patchwarden 1.5.1 → 1.6.2

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 (591) hide show
  1. package/PatchWarden.cmd +32 -2
  2. package/README.en.md +158 -26
  3. package/README.md +124 -24
  4. package/dist/assessments/agentAssessor.js +21 -12
  5. package/dist/assessments/assessmentDiagnostics.d.ts +29 -0
  6. package/dist/assessments/assessmentDiagnostics.js +132 -0
  7. package/dist/assessments/assessmentStore.d.ts +39 -0
  8. package/dist/assessments/assessmentStore.js +207 -45
  9. package/dist/assessments/securitySnapshot.d.ts +50 -0
  10. package/dist/assessments/securitySnapshot.js +158 -0
  11. package/dist/config.d.ts +15 -0
  12. package/dist/config.js +66 -13
  13. package/dist/control/fileManager.d.ts +2 -0
  14. package/dist/control/fileManager.js +39 -0
  15. package/dist/control/middleware/auth.d.ts +6 -0
  16. package/dist/control/middleware/auth.js +14 -5
  17. package/dist/control/middleware/static.js +16 -3
  18. package/dist/control/routeTable.d.ts +24 -0
  19. package/dist/control/routeTable.js +263 -0
  20. package/dist/control/routes/audit.js +17 -7
  21. package/dist/control/routes/evidence.js +1 -1
  22. package/dist/control/routes/lineage.js +1 -1
  23. package/dist/control/routes/process.d.ts +7 -0
  24. package/dist/control/routes/process.js +329 -42
  25. package/dist/control/routes/sessions.d.ts +9 -1
  26. package/dist/control/routes/sessions.js +84 -21
  27. package/dist/control/routes/status.d.ts +60 -1
  28. package/dist/control/routes/status.js +94 -15
  29. package/dist/control/routes/taskActions.js +24 -60
  30. package/dist/control/routes/tasks.d.ts +4 -0
  31. package/dist/control/routes/tasks.js +61 -62
  32. package/dist/control/routes/workspace.js +50 -23
  33. package/dist/control/runtime.d.ts +3 -2
  34. package/dist/control/runtime.js +65 -40
  35. package/dist/control/server.js +37 -365
  36. package/dist/control/shared.d.ts +25 -1
  37. package/dist/control/shared.js +64 -11
  38. package/dist/diagnostics/allowedTestCommandSafety.d.ts +1 -0
  39. package/dist/diagnostics/allowedTestCommandSafety.js +11 -0
  40. package/dist/direct/directAudit.js +234 -225
  41. package/dist/direct/directGuards.d.ts +2 -1
  42. package/dist/direct/directGuards.js +42 -29
  43. package/dist/direct/directPatch.d.ts +6 -1
  44. package/dist/direct/directPatch.js +55 -8
  45. package/dist/direct/directSessionStore.d.ts +16 -6
  46. package/dist/direct/directSessionStore.js +128 -35
  47. package/dist/direct/directVerification.js +8 -16
  48. package/dist/doctor.js +65 -57
  49. package/dist/goal/acceptanceEngine.d.ts +1 -1
  50. package/dist/goal/goalProgress.js +75 -69
  51. package/dist/goal/goalReport.js +5 -12
  52. package/dist/goal/goalStatus.d.ts +2 -0
  53. package/dist/goal/goalStatus.js +10 -3
  54. package/dist/goal/goalStore.d.ts +9 -2
  55. package/dist/goal/goalStore.js +152 -45
  56. package/dist/goal/handoffExport.js +6 -6
  57. package/dist/goal/specKitImport.js +97 -96
  58. package/dist/goal/subgoalSync.js +11 -9
  59. package/dist/goal/worktreeManager.d.ts +2 -0
  60. package/dist/goal/worktreeManager.js +209 -136
  61. package/dist/httpServer.js +111 -32
  62. package/dist/logging.js +5 -3
  63. package/dist/policy/projectPolicy.js +5 -2
  64. package/dist/release/releaseGate.d.ts +1 -1
  65. package/dist/release/releaseGate.js +78 -25
  66. package/dist/runner/agentInvocation.d.ts +14 -0
  67. package/dist/runner/agentInvocation.js +96 -4
  68. package/dist/runner/changeCapture.d.ts +13 -5
  69. package/dist/runner/changeCapture.js +243 -61
  70. package/dist/runner/postTaskCleanup.js +48 -19
  71. package/dist/runner/processSecurity.d.ts +56 -0
  72. package/dist/runner/processSecurity.js +373 -0
  73. package/dist/runner/runTask.d.ts +2 -1
  74. package/dist/runner/runTask.js +162 -93
  75. package/dist/runner/simpleProcess.d.ts +3 -0
  76. package/dist/runner/simpleProcess.js +50 -36
  77. package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
  78. package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
  79. package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +3 -1
  80. package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
  81. package/dist/runner/taskStatusStore.d.ts +11 -0
  82. package/dist/runner/taskStatusStore.js +35 -0
  83. package/dist/runner/watch.d.ts +14 -1
  84. package/dist/runner/watch.js +320 -49
  85. package/dist/security/contentRedaction.js +2 -2
  86. package/dist/security/discoveryTokenStore.d.ts +3 -2
  87. package/dist/security/discoveryTokenStore.js +17 -2
  88. package/dist/security/loopbackHost.d.ts +2 -0
  89. package/dist/security/loopbackHost.js +16 -0
  90. package/dist/security/pathGuard.js +32 -17
  91. package/dist/security/planGuard.js +2 -1
  92. package/dist/security/runtimeGuard.js +9 -6
  93. package/dist/security/secretComparison.d.ts +3 -0
  94. package/dist/security/secretComparison.js +11 -0
  95. package/dist/security/sensitiveGuard.d.ts +5 -0
  96. package/dist/security/sensitiveGuard.js +27 -8
  97. package/dist/security/toolInvocationGuard.d.ts +2 -2
  98. package/dist/security/toolInvocationGuard.js +1 -1
  99. package/dist/security/workspaceRootGuard.d.ts +8 -0
  100. package/dist/security/workspaceRootGuard.js +47 -0
  101. package/dist/smoke-test.js +27 -26
  102. package/dist/tools/catalog/index.d.ts +4 -0
  103. package/dist/tools/catalog/index.js +4 -0
  104. package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
  105. package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
  106. package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +6 -15
  107. package/dist/tools/definitions/toolDefs.d.ts +18 -0
  108. package/dist/tools/definitions/toolDefs.js +1177 -0
  109. package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
  110. package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
  111. package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +2 -1
  112. package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +134 -36
  113. package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +18 -6
  114. package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +36 -8
  115. package/dist/tools/diagnostics/index.d.ts +6 -0
  116. package/dist/tools/diagnostics/index.js +6 -0
  117. package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
  118. package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
  119. package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +12 -8
  120. package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +23 -13
  121. package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
  122. package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
  123. package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +6 -6
  124. package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +1 -1
  125. package/dist/tools/direct/finalizeDirectSession.js +86 -0
  126. package/dist/tools/direct/index.d.ts +3 -0
  127. package/dist/tools/direct/index.js +3 -0
  128. package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
  129. package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
  130. package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
  131. package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
  132. package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
  133. package/dist/tools/discovery/index.d.ts +3 -0
  134. package/dist/tools/discovery/index.js +3 -0
  135. package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
  136. package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
  137. package/dist/tools/dispatch/coreDispatch.js +32 -31
  138. package/dist/tools/dispatch/diagnosticDispatch.d.ts +3 -5
  139. package/dist/tools/dispatch/diagnosticDispatch.js +70 -68
  140. package/dist/tools/dispatch/directDispatch.js +11 -10
  141. package/dist/tools/dispatch/goalDispatch.js +5 -4
  142. package/dist/tools/dispatch/releaseDispatch.js +3 -2
  143. package/dist/tools/dispatch/validation.d.ts +7 -0
  144. package/dist/tools/dispatch/validation.js +71 -0
  145. package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
  146. package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +1 -1
  147. package/dist/tools/goals/goalSubgoalTask.js +118 -0
  148. package/dist/tools/goals/index.d.ts +3 -0
  149. package/dist/tools/goals/index.js +3 -0
  150. package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
  151. package/dist/tools/registry.d.ts +7 -11
  152. package/dist/tools/registry.js +17 -1178
  153. package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
  154. package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
  155. package/dist/tools/release/index.d.ts +2 -0
  156. package/dist/tools/release/index.js +2 -0
  157. package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
  158. package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
  159. package/dist/tools/tasks/cancelTask.d.ts +11 -0
  160. package/dist/tools/tasks/cancelTask.js +86 -0
  161. package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +12 -4
  162. package/dist/tools/{createTask.js → tasks/createTask.js} +110 -34
  163. package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
  164. package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +12 -16
  165. package/dist/tools/{evidencePack.js → tasks/evidencePack.js} +34 -22
  166. package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
  167. package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
  168. package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +11 -6
  169. package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
  170. package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +35 -36
  171. package/dist/tools/tasks/index.d.ts +18 -0
  172. package/dist/tools/tasks/index.js +18 -0
  173. package/dist/tools/tasks/killTask.d.ts +1 -0
  174. package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
  175. package/dist/tools/{listTasks.js → tasks/listTasks.js} +5 -4
  176. package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +3 -2
  177. package/dist/tools/tasks/reconcileTasks.js +496 -0
  178. package/dist/tools/tasks/retryTask.js +60 -0
  179. package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
  180. package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +63 -41
  181. package/dist/tools/tasks/runVerification.js +38 -0
  182. package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
  183. package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +2 -2
  184. package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
  185. package/dist/tools/tasks/taskStates.d.ts +6 -0
  186. package/dist/tools/tasks/taskStates.js +52 -0
  187. package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +3 -11
  188. package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
  189. package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
  190. package/dist/tools/workspace/applyPatch.js +53 -0
  191. package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
  192. package/dist/tools/workspace/index.d.ts +10 -0
  193. package/dist/tools/workspace/index.js +10 -0
  194. package/dist/tools/workspace/listAgents.d.ts +23 -0
  195. package/dist/tools/workspace/listAgents.js +56 -0
  196. package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
  197. package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
  198. package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
  199. package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
  200. package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
  201. package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
  202. package/dist/tools/workspace/syncFile.js +134 -0
  203. package/dist/utils/atomicFile.d.ts +7 -0
  204. package/dist/utils/atomicFile.js +67 -0
  205. package/dist/utils/boundedFile.d.ts +8 -0
  206. package/dist/utils/boundedFile.js +93 -0
  207. package/dist/utils/lockedJsonFile.d.ts +15 -0
  208. package/dist/utils/lockedJsonFile.js +224 -0
  209. package/dist/utils/platform.d.ts +11 -0
  210. package/dist/utils/platform.js +26 -0
  211. package/dist/utils/stableJson.d.ts +2 -0
  212. package/dist/utils/stableJson.js +12 -0
  213. package/dist/version.d.ts +3 -2
  214. package/dist/version.js +3 -2
  215. package/dist/watcherStatus.d.ts +2 -2
  216. package/dist/watcherStatus.js +18 -0
  217. package/docs/CODE_WIKI.md +808 -143
  218. package/docs/architecture.md +15 -55
  219. package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
  220. package/docs/control-center/README.md +4 -4
  221. package/docs/dashboard-overview.md +4 -4
  222. package/docs/desktop-app.md +175 -0
  223. package/docs/evidence-pack-schema.md +3 -3
  224. package/docs/open-source-application.md +16 -11
  225. package/docs/release-checklist.md +1 -1
  226. package/docs/release-evidence.md +35 -39
  227. package/docs/task-safe-review-workflow.md +5 -5
  228. package/docs/threat-model.md +19 -1
  229. package/examples/config.example.json +4 -2
  230. package/package.json +27 -10
  231. package/scripts/README.md +15 -6
  232. package/scripts/build.js +11 -0
  233. package/scripts/checks/brand-check.js +3 -0
  234. package/scripts/checks/build-output-check.js +37 -0
  235. package/scripts/checks/control-center-smoke.js +102 -10
  236. package/scripts/checks/control-smoke.js +19 -8
  237. package/scripts/checks/http-mcp-smoke.js +82 -4
  238. package/scripts/checks/lifecycle-smoke.js +15 -12
  239. package/scripts/checks/mcp-manifest-check.js +1 -1
  240. package/scripts/checks/mcp-smoke.js +58 -4
  241. package/scripts/checks/package-manifest-check.js +20 -7
  242. package/scripts/checks/unit-tests.js +3 -5
  243. package/scripts/checks/watcher-supervisor-smoke.js +38 -1
  244. package/scripts/control/get-patchwarden-health.ps1 +1 -1
  245. package/scripts/control/manage-patchwarden.ps1 +69 -4
  246. package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
  247. package/scripts/control/run-background-supervisor.ps1 +41 -0
  248. package/scripts/control/start-patchwarden-tunnel.ps1 +191 -33
  249. package/scripts/e2e/demo-runtime.mjs +153 -0
  250. package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
  251. package/scripts/launchers/PatchWarden-Control.cmd +6 -0
  252. package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
  253. package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
  254. package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
  255. package/scripts/lib/clean-generated-output.js +11 -0
  256. package/scripts/lib/file-discovery.js +12 -0
  257. package/scripts/release/desktop-preflight.js +211 -0
  258. package/scripts/release/pack-clean.js +59 -14
  259. package/src/assessments/agentAssessor.ts +26 -12
  260. package/src/assessments/assessmentDiagnostics.ts +172 -0
  261. package/src/assessments/assessmentStore.ts +288 -51
  262. package/src/assessments/securitySnapshot.ts +231 -0
  263. package/src/config.ts +70 -13
  264. package/src/control/fileManager.ts +40 -0
  265. package/src/control/middleware/auth.ts +22 -4
  266. package/src/control/middleware/static.ts +16 -3
  267. package/src/control/routeTable.ts +301 -0
  268. package/src/control/routes/audit.ts +14 -6
  269. package/src/control/routes/evidence.ts +1 -1
  270. package/src/control/routes/lineage.ts +1 -1
  271. package/src/control/routes/process.ts +341 -40
  272. package/src/control/routes/sessions.ts +88 -25
  273. package/src/control/routes/status.ts +134 -17
  274. package/src/control/routes/taskActions.ts +24 -58
  275. package/src/control/routes/tasks.ts +66 -58
  276. package/src/control/routes/workspace.ts +56 -25
  277. package/src/control/runtime.ts +71 -43
  278. package/src/control/server.ts +37 -342
  279. package/src/control/shared.ts +77 -11
  280. package/src/diagnostics/allowedTestCommandSafety.ts +12 -0
  281. package/src/direct/directAudit.ts +17 -9
  282. package/src/direct/directGuards.ts +72 -44
  283. package/src/direct/directPatch.ts +95 -8
  284. package/src/direct/directSessionStore.ts +213 -55
  285. package/src/direct/directVerification.ts +9 -23
  286. package/src/doctor.ts +76 -64
  287. package/src/goal/acceptanceEngine.ts +1 -1
  288. package/src/goal/goalProgress.ts +17 -13
  289. package/src/goal/goalReport.ts +5 -13
  290. package/src/goal/goalStatus.ts +19 -3
  291. package/src/goal/goalStore.ts +241 -54
  292. package/src/goal/handoffExport.ts +6 -6
  293. package/src/goal/specKitImport.ts +12 -12
  294. package/src/goal/subgoalSync.ts +11 -8
  295. package/src/goal/worktreeManager.ts +139 -22
  296. package/src/httpServer.ts +113 -30
  297. package/src/logging.ts +10 -3
  298. package/src/policy/projectPolicy.ts +5 -2
  299. package/src/release/releaseGate.ts +74 -27
  300. package/src/runner/agentInvocation.ts +126 -4
  301. package/src/runner/changeCapture.ts +291 -57
  302. package/src/runner/postTaskCleanup.ts +41 -17
  303. package/src/runner/processSecurity.ts +433 -0
  304. package/src/runner/runTask.ts +197 -97
  305. package/src/runner/simpleProcess.ts +66 -31
  306. package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
  307. package/src/{taskRuntime.ts → runner/taskRuntime.ts} +6 -3
  308. package/src/runner/taskStatusStore.ts +69 -0
  309. package/src/runner/watch.ts +348 -52
  310. package/src/security/contentRedaction.ts +2 -2
  311. package/src/security/discoveryTokenStore.ts +18 -4
  312. package/src/security/loopbackHost.ts +19 -0
  313. package/src/security/pathGuard.ts +35 -16
  314. package/src/security/planGuard.ts +2 -1
  315. package/src/security/runtimeGuard.ts +9 -6
  316. package/src/security/secretComparison.ts +13 -0
  317. package/src/security/sensitiveGuard.ts +27 -8
  318. package/src/security/toolInvocationGuard.ts +2 -2
  319. package/src/security/workspaceRootGuard.ts +53 -0
  320. package/src/smoke-test.ts +27 -26
  321. package/src/tools/catalog/index.ts +4 -0
  322. package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
  323. package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +7 -16
  324. package/src/tools/definitions/toolDefs.ts +1264 -0
  325. package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
  326. package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +136 -39
  327. package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +37 -9
  328. package/src/tools/diagnostics/index.ts +6 -0
  329. package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
  330. package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +27 -17
  331. package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
  332. package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +6 -6
  333. package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +7 -5
  334. package/src/tools/direct/index.ts +3 -0
  335. package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
  336. package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
  337. package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
  338. package/src/tools/discovery/index.ts +3 -0
  339. package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
  340. package/src/tools/dispatch/coreDispatch.ts +36 -31
  341. package/src/tools/dispatch/diagnosticDispatch.ts +26 -21
  342. package/src/tools/dispatch/directDispatch.ts +11 -10
  343. package/src/tools/dispatch/goalDispatch.ts +5 -4
  344. package/src/tools/dispatch/releaseDispatch.ts +3 -2
  345. package/src/tools/dispatch/validation.ts +78 -0
  346. package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
  347. package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +41 -26
  348. package/src/tools/goals/index.ts +3 -0
  349. package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
  350. package/src/tools/registry.ts +17 -1261
  351. package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
  352. package/src/tools/release/index.ts +2 -0
  353. package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
  354. package/src/tools/tasks/cancelTask.ts +110 -0
  355. package/src/tools/{createTask.ts → tasks/createTask.ts} +161 -33
  356. package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +12 -16
  357. package/src/tools/{evidencePack.ts → tasks/evidencePack.ts} +36 -22
  358. package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
  359. package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +13 -6
  360. package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
  361. package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +46 -44
  362. package/src/tools/tasks/index.ts +18 -0
  363. package/src/tools/{listTasks.ts → tasks/listTasks.ts} +6 -5
  364. package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +228 -77
  365. package/src/tools/tasks/retryTask.ts +69 -0
  366. package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +73 -46
  367. package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
  368. package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
  369. package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
  370. package/src/tools/tasks/taskStates.ts +54 -0
  371. package/src/tools/{waitForTask.ts → tasks/waitForTask.ts} +3 -12
  372. package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
  373. package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
  374. package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
  375. package/src/tools/workspace/index.ts +10 -0
  376. package/src/tools/workspace/listAgents.ts +75 -0
  377. package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
  378. package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
  379. package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
  380. package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
  381. package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
  382. package/src/tools/workspace/syncFile.ts +292 -0
  383. package/src/utils/atomicFile.ts +74 -0
  384. package/src/utils/boundedFile.ts +116 -0
  385. package/src/utils/lockedJsonFile.ts +251 -0
  386. package/src/utils/platform.ts +31 -0
  387. package/src/utils/stableJson.ts +12 -0
  388. package/src/version.ts +3 -2
  389. package/src/watcherStatus.ts +19 -1
  390. package/ui/desktop-bootstrap.js +11 -0
  391. package/ui/desktop-bridge.js +36 -0
  392. package/ui/desktop.css +160 -0
  393. package/ui/getting-started.js +93 -0
  394. package/ui/i18n.js +484 -0
  395. package/ui/log-parser.js +30 -0
  396. package/ui/pages/audit.html +12 -0
  397. package/ui/pages/dashboard.html +94 -147
  398. package/ui/pages/direct-sessions.html +123 -26
  399. package/ui/pages/getting-started.html +43 -0
  400. package/ui/pages/logs.html +134 -22
  401. package/ui/pages/settings.html +101 -0
  402. package/ui/pages/task-detail.html +12 -0
  403. package/ui/pages/tasks.html +54 -8
  404. package/ui/pages/workspace.html +38 -1
  405. package/ui/settings.js +254 -0
  406. package/PatchWarden-Control.cmd +0 -6
  407. package/Restart-PatchWarden-Control.cmd +0 -6
  408. package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
  409. package/dist/test/unit/acceptance-engine.test.js +0 -228
  410. package/dist/test/unit/agent-router.test.d.ts +0 -1
  411. package/dist/test/unit/agent-router.test.js +0 -287
  412. package/dist/test/unit/android-doctor.test.d.ts +0 -1
  413. package/dist/test/unit/android-doctor.test.js +0 -118
  414. package/dist/test/unit/apply-patch.test.d.ts +0 -1
  415. package/dist/test/unit/apply-patch.test.js +0 -225
  416. package/dist/test/unit/audit-checks.test.d.ts +0 -1
  417. package/dist/test/unit/audit-checks.test.js +0 -350
  418. package/dist/test/unit/chinese-path.test.d.ts +0 -1
  419. package/dist/test/unit/chinese-path.test.js +0 -91
  420. package/dist/test/unit/command-guard.test.d.ts +0 -1
  421. package/dist/test/unit/command-guard.test.js +0 -160
  422. package/dist/test/unit/create-task.test.d.ts +0 -1
  423. package/dist/test/unit/create-task.test.js +0 -197
  424. package/dist/test/unit/diagnose-task.test.d.ts +0 -1
  425. package/dist/test/unit/diagnose-task.test.js +0 -457
  426. package/dist/test/unit/direct-guards.test.d.ts +0 -1
  427. package/dist/test/unit/direct-guards.test.js +0 -328
  428. package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
  429. package/dist/test/unit/discovery-token-store.test.js +0 -139
  430. package/dist/test/unit/evidence-pack.test.d.ts +0 -1
  431. package/dist/test/unit/evidence-pack.test.js +0 -224
  432. package/dist/test/unit/get-task-status.test.d.ts +0 -1
  433. package/dist/test/unit/get-task-status.test.js +0 -174
  434. package/dist/test/unit/get-task-summary.test.d.ts +0 -1
  435. package/dist/test/unit/get-task-summary.test.js +0 -146
  436. package/dist/test/unit/goal-graph.test.d.ts +0 -1
  437. package/dist/test/unit/goal-graph.test.js +0 -298
  438. package/dist/test/unit/goal-progress.test.d.ts +0 -1
  439. package/dist/test/unit/goal-progress.test.js +0 -381
  440. package/dist/test/unit/goal-report.test.d.ts +0 -1
  441. package/dist/test/unit/goal-report.test.js +0 -159
  442. package/dist/test/unit/goal-status.test.d.ts +0 -1
  443. package/dist/test/unit/goal-status.test.js +0 -215
  444. package/dist/test/unit/goal-store.test.d.ts +0 -1
  445. package/dist/test/unit/goal-store.test.js +0 -253
  446. package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
  447. package/dist/test/unit/goal-subgoal-task.test.js +0 -55
  448. package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
  449. package/dist/test/unit/goal-tools-registry.test.js +0 -192
  450. package/dist/test/unit/handoff-export.test.d.ts +0 -1
  451. package/dist/test/unit/handoff-export.test.js +0 -263
  452. package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
  453. package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
  454. package/dist/test/unit/logging.test.d.ts +0 -1
  455. package/dist/test/unit/logging.test.js +0 -397
  456. package/dist/test/unit/path-guard.test.d.ts +0 -1
  457. package/dist/test/unit/path-guard.test.js +0 -133
  458. package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
  459. package/dist/test/unit/post-task-cleanup.test.js +0 -48
  460. package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
  461. package/dist/test/unit/project-policy-release-mode.test.js +0 -125
  462. package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
  463. package/dist/test/unit/reconcile-tasks.test.js +0 -456
  464. package/dist/test/unit/release-gate.test.d.ts +0 -1
  465. package/dist/test/unit/release-gate.test.js +0 -242
  466. package/dist/test/unit/run-task-loop.test.d.ts +0 -1
  467. package/dist/test/unit/run-task-loop.test.js +0 -380
  468. package/dist/test/unit/safe-status.test.d.ts +0 -1
  469. package/dist/test/unit/safe-status.test.js +0 -165
  470. package/dist/test/unit/safe-views.test.d.ts +0 -1
  471. package/dist/test/unit/safe-views.test.js +0 -171
  472. package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
  473. package/dist/test/unit/schema-drift-check.test.js +0 -176
  474. package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
  475. package/dist/test/unit/sensitive-guard.test.js +0 -104
  476. package/dist/test/unit/spec-kit-import.test.d.ts +0 -1
  477. package/dist/test/unit/spec-kit-import.test.js +0 -341
  478. package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
  479. package/dist/test/unit/subgoal-sync.test.js +0 -183
  480. package/dist/test/unit/sync-file.test.d.ts +0 -1
  481. package/dist/test/unit/sync-file.test.js +0 -154
  482. package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
  483. package/dist/test/unit/tool-invocation-guard.test.js +0 -432
  484. package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
  485. package/dist/test/unit/tool-usage-stats.test.js +0 -300
  486. package/dist/test/unit/toolSearch.test.d.ts +0 -1
  487. package/dist/test/unit/toolSearch.test.js +0 -571
  488. package/dist/test/unit/wait-for-task.test.d.ts +0 -1
  489. package/dist/test/unit/wait-for-task.test.js +0 -144
  490. package/dist/test/unit/watcher-status.test.d.ts +0 -1
  491. package/dist/test/unit/watcher-status.test.js +0 -169
  492. package/dist/test/unit/worktree-manager.test.d.ts +0 -1
  493. package/dist/test/unit/worktree-manager.test.js +0 -176
  494. package/dist/tools/applyPatch.js +0 -41
  495. package/dist/tools/cancelTask.d.ts +0 -30
  496. package/dist/tools/cancelTask.js +0 -64
  497. package/dist/tools/finalizeDirectSession.js +0 -84
  498. package/dist/tools/goalSubgoalTask.js +0 -110
  499. package/dist/tools/killTask.d.ts +0 -15
  500. package/dist/tools/listAgents.d.ts +0 -12
  501. package/dist/tools/listAgents.js +0 -42
  502. package/dist/tools/reconcileTasks.js +0 -352
  503. package/dist/tools/retryTask.js +0 -45
  504. package/dist/tools/runVerification.js +0 -36
  505. package/dist/tools/syncFile.js +0 -65
  506. package/docs/control-center/control-center-daily-driver.md +0 -211
  507. package/docs/control-center/control-center-mvp.md +0 -205
  508. package/docs/control-center/control-center-phase2.md +0 -159
  509. package/docs/execution-plan-2026-07-09.md +0 -315
  510. package/docs/release-v0.6.0.md +0 -71
  511. package/docs/release-v0.6.1.md +0 -75
  512. package/docs/release-v0.6.4.md +0 -45
  513. package/docs/roadmap-execution-and-acceptance.md +0 -365
  514. package/src/test/unit/acceptance-engine.test.ts +0 -261
  515. package/src/test/unit/agent-router.test.ts +0 -342
  516. package/src/test/unit/android-doctor.test.ts +0 -158
  517. package/src/test/unit/apply-patch.test.ts +0 -293
  518. package/src/test/unit/audit-checks.test.ts +0 -567
  519. package/src/test/unit/chinese-path.test.ts +0 -106
  520. package/src/test/unit/command-guard.test.ts +0 -221
  521. package/src/test/unit/create-task.test.ts +0 -255
  522. package/src/test/unit/diagnose-task.test.ts +0 -544
  523. package/src/test/unit/direct-guards.test.ts +0 -467
  524. package/src/test/unit/discovery-token-store.test.ts +0 -181
  525. package/src/test/unit/evidence-pack.test.ts +0 -251
  526. package/src/test/unit/get-task-status.test.ts +0 -203
  527. package/src/test/unit/get-task-summary.test.ts +0 -173
  528. package/src/test/unit/goal-graph.test.ts +0 -347
  529. package/src/test/unit/goal-progress.test.ts +0 -538
  530. package/src/test/unit/goal-report.test.ts +0 -189
  531. package/src/test/unit/goal-status.test.ts +0 -270
  532. package/src/test/unit/goal-store.test.ts +0 -318
  533. package/src/test/unit/goal-subgoal-task.test.ts +0 -72
  534. package/src/test/unit/goal-tools-registry.test.ts +0 -245
  535. package/src/test/unit/handoff-export.test.ts +0 -295
  536. package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
  537. package/src/test/unit/logging.test.ts +0 -497
  538. package/src/test/unit/path-guard.test.ts +0 -180
  539. package/src/test/unit/post-task-cleanup.test.ts +0 -53
  540. package/src/test/unit/project-policy-release-mode.test.ts +0 -156
  541. package/src/test/unit/reconcile-tasks.test.ts +0 -551
  542. package/src/test/unit/release-gate.test.ts +0 -314
  543. package/src/test/unit/run-task-loop.test.ts +0 -425
  544. package/src/test/unit/safe-status.test.ts +0 -187
  545. package/src/test/unit/safe-views.test.ts +0 -184
  546. package/src/test/unit/schema-drift-check.test.ts +0 -260
  547. package/src/test/unit/sensitive-guard.test.ts +0 -124
  548. package/src/test/unit/spec-kit-import.test.ts +0 -429
  549. package/src/test/unit/subgoal-sync.test.ts +0 -236
  550. package/src/test/unit/sync-file.test.ts +0 -231
  551. package/src/test/unit/tool-invocation-guard.test.ts +0 -542
  552. package/src/test/unit/tool-usage-stats.test.ts +0 -384
  553. package/src/test/unit/toolSearch.test.ts +0 -756
  554. package/src/test/unit/wait-for-task.test.ts +0 -176
  555. package/src/test/unit/watcher-status.test.ts +0 -190
  556. package/src/test/unit/worktree-manager.test.ts +0 -247
  557. package/src/tools/cancelTask.ts +0 -70
  558. package/src/tools/listAgents.ts +0 -54
  559. package/src/tools/retryTask.ts +0 -53
  560. package/src/tools/syncFile.ts +0 -122
  561. /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
  562. /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
  563. /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
  564. /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
  565. /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
  566. /package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +0 -0
  567. /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
  568. /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
  569. /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
  570. /package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +0 -0
  571. /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
  572. /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
  573. /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
  574. /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
  575. /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
  576. /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
  577. /package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +0 -0
  578. /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
  579. /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
  580. /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
  581. /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
  582. /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
  583. /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
  584. /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
  585. /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
  586. /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
  587. /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
  588. /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
  589. /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
  590. /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
  591. /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
