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.
- package/PatchWarden.cmd +32 -2
- package/README.en.md +158 -26
- package/README.md +124 -24
- package/dist/assessments/agentAssessor.js +21 -12
- package/dist/assessments/assessmentDiagnostics.d.ts +29 -0
- package/dist/assessments/assessmentDiagnostics.js +132 -0
- package/dist/assessments/assessmentStore.d.ts +39 -0
- package/dist/assessments/assessmentStore.js +207 -45
- package/dist/assessments/securitySnapshot.d.ts +50 -0
- package/dist/assessments/securitySnapshot.js +158 -0
- 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 +60 -1
- package/dist/control/routes/status.js +94 -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 +65 -40
- package/dist/control/server.js +37 -365
- package/dist/control/shared.d.ts +25 -1
- package/dist/control/shared.js +64 -11
- package/dist/diagnostics/allowedTestCommandSafety.d.ts +1 -0
- package/dist/diagnostics/allowedTestCommandSafety.js +11 -0
- 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 +128 -35
- package/dist/direct/directVerification.js +8 -16
- package/dist/doctor.js +65 -57
- 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 +2 -1
- package/dist/runner/runTask.js +162 -93
- 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} +3 -1
- package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
- package/dist/runner/taskStatusStore.d.ts +11 -0
- package/dist/runner/taskStatusStore.js +35 -0
- package/dist/runner/watch.d.ts +14 -1
- package/dist/runner/watch.js +320 -49
- 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 +27 -26
- 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} +2 -1
- package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +134 -36
- package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +18 -6
- package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +36 -8
- 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 +86 -0
- package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +12 -4
- package/dist/tools/{createTask.js → tasks/createTask.js} +110 -34
- package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
- package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +12 -16
- 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} +11 -6
- package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
- package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +35 -36
- 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} +5 -4
- package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +3 -2
- package/dist/tools/tasks/reconcileTasks.js +496 -0
- 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} +63 -41
- package/dist/tools/tasks/runVerification.js +38 -0
- package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
- package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +2 -2
- package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
- package/dist/tools/tasks/taskStates.d.ts +6 -0
- package/dist/tools/tasks/taskStates.js +52 -0
- package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +3 -11
- 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/workspace/listAgents.d.ts +23 -0
- package/dist/tools/workspace/listAgents.js +56 -0
- 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 +67 -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 +16 -11
- package/docs/release-checklist.md +1 -1
- package/docs/release-evidence.md +35 -39
- 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 +102 -10
- package/scripts/checks/control-smoke.js +19 -8
- package/scripts/checks/http-mcp-smoke.js +82 -4
- package/scripts/checks/lifecycle-smoke.js +15 -12
- package/scripts/checks/mcp-manifest-check.js +1 -1
- package/scripts/checks/mcp-smoke.js +58 -4
- package/scripts/checks/package-manifest-check.js +20 -7
- package/scripts/checks/unit-tests.js +3 -5
- package/scripts/checks/watcher-supervisor-smoke.js +38 -1
- 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 +191 -33
- package/scripts/e2e/demo-runtime.mjs +153 -0
- 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/assessmentDiagnostics.ts +172 -0
- package/src/assessments/assessmentStore.ts +288 -51
- package/src/assessments/securitySnapshot.ts +231 -0
- 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 +134 -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 +71 -43
- package/src/control/server.ts +37 -342
- package/src/control/shared.ts +77 -11
- package/src/diagnostics/allowedTestCommandSafety.ts +12 -0
- 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 +213 -55
- package/src/direct/directVerification.ts +9 -23
- package/src/doctor.ts +76 -64
- 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 +197 -97
- package/src/runner/simpleProcess.ts +66 -31
- package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
- package/src/{taskRuntime.ts → runner/taskRuntime.ts} +6 -3
- package/src/runner/taskStatusStore.ts +69 -0
- package/src/runner/watch.ts +348 -52
- 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 +27 -26
- 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} +136 -39
- package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +37 -9
- 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 +110 -0
- package/src/tools/{createTask.ts → tasks/createTask.ts} +161 -33
- package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +12 -16
- 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} +13 -6
- package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
- package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +46 -44
- package/src/tools/tasks/index.ts +18 -0
- package/src/tools/{listTasks.ts → tasks/listTasks.ts} +6 -5
- package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +228 -77
- package/src/tools/tasks/retryTask.ts +69 -0
- package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +73 -46
- 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/tasks/taskStates.ts +54 -0
- package/src/tools/{waitForTask.ts → tasks/waitForTask.ts} +3 -12
- 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/workspace/listAgents.ts +75 -0
- 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 +74 -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 +94 -147
- package/ui/pages/direct-sessions.html +123 -26
- package/ui/pages/getting-started.html +43 -0
- package/ui/pages/logs.html +134 -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 +254 -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/listAgents.d.ts +0 -12
- package/dist/tools/listAgents.js +0 -42
- package/dist/tools/reconcileTasks.js +0 -352
- 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/listAgents.ts +0 -54
- 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/{waitForTask.d.ts → tasks/waitForTask.d.ts} +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
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
# PatchWarden Control Center Phase 2
|
|
2
|
-
|
|
3
|
-
> v0.6.3 在 v0.6.2 MVP 基础上增强任务、工作区、Direct session 和日志体验。
|
|
4
|
-
> 不重构架构,不合并 Core/Direct MCP,不改现有 MCP 工具注册逻辑。
|
|
5
|
-
> 不发布 npm,不打 git tag。
|
|
6
|
-
|
|
7
|
-
## 概述
|
|
8
|
-
|
|
9
|
-
Phase 2 完全在 Control Center HTTP 层增强,未触动 MCP 工具注册、watcher 核心循环或
|
|
10
|
-
Direct session 写入逻辑。新增的 API 全部沿用既有 token 校验、路径围栏和脱敏机制。
|
|
11
|
-
|
|
12
|
-
- **Stale Task 管理**:4 条规则识别僵死任务,reconcile 只标注不删除
|
|
13
|
-
- **task-detail 增强**:变更文件、验证摘要、警告/错误、stale 横幅 + 4 个动作按钮
|
|
14
|
-
- **工作区按需 git 状态**:仅在用户点击时对单个 repo 执行 `git status --short`
|
|
15
|
-
- **Direct Sessions 页面**:浏览 `.patchwarden/direct-sessions` 下的会话产物
|
|
16
|
-
- **Logs 页面**:core/direct/watcher/control-center 四类日志,支持 tail 100/300/1000
|
|
17
|
-
|
|
18
|
-
## 启动方式
|
|
19
|
-
|
|
20
|
-
启动方式与 MVP 完全一致,无新增入口:
|
|
21
|
-
|
|
22
|
-
```powershell
|
|
23
|
-
.\PatchWarden-Control.cmd
|
|
24
|
-
# 或
|
|
25
|
-
npm.cmd run build
|
|
26
|
-
npm.cmd run start:control
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
启动后访问 `http://127.0.0.1:8090`,左侧导航新增「Direct 会话」和「日志」两项。
|
|
30
|
-
|
|
31
|
-
## 改动文件
|
|
32
|
-
|
|
33
|
-
| 文件 | 改动 |
|
|
34
|
-
| --- | --- |
|
|
35
|
-
| `src/version.ts` | `PATCHWARDEN_VERSION` 0.6.2 → 0.6.3 |
|
|
36
|
-
| `package.json` | `version` 0.6.2 → 0.6.3 |
|
|
37
|
-
| `src/controlCenter.ts` | 新增 stale/reconcile/task-detail 增强/workspace repo status/direct sessions/logs 分类等 API |
|
|
38
|
-
| `ui/pages/dashboard.html` | 侧边栏新增 Direct 会话 + 日志导航 |
|
|
39
|
-
| `ui/pages/tasks.html` | 侧边栏新增 Direct 会话 + 日志导航 |
|
|
40
|
-
| `ui/pages/task-detail.html` | 新增变更文件卡、验证摘要卡、警告/错误卡、stale 横幅、Refresh/Copy task_id/Open folder/Run audit/Reconcile 按钮 |
|
|
41
|
-
| `ui/pages/workspace.html` | 每个 repo 新增「检查」按钮,按需调用 `/api/workspace/:repo/status`,渲染 git 状态面板 |
|
|
42
|
-
| `ui/pages/audit.html` | 侧边栏新增 Direct 会话 + 日志导航 |
|
|
43
|
-
| `ui/pages/direct-sessions.html` | 新页面:会话列表 + 会话详情(summary.md / audit.md / audit.json / diff.patch / changed-files.json) |
|
|
44
|
-
| `ui/pages/logs.html` | 新页面:分类选择 + tail 选择 + 自动刷新开关 |
|
|
45
|
-
| `scripts/checks/control-center-smoke.js` | 新增 Test 11–15 覆盖 Phase 2 API |
|
|
46
|
-
| `docs/control-center/control-center-phase2.md` | 本文档 |
|
|
47
|
-
|
|
48
|
-
## 新增 API
|
|
49
|
-
|
|
50
|
-
### GET 接口(免 token)
|
|
51
|
-
|
|
52
|
-
| 路径 | 说明 |
|
|
53
|
-
| --- | --- |
|
|
54
|
-
| `GET /api/tasks/stale` | 返回当前判定为 stale 的任务列表(含 stale_reasons) |
|
|
55
|
-
| `GET /api/tasks/:taskId` | 增强详情:新增 `changed_files`、`file_stats`、`verification_summary`、`warnings`、`errors`、`stale`、`reconcile`、`task_dir`、`independent_review`、`verify_log` |
|
|
56
|
-
| `GET /api/workspace/:repo/status` | 对单个 repo 执行 `git status --short`,返回 changed_files_count/untracked_count/modified_count/is_clean/short_status |
|
|
57
|
-
| `GET /api/direct-sessions` | 列出 `.patchwarden/direct-sessions` 下所有会话摘要 |
|
|
58
|
-
| `GET /api/direct-sessions/:sessionId` | 返回会话详情:summary/session/summary_md/diff_patch/audit_json/audit_md/changed_files |
|
|
59
|
-
| `GET /api/logs/:category?tail=<100\|300\|1000>` | 四类日志(core/direct/watcher/control-center),支持 tail 行数 |
|
|
60
|
-
|
|
61
|
-
### POST 接口(必须校验 token)
|
|
62
|
-
|
|
63
|
-
| 路径 | 说明 |
|
|
64
|
-
| --- | --- |
|
|
65
|
-
| `POST /api/tasks/:taskId/reconcile` | 标注 stale/archived,写入 `reconcile.json`,不删除任务 |
|
|
66
|
-
| `POST /api/tasks/:taskId/audit` | 仅当任务处于终态时委托 `auditTask` 运行独立审计 |
|
|
67
|
-
| `POST /api/tasks/:taskId/open-folder` | 通过系统命令打开任务目录 |
|
|
68
|
-
|
|
69
|
-
## Stale Task 判定规则
|
|
70
|
-
|
|
71
|
-
`classifyStaleTask` 仅对 `pending` / `running` 状态任务判定(终态任务直接返回非 stale)。
|
|
72
|
-
判定使用 `config.watcherStaleSeconds` 作为阈值,4 条规则任一命中即标记 stale:
|
|
73
|
-
|
|
74
|
-
| 规则 | 字段值 | 说明 |
|
|
75
|
-
| --- | --- | --- |
|
|
76
|
-
| `heartbeat_stale` | status=running 且 last_heartbeat_at 超过阈值 | 运行中但心跳长时间未更新 |
|
|
77
|
-
| `collecting_artifacts_stale` | phase=collecting_artifacts 且心跳超过阈值 | 卡在产物收集阶段 |
|
|
78
|
-
| `running_no_command_watcher_healthy` | status=running 且 current_command 为空且 watcher healthy | 运行中无命令但 watcher 在工作,疑似僵死 |
|
|
79
|
-
| `heartbeat_far_behind_watcher` | 任务心跳比 watcher 心跳早 2× 阈值以上且 watcher healthy | 任务明显落后于 watcher |
|
|
80
|
-
|
|
81
|
-
`/api/status` 和 `/api/tasks` 返回的任务对象均带 `is_stale: boolean` 和
|
|
82
|
-
`stale_reasons: string[]`。`/api/status.tasks` 还聚合了 `stale` 计数和
|
|
83
|
-
`stale_task_ids` 列表。
|
|
84
|
-
|
|
85
|
-
## Reconcile 行为
|
|
86
|
-
|
|
87
|
-
`POST /api/tasks/:taskId/reconcile` 的安全契约:
|
|
88
|
-
|
|
89
|
-
- **不删除任务**,不修改 `status` 枚举值
|
|
90
|
-
- 读取 `status.json` / `runtime.json` 重建 `TaskEntry`,重新调用 `classifyStaleTask`
|
|
91
|
-
- 决策(`decision` 字段):
|
|
92
|
-
- `marked_archived`:任务已处于终态 → 标注归档
|
|
93
|
-
- `marked_stale`:stale 且 watcher 未在驱动(无 current_command 或 watcher 非 healthy)→ 标注僵死
|
|
94
|
-
- `no_action`:不满足上述条件 → 仅记录,不标注
|
|
95
|
-
- 写入 `tasks/<taskId>/reconcile.json`(完整决策记录)
|
|
96
|
-
- 仅当 `safe=true` 时,在 `status.json` 追加 `reconcile_state`(`"stale"` 或 `"archived"`)和 `reconciled_at`,**原 status 字段保持不变**
|
|
97
|
-
- 返回 reconcile 记录 JSON
|
|
98
|
-
|
|
99
|
-
## 路径围栏(workspace repo status)
|
|
100
|
-
|
|
101
|
-
`GET /api/workspace/:repo/status` 的安全约束:
|
|
102
|
-
|
|
103
|
-
- `repo` 参数经 `decodeURIComponent` 后若包含 `..` 或 `\0` → 直接 400
|
|
104
|
-
- 通过 `guardWorkspacePath(repo, workspaceRoot)` 解析为绝对路径,任何逃逸 `workspaceRoot` 的路径 → 400
|
|
105
|
-
- 仅对解析后的目录执行 `git status --short`,超时 8 秒,maxBuffer 1MB
|
|
106
|
-
- 非 git 仓库或 git 不可用时返回 200 + `is_git_repo: false` + error 字段,不返回 500
|
|
107
|
-
- smoke test 用 `encodeURIComponent("../secret")` 验证穿越被拒(400)
|
|
108
|
-
|
|
109
|
-
## Direct Sessions 数据来源
|
|
110
|
-
|
|
111
|
-
- 会话目录:`getDirectSessionsDir(config)` → `<runtime>/.patchwarden/direct-sessions/`
|
|
112
|
-
- 每个会话子目录读取:`session.json`、`summary.json`、`audit.json`、`summary.md`、`diff.patch`、`audit.md`、`changed-files.json`
|
|
113
|
-
- `DirectSessionSummary` 字段:`session_id`、`repo_path`、`resolved_repo_path`、`created_at`、`expires_at`、`finalized`、`finalized_at`、`audited`、`changed_files_total`、`verification_summary`、`audit_decision`、`audit_checked_at`、`title`
|
|
114
|
-
- 目录不存在时返回 `{ sessions: [], total: 0, reason: null }`,**不返回 500**
|
|
115
|
-
- 会话按 `created_at` 降序排列
|
|
116
|
-
|
|
117
|
-
## 日志脱敏
|
|
118
|
-
|
|
119
|
-
- 所有 `/api/logs/:category` 响应均经 `redactSensitiveContent` 脱敏
|
|
120
|
-
- tail 行数限制在 `ALLOWED_LOG_TAILS = {100, 300, 1000}`,非法值回退到 100
|
|
121
|
-
- 日志文件缺失时返回 `{ stdout: "", stderr: "", reason: "log file not found" }`
|
|
122
|
-
|
|
123
|
-
## 冒烟测试
|
|
124
|
-
|
|
125
|
-
`scripts/checks/control-center-smoke.js` 在原 10 项基础上新增 5 项(共 16 项):
|
|
126
|
-
|
|
127
|
-
| # | 测试 |
|
|
128
|
-
| --- | --- |
|
|
129
|
-
| 11 | `GET /api/tasks/stale` 返回有效 JSON(`stale_tasks` 数组、`total` 数字、`stale_threshold_seconds` 数字) |
|
|
130
|
-
| 12 | `GET /api/workspace/<traversal>/status` 被拒绝(400,error 含 "traversal") |
|
|
131
|
-
| 13 | `POST /api/tasks/:taskId/reconcile` 无 token → 403 |
|
|
132
|
-
| 14 | `GET /api/direct-sessions` 目录缺失时返回空列表(200,非 500) |
|
|
133
|
-
| 15 | `GET /api/logs/core?tail=300` 响应包含 `tail: 300` |
|
|
134
|
-
|
|
135
|
-
## 测试结果
|
|
136
|
-
|
|
137
|
-
```
|
|
138
|
-
npm.cmd run build # tsc 编译通过
|
|
139
|
-
node scripts/checks/control-center-smoke.js
|
|
140
|
-
# Summary: 16 passed, 0 failed
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
全量 `npm test` 链路(security 139 + unit 136 + lifecycle 22 + control-center 16)
|
|
144
|
-
全部通过,0 失败。
|
|
145
|
-
|
|
146
|
-
> 注:在 TRAE IDE 沙盒内运行 `npm test` 时,control-center-smoke spawn 的子进程退出
|
|
147
|
-
> 后 Windows 会尝试更新 jump list 临时文件,被沙盒拒绝并打印
|
|
148
|
-
> "TRAE Sandbox Error: hit restricted …CustomDestinations…"。该错误与测试逻辑无关,
|
|
149
|
-
> 所有测试用例均报告 PASS。直接运行 `node scripts/checks/control-center-smoke.js` 退出码为 0。
|
|
150
|
-
|
|
151
|
-
## 已知限制
|
|
152
|
-
|
|
153
|
-
- `/api/workspace/:repo/status` 仅运行 `git status --short`,不返回 diff 或 stash 信息
|
|
154
|
-
- reconcile 不会清理任务文件,需人工后续处理或由 watcher 在下个周期自然覆盖
|
|
155
|
-
- `/api/tasks/:taskId/audit` 仅在任务处于终态(done/failed/failed_verification/
|
|
156
|
-
failed_scope_violation/failed_policy_violation/canceled/timeout)时才执行,否则返回 409
|
|
157
|
-
- Direct Sessions 页面只读,不提供 finalize 或 audit 触发入口(这些操作仍需通过 MCP 工具完成)
|
|
158
|
-
- Logs 页面的自动刷新间隔固定为 5 秒,不读取 watcher 实时事件
|
|
159
|
-
- task-detail 的「Open task folder」按钮通过 `explorer.exe` / `open` / `xdg-open` 打开,需要本地图形环境
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
# PatchWarden Execution Plan 2026-07-09
|
|
2
|
-
|
|
3
|
-
> Created: 2026-07-09
|
|
4
|
-
> Base document: `docs/roadmap-execution-and-acceptance.md`
|
|
5
|
-
> Scope: 基于 2026-07-09 实地核验后的细化执行计划,覆盖 P0–P3 全阶段。
|
|
6
|
-
> Codex 负责实现与门禁验证;用户负责 credentialed / external-write 操作(push、merge、release、publish)。
|
|
7
|
-
|
|
8
|
-
## 0. 当前真实状态核验(对 roadmap 文档的修正)
|
|
9
|
-
|
|
10
|
-
| 项目 | roadmap 假设 | 2026-07-09 实地核验 | 影响 |
|
|
11
|
-
| --- | --- | --- | --- |
|
|
12
|
-
| 分支 | `codex/patchwarden-v1.5.0` | 一致 | — |
|
|
13
|
-
| HEAD | `cc27e6a Add OSS application evidence materials` | 一致 | — |
|
|
14
|
-
| 工作区 | dirty,preserve user changes | 34 个 M + 5 个 ??,含 `package.json`、`version.ts`、`src/tools/*`、`ui/pages/*`、4 个新增 docs | P0 前必须逐文件核对并提交 |
|
|
15
|
-
| 本地源码版本 | 1.5.1 | `package.json` = 1.5.1,CHANGELOG v1.5.1 主题为 Dashboard UI 优化 | 一致 |
|
|
16
|
-
| GitHub Release / npm | 仍为 v1.5.0 | 未重新核验(roadmap 已记录) | P0 任务成立 |
|
|
17
|
-
| Evidence Pack 现状 | 仅 `evidence.json` + `EVIDENCE.md` | `src/tools/evidencePack.ts` 确认只写这两个文件 | P1 v2 差距成立 |
|
|
18
|
-
| 已有 docs | 部分缺失 | `lineage-evidence-pack-workflow.md`、`threat-model.md` 已存在(未跟踪);缺 `why-patchwarden.md`、`evidence-pack-schema.md`、`spec-kit-integration.md`、`agentseal-integration.md`、`mcp-inspector-testing.md`、`opencode-worker.md`、`openhands-worker.md` | P1 docs 任务成立 |
|
|
19
|
-
|
|
20
|
-
**关键修正**:roadmap P0 假设"本地源码已就绪,只需发布"。实地发现工作区有大量未提交修改(看起来是 v1.5.1 Dashboard UI 优化的实现)。因此新增 **P0-0 前置步骤:逐文件核对并提交工作区修改**。
|
|
21
|
-
|
|
22
|
-
## 1. 用户决策记录(2026-07-09)
|
|
23
|
-
|
|
24
|
-
1. 工作区 34 个 M + 5 个 ?? 文件:**逐文件核对**后决定纳入范围。
|
|
25
|
-
2. P0 发布的 credentialed / external-write 操作(push、merge、release、publish):**用户手动执行**。Codex 只负责本地门禁与分支准备。
|
|
26
|
-
3. 本计划:**写入 docs 文件存档**,便于后续按阶段跟踪。
|
|
27
|
-
|
|
28
|
-
## 2. P0:v1.5.1 可信发布
|
|
29
|
-
|
|
30
|
-
### P0-0 前置:逐文件核对并提交工作区修改(新增)
|
|
31
|
-
|
|
32
|
-
#### 核对结果(2026-07-09 完成)
|
|
33
|
-
|
|
34
|
-
实际工作区:**41 个 M + 9 个 ??**(非最初预估的 34+5)。
|
|
35
|
-
|
|
36
|
-
**版本号一致性**:`package.json` / `version.ts` / `CHANGELOG.md` 三处均为 1.5.1 ✅;`README.md` 第 11 行 / `README.en.md` 第 11 行仍为 v1.5.0 ❌(发布前必修)。
|
|
37
|
-
|
|
38
|
-
**分类汇总**:
|
|
39
|
-
|
|
40
|
-
| 分类 | 文件数 | 判定 |
|
|
41
|
-
| --- | --- | --- |
|
|
42
|
-
| Dashboard UI 优化本体 | 9 M + 4 ?? | 属于 v1.5.1 |
|
|
43
|
-
| async 重构链(sync→async) | 16 M | **隐性依赖**:controlCenter.ts v1.5.1 端点 `await safeFinalizeDirectSession(...)` 依赖此链,技术上不可简单拆分 |
|
|
44
|
-
| 并发任务执行特性(maxConcurrentTasks) | 8 M | 独立新特性,CHANGELOG 未提及,可拆为下一版本 |
|
|
45
|
-
| 安全加固 / Bug 修复 | 4 M | 独立,建议纳入(含二进制检测窗口 8KB→1MB、Windows fs.rmSync 修复) |
|
|
46
|
-
| 用户本地配置(AGENTS.md Codex Memory) | 1 M | 含本机绝对路径 `D:\ai_agent\CodexMemory`,不应入库 |
|
|
47
|
-
| IDE 状态 / 发布产物 | 3 ?? | `.trae/`、`patchwarden-v1.1.0-SHA256SUMS.txt`、`patchwarden-v1.5.0-SHA256SUMS.txt` → 加入 `.gitignore` |
|
|
48
|
-
| 规划文档 | 2 ?? | `docs/roadmap-execution-and-acceptance.md`、`docs/execution-plan-2026-07-09.md` → 是否入库由用户决定 |
|
|
49
|
-
|
|
50
|
-
**Dashboard UI 本体(9 M)**:`CHANGELOG.md`、`package.json`、`version.ts`、`scripts/checks/control-center-smoke.js`、`ui/pages/audit.html`、`ui/pages/dashboard.html`、`ui/pages/direct-sessions.html`、`ui/pages/task-detail.html`、`ui/pages/tasks.html`
|
|
51
|
-
|
|
52
|
-
**Dashboard docs(4 ??)**:`docs/dashboard-overview.md`、`docs/direct-session-workflow.md`、`docs/lineage-evidence-pack-workflow.md`、`docs/task-safe-review-workflow.md`(均被 README 新章节链接引用)
|
|
53
|
-
|
|
54
|
-
**async 重构链(16 M)**:`changeCapture.ts`、`runTask.ts`、`agentAssessor.ts`、`assessmentStore.ts`、`confirmCli.ts`、`createTask.ts`、`createDirectSession.ts`、`finalizeDirectSession.ts`、`goalSubgoalTask.ts`、`retryTask.ts`、`safeViews.ts`、`registry.ts`、`runTaskLoop.ts`、`smoke-test.ts`、`scripts/checks/lifecycle-smoke.js`、`src/test/unit/goal-subgoal-task.test.ts`
|
|
55
|
-
|
|
56
|
-
**并发任务执行特性(8 M)**:`config.ts`(新增 maxConcurrentTasks)、`watch.ts`(跨进程 lockfile + 并发执行 + executed-tasks.json)、6 个 unit test(command-guard / diagnose-task / reconcile-tasks / safe-status / sync-file / watcher-status,各加 1 行满足新必填字段)
|
|
57
|
-
|
|
58
|
-
**安全加固(4 M)**:`directGuards.ts`、`postTaskCleanup.ts`、`direct-guards.test.ts`、`path-guard.test.ts`
|
|
59
|
-
|
|
60
|
-
#### 关键风险
|
|
61
|
-
|
|
62
|
-
1. **async 重构是 v1.5.1 隐性依赖**:controlCenter.ts 的 v1.5.1 端点调用 async 函数,若排除 async 链则需回退这些端点,否则编译/运行断裂。
|
|
63
|
-
2. **README 版本号漏改**:第 11 行必须从 v1.5.0 改为 v1.5.1。
|
|
64
|
-
3. **AGENTS.md 含本机绝对路径**:`D:\ai_agent\CodexMemory` 不应入库。
|
|
65
|
-
4. **.gitignore 需扩充**:新增 `.trae/` 与 `patchwarden-v*-SHA256SUMS.txt` 通配规则。
|
|
66
|
-
|
|
67
|
-
#### 范围决策(待用户确定)
|
|
68
|
-
|
|
69
|
-
- 方案 A(推荐):v1.5.1 = Dashboard UI(9) + async 重构链(16) + 安全加固(4) + 4 docs + 版本号修正;并发特性(8) 拆为 v1.5.2/v1.6.0;CHANGELOG 补 async 与安全修复说明。
|
|
70
|
-
- 方案 B:回退 controlCenter.ts 中依赖 async 的端点,只发纯 Dashboard UI。
|
|
71
|
-
- 方案 C:全部纳入(含并发特性),CHANGELOG 补全说明。
|
|
72
|
-
|
|
73
|
-
### P0-1 本地全套门禁
|
|
74
|
-
|
|
75
|
-
```powershell
|
|
76
|
-
npm.cmd ci
|
|
77
|
-
npm.cmd run build
|
|
78
|
-
npm.cmd run test:unit
|
|
79
|
-
npm.cmd run test:mcp
|
|
80
|
-
npm.cmd run test:http-mcp
|
|
81
|
-
npm.cmd run doctor:ci
|
|
82
|
-
npm.cmd run verify:package
|
|
83
|
-
npm.cmd test
|
|
84
|
-
npm.cmd run pack:clean
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### P0-2 提交并推送(用户执行 push)
|
|
88
|
-
|
|
89
|
-
- 提交工作区修改到 `codex/patchwarden-v1.5.0`(或新建 `codex/patchwarden-v1.5.1`)
|
|
90
|
-
- 若 PR #24 落后 main:`git fetch origin main` + `git rebase origin/main`
|
|
91
|
-
- git credential 出错时修复 credential/proxy,**禁止 force-push 或 reset 绕过**
|
|
92
|
-
|
|
93
|
-
### P0-3 PR #24 推进(用户执行 merge)
|
|
94
|
-
|
|
95
|
-
- 标记 ready for review(仅本地门禁全绿后)
|
|
96
|
-
- 监控 GitHub Actions
|
|
97
|
-
- checks 绿时通过 PR 合并
|
|
98
|
-
|
|
99
|
-
### P0-4 发布(用户执行 release + publish)
|
|
100
|
-
|
|
101
|
-
- 创建 `v1.5.1` tag + GitHub Release(非 draft)
|
|
102
|
-
- 确认 npm auth 后发布(不暴露 token)
|
|
103
|
-
|
|
104
|
-
### P0 验收
|
|
105
|
-
|
|
106
|
-
```powershell
|
|
107
|
-
gh pr view 24 --repo jiezeng2004-design/PatchWarden --json state,mergeStateStatus,statusCheckRollup
|
|
108
|
-
gh release view v1.5.1 --repo jiezeng2004-design/PatchWarden --json tagName,name,isDraft,isPrerelease,publishedAt,url
|
|
109
|
-
npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
通过标准:PR 已合并 · Release `v1.5.1` 存在且非 draft · npm `version=1.5.1` · `dist-tags.latest=1.5.1` · 发布说明不夸大未验证内容。
|
|
113
|
-
|
|
114
|
-
### P0 风险
|
|
115
|
-
|
|
116
|
-
- 工作区修改可能混入非 v1.5.1 内容 → P0-0 逐文件核对
|
|
117
|
-
- README 第 11 行版本号待更新
|
|
118
|
-
- npm publish 需用户 credentialed 操作
|
|
119
|
-
|
|
120
|
-
## 3. P1-A:Evidence Pack v2
|
|
121
|
-
|
|
122
|
-
### 目标
|
|
123
|
-
|
|
124
|
-
把 Evidence Pack 从 2 文件升级为有界多文件结构,成为项目招牌能力。
|
|
125
|
-
|
|
126
|
-
### 当前差距
|
|
127
|
-
|
|
128
|
-
`src/tools/evidencePack.ts` 当前只写:
|
|
129
|
-
|
|
130
|
-
- `.patchwarden/evidence-packs/<lineage_id>/evidence.json`
|
|
131
|
-
- `.patchwarden/evidence-packs/<lineage_id>/EVIDENCE.md`
|
|
132
|
-
|
|
133
|
-
### v2 目标文件结构
|
|
134
|
-
|
|
135
|
-
| 文件 | 内容 |
|
|
136
|
-
| --- | --- |
|
|
137
|
-
| `risk.json` | 风险项与严重度 |
|
|
138
|
-
| `verify.json` | 每条验证命令的结构化记录 |
|
|
139
|
-
| `diffstat.json` | 文件级增删统计(非完整 diff) |
|
|
140
|
-
| `lineage.json` | lineage 有界摘要 |
|
|
141
|
-
| `attestation.json` | 版本/commit/Node/OS/tool profile/schema epoch |
|
|
142
|
-
| `redactions.json` | 脱敏类别与原因(**不存原始隐藏值**) |
|
|
143
|
-
|
|
144
|
-
### 执行步骤
|
|
145
|
-
|
|
146
|
-
1. 扩展 `SafeEvidencePack` 接口,新增 v2 文件字段
|
|
147
|
-
2. 在 `exportTaskEvidencePack` 中按文件逐个写入,保持有界
|
|
148
|
-
3. 更新 `src/tools/taskLineage.ts`、`src/tools/registry.ts`、`src/tools/toolRegistry.ts` 工具清单
|
|
149
|
-
4. 更新 `src/test/unit/evidence-pack.test.ts` 覆盖 v2 文件
|
|
150
|
-
5. 新增 `docs/evidence-pack-schema.md`(schema 参考)
|
|
151
|
-
6. 更新 `docs/lineage-evidence-pack-workflow.md` 补 v2 文件说明
|
|
152
|
-
|
|
153
|
-
### 实现红线
|
|
154
|
-
|
|
155
|
-
- 不含完整 stdout/stderr/diff/secrets/.env/token/cookie/凭据路径
|
|
156
|
-
- redactions 只存类别+原因,不存原值
|
|
157
|
-
- attestation 含 PatchWarden version、commit、package version、Node version、OS、tool profile、schema epoch
|
|
158
|
-
- `.patchwarden/evidence-packs/` 不得进入 npm 包(`package.json` 已排除 `.patchwarden/`)
|
|
159
|
-
|
|
160
|
-
### P1-A 验收
|
|
161
|
-
|
|
162
|
-
```powershell
|
|
163
|
-
npm.cmd run build
|
|
164
|
-
npm.cmd run test:unit
|
|
165
|
-
npm.cmd run doctor:ci
|
|
166
|
-
npm.cmd run verify:package
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
手动验收:跑一次 `run_task_loop` → `export_task_evidence_pack` → 确认 6 个 v2 文件存在 · `EVIDENCE.md` 可读有界 · `redactions.json` 无原始密钥 · npm 包不含 evidence-packs 输出。
|
|
170
|
-
|
|
171
|
-
## 4. P1-B:README 与公开文档就绪
|
|
172
|
-
|
|
173
|
-
### 目标
|
|
174
|
-
|
|
175
|
-
在外部 PR 引流前,让仓库对外部用户可读。
|
|
176
|
-
|
|
177
|
-
### 待补文档
|
|
178
|
-
|
|
179
|
-
| 文档 | 状态 | 说明 |
|
|
180
|
-
| --- | --- | --- |
|
|
181
|
-
| `docs/why-patchwarden.md` | 新建 | 定位与动机 |
|
|
182
|
-
| `docs/evidence-pack-schema.md` | 新建(与 P1-A 同步) | v2 schema 参考 |
|
|
183
|
-
| `docs/spec-kit-integration.md` | 新建 | Spec Kit 集成 |
|
|
184
|
-
| `docs/agentseal-integration.md` | 新建 | AgentSeal 集成 |
|
|
185
|
-
| `docs/mcp-inspector-testing.md` | 新建 | MCP Inspector 测试 |
|
|
186
|
-
| `docs/opencode-worker.md` | 新建 | OpenCode worker |
|
|
187
|
-
| `docs/openhands-worker.md` | 新建 | OpenHands worker |
|
|
188
|
-
| `docs/threat-model.md` | 已存在,更新 | 不重复创建 |
|
|
189
|
-
|
|
190
|
-
### README 前页需保留的 8 个章节
|
|
191
|
-
|
|
192
|
-
1. 一句定位
|
|
193
|
-
2. 架构图
|
|
194
|
-
3. 为何不是远程 shell
|
|
195
|
-
4. 五分钟 demo
|
|
196
|
-
5. Evidence Pack 样本
|
|
197
|
-
6. 支持的 agent
|
|
198
|
-
7. 安全边界
|
|
199
|
-
8. 生态适配
|
|
200
|
-
|
|
201
|
-
### P1-B 验收
|
|
202
|
-
|
|
203
|
-
```powershell
|
|
204
|
-
npm.cmd run build
|
|
205
|
-
npm.cmd run check:brand
|
|
206
|
-
npm.cmd run doctor:ci
|
|
207
|
-
npm.cmd run verify:package
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
通过标准:README 在 npm/GitHub 确认前不声称 v1.5.1 已发布 · 安全边界在外部集成之前讲解 · 示例用占位版本号除非有发布真相。
|
|
211
|
-
|
|
212
|
-
## 5. P2:外部 PR 批次 1(按风险递增顺序)
|
|
213
|
-
|
|
214
|
-
### P2-1 MCP Inspector(最先,最低风险)
|
|
215
|
-
|
|
216
|
-
- PR 形态:`docs: add CLI smoke testing example for MCP servers`
|
|
217
|
-
- 通用优先,PatchWarden 仅作示例之一
|
|
218
|
-
- 流程:clone inspector → 建 `docs/cli-smoke-testing-example` → 查上游贡献规则 → 仅改 docs → 跑上游 docs/lint/test → 推 fork 分支 → 开 PR → 监控 CI
|
|
219
|
-
- 验收:上游检查通过 · 无营销措辞 · 不依赖 PatchWarden 也能成立
|
|
220
|
-
|
|
221
|
-
### P2-2 AgentSeal(第二)
|
|
222
|
-
|
|
223
|
-
- PR 形态:`feat: detect PatchWarden MCP configs and project policies` 或 `docs: add guarded local agent execution pattern`
|
|
224
|
-
- 流程:clone agentseal → 建 `detect/patchwarden-policy` → 查 CONTRIBUTING + 现有 probes/tests → 选 code 或 docs 范围
|
|
225
|
-
- 验收:detector 识别 `.patchwarden/config.json` 和 `project-policy.json` 但不读密钥 · 正负 fixture 测试 · 描述通用安全模式非营销
|
|
226
|
-
|
|
227
|
-
### P2-3 PatchWarden 兼容文档(第三)
|
|
228
|
-
|
|
229
|
-
- 新增 `docs/mcp-inspector-testing.md`、`docs/agentseal-integration.md`
|
|
230
|
-
- 验收:Windows PowerShell 可运行 · 文档链接到真实上游 PR/issue
|
|
231
|
-
|
|
232
|
-
## 6. P2:外部 PR 批次 2
|
|
233
|
-
|
|
234
|
-
### Spec Kit(在 Evidence Pack v2 之后)
|
|
235
|
-
|
|
236
|
-
- 前置依赖:**P1-A 完成**(需要稳定 evidence schema)
|
|
237
|
-
- PR 形态:`docs: add evidence pack pattern for spec-driven development` 或 `walkthrough: verify implemented tasks with an external MCP safety layer`
|
|
238
|
-
- 流程:clone spec-kit → 建 `docs/evidence-verification-pattern`
|
|
239
|
-
- 验收:PR 映射 spec→tasks→implementation→evidence verification · PatchWarden 仅作示例实现 · 上游 docs 检查通过
|
|
240
|
-
|
|
241
|
-
## 7. P3:外部 PR 批次 3(最后,需已发布 evidence 可引用)
|
|
242
|
-
|
|
243
|
-
### OpenCode / OpenHands / Aider
|
|
244
|
-
|
|
245
|
-
- **OpenCode**:流量大、repo 大,先 docs-only external supervisor pattern
|
|
246
|
-
- **OpenHands**:源码归属在迁移,先查当前 repo 结构再选目标
|
|
247
|
-
- **Aider**:成熟 CLI,safe wrapper pattern 有用但应在 PatchWarden 有发布示例之后
|
|
248
|
-
- 每个 PR 验收:查上游贡献规则 · 不依赖 PatchWarden 也能用 · CI 或文档化本地检查通过 · PatchWarden README 仅在 PR 存在后回链
|
|
249
|
-
|
|
250
|
-
## 8. Issue Backlog(P0 发布真相干净后创建)
|
|
251
|
-
|
|
252
|
-
1. `fix: close v1.5.1 release truth gap`
|
|
253
|
-
2. `feat: add Evidence Pack v2 artifact schema`
|
|
254
|
-
3. `docs: add Evidence Pack v2 schema reference`
|
|
255
|
-
4. `feat: export goal final report`
|
|
256
|
-
5. `feat: import Spec Kit tasks into Goal Session`
|
|
257
|
-
6. `docs: add MCP Inspector CLI smoke testing guide`
|
|
258
|
-
7. `docs: add AgentSeal compatibility guide`
|
|
259
|
-
8. `docs: add OpenCode worker integration guide`
|
|
260
|
-
9. `docs: add OpenHands worker integration guide`
|
|
261
|
-
10. `docs: add external PR roadmap and ecosystem compatibility matrix`
|
|
262
|
-
|
|
263
|
-
## 9. 全局验收规则
|
|
264
|
-
|
|
265
|
-
### 每个内部 PatchWarden PR
|
|
266
|
-
|
|
267
|
-
```powershell
|
|
268
|
-
npm.cmd run build
|
|
269
|
-
npm.cmd run test:unit
|
|
270
|
-
npm.cmd run test:mcp
|
|
271
|
-
npm.cmd run test:http-mcp
|
|
272
|
-
npm.cmd run doctor:ci
|
|
273
|
-
npm.cmd run verify:package
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### 发布前追加
|
|
277
|
-
|
|
278
|
-
```powershell
|
|
279
|
-
npm.cmd ci
|
|
280
|
-
npm.cmd test
|
|
281
|
-
npm.cmd run pack:clean
|
|
282
|
-
gh pr checks <PR_NUMBER> --repo jiezeng2004-design/PatchWarden --watch
|
|
283
|
-
gh release view v<version> --repo jiezeng2004-design/PatchWarden --json tagName,isDraft,publishedAt,url
|
|
284
|
-
npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
**铁律**:GitHub Release 与 npm registry 真相都匹配目标版本前,绝不标记发布完成。
|
|
288
|
-
|
|
289
|
-
## 10. 执行顺序与依赖
|
|
290
|
-
|
|
291
|
-
```
|
|
292
|
-
P0-0 逐文件核对 → P0-1 门禁 → P0-2 提交推送(用户) → P0-3 PR(用户) → P0-4 发布(用户)
|
|
293
|
-
│
|
|
294
|
-
v
|
|
295
|
-
P1-A Evidence Pack v2
|
|
296
|
-
│
|
|
297
|
-
P1-B docs ───┤
|
|
298
|
-
v
|
|
299
|
-
P2-1 Inspector → P2-2 AgentSeal → P2-3 兼容文档
|
|
300
|
-
│
|
|
301
|
-
v
|
|
302
|
-
P2 Spec Kit (依赖 P1-A)
|
|
303
|
-
│
|
|
304
|
-
v
|
|
305
|
-
P3 OpenCode / OpenHands / Aider
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
## 11. 安全边界(贯穿全阶段)
|
|
309
|
-
|
|
310
|
-
- 不暴露通用远程 shell,不弱化精确命令匹配
|
|
311
|
-
- 所有 repo 路径在 `workspaceRoot` 内,阻止敏感名与越界改动
|
|
312
|
-
- 不读取或持久化 token/cookie/浏览器状态/.env/SSH 密钥/凭据文件
|
|
313
|
-
- 不 blanket-kill watcher/tunnel,仅监督 launcher 拥有的进程
|
|
314
|
-
- live tunnel/watcher 切换与本地代码验证分开,不重启 live 服务除非显式要求
|
|
315
|
-
- 保留结构化任务证据、心跳状态、前后 Git 快照、变更文件记录与脱敏
|
package/docs/release-v0.6.0.md
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# PatchWarden v0.6.0
|
|
2
|
-
|
|
3
|
-
PatchWarden v0.6.0 在保持 `chatgpt_core` 固定 16 工具兼容的同时,加入默认关闭的
|
|
4
|
-
`chatgpt_direct` 安全直接开发模式、本地 assess → confirm → execute 闭环,以及更可靠的
|
|
5
|
-
Windows Core/Direct 双通道运行管理。
|
|
6
|
-
|
|
7
|
-
## 主要更新
|
|
8
|
-
|
|
9
|
-
### ChatGPT Core 安全体验
|
|
10
|
-
|
|
11
|
-
- `assess_only` 返回最小化的结构化 `next_tool_call`;execute 只需
|
|
12
|
-
`execution_mode` 和完整 `assessment_id`,不再重复传输目标、计划和仓库参数。
|
|
13
|
-
- 中风险票据通过本地 `patchwarden-confirm <full_assessment_id>` 确认。该入口不是 MCP
|
|
14
|
-
工具,远程调用者不能自行放行。
|
|
15
|
-
- 确认和执行会重新校验票据时效、工作区、计划、策略和工具 Manifest。
|
|
16
|
-
- `audit_task` 将已确认失败、可能误报和人工核查项分开呈现。
|
|
17
|
-
- `get_task_summary(view: "compact")` 和终态 `wait_for_task` 返回有界验收证据,避免长任务
|
|
18
|
-
结果淹没客户端上下文。
|
|
19
|
-
|
|
20
|
-
### ChatGPT Direct 模式
|
|
21
|
-
|
|
22
|
-
- 默认关闭;启用需设置 `enableDirectProfile: true` 并使用 `chatgpt_direct` Profile。
|
|
23
|
-
- 固定 9 工具:健康检查、工作区列表、会话创建、搜索、文件读取、JSON 补丁、白名单
|
|
24
|
-
验证、会话完成和独立审计。
|
|
25
|
-
- 所有写操作绑定 Direct session 和内容哈希;不支持任意 shell、删除/重命名、Git 推送、
|
|
26
|
-
npm 发布或远程部署。
|
|
27
|
-
|
|
28
|
-
### Windows Core/Direct 控制与可观测性
|
|
29
|
-
|
|
30
|
-
- 根目录统一使用 `PatchWarden.cmd`,支持 Core、Direct 或两者的
|
|
31
|
-
`start`、`stop`、`restart`、`status`、`health` 和受限 `kill`。
|
|
32
|
-
- Core 和 Direct 分别使用 `127.0.0.1:8080` 与 `127.0.0.1:8081`,并自动校正各自
|
|
33
|
-
tunnel profile 的 health 地址。
|
|
34
|
-
- supervisor 将 stdout/stderr 写入各自 runtime 目录;非零退出时显示 stderr 最后 30 行,
|
|
35
|
-
并把退出码、脱敏 tail 和日志路径写入 `tunnel-status.json`。
|
|
36
|
-
- 修复 Core watcher 的 `XDG_CONFIG_HOME` 泄漏到 tunnel-client,导致 Core 错误读取
|
|
37
|
-
`%LOCALAPPDATA%\patchwarden\opencode-config\tunnel-client\patchwarden.yaml` 并反复退出的问题。
|
|
38
|
-
- `stop` / `restart` 可清理 Profile 精确匹配的遗留 tunnel-client;无关端口占用只报告、不误杀。
|
|
39
|
-
- `status` 支持 health endpoint fallback,陈旧 JSON 不再把实际 ready 的实例误报为 stopped。
|
|
40
|
-
- 旧的单用途入口迁入 `scripts/launchers/`;个人 `.local/launchers/`、运行时配置、凭据和日志
|
|
41
|
-
不进入 Git、npm 包或 GitHub 发布资产。
|
|
42
|
-
|
|
43
|
-
## 兼容性
|
|
44
|
-
|
|
45
|
-
- `chatgpt_core` 仍为固定 16 工具;`chatgpt_direct` 为固定 9 工具。
|
|
46
|
-
- schema epoch 为 `2026-06-22-v6`。
|
|
47
|
-
- `assess_only`、`execute`、`assessment_id`、`plan_ref` 和既有任务记录保持兼容。
|
|
48
|
-
- npm 包名保持 `patchwarden`;旧的 `safe-bifrost` 包继续冻结在 v0.3.0。
|
|
49
|
-
|
|
50
|
-
## 验证
|
|
51
|
-
|
|
52
|
-
发布候选通过以下门禁:
|
|
53
|
-
|
|
54
|
-
```powershell
|
|
55
|
-
npm.cmd run build
|
|
56
|
-
npm.cmd test
|
|
57
|
-
npm.cmd run check:tool-manifest
|
|
58
|
-
npm.cmd run check:direct-tool-manifest
|
|
59
|
-
npm.cmd run test:mcp
|
|
60
|
-
npm.cmd run test:http-mcp
|
|
61
|
-
npm.cmd run doctor:ci
|
|
62
|
-
npm.cmd run pack:clean
|
|
63
|
-
npm.cmd run verify:package
|
|
64
|
-
git diff --check
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
本机双通道验收确认 Core 16 工具和 Direct 9 工具均为 `running`、`ready=true`,8080/8081
|
|
68
|
-
由对应 `tunnel-client.exe` 监听,两个 `/readyz` 均返回 `ready`。
|
|
69
|
-
|
|
70
|
-
GitHub Release 与 npm Registry 是独立发布面。创建 Tag/Release 不会自动发布 npm;npm 发布后
|
|
71
|
-
仍需单独核对 `patchwarden@latest`、版本时间、dist-tag 和包完整性。
|
package/docs/release-v0.6.1.md
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
# PatchWarden v0.6.1 Release Notes
|
|
2
|
-
|
|
3
|
-
**Release Date**: 2026-06-25
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
PatchWarden v0.6.1 is a stability and observability release. It addresses watcher heartbeat false positives, adds Chinese path reliability, introduces two new tools (`safe_status` and `sync_file`), and adds comprehensive security guard unit tests.
|
|
8
|
-
|
|
9
|
-
## New Features
|
|
10
|
-
|
|
11
|
-
### safe_status Tool
|
|
12
|
-
|
|
13
|
-
A minimal task lifecycle status tool that returns task state without exposing diff, log content, or file contents. Useful when upper-layer security policies block content-bearing tools.
|
|
14
|
-
|
|
15
|
-
```json
|
|
16
|
-
{
|
|
17
|
-
"task_id": "task-001",
|
|
18
|
-
"status": "running",
|
|
19
|
-
"phase": "executing_agent",
|
|
20
|
-
"last_heartbeat_at": "2026-06-24T10:00:12Z",
|
|
21
|
-
"current_command": "codex exec",
|
|
22
|
-
"watcher_state": "healthy"
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### sync_file Tool
|
|
27
|
-
|
|
28
|
-
Copy a file from source to target within a Direct session repo. Both paths must be inside the session's `repo_path`. Supports optional sha256 verification for both source and target.
|
|
29
|
-
|
|
30
|
-
### Android Build Doctor
|
|
31
|
-
|
|
32
|
-
When a managed project contains an `android_app` directory, the health check now includes Android build environment diagnostics: Java version, JAVA_HOME, ANDROID_HOME, SDK platform, build-tools, Gradle wrapper, and APK output path.
|
|
33
|
-
|
|
34
|
-
## Bug Fixes
|
|
35
|
-
|
|
36
|
-
- **Watcher stale false positive**: Long-running tasks no longer cause the watcher to be incorrectly reported as stale. The watcher status now falls back to checking running task heartbeats.
|
|
37
|
-
- **Chinese path encoding**: All file I/O operations verified to use UTF-8 encoding. Health check now reports `path_encoding` status.
|
|
38
|
-
- **Tracked external dirty detection**: `captureRepoSnapshot` now correctly identifies tracked-but-modified external files via `dirty_paths` field parsed from `git status --porcelain`. The regex now includes `R` (rename) status, fixing dead code that previously never executed for renamed files.
|
|
39
|
-
- **Release zip path separators**: The packaging script (`pack-clean.js`) now creates zip archives with POSIX `/` path separators instead of Windows backslashes. Linux `unzip` no longer reports `warning: appears to use backslashes as path separators`.
|
|
40
|
-
|
|
41
|
-
## Security
|
|
42
|
-
|
|
43
|
-
- 136 unit tests covering all security guards (path guard, sensitive guard, command guard, direct guards)
|
|
44
|
-
- Tests use Node's built-in `node:test` — zero new dependencies
|
|
45
|
-
|
|
46
|
-
## Observability
|
|
47
|
-
|
|
48
|
-
- Structured JSON logging to stderr (never stdout, to avoid polluting MCP JSON-RPC)
|
|
49
|
-
- Tool call audit logs with duration tracking
|
|
50
|
-
- Global `unhandledRejection` and `uncaughtException` handlers
|
|
51
|
-
|
|
52
|
-
## Tool Profile Changes
|
|
53
|
-
|
|
54
|
-
| Profile | v0.6.0 | v0.6.1 |
|
|
55
|
-
|---------|--------|--------|
|
|
56
|
-
| full | 28 | 30 |
|
|
57
|
-
| chatgpt_core | 16 | 17 |
|
|
58
|
-
| chatgpt_direct | 9 | 10 |
|
|
59
|
-
|
|
60
|
-
## Migration
|
|
61
|
-
|
|
62
|
-
No breaking changes. All new fields are optional. New tools are additive and do not affect existing tools.
|
|
63
|
-
|
|
64
|
-
## Verification
|
|
65
|
-
|
|
66
|
-
- TypeScript compilation: PASS
|
|
67
|
-
- Unit tests: 136 pass, 0 fail, 1 skipped (Windows symlink)
|
|
68
|
-
- Smoke tests: 139 pass, 0 fail
|
|
69
|
-
- Lifecycle tests: 22 pass, 0 fail (includes tracked external file rename regression test)
|
|
70
|
-
- Doctor CI: PASS (81 OK, 0 WARN, 0 FAIL on the release check host)
|
|
71
|
-
- Tool manifest check: PASS
|
|
72
|
-
- Package manifest check: PASS (260 files)
|
|
73
|
-
- Brand check: PASS (128 tracked files)
|
|
74
|
-
- MCP HTTP tests: 13 pass, 0 fail
|
|
75
|
-
- Release zip: POSIX path separators verified (261 entries, no backslashes)
|
package/docs/release-v0.6.4.md
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# PatchWarden v0.6.4 Release Notes
|
|
2
|
-
|
|
3
|
-
**Release Date**: 2026-06-26
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
PatchWarden v0.6.4 is a desktop experience release. It keeps the existing CLI and script surface, but makes the normal Windows workflow feel like a lightweight local application: start one desktop entry, control Core/Direct from the tray or Web dashboard, and shut everything down from one stop command.
|
|
8
|
-
|
|
9
|
-
## Desktop Entry
|
|
10
|
-
|
|
11
|
-
- Added `PatchWarden-Desktop.cmd` as the recommended daily entry point.
|
|
12
|
-
- The desktop entry starts the tray in a hidden PowerShell host and ensures the local Control Center is available.
|
|
13
|
-
- It does not automatically open a browser window. Use **Open Dashboard** from the tray or `PatchWarden-Control.cmd` when you want the full Web console.
|
|
14
|
-
- `PatchWarden-Control-Tray.cmd --foreground` remains available for tray debugging.
|
|
15
|
-
|
|
16
|
-
## Tray Improvements
|
|
17
|
-
|
|
18
|
-
- Added single-instance protection for the tray process.
|
|
19
|
-
- Replaced the generic system icon path with a small PatchWarden-styled shield icon drawn through WinForms/System.Drawing.
|
|
20
|
-
- Kept the tray as a lightweight switch layer: Open Dashboard, Status, Start All, Stop All, Restart All, Open Logs, and Quit Tray.
|
|
21
|
-
- Added clearer balloon/status feedback for startup and lifecycle actions.
|
|
22
|
-
- Clarified action semantics: **Stop All** stops Core/Direct and leaves tray/dashboard available; **Quit Tray** exits only the tray; `Stop-PatchWarden.cmd` performs full shutdown.
|
|
23
|
-
|
|
24
|
-
## Background Lifecycle
|
|
25
|
-
|
|
26
|
-
- Control Center now invokes `manage-patchwarden.ps1` with `-Background` and `windowsHide: true` for lifecycle API calls.
|
|
27
|
-
- The manager starts Core/Direct supervisors hidden for desktop/Web flows, while preserving visible launcher windows for explicit CLI/debug usage.
|
|
28
|
-
- Added `-NoTunnelWebUi` to `start-patchwarden-tunnel.ps1` so background starts do not open tunnel-client Web UI tabs.
|
|
29
|
-
|
|
30
|
-
## Verification
|
|
31
|
-
|
|
32
|
-
- TypeScript build: PASS
|
|
33
|
-
- Control smoke: PASS
|
|
34
|
-
- Control Center smoke: PASS (23 passed, 0 failed)
|
|
35
|
-
- Package manifest check: PASS
|
|
36
|
-
- PowerShell control script parse check: PASS
|
|
37
|
-
- Manual desktop-flow evidence: desktop entry starts only tray + Control Center; Start/Restart uses hidden supervisors; Stop-PatchWarden closes Core/Direct, Control Center, and tray.
|
|
38
|
-
|
|
39
|
-
## Migration
|
|
40
|
-
|
|
41
|
-
No breaking changes. Existing CLI commands and compatibility launchers remain available. For daily Windows use, prefer:
|
|
42
|
-
|
|
43
|
-
```powershell
|
|
44
|
-
.\PatchWarden-Desktop.cmd
|
|
45
|
-
```
|