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,131 @@
1
+ # Spec Kit 集成模式
2
+
3
+ > 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
4
+ > 说明:本文描述的是 PatchWarden 与 Spec Kit 的集成模式建议,**不是** Spec Kit 的官方功能。
5
+ > Spec Kit 是 GitHub 维护的独立项目,本文不声称任何官方集成关系。
6
+
7
+ ## Spec Kit 是什么
8
+
9
+ Spec Kit 是 GitHub 推出的 spec-driven development(规格驱动开发)工具集,
10
+ 用于在代码实现之前先定义、版本化、验证规格(spec)。典型流程为:
11
+
12
+ 1. **Spec**:用结构化方式描述功能需求与验收标准。
13
+ 2. **Tasks**:将 spec 拆解为可执行的任务列表。
14
+ 3. **Implementation**:由人或 Agent 执行任务。
15
+ 4. **Verification**:根据 spec 的验收标准验证实现结果。
16
+
17
+ Spec Kit 的核心价值在于把“要做什么”与“怎么做”显式分离,让验收有据可依。
18
+
19
+ ## PatchWarden 在 Spec Kit 流程中的位置
20
+
21
+ PatchWarden 不替代 Spec Kit 的规格定义能力,而是承担 Spec Kit 流程中
22
+ “Implementation”与“Verification”两个阶段的**安全执行与证据收集**角色:
23
+
24
+ ```
25
+ Spec Kit: spec → tasks → implementation → verification
26
+ ↑ ↑
27
+ PatchWarden 在此执行并产出 Evidence Pack v2
28
+ ```
29
+
30
+ - **Implementation 阶段**:PatchWarden 以 MCP 安全桥接器身份接收任务,
31
+ 在 workspace 隔离、命令允许列表、范围违规检测下执行。
32
+ - **Verification 阶段**:PatchWarden 导出 Evidence Pack v2,作为 spec
33
+ 验收的结构化证据。
34
+
35
+ ## Evidence Pack v2 作为 spec 验收证据
36
+
37
+ Spec Kit 的验收标准通常是自然语言描述。PatchWarden 的 Evidence Pack v2
38
+ 提供机器可读的对应物,便于自动化对齐:
39
+
40
+ | Evidence Pack 文件 | Spec 验收对应物 |
41
+ | --- | --- |
42
+ | `evidence.json` | 任务整体证据,含 lineage、policy、catalog 摘要 |
43
+ | `EVIDENCE.md` | 人类可读摘要,便于 spec reviewer 阅读 |
44
+ | `risk.json` | 实现过程中识别的风险项,对应 spec 的风险条款 |
45
+ | `verify.json` | 每轮迭代的结构化验证记录 |
46
+ | `diffstat.json` | 文件级改动统计,对应 spec 声明的改动范围 |
47
+ | `lineage.json` | 任务谱系,证明实现源自哪条 spec task |
48
+ | `attestation.json` | 任务签名与证明 |
49
+ | `redactions.json` | 已脱敏内容清单 |
50
+
51
+ ## 集成流程示例
52
+
53
+ ### 1. 在 Spec Kit 中定义 spec 与 tasks
54
+
55
+ 在 Spec Kit 仓库中编写 spec 与 task 清单,例如:
56
+
57
+ ```json
58
+ {
59
+ "spec": "add-rate-limit-middleware",
60
+ "tasks": [
61
+ { "id": "T1", "desc": "implement rate limiter", "files": ["src/middleware/rate.ts"] },
62
+ { "id": "T2", "desc": "add tests", "files": ["test/middleware/rate.test.ts"] }
63
+ ],
64
+ "acceptance": ["T1 passes", "T2 passes", "no changes outside declared files"]
65
+ }
66
+ ```
67
+
68
+ ### 1.5 批量导入 Spec Kit tasks 为 PatchWarden subgoal
69
+
70
+ PatchWarden 提供 `import_speckit_tasks` 工具,可将 Spec Kit 的 tasks 批量导入为 Goal 下的 subgoal:
71
+
72
+ - 每个 Spec Kit task 创建一个对应 subgoal,title 取自 task.desc
73
+ - task.files 映射为 subgoal 的 scope_hints(声明改动范围提示)
74
+ - task.depends_on 映射为 subgoal 间的依赖关系
75
+ - Spec Kit 的 acceptance[] 存入 Goal 的 acceptance_criteria 字段
76
+ - 支持幂等导入:重复导入同一 Spec Kit JSON 不会创建重复 subgoal
77
+
78
+ ### 2. 通过 PatchWarden 执行任务
79
+
80
+ 将 Spec Kit 的 task 通过 MCP 客户端交给 PatchWarden:
81
+
82
+ ```powershell
83
+ # 假设 PatchWarden MCP server 已启动
84
+ # MCP 客户端调用 PatchWarden 工具,传入 task 描述与声明的文件范围
85
+ ```
86
+
87
+ PatchWarden 会在执行时:
88
+
89
+ - 校验改动是否仅在 `src/middleware/rate.ts` 与 `test/middleware/rate.test.ts`。
90
+ - 阻断任何越界文件改动或未注册命令。
91
+ - 在每轮迭代后记录结构化验证。
92
+
93
+ ### 3. 导出 Evidence Pack 并与 spec 对齐
94
+
95
+ 任务完成后导出 Evidence Pack v2:
96
+
97
+ ```powershell
98
+ # 通过 MCP 工具 export_task_evidence_pack 导出
99
+ # 产物位于 .patchwarden/evidence-packs/<lineage_id>/
100
+ ```
101
+
102
+ 随后可用脚本将 `diffstat.json` 与 spec 声明的 `files` 对齐,
103
+ 将 `verify.json` 与 spec `acceptance` 对齐。
104
+
105
+ ### 4. Spec 验收
106
+
107
+ reviewer 阅读 `EVIDENCE.md` 与 `verify.json`,
108
+ 确认实现满足 spec 验收标准后标记 spec 为已验收。
109
+
110
+ ## 配置要点
111
+
112
+ - PatchWarden 的 `workspaceRoot` 应覆盖 Spec Kit 仓库根目录。
113
+ - Spec Kit 的 task 中声明的文件范围应与 PatchWarden Project Policy 的
114
+ allowed paths 一致,避免执行时被范围违规检测阻断。
115
+ - Evidence Pack v2 的 `lineage.json` 可用于回溯到 Spec Kit 的 task id,
116
+ 建议在任务描述中包含 Spec Kit task id。
117
+
118
+ ## 边界与注意事项
119
+
120
+ - PatchWarden 不解析 Spec Kit 的 spec 格式本身,只处理 tasks 与 acceptance 字段并产出证据。
121
+ - Spec Kit 的 spec 验收逻辑由 Spec Kit 自身或 reviewer 负责,
122
+ PatchWarden 只提供证据材料。
123
+ - 本集成模式不修改 Spec Kit 的任何行为,仅在流程上配合使用。
124
+ - 如 Spec Kit task 要求读取 `.env` 或敏感文件,PatchWarden 会按安全契约阻断,
125
+ 此时需要重新设计 task 以避免触碰敏感资源。
126
+
127
+ ## 相关文档
128
+
129
+ - `docs/evidence-pack-schema.md`:Evidence Pack v2 文件结构。
130
+ - `docs/threat-model.md`:PatchWarden 安全契约。
131
+ - `docs/why-patchwarden.md`:PatchWarden 定位与动机。
@@ -0,0 +1,98 @@
1
+ # 任务 Safe 验收工作流
2
+
3
+ > 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
4
+ > 相关页面:Tasks、Task Detail
5
+
6
+ ## 目的
7
+
8
+ 在不暴露完整日志、diff、test log 的前提下,用一组 safe 摘要接口完成对单个任务的
9
+ 验收判断。完整产物仅在确认需要时才从折叠的“高级区”按需加载。
10
+
11
+ ## 核心概念
12
+
13
+ - **safe_result**:任务结果摘要,包含 status、acceptance_status、verification 概要、
14
+ warnings、fail_checks、manual_verification_required、recommended_next_actions。
15
+ - **safe_test_summary**:测试摘要,只包含通过/失败计数和失败用例名称,不含完整 stdout。
16
+ - **safe_diff_summary**:diff 摘要,包含变更文件数、新增/删除/修改行数统计、
17
+ 受保护路径命中情况,不含完整 diff。
18
+ - **safe_audit**:审计摘要,包含 artifact 完整性、scope_changes、命令白名单合规性
19
+ 的有界摘要。
20
+ - **acceptance_status**:任务的验收状态,比 `status` 更能反映“是否真的通过”。
21
+ - **Advanced 区**:折叠区域,包含配置上限内的 result / diff / test_log,需手动展开。
22
+
23
+ ## 验收工作流
24
+
25
+ ### 1. 在 Tasks 列表筛选目标任务
26
+
27
+ Tasks 页支持按 `repo_path` / `status` / `acceptance_status` / `warning_type` /
28
+ `agent` / date range 过滤。建议优先关注:
29
+
30
+ - `acceptance_status` 为 `pending` 或 `failed_verification` 的任务
31
+ - 带有 warning 的任务(warning_type 列会高亮)
32
+
33
+ ### 2. 使用行内快捷操作预览
34
+
35
+ 每行任务提供以下快捷操作,无需进入详情页即可快速判断:
36
+
37
+ - `safe_result` — 查看任务结果摘要
38
+ - `safe_test_summary` — 查看测试摘要
39
+ - `safe_diff_summary` — 查看变更摘要
40
+ - `safe_audit` — 查看审计摘要
41
+ - `open detail` — 进入 Task Detail 页
42
+ - `copy id` — 复制完整 task_id
43
+
44
+ ### 3. 进入 Task Detail 进行完整 safe 验收
45
+
46
+ Task Detail 默认展示 safe 摘要视图:
47
+
48
+ - **safe_result** 区:status、acceptance_status、verification headline、warnings、
49
+ fail_checks、manual_verification_required、recommended_next_actions
50
+ - **safe_test_summary** 区:通过/失败计数、失败用例名
51
+ - **safe_diff_summary** 区:变更文件数、行数统计、受保护路径命中
52
+ - **safe_audit** 区:artifact 完整性、scope_changes、命令合规性
53
+
54
+ ### 4. 仅在必要时展开高级区
55
+
56
+ 只有当 safe 摘要无法定论时(例如 `manual_verification_required` 为 true,
57
+ 或 `fail_checks` 指向某个具体失败),才展开高级区查看配置上限内的产物:
58
+
59
+ - 有界并脱敏的 result(JSON)
60
+ - 有界并脱敏的 diff
61
+ - 有界并脱敏的 test_log
62
+
63
+ > 高级区内容不会自动加载,必须手动点击展开。展开不会触发任何写操作。
64
+
65
+ ### 5. 根据 recommended_next_actions 决定下一步
66
+
67
+ safe_result 的 `recommended_next_actions` 会给出建议,例如:
68
+
69
+ - 验收通过 → 导出 Evidence Pack 或进行 Direct 独立验证
70
+ - 验收失败 → 基于 `run_task_loop` 创建修复任务
71
+ - 需要人工确认 → 标记 `manual_verification_required` 后人工复核
72
+
73
+ ## Stale 任务处理
74
+
75
+ Stale 任务卡片会给出 explanation 和 next_action:
76
+
77
+ - **view detail** — 查看 safe 摘要判断是否需要重建
78
+ - **copy task_id** — 复制 id 用于后续命令
79
+ - **hide** — 调用 `POST /api/tasks/:taskId/hide-stale` 从 stale 列表隐藏
80
+ - **recreate task** — 基于原任务参数创建新任务
81
+
82
+ ## 安全边界
83
+
84
+ - safe 接口返回有界摘要,不含完整 stdout/stderr、完整 diff、密钥、token。
85
+ - 完整产物仅在高级区手动展开后加载,且不离开本机。
86
+ - 验收操作不触发远程写(不 publish、不 push、不 tag、不 release)。
87
+ - `acceptance_status` 由 watcher 与 verification 流程计算,不能从 UI 直接伪造。
88
+
89
+ ## 相关 API 端点
90
+
91
+ - `GET /api/tasks` — 任务列表(支持 repo_path / status / acceptance_status /
92
+ agent / warning_type 过滤)
93
+ - `GET /api/tasks/:taskId/safe-result` — safe_result 摘要
94
+ - `GET /api/tasks/:taskId/safe-test-summary` — safe_test_summary 摘要
95
+ - `GET /api/tasks/:taskId/safe-diff-summary` — safe_diff_summary 摘要
96
+ - `GET /api/tasks/:taskId/safe-audit` — safe_audit 摘要
97
+ - `GET /api/tasks/stale` — stale 任务列表(含 explanation / next_action)
98
+ - `POST /api/tasks/:taskId/hide-stale` — 隐藏 stale 任务
@@ -0,0 +1,97 @@
1
+ # PatchWarden Threat Model
2
+
3
+ PatchWarden is a local MCP bridge for AI coding workflows. Its core security
4
+ goal is to let an MCP client request bounded maintainer tasks without turning
5
+ the local machine into a general-purpose remote shell.
6
+
7
+ ## Assets Protected
8
+
9
+ - source repositories under the configured workspace
10
+ - release artifacts and checksums
11
+ - task evidence under `.patchwarden/`
12
+ - local configuration files
13
+ - `.env` files, API keys, tokens, SSH keys, cookies, browser state, and
14
+ credential stores
15
+ - maintainer time and trust in verification evidence
16
+
17
+ ## Trust Boundaries
18
+
19
+ PatchWarden assumes the upstream model or MCP client can be wrong, overbroad, or
20
+ prompt-injected. It should not be trusted with unrestricted command execution,
21
+ arbitrary filesystem reads, or release authority.
22
+
23
+ Trusted local configuration includes:
24
+
25
+ - `workspaceRoot`
26
+ - registered agents and their command templates
27
+ - `allowedTestCommands`
28
+ - project policy files reviewed by the maintainer
29
+
30
+ Human maintainer confirmation remains required for high-risk actions such as
31
+ publishing, pushing, creating releases, changing live services, or approving
32
+ local confirmation tickets.
33
+
34
+ ## Main Threats
35
+
36
+ | Threat | Example | Mitigation |
37
+ | --- | --- | --- |
38
+ | Arbitrary shell execution | A prompt asks the MCP server to run a custom command. | PatchWarden exposes task tools, not a general shell; verification commands must exactly match allowlists. |
39
+ | Path traversal | A task tries to edit `../other-project` or user home files. | Task paths are resolved under `workspaceRoot`; out-of-scope changes are reported as violations. |
40
+ | Secret exfiltration | A task asks to read `.env`, SSH keys, cookies, or credentials. | Sensitive path names are blocked and docs require redacted logs. |
41
+ | Prompt injection | Repository text instructs the model to ignore safety constraints. | Safety is enforced by local code and configuration, not by prompt instructions alone. |
42
+ | Unsafe release claims | A local build passes and the agent claims npm/GitHub publish is complete. | Release docs require separate verification of PR/CI, GitHub Release, npm version, and `dist-tags.latest`. |
43
+ | Evidence overload | A client requests full logs, diffs, or private task history by default. | Safe summary tools and bounded evidence packs are the preferred review surfaces. |
44
+ | Evidence secret persistence | An agent writes a token into a normal source file and the Git diff duplicates it under `.patchwarden`. | Diff evidence is capped at 20 MiB, redacted before persistence, and credential-like content produces a policy violation. |
45
+ | Artifact-directory confusion | A secret-shaped filename is placed under `.patchwarden` and assumed safe because it is an internal artifact. | The sensitive-name guard applies at every depth; `.patchwarden` has no blanket exemption. |
46
+ | Concurrent Goal/worktree mutation | Two MCP processes accept subgoals or create/merge/discard worktrees at the same time and lose state or corrupt repository lifecycle. | Goal mutations share a cross-process lock and atomic replacement; worktree repository mutations share a lifecycle lock. |
47
+ | Evidence resource exhaustion | Oversized task logs or a large documentation tree consume unbounded memory, response size, or disk. | Task and Control reads use bounded prefix/tail reads, audit scans enforce file/byte budgets, and persistent invocation/reconcile logs use locked bounded append with explicit truncation. |
48
+ | DNS rebinding | A hostile web origin resolves to `127.0.0.1` and tries to read the Control token or call HTTP MCP. | Control Center and HTTP MCP reject Host headers other than the configured `127.0.0.1`/`localhost` origin. |
49
+ | Live-service disruption | A task restarts tunnels, watchers, or unrelated processes. | Project rules forbid blanket process kills; live cutover must be explicit and separately approved. |
50
+
51
+ ## Security Invariants
52
+
53
+ PatchWarden changes should preserve these invariants:
54
+
55
+ - no general-purpose remote shell
56
+ - all task repositories stay under `workspaceRoot`
57
+ - agents are explicitly registered before use
58
+ - child processes receive a minimal environment; provider variables require an
59
+ explicit per-agent `envAllowlist`, and Tunnel owner credentials are never
60
+ forwarded
61
+ - model input cannot define arbitrary agent launch commands
62
+ - verification commands use exact allowlist matching
63
+ - sensitive paths remain blocked at every directory depth, including under
64
+ `.patchwarden`
65
+ - task artifacts remain auditable and redacted where appropriate
66
+ - Goal status mutations and worktree repository lifecycle changes are
67
+ cross-process serialized; a non-empty Goal becomes completed only after all
68
+ subgoals are accepted
69
+ - subgoal tasks use the Goal's stored `repo_path` as authority and reject a
70
+ caller-supplied repository mismatch
71
+ - task/audit/log read and append paths enforce explicit byte, line, or file
72
+ budgets and report truncation
73
+ - Direct patch/sync accepts only bounded UTF-8 text, rejects credential-like
74
+ results, and serializes session mutations
75
+ - scope violations are surfaced, not silently accepted
76
+ - publish, push, tag, release, and live-service operations remain
77
+ confirmation-gated
78
+
79
+ ## Non-Goals
80
+
81
+ PatchWarden is not a full sandbox, container runtime, endpoint security product,
82
+ or secret scanner. It adds policy, task evidence, verification, and review
83
+ records around local agent work. It should be used with normal operating-system
84
+ permissions, Git review, CI, and maintainer judgment.
85
+
86
+ ## Review Checklist For Security-Sensitive Changes
87
+
88
+ - [ ] Does the change weaken workspace confinement?
89
+ - [ ] Does it expand command execution beyond exact allowlists?
90
+ - [ ] Does it expose full logs, diffs, task history, or file contents where a
91
+ safe summary would be enough?
92
+ - [ ] Does it read or persist credentials, tokens, cookies, browser state, or
93
+ `.env` content?
94
+ - [ ] Does it auto-push, auto-publish, auto-tag, or restart live services?
95
+ - [ ] Does it add or update smoke coverage for changed behavior?
96
+ - [ ] Does it keep README, examples, tool manifests, package metadata, and
97
+ migration docs aligned?
@@ -0,0 +1,40 @@
1
+ # PatchWarden User Feedback
2
+
3
+ This file tracks real feedback only. Do not add invented users, fake adoption,
4
+ or private conversations that cannot be shared.
5
+
6
+ ## Current Status
7
+
8
+ No third-party feedback has been imported into this repository yet.
9
+
10
+ Before using this file as application evidence, collect public feedback through
11
+ GitHub issues or discussions from real testers who have tried at least one of
12
+ the documented flows.
13
+
14
+ ## Feedback To Collect
15
+
16
+ Ask testers to include:
17
+
18
+ - operating system
19
+ - Node.js version
20
+ - MCP client used, such as ChatGPT, Codex, OpenCode, or another MCP client
21
+ - whether `npm.cmd run doctor` or the documented setup passed
22
+ - what task they attempted
23
+ - whether task evidence, safe summaries, or audit output helped
24
+ - confusing setup steps
25
+ - feature requests
26
+
27
+ ## Public Feedback Log
28
+
29
+ | Date | Source | Tester context | Result | Follow-up |
30
+ | --- | --- | --- | --- | --- |
31
+ | Pending | Pending GitHub issue or discussion | Pending | Pending | Pending |
32
+
33
+ ## Maintainer Response Rules
34
+
35
+ - Keep feedback public when possible.
36
+ - Redact local paths, logs, keys, tokens, cookies, `.env` contents, and account
37
+ identifiers.
38
+ - Convert recurring friction into issues with `documentation`, `good first
39
+ issue`, `help wanted`, or `security` labels when appropriate.
40
+ - Close the loop by linking fixes, docs, or release notes back to the feedback.
@@ -0,0 +1,110 @@
1
+ # 为什么需要 PatchWarden
2
+
3
+ > 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
4
+ > 面向:使用 ChatGPT、Codex、OpenCode 等 MCP 客户端但需要安全边界的开发者
5
+
6
+ ## 背景:本地 Agent 的安全缺口
7
+
8
+ 当前主流的本地编程 Agent(如 ChatGPT 桌面端、Codex CLI、OpenCode、OpenHands)
9
+ 在带来生产力提升的同时,也引入了新的攻击面:
10
+
11
+ - Agent 可执行本地命令,一旦被 prompt injection 或上下文污染,可能执行越权操作。
12
+ - 通用远程 Shell 模式将完整命令执行能力暴露给 MCP 客户端,缺乏边界。
13
+ - 任务产物分散在 stdout / stderr / diff 中,难以审计与验收。
14
+ - `.env`、token、SSH key、cookie、浏览器状态等敏感文件缺乏强制隔离。
15
+
16
+ PatchWarden 不是另一个通用 Shell。它定位为本地优先的 MCP 安全与验证层
17
+ (local-first MCP safety and verification layer for AI coding agents),
18
+ 在不牺牲 Agent 能力的前提下提供可审计的安全边界。
19
+
20
+ ## 核心价值
21
+
22
+ ### 1. Workspace Confinement(工作区隔离)
23
+
24
+ 所有仓库路径必须位于配置的 `workspaceRoot` 之下。PatchWarden 会阻断:
25
+
26
+ - 越出 workspace 的文件读写。
27
+ - 对敏感文件名(如 `.env`、`id_rsa`、`cookies.db`)的访问。
28
+ - 跨仓库的非授权改动。
29
+
30
+ ### 2. Command Allowlists(命令允许列表)
31
+
32
+ PatchWarden 采用精确命令匹配,而非宽松的 glob 或前缀匹配:
33
+
34
+ - 只有显式注册的命令才能执行。
35
+ - 参数变化同样受约束,避免命令注入绕过。
36
+ - 不存在“允许 `git` 即允许任意 git 子命令”的隐式放大。
37
+
38
+ ### 3. Scope-Violation Detection(范围违规检测)
39
+
40
+ Agent 提出的任务若超出声明的 scope(例如修改了未授权文件、执行了未注册命令),
41
+ PatchWarden 会在执行前或执行中识别并阻断,而不是事后才在日志里发现。
42
+
43
+ ### 4. Auditable Task Evidence(可审计任务证据)
44
+
45
+ 每个任务通过 Evidence Pack v2 导出 8 个有界文件:
46
+
47
+ | 文件 | 用途 |
48
+ | --- | --- |
49
+ | `evidence.json` | 完整有界证据包(机器可读) |
50
+ | `EVIDENCE.md` | 人类可读的 Markdown 摘要 |
51
+ | `risk.json` | 聚合的风险项与严重度 |
52
+ | `verify.json` | 每轮迭代的结构化验证记录 |
53
+ | `diffstat.json` | 文件级增删统计(不含完整 diff) |
54
+ | `lineage.json` | 任务谱系与上下文链 |
55
+ | `attestation.json` | 任务签名与证明 |
56
+ | `redactions.json` | 已脱敏内容清单 |
57
+
58
+ 这些文件只包含有界摘要,**不**包含完整 stdout/stderr、完整 diff、
59
+ secrets、token、cookie 或凭据路径。
60
+
61
+ ## 与通用远程 Shell 的区别
62
+
63
+ | 维度 | 通用远程 Shell | PatchWarden |
64
+ | --- | --- | --- |
65
+ | 命令执行 | 任意命令 | 精确允许列表 |
66
+ | 路径访问 | 通常无约束 | 强制 workspace 隔离 |
67
+ | 敏感文件 | 取决于调用方自觉 | 强制阻断 |
68
+ | 任务证据 | 散落在日志 | 8 个有界文件可审计 |
69
+ | 范围违规 | 事后发现 | 执行前/中阻断 |
70
+ | MCP 客户端权限 | 全权委托 | 受约束代理 |
71
+
72
+ PatchWarden 假设上游模型或 MCP 客户端可能出错、过度宽泛或被 prompt injection。
73
+ 它不应被信任以无约束方式执行命令。
74
+
75
+ ## 适用场景
76
+
77
+ - 使用 ChatGPT / Codex / OpenCode / OpenHands 等 MCP 客户端进行本地代码维护。
78
+ - 需要对 Agent 任务进行可审计验收的团队或个人。
79
+ - 希望将 Agent 限制在特定 workspace 内的开发工作流。
80
+ - 需要生成 spec 验收证据的 spec-driven 开发流程。
81
+
82
+ ## 不适用场景
83
+
84
+ - 需要任意远程 shell 访问的场景(PatchWarden 刻意不提供)。
85
+ - 需要读取或修改 `.env`、SSH key、浏览器状态等敏感文件的工作流。
86
+ - 需要 Agent 跨多个不受信任 workspace 自由移动的场景。
87
+ - 不接受命令允许列表约束的通用任务执行需求。
88
+
89
+ ## 目标用户
90
+
91
+ - 使用 ChatGPT 桌面端、Codex CLI、OpenCode 等 MCP 客户端的开发者。
92
+ - 在本地维护多个仓库并希望统一安全边界的维护者。
93
+ - 需要为 Agent 任务生成可审计证据的团队。
94
+ - 对 prompt injection 风险敏感、希望有执行前阻断机制的安全工程师。
95
+
96
+ ## 安全契约要点
97
+
98
+ PatchWarden 的安全契约(详见 `docs/threat-model.md`)包括:
99
+
100
+ - 不暴露通用远程 shell,不弱化精确命令匹配。
101
+ - 所有仓库路径保持在 `workspaceRoot` 下,阻断敏感名与越界改动。
102
+ - 不读取或持久化 token、cookie、浏览器状态、`.env`、SSH key、凭据文件。
103
+ - 不无差别 kill watcher 或 tunnel,仅监督 launcher 拥有的进程。
104
+ - 保留结构化任务证据、心跳状态、Git before/after 快照、改动文件记录与脱敏。
105
+
106
+ ## 下一步
107
+
108
+ - 阅读 `docs/threat-model.md` 了解完整威胁模型。
109
+ - 阅读 `docs/evidence-pack-schema.md` 了解证据包文件结构。
110
+ - 阅读 `docs/dashboard-overview.md` 了解 Control Center 工作流。
@@ -6,11 +6,13 @@
6
6
  "agents": {
7
7
  "codex": {
8
8
  "command": "codex",
9
- "args": ["exec", "--cd", "{repo}", "{prompt}"]
9
+ "args": ["exec", "--cd", "{repo}", "{prompt}"],
10
+ "envAllowlist": []
10
11
  },
11
12
  "opencode": {
12
13
  "command": "opencode",
13
- "args": ["run", "{prompt}"]
14
+ "args": ["run", "{prompt}"],
15
+ "envAllowlist": []
14
16
  }
15
17
  },