@@ -6,8 +6,8 @@
6
6
  *
7
7
  * 本模块只做检测和报告,不做运行时阻断。
8
8
  */
9
- import { computeSchemaDigest } from "./toolRegistry.js";
10
- import { CHATGPT_CORE_TOOL_NAMES } from "./toolCatalog.js";
9
+ import { computeSchemaDigest } from "../catalog/toolRegistry.js";
10
+ import { CHATGPT_CORE_TOOL_NAMES } from "../catalog/toolCatalog.js";
11
11
  /** chatgpt_core profile 的预期工具数(来自 CHATGPT_CORE_TOOL_NAMES)。 */
12
12
  const EXPECTED_CORE_COUNT = CHATGPT_CORE_TOOL_NAMES.length;
13
13
  // ── 检查 1: registry schema digest 一致性 ─────────────────────────
@@ -1,10 +1,10 @@
1
1
  import { existsSync, statSync } from "node:fs";
2
- import { getConfig } from "../config.js";
3
- import { PatchWardenError } from "../errors.js";
4
- import { guardWorkspacePath } from "../security/pathGuard.js";
5
- import { guardRuntimeSelfModification } from "../security/runtimeGuard.js";
6
- import { captureRepoSnapshot } from "../runner/changeCapture.js";
7
- import { createDirectSession as createDirectSessionRecord, } from "../direct/directSessionStore.js";
2
+ import { getConfig } from "../../config.js";
3
+ import { PatchWardenError } from "../../errors.js";
4
+ import { guardWorkspacePath } from "../../security/pathGuard.js";
5
+ import { guardRuntimeSelfModification } from "../../security/runtimeGuard.js";
6
+ import { captureRepoSnapshot } from "../../runner/changeCapture.js";
7
+ import { createDirectSession as createDirectSessionRecord, } from "../../direct/directSessionStore.js";
8
8
  // ── Tool implementation ────────────────────────────────────────────
