patchwarden 1.1.0 → 1.5.1
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 +83 -8
- package/README.md +78 -10
- package/dist/assessments/agentAssessor.d.ts +1 -1
- package/dist/assessments/agentAssessor.js +3 -3
- package/dist/assessments/assessmentStore.d.ts +1 -1
- package/dist/assessments/assessmentStore.js +2 -2
- package/dist/assessments/confirmCli.js +5 -4
- package/dist/config.d.ts +7 -0
- package/dist/config.js +34 -0
- package/dist/control/middleware/auth.d.ts +10 -0
- package/dist/control/middleware/auth.js +8 -0
- package/dist/control/middleware/static.d.ts +3 -0
- package/dist/control/middleware/static.js +65 -0
- package/dist/control/routes/audit.d.ts +15 -0
- package/dist/control/routes/audit.js +277 -0
- package/dist/control/routes/evidence.d.ts +4 -0
- package/dist/control/routes/evidence.js +96 -0
- package/dist/control/routes/lineage.d.ts +3 -0
- package/dist/control/routes/lineage.js +71 -0
- package/dist/control/routes/policy.d.ts +3 -0
- package/dist/control/routes/policy.js +81 -0
- package/dist/control/routes/process.d.ts +5 -0
- package/dist/control/routes/process.js +200 -0
- package/dist/control/routes/sessions.d.ts +22 -0
- package/dist/control/routes/sessions.js +224 -0
- package/dist/control/routes/status.d.ts +6 -0
- package/dist/control/routes/status.js +250 -0
- package/dist/control/routes/taskActions.d.ts +21 -0
- package/dist/control/routes/taskActions.js +233 -0
- package/dist/control/routes/tasks.d.ts +20 -0
- package/dist/control/routes/tasks.js +310 -0
- package/dist/control/routes/workspace.d.ts +15 -0
- package/dist/control/routes/workspace.js +193 -0
- package/dist/control/runtime.d.ts +91 -0
- package/dist/control/runtime.js +392 -0
- package/dist/control/server.d.ts +13 -0
- package/dist/control/server.js +479 -0
- package/dist/control/shared.d.ts +35 -0
- package/dist/control/shared.js +288 -0
- package/dist/controlCenter.d.ts +6 -0
- package/dist/controlCenter.js +7 -2001
- package/dist/direct/directGuards.js +30 -8
- package/dist/direct/directSessionStore.d.ts +2 -0
- package/dist/direct/directVerification.js +7 -0
- package/dist/doctor.d.ts +18 -1
- package/dist/doctor.js +579 -348
- package/dist/goal/goalReport.d.ts +54 -0
- package/dist/goal/goalReport.js +204 -0
- package/dist/goal/goalStatus.d.ts +6 -0
- package/dist/goal/specKitImport.d.ts +63 -0
- package/dist/goal/specKitImport.js +220 -0
- package/dist/goal/subgoalSync.js +2 -1
- package/dist/httpServer.js +15 -12
- package/dist/index.js +7 -4
- package/dist/logging.d.ts +7 -1
- package/dist/logging.js +8 -0
- package/dist/policy/projectPolicy.d.ts +55 -0
- package/dist/policy/projectPolicy.js +286 -0
- package/dist/runner/changeCapture.d.ts +3 -3
- package/dist/runner/changeCapture.js +63 -39
- package/dist/runner/cli.js +7 -6
- package/dist/runner/postTaskCleanup.js +26 -2
- package/dist/runner/runTask.js +245 -221
- package/dist/runner/simpleProcess.js +4 -4
- package/dist/runner/watch.js +17 -14
- package/dist/security/contentRedaction.d.ts +6 -0
- package/dist/security/contentRedaction.js +22 -0
- package/dist/smoke-test.js +261 -255
- package/dist/test/unit/apply-patch.test.d.ts +1 -0
- package/dist/test/unit/apply-patch.test.js +225 -0
- package/dist/test/unit/create-task.test.d.ts +1 -0
- package/dist/test/unit/create-task.test.js +197 -0
- package/dist/test/unit/direct-guards.test.js +124 -9
- package/dist/test/unit/evidence-pack.test.d.ts +1 -0
- package/dist/test/unit/evidence-pack.test.js +224 -0
- package/dist/test/unit/get-task-status.test.d.ts +1 -0
- package/dist/test/unit/get-task-status.test.js +174 -0
- package/dist/test/unit/get-task-summary.test.d.ts +1 -0
- package/dist/test/unit/get-task-summary.test.js +146 -0
- package/dist/test/unit/goal-report.test.d.ts +1 -0
- package/dist/test/unit/goal-report.test.js +159 -0
- package/dist/test/unit/goal-subgoal-task.test.js +6 -6
- package/dist/test/unit/goal-tools-registry.test.js +6 -4
- package/dist/test/unit/path-guard.test.js +24 -0
- package/dist/test/unit/project-policy-release-mode.test.d.ts +1 -0
- package/dist/test/unit/project-policy-release-mode.test.js +125 -0
- package/dist/test/unit/run-task-loop.test.d.ts +1 -0
- package/dist/test/unit/run-task-loop.test.js +380 -0
- package/dist/test/unit/schema-drift-check.test.js +10 -9
- package/dist/test/unit/spec-kit-import.test.d.ts +1 -0
- package/dist/test/unit/spec-kit-import.test.js +341 -0
- package/dist/test/unit/wait-for-task.test.d.ts +1 -0
- package/dist/test/unit/wait-for-task.test.js +144 -0
- package/dist/tools/auditTask.d.ts +8 -63
- package/dist/tools/auditTask.js +12 -8
- package/dist/tools/createDirectSession.d.ts +1 -1
- package/dist/tools/createDirectSession.js +2 -2
- package/dist/tools/createTask.d.ts +2 -2
- package/dist/tools/createTask.js +4 -4
- package/dist/tools/dispatch/coreDispatch.d.ts +9 -0
- package/dist/tools/dispatch/coreDispatch.js +282 -0
- package/dist/tools/dispatch/diagnosticDispatch.d.ts +14 -0
- package/dist/tools/dispatch/diagnosticDispatch.js +78 -0
- package/dist/tools/dispatch/directDispatch.d.ts +8 -0
- package/dist/tools/dispatch/directDispatch.js +115 -0
- package/dist/tools/dispatch/goalDispatch.d.ts +8 -0
- package/dist/tools/dispatch/goalDispatch.js +91 -0
- package/dist/tools/dispatch/releaseDispatch.d.ts +8 -0
- package/dist/tools/dispatch/releaseDispatch.js +45 -0
- package/dist/tools/dispatch/types.d.ts +23 -0
- package/dist/tools/dispatch/types.js +15 -0
- package/dist/tools/evidencePack.d.ts +45 -0
- package/dist/tools/evidencePack.js +375 -0
- package/dist/tools/finalizeDirectSession.d.ts +1 -1
- package/dist/tools/finalizeDirectSession.js +3 -3
- package/dist/tools/goalSubgoalTask.d.ts +1 -1
- package/dist/tools/goalSubgoalTask.js +2 -2
- package/dist/tools/healthCheck.js +3 -3
- package/dist/tools/recommendAgentForTask.d.ts +19 -0
- package/dist/tools/recommendAgentForTask.js +56 -0
- package/dist/tools/registry.d.ts +3 -3
- package/dist/tools/registry.js +333 -402
- package/dist/tools/releaseMode.d.ts +50 -0
- package/dist/tools/releaseMode.js +370 -0
- package/dist/tools/retryTask.d.ts +2 -2
- package/dist/tools/retryTask.js +2 -2
- package/dist/tools/runDirectVerificationBundle.d.ts +26 -0
- package/dist/tools/runDirectVerificationBundle.js +64 -0
- package/dist/tools/runTaskLoop.d.ts +57 -0
- package/dist/tools/runTaskLoop.js +417 -0
- package/dist/tools/runVerification.d.ts +4 -0
- package/dist/tools/runVerification.js +4 -0
- package/dist/tools/safeViews.d.ts +8 -2
- package/dist/tools/safeViews.js +4 -2
- package/dist/tools/taskLineage.d.ts +91 -0
- package/dist/tools/taskLineage.js +175 -0
- package/dist/tools/toolCatalog.d.ts +2 -2
- package/dist/tools/toolCatalog.js +6 -0
- package/dist/tools/toolRegistry.js +132 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/docs/CODE_WIKI.md +983 -0
- package/docs/agentseal-integration.md +150 -0
- package/docs/architecture.md +63 -0
- package/docs/assets/patchwarden-oss-demo.gif +0 -0
- package/docs/chatgpt-usage.md +31 -0
- package/docs/control-center/README.md +9 -0
- package/docs/dashboard-overview.md +86 -0
- package/docs/demo.md +8 -0
- package/docs/direct-session-workflow.md +98 -0
- package/docs/evidence-pack-schema.md +215 -0
- package/docs/execution-plan-2026-07-09.md +315 -0
- package/docs/lineage-evidence-pack-workflow.md +127 -0
- package/docs/mcp-inspector-testing.md +200 -0
- package/docs/open-source-application.md +162 -0
- package/docs/opencode-worker.md +151 -0
- package/docs/openhands-worker.md +181 -0
- package/docs/release-evidence.md +72 -0
- package/docs/roadmap-execution-and-acceptance.md +365 -0
- package/docs/spec-kit-integration.md +131 -0
- package/docs/task-safe-review-workflow.md +98 -0
- package/docs/threat-model.md +79 -0
- package/docs/user-feedback.md +40 -0
- package/docs/why-patchwarden.md +110 -0
- package/package.json +3 -3
- package/scripts/checks/control-center-smoke.js +443 -0
- package/scripts/checks/control-smoke.js +2 -2
- package/scripts/checks/lifecycle-smoke.js +29 -23
- package/scripts/checks/mcp-manifest-check.js +12 -0
- package/scripts/checks/mcp-smoke.js +33 -7
- package/scripts/checks/watcher-supervisor-smoke.js +1 -1
- package/scripts/generate-demo-gif.py +320 -0
- package/src/assessments/agentAssessor.ts +3 -3
- package/src/assessments/assessmentStore.ts +2 -2
- package/src/assessments/confirmCli.ts +5 -4
- package/src/config.ts +37 -0
- package/src/control/middleware/auth.ts +17 -0
- package/src/control/middleware/static.ts +71 -0
- package/src/control/routes/audit.ts +321 -0
- package/src/control/routes/evidence.ts +107 -0
- package/src/control/routes/lineage.ts +92 -0
- package/src/control/routes/policy.ts +81 -0
- package/src/control/routes/process.ts +204 -0
- package/src/control/routes/sessions.ts +251 -0
- package/src/control/routes/status.ts +325 -0
- package/src/control/routes/taskActions.ts +248 -0
- package/src/control/routes/tasks.ts +323 -0
- package/src/control/routes/workspace.ts +203 -0
- package/src/control/runtime.ts +472 -0
- package/src/control/server.ts +471 -0
- package/src/control/shared.ts +294 -0
- package/src/controlCenter.ts +7 -2150
- package/src/direct/directGuards.ts +28 -7
- package/src/direct/directSessionStore.ts +2 -0
- package/src/direct/directVerification.ts +7 -0
- package/src/doctor.ts +741 -481
- package/src/goal/goalReport.ts +271 -0
- package/src/goal/goalStatus.ts +6 -0
- package/src/goal/specKitImport.ts +355 -0
- package/src/goal/subgoalSync.ts +4 -2
- package/src/httpServer.ts +17 -14
- package/src/index.ts +7 -4
- package/src/logging.ts +10 -1
- package/src/policy/projectPolicy.ts +344 -0
- package/src/runner/changeCapture.ts +70 -42
- package/src/runner/cli.ts +7 -6
- package/src/runner/postTaskCleanup.ts +26 -2
- package/src/runner/runTask.ts +325 -223
- package/src/runner/simpleProcess.ts +4 -4
- package/src/runner/watch.ts +17 -14
- package/src/security/contentRedaction.ts +29 -0
- package/src/smoke-test.ts +254 -252
- package/src/test/unit/apply-patch.test.ts +293 -0
- package/src/test/unit/create-task.test.ts +255 -0
- package/src/test/unit/direct-guards.test.ts +178 -8
- package/src/test/unit/evidence-pack.test.ts +251 -0
- package/src/test/unit/get-task-status.test.ts +203 -0
- package/src/test/unit/get-task-summary.test.ts +173 -0
- package/src/test/unit/goal-report.test.ts +189 -0
- package/src/test/unit/goal-subgoal-task.test.ts +6 -6
- package/src/test/unit/goal-tools-registry.test.ts +7 -5
- package/src/test/unit/path-guard.test.ts +30 -0
- package/src/test/unit/project-policy-release-mode.test.ts +156 -0
- package/src/test/unit/run-task-loop.test.ts +425 -0
- package/src/test/unit/schema-drift-check.test.ts +11 -9
- package/src/test/unit/spec-kit-import.test.ts +429 -0
- package/src/test/unit/wait-for-task.test.ts +176 -0
- package/src/tools/auditTask.ts +99 -59
- package/src/tools/createDirectSession.ts +3 -3
- package/src/tools/createTask.ts +7 -7
- package/src/tools/dispatch/coreDispatch.ts +374 -0
- package/src/tools/dispatch/diagnosticDispatch.ts +101 -0
- package/src/tools/dispatch/directDispatch.ts +167 -0
- package/src/tools/dispatch/goalDispatch.ts +127 -0
- package/src/tools/dispatch/releaseDispatch.ts +65 -0
- package/src/tools/dispatch/types.ts +24 -0
- package/src/tools/evidencePack.ts +490 -0
- package/src/tools/finalizeDirectSession.ts +4 -4
- package/src/tools/goalSubgoalTask.ts +2 -2
- package/src/tools/healthCheck.ts +3 -3
- package/src/tools/listWorkspace.ts +71 -71
- package/src/tools/recommendAgentForTask.ts +79 -0
- package/src/tools/registry.ts +352 -509
- package/src/tools/releaseMode.ts +450 -0
- package/src/tools/retryTask.ts +2 -2
- package/src/tools/runDirectVerificationBundle.ts +98 -0
- package/src/tools/runTaskLoop.ts +526 -0
- package/src/tools/runVerification.ts +8 -0
- package/src/tools/safeViews.ts +4 -2
- package/src/tools/taskLineage.ts +300 -0
- package/src/tools/toolCatalog.ts +6 -0
- package/src/tools/toolRegistry.ts +132 -0
- package/src/version.ts +2 -2
- package/ui/pages/audit.html +192 -3
- package/ui/pages/dashboard.html +1070 -14
- package/ui/pages/direct-sessions.html +505 -53
- package/ui/pages/task-detail.html +456 -438
- package/ui/pages/tasks.html +598 -61
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# PatchWarden Execution Plan 2026-07-09
|
|
2
|
+
|
|
3
|
+
> Created: 2026-07-09
|
|
4
|
+
> Base document: `docs/roadmap-execution-and-acceptance.md`
|
|
5
|
+
> Scope: 基于 2026-07-09 实地核验后的细化执行计划,覆盖 P0–P3 全阶段。
|
|
6
|
+
> Codex 负责实现与门禁验证;用户负责 credentialed / external-write 操作(push、merge、release、publish)。
|
|
7
|
+
|
|
8
|
+
## 0. 当前真实状态核验(对 roadmap 文档的修正)
|
|
9
|
+
|
|
10
|
+
| 项目 | roadmap 假设 | 2026-07-09 实地核验 | 影响 |
|
|
11
|
+
| --- | --- | --- | --- |
|
|
12
|
+
| 分支 | `codex/patchwarden-v1.5.0` | 一致 | — |
|
|
13
|
+
| HEAD | `cc27e6a Add OSS application evidence materials` | 一致 | — |
|
|
14
|
+
| 工作区 | dirty,preserve user changes | 34 个 M + 5 个 ??,含 `package.json`、`version.ts`、`src/tools/*`、`ui/pages/*`、4 个新增 docs | P0 前必须逐文件核对并提交 |
|
|
15
|
+
| 本地源码版本 | 1.5.1 | `package.json` = 1.5.1,CHANGELOG v1.5.1 主题为 Dashboard UI 优化 | 一致 |
|
|
16
|
+
| GitHub Release / npm | 仍为 v1.5.0 | 未重新核验(roadmap 已记录) | P0 任务成立 |
|
|
17
|
+
| Evidence Pack 现状 | 仅 `evidence.json` + `EVIDENCE.md` | `src/tools/evidencePack.ts` 确认只写这两个文件 | P1 v2 差距成立 |
|
|
18
|
+
| 已有 docs | 部分缺失 | `lineage-evidence-pack-workflow.md`、`threat-model.md` 已存在(未跟踪);缺 `why-patchwarden.md`、`evidence-pack-schema.md`、`spec-kit-integration.md`、`agentseal-integration.md`、`mcp-inspector-testing.md`、`opencode-worker.md`、`openhands-worker.md` | P1 docs 任务成立 |
|
|
19
|
+
|
|
20
|
+
**关键修正**:roadmap P0 假设"本地源码已就绪,只需发布"。实地发现工作区有大量未提交修改(看起来是 v1.5.1 Dashboard UI 优化的实现)。因此新增 **P0-0 前置步骤:逐文件核对并提交工作区修改**。
|
|
21
|
+
|
|
22
|
+
## 1. 用户决策记录(2026-07-09)
|
|
23
|
+
|
|
24
|
+
1. 工作区 34 个 M + 5 个 ?? 文件:**逐文件核对**后决定纳入范围。
|
|
25
|
+
2. P0 发布的 credentialed / external-write 操作(push、merge、release、publish):**用户手动执行**。Codex 只负责本地门禁与分支准备。
|
|
26
|
+
3. 本计划:**写入 docs 文件存档**,便于后续按阶段跟踪。
|
|
27
|
+
|
|
28
|
+
## 2. P0:v1.5.1 可信发布
|
|
29
|
+
|
|
30
|
+
### P0-0 前置:逐文件核对并提交工作区修改(新增)
|
|
31
|
+
|
|
32
|
+
#### 核对结果(2026-07-09 完成)
|
|
33
|
+
|
|
34
|
+
实际工作区:**41 个 M + 9 个 ??**(非最初预估的 34+5)。
|
|
35
|
+
|
|
36
|
+
**版本号一致性**:`package.json` / `version.ts` / `CHANGELOG.md` 三处均为 1.5.1 ✅;`README.md` 第 11 行 / `README.en.md` 第 11 行仍为 v1.5.0 ❌(发布前必修)。
|
|
37
|
+
|
|
38
|
+
**分类汇总**:
|
|
39
|
+
|
|
40
|
+
| 分类 | 文件数 | 判定 |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| Dashboard UI 优化本体 | 9 M + 4 ?? | 属于 v1.5.1 |
|
|
43
|
+
| async 重构链(sync→async) | 16 M | **隐性依赖**:controlCenter.ts v1.5.1 端点 `await safeFinalizeDirectSession(...)` 依赖此链,技术上不可简单拆分 |
|
|
44
|
+
| 并发任务执行特性(maxConcurrentTasks) | 8 M | 独立新特性,CHANGELOG 未提及,可拆为下一版本 |
|
|
45
|
+
| 安全加固 / Bug 修复 | 4 M | 独立,建议纳入(含二进制检测窗口 8KB→1MB、Windows fs.rmSync 修复) |
|
|
46
|
+
| 用户本地配置(AGENTS.md Codex Memory) | 1 M | 含本机绝对路径 `D:\ai_agent\CodexMemory`,不应入库 |
|
|
47
|
+
| IDE 状态 / 发布产物 | 3 ?? | `.trae/`、`patchwarden-v1.1.0-SHA256SUMS.txt`、`patchwarden-v1.5.0-SHA256SUMS.txt` → 加入 `.gitignore` |
|
|
48
|
+
| 规划文档 | 2 ?? | `docs/roadmap-execution-and-acceptance.md`、`docs/execution-plan-2026-07-09.md` → 是否入库由用户决定 |
|
|
49
|
+
|
|
50
|
+
**Dashboard UI 本体(9 M)**:`CHANGELOG.md`、`package.json`、`version.ts`、`scripts/checks/control-center-smoke.js`、`ui/pages/audit.html`、`ui/pages/dashboard.html`、`ui/pages/direct-sessions.html`、`ui/pages/task-detail.html`、`ui/pages/tasks.html`
|
|
51
|
+
|
|
52
|
+
**Dashboard docs(4 ??)**:`docs/dashboard-overview.md`、`docs/direct-session-workflow.md`、`docs/lineage-evidence-pack-workflow.md`、`docs/task-safe-review-workflow.md`(均被 README 新章节链接引用)
|
|
53
|
+
|
|
54
|
+
**async 重构链(16 M)**:`changeCapture.ts`、`runTask.ts`、`agentAssessor.ts`、`assessmentStore.ts`、`confirmCli.ts`、`createTask.ts`、`createDirectSession.ts`、`finalizeDirectSession.ts`、`goalSubgoalTask.ts`、`retryTask.ts`、`safeViews.ts`、`registry.ts`、`runTaskLoop.ts`、`smoke-test.ts`、`scripts/checks/lifecycle-smoke.js`、`src/test/unit/goal-subgoal-task.test.ts`
|
|
55
|
+
|
|
56
|
+
**并发任务执行特性(8 M)**:`config.ts`(新增 maxConcurrentTasks)、`watch.ts`(跨进程 lockfile + 并发执行 + executed-tasks.json)、6 个 unit test(command-guard / diagnose-task / reconcile-tasks / safe-status / sync-file / watcher-status,各加 1 行满足新必填字段)
|
|
57
|
+
|
|
58
|
+
**安全加固(4 M)**:`directGuards.ts`、`postTaskCleanup.ts`、`direct-guards.test.ts`、`path-guard.test.ts`
|
|
59
|
+
|
|
60
|
+
#### 关键风险
|
|
61
|
+
|
|
62
|
+
1. **async 重构是 v1.5.1 隐性依赖**:controlCenter.ts 的 v1.5.1 端点调用 async 函数,若排除 async 链则需回退这些端点,否则编译/运行断裂。
|
|
63
|
+
2. **README 版本号漏改**:第 11 行必须从 v1.5.0 改为 v1.5.1。
|
|
64
|
+
3. **AGENTS.md 含本机绝对路径**:`D:\ai_agent\CodexMemory` 不应入库。
|
|
65
|
+
4. **.gitignore 需扩充**:新增 `.trae/` 与 `patchwarden-v*-SHA256SUMS.txt` 通配规则。
|
|
66
|
+
|
|
67
|
+
#### 范围决策(待用户确定)
|
|
68
|
+
|
|
69
|
+
- 方案 A(推荐):v1.5.1 = Dashboard UI(9) + async 重构链(16) + 安全加固(4) + 4 docs + 版本号修正;并发特性(8) 拆为 v1.5.2/v1.6.0;CHANGELOG 补 async 与安全修复说明。
|
|
70
|
+
- 方案 B:回退 controlCenter.ts 中依赖 async 的端点,只发纯 Dashboard UI。
|
|
71
|
+
- 方案 C:全部纳入(含并发特性),CHANGELOG 补全说明。
|
|
72
|
+
|
|
73
|
+
### P0-1 本地全套门禁
|
|
74
|
+
|
|
75
|
+
```powershell
|
|
76
|
+
npm.cmd ci
|
|
77
|
+
npm.cmd run build
|
|
78
|
+
npm.cmd run test:unit
|
|
79
|
+
npm.cmd run test:mcp
|
|
80
|
+
npm.cmd run test:http-mcp
|
|
81
|
+
npm.cmd run doctor:ci
|
|
82
|
+
npm.cmd run verify:package
|
|
83
|
+
npm.cmd test
|
|
84
|
+
npm.cmd run pack:clean
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### P0-2 提交并推送(用户执行 push)
|
|
88
|
+
|
|
89
|
+
- 提交工作区修改到 `codex/patchwarden-v1.5.0`(或新建 `codex/patchwarden-v1.5.1`)
|
|
90
|
+
- 若 PR #24 落后 main:`git fetch origin main` + `git rebase origin/main`
|
|
91
|
+
- git credential 出错时修复 credential/proxy,**禁止 force-push 或 reset 绕过**
|
|
92
|
+
|
|
93
|
+
### P0-3 PR #24 推进(用户执行 merge)
|
|
94
|
+
|
|
95
|
+
- 标记 ready for review(仅本地门禁全绿后)
|
|
96
|
+
- 监控 GitHub Actions
|
|
97
|
+
- checks 绿时通过 PR 合并
|
|
98
|
+
|
|
99
|
+
### P0-4 发布(用户执行 release + publish)
|
|
100
|
+
|
|
101
|
+
- 创建 `v1.5.1` tag + GitHub Release(非 draft)
|
|
102
|
+
- 确认 npm auth 后发布(不暴露 token)
|
|
103
|
+
|
|
104
|
+
### P0 验收
|
|
105
|
+
|
|
106
|
+
```powershell
|
|
107
|
+
gh pr view 24 --repo jiezeng2004-design/PatchWarden --json state,mergeStateStatus,statusCheckRollup
|
|
108
|
+
gh release view v1.5.1 --repo jiezeng2004-design/PatchWarden --json tagName,name,isDraft,isPrerelease,publishedAt,url
|
|
109
|
+
npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
通过标准:PR 已合并 · Release `v1.5.1` 存在且非 draft · npm `version=1.5.1` · `dist-tags.latest=1.5.1` · 发布说明不夸大未验证内容。
|
|
113
|
+
|
|
114
|
+
### P0 风险
|
|
115
|
+
|
|
116
|
+
- 工作区修改可能混入非 v1.5.1 内容 → P0-0 逐文件核对
|
|
117
|
+
- README 第 11 行版本号待更新
|
|
118
|
+
- npm publish 需用户 credentialed 操作
|
|
119
|
+
|
|
120
|
+
## 3. P1-A:Evidence Pack v2
|
|
121
|
+
|
|
122
|
+
### 目标
|
|
123
|
+
|
|
124
|
+
把 Evidence Pack 从 2 文件升级为有界多文件结构,成为项目招牌能力。
|
|
125
|
+
|
|
126
|
+
### 当前差距
|
|
127
|
+
|
|
128
|
+
`src/tools/evidencePack.ts` 当前只写:
|
|
129
|
+
|
|
130
|
+
- `.patchwarden/evidence-packs/<lineage_id>/evidence.json`
|
|
131
|
+
- `.patchwarden/evidence-packs/<lineage_id>/EVIDENCE.md`
|
|
132
|
+
|
|
133
|
+
### v2 目标文件结构
|
|
134
|
+
|
|
135
|
+
| 文件 | 内容 |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| `risk.json` | 风险项与严重度 |
|
|
138
|
+
| `verify.json` | 每条验证命令的结构化记录 |
|
|
139
|
+
| `diffstat.json` | 文件级增删统计(非完整 diff) |
|
|
140
|
+
| `lineage.json` | lineage 有界摘要 |
|
|
141
|
+
| `attestation.json` | 版本/commit/Node/OS/tool profile/schema epoch |
|
|
142
|
+
| `redactions.json` | 脱敏类别与原因(**不存原始隐藏值**) |
|
|
143
|
+
|
|
144
|
+
### 执行步骤
|
|
145
|
+
|
|
146
|
+
1. 扩展 `SafeEvidencePack` 接口,新增 v2 文件字段
|
|
147
|
+
2. 在 `exportTaskEvidencePack` 中按文件逐个写入,保持有界
|
|
148
|
+
3. 更新 `src/tools/taskLineage.ts`、`src/tools/registry.ts`、`src/tools/toolRegistry.ts` 工具清单
|
|
149
|
+
4. 更新 `src/test/unit/evidence-pack.test.ts` 覆盖 v2 文件
|
|
150
|
+
5. 新增 `docs/evidence-pack-schema.md`(schema 参考)
|
|
151
|
+
6. 更新 `docs/lineage-evidence-pack-workflow.md` 补 v2 文件说明
|
|
152
|
+
|
|
153
|
+
### 实现红线
|
|
154
|
+
|
|
155
|
+
- 不含完整 stdout/stderr/diff/secrets/.env/token/cookie/凭据路径
|
|
156
|
+
- redactions 只存类别+原因,不存原值
|
|
157
|
+
- attestation 含 PatchWarden version、commit、package version、Node version、OS、tool profile、schema epoch
|
|
158
|
+
- `.patchwarden/evidence-packs/` 不得进入 npm 包(`package.json` 已排除 `.patchwarden/`)
|
|
159
|
+
|
|
160
|
+
### P1-A 验收
|
|
161
|
+
|
|
162
|
+
```powershell
|
|
163
|
+
npm.cmd run build
|
|
164
|
+
npm.cmd run test:unit
|
|
165
|
+
npm.cmd run doctor:ci
|
|
166
|
+
npm.cmd run verify:package
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
手动验收:跑一次 `run_task_loop` → `export_task_evidence_pack` → 确认 6 个 v2 文件存在 · `EVIDENCE.md` 可读有界 · `redactions.json` 无原始密钥 · npm 包不含 evidence-packs 输出。
|
|
170
|
+
|
|
171
|
+
## 4. P1-B:README 与公开文档就绪
|
|
172
|
+
|
|
173
|
+
### 目标
|
|
174
|
+
|
|
175
|
+
在外部 PR 引流前,让仓库对外部用户可读。
|
|
176
|
+
|
|
177
|
+
### 待补文档
|
|
178
|
+
|
|
179
|
+
| 文档 | 状态 | 说明 |
|
|
180
|
+
| --- | --- | --- |
|
|
181
|
+
| `docs/why-patchwarden.md` | 新建 | 定位与动机 |
|
|
182
|
+
| `docs/evidence-pack-schema.md` | 新建(与 P1-A 同步) | v2 schema 参考 |
|
|
183
|
+
| `docs/spec-kit-integration.md` | 新建 | Spec Kit 集成 |
|
|
184
|
+
| `docs/agentseal-integration.md` | 新建 | AgentSeal 集成 |
|
|
185
|
+
| `docs/mcp-inspector-testing.md` | 新建 | MCP Inspector 测试 |
|
|
186
|
+
| `docs/opencode-worker.md` | 新建 | OpenCode worker |
|
|
187
|
+
| `docs/openhands-worker.md` | 新建 | OpenHands worker |
|
|
188
|
+
| `docs/threat-model.md` | 已存在,更新 | 不重复创建 |
|
|
189
|
+
|
|
190
|
+
### README 前页需保留的 8 个章节
|
|
191
|
+
|
|
192
|
+
1. 一句定位
|
|
193
|
+
2. 架构图
|
|
194
|
+
3. 为何不是远程 shell
|
|
195
|
+
4. 五分钟 demo
|
|
196
|
+
5. Evidence Pack 样本
|
|
197
|
+
6. 支持的 agent
|
|
198
|
+
7. 安全边界
|
|
199
|
+
8. 生态适配
|
|
200
|
+
|
|
201
|
+
### P1-B 验收
|
|
202
|
+
|
|
203
|
+
```powershell
|
|
204
|
+
npm.cmd run build
|
|
205
|
+
npm.cmd run check:brand
|
|
206
|
+
npm.cmd run doctor:ci
|
|
207
|
+
npm.cmd run verify:package
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
通过标准:README 在 npm/GitHub 确认前不声称 v1.5.1 已发布 · 安全边界在外部集成之前讲解 · 示例用占位版本号除非有发布真相。
|
|
211
|
+
|
|
212
|
+
## 5. P2:外部 PR 批次 1(按风险递增顺序)
|
|
213
|
+
|
|
214
|
+
### P2-1 MCP Inspector(最先,最低风险)
|
|
215
|
+
|
|
216
|
+
- PR 形态:`docs: add CLI smoke testing example for MCP servers`
|
|
217
|
+
- 通用优先,PatchWarden 仅作示例之一
|
|
218
|
+
- 流程:clone inspector → 建 `docs/cli-smoke-testing-example` → 查上游贡献规则 → 仅改 docs → 跑上游 docs/lint/test → 推 fork 分支 → 开 PR → 监控 CI
|
|
219
|
+
- 验收:上游检查通过 · 无营销措辞 · 不依赖 PatchWarden 也能成立
|
|
220
|
+
|
|
221
|
+
### P2-2 AgentSeal(第二)
|
|
222
|
+
|
|
223
|
+
- PR 形态:`feat: detect PatchWarden MCP configs and project policies` 或 `docs: add guarded local agent execution pattern`
|
|
224
|
+
- 流程:clone agentseal → 建 `detect/patchwarden-policy` → 查 CONTRIBUTING + 现有 probes/tests → 选 code 或 docs 范围
|
|
225
|
+
- 验收:detector 识别 `.patchwarden/config.json` 和 `project-policy.json` 但不读密钥 · 正负 fixture 测试 · 描述通用安全模式非营销
|
|
226
|
+
|
|
227
|
+
### P2-3 PatchWarden 兼容文档(第三)
|
|
228
|
+
|
|
229
|
+
- 新增 `docs/mcp-inspector-testing.md`、`docs/agentseal-integration.md`
|
|
230
|
+
- 验收:Windows PowerShell 可运行 · 文档链接到真实上游 PR/issue
|
|
231
|
+
|
|
232
|
+
## 6. P2:外部 PR 批次 2
|
|
233
|
+
|
|
234
|
+
### Spec Kit(在 Evidence Pack v2 之后)
|
|
235
|
+
|
|
236
|
+
- 前置依赖:**P1-A 完成**(需要稳定 evidence schema)
|
|
237
|
+
- PR 形态:`docs: add evidence pack pattern for spec-driven development` 或 `walkthrough: verify implemented tasks with an external MCP safety layer`
|
|
238
|
+
- 流程:clone spec-kit → 建 `docs/evidence-verification-pattern`
|
|
239
|
+
- 验收:PR 映射 spec→tasks→implementation→evidence verification · PatchWarden 仅作示例实现 · 上游 docs 检查通过
|
|
240
|
+
|
|
241
|
+
## 7. P3:外部 PR 批次 3(最后,需已发布 evidence 可引用)
|
|
242
|
+
|
|
243
|
+
### OpenCode / OpenHands / Aider
|
|
244
|
+
|
|
245
|
+
- **OpenCode**:流量大、repo 大,先 docs-only external supervisor pattern
|
|
246
|
+
- **OpenHands**:源码归属在迁移,先查当前 repo 结构再选目标
|
|
247
|
+
- **Aider**:成熟 CLI,safe wrapper pattern 有用但应在 PatchWarden 有发布示例之后
|
|
248
|
+
- 每个 PR 验收:查上游贡献规则 · 不依赖 PatchWarden 也能用 · CI 或文档化本地检查通过 · PatchWarden README 仅在 PR 存在后回链
|
|
249
|
+
|
|
250
|
+
## 8. Issue Backlog(P0 发布真相干净后创建)
|
|
251
|
+
|
|
252
|
+
1. `fix: close v1.5.1 release truth gap`
|
|
253
|
+
2. `feat: add Evidence Pack v2 artifact schema`
|
|
254
|
+
3. `docs: add Evidence Pack v2 schema reference`
|
|
255
|
+
4. `feat: export goal final report`
|
|
256
|
+
5. `feat: import Spec Kit tasks into Goal Session`
|
|
257
|
+
6. `docs: add MCP Inspector CLI smoke testing guide`
|
|
258
|
+
7. `docs: add AgentSeal compatibility guide`
|
|
259
|
+
8. `docs: add OpenCode worker integration guide`
|
|
260
|
+
9. `docs: add OpenHands worker integration guide`
|
|
261
|
+
10. `docs: add external PR roadmap and ecosystem compatibility matrix`
|
|
262
|
+
|
|
263
|
+
## 9. 全局验收规则
|
|
264
|
+
|
|
265
|
+
### 每个内部 PatchWarden PR
|
|
266
|
+
|
|
267
|
+
```powershell
|
|
268
|
+
npm.cmd run build
|
|
269
|
+
npm.cmd run test:unit
|
|
270
|
+
npm.cmd run test:mcp
|
|
271
|
+
npm.cmd run test:http-mcp
|
|
272
|
+
npm.cmd run doctor:ci
|
|
273
|
+
npm.cmd run verify:package
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 发布前追加
|
|
277
|
+
|
|
278
|
+
```powershell
|
|
279
|
+
npm.cmd ci
|
|
280
|
+
npm.cmd test
|
|
281
|
+
npm.cmd run pack:clean
|
|
282
|
+
gh pr checks <PR_NUMBER> --repo jiezeng2004-design/PatchWarden --watch
|
|
283
|
+
gh release view v<version> --repo jiezeng2004-design/PatchWarden --json tagName,isDraft,publishedAt,url
|
|
284
|
+
npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**铁律**:GitHub Release 与 npm registry 真相都匹配目标版本前,绝不标记发布完成。
|
|
288
|
+
|
|
289
|
+
## 10. 执行顺序与依赖
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
P0-0 逐文件核对 → P0-1 门禁 → P0-2 提交推送(用户) → P0-3 PR(用户) → P0-4 发布(用户)
|
|
293
|
+
│
|
|
294
|
+
v
|
|
295
|
+
P1-A Evidence Pack v2
|
|
296
|
+
│
|
|
297
|
+
P1-B docs ───┤
|
|
298
|
+
v
|
|
299
|
+
P2-1 Inspector → P2-2 AgentSeal → P2-3 兼容文档
|
|
300
|
+
│
|
|
301
|
+
v
|
|
302
|
+
P2 Spec Kit (依赖 P1-A)
|
|
303
|
+
│
|
|
304
|
+
v
|
|
305
|
+
P3 OpenCode / OpenHands / Aider
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## 11. 安全边界(贯穿全阶段)
|
|
309
|
+
|
|
310
|
+
- 不暴露通用远程 shell,不弱化精确命令匹配
|
|
311
|
+
- 所有 repo 路径在 `workspaceRoot` 内,阻止敏感名与越界改动
|
|
312
|
+
- 不读取或持久化 token/cookie/浏览器状态/.env/SSH 密钥/凭据文件
|
|
313
|
+
- 不 blanket-kill watcher/tunnel,仅监督 launcher 拥有的进程
|
|
314
|
+
- live tunnel/watcher 切换与本地代码验证分开,不重启 live 服务除非显式要求
|
|
315
|
+
- 保留结构化任务证据、心跳状态、前后 Git 快照、变更文件记录与脱敏
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Lineage 与 Evidence Pack 工作流
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
|
|
4
|
+
> 相关页面:Dashboard(Lineage / Evidence Pack 卡片)、Lineage Detail 模态框
|
|
5
|
+
|
|
6
|
+
## 目的
|
|
7
|
+
|
|
8
|
+
`run_task_loop` 是 PatchWarden 的受守护循环(guarded loop):在 watcher、命令
|
|
9
|
+
白名单、workspace 隔离、敏感路径拦截下,自动执行“主任务 → 修复 → 清理”迭代。
|
|
10
|
+
Lineage 记录整条循环的因果链,Evidence Pack 把通过验收的 lineage 导出为可归档的
|
|
11
|
+
证据文件,整个过程不泄露完整日志或密钥。
|
|
12
|
+
|
|
13
|
+
## 核心概念
|
|
14
|
+
|
|
15
|
+
- **Lineage**:一次 `run_task_loop` 的完整记录,包含 goal、final_status、
|
|
16
|
+
stop_reason、iterations、main/fix/cleanup 各角色的 task 计数、
|
|
17
|
+
direct_verification、warnings_count。
|
|
18
|
+
- **Iteration**:循环中的单次迭代,按角色(main / fix / cleanup)分组,记录
|
|
19
|
+
status、acceptance_status、verification、audit、stop_reason、
|
|
20
|
+
final_recommended_next_action。
|
|
21
|
+
- **Evidence Pack**:与 lineage 绑定的证据包,写入
|
|
22
|
+
`.patchwarden/evidence-packs/<lineage_id>/`,包含 `evidence.json` 与
|
|
23
|
+
`EVIDENCE.md` 两个文件(v2 额外包含 6 个结构化文件,见下文)。
|
|
24
|
+
- **export_status**:证据包的导出状态,`pending` / `exported` / `failed`。
|
|
25
|
+
|
|
26
|
+
## 工作流
|
|
27
|
+
|
|
28
|
+
### 1. 启动受守护循环
|
|
29
|
+
|
|
30
|
+
通过 MCP 工具 `run_task_loop` 启动循环,可指定:
|
|
31
|
+
|
|
32
|
+
- `agent="auto"` — 让 PatchWarden 自动路由到合适的 agent
|
|
33
|
+
- `scope_files` — 路由提示
|
|
34
|
+
- `isolation_mode="worktree"` — 可选的 git worktree 隔离
|
|
35
|
+
|
|
36
|
+
循环结束后会生成一条 lineage 记录。
|
|
37
|
+
|
|
38
|
+
### 2. 在 Dashboard 查看 Lineage 状态
|
|
39
|
+
|
|
40
|
+
Dashboard 的 Lineage 卡片区分空/已填充两种状态:
|
|
41
|
+
|
|
42
|
+
- **空状态**:显示 “No loop lineage yet”,提供 “Start guarded loop” 和
|
|
43
|
+
“View recent loop runs” 入口。
|
|
44
|
+
- **已填充状态**:显示 lineage_id、goal、final_status、stop_reason、iterations、
|
|
45
|
+
main/fix/cleanup task 计数、direct_verification、warnings_count。
|
|
46
|
+
|
|
47
|
+
### 3. 打开 Lineage Detail 排查成功/失败原因
|
|
48
|
+
|
|
49
|
+
点击 lineage 卡片可打开 Lineage Detail 模态框,按角色(main / fix / cleanup)
|
|
50
|
+
分组展示每次迭代的:
|
|
51
|
+
|
|
52
|
+
- status、acceptance_status
|
|
53
|
+
- verification 摘要
|
|
54
|
+
- audit 摘要
|
|
55
|
+
- stop_reason
|
|
56
|
+
- final_recommended_next_action
|
|
57
|
+
|
|
58
|
+
如果 `final_status` 为 `failed`,先看最后一个迭代的 `stop_reason` 和
|
|
59
|
+
`final_recommended_next_action`,再决定是重建任务还是人工介入。
|
|
60
|
+
|
|
61
|
+
### 4. 验收通过后导出 Evidence Pack
|
|
62
|
+
|
|
63
|
+
只有 lineage 存在且验收通过后,Evidence Pack 卡片才会进入可导出状态:
|
|
64
|
+
|
|
65
|
+
- **空状态**:显示 “Evidence pack is available after run_task_loop.”
|
|
66
|
+
- **已填充状态**:显示 lineage_id、export_status、evidence_json_exists、
|
|
67
|
+
evidence_md_exists、exported_at。
|
|
68
|
+
|
|
69
|
+
点击 **Export evidence pack** 调用 `POST /api/evidence-packs/:lineageId/export`,
|
|
70
|
+
PatchWarden 会把有界摘要写入:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
.patchwarden/evidence-packs/<lineage_id>/evidence.json
|
|
74
|
+
.patchwarden/evidence-packs/<lineage_id>/EVIDENCE.md
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 4.1 Evidence Pack v2 结构化文件(基于 v1.5.1 源码)
|
|
78
|
+
|
|
79
|
+
v2 在原有 `evidence.json` 与 `EVIDENCE.md` 基础上额外导出 6 个有界文件:
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
.patchwarden/evidence-packs/<lineage_id>/risk.json
|
|
83
|
+
.patchwarden/evidence-packs/<lineage_id>/verify.json
|
|
84
|
+
.patchwarden/evidence-packs/<lineage_id>/diffstat.json
|
|
85
|
+
.patchwarden/evidence-packs/<lineage_id>/lineage.json
|
|
86
|
+
.patchwarden/evidence-packs/<lineage_id>/attestation.json
|
|
87
|
+
.patchwarden/evidence-packs/<lineage_id>/redactions.json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
| 文件 | 用途 |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| `risk.json` | 聚合的风险项与严重度(high/medium/low),来源为 rounds 的 fail_checks/warn_checks 与 lineage warnings。 |
|
|
93
|
+
| `verify.json` | 每轮迭代和 direct session 的结构化验证记录(状态、audit、command 计数)。 |
|
|
94
|
+
| `diffstat.json` | 文件级增删统计(路径、增删行数),不含完整 diff。 |
|
|
95
|
+
| `lineage.json` | lineage 有界摘要(goal、final_status、stop_reason、task 计数)。 |
|
|
96
|
+
| `attestation.json` | 版本、commit short hash、Node/OS、tool profile、schema epoch。 |
|
|
97
|
+
| `redactions.json` | 本次导出中脱敏的类别与计数(不存原始隐藏值)。 |
|
|
98
|
+
|
|
99
|
+
每个文件都经过 `redactSensitiveValue` 脱敏处理。详细字段结构与示例见
|
|
100
|
+
[Evidence Pack v2 文件结构](./evidence-pack-schema.md)。
|
|
101
|
+
|
|
102
|
+
### 5. 查看与归档证据文件
|
|
103
|
+
|
|
104
|
+
导出后可使用卡片上的按钮:
|
|
105
|
+
|
|
106
|
+
- **Open EVIDENCE.md** — 打开人类可读的 Markdown 证据
|
|
107
|
+
- **Open evidence.json** — 打开机器可读的 JSON 证据
|
|
108
|
+
- **Copy lineage_id** — 复制 lineage_id 用于后续追溯
|
|
109
|
+
|
|
110
|
+
## 安全边界
|
|
111
|
+
|
|
112
|
+
- Evidence Pack 只包含有界摘要,**不**包含完整日志、stdout/stderr tail、
|
|
113
|
+
完整 diff、verification 日志或密钥内容。
|
|
114
|
+
- worktree 模式不会自动 merge 或删除 worktree,需要人工确认。
|
|
115
|
+
- 导出操作只写本地文件,不执行 `npm publish` / `git push` / `git tag` /
|
|
116
|
+
`gh release` 等远程写。
|
|
117
|
+
- direct_verification 仅作为独立验证通道,不会自动 patch 文件。
|
|
118
|
+
|
|
119
|
+
## 相关 API 端点
|
|
120
|
+
|
|
121
|
+
- `GET /api/lineages` — lineage 列表(含 goal / final_status / stop_reason /
|
|
122
|
+
iterations / task counts / direct_verification / warnings_count)
|
|
123
|
+
- `GET /api/lineages/:id` — 单条 lineage 详情
|
|
124
|
+
- `GET /api/evidence-packs` — 证据包列表(含 export_status /
|
|
125
|
+
evidence_json_exists / evidence_md_exists / exported_at)
|
|
126
|
+
- `GET /api/evidence-packs/:lineage_id` — 单个证据包详情
|
|
127
|
+
- `POST /api/evidence-packs/:lineageId/export` — 触发证据包导出
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# 用 MCP Inspector 测试 PatchWarden
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
|
|
4
|
+
> 说明:本文以 PatchWarden 为例介绍通用的 MCP server 调试方法,
|
|
5
|
+
> MCP Inspector 是 modelcontextprotocol 社区维护的独立工具。
|
|
6
|
+
|
|
7
|
+
## MCP Inspector 是什么
|
|
8
|
+
|
|
9
|
+
MCP Inspector(`modelcontextprotocol/inspector`)是用于调试 MCP server 的官方工具,
|
|
10
|
+
主要能力包括:
|
|
11
|
+
|
|
12
|
+
- 连接到本地或远程 MCP server。
|
|
13
|
+
- 列出 server 暴露的 tools、resources、prompts。
|
|
14
|
+
- 交互式调用 tool 并查看结构化响应。
|
|
15
|
+
- 检查 server 的 capabilities 声明。
|
|
16
|
+
|
|
17
|
+
对于 PatchWarden 这类本地 MCP server,Inspector 是验证工具行为、
|
|
18
|
+
确认 safe 输出不含敏感内容的最直接手段。
|
|
19
|
+
|
|
20
|
+
## 前置准备
|
|
21
|
+
|
|
22
|
+
### 1. 安装 MCP Inspector
|
|
23
|
+
|
|
24
|
+
```powershell
|
|
25
|
+
# 全局安装(Node.js 环境)
|
|
26
|
+
npm.cmd install -g @modelcontextprotocol/inspector
|
|
27
|
+
|
|
28
|
+
# 或直接通过 npx 临时运行
|
|
29
|
+
npx @modelcontextprotocol/inspector
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 2. 确认 PatchWarden 可启动
|
|
33
|
+
|
|
34
|
+
在 PatchWarden 仓库下确认构建产物存在:
|
|
35
|
+
|
|
36
|
+
```powershell
|
|
37
|
+
# 在 PatchWarden 仓库根目录
|
|
38
|
+
npm.cmd run build
|
|
39
|
+
# 确认 dist/ 目录存在 MCP server 入口
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3. 准备测试 workspace
|
|
43
|
+
|
|
44
|
+
准备一个独立的测试 workspace,避免在生产仓库上直接调试:
|
|
45
|
+
|
|
46
|
+
```powershell
|
|
47
|
+
# 示例:创建测试用 workspace
|
|
48
|
+
New-Item -ItemType Directory -Path "D:\test-workspace\demo-repo" -Force
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
并在该 workspace 下放置最小化的 `.patchwarden/config.json` 与 `project-policy.json`。
|
|
52
|
+
|
|
53
|
+
## 连接 PatchWarden
|
|
54
|
+
|
|
55
|
+
### 方式一:Inspector GUI
|
|
56
|
+
|
|
57
|
+
```powershell
|
|
58
|
+
# 启动 Inspector
|
|
59
|
+
npx @modelcontextprotocol/inspector
|
|
60
|
+
|
|
61
|
+
# Inspector 默认在 http://localhost:6274 提供 Web UI
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
在 Inspector UI 中:
|
|
65
|
+
|
|
66
|
+
1. Transport 选择 `STDIO`。
|
|
67
|
+
2. Command 填写 PatchWarden server 启动命令(如 `node` )。
|
|
68
|
+
3. Args 填写 PatchWarden dist 入口路径。
|
|
69
|
+
4. 点击 Connect。
|
|
70
|
+
|
|
71
|
+
### 方式二:直接通过 Inspector CLI
|
|
72
|
+
|
|
73
|
+
```powershell
|
|
74
|
+
# Inspector CLI 模式,连接 PatchWarden 并列出 tools
|
|
75
|
+
npx @modelcontextprotocol/inspector cli `
|
|
76
|
+
--transport stdio `
|
|
77
|
+
--command node `
|
|
78
|
+
--args "D:\ai_agent\Reasonix\reasonix_program\PatchWarden\dist\index.js"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 调用工具并验证响应
|
|
82
|
+
|
|
83
|
+
### 列出可用工具
|
|
84
|
+
|
|
85
|
+
连接成功后,在 Inspector 中调用 `tools/list`,确认 PatchWarden 暴露的工具清单,
|
|
86
|
+
例如:
|
|
87
|
+
|
|
88
|
+
- `list_agents`
|
|
89
|
+
- `run_safe_task`
|
|
90
|
+
- `export_task_evidence_pack`
|
|
91
|
+
- `get_safe_audit`
|
|
92
|
+
- 其他 safe-first 工具
|
|
93
|
+
|
|
94
|
+
### 调用一个 safe 工具
|
|
95
|
+
|
|
96
|
+
在 Inspector UI 中选择 `run_safe_task`,填入参数:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"agent": "opencode",
|
|
101
|
+
"task": "echo hello",
|
|
102
|
+
"declaredFiles": ["README.md"]
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
查看返回的 `safe_result`,确认:
|
|
107
|
+
|
|
108
|
+
- 返回内容是有界摘要(字节数受 `safeResult.maxBytes` 约束)。
|
|
109
|
+
- 不包含完整 stdout / stderr。
|
|
110
|
+
- 不包含敏感路径或凭据信息。
|
|
111
|
+
|
|
112
|
+
### 验证 safe 输出不含敏感内容
|
|
113
|
+
|
|
114
|
+
PatchWarden 的安全契约要求 safe 输出不得包含 token、cookie、`.env` 内容等。
|
|
115
|
+
可用以下方法验证:
|
|
116
|
+
|
|
117
|
+
```powershell
|
|
118
|
+
# 导出 evidence pack 后检查文件内容
|
|
119
|
+
$pack = "D:\test-workspace\demo-repo\.patchwarden\evidence-packs"
|
|
120
|
+
Select-String -Path "$pack\*\evidence.json" -Pattern "token|secret|password|api_key|cookie" -CaseSensitive:$false
|
|
121
|
+
# 期望:无匹配,或仅匹配 redactions.json 中已脱敏的占位符
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```powershell
|
|
125
|
+
# 检查 redactions.json 确认脱敏记录
|
|
126
|
+
Get-Content "$pack\*\redactions.json" | ConvertFrom-Json
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## CLI smoke testing 示例
|
|
130
|
+
|
|
131
|
+
以下为通用的 MCP server smoke test 方法,PatchWarden 作为示例之一。
|
|
132
|
+
|
|
133
|
+
### 启动 PatchWarden 并发送 initialize 请求
|
|
134
|
+
|
|
135
|
+
```powershell
|
|
136
|
+
# 通过 Inspector 的 CLI 模式发送 initialize
|
|
137
|
+
npx @modelcontextprotocol/inspector cli `
|
|
138
|
+
--transport stdio `
|
|
139
|
+
--command node `
|
|
140
|
+
--args "D:\ai_agent\Reasonix\reasonix_program\PatchWarden\dist\index.js" `
|
|
141
|
+
--method initialize `
|
|
142
|
+
--params '{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{}}'
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
确认响应中包含 PatchWarden 的 serverInfo 与 capabilities。
|
|
146
|
+
|
|
147
|
+
### 列出工具并保存清单
|
|
148
|
+
|
|
149
|
+
```powershell
|
|
150
|
+
# 将 tools/list 结果保存到文件便于审查
|
|
151
|
+
npx @modelcontextprotocol/inspector cli `
|
|
152
|
+
--transport stdio `
|
|
153
|
+
--command node `
|
|
154
|
+
--args "D:\ai_agent\Reasonix\reasonix_program\PatchWarden\dist\index.js" `
|
|
155
|
+
--method tools/list `
|
|
156
|
+
| Out-File -FilePath "D:\test-workspace\tools-list.json" -Encoding utf8
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 调用工具并检查响应边界
|
|
160
|
+
|
|
161
|
+
```powershell
|
|
162
|
+
# 调用一个 safe 工具,将响应保存后检查字节数
|
|
163
|
+
npx @modelcontextprotocol/inspector cli `
|
|
164
|
+
--transport stdio `
|
|
165
|
+
--command node `
|
|
166
|
+
--args "D:\ai_agent\Reasonix\reasonix_program\PatchWarden\dist\index.js" `
|
|
167
|
+
--method tools/call `
|
|
168
|
+
--params '{\"name\":\"get_safe_audit\",\"arguments\":{}}' `
|
|
169
|
+
| Out-File -FilePath "D:\test-workspace\safe-audit.json" -Encoding utf8
|
|
170
|
+
|
|
171
|
+
# 检查响应字节数是否在有界范围内
|
|
172
|
+
(Get-Item "D:\test-workspace\safe-audit.json").Length
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## 常见验证清单
|
|
176
|
+
|
|
177
|
+
测试 PatchWarden 时建议覆盖以下项:
|
|
178
|
+
|
|
179
|
+
- [ ] `tools/list` 返回的均为 safe-first 工具。
|
|
180
|
+
- [ ] `run_safe_task` 返回的 `safe_result` 字节数在 `maxBytes` 范围内。
|
|
181
|
+
- [ ] 调用涉及敏感文件名的工具时被阻断(如尝试读取 `.env`)。
|
|
182
|
+
- [ ] 越出 workspace 的路径请求被拒绝。
|
|
183
|
+
- [ ] 未在 `allowedCommands` 中的命令被拒绝执行。
|
|
184
|
+
- [ ] `export_task_evidence_pack` 产出 8 个有界文件。
|
|
185
|
+
- [ ] evidence 文件中不含 token、cookie、secret 明文。
|
|
186
|
+
|
|
187
|
+
## 注意事项
|
|
188
|
+
|
|
189
|
+
- Inspector 是调试工具,不应作为生产客户端长期运行。
|
|
190
|
+
- 调试时使用独立测试 workspace,不要在生产仓库上执行破坏性任务。
|
|
191
|
+
- 若 Inspector 报告连接失败,先确认 PatchWarden 的 dist 产物已构建。
|
|
192
|
+
- safe 输出的有界范围由 `.patchwarden/config.json` 中的 `safeResult.maxBytes` 控制,
|
|
193
|
+
调试时可适当调小以验证边界行为。
|
|
194
|
+
|
|
195
|
+
## 相关文档
|
|
196
|
+
|
|
197
|
+
- `docs/threat-model.md`:PatchWarden 安全契约与敏感文件清单。
|
|
198
|
+
- `docs/evidence-pack-schema.md`:Evidence Pack v2 文件结构。
|
|
199
|
+
- `docs/dashboard-overview.md`:Control Center 与 safe-first 概念。
|
|
200
|
+
- 上游草稿 PR:https://github.com/modelcontextprotocol/inspector/pull/1635
|