patchwarden 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/PatchWarden.cmd +32 -2
  2. package/README.en.md +194 -26
  3. package/README.md +160 -22
  4. package/dist/assessments/agentAssessor.d.ts +1 -1
  5. package/dist/assessments/agentAssessor.js +24 -15
  6. package/dist/assessments/assessmentStore.d.ts +1 -1
  7. package/dist/assessments/assessmentStore.js +44 -36
  8. package/dist/assessments/confirmCli.js +5 -4
  9. package/dist/config.d.ts +22 -0
  10. package/dist/config.js +98 -11
  11. package/dist/control/fileManager.d.ts +2 -0
  12. package/dist/control/fileManager.js +39 -0
  13. package/dist/control/middleware/auth.d.ts +16 -0
  14. package/dist/control/middleware/auth.js +17 -0
  15. package/dist/control/middleware/static.d.ts +3 -0
  16. package/dist/control/middleware/static.js +78 -0
  17. package/dist/control/routeTable.d.ts +24 -0
  18. package/dist/control/routeTable.js +263 -0
  19. package/dist/control/routes/audit.d.ts +15 -0
  20. package/dist/control/routes/audit.js +287 -0
  21. package/dist/control/routes/evidence.d.ts +4 -0
  22. package/dist/control/routes/evidence.js +96 -0
  23. package/dist/control/routes/lineage.d.ts +3 -0
  24. package/dist/control/routes/lineage.js +71 -0
  25. package/dist/control/routes/policy.d.ts +3 -0
  26. package/dist/control/routes/policy.js +81 -0
  27. package/dist/control/routes/process.d.ts +12 -0
  28. package/dist/control/routes/process.js +487 -0
  29. package/dist/control/routes/sessions.d.ts +30 -0
  30. package/dist/control/routes/sessions.js +287 -0
  31. package/dist/control/routes/status.d.ts +51 -0
  32. package/dist/control/routes/status.js +307 -0
  33. package/dist/control/routes/taskActions.d.ts +21 -0
  34. package/dist/control/routes/taskActions.js +197 -0
  35. package/dist/control/routes/tasks.d.ts +24 -0
  36. package/dist/control/routes/tasks.js +309 -0
  37. package/dist/control/routes/workspace.d.ts +15 -0
  38. package/dist/control/routes/workspace.js +220 -0
  39. package/dist/control/runtime.d.ts +92 -0
  40. package/dist/control/runtime.js +425 -0
  41. package/dist/control/server.d.ts +13 -0
  42. package/dist/control/server.js +150 -0
  43. package/dist/control/shared.d.ts +59 -0
  44. package/dist/control/shared.js +341 -0
  45. package/dist/controlCenter.d.ts +6 -0
  46. package/dist/controlCenter.js +7 -2197
  47. package/dist/direct/directAudit.js +234 -225
  48. package/dist/direct/directGuards.d.ts +2 -1
  49. package/dist/direct/directGuards.js +72 -37
  50. package/dist/direct/directPatch.d.ts +6 -1
  51. package/dist/direct/directPatch.js +55 -8
  52. package/dist/direct/directSessionStore.d.ts +16 -6
  53. package/dist/direct/directSessionStore.js +127 -35
  54. package/dist/direct/directVerification.js +8 -16
  55. package/dist/doctor.d.ts +18 -1
  56. package/dist/doctor.js +614 -373
  57. package/dist/goal/acceptanceEngine.d.ts +1 -1
  58. package/dist/goal/goalProgress.js +75 -69
  59. package/dist/goal/goalReport.d.ts +54 -0
  60. package/dist/goal/goalReport.js +197 -0
  61. package/dist/goal/goalStatus.d.ts +8 -0
  62. package/dist/goal/goalStatus.js +10 -3
  63. package/dist/goal/goalStore.d.ts +9 -2
  64. package/dist/goal/goalStore.js +152 -45
  65. package/dist/goal/handoffExport.js +6 -6
  66. package/dist/goal/specKitImport.d.ts +63 -0
  67. package/dist/goal/specKitImport.js +221 -0
  68. package/dist/goal/subgoalSync.js +13 -10
  69. package/dist/goal/worktreeManager.d.ts +2 -0
  70. package/dist/goal/worktreeManager.js +209 -136
  71. package/dist/httpServer.js +126 -44
  72. package/dist/index.js +7 -4
  73. package/dist/logging.d.ts +7 -1
  74. package/dist/logging.js +13 -3
  75. package/dist/policy/projectPolicy.js +5 -2
  76. package/dist/release/releaseGate.d.ts +1 -1
  77. package/dist/release/releaseGate.js +78 -25
  78. package/dist/runner/agentInvocation.d.ts +14 -0
  79. package/dist/runner/agentInvocation.js +96 -4
  80. package/dist/runner/changeCapture.d.ts +14 -6
  81. package/dist/runner/changeCapture.js +287 -81
  82. package/dist/runner/cli.js +7 -6
  83. package/dist/runner/postTaskCleanup.js +60 -7
  84. package/dist/runner/processSecurity.d.ts +56 -0
  85. package/dist/runner/processSecurity.js +373 -0
  86. package/dist/runner/runTask.d.ts +1 -1
  87. package/dist/runner/runTask.js +339 -287
  88. package/dist/runner/simpleProcess.d.ts +3 -0
  89. package/dist/runner/simpleProcess.js +52 -38
  90. package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
  91. package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
  92. package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +1 -1
  93. package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
  94. package/dist/runner/taskStatusStore.d.ts +11 -0
  95. package/dist/runner/taskStatusStore.js +24 -0
  96. package/dist/runner/watch.d.ts +14 -1
  97. package/dist/runner/watch.js +265 -54
  98. package/dist/security/contentRedaction.d.ts +6 -0
  99. package/dist/security/contentRedaction.js +24 -2
  100. package/dist/security/discoveryTokenStore.d.ts +3 -2
  101. package/dist/security/discoveryTokenStore.js +17 -2
  102. package/dist/security/loopbackHost.d.ts +2 -0
  103. package/dist/security/loopbackHost.js +16 -0
  104. package/dist/security/pathGuard.js +32 -17
  105. package/dist/security/planGuard.js +2 -1
  106. package/dist/security/runtimeGuard.js +9 -6
  107. package/dist/security/secretComparison.d.ts +3 -0
  108. package/dist/security/secretComparison.js +11 -0
  109. package/dist/security/sensitiveGuard.d.ts +5 -0
  110. package/dist/security/sensitiveGuard.js +27 -8
  111. package/dist/security/toolInvocationGuard.d.ts +2 -2
  112. package/dist/security/toolInvocationGuard.js +1 -1
  113. package/dist/security/workspaceRootGuard.d.ts +8 -0
  114. package/dist/security/workspaceRootGuard.js +47 -0
  115. package/dist/smoke-test.js +280 -273
  116. package/dist/tools/catalog/index.d.ts +4 -0
  117. package/dist/tools/catalog/index.js +4 -0
  118. package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
  119. package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
  120. package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +28 -15
  121. package/dist/tools/definitions/toolDefs.d.ts +18 -0
  122. package/dist/tools/definitions/toolDefs.js +1177 -0
  123. package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
  124. package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
  125. package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +8 -63
  126. package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +111 -37
  127. package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +6 -6
  128. package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +10 -10
  129. package/dist/tools/diagnostics/index.d.ts +6 -0
  130. package/dist/tools/diagnostics/index.js +6 -0
  131. package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
  132. package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
  133. package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +14 -10
  134. package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +25 -15
  135. package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
  136. package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
  137. package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +1 -1
  138. package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +8 -8
  139. package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +2 -2
  140. package/dist/tools/direct/finalizeDirectSession.js +86 -0
  141. package/dist/tools/direct/index.d.ts +3 -0
  142. package/dist/tools/direct/index.js +3 -0
  143. package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
  144. package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
  145. package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
  146. package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
  147. package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
  148. package/dist/tools/discovery/index.d.ts +3 -0
  149. package/dist/tools/discovery/index.js +3 -0
  150. package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
  151. package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
  152. package/dist/tools/dispatch/coreDispatch.d.ts +9 -0
  153. package/dist/tools/dispatch/coreDispatch.js +283 -0
  154. package/dist/tools/dispatch/diagnosticDispatch.d.ts +12 -0
  155. package/dist/tools/dispatch/diagnosticDispatch.js +80 -0
  156. package/dist/tools/dispatch/directDispatch.d.ts +8 -0
  157. package/dist/tools/dispatch/directDispatch.js +116 -0
  158. package/dist/tools/dispatch/goalDispatch.d.ts +8 -0
  159. package/dist/tools/dispatch/goalDispatch.js +92 -0
  160. package/dist/tools/dispatch/releaseDispatch.d.ts +8 -0
  161. package/dist/tools/dispatch/releaseDispatch.js +46 -0
  162. package/dist/tools/dispatch/types.d.ts +23 -0
  163. package/dist/tools/dispatch/types.js +15 -0
  164. package/dist/tools/dispatch/validation.d.ts +7 -0
  165. package/dist/tools/dispatch/validation.js +71 -0
  166. package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
  167. package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +2 -2
  168. package/dist/tools/goals/goalSubgoalTask.js +118 -0
  169. package/dist/tools/goals/index.d.ts +3 -0
  170. package/dist/tools/goals/index.js +3 -0
  171. package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
  172. package/dist/tools/registry.d.ts +10 -14
  173. package/dist/tools/registry.js +47 -1651
  174. package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
  175. package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
  176. package/dist/tools/release/index.d.ts +2 -0
  177. package/dist/tools/release/index.js +2 -0
  178. package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
  179. package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
  180. package/dist/tools/tasks/cancelTask.d.ts +11 -0
  181. package/dist/tools/tasks/cancelTask.js +85 -0
  182. package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +12 -4
  183. package/dist/tools/{createTask.js → tasks/createTask.js} +46 -31
  184. package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
  185. package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +8 -8
  186. package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +6 -0
  187. package/dist/tools/tasks/evidencePack.js +387 -0
  188. package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
  189. package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
  190. package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +5 -5
  191. package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
  192. package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +33 -26
  193. package/dist/tools/tasks/index.d.ts +18 -0
  194. package/dist/tools/tasks/index.js +18 -0
  195. package/dist/tools/tasks/killTask.d.ts +1 -0
  196. package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
  197. package/dist/tools/{listTasks.js → tasks/listTasks.js} +3 -3
  198. package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +1 -1
  199. package/dist/tools/{reconcileTasks.js → tasks/reconcileTasks.js} +64 -66
  200. package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +2 -2
  201. package/dist/tools/tasks/retryTask.js +60 -0
  202. package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
  203. package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +59 -31
  204. package/dist/tools/tasks/runVerification.js +38 -0
  205. package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
  206. package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
  207. package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
  208. package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
  209. package/dist/tools/workspace/applyPatch.js +53 -0
  210. package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
  211. package/dist/tools/workspace/index.d.ts +10 -0
  212. package/dist/tools/workspace/index.js +10 -0
  213. package/dist/tools/{listAgents.d.ts → workspace/listAgents.d.ts} +5 -0
  214. package/dist/tools/{listAgents.js → workspace/listAgents.js} +8 -4
  215. package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
  216. package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
  217. package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
  218. package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
  219. package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
  220. package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
  221. package/dist/tools/workspace/syncFile.js +134 -0
  222. package/dist/utils/atomicFile.d.ts +7 -0
  223. package/dist/utils/atomicFile.js +48 -0
  224. package/dist/utils/boundedFile.d.ts +8 -0
  225. package/dist/utils/boundedFile.js +93 -0
  226. package/dist/utils/lockedJsonFile.d.ts +15 -0
  227. package/dist/utils/lockedJsonFile.js +224 -0
  228. package/dist/utils/platform.d.ts +11 -0
  229. package/dist/utils/platform.js +26 -0
  230. package/dist/utils/stableJson.d.ts +2 -0
  231. package/dist/utils/stableJson.js +12 -0
  232. package/dist/version.d.ts +3 -2
  233. package/dist/version.js +3 -2
  234. package/dist/watcherStatus.d.ts +2 -2
  235. package/dist/watcherStatus.js +18 -0
  236. package/docs/CODE_WIKI.md +1648 -0
  237. package/docs/agentseal-integration.md +150 -0
  238. package/docs/architecture.md +23 -0
  239. package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
  240. package/docs/assets/patchwarden-oss-demo.gif +0 -0
  241. package/docs/control-center/README.md +4 -4
  242. package/docs/dashboard-overview.md +86 -0
  243. package/docs/demo.md +8 -0
  244. package/docs/desktop-app.md +175 -0
  245. package/docs/direct-session-workflow.md +98 -0
  246. package/docs/evidence-pack-schema.md +215 -0
  247. package/docs/lineage-evidence-pack-workflow.md +127 -0
  248. package/docs/mcp-inspector-testing.md +200 -0
  249. package/docs/open-source-application.md +168 -0
  250. package/docs/opencode-worker.md +151 -0
  251. package/docs/openhands-worker.md +181 -0
  252. package/docs/release-checklist.md +1 -1
  253. package/docs/release-evidence.md +82 -0
  254. package/docs/spec-kit-integration.md +131 -0
  255. package/docs/task-safe-review-workflow.md +98 -0
  256. package/docs/threat-model.md +97 -0
  257. package/docs/user-feedback.md +40 -0
  258. package/docs/why-patchwarden.md +110 -0
  259. package/examples/config.example.json +4 -2
  260. package/package.json +28 -11
  261. package/scripts/README.md +15 -6
  262. package/scripts/build.js +11 -0
  263. package/scripts/checks/brand-check.js +3 -0
  264. package/scripts/checks/build-output-check.js +37 -0
  265. package/scripts/checks/control-center-smoke.js +447 -6
  266. package/scripts/checks/control-smoke.js +19 -8
  267. package/scripts/checks/http-mcp-smoke.js +82 -4
  268. package/scripts/checks/lifecycle-smoke.js +39 -33
  269. package/scripts/checks/mcp-manifest-check.js +1 -1
  270. package/scripts/checks/mcp-smoke.js +30 -4
  271. package/scripts/checks/package-manifest-check.js +20 -7
  272. package/scripts/checks/unit-tests.js +3 -5
  273. package/scripts/checks/watcher-supervisor-smoke.js +9 -0
  274. package/scripts/control/get-patchwarden-health.ps1 +1 -1
  275. package/scripts/control/manage-patchwarden.ps1 +69 -4
  276. package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
  277. package/scripts/control/run-background-supervisor.ps1 +41 -0
  278. package/scripts/control/start-patchwarden-tunnel.ps1 +126 -32
  279. package/scripts/generate-demo-gif.py +320 -0
  280. package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
  281. package/scripts/launchers/PatchWarden-Control.cmd +6 -0
  282. package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
  283. package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
  284. package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
  285. package/scripts/lib/clean-generated-output.js +11 -0
  286. package/scripts/lib/file-discovery.js +12 -0
  287. package/scripts/release/desktop-preflight.js +211 -0
  288. package/scripts/release/pack-clean.js +59 -14
  289. package/src/assessments/agentAssessor.ts +29 -15
  290. package/src/assessments/assessmentStore.ts +55 -43
  291. package/src/assessments/confirmCli.ts +5 -4
  292. package/src/config.ts +105 -11
  293. package/src/control/fileManager.ts +40 -0
  294. package/src/control/middleware/auth.ts +35 -0
  295. package/src/control/middleware/static.ts +84 -0
  296. package/src/control/routeTable.ts +301 -0
  297. package/src/control/routes/audit.ts +329 -0
  298. package/src/control/routes/evidence.ts +107 -0
  299. package/src/control/routes/lineage.ts +92 -0
  300. package/src/control/routes/policy.ts +81 -0
  301. package/src/control/routes/process.ts +505 -0
  302. package/src/control/routes/sessions.ts +314 -0
  303. package/src/control/routes/status.ts +405 -0
  304. package/src/control/routes/taskActions.ts +214 -0
  305. package/src/control/routes/tasks.ts +331 -0
  306. package/src/control/routes/workspace.ts +234 -0
  307. package/src/control/runtime.ts +508 -0
  308. package/src/control/server.ts +165 -0
  309. package/src/control/shared.ts +360 -0
  310. package/src/controlCenter.ts +7 -2347
  311. package/src/direct/directAudit.ts +17 -9
  312. package/src/direct/directGuards.ts +100 -51
  313. package/src/direct/directPatch.ts +95 -8
  314. package/src/direct/directSessionStore.ts +211 -55
  315. package/src/direct/directVerification.ts +9 -23
  316. package/src/doctor.ts +766 -492
  317. package/src/goal/acceptanceEngine.ts +1 -1
  318. package/src/goal/goalProgress.ts +17 -13
  319. package/src/goal/goalReport.ts +263 -0
  320. package/src/goal/goalStatus.ts +25 -3
  321. package/src/goal/goalStore.ts +241 -54
  322. package/src/goal/handoffExport.ts +6 -6
  323. package/src/goal/specKitImport.ts +355 -0
  324. package/src/goal/subgoalSync.ts +15 -10
  325. package/src/goal/worktreeManager.ts +139 -22
  326. package/src/httpServer.ts +130 -44
  327. package/src/index.ts +7 -4
  328. package/src/logging.ts +20 -4
  329. package/src/policy/projectPolicy.ts +5 -2
  330. package/src/release/releaseGate.ts +74 -27
  331. package/src/runner/agentInvocation.ts +126 -4
  332. package/src/runner/changeCapture.ts +342 -80
  333. package/src/runner/cli.ts +7 -6
  334. package/src/runner/postTaskCleanup.ts +55 -7
  335. package/src/runner/processSecurity.ts +433 -0
  336. package/src/runner/runTask.ts +441 -292
  337. package/src/runner/simpleProcess.ts +68 -33
  338. package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
  339. package/src/{taskRuntime.ts → runner/taskRuntime.ts} +4 -3
  340. package/src/runner/taskStatusStore.ts +54 -0
  341. package/src/runner/watch.ts +290 -57
  342. package/src/security/contentRedaction.ts +31 -2
  343. package/src/security/discoveryTokenStore.ts +18 -4
  344. package/src/security/loopbackHost.ts +19 -0
  345. package/src/security/pathGuard.ts +35 -16
  346. package/src/security/planGuard.ts +2 -1
  347. package/src/security/runtimeGuard.ts +9 -6
  348. package/src/security/secretComparison.ts +13 -0
  349. package/src/security/sensitiveGuard.ts +27 -8
  350. package/src/security/toolInvocationGuard.ts +2 -2
  351. package/src/security/workspaceRootGuard.ts +53 -0
  352. package/src/smoke-test.ts +276 -273
  353. package/src/tools/catalog/index.ts +4 -0
  354. package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
  355. package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +29 -16
  356. package/src/tools/definitions/toolDefs.ts +1264 -0
  357. package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
  358. package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +196 -89
  359. package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +11 -11
  360. package/src/tools/diagnostics/index.ts +6 -0
  361. package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
  362. package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +29 -19
  363. package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
  364. package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +9 -9
  365. package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +11 -9
  366. package/src/tools/direct/index.ts +3 -0
  367. package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
  368. package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
  369. package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
  370. package/src/tools/discovery/index.ts +3 -0
  371. package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
  372. package/src/tools/dispatch/coreDispatch.ts +379 -0
  373. package/src/tools/dispatch/diagnosticDispatch.ts +106 -0
  374. package/src/tools/dispatch/directDispatch.ts +168 -0
  375. package/src/tools/dispatch/goalDispatch.ts +128 -0
  376. package/src/tools/dispatch/releaseDispatch.ts +66 -0
  377. package/src/tools/dispatch/types.ts +24 -0
  378. package/src/tools/dispatch/validation.ts +78 -0
  379. package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
  380. package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +43 -28
  381. package/src/tools/goals/index.ts +3 -0
  382. package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
  383. package/src/tools/registry.ts +54 -1858
  384. package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
  385. package/src/tools/release/index.ts +2 -0
  386. package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
  387. package/src/tools/tasks/cancelTask.ts +109 -0
  388. package/src/tools/{createTask.ts → tasks/createTask.ts} +56 -33
  389. package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +8 -8
  390. package/src/tools/tasks/evidencePack.ts +504 -0
  391. package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
  392. package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +7 -5
  393. package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
  394. package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +44 -33
  395. package/src/tools/tasks/index.ts +18 -0
  396. package/src/tools/{listTasks.ts → tasks/listTasks.ts} +4 -4
  397. package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +68 -66
  398. package/src/tools/tasks/retryTask.ts +69 -0
  399. package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +70 -35
  400. package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
  401. package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
  402. package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
  403. package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
  404. package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
  405. package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
  406. package/src/tools/workspace/index.ts +10 -0
  407. package/src/tools/{listAgents.ts → workspace/listAgents.ts} +11 -4
  408. package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
  409. package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
  410. package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
  411. package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
  412. package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
  413. package/src/tools/workspace/syncFile.ts +292 -0
  414. package/src/utils/atomicFile.ts +58 -0
  415. package/src/utils/boundedFile.ts +116 -0
  416. package/src/utils/lockedJsonFile.ts +251 -0
  417. package/src/utils/platform.ts +31 -0
  418. package/src/utils/stableJson.ts +12 -0
  419. package/src/version.ts +3 -2
  420. package/src/watcherStatus.ts +19 -1
  421. package/ui/desktop-bootstrap.js +11 -0
  422. package/ui/desktop-bridge.js +36 -0
  423. package/ui/desktop.css +160 -0
  424. package/ui/getting-started.js +93 -0
  425. package/ui/i18n.js +484 -0
  426. package/ui/log-parser.js +30 -0
  427. package/ui/pages/audit.html +204 -3
  428. package/ui/pages/dashboard.html +937 -79
  429. package/ui/pages/direct-sessions.html +609 -60
  430. package/ui/pages/getting-started.html +43 -0
  431. package/ui/pages/logs.html +105 -22
  432. package/ui/pages/settings.html +101 -0
  433. package/ui/pages/task-detail.html +468 -438
  434. package/ui/pages/tasks.html +648 -65
  435. package/ui/pages/workspace.html +38 -1
  436. package/ui/settings.js +245 -0
  437. package/PatchWarden-Control.cmd +0 -6
  438. package/Restart-PatchWarden-Control.cmd +0 -6
  439. package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
  440. package/dist/test/unit/acceptance-engine.test.js +0 -228
  441. package/dist/test/unit/agent-router.test.d.ts +0 -1
  442. package/dist/test/unit/agent-router.test.js +0 -287
  443. package/dist/test/unit/android-doctor.test.d.ts +0 -1
  444. package/dist/test/unit/android-doctor.test.js +0 -118
  445. package/dist/test/unit/audit-checks.test.d.ts +0 -1
  446. package/dist/test/unit/audit-checks.test.js +0 -350
  447. package/dist/test/unit/chinese-path.test.d.ts +0 -1
  448. package/dist/test/unit/chinese-path.test.js +0 -91
  449. package/dist/test/unit/command-guard.test.d.ts +0 -1
  450. package/dist/test/unit/command-guard.test.js +0 -160
  451. package/dist/test/unit/diagnose-task.test.d.ts +0 -1
  452. package/dist/test/unit/diagnose-task.test.js +0 -457
  453. package/dist/test/unit/direct-guards.test.d.ts +0 -1
  454. package/dist/test/unit/direct-guards.test.js +0 -213
  455. package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
  456. package/dist/test/unit/discovery-token-store.test.js +0 -139
  457. package/dist/test/unit/evidence-pack.test.d.ts +0 -1
  458. package/dist/test/unit/evidence-pack.test.js +0 -130
  459. package/dist/test/unit/goal-graph.test.d.ts +0 -1
  460. package/dist/test/unit/goal-graph.test.js +0 -298
  461. package/dist/test/unit/goal-progress.test.d.ts +0 -1
  462. package/dist/test/unit/goal-progress.test.js +0 -381
  463. package/dist/test/unit/goal-status.test.d.ts +0 -1
  464. package/dist/test/unit/goal-status.test.js +0 -215
  465. package/dist/test/unit/goal-store.test.d.ts +0 -1
  466. package/dist/test/unit/goal-store.test.js +0 -253
  467. package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
  468. package/dist/test/unit/goal-subgoal-task.test.js +0 -55
  469. package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
  470. package/dist/test/unit/goal-tools-registry.test.js +0 -190
  471. package/dist/test/unit/handoff-export.test.d.ts +0 -1
  472. package/dist/test/unit/handoff-export.test.js +0 -263
  473. package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
  474. package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
  475. package/dist/test/unit/logging.test.d.ts +0 -1
  476. package/dist/test/unit/logging.test.js +0 -397
  477. package/dist/test/unit/path-guard.test.d.ts +0 -1
  478. package/dist/test/unit/path-guard.test.js +0 -109
  479. package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
  480. package/dist/test/unit/post-task-cleanup.test.js +0 -48
  481. package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
  482. package/dist/test/unit/project-policy-release-mode.test.js +0 -125
  483. package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
  484. package/dist/test/unit/reconcile-tasks.test.js +0 -456
  485. package/dist/test/unit/release-gate.test.d.ts +0 -1
  486. package/dist/test/unit/release-gate.test.js +0 -242
  487. package/dist/test/unit/run-task-loop.test.d.ts +0 -1
  488. package/dist/test/unit/run-task-loop.test.js +0 -380
  489. package/dist/test/unit/safe-status.test.d.ts +0 -1
  490. package/dist/test/unit/safe-status.test.js +0 -165
  491. package/dist/test/unit/safe-views.test.d.ts +0 -1
  492. package/dist/test/unit/safe-views.test.js +0 -171
  493. package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
  494. package/dist/test/unit/schema-drift-check.test.js +0 -176
  495. package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
  496. package/dist/test/unit/sensitive-guard.test.js +0 -104
  497. package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
  498. package/dist/test/unit/subgoal-sync.test.js +0 -183
  499. package/dist/test/unit/sync-file.test.d.ts +0 -1
  500. package/dist/test/unit/sync-file.test.js +0 -154
  501. package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
  502. package/dist/test/unit/tool-invocation-guard.test.js +0 -432
  503. package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
  504. package/dist/test/unit/tool-usage-stats.test.js +0 -300
  505. package/dist/test/unit/toolSearch.test.d.ts +0 -1
  506. package/dist/test/unit/toolSearch.test.js +0 -571
  507. package/dist/test/unit/watcher-status.test.d.ts +0 -1
  508. package/dist/test/unit/watcher-status.test.js +0 -169
  509. package/dist/test/unit/worktree-manager.test.d.ts +0 -1
  510. package/dist/test/unit/worktree-manager.test.js +0 -176
  511. package/dist/tools/applyPatch.js +0 -41
  512. package/dist/tools/cancelTask.d.ts +0 -30
  513. package/dist/tools/cancelTask.js +0 -64
  514. package/dist/tools/evidencePack.js +0 -168
  515. package/dist/tools/finalizeDirectSession.js +0 -84
  516. package/dist/tools/goalSubgoalTask.js +0 -110
  517. package/dist/tools/killTask.d.ts +0 -15
  518. package/dist/tools/retryTask.js +0 -45
  519. package/dist/tools/runVerification.js +0 -36
  520. package/dist/tools/syncFile.js +0 -65
  521. package/docs/control-center/control-center-daily-driver.md +0 -211
  522. package/docs/control-center/control-center-mvp.md +0 -205
  523. package/docs/control-center/control-center-phase2.md +0 -159
  524. package/docs/release-v0.6.0.md +0 -71
  525. package/docs/release-v0.6.1.md +0 -75
  526. package/docs/release-v0.6.4.md +0 -45
  527. package/src/test/unit/acceptance-engine.test.ts +0 -261
  528. package/src/test/unit/agent-router.test.ts +0 -342
  529. package/src/test/unit/android-doctor.test.ts +0 -158
  530. package/src/test/unit/audit-checks.test.ts +0 -567
  531. package/src/test/unit/chinese-path.test.ts +0 -106
  532. package/src/test/unit/command-guard.test.ts +0 -221
  533. package/src/test/unit/diagnose-task.test.ts +0 -544
  534. package/src/test/unit/direct-guards.test.ts +0 -297
  535. package/src/test/unit/discovery-token-store.test.ts +0 -181
  536. package/src/test/unit/evidence-pack.test.ts +0 -142
  537. package/src/test/unit/goal-graph.test.ts +0 -347
  538. package/src/test/unit/goal-progress.test.ts +0 -538
  539. package/src/test/unit/goal-status.test.ts +0 -270
  540. package/src/test/unit/goal-store.test.ts +0 -318
  541. package/src/test/unit/goal-subgoal-task.test.ts +0 -72
  542. package/src/test/unit/goal-tools-registry.test.ts +0 -243
  543. package/src/test/unit/handoff-export.test.ts +0 -295
  544. package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
  545. package/src/test/unit/logging.test.ts +0 -497
  546. package/src/test/unit/path-guard.test.ts +0 -150
  547. package/src/test/unit/post-task-cleanup.test.ts +0 -53
  548. package/src/test/unit/project-policy-release-mode.test.ts +0 -156
  549. package/src/test/unit/reconcile-tasks.test.ts +0 -551
  550. package/src/test/unit/release-gate.test.ts +0 -314
  551. package/src/test/unit/run-task-loop.test.ts +0 -425
  552. package/src/test/unit/safe-status.test.ts +0 -187
  553. package/src/test/unit/safe-views.test.ts +0 -184
  554. package/src/test/unit/schema-drift-check.test.ts +0 -260
  555. package/src/test/unit/sensitive-guard.test.ts +0 -124
  556. package/src/test/unit/subgoal-sync.test.ts +0 -236
  557. package/src/test/unit/sync-file.test.ts +0 -231
  558. package/src/test/unit/tool-invocation-guard.test.ts +0 -542
  559. package/src/test/unit/tool-usage-stats.test.ts +0 -384
  560. package/src/test/unit/toolSearch.test.ts +0 -756
  561. package/src/test/unit/watcher-status.test.ts +0 -190
  562. package/src/test/unit/worktree-manager.test.ts +0 -247
  563. package/src/tools/cancelTask.ts +0 -70
  564. package/src/tools/evidencePack.ts +0 -205
  565. package/src/tools/retryTask.ts +0 -53
  566. package/src/tools/syncFile.ts +0 -122
  567. /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
  568. /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
  569. /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
  570. /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
  571. /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
  572. /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
  573. /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
  574. /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
  575. /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
  576. /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
  577. /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
  578. /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
  579. /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
  580. /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
  581. /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
  582. /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
  583. /package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +0 -0
  584. /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
  585. /package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +0 -0
  586. /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
  587. /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
  588. /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
  589. /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
  590. /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
  591. /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
  592. /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
  593. /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
  594. /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
  595. /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
  596. /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
  597. /package/src/tools/{waitForTask.ts → tasks/waitForTask.ts} +0 -0