9
9
  export async function createDirectSession(input) {
10
10
  const config = getConfig();
@@ -1,4 +1,4 @@
1
- import { type ClassifiedChange } from "../runner/changeCapture.js";
1
+ import { type ClassifiedChange } from "../../runner/changeCapture.js";
2
2
  export interface FinalizeDirectSessionInput {
3
3
  session_id: string;
4
4
  }
@@ -0,0 +1,86 @@
1
+ import { join, resolve, relative, isAbsolute } from "node:path";
2
+ import { readDirectSession, finalizeDirectSessionRecord, getDirectSessionDir, withDirectSessionMutationLockAsync, } from "../../direct/directSessionStore.js";
3
+ import { guardDirectSessionActive } from "../../direct/directGuards.js";
4
+ import { captureRepoSnapshot, buildChangeArtifacts, } from "../../runner/changeCapture.js";
5
+ // ── Main function ──────────────────────────────────────────────────
6
+ export async function finalizeDirectSession(input) {
7
+ const { session_id } = input;
8
+ return withDirectSessionMutationLockAsync(session_id, async () => {
9
+ // 1. Read session and guard active (not expired, not finalized)
10
+ const session = readDirectSession(session_id);
11
+ guardDirectSessionActive(session);
12
+ // 2. Capture after snapshot
13
+ const afterSnapshot = await captureRepoSnapshot(session.resolved_repo_path);
14
+ // 3. Build change artifacts from before/after snapshots
15
+ const changeArtifacts = await buildChangeArtifacts(session.resolved_repo_path, session.workspace_snapshot_before, afterSnapshot);
16
+ // 4. Finalize session record — writes changed-files.json, diff.patch,
17
+ // summary.json, summary.md and marks the session as finalized.
18
+ finalizeDirectSessionRecord(session_id, changeArtifacts);
19
+ // 5. Build verification summary from session.verification_runs
20
+ const verification_summary = {};
21
+ for (const run of session.verification_runs) {
22
+ verification_summary[run.command] = run.passed ? "passed" : "failed";
23
+ }
24
+ // 6. Identify out-of-scope changes (paths outside resolved_repo_path)
25
+ const out_of_scope_changes = findOutOfScopeChanges(changeArtifacts, session.resolved_repo_path);
26
+ // 7. Build compact summary with categorized changes
27
+ const sessionDir = getDirectSessionDir(session_id);
28
+ return {
29
+ session_id,
30
+ changed_files_total: changeArtifacts.changed_files.length,
31
+ source_changes: changeArtifacts.artifact_hygiene.source_changes,
32
+ tracked_build_artifacts: changeArtifacts.artifact_hygiene.tracked_build_artifacts,
33
+ runtime_generated_files: changeArtifacts.artifact_hygiene.runtime_generated_files,
34
+ suspicious_changes: changeArtifacts.artifact_hygiene.suspicious_changes,
35
+ out_of_scope_changes,
36
+ verification_summary,
37
+ diff_path: join(sessionDir, "diff.patch"),
38
+ summary_path: join(sessionDir, "summary.md"),
39
+ finalized: true,
40
+ next_action: "Call audit_session to independently review the changes.",
41
+ };
42
+ });
43
+ }
44
+ // ── Helpers ────────────────────────────────────────────────────────
45
+ /**
46
+ * Filter changeArtifacts.changed_files for paths that resolve outside the
47
+ * session's resolved_repo_path and map them to ClassifiedChange format.
48
+ */
49
+ function findOutOfScopeChanges(artifacts, resolvedRepoPath) {
50
+ const normalizedRepo = resolve(resolvedRepoPath);
51
+ return artifacts.changed_files
52
+ .filter((file) => {
53
+ const fullPath = resolve(normalizedRepo, file.path);
54
+ const rel = relative(normalizedRepo, fullPath);
55
+ return isAbsolute(rel) || rel.startsWith("..");
56
+ })
57
+ .map((file) => toClassifiedChange(file));
58
+ }
59
+ /**
60
+ * Map a ChangedFile to the ClassifiedChange format by adding a reason string.
61
+ */
62
+ function toClassifiedChange(file) {
63
+ return {
64
+ path: file.path,
65
+ change: file.change,
66
+ tracked: file.tracked,
67
+ ignored: file.ignored,
68
+ kind: file.kind,
69
+ reason: classificationReason(file),
70
+ };
71
+ }
72
+ /**
73
+ * Produce a human-readable reason for a changed file classification.
74
+ * Mirrors the logic in changeCapture.ts classifyArtifactHygiene.
75
+ */
76
+ function classificationReason(change) {
77
+ if (change.ignored)
78
+ return "untracked path is ignored by repository Git rules";
79
+ if (change.kind === "build_artifact" && change.tracked)
80
+ return "artifact-like path is tracked by Git and requires review";
81
+ if (change.kind === "build_artifact")
82
+ return "artifact-like path is not ignored and requires review";
83
+ if (change.kind === "runtime_generated")
84
+ return "runtime-generated path is not ignored and requires review";
85
+ return change.tracked ? "tracked source change" : "untracked source change";
86
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./createDirectSession.js";
2
+ export * from "./finalizeDirectSession.js";
3
+ export * from "./runDirectVerificationBundle.js";
@@ -0,0 +1,3 @@
1
+ export * from "./createDirectSession.js";
2
+ export * from "./finalizeDirectSession.js";
3
+ export * from "./runDirectVerificationBundle.js";
@@ -1,5 +1,5 @@
1
- import { getConfig } from "../config.js";
2
- import { runVerification } from "./runVerification.js";
1
+ import { getConfig } from "../../config.js";
2
+ import { runVerification } from "../tasks/runVerification.js";
3
3
  export async function runDirectVerificationBundle(input) {
4
4
  const normalized = normalizeInput(input);
5
5
  const results = [];
@@ -6,6 +6,6 @@
6
6
  * v0.8.1: 为每个搜索结果生成 discoveryToken(server-side 保存)。
7
7
  * v0.9.0: 传入 usageStatsProvider,从 invocation.log 聚合历史成功率用于混合排序。
8
8
  */
9
- import type { ToolDef } from "./registry.js";
10
- import { discoverTools as searchDiscover, type DiscoverToolsInput } from "./toolSearch.js";
9
+ import type { ToolDef } from "../registry.js";
10
+ import { discoverTools as searchDiscover, type DiscoverToolsInput } from "../catalog/toolSearch.js";
11
11
  export declare function discoverTools(input: DiscoverToolsInput, tools: ToolDef[]): ReturnType<typeof searchDiscover>;
@@ -7,11 +7,11 @@
7
7
  * v0.9.0: 传入 usageStatsProvider,从 invocation.log 聚合历史成功率用于混合排序。
8
8
  */
9
9
  import { join } from "node:path";
10
- import { buildToolRegistry } from "./toolRegistry.js";
11
- import { discoverTools as searchDiscover } from "./toolSearch.js";
12
- import { issueToken } from "../security/discoveryTokenStore.js";
13
- import { aggregateUsageStats } from "./toolUsageStats.js";
14
- import { getConfig } from "../config.js";
10
+ import { buildToolRegistry } from "../catalog/toolRegistry.js";
11
+ import { discoverTools as searchDiscover } from "../catalog/toolSearch.js";
12
+ import { issueToken } from "../../security/discoveryTokenStore.js";
13
+ import { aggregateUsageStats } from "../catalog/toolUsageStats.js";
14
+ import { getConfig } from "../../config.js";
15
15
  export function discoverTools(input, tools) {
16
16
  const registry = buildToolRegistry(tools);
17
17
  // v0.9.0: 从 invocation.log 聚合历史成功率,用于混合排序公式
@@ -6,6 +6,6 @@
6
6
  * v0.8.1: includeSchema=true 时通过 tokenPeeker 二次确认 schema digest,
7
7
  * 检测 registry 与实际 toolDef 之间的 schema drift。
8
8
  */
9
- import type { ToolDef } from "./registry.js";
10
- import { explainTool as searchExplain, type ExplainToolInput } from "./toolSearch.js";
9
+ import type { ToolDef } from "../registry.js";
10
+ import { explainTool as searchExplain, type ExplainToolInput } from "../catalog/toolSearch.js";
11
11
  export declare function explainTool(input: ExplainToolInput, tools: ToolDef[]): ReturnType<typeof searchExplain>;
@@ -6,8 +6,8 @@
6
6
  * v0.8.1: includeSchema=true 时通过 tokenPeeker 二次确认 schema digest,
7
7
  * 检测 registry 与实际 toolDef 之间的 schema drift。
8
8
  */
9
- import { buildToolRegistry, computeSchemaDigest } from "./toolRegistry.js";
10
- import { explainTool as searchExplain } from "./toolSearch.js";
9
+ import { buildToolRegistry, computeSchemaDigest } from "../catalog/toolRegistry.js";
10
+ import { explainTool as searchExplain } from "../catalog/toolSearch.js";
11
11
  export function explainTool(input, tools) {
12
12
  const registry = buildToolRegistry(tools);
13
13
  const toolDefsMap = new Map(tools.map((t) => [t.name, t]));
@@ -0,0 +1,3 @@
1
+ export * from "./discoverTools.js";
2
+ export * from "./explainTool.js";
3
+ export * from "./invokeDiscoveredTool.js";
@@ -0,0 +1,3 @@
1
+ export * from "./discoverTools.js";
2
+ export * from "./explainTool.js";
3
+ export * from "./invokeDiscoveredTool.js";
@@ -6,8 +6,8 @@
6
6
  * 防递归 → checkInvocation → dispatch → logToolInvocation,
7
7
  * 任一环节失败都记审计日志并返回错误结果,不向上层抛错。
8
8
  */
9
- import type { ToolProfile } from "./toolCatalog.js";
10
- import type { ToolDef } from "./registry.js";
9
+ import type { ToolProfile } from "../catalog/toolCatalog.js";
10
+ import type { ToolDef } from "../registry.js";
11
11
  export interface InvokeDiscoveredToolInput {
12
12
  toolName: string;
13
13
  arguments: Record<string, unknown>;
@@ -6,11 +6,11 @@
6
6
  * 防递归 → checkInvocation → dispatch → logToolInvocation,
7
7
  * 任一环节失败都记审计日志并返回错误结果,不向上层抛错。
8
8
  */
9
- import { consumeToken } from "../security/discoveryTokenStore.js";
10
- import { checkInvocation } from "../security/toolInvocationGuard.js";
11
- import { logToolInvocation, computeArgumentsDigest } from "../logging.js";
12
- import { buildToolRegistry } from "./toolRegistry.js";
13
- import { PatchWardenError } from "../errors.js";
9
+ import { consumeToken } from "../../security/discoveryTokenStore.js";
10
+ import { checkInvocation } from "../../security/toolInvocationGuard.js";
11
+ import { logToolInvocation, computeArgumentsDigest } from "../../logging.js";
12
+ import { buildToolRegistry } from "../catalog/toolRegistry.js";
13
+ import { PatchWardenError } from "../../errors.js";
14
14
  // ── 内部错误码常量 ────────────────────────────────────────────────
15
15
  const RECURSIVE_INVOCATION_BLOCKED = "recursive_invocation_blocked";
16
16
  const TOOL_NOT_REGISTERED = "tool_not_registered";
@@ -4,38 +4,39 @@
4
4
  * Each handler directly calls the existing tool function — no logic is
5
5
  * rewritten. Extracted from the original handleToolCallInternal switch.
6
6
  */
7
- import { savePlan } from "../savePlan.js";
8
- import { getPlan } from "../getPlan.js";
9
- import { createTask } from "../createTask.js";
10
- import { getTaskStatus } from "../getTaskStatus.js";
11
- import { getResult, getResultJson, getDiff, getTestLog, getTaskLogTail } from "../taskOutputs.js";
12
- import { listWorkspace } from "../listWorkspace.js";
13
- import { readWorkspaceFile } from "../readWorkspaceFile.js";
14
- import { listTasks } from "../listTasks.js";
15
- import { cancelTask } from "../cancelTask.js";
16
- import { killTask } from "../killTask.js";
17
- import { retryTask } from "../retryTask.js";
18
- import { getTaskStdoutTail } from "../getTaskStdoutTail.js";
19
- import { getTaskProgress } from "../getTaskProgress.js";
20
- import { listAgents } from "../listAgents.js";
21
- import { healthCheck } from "../healthCheck.js";
22
- import { getTaskSummary } from "../getTaskSummary.js";
23
- import { waitForTask } from "../waitForTask.js";
24
- import { runTaskLoop } from "../runTaskLoop.js";
25
- import { getTaskLineage } from "../taskLineage.js";
26
- import { exportTaskEvidencePack } from "../evidencePack.js";
27
- import { recommendAgentForTask } from "../recommendAgentForTask.js";
28
- import { auditTask } from "../auditTask.js";
29
- import { safeStatus } from "../safeStatus.js";
30
- import { safeAudit, safeDiffSummary, safeResult, safeTestSummary } from "../safeViews.js";
31
- import { diagnoseTask } from "../diagnoseTask.js";
32
- import { reconcileTasks } from "../reconcileTasks.js";
33
- import { checkReleaseGate } from "../checkReleaseGate.js";
34
- import { getProjectPolicyTool } from "../releaseMode.js";
7
+ import { savePlan } from "../goals/savePlan.js";
8
+ import { getPlan } from "../goals/getPlan.js";
9
+ import { createTask } from "../tasks/createTask.js";
10
+ import { getTaskStatus } from "../tasks/getTaskStatus.js";
11
+ import { getResult, getResultJson, getDiff, getTestLog, getTaskLogTail } from "../tasks/taskOutputs.js";
12
+ import { listWorkspace } from "../workspace/listWorkspace.js";
13
+ import { readWorkspaceFile } from "../workspace/readWorkspaceFile.js";
14
+ import { listTasks } from "../tasks/listTasks.js";
15
+ import { cancelTask } from "../tasks/cancelTask.js";
16
+ import { killTask } from "../tasks/killTask.js";
17
+ import { retryTask } from "../tasks/retryTask.js";
18
+ import { getTaskStdoutTail } from "../tasks/getTaskStdoutTail.js";
19
+ import { getTaskProgress } from "../tasks/getTaskProgress.js";
20
+ import { listAgents } from "../workspace/listAgents.js";
21
+ import { healthCheck } from "../diagnostics/healthCheck.js";
22
+ import { getTaskSummary } from "../tasks/getTaskSummary.js";
23
+ import { waitForTask } from "../tasks/waitForTask.js";
24
+ import { runTaskLoop } from "../tasks/runTaskLoop.js";
25
+ import { getTaskLineage } from "../tasks/taskLineage.js";
26
+ import { exportTaskEvidencePack } from "../tasks/evidencePack.js";
27
+ import { recommendAgentForTask } from "../workspace/recommendAgentForTask.js";
28
+ import { auditTask } from "../diagnostics/auditTask.js";
29
+ import { safeStatus } from "../diagnostics/safeStatus.js";
30
+ import { safeAudit, safeDiffSummary, safeResult, safeTestSummary } from "../diagnostics/safeViews.js";
31
+ import { diagnoseTask } from "../tasks/diagnoseTask.js";
32
+ import { reconcileTasks } from "../tasks/reconcileTasks.js";
33
+ import { checkReleaseGate } from "../release/checkReleaseGate.js";
34
+ import { getProjectPolicyTool } from "../release/releaseMode.js";
35
35
  import { runTask } from "../../runner/runTask.js";
36
36
  import { getConfig } from "../../config.js";
37
37
  import { getToolCatalogSnapshot } from "../registry.js";
38
38
  import { toResult } from "./types.js";
39
+ import { parseOptionalTaskTemplate, parseReleaseStage, parseTaskLogFile, } from "./validation.js";
39
40
  // ── Local helpers (moved verbatim from registry.ts) ───────────────
40
41
  function normalizeWaitSeconds(args) {
41
42
  const legacy = args?.wait_seconds;
@@ -71,7 +72,7 @@ export const coreHandlers = {
71
72
  plan_id: args?.plan_id ? String(args.plan_id) : undefined,
72
73
  inline_plan: args?.inline_plan ? String(args.inline_plan) : undefined,
73
74
  plan_title: args?.plan_title ? String(args.plan_title) : undefined,
74
- template: args?.template ? String(args.template) : undefined,
75
+ template: parseOptionalTaskTemplate(args?.template),
75
76
  goal: args?.goal ? String(args.goal) : undefined,
76
77
  source_task_id: args?.source_task_id ? String(args.source_task_id) : undefined,
77
78
  agent: String(args?.agent ?? ""),
@@ -201,7 +202,7 @@ export const coreHandlers = {
201
202
  return toResult(getTaskStdoutTail(String(args?.task_id ?? ""), args?.lines ? Number(args.lines) : undefined));
202
203
  },
203
204
  get_task_log_tail: async (args) => {
204
- return toResult(getTaskLogTail(String(args?.task_id ?? ""), args?.file || "stdout", {
205
+ return toResult(getTaskLogTail(String(args?.task_id ?? ""), parseTaskLogFile(args?.file), {
205
206
  lines: args?.lines ? Number(args.lines) : undefined,
206
207
  redact: args?.redact !== undefined ? Boolean(args.redact) : undefined,
207
208
  }));
@@ -261,7 +262,7 @@ export const coreHandlers = {
261
262
  check_release_gate: async (args) => {
262
263
  return toResult(await checkReleaseGate({
263
264
  repo_path: String(args?.repo_path ?? ""),
264
- target_stage: String(args?.target_stage ?? "local_ready"),
265
+ target_stage: parseReleaseStage(args?.target_stage),
265
266
  package_name: args?.package_name ? String(args.package_name) : undefined,
266
267
  version: args?.version ? String(args.version) : undefined,
267
268
  github_repo: args?.github_repo ? String(args.github_repo) : undefined,
@@ -5,10 +5,8 @@
5
5
  * invoke_discovered_tool consumes a discovery token and dispatches to
6
6
  * the target tool via handleToolCall.
7
7
  *
8
- * Note: This module imports getToolDefs and handleToolCall from
9
- * registry.ts. The import is a live ESM binding resolved at runtime,
10
- * so the circular dependency (registry → diagnosticDispatch → registry)
11
- * is safe: neither binding is touched during module evaluation.
8
+ * The registry injects the audited dispatcher used by invoke_discovered_tool,
9
+ * avoiding a registry -> diagnosticDispatch -> registry import cycle.
12
10
  */
13
11
  import type { ToolHandlerMap } from "./types.js";
14
- export declare const diagnosticHandlers: ToolHandlerMap;
12
+ export declare function buildDiagnosticHandlers(dispatchTool: (name: string, args: Record<string, unknown> | undefined) => Promise<unknown>): ToolHandlerMap;
@@ -5,74 +5,76 @@
5
5
  * invoke_discovered_tool consumes a discovery token and dispatches to
6
6
  * the target tool via handleToolCall.
7
7
  *
8
- * Note: This module imports getToolDefs and handleToolCall from
9
- * registry.ts. The import is a live ESM binding resolved at runtime,
10
- * so the circular dependency (registry → diagnosticDispatch → registry)
11
- * is safe: neither binding is touched during module evaluation.
8
+ * The registry injects the audited dispatcher used by invoke_discovered_tool,
9
+ * avoiding a registry -> diagnosticDispatch -> registry import cycle.
12
10
  */
13
- import { discoverTools } from "../discoverTools.js";
14
- import { explainTool } from "../explainTool.js";
15
- import { invokeDiscoveredTool } from "../invokeDiscoveredTool.js";
11
+ import { discoverTools } from "../discovery/discoverTools.js";
12
+ import { explainTool } from "../discovery/explainTool.js";
13
+ import { invokeDiscoveredTool } from "../discovery/invokeDiscoveredTool.js";
16
14
  import { getConfig } from "../../config.js";
17
- import { resolveToolProfile } from "../toolCatalog.js";
18
- import { getToolDefs, handleToolCall } from "../registry.js";
15
+ import { resolveToolProfile } from "../catalog/toolCatalog.js";
16
+ import { getToolDefs } from "../definitions/toolDefs.js";
19
17
  import { toResult } from "./types.js";
20
- export const diagnosticHandlers = {
21
- discover_tools: async (args) => {
22
- const profile = args?.profile === "full" ||
23
- args?.profile === "chatgpt_core" ||
24
- args?.profile === "chatgpt_direct" ||
25
- args?.profile === "chatgpt_search"
26
- ? args.profile
27
- : undefined;
28
- const mode = args?.mode === "delegate" ||
29
- args?.mode === "direct" ||
30
- args?.mode === "audit" ||
31
- args?.mode === "release" ||
32
- args?.mode === "diagnostic"
33
- ? args.mode
34
- : undefined;
35
- const riskCeiling = [
36
- "readonly",
37
- "workspace_read_sensitive",
38
- "workspace_write",
39
- "command",
40
- "release",
41
- "credential_sensitive",
42
- ].includes(String(args?.riskCeiling ?? ""))
43
- ? String(args?.riskCeiling)
44
- : undefined;
45
- return toResult(discoverTools({
46
- query: String(args?.query ?? ""),
47
- profile,
48
- mode,
49
- maxResults: args?.maxResults !== undefined ? Number(args.maxResults) : undefined,
50
- riskCeiling,
51
- includeHighRisk: args?.includeHighRisk !== undefined ? Boolean(args.includeHighRisk) : undefined,
52
- }, getToolDefs()));
53
- },
54
- explain_tool: async (args) => {
55
- return toResult(explainTool({
56
- name: String(args?.name ?? ""),
57
- includeSchema: args?.includeSchema !== undefined ? Boolean(args.includeSchema) : undefined,
58
- }, getToolDefs()));
59
- },
60
- invoke_discovered_tool: async (args) => {
61
- const profile = resolveToolProfile(getConfig().toolProfile);
62
- const result = await invokeDiscoveredTool({
63
- toolName: String(args?.toolName ?? ""),
64
- arguments: args?.arguments && typeof args.arguments === "object"
65
- ? args.arguments
66
- : {},
67
- discoveryToken: String(args?.discoveryToken ?? ""),
68
- assessmentId: args?.assessmentId ? String(args.assessmentId) : undefined,
69
- }, {
70
- tools: getToolDefs(),
71
- profile,
72
- dispatch: async (name, dispatchArgs) => {
73
- return handleToolCall(name, dispatchArgs);
74
- },
75
- });
76
- return toResult(result);
77
- },
78
- };
18
+ export function buildDiagnosticHandlers(dispatchTool) {
19
+ return {
20
+ discover_tools: async (args) => {
21
+ const profile = args?.profile === "full" ||
22
+ args?.profile === "chatgpt_core" ||
23
+ args?.profile === "chatgpt_direct" ||
24
+ args?.profile === "chatgpt_search"
25
+ ? args.profile
26
+ : undefined;
27
+ const mode = args?.mode === "delegate" ||
28
+ args?.mode === "direct" ||
29
+ args?.mode === "audit" ||
30
+ args?.mode === "release" ||
31
+ args?.mode === "diagnostic"
32
+ ? args.mode
33
+ : undefined;
34
+ const riskCeilings = new Set([
35
+ "readonly",
36
+ "workspace_read_sensitive",
37
+ "workspace_write",
38
+ "command",
39
+ "release",
40
+ "credential_sensitive",
41
+ ]);
42
+ const requestedRiskCeiling = String(args?.riskCeiling ?? "");
43
+ const riskCeiling = riskCeilings.has(requestedRiskCeiling)
44
+ ? requestedRiskCeiling
45
+ : undefined;
46
+ return toResult(discoverTools({
47
+ query: String(args?.query ?? ""),
48
+ profile,
49
+ mode,
50
+ maxResults: args?.maxResults !== undefined ? Number(args.maxResults) : undefined,
51
+ riskCeiling,
52
+ includeHighRisk: args?.includeHighRisk !== undefined ? Boolean(args.includeHighRisk) : undefined,
53
+ }, getToolDefs()));
54
+ },
55
+ explain_tool: async (args) => {
56
+ return toResult(explainTool({
57
+ name: String(args?.name ?? ""),
58
+ includeSchema: args?.includeSchema !== undefined ? Boolean(args.includeSchema) : undefined,
59
+ }, getToolDefs()));
60
+ },
61
+ invoke_discovered_tool: async (args) => {
62
+ const profile = resolveToolProfile(getConfig().toolProfile);
63
+ const result = await invokeDiscoveredTool({
64
+ toolName: String(args?.toolName ?? ""),
65
+ arguments: args?.arguments && typeof args.arguments === "object"
66
+ ? args.arguments
67
+ : {},
68
+ discoveryToken: String(args?.discoveryToken ?? ""),
69
+ assessmentId: args?.assessmentId ? String(args.assessmentId) : undefined,
70
+ }, {
71
+ tools: getToolDefs(),
72
+ profile,
73
+ dispatch: async (name, dispatchArgs) => {
74
+ return dispatchTool(name, dispatchArgs);
75
+ },
76
+ });
77
+ return toResult(result);
78
+ },
79
+ };
80
+ }
@@ -6,16 +6,17 @@
6
6
  */
7
7
  import { getConfig } from "../../config.js";
8
8
  import { PatchWardenError } from "../../errors.js";
9
- import { createDirectSession } from "../createDirectSession.js";
10
- import { searchWorkspace } from "../searchWorkspace.js";
11
- import { applyPatch } from "../applyPatch.js";
12
- import { runVerification } from "../runVerification.js";
13
- import { runDirectVerificationBundle } from "../runDirectVerificationBundle.js";
14
- import { finalizeDirectSession } from "../finalizeDirectSession.js";
15
- import { auditSession } from "../auditSession.js";
16
- import { syncFile } from "../syncFile.js";
17
- import { safeAuditDirectSession, safeDirectSummary, safeFinalizeDirectSession, } from "../safeViews.js";
9
+ import { createDirectSession } from "../direct/createDirectSession.js";
10
+ import { searchWorkspace } from "../workspace/searchWorkspace.js";
11
+ import { applyPatch } from "../workspace/applyPatch.js";
12
+ import { runVerification } from "../tasks/runVerification.js";
13
+ import { runDirectVerificationBundle } from "../direct/runDirectVerificationBundle.js";
14
+ import { finalizeDirectSession } from "../direct/finalizeDirectSession.js";
15
+ import { auditSession } from "../diagnostics/auditSession.js";
16
+ import { syncFile } from "../workspace/syncFile.js";
17
+ import { safeAuditDirectSession, safeDirectSummary, safeFinalizeDirectSession, } from "../diagnostics/safeViews.js";
18
18
  import { toResult } from "./types.js";
19
+ import { parsePatchOperations } from "./validation.js";
19
20
  /** Mirror of guardDirectProfileEnabled from the original registry.ts. */
20
21
  function guardDirectProfileEnabled() {
21
22
  const config = getConfig();
@@ -50,7 +51,7 @@ export const directHandlers = {
50
51
  session_id: String(args?.session_id ?? ""),
51
52
  path: String(args?.path ?? ""),
52
53
  expected_sha256: String(args?.expected_sha256 ?? ""),
53
- operations: Array.isArray(args?.operations) ? args.operations : [],
54
+ operations: parsePatchOperations(args?.operations),
54
55
  }));
55
56
  },
56
57
  run_verification: async (args) => {
@@ -10,10 +10,11 @@ import { exportHandoff } from "../../goal/handoffExport.js";
10
10
  import { acceptSubgoal, rejectSubgoal, summarizeGoalProgress } from "../../goal/goalProgress.js";
11
11
  import { exportGoalReport } from "../../goal/goalReport.js";
12
12
  import { importSpecKitTasks, parseSpecKitJson } from "../../goal/specKitImport.js";
13
- import { createSubgoalTask } from "../goalSubgoalTask.js";
14
- import { mergeWorktreeTool } from "../mergeWorktree.js";
15
- import { discardWorktreeTool } from "../discardWorktree.js";
13
+ import { createSubgoalTask } from "../goals/goalSubgoalTask.js";
14
+ import { mergeWorktreeTool } from "../workspace/mergeWorktree.js";
15
+ import { discardWorktreeTool } from "../workspace/discardWorktree.js";
16
16
  import { toResult } from "./types.js";
17
+ import { parseOptionalTaskTemplate } from "./validation.js";
17
18
  export const goalHandlers = {
18
19
  create_goal: async (args) => {
19
20
  return toResult(createGoal(String(args?.repo_path ?? ""), String(args?.title ?? ""), String(args?.goal_description ?? "")));
@@ -32,7 +33,7 @@ export const goalHandlers = {
32
33
  plan_id: args?.plan_id ? String(args.plan_id) : undefined,
33
34
  inline_plan: args?.inline_plan ? String(args.inline_plan) : undefined,
34
35
  plan_title: args?.plan_title ? String(args.plan_title) : undefined,
35
- template: args?.template ? String(args.template) : undefined,
36
+ template: parseOptionalTaskTemplate(args?.template),
36
37
  goal: args?.goal ? String(args.goal) : undefined,
37
38
  agent: args?.agent ? String(args.agent) : undefined,
38
39
  repo_path: String(args?.repo_path ?? ""),
@@ -4,13 +4,14 @@
4
4
  * Wraps releaseCheck, releasePrepare, releaseVerify, and releaseCleanup
5
5
  * from releaseMode.ts.
6
6
  */
7
- import { releaseCheck, releasePrepare, releaseVerify, releaseCleanup, } from "../releaseMode.js";
7
+ import { releaseCheck, releasePrepare, releaseVerify, releaseCleanup, } from "../release/releaseMode.js";
8
8
  import { toResult } from "./types.js";
9
+ import { parseReleaseStage } from "./validation.js";
9
10
  export const releaseHandlers = {
10
11
  release_check: async (args) => {
11
12
  return toResult(await releaseCheck({
12
13
  repo_path: String(args?.repo_path ?? ""),
13
- target_stage: String(args?.target_stage ?? "local_ready"),
14
+ target_stage: parseReleaseStage(args?.target_stage),
14
15
  package_name: args?.package_name ? String(args.package_name) : undefined,
15
16
  version: args?.version ? String(args.version) : undefined,
16
17
  github_repo: args?.github_repo ? String(args.github_repo) : undefined,
@@ -0,0 +1,7 @@
1
+ import type { PatchOperation } from "../../direct/directPatch.js";
2
+ import type { ReleaseStage } from "../../release/releaseGate.js";
3
+ import { type TaskTemplateName } from "../taskTemplates.js";
4
+ export declare function parseOptionalTaskTemplate(value: unknown): TaskTemplateName | undefined;
5
+ export declare function parseReleaseStage(value: unknown): ReleaseStage;
6
+ export declare function parseTaskLogFile(value: unknown): "stdout" | "stderr" | "test" | "verify";
7
+ export declare function parsePatchOperations(value: unknown): PatchOperation[];