patchwarden 1.5.1 → 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 (573) hide show
  1. package/PatchWarden.cmd +32 -2
  2. package/README.en.md +152 -25
  3. package/README.md +120 -23
  4. package/dist/assessments/agentAssessor.js +21 -12
  5. package/dist/assessments/assessmentStore.js +42 -34
  6. package/dist/config.d.ts +15 -0
  7. package/dist/config.js +66 -13
  8. package/dist/control/fileManager.d.ts +2 -0
  9. package/dist/control/fileManager.js +39 -0
  10. package/dist/control/middleware/auth.d.ts +6 -0
  11. package/dist/control/middleware/auth.js +14 -5
  12. package/dist/control/middleware/static.js +16 -3
  13. package/dist/control/routeTable.d.ts +24 -0
  14. package/dist/control/routeTable.js +263 -0
  15. package/dist/control/routes/audit.js +17 -7
  16. package/dist/control/routes/evidence.js +1 -1
  17. package/dist/control/routes/lineage.js +1 -1
  18. package/dist/control/routes/process.d.ts +7 -0
  19. package/dist/control/routes/process.js +329 -42
  20. package/dist/control/routes/sessions.d.ts +9 -1
  21. package/dist/control/routes/sessions.js +84 -21
  22. package/dist/control/routes/status.d.ts +46 -1
  23. package/dist/control/routes/status.js +72 -15
  24. package/dist/control/routes/taskActions.js +24 -60
  25. package/dist/control/routes/tasks.d.ts +4 -0
  26. package/dist/control/routes/tasks.js +61 -62
  27. package/dist/control/routes/workspace.js +50 -23
  28. package/dist/control/runtime.d.ts +3 -2
  29. package/dist/control/runtime.js +63 -30
  30. package/dist/control/server.js +36 -365
  31. package/dist/control/shared.d.ts +25 -1
  32. package/dist/control/shared.js +64 -11
  33. package/dist/direct/directAudit.js +234 -225
  34. package/dist/direct/directGuards.d.ts +2 -1
  35. package/dist/direct/directGuards.js +42 -29
  36. package/dist/direct/directPatch.d.ts +6 -1
  37. package/dist/direct/directPatch.js +55 -8
  38. package/dist/direct/directSessionStore.d.ts +16 -6
  39. package/dist/direct/directSessionStore.js +127 -35
  40. package/dist/direct/directVerification.js +8 -16
  41. package/dist/doctor.js +62 -52
  42. package/dist/goal/acceptanceEngine.d.ts +1 -1
  43. package/dist/goal/goalProgress.js +75 -69
  44. package/dist/goal/goalReport.js +5 -12
  45. package/dist/goal/goalStatus.d.ts +2 -0
  46. package/dist/goal/goalStatus.js +10 -3
  47. package/dist/goal/goalStore.d.ts +9 -2
  48. package/dist/goal/goalStore.js +152 -45
  49. package/dist/goal/handoffExport.js +6 -6
  50. package/dist/goal/specKitImport.js +97 -96
  51. package/dist/goal/subgoalSync.js +11 -9
  52. package/dist/goal/worktreeManager.d.ts +2 -0
  53. package/dist/goal/worktreeManager.js +209 -136
  54. package/dist/httpServer.js +111 -32
  55. package/dist/logging.js +5 -3
  56. package/dist/policy/projectPolicy.js +5 -2
  57. package/dist/release/releaseGate.d.ts +1 -1
  58. package/dist/release/releaseGate.js +78 -25
  59. package/dist/runner/agentInvocation.d.ts +14 -0
  60. package/dist/runner/agentInvocation.js +96 -4
  61. package/dist/runner/changeCapture.d.ts +13 -5
  62. package/dist/runner/changeCapture.js +243 -61
  63. package/dist/runner/postTaskCleanup.js +48 -19
  64. package/dist/runner/processSecurity.d.ts +56 -0
  65. package/dist/runner/processSecurity.js +373 -0
  66. package/dist/runner/runTask.d.ts +1 -1
  67. package/dist/runner/runTask.js +115 -87
  68. package/dist/runner/simpleProcess.d.ts +3 -0
  69. package/dist/runner/simpleProcess.js +50 -36
  70. package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
  71. package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
  72. package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +1 -1
  73. package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
  74. package/dist/runner/taskStatusStore.d.ts +11 -0
  75. package/dist/runner/taskStatusStore.js +24 -0
  76. package/dist/runner/watch.d.ts +14 -1
  77. package/dist/runner/watch.js +256 -48
  78. package/dist/security/contentRedaction.js +2 -2
  79. package/dist/security/discoveryTokenStore.d.ts +3 -2
  80. package/dist/security/discoveryTokenStore.js +17 -2
  81. package/dist/security/loopbackHost.d.ts +2 -0
  82. package/dist/security/loopbackHost.js +16 -0
  83. package/dist/security/pathGuard.js +32 -17
  84. package/dist/security/planGuard.js +2 -1
  85. package/dist/security/runtimeGuard.js +9 -6
  86. package/dist/security/secretComparison.d.ts +3 -0
  87. package/dist/security/secretComparison.js +11 -0
  88. package/dist/security/sensitiveGuard.d.ts +5 -0
  89. package/dist/security/sensitiveGuard.js +27 -8
  90. package/dist/security/toolInvocationGuard.d.ts +2 -2
  91. package/dist/security/toolInvocationGuard.js +1 -1
  92. package/dist/security/workspaceRootGuard.d.ts +8 -0
  93. package/dist/security/workspaceRootGuard.js +47 -0
  94. package/dist/smoke-test.js +24 -23
  95. package/dist/tools/catalog/index.d.ts +4 -0
  96. package/dist/tools/catalog/index.js +4 -0
  97. package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
  98. package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
  99. package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +6 -15
  100. package/dist/tools/definitions/toolDefs.d.ts +18 -0
  101. package/dist/tools/definitions/toolDefs.js +1177 -0
  102. package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
  103. package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
  104. package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +1 -1
  105. package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +99 -29
  106. package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +6 -6
  107. package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +7 -7
  108. package/dist/tools/diagnostics/index.d.ts +6 -0
  109. package/dist/tools/diagnostics/index.js +6 -0
  110. package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
  111. package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
  112. package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +12 -8
  113. package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +23 -13
  114. package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
  115. package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
  116. package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +6 -6
  117. package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +1 -1
  118. package/dist/tools/direct/finalizeDirectSession.js +86 -0
  119. package/dist/tools/direct/index.d.ts +3 -0
  120. package/dist/tools/direct/index.js +3 -0
  121. package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
  122. package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
  123. package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
  124. package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
  125. package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
  126. package/dist/tools/discovery/index.d.ts +3 -0
  127. package/dist/tools/discovery/index.js +3 -0
  128. package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
  129. package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
  130. package/dist/tools/dispatch/coreDispatch.js +32 -31
  131. package/dist/tools/dispatch/diagnosticDispatch.d.ts +3 -5
  132. package/dist/tools/dispatch/diagnosticDispatch.js +70 -68
  133. package/dist/tools/dispatch/directDispatch.js +11 -10
  134. package/dist/tools/dispatch/goalDispatch.js +5 -4
  135. package/dist/tools/dispatch/releaseDispatch.js +3 -2
  136. package/dist/tools/dispatch/validation.d.ts +7 -0
  137. package/dist/tools/dispatch/validation.js +71 -0
  138. package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
  139. package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +1 -1
  140. package/dist/tools/goals/goalSubgoalTask.js +118 -0
  141. package/dist/tools/goals/index.d.ts +3 -0
  142. package/dist/tools/goals/index.js +3 -0
  143. package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
  144. package/dist/tools/registry.d.ts +7 -11
  145. package/dist/tools/registry.js +17 -1178
  146. package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
  147. package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
  148. package/dist/tools/release/index.d.ts +2 -0
  149. package/dist/tools/release/index.js +2 -0
  150. package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
  151. package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
  152. package/dist/tools/tasks/cancelTask.d.ts +11 -0
  153. package/dist/tools/tasks/cancelTask.js +85 -0
  154. package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +10 -2
  155. package/dist/tools/{createTask.js → tasks/createTask.js} +42 -27
  156. package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
  157. package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +8 -8
  158. package/dist/tools/{evidencePack.js → tasks/evidencePack.js} +34 -22
  159. package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
  160. package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
  161. package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +5 -5
  162. package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
  163. package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +33 -26
  164. package/dist/tools/tasks/index.d.ts +18 -0
  165. package/dist/tools/tasks/index.js +18 -0
  166. package/dist/tools/tasks/killTask.d.ts +1 -0
  167. package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
  168. package/dist/tools/{listTasks.js → tasks/listTasks.js} +3 -3
  169. package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +1 -1
  170. package/dist/tools/{reconcileTasks.js → tasks/reconcileTasks.js} +64 -66
  171. package/dist/tools/tasks/retryTask.js +60 -0
  172. package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
  173. package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +58 -30
  174. package/dist/tools/tasks/runVerification.js +38 -0
  175. package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
  176. package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
  177. package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
  178. package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
  179. package/dist/tools/workspace/applyPatch.js +53 -0
  180. package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
  181. package/dist/tools/workspace/index.d.ts +10 -0
  182. package/dist/tools/workspace/index.js +10 -0
  183. package/dist/tools/{listAgents.d.ts → workspace/listAgents.d.ts} +5 -0
  184. package/dist/tools/{listAgents.js → workspace/listAgents.js} +8 -4
  185. package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
  186. package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
  187. package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
  188. package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
  189. package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
  190. package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
  191. package/dist/tools/workspace/syncFile.js +134 -0
  192. package/dist/utils/atomicFile.d.ts +7 -0
  193. package/dist/utils/atomicFile.js +48 -0
  194. package/dist/utils/boundedFile.d.ts +8 -0
  195. package/dist/utils/boundedFile.js +93 -0
  196. package/dist/utils/lockedJsonFile.d.ts +15 -0
  197. package/dist/utils/lockedJsonFile.js +224 -0
  198. package/dist/utils/platform.d.ts +11 -0
  199. package/dist/utils/platform.js +26 -0
  200. package/dist/utils/stableJson.d.ts +2 -0
  201. package/dist/utils/stableJson.js +12 -0
  202. package/dist/version.d.ts +3 -2
  203. package/dist/version.js +3 -2
  204. package/dist/watcherStatus.d.ts +2 -2
  205. package/dist/watcherStatus.js +18 -0
  206. package/docs/CODE_WIKI.md +808 -143
  207. package/docs/architecture.md +15 -55
  208. package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
  209. package/docs/control-center/README.md +4 -4
  210. package/docs/dashboard-overview.md +4 -4
  211. package/docs/desktop-app.md +175 -0
  212. package/docs/evidence-pack-schema.md +3 -3
  213. package/docs/open-source-application.md +17 -11
  214. package/docs/release-checklist.md +1 -1
  215. package/docs/release-evidence.md +39 -29
  216. package/docs/task-safe-review-workflow.md +5 -5
  217. package/docs/threat-model.md +19 -1
  218. package/examples/config.example.json +4 -2
  219. package/package.json +27 -10
  220. package/scripts/README.md +15 -6
  221. package/scripts/build.js +11 -0
  222. package/scripts/checks/brand-check.js +3 -0
  223. package/scripts/checks/build-output-check.js +37 -0
  224. package/scripts/checks/control-center-smoke.js +91 -6
  225. package/scripts/checks/control-smoke.js +19 -8
  226. package/scripts/checks/http-mcp-smoke.js +82 -4
  227. package/scripts/checks/lifecycle-smoke.js +10 -10
  228. package/scripts/checks/mcp-manifest-check.js +1 -1
  229. package/scripts/checks/mcp-smoke.js +27 -3
  230. package/scripts/checks/package-manifest-check.js +20 -7
  231. package/scripts/checks/unit-tests.js +3 -5
  232. package/scripts/checks/watcher-supervisor-smoke.js +9 -0
  233. package/scripts/control/get-patchwarden-health.ps1 +1 -1
  234. package/scripts/control/manage-patchwarden.ps1 +69 -4
  235. package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
  236. package/scripts/control/run-background-supervisor.ps1 +41 -0
  237. package/scripts/control/start-patchwarden-tunnel.ps1 +126 -32
  238. package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
  239. package/scripts/launchers/PatchWarden-Control.cmd +6 -0
  240. package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
  241. package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
  242. package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
  243. package/scripts/lib/clean-generated-output.js +11 -0
  244. package/scripts/lib/file-discovery.js +12 -0
  245. package/scripts/release/desktop-preflight.js +211 -0
  246. package/scripts/release/pack-clean.js +59 -14
  247. package/src/assessments/agentAssessor.ts +26 -12
  248. package/src/assessments/assessmentStore.ts +52 -40
  249. package/src/config.ts +70 -13
  250. package/src/control/fileManager.ts +40 -0
  251. package/src/control/middleware/auth.ts +22 -4
  252. package/src/control/middleware/static.ts +16 -3
  253. package/src/control/routeTable.ts +301 -0
  254. package/src/control/routes/audit.ts +14 -6
  255. package/src/control/routes/evidence.ts +1 -1
  256. package/src/control/routes/lineage.ts +1 -1
  257. package/src/control/routes/process.ts +341 -40
  258. package/src/control/routes/sessions.ts +88 -25
  259. package/src/control/routes/status.ts +97 -17
  260. package/src/control/routes/taskActions.ts +24 -58
  261. package/src/control/routes/tasks.ts +66 -58
  262. package/src/control/routes/workspace.ts +56 -25
  263. package/src/control/runtime.ts +69 -33
  264. package/src/control/server.ts +36 -342
  265. package/src/control/shared.ts +77 -11
  266. package/src/direct/directAudit.ts +17 -9
  267. package/src/direct/directGuards.ts +72 -44
  268. package/src/direct/directPatch.ts +95 -8
  269. package/src/direct/directSessionStore.ts +211 -55
  270. package/src/direct/directVerification.ts +9 -23
  271. package/src/doctor.ts +73 -59
  272. package/src/goal/acceptanceEngine.ts +1 -1
  273. package/src/goal/goalProgress.ts +17 -13
  274. package/src/goal/goalReport.ts +5 -13
  275. package/src/goal/goalStatus.ts +19 -3
  276. package/src/goal/goalStore.ts +241 -54
  277. package/src/goal/handoffExport.ts +6 -6
  278. package/src/goal/specKitImport.ts +12 -12
  279. package/src/goal/subgoalSync.ts +11 -8
  280. package/src/goal/worktreeManager.ts +139 -22
  281. package/src/httpServer.ts +113 -30
  282. package/src/logging.ts +10 -3
  283. package/src/policy/projectPolicy.ts +5 -2
  284. package/src/release/releaseGate.ts +74 -27
  285. package/src/runner/agentInvocation.ts +126 -4
  286. package/src/runner/changeCapture.ts +291 -57
  287. package/src/runner/postTaskCleanup.ts +41 -17
  288. package/src/runner/processSecurity.ts +433 -0
  289. package/src/runner/runTask.ts +138 -91
  290. package/src/runner/simpleProcess.ts +66 -31
  291. package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
  292. package/src/{taskRuntime.ts → runner/taskRuntime.ts} +4 -3
  293. package/src/runner/taskStatusStore.ts +54 -0
  294. package/src/runner/watch.ts +281 -51
  295. package/src/security/contentRedaction.ts +2 -2
  296. package/src/security/discoveryTokenStore.ts +18 -4
  297. package/src/security/loopbackHost.ts +19 -0
  298. package/src/security/pathGuard.ts +35 -16
  299. package/src/security/planGuard.ts +2 -1
  300. package/src/security/runtimeGuard.ts +9 -6
  301. package/src/security/secretComparison.ts +13 -0
  302. package/src/security/sensitiveGuard.ts +27 -8
  303. package/src/security/toolInvocationGuard.ts +2 -2
  304. package/src/security/workspaceRootGuard.ts +53 -0
  305. package/src/smoke-test.ts +25 -24
  306. package/src/tools/catalog/index.ts +4 -0
  307. package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
  308. package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +7 -16
  309. package/src/tools/definitions/toolDefs.ts +1264 -0
  310. package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
  311. package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +99 -32
  312. package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +8 -8
  313. package/src/tools/diagnostics/index.ts +6 -0
  314. package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
  315. package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +27 -17
  316. package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
  317. package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +6 -6
  318. package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +7 -5
  319. package/src/tools/direct/index.ts +3 -0
  320. package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
  321. package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
  322. package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
  323. package/src/tools/discovery/index.ts +3 -0
  324. package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
  325. package/src/tools/dispatch/coreDispatch.ts +36 -31
  326. package/src/tools/dispatch/diagnosticDispatch.ts +26 -21
  327. package/src/tools/dispatch/directDispatch.ts +11 -10
  328. package/src/tools/dispatch/goalDispatch.ts +5 -4
  329. package/src/tools/dispatch/releaseDispatch.ts +3 -2
  330. package/src/tools/dispatch/validation.ts +78 -0
  331. package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
  332. package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +41 -26
  333. package/src/tools/goals/index.ts +3 -0
  334. package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
  335. package/src/tools/registry.ts +17 -1261
  336. package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
  337. package/src/tools/release/index.ts +2 -0
  338. package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
  339. package/src/tools/tasks/cancelTask.ts +109 -0
  340. package/src/tools/{createTask.ts → tasks/createTask.ts} +49 -26
  341. package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +8 -8
  342. package/src/tools/{evidencePack.ts → tasks/evidencePack.ts} +36 -22
  343. package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
  344. package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +7 -5
  345. package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
  346. package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +44 -33
  347. package/src/tools/tasks/index.ts +18 -0
  348. package/src/tools/{listTasks.ts → tasks/listTasks.ts} +4 -4
  349. package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +68 -66
  350. package/src/tools/tasks/retryTask.ts +69 -0
  351. package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +69 -34
  352. package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
  353. package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
  354. package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
  355. package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
  356. package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
  357. package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
  358. package/src/tools/workspace/index.ts +10 -0
  359. package/src/tools/{listAgents.ts → workspace/listAgents.ts} +11 -4
  360. package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
  361. package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
  362. package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
  363. package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
  364. package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
  365. package/src/tools/workspace/syncFile.ts +292 -0
  366. package/src/utils/atomicFile.ts +58 -0
  367. package/src/utils/boundedFile.ts +116 -0
  368. package/src/utils/lockedJsonFile.ts +251 -0
  369. package/src/utils/platform.ts +31 -0
  370. package/src/utils/stableJson.ts +12 -0
  371. package/src/version.ts +3 -2
  372. package/src/watcherStatus.ts +19 -1
  373. package/ui/desktop-bootstrap.js +11 -0
  374. package/ui/desktop-bridge.js +36 -0
  375. package/ui/desktop.css +160 -0
  376. package/ui/getting-started.js +93 -0
  377. package/ui/i18n.js +484 -0
  378. package/ui/log-parser.js +30 -0
  379. package/ui/pages/audit.html +12 -0
  380. package/ui/pages/dashboard.html +90 -147
  381. package/ui/pages/direct-sessions.html +123 -26
  382. package/ui/pages/getting-started.html +43 -0
  383. package/ui/pages/logs.html +105 -22
  384. package/ui/pages/settings.html +101 -0
  385. package/ui/pages/task-detail.html +12 -0
  386. package/ui/pages/tasks.html +54 -8
  387. package/ui/pages/workspace.html +38 -1
  388. package/ui/settings.js +245 -0
  389. package/PatchWarden-Control.cmd +0 -6
  390. package/Restart-PatchWarden-Control.cmd +0 -6
  391. package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
  392. package/dist/test/unit/acceptance-engine.test.js +0 -228
  393. package/dist/test/unit/agent-router.test.d.ts +0 -1
  394. package/dist/test/unit/agent-router.test.js +0 -287
  395. package/dist/test/unit/android-doctor.test.d.ts +0 -1
  396. package/dist/test/unit/android-doctor.test.js +0 -118
  397. package/dist/test/unit/apply-patch.test.d.ts +0 -1
  398. package/dist/test/unit/apply-patch.test.js +0 -225
  399. package/dist/test/unit/audit-checks.test.d.ts +0 -1
  400. package/dist/test/unit/audit-checks.test.js +0 -350
  401. package/dist/test/unit/chinese-path.test.d.ts +0 -1
  402. package/dist/test/unit/chinese-path.test.js +0 -91
  403. package/dist/test/unit/command-guard.test.d.ts +0 -1
  404. package/dist/test/unit/command-guard.test.js +0 -160
  405. package/dist/test/unit/create-task.test.d.ts +0 -1
  406. package/dist/test/unit/create-task.test.js +0 -197
  407. package/dist/test/unit/diagnose-task.test.d.ts +0 -1
  408. package/dist/test/unit/diagnose-task.test.js +0 -457
  409. package/dist/test/unit/direct-guards.test.d.ts +0 -1
  410. package/dist/test/unit/direct-guards.test.js +0 -328
  411. package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
  412. package/dist/test/unit/discovery-token-store.test.js +0 -139
  413. package/dist/test/unit/evidence-pack.test.d.ts +0 -1
  414. package/dist/test/unit/evidence-pack.test.js +0 -224
  415. package/dist/test/unit/get-task-status.test.d.ts +0 -1
  416. package/dist/test/unit/get-task-status.test.js +0 -174
  417. package/dist/test/unit/get-task-summary.test.d.ts +0 -1
  418. package/dist/test/unit/get-task-summary.test.js +0 -146
  419. package/dist/test/unit/goal-graph.test.d.ts +0 -1
  420. package/dist/test/unit/goal-graph.test.js +0 -298
  421. package/dist/test/unit/goal-progress.test.d.ts +0 -1
  422. package/dist/test/unit/goal-progress.test.js +0 -381
  423. package/dist/test/unit/goal-report.test.d.ts +0 -1
  424. package/dist/test/unit/goal-report.test.js +0 -159
  425. package/dist/test/unit/goal-status.test.d.ts +0 -1
  426. package/dist/test/unit/goal-status.test.js +0 -215
  427. package/dist/test/unit/goal-store.test.d.ts +0 -1
  428. package/dist/test/unit/goal-store.test.js +0 -253
  429. package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
  430. package/dist/test/unit/goal-subgoal-task.test.js +0 -55
  431. package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
  432. package/dist/test/unit/goal-tools-registry.test.js +0 -192
  433. package/dist/test/unit/handoff-export.test.d.ts +0 -1
  434. package/dist/test/unit/handoff-export.test.js +0 -263
  435. package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
  436. package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
  437. package/dist/test/unit/logging.test.d.ts +0 -1
  438. package/dist/test/unit/logging.test.js +0 -397
  439. package/dist/test/unit/path-guard.test.d.ts +0 -1
  440. package/dist/test/unit/path-guard.test.js +0 -133
  441. package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
  442. package/dist/test/unit/post-task-cleanup.test.js +0 -48
  443. package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
  444. package/dist/test/unit/project-policy-release-mode.test.js +0 -125
  445. package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
  446. package/dist/test/unit/reconcile-tasks.test.js +0 -456
  447. package/dist/test/unit/release-gate.test.d.ts +0 -1
  448. package/dist/test/unit/release-gate.test.js +0 -242
  449. package/dist/test/unit/run-task-loop.test.d.ts +0 -1
  450. package/dist/test/unit/run-task-loop.test.js +0 -380
  451. package/dist/test/unit/safe-status.test.d.ts +0 -1
  452. package/dist/test/unit/safe-status.test.js +0 -165
  453. package/dist/test/unit/safe-views.test.d.ts +0 -1
  454. package/dist/test/unit/safe-views.test.js +0 -171
  455. package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
  456. package/dist/test/unit/schema-drift-check.test.js +0 -176
  457. package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
  458. package/dist/test/unit/sensitive-guard.test.js +0 -104
  459. package/dist/test/unit/spec-kit-import.test.d.ts +0 -1
  460. package/dist/test/unit/spec-kit-import.test.js +0 -341
  461. package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
  462. package/dist/test/unit/subgoal-sync.test.js +0 -183
  463. package/dist/test/unit/sync-file.test.d.ts +0 -1
  464. package/dist/test/unit/sync-file.test.js +0 -154
  465. package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
  466. package/dist/test/unit/tool-invocation-guard.test.js +0 -432
  467. package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
  468. package/dist/test/unit/tool-usage-stats.test.js +0 -300
  469. package/dist/test/unit/toolSearch.test.d.ts +0 -1
  470. package/dist/test/unit/toolSearch.test.js +0 -571
  471. package/dist/test/unit/wait-for-task.test.d.ts +0 -1
  472. package/dist/test/unit/wait-for-task.test.js +0 -144
  473. package/dist/test/unit/watcher-status.test.d.ts +0 -1
  474. package/dist/test/unit/watcher-status.test.js +0 -169
  475. package/dist/test/unit/worktree-manager.test.d.ts +0 -1
  476. package/dist/test/unit/worktree-manager.test.js +0 -176
  477. package/dist/tools/applyPatch.js +0 -41
  478. package/dist/tools/cancelTask.d.ts +0 -30
  479. package/dist/tools/cancelTask.js +0 -64
  480. package/dist/tools/finalizeDirectSession.js +0 -84
  481. package/dist/tools/goalSubgoalTask.js +0 -110
  482. package/dist/tools/killTask.d.ts +0 -15
  483. package/dist/tools/retryTask.js +0 -45
  484. package/dist/tools/runVerification.js +0 -36
  485. package/dist/tools/syncFile.js +0 -65
  486. package/docs/control-center/control-center-daily-driver.md +0 -211
  487. package/docs/control-center/control-center-mvp.md +0 -205
  488. package/docs/control-center/control-center-phase2.md +0 -159
  489. package/docs/execution-plan-2026-07-09.md +0 -315
  490. package/docs/release-v0.6.0.md +0 -71
  491. package/docs/release-v0.6.1.md +0 -75
  492. package/docs/release-v0.6.4.md +0 -45
  493. package/docs/roadmap-execution-and-acceptance.md +0 -365
  494. package/src/test/unit/acceptance-engine.test.ts +0 -261
  495. package/src/test/unit/agent-router.test.ts +0 -342
  496. package/src/test/unit/android-doctor.test.ts +0 -158
  497. package/src/test/unit/apply-patch.test.ts +0 -293
  498. package/src/test/unit/audit-checks.test.ts +0 -567
  499. package/src/test/unit/chinese-path.test.ts +0 -106
  500. package/src/test/unit/command-guard.test.ts +0 -221
  501. package/src/test/unit/create-task.test.ts +0 -255
  502. package/src/test/unit/diagnose-task.test.ts +0 -544
  503. package/src/test/unit/direct-guards.test.ts +0 -467
  504. package/src/test/unit/discovery-token-store.test.ts +0 -181
  505. package/src/test/unit/evidence-pack.test.ts +0 -251
  506. package/src/test/unit/get-task-status.test.ts +0 -203
  507. package/src/test/unit/get-task-summary.test.ts +0 -173
  508. package/src/test/unit/goal-graph.test.ts +0 -347
  509. package/src/test/unit/goal-progress.test.ts +0 -538
  510. package/src/test/unit/goal-report.test.ts +0 -189
  511. package/src/test/unit/goal-status.test.ts +0 -270
  512. package/src/test/unit/goal-store.test.ts +0 -318
  513. package/src/test/unit/goal-subgoal-task.test.ts +0 -72
  514. package/src/test/unit/goal-tools-registry.test.ts +0 -245
  515. package/src/test/unit/handoff-export.test.ts +0 -295
  516. package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
  517. package/src/test/unit/logging.test.ts +0 -497
  518. package/src/test/unit/path-guard.test.ts +0 -180
  519. package/src/test/unit/post-task-cleanup.test.ts +0 -53
  520. package/src/test/unit/project-policy-release-mode.test.ts +0 -156
  521. package/src/test/unit/reconcile-tasks.test.ts +0 -551
  522. package/src/test/unit/release-gate.test.ts +0 -314
  523. package/src/test/unit/run-task-loop.test.ts +0 -425
  524. package/src/test/unit/safe-status.test.ts +0 -187
  525. package/src/test/unit/safe-views.test.ts +0 -184
  526. package/src/test/unit/schema-drift-check.test.ts +0 -260
  527. package/src/test/unit/sensitive-guard.test.ts +0 -124
  528. package/src/test/unit/spec-kit-import.test.ts +0 -429
  529. package/src/test/unit/subgoal-sync.test.ts +0 -236
  530. package/src/test/unit/sync-file.test.ts +0 -231
  531. package/src/test/unit/tool-invocation-guard.test.ts +0 -542
  532. package/src/test/unit/tool-usage-stats.test.ts +0 -384
  533. package/src/test/unit/toolSearch.test.ts +0 -756
  534. package/src/test/unit/wait-for-task.test.ts +0 -176
  535. package/src/test/unit/watcher-status.test.ts +0 -190
  536. package/src/test/unit/worktree-manager.test.ts +0 -247
  537. package/src/tools/cancelTask.ts +0 -70
  538. package/src/tools/retryTask.ts +0 -53
  539. package/src/tools/syncFile.ts +0 -122
  540. /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
  541. /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
  542. /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
  543. /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
  544. /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
  545. /package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +0 -0
  546. /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
  547. /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
  548. /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
  549. /package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +0 -0
  550. /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
  551. /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
  552. /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
  553. /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
  554. /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
  555. /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
  556. /package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +0 -0
  557. /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
  558. /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
  559. /package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +0 -0
  560. /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
  561. /package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +0 -0
  562. /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
  563. /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
  564. /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
  565. /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
  566. /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
  567. /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
  568. /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
  569. /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
  570. /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
  571. /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
  572. /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
  573. /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.1**. 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)