16
18
  "allowedTestCommands": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "patchwarden",
3
- "version": "1.5.0",
3
+ "version": "1.6.1",
4
4
  "description": "Secure local MCP bridge for ChatGPT and local agents, with workspace-scoped task loops, safe summaries, audits, and Direct editing.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,9 +12,12 @@
12
12
  },
13
13
  "files": [
14
14
  "dist/",
15
+ "!dist/test/",
15
16
  "docs/",
17
+ "!docs/archive/",
16
18
  "!docs/optimization-proposal.md",
17
19
  "src/",
20
+ "!src/test/",
18
21
  "examples/",
19
22
  "scripts/",
20
23
  "!scripts/control/kill-patchwarden.ps1",
@@ -22,18 +25,14 @@
22
25
  "!.local/",
23
26
  "ui/",
24
27
  "PatchWarden.cmd",
25
- "PatchWarden-Control.cmd",
26
- "PatchWarden-Control-Tray.cmd",
27
- "PatchWarden-Desktop.cmd",
28
- "Restart-PatchWarden-Control.cmd",
29
- "Stop-PatchWarden.cmd",
30
28
  "README.md",
31
29
  "README.en.md",
32
30
  "LICENSE",
33
31
  "tsconfig.json"
34
32
  ],
35
33
  "scripts": {
36
- "build": "node ./node_modules/typescript/bin/tsc",
34
+ "build": "node scripts/build.js",
35
+ "check:build-output": "node scripts/checks/build-output-check.js",
37
36
  "start": "node dist/index.js",
38
37
  "start:http": "node dist/httpServer.js",
39
38
  "start:control": "node dist/controlCenter.js",
@@ -43,7 +42,7 @@
43
42
  "doctor": "node dist/doctor.js",
44
43
  "doctor:ci": "node dist/doctor.js --allow-default-config",
45
44
  "test:unit": "node scripts/checks/unit-tests.js",
46
- "test": "node dist/smoke-test.js && node scripts/checks/unit-tests.js && node scripts/checks/lifecycle-smoke.js && node scripts/checks/doctor-smoke.js && node scripts/checks/tunnel-supervisor-smoke.js && node scripts/checks/watcher-supervisor-smoke.js && node scripts/checks/control-smoke.js && node scripts/checks/mcp-manifest-check.js && node scripts/checks/brand-check.js && node scripts/checks/control-center-smoke.js",
45
+ "test": "node scripts/checks/build-output-check.js && node dist/smoke-test.js && node scripts/checks/unit-tests.js && node scripts/checks/lifecycle-smoke.js && node scripts/checks/doctor-smoke.js && node scripts/checks/tunnel-supervisor-smoke.js && node scripts/checks/watcher-supervisor-smoke.js && node scripts/checks/control-smoke.js && node scripts/checks/mcp-manifest-check.js && node scripts/checks/brand-check.js && node scripts/checks/control-center-smoke.js",
47
46
  "test:lifecycle": "npm run build && node scripts/checks/lifecycle-smoke.js",
48
47
  "test:doctor": "npm run build && node scripts/checks/doctor-smoke.js",
49
48
  "test:tunnel-supervisor": "npm run build && node scripts/checks/tunnel-supervisor-smoke.js",
@@ -53,18 +52,36 @@
53
52
  "check:search-tool-manifest": "npm run build && node scripts/checks/mcp-manifest-check.js --profile chatgpt_search",
54
53
  "check:brand": "node scripts/checks/brand-check.js",
55
54
  "test:mcp": "npm run build && node scripts/checks/mcp-smoke.js",
55
+ "test:mcp:built": "node scripts/checks/mcp-smoke.js",
56
56
  "test:http-mcp": "npm run build && node scripts/checks/http-mcp-smoke.js",
57
+ "test:http-mcp:built": "node scripts/checks/http-mcp-smoke.js",
57
58
  "pretest": "npm run build",
58
59
  "pack:clean": "npm run build && node scripts/release/pack-clean.js",
59
- "verify:package": "npm run build && node scripts/checks/package-manifest-check.js"
60
+ "pack:clean:built": "node scripts/release/pack-clean.js",
61
+ "verify:package": "npm run build && node scripts/checks/package-manifest-check.js",
62
+ "verify:package:built": "node scripts/checks/package-manifest-check.js",
63
+ "desktop:install": "npm.cmd --prefix desktop install --cache ..\\.npm-cache",
64
+ "desktop:test": "npm.cmd --prefix desktop test",
65
+ "desktop:smoke:unpacked": "npm.cmd --prefix desktop run smoke:unpacked --",
66
+ "desktop:stage": "npm run build && npm.cmd --prefix desktop run stage",
67
+ "desktop:dev": "npm run build && npm.cmd --prefix desktop run dev",
68
+ "desktop:package:dir": "npm run build && npm.cmd --prefix desktop run build:dir",
69
+ "desktop:package": "npm run build && npm.cmd --prefix desktop run build",
70
+ "desktop:preflight": "node scripts/release/desktop-preflight.js",
71
+ "desktop:preflight:release": "node scripts/release/desktop-preflight.js --require-clean"
60
72
  },
