add-coder 0.3.25-0 → 0.3.25
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.
- package/README.en.md +10 -10
- package/README.md +20 -46
- package/dist/index.js +6 -69
- package/package.json +1 -1
- package/templates/.add-coder-src-hash.json +18 -22
- package/templates/core/scripts/db-ensure.sh +0 -8
- package/templates/core/scripts/mcp-server/shared/db-types.ts +208 -0
- package/templates/core/scripts/mcp-server/shared/response.ts +2 -3
- package/templates/core/scripts/mcp-server/tools/audit.ts +10 -7
- package/templates/core/scripts/mcp-server/tools/context.ts +19 -0
- package/templates/core/scripts/mcp-server/tools/contract.ts +6 -4
- package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +2 -69
- package/templates/core/scripts/mcp-server/tools/gateway/check_spec_sync.ts +1 -1
- package/templates/core/scripts/mcp-server/tools/hitl.ts +116 -34
- package/templates/core/scripts/mcp-server/tools/index.ts +1 -66
- package/templates/core/scripts/mcp-server/tools/plan.ts +33 -16
- package/templates/core/scripts/mcp-server/tools/review.ts +12 -9
- package/templates/core/scripts/mcp-server.ts +1 -2
- package/templates/core/templates/simple-plan-template.md +13 -0
- package/templates/core/templates/simple-plan-template.schema.json +10 -0
- package/templates/core/templates/standard-plan-template.md +13 -0
- package/templates/core/templates/standard-plan-template.schema.json +10 -0
- package/templates/adapters/codex/config.toml.example +0 -20
- package/templates/core/plans/2026-07/08/add-coder-npm-package-add-route-v1.md +0 -331
- package/templates/core/plans/2026-07/08/add-coder-npm-package-handoff-v1.md +0 -686
- package/templates/core/plans/2026-07/08/add-coder-npm-package-plan-v1.md +0 -895
- package/templates/core/scripts/mcp-server/shared/redact.ts +0 -28
|
@@ -5,9 +5,12 @@ import { join, basename } from "path"
|
|
|
5
5
|
import { textResponse, errorResponse } from "../shared/response.js"
|
|
6
6
|
import { readFileSafe, readdirRecursive, PROJECT_ROOT, MAGIC_DIR } from "../shared/fs.js"
|
|
7
7
|
import { prisma } from "../shared/prisma.js"
|
|
8
|
+
import type { PlanRow } from "../shared/db-types.js"
|
|
9
|
+
import { PlanRowSchema, validatedDelegate } from "../shared/db-types.js"
|
|
8
10
|
|
|
11
|
+
// 无类型边界单点(zod 托管):动态加载的 prisma client 在此一次性转为运行期校验的泛型委托
|
|
9
12
|
const db = {
|
|
10
|
-
get plan() { return prisma.planRecord
|
|
13
|
+
get plan() { return validatedDelegate<PlanRow>(prisma.planRecord, PlanRowSchema, "PlanRecord") },
|
|
11
14
|
}
|
|
12
15
|
|
|
13
16
|
export function registerPlanTools(server: ToolRegistrar) {
|
|
@@ -81,8 +84,8 @@ export function registerPlanTools(server: ToolRegistrar) {
|
|
|
81
84
|
)
|
|
82
85
|
const addRoutePath = addRouteFile ? join(plansDir, addRouteFile) : undefined
|
|
83
86
|
// upsert PlanRecord
|
|
84
|
-
const existing = await db.plan.findFirst({ where: { planName: t.name } })
|
|
85
|
-
const data = {
|
|
87
|
+
const existing = await db.plan.findFirst({ where: { planName: t.name } })
|
|
88
|
+
const data: Partial<PlanRow> = {
|
|
86
89
|
planPath: t.path,
|
|
87
90
|
specPath: existsSync(specPath) ? specPath : undefined,
|
|
88
91
|
tasksPath: existsSync(tasksPath) ? tasksPath : undefined,
|
|
@@ -100,6 +103,20 @@ export function registerPlanTools(server: ToolRegistrar) {
|
|
|
100
103
|
newPlans.push(t.name.replace(/-plan-v\d+$/, ""))
|
|
101
104
|
}
|
|
102
105
|
}
|
|
106
|
+
// ── 孤儿对账(全量扫描时):PlanRecord 存在但 planPath 文件缺失 → 悬空清单。
|
|
107
|
+
// 来源:create_hitl 预置行被中断 / 用户放弃未清理。允许暂时存在,不允许不可见。 ──
|
|
108
|
+
if (!pn) {
|
|
109
|
+
const allPlans = await db.plan.findMany({ orderBy: { createdAt: "desc" } })
|
|
110
|
+
const orphans = allPlans.filter(p => !existsSync(p.planPath))
|
|
111
|
+
if (orphans.length > 0) {
|
|
112
|
+
results.push("", `⚠️ 悬空 Plan(记录在、文件缺失)— 续写或清理:`)
|
|
113
|
+
const cutoff = Date.now() - 14 * 86400000
|
|
114
|
+
for (const o of orphans) {
|
|
115
|
+
const stale = o.createdAt.getTime() < cutoff
|
|
116
|
+
results.push(` ${stale ? "🔴 超 14 天,建议清理" : "·"} ${o.planName} → ${o.planPath}`)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
103
120
|
// scanAll 完成后提示用户调用 review_track 填充缺陷指标
|
|
104
121
|
if (newPlans.length > 0) {
|
|
105
122
|
results.push(``, `💡 以下 Plan 为新创建,ReviewRecord 暂无 P0/P1 指标:`)
|
|
@@ -120,13 +137,13 @@ export function registerPlanTools(server: ToolRegistrar) {
|
|
|
120
137
|
}, async (args: Record<string, unknown>) => {
|
|
121
138
|
try {
|
|
122
139
|
const { planName } = args as { planName: string }
|
|
123
|
-
const plan = await db.plan.findFirst({ where: { planName } })
|
|
140
|
+
const plan = await db.plan.findFirst({ where: { planName } })
|
|
124
141
|
if (!plan) return textResponse(`📋 Plan: 未跟踪\nplanName: ${planName}\n\n操作: plan_track({ planName: "${planName}" })`)
|
|
125
|
-
const t = plan.totalTasks
|
|
126
|
-
const d = plan.doneTasks
|
|
127
|
-
const ct = plan.checklistT
|
|
128
|
-
const ctd = plan.checklistTDone
|
|
129
|
-
const cr = plan.checklistR
|
|
142
|
+
const t = plan.totalTasks || 0
|
|
143
|
+
const d = plan.doneTasks || 0
|
|
144
|
+
const ct = plan.checklistT || 0
|
|
145
|
+
const ctd = plan.checklistTDone || 0
|
|
146
|
+
const cr = plan.checklistR || 0
|
|
130
147
|
const taskPct = t > 0 ? Math.round((d / t) * 100) : 0
|
|
131
148
|
const lines = [
|
|
132
149
|
`📊 ${planName}`,
|
|
@@ -155,16 +172,16 @@ export function registerPlanTools(server: ToolRegistrar) {
|
|
|
155
172
|
}, async (args: Record<string, unknown>) => {
|
|
156
173
|
try {
|
|
157
174
|
const { planName } = args as { planName: string }
|
|
158
|
-
const plan = await db.plan.findFirst({ where: { planName } })
|
|
175
|
+
const plan = await db.plan.findFirst({ where: { planName } })
|
|
159
176
|
if (!plan) return errorResponse(`PlanRecord 未找到: ${planName}`)
|
|
160
|
-
const planPath = plan.planPath
|
|
177
|
+
const planPath = plan.planPath
|
|
161
178
|
if (!existsSync(planPath)) return errorResponse(`Plan 文件不存在: ${planPath}`)
|
|
162
179
|
const content = readFileSync(planPath, "utf-8")
|
|
163
|
-
const t = plan.totalTasks
|
|
164
|
-
const d = plan.doneTasks
|
|
165
|
-
const ct = plan.checklistT
|
|
166
|
-
const ctd = plan.checklistTDone
|
|
167
|
-
const cr = plan.checklistR
|
|
180
|
+
const t = plan.totalTasks || 0
|
|
181
|
+
const d = plan.doneTasks || 0
|
|
182
|
+
const ct = plan.checklistT || 0
|
|
183
|
+
const ctd = plan.checklistTDone || 0
|
|
184
|
+
const cr = plan.checklistR || 0
|
|
168
185
|
const pct = t > 0 ? Math.round((d / t) * 100) : 0
|
|
169
186
|
const snapshot = [
|
|
170
187
|
`## 📊 Plan 进度快照`,
|
|
@@ -5,14 +5,17 @@ import { join, basename } from "path"
|
|
|
5
5
|
import { textResponse, errorResponse } from "../shared/response.js"
|
|
6
6
|
import { readFileSafe, readdirRecursive, PROJECT_ROOT, MAGIC_DIR } from "../shared/fs.js"
|
|
7
7
|
import { prisma } from "../shared/prisma.js"
|
|
8
|
+
import type { PlanRow, ReviewRow } from "../shared/db-types.js"
|
|
9
|
+
import { PlanRowSchema, ReviewRowSchema, validatedDelegate } from "../shared/db-types.js"
|
|
8
10
|
|
|
9
11
|
const db = {
|
|
10
|
-
get review() { return prisma.reviewRecord
|
|
11
|
-
get plan() { return prisma.planRecord
|
|
12
|
+
get review() { return validatedDelegate<ReviewRow>(prisma.reviewRecord, ReviewRowSchema, "ReviewRecord") },
|
|
13
|
+
get plan() { return validatedDelegate<PlanRow>(prisma.planRecord, PlanRowSchema, "PlanRecord") },
|
|
12
14
|
}
|
|
13
15
|
|
|
14
|
-
// 检测 review
|
|
15
|
-
|
|
16
|
+
// 检测 review 类型(与 ReviewRowSchema.type 枚举对齐)
|
|
17
|
+
type ReviewTypeValue = "PLAN_REVIEW" | "IMPLEMENTATION" | "RUNTIME"
|
|
18
|
+
function detectReviewType(filename: string): ReviewTypeValue {
|
|
16
19
|
const l = filename.toLowerCase()
|
|
17
20
|
if (l.includes("implementation")) return "IMPLEMENTATION"
|
|
18
21
|
if (l.includes("runtime")) return "RUNTIME"
|
|
@@ -67,9 +70,9 @@ export function registerReviewTools(server: ToolRegistrar) {
|
|
|
67
70
|
// 需要用 contains 匹配,而不是 exact match
|
|
68
71
|
const planMatch = await db.plan.findFirst({
|
|
69
72
|
where: { planName: { contains: derivedPlan } },
|
|
70
|
-
})
|
|
73
|
+
})
|
|
71
74
|
const actualPlanName = planMatch
|
|
72
|
-
?
|
|
75
|
+
? planMatch.planName
|
|
73
76
|
: derivedPlan // fallback,让外键约束报错时提示更清晰
|
|
74
77
|
|
|
75
78
|
const content = await readFileSafe(fullPath)
|
|
@@ -79,7 +82,7 @@ export function registerReviewTools(server: ToolRegistrar) {
|
|
|
79
82
|
const stats = countIssueType(content)
|
|
80
83
|
const record = await db.review.findFirst({
|
|
81
84
|
where: { planName: actualPlanName, type: rtype },
|
|
82
|
-
})
|
|
85
|
+
})
|
|
83
86
|
|
|
84
87
|
const data = {
|
|
85
88
|
reviewPath: fullPath,
|
|
@@ -117,7 +120,7 @@ export function registerReviewTools(server: ToolRegistrar) {
|
|
|
117
120
|
const rows = await db.review.findMany({
|
|
118
121
|
where: { planName },
|
|
119
122
|
orderBy: { type: "asc" },
|
|
120
|
-
})
|
|
123
|
+
})
|
|
121
124
|
|
|
122
125
|
if (!rows.length) {
|
|
123
126
|
return textResponse(
|
|
@@ -155,7 +158,7 @@ export function registerReviewTools(server: ToolRegistrar) {
|
|
|
155
158
|
}, async (args: Record<string, unknown>) => {
|
|
156
159
|
try {
|
|
157
160
|
const { planName } = args as { planName: string }
|
|
158
|
-
const rows = await db.review.findMany({ where: { planName } })
|
|
161
|
+
const rows = await db.review.findMany({ where: { planName } })
|
|
159
162
|
|
|
160
163
|
if (!rows.length) return errorResponse(`无 ReviewRecord: ${planName}`)
|
|
161
164
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/server"
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/server/stdio"
|
|
3
3
|
import { registerAll } from "./mcp-server/index.js"
|
|
4
|
-
import { redact } from "./mcp-server/shared/redact.js"
|
|
5
4
|
|
|
6
5
|
async function main() {
|
|
7
6
|
const server = new McpServer(
|
|
@@ -15,6 +14,6 @@ async function main() {
|
|
|
15
14
|
}
|
|
16
15
|
|
|
17
16
|
main().catch((error) => {
|
|
18
|
-
console.error("[ADD-MCP] Fatal error:",
|
|
17
|
+
console.error("[ADD-MCP] Fatal error:", error)
|
|
19
18
|
process.exit(1)
|
|
20
19
|
})
|
|
@@ -34,6 +34,19 @@
|
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
+
## Review 回流记录
|
|
38
|
+
|
|
39
|
+
> **功能**:总览索引——记录所有 review 发现及其回流落点。读者可从表快速扫描“有哪些问题”,再跳转到对应位置看“改了什么”。
|
|
40
|
+
> **回流规则**:每条发现必须在 Plan 体中对应位置有落点(补充 Task / 修正描述 / 新增约束),表行与落点双向一致。
|
|
41
|
+
|
|
42
|
+
| # | 来源阶段 | 严重度 | 发现 | 回流落点 |
|
|
43
|
+
|---|:---:|:---:|------|------|
|
|
44
|
+
| R1 | Plan Review | 🔴高 | {发现简述} | Task {N} / §{章节}:{具体修改} |
|
|
45
|
+
|
|
46
|
+
> **来源阶段枚举**:`Plan Review`(Step 0.6.5 设计审查)| `Impl Review`(Step 3-7 实现审查)| `Runtime Review`(Step 8+ 运行时纠偏)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
37
50
|
## 一、Plan 概述
|
|
38
51
|
|
|
39
52
|
- **现状**: 一句话描述当前问题
|
|
@@ -12,6 +12,16 @@
|
|
|
12
12
|
"required": true,
|
|
13
13
|
"note": "AI 必须先在此表中列出实际完整文件路径和方案决策,等待人类拍板后再执行。禁止偷懒写'等 N 个文件'。"
|
|
14
14
|
},
|
|
15
|
+
{
|
|
16
|
+
"id": "review-backflow",
|
|
17
|
+
"heading": "## Review 回流记录",
|
|
18
|
+
"required": true,
|
|
19
|
+
"note": "总览索引表:记录所有 review 发现及其回流落点。列:'#' + '来源阶段' + '严重度' + '发现' + '回流落点'。来源阶段枚举:Plan Review / Impl Review / Runtime Review。",
|
|
20
|
+
"validation": {
|
|
21
|
+
"columns": ["#", "来源阶段", "严重度", "发现", "回流落点"],
|
|
22
|
+
"source_phase_enum": ["Plan Review", "Impl Review", "Runtime Review"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
15
25
|
{
|
|
16
26
|
"id": "changes",
|
|
17
27
|
"heading": "## 二、变更范围",
|
|
@@ -37,6 +37,19 @@
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
+
## Review 回流记录
|
|
41
|
+
|
|
42
|
+
> **功能**:总览索引——记录所有 review 发现及其回流落点。读者可从表快速扫描“有哪些问题”,再跳转到对应位置看“改了什么”。
|
|
43
|
+
> **回流规则**:每条发现必须在 Plan 体中对应位置有落点(补充 Task / 修正描述 / 新增约束),表行与落点双向一致。
|
|
44
|
+
|
|
45
|
+
| # | 来源阶段 | 严重度 | 发现 | 回流落点 |
|
|
46
|
+
|---|:---:|:---:|------|------|
|
|
47
|
+
| R1 | Plan Review | 🔴高 | {发现简述} | Task {N.M} / §{章节}:{具体修改} |
|
|
48
|
+
|
|
49
|
+
> **来源阶段枚举**:`Plan Review`(Step 0.6.5 设计审查)| `Impl Review`(Step 3-7 实现审查)| `Runtime Review`(Step 8+ 运行时纠偏)
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
40
53
|
## 一、背景与目标
|
|
41
54
|
|
|
42
55
|
### 1.1 问题现状
|
|
@@ -12,6 +12,16 @@
|
|
|
12
12
|
"required": true,
|
|
13
13
|
"note": "AI 必须先在此表中列出全部关键决策,等待人类拍板后再展开详细设计。"
|
|
14
14
|
},
|
|
15
|
+
{
|
|
16
|
+
"id": "review-backflow",
|
|
17
|
+
"heading": "## Review 回流记录",
|
|
18
|
+
"required": true,
|
|
19
|
+
"note": "总览索引表:记录所有 review 发现及其回流落点。列:'#' + '来源阶段' + '严重度' + '发现' + '回流落点'。来源阶段枚举:Plan Review / Impl Review / Runtime Review。",
|
|
20
|
+
"validation": {
|
|
21
|
+
"columns": ["#", "来源阶段", "严重度", "发现", "回流落点"],
|
|
22
|
+
"source_phase_enum": ["Plan Review", "Impl Review", "Runtime Review"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
15
25
|
{
|
|
16
26
|
"id": "background",
|
|
17
27
|
"heading": "## 一、背景与目标",
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# Codex MCP 配置模板(真源)
|
|
2
|
-
# 渲染后分发到 .codex/ 与各 magic dirs templates/,供 --print-mcp-config 输出
|
|
3
|
-
# 使用方式:
|
|
4
|
-
# npx add-coder init --adapter=codex --print-mcp-config # stdout 输出片段
|
|
5
|
-
# npx add-coder init --adapter=codex --write-user-config # 显式确认后写入 ~/.codex/config.toml
|
|
6
|
-
#
|
|
7
|
-
# Windows 分支(renderer 按平台注入,无需手动修改):
|
|
8
|
-
# win32: command = "cmd /c" args = ["npx.cmd", "tsx", "..."] # .cmd 分支
|
|
9
|
-
# posix: command = "npx" args = ["tsx", "..."]
|
|
10
|
-
#
|
|
11
|
-
# 安全约定:
|
|
12
|
-
# - env 只引用环境变量({{projectRoot}} 由渲染时注入,密码/连接串禁止写入模板)
|
|
13
|
-
# - DATABASE_URL 请通过消费方 .env 或 IDE 环境传入,模板不包含任何连接串
|
|
14
|
-
|
|
15
|
-
[mcp_servers.add_coder]
|
|
16
|
-
command = "{{codexCommand}}"
|
|
17
|
-
args = ["tsx", "{{magicDir}}/scripts/mcp-server.ts"]
|
|
18
|
-
env = {
|
|
19
|
-
PROJECT_ROOT = "{{projectRoot}}",
|
|
20
|
-
}
|
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
# add-coder-add-coder-npm-package-add-route-v1
|
|
2
|
-
|
|
3
|
-
> **定位**:Plan → ADD Step 执行映射。不重复 Plan 的架构设计和 Specs 的任务细节——只定义每个 ADD Step 在本 Plan 中的具体动作、输入、产出。
|
|
4
|
-
>
|
|
5
|
-
> **模式**:重型(Heavyweight)——每一步产出检查强制执行"验证并更新项目状态"。本项目为 npm 包工程化,代码产物在 `packages/add-coder/`,不修改 add-coder 业务代码。
|
|
6
|
-
>
|
|
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
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Step 0:文档先行(Documentation First)
|
|
12
|
-
|
|
13
|
-
**目的**:代码动工前,确认 Plan + Specs + Handoff 三元组齐全,项目文档反映即将实现的变更。
|
|
14
|
-
|
|
15
|
-
**输入**:
|
|
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
|
-
|
|
20
|
-
**动作**:
|
|
21
|
-
1. 确认 Specs 三元组就绪:`spec.md` + `tasks.md` + `checklist.md` ✅
|
|
22
|
-
2. 调用 `find_related_docs` 检索受影响的架构/规范/需求文档 → 已完成,4 篇相关文档已审阅
|
|
23
|
-
3. 按检索结果更新项目文档 → 本次变更无需更新项目文档(变更对象为 `packages/add-coder/` 工具链,非大田耕播业务功能)
|
|
24
|
-
4. 确认 Handoff 就绪 ✅
|
|
25
|
-
|
|
26
|
-
**产出**:
|
|
27
|
-
- [x] 验证并更新项目状态:Specs 三元组路径确认
|
|
28
|
-
- [x] 验证并更新项目状态:项目文档已更新(或无需更新声明已记录)
|
|
29
|
-
- [x] 验证并更新项目状态:Handoff 就绪
|
|
30
|
-
|
|
31
|
-
### §0.8 DPS 闸门(上游文档质量校验)
|
|
32
|
-
|
|
33
|
-
调用 `check_dps({ planKeyword: "add-coder-npm-package" })`。
|
|
34
|
-
|
|
35
|
-
| DPS | 判定 | 动作 |
|
|
36
|
-
|-----|:--:|------|
|
|
37
|
-
| ≥ 85 | 🟢 | 进入 Step 1 |
|
|
38
|
-
| 70–84 | 🟡 | 回退补齐短板(补 Review 缺失维度 / Specs 缺失 Requirement) |
|
|
39
|
-
| < 70 | 🔴 | 回退细化 Plan 本身(粒度不足是下游漂移的根因) |
|
|
40
|
-
|
|
41
|
-
- [ ] DPS 已通过(≥ 85),可进入 Step 1
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## Step 1:功能分析与审计打点定义
|
|
46
|
-
|
|
47
|
-
**目的**:本 Plan 为 npm 包工程化,不修改 add-coder 业务代码。无需新增 `AgentAuditPhase` 字面量。审计通过 `record_dev_operation`(ADD-7)落库 DevOperation 表。
|
|
48
|
-
|
|
49
|
-
**输入**:
|
|
50
|
-
- Plan §3 的 Task 列表(6 轮 11 个 Task)
|
|
51
|
-
- Plan 元信息 ADD-7 审计策略表(3 条记录)
|
|
52
|
-
|
|
53
|
-
**动作**:
|
|
54
|
-
1. 确认本 Plan 无需新增 AgentAuditPhase(npm 包工程化,无业务逻辑审计点)
|
|
55
|
-
2. 确认 ADD-7 审计策略表覆盖所有文件变更(package.json / src/ / templates/)
|
|
56
|
-
|
|
57
|
-
**产出**:
|
|
58
|
-
- [ ] 验证并更新项目状态:审计策略确认完成,ADD-7 策略表已同步到 tasks.md Step 1 区域
|
|
59
|
-
|
|
60
|
-
| 审计方式 | 适用场景 | 工具 |
|
|
61
|
-
|---------|---------|------|
|
|
62
|
-
| `record_dev_operation` | 文件变更(CREATE/MODIFY/DELETE) | MCP 工具 |
|
|
63
|
-
| 无 AgentAuditPhase | 本 Plan 不修改 add-coder 业务代码 | — |
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Step 2:审计基础设施确认
|
|
68
|
-
|
|
69
|
-
**目的**:确认 npm 包所需的数据库基础设施(DevOperation + AuditLog 表)在第1轮 Task 0 中创建。
|
|
70
|
-
|
|
71
|
-
**输入**:
|
|
72
|
-
- `templates/core/prisma/add.prisma`(第1轮 Task 0 产出)
|
|
73
|
-
- `src/cli/prisma-injector.ts`(第1轮 Task 0 产出)
|
|
74
|
-
|
|
75
|
-
**动作**:
|
|
76
|
-
1. 确认 `add.prisma` 包含 DevOperation 和 AuditLog 模型定义
|
|
77
|
-
2. 确认 `prisma-injector.ts` 实现检测 → 复制 → 迁移 → generate 全流程
|
|
78
|
-
3. 确认 Prisma 迁移幂等(重复执行不报错)
|
|
79
|
-
|
|
80
|
-
**产出**:
|
|
81
|
-
- [ ] 验证并更新项目状态:DevOperation + AuditLog 表创建成功,状态已同步到 checklist.md ADD 规则合规项
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Step 3:业务逻辑实现与审计植入
|
|
86
|
-
|
|
87
|
-
**目的**:按 Plan 的 6 轮 11 个 Task 依赖拓扑,逐 Task 实施代码 + 嵌入 ADD-7 审计。
|
|
88
|
-
|
|
89
|
-
**输入**:
|
|
90
|
-
- Plan §3 架构设计(数据流转、目录结构、适配器矩阵)
|
|
91
|
-
- Plan §4 实施 Task + 依赖图
|
|
92
|
-
- `tasks.md` 的 Task 清单 ✅
|
|
93
|
-
- Handoff 的 ADD-7 审计策略表 ✅
|
|
94
|
-
|
|
95
|
-
**动作**:
|
|
96
|
-
|
|
97
|
-
### §3.0 前置守卫(重型强制)
|
|
98
|
-
|
|
99
|
-
调用 `check_add_route_status` 确认 add-route 文件有效存在,不通过则禁止进入代码实现。
|
|
100
|
-
|
|
101
|
-
### Task 映射表
|
|
102
|
-
|
|
103
|
-
| # | 轮次 | Task | 文件 | 审计植入点 | 新增字面量 | 依赖 | 状态 |
|
|
104
|
-
|---|:--:|------|------|-----------|-----------|------|------|
|
|
105
|
-
| 1 | 1 | Prisma 模型准备 | `templates/core/prisma/add.prisma`、`src/cli/prisma-injector.ts` | `record_dev_operation` (CREATE) | — | 无 | ⬜ |
|
|
106
|
-
| 2 | 1 | 清理硬编码 + 参数化 core 模板 | `templates/` 下 ~70 个文件 | `record_dev_operation` (MODIFY) | — | 无(可并行 Task 1) | ⬜ |
|
|
107
|
-
| 3 | 2 | 模板目录重组 + 适配器架构搭建 | `templates/core/`、`src/adapters/`、`src/core/` | `record_dev_operation` (CREATE/MODIFY) | — | 第1轮 Task 1 | ⬜ |
|
|
108
|
-
| 4 | 3 | Claude 适配器实现 | `templates/adapters/claude/`、`src/adapters/claude/renderer.ts` | `record_dev_operation` (CREATE) | — | 第2轮 Task 0 | ⬜ |
|
|
109
|
-
| 5 | 3 | Qoder 适配器实现 | `templates/adapters/qoder/`、`src/adapters/qoder/renderer.ts` | `record_dev_operation` (CREATE/MODIFY) | — | 第3轮 Task 0 | ⬜ |
|
|
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/{{magicDir}}/.claude) | `src/core/renderer.ts`、`src/cli/commands/init.ts`、adapter renderers | `record_dev_operation` (MODIFY) | — | 第3轮 Task 2 | ⬜ |
|
|
112
|
-
| 7 | 4 | 配置系统(Zod schema) | `src/config/schema.ts`、`src/config/defaults.ts` | `record_dev_operation` (CREATE) | — | 无 | ⬜ |
|
|
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
|
-
| 9 | 5 | 集成测试 + 文档 + devlog | 测试文件、`README.md`、`package.json` | `record_dev_operation` (CREATE/MODIFY) | — | 全部前序 Task | ⬜ |
|
|
115
|
-
| 10 | 6 | CaijueHub 核心 | `src/caijuehub/caijue.toml`、`src/caijuehub/caijue.ts`、`src/caijuehub/transcribe.ts`、`src/caijuehub/*-rules.toml` (4) | `record_dev_operation` (CREATE) | — | 第4轮 Task 1 | ⬜ |
|
|
116
|
-
| 11 | 6 | 策略文件 + cli 重构 | `src/caijuehub/strategies/*.strategy.ts` (4)、`src/cli/detect.ts`、`src/cli/prisma-injector.ts`、`src/cli/writer.ts` | `record_dev_operation` (CREATE/MODIFY) | — | 第6轮 Task 0 | ⬜ |
|
|
117
|
-
|
|
118
|
-
### 依赖拓扑
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
第1轮: 基础准备
|
|
122
|
-
Task 0: Prisma 模型准备 ──┐
|
|
123
|
-
Task 1: 清理硬编码 ────────┘ 可并行,互不依赖
|
|
124
|
-
│
|
|
125
|
-
▼
|
|
126
|
-
第2轮: 架构搭建
|
|
127
|
-
Task 0: 适配器架构搭建
|
|
128
|
-
│
|
|
129
|
-
▼
|
|
130
|
-
第3轮: 适配器实现
|
|
131
|
-
Task 0: Claude → Task 1: Qoder → Task 2: VS Code(串行)
|
|
132
|
-
│
|
|
133
|
-
▼ 增量:core 内容三目录部署
|
|
134
|
-
Task 3.3: renderCore() 改造 → adapter renderers 不再重复部署 core
|
|
135
|
-
│
|
|
136
|
-
▼
|
|
137
|
-
第4轮: 配置 + CLI
|
|
138
|
-
Task 0: 配置系统 → Task 1: CLI 重写
|
|
139
|
-
│
|
|
140
|
-
▼
|
|
141
|
-
第5轮: 测试 + 发布
|
|
142
|
-
Task 0: 集成测试 + 文档 + devlog
|
|
143
|
-
│
|
|
144
|
-
▼
|
|
145
|
-
第6轮: 裁决层
|
|
146
|
-
Task 0: CaijueHub 核心 → Task 1: 重构模块读 caijue
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### 每个 Task 完成后(重型强制执行)
|
|
150
|
-
|
|
151
|
-
1. 验证该 Task 的 checklist `[T]` 项
|
|
152
|
-
2. 调用 `record_dev_operation` 记录 ADD-7 审计
|
|
153
|
-
3. **验证并更新项目状态**:将该 Task 在 `tasks.md` 中逐子项勾选为 `[x]`
|
|
154
|
-
|
|
155
|
-
**产出**:
|
|
156
|
-
- [ ] 验证并更新项目状态:全部 Task 的 `[T]` 项通过,`tasks.md` 已完成项已逐项勾选
|
|
157
|
-
- [ ] 验证并更新项目状态:每个文件有 `record_dev_operation` 记录,`checklist.md` ADD-7 审计项已确认
|
|
158
|
-
- [ ] 验证并更新项目状态:调用 `check_spec_sync` 确认 spec 文档勾选状态与实际代码一致
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
## Step 3.5:实现审查
|
|
163
|
-
|
|
164
|
-
**目的**:代码完成后,验证意图与实现无语义鸿沟(ADD-10)。
|
|
165
|
-
|
|
166
|
-
**输入**:
|
|
167
|
-
- `checklist.md`
|
|
168
|
-
- `review-implementation-template.md`
|
|
169
|
-
|
|
170
|
-
**动作**:
|
|
171
|
-
1. 逐项执行 `checklist.md` 中所有 `[T]` 编译期检查项
|
|
172
|
-
2. 按 `checklist-template.md` 执行跨项目联调检查
|
|
173
|
-
3. 读取 `review-implementation-template.md`,生成 `review-implementation.md`
|
|
174
|
-
4. 所有 `[T]` 项通过后,生成 `review-runtime.md`(含 `[R]` 待验证清单)
|
|
175
|
-
5. **重型强制**:调用 `check_spec_sync` 确认 `tasks.md` / `checklist.md` 全部已完成项的勾选状态正确
|
|
176
|
-
|
|
177
|
-
**产出**:
|
|
178
|
-
- [ ] 验证并更新项目状态:`checklist.md` 全部 `[T]` 项已通过并勾选
|
|
179
|
-
- [ ] 验证并更新项目状态:`review-implementation.md` 已生成
|
|
180
|
-
- [ ] 验证并更新项目状态:`review-runtime.md` 已生成(含 `[R]` 待验证清单)
|
|
181
|
-
- [ ] 验证并更新项目状态:`check_spec_sync` 通过——spec 文档勾选状态与代码一致
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
## Step 4:审计数据验证
|
|
186
|
-
|
|
187
|
-
**目的**:编译 + 审计完整性检查。
|
|
188
|
-
|
|
189
|
-
**输入**:
|
|
190
|
-
- 全部修改文件(`packages/add-coder/`)
|
|
191
|
-
- MCP 工具:`check_phase_symmetry`、`check_failure_path`、`check_spec_sync`
|
|
192
|
-
|
|
193
|
-
**动作**:
|
|
194
|
-
1. `npx tsc --noEmit` —— 零类型错误(`packages/add-coder/` 目录)
|
|
195
|
-
2. 调用 `check_phase_symmetry` → 不适用(本 Plan 无 AgentAuditPhase 打点)
|
|
196
|
-
3. 调用 `check_failure_path` → 不适用
|
|
197
|
-
4. 验证 ADD-7 审计记录完整性:`query_audit_logs` 按 planKeyword 检索
|
|
198
|
-
5. **重型强制**:调用 `check_spec_sync` 确认 spec 文档与实际代码一致
|
|
199
|
-
|
|
200
|
-
**产出**:
|
|
201
|
-
- [ ] `tsc --noEmit` 通过
|
|
202
|
-
- [ ] 验证并更新项目状态:`check_spec_sync` 通过,checklist.md 编译检查项已同步勾选
|
|
203
|
-
|
|
204
|
-
### §4.6 RAHS 闸门(下游执行健康度校验)
|
|
205
|
-
|
|
206
|
-
调用 `check_rahs({ planKeyword: "add-coder-npm-package" })`。
|
|
207
|
-
|
|
208
|
-
| RAHS | 判定 | 动作 |
|
|
209
|
-
|------|:--:|------|
|
|
210
|
-
| ≥ 90 | 🟢 | 进入 Step 5 |
|
|
211
|
-
| 70–89 | 🟡 | 自检:范围扩散?审计漏记?类型错误? |
|
|
212
|
-
| < 70 | 🔴 | 注意力漂移严重,返工回退 Step 3 |
|
|
213
|
-
|
|
214
|
-
- [ ] RAHS 已通过(≥ 90),可进入 Step 5
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## Step 5:AI 自动合规检查
|
|
219
|
-
|
|
220
|
-
**目的**:扫描全部修改文件的 ADD-1~ADD-7 合规性。
|
|
221
|
-
|
|
222
|
-
**输入**:
|
|
223
|
-
- 全部修改文件的代码(`packages/add-coder/`)
|
|
224
|
-
- MCP 工具:`check_add_compliance`
|
|
225
|
-
|
|
226
|
-
**动作**:
|
|
227
|
-
1. 对每个修改文件调用 `check_add_compliance(code, projectPattern="event-based")`
|
|
228
|
-
2. 汇总合规报告,标注违规项和风险等级
|
|
229
|
-
|
|
230
|
-
**产出**:
|
|
231
|
-
- [ ] 验证并更新项目状态:合规报告已生成,违规项处理决策已记录
|
|
232
|
-
- [ ] 验证并更新项目状态:`checklist.md` ADD 规则合规检查项已同步勾选
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## Step 6:从审计数据定位问题
|
|
237
|
-
|
|
238
|
-
> **仅当 Step 4/5 发现异常时进入。**
|
|
239
|
-
|
|
240
|
-
**动作**:
|
|
241
|
-
1. 查询审计日志(`query_audit_logs` 或直接 grep)
|
|
242
|
-
2. 对照 Plan 验收到位情况
|
|
243
|
-
|
|
244
|
-
**产出**:
|
|
245
|
-
- [ ] 验证并更新项目状态:问题清单已记录(含文件路径和根因分析),已同步到 `tasks.md`
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## Step 7:修复并验证
|
|
250
|
-
|
|
251
|
-
> **仅当 Step 6 发现问题时进入。**
|
|
252
|
-
|
|
253
|
-
**动作**:
|
|
254
|
-
1. 按问题优先级逐个修复
|
|
255
|
-
2. 修复后回到 Step 4 重新验证
|
|
256
|
-
|
|
257
|
-
**产出**:
|
|
258
|
-
- [ ] 验证并更新项目状态:所有问题已修复,`checklist.md` 回归验证项已重新勾选
|
|
259
|
-
- [ ] 验证并更新项目状态:Step 4/5 复验通过
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
## Step 8:收敛判断 + Handoff 更新 + Step 0 第二部分
|
|
264
|
-
|
|
265
|
-
**目的**:功能收敛判定,更新 Handoff,回到架构文档做最终校准。
|
|
266
|
-
|
|
267
|
-
**输入**:
|
|
268
|
-
- Handoff 文档
|
|
269
|
-
- `checklist.md` 最终状态
|
|
270
|
-
|
|
271
|
-
**动作**:
|
|
272
|
-
1. **收敛判断**:全部 `[T]` 项通过 + `[R]` 清单已生成 + RAHS ≥ 90 + `grep -r "farm.agent\|大田" dist/` 返回空 + `tsc --noEmit` 通过 + 集成测试全部通过 + Prisma 迁移幂等 → 功能收敛
|
|
273
|
-
2. **RAHS 最终核定**:调用 `check_rahs({ planKeyword: "add-coder-npm-package" })`,RAHS ≥ 90 方可收敛
|
|
274
|
-
3. **验证并更新项目状态**:`tasks.md` 全部 Task 已完成 + 全部子项已勾选,`checklist.md` 全部可验证项已勾选
|
|
275
|
-
4. **验证并更新项目状态**:调用 `check_spec_sync` 做最终交叉校验
|
|
276
|
-
5. **Handoff 更新**:更新 Handoff 的 §7(实际产出与偏离)、§8(验证结果)、§9(后置确认)
|
|
277
|
-
6. **Step 0 第二部分**:回架构文档做最终校准——确认 `packages/add-coder/templates/docs/` 下 grounding 文档已反映变更
|
|
278
|
-
7. **ADD-7 回查**:`query_audit_logs` 确认全部 `record_dev_operation` 记录已落库
|
|
279
|
-
8. **devlog**:调用 `record_dev_operation` 落库开发日志到 DevOperation 表(planKeyword: "add-coder-npm-package")
|
|
280
|
-
|
|
281
|
-
**产出**:
|
|
282
|
-
- [ ] 验证并更新项目状态:收敛判定结果
|
|
283
|
-
- [ ] 验证并更新项目状态:`tasks.md` + `checklist.md` 全部完成项已勾选
|
|
284
|
-
- [ ] 验证并更新项目状态:`check_spec_sync` 四者一致确认
|
|
285
|
-
- [ ] 验证并更新项目状态:Handoff 已更新
|
|
286
|
-
- [ ] 验证并更新项目状态:架构文档已校准
|
|
287
|
-
- [ ] 验证并更新项目状态:ADD-7 审计记录已落库确认
|
|
288
|
-
- [ ] 验证并更新项目状态:devlog 已落库
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
## Step 9:Report Closure(运行时发现关闭 — 条件性操作)
|
|
293
|
-
|
|
294
|
-
> **本 Plan 非 runtime-fix plan,跳过 Step 9。**
|
|
295
|
-
|
|
296
|
-
---
|
|
297
|
-
|
|
298
|
-
## 附录:文件清单
|
|
299
|
-
|
|
300
|
-
| 文件 | 操作 | 轮次/Task | targetType | ADD-7 状态 |
|
|
301
|
-
|------|------|-----------|-----------|------------|
|
|
302
|
-
| `packages/add-coder/package.json` | MODIFY | 5/0 | PACKAGE | ⬜ |
|
|
303
|
-
| `packages/add-coder/tsconfig.json` | CREATE | 4/1 | BUILD_CONFIG | ⬜ |
|
|
304
|
-
| `packages/add-coder/tsup.config.ts` | CREATE | 4/1 | BUILD_CONFIG | ⬜ |
|
|
305
|
-
| `packages/add-coder/bin/add-coder.js` | MODIFY | 4/1 | CLI_ENTRY | ⬜ |
|
|
306
|
-
| `packages/add-coder/src/cli/index.ts` | CREATE | 4/1 | CLI | ⬜ |
|
|
307
|
-
| `packages/add-coder/src/cli/commands/init.ts` | CREATE | 4/1 | CLI | ⬜ |
|
|
308
|
-
| `packages/add-coder/src/cli/commands/sync.ts` | CREATE | 4/1 | CLI | ⬜ |
|
|
309
|
-
| `packages/add-coder/src/cli/commands/status.ts` | CREATE | 4/1 | CLI | ⬜ |
|
|
310
|
-
| `packages/add-coder/src/cli/detect.ts` | CREATE | 4/1 | CLI | ⬜ |
|
|
311
|
-
| `packages/add-coder/src/cli/config-loader.ts` | CREATE | 4/1 | CLI | ⬜ |
|
|
312
|
-
| `packages/add-coder/src/cli/prisma-injector.ts` | CREATE | 1/0 | CLI | ⬜ |
|
|
313
|
-
| `packages/add-coder/src/cli/writer.ts` | CREATE | 4/1 | CLI | ⬜ |
|
|
314
|
-
| `packages/add-coder/src/config/schema.ts` | CREATE | 4/0 | CONFIG | ⬜ |
|
|
315
|
-
| `packages/add-coder/src/config/defaults.ts` | CREATE | 4/0 | CONFIG | ⬜ |
|
|
316
|
-
| `packages/add-coder/src/core/renderer.ts` | CREATE | 1/1 | RENDERER | ⬜ |
|
|
317
|
-
| `packages/add-coder/src/adapters/claude/renderer.ts` | CREATE | 3/0 | ADAPTER | ⬜ |
|
|
318
|
-
| `packages/add-coder/src/adapters/qoder/renderer.ts` | CREATE | 3/1 | ADAPTER | ⬜ |
|
|
319
|
-
| `packages/add-coder/src/adapters/vscode/renderer.ts` | CREATE | 3/2 | ADAPTER | ⬜ |
|
|
320
|
-
| `packages/add-coder/templates/core/prisma/add.prisma` | CREATE | 1/0 | PRISMA_SCHEMA | ⬜ |
|
|
321
|
-
| `packages/add-coder/templates/core/` (全部模板文件) | MOVE | 2/0 | TEMPLATE | ⬜ |
|
|
322
|
-
| `packages/add-coder/templates/adapters/claude/` | CREATE | 3/0 | TEMPLATE | ⬜ |
|
|
323
|
-
| `packages/add-coder/templates/adapters/qoder/` | MOVE | 3/1 | TEMPLATE | ⬜ |
|
|
324
|
-
| `packages/add-coder/templates/adapters/vscode/` | MOVE | 3/2 | TEMPLATE | ⬜ |
|
|
325
|
-
| `packages/add-coder/templates/docs/` (grounding 文档) | CREATE | 1/1 | DOC | ⬜ |
|
|
326
|
-
| `packages/add-coder/src/caijuehub/caijue.toml` | CREATE | 6/0 | CAIJUE_CONFIG | ⬜ |
|
|
327
|
-
| `packages/add-coder/src/caijuehub/caijue.ts` | CREATE | 6/0 | CAIJUE_CONFIG | ⬜ |
|
|
328
|
-
| `packages/add-coder/src/caijuehub/transcribe.ts` | CREATE | 6/0 | CAIJUE_CONFIG | ⬜ |
|
|
329
|
-
| `packages/add-coder/src/caijuehub/*-rules.toml` (4) | CREATE | 6/0 | CAIJUE_CONFIG | ⬜ |
|
|
330
|
-
| `packages/add-coder/src/caijuehub/strategies/*.strategy.ts` (4) | CREATE | 6/1 | STRATEGY | ⬜ |
|
|
331
|
-
| `packages/add-coder/README.md` | MODIFY | 5/0 | DOC | ⬜ |
|