@@ -61,12 +73,13 @@ PatchWarden uses a narrower, auditable task channel:
61
73
  - Every task must specify a `repo_path` inside `workspaceRoot`.
62
74
  - Agent launch commands come from local configuration, not model input.
63
75
  - Verification commands must exactly match `allowedTestCommands`.
64
- - Every completed task records structured results, a full diff, file
76
+ - Every completed task records structured results, a bounded and redacted diff, file
65
77
  statistics, and independent verification output.
66
78
  - Changes outside the requested repository cause a scope violation instead of
67
79
  being silently accepted.
68
- - Sensitive paths such as `.env` files, tokens, SSH keys, cookies, and
69
- 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.
70
83
 
71
84
  Good use cases:
72
85
 
@@ -110,7 +123,7 @@ A completed task writes bounded, reviewable artifacts under
110
123
  - `result.json` - final status, verification status, changed-file groups, and warnings.
111
124
  - `artifact_manifest.json` - generated artifacts with size, type, and SHA-256.
112
125
  - `verify.json` - exact verification commands and exit codes.
113
- - `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.
114
127
  - `rollback_scope_violation_plan.md` - review plan when a task changes files outside `repo_path`.
115
128
 
116
129
  Example compact evidence:
@@ -218,9 +231,37 @@ If `where.exe codex` only returns the Codex Desktop executable under
218
231
  WindowsApps, it may not be a callable Codex CLI. Install or point to the real
219
232
  CLI, or configure OpenCode as the execution agent.
220
233
 
221
- ## Five-minute quick start
234
+ ## Three-minute quick start
235
+
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.
222
258
 
223
- ### Option A: run from source (recommended)
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)
224
265
 
225
266
  Source mode is the easiest way to use the Watcher, Windows launchers, and
226
267
  diagnostic scripts together.
@@ -257,7 +298,7 @@ npm.cmd run watch
257
298
  Keep this window open, then configure OpenCode, Codex, or ChatGPT as described
258
299
  below.
259
300
 
260
- ### Option B: use the npm package
301
+ ### Option C: use the npm package
261
302
 
262
303
  The npm package is convenient for launching a pinned MCP server. Task
263
304
  execution still requires a separate Watcher.
@@ -300,11 +341,13 @@ Recommended Windows example:
300
341
  "agents": {
301
342
  "opencode": {
302
343
  "command": "opencode",
303
- "args": ["run", "{prompt}"]
344
+ "args": ["run", "{prompt}"],
345
+ "envAllowlist": []
304
346
  },
305
347
  "codex": {
306
348
  "command": "codex",
307
- "args": ["exec", "--cd", "{repo}", "{prompt}"]
349
+ "args": ["exec", "--cd", "{repo}", "{prompt}"],
350
+ "envAllowlist": []
308
351
  }
309
352
  },
310
353
  "allowedTestCommands": [
@@ -333,6 +376,7 @@ Configuration fields:
333
376
  | `tasksDir` | Yes | Task and result directory, normally `.patchwarden/tasks`. |
334
377
  | `toolProfile` | No | `full`, `chatgpt_core`, `chatgpt_direct`, or `chatgpt_search`; use `full` for local clients and `chatgpt_search` for compact discovery-driven clients. |
335
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. |
336
380
  | `allowedTestCommands` | Yes | Exact allowlist for independent verification commands. |
337
381
  | `repoAllowedTestCommands` | No | Extra exact commands keyed by workspace-relative repository path; wildcards are unsupported. |
338
382
  | `maxReadFileBytes` | Yes | Maximum bytes returned by one MCP file read. |
@@ -349,12 +393,17 @@ Important configuration rules:
349
393
  - If you use backslashes, escape them as `D:\\path\\to\\project`.
350
394
  - Do not set `workspaceRoot` to a drive root, home directory, Desktop,
351
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.
352
398
  - `plansDir` and `tasksDir` are resolved relative to `workspaceRoot`.
353
399
  - `repo_path` must stay inside `workspaceRoot` and cannot escape with `..`.
354
400
  - `allowedTestCommands` uses exact matching; similar commands are not
355
401
  automatically authorized.
356
402
  - Repository-specific commands come only from trusted local configuration;
357
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.
358
407
  - Configuration may contain private paths and should not be committed.
359
408
 
360
409
  Set the configuration path:
@@ -463,11 +512,26 @@ configured under `agents` is available.
463
512
 
464
513
  ## Connect ChatGPT
465
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
+
466
530
  Recommended Windows path:
467
531
 
468
532
  ```text
