patchwarden 1.5.0 → 1.6.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.
Files changed (597) hide show
  1. package/PatchWarden.cmd +32 -2
  2. package/README.en.md +194 -26
  3. package/README.md +160 -22
  4. package/dist/assessments/agentAssessor.d.ts +1 -1
  5. package/dist/assessments/agentAssessor.js +24 -15
  6. package/dist/assessments/assessmentStore.d.ts +1 -1
  7. package/dist/assessments/assessmentStore.js +44 -36
  8. package/dist/assessments/confirmCli.js +5 -4
  9. package/dist/config.d.ts +22 -0
  10. package/dist/config.js +98 -11
  11. package/dist/control/fileManager.d.ts +2 -0
  12. package/dist/control/fileManager.js +39 -0
  13. package/dist/control/middleware/auth.d.ts +16 -0
  14. package/dist/control/middleware/auth.js +17 -0
  15. package/dist/control/middleware/static.d.ts +3 -0
  16. package/dist/control/middleware/static.js +78 -0
  17. package/dist/control/routeTable.d.ts +24 -0
  18. package/dist/control/routeTable.js +263 -0
  19. package/dist/control/routes/audit.d.ts +15 -0
  20. package/dist/control/routes/audit.js +287 -0
  21. package/dist/control/routes/evidence.d.ts +4 -0
  22. package/dist/control/routes/evidence.js +96 -0
  23. package/dist/control/routes/lineage.d.ts +3 -0
  24. package/dist/control/routes/lineage.js +71 -0
  25. package/dist/control/routes/policy.d.ts +3 -0
  26. package/dist/control/routes/policy.js +81 -0
  27. package/dist/control/routes/process.d.ts +12 -0
  28. package/dist/control/routes/process.js +487 -0
  29. package/dist/control/routes/sessions.d.ts +30 -0
  30. package/dist/control/routes/sessions.js +287 -0
  31. package/dist/control/routes/status.d.ts +51 -0
  32. package/dist/control/routes/status.js +307 -0
  33. package/dist/control/routes/taskActions.d.ts +21 -0
  34. package/dist/control/routes/taskActions.js +197 -0
  35. package/dist/control/routes/tasks.d.ts +24 -0
  36. package/dist/control/routes/tasks.js +309 -0
  37. package/dist/control/routes/workspace.d.ts +15 -0
  38. package/dist/control/routes/workspace.js +220 -0
  39. package/dist/control/runtime.d.ts +92 -0
  40. package/dist/control/runtime.js +425 -0
  41. package/dist/control/server.d.ts +13 -0
  42. package/dist/control/server.js +150 -0
  43. package/dist/control/shared.d.ts +59 -0
  44. package/dist/control/shared.js +341 -0
  45. package/dist/controlCenter.d.ts +6 -0
  46. package/dist/controlCenter.js +7 -2197
  47. package/dist/direct/directAudit.js +234 -225
  48. package/dist/direct/directGuards.d.ts +2 -1
  49. package/dist/direct/directGuards.js +72 -37
  50. package/dist/direct/directPatch.d.ts +6 -1
  51. package/dist/direct/directPatch.js +55 -8
  52. package/dist/direct/directSessionStore.d.ts +16 -6
  53. package/dist/direct/directSessionStore.js +127 -35
  54. package/dist/direct/directVerification.js +8 -16
  55. package/dist/doctor.d.ts +18 -1
  56. package/dist/doctor.js +614 -373
  57. package/dist/goal/acceptanceEngine.d.ts +1 -1
  58. package/dist/goal/goalProgress.js +75 -69
  59. package/dist/goal/goalReport.d.ts +54 -0
  60. package/dist/goal/goalReport.js +197 -0
  61. package/dist/goal/goalStatus.d.ts +8 -0
  62. package/dist/goal/goalStatus.js +10 -3
  63. package/dist/goal/goalStore.d.ts +9 -2
  64. package/dist/goal/goalStore.js +152 -45
  65. package/dist/goal/handoffExport.js +6 -6
  66. package/dist/goal/specKitImport.d.ts +63 -0
  67. package/dist/goal/specKitImport.js +221 -0
  68. package/dist/goal/subgoalSync.js +13 -10
  69. package/dist/goal/worktreeManager.d.ts +2 -0
  70. package/dist/goal/worktreeManager.js +209 -136
  71. package/dist/httpServer.js +126 -44
  72. package/dist/index.js +7 -4
  73. package/dist/logging.d.ts +7 -1
  74. package/dist/logging.js +13 -3
  75. package/dist/policy/projectPolicy.js +5 -2
  76. package/dist/release/releaseGate.d.ts +1 -1
  77. package/dist/release/releaseGate.js +78 -25
  78. package/dist/runner/agentInvocation.d.ts +14 -0
  79. package/dist/runner/agentInvocation.js +96 -4
  80. package/dist/runner/changeCapture.d.ts +14 -6
  81. package/dist/runner/changeCapture.js +287 -81
  82. package/dist/runner/cli.js +7 -6
  83. package/dist/runner/postTaskCleanup.js +60 -7
  84. package/dist/runner/processSecurity.d.ts +56 -0
  85. package/dist/runner/processSecurity.js +373 -0
  86. package/dist/runner/runTask.d.ts +1 -1
  87. package/dist/runner/runTask.js +339 -287
  88. package/dist/runner/simpleProcess.d.ts +3 -0
  89. package/dist/runner/simpleProcess.js +52 -38
  90. package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
  91. package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
  92. package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +1 -1
  93. package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
  94. package/dist/runner/taskStatusStore.d.ts +11 -0
  95. package/dist/runner/taskStatusStore.js +24 -0
  96. package/dist/runner/watch.d.ts +14 -1
  97. package/dist/runner/watch.js +265 -54
  98. package/dist/security/contentRedaction.d.ts +6 -0
  99. package/dist/security/contentRedaction.js +24 -2
  100. package/dist/security/discoveryTokenStore.d.ts +3 -2
  101. package/dist/security/discoveryTokenStore.js +17 -2
  102. package/dist/security/loopbackHost.d.ts +2 -0
  103. package/dist/security/loopbackHost.js +16 -0
  104. package/dist/security/pathGuard.js +32 -17
  105. package/dist/security/planGuard.js +2 -1
  106. package/dist/security/runtimeGuard.js +9 -6
  107. package/dist/security/secretComparison.d.ts +3 -0
  108. package/dist/security/secretComparison.js +11 -0
  109. package/dist/security/sensitiveGuard.d.ts +5 -0
  110. package/dist/security/sensitiveGuard.js +27 -8
  111. package/dist/security/toolInvocationGuard.d.ts +2 -2
  112. package/dist/security/toolInvocationGuard.js +1 -1
  113. package/dist/security/workspaceRootGuard.d.ts +8 -0
  114. package/dist/security/workspaceRootGuard.js +47 -0
  115. package/dist/smoke-test.js +280 -273
  116. package/dist/tools/catalog/index.d.ts +4 -0
  117. package/dist/tools/catalog/index.js +4 -0
  118. package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
  119. package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
  120. package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +28 -15
  121. package/dist/tools/definitions/toolDefs.d.ts +18 -0
  122. package/dist/tools/definitions/toolDefs.js +1177 -0
  123. package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
  124. package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
  125. package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +8 -63
  126. package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +111 -37
  127. package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +6 -6
  128. package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +10 -10
  129. package/dist/tools/diagnostics/index.d.ts +6 -0
  130. package/dist/tools/diagnostics/index.js +6 -0
  131. package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
  132. package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
  133. package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +14 -10
  134. package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +25 -15
  135. package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
  136. package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
  137. package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +1 -1
  138. package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +8 -8
  139. package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +2 -2
  140. package/dist/tools/direct/finalizeDirectSession.js +86 -0
  141. package/dist/tools/direct/index.d.ts +3 -0
  142. package/dist/tools/direct/index.js +3 -0
  143. package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
  144. package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
  145. package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
  146. package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
  147. package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
  148. package/dist/tools/discovery/index.d.ts +3 -0
  149. package/dist/tools/discovery/index.js +3 -0
  150. package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
  151. package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
  152. package/dist/tools/dispatch/coreDispatch.d.ts +9 -0
  153. package/dist/tools/dispatch/coreDispatch.js +283 -0
  154. package/dist/tools/dispatch/diagnosticDispatch.d.ts +12 -0
  155. package/dist/tools/dispatch/diagnosticDispatch.js +80 -0
  156. package/dist/tools/dispatch/directDispatch.d.ts +8 -0
  157. package/dist/tools/dispatch/directDispatch.js +116 -0
  158. package/dist/tools/dispatch/goalDispatch.d.ts +8 -0
  159. package/dist/tools/dispatch/goalDispatch.js +92 -0
  160. package/dist/tools/dispatch/releaseDispatch.d.ts +8 -0
  161. package/dist/tools/dispatch/releaseDispatch.js +46 -0
  162. package/dist/tools/dispatch/types.d.ts +23 -0
  163. package/dist/tools/dispatch/types.js +15 -0
  164. package/dist/tools/dispatch/validation.d.ts +7 -0
  165. package/dist/tools/dispatch/validation.js +71 -0
  166. package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
  167. package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +2 -2
  168. package/dist/tools/goals/goalSubgoalTask.js +118 -0
  169. package/dist/tools/goals/index.d.ts +3 -0
  170. package/dist/tools/goals/index.js +3 -0
  171. package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
  172. package/dist/tools/registry.d.ts +10 -14
  173. package/dist/tools/registry.js +47 -1651
  174. package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
  175. package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
  176. package/dist/tools/release/index.d.ts +2 -0
  177. package/dist/tools/release/index.js +2 -0
  178. package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
  179. package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
  180. package/dist/tools/tasks/cancelTask.d.ts +11 -0
  181. package/dist/tools/tasks/cancelTask.js +85 -0
  182. package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +12 -4
  183. package/dist/tools/{createTask.js → tasks/createTask.js} +46 -31
  184. package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
  185. package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +8 -8
  186. package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +6 -0
  187. package/dist/tools/tasks/evidencePack.js +387 -0
  188. package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
  189. package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
  190. package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +5 -5
  191. package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
  192. package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +33 -26
  193. package/dist/tools/tasks/index.d.ts +18 -0
  194. package/dist/tools/tasks/index.js +18 -0
  195. package/dist/tools/tasks/killTask.d.ts +1 -0
  196. package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
  197. package/dist/tools/{listTasks.js → tasks/listTasks.js} +3 -3
  198. package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +1 -1
  199. package/dist/tools/{reconcileTasks.js → tasks/reconcileTasks.js} +64 -66
  200. package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +2 -2
  201. package/dist/tools/tasks/retryTask.js +60 -0
  202. package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
  203. package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +59 -31
  204. package/dist/tools/tasks/runVerification.js +38 -0
  205. package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
  206. package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
  207. package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
  208. package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
  209. package/dist/tools/workspace/applyPatch.js +53 -0
  210. package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
  211. package/dist/tools/workspace/index.d.ts +10 -0
  212. package/dist/tools/workspace/index.js +10 -0
  213. package/dist/tools/{listAgents.d.ts → workspace/listAgents.d.ts} +5 -0
  214. package/dist/tools/{listAgents.js → workspace/listAgents.js} +8 -4
  215. package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
  216. package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
  217. package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
  218. package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
  219. package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
  220. package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
  221. package/dist/tools/workspace/syncFile.js +134 -0
  222. package/dist/utils/atomicFile.d.ts +7 -0
  223. package/dist/utils/atomicFile.js +48 -0
  224. package/dist/utils/boundedFile.d.ts +8 -0
  225. package/dist/utils/boundedFile.js +93 -0
  226. package/dist/utils/lockedJsonFile.d.ts +15 -0
  227. package/dist/utils/lockedJsonFile.js +224 -0
  228. package/dist/utils/platform.d.ts +11 -0
  229. package/dist/utils/platform.js +26 -0
  230. package/dist/utils/stableJson.d.ts +2 -0
  231. package/dist/utils/stableJson.js +12 -0
  232. package/dist/version.d.ts +3 -2
  233. package/dist/version.js +3 -2
  234. package/dist/watcherStatus.d.ts +2 -2
  235. package/dist/watcherStatus.js +18 -0
  236. package/docs/CODE_WIKI.md +1648 -0
  237. package/docs/agentseal-integration.md +150 -0
  238. package/docs/architecture.md +23 -0
  239. package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
  240. package/docs/assets/patchwarden-oss-demo.gif +0 -0
  241. package/docs/control-center/README.md +4 -4
  242. package/docs/dashboard-overview.md +86 -0
  243. package/docs/demo.md +8 -0
  244. package/docs/desktop-app.md +175 -0
  245. package/docs/direct-session-workflow.md +98 -0
  246. package/docs/evidence-pack-schema.md +215 -0
  247. package/docs/lineage-evidence-pack-workflow.md +127 -0
  248. package/docs/mcp-inspector-testing.md +200 -0
  249. package/docs/open-source-application.md +168 -0
  250. package/docs/opencode-worker.md +151 -0
  251. package/docs/openhands-worker.md +181 -0
  252. package/docs/release-checklist.md +1 -1
  253. package/docs/release-evidence.md +82 -0
  254. package/docs/spec-kit-integration.md +131 -0
  255. package/docs/task-safe-review-workflow.md +98 -0
  256. package/docs/threat-model.md +97 -0
  257. package/docs/user-feedback.md +40 -0
  258. package/docs/why-patchwarden.md +110 -0
  259. package/examples/config.example.json +4 -2
  260. package/package.json +28 -11
  261. package/scripts/README.md +15 -6
  262. package/scripts/build.js +11 -0
  263. package/scripts/checks/brand-check.js +3 -0
  264. package/scripts/checks/build-output-check.js +37 -0
  265. package/scripts/checks/control-center-smoke.js +447 -6
  266. package/scripts/checks/control-smoke.js +19 -8
  267. package/scripts/checks/http-mcp-smoke.js +82 -4
  268. package/scripts/checks/lifecycle-smoke.js +39 -33
  269. package/scripts/checks/mcp-manifest-check.js +1 -1
  270. package/scripts/checks/mcp-smoke.js +30 -4
  271. package/scripts/checks/package-manifest-check.js +20 -7
  272. package/scripts/checks/unit-tests.js +3 -5
  273. package/scripts/checks/watcher-supervisor-smoke.js +9 -0
  274. package/scripts/control/get-patchwarden-health.ps1 +1 -1
  275. package/scripts/control/manage-patchwarden.ps1 +69 -4
  276. package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
  277. package/scripts/control/run-background-supervisor.ps1 +41 -0
  278. package/scripts/control/start-patchwarden-tunnel.ps1 +126 -32
  279. package/scripts/generate-demo-gif.py +320 -0
  280. package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
  281. package/scripts/launchers/PatchWarden-Control.cmd +6 -0
  282. package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
  283. package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
  284. package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
  285. package/scripts/lib/clean-generated-output.js +11 -0
  286. package/scripts/lib/file-discovery.js +12 -0
  287. package/scripts/release/desktop-preflight.js +211 -0
  288. package/scripts/release/pack-clean.js +59 -14
  289. package/src/assessments/agentAssessor.ts +29 -15
  290. package/src/assessments/assessmentStore.ts +55 -43
  291. package/src/assessments/confirmCli.ts +5 -4
  292. package/src/config.ts +105 -11
  293. package/src/control/fileManager.ts +40 -0
  294. package/src/control/middleware/auth.ts +35 -0
  295. package/src/control/middleware/static.ts +84 -0
  296. package/src/control/routeTable.ts +301 -0
  297. package/src/control/routes/audit.ts +329 -0
  298. package/src/control/routes/evidence.ts +107 -0
  299. package/src/control/routes/lineage.ts +92 -0
  300. package/src/control/routes/policy.ts +81 -0
  301. package/src/control/routes/process.ts +505 -0
  302. package/src/control/routes/sessions.ts +314 -0
  303. package/src/control/routes/status.ts +405 -0
  304. package/src/control/routes/taskActions.ts +214 -0
  305. package/src/control/routes/tasks.ts +331 -0
  306. package/src/control/routes/workspace.ts +234 -0
  307. package/src/control/runtime.ts +508 -0
  308. package/src/control/server.ts +165 -0
  309. package/src/control/shared.ts +360 -0
  310. package/src/controlCenter.ts +7 -2347
  311. package/src/direct/directAudit.ts +17 -9
  312. package/src/direct/directGuards.ts +100 -51
  313. package/src/direct/directPatch.ts +95 -8
  314. package/src/direct/directSessionStore.ts +211 -55
  315. package/src/direct/directVerification.ts +9 -23
  316. package/src/doctor.ts +766 -492
  317. package/src/goal/acceptanceEngine.ts +1 -1
  318. package/src/goal/goalProgress.ts +17 -13
  319. package/src/goal/goalReport.ts +263 -0
  320. package/src/goal/goalStatus.ts +25 -3
  321. package/src/goal/goalStore.ts +241 -54
  322. package/src/goal/handoffExport.ts +6 -6
  323. package/src/goal/specKitImport.ts +355 -0
  324. package/src/goal/subgoalSync.ts +15 -10
  325. package/src/goal/worktreeManager.ts +139 -22
  326. package/src/httpServer.ts +130 -44
  327. package/src/index.ts +7 -4
  328. package/src/logging.ts +20 -4
  329. package/src/policy/projectPolicy.ts +5 -2
  330. package/src/release/releaseGate.ts +74 -27
  331. package/src/runner/agentInvocation.ts +126 -4
  332. package/src/runner/changeCapture.ts +342 -80
  333. package/src/runner/cli.ts +7 -6
  334. package/src/runner/postTaskCleanup.ts +55 -7
  335. package/src/runner/processSecurity.ts +433 -0
  336. package/src/runner/runTask.ts +441 -292
  337. package/src/runner/simpleProcess.ts +68 -33
  338. package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
  339. package/src/{taskRuntime.ts → runner/taskRuntime.ts} +4 -3
  340. package/src/runner/taskStatusStore.ts +54 -0
  341. package/src/runner/watch.ts +290 -57
  342. package/src/security/contentRedaction.ts +31 -2
  343. package/src/security/discoveryTokenStore.ts +18 -4
  344. package/src/security/loopbackHost.ts +19 -0
  345. package/src/security/pathGuard.ts +35 -16
  346. package/src/security/planGuard.ts +2 -1
  347. package/src/security/runtimeGuard.ts +9 -6
  348. package/src/security/secretComparison.ts +13 -0
  349. package/src/security/sensitiveGuard.ts +27 -8
  350. package/src/security/toolInvocationGuard.ts +2 -2
  351. package/src/security/workspaceRootGuard.ts +53 -0
  352. package/src/smoke-test.ts +276 -273
  353. package/src/tools/catalog/index.ts +4 -0
  354. package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
  355. package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +29 -16
  356. package/src/tools/definitions/toolDefs.ts +1264 -0
  357. package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
  358. package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +196 -89
  359. package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +11 -11
  360. package/src/tools/diagnostics/index.ts +6 -0
  361. package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
  362. package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +29 -19
  363. package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
  364. package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +9 -9
  365. package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +11 -9
  366. package/src/tools/direct/index.ts +3 -0
  367. package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
  368. package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
  369. package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
  370. package/src/tools/discovery/index.ts +3 -0
  371. package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
  372. package/src/tools/dispatch/coreDispatch.ts +379 -0
  373. package/src/tools/dispatch/diagnosticDispatch.ts +106 -0
  374. package/src/tools/dispatch/directDispatch.ts +168 -0
  375. package/src/tools/dispatch/goalDispatch.ts +128 -0
  376. package/src/tools/dispatch/releaseDispatch.ts +66 -0
  377. package/src/tools/dispatch/types.ts +24 -0
  378. package/src/tools/dispatch/validation.ts +78 -0
  379. package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
  380. package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +43 -28
  381. package/src/tools/goals/index.ts +3 -0
  382. package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
  383. package/src/tools/registry.ts +54 -1858
  384. package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
  385. package/src/tools/release/index.ts +2 -0
  386. package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
  387. package/src/tools/tasks/cancelTask.ts +109 -0
  388. package/src/tools/{createTask.ts → tasks/createTask.ts} +56 -33
  389. package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +8 -8
  390. package/src/tools/tasks/evidencePack.ts +504 -0
  391. package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
  392. package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +7 -5
  393. package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
  394. package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +44 -33
  395. package/src/tools/tasks/index.ts +18 -0
  396. package/src/tools/{listTasks.ts → tasks/listTasks.ts} +4 -4
  397. package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +68 -66
  398. package/src/tools/tasks/retryTask.ts +69 -0
  399. package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +70 -35
  400. package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
  401. package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
  402. package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
  403. package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
  404. package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
  405. package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
  406. package/src/tools/workspace/index.ts +10 -0
  407. package/src/tools/{listAgents.ts → workspace/listAgents.ts} +11 -4
  408. package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
  409. package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
  410. package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
  411. package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
  412. package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
  413. package/src/tools/workspace/syncFile.ts +292 -0
  414. package/src/utils/atomicFile.ts +58 -0
  415. package/src/utils/boundedFile.ts +116 -0
  416. package/src/utils/lockedJsonFile.ts +251 -0
  417. package/src/utils/platform.ts +31 -0
  418. package/src/utils/stableJson.ts +12 -0
  419. package/src/version.ts +3 -2
  420. package/src/watcherStatus.ts +19 -1
  421. package/ui/desktop-bootstrap.js +11 -0
  422. package/ui/desktop-bridge.js +36 -0
  423. package/ui/desktop.css +160 -0
  424. package/ui/getting-started.js +93 -0
  425. package/ui/i18n.js +484 -0
  426. package/ui/log-parser.js +30 -0
  427. package/ui/pages/audit.html +204 -3
  428. package/ui/pages/dashboard.html +937 -79
  429. package/ui/pages/direct-sessions.html +609 -60
  430. package/ui/pages/getting-started.html +43 -0
  431. package/ui/pages/logs.html +105 -22
  432. package/ui/pages/settings.html +101 -0
  433. package/ui/pages/task-detail.html +468 -438
  434. package/ui/pages/tasks.html +648 -65
  435. package/ui/pages/workspace.html +38 -1
  436. package/ui/settings.js +245 -0
  437. package/PatchWarden-Control.cmd +0 -6
  438. package/Restart-PatchWarden-Control.cmd +0 -6
  439. package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
  440. package/dist/test/unit/acceptance-engine.test.js +0 -228
  441. package/dist/test/unit/agent-router.test.d.ts +0 -1
  442. package/dist/test/unit/agent-router.test.js +0 -287
  443. package/dist/test/unit/android-doctor.test.d.ts +0 -1
  444. package/dist/test/unit/android-doctor.test.js +0 -118
  445. package/dist/test/unit/audit-checks.test.d.ts +0 -1
  446. package/dist/test/unit/audit-checks.test.js +0 -350
  447. package/dist/test/unit/chinese-path.test.d.ts +0 -1
  448. package/dist/test/unit/chinese-path.test.js +0 -91
  449. package/dist/test/unit/command-guard.test.d.ts +0 -1
  450. package/dist/test/unit/command-guard.test.js +0 -160
  451. package/dist/test/unit/diagnose-task.test.d.ts +0 -1
  452. package/dist/test/unit/diagnose-task.test.js +0 -457
  453. package/dist/test/unit/direct-guards.test.d.ts +0 -1
  454. package/dist/test/unit/direct-guards.test.js +0 -213
  455. package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
  456. package/dist/test/unit/discovery-token-store.test.js +0 -139
  457. package/dist/test/unit/evidence-pack.test.d.ts +0 -1
  458. package/dist/test/unit/evidence-pack.test.js +0 -130
  459. package/dist/test/unit/goal-graph.test.d.ts +0 -1
  460. package/dist/test/unit/goal-graph.test.js +0 -298
  461. package/dist/test/unit/goal-progress.test.d.ts +0 -1
  462. package/dist/test/unit/goal-progress.test.js +0 -381
  463. package/dist/test/unit/goal-status.test.d.ts +0 -1
  464. package/dist/test/unit/goal-status.test.js +0 -215
  465. package/dist/test/unit/goal-store.test.d.ts +0 -1
  466. package/dist/test/unit/goal-store.test.js +0 -253
  467. package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
  468. package/dist/test/unit/goal-subgoal-task.test.js +0 -55
  469. package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
  470. package/dist/test/unit/goal-tools-registry.test.js +0 -190
  471. package/dist/test/unit/handoff-export.test.d.ts +0 -1
  472. package/dist/test/unit/handoff-export.test.js +0 -263
  473. package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
  474. package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
  475. package/dist/test/unit/logging.test.d.ts +0 -1
  476. package/dist/test/unit/logging.test.js +0 -397
  477. package/dist/test/unit/path-guard.test.d.ts +0 -1
  478. package/dist/test/unit/path-guard.test.js +0 -109
  479. package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
  480. package/dist/test/unit/post-task-cleanup.test.js +0 -48
  481. package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
  482. package/dist/test/unit/project-policy-release-mode.test.js +0 -125
  483. package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
  484. package/dist/test/unit/reconcile-tasks.test.js +0 -456
  485. package/dist/test/unit/release-gate.test.d.ts +0 -1
  486. package/dist/test/unit/release-gate.test.js +0 -242
  487. package/dist/test/unit/run-task-loop.test.d.ts +0 -1
  488. package/dist/test/unit/run-task-loop.test.js +0 -380
  489. package/dist/test/unit/safe-status.test.d.ts +0 -1
  490. package/dist/test/unit/safe-status.test.js +0 -165
  491. package/dist/test/unit/safe-views.test.d.ts +0 -1
  492. package/dist/test/unit/safe-views.test.js +0 -171
  493. package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
  494. package/dist/test/unit/schema-drift-check.test.js +0 -176
  495. package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
  496. package/dist/test/unit/sensitive-guard.test.js +0 -104
  497. package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
  498. package/dist/test/unit/subgoal-sync.test.js +0 -183
  499. package/dist/test/unit/sync-file.test.d.ts +0 -1
  500. package/dist/test/unit/sync-file.test.js +0 -154
  501. package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
  502. package/dist/test/unit/tool-invocation-guard.test.js +0 -432
  503. package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
  504. package/dist/test/unit/tool-usage-stats.test.js +0 -300
  505. package/dist/test/unit/toolSearch.test.d.ts +0 -1
  506. package/dist/test/unit/toolSearch.test.js +0 -571
  507. package/dist/test/unit/watcher-status.test.d.ts +0 -1
  508. package/dist/test/unit/watcher-status.test.js +0 -169
  509. package/dist/test/unit/worktree-manager.test.d.ts +0 -1
  510. package/dist/test/unit/worktree-manager.test.js +0 -176
  511. package/dist/tools/applyPatch.js +0 -41
  512. package/dist/tools/cancelTask.d.ts +0 -30
  513. package/dist/tools/cancelTask.js +0 -64
  514. package/dist/tools/evidencePack.js +0 -168
  515. package/dist/tools/finalizeDirectSession.js +0 -84
  516. package/dist/tools/goalSubgoalTask.js +0 -110
  517. package/dist/tools/killTask.d.ts +0 -15
  518. package/dist/tools/retryTask.js +0 -45
  519. package/dist/tools/runVerification.js +0 -36
  520. package/dist/tools/syncFile.js +0 -65
  521. package/docs/control-center/control-center-daily-driver.md +0 -211
  522. package/docs/control-center/control-center-mvp.md +0 -205
  523. package/docs/control-center/control-center-phase2.md +0 -159
  524. package/docs/release-v0.6.0.md +0 -71
  525. package/docs/release-v0.6.1.md +0 -75
  526. package/docs/release-v0.6.4.md +0 -45
  527. package/src/test/unit/acceptance-engine.test.ts +0 -261
  528. package/src/test/unit/agent-router.test.ts +0 -342
  529. package/src/test/unit/android-doctor.test.ts +0 -158
  530. package/src/test/unit/audit-checks.test.ts +0 -567
  531. package/src/test/unit/chinese-path.test.ts +0 -106
  532. package/src/test/unit/command-guard.test.ts +0 -221
  533. package/src/test/unit/diagnose-task.test.ts +0 -544
  534. package/src/test/unit/direct-guards.test.ts +0 -297
  535. package/src/test/unit/discovery-token-store.test.ts +0 -181
  536. package/src/test/unit/evidence-pack.test.ts +0 -142
  537. package/src/test/unit/goal-graph.test.ts +0 -347
  538. package/src/test/unit/goal-progress.test.ts +0 -538
  539. package/src/test/unit/goal-status.test.ts +0 -270
  540. package/src/test/unit/goal-store.test.ts +0 -318
  541. package/src/test/unit/goal-subgoal-task.test.ts +0 -72
  542. package/src/test/unit/goal-tools-registry.test.ts +0 -243
  543. package/src/test/unit/handoff-export.test.ts +0 -295
  544. package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
  545. package/src/test/unit/logging.test.ts +0 -497
  546. package/src/test/unit/path-guard.test.ts +0 -150
  547. package/src/test/unit/post-task-cleanup.test.ts +0 -53
  548. package/src/test/unit/project-policy-release-mode.test.ts +0 -156
  549. package/src/test/unit/reconcile-tasks.test.ts +0 -551
  550. package/src/test/unit/release-gate.test.ts +0 -314
  551. package/src/test/unit/run-task-loop.test.ts +0 -425
  552. package/src/test/unit/safe-status.test.ts +0 -187
  553. package/src/test/unit/safe-views.test.ts +0 -184
  554. package/src/test/unit/schema-drift-check.test.ts +0 -260
  555. package/src/test/unit/sensitive-guard.test.ts +0 -124
  556. package/src/test/unit/subgoal-sync.test.ts +0 -236
  557. package/src/test/unit/sync-file.test.ts +0 -231
  558. package/src/test/unit/tool-invocation-guard.test.ts +0 -542
  559. package/src/test/unit/tool-usage-stats.test.ts +0 -384
  560. package/src/test/unit/toolSearch.test.ts +0 -756
  561. package/src/test/unit/watcher-status.test.ts +0 -190
  562. package/src/test/unit/worktree-manager.test.ts +0 -247
  563. package/src/tools/cancelTask.ts +0 -70
  564. package/src/tools/evidencePack.ts +0 -205
  565. package/src/tools/retryTask.ts +0 -53
  566. package/src/tools/syncFile.ts +0 -122
  567. /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
  568. /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
  569. /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
  570. /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
  571. /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
  572. /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
  573. /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
  574. /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
  575. /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
  576. /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
  577. /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
  578. /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
  579. /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
  580. /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
  581. /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
  582. /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
  583. /package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +0 -0
  584. /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
  585. /package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +0 -0
  586. /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
  587. /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
  588. /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
  589. /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
  590. /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
  591. /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
  592. /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
  593. /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
  594. /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
  595. /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
  596. /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
  597. /package/src/tools/{waitForTask.ts → tasks/waitForTask.ts} +0 -0
