add-coder 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +9 -19
  2. package/dist/index.js +25 -5
  3. package/package.json +1 -1
  4. package/templates/core/agents/add-flow-guardian.md +6 -6
  5. package/templates/core/agents/add-orchestrator.md +2 -2
  6. package/templates/core/plans/2026-07/08/{farm-agent-add-coder-npm-package-add-route-v1.md → add-coder-npm-package-add-route-v1.md} +9 -9
  7. package/templates/core/plans/2026-07/08/{farm-agent-add-coder-npm-package-handoff-v1.md → add-coder-npm-package-handoff-v1.md} +43 -43
  8. package/templates/core/plans/2026-07/08/{farm-agent-add-coder-npm-package-plan-v1.md → add-coder-npm-package-plan-v1.md} +47 -47
  9. package/templates/core/reports/REPORT-WORKFLOW.md +2 -2
  10. package/templates/core/reports/index.md +1 -1
  11. package/templates/core/rules/project_rules.md +29 -29
  12. package/templates/core/scripts/mcp-server.ts +17 -17
  13. package/templates/core/skills/add-paradigm/SKILL.md +18 -16
  14. package/templates/core/skills/session-init/SKILL.md +3 -3
  15. package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/checklist.md +7 -7
  16. package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/spec.md +12 -12
  17. package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/tasks.md +17 -17
  18. package/templates/core/templates/01-/346/236/266/346/236/204//343/200/212ADD/345/274/200/345/217/221/345/267/245/344/275/234/350/267/257/345/276/204/344/270/216/346/226/207/346/241/243/345/215/217/345/220/214/350/247/204/350/214/203/343/200/213.md +25 -25
  19. package/templates/core/templates/TERMINOLOGY.md +1 -1
  20. package/templates/core/templates/checklist-template.md +1 -1
  21. package/templates/core/templates/handoff-multi-round-template.md +10 -10
  22. package/templates/core/templates/handoff-single-round-template.md +1 -1
  23. package/templates/core/templates/index.md +5 -1
  24. package/templates/core/templates/prd-incremental-template.md +103 -0
  25. package/templates/core/templates/prd-incremental-template.schema.json +32 -0
  26. package/templates/core/templates/prd-standard-template.md +219 -0
  27. package/templates/core/templates/prd-standard-template.schema.json +27 -0
  28. package/templates/core/templates/simple-plan-template.md +2 -2
  29. package/templates/core/templates/standard-plan-template.md +9 -9
  30. package/templates/core/tools/README.md +2 -2
  31. package/templates/core/vocabulary/add-governance-vocabulary.md +28 -26
  32. package/templates/core/podman-compose.yml +0 -19
package/README.md CHANGED
@@ -74,25 +74,15 @@ hook 不是「通知推送」,而是 **IDE 运行时拦截层**:
74
74
  npx add-coder init
75
75
  ```
76
76
 
77
- 首次 init 自动检测 IDE,交互式引导完成 Prisma 初始化、User 模型注入、ADD 模板部署。
78
-
79
- ### 完整初始化流程
77
+ 首次 init 自动检测 IDE,交互式引导完成数据库选择(PostgreSQL / SQLite / 自行管理)、容器运行时(podman / docker / 自行管理)、Prisma 初始化、ADD 模板部署。
80
78
 
81
79
  ```bash
82
- # ① 首次执行(自动:prisma init + User 模型 + add.prisma + 模板部署)
83
80
  npx add-coder init
84
- # → 是否执行 prisma init?[Y/n] y
85
- # → 已将 DATABASE_URL 迁移到 .env.development
86
- # → 已注入 User 模型
87
- # → 已复制 add.prisma
88
- # → Core 模板: 55 文件 + adapter 模板已就位
89
-
90
- # ② 编辑 .env.development 配置数据库连接串
91
- DATABASE_URL="postgresql://user:pass@localhost:5432/mydb?schema=public"
92
-
93
- # ③ 第二次执行(自动:prisma migrate + generate)
94
- npx add-coder init --yes
95
- # → prisma migrate dev(创建 DevOperation + AuditLog 表)
81
+ # → 选择 IDE(Qoder / Claude / VS Code)
82
+ # → 选择数据库(PostgreSQL / SQLite / 自行管理)
83
+ # → 选择容器(podman / docker / 自行管理)
84
+ # → prisma init + add.prisma 复制
85
+ # → prisma db push(仅新增表,不删数据)
96
86
  # → prisma generate
97
87
  # → ADD 治理模型已就绪 ✓