469
533
  ChatGPT Web
470
- → ChatGPT Connector
534
+ → ChatGPT developer-mode app / Plugins (formerly Connector)
471
535
  → OpenAI Secure MCP Tunnel
472
536
  → PatchWarden stdio MCP
473
537
  → Watcher
@@ -512,7 +576,7 @@ Runtime status is stored under:
512
576
  This directory contains PIDs, health state, and redacted diagnostics. It must
513
577
  not contain the API key or Tunnel ID.
514
578
 
515
- When creating the ChatGPT Connector:
579
+ When creating the ChatGPT developer-mode app in Plugins:
516
580
 
517
581
  - Select the tunnel **Channel**.
518
582
  - Choose **None** for authentication unless you implemented OAuth.
@@ -687,13 +751,20 @@ mean the task is wrong.
687
751
  | `progress.md` | Progress reported by the agent. |
688
752
  | `result.md` | Human-readable execution report. |
689
753
  | `result.json` | Structured result, paths, changes, warnings, and next steps. |
690
- | `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. |
691
755
  | `artifact_manifest.json` | Generated artifact paths, types, sizes, and SHA-256 hashes. |
692
756
  | `file-stats.json` | Per-file addition and deletion statistics. |
693
757
  | `verify.json` | Structured record for every independent verification command. |
694
758
  | `verify.log` | Human-readable independent verification output. |
695
759
  | `test.log` | Test output captured during agent execution. |
696
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
+
697
768
  An agent saying “published” or “pushed” is not reliable remote evidence.
698
769
  Verify GitHub, npm, tags, and releases against the live platform state.
699
770
 
@@ -778,10 +849,51 @@ available from PowerShell:
778
849
  .\PatchWarden.cmd restart all
779
850
  .\PatchWarden.cmd status all
780
851
  .\PatchWarden.cmd kill all
781
- .\Stop-PatchWarden.cmd
852
+ .\scripts\launchers\Stop-PatchWarden.cmd
782
853
  ```
