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
@@ -1,205 +0,0 @@
1
- # PatchWarden Control Center MVP
2
-
3
- > 本地 Web 控制中心,统一管理 PatchWarden Core 与 PatchWarden Direct 两个 MCP profile。
4
- > 不合并工具,不发布到 npm,不打 git tag。
5
-
6
- ## 概述
7
-
8
- Control Center 是一个绑定 `127.0.0.1:8090` 的本地 HTTP 服务,提供静态 UI 页面和一组容错 JSON API。
9
- 所有进程生命周期操作(start/stop/restart)均委托 `scripts/control/manage-patchwarden.ps1` 执行,
10
- Control Center 自身不直接 kill 进程,也不读取任意 PID 文件。
11
-
12
- - **Core profile**: `chatgpt_core`,17 个工具,HTTP 端口 8080
13
- - **Direct profile**: `chatgpt_direct`,10 个工具,HTTP 端口 8081
14
-
15
- ## 新增文件
16
-
17
- | 文件 | 说明 |
18
- | --- | --- |
19
- | `src/controlCenter.ts` | Control Center HTTP 服务主程序(TypeScript 源) |
20
- | `scripts/checks/control-center-smoke.js` | 测试模式冒烟测试(ESM,仅用 Node 内置模块) |
21
- | `scripts/control/start-control-center.ps1` | PowerShell 启动脚本(含构建检查、端口轮询、浏览器自动打开;支持 `-NoBrowser`) |
22
- | `PatchWarden-Control.cmd` | 根目录 CMD 入口,调用上述 PowerShell 脚本 |
23
- | `ui/pages/dashboard.html` | 总控首页(真实状态,7 个工具栏按钮,两张服务卡) |
24
- | `ui/pages/tasks.html` | 任务列表页(接 `/api/tasks`) |
25
- | `ui/pages/task-detail.html` | 任务详情页(接 `/api/tasks/:taskId`) |
26
- | `ui/pages/workspace.html` | 工作区页(接轻量 `/api/workspace`) |
27
- | `ui/pages/audit.html` | 审计历史页(接 `/api/audit`) |
28
- | `ui/partials/project-shell.html` | 页面外壳(CDN 引用已替换为本地 `/vendor/`) |
29
- | `ui/colors_and_type.css` | 颜色与字体样式 |
30
- | `ui/vendor/tailwindcss-browser.js` | Tailwind v4.3.1 browser build(本地副本,离线可用) |
31
- | `ui/vendor/lucide.js` | Lucide v1.8.0 UMD(本地副本,离线可用) |
32
- | `docs/control-center/control-center-mvp.md` | 本文档 |
33
-
34
- ## 改动文件
35
-
36
- | 文件 | 改动 |
37
- | --- | --- |
38
- | `package.json` | 新增 `start:control` 脚本(`node dist/controlCenter.js`);`files` 数组新增 `ui/`;`test` 脚本末尾追加 `&& node scripts/checks/control-center-smoke.js` |
39
- | `.gitignore` | 新增 `/CODE_WIKI.md`、`/PatchWarden-UI.zip`、`/patchwarden-v0.6.1-SHA256SUMS.txt`(避免 brand-check 误报) |
40
-
41
- ## 启动方式
42
-
43
- ### 方式一:CMD 入口(推荐用户使用)
44
-
45
- ```powershell
46
- .\PatchWarden-Control.cmd
47
- ```
48
-
49
- ### 方式二:PowerShell 脚本
50
-
51
- ```powershell
52
- # 正常启动(构建检查 + 打开浏览器)
53
- powershell -ExecutionPolicy Bypass -File scripts\control\start-control-center.ps1
54
-
55
- # 测试模式(不打开浏览器)
56
- powershell -ExecutionPolicy Bypass -File scripts\control\start-control-center.ps1 -NoBrowser
57
- ```
58
-
59
- ### 方式三:npm 脚本(需先 `npm run build`)
60
-
61
- ```powershell
62
- npm.cmd run build
63
- npm.cmd run start:control
64
- ```
65
-
66
- 启动后自动打开 `http://127.0.0.1:8090`。
67
-
68
- 端口可通过环境变量覆盖(仅用于测试):
69
-
70
- ```powershell
71
- $env:PATCHWARDEN_CONTROL_PORT=18090; node dist/controlCenter.js
72
- ```
73
-
74
- ## 控制 Token 校验
75
-
76
- - 服务启动时通过 `crypto.randomUUID()` 生成 token,**仅保存在内存中**,不写入任何文件。
77
- - 前端通过 `GET /control-token.json` 从内存获取 token,响应头 `Cache-Control: no-store`。
78
- - **所有 POST 接口**(含 `/api/start-all`、`/api/stop-all`、`/api/restart-all`、`/api/core/*`、`/api/direct/*`、`/api/open-logs-folder`)必须携带 `X-PatchWarden-Control-Token` 请求头。
79
- - token 缺失或错误时返回 `403`,不执行任何进程控制或本地系统动作。
80
- - GET 接口(status、tasks、logs 等)不需要 token。
81
- - `git status --porcelain` 不会出现 `ui/control-token.json`。
82
-
83
- ## API 清单
84
-
85
- ### GET 接口(免 token)
86
-
87
- | 路径 | 说明 |
88
- | --- | --- |
89
- | `GET /` | 返回 `ui/pages/dashboard.html` |
90
- | `GET /control-token.json` | 从内存返回控制 token,`Cache-Control: no-store` |
91
- | `GET /colors_and_type.css` | 静态 CSS |
92
- | `GET /pages/*` | 静态 HTML 页面 |
93
- | `GET /partials/*` | 静态 HTML 片段 |
94
- | `GET /vendor/*` | 本地化的 Tailwind / Lucide |
95
- | `GET /api/status` | 聚合状态(容错,永不 500) |
96
- | `GET /api/tasks` | 任务列表(复用 `listTasks`) |
97
- | `GET /api/tasks/:taskId` | 任务详情(status/runtime/result/audit/diff_patch/test_log) |
98
- | `GET /api/logs/core` | Core runtime 日志尾部 100 行(脱敏) |
99
- | `GET /api/logs/direct` | Direct runtime 日志尾部 100 行(脱敏) |
100
- | `GET /api/logs/watcher` | Watcher 日志尾部 100 行(脱敏) |
101
- | `GET /api/workspace` | 轻量工作区信息(workspace_root、directories、agents、config 摘要;**不做 git 扫描**) |
102
- | `GET /api/audit` | 审计历史(扫描 tasks 目录下含 audit.json 的任务,最多 50 条) |
103
- | `GET /api/tunnel-ui-url` | 读取 Core/Direct 的 tunnel-health-url.txt |
104
-
105
- ### POST 接口(必须校验 token)
106
-
107
- | 路径 | 委托命令 | 说明 |
108
- | --- | --- | --- |
109
- | `POST /api/start-all` | `manage-patchwarden.ps1 start all` | 启动全部 |
110
- | `POST /api/stop-all` | `manage-patchwarden.ps1 stop all` | 停止全部 |
111
- | `POST /api/restart-all` | `manage-patchwarden.ps1 restart all` | 重启全部 |
112
- | `POST /api/core/start` | `manage-patchwarden.ps1 start core` | 启动 Core |
113
- | `POST /api/core/stop` | `manage-patchwarden.ps1 stop core` | 停止 Core |
114
- | `POST /api/direct/start` | `manage-patchwarden.ps1 start direct` | 启动 Direct |
115
- | `POST /api/direct/stop` | `manage-patchwarden.ps1 stop direct` | 停止 Direct |
116
- | `POST /api/open-logs-folder` | 系统命令打开 runtime 目录 | 打开日志文件夹 |
117
-
118
- ### `/api/status` 返回结构(容错)
119
-
120
- ```json
121
- {
122
- "core": { "available": false, "reason": "...", "healthz": null, "readyz": null },
123
- "direct": { "available": false, "reason": "...", "healthz": null, "readyz": null },
124
- "watcher": { "status": "missing|healthy|stale|unreadable", "available": false, "reason": "..." },
125
- "tunnel": { "core": { "observed": false }, "direct": { "observed": false } },
126
- "tools": {
127
- "core": { "tool_profile": null, "tool_count": null, "schema_epoch": null, "tool_manifest_sha256": null, "tool_names": null },
128
- "direct": { "tool_profile": null, "tool_count": null, "schema_epoch": null, "tool_manifest_sha256": null, "tool_names": null }
129
- },
130
- "agents": [],
131
- "workspace_root": "string | null",
132
- "tasks": { "tasks": [], "total": 0, "active": 0, "stale": 0, "reason": null }
133
- }
134
- ```
135
-
136
- 容错保证:
137
- - core/direct health 探测失败 → `{ available: false, reason: "..." }`,接口仍 200
138
- - runtime 文件(tunnel-status.json、tool-manifest.json)缺失 → 返回 null 或 `{ observed: false }`,接口仍 200
139
- - 日志文件缺失 → `{ stdout: "", stderr: "", reason: "..." }`,接口仍 200
140
- - tasks 目录缺失 → `{ tasks: [], total: 0, reason: "..." }`,接口仍 200
141
- - Core/Direct 未启动时 `/api/status` 仍返回 200 JSON,不报 500
142
-
143
- ## 进程安全
144
-
145
- - Control Center **不直接 kill 进程**,所有 start/stop/restart 均委托 `scripts/control/manage-patchwarden.ps1`。
146
- - `manage-patchwarden.ps1` 的 `Test-TunnelProcessForMode` 在 stop/restart 前校验进程命令行属于 `tunnel-client.exe --profile` 模式,仅停止匹配的进程。
147
- - **不根据任意 PID 文件 kill 进程**。
148
- - Control Center 仅在自身服务关闭时退出自己启动的 HTTP server。
149
-
150
- ## CDN 本地化
151
-
152
- - 所有 HTML 无 `https://cdn` 或 `https://unpkg` 引用。
153
- - `ui/vendor/tailwindcss-browser.js`(Tailwind v4.3.1)和 `ui/vendor/lucide.js`(Lucide v1.8.0)为本地副本。
154
- - 断网后页面样式和图标正常渲染。
155
-
156
- ## 冒烟测试(测试模式)
157
-
158
- `scripts/checks/control-center-smoke.js` 严格遵循测试模式:
159
-
160
- - 不打开浏览器
161
- - 不真正 start/stop Core 或 Direct
162
- - 不 kill 任何进程(仅关闭自己 spawn 的 controlCenter 子进程)
163
- - 使用测试端口 `18090`(通过 `PATCHWARDEN_CONTROL_PORT`),避免 8090 冲突
164
- - 测试结束关闭 server,释放端口
165
-
166
- 测试覆盖(10 项):
167
-
168
- 1. 静态文件服务(`/`、`/vendor/*`、`/colors_and_type.css` 返回 200 + 正确 Content-Type)
169
- 2. `/api/status` 返回有效 JSON 且容错(core/direct 未启动时仍 200)
170
- 3. `/api/tasks` 返回有效 JSON
171
- 4. `/control-token.json` 返回 token + `Cache-Control: no-store`
172
- 5. POST `/api/start-all` 不带 token → 403
173
- 6. POST `/api/start-all` 带错误 token → 403
174
- 7. POST `/api/open-logs-folder` 不带 token → 403
175
- 8. token 不污染 Git(`git status --porcelain` 不含 `ui/control-token.json`)
176
- 9. 无 CDN 引用(HTML 文件无 `https://cdn` / `https://unpkg`)
177
- 10. 其他 GET API 可达(`/api/workspace`、`/api/audit`、`/api/logs/core`、`/api/tunnel-ui-url`)
178
-
179
- ## 测试结果
180
-
181
- `npm test` 全量通过(`FINAL_EXIT_CODE: 0`):
182
-
183
- | 测试链 | 结果 |
184
- | --- | --- |
185
- | smoke-test | OK |
186
- | unit-tests | 139 total(136 pass,0 fail,1 skipped) |
187
- | lifecycle-smoke | 22 passed, 0 failed |
188
- | doctor-smoke | OK |
189
- | tunnel-supervisor-smoke | OK |
190
- | watcher-supervisor-smoke | OK |
191
- | control-smoke | OK |
192
- | mcp-manifest-check | 17 tools, chatgpt_core profile |
193
- | brand-check | OK: 144 tracked files checked |
194
- | control-center-smoke | 10 passed, 0 failed |
195
-
196
- 未发布 npm、未打 git tag、未上传 npm。
197
-
198
- ## 已知限制
199
-
200
- 1. **`/api/workspace` 轻量版**:第一版只返回 workspace_root、项目列表(一级子目录)、agents、config 摘要。不做 git 扫描,不返回 repo clean 状态。workspace.html 中 "Repo Clean 状态" 显示为"按需接口待实现"占位。
201
- 2. **task-detail / workspace / audit 为基础接入**:能加载数据并渲染,但未实现全部高级功能(如 diff 高亮、审计证据深度展示)。diff/test-log 仅做文本预览。
202
- 3. **进程控制仅支持 Windows**:`manage-patchwarden.ps1` 为 PowerShell 脚本,POST 控制接口在非 Windows 环境下不可用。`/api/open-logs-folder` 在 macOS/Linux 下会尝试 `open`/`xdg-open`。
203
- 4. **Health 探测端口固定**:Core 探测 `127.0.0.1:8080`,Direct 探测 `127.0.0.1:8081`,暂不支持配置覆盖。
204
- 5. **Control token 生命周期**:token 在服务进程内存中,服务重启后 token 会变化(前端通过 `/control-token.json` 重新获取)。
205
- 6. **日志读取**:仅返回各日志文件尾部 100 行,并对敏感内容脱敏(复用 `redactSensitiveContent`)。
@@ -1,159 +0,0 @@
1
- # PatchWarden Control Center Phase 2
2
-
3
- > v0.6.3 在 v0.6.2 MVP 基础上增强任务、工作区、Direct session 和日志体验。
4
- > 不重构架构,不合并 Core/Direct MCP,不改现有 MCP 工具注册逻辑。
5
- > 不发布 npm,不打 git tag。
6
-
7
- ## 概述
8
-
9
- Phase 2 完全在 Control Center HTTP 层增强,未触动 MCP 工具注册、watcher 核心循环或
10
- Direct session 写入逻辑。新增的 API 全部沿用既有 token 校验、路径围栏和脱敏机制。
11
-
12
- - **Stale Task 管理**:4 条规则识别僵死任务,reconcile 只标注不删除
13
- - **task-detail 增强**:变更文件、验证摘要、警告/错误、stale 横幅 + 4 个动作按钮
14
- - **工作区按需 git 状态**:仅在用户点击时对单个 repo 执行 `git status --short`
15
- - **Direct Sessions 页面**:浏览 `.patchwarden/direct-sessions` 下的会话产物
16
- - **Logs 页面**:core/direct/watcher/control-center 四类日志,支持 tail 100/300/1000
17
-
18
- ## 启动方式
19
-
20
- 启动方式与 MVP 完全一致,无新增入口:
21
-
22
- ```powershell
23
- .\PatchWarden-Control.cmd
24
- # 或
25
- npm.cmd run build
26
- npm.cmd run start:control
27
- ```
28
-
29
- 启动后访问 `http://127.0.0.1:8090`,左侧导航新增「Direct 会话」和「日志」两项。
30
-
31
- ## 改动文件
32
-
33
- | 文件 | 改动 |
34
- | --- | --- |
35
- | `src/version.ts` | `PATCHWARDEN_VERSION` 0.6.2 → 0.6.3 |
36
- | `package.json` | `version` 0.6.2 → 0.6.3 |
37
- | `src/controlCenter.ts` | 新增 stale/reconcile/task-detail 增强/workspace repo status/direct sessions/logs 分类等 API |
38
- | `ui/pages/dashboard.html` | 侧边栏新增 Direct 会话 + 日志导航 |
39
- | `ui/pages/tasks.html` | 侧边栏新增 Direct 会话 + 日志导航 |
40
- | `ui/pages/task-detail.html` | 新增变更文件卡、验证摘要卡、警告/错误卡、stale 横幅、Refresh/Copy task_id/Open folder/Run audit/Reconcile 按钮 |
41
- | `ui/pages/workspace.html` | 每个 repo 新增「检查」按钮,按需调用 `/api/workspace/:repo/status`,渲染 git 状态面板 |
42
- | `ui/pages/audit.html` | 侧边栏新增 Direct 会话 + 日志导航 |
43
- | `ui/pages/direct-sessions.html` | 新页面:会话列表 + 会话详情(summary.md / audit.md / audit.json / diff.patch / changed-files.json) |
44
- | `ui/pages/logs.html` | 新页面:分类选择 + tail 选择 + 自动刷新开关 |
45
- | `scripts/checks/control-center-smoke.js` | 新增 Test 11–15 覆盖 Phase 2 API |
46
- | `docs/control-center/control-center-phase2.md` | 本文档 |
47
-
48
- ## 新增 API
49
-
50
- ### GET 接口(免 token)
51
-
52
- | 路径 | 说明 |
53
- | --- | --- |
54
- | `GET /api/tasks/stale` | 返回当前判定为 stale 的任务列表(含 stale_reasons) |
55
- | `GET /api/tasks/:taskId` | 增强详情:新增 `changed_files`、`file_stats`、`verification_summary`、`warnings`、`errors`、`stale`、`reconcile`、`task_dir`、`independent_review`、`verify_log` |
56
- | `GET /api/workspace/:repo/status` | 对单个 repo 执行 `git status --short`,返回 changed_files_count/untracked_count/modified_count/is_clean/short_status |
57
- | `GET /api/direct-sessions` | 列出 `.patchwarden/direct-sessions` 下所有会话摘要 |
58
- | `GET /api/direct-sessions/:sessionId` | 返回会话详情:summary/session/summary_md/diff_patch/audit_json/audit_md/changed_files |
59
- | `GET /api/logs/:category?tail=<100\|300\|1000>` | 四类日志(core/direct/watcher/control-center),支持 tail 行数 |
60
-
61
- ### POST 接口(必须校验 token)
62
-
63
- | 路径 | 说明 |
64
- | --- | --- |
65
- | `POST /api/tasks/:taskId/reconcile` | 标注 stale/archived,写入 `reconcile.json`,不删除任务 |
66
- | `POST /api/tasks/:taskId/audit` | 仅当任务处于终态时委托 `auditTask` 运行独立审计 |
67
- | `POST /api/tasks/:taskId/open-folder` | 通过系统命令打开任务目录 |
68
-
69
- ## Stale Task 判定规则
70
-
71
- `classifyStaleTask` 仅对 `pending` / `running` 状态任务判定(终态任务直接返回非 stale)。
72
- 判定使用 `config.watcherStaleSeconds` 作为阈值,4 条规则任一命中即标记 stale:
73
-
74
- | 规则 | 字段值 | 说明 |
75
- | --- | --- | --- |
76
- | `heartbeat_stale` | status=running 且 last_heartbeat_at 超过阈值 | 运行中但心跳长时间未更新 |
77
- | `collecting_artifacts_stale` | phase=collecting_artifacts 且心跳超过阈值 | 卡在产物收集阶段 |
78
- | `running_no_command_watcher_healthy` | status=running 且 current_command 为空且 watcher healthy | 运行中无命令但 watcher 在工作,疑似僵死 |
79
- | `heartbeat_far_behind_watcher` | 任务心跳比 watcher 心跳早 2× 阈值以上且 watcher healthy | 任务明显落后于 watcher |
80
-
81
- `/api/status` 和 `/api/tasks` 返回的任务对象均带 `is_stale: boolean` 和
82
- `stale_reasons: string[]`。`/api/status.tasks` 还聚合了 `stale` 计数和
83
- `stale_task_ids` 列表。
84
-
85
- ## Reconcile 行为
86
-
87
- `POST /api/tasks/:taskId/reconcile` 的安全契约:
88
-
89
- - **不删除任务**,不修改 `status` 枚举值
90
- - 读取 `status.json` / `runtime.json` 重建 `TaskEntry`,重新调用 `classifyStaleTask`
91
- - 决策(`decision` 字段):
92
- - `marked_archived`:任务已处于终态 → 标注归档
93
- - `marked_stale`:stale 且 watcher 未在驱动(无 current_command 或 watcher 非 healthy)→ 标注僵死
94
- - `no_action`:不满足上述条件 → 仅记录,不标注
95
- - 写入 `tasks/<taskId>/reconcile.json`(完整决策记录)
96
- - 仅当 `safe=true` 时,在 `status.json` 追加 `reconcile_state`(`"stale"` 或 `"archived"`)和 `reconciled_at`,**原 status 字段保持不变**
97
- - 返回 reconcile 记录 JSON
98
-
99
- ## 路径围栏(workspace repo status)
100
-
101
- `GET /api/workspace/:repo/status` 的安全约束:
102
-
103
- - `repo` 参数经 `decodeURIComponent` 后若包含 `..` 或 `\0` → 直接 400
104
- - 通过 `guardWorkspacePath(repo, workspaceRoot)` 解析为绝对路径,任何逃逸 `workspaceRoot` 的路径 → 400
105
- - 仅对解析后的目录执行 `git status --short`,超时 8 秒,maxBuffer 1MB
106
- - 非 git 仓库或 git 不可用时返回 200 + `is_git_repo: false` + error 字段,不返回 500
107
- - smoke test 用 `encodeURIComponent("../secret")` 验证穿越被拒(400)
108
-
109
- ## Direct Sessions 数据来源
110
-
111
- - 会话目录:`getDirectSessionsDir(config)` → `<runtime>/.patchwarden/direct-sessions/`
112
- - 每个会话子目录读取:`session.json`、`summary.json`、`audit.json`、`summary.md`、`diff.patch`、`audit.md`、`changed-files.json`
113
- - `DirectSessionSummary` 字段:`session_id`、`repo_path`、`resolved_repo_path`、`created_at`、`expires_at`、`finalized`、`finalized_at`、`audited`、`changed_files_total`、`verification_summary`、`audit_decision`、`audit_checked_at`、`title`
114
- - 目录不存在时返回 `{ sessions: [], total: 0, reason: null }`,**不返回 500**
115
- - 会话按 `created_at` 降序排列
116
-
117
- ## 日志脱敏
118
-
119
- - 所有 `/api/logs/:category` 响应均经 `redactSensitiveContent` 脱敏
120
- - tail 行数限制在 `ALLOWED_LOG_TAILS = {100, 300, 1000}`,非法值回退到 100
121
- - 日志文件缺失时返回 `{ stdout: "", stderr: "", reason: "log file not found" }`
122
-
123
- ## 冒烟测试
124
-
125
- `scripts/checks/control-center-smoke.js` 在原 10 项基础上新增 5 项(共 16 项):
126
-
127
- | # | 测试 |
128
- | --- | --- |
129
- | 11 | `GET /api/tasks/stale` 返回有效 JSON(`stale_tasks` 数组、`total` 数字、`stale_threshold_seconds` 数字) |
130
- | 12 | `GET /api/workspace/<traversal>/status` 被拒绝(400,error 含 "traversal") |
131
- | 13 | `POST /api/tasks/:taskId/reconcile` 无 token → 403 |
132
- | 14 | `GET /api/direct-sessions` 目录缺失时返回空列表(200,非 500) |
133
- | 15 | `GET /api/logs/core?tail=300` 响应包含 `tail: 300` |
134
-
135
- ## 测试结果
136
-
137
- ```
138
- npm.cmd run build # tsc 编译通过
139
- node scripts/checks/control-center-smoke.js
140
- # Summary: 16 passed, 0 failed
141
- ```
142
-
143
- 全量 `npm test` 链路(security 139 + unit 136 + lifecycle 22 + control-center 16)
144
- 全部通过,0 失败。
145
-
146
- > 注:在 TRAE IDE 沙盒内运行 `npm test` 时,control-center-smoke spawn 的子进程退出
147
- > 后 Windows 会尝试更新 jump list 临时文件,被沙盒拒绝并打印
148
- > "TRAE Sandbox Error: hit restricted …CustomDestinations…"。该错误与测试逻辑无关,
149
- > 所有测试用例均报告 PASS。直接运行 `node scripts/checks/control-center-smoke.js` 退出码为 0。
150
-
151
- ## 已知限制
152
-
153
- - `/api/workspace/:repo/status` 仅运行 `git status --short`,不返回 diff 或 stash 信息
154
- - reconcile 不会清理任务文件,需人工后续处理或由 watcher 在下个周期自然覆盖
155
- - `/api/tasks/:taskId/audit` 仅在任务处于终态(done/failed/failed_verification/
156
- failed_scope_violation/failed_policy_violation/canceled/timeout)时才执行,否则返回 409
157
- - Direct Sessions 页面只读,不提供 finalize 或 audit 触发入口(这些操作仍需通过 MCP 工具完成)
158
- - Logs 页面的自动刷新间隔固定为 5 秒,不读取 watcher 实时事件
159
- - task-detail 的「Open task folder」按钮通过 `explorer.exe` / `open` / `xdg-open` 打开,需要本地图形环境
@@ -1,71 +0,0 @@
1
- # PatchWarden v0.6.0
2
-
3
- PatchWarden v0.6.0 在保持 `chatgpt_core` 固定 16 工具兼容的同时,加入默认关闭的
4
- `chatgpt_direct` 安全直接开发模式、本地 assess → confirm → execute 闭环,以及更可靠的
5
- Windows Core/Direct 双通道运行管理。
6
-
7
- ## 主要更新
8
-
9
- ### ChatGPT Core 安全体验
10
-
11
- - `assess_only` 返回最小化的结构化 `next_tool_call`;execute 只需
12
- `execution_mode` 和完整 `assessment_id`,不再重复传输目标、计划和仓库参数。
13
- - 中风险票据通过本地 `patchwarden-confirm <full_assessment_id>` 确认。该入口不是 MCP
14
- 工具,远程调用者不能自行放行。
15
- - 确认和执行会重新校验票据时效、工作区、计划、策略和工具 Manifest。
16
- - `audit_task` 将已确认失败、可能误报和人工核查项分开呈现。
17
- - `get_task_summary(view: "compact")` 和终态 `wait_for_task` 返回有界验收证据,避免长任务
18
- 结果淹没客户端上下文。
19
-
20
- ### ChatGPT Direct 模式
21
-
22
- - 默认关闭;启用需设置 `enableDirectProfile: true` 并使用 `chatgpt_direct` Profile。
23
- - 固定 9 工具:健康检查、工作区列表、会话创建、搜索、文件读取、JSON 补丁、白名单
24
- 验证、会话完成和独立审计。
25
- - 所有写操作绑定 Direct session 和内容哈希;不支持任意 shell、删除/重命名、Git 推送、
26
- npm 发布或远程部署。
27
-
28
- ### Windows Core/Direct 控制与可观测性
29
-
30
- - 根目录统一使用 `PatchWarden.cmd`,支持 Core、Direct 或两者的
31
- `start`、`stop`、`restart`、`status`、`health` 和受限 `kill`。
32
- - Core 和 Direct 分别使用 `127.0.0.1:8080` 与 `127.0.0.1:8081`,并自动校正各自
33
- tunnel profile 的 health 地址。
34
- - supervisor 将 stdout/stderr 写入各自 runtime 目录;非零退出时显示 stderr 最后 30 行,
35
- 并把退出码、脱敏 tail 和日志路径写入 `tunnel-status.json`。
36
- - 修复 Core watcher 的 `XDG_CONFIG_HOME` 泄漏到 tunnel-client,导致 Core 错误读取
37
- `%LOCALAPPDATA%\patchwarden\opencode-config\tunnel-client\patchwarden.yaml` 并反复退出的问题。
38
- - `stop` / `restart` 可清理 Profile 精确匹配的遗留 tunnel-client;无关端口占用只报告、不误杀。
39
- - `status` 支持 health endpoint fallback,陈旧 JSON 不再把实际 ready 的实例误报为 stopped。
40
- - 旧的单用途入口迁入 `scripts/launchers/`;个人 `.local/launchers/`、运行时配置、凭据和日志
41
- 不进入 Git、npm 包或 GitHub 发布资产。
42
-
43
- ## 兼容性
44
-
45
- - `chatgpt_core` 仍为固定 16 工具;`chatgpt_direct` 为固定 9 工具。
46
- - schema epoch 为 `2026-06-22-v6`。
47
- - `assess_only`、`execute`、`assessment_id`、`plan_ref` 和既有任务记录保持兼容。
48
- - npm 包名保持 `patchwarden`;旧的 `safe-bifrost` 包继续冻结在 v0.3.0。
49
-
50
- ## 验证
51
-
52
- 发布候选通过以下门禁:
53
-
54
- ```powershell
55
- npm.cmd run build
56
- npm.cmd test
57
- npm.cmd run check:tool-manifest
58
- npm.cmd run check:direct-tool-manifest
59
- npm.cmd run test:mcp
60
- npm.cmd run test:http-mcp
61
- npm.cmd run doctor:ci
62
- npm.cmd run pack:clean
63
- npm.cmd run verify:package
64
- git diff --check
65
- ```
66
-
67
- 本机双通道验收确认 Core 16 工具和 Direct 9 工具均为 `running`、`ready=true`,8080/8081
68
- 由对应 `tunnel-client.exe` 监听,两个 `/readyz` 均返回 `ready`。
69
-
70
- GitHub Release 与 npm Registry 是独立发布面。创建 Tag/Release 不会自动发布 npm;npm 发布后
71
- 仍需单独核对 `patchwarden@latest`、版本时间、dist-tag 和包完整性。
@@ -1,75 +0,0 @@
1
- # PatchWarden v0.6.1 Release Notes
2
-
3
- **Release Date**: 2026-06-25
4
-
5
- ## Overview
6
-
7
- PatchWarden v0.6.1 is a stability and observability release. It addresses watcher heartbeat false positives, adds Chinese path reliability, introduces two new tools (`safe_status` and `sync_file`), and adds comprehensive security guard unit tests.
8
-
9
- ## New Features
10
-
11
- ### safe_status Tool
12
-
13
- A minimal task lifecycle status tool that returns task state without exposing diff, log content, or file contents. Useful when upper-layer security policies block content-bearing tools.
14
-
15
- ```json
16
- {
17
- "task_id": "task-001",
18
- "status": "running",
19
- "phase": "executing_agent",
20
- "last_heartbeat_at": "2026-06-24T10:00:12Z",
21
- "current_command": "codex exec",
22
- "watcher_state": "healthy"
23
- }
24
- ```
25
-
26
- ### sync_file Tool
27
-
28
- Copy a file from source to target within a Direct session repo. Both paths must be inside the session's `repo_path`. Supports optional sha256 verification for both source and target.
29
-
30
- ### Android Build Doctor
31
-
32
- When a managed project contains an `android_app` directory, the health check now includes Android build environment diagnostics: Java version, JAVA_HOME, ANDROID_HOME, SDK platform, build-tools, Gradle wrapper, and APK output path.
33
-
34
- ## Bug Fixes
35
-
36
- - **Watcher stale false positive**: Long-running tasks no longer cause the watcher to be incorrectly reported as stale. The watcher status now falls back to checking running task heartbeats.
37
- - **Chinese path encoding**: All file I/O operations verified to use UTF-8 encoding. Health check now reports `path_encoding` status.
38
- - **Tracked external dirty detection**: `captureRepoSnapshot` now correctly identifies tracked-but-modified external files via `dirty_paths` field parsed from `git status --porcelain`. The regex now includes `R` (rename) status, fixing dead code that previously never executed for renamed files.
39
- - **Release zip path separators**: The packaging script (`pack-clean.js`) now creates zip archives with POSIX `/` path separators instead of Windows backslashes. Linux `unzip` no longer reports `warning: appears to use backslashes as path separators`.
40
-
41
- ## Security
42
-
43
- - 136 unit tests covering all security guards (path guard, sensitive guard, command guard, direct guards)
44
- - Tests use Node's built-in `node:test` — zero new dependencies
45
-
46
- ## Observability
47
-
48
- - Structured JSON logging to stderr (never stdout, to avoid polluting MCP JSON-RPC)
49
- - Tool call audit logs with duration tracking
50
- - Global `unhandledRejection` and `uncaughtException` handlers
51
-
52
- ## Tool Profile Changes
53
-
54
- | Profile | v0.6.0 | v0.6.1 |
55
- |---------|--------|--------|
56
- | full | 28 | 30 |
57
- | chatgpt_core | 16 | 17 |
58
- | chatgpt_direct | 9 | 10 |
59
-
60
- ## Migration
61
-
62
- No breaking changes. All new fields are optional. New tools are additive and do not affect existing tools.
63
-
64
- ## Verification
65
-
66
- - TypeScript compilation: PASS
67
- - Unit tests: 136 pass, 0 fail, 1 skipped (Windows symlink)
68
- - Smoke tests: 139 pass, 0 fail
69
- - Lifecycle tests: 22 pass, 0 fail (includes tracked external file rename regression test)
70
- - Doctor CI: PASS (81 OK, 0 WARN, 0 FAIL on the release check host)
71
- - Tool manifest check: PASS
72
- - Package manifest check: PASS (260 files)
73
- - Brand check: PASS (128 tracked files)
74
- - MCP HTTP tests: 13 pass, 0 fail
75
- - Release zip: POSIX path separators verified (261 entries, no backslashes)
@@ -1,45 +0,0 @@
1
- # PatchWarden v0.6.4 Release Notes
2
-
3
- **Release Date**: 2026-06-26
4
-
5
- ## Overview
6
-
7
- PatchWarden v0.6.4 is a desktop experience release. It keeps the existing CLI and script surface, but makes the normal Windows workflow feel like a lightweight local application: start one desktop entry, control Core/Direct from the tray or Web dashboard, and shut everything down from one stop command.
8
-
9
- ## Desktop Entry
10
-
11
- - Added `PatchWarden-Desktop.cmd` as the recommended daily entry point.
12
- - The desktop entry starts the tray in a hidden PowerShell host and ensures the local Control Center is available.
13
- - It does not automatically open a browser window. Use **Open Dashboard** from the tray or `PatchWarden-Control.cmd` when you want the full Web console.
14
- - `PatchWarden-Control-Tray.cmd --foreground` remains available for tray debugging.
15
-
16
- ## Tray Improvements
17
-
18
- - Added single-instance protection for the tray process.
19
- - Replaced the generic system icon path with a small PatchWarden-styled shield icon drawn through WinForms/System.Drawing.
20
- - Kept the tray as a lightweight switch layer: Open Dashboard, Status, Start All, Stop All, Restart All, Open Logs, and Quit Tray.
21
- - Added clearer balloon/status feedback for startup and lifecycle actions.
22
- - Clarified action semantics: **Stop All** stops Core/Direct and leaves tray/dashboard available; **Quit Tray** exits only the tray; `Stop-PatchWarden.cmd` performs full shutdown.
23
-
24
- ## Background Lifecycle
25
-
26
- - Control Center now invokes `manage-patchwarden.ps1` with `-Background` and `windowsHide: true` for lifecycle API calls.
27
- - The manager starts Core/Direct supervisors hidden for desktop/Web flows, while preserving visible launcher windows for explicit CLI/debug usage.
28
- - Added `-NoTunnelWebUi` to `start-patchwarden-tunnel.ps1` so background starts do not open tunnel-client Web UI tabs.
29
-
30
- ## Verification
31
-
32
- - TypeScript build: PASS
33
- - Control smoke: PASS
34
- - Control Center smoke: PASS (23 passed, 0 failed)
35
- - Package manifest check: PASS
36
- - PowerShell control script parse check: PASS
37
- - Manual desktop-flow evidence: desktop entry starts only tray + Control Center; Start/Restart uses hidden supervisors; Stop-PatchWarden closes Core/Direct, Control Center, and tray.
38
-
39
- ## Migration
40
-
41
- No breaking changes. Existing CLI commands and compatibility launchers remain available. For daily Windows use, prefer:
42
-
43
- ```powershell
44
- .\PatchWarden-Desktop.cmd
45
- ```