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
package/PatchWarden.cmd CHANGED
@@ -3,6 +3,37 @@ setlocal EnableExtensions
3
3
  chcp 65001 >nul
4
4
  cd /d "%~dp0"
5
5
 
6
+ set "LAUNCHERS_DIR=%~dp0scripts\launchers"
7
+ set "PATCHWARDEN_COMMAND=%~1"
8
+
9
+ if /i "%PATCHWARDEN_COMMAND%"=="control" goto dispatch_control
10
+ if /i "%PATCHWARDEN_COMMAND%"=="desktop" goto dispatch_desktop
11
+ if /i "%PATCHWARDEN_COMMAND%"=="tray" goto dispatch_tray
12
+ if /i "%PATCHWARDEN_COMMAND%"=="stop" goto dispatch_stop
13
+ if /i "%PATCHWARDEN_COMMAND%"=="restart-control" goto dispatch_restart_control
14
+ goto default_behavior
15
+
16
+ :dispatch_control
17
+ call "%LAUNCHERS_DIR%\PatchWarden-Control.cmd" %2 %3 %4 %5 %6 %7 %8 %9
18
+ exit /b %ERRORLEVEL%
19
+
20
+ :dispatch_desktop
21
+ call "%LAUNCHERS_DIR%\PatchWarden-Desktop.cmd" %2 %3 %4 %5 %6 %7 %8 %9
22
+ exit /b %ERRORLEVEL%
23
+
24
+ :dispatch_tray
25
+ call "%LAUNCHERS_DIR%\PatchWarden-Control-Tray.cmd" %2 %3 %4 %5 %6 %7 %8 %9
26
+ exit /b %ERRORLEVEL%
27
+
28
+ :dispatch_stop
29
+ call "%LAUNCHERS_DIR%\Stop-PatchWarden.cmd" %2 %3 %4 %5 %6 %7 %8 %9
30
+ exit /b %ERRORLEVEL%
31
+
32
+ :dispatch_restart_control
33
+ call "%LAUNCHERS_DIR%\Restart-PatchWarden-Control.cmd" %2 %3 %4 %5 %6 %7 %8 %9
34
+ exit /b %ERRORLEVEL%
35
+
36
+ :default_behavior
6
37
  set "DEFAULT_PROXY=http://127.0.0.1:7892"
7
38
 
8
39
  if not defined PATCHWARDEN_PROXY_URL (
@@ -20,8 +51,7 @@ set "HTTPS_PROXY=%PATCHWARDEN_PROXY_URL%"
20
51
  set "ALL_PROXY=%PATCHWARDEN_PROXY_URL%"
21
52
  set "NO_PROXY=localhost,127.0.0.1,::1"
22
53
 
23
- set "SCRIPTS_DIR=%~dp0scripts\control"
24
- set "MANAGER=%SCRIPTS_DIR%\manage-patchwarden.ps1"
54
+ set "MANAGER=%~dp0scripts\control\manage-patchwarden.ps1"
25
55
 
26
56
  if not exist "%MANAGER%" (
27
57
  echo [error] manage-patchwarden.ps1 not found:
package/README.en.md CHANGED
@@ -8,9 +8,7 @@
8
8
  [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D18-339933.svg)](https://nodejs.org/)
9
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
10
10
 
11
- Current source version: **v1.5.0**. See the
12
- [CHANGELOG](CHANGELOG.md), [migration guide](docs/migration-from-safe-bifrost.md), and
13
- [release checklist](docs/release-checklist.md). Verify GitHub Release / npm publication separately before release.
11
+ **Let an MCP client such as ChatGPT or Codex plan and review the work while a local coding agent executes inside explicit safety boundaries and leaves auditable evidence.**
14
12
 
15
13
  PatchWarden is a local-first MCP safety and verification layer for AI coding
16
14
  agents, with workspace confinement, command allowlists, scope-violation
@@ -21,7 +19,21 @@ PatchWarden stores that plan as a workspace-scoped task, lets a preconfigured
21
19
  local agent execute it, and returns results, diffs, artifact manifests, and
22
20
  independent verification evidence.
23
21
 
24
- ![PatchWarden ChatGPT connector demo](docs/assets/patchwarden-chatgpt-demo.svg)
22
+ [Download Windows installer v1.6.0](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Setup-1.6.0-x64.exe)
23
+ · [Portable ZIP](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Portable-1.6.0-x64.zip)
24
+ · [Checksums](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Desktop-SHA256SUMS.txt)
25
+ · [Three-minute quick start](#three-minute-quick-start)
26
+ · [Discussions](https://github.com/jiezeng2004-design/PatchWarden/discussions)
27
+
28
+ ![Real PatchWarden Desktop first-run screen](docs/assets/patchwarden-desktop-onboarding.png)
29
+
30
+ <sub>Real PatchWarden Desktop first-run UI from a privacy-safe smoke run; no real workspace, account, or credential data is shown.</sub>
31
+
32
+ Current source version: **v1.6.1**; current Windows Release: **v1.6.0**; npm
33
+ `latest`: **v1.5.1**. Use the installer above for the first Windows experience;
34
+ pin an actually published version for npm/CLI use. See the
35
+ [CHANGELOG](CHANGELOG.md), [migration guide](docs/migration-from-safe-bifrost.md), and
36
+ [release checklist](docs/release-checklist.md).
25
37
 
26
38
  > [!IMPORTANT]
27
39
  > PatchWarden is not a general-purpose remote shell. MCP clients cannot run
@@ -36,7 +48,7 @@ independent verification evidence.
36
48
  - [Evidence example](#evidence-example)
37
49
  - [Runtime architecture](#runtime-architecture)
38
50
  - [Requirements](#requirements)
39
- - [Five-minute quick start](#five-minute-quick-start)
51
+ - [Three-minute quick start](#three-minute-quick-start)
40
52
  - [Complete configuration guide](#complete-configuration-guide)
41
53
  - [Connect OpenCode](#connect-opencode)
42
54
  - [Connect Codex](#connect-codex)
@@ -46,6 +58,7 @@ independent verification evidence.
46
58
  - [HTTP MCP mode](#http-mcp-mode)
47
59
  - [Diagnostics and health checks](#diagnostics-and-health-checks)
48
60
  - [Lessons learned and troubleshooting](#lessons-learned-and-troubleshooting)
61
+ - [Ecosystem guides](#ecosystem-guides)
49
62
  - [Security boundaries and local data](#security-boundaries-and-local-data)
50
63
  - [Upgrading and migration](#upgrading-and-migration)
51
64
  - [Development and release verification](#development-and-release-verification)
@@ -60,12 +73,13 @@ PatchWarden uses a narrower, auditable task channel:
60
73
  - Every task must specify a `repo_path` inside `workspaceRoot`.
61
74
  - Agent launch commands come from local configuration, not model input.
62
75
  - Verification commands must exactly match `allowedTestCommands`.
63
- - Every completed task records structured results, a full diff, file
76
+ - Every completed task records structured results, a bounded and redacted diff, file
64
77
  statistics, and independent verification output.
65
78
  - Changes outside the requested repository cause a scope violation instead of
66
79
  being silently accepted.
67
- - Sensitive paths such as `.env` files, tokens, SSH keys, cookies, and
68
- credential stores are blocked by default.
80
+ - `.patchwarden/` is not a sensitive-path exemption. Names such as `.env`
81
+ files, tokens, SSH keys, cookies, and credential stores remain blocked at
82
+ every directory depth.
69
83
 
70
84
  Good use cases:
71
85
 
@@ -109,7 +123,7 @@ A completed task writes bounded, reviewable artifacts under
109
123
  - `result.json` - final status, verification status, changed-file groups, and warnings.
110
124
  - `artifact_manifest.json` - generated artifacts with size, type, and SHA-256.
111
125
  - `verify.json` - exact verification commands and exit codes.
112
- - `diff.patch` - complete source diff when Git evidence is available.
126
+ - `diff.patch` - up to 20 MiB of redacted source diff when Git evidence is available; truncation is explicit.
113
127
  - `rollback_scope_violation_plan.md` - review plan when a task changes files outside `repo_path`.
114
128
 
115
129
  Example compact evidence:
@@ -217,9 +231,37 @@ If `where.exe codex` only returns the Codex Desktop executable under
217
231
  WindowsApps, it may not be a callable Codex CLI. Install or point to the real
218
232
  CLI, or configure OpenCode as the execution agent.
219
233
 
220
- ## Five-minute quick start
234
+ ## Three-minute quick start
221
235
 
222
- ### Option A: run from source (recommended)
236
+ If Node.js 18+ and at least one local coding agent are already installed, this
237
+ Windows path is designed to reach its first read-only health check in about
238
+ three minutes. A ChatGPT Tunnel is not required for this first run.
239
+
240
+ ### Option A: Windows installer (recommended for a first run)
241
+
242
+ 1. Download the [Windows installer v1.6.0](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Setup-1.6.0-x64.exe)
243
+ and its [SHA256 checksum file](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Desktop-SHA256SUMS.txt).
244
+ 2. Verify the installer in PowerShell:
245
+
246
+ ```powershell
247
+ Get-FileHash .\PatchWarden-Setup-1.6.0-x64.exe -Algorithm SHA256
248
+ ```
249
+
250
+ The current published value is `77d655545925ae283a0caed0fff12554debac15b54c5decf1ae8f3867703058e`;
251
+ always prefer the checksum file from the same Release. The installer is not
252
+ code-signed yet, so Windows SmartScreen may show an unknown-publisher warning.
253
+
254
+ 3. Install and open PatchWarden Desktop, then choose a dedicated workspace that
255
+ contains only your projects.
256
+ 4. Select **Local MCP** on the first screen, review the detected agent, and let
257
+ the read-only health check finish.
258
+
259
+ Success means the onboarding flow reaches the read-only console, shows the
260
+ selected workspace, and completes the agent/runtime checks. Share a successful
261
+ install or a blocked step in [Discussions](https://github.com/jiezeng2004-design/PatchWarden/discussions),
262
+ including your OS, Node.js version, agent, and the step where you stopped.
263
+
264
+ ### Option B: run from source (developer workflow)
223
265
 
224
266
  Source mode is the easiest way to use the Watcher, Windows launchers, and
225
267
  diagnostic scripts together.
@@ -256,7 +298,7 @@ npm.cmd run watch
256
298
  Keep this window open, then configure OpenCode, Codex, or ChatGPT as described
257
299
  below.
258
300
 
259
- ### Option B: use the npm package
301
+ ### Option C: use the npm package
260
302
 
261
303
  The npm package is convenient for launching a pinned MCP server. Task
262
304
  execution still requires a separate Watcher.
@@ -299,11 +341,13 @@ Recommended Windows example:
299
341
  "agents": {
300
342
  "opencode": {
301
343
  "command": "opencode",
302
- "args": ["run", "{prompt}"]
344
+ "args": ["run", "{prompt}"],
345
+ "envAllowlist": []
303
346
  },
304
347
  "codex": {
305
348
  "command": "codex",
306
- "args": ["exec", "--cd", "{repo}", "{prompt}"]
349
+ "args": ["exec", "--cd", "{repo}", "{prompt}"],
350
+ "envAllowlist": []
307
351
  }
308
352
  },
309
353
  "allowedTestCommands": [
@@ -332,6 +376,7 @@ Configuration fields:
332
376
  | `tasksDir` | Yes | Task and result directory, normally `.patchwarden/tasks`. |
333
377
  | `toolProfile` | No | `full`, `chatgpt_core`, `chatgpt_direct`, or `chatgpt_search`; use `full` for local clients and `chatgpt_search` for compact discovery-driven clients. |
334
378
  | `agents` | Yes | Execution-agent allowlist; supports `{repo}` and `{prompt}` placeholders. |
379
+ | `agents.<name>.envAllowlist` | No | Provider environment variable names explicitly forwarded to that agent; none are inherited by default. Tunnel and HTTP owner credentials are always blocked. |
335
380
  | `allowedTestCommands` | Yes | Exact allowlist for independent verification commands. |
336
381
  | `repoAllowedTestCommands` | No | Extra exact commands keyed by workspace-relative repository path; wildcards are unsupported. |
337
382
  | `maxReadFileBytes` | Yes | Maximum bytes returned by one MCP file read. |
@@ -348,12 +393,17 @@ Important configuration rules:
348
393
  - If you use backslashes, escape them as `D:\\path\\to\\project`.
349
394
  - Do not set `workspaceRoot` to a drive root, home directory, Desktop,
350
395
  Downloads, or Documents.
396
+ - Configuration loading fails closed when `workspaceRoot` is missing,
397
+ inaccessible, not a directory, or one of those unsafe broad roots.
351
398
  - `plansDir` and `tasksDir` are resolved relative to `workspaceRoot`.
352
399
  - `repo_path` must stay inside `workspaceRoot` and cannot escape with `..`.
353
400
  - `allowedTestCommands` uses exact matching; similar commands are not
354
401
  automatically authorized.
355
402
  - Repository-specific commands come only from trusted local configuration;
356
403
  a target repository cannot authorize itself through `package.json`.
404
+ - Every execution agent must be explicitly registered. Provider credentials or
405
+ proxy variables are forwarded only when their names appear in that agent's
406
+ `envAllowlist`; owner credentials cannot be allow-listed.
357
407
  - Configuration may contain private paths and should not be committed.
358
408
 
359
409
  Set the configuration path:
@@ -462,11 +512,26 @@ configured under `agents` is available.
462
512
 
463
513
  ## Connect ChatGPT
464
514
 
515
+ > The current ChatGPT terms are **developer-mode app / Plugins**. Older docs and UI builds called this a Connector.
516
+
517
+ ### Eight-step desktop setup
518
+
519
+ 1. Confirm that the OpenAI Platform account has Tunnel access and enable developer mode in the target ChatGPT workspace.
520
+ 2. Open [Platform Tunnel settings](https://platform.openai.com/settings/organization/tunnels), create a Tunnel, and associate the target ChatGPT workspace.
521
+ 3. Start PatchWarden Desktop and detect or choose an existing `tunnel-client.exe` under **Settings → MCP and Tunnel**. The app never downloads or executes new software automatically.
522
+ 4. Enter the Core Tunnel ID and the dedicated Tunnel runtime API key. This credential is used as `CONTROL_PLANE_API_KEY`; it is **not** the `OPENAI_API_KEY` used by ordinary applications.
523
+ 5. Select environment proxy, no proxy, or a credential-free HTTP/HTTPS/SOCKS5 (Mixed) proxy, then confirm that its port is reachable.
524
+ 6. Choose **Configure and verify Core**. Desktop initializes the `patchwarden` profile, runs `tunnel-client doctor --explain --json`, and saves the credential with Windows DPAPI only after validation succeeds; then start Core.
525
+ 7. On **Getting Started**, confirm Tunnel ready and Watcher healthy, and verify that `chatgpt_core` exposes the fixed 26-tool catalog. Direct is optional; when disabled, Start All starts Core and reports Direct as skipped.
526
+ 8. In ChatGPT **Settings → Plugins**, create a developer-mode app and choose the Tunnel. Reconnect it, open a new chat, and call `health_check`.
527
+
528
+ The first-run wizard also offers **Local MCP**. That route configures the safe workspace and a local MCP client, and can skip the Platform/ChatGPT Tunnel portions of steps 1, 2, 4, 5, 7, and 8.
529
+
465
530
  Recommended Windows path:
466
531
 
467
532
  ```text
468
533
  ChatGPT Web
469
- → ChatGPT Connector
534
+ → ChatGPT developer-mode app / Plugins (formerly Connector)
470
535
  → OpenAI Secure MCP Tunnel
471
536
  → PatchWarden stdio MCP
472
537
  → Watcher
@@ -511,7 +576,7 @@ Runtime status is stored under:
511
576
  This directory contains PIDs, health state, and redacted diagnostics. It must
512
577
  not contain the API key or Tunnel ID.
513
578
 
514
- When creating the ChatGPT Connector:
579
+ When creating the ChatGPT developer-mode app in Plugins:
515
580
 
516
581
  - Select the tunnel **Channel**.
517
582
  - Choose **None** for authentication unless you implemented OAuth.
@@ -686,13 +751,20 @@ mean the task is wrong.
686
751
  | `progress.md` | Progress reported by the agent. |
687
752
  | `result.md` | Human-readable execution report. |
688
753
  | `result.json` | Structured result, paths, changes, warnings, and next steps. |
689
- | `diff.patch` | Complete task change evidence. |
754
+ | `diff.patch` | Up to 20 MiB of task change evidence; credential-like values are redacted before persistence and truncation is explicit. |
690
755
  | `artifact_manifest.json` | Generated artifact paths, types, sizes, and SHA-256 hashes. |
691
756
  | `file-stats.json` | Per-file addition and deletion statistics. |
692
757
  | `verify.json` | Structured record for every independent verification command. |
693
758
  | `verify.log` | Human-readable independent verification output. |
694
759
  | `test.log` | Test output captured during agent execution. |
695
760
 
761
+ Client-facing task artifact reads are limited by `maxReadFileBytes`; diff,
762
+ summary, and log-tail surfaces read bounded prefixes or suffixes. `audit_task`
763
+ scans at most 200 Markdown files and 4 MiB of documentation and returns a
764
+ warning when that budget is reached. Persistent invocation and reconciliation
765
+ logs use cross-process locked, bounded append and retain recent content with an
766
+ explicit truncation marker when full.
767
+
696
768
  An agent saying “published” or “pushed” is not reliable remote evidence.
697
769
  Verify GitHub, npm, tags, and releases against the live platform state.
698
770
 
@@ -777,10 +849,51 @@ available from PowerShell:
777
849
  .\PatchWarden.cmd restart all
778
850
  .\PatchWarden.cmd status all
779
851
  .\PatchWarden.cmd kill all
780
- .\Stop-PatchWarden.cmd
852
+ .\scripts\launchers\Stop-PatchWarden.cmd
781
853
  ```
782
854
 
783
- For daily desktop use, start with `PatchWarden-Desktop.cmd`; it starts the tray and keeps Control Center available without opening extra browser windows. Use `PatchWarden-Control-Tray.cmd --foreground` only for tray debugging, `PatchWarden-Control.cmd` for the full local Web dashboard, and `Stop-PatchWarden.cmd` for one-click shutdown of Core/Direct, Control Center, and the tray.
855
+ For daily desktop use, start with `scripts\launchers\PatchWarden-Desktop.cmd`; it starts the tray and keeps Control Center available without opening extra browser windows. Use `scripts\launchers\PatchWarden-Control-Tray.cmd --foreground` only for tray debugging, `scripts\launchers\PatchWarden-Control.cmd` for the full local Web dashboard, and `scripts\launchers\Stop-PatchWarden.cmd` for one-click shutdown of Core/Direct, Control Center, and the tray.
856
+
857
+ ### Windows installer
858
+
859
+ PatchWarden Desktop ships as an installer and a no-install ZIP. It provides an Electron window,
860
+ first-run workspace setup, a system tray, and desktop settings while reusing
861
+ the same loopback Control Center and bounded control APIs. Electron and builder
862
+ dependencies remain isolated in the private `desktop/` package and are not
863
+ included in the public `patchwarden` npm package.
864
+
865
+ The installer still requires Windows x64, Node.js 18+, and tunnel-client. The
866
+ first run performs bounded discovery through `PATH`, current-user locations,
867
+ and the area next to the workspace. If it is missing, the read-only console
868
+ remains available and **Settings > MCP and tunnel** provides a dedicated file
869
+ picker plus SHA256 guidance. The app never downloads or runs new software
870
+ automatically. Settings also exposes the explicit Direct switch and
871
+ environment, none, or manual proxy modes; manual URLs support only http,
872
+ https, or socks5 without embedded credentials. Start/restart reports success
873
+ only after health/ready and the Core watcher have been verified.
874
+ Desktop supports Codex, OpenCode, Claude Code, Gemini CLI, GitHub Copilot CLI,
875
+ Qwen Code, Kimi Code, and Aider. It reads only model fields from agent settings,
876
+ never credentials.
877
+
878
+ ```powershell
879
+ npm.cmd install --prefix desktop --cache .\.npm-cache
880
+ npm.cmd run desktop:test
881
+ npm.cmd run desktop:preflight
882
+ npm.cmd run desktop:package
883
+ ```
884
+
885
+ The installer, portable ZIP, and SHA256 file are written to `release\desktop`. The first
886
+ release is unsigned and has no automatic updater, so Windows SmartScreen may
887
+ show an unknown-publisher warning. Verify the GitHub Release source and SHA256.
888
+ See [docs/desktop-app.md](docs/desktop-app.md) for installation, runtime, and
889
+ uninstall details.
890
+
891
+ `desktop:preflight` uses a unique output directory for clean builds, complete
892
+ unit and desktop tests, npm package-surface validation, an Electron directory
893
+ package, an isolated 26-tool runtime check, and unpacked UI/single-instance
894
+ smoke evidence. It writes `preflight-report.json` and `preflight-report.md`.
895
+ Before release, run `npm.cmd run desktop:preflight:release` from a clean
896
+ checkout; it rejects any uncommitted path.
784
897
 
785
898
  The old single-purpose launchers remain under `scripts/launchers/` as a
786
899
  compatibility layer. Personal launchers live under `.local/launchers/` and
@@ -845,6 +958,31 @@ It stops only this project's launchers and Watcher plus `tunnel-client.exe`
845
958
  processes that exactly match the selected profile. It does not globally
846
959
  terminate unrelated PatchWarden, OpenCode, or Codex instances.
847
960
 
961
+ ## Dashboard pages and recommended workflow
962
+
963
+ The PatchWarden Dashboard (Control Center) provides these main pages:
964
+
965
+ - **Dashboard**: System overview, including Repo selector, Health Score, service status, Release card, Project Policy, Lineage, Evidence Pack, stale task hints, recent task list, and system status (with Copy diagnostics).
966
+ - **Tasks**: Task list, filterable by repo_path / status / acceptance_status / warning type / agent / date range. Each row offers safe_result / safe_audit / safe_test_summary / safe_diff_summary quick actions.
967
+ - **Task Detail**: Defaults to a safe summary (safe_result / safe_test_summary / safe_diff_summary / safe_audit). Full result / diff / test log live in a collapsed advanced section and load on demand.
968
+ - **Direct Sessions**: Grouped by active / finalized / audited / expired, with safe_direct_summary / safe_finalize_direct_session / safe_audit_direct_session quick actions.
969
+ - **Audit / Warnings**: Aggregated by warning type, showing affected tasks / severity / recommended action.
970
+ - **Workspace**: First-level workspace directories and project list.
971
+ - **Logs**: Tails of Core / Direct / Watcher / Control Center logs.
972
+
973
+ Recommended workflow:
974
+
975
+ 1. Select the target repo at the top of the Dashboard.
976
+ 2. Check the Health Score to confirm system health.
977
+ 3. Click safe_result on a recent task row to view the task summary.
978
+ 4. Open Task Detail for safe-first acceptance; expand the advanced section only when you need the full logs.
979
+ 5. Use Lineage Detail to inspect why a run_task_loop succeeded or failed.
980
+ 6. Export the Evidence Pack after acceptance.
981
+ 7. Use Direct sessions for independent verification, then finalize + audit.
982
+ 8. When something goes wrong, click Copy diagnostics and paste the output to ChatGPT / Codex / opencode for triage.
983
+
984
+ > See [docs/dashboard-overview.md](docs/dashboard-overview.md), [docs/task-safe-review-workflow.md](docs/task-safe-review-workflow.md), [docs/lineage-evidence-pack-workflow.md](docs/lineage-evidence-pack-workflow.md), and [docs/direct-session-workflow.md](docs/direct-session-workflow.md) for details.
985
+
848
986
  ## Lessons learned and troubleshooting
849
987
 
850
988
  ### Quick reference
@@ -976,6 +1114,13 @@ creation. `export_task_evidence_pack` writes bounded `evidence.json` and
976
1114
  `EVIDENCE.md` files under `.patchwarden/evidence-packs/<lineage_id>/` without
977
1115
  stdout/stderr tails, full diffs, verification logs, or sensitive file content.
978
1116
 
1117
+ Goal Session state changes are serialized by a shared cross-process mutation
1118
+ lock and committed atomically. A non-empty Goal automatically becomes
1119
+ `completed` after every subgoal is accepted. `create_subgoal_task` treats the
1120
+ Goal's stored `repo_path` as authoritative and rejects a caller-supplied mismatch
1121
+ with `goal_repo_mismatch`; isolated worktrees are created from that repository,
1122
+ and create/merge/discard share a repository lifecycle lock.
1123
+
979
1124
  `full` additionally provides:
980
1125
 
981
1126
  - `get_plan`
@@ -995,6 +1140,12 @@ session, read and search source files, apply hash-bound JSON patches, run
995
1140
  exactly allowlisted verification commands or a bounded verification bundle, finalize the evidence, and audit
996
1141
  the result without a local execution agent.
997
1142
 
1143
+ Direct patch and sync operations accept only size-bounded UTF-8 text, count
1144
+ patch limits in UTF-8 bytes, reject credential-like results, revalidate hashes
1145
+ immediately before replacement, and serialize patch/sync/verify/finalize/audit
1146
+ for each session. Direct still does not expose shell, delete, rename, commit,
1147
+ push, publish, or deployment operations.
1148
+
998
1149
  Enable it in the trusted local configuration while keeping the ordinary Core
999
1150
  profile unchanged:
1000
1151
 
@@ -1017,6 +1168,17 @@ the Watcher, and retains the existing DPAPI credential handling. In a fresh
1017
1168
  ChatGPT conversation, `health_check` should report `chatgpt_direct`, fourteen
1018
1169
  tools, and `direct_profile_enabled=true`.
1019
1170
 
1171
+ ## Ecosystem guides
1172
+
1173
+ - [Why PatchWarden](docs/why-patchwarden.md)
1174
+ - [Evidence Pack v2 schema](docs/evidence-pack-schema.md)
1175
+ - [Spec Kit integration](docs/spec-kit-integration.md)
1176
+ - [AgentSeal integration](docs/agentseal-integration.md)
1177
+ - [MCP Inspector testing](docs/mcp-inspector-testing.md)
1178
+ - [OpenCode worker integration](docs/opencode-worker.md)
1179
+ - [OpenHands worker integration](docs/openhands-worker.md)
1180
+ - [Threat model](docs/threat-model.md)
1181
+
1020
1182
  ## Security boundaries and local data
1021
1183
 
1022
1184
  Primary protections:
@@ -1025,9 +1187,10 @@ Primary protections:
1025
1187
  - Agent commands and argument templates must be configured in advance.
1026
1188
  - Verification commands must exactly match the allowlist.
1027
1189
  - File access is contained to `workspaceRoot`.
1028
- - Sensitive filenames and obvious credential-read plans are blocked.
1029
- - Secret-like values in task artifacts are redacted.
1030
- - HTTP mode binds only to `127.0.0.1`.
1190
+ - Sensitive filenames and obvious credential-read plans are blocked;
1191
+ `.patchwarden/` does not bypass this check.
1192
+ - Credential-like diff content is redacted before persistence and marks the task as a policy violation.
1193
+ - HTTP services bind only to `127.0.0.1` and reject non-loopback Host headers.
1031
1194
  - The Runner does not automatically commit, push, publish, or reset.
1032
1195
 
1033
1196
  Protect these local paths:
@@ -1116,12 +1279,17 @@ and release-asset checksums independently.
1116
1279
 
1117
1280
  ## Related documentation
1118
1281
 
1119
- - [v0.6.4 release notes](docs/release-v0.6.4.md)
1120
- - [v0.6.1 release notes](docs/release-v0.6.1.md)
1121
- - [v0.6.0 release notes](docs/release-v0.6.0.md)
1282
+ - [Windows Desktop installer](docs/desktop-app.md)
1283
+ - [v0.6.4 release notes](docs/archive/releases/release-v0.6.4.md)
1284
+ - [v0.6.1 release notes](docs/archive/releases/release-v0.6.1.md)
1285
+ - [v0.6.0 release notes](docs/archive/releases/release-v0.6.0.md)
1122
1286
  - [ChatGPT usage guide](docs/chatgpt-usage.md)
1123
1287
  - [Migration guide](docs/migration-from-safe-bifrost.md)
1124
1288
  - [ChatGPT Connector demo](docs/demo.md)
1289
+ - [Dashboard overview](docs/dashboard-overview.md)
1290
+ - [Task safe review workflow](docs/task-safe-review-workflow.md)
1291
+ - [Lineage and Evidence Pack workflow](docs/lineage-evidence-pack-workflow.md)
1292
+ - [Direct session workflow](docs/direct-session-workflow.md)
1125
1293
  - [OpenAI tunnel examples](examples/openai-tunnel/README.md)
1126
1294
  - [ChatGPT test prompt](examples/openai-tunnel/chatgpt-test-prompt.md)
1127
1295
 
@@ -1137,7 +1305,7 @@ and release-asset checksums independently.
1137
1305
  - [x] Release Gate (five-stage pre-release verification)
1138
1306
  - [x] Worktree isolation
1139
1307
  - [x] Multi-agent routing
1140
- - [ ] Local dashboard
1308
+ - [x] Local dashboard
1141
1309
 
1142
1310
  ## License
1143
1311