783
854
 
784
- 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.
785
897
 
786
898
  The old single-purpose launchers remain under `scripts/launchers/` as a
787
899
  compatibility layer. Personal launchers live under `.local/launchers/` and
@@ -1002,6 +1114,13 @@ creation. `export_task_evidence_pack` writes bounded `evidence.json` and
1002
1114
  `EVIDENCE.md` files under `.patchwarden/evidence-packs/<lineage_id>/` without
1003
1115
  stdout/stderr tails, full diffs, verification logs, or sensitive file content.
1004
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
+
1005
1124
  `full` additionally provides:
1006
1125
 
1007
1126
  - `get_plan`
@@ -1021,6 +1140,12 @@ session, read and search source files, apply hash-bound JSON patches, run
1021
1140
  exactly allowlisted verification commands or a bounded verification bundle, finalize the evidence, and audit
1022
1141
  the result without a local execution agent.
1023
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
+
1024
1149
  Enable it in the trusted local configuration while keeping the ordinary Core
1025
1150
  profile unchanged:
1026
1151
 
@@ -1062,9 +1187,10 @@ Primary protections:
1062
1187
  - Agent commands and argument templates must be configured in advance.
1063
1188
  - Verification commands must exactly match the allowlist.
1064
1189
  - File access is contained to `workspaceRoot`.