@@ -0,0 +1,168 @@
1
+ # PatchWarden Open Source Application Brief
2
+
3
+ This brief is written for programs that evaluate open source maintainer work,
4
+ including Codex-style OSS support programs. It is evidence-oriented and avoids
5
+ claiming adoption that has not happened yet.
6
+
7
+ ## Project
8
+
9
+ - Repository: https://github.com/jiezeng2004-design/PatchWarden
10
+ - Package: `patchwarden`
11
+ - License: MIT
12
+ - Primary language: TypeScript
13
+ - Runtime: Node.js 18+
14
+ - Primary maintainer: `jiezeng2004-design`
15
+
16
+ PatchWarden is a local-first MCP safety and verification layer for AI coding
17
+ agents. It lets ChatGPT, Codex, OpenCode, or another MCP client plan and review
18
+ work while a preconfigured local agent performs bounded execution inside a
19
+ configured workspace.
20
+
21
+ ## Why This Matters For OSS Maintainers
22
+
23
+ AI coding workflows are becoming useful for maintainers, but many local bridges
24
+ solve convenience by exposing an unrestricted shell or broad filesystem access.
25
+ That is a poor default for open source work, where a maintainer may have
26
+ credentials, release artifacts, private issue context, unpublished patches, and
27
+ multiple repositories on the same machine.
28
+
29
+ PatchWarden narrows that workflow into an auditable task channel:
30
+
31
+ - workspace confinement through `workspaceRoot` and repo-scoped task paths
32
+ - pre-registered local agents instead of model-supplied shell commands
33
+ - exact allowlisted verification commands
34
+ - sensitive-path blocking for `.env`, tokens, SSH keys, cookies, and credential
35
+ material
36
+ - scope-violation detection for unexpected out-of-repository changes
37
+ - structured task artifacts, diffs, verification records, and evidence packs
38
+ - release checks that distinguish local verification from GitHub/npm truth
39
+
40
+ The goal is not to replace human maintainers. The goal is to make AI-assisted
41
+ maintenance reviewable enough for routine OSS work: small fixes, test
42
+ generation, documentation updates, release preflight checks, and post-task
43
+ audit.
44
+
45
+ ## Maintainer Role
46
+
47
+ I am the primary maintainer of PatchWarden. My work includes architecture,
48
+ security boundaries, MCP tool design, TypeScript implementation, CI, release
49
+ checklists, documentation, issue/PR templates, and package metadata.
50
+
51
+ The repository is early-stage, but it is not a throwaway demo. The project has a
52
+ documented safety model, bilingual README files, CI across Linux and Windows, a
53
+ private security reporting path, release notes, package verification scripts,
54
+ and a growing control center for safe summaries, audit views, lineage, and
55
+ evidence packs.
56
+
57
+ ## Current Public Evidence
58
+
59
+ Remote snapshot checked on 2026-07-19:
60
+
61
+ - GitHub repository: `jiezeng2004-design/PatchWarden`
62
+ - Stars: 2
63
+ - Forks: 0
64
+ - Open issues: 9
65
+ - Open pull requests: 4
66
+ - GitHub latest release: `v1.6.0`, published on 2026-07-16
67
+ - npm latest dist-tag: `patchwarden@1.5.1`
68
+
69
+ Local workspace facts, kept separate from the public snapshot:
70
+
71
+ - Local source version in `package.json`: `1.6.1`
72
+ - Local working branch: `codex/windows-desktop-tunnel-fixes`
73
+
74
+ Local source is `v1.6.1`; the 2026-07-19 remote snapshot still records GitHub
75
+ Release `v1.6.0` and npm `latest` `1.5.1`. Treat the publication surfaces as out
76
+ of sync; local builds do not establish that either remote surface was updated.
77
+
78
+ ## Existing Project Evidence
79
+
80
+ Repository-facing evidence already present:
81
+
82
+ - `README.md` and `README.en.md` explain the MCP bridge model, safety boundary,
83
+ setup, ChatGPT/Codex/OpenCode usage, and local data handling.
84
+ - `CHANGELOG.md` records ongoing releases from the 1.0 line through 1.6.1.
85
+ - `SECURITY.md` directs vulnerability reports to GitHub private security
86
+ advisories.
87
+ - `CONTRIBUTING.md` documents local verification and safety expectations.
88
+ - `.github/workflows/ci.yml` runs Node 20 checks on Ubuntu and Windows, full
89
+ regression tests, MCP smoke tests, HTTP MCP smoke tests, redacted doctor,
90
+ clean package verification, npm package-surface verification, and Gitleaks.
91
+ - `.github/ISSUE_TEMPLATE/` and `.github/PULL_REQUEST_TEMPLATE.md` guide bug,
92
+ feature, and safety review reports.
93
+ - `docs/release-checklist.md` separates local validation, PR review, GitHub
94
+ Release, npm publish, and remote publication verification.
95
+ - `docs/chatgpt-usage.md` documents safer ChatGPT connector usage patterns.
96
+ - `docs/demo.md` provides a privacy-safe demo flow.
97
+ - `docs/assets/patchwarden-chatgpt-demo.svg` provides a repository-safe visual
98
+ demo asset.
99
+ - `docs/assets/patchwarden-oss-demo.gif` provides a privacy-safe animated demo
100
+ of the maintainer workflow. It is scripted demo material, not adoption
101
+ evidence.
102
+
103
+ ## Related Project
104
+
105
+ RelayForge can be mentioned as a related local-first AI coding gateway project,
106
+ but PatchWarden should be the primary application repository because its safety
107
+ boundary and MCP maintainer workflow are more directly aligned with Codex-style
108
+ OSS automation.
109
+
110
+ ## Honest Gaps
111
+
112
+ PatchWarden should not claim broad adoption yet. The strongest current argument
113
+ is ecosystem importance, not stars or download volume.
114
+
115
+ Known gaps before submission:
116
+
117
+ - collect 3 to 5 real user reports through GitHub issues or discussions
118
+ - record a live screencast if stronger evidence is needed; a privacy-safe
119
+ scripted GIF now exists for the public maintainer workflow
120
+ - resolve the release lag through the reviewed workflow; local source is
121
+ `1.6.1`, while the last verified GitHub Release is `1.6.0` and npm `latest`
122
+ / `dist-tags.latest` are `1.5.1`
123
+ - add small contributor-friendly roadmap issues such as macOS docs, Codex CLI
124
+ examples, and a minimal demo repository
125
+
126
+ Do not fabricate feedback, usage numbers, or third-party endorsements.
127
+
128
+ ## Application Statement
129
+
130
+ PatchWarden addresses a growing safety gap in AI coding workflows: connecting
131
+ ChatGPT, Codex, OpenCode, and other MCP clients to local coding agents without
132
+ giving the upstream model unrestricted shell access. It provides workspace
133
+ confinement, command allowlists, sensitive-path blocking, scope-violation
134
+ detection, CI-backed regression tests, release verification, and auditable task
135
+ evidence. As the primary maintainer, I maintain the architecture, TypeScript
136
+ implementation, documentation, security policy, tests, release workflow, and
137
+ review process. The project is early, with low public adoption metrics, but it
138
+ directly supports safer OSS maintainer automation for Codex-style agents.
139
+
140
+ ## API Credits Use
141
+
142
+ API credits would be used for maintainer automation only:
143
+
144
+ - Codex-assisted pull request review
145
+ - security regression analysis
146
+ - release evidence review
147
+ - documentation consistency checks
148
+ - compatibility testing across ChatGPT, Codex, OpenCode, and MCP profiles
149
+ - issue triage and small test generation
150
+
151
+ Credits would not be used to publish releases automatically, bypass human
152
+ confirmation, inspect private credentials, or weaken PatchWarden's safety
153
+ boundary.
154
+
155
+ ## Submission Checklist
156
+
157
+ - [ ] Confirm GitHub stars, forks, issues, PRs, and latest release again on the
158
+ day of submission.
159
+ - [ ] Confirm `npm.cmd view patchwarden version dist-tags --json`.
160
+ - [ ] Confirm README version text matches the intended release story.
161
+ - [ ] Link `docs/threat-model.md`.
162
+ - [ ] Link `docs/release-evidence.md`.
163
+ - [ ] Link `docs/user-feedback.md` only after real feedback exists.
164
+ - [x] Prepare a privacy-safe scripted GIF without secrets or private workspace
165
+ names.
166
+ - [ ] Optionally record a live screencast for stronger external evidence.
167
+ - [ ] Do not click any final application submit button until the maintainer has
168
+ reviewed the form.
@@ -0,0 +1,151 @@
1
+ # OpenCode worker 集成模式
2
+
3
+ > 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
4
+ > 说明:本文描述的是 PatchWarden 将 OpenCode 作为 worker agent 的集成模式建议。
5
+ > OpenCode 是独立的本地编程 Agent 项目,本文不声称任何官方集成关系。
6
+
7
+ ## OpenCode 是什么
8
+
9
+ OpenCode 是面向本地开发的编程 Agent,主要能力包括:
10
+
11
+ - 在本地仓库中读写文件、执行命令、运行测试。
12
+ - 接收自然语言任务描述并产出代码改动。
13
+ - 支持多种模型后端。
14
+
15
+ OpenCode 本身是通用 Agent,默认不具备 PatchWarden 的安全边界。
16
+ 本文描述如何让 PatchWarden 作为外部监督层,OpenCode 作为受约束的 worker。
17
+
18
+ ## External Supervisor Pattern
19
+
20
+ PatchWarden 与 OpenCode 的集成采用 **external supervisor pattern**:
21
+
22
+ ```
23
+ MCP 客户端 → PatchWarden(supervisor)→ OpenCode(worker)→ workspace
24
+ ↑ 安全边界在此
25
+ ```
26
+
27
+ - **PatchWarden 作为 supervisor**:接收 MCP 客户端的任务请求,
28
+ 负责工作区隔离、命令允许列表、范围违规检测、证据收集。
29
+ - **OpenCode 作为 worker**:在 PatchWarden 允许的范围内执行具体编码任务。
30
+ - **安全边界在 PatchWarden 侧**:OpenCode 的所有文件改动与命令执行
31
+ 必须经过 PatchWarden 的策略校验。
32
+
33
+ 关键点:OpenCode 不直接暴露给 MCP 客户端,而是由 PatchWarden 调度。
34
+ 这避免了 OpenCode 在无监督下执行越权操作。
35
+
36
+ ## 配置示例
37
+
38
+ ### 1. 在 PatchWarden 中注册 OpenCode agent
39
+
40
+ 在 `.patchwarden/config.json` 中注册 OpenCode:
41
+
42
+ ```json
43
+ {
44
+ "workspaceRoot": "D:\\repos\\my-project",
45
+ "agents": [
46
+ {
47
+ "name": "opencode",
48
+ "type": "local-worker",
49
+ "command": "opencode",
50
+ "args": ["--no-interactive"],
51
+ "workspace": "D:\\repos\\my-project"
52
+ }
53
+ ],
54
+ "evidencePackVersion": 2,
55
+ "safeResult": { "maxBytes": 4096 }
56
+ }
57
+ ```
58
+
59
+ ### 2. 配置 project-policy.json 约束 OpenCode 的操作范围
60
+
61
+ ```json
62
+ {
63
+ "allowedPaths": ["src/**", "test/**", "docs/**"],
64
+ "allowedCommands": [
65
+ "npm.cmd test",
66
+ "npm.cmd run build",
67
+ "git status",
68
+ "git diff",
69
+ "opencode --no-interactive"
70
+ ],
71
+ "blockedFiles": [".env", ".env.*", "id_rsa", "*.key", "*.pem", "cookies.db"],
72
+ "scopeRules": {
73
+ "enforceDeclaredFiles": true,
74
+ "blockOutOfWorkspace": true
75
+ }
76
+ }
77
+ ```
78
+
79
+ ### 3. OpenCode 在 workspace 内执行
80
+
81
+ OpenCode 进程由 PatchWarden 启动并监督:
82
+
83
+ ```powershell
84
+ # PatchWarden 通过 MCP 工具 run_safe_task 调度 OpenCode
85
+ # MCP 客户端传入任务描述与声明的文件范围
86
+ # PatchWarden 在执行前校验范围,执行中监督,执行后收集证据
87
+ ```
88
+
89
+ ## 工作流示例
90
+
91
+ ### 任务:让 OpenCode 实现一个新模块
92
+
93
+ 1. **MCP 客户端发起任务**:
94
+
95
+ ```json
96
+ {
97
+ "agent": "opencode",
98
+ "task": "add input validation to src/handlers/user.ts",
99
+ "declaredFiles": ["src/handlers/user.ts", "test/handlers/user.test.ts"]
100
+ }
101
+ ```
102
+
103
+ 2. **PatchWarden 校验范围**:
104
+
105
+ - `src/handlers/user.ts` 与 `test/handlers/user.test.ts` 在 `allowedPaths` 内。
106
+ - `opencode` 命令在 `allowedCommands` 内。
107
+ - 无 `blockedFiles` 命中。
108
+
109
+ 3. **PatchWarden 启动 OpenCode worker**:
110
+
111
+ - OpenCode 在 `workspaceRoot` 下执行。
112
+ - OpenCode 的文件改动受 PatchWarden 监督。
113
+ - 若 OpenCode 尝试修改未声明文件,PatchWarden 触发范围违规检测并阻断。
114
+
115
+ 4. **任务完成后导出证据**:
116
+
117
+ ```powershell
118
+ # 产物位于 .patchwarden/evidence-packs/<lineage_id>/
119
+ # 包含 evidence.json / EVIDENCE.md / risk.json / verify.json 等 8 个文件
120
+ ```
121
+
122
+ ## 安全边界
123
+
124
+ PatchWarden 对 OpenCode worker 的约束包括:
125
+
126
+ | 维度 | 约束 |
127
+ | --- | --- |
128
+ | 文件读写 | 必须在 `allowedPaths` 内,命中 `blockedFiles` 即阻断 |
129
+ | 命令执行 | 必须在 `allowedCommands` 中(精确匹配) |
130
+ | 工作区 | OpenCode 进程的 cwd 限定在 `workspaceRoot` 下 |
131
+ | 越界改动 | `enforceDeclaredFiles` 为 true 时,未声明文件改动被阻断 |
132
+ | 敏感资源 | `.env`、SSH key、cookie、token 等一律不可访问 |
133
+ | 进程监督 | OpenCode 进程由 PatchWarden launcher 拥有,可被监督与终止 |
134
+
135
+ ## 注意事项
136
+
137
+ - OpenCode 必须以非交互模式运行(如 `--no-interactive`),避免阻塞 PatchWarden。
138
+ - OpenCode 的模型后端配置(API key 等)属于 OpenCode 自身配置,
139
+ PatchWarden 不读取也不持久化这些凭据。
140
+ - 若 OpenCode 任务需要执行 `allowedCommands` 之外的命令,
141
+ 应先更新 `project-policy.json` 再执行,不应临时放宽约束。
142
+ - OpenCode worker 的 stdout / stderr 由 PatchWarden 收集为有界摘要,
143
+ 完整日志不直接暴露给 MCP 客户端。
144
+ - 本集成模式不修改 OpenCode 的任何行为,仅在调度与监督层面配合。
145
+
146
+ ## 相关文档
147
+
148
+ - `docs/threat-model.md`:PatchWarden 安全契约与进程监督边界。
149
+ - `docs/evidence-pack-schema.md`:Evidence Pack v2 文件结构。
150
+ - `docs/why-patchwarden.md`:external supervisor pattern 的定位。
151
+ - `docs/openhands-worker.md`:类似的 worker 集成模式(OpenHands)。
@@ -0,0 +1,181 @@
1
+ # OpenHands worker 集成模式
2
+
3
+ > 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
4
+ > 说明:本文描述的是 PatchWarden 将 OpenHands 作为 worker agent 的集成模式建议。
5
+ > OpenHands 是独立的 AI 软件开发 Agent 项目,本文不声称任何官方集成关系。
6
+
7
+ ## OpenHands 是什么
8
+
9
+ OpenHands 是面向软件开发的 AI Agent,主要能力包括:
10
+
11
+ - 在本地或容器化环境中编写、修改、调试代码。
12
+ - 执行测试、运行构建、操作文件系统。
13
+ - 接收自然语言任务并自主规划实现步骤。
14
+ - 支持多种模型后端与运行时环境。
15
+
16
+ OpenHands 默认以较自主的方式运行,本身不具备 PatchWarden 的安全边界。
17
+ 本文描述如何让 PatchWarden 作为外部监督层,OpenHands 作为受约束的 worker。
18
+
19
+ ## External Supervisor Pattern
20
+
21
+ PatchWarden 与 OpenHands 的集成采用 **external supervisor pattern**:
22
+
23
+ ```
24
+ MCP 客户端 → PatchWarden(supervisor)→ OpenHands(worker)→ workspace
25
+ ↑ 安全边界在此
26
+ ```
27
+
28
+ - **PatchWarden 作为 supervisor**:接收 MCP 客户端的任务请求,
29
+ 负责工作区隔离、命令允许列表、范围违规检测、证据收集。
30
+ - **OpenHands 作为 worker**:在 PatchWarden 允许的范围内执行软件开发任务。
31
+ - **安全边界在 PatchWarden 侧**:OpenHands 的所有文件改动与命令执行
32
+ 必须经过 PatchWarden 的策略校验。
33
+
34
+ 关键点:OpenHands 不直接暴露给 MCP 客户端,而是由 PatchWarden 调度。
35
+ 这避免了 OpenHands 在无监督下执行越权操作或访问敏感资源。
36
+
37
+ ## 配置示例
38
+
39
+ ### 1. 在 PatchWarden 中注册 OpenHands agent
40
+
41
+ 在 `.patchwarden/config.json` 中注册 OpenHands:
42
+
43
+ ```json
44
+ {
45
+ "workspaceRoot": "D:\\repos\\my-project",
46
+ "agents": [
47
+ {
48
+ "name": "openhands",
49
+ "type": "local-worker",
50
+ "command": "openhands",
51
+ "args": ["--headless", "--task"],
52
+ "workspace": "D:\\repos\\my-project"
53
+ }
54
+ ],
55
+ "evidencePackVersion": 2,
56
+ "safeResult": { "maxBytes": 4096 }
57
+ }
58
+ ```
59
+
60
+ ### 2. 配置 project-policy.json 约束 OpenHands 的操作范围
61
+
62
+ ```json
63
+ {
64
+ "allowedPaths": ["src/**", "test/**", "docs/**"],
65
+ "allowedCommands": [
66
+ "npm.cmd test",
67
+ "npm.cmd run build",
68
+ "git status",
69
+ "git diff",
70
+ "openhands --headless"
71
+ ],
72
+ "blockedFiles": [".env", ".env.*", "id_rsa", "*.key", "*.pem", "cookies.db"],
73
+ "scopeRules": {
74
+ "enforceDeclaredFiles": true,
75
+ "blockOutOfWorkspace": true
76
+ }
77
+ }
78
+ ```
79
+
80
+ ### 3. OpenHands 在 workspace 内执行
81
+
82
+ OpenHands 进程由 PatchWarden 启动并监督:
83
+
84
+ ```powershell
85
+ # PatchWarden 通过 MCP 工具 run_safe_task 调度 OpenHands
86
+ # MCP 客户端传入任务描述与声明的文件范围
87
+ # PatchWarden 在执行前校验范围,执行中监督,执行后收集证据
88
+ ```
89
+
90
+ ## 工作流示例
91
+
92
+ ### 任务:让 OpenHands 修复一个 bug
93
+
94
+ 1. **MCP 客户端发起任务**:
95
+
96
+ ```json
97
+ {
98
+ "agent": "openhands",
99
+ "task": "fix null pointer in src/services/auth.ts when token is missing",
100
+ "declaredFiles": ["src/services/auth.ts", "test/services/auth.test.ts"]
101
+ }
102
+ ```
103
+
104
+ 2. **PatchWarden 校验范围**:
105
+
106
+ - `src/services/auth.ts` 与 `test/services/auth.test.ts` 在 `allowedPaths` 内。
107
+ - `openhands` 命令在 `allowedCommands` 内。
108
+ - 无 `blockedFiles` 命中。
109
+
110
+ 3. **PatchWarden 启动 OpenHands worker**:
111
+
112
+ - OpenHands 在 `workspaceRoot` 下以 headless 模式执行。
113
+ - OpenHands 的文件改动受 PatchWarden 监督。
114
+ - 若 OpenHands 尝试修改未声明文件,PatchWarden 触发范围违规检测并阻断。
115
+ - 若 OpenHands 尝试读取 `.env` 或凭据文件,PatchWarden 立即阻断。
116
+
117
+ 4. **任务完成后导出证据**:
118
+
119
+ ```powershell
120
+ # 产物位于 .patchwarden/evidence-packs/<lineage_id>/
121
+ # 包含 evidence.json / EVIDENCE.md / risk.json / verify.json 等 8 个文件
122
+ ```
123
+
124
+ ## 安全边界
125
+
126
+ PatchWarden 对 OpenHands worker 的约束包括:
127
+
128
+ | 维度 | 约束 |
129
+ | --- | --- |
130
+ | 文件读写 | 必须在 `allowedPaths` 内,命中 `blockedFiles` 即阻断 |
131
+ | 命令执行 | 必须在 `allowedCommands` 中(精确匹配) |
132
+ | 工作区 | OpenHands 进程的 cwd 限定在 `workspaceRoot` 下 |
133
+ | 越界改动 | `enforceDeclaredFiles` 为 true 时,未声明文件改动被阻断 |
134
+ | 敏感资源 | `.env`、SSH key、cookie、token 等一律不可访问 |
135
+ | 进程监督 | OpenHands 进程由 PatchWarden launcher 拥有,可被监督与终止 |
136
+ | 网络访问 | 取决于 OpenHands 运行时配置,PatchWarden 不放宽命令允许列表 |
137
+
138
+ ## 容器化运行注意事项
139
+
140
+ 若 OpenHands 运行在容器中,需额外注意:
141
+
142
+ - PatchWarden 监督的是宿主机上的 OpenHands 进程,
143
+ 容器内的文件系统改动应通过挂载卷映射回 `workspaceRoot`。
144
+ - `project-policy.json` 的 `allowedPaths` 应对应宿主机路径,
145
+ 而非容器内路径。
146
+ - 容器内的命令执行若需被 PatchWarden 监督,
147
+ 应通过 OpenHands 的 headless 接口走 PatchWarden 调度,
148
+ 而非绕过 PatchWarden 直接在容器内执行。
149
+
150
+ ## 注意事项
151
+
152
+ - OpenHands 必须以 headless / 非交互模式运行,避免阻塞 PatchWarden。
153
+ - OpenHands 的模型后端配置(API key 等)属于 OpenHands 自身配置,
154
+ PatchWarden 不读取也不持久化这些凭据。
155
+ - 若 OpenHands 任务需要执行 `allowedCommands` 之外的命令,
156
+ 应先更新 `project-policy.json` 再执行,不应临时放宽约束。
157
+ - OpenHands worker 的 stdout / stderr 由 PatchWarden 收集为有界摘要,
158
+ 完整日志不直接暴露给 MCP 客户端。
159
+ - 本集成模式不修改 OpenHands 的任何行为,仅在调度与监督层面配合。
160
+
161
+ ## 与 OpenCode worker 的差异
162
+
163
+ OpenHands 与 OpenCode 的集成模式在结构上一致(均采用 external supervisor pattern),
164
+ 主要差异在于:
165
+
166
+ | 维度 | OpenCode | OpenHands |
167
+ | --- | --- | --- |
168
+ | 定位 | 本地编程 Agent | AI 软件开发 Agent |
169
+ | 运行模式 | 通常直接在宿主机 | 支持 headless 与容器化 |
170
+ | 自主性 | 中等,偏交互式 | 较高,偏自主规划 |
171
+ | 适用任务 | 中小规模代码改动 | 较复杂的软件开发任务 |
172
+
173
+ 选择哪个 worker 取决于任务复杂度与运行时偏好,
174
+ PatchWarden 的安全边界对两者一视同仁。
175
+
176
+ ## 相关文档
177
+
178
+ - `docs/threat-model.md`:PatchWarden 安全契约与进程监督边界。
179
+ - `docs/evidence-pack-schema.md`:Evidence Pack v2 文件结构。
180
+ - `docs/why-patchwarden.md`:external supervisor pattern 的定位。
181
+ - `docs/opencode-worker.md`:类似的 worker 集成模式(OpenCode)。
@@ -3,7 +3,7 @@
3
3
  PatchWarden releases remain confirmation-gated. Creating a tag or GitHub Release does not publish npm automatically.
