patchwarden 1.5.1 → 1.6.2

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 (591) hide show
  1. package/PatchWarden.cmd +32 -2
  2. package/README.en.md +158 -26
  3. package/README.md +124 -24
  4. package/dist/assessments/agentAssessor.js +21 -12
  5. package/dist/assessments/assessmentDiagnostics.d.ts +29 -0
  6. package/dist/assessments/assessmentDiagnostics.js +132 -0
  7. package/dist/assessments/assessmentStore.d.ts +39 -0
  8. package/dist/assessments/assessmentStore.js +207 -45
  9. package/dist/assessments/securitySnapshot.d.ts +50 -0
  10. package/dist/assessments/securitySnapshot.js +158 -0
  11. package/dist/config.d.ts +15 -0
  12. package/dist/config.js +66 -13
  13. package/dist/control/fileManager.d.ts +2 -0
  14. package/dist/control/fileManager.js +39 -0
  15. package/dist/control/middleware/auth.d.ts +6 -0
  16. package/dist/control/middleware/auth.js +14 -5
  17. package/dist/control/middleware/static.js +16 -3
  18. package/dist/control/routeTable.d.ts +24 -0
  19. package/dist/control/routeTable.js +263 -0
  20. package/dist/control/routes/audit.js +17 -7
  21. package/dist/control/routes/evidence.js +1 -1
  22. package/dist/control/routes/lineage.js +1 -1
  23. package/dist/control/routes/process.d.ts +7 -0
  24. package/dist/control/routes/process.js +329 -42
  25. package/dist/control/routes/sessions.d.ts +9 -1
  26. package/dist/control/routes/sessions.js +84 -21
  27. package/dist/control/routes/status.d.ts +60 -1
  28. package/dist/control/routes/status.js +94 -15
  29. package/dist/control/routes/taskActions.js +24 -60
  30. package/dist/control/routes/tasks.d.ts +4 -0
  31. package/dist/control/routes/tasks.js +61 -62
  32. package/dist/control/routes/workspace.js +50 -23
  33. package/dist/control/runtime.d.ts +3 -2
  34. package/dist/control/runtime.js +65 -40
  35. package/dist/control/server.js +37 -365
  36. package/dist/control/shared.d.ts +25 -1
  37. package/dist/control/shared.js +64 -11
  38. package/dist/diagnostics/allowedTestCommandSafety.d.ts +1 -0
  39. package/dist/diagnostics/allowedTestCommandSafety.js +11 -0
  40. package/dist/direct/directAudit.js +234 -225
  41. package/dist/direct/directGuards.d.ts +2 -1
  42. package/dist/direct/directGuards.js +42 -29
  43. package/dist/direct/directPatch.d.ts +6 -1
  44. package/dist/direct/directPatch.js +55 -8
  45. package/dist/direct/directSessionStore.d.ts +16 -6
  46. package/dist/direct/directSessionStore.js +128 -35
  47. package/dist/direct/directVerification.js +8 -16
  48. package/dist/doctor.js +65 -57
  49. package/dist/goal/acceptanceEngine.d.ts +1 -1
  50. package/dist/goal/goalProgress.js +75 -69
  51. package/dist/goal/goalReport.js +5 -12
  52. package/dist/goal/goalStatus.d.ts +2 -0
  53. package/dist/goal/goalStatus.js +10 -3
  54. package/dist/goal/goalStore.d.ts +9 -2
  55. package/dist/goal/goalStore.js +152 -45
  56. package/dist/goal/handoffExport.js +6 -6
  57. package/dist/goal/specKitImport.js +97 -96
  58. package/dist/goal/subgoalSync.js +11 -9
  59. package/dist/goal/worktreeManager.d.ts +2 -0
  60. package/dist/goal/worktreeManager.js +209 -136
  61. package/dist/httpServer.js +111 -32
  62. package/dist/logging.js +5 -3
  63. package/dist/policy/projectPolicy.js +5 -2
  64. package/dist/release/releaseGate.d.ts +1 -1
  65. package/dist/release/releaseGate.js +78 -25
  66. package/dist/runner/agentInvocation.d.ts +14 -0
  67. package/dist/runner/agentInvocation.js +96 -4
  68. package/dist/runner/changeCapture.d.ts +13 -5
  69. package/dist/runner/changeCapture.js +243 -61
  70. package/dist/runner/postTaskCleanup.js +48 -19
  71. package/dist/runner/processSecurity.d.ts +56 -0
  72. package/dist/runner/processSecurity.js +373 -0
  73. package/dist/runner/runTask.d.ts +2 -1
  74. package/dist/runner/runTask.js +162 -93
  75. package/dist/runner/simpleProcess.d.ts +3 -0
  76. package/dist/runner/simpleProcess.js +50 -36
  77. package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
  78. package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
  79. package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +3 -1
  80. package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
  81. package/dist/runner/taskStatusStore.d.ts +11 -0
  82. package/dist/runner/taskStatusStore.js +35 -0
  83. package/dist/runner/watch.d.ts +14 -1
  84. package/dist/runner/watch.js +320 -49
  85. package/dist/security/contentRedaction.js +2 -2
  86. package/dist/security/discoveryTokenStore.d.ts +3 -2
  87. package/dist/security/discoveryTokenStore.js +17 -2
  88. package/dist/security/loopbackHost.d.ts +2 -0
  89. package/dist/security/loopbackHost.js +16 -0
  90. package/dist/security/pathGuard.js +32 -17
  91. package/dist/security/planGuard.js +2 -1
  92. package/dist/security/runtimeGuard.js +9 -6
  93. package/dist/security/secretComparison.d.ts +3 -0
  94. package/dist/security/secretComparison.js +11 -0
  95. package/dist/security/sensitiveGuard.d.ts +5 -0
  96. package/dist/security/sensitiveGuard.js +27 -8
  97. package/dist/security/toolInvocationGuard.d.ts +2 -2
  98. package/dist/security/toolInvocationGuard.js +1 -1
  99. package/dist/security/workspaceRootGuard.d.ts +8 -0
  100. package/dist/security/workspaceRootGuard.js +47 -0
  101. package/dist/smoke-test.js +27 -26
  102. package/dist/tools/catalog/index.d.ts +4 -0
  103. package/dist/tools/catalog/index.js +4 -0
  104. package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
  105. package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
  106. package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +6 -15
  107. package/dist/tools/definitions/toolDefs.d.ts +18 -0
  108. package/dist/tools/definitions/toolDefs.js +1177 -0
  109. package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
  110. package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
  111. package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +2 -1
  112. package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +134 -36
  113. package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +18 -6
  114. package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +36 -8
  115. package/dist/tools/diagnostics/index.d.ts +6 -0
  116. package/dist/tools/diagnostics/index.js +6 -0
  117. package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
  118. package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
  119. package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +12 -8
  120. package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +23 -13
  121. package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
  122. package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
  123. package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +6 -6
  124. package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +1 -1
  125. package/dist/tools/direct/finalizeDirectSession.js +86 -0
  126. package/dist/tools/direct/index.d.ts +3 -0
  127. package/dist/tools/direct/index.js +3 -0
  128. package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
  129. package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
  130. package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
  131. package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
  132. package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
  133. package/dist/tools/discovery/index.d.ts +3 -0
  134. package/dist/tools/discovery/index.js +3 -0
  135. package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
  136. package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
  137. package/dist/tools/dispatch/coreDispatch.js +32 -31
  138. package/dist/tools/dispatch/diagnosticDispatch.d.ts +3 -5
  139. package/dist/tools/dispatch/diagnosticDispatch.js +70 -68
  140. package/dist/tools/dispatch/directDispatch.js +11 -10
  141. package/dist/tools/dispatch/goalDispatch.js +5 -4
  142. package/dist/tools/dispatch/releaseDispatch.js +3 -2
  143. package/dist/tools/dispatch/validation.d.ts +7 -0
  144. package/dist/tools/dispatch/validation.js +71 -0
  145. package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
  146. package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +1 -1
  147. package/dist/tools/goals/goalSubgoalTask.js +118 -0
  148. package/dist/tools/goals/index.d.ts +3 -0
  149. package/dist/tools/goals/index.js +3 -0
  150. package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
  151. package/dist/tools/registry.d.ts +7 -11
  152. package/dist/tools/registry.js +17 -1178
  153. package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
  154. package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
  155. package/dist/tools/release/index.d.ts +2 -0
  156. package/dist/tools/release/index.js +2 -0
  157. package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
  158. package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
  159. package/dist/tools/tasks/cancelTask.d.ts +11 -0
  160. package/dist/tools/tasks/cancelTask.js +86 -0
  161. package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +12 -4
  162. package/dist/tools/{createTask.js → tasks/createTask.js} +110 -34
  163. package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
  164. package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +12 -16
  165. package/dist/tools/{evidencePack.js → tasks/evidencePack.js} +34 -22
  166. package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
  167. package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
  168. package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +11 -6
  169. package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
  170. package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +35 -36
  171. package/dist/tools/tasks/index.d.ts +18 -0
  172. package/dist/tools/tasks/index.js +18 -0
  173. package/dist/tools/tasks/killTask.d.ts +1 -0
  174. package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
  175. package/dist/tools/{listTasks.js → tasks/listTasks.js} +5 -4
  176. package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +3 -2
  177. package/dist/tools/tasks/reconcileTasks.js +496 -0
  178. package/dist/tools/tasks/retryTask.js +60 -0
  179. package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
  180. package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +63 -41
  181. package/dist/tools/tasks/runVerification.js +38 -0
  182. package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
  183. package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +2 -2
  184. package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
  185. package/dist/tools/tasks/taskStates.d.ts +6 -0
  186. package/dist/tools/tasks/taskStates.js +52 -0
  187. package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +3 -11
  188. package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
  189. package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
  190. package/dist/tools/workspace/applyPatch.js +53 -0
  191. package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
  192. package/dist/tools/workspace/index.d.ts +10 -0
  193. package/dist/tools/workspace/index.js +10 -0
  194. package/dist/tools/workspace/listAgents.d.ts +23 -0
  195. package/dist/tools/workspace/listAgents.js +56 -0
  196. package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
  197. package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
  198. package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
  199. package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
  200. package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
  201. package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
  202. package/dist/tools/workspace/syncFile.js +134 -0
  203. package/dist/utils/atomicFile.d.ts +7 -0
  204. package/dist/utils/atomicFile.js +67 -0
  205. package/dist/utils/boundedFile.d.ts +8 -0
  206. package/dist/utils/boundedFile.js +93 -0
  207. package/dist/utils/lockedJsonFile.d.ts +15 -0
  208. package/dist/utils/lockedJsonFile.js +224 -0
  209. package/dist/utils/platform.d.ts +11 -0
  210. package/dist/utils/platform.js +26 -0
  211. package/dist/utils/stableJson.d.ts +2 -0
  212. package/dist/utils/stableJson.js +12 -0
  213. package/dist/version.d.ts +3 -2
  214. package/dist/version.js +3 -2
  215. package/dist/watcherStatus.d.ts +2 -2
  216. package/dist/watcherStatus.js +18 -0
  217. package/docs/CODE_WIKI.md +808 -143
  218. package/docs/architecture.md +15 -55
  219. package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
  220. package/docs/control-center/README.md +4 -4
  221. package/docs/dashboard-overview.md +4 -4
  222. package/docs/desktop-app.md +175 -0
  223. package/docs/evidence-pack-schema.md +3 -3
  224. package/docs/open-source-application.md +16 -11
  225. package/docs/release-checklist.md +1 -1
  226. package/docs/release-evidence.md +35 -39
  227. package/docs/task-safe-review-workflow.md +5 -5
  228. package/docs/threat-model.md +19 -1
  229. package/examples/config.example.json +4 -2
  230. package/package.json +27 -10
  231. package/scripts/README.md +15 -6
  232. package/scripts/build.js +11 -0
  233. package/scripts/checks/brand-check.js +3 -0
  234. package/scripts/checks/build-output-check.js +37 -0
  235. package/scripts/checks/control-center-smoke.js +102 -10
  236. package/scripts/checks/control-smoke.js +19 -8
  237. package/scripts/checks/http-mcp-smoke.js +82 -4
  238. package/scripts/checks/lifecycle-smoke.js +15 -12
  239. package/scripts/checks/mcp-manifest-check.js +1 -1
  240. package/scripts/checks/mcp-smoke.js +58 -4
  241. package/scripts/checks/package-manifest-check.js +20 -7
  242. package/scripts/checks/unit-tests.js +3 -5
  243. package/scripts/checks/watcher-supervisor-smoke.js +38 -1
  244. package/scripts/control/get-patchwarden-health.ps1 +1 -1
  245. package/scripts/control/manage-patchwarden.ps1 +69 -4
  246. package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
  247. package/scripts/control/run-background-supervisor.ps1 +41 -0
  248. package/scripts/control/start-patchwarden-tunnel.ps1 +191 -33
  249. package/scripts/e2e/demo-runtime.mjs +153 -0
  250. package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
  251. package/scripts/launchers/PatchWarden-Control.cmd +6 -0
  252. package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
  253. package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
  254. package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
  255. package/scripts/lib/clean-generated-output.js +11 -0
  256. package/scripts/lib/file-discovery.js +12 -0
  257. package/scripts/release/desktop-preflight.js +211 -0
  258. package/scripts/release/pack-clean.js +59 -14
  259. package/src/assessments/agentAssessor.ts +26 -12
  260. package/src/assessments/assessmentDiagnostics.ts +172 -0
  261. package/src/assessments/assessmentStore.ts +288 -51
  262. package/src/assessments/securitySnapshot.ts +231 -0
  263. package/src/config.ts +70 -13
  264. package/src/control/fileManager.ts +40 -0
  265. package/src/control/middleware/auth.ts +22 -4
  266. package/src/control/middleware/static.ts +16 -3
  267. package/src/control/routeTable.ts +301 -0
  268. package/src/control/routes/audit.ts +14 -6
  269. package/src/control/routes/evidence.ts +1 -1
  270. package/src/control/routes/lineage.ts +1 -1
  271. package/src/control/routes/process.ts +341 -40
  272. package/src/control/routes/sessions.ts +88 -25
  273. package/src/control/routes/status.ts +134 -17
  274. package/src/control/routes/taskActions.ts +24 -58
  275. package/src/control/routes/tasks.ts +66 -58
  276. package/src/control/routes/workspace.ts +56 -25
  277. package/src/control/runtime.ts +71 -43
  278. package/src/control/server.ts +37 -342
  279. package/src/control/shared.ts +77 -11
  280. package/src/diagnostics/allowedTestCommandSafety.ts +12 -0
  281. package/src/direct/directAudit.ts +17 -9
  282. package/src/direct/directGuards.ts +72 -44
  283. package/src/direct/directPatch.ts +95 -8
  284. package/src/direct/directSessionStore.ts +213 -55
  285. package/src/direct/directVerification.ts +9 -23
  286. package/src/doctor.ts +76 -64
  287. package/src/goal/acceptanceEngine.ts +1 -1
  288. package/src/goal/goalProgress.ts +17 -13
  289. package/src/goal/goalReport.ts +5 -13
  290. package/src/goal/goalStatus.ts +19 -3
  291. package/src/goal/goalStore.ts +241 -54
  292. package/src/goal/handoffExport.ts +6 -6
  293. package/src/goal/specKitImport.ts +12 -12
  294. package/src/goal/subgoalSync.ts +11 -8
  295. package/src/goal/worktreeManager.ts +139 -22
  296. package/src/httpServer.ts +113 -30
  297. package/src/logging.ts +10 -3
  298. package/src/policy/projectPolicy.ts +5 -2
  299. package/src/release/releaseGate.ts +74 -27
  300. package/src/runner/agentInvocation.ts +126 -4
  301. package/src/runner/changeCapture.ts +291 -57
  302. package/src/runner/postTaskCleanup.ts +41 -17
  303. package/src/runner/processSecurity.ts +433 -0
  304. package/src/runner/runTask.ts +197 -97
  305. package/src/runner/simpleProcess.ts +66 -31
  306. package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
  307. package/src/{taskRuntime.ts → runner/taskRuntime.ts} +6 -3
  308. package/src/runner/taskStatusStore.ts +69 -0
  309. package/src/runner/watch.ts +348 -52
  310. package/src/security/contentRedaction.ts +2 -2
  311. package/src/security/discoveryTokenStore.ts +18 -4
  312. package/src/security/loopbackHost.ts +19 -0
  313. package/src/security/pathGuard.ts +35 -16
  314. package/src/security/planGuard.ts +2 -1
  315. package/src/security/runtimeGuard.ts +9 -6
  316. package/src/security/secretComparison.ts +13 -0
  317. package/src/security/sensitiveGuard.ts +27 -8
  318. package/src/security/toolInvocationGuard.ts +2 -2
  319. package/src/security/workspaceRootGuard.ts +53 -0
  320. package/src/smoke-test.ts +27 -26
  321. package/src/tools/catalog/index.ts +4 -0
  322. package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
  323. package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +7 -16
  324. package/src/tools/definitions/toolDefs.ts +1264 -0
  325. package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
  326. package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +136 -39
  327. package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +37 -9
  328. package/src/tools/diagnostics/index.ts +6 -0
  329. package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
  330. package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +27 -17
  331. package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
  332. package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +6 -6
  333. package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +7 -5
  334. package/src/tools/direct/index.ts +3 -0
  335. package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
  336. package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
  337. package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
  338. package/src/tools/discovery/index.ts +3 -0
  339. package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
  340. package/src/tools/dispatch/coreDispatch.ts +36 -31
  341. package/src/tools/dispatch/diagnosticDispatch.ts +26 -21
  342. package/src/tools/dispatch/directDispatch.ts +11 -10
  343. package/src/tools/dispatch/goalDispatch.ts +5 -4
  344. package/src/tools/dispatch/releaseDispatch.ts +3 -2
  345. package/src/tools/dispatch/validation.ts +78 -0
  346. package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
  347. package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +41 -26
  348. package/src/tools/goals/index.ts +3 -0
  349. package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
  350. package/src/tools/registry.ts +17 -1261
  351. package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
  352. package/src/tools/release/index.ts +2 -0
  353. package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
  354. package/src/tools/tasks/cancelTask.ts +110 -0
  355. package/src/tools/{createTask.ts → tasks/createTask.ts} +161 -33
  356. package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +12 -16
  357. package/src/tools/{evidencePack.ts → tasks/evidencePack.ts} +36 -22
  358. package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
  359. package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +13 -6
  360. package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
  361. package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +46 -44
  362. package/src/tools/tasks/index.ts +18 -0
  363. package/src/tools/{listTasks.ts → tasks/listTasks.ts} +6 -5
  364. package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +228 -77
  365. package/src/tools/tasks/retryTask.ts +69 -0
  366. package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +73 -46
  367. package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
  368. package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
  369. package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
  370. package/src/tools/tasks/taskStates.ts +54 -0
  371. package/src/tools/{waitForTask.ts → tasks/waitForTask.ts} +3 -12
  372. package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
  373. package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
  374. package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
  375. package/src/tools/workspace/index.ts +10 -0
  376. package/src/tools/workspace/listAgents.ts +75 -0
  377. package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
  378. package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
  379. package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
  380. package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
  381. package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
  382. package/src/tools/workspace/syncFile.ts +292 -0
  383. package/src/utils/atomicFile.ts +74 -0
  384. package/src/utils/boundedFile.ts +116 -0
  385. package/src/utils/lockedJsonFile.ts +251 -0
  386. package/src/utils/platform.ts +31 -0
  387. package/src/utils/stableJson.ts +12 -0
  388. package/src/version.ts +3 -2
  389. package/src/watcherStatus.ts +19 -1
  390. package/ui/desktop-bootstrap.js +11 -0
  391. package/ui/desktop-bridge.js +36 -0
  392. package/ui/desktop.css +160 -0
  393. package/ui/getting-started.js +93 -0
  394. package/ui/i18n.js +484 -0
  395. package/ui/log-parser.js +30 -0
  396. package/ui/pages/audit.html +12 -0
  397. package/ui/pages/dashboard.html +94 -147
  398. package/ui/pages/direct-sessions.html +123 -26
  399. package/ui/pages/getting-started.html +43 -0
  400. package/ui/pages/logs.html +134 -22
  401. package/ui/pages/settings.html +101 -0
  402. package/ui/pages/task-detail.html +12 -0
  403. package/ui/pages/tasks.html +54 -8
  404. package/ui/pages/workspace.html +38 -1
  405. package/ui/settings.js +254 -0
  406. package/PatchWarden-Control.cmd +0 -6
  407. package/Restart-PatchWarden-Control.cmd +0 -6
  408. package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
  409. package/dist/test/unit/acceptance-engine.test.js +0 -228
  410. package/dist/test/unit/agent-router.test.d.ts +0 -1
  411. package/dist/test/unit/agent-router.test.js +0 -287
  412. package/dist/test/unit/android-doctor.test.d.ts +0 -1
  413. package/dist/test/unit/android-doctor.test.js +0 -118
  414. package/dist/test/unit/apply-patch.test.d.ts +0 -1
  415. package/dist/test/unit/apply-patch.test.js +0 -225
  416. package/dist/test/unit/audit-checks.test.d.ts +0 -1
  417. package/dist/test/unit/audit-checks.test.js +0 -350
  418. package/dist/test/unit/chinese-path.test.d.ts +0 -1
  419. package/dist/test/unit/chinese-path.test.js +0 -91
  420. package/dist/test/unit/command-guard.test.d.ts +0 -1
  421. package/dist/test/unit/command-guard.test.js +0 -160
  422. package/dist/test/unit/create-task.test.d.ts +0 -1
  423. package/dist/test/unit/create-task.test.js +0 -197
  424. package/dist/test/unit/diagnose-task.test.d.ts +0 -1
  425. package/dist/test/unit/diagnose-task.test.js +0 -457
  426. package/dist/test/unit/direct-guards.test.d.ts +0 -1
  427. package/dist/test/unit/direct-guards.test.js +0 -328
  428. package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
  429. package/dist/test/unit/discovery-token-store.test.js +0 -139
  430. package/dist/test/unit/evidence-pack.test.d.ts +0 -1
  431. package/dist/test/unit/evidence-pack.test.js +0 -224
  432. package/dist/test/unit/get-task-status.test.d.ts +0 -1
  433. package/dist/test/unit/get-task-status.test.js +0 -174
  434. package/dist/test/unit/get-task-summary.test.d.ts +0 -1
  435. package/dist/test/unit/get-task-summary.test.js +0 -146
  436. package/dist/test/unit/goal-graph.test.d.ts +0 -1
  437. package/dist/test/unit/goal-graph.test.js +0 -298
  438. package/dist/test/unit/goal-progress.test.d.ts +0 -1
  439. package/dist/test/unit/goal-progress.test.js +0 -381
  440. package/dist/test/unit/goal-report.test.d.ts +0 -1
  441. package/dist/test/unit/goal-report.test.js +0 -159
  442. package/dist/test/unit/goal-status.test.d.ts +0 -1
  443. package/dist/test/unit/goal-status.test.js +0 -215
  444. package/dist/test/unit/goal-store.test.d.ts +0 -1
  445. package/dist/test/unit/goal-store.test.js +0 -253
  446. package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
  447. package/dist/test/unit/goal-subgoal-task.test.js +0 -55
  448. package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
  449. package/dist/test/unit/goal-tools-registry.test.js +0 -192
  450. package/dist/test/unit/handoff-export.test.d.ts +0 -1
  451. package/dist/test/unit/handoff-export.test.js +0 -263
  452. package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
  453. package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
  454. package/dist/test/unit/logging.test.d.ts +0 -1
  455. package/dist/test/unit/logging.test.js +0 -397
  456. package/dist/test/unit/path-guard.test.d.ts +0 -1
  457. package/dist/test/unit/path-guard.test.js +0 -133
  458. package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
  459. package/dist/test/unit/post-task-cleanup.test.js +0 -48
  460. package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
  461. package/dist/test/unit/project-policy-release-mode.test.js +0 -125
  462. package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
  463. package/dist/test/unit/reconcile-tasks.test.js +0 -456
  464. package/dist/test/unit/release-gate.test.d.ts +0 -1
  465. package/dist/test/unit/release-gate.test.js +0 -242
  466. package/dist/test/unit/run-task-loop.test.d.ts +0 -1
  467. package/dist/test/unit/run-task-loop.test.js +0 -380
  468. package/dist/test/unit/safe-status.test.d.ts +0 -1
  469. package/dist/test/unit/safe-status.test.js +0 -165
  470. package/dist/test/unit/safe-views.test.d.ts +0 -1
  471. package/dist/test/unit/safe-views.test.js +0 -171
  472. package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
  473. package/dist/test/unit/schema-drift-check.test.js +0 -176
  474. package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
  475. package/dist/test/unit/sensitive-guard.test.js +0 -104
  476. package/dist/test/unit/spec-kit-import.test.d.ts +0 -1
  477. package/dist/test/unit/spec-kit-import.test.js +0 -341
  478. package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
  479. package/dist/test/unit/subgoal-sync.test.js +0 -183
  480. package/dist/test/unit/sync-file.test.d.ts +0 -1
  481. package/dist/test/unit/sync-file.test.js +0 -154
  482. package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
  483. package/dist/test/unit/tool-invocation-guard.test.js +0 -432
  484. package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
  485. package/dist/test/unit/tool-usage-stats.test.js +0 -300
  486. package/dist/test/unit/toolSearch.test.d.ts +0 -1
  487. package/dist/test/unit/toolSearch.test.js +0 -571
  488. package/dist/test/unit/wait-for-task.test.d.ts +0 -1
  489. package/dist/test/unit/wait-for-task.test.js +0 -144
  490. package/dist/test/unit/watcher-status.test.d.ts +0 -1
  491. package/dist/test/unit/watcher-status.test.js +0 -169
  492. package/dist/test/unit/worktree-manager.test.d.ts +0 -1
  493. package/dist/test/unit/worktree-manager.test.js +0 -176
  494. package/dist/tools/applyPatch.js +0 -41
  495. package/dist/tools/cancelTask.d.ts +0 -30
  496. package/dist/tools/cancelTask.js +0 -64
  497. package/dist/tools/finalizeDirectSession.js +0 -84
  498. package/dist/tools/goalSubgoalTask.js +0 -110
  499. package/dist/tools/killTask.d.ts +0 -15
  500. package/dist/tools/listAgents.d.ts +0 -12
  501. package/dist/tools/listAgents.js +0 -42
  502. package/dist/tools/reconcileTasks.js +0 -352
  503. package/dist/tools/retryTask.js +0 -45
  504. package/dist/tools/runVerification.js +0 -36
  505. package/dist/tools/syncFile.js +0 -65
  506. package/docs/control-center/control-center-daily-driver.md +0 -211
  507. package/docs/control-center/control-center-mvp.md +0 -205
  508. package/docs/control-center/control-center-phase2.md +0 -159
  509. package/docs/execution-plan-2026-07-09.md +0 -315
  510. package/docs/release-v0.6.0.md +0 -71
  511. package/docs/release-v0.6.1.md +0 -75
  512. package/docs/release-v0.6.4.md +0 -45
  513. package/docs/roadmap-execution-and-acceptance.md +0 -365
  514. package/src/test/unit/acceptance-engine.test.ts +0 -261
  515. package/src/test/unit/agent-router.test.ts +0 -342
  516. package/src/test/unit/android-doctor.test.ts +0 -158
  517. package/src/test/unit/apply-patch.test.ts +0 -293
  518. package/src/test/unit/audit-checks.test.ts +0 -567
  519. package/src/test/unit/chinese-path.test.ts +0 -106
  520. package/src/test/unit/command-guard.test.ts +0 -221
  521. package/src/test/unit/create-task.test.ts +0 -255
  522. package/src/test/unit/diagnose-task.test.ts +0 -544
  523. package/src/test/unit/direct-guards.test.ts +0 -467
  524. package/src/test/unit/discovery-token-store.test.ts +0 -181
  525. package/src/test/unit/evidence-pack.test.ts +0 -251
  526. package/src/test/unit/get-task-status.test.ts +0 -203
  527. package/src/test/unit/get-task-summary.test.ts +0 -173
  528. package/src/test/unit/goal-graph.test.ts +0 -347
  529. package/src/test/unit/goal-progress.test.ts +0 -538
  530. package/src/test/unit/goal-report.test.ts +0 -189
  531. package/src/test/unit/goal-status.test.ts +0 -270
  532. package/src/test/unit/goal-store.test.ts +0 -318
  533. package/src/test/unit/goal-subgoal-task.test.ts +0 -72
  534. package/src/test/unit/goal-tools-registry.test.ts +0 -245
  535. package/src/test/unit/handoff-export.test.ts +0 -295
  536. package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
  537. package/src/test/unit/logging.test.ts +0 -497
  538. package/src/test/unit/path-guard.test.ts +0 -180
  539. package/src/test/unit/post-task-cleanup.test.ts +0 -53
  540. package/src/test/unit/project-policy-release-mode.test.ts +0 -156
  541. package/src/test/unit/reconcile-tasks.test.ts +0 -551
  542. package/src/test/unit/release-gate.test.ts +0 -314
  543. package/src/test/unit/run-task-loop.test.ts +0 -425
  544. package/src/test/unit/safe-status.test.ts +0 -187
  545. package/src/test/unit/safe-views.test.ts +0 -184
  546. package/src/test/unit/schema-drift-check.test.ts +0 -260
  547. package/src/test/unit/sensitive-guard.test.ts +0 -124
  548. package/src/test/unit/spec-kit-import.test.ts +0 -429
  549. package/src/test/unit/subgoal-sync.test.ts +0 -236
  550. package/src/test/unit/sync-file.test.ts +0 -231
  551. package/src/test/unit/tool-invocation-guard.test.ts +0 -542
  552. package/src/test/unit/tool-usage-stats.test.ts +0 -384
  553. package/src/test/unit/toolSearch.test.ts +0 -756
  554. package/src/test/unit/wait-for-task.test.ts +0 -176
  555. package/src/test/unit/watcher-status.test.ts +0 -190
  556. package/src/test/unit/worktree-manager.test.ts +0 -247
  557. package/src/tools/cancelTask.ts +0 -70
  558. package/src/tools/listAgents.ts +0 -54
  559. package/src/tools/retryTask.ts +0 -53
  560. package/src/tools/syncFile.ts +0 -122
  561. /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
  562. /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
  563. /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
  564. /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
  565. /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
  566. /package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +0 -0
  567. /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
  568. /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
  569. /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
  570. /package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +0 -0
  571. /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
  572. /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
  573. /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
  574. /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
  575. /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
  576. /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
  577. /package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +0 -0
  578. /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
  579. /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
  580. /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
  581. /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
  582. /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
  583. /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
  584. /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
  585. /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
  586. /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
  587. /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
  588. /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
  589. /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
  590. /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
  591. /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
@@ -1,365 +0,0 @@
1
- # PatchWarden Roadmap Execution And Acceptance Plan
2
-
3
- > Created: 2026-07-09
4
- > Source document: `C:\Users\zengjie\Downloads\PatchWarden_项目推进与外部PR路线图.docx`
5
- > Scope: feasibility check, executable steps, and acceptance commands for PatchWarden-first ecosystem work.
6
-
7
- ## Conclusion
8
-
9
- The roadmap is feasible, but it needs two corrections before execution:
10
-
11
- 1. `v1.5.1` is not published yet. Local source is `1.5.1`, but GitHub Release and npm `latest` are still `v1.5.0`.
12
- 2. Goal Session is not a greenfield feature. PatchWarden already has Goal/Subgoal tools; the next valuable work is final report export, Spec Kit import, and better evidence mapping.
13
-
14
- Therefore the execution order should be:
15
-
16
- 1. P0: close and publish `v1.5.1` safely.
17
- 2. P1: finish Evidence Pack v2 and public-facing docs.
18
- 3. P2: submit external PRs in low-risk order: MCP Inspector, AgentSeal, then Spec Kit.
19
- 4. P3: move to OpenCode/OpenHands/Aider integration docs after PatchWarden has published evidence to point at.
20
-
21
- Codex is responsible for implementation submission and acceptance verification. The user only needs to approve destructive, credentialed, or external-write actions when required by local policy.
22
-
23
- ## Current Verified State
24
-
25
- Checked from `D:\ai_agent\Reasonix\reasonix_program\PatchWarden` on 2026-07-09:
26
-
27
- - Branch: `codex/patchwarden-v1.5.0`
28
- - HEAD: `cc27e6a Add OSS application evidence materials`
29
- - Worktree: dirty before this plan was added; preserve existing user changes.
30
- - `package.json`: `patchwarden@1.5.1`
31
- - GitHub Release latest: `v1.5.0`
32
- - npm `patchwarden`: `version=1.5.0`, `dist-tags.latest=1.5.0`
33
- - PR #24: open draft, CI passing, branch behind `main`
34
- - Local gates run successfully:
35
- - `npm.cmd run build`
36
- - `npm.cmd run test:unit`
37
- - `npm.cmd run doctor:ci`
38
- - `npm.cmd run verify:package`
39
-
40
- ## P0: v1.5.1 Trusted Release
41
-
42
- ### Objective
43
-
44
- Make `v1.5.1` a real published version, not just a local source version.
45
-
46
- ### Execution
47
-
48
- ```powershell
49
- git status --short --branch
50
- gh pr view 24 --repo jiezeng2004-design/PatchWarden --json number,title,state,isDraft,mergeStateStatus,headRefName,headRefOid,baseRefName,statusCheckRollup,url
51
- npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
52
- gh release view --repo jiezeng2004-design/PatchWarden --json tagName,name,isDraft,isPrerelease,publishedAt,url
53
- ```
54
-
55
- If PR #24 is still behind `main`, update the branch without overwriting local work:
56
-
57
- ```powershell
58
- git fetch origin main
59
- git rebase origin/main
60
- ```
61
-
62
- If `git fetch` fails with Windows credential errors, stop and repair Git credential/proxy state before retrying. Do not work around it by force-pushing or resetting.
63
-
64
- After branch update:
65
-
66
- ```powershell
67
- npm.cmd ci
68
- npm.cmd run build
69
- npm.cmd run test:unit
70
- npm.cmd run test:mcp
71
- npm.cmd run test:http-mcp
72
- npm.cmd run doctor:ci
73
- npm.cmd run verify:package
74
- npm.cmd test
75
- npm.cmd run pack:clean
76
- ```
77
-
78
- ### Submission
79
-
80
- Codex owns:
81
-
82
- - push updated branch
83
- - mark PR #24 ready for review only after local gates pass
84
- - monitor GitHub Actions
85
- - merge only through PR when checks are green
86
- - create tag and GitHub Release for `v1.5.1`
87
- - publish npm package only after npm auth is confirmed without exposing tokens
88
-
89
- ### Acceptance
90
-
91
- ```powershell
92
- gh pr view 24 --repo jiezeng2004-design/PatchWarden --json state,mergeStateStatus,statusCheckRollup
93
- gh release view v1.5.1 --repo jiezeng2004-design/PatchWarden --json tagName,name,isDraft,isPrerelease,publishedAt,url
94
- npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
95
- ```
96
-
97
- Pass criteria:
98
-
99
- - PR merged.
100
- - GitHub Release `v1.5.1` exists and is not draft.
101
- - npm `version` is `1.5.1`.
102
- - npm `dist-tags.latest` is `1.5.1`.
103
- - release notes do not claim anything not verified by CI/GitHub/npm.
104
-
105
- ## P1: Evidence Pack v2
106
-
107
- ### Objective
108
-
109
- Make Evidence Pack the project signature capability: bounded human summary plus structured machine-readable evidence.
110
-
111
- ### Current Gap
112
-
113
- Current export writes:
114
-
115
- - `.patchwarden/evidence-packs/<lineage_id>/evidence.json`
116
- - `.patchwarden/evidence-packs/<lineage_id>/EVIDENCE.md`
117
-
118
- The roadmap asks for richer named artifacts:
119
-
120
- - `risk.json`
121
- - `verify.json`
122
- - `diffstat.json`
123
- - `lineage.json`
124
- - `attestation.json`
125
- - `redactions.json`
126
-
127
- This is feasible as an incremental schema upgrade, not a rewrite.
128
-
129
- ### Execution
130
-
131
- Primary files:
132
-
133
- - `src/tools/evidencePack.ts`
134
- - `src/tools/taskLineage.ts`
135
- - `src/tools/registry.ts`
136
- - `src/tools/toolRegistry.ts`
137
- - `src/test/unit/evidence-pack.test.ts` or existing v1.5 evidence tests
138
- - `docs/evidence-pack-schema.md`
139
- - `docs/lineage-evidence-pack-workflow.md`
140
-
141
- Implementation rules:
142
-
143
- - Keep exports bounded.
144
- - Do not include full stdout, stderr, full diff, secrets, `.env`, tokens, cookies, browser state, or credential paths.
145
- - Store redaction metadata as categories and reasons, not raw hidden values.
146
- - Include PatchWarden version, commit, package version, Node version, OS, tool profile, and schema epoch in attestation.
147
-
148
- ### Acceptance
149
-
150
- ```powershell
151
- npm.cmd run build
152
- npm.cmd run test:unit
153
- npm.cmd run doctor:ci
154
- npm.cmd run verify:package
155
- ```
156
-
157
- Additional manual acceptance:
158
-
159
- - Run or reuse a `run_task_loop` lineage.
160
- - Export Evidence Pack.
161
- - Confirm all v2 files exist.
162
- - Confirm `EVIDENCE.md` is readable and bounded.
163
- - Confirm `redactions.json` does not contain raw secrets.
164
- - Confirm no `.patchwarden/evidence-packs` output is included in npm package.
165
-
166
- ## P1: README And Docs Readiness
167
-
168
- ### Objective
169
-
170
- Make the repository understandable to external users before sending traffic from external PRs.
171
-
172
- ### Execution
173
-
174
- Add or align these docs:
175
-
176
- - `docs/why-patchwarden.md`
177
- - `docs/evidence-pack-schema.md`
178
- - `docs/spec-kit-integration.md`
179
- - `docs/agentseal-integration.md`
180
- - `docs/mcp-inspector-testing.md`
181
- - `docs/opencode-worker.md`
182
- - `docs/openhands-worker.md`
183
- - `docs/threat-model.md` already exists; update instead of duplicating.
184
-
185
- README front page should preserve these sections:
186
-
187
- 1. one-line positioning
188
- 2. architecture diagram
189
- 3. why PatchWarden is not a remote shell
190
- 4. five-minute demo
191
- 5. Evidence Pack screenshot or text sample
192
- 6. supported agents
193
- 7. safety boundaries
194
- 8. ecosystem adaptation
195
-
196
- ### Acceptance
197
-
198
- ```powershell
199
- npm.cmd run build
200
- npm.cmd run check:brand
201
- npm.cmd run doctor:ci
202
- npm.cmd run verify:package
203
- ```
204
-
205
- Pass criteria:
206
-
207
- - README does not say `v1.5.1` is published until npm and GitHub confirm it.
208
- - Docs explain safety boundaries before external integrations.
209
- - Examples use placeholders for published versions unless release truth exists.
210
-
211
- ## P2: External PR Batch 1
212
-
213
- ### 1. MCP Inspector
214
-
215
- Why first: it is directly relevant, low-risk, and the upstream project is a testing tool for MCP servers.
216
-
217
- PR shape:
218
-
219
- - `docs: add CLI smoke testing example for MCP servers`
220
- - Generic first; PatchWarden only as one example if appropriate.
221
-
222
- Execution:
223
-
224
- ```powershell
225
- git clone https://github.com/modelcontextprotocol/inspector.git
226
- cd inspector
227
- git checkout -b docs/cli-smoke-testing-example
228
- ```
229
-
230
- Codex then inspects upstream contribution rules, edits docs only, runs upstream docs/lint/test commands, pushes fork branch, opens PR, and monitors CI.
231
-
232
- Acceptance:
233
-
234
- - Upstream tests or docs checks pass.
235
- - PR avoids promotional wording.
236
- - PR can stand alone without PatchWarden.
237
-
238
- ### 2. AgentSeal
239
-
240
- Why second: AgentSeal scans dangerous agent skills and MCP configs, which matches PatchWarden policy/config detection.
241
-
242
- PR shape:
243
-
244
- - `feat: detect PatchWarden MCP configs and project policies`
245
- - or `docs: add guarded local agent execution pattern` if code detector scope is too broad.
246
-
247
- Execution:
248
-
249
- ```powershell
250
- git clone https://github.com/getagentseal/agentseal.git
251
- cd agentseal
252
- git checkout -b detect/patchwarden-policy
253
- ```
254
-
255
- Codex then inspects `CONTRIBUTING.md`, existing probes, and tests before choosing code or docs scope.
256
-
257
- Acceptance:
258
-
259
- - Detector recognizes `.patchwarden/config.json` and `project-policy.json` without reading secrets.
260
- - Tests cover positive and negative fixtures.
261
- - PR describes a general safety pattern, not just PatchWarden marketing.
262
-
263
- ### 3. PatchWarden Compatibility Docs
264
-
265
- Why third: after first two external drafts, PatchWarden should document how to reproduce those workflows.
266
-
267
- Execution:
268
-
269
- ```powershell
270
- npm.cmd run build
271
- npm.cmd run doctor:ci
272
- ```
273
-
274
- Add:
275
-
276
- - `docs/mcp-inspector-testing.md`
277
- - `docs/agentseal-integration.md`
278
-
279
- Acceptance:
280
-
281
- - Commands are runnable on Windows PowerShell.
282
- - Docs link to real upstream PRs or issues after submission.
283
-
284
- ## P2: External PR Batch 2
285
-
286
- ### Spec Kit
287
-
288
- Why after Evidence Pack v2: Spec Kit is a strong fit, but PatchWarden needs a stable evidence schema before proposing integration.
289
-
290
- PR shape:
291
-
292
- - `docs: add evidence pack pattern for spec-driven development`
293
- - or `walkthrough: verify implemented tasks with an external MCP safety layer`
294
-
295
- Execution:
296
-
297
- ```powershell
298
- git clone https://github.com/github/spec-kit.git
299
- cd spec-kit
300
- git checkout -b docs/evidence-verification-pattern
301
- ```
302
-
303
- Acceptance:
304
-
305
- - PR maps spec -> tasks -> implementation -> evidence verification.
306
- - PatchWarden appears only as an example implementation.
307
- - Upstream docs checks pass.
308
-
309
- ## P3: External PR Batch 3
310
-
311
- ### OpenCode / OpenHands / Aider
312
-
313
- These are feasible but should not be first:
314
-
315
- - OpenCode has high traffic and a large repo; start with docs-only external supervisor pattern.
316
- - OpenHands is transitioning source ownership; inspect current repo structure before choosing target.
317
- - Aider is mature CLI tooling; a safe wrapper pattern is useful but should follow a published PatchWarden example.
318
-
319
- Acceptance for each:
320
-
321
- - Upstream contribution rules inspected.
322
- - PR is useful without requiring PatchWarden.
323
- - CI or documented local checks pass.
324
- - PatchWarden README links back only after PR exists.
325
-
326
- ## Issue Backlog To Create
327
-
328
- Create these as GitHub issues after P0 release truth is clean:
329
-
330
- 1. `fix: close v1.5.1 release truth gap`
331
- 2. `feat: add Evidence Pack v2 artifact schema`
332
- 3. `docs: add Evidence Pack v2 schema reference`
333
- 4. `feat: export goal final report`
334
- 5. `feat: import Spec Kit tasks into Goal Session`
335
- 6. `docs: add MCP Inspector CLI smoke testing guide`
336
- 7. `docs: add AgentSeal compatibility guide`
337
- 8. `docs: add OpenCode worker integration guide`
338
- 9. `docs: add OpenHands worker integration guide`
339
- 10. `docs: add external PR roadmap and ecosystem compatibility matrix`
340
-
341
- ## Global Acceptance Rules
342
-
343
- For every internal PatchWarden PR:
344
-
345
- ```powershell
346
- npm.cmd run build
347
- npm.cmd run test:unit
348
- npm.cmd run test:mcp
349
- npm.cmd run test:http-mcp
350
- npm.cmd run doctor:ci
351
- npm.cmd run verify:package
352
- ```
353
-
354
- Before release:
355
-
356
- ```powershell
357
- npm.cmd ci
358
- npm.cmd test
359
- npm.cmd run pack:clean
360
- gh pr checks <PR_NUMBER> --repo jiezeng2004-design/PatchWarden --watch
361
- gh release view v<version> --repo jiezeng2004-design/PatchWarden --json tagName,isDraft,publishedAt,url
362
- npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
363
- ```
364
-
365
- Never mark release work complete unless GitHub Release and npm registry truth both match the intended version.
@@ -1,261 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import { strict as assert } from "node:assert";
3
- import {
4
- evaluateAcceptance,
5
- verdictToStatus,
6
- type AcceptanceEvidence,
7
- } from "../../goal/acceptanceEngine.js";
8
- import { renderAcceptanceMarkdown } from "../../goal/acceptanceTemplate.js";
9
-
10
- // ── Helpers ───────────────────────────────────────────────────────
11
-
12
- function makeEvidence(overrides: Partial<AcceptanceEvidence> = {}): AcceptanceEvidence {
13
- return {
14
- task_id: "task_test_001",
15
- task_status: "done_by_agent",
16
- result_md_exists: true,
17
- result_json_exists: true,
18
- verify_json_exists: true,
19
- test_log_exists: true,
20
- git_diff_exists: true,
21
- verify_status: "passed",
22
- new_out_of_scope_changes: [],
23
- goal: null,
24
- scope: null,
25
- forbidden: null,
26
- verification: null,
27
- done_evidence: null,
28
- artifact_status: "collected",
29
- release_claims_unverified: false,
30
- checks: [
31
- { name: "task_status", result: "pass", detail: "Task status is done_by_agent." },
32
- { name: "result_md_exists", result: "pass", detail: "result.md found." },
33
- { name: "verify_status", result: "pass", detail: "Verification passed." },
34
- ],
35
- ...overrides,
36
- };
37
- }
38
-
39
- // ── Tests ─────────────────────────────────────────────────────────
40
-
41
- describe("acceptanceEngine", () => {
42
-
43
- describe("evaluateAcceptance — 基础场景", () => {
44
-
45
- it("所有检查通过 → ACCEPTED", () => {
46
- const evidence = makeEvidence();
47
- const result = evaluateAcceptance(evidence);
48
- assert.equal(result.verdict, "ACCEPTED");
49
- assert.equal(result.acceptance_status, "accepted");
50
- assert.equal(result.fail_checks.length, 0);
51
- assert.equal(result.warn_checks.length, 0);
52
- assert.ok(result.reason.includes("All acceptance checks passed"));
53
- });
54
-
55
- it("存在 fail 级检查项 → REJECTED", () => {
56
- const evidence = makeEvidence({
57
- checks: [
58
- { name: "task_status", result: "pass", detail: "ok" },
59
- { name: "result_md_exists", result: "fail", detail: "result.md is missing." },
60
- { name: "verify_status", result: "pass", detail: "ok" },
61
- ],
62
- });
63
- const result = evaluateAcceptance(evidence);
64
- assert.equal(result.verdict, "REJECTED");
65
- assert.equal(result.acceptance_status, "rejected");
66
- assert.equal(result.fail_checks.length, 1);
67
- assert.equal(result.fail_checks[0].name, "result_md_exists");
68
- assert.ok(result.reason.includes("fail-level"));
69
- });
70
-
71
- it("存在 warn 级检查项(无 fail)→ NEEDS_FIX", () => {
72
- const evidence = makeEvidence({
73
- checks: [
74
- { name: "task_status", result: "pass", detail: "ok" },
75
- { name: "git_diff_exists", result: "warn", detail: "git.diff is missing." },
76
- { name: "test_log_exists", result: "warn", detail: "test.log is missing." },
77
- ],
78
- });
79
- const result = evaluateAcceptance(evidence);
80
- assert.equal(result.verdict, "NEEDS_FIX");
81
- assert.equal(result.acceptance_status, "needs_fix");
82
- assert.equal(result.warn_checks.length, 2);
83
- assert.ok(result.reason.includes("warn-level"));
84
- });
85
-
86
- it("存在 release claims 但无法验证 → BLOCKED_BY_APPROVAL(即使有 warn)", () => {
87
- const evidence = makeEvidence({
88
- release_claims_unverified: true,
89
- checks: [
90
- { name: "task_status", result: "pass", detail: "ok" },
91
- { name: "release_claims_unverified", result: "warn", detail: "Found release claims." },
92
- ],
93
- });
94
- const result = evaluateAcceptance(evidence);
95
- assert.equal(result.verdict, "BLOCKED_BY_APPROVAL");
96
- assert.equal(result.acceptance_status, "blocked");
97
- assert.ok(result.reason.includes("Release claims"));
98
- assert.ok(result.required_evidence.some((e) => e.includes("Verify remote")));
99
- });
100
-
101
- it("fail 级检查项优先于 release claims", () => {
102
- const evidence = makeEvidence({
103
- release_claims_unverified: true,
104
- checks: [
105
- { name: "task_status", result: "fail", detail: "Task failed." },
106
- { name: "release_claims_unverified", result: "warn", detail: "Found release claims." },
107
- ],
108
- });
109
- const result = evaluateAcceptance(evidence);
110
- assert.equal(result.verdict, "REJECTED");
111
- assert.equal(result.acceptance_status, "rejected");
112
- });
113
-
114
- it("多个 fail 级检查项全部收集", () => {
115
- const evidence = makeEvidence({
116
- checks: [
117
- { name: "result_md_exists", result: "fail", detail: "missing" },
118
- { name: "verify_status", result: "fail", detail: "failed" },
119
- { name: "scope_changes", result: "fail", detail: "out of scope" },
120
- ],
121
- });
122
- const result = evaluateAcceptance(evidence);
123
- assert.equal(result.verdict, "REJECTED");
124
- assert.equal(result.fail_checks.length, 3);
125
- });
126
- });
127
-
128
- describe("verdictToStatus", () => {
129
- it("ACCEPTED → accepted", () => {
130
- assert.equal(verdictToStatus("ACCEPTED"), "accepted");
131
- });
132
-
133
- it("REJECTED → rejected", () => {
134
- assert.equal(verdictToStatus("REJECTED"), "rejected");
135
- });
136
-
137
- it("NEEDS_FIX → needs_fix", () => {
138
- assert.equal(verdictToStatus("NEEDS_FIX"), "needs_fix");
139
- });
140
-
141
- it("BLOCKED_BY_APPROVAL → blocked", () => {
142
- assert.equal(verdictToStatus("BLOCKED_BY_APPROVAL"), "blocked");
143
- });
144
- });
145
-
146
- describe("evaluateAcceptance — next_suggested_task", () => {
147
- it("ACCEPTED 的 next_suggested_task 包含 'accepted'", () => {
148
- const result = evaluateAcceptance(makeEvidence());
149
- assert.ok(result.next_suggested_task.includes("accepted"));
150
- });
151
-
152
- it("REJECTED 的 next_suggested_task 包含 fail 检查名", () => {
153
- const result = evaluateAcceptance(makeEvidence({
154
- checks: [{ name: "result_md_exists", result: "fail", detail: "missing" }],
155
- }));
156
- assert.ok(result.next_suggested_task.includes("result_md_exists"));
157
- });
158
-
159
- it("NEEDS_FIX 的 next_suggested_task 包含 warn 检查名", () => {
160
- const result = evaluateAcceptance(makeEvidence({
161
- checks: [{ name: "git_diff_exists", result: "warn", detail: "missing" }],
162
- }));
163
- assert.ok(result.next_suggested_task.includes("git_diff_exists"));
164
- });
165
-
166
- it("BLOCKED_BY_APPROVAL 的 next_suggested_task 包含 'verify'", () => {
167
- const result = evaluateAcceptance(makeEvidence({ release_claims_unverified: true }));
168
- assert.ok(result.next_suggested_task.toLowerCase().includes("verify"));
169
- });
170
- });
171
-
172
- describe("evaluateAcceptance — reasons 可追溯", () => {
173
- it("REJECTED 的 reasons 包含 [FAIL] 前缀", () => {
174
- const result = evaluateAcceptance(makeEvidence({
175
- checks: [{ name: "result_md_exists", result: "fail", detail: "missing" }],
176
- }));
177
- assert.ok(result.reasons.some((r) => r.includes("[FAIL]")));
178
- });
179
-
180
- it("NEEDS_FIX 的 reasons 包含 [WARN] 前缀", () => {
181
- const result = evaluateAcceptance(makeEvidence({
182
- checks: [{ name: "git_diff_exists", result: "warn", detail: "missing" }],
183
- }));
184
- assert.ok(result.reasons.some((r) => r.includes("[WARN]")));
185
- });
186
-
187
- it("BLOCKED_BY_APPROVAL 的 reasons 包含 [BLOCKED] 前缀", () => {
188
- const result = evaluateAcceptance(makeEvidence({ release_claims_unverified: true }));
189
- assert.ok(result.reasons.some((r) => r.includes("[BLOCKED]")));
190
- });
191
-
192
- it("ACCEPTED 的 reasons 非空", () => {
193
- const result = evaluateAcceptance(makeEvidence());
194
- assert.ok(result.reasons.length > 0);
195
- });
196
- });
197
-
198
- describe("renderAcceptanceMarkdown", () => {
199
- it("生成包含 verdict 的 ACCEPTANCE.md 内容", () => {
200
- const evidence = makeEvidence();
201
- const result = evaluateAcceptance(evidence);
202
- const md = renderAcceptanceMarkdown("task_test_001", result, evidence);
203
- assert.ok(md.includes("# Acceptance Report — task_test_001"));
204
- assert.ok(md.includes("**ACCEPTED**"));
205
- assert.ok(md.includes("## Evidence Summary"));
206
- assert.ok(md.includes("## Verdict"));
207
- });
208
-
209
- it("REJECTED 的 Markdown 包含 fail 检查", () => {
210
- const evidence = makeEvidence({
211
- checks: [{ name: "result_md_exists", result: "fail", detail: "missing" }],
212
- });
213
- const result = evaluateAcceptance(evidence);
214
- const md = renderAcceptanceMarkdown("task_test_002", result, evidence);
215
- assert.ok(md.includes("**REJECTED**"));
216
- assert.ok(md.includes("## Fail-Level Checks"));
217
- assert.ok(md.includes("result_md_exists"));
218
- });
219
-
220
- it("NEEDS_FIX 的 Markdown 包含 warn 检查", () => {
221
- const evidence = makeEvidence({
222
- checks: [{ name: "git_diff_exists", result: "warn", detail: "missing" }],
223
- });
224
- const result = evaluateAcceptance(evidence);
225
- const md = renderAcceptanceMarkdown("task_test_003", result, evidence);
226
- assert.ok(md.includes("**NEEDS_FIX**"));
227
- assert.ok(md.includes("## Warn-Level Checks"));
228
- });
229
-
230
- it("BLOCKED 的 Markdown 包含 required_evidence", () => {
231
- const evidence = makeEvidence({ release_claims_unverified: true });
232
- const result = evaluateAcceptance(evidence);
233
- const md = renderAcceptanceMarkdown("task_test_004", result, evidence);
234
- assert.ok(md.includes("**BLOCKED_BY_APPROVAL**"));
235
- assert.ok(md.includes("## Required Evidence"));
236
- });
237
-
238
- it("有 goal/scope 时显示 Task Acceptance Criteria", () => {
239
- const evidence = makeEvidence({
240
- goal: "Implement feature X",
241
- scope: ["src/feature.ts"],
242
- forbidden: [".env"],
243
- verification: ["npm test"],
244
- done_evidence: ["result.md", "test.log"],
245
- });
246
- const result = evaluateAcceptance(evidence);
247
- const md = renderAcceptanceMarkdown("task_test_005", result, evidence);
248
- assert.ok(md.includes("## Task Acceptance Criteria"));
249
- assert.ok(md.includes("Implement feature X"));
250
- assert.ok(md.includes("src/feature.ts"));
251
- assert.ok(md.includes(".env"));
252
- });
253
-
254
- it("无 goal/scope 时不显示 Task Acceptance Criteria section", () => {
255
- const evidence = makeEvidence();
256
- const result = evaluateAcceptance(evidence);
257
- const md = renderAcceptanceMarkdown("task_test_006", result, evidence);
258
- assert.ok(!md.includes("## Task Acceptance Criteria"));
259
- });
260
- });
261
- });