1065
- - Sensitive filenames and obvious credential-read plans are blocked.
1066
- - Secret-like values in task artifacts are redacted.
1067
- - 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.
1068
1194
  - The Runner does not automatically commit, push, publish, or reset.
1069
1195
 
1070
1196
  Protect these local paths:
@@ -1153,9 +1279,10 @@ and release-asset checksums independently.
1153
1279
 
1154
1280
  ## Related documentation
1155
1281
 
1156
- - [v0.6.4 release notes](docs/release-v0.6.4.md)
1157
- - [v0.6.1 release notes](docs/release-v0.6.1.md)
1158
- - [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)
1159
1286
  - [ChatGPT usage guide](docs/chatgpt-usage.md)
1160
1287
  - [Migration guide](docs/migration-from-safe-bifrost.md)
1161
1288
  - [ChatGPT Connector demo](docs/demo.md)
package/README.md CHANGED
@@ -8,20 +8,27 @@
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
- 当前源码版本:**v1.5.1**。查看
12
- [CHANGELOG](CHANGELOG.md)、[迁移指南](docs/migration-from-safe-bifrost.md)和
13
- [发布检查清单](docs/release-checklist.md)。GitHub Release / npm 发布状态需要在发布前单独核对。
11
+ **让 ChatGPT、Codex 等 MCP 客户端负责规划与验收,让本地编程 Agent 在明确的安全边界内执行,并留下可审计证据。**
14
12
 