4
4
 
5
5
  1. Work on a release branch and update `package.json`, changelog/release notes, README, examples, and tool manifests together.
6
- 2. Run the complete local quality gates from `AGENTS.md`.
6
+ 2. Run the complete local quality gates from `AGENTS.md`. For Desktop, run `npm.cmd run desktop:preflight:release` from a clean checkout before creating the installer.
7
7
  3. Open a pull request, wait for `CI gate`, review the diff and package contents, then merge.
8
8
  4. Create the version tag from the verified merge commit.
9
9
  5. Create the GitHub Release and attach only reviewed release artifacts and checksums.
@@ -0,0 +1,82 @@
1
+ # PatchWarden Release Evidence
2
+
3
+ This file separates local source state from public release truth. Update it
4
+ before submitting external applications or publishing a release.
5
+
6
+ ## Current Snapshot
7
+
8
+ Remote facts checked on 2026-07-19. Local source and branch values were read
9
+ from the PatchWarden workspace and are not evidence that a public package was
10
+ published.
11
+
12
+ | Surface | Current evidence |
13
+ | --- | --- |
14
+ | Local branch | `codex/windows-desktop-tunnel-fixes` |
15
+ | Local `package.json` | `patchwarden@1.6.1` |
16
+ | GitHub latest release | `v1.6.0` |
17
+ | GitHub release URL | https://github.com/jiezeng2004-design/PatchWarden/releases/tag/v1.6.0 |
18
+ | GitHub release published on | 2026-07-16 |
19
+ | npm latest | `patchwarden@1.5.1` |
20
+ | npm `dist-tags.latest` | `1.5.1` |
21
+ | GitHub stars | 2 |
22
+ | GitHub forks | 0 |
23
+ | Open issues | 9 |
24
+ | Open pull requests | 4 |
25
+
26
+ Conclusion: local source is `v1.6.1`; the last verified GitHub Release is
27
+ `v1.6.0`, while npm `latest` remains `1.5.1`. Do not describe the public
28
+ release surfaces as synchronized until GitHub, npm, and `dist-tags.latest` are
29
+ independently verified at the intended version.
30
+
31
+ ## Commands Used
32
+
33
+ Windows PowerShell:
34
+
35
+ ```powershell
36
+ gh repo view jiezeng2004-design/PatchWarden --json nameWithOwner,stargazerCount,forkCount,issues,pullRequests,defaultBranchRef,pushedAt,url,description,licenseInfo,repositoryTopics,latestRelease,hasDiscussionsEnabled,hasIssuesEnabled,securityPolicyUrl
37
+ gh release view v1.6.0 --repo jiezeng2004-design/PatchWarden --json tagName,name,publishedAt,isDraft,isPrerelease,url
38
+ gh release view --repo jiezeng2004-design/PatchWarden --json tagName,name,publishedAt,isDraft,isPrerelease,url
39
+ npm.cmd view patchwarden version dist-tags --json --cache .\.npm-cache
40
+ ```
41
+
42
+ The npm query was verified on 2026-07-19: `version=1.5.1` and
43
+ `dist-tags.latest=1.5.1`.
44
+
45
+ ## Local Verification Snapshot (Separate From Remote Truth)
46
+
47
+ The following 2026-07-19 baseline checks describe the local working tree only.
48
+ They do not prove GitHub/npm publication state, and the complete gate must be
49
+ rerun after the current optimization work finishes.
50
+
51
+ - Root TypeScript `--noEmit` and the Desktop TypeScript build: passed.
52
+ - Targeted reliability/security tests: 49 passed; targeted Desktop backend
53
+ lifecycle tests: 8 passed.
54
+ - `npm.cmd test`: passed on the second baseline run, including 139/139 security
55
+ checks, 747 passed and 2 skipped unit tests, 22/22 lifecycle checks, and
56
+ 32/32 Control Center checks. An earlier run exposed one Git commit setup
57
+ flake; the test setup was then hardened.
58
+ - `npm.cmd run test:mcp`: passed.
59
+ - `npm.cmd run test:http-mcp`: 13 passed, 0 failed.
60
+ - `npm.cmd run desktop:test`: 41 passed, 0 failed at the baseline snapshot.
61
+ - Root and Desktop dependency audits: 0 known vulnerabilities.
62
+ - `npm.cmd run pack:clean` was not run for this historical baseline. Current
63
+ versions recreate only `release/package/` plus the two root package archives;
64
+ Desktop and preflight siblings under `release/` are preserved. It still
65
+ overwrites those package artifacts, so run it only during explicitly approved
66
+ release preparation.
67
+
68
+ ## Release Verification Checklist
69
+
70
+ - [ ] Confirm the target version in `package.json`.
71
+ - [ ] Confirm `src/version.ts`, package metadata, README version text, and
72
+ changelog agree.
73
+ - [ ] Run the complete local gate chain from `AGENTS.md`.
74
+ - [ ] Open a PR and wait for the GitHub CI gate.
75
+ - [ ] Merge only after review.
76
+ - [ ] Create the tag from the verified merge commit.
77
+ - [ ] Create the GitHub Release with reviewed artifacts and checksums.
78
+ - [ ] Publish `patchwarden` to npm using process-scoped authentication.
79
+ - [ ] Verify the remote tag, GitHub Release, npm package version, and
80
+ `dist-tags.latest`.
81
+
82
+ Do not publish new versions under the frozen pre-rename package name.