98
88
  ```
@@ -113,7 +103,7 @@ npx add-coder init --yes
113
103
  |------|------|------|
114
104
  | ① | 检测 IDE | 扫描 `.qoder/` `.claude/` `.vscode/` 存在性,或通过 `--adapter` 指定 |
115
105
  | ② | 加载配置 | 交互式问答 > `add-coder.config.ts` > 自动检测 > 默认值 |
116
- | ③ | Prisma 注入 | 检测 Prisma 引导安装 注入 User 模型 复制 `add.prisma`迁移 |
106
+ | ③ | 数据库部署 | `db-ensure.sh` 启容器/PG 连接 + `injectPrisma()` 裁决层(Prisma initAddUser 模型复制db pushgenerate) |
117
107
  | ④ | 渲染模板 | 55 个 core 模板文件(skills/agents/templates/plans/specs/scripts…) |
118
108
  | ⑤ | 部署适配 | 将 core 内容复制到 `.add/` `.qoder/` `.claude/` 三目录,补 IDE 专属 hooks/mcp |
119
109
  | ⑥ | 写入文件 | 交互/yes/force/dry-run 四种模式,`.sh` 脚本自动 `chmod` |
@@ -197,8 +187,8 @@ npx add-coder init --yes
197
187
  ## 前置条件
198
188
 
199
189
  - Node.js >= 20
200
- - Prisma >= 6.9 / ^7.0(`init` 时自动检测,无则引导安装)
201
- - PostgreSQL(MCP 工具链依赖 DevOperation + AuditLog 表)
190
+ - Prisma ^7.0(`init` 时自动检测,无则引导安装)
191
+ - PostgreSQL / SQLite(MCP 工具链依赖 DevOperation + AuditLog 表)
202
192
 
203
193
  > **推荐**:使用 Podman/Docker 运行 PostgreSQL,参考配置:
204
194
  > ```yaml
package/dist/index.js CHANGED
@@ -532,7 +532,7 @@ async function injectPrisma2(projectRoot, options = {}) {
532
532
  }
533
533
 
534
534
  // src/cli/commands/init.ts
535
- import { readFileSync as readFileSync7, writeFileSync as writeFileSync3, existsSync as existsSync6, mkdirSync as mkdirSync3 } from "fs";
535
+ import { readFileSync as readFileSync7, writeFileSync as writeFileSync3, existsSync as existsSync6, mkdirSync as mkdirSync3, copyFileSync as copyFileSync2, readdirSync as readdirSync5 } from "fs";
536
536
  import { resolve as resolve4 } from "path";
537
537
  import { spawnSync as spawnSync2 } from "child_process";
538
538
  import { createConnection } from "net";
@@ -778,7 +778,7 @@ PROJECT_NAME=${config.projectName || "add-project"}
778
778
  const result = await writeFiles2(projectRoot, allFiles, { force: options.force, dryRun: options.dryRun });
779
779
  if (db.engine === "postgresql" && db.container && db.container !== "manual") {
780
780
  if (!options.dryRun) {
781
- const dbScript = resolve4(projectRoot, ".qoder", "scripts", "db-ensure.sh");
781
+ const dbScript = resolve4(projectRoot, magicDir, "scripts", "db-ensure.sh");
782
782
  const dbEnv = { ...process.env, DATABASE_USER: db.user, DATABASE_PASSWORD: db.password, DATABASE_PORT: db.port, PROJECT_NAME: config.projectName };
783
783
  const mode = db.reuseExisting ? "manual" : db.container;
784
784
  console.log(db.reuseExisting ? "\u590D\u7528\u5DF2\u6709 PostgreSQL ..." : `\u90E8\u7F72\u6570\u636E\u5E93 (${db.container}) ...`);
@@ -792,14 +792,14 @@ PROJECT_NAME=${config.projectName || "add-project"}
792
792
  }
793
793
  if (db.engine === "postgresql" && db.container === "manual") {
794
794
  if (!options.dryRun) {
795
- const dbScript = resolve4(projectRoot, ".qoder", "scripts", "db-ensure.sh");
795
+ const dbScript = resolve4(projectRoot, magicDir, "scripts", "db-ensure.sh");
796
796
  if (existsSync6(dbScript)) spawnSync2("bash", [dbScript, "postgresql", "manual"], { cwd: projectRoot, stdio: "inherit" });
797
- console.log(["", "\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501", "ADD \u6A21\u677F\u5DF2\u5C31\u4F4D\u3002\u5728\u5B8C\u6210\u4EE5\u4E0B\u64CD\u4F5C\u524D MCP \u4E0D\u53EF\u7528\uFF1A", "", "1. \u7F16\u8F91 .env.development\uFF0C\u914D\u7F6E DATABASE_URL", "2. \u91CD\u65B0\u8FD0\u884C add-coder init \u5B8C\u6210\u8FC1\u79FB", "", "\u26A0\uFE0F \u975E PG \u6570\u636E\u5E93\u9700\u7F16\u8F91 .qoder/scripts/mcp-server.ts \u624B\u52A8\u914D Prisma 7 adapter", "\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"].join("\n"));
797
+ console.log(["", "\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501", "ADD \u6A21\u677F\u5DF2\u5C31\u4F4D\u3002\u5728\u5B8C\u6210\u4EE5\u4E0B\u64CD\u4F5C\u524D MCP \u4E0D\u53EF\u7528\uFF1A", "", "1. \u7F16\u8F91 .env.development\uFF0C\u914D\u7F6E DATABASE_URL", "2. \u91CD\u65B0\u8FD0\u884C add-coder init \u5B8C\u6210\u8FC1\u79FB", "", `\u26A0\uFE0F \u975E PG \u6570\u636E\u5E93\u9700\u7F16\u8F91 ${magicDir}/scripts/mcp-server.ts \u624B\u52A8\u914D Prisma 7 adapter`, "\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"].join("\n"));
798
798
  }
799
799
  }
800
800
  if (db.engine === "manual") {
801
801
  if (!options.dryRun) {
802
- console.log(["", "Prisma \u652F\u6301\u7684 datasource: postgresql / mysql / sqlite / sqlserver / cockroachdb", "\u81EA\u884C prisma init + \u7F16\u8F91 .env.development\uFF0C\u91CD\u65B0 run init \u5B8C\u6210\u8FC1\u79FB\u3002", "", "\u26A0\uFE0F Prisma 7 adapter \u9700\u624B\u52A8\u914D \u2192 .qoder/scripts/mcp-server.ts"].join("\n"));
802
+ console.log(["", "Prisma \u652F\u6301\u7684 datasource: postgresql / mysql / sqlite / sqlserver / cockroachdb", "\u81EA\u884C prisma init + \u7F16\u8F91 .env.development\uFF0C\u91CD\u65B0 run init \u5B8C\u6210\u8FC1\u79FB\u3002", "", `\u26A0\uFE0F Prisma 7 adapter \u9700\u624B\u52A8\u914D \u2192 ${magicDir}/scripts/mcp-server.ts`].join("\n"));
803
803
  }
804
804
  }
805
805
  if (db.engine === "sqlite") {
@@ -813,6 +813,26 @@ PROJECT_NAME=${config.projectName || "add-project"}
813
813
  }
814
814
  }