15
13
  PatchWarden 是一个面向本地编程 Agent 的安全 MCP 桥接器。上游的
16
14
  ChatGPT、Codex、OpenCode 或其他 MCP 客户端负责规划与验收,
17
15
  PatchWarden 负责把计划保存成工作区内任务,再由预先配置的本地 Agent
18
16
  执行,并返回结果、代码差异和独立测试记录。
19
17
 
20
- 统一英文定位:
18
+ [下载 Windows 安装版 v1.6.0](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Setup-1.6.0-x64.exe)
19
+ · [免安装 ZIP](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Portable-1.6.0-x64.zip)
20
+ · [校验文件](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Desktop-SHA256SUMS.txt)
21
+ · [三分钟快速开始](#三分钟快速开始)
22
+ · [Discussions](https://github.com/jiezeng2004-design/PatchWarden/discussions)
23
+
24
+ ![PatchWarden Desktop 真实首启界面](docs/assets/patchwarden-desktop-onboarding.png)
21
25
 
22
- > PatchWarden is a local-first MCP safety and verification layer for AI coding agents, with workspace confinement, command allowlists, scope-violation detection, and auditable task evidence.
26
+ <sub>PatchWarden Desktop 真实首启界面,来自隐私安全的桌面 smoke 验收;截图未使用真实工作区、账号或凭据。</sub>
23
27
 
24
- ![PatchWarden ChatGPT connector demo](docs/assets/patchwarden-chatgpt-demo.svg)
28
+ 当前源码版本:**v1.6.1**;当前 Windows Release:**v1.6.0**;npm `latest`:**v1.5.1**。
29
+ Windows 首次体验推荐上面的安装版;npm/CLI 用户请固定已发布版本。查看
30
+ [CHANGELOG](CHANGELOG.md)、[迁移指南](docs/migration-from-safe-bifrost.md)和
31
+ [发布检查清单](docs/release-checklist.md)。
25
32
 
26
33
  > [!IMPORTANT]
27
34
  > PatchWarden 不是通用远程 Shell。MCP 客户端不能随意执行命令:
@@ -33,7 +40,7 @@ PatchWarden 负责把计划保存成工作区内任务,再由预先配置的
33
40
  - [它解决什么问题](#它解决什么问题)
34
41
  - [运行结构](#运行结构)
35
42
  - [环境要求](#环境要求)
36
- - [五分钟快速开始](#五分钟快速开始)
43
+ - [三分钟快速开始](#三分钟快速开始)
37
44
  - [完整配置说明](#完整配置说明)
38
45
  - [接入 OpenCode](#接入-opencode)
39
46
  - [接入 Codex](#接入-codex)
@@ -58,9 +65,9 @@ PatchWarden 负责把计划保存成工作区内任务,再由预先配置的
58
65
  - 每个任务必须指定位于 `workspaceRoot` 内的 `repo_path`。
59
66
  - Agent 启动命令来自本地配置,而不是来自模型输入。
60
67
  - 测试命令必须精确匹配 `allowedTestCommands`。
61
- - 任务完成后保存结构化结果、完整差异、文件统计和独立验证记录。
68
+ - 任务完成后保存结构化结果、有界且脱敏的差异、文件统计和独立验证记录。
62
69
  - 工作区外出现变化时,任务会标记为作用域违规,而不是悄悄接受。
63
- - `.env`、Token、SSH 密钥、Cookie、凭据文件等敏感路径默认不可读。
70
+ - `.patchwarden/` 不是敏感路径豁免区;`.env`、Token、SSH 密钥、Cookie、凭据文件等敏感名称无论位于哪一层目录都不可读。
64
71
 
65
72
  适合的场景:
66
73
 
@@ -134,9 +141,33 @@ where.exe codex
134
141
  应用程序,它不一定是可供 PatchWarden 调用的 Codex CLI。请安装或指定真正的
135
142
  CLI,或者先把 OpenCode 配置为执行 Agent。
136
143
 
137
- ## 五分钟快速开始
144
+ ## 三分钟快速开始
145
+
146
+ 如果已经安装 Node.js 18+ 和至少一个本地编程 Agent,这条 Windows 路径的目标是
147
+ 在三分钟内完成首次只读健康检查。首次体验不需要配置 ChatGPT Tunnel。
138
148
 
139
- ### 方案 A:从源码运行(推荐)
149
+ ### 方案 A:Windows 安装版(首次体验推荐)
150
+
151
+ 1. 下载 [Windows 安装版 v1.6.0](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Setup-1.6.0-x64.exe)
152
+ 和 [SHA256 校验文件](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Desktop-SHA256SUMS.txt)。
153
+ 2. 在 PowerShell 中校验安装包:
154
+
155
+ ```powershell
156
+ Get-FileHash .\PatchWarden-Setup-1.6.0-x64.exe -Algorithm SHA256
157
+ ```
158
+
159
+ 当前发布值应为 `77d655545925ae283a0caed0fff12554debac15b54c5decf1ae8f3867703058e`;
160
+ 仍应以同一 Release 的校验文件为准。安装包尚未代码签名,Windows SmartScreen
161
+ 可能显示“未知发布者”。
162
+
163
+ 3. 安装并打开 PatchWarden Desktop,选择一个只包含项目的专用工作区。
164
+ 4. 首屏选择 **本地 MCP**,确认检测到的 Agent,让只读健康检查完成。
165
+
166
+ 成功标志:向导能够进入只读控制台,显示所选工作区,并完成 Agent 与运行环境检查。
167
+ 安装成功或遇到阻塞时,请到 [Discussions](https://github.com/jiezeng2004-design/PatchWarden/discussions)
168
+ 记录操作系统、Node.js 版本、使用的 Agent 和卡住的步骤。
169
+
170
+ ### 方案 B:从源码运行(开发者)
140
171
 
141
172
  源码方式最适合完整使用 Watcher、Windows 一键启动器和诊断脚本。
142
173
 
@@ -171,7 +202,7 @@ npm.cmd run watch
171
202
 
172
203
  保持该窗口运行,再按照后文配置 OpenCode、Codex 或 ChatGPT Connector。
173
204
 
174
- ### 方案 B:使用 npm 包
205
+ ### 方案 C:使用 npm 包
175
206
 
176
207
  npm 包适合让 MCP 客户端通过固定版本启动 PatchWarden。为了执行任务,
177
208
  仍然必须另外启动 Watcher。
@@ -213,11 +244,13 @@ Copy-Item .\examples\config.example.json .\patchwarden.config.json
213
244
  "agents": {
214
245
  "opencode": {
215
246
  "command": "opencode",
216
- "args": ["run", "{prompt}"]
247
+ "args": ["run", "{prompt}"],
248
+ "envAllowlist": []
217
249
  },
218
250
  "codex": {
219
251
  "command": "codex",
220
- "args": ["exec", "--cd", "{repo}", "{prompt}"]
252
+ "args": ["exec", "--cd", "{repo}", "{prompt}"],
253
+ "envAllowlist": []
221
254
  }
222
255
  },
223
256
  "allowedTestCommands": [
@@ -246,6 +279,7 @@ Copy-Item .\examples\config.example.json .\patchwarden.config.json
246
279
  | `tasksDir` | 是 | 任务和结果目录,通常使用 `.patchwarden/tasks`。 |
247
280
  | `toolProfile` | 否 | `full`、`chatgpt_core`、`chatgpt_direct` 或 `chatgpt_search`;本地客户端推荐 `full`,动态工具发现场景使用 `chatgpt_search`。 |
248
281
  | `agents` | 是 | 可执行 Agent 白名单;支持 `{repo}` 和 `{prompt}` 占位符。 |
282
+ | `agents.<name>.envAllowlist` | 否 | 显式传给该 Agent 的 provider 环境变量名;默认不继承。Tunnel owner token 禁止透传。 |
249
283
  | `allowedTestCommands` | 是 | 独立验证命令白名单,调用时必须精确匹配。 |
250
284
  | `repoAllowedTestCommands` | 否 | 按工作区相对仓库路径增加精确验证命令;不支持通配符。 |
251
285
  | `maxReadFileBytes` | 是 | MCP 单次文件读取上限。 |
@@ -369,6 +403,21 @@ PATCHWARDEN_TOOL_PROFILE = "full"
369
403
 
370
404
  ## 接入 ChatGPT Connector
371
405
 
406
+ > 当前 ChatGPT 术语为 **developer-mode app / Plugins**;旧版文档与部分界面曾称为 Connector。新配置请以 Plugins 为准。
407
+
408
+ ### 桌面版八步新手流程
409
+
410
+ 1. 确认 OpenAI Platform 账号具有 Tunnel 权限,并在目标 ChatGPT workspace 开启 developer mode。
411
+ 2. 打开 [Platform Tunnel 设置](https://platform.openai.com/settings/organization/tunnels),创建 Tunnel,并关联目标 ChatGPT workspace。
412
+ 3. 启动 PatchWarden Desktop,在“设置 → MCP 与隧道”检测或选择现有的 `tunnel-client.exe`;应用不会自动下载或执行新软件。
413
+ 4. 输入 Core Tunnel ID 与专用 Tunnel runtime API key。该凭据对应 `CONTROL_PLANE_API_KEY`,**不是**普通应用使用的 `OPENAI_API_KEY`。
414
+ 5. 配置环境代理、无代理或不含凭据的 HTTP/HTTPS/SOCKS5(Mixed)代理,并先确认代理端口可达。
415
+ 6. 点击“配置并验证 Core”。桌面端初始化 `patchwarden` profile,运行 `tunnel-client doctor --explain --json`,验证成功后才用 Windows DPAPI 保存凭据;随后启动 Core。
416
+ 7. 在“开始使用”确认 Tunnel ready、Watcher healthy,并确认 `chatgpt_core` 发现固定的 26 个工具。Direct 是设置页中的可选高级能力,未启用时“全部启动”只启动 Core。
417
+ 8. 在 ChatGPT **Settings → Plugins** 创建 developer-mode app,选择刚创建的 Tunnel;重新连接后新建对话,调用 `health_check` 验证。
418
+
419
+ 首次引导也可选择“本地 MCP”。该路线只配置安全工作区和本地 MCP 客户端,可以跳过第 1、2、4、5、7、8 步中的 Platform/ChatGPT Tunnel 操作。
420
+
372
421
  推荐的 Windows 链路:
373
422
 
374
423
  ```text
@@ -572,19 +621,25 @@ ChatGPT 任务应优先选择前三个守护模板:只读诊断使用 `inspect
572
621
  | `progress.md` | Agent 写入的进度记录。 |
573
622
  | `result.md` | 人类可读的执行报告。 |
574
623
  | `result.json` | 结构化结果、路径、变更、警告和后续建议。 |
575
- | `diff.patch` | 完整任务差异证据。 |
624
+ | `diff.patch` | 最多 20 MiB 的任务差异证据;疑似凭据会在落盘前脱敏,超限会明确标记截断。 |
576
625
  | `artifact_manifest.json` | 构建或发布产物的路径、类型、大小与 SHA-256。 |
577
626
  | `file-stats.json` | 文件级增删统计。 |
578
627
  | `verify.json` | 每条独立验证命令的结构化记录。 |
579
628
  | `verify.log` | 独立验证的可读日志。 |
580
629
  | `test.log` | Agent 执行过程中产生的测试输出。 |
581
630
 
631
+ 面向客户端的任务产物读取受 `maxReadFileBytes` 限制;diff、summary 与日志 tail
632
+ 只读取有界前缀或尾部。`audit_task` 最多扫描 200 个 Markdown 文件和 4 MiB 文档内容,
633
+ 达到预算会返回 warning。invocation/reconcile 等持续日志使用跨进程锁内的有界追加,
634
+ 超限时保留最近内容并写入明确的截断标记。
635
+
582
636
  本地 Agent 声称“已推送”“已发布”不属于可靠的远程证据。GitHub、npm、
583
637
  Tag 和 Release 必须再用对应平台的实时状态核验。
584
638
 
585
639
  ## HTTP MCP 模式
586
640
 
587
- HTTP Server 只绑定 `127.0.0.1`,默认端口 7331,不会直接监听局域网。
641
+ HTTP Server 只绑定 `127.0.0.1`,默认端口 7331,不会直接监听局域网;
642
+ HTTP MCP 与 Control Center 同时拒绝非 `127.0.0.1`/`localhost` 的 Host,防止 DNS rebinding 绕过回环边界。
588
643
 
589
644
  终端 1,启动 Watcher:
590
645
 
@@ -659,10 +714,43 @@ Direct 两种模式的启动、停止、重启与状态。也可以在 PowerShel
659
714
  .\PatchWarden.cmd restart all
660
715
  .\PatchWarden.cmd status all
661
716
  .\PatchWarden.cmd kill all
662
- .\Stop-PatchWarden.cmd
717
+ .\scripts\launchers\Stop-PatchWarden.cmd
663
718
  ```
664
719
 
665
- 日常桌面入口:`PatchWarden-Desktop.cmd` 启动托盘并确保 Control Center 可用,不自动打开额外浏览器窗口。只有调试托盘时才使用 `PatchWarden-Control-Tray.cmd --foreground`;需要完整 Web 控制台时打开 `PatchWarden-Control.cmd`;需要一键收尾时使用 `Stop-PatchWarden.cmd` 关闭 Core/Direct、Control Center 和托盘。
720
+ 日常桌面入口:`scripts\launchers\PatchWarden-Desktop.cmd` 启动托盘并确保 Control Center 可用,不自动打开额外浏览器窗口。只有调试托盘时才使用 `scripts\launchers\PatchWarden-Control-Tray.cmd --foreground`;需要完整 Web 控制台时打开 `scripts\launchers\PatchWarden-Control.cmd`;需要一键收尾时使用 `scripts\launchers\Stop-PatchWarden.cmd` 关闭 Core/Direct、Control Center 和托盘。
721
+
722
+ ### Windows 安装版
723
+
724
+ 公开分发可以构建 PatchWarden Desktop 安装包和免安装 ZIP。它提供 Electron
725
+ 独立窗口、首次工作区引导、系统托盘和设置页,同时继续复用相同的
726
+ loopback Control Center 与安全控制 API。桌面依赖隔离在私有的
727
+ `desktop/` 子包中,不进入 `patchwarden` npm 包。
728
+
729
+ 安装版仍要求 Windows x64、Node.js 18+ 和 tunnel-client。首次启动会在
730
+ `PATH`、当前用户目录和工作区附近做有界检测;未找到时可进入只读控制台,
731
+ 再从“设置 -> MCP 与隧道”选择 `tunnel-client.exe` 并查看 SHA256 校验步骤。
732
+ 应用不会自动下载或运行新软件。设置页还提供 Direct 显式开关,以及环境代理、
733
+ 无代理、手动代理三种模式;手动代理只接受不含凭据的 http/https/socks5 URL。
734
+ 启动和重启只有在 health/ready 与 Core Watcher 验证通过后才会报告成功。
735
+ 桌面端支持 Codex、OpenCode、Claude Code、Gemini CLI、GitHub Copilot CLI、
736
+ Qwen Code、Kimi Code 和 Aider;只读取各 Agent 配置中的模型字段,不读取凭据。
737
+
738
+ ```powershell
739
+ npm.cmd install --prefix desktop --cache .\.npm-cache
740
+ npm.cmd run desktop:test
741
+ npm.cmd run desktop:preflight
742
+ npm.cmd run desktop:package
743
+ ```
744
+
745
+ 安装包、免安装 ZIP 与 SHA256 文件输出到 `release\desktop`。首版不包含自动更新或
746
+ 代码签名,Windows SmartScreen 可能提示未知发布者;发布前必须核对
747
+ GitHub Release 来源和 SHA256。完整安装、运行与卸载说明见
748
+ [docs/desktop-app.md](docs/desktop-app.md)。
749
+
750
+ `desktop:preflight` 会使用唯一目录完成 clean build、完整单测、桌面测试、npm 包面、
751
+ Electron 目录包、仓库外 26-tool manifest 与隔离 unpacked UI/单实例验收,并生成
752
+ `preflight-report.json` / `preflight-report.md`。正式发布前必须在干净 checkout 运行
753
+ `npm.cmd run desktop:preflight:release`;该命令发现未提交路径时会直接阻断。
666
754
 
667
755
  旧的单用途入口保留在 `scripts/launchers/` 作为兼容层;个人入口位于
668
756
  `.local/launchers/`,并继续被 Git 和发布包排除。`stop` / `restart` 会同时检查
@@ -758,7 +846,7 @@ PatchWarden Dashboard (Control Center) 提供以下主要页面:
758
846
 
759
847
  - **控制台 (Dashboard)**: 系统总览,包含 Repo selector、Health Score、服务状态、Release 卡片、Project Policy、Lineage、Evidence Pack、Stale 任务提示、最近任务列表、系统状态(含 Copy diagnostics)。
760
848
  - **任务面板 (Tasks)**: 任务列表,支持按 repo_path / status / acceptance_status / warning type / agent / date range 过滤,每行提供 safe_result / safe_audit / safe_test_summary / safe_diff_summary 快捷操作。
761
- - **任务详情 (Task Detail)**: 默认展示 safe 摘要(safe_result / safe_test_summary / safe_diff_summary / safe_audit),完整 result / diff / test log 在折叠的高级区按需加载。
849
+ - **任务详情 (Task Detail)**: 默认展示 safe 摘要(safe_result / safe_test_summary / safe_diff_summary / safe_audit),配置上限内的 result / diff / test log 在折叠的高级区按需加载。
762
850
  - **Direct 会话 (Direct Sessions)**: 按 active / finalized / audited / expired 分组,提供 safe_direct_summary / safe_finalize_direct_session / safe_audit_direct_session 快捷操作。
763
851
  - **审计日志 / Warnings (Audit)**: 按 warning 类型聚合,显示 affected tasks / severity / recommended action。
764
852
  - **工作区 (Workspace)**: workspace 一级目录与项目列表。
@@ -769,7 +857,7 @@ PatchWarden Dashboard (Control Center) 提供以下主要页面:
769
857
  1. 在 Dashboard 顶部选择目标 repo。
770
858
  2. 查看 Health Score 确认系统健康。
771
859
  3. 在最近任务列表点击 safe_result 快捷查看任务摘要。
772
- 4. 打开 Task Detail 进行 safe-first 验收,仅在需要时展开高级区查看完整日志。
860
+ 4. 打开 Task Detail 进行 safe-first 验收,仅在需要时展开高级区查看有界日志。
773
861
  5. 使用 Lineage Detail 查看 run_task_loop 的成功/失败原因。
774
862
  6. 验收完成后导出 Evidence Pack。
775
863
  7. Direct 会话用于独立验证,完成后 finalize + audit。
@@ -894,6 +982,12 @@ creation. `export_task_evidence_pack` writes bounded `evidence.json` and
894
982
  `EVIDENCE.md` files under `.patchwarden/evidence-packs/<lineage_id>/` without
895
983
  stdout/stderr tails, full diffs, verification logs, or sensitive file content.
896
984
 
985
+ Goal Session 的状态变更通过共享的跨进程 mutation lock 串行化并原子落盘;
986
+ 非空 Goal 的所有子目标都被 `accept_subgoal` 接受后,Goal 会自动转为 `completed`。
987
+ `create_subgoal_task` 以 Goal 已保存的 `repo_path` 为权威,调用方传入其他仓库会以
988
+ `goal_repo_mismatch` 拒绝;隔离 worktree 也从该仓库创建,且 create/merge/discard
989
+ 共用仓库级 lifecycle lock。
990
+
897
991
  `get_project_policy` 是 v1.3 的只读策略入口,返回 `.patchwarden/project-policy.json`
898
992
  的有界 effective policy 与 release readiness,不会扩大命令白名单。v1.3 的
899
993
  `release_check`、`release_prepare`、`release_verify`、`release_cleanup` 仅在 `full`
@@ -997,6 +1091,9 @@ Direct 模式在受控 session 内执行,具有以下硬性限制:
997
1091
  - 禁止修改 `node_modules`
998
1092
  - 禁止手动修改 release/dist
999
1093
  - 禁止修改二进制文件
1094
+ - 只修改大小受限的 UTF-8 文本;补丁按 UTF-8 字节计数
1095
+ - 补丁或同步结果包含疑似凭据时拒绝写入
1096
+ - 同一 session 的 patch、sync、verify、finalize、audit 串行化
1000
1097
  - 所有操作限制在 `workspaceRoot` 和 session repo 内
1001
1098
 
1002
1099
  ### 不支持内容
@@ -1022,9 +1119,9 @@ PatchWarden 的主要保护:
1022
1119
  - Agent 命令和参数模板必须预先配置。
1023
1120
  - 验证命令必须精确匹配白名单。
1024
1121
  - 文件访问被限制在 `workspaceRoot` 内。
1025
- - 敏感文件名和明显的凭据读取计划会被阻止。
1026
- - 任务产物中的疑似密钥值会被脱敏。
1027
- - HTTP Server 只绑定 `127.0.0.1`。
1122
+ - 敏感文件名和明显的凭据读取计划会被阻止;`.patchwarden/` 不会绕过该检查。
1123
+ - 任务差异中的疑似密钥值会在落盘前脱敏,并把任务标记为策略违规。
1124
+ - HTTP 服务只绑定 `127.0.0.1`,并拒绝非回环 Host。
1028
1125
  - Runner 不会自动 commit、push、发布或重置仓库。
1029
1126
 
1030
1127
  需要保护的本地路径: