Gallifrey Code 设计文档
Go 语言实现的 AI 编程助手
一、项目背景基于对 AI 编程助手架构的学习和研究,使用 Go 语言实现一个类似的 CLI 工具。项目名称 Gallifrey Code,灵感来源于《神秘博士》中时间领主的母星。
设计目标
单二进制部署 - 纯 Go 实现,无需运行时环境
双模式输出 - TUI 交互 + —print 无头模式
多 API 支持 - Anthropic API + OpenAI 兼容 API
可扩展工具系统 - 模块化的工具接口设计
二、架构设计2.1 分层架构12345678910111213141516┌─────────────────────────────────────────────────────────────┐│ CLI Layer ││ (cobra CLI, TUI with bubbletea, --print mode) │├───────────────────────────────────────── ...
Go-Claw-Code 设计说明
Go 语言实现 Claude Code 风格 AI 编程助手
GitHub 仓库:https://github.com/gallifreyCar/go-claw-code-gallifrey-self-use
一、项目背景基于 2026年3月31日泄漏的 Claude Code v2.1.88 源码架构分析,用 Go 语言实现一个类似的 AI 编程助手 CLI 工具。
为什么用 Go?
特性
TypeScript (原版)
Go
运行时
Node.js/Bun
单二进制
部署
需要 Node 环境
直接运行
性能
解释执行
编译优化
内存
V8 内存模型
GC + 值类型
依赖
node_modules
无外部依赖
二、架构设计2.1 分层架构参考泄漏代码的分层设计,采用清晰的分层架构:
12345678910111213141516┌─────────────────────────────────────────────────────────────┐│ CLI Layer ...
TDD开发模式:AI友好的工程实践
核心观点: TDD(测试驱动开发)是目前最适配AI编程的开发模式。先写测试、再写实现,让AI的每次输出都有明确的验证标准。
一、为什么TDD对AI友好传统开发 vs TDD传统开发流程
1234561. 理解需求2. 写代码3. AI生成/修改代码4. 手动测试5. 发现bug,回头改6. 循环3-5...
问题:AI修改后,不知道改对了没有,需要人工反复验证。
TDD开发流程
1234561. 写测试用例(明确预期)2. 运行测试 → 红色(失败)3. AI写实现代码4. 运行测试 → 绿色(通过)5. AI重构优化6. 运行测试 → 仍然绿色
优势:每一步都有自动化验证,AI输出质量可量化。
二、TDD的AI适配优势1. 测试即需求文档
传统文档
问题
测试用例
PRD/技术文档
AI理解歧义,实现可能偏离
精确的输入输出定义
口头沟通
信息丢失,AI无从得知
可执行的规格说明
注释/README
可能过时,与代码不同步
始终与代码行为一致
示例:
123456789101112131415// 传统文档:"查询用户订单,返回订单列表&q ...
从 Figma 到前端部署上线的闭环尝试
这不是一个”完美的 Figma 转代码工具”,而是一次尽量跑通真实业务闭环的尝试。
先说结果:我们做出了什么这次我们实际搭了一条可以跑起来的链路:产品修改figma,ai自动完成前端app对应修改并部署到线上(无感知)。
这条链路里,已经跑通的部分包括:
能从 Figma 版本里检测出真实变更
默认只比较相邻两次 Completed
能把变更限制在指定开发区间内
能让 Claude 读取本地 Flutter 仓库
能结合 Figma 文本层级推断代码落点
能把改动真实写进页面文件
能复用已有自动部署链路
一、我真正想解决的问题真实痛点是:
产品或设计同学改了 Figma,开发往往不能第一时间知道改了什么
即使知道改了,也要自己去 Figma 里定位节点、理解设计意图
改完还不算结束,还要提交、部署,最后才能去真实环境看效果
二、这次踩过的坑1. “生成成功”不等于”业务成功”模型很容易生成一个独立组件,看起来没问题,但没有真正挂到页面里。
2. 最大难点其实是”找到宿主页”比如一个节点叫 Frame 2087327689,你单看名字几乎得不到任何有用信息。
真正起作用的是: ...
后端工程师转Agent开发工程师转型指南
写给团队里的后端程序员:怎么从写 API 转成写 Agent,系统怎么设计,学什么,怎么上手。
一、为什么后端程序员适合做 Agent 开发后端工程师写 Agent 有天然优势——Agent 系统 本质上就是一个后端系统,只是「业务逻辑」由模型来决策。
1.1 先建立心智模型
你熟悉的后端概念
Agent 世界里的对应
HTTP Handler
Tool(工具)
Middleware
Context Manager(上下文管理)
事件循环 / Worker
Agent Loop(执行循环)
服务编排 / 微服务
Multi-Agent 协作
配置中心 / Feature Flag
System Prompt
日志 / 监控
Agent Observability
单测 / 集成测试
Agent Evals(评测)
一句话:你写的是 Harness(运行框架),模型是「业务逻辑层」。
1.2 Harness vs Agent:分清职责你的代码职责:
给模型提供工具:定义 Tool 的接口和实现
管理上下文:拼接 Prompt、维护对话历 ...
后端工程师 → Agent 开发工程师转型指南
写给团队里的后端程序员:怎么从写 API 转成写 Agent,系统怎么设计,学什么,怎么上手。
一、为什么后端程序员适合做 Agent 开发后端工程师写 Agent 有天然优势——Agent 系统 本质上就是一个后端系统,只是「业务逻辑」由模型来决策。
1.1 先建立心智模型
你熟悉的后端概念
Agent 世界里的对应
HTTP Handler
Tool(工具)
Middleware
Context Manager(上下文管理)
事件循环 / Worker
Agent Loop(执行循环)
服务编排 / 微服务
Multi-Agent 协作
配置中心 / Feature Flag
System Prompt
日志 / 监控
Agent Observability
单测 / 集成测试
Agent Evals(评测)
一句话:你写的是 Harness(运行框架),模型是「业务逻辑层」。
1.2 Harness vs Agent:分清职责你的代码职责:
给模型提供工具:定义 Tool 的接口和实现
管理上下文:拼接 Prompt、维护对话历 ...
开发工具实用技巧速查
临时代理设置、VS Code 扩展管理、Git 技巧等开发常用命令速查
Linux磁盘分区
前言本文是视频教程韩顺平 一周学会Linux部分章节的归纳总结,内容补充和错误纠正。
概念Linux的磁盘分区机制
Linux的磁盘分区机制是指将物理硬盘划分为多个逻辑部分的过程。每个分区都被视为独立的逻辑驱动器,并有自己的文件系统进行格式化和挂载。以下是Linux磁盘分区机制的核心概念:
主分区(Primary Partition):主分区是硬盘上最基本的分区类型,最多可以划分为4个主分区。每个主分区都可以被视为一个独立的逻辑驱动器。
扩展分区(Extended Partition):扩展分区是一种特殊类型的主分区,它可以容纳多个逻辑分区。只能有一个扩展分区存在,并且必须在4个主分区之中。
逻辑分区(Logical Partition):逻辑分区是在扩展分区内创建的分区。通过扩展分区,可以划分出多个逻辑分区来扩展硬盘上的分区数量。
文件系统(File System):每个分区都需要格式化为特定的文件系统以用于存储数据。常见的Linux文件系统包括ext4、XFS、Btrfs等。
挂载(Mounting):挂载是将一个分区与Linux文件系统中的目录进行关联的过程。挂载点是一 ...
Kubeadm安装K8s集群指南
需求最近给公司的一批测试环境的服务器升级k8s集群,下面是一些要求:
k8s从v1.16.x版本升级到v1.27.4版本
运行时使用containerd:v1.6.20版本
网络插件停止以前的flannel,使用calico: v3.24.6版本
这批服务器机器不能连接外国网络
下面记录了主要的操作步骤,以备不时之需
[所有节点]关停旧版本节点的kubelet及其相关服务
关停服务
12345678910111213# 关停kubeletsystemctl stop kubeletsystemctl stop kube-proxy && systemctl disable kube-proxy# 关闭swapswapoff -a# 编辑注释掉swap开机启动vim /etc/fstab# 关停相关服务,下面的只有master节点需要关停systemctl stop etcd && systemctl disable etcdsystemctl stop kube-apiserver && systemctl disable kube ...
GMP模型的应用场景
场景1:G1创建G3P拥有G1,M1获取P后开始运行G1,G1使用go func()创建了G3,为了局部性,G3优先加入到P1(而不是P2)的本地队列。(被淘汰的旧版调度器没有本地队列,无法像现在一样维护局部性)
场景2:G1执行完毕G1执行完成后会执行goexit()函数退出,然后M上运行的goroutine切换为G0,G0负责调度时协程的切换,执行函数schedule()切换G。然后G0切换到G3,然后M开始运行G3,执行G3的excute()函数,这里实现了M的复用。
场景3:G2开辟过多的G假设每个P的本地队列只能存4个G。G2要创建了6个G,前4个G(G3,G4, G5,G6)已经加入p1的本地队列,p1本地队列满了。
G2在创建G7的时候,发现P1的本地队列已满,会将P1本地队列的前一半G取出,次序打乱,将G7和这一半G一同放入全局队列
现在G2再创建G8,队列已经不满了,就可以正常进入p1队列了
场景4:唤醒正在休眠的M在创建G时,运行的G会尝试唤醒其他空闲的P和M组合去执行。
如果G2成功唤醒一个M。这个M绑定了P2,运行G0,但P2的本地队列没有G,此时M ...