@@ -0,0 +1,215 @@
1
+ # Evidence Pack v2 文件结构
2
+
3
+ > 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。(Evidence Pack v2)
4
+ > 相关页面:`export_task_evidence_pack` MCP 工具、Lineage 与 Evidence Pack 工作流
5
+
6
+ ## 概述
7
+
8
+ `export_task_evidence_pack` 导出 8 个有界文件到
9
+ `.patchwarden/evidence-packs/<lineage_id>/`。每个文件只包含有界摘要,
10
+ **不**包含完整 stdout/stderr/diff/secrets/.env/token/cookie/凭据路径。
11
+
12
+ ## 文件清单
13
+
14
+ | 文件 | 用途 |
15
+ | --- | --- |
16
+ | `evidence.json` | 完整有界证据包(机器可读),含 lineage、policy、catalog 摘要。 |
17
+ | `EVIDENCE.md` | 人类可读的 Markdown 证据摘要。 |
18
+ | `risk.json` | 聚合的风险项与严重度(high/medium/low)。 |
19
+ | `verify.json` | 每轮迭代和 direct session 的结构化验证记录。 |
20
+ | `diffstat.json` | 文件级增删统计(路径、增删行数),不含完整 diff。 |
21
+ | `lineage.json` | lineage 有界摘要(goal、final_status、stop_reason、task 计数)。 |
22
+ | `attestation.json` | 版本、commit、Node/OS、tool profile、schema epoch 等溯源信息。 |
23
+ | `redactions.json` | 本次导出中脱敏的类别与计数(不存原始隐藏值)。 |
24
+
25
+ ## risk.json
26
+
27
+ 从 lineage 的 rounds(`fail_checks` / `warn_checks`)和 `warnings` 聚合风险项。
28
+
29
+ ```json
30
+ {
31
+ "risks": [
32
+ {
33
+ "source": "round",
34
+ "task_id": "task-main",
35
+ "severity": "high",
36
+ "category": "fail_check",
37
+ "detail": "verification failed: npm test exited with code 1"
38
+ },
39
+ {
40
+ "source": "round",
41
+ "task_id": "task-main",
42
+ "severity": "medium",
43
+ "category": "warn_check",
44
+ "detail": "minor scope drift"
45
+ },
46
+ {
47
+ "source": "lineage",
48
+ "severity": "low",
49
+ "category": "warning",
50
+ "detail": "diff.patch was truncated"
51
+ }
52
+ ],
53
+ "count": 3,
54
+ "by_severity": { "high": 1, "medium": 1, "low": 1 }
55
+ }
56
+ ```
57
+
58
+ **严重度映射**:
59
+
60
+ - `high` — round 的 `fail_checks`
61
+ - `medium` — round 的 `warn_checks`
62
+ - `low` — lineage 的 `warnings`
63
+
64
+ 如果 lineage 无风险信息,写 `{"risks": [], "count": 0, "by_severity": {"high": 0, "medium": 0, "low": 0}}`。
65
+
66
+ ## verify.json
67
+
68
+ 从 lineage 的 rounds 和 direct_sessions 提取结构化验证记录。
69
+
70
+ ```json
71
+ {
72
+ "records": [
73
+ {
74
+ "source": "round",
75
+ "task_id": "task-main",
76
+ "role": "main",
77
+ "verification_status": "passed",
78
+ "audit_verdict": "pass",
79
+ "passed": true
80
+ },
81
+ {
82
+ "source": "direct_session",
83
+ "session_id": "direct-one",
84
+ "verification_status": "passed",
85
+ "audit_verdict": "pass",
86
+ "passed": true,
87
+ "command_count": 3,
88
+ "passed_commands": 3,
89
+ "failed_commands": 0
90
+ }
91
+ ],
92
+ "count": 2,
93
+ "summary": { "total": 2, "passed": 2, "failed": 0 },
94
+ "latest_status": "passed",
95
+ "overall_passed": true
96
+ }
97
+ ```
98
+
99
+ **有界规则**:不含 stdout_tail/stderr_tail/完整验证日志,只保留状态与计数摘要。
100
+
101
+ 如果 lineage 无验证信息,写空 records 数组。
102
+
103
+ ## diffstat.json
104
+
105
+ 从 lineage 引用的 task 目录(`<tasksDir>/<task_id>/file-stats.json`)聚合文件级增删统计。
106
+
107
+ ```json
108
+ {
109
+ "files": [
110
+ {
111
+ "path": "src/index.ts",
112
+ "status": "modified",
113
+ "additions": 12,
114
+ "deletions": 3,
115
+ "task_id": "task-main"
116
+ }
117
+ ],
118
+ "count": 1,
119
+ "totals": { "additions": 12, "deletions": 3 }
120
+ }
121
+ ```
122
+
123
+ **有界规则**:只存文件路径与行级增删计数,**不**含完整 diff 内容。所有路径经过
124
+ `redactSensitiveValue` 脱敏处理。如果 task 目录不存在或 file-stats.json 缺失,写空数组。
125
+
126
+ ## lineage.json
127
+
128
+ lineage 的有界摘要,不含完整 rounds 详情或 warnings/errors 原文。
129
+
130
+ ```json
131
+ {
132
+ "lineage_id": "lineage_20260709_120000_a1b2c3d4",
133
+ "goal": "Fix authentication bug",
134
+ "final_status": "accepted",
135
+ "stop_reason": "success",
136
+ "iterations_count": 1,
137
+ "task_counts": {
138
+ "main": 1,
139
+ "fix": 0,
140
+ "cleanup": 0,
141
+ "direct_sessions": 1
142
+ },
143
+ "verification": { "latest_status": "passed", "passed": true },
144
+ "worktree": { "isolation_mode": "worktree", "status": "active" },
145
+ "agent_routing": { "selected_agent": "codex" },
146
+ "warnings_count": 0,
147
+ "errors_count": 0,
148
+ "truncated": false
149
+ }
150
+ ```
151
+
152
+ ## attestation.json
153
+
154
+ 记录生成此证据包时的环境与版本溯源信息。
155
+
156
+ ```json
157
+ {
158
+ "patchwarden_version": "1.6.1",
159
+ "package_version": "1.6.1",
160
+ "commit": "bc950a2",
161
+ "node_version": "v20.11.0",
162
+ "os": { "platform": "win32", "arch": "x64" },
163
+ "tool_profile": "full",
164
+ "schema_epoch": "2026-07-19-v15",
165
+ "generated_at": "2026-07-09T12:00:00.000Z"
166
+ }
167
+ ```
168
+
169
+ **字段说明**:
170
+
171
+ - `patchwarden_version` — `src/version.ts` 中的 `PATCHWARDEN_VERSION`
172
+ - `package_version` — `package.json` 中的 version(与 patchwarden_version 一致)
173
+ - `commit` — `git rev-parse --short HEAD` 获取的 short hash;非 Git 环境为 `"unknown"`
174
+ - `node_version` — `process.version`
175
+ - `os` — `process.platform` 与 `process.arch`
176
+ - `tool_profile` — 当前工具目录快照的 profile
177
+ - `schema_epoch` — `TOOL_SCHEMA_EPOCH`
178
+
179
+ ## redactions.json
180
+
181
+ 记录本次导出中脱敏的类别、原因与计数。**不存原始隐藏值**。
182
+
183
+ ```json
184
+ {
185
+ "redactions": [
186
+ {
187
+ "category": "known_token_format",
188
+ "reason": "matched known token format",
189
+ "count": 1
190
+ }
191
+ ],
192
+ "total_redacted": 1,
193
+ "bounded": true,
194
+ "note": "Only categories and counts are recorded; original secret values are never persisted."
195
+ }
196
+ ```
197
+
198
+ **脱敏类别**:
199
+
200
+ | category | 匹配内容 |
201
+ | --- | --- |
202
+ | `private_key` | PEM 私钥块 |
203
+ | `bearer_token` | `Bearer <token>` 格式 |
204
+ | `npm_token` | npm `_?authToken=` 赋值 |
205
+ | `credential_assignment` | `api_key=` / `secret=` / `password=` 等凭据赋值 |
206
+ | `known_token_format` | `sk_` / `ghp_` / `github_pat_` 前缀的 token |
207
+
208
+ ## 安全边界
209
+
210
+ - 所有 v2 文件经过 `redactSensitiveValue` 处理后才写入磁盘。
211
+ - `redactions.json` 只记录类别 + 原因 + 计数,**永不**持久化原始密钥值。
212
+ - `diffstat.json` 只存文件路径与行级计数,不含 diff 正文。
213
+ - `verify.json` 只存状态摘要,不含 stdout/stderr tail。
214
+ - `.patchwarden/evidence-packs/` 不进入 npm 包(package.json `files` 已排除)。
215
+ - MCP 工具 `export_task_evidence_pack` 的输入参数无破坏性变更,只是输出多了文件。
@@ -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