815
815
  }
816
+ if (!options.dryRun) {
817
+ const pn = config.projectName || "add-project";
818
+ const docsBase = resolve4(projectRoot, "docs", pn, "knowledge");
819
+ const groundingSrc = resolve4(import.meta.dirname, "../templates/core/templates");
820
+ for (const d of ["00-\u9700\u6C42", "01-\u67B6\u6784", "02-\u89C4\u8303"]) {
821
+ const srcDir = resolve4(groundingSrc, d);
822
+ const destDir = resolve4(docsBase, d);
823
+ if (!existsSync6(destDir)) mkdirSync3(destDir, { recursive: true });
824
+ if (!existsSync6(srcDir)) continue;
825
+ for (const f of readdirSync5(srcDir)) {
826
+ const src = resolve4(srcDir, f);
827
+ const dest = resolve4(destDir, f);
828
+ if (existsSync6(dest)) continue;
829
+ try {
830
+ copyFileSync2(src, dest);
831
+ } catch {
832
+ }
833
+ }
834
+ }
835
+ }
816
836
  console.log(`
817
837
  \u5B8C\u6210: \u65B0\u5EFA ${result.created}, \u8DF3\u8FC7 ${result.skipped}, \u8986\u76D6 ${result.overwritten}`);
818
838
  if (!options.dryRun) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "add-coder",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "private": false,
5
5
  "description": "[codein2027](https://github.com/xiaomingming92/codein2027) 快速构建 ADD 编程范式的完整脚手架——AI 代码治理的落地方案。以「审计即基础设施」为核心,彻底打破编程过程黑盒与跨轮失忆,让编程范式进化为可审计、可追溯、可收敛的新时代。npx 即用,人人可体验。",
6
6
  "type": "module",
@@ -33,7 +33,7 @@ Step N-1 出口 ──→ Guardian 出口检查 ──→ BLOCKED? 回退
33
33
 
34
34
  **0.1 从 MCP 获取 ADD 状态快照**
35
35
 
36
- 读取 `.qoder/plans/` 目录(递归搜索子目录 `**/*.md`,目录已按 `YYYY-MM/DD/` 分层),定位当前活跃的 Plan 和 add-route 文件:
36
+ 读取 `{{magicDir}}/plans/` 目录(递归搜索子目录 `**/*.md`,目录已按 `YYYY-MM/DD/` 分层),定位当前活跃的 Plan 和 add-route 文件:
37
37
 
38
38
  1. 使用 Glob `**/*add-route*.md` 递归搜索所有 add-route 文件
39
39
  2. 从 add-route 提取绑定的 Plan / Specs / Tasks / Checklist 路径
@@ -76,7 +76,7 @@ Step N-1 出口 ──→ Guardian 出口检查 ──→ BLOCKED? 回退
76
76
  #### Step 3 入口(业务逻辑实现)
77
77
  | 检查项 | 方法 | 不通过 |
78
78
  |--------|------|--------|
79
- | add-route 存在性 | 递归搜索 `.qoder/plans/`(含 `YYYY-MM/DD/` 子目录)确认 `*add-route*.md` 文件存在 | 不存在 → **BLOCKED** — 回退 Step 0.5 |
79
+ | add-route 存在性 | 递归搜索 `{{magicDir}}/plans/`(含 `YYYY-MM/DD/` 子目录)确认 `*add-route*.md` 文件存在 | 不存在 → **BLOCKED** — 回退 Step 0.5 |
80
80
  | add-route 审计记录 | 检查 add-route 文件内容中 Steps 0/1/2 的产出 checkbox 是否已全部 `[x]` | 有 `[ ]` → **BLOCKED** — 回退完成前置 Step |
81
81
  | Tasks 文件就绪 | 确认 `tasks.md` 存在且 Task 清单与 add-route 映射表一致 | 缺失 → **BLOCKED** |
82
82
 
@@ -108,7 +108,7 @@ Step N-1 出口 ──→ Guardian 出口检查 ──→ BLOCKED? 回退
108
108
  | 检查项 | 方法 | 不通过 |
109
109
  |--------|------|--------|
110
110
  | Plan 为 runtime-fix 类型 | 检查 Plan 元信息是否标注 runtime-fix | 非 runtime-fix → **SKIP** |
111
- | gateway.md 发现可定位 | 确认 `.qoder/reports/{{projectName}}-runtime-report/gateway.md` 存在 | 缺失 → **FAIL** |
111
+ | gateway.md 发现可定位 | 确认 `{{magicDir}}/reports/{{projectName}}-runtime-report/gateway.md` 存在 | 缺失 → **FAIL** |
112
112
  | report-handoff-template 已读取 | 确认模板存在 | 缺失 → **FAIL** |
113
113
 
114
114
  ---
@@ -118,10 +118,10 @@ Step N-1 出口 ──→ Guardian 出口检查 ──→ BLOCKED? 回退
118
118
  #### Step 0 出口
119
119
  | 检查项 | 方法 | 判定 |
120
120
  |--------|------|------|
121
- | Plan 文件存在 | 确认 `.qoder/plans/` 下(含日期子目录)有对应的 `-plan-v*.md` | 缺失 → **BLOCKED** |
121
+ | Plan 文件存在 | 确认 `{{magicDir}}/plans/` 下(含日期子目录)有对应的 `-plan-v*.md` | 缺失 → **BLOCKED** |
122
122
  | Specs 三元组就绪 | 确认 `spec.md` + `tasks.md` + `checklist.md` 存在 | 缺失 → **BLOCKED** |
123
- | Review 文件存在 | 确认 `.qoder/reviews/` 下有对应的 review 文件 | 缺失 → **BLOCKED** |
124
- | add-route 已生成 | 确认 `.qoder/plans/` 下(含日期子目录)有 `*add-route*.md` | 缺失 → **BLOCKED** |
123
+ | Review 文件存在 | 确认 `{{magicDir}}/reviews/` 下有对应的 review 文件 | 缺失 → **BLOCKED** |
124
+ | add-route 已生成 | 确认 `{{magicDir}}/plans/` 下(含日期子目录)有 `*add-route*.md` | 缺失 → **BLOCKED** |
125
125
  | 项目文档已更新 | 检查 add-route Step 0 产出中是否勾选了"项目文档已更新"或"无需更新声明已记录" | 未勾选 → **FAIL** |
126
126
  | 0.6.5 回流完成 | 检查 add-route §0.8 是否记录了 DPS ≥ 85(或有 DPS 待通过标记) | 无记录 → **FAIL** |
127
127
  | 原子闭包判定已执行 | add-route 含"原子闭包三可性判定"章节且有结论 | 缺失 → **BLOCKED** |
@@ -29,7 +29,7 @@ mcpServers:
29
29
 
30
30
  **0.1 加载 Plan 索引**
31
31
 
32
- 读取 `.qoder/plans/index.md`,提取最近的 Plan 列表。如文件不存在 → 跳过,继续。
32
+ 读取 `{{magicDir}}/plans/index.md`,提取最近的 Plan 列表。如文件不存在 → 跳过,继续。
33
33
 
34
34
  **0.2 获取 ADD 状态快照**
35
35
 
@@ -141,7 +141,7 @@ mcpServers:
141
141
  ✅ Step 8 收敛判断通过!
142
142
 
143
143
  ⚠️ 验收闭环四步(不可跳过):
144
- ① 写 devlog日志(走mcp) → .qoder/plans/{YYYY-MM}/{DD}/
144
+ ① 写 devlog日志(走mcp) → {{magicDir}}/plans/{YYYY-MM}/{DD}/
145
145
  ② 更新 handoff(记录实际产出与偏离)
146
146
  ③ Step 9 Report Closure(如为 runtime-fix plan)→ gateway.md 追 - [x]
147
147
  ④ 架构文档回看(ADD-12)
@@ -1,10 +1,10 @@
1
- # farm-agent-add-coder-npm-package-add-route-v1
1
+ # add-coder-add-coder-npm-package-add-route-v1
2
2
 
3
3
  > **定位**:Plan → ADD Step 执行映射。不重复 Plan 的架构设计和 Specs 的任务细节——只定义每个 ADD Step 在本 Plan 中的具体动作、输入、产出。
4
4
  >
5
- > **模式**:重型(Heavyweight)——每一步产出检查强制执行"验证并更新项目状态"。本项目为 npm 包工程化,代码产物在 `packages/add-coder/`,不修改 farm-agent 业务代码。
5
+ > **模式**:重型(Heavyweight)——每一步产出检查强制执行"验证并更新项目状态"。本项目为 npm 包工程化,代码产物在 `packages/add-coder/`,不修改 add-coder 业务代码。
6
6
  >
7
- > **绑定**:Plan: `.qoder/plans/2026-07/08/farm-agent-add-coder-npm-package-plan-v1.md` · Spec: `.qoder/specs/farm-agent-add-coder-npm-package/spec.md` ✅ · Tasks: `.qoder/specs/farm-agent-add-coder-npm-package/tasks.md` ✅ · Handoff: `.qoder/plans/2026-07/08/farm-agent-add-coder-npm-package-handoff-v1.md` ✅
7
+ > **绑定**:Plan: `{{magicDir}}/plans/2026-07/08/add-coder-add-coder-npm-package-plan-v1.md` · Spec: `{{magicDir}}/specs/add-coder-add-coder-npm-package/spec.md` ✅ · Tasks: `{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md` ✅ · Handoff: `{{magicDir}}/plans/2026-07/08/add-coder-add-coder-npm-package-handoff-v1.md` ✅
8
8
 
9
9
  ---
10
10
 
@@ -13,9 +13,9 @@
13
13
  **目的**:代码动工前,确认 Plan + Specs + Handoff 三元组齐全,项目文档反映即将实现的变更。
14
14
 
15
15
  **输入**:
16
- - 上游 Review:`.qoder/reviews/farm-agent-add-coder-npm-package-review-v1.md` ✅
17
- - 上游 Review v2:`.qoder/reviews/farm-agent-add-coder-npm-package-review-v2.md` ✅ — 代码实现评审
18
- - Plan 文档:`.qoder/plans/2026-07/08/farm-agent-add-coder-npm-package-plan-v1.md` ✅
16
+ - 上游 Review:`{{magicDir}}/reviews/add-coder-add-coder-npm-package-review-v1.md` ✅
17
+ - 上游 Review v2:`{{magicDir}}/reviews/add-coder-add-coder-npm-package-review-v2.md` ✅ — 代码实现评审
18
+ - Plan 文档:`{{magicDir}}/plans/2026-07/08/add-coder-add-coder-npm-package-plan-v1.md` ✅
19
19
 
20
20
  **动作**:
21
21
  1. 确认 Specs 三元组就绪:`spec.md` + `tasks.md` + `checklist.md` ✅
@@ -44,7 +44,7 @@
44
44
 
45
45
  ## Step 1:功能分析与审计打点定义
46
46
 
47
- **目的**:本 Plan 为 npm 包工程化,不修改 farm-agent 业务代码。无需新增 `AgentAuditPhase` 字面量。审计通过 `record_dev_operation`(ADD-7)落库 DevOperation 表。
47
+ **目的**:本 Plan 为 npm 包工程化,不修改 add-coder 业务代码。无需新增 `AgentAuditPhase` 字面量。审计通过 `record_dev_operation`(ADD-7)落库 DevOperation 表。
48
48
 
49
49
  **输入**:
50
50
  - Plan §3 的 Task 列表(6 轮 11 个 Task)
@@ -60,7 +60,7 @@
60
60
  | 审计方式 | 适用场景 | 工具 |
61
61
  |---------|---------|------|
62
62
  | `record_dev_operation` | 文件变更(CREATE/MODIFY/DELETE) | MCP 工具 |
63
- | 无 AgentAuditPhase | 本 Plan 不修改 farm-agent 业务代码 | — |
63
+ | 无 AgentAuditPhase | 本 Plan 不修改 add-coder 业务代码 | — |
64
64
 
65
65
  ---
66
66
 
@@ -108,7 +108,7 @@
108
108
  | 4 | 3 | Claude 适配器实现 | `templates/adapters/claude/`、`src/adapters/claude/renderer.ts` | `record_dev_operation` (CREATE) | — | 第2轮 Task 0 | ⬜ |
109
109
  | 5 | 3 | Qoder 适配器实现 | `templates/adapters/qoder/`、`src/adapters/qoder/renderer.ts` | `record_dev_operation` (CREATE/MODIFY) | — | 第3轮 Task 0 | ⬜ |
110
110
  | 6 | 3 | VS Code 适配器实现 | `templates/adapters/vscode/`、`src/adapters/vscode/renderer.ts` | `record_dev_operation` (CREATE/MODIFY) | — | 第3轮 Task 1 | ⬜ |
111
- | 6b | 3 | 三目录部署(core→.add/.qoder/.claude) | `src/core/renderer.ts`、`src/cli/commands/init.ts`、adapter renderers | `record_dev_operation` (MODIFY) | — | 第3轮 Task 2 | ⬜ |
111
+ | 6b | 3 | 三目录部署(core→.add/{{magicDir}}/.claude) | `src/core/renderer.ts`、`src/cli/commands/init.ts`、adapter renderers | `record_dev_operation` (MODIFY) | — | 第3轮 Task 2 | ⬜ |
112
112
  | 7 | 4 | 配置系统(Zod schema) | `src/config/schema.ts`、`src/config/defaults.ts` | `record_dev_operation` (CREATE) | — | 无 | ⬜ |
113
113
  | 8 | 4 | CLI 重写 | `src/cli/`、`bin/add-coder.js`、`tsup.config.ts` | `record_dev_operation` (CREATE/MODIFY) | — | 第1轮 Task 0 + 第4轮 Task 0 | ⬜ |
114
114
  | 9 | 5 | 集成测试 + 文档 + devlog | 测试文件、`README.md`、`package.json` | `record_dev_operation` (CREATE/MODIFY) | — | 全部前序 Task | ⬜ |
@@ -1,6 +1,6 @@
1
1
  # add-coder npm 包 — 6 轮原子事务交接手册
2
2
 
3
- > **适用场景**:6 轮原子事务变更,每轮独立收敛。将 ADD 范式从 farm-agent 内部工具改造为可发布的 npm 包。
3
+ > **适用场景**:6 轮原子事务变更,每轮独立收敛。将 ADD 范式从 add-coder 内部工具改造为可发布的 npm 包。
4
4
  >
5
5
  > **用途**:每个新对话开始时,把对应轮次章节粘贴给 LLM。
6
6
 
@@ -8,9 +8,9 @@
8
8
 
9
9
  ## 全局元信息
10
10
 
11
- - **父 Plan**: `farm-agent-add-coder-npm-package-plan-v1.md`
12
- - **原子事务拓扑**: `farm-agent-add-coder-npm-package-add-route-v1.md`
13
- - **目标仓库**: `/home/xmm/ai/farm-agent`
11
+ - **父 Plan**: `add-coder-add-coder-npm-package-plan-v1.md`
12
+ - **原子事务拓扑**: `add-coder-add-coder-npm-package-add-route-v1.md`
13
+ - **目标仓库**: `/home/xmm/ai/add-coder`
14
14
  - **总文件数**: 约 90 个独立文件
15
15
  - **轮次数**: 6 轮局部闭包
16
16
  - **拆分原则**: 以业务原子闭包为主,以对话上下文容量为辅
@@ -47,7 +47,7 @@
47
47
 
48
48
  ### 交接手册与 spec 的优先级
49
49
 
50
- - 本 handoff 是新对话的入口索引。具体实现细节以 `.qoder/specs/farm-agent-add-coder-npm-package/spec.md`、`tasks.md`、`checklist.md` 为准。
50
+ - 本 handoff 是新对话的入口索引。具体实现细节以 `{{magicDir}}/specs/add-coder-add-coder-npm-package/spec.md`、`tasks.md`、`checklist.md` 为准。
51
51
  - 如果 handoff 摘要与 spec/tasks/checklist 存在颗粒度差异,以 spec/tasks/checklist 为准。
52
52
 
53
53
  ---
@@ -83,9 +83,9 @@ query_audit_logs({ targetId: "packages/add-coder/templates/core/prisma/add.prism
83
83
  ```
84
84
  1. session-init SKILL
85
85
  2. query_audit_logs({ planKeyword: "add-coder-npm-package" }) → 查看本轮 4 条记录
86
- 3. read ".qoder/specs/farm-agent-add-coder-npm-package/spec.md"
87
- 4. read ".qoder/specs/farm-agent-add-coder-npm-package/tasks.md"(第1轮)
88
- 5. read ".qoder/specs/farm-agent-add-coder-npm-package/checklist.md"(一、二、四)
86
+ 3. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/spec.md"
87
+ 4. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md"(第1轮)
88
+ 5. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md"(一、二、四)
89
89
  ```
90
90
 
91
91
  ### 原子事务目标
@@ -96,9 +96,9 @@ query_audit_logs({ targetId: "packages/add-coder/templates/core/prisma/add.prism
96
96
 
97
97
  ### spec 文件
98
98
 
99
- - `.qoder/specs/farm-agent-add-coder-npm-package/spec.md`
100
- - `.qoder/specs/farm-agent-add-coder-npm-package/tasks.md`(第1轮)
101
- - `.qoder/specs/farm-agent-add-coder-npm-package/checklist.md`(一、二、四)
99
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/spec.md`
100
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md`(第1轮)
101
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md`(一、二、四)
102
102
 
103
103
  ### 你要改的文件(Task 1.0: 2 新建 + Task 1.1: ~70 修改)
104
104
 
@@ -106,11 +106,11 @@ query_audit_logs({ targetId: "packages/add-coder/templates/core/prisma/add.prism
106
106
  |------|------|--------|
107
107
  | `packages/add-coder/templates/core/prisma/add.prisma` | 新建 | DevOperation + AuditLog 模型定义 |
108
108
  | `packages/add-coder/src/cli/prisma-injector.ts` | 新建 | Prisma 注入器(检测→复制→迁移→generate) |
109
- | `templates/` 下 15 个 `.md` 模板 | 修改 | `farm-agent-*` → `{{projectName}}-*` |
109
+ | `templates/` 下 15 个 `.md` 模板 | 修改 | `add-coder-*` → `{{projectName}}-*` |
110
110
  | `skills/` 下 2 个 SKILL.md | 修改 | `/home/xmm/` → `{{projectRoot}}/` |
111
111
  | `scripts/mcp-server.ts` + `add-coder-mcp-server.ts` | 修改 | 数据库密码 → `process.env.DATABASE_URL` |
112
- | `.qoder/settings.json` / `.qoder/mcp.json` | 修改 | 硬编码路径 → 占位符 |
113
- | `.qoder/hooks/` 下 14 个 `.sh` + `lib/` | 修改 | 项目名提取逻辑 |
112
+ | `{{magicDir}}/settings.json` / `{{magicDir}}/mcp.json` | 修改 | 硬编码路径 → 占位符 |
113
+ | `{{magicDir}}/hooks/` 下 14 个 `.sh` + `lib/` | 修改 | 项目名提取逻辑 |
114
114
  | `.vscode/` 下 4 个文件 | 修改 | MCP 路径 → `{{projectRoot}}` |
115
115
  | `reports/` 下 7 个文件 | 修改 | 硬编码 → `{{projectName}}` |
116
116
  | `packages/add-coder/src/core/renderer.ts` | 新建 | 核心渲染器 |
@@ -182,7 +182,7 @@ query_audit_logs({ targetId: "packages/add-coder/src/adapters/" })
182
182
  **恢复顺序建议**:
183
183
  ```
184
184
  1. query_audit_logs({ planKeyword: "add-coder-npm-package" })
185
- 2. read ".qoder/specs/farm-agent-add-coder-npm-package/tasks.md"(第2轮)
185
+ 2. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md"(第2轮)
186
186
  ```
187
187
 
188
188
  ### 原子事务目标
@@ -191,7 +191,7 @@ query_audit_logs({ targetId: "packages/add-coder/src/adapters/" })
191
191
 
192
192
  ### spec 文件
193
193
 
194
- - `.qoder/specs/farm-agent-add-coder-npm-package/tasks.md`(第2轮)
194
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md`(第2轮)
195
195
 
196
196
  ### 你要改的文件(22 迁移 + 4 新建)
197
197
 
@@ -206,9 +206,9 @@ query_audit_logs({ targetId: "packages/add-coder/src/adapters/" })
206
206
  | `templates/scripts/` | `templates/core/scripts/` | 迁移 |
207
207
  | `templates/reports/` | `templates/core/reports/` | 迁移 |
208
208
  | `templates/tools/` | `templates/core/tools/` | 迁移 |
209
- | `templates/.qoder/hooks/` | `templates/adapters/qoder/hooks/` | 迁移 |
210
- | `templates/.qoder/settings.json` | `templates/adapters/qoder/settings.json` | 迁移 |
211
- | `templates/.qoder/mcp.json` | `templates/adapters/qoder/mcp.json` | 迁移 |
209
+ | `templates/{{magicDir}}/hooks/` | `templates/adapters/qoder/hooks/` | 迁移 |
210
+ | `templates/{{magicDir}}/settings.json` | `templates/adapters/qoder/settings.json` | 迁移 |
211
+ | `templates/{{magicDir}}/mcp.json` | `templates/adapters/qoder/mcp.json` | 迁移 |
212
212
  | `templates/.vscode/` (4) | `templates/adapters/vscode/` | 迁移 |
213
213
  | — | `templates/adapters/claude/` | 新建空壳 |
214
214
  | — | `templates/shared/hooks-lib/common.sh` | 新建 |
@@ -258,8 +258,8 @@ query_audit_logs({ targetId: "packages/add-coder/src/adapters/claude/renderer.ts
258
258
  **恢复顺序建议**:
259
259
  ```
260
260
  1. query_audit_logs({ planKeyword: "add-coder-npm-package" })
261
- 2. read ".qoder/specs/farm-agent-add-coder-npm-package/tasks.md"(第3轮)
262
- 3. read ".qoder/specs/farm-agent-add-coder-npm-package/checklist.md"(三)
261
+ 2. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md"(第3轮)
262
+ 3. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md"(三)
263
263
  ```
264
264
 
265
265
  ### 原子事务目标
@@ -268,8 +268,8 @@ query_audit_logs({ targetId: "packages/add-coder/src/adapters/claude/renderer.ts
268
268
 
269
269
  ### spec 文件
270
270
 
271
- - `.qoder/specs/farm-agent-add-coder-npm-package/tasks.md`(第3轮)
272
- - `.qoder/specs/farm-agent-add-coder-npm-package/checklist.md`(三)
271
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md`(第3轮)
272
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md`(三)
273
273
 
274
274
  ### 你要改的文件(Task 3.0 Claude: 14 新建 / Task 3.1 Qoder: 3 / Task 3.2 VS Code: 3)
275
275
 
@@ -300,7 +300,7 @@ query_audit_logs({ targetId: "packages/add-coder/src/adapters/claude/renderer.ts
300
300
  #### 已完成验证
301
301
 
302
302
  - `npx add-coder init --adapter claude` 生成 `.claude/` 目录 ✅
303
- - `npx add-coder init --adapter qoder` 生成 `.qoder/` 目录 ✅
303
+ - `npx add-coder init --adapter qoder` 生成 `{{magicDir}}/` 目录 ✅
304
304
  - `npx add-coder init --adapter vscode` 生成 `.vscode/` 目录 ✅
305
305
 
306
306
  ---
@@ -336,8 +336,8 @@ query_audit_logs({ targetId: "packages/add-coder/src/cli/commands/init.ts" })
336
336
  **恢复顺序建议**:
337
337
  ```
338
338
  1. query_audit_logs({ planKeyword: "add-coder-npm-package" })
339
- 2. read ".qoder/specs/farm-agent-add-coder-npm-package/tasks.md"(第4轮)
340
- 3. read ".qoder/specs/farm-agent-add-coder-npm-package/checklist.md"(五)
339
+ 2. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md"(第4轮)
340
+ 3. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md"(五)
341
341
  ```
342
342
 
343
343
  ### 原子事务目标
@@ -346,8 +346,8 @@ query_audit_logs({ targetId: "packages/add-coder/src/cli/commands/init.ts" })
346
346
 
347
347
  ### spec 文件
348
348
 
349
- - `.qoder/specs/farm-agent-add-coder-npm-package/tasks.md`(第4轮)
350
- - `.qoder/specs/farm-agent-add-coder-npm-package/checklist.md`(五)
349
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md`(第4轮)
350
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md`(五)
351
351
 
352
352
  ### 你要改的文件(Task 4.0: 2 新建 + Task 4.1: 10 文件)
353
353
 
@@ -412,8 +412,8 @@ query_audit_logs({ targetId: "packages/add-coder/package.json" })
412
412
  **恢复顺序建议**:
413
413
  ```
414
414
  1. query_audit_logs({ planKeyword: "add-coder-npm-package" })
415
- 2. read ".qoder/specs/farm-agent-add-coder-npm-package/tasks.md"(第5轮)
416
- 3. read ".qoder/specs/farm-agent-add-coder-npm-package/checklist.md"(五、六、八)
415
+ 2. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md"(第5轮)
416
+ 3. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md"(五、六、八)
417
417
  ```
418
418
 
419
419
  ### 原子事务目标
@@ -422,8 +422,8 @@ query_audit_logs({ targetId: "packages/add-coder/package.json" })
422
422
 
423
423
  ### spec 文件
424
424
 
425
- - `.qoder/specs/farm-agent-add-coder-npm-package/tasks.md`(第5轮)
426
- - `.qoder/specs/farm-agent-add-coder-npm-package/checklist.md`(五、六、八)
425
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md`(第5轮)
426
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md`(五、六、八)
427
427
 
428
428
  ### 你要改的文件(6 文件)
429
429
 
@@ -495,8 +495,8 @@ query_audit_logs({ targetId: "packages/add-coder/src/cli/detect.ts" })
495
495
  **恢复顺序建议**:
496
496
  ```
497
497
  1. query_audit_logs({ planKeyword: "add-coder-npm-package" })
498
- 2. read ".qoder/specs/farm-agent-add-coder-npm-package/tasks.md"(第6轮)
499
- 3. read ".qoder/specs/farm-agent-add-coder-npm-package/checklist.md"(七)
498
+ 2. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md"(第6轮)
499
+ 3. read "{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md"(七)
500
500
  4. 执行 npm run generate 确保 GENERATED 区块最新
501
501
  ```
502
502
 
@@ -507,9 +507,9 @@ query_audit_logs({ targetId: "packages/add-coder/src/cli/detect.ts" })
507
507
 
508
508
  ### spec 文件
509
509
 
510
- - `.qoder/specs/farm-agent-add-coder-npm-package/spec.md`(Requirement: CaijueHub 裁决层)
511
- - `.qoder/specs/farm-agent-add-coder-npm-package/tasks.md`(第6轮)
512
- - `.qoder/specs/farm-agent-add-coder-npm-package/checklist.md`(七)
510
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/spec.md`(Requirement: CaijueHub 裁决层)
511
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md`(第6轮)
512
+ - `{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md`(七)
513
513
 
514
514
  ### 你要改的文件(~16 个)
515
515
 
@@ -610,11 +610,11 @@ npm run generate → transcribe.ts → GENERATED 区块 │ injectPrisma
610
610
  | caijue.toml | 无 | 索引注册 4 个策略 | 新增 |
611
611
  | transcribe.ts | 无 | GENERATED 区块产出引擎 | 新增 |
612
612
  | 策略文件 | 无 | GENERATED+USER CODE 双区块模式 | 新增 |
613
- | 模板部署策略 | 仅 `.add/` | `.qoder/` `.claude/` 同时部署 core 内容 | IDE 只认自身 magic path,需三者各自完整 |
613
+ | 模板部署策略 | 仅 `.add/` | `{{magicDir}}/` `.claude/` 同时部署 core 内容 | IDE 只认自身 magic path,需三者各自完整 |
614
614
  | `templates/core/prisma/` | add.prisma 模板 | 删除,由 injectPrisma 直接处理 | Prisma 文件不应在 `.add/` 下 |
615
615
  | plans/specs 示例 | 无 | `templates/core/plans/` `specs/` 含 add-coder 示例 | 用户首次 init 即可看到完整 ADD 文档样例 |
616
616
  | 三目录部署 | 仅 `.add/` | Plan 已设计,`renderCore()` 改造待执行 | 见 Plan §3.2 改造待执行清单 |
617
- | Review v2 回流 | 无 | `.qoder/reviews/farm-agent-add-coder-npm-package-review-v2.md` | 代码实现评审:2 条 P0(spawnSync catch 失能、ask 重复定义)在 Plan §4.8 回流,P0-1 已补充至 Task 1.0 验收项 |
617
+ | Review v2 回流 | 无 | `{{magicDir}}/reviews/add-coder-add-coder-npm-package-review-v2.md` | 代码实现评审:2 条 P0(spawnSync catch 失能、ask 重复定义)在 Plan §4.8 回流,P0-1 已补充至 Task 1.0 验收项 |
618
618
 
619
619
  ## §8 验证结果
620
620
 
@@ -650,15 +650,15 @@ npm run generate → transcribe.ts → GENERATED 区块 │ injectPrisma
650
650
 
651
651
  你在执行 add-coder npm 包工程化的 [第N轮]。
652
652
  上游 [第1轮~第N-1轮] 已完成。
653
- 先读 .qoder/plans/2026-07/08/farm-agent-add-coder-npm-package-handoff-v1.md 的 <第N轮> 章节。
653
+ 先读 {{magicDir}}/plans/2026-07/08/add-coder-add-coder-npm-package-handoff-v1.md 的 <第N轮> 章节。
654
654
 
655
655
  ## 启动步骤(按顺序)
656
656
 
657
657
  1. 执行 session-init SKILL
658
658
  2. 执行 add-paradigm SKILL
659
- 3. 读 .qoder/specs/farm-agent-add-coder-npm-package/spec.md
660
- 4. 读 .qoder/specs/farm-agent-add-coder-npm-package/tasks.md(第N轮)
661
- 5. 读 .qoder/specs/farm-agent-add-coder-npm-package/checklist.md
659
+ 3. 读 {{magicDir}}/specs/add-coder-add-coder-npm-package/spec.md
660
+ 4. 读 {{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md(第N轮)
661
+ 5. 读 {{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md
662
662
  6. 按 tasks.md 顺序执行代码修改
663
663
  7. 每完成一个 Task:读 checklist.md → 逐项验证 → 附证据 → 勾选
664
664
  8. 每完成一个文件修改:record_dev_operation 写入 ADD-7 审计