Self-Dev 工作流
自开发工作流
相关源文件
本章引用的主要源码文件:
AGENTS.mdbuild.rscrates/jcode-build-support/src/paths.rsscripts/agent_trace.shscripts/cargo_exec.shscripts/dev_cargo.shscripts/install_release.shscripts/real_provider_smoke.shscripts/remote_build.shscripts/remote_config.shscripts/test_auth_e2e.shscripts/test_e2e.shsrc/build.rssrc/cli/selfdev.rssrc/cli/terminal.rssrc/cli/tui_launch.rssrc/plan.rssrc/server/reload.rssrc/server/runtime.rssrc/setup_hints.rssrc/setup_hints/macos_launcher.rssrc/setup_hints/windows_setup.rssrc/tool/selfdev/build_queue.rssrc/tool/selfdev/mod.rssrc/tool/selfdev/reload.rssrc/tool/selfdev/tests.rssrc/tui/app/helpers.rs
自开发工作流是一种特殊的操作模式,允许 jcode 管理自身的开发生命周期。它实现了一个递归的开发循环,代理可以在其中构建、测试和热重载正在运行的可执行文件,并使用金丝雀发布来确保过程中的稳定性。
金丝雀构建管理
自开发会话通过 is_canary 标志和特定的"self-dev"标签来区分 src/cli/selfdev.rs:47-60。当用户运行 jcode self-dev 时,系统会自动检测仓库根目录 src/cli/selfdev.rs:42-43,并准备一个专门的环境。
二进制文件解析策略
系统使用优先级层级来决定执行或重载哪个二进制文件。构建系统会在编译期间注入版本元数据,例如 JCODE_VERSION、JCODE_GIT_HASH 和 JCODE_GIT_DATE build.rs:112-119。
- 稳定版(Stable):生产发布通道
AGENTS.md:22。 - 金丝雀版(Canary):用于验证新构建的测试通道
AGENTS.md:23。 - 当前版(Current):位于
~/.jcode/builds/current/jcode的活动本地构建通道,自开发构建会发布到此位置AGENTS.md:21。
自开发启动序列
run_self_dev 函数负责编排进入此模式的转换过程:
- 设置
JCODE_CLIENT_SELFDEV_ENV环境变量src/cli/selfdev.rs:40。 - 可选地通过
run_selfdev_build触发引导构建src/cli/selfdev.rs:69。 - 使用
client_update_candidate(true)定位最佳目标二进制文件src/cli/selfdev.rs:77-80,该方法会检查本地更新候选src/tui/app/helpers.rs:38-43。 - 启动 TUI 客户端,如果已有服务器在运行,则连接到共享服务器
src/cli/selfdev.rs:166。
金丝雀二进制文件生命周期
| 阶段 | 操作 | 代码引用 |
|---|---|---|
| 检测 | 通过 get_repo_dir 识别仓库 | src/cli/selfdev.rs:42-43 |
| 构建 | 执行 selfdev_build_command | src/cli/selfdev.rs:66-69 |
| 测试 | 将会话标记为 is_canary | src/cli/selfdev.rs:49-58 |
| 交接 | 通过 await_reload_handoff 等待服务器重载 | src/cli/selfdev.rs:17-21 |
来源: src/cli/selfdev.rs:12-167, build.rs:112-119, src/tui/app/helpers.rs:38-43, AGENTS.md:20-26
自开发工具操作
SelfDevTool 为代理提供了对开发循环的直接控制能力,支持 build(构建)、reload(重载)和 spawn(生成)等操作。
重载信号实现
重载通过一个广播 ReloadSignal 的 watch 通道进行协调 src/server/reload.rs:58-64。该信号包含唯一的 request_id、构建 hash 以及是否优先使用自开发二进制文件的标志 src/server/reload.rs:67-69。
低内存优化
在自开发构建期间,系统可以自动检测低内存环境(例如运行 earlyoom 的小型 Linux 机器)并应用性能覆盖 scripts/dev_cargo.sh:164-182。这些覆盖包括:
- 禁用增量编译
scripts/dev_cargo.sh:210-211。 - 将代码生成单元减少到
16个,以限制峰值内存使用scripts/dev_cargo.sh:212。
自开发工具数据流
来源: src/server/reload.rs:50-159, scripts/dev_cargo.sh:164-215, src/cli/selfdev.rs:105-134
调试套接字命令
jcode 暴露了一个用于运行时级别调试的 Unix 套接字 AGENTS.md:17-18。服务器运行时管理一个专用的调试接受循环 src/server/runtime.rs:111-115。
调试服务器生命周期
spawn_debug_accept_loop 函数监听传入连接,并生成一个 handle_debug_client 任务 src/server/runtime.rs:125。与标准客户端不同,调试客户端不参与空闲超时计算 src/server/runtime.rs:124。
命令基础设施
调试命令允许开发者与 ServerRuntime 状态进行交互,该状态跟踪 client_debug_state、debug_jobs 和 event_history src/server/runtime.rs:40-45。
调试套接字命令路由
来源: src/server/runtime.rs:26-133, AGENTS.md:16-18
提示覆盖与技能
系统提示会动态地附加项目特定的指令和环境上下文。
提示覆盖
- CLAUDE.md / AGENTS.md:这些文件被视为代理的仓库指南
AGENTS.md:1-2。AGENTS.md特别包含开发工作流的指令,例如"边开发边提交"和"完成后重新构建"AGENTS.md:5-9。 - 自开发标识:当
client_selfdev_requested()返回 true 时,UI 标题会更新以包含会话名称和自开发状态src/cli/tui_launch.rs:140-151。
上下文管理
CachedContextInfo 结构体缓存会话元数据,包括 compaction_count 和 compaction_summary_chars,以优化提示生成 src/tui/app/helpers.rs:16-24。
来源: src/tui/app/helpers.rs:16-66, src/cli/selfdev.rs:12-14, AGENTS.md:1-11
通过 Exec 实现热重载
热重载通过进程替换实现。这使得服务器可以在保留会话状态的同时更新自身,状态通过持久化保存。
重载生命周期
- 信号:通过内部广播通道接收重载信号
src/server/reload.rs:61-64。 - 恢复意图:系统使用
persist_reload_recovery_intents持久化运行中会话的恢复意图src/server/reload.rs:92-97。 - 关闭:使用
graceful_shutdown_sessions优雅地关闭活动会话src/server/reload.rs:99-106。 - 执行:进程使用
replace_process将自身替换为新二进制文件src/server/reload.rs:130。在此阶段,标准输入输出被分离,以防止SIGPIPEsrc/server/reload.rs:27-29。
会话延续
重载后,ReloadContext 会向代理提供一条 continuation_message,指示其立即继续执行,无需询问用户下一步操作 src/tool/selfdev/reload.rs:98-111。如果某个工具被中断,则会生成一条特定的通知 src/tool/selfdev/reload.rs:113-115。
来源: src/server/reload.rs:16-158, src/tool/selfdev/reload.rs:4-163, src/cli/selfdev.rs:16-36