agentic_huge_data_base / wiki
页面 jcode · 11 Self-Dev 工作流·DeepWiki 中文全文译文

11 · Self-Dev 工作流(Self-Dev Workflow)

代理式研究运行时 · 聚焦本章的模块关系、源码依据与实现要点。

项目jcode 章节11 状态全文译文 模块测试、发布与运维、工作流与编排、记忆与上下文、接口与服务契约
源码线索
  • AGENTS.md
  • build.rs
  • crates/jcode-build-support/src/paths.rs
  • scripts/agent_trace.sh
  • scripts/cargo_exec.sh
  • scripts/dev_cargo.sh
  • scripts/install_release.sh
  • scripts/real_provider_smoke.sh
  • scripts/remote_build.sh
  • scripts/remote_config.sh
模块标签
  • 测试、发布与运维
  • 工作流与编排
  • 记忆与上下文
  • 接口与服务契约
  • 界面与交互

章节正文

Self-Dev 工作流

自开发工作流

相关源文件

本章引用的主要源码文件:

  • AGENTS.md
  • build.rs
  • crates/jcode-build-support/src/paths.rs
  • scripts/agent_trace.sh
  • scripts/cargo_exec.sh
  • scripts/dev_cargo.sh
  • scripts/install_release.sh
  • scripts/real_provider_smoke.sh
  • scripts/remote_build.sh
  • scripts/remote_config.sh
  • scripts/test_auth_e2e.sh
  • scripts/test_e2e.sh
  • src/build.rs
  • src/cli/selfdev.rs
  • src/cli/terminal.rs
  • src/cli/tui_launch.rs
  • src/plan.rs
  • src/server/reload.rs
  • src/server/runtime.rs
  • src/setup_hints.rs
  • src/setup_hints/macos_launcher.rs
  • src/setup_hints/windows_setup.rs
  • src/tool/selfdev/build_queue.rs
  • src/tool/selfdev/mod.rs
  • src/tool/selfdev/reload.rs
  • src/tool/selfdev/tests.rs
  • src/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_VERSIONJCODE_GIT_HASHJCODE_GIT_DATE build.rs:112-119

  1. 稳定版(Stable):生产发布通道 AGENTS.md:22
  2. 金丝雀版(Canary):用于验证新构建的测试通道 AGENTS.md:23
  3. 当前版(Current):位于 ~/.jcode/builds/current/jcode 的活动本地构建通道,自开发构建会发布到此位置 AGENTS.md:21
自开发启动序列

run_self_dev 函数负责编排进入此模式的转换过程:

  1. 设置 JCODE_CLIENT_SELFDEV_ENV 环境变量 src/cli/selfdev.rs:40
  2. 可选地通过 run_selfdev_build 触发引导构建 src/cli/selfdev.rs:69
  3. 使用 client_update_candidate(true) 定位最佳目标二进制文件 src/cli/selfdev.rs:77-80,该方法会检查本地更新候选 src/tui/app/helpers.rs:38-43
  4. 启动 TUI 客户端,如果已有服务器在运行,则连接到共享服务器 src/cli/selfdev.rs:166

金丝雀二进制文件生命周期

阶段操作代码引用
检测通过 get_repo_dir 识别仓库src/cli/selfdev.rs:42-43
构建执行 selfdev_build_commandsrc/cli/selfdev.rs:66-69
测试将会话标记为 is_canarysrc/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(生成)等操作。

重载信号实现

重载通过一个广播 ReloadSignalwatch 通道进行协调 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

自开发工具数据流

jcode · 低内存优化 · 图 1
jcode · 低内存优化 · 图 1

来源: 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_statedebug_jobsevent_history src/server/runtime.rs:40-45

调试套接字命令路由

jcode · 命令基础设施 · 图 2
jcode · 命令基础设施 · 图 2

来源: src/server/runtime.rs:26-133, AGENTS.md:16-18

提示覆盖与技能

系统提示会动态地附加项目特定的指令和环境上下文。

提示覆盖
  • CLAUDE.md / AGENTS.md:这些文件被视为代理的仓库指南 AGENTS.md:1-2AGENTS.md 特别包含开发工作流的指令,例如"边开发边提交"和"完成后重新构建" AGENTS.md:5-9
  • 自开发标识:当 client_selfdev_requested() 返回 true 时,UI 标题会更新以包含会话名称和自开发状态 src/cli/tui_launch.rs:140-151
上下文管理

CachedContextInfo 结构体缓存会话元数据,包括 compaction_countcompaction_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 实现热重载

热重载通过进程替换实现。这使得服务器可以在保留会话状态的同时更新自身,状态通过持久化保存。

重载生命周期
  1. 信号:通过内部广播通道接收重载信号 src/server/reload.rs:61-64
  2. 恢复意图:系统使用 persist_reload_recovery_intents 持久化运行中会话的恢复意图 src/server/reload.rs:92-97
  3. 关闭:使用 graceful_shutdown_sessions 优雅地关闭活动会话 src/server/reload.rs:99-106
  4. 执行:进程使用 replace_process 将自身替换为新二进制文件 src/server/reload.rs:130。在此阶段,标准输入输出被分离,以防止 SIGPIPE src/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