patchwarden 1.5.1 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PatchWarden.cmd +32 -2
- package/README.en.md +152 -25
- package/README.md +120 -23
- package/dist/assessments/agentAssessor.js +21 -12
- package/dist/assessments/assessmentStore.js +42 -34
- package/dist/config.d.ts +15 -0
- package/dist/config.js +66 -13
- package/dist/control/fileManager.d.ts +2 -0
- package/dist/control/fileManager.js +39 -0
- package/dist/control/middleware/auth.d.ts +6 -0
- package/dist/control/middleware/auth.js +14 -5
- package/dist/control/middleware/static.js +16 -3
- package/dist/control/routeTable.d.ts +24 -0
- package/dist/control/routeTable.js +263 -0
- package/dist/control/routes/audit.js +17 -7
- package/dist/control/routes/evidence.js +1 -1
- package/dist/control/routes/lineage.js +1 -1
- package/dist/control/routes/process.d.ts +7 -0
- package/dist/control/routes/process.js +329 -42
- package/dist/control/routes/sessions.d.ts +9 -1
- package/dist/control/routes/sessions.js +84 -21
- package/dist/control/routes/status.d.ts +46 -1
- package/dist/control/routes/status.js +72 -15
- package/dist/control/routes/taskActions.js +24 -60
- package/dist/control/routes/tasks.d.ts +4 -0
- package/dist/control/routes/tasks.js +61 -62
- package/dist/control/routes/workspace.js +50 -23
- package/dist/control/runtime.d.ts +3 -2
- package/dist/control/runtime.js +63 -30
- package/dist/control/server.js +36 -365
- package/dist/control/shared.d.ts +25 -1
- package/dist/control/shared.js +64 -11
- package/dist/direct/directAudit.js +234 -225
- package/dist/direct/directGuards.d.ts +2 -1
- package/dist/direct/directGuards.js +42 -29
- package/dist/direct/directPatch.d.ts +6 -1
- package/dist/direct/directPatch.js +55 -8
- package/dist/direct/directSessionStore.d.ts +16 -6
- package/dist/direct/directSessionStore.js +127 -35
- package/dist/direct/directVerification.js +8 -16
- package/dist/doctor.js +62 -52
- package/dist/goal/acceptanceEngine.d.ts +1 -1
- package/dist/goal/goalProgress.js +75 -69
- package/dist/goal/goalReport.js +5 -12
- package/dist/goal/goalStatus.d.ts +2 -0
- package/dist/goal/goalStatus.js +10 -3
- package/dist/goal/goalStore.d.ts +9 -2
- package/dist/goal/goalStore.js +152 -45
- package/dist/goal/handoffExport.js +6 -6
- package/dist/goal/specKitImport.js +97 -96
- package/dist/goal/subgoalSync.js +11 -9
- package/dist/goal/worktreeManager.d.ts +2 -0
- package/dist/goal/worktreeManager.js +209 -136
- package/dist/httpServer.js +111 -32
- package/dist/logging.js +5 -3
- package/dist/policy/projectPolicy.js +5 -2
- package/dist/release/releaseGate.d.ts +1 -1
- package/dist/release/releaseGate.js +78 -25
- package/dist/runner/agentInvocation.d.ts +14 -0
- package/dist/runner/agentInvocation.js +96 -4
- package/dist/runner/changeCapture.d.ts +13 -5
- package/dist/runner/changeCapture.js +243 -61
- package/dist/runner/postTaskCleanup.js +48 -19
- package/dist/runner/processSecurity.d.ts +56 -0
- package/dist/runner/processSecurity.js +373 -0
- package/dist/runner/runTask.d.ts +1 -1
- package/dist/runner/runTask.js +115 -87
- package/dist/runner/simpleProcess.d.ts +3 -0
- package/dist/runner/simpleProcess.js +50 -36
- package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
- package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
- package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +1 -1
- package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
- package/dist/runner/taskStatusStore.d.ts +11 -0
- package/dist/runner/taskStatusStore.js +24 -0
- package/dist/runner/watch.d.ts +14 -1
- package/dist/runner/watch.js +256 -48
- package/dist/security/contentRedaction.js +2 -2
- package/dist/security/discoveryTokenStore.d.ts +3 -2
- package/dist/security/discoveryTokenStore.js +17 -2
- package/dist/security/loopbackHost.d.ts +2 -0
- package/dist/security/loopbackHost.js +16 -0
- package/dist/security/pathGuard.js +32 -17
- package/dist/security/planGuard.js +2 -1
- package/dist/security/runtimeGuard.js +9 -6
- package/dist/security/secretComparison.d.ts +3 -0
- package/dist/security/secretComparison.js +11 -0
- package/dist/security/sensitiveGuard.d.ts +5 -0
- package/dist/security/sensitiveGuard.js +27 -8
- package/dist/security/toolInvocationGuard.d.ts +2 -2
- package/dist/security/toolInvocationGuard.js +1 -1
- package/dist/security/workspaceRootGuard.d.ts +8 -0
- package/dist/security/workspaceRootGuard.js +47 -0
- package/dist/smoke-test.js +24 -23
- package/dist/tools/catalog/index.d.ts +4 -0
- package/dist/tools/catalog/index.js +4 -0
- package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
- package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
- package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +6 -15
- package/dist/tools/definitions/toolDefs.d.ts +18 -0
- package/dist/tools/definitions/toolDefs.js +1177 -0
- package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
- package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
- package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +1 -1
- package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +99 -29
- package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +6 -6
- package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +7 -7
- package/dist/tools/diagnostics/index.d.ts +6 -0
- package/dist/tools/diagnostics/index.js +6 -0
- package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
- package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
- package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +12 -8
- package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +23 -13
- package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
- package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
- package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +6 -6
- package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +1 -1
- package/dist/tools/direct/finalizeDirectSession.js +86 -0
- package/dist/tools/direct/index.d.ts +3 -0
- package/dist/tools/direct/index.js +3 -0
- package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
- package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
- package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
- package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
- package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
- package/dist/tools/discovery/index.d.ts +3 -0
- package/dist/tools/discovery/index.js +3 -0
- package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
- package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
- package/dist/tools/dispatch/coreDispatch.js +32 -31
- package/dist/tools/dispatch/diagnosticDispatch.d.ts +3 -5
- package/dist/tools/dispatch/diagnosticDispatch.js +70 -68
- package/dist/tools/dispatch/directDispatch.js +11 -10
- package/dist/tools/dispatch/goalDispatch.js +5 -4
- package/dist/tools/dispatch/releaseDispatch.js +3 -2
- package/dist/tools/dispatch/validation.d.ts +7 -0
- package/dist/tools/dispatch/validation.js +71 -0
- package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
- package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +1 -1
- package/dist/tools/goals/goalSubgoalTask.js +118 -0
- package/dist/tools/goals/index.d.ts +3 -0
- package/dist/tools/goals/index.js +3 -0
- package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
- package/dist/tools/registry.d.ts +7 -11
- package/dist/tools/registry.js +17 -1178
- package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
- package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
- package/dist/tools/release/index.d.ts +2 -0
- package/dist/tools/release/index.js +2 -0
- package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
- package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
- package/dist/tools/tasks/cancelTask.d.ts +11 -0
- package/dist/tools/tasks/cancelTask.js +85 -0
- package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +10 -2
- package/dist/tools/{createTask.js → tasks/createTask.js} +42 -27
- package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
- package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +8 -8
- package/dist/tools/{evidencePack.js → tasks/evidencePack.js} +34 -22
- package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
- package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
- package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +5 -5
- package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
- package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +33 -26
- package/dist/tools/tasks/index.d.ts +18 -0
- package/dist/tools/tasks/index.js +18 -0
- package/dist/tools/tasks/killTask.d.ts +1 -0
- package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
- package/dist/tools/{listTasks.js → tasks/listTasks.js} +3 -3
- package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +1 -1
- package/dist/tools/{reconcileTasks.js → tasks/reconcileTasks.js} +64 -66
- package/dist/tools/tasks/retryTask.js +60 -0
- package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
- package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +58 -30
- package/dist/tools/tasks/runVerification.js +38 -0
- package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
- package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
- package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
- package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
- package/dist/tools/workspace/applyPatch.js +53 -0
- package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
- package/dist/tools/workspace/index.d.ts +10 -0
- package/dist/tools/workspace/index.js +10 -0
- package/dist/tools/{listAgents.d.ts → workspace/listAgents.d.ts} +5 -0
- package/dist/tools/{listAgents.js → workspace/listAgents.js} +8 -4
- package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
- package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
- package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
- package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
- package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
- package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
- package/dist/tools/workspace/syncFile.js +134 -0
- package/dist/utils/atomicFile.d.ts +7 -0
- package/dist/utils/atomicFile.js +48 -0
- package/dist/utils/boundedFile.d.ts +8 -0
- package/dist/utils/boundedFile.js +93 -0
- package/dist/utils/lockedJsonFile.d.ts +15 -0
- package/dist/utils/lockedJsonFile.js +224 -0
- package/dist/utils/platform.d.ts +11 -0
- package/dist/utils/platform.js +26 -0
- package/dist/utils/stableJson.d.ts +2 -0
- package/dist/utils/stableJson.js +12 -0
- package/dist/version.d.ts +3 -2
- package/dist/version.js +3 -2
- package/dist/watcherStatus.d.ts +2 -2
- package/dist/watcherStatus.js +18 -0
- package/docs/CODE_WIKI.md +808 -143
- package/docs/architecture.md +15 -55
- package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
- package/docs/control-center/README.md +4 -4
- package/docs/dashboard-overview.md +4 -4
- package/docs/desktop-app.md +175 -0
- package/docs/evidence-pack-schema.md +3 -3
- package/docs/open-source-application.md +17 -11
- package/docs/release-checklist.md +1 -1
- package/docs/release-evidence.md +39 -29
- package/docs/task-safe-review-workflow.md +5 -5
- package/docs/threat-model.md +19 -1
- package/examples/config.example.json +4 -2
- package/package.json +27 -10
- package/scripts/README.md +15 -6
- package/scripts/build.js +11 -0
- package/scripts/checks/brand-check.js +3 -0
- package/scripts/checks/build-output-check.js +37 -0
- package/scripts/checks/control-center-smoke.js +91 -6
- package/scripts/checks/control-smoke.js +19 -8
- package/scripts/checks/http-mcp-smoke.js +82 -4
- package/scripts/checks/lifecycle-smoke.js +10 -10
- package/scripts/checks/mcp-manifest-check.js +1 -1
- package/scripts/checks/mcp-smoke.js +27 -3
- package/scripts/checks/package-manifest-check.js +20 -7
- package/scripts/checks/unit-tests.js +3 -5
- package/scripts/checks/watcher-supervisor-smoke.js +9 -0
- package/scripts/control/get-patchwarden-health.ps1 +1 -1
- package/scripts/control/manage-patchwarden.ps1 +69 -4
- package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
- package/scripts/control/run-background-supervisor.ps1 +41 -0
- package/scripts/control/start-patchwarden-tunnel.ps1 +126 -32
- package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
- package/scripts/launchers/PatchWarden-Control.cmd +6 -0
- package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
- package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
- package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
- package/scripts/lib/clean-generated-output.js +11 -0
- package/scripts/lib/file-discovery.js +12 -0
- package/scripts/release/desktop-preflight.js +211 -0
- package/scripts/release/pack-clean.js +59 -14
- package/src/assessments/agentAssessor.ts +26 -12
- package/src/assessments/assessmentStore.ts +52 -40
- package/src/config.ts +70 -13
- package/src/control/fileManager.ts +40 -0
- package/src/control/middleware/auth.ts +22 -4
- package/src/control/middleware/static.ts +16 -3
- package/src/control/routeTable.ts +301 -0
- package/src/control/routes/audit.ts +14 -6
- package/src/control/routes/evidence.ts +1 -1
- package/src/control/routes/lineage.ts +1 -1
- package/src/control/routes/process.ts +341 -40
- package/src/control/routes/sessions.ts +88 -25
- package/src/control/routes/status.ts +97 -17
- package/src/control/routes/taskActions.ts +24 -58
- package/src/control/routes/tasks.ts +66 -58
- package/src/control/routes/workspace.ts +56 -25
- package/src/control/runtime.ts +69 -33
- package/src/control/server.ts +36 -342
- package/src/control/shared.ts +77 -11
- package/src/direct/directAudit.ts +17 -9
- package/src/direct/directGuards.ts +72 -44
- package/src/direct/directPatch.ts +95 -8
- package/src/direct/directSessionStore.ts +211 -55
- package/src/direct/directVerification.ts +9 -23
- package/src/doctor.ts +73 -59
- package/src/goal/acceptanceEngine.ts +1 -1
- package/src/goal/goalProgress.ts +17 -13
- package/src/goal/goalReport.ts +5 -13
- package/src/goal/goalStatus.ts +19 -3
- package/src/goal/goalStore.ts +241 -54
- package/src/goal/handoffExport.ts +6 -6
- package/src/goal/specKitImport.ts +12 -12
- package/src/goal/subgoalSync.ts +11 -8
- package/src/goal/worktreeManager.ts +139 -22
- package/src/httpServer.ts +113 -30
- package/src/logging.ts +10 -3
- package/src/policy/projectPolicy.ts +5 -2
- package/src/release/releaseGate.ts +74 -27
- package/src/runner/agentInvocation.ts +126 -4
- package/src/runner/changeCapture.ts +291 -57
- package/src/runner/postTaskCleanup.ts +41 -17
- package/src/runner/processSecurity.ts +433 -0
- package/src/runner/runTask.ts +138 -91
- package/src/runner/simpleProcess.ts +66 -31
- package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
- package/src/{taskRuntime.ts → runner/taskRuntime.ts} +4 -3
- package/src/runner/taskStatusStore.ts +54 -0
- package/src/runner/watch.ts +281 -51
- package/src/security/contentRedaction.ts +2 -2
- package/src/security/discoveryTokenStore.ts +18 -4
- package/src/security/loopbackHost.ts +19 -0
- package/src/security/pathGuard.ts +35 -16
- package/src/security/planGuard.ts +2 -1
- package/src/security/runtimeGuard.ts +9 -6
- package/src/security/secretComparison.ts +13 -0
- package/src/security/sensitiveGuard.ts +27 -8
- package/src/security/toolInvocationGuard.ts +2 -2
- package/src/security/workspaceRootGuard.ts +53 -0
- package/src/smoke-test.ts +25 -24
- package/src/tools/catalog/index.ts +4 -0
- package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
- package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +7 -16
- package/src/tools/definitions/toolDefs.ts +1264 -0
- package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
- package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +99 -32
- package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +8 -8
- package/src/tools/diagnostics/index.ts +6 -0
- package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
- package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +27 -17
- package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
- package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +6 -6
- package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +7 -5
- package/src/tools/direct/index.ts +3 -0
- package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
- package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
- package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
- package/src/tools/discovery/index.ts +3 -0
- package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
- package/src/tools/dispatch/coreDispatch.ts +36 -31
- package/src/tools/dispatch/diagnosticDispatch.ts +26 -21
- package/src/tools/dispatch/directDispatch.ts +11 -10
- package/src/tools/dispatch/goalDispatch.ts +5 -4
- package/src/tools/dispatch/releaseDispatch.ts +3 -2
- package/src/tools/dispatch/validation.ts +78 -0
- package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
- package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +41 -26
- package/src/tools/goals/index.ts +3 -0
- package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
- package/src/tools/registry.ts +17 -1261
- package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
- package/src/tools/release/index.ts +2 -0
- package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
- package/src/tools/tasks/cancelTask.ts +109 -0
- package/src/tools/{createTask.ts → tasks/createTask.ts} +49 -26
- package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +8 -8
- package/src/tools/{evidencePack.ts → tasks/evidencePack.ts} +36 -22
- package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
- package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +7 -5
- package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
- package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +44 -33
- package/src/tools/tasks/index.ts +18 -0
- package/src/tools/{listTasks.ts → tasks/listTasks.ts} +4 -4
- package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +68 -66
- package/src/tools/tasks/retryTask.ts +69 -0
- package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +69 -34
- package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
- package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
- package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
- package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
- package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
- package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
- package/src/tools/workspace/index.ts +10 -0
- package/src/tools/{listAgents.ts → workspace/listAgents.ts} +11 -4
- package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
- package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
- package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
- package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
- package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
- package/src/tools/workspace/syncFile.ts +292 -0
- package/src/utils/atomicFile.ts +58 -0
- package/src/utils/boundedFile.ts +116 -0
- package/src/utils/lockedJsonFile.ts +251 -0
- package/src/utils/platform.ts +31 -0
- package/src/utils/stableJson.ts +12 -0
- package/src/version.ts +3 -2
- package/src/watcherStatus.ts +19 -1
- package/ui/desktop-bootstrap.js +11 -0
- package/ui/desktop-bridge.js +36 -0
- package/ui/desktop.css +160 -0
- package/ui/getting-started.js +93 -0
- package/ui/i18n.js +484 -0
- package/ui/log-parser.js +30 -0
- package/ui/pages/audit.html +12 -0
- package/ui/pages/dashboard.html +90 -147
- package/ui/pages/direct-sessions.html +123 -26
- package/ui/pages/getting-started.html +43 -0
- package/ui/pages/logs.html +105 -22
- package/ui/pages/settings.html +101 -0
- package/ui/pages/task-detail.html +12 -0
- package/ui/pages/tasks.html +54 -8
- package/ui/pages/workspace.html +38 -1
- package/ui/settings.js +245 -0
- package/PatchWarden-Control.cmd +0 -6
- package/Restart-PatchWarden-Control.cmd +0 -6
- package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
- package/dist/test/unit/acceptance-engine.test.js +0 -228
- package/dist/test/unit/agent-router.test.d.ts +0 -1
- package/dist/test/unit/agent-router.test.js +0 -287
- package/dist/test/unit/android-doctor.test.d.ts +0 -1
- package/dist/test/unit/android-doctor.test.js +0 -118
- package/dist/test/unit/apply-patch.test.d.ts +0 -1
- package/dist/test/unit/apply-patch.test.js +0 -225
- package/dist/test/unit/audit-checks.test.d.ts +0 -1
- package/dist/test/unit/audit-checks.test.js +0 -350
- package/dist/test/unit/chinese-path.test.d.ts +0 -1
- package/dist/test/unit/chinese-path.test.js +0 -91
- package/dist/test/unit/command-guard.test.d.ts +0 -1
- package/dist/test/unit/command-guard.test.js +0 -160
- package/dist/test/unit/create-task.test.d.ts +0 -1
- package/dist/test/unit/create-task.test.js +0 -197
- package/dist/test/unit/diagnose-task.test.d.ts +0 -1
- package/dist/test/unit/diagnose-task.test.js +0 -457
- package/dist/test/unit/direct-guards.test.d.ts +0 -1
- package/dist/test/unit/direct-guards.test.js +0 -328
- package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
- package/dist/test/unit/discovery-token-store.test.js +0 -139
- package/dist/test/unit/evidence-pack.test.d.ts +0 -1
- package/dist/test/unit/evidence-pack.test.js +0 -224
- package/dist/test/unit/get-task-status.test.d.ts +0 -1
- package/dist/test/unit/get-task-status.test.js +0 -174
- package/dist/test/unit/get-task-summary.test.d.ts +0 -1
- package/dist/test/unit/get-task-summary.test.js +0 -146
- package/dist/test/unit/goal-graph.test.d.ts +0 -1
- package/dist/test/unit/goal-graph.test.js +0 -298
- package/dist/test/unit/goal-progress.test.d.ts +0 -1
- package/dist/test/unit/goal-progress.test.js +0 -381
- package/dist/test/unit/goal-report.test.d.ts +0 -1
- package/dist/test/unit/goal-report.test.js +0 -159
- package/dist/test/unit/goal-status.test.d.ts +0 -1
- package/dist/test/unit/goal-status.test.js +0 -215
- package/dist/test/unit/goal-store.test.d.ts +0 -1
- package/dist/test/unit/goal-store.test.js +0 -253
- package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
- package/dist/test/unit/goal-subgoal-task.test.js +0 -55
- package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
- package/dist/test/unit/goal-tools-registry.test.js +0 -192
- package/dist/test/unit/handoff-export.test.d.ts +0 -1
- package/dist/test/unit/handoff-export.test.js +0 -263
- package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
- package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
- package/dist/test/unit/logging.test.d.ts +0 -1
- package/dist/test/unit/logging.test.js +0 -397
- package/dist/test/unit/path-guard.test.d.ts +0 -1
- package/dist/test/unit/path-guard.test.js +0 -133
- package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
- package/dist/test/unit/post-task-cleanup.test.js +0 -48
- package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
- package/dist/test/unit/project-policy-release-mode.test.js +0 -125
- package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
- package/dist/test/unit/reconcile-tasks.test.js +0 -456
- package/dist/test/unit/release-gate.test.d.ts +0 -1
- package/dist/test/unit/release-gate.test.js +0 -242
- package/dist/test/unit/run-task-loop.test.d.ts +0 -1
- package/dist/test/unit/run-task-loop.test.js +0 -380
- package/dist/test/unit/safe-status.test.d.ts +0 -1
- package/dist/test/unit/safe-status.test.js +0 -165
- package/dist/test/unit/safe-views.test.d.ts +0 -1
- package/dist/test/unit/safe-views.test.js +0 -171
- package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
- package/dist/test/unit/schema-drift-check.test.js +0 -176
- package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
- package/dist/test/unit/sensitive-guard.test.js +0 -104
- package/dist/test/unit/spec-kit-import.test.d.ts +0 -1
- package/dist/test/unit/spec-kit-import.test.js +0 -341
- package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
- package/dist/test/unit/subgoal-sync.test.js +0 -183
- package/dist/test/unit/sync-file.test.d.ts +0 -1
- package/dist/test/unit/sync-file.test.js +0 -154
- package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
- package/dist/test/unit/tool-invocation-guard.test.js +0 -432
- package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
- package/dist/test/unit/tool-usage-stats.test.js +0 -300
- package/dist/test/unit/toolSearch.test.d.ts +0 -1
- package/dist/test/unit/toolSearch.test.js +0 -571
- package/dist/test/unit/wait-for-task.test.d.ts +0 -1
- package/dist/test/unit/wait-for-task.test.js +0 -144
- package/dist/test/unit/watcher-status.test.d.ts +0 -1
- package/dist/test/unit/watcher-status.test.js +0 -169
- package/dist/test/unit/worktree-manager.test.d.ts +0 -1
- package/dist/test/unit/worktree-manager.test.js +0 -176
- package/dist/tools/applyPatch.js +0 -41
- package/dist/tools/cancelTask.d.ts +0 -30
- package/dist/tools/cancelTask.js +0 -64
- package/dist/tools/finalizeDirectSession.js +0 -84
- package/dist/tools/goalSubgoalTask.js +0 -110
- package/dist/tools/killTask.d.ts +0 -15
- package/dist/tools/retryTask.js +0 -45
- package/dist/tools/runVerification.js +0 -36
- package/dist/tools/syncFile.js +0 -65
- package/docs/control-center/control-center-daily-driver.md +0 -211
- package/docs/control-center/control-center-mvp.md +0 -205
- package/docs/control-center/control-center-phase2.md +0 -159
- package/docs/execution-plan-2026-07-09.md +0 -315
- package/docs/release-v0.6.0.md +0 -71
- package/docs/release-v0.6.1.md +0 -75
- package/docs/release-v0.6.4.md +0 -45
- package/docs/roadmap-execution-and-acceptance.md +0 -365
- package/src/test/unit/acceptance-engine.test.ts +0 -261
- package/src/test/unit/agent-router.test.ts +0 -342
- package/src/test/unit/android-doctor.test.ts +0 -158
- package/src/test/unit/apply-patch.test.ts +0 -293
- package/src/test/unit/audit-checks.test.ts +0 -567
- package/src/test/unit/chinese-path.test.ts +0 -106
- package/src/test/unit/command-guard.test.ts +0 -221
- package/src/test/unit/create-task.test.ts +0 -255
- package/src/test/unit/diagnose-task.test.ts +0 -544
- package/src/test/unit/direct-guards.test.ts +0 -467
- package/src/test/unit/discovery-token-store.test.ts +0 -181
- package/src/test/unit/evidence-pack.test.ts +0 -251
- package/src/test/unit/get-task-status.test.ts +0 -203
- package/src/test/unit/get-task-summary.test.ts +0 -173
- package/src/test/unit/goal-graph.test.ts +0 -347
- package/src/test/unit/goal-progress.test.ts +0 -538
- package/src/test/unit/goal-report.test.ts +0 -189
- package/src/test/unit/goal-status.test.ts +0 -270
- package/src/test/unit/goal-store.test.ts +0 -318
- package/src/test/unit/goal-subgoal-task.test.ts +0 -72
- package/src/test/unit/goal-tools-registry.test.ts +0 -245
- package/src/test/unit/handoff-export.test.ts +0 -295
- package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
- package/src/test/unit/logging.test.ts +0 -497
- package/src/test/unit/path-guard.test.ts +0 -180
- package/src/test/unit/post-task-cleanup.test.ts +0 -53
- package/src/test/unit/project-policy-release-mode.test.ts +0 -156
- package/src/test/unit/reconcile-tasks.test.ts +0 -551
- package/src/test/unit/release-gate.test.ts +0 -314
- package/src/test/unit/run-task-loop.test.ts +0 -425
- package/src/test/unit/safe-status.test.ts +0 -187
- package/src/test/unit/safe-views.test.ts +0 -184
- package/src/test/unit/schema-drift-check.test.ts +0 -260
- package/src/test/unit/sensitive-guard.test.ts +0 -124
- package/src/test/unit/spec-kit-import.test.ts +0 -429
- package/src/test/unit/subgoal-sync.test.ts +0 -236
- package/src/test/unit/sync-file.test.ts +0 -231
- package/src/test/unit/tool-invocation-guard.test.ts +0 -542
- package/src/test/unit/tool-usage-stats.test.ts +0 -384
- package/src/test/unit/toolSearch.test.ts +0 -756
- package/src/test/unit/wait-for-task.test.ts +0 -176
- package/src/test/unit/watcher-status.test.ts +0 -190
- package/src/test/unit/worktree-manager.test.ts +0 -247
- package/src/tools/cancelTask.ts +0 -70
- package/src/tools/retryTask.ts +0 -53
- package/src/tools/syncFile.ts +0 -122
- /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
- /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
- /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
- /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
- /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
- /package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +0 -0
- /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
- /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
- /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
- /package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +0 -0
- /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
- /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
- /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
- /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
- /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
- /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
- /package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +0 -0
- /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
- /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
- /package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +0 -0
- /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
- /package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +0 -0
- /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
- /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
- /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
- /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
- /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
- /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
- /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
- /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
- /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
- /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
- /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
- /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` 打开,需要本地图形环境
|