61
73
  "dependencies": {
62
- "@modelcontextprotocol/sdk": "^1.0.0"
74
+ "@modelcontextprotocol/sdk": "^1.29.0"
63
75
  },
64
76
  "devDependencies": {
65
- "@types/node": "^20.0.0",
77
+ "@types/node": "^26.1.0",
66
78
  "typescript": "^6.0.3"
67
79
  },
80
+ "overrides": {
81
+ "@hono/node-server": "2.0.11",
82
+ "hono": "4.12.31",
83
+ "fast-uri": "4.1.1"
84
+ },
68
85
  "engines": {
69
86
  "node": ">=18.0.0"
70
87
  },
package/scripts/README.md CHANGED
@@ -4,13 +4,18 @@ This directory keeps implementation scripts out of the root folder. Normal
4
4
  desktop use should start from the root entrypoints:
5
5
 
6
6
  ```powershell
7
- .\PatchWarden-Desktop.cmd
8
- .\PatchWarden-Control.cmd
9
- .\PatchWarden-Control-Tray.cmd --foreground
10
- .\Stop-PatchWarden.cmd
7
+ .\scripts\launchers\PatchWarden-Desktop.cmd
8
+ .\scripts\launchers\PatchWarden-Control.cmd
9
+ .\scripts\launchers\PatchWarden-Control-Tray.cmd --foreground
10
+ .\scripts\launchers\Stop-PatchWarden.cmd
11
11
  .\PatchWarden.cmd status all
12
12
  ```
13
13
 
14
+ The installable Windows desktop shell is built separately with
15
+ `npm.cmd run desktop:package`. It preserves these source/npm entrypoints and
16
+ uses the same Control Center API rather than adding another process-management
17
+ surface. See `docs/desktop-app.md`.
18
+
14
19
  ## Control Scripts
15
20
 
16
21
  - `control/manage-patchwarden.ps1`: backing implementation for `PatchWarden.cmd`.
@@ -34,11 +39,15 @@ desktop use should start from the root entrypoints:
34
39
  - `checks/mcp-manifest-check.js`: validates MCP manifest expectations.
35
40
  - `brand-check.js`: checks public brand strings.
36
41
  - `checks/package-manifest-check.js`: verifies package contents.
42
+ - `checks/build-output-check.js`: verifies clean-output confinement and exact recursive unit-test compilation.
43
+ - `release/desktop-preflight.js`: builds an isolated Windows directory package and writes a bounded preflight receipt.
37
44
 
38
45
  ## Release Helpers
39
46
 
40
- - `release/pack-clean.js`: rebuilds `release/`, `patchwarden-release.tar.gz`, and the
41
- versioned `PatchWarden-v*.zip` artifact.
47
+ - `release/pack-clean.js`: rebuilds the isolated `release/package/` staging
48
+ directory, `patchwarden-release.tar.gz`, and the versioned
49
+ `PatchWarden-v*.zip` artifact. Desktop and preflight siblings under
50
+ `release/` are preserved.
42
51
 
43
52
  ## Compatibility Launchers
44
53
 
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { cleanGeneratedOutput } from "./lib/clean-generated-output.js";
5
+
6
+ const root = resolve(fileURLToPath(new URL("..", import.meta.url)));
7
+ const dist = resolve(root, "dist");
8
+
9
+ cleanGeneratedOutput(root, dist);
10
+ process.chdir(root);
11
+ await import("../node_modules/typescript/lib/tsc.js");
@@ -12,6 +12,9 @@ const allowedLegacyFiles = new Set([
12
12
  "docs/release-v0.3.0.md",
13
13
  "docs/release-v0.4.0.md",
14
14
  "docs/release-v0.6.0.md",
15
+ "docs/archive/releases/release-v0.6.0.md",
16
+ "docs/archive/releases/release-v0.6.1.md",
17
+ "docs/archive/releases/release-v0.6.4.md",
15
18
  "scripts/checks/brand-check.js",
16
19
  "scripts/release/pack-clean.js",
17
20
  ]);