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
package/PatchWarden.cmd
CHANGED
|
@@ -3,6 +3,37 @@ setlocal EnableExtensions
|
|
|
3
3
|
chcp 65001 >nul
|
|
4
4
|
cd /d "%~dp0"
|
|
5
5
|
|
|
6
|
+
set "LAUNCHERS_DIR=%~dp0scripts\launchers"
|
|
7
|
+
set "PATCHWARDEN_COMMAND=%~1"
|
|
8
|
+
|
|
9
|
+
if /i "%PATCHWARDEN_COMMAND%"=="control" goto dispatch_control
|
|
10
|
+
if /i "%PATCHWARDEN_COMMAND%"=="desktop" goto dispatch_desktop
|
|
11
|
+
if /i "%PATCHWARDEN_COMMAND%"=="tray" goto dispatch_tray
|
|
12
|
+
if /i "%PATCHWARDEN_COMMAND%"=="stop" goto dispatch_stop
|
|
13
|
+
if /i "%PATCHWARDEN_COMMAND%"=="restart-control" goto dispatch_restart_control
|
|
14
|
+
goto default_behavior
|
|
15
|
+
|
|
16
|
+
:dispatch_control
|
|
17
|
+
call "%LAUNCHERS_DIR%\PatchWarden-Control.cmd" %2 %3 %4 %5 %6 %7 %8 %9
|
|
18
|
+
exit /b %ERRORLEVEL%
|
|
19
|
+
|
|
20
|
+
:dispatch_desktop
|
|
21
|
+
call "%LAUNCHERS_DIR%\PatchWarden-Desktop.cmd" %2 %3 %4 %5 %6 %7 %8 %9
|
|
22
|
+
exit /b %ERRORLEVEL%
|
|
23
|
+
|
|
24
|
+
:dispatch_tray
|
|
25
|
+
call "%LAUNCHERS_DIR%\PatchWarden-Control-Tray.cmd" %2 %3 %4 %5 %6 %7 %8 %9
|
|
26
|
+
exit /b %ERRORLEVEL%
|
|
27
|
+
|
|
28
|
+
:dispatch_stop
|
|
29
|
+
call "%LAUNCHERS_DIR%\Stop-PatchWarden.cmd" %2 %3 %4 %5 %6 %7 %8 %9
|
|
30
|
+
exit /b %ERRORLEVEL%
|
|
31
|
+
|
|
32
|
+
:dispatch_restart_control
|
|
33
|
+
call "%LAUNCHERS_DIR%\Restart-PatchWarden-Control.cmd" %2 %3 %4 %5 %6 %7 %8 %9
|
|
34
|
+
exit /b %ERRORLEVEL%
|
|
35
|
+
|
|
36
|
+
:default_behavior
|
|
6
37
|
set "DEFAULT_PROXY=http://127.0.0.1:7892"
|
|
7
38
|
|
|
8
39
|
if not defined PATCHWARDEN_PROXY_URL (
|
|
@@ -20,8 +51,7 @@ set "HTTPS_PROXY=%PATCHWARDEN_PROXY_URL%"
|
|
|
20
51
|
set "ALL_PROXY=%PATCHWARDEN_PROXY_URL%"
|
|
21
52
|
set "NO_PROXY=localhost,127.0.0.1,::1"
|
|
22
53
|
|
|
23
|
-
set "
|
|
24
|
-
set "MANAGER=%SCRIPTS_DIR%\manage-patchwarden.ps1"
|
|
54
|
+
set "MANAGER=%~dp0scripts\control\manage-patchwarden.ps1"
|
|
25
55
|
|
|
26
56
|
if not exist "%MANAGER%" (
|
|
27
57
|
echo [error] manage-patchwarden.ps1 not found:
|
package/README.en.md
CHANGED
|
@@ -8,9 +8,7 @@
|
|
|
8
8
|
[](https://nodejs.org/)
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
[CHANGELOG](CHANGELOG.md), [migration guide](docs/migration-from-safe-bifrost.md), and
|
|
13
|
-
[release checklist](docs/release-checklist.md). Verify GitHub Release / npm publication separately before release.
|
|
11
|
+
**Let an MCP client such as ChatGPT or Codex plan and review the work while a local coding agent executes inside explicit safety boundaries and leaves auditable evidence.**
|
|
14
12
|
|
|
15
13
|
PatchWarden is a local-first MCP safety and verification layer for AI coding
|
|
16
14
|
agents, with workspace confinement, command allowlists, scope-violation
|
|
@@ -21,7 +19,21 @@ PatchWarden stores that plan as a workspace-scoped task, lets a preconfigured
|
|
|
21
19
|
local agent execute it, and returns results, diffs, artifact manifests, and
|
|
22
20
|
independent verification evidence.
|
|
23
21
|
|
|
24
|
-
|
|
22
|
+
[Download Windows installer v1.6.0](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Setup-1.6.0-x64.exe)
|
|
23
|
+
· [Portable ZIP](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Portable-1.6.0-x64.zip)
|
|
24
|
+
· [Checksums](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Desktop-SHA256SUMS.txt)
|
|
25
|
+
· [Three-minute quick start](#three-minute-quick-start)
|
|
26
|
+
· [Discussions](https://github.com/jiezeng2004-design/PatchWarden/discussions)
|
|
27
|
+
|
|
28
|
+

|
|
29
|
+
|
|
30
|
+
<sub>Real PatchWarden Desktop first-run UI from a privacy-safe smoke run; no real workspace, account, or credential data is shown.</sub>
|
|
31
|
+
|
|
32
|
+
Current source version: **v1.6.1**; current Windows Release: **v1.6.0**; npm
|
|
33
|
+
`latest`: **v1.5.1**. Use the installer above for the first Windows experience;
|
|
34
|
+
pin an actually published version for npm/CLI use. See the
|
|
35
|
+
[CHANGELOG](CHANGELOG.md), [migration guide](docs/migration-from-safe-bifrost.md), and
|
|
36
|
+
[release checklist](docs/release-checklist.md).
|
|
25
37
|
|
|
26
38
|
> [!IMPORTANT]
|
|
27
39
|
> PatchWarden is not a general-purpose remote shell. MCP clients cannot run
|
|
@@ -36,7 +48,7 @@ independent verification evidence.
|
|
|
36
48
|
- [Evidence example](#evidence-example)
|
|
37
49
|
- [Runtime architecture](#runtime-architecture)
|
|
38
50
|
- [Requirements](#requirements)
|
|
39
|
-
- [
|
|
51
|
+
- [Three-minute quick start](#three-minute-quick-start)
|
|
40
52
|
- [Complete configuration guide](#complete-configuration-guide)
|
|
41
53
|
- [Connect OpenCode](#connect-opencode)
|
|
42
54
|
- [Connect Codex](#connect-codex)
|
|
@@ -61,12 +73,13 @@ PatchWarden uses a narrower, auditable task channel:
|
|
|
61
73
|
- Every task must specify a `repo_path` inside `workspaceRoot`.
|
|
62
74
|
- Agent launch commands come from local configuration, not model input.
|
|
63
75
|
- Verification commands must exactly match `allowedTestCommands`.
|
|
64
|
-
- Every completed task records structured results, a
|
|
76
|
+
- Every completed task records structured results, a bounded and redacted diff, file
|
|
65
77
|
statistics, and independent verification output.
|
|
66
78
|
- Changes outside the requested repository cause a scope violation instead of
|
|
67
79
|
being silently accepted.
|
|
68
|
-
-
|
|
69
|
-
credential stores
|
|
80
|
+
- `.patchwarden/` is not a sensitive-path exemption. Names such as `.env`
|
|
81
|
+
files, tokens, SSH keys, cookies, and credential stores remain blocked at
|
|
82
|
+
every directory depth.
|
|
70
83
|
|
|
71
84
|
Good use cases:
|
|
72
85
|
|
|
@@ -110,7 +123,7 @@ A completed task writes bounded, reviewable artifacts under
|
|
|
110
123
|
- `result.json` - final status, verification status, changed-file groups, and warnings.
|
|
111
124
|
- `artifact_manifest.json` - generated artifacts with size, type, and SHA-256.
|
|
112
125
|
- `verify.json` - exact verification commands and exit codes.
|
|
113
|
-
- `diff.patch` -
|
|
126
|
+
- `diff.patch` - up to 20 MiB of redacted source diff when Git evidence is available; truncation is explicit.
|
|
114
127
|
- `rollback_scope_violation_plan.md` - review plan when a task changes files outside `repo_path`.
|
|
115
128
|
|
|
116
129
|
Example compact evidence:
|
|
@@ -218,9 +231,37 @@ If `where.exe codex` only returns the Codex Desktop executable under
|
|
|
218
231
|
WindowsApps, it may not be a callable Codex CLI. Install or point to the real
|
|
219
232
|
CLI, or configure OpenCode as the execution agent.
|
|
220
233
|
|
|
221
|
-
##
|
|
234
|
+
## Three-minute quick start
|
|
235
|
+
|
|
236
|
+
If Node.js 18+ and at least one local coding agent are already installed, this
|
|
237
|
+
Windows path is designed to reach its first read-only health check in about
|
|
238
|
+
three minutes. A ChatGPT Tunnel is not required for this first run.
|
|
239
|
+
|
|
240
|
+
### Option A: Windows installer (recommended for a first run)
|
|
241
|
+
|
|
242
|
+
1. Download the [Windows installer v1.6.0](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Setup-1.6.0-x64.exe)
|
|
243
|
+
and its [SHA256 checksum file](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Desktop-SHA256SUMS.txt).
|
|
244
|
+
2. Verify the installer in PowerShell:
|
|
245
|
+
|
|
246
|
+
```powershell
|
|
247
|
+
Get-FileHash .\PatchWarden-Setup-1.6.0-x64.exe -Algorithm SHA256
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
The current published value is `77d655545925ae283a0caed0fff12554debac15b54c5decf1ae8f3867703058e`;
|
|
251
|
+
always prefer the checksum file from the same Release. The installer is not
|
|
252
|
+
code-signed yet, so Windows SmartScreen may show an unknown-publisher warning.
|
|
253
|
+
|
|
254
|
+
3. Install and open PatchWarden Desktop, then choose a dedicated workspace that
|
|
255
|
+
contains only your projects.
|
|
256
|
+
4. Select **Local MCP** on the first screen, review the detected agent, and let
|
|
257
|
+
the read-only health check finish.
|
|
222
258
|
|
|
223
|
-
|
|
259
|
+
Success means the onboarding flow reaches the read-only console, shows the
|
|
260
|
+
selected workspace, and completes the agent/runtime checks. Share a successful
|
|
261
|
+
install or a blocked step in [Discussions](https://github.com/jiezeng2004-design/PatchWarden/discussions),
|
|
262
|
+
including your OS, Node.js version, agent, and the step where you stopped.
|
|
263
|
+
|
|
264
|
+
### Option B: run from source (developer workflow)
|
|
224
265
|
|
|
225
266
|
Source mode is the easiest way to use the Watcher, Windows launchers, and
|
|
226
267
|
diagnostic scripts together.
|
|
@@ -257,7 +298,7 @@ npm.cmd run watch
|
|
|
257
298
|
Keep this window open, then configure OpenCode, Codex, or ChatGPT as described
|
|
258
299
|
below.
|
|
259
300
|
|
|
260
|
-
### Option
|
|
301
|
+
### Option C: use the npm package
|
|
261
302
|
|
|
262
303
|
The npm package is convenient for launching a pinned MCP server. Task
|
|
263
304
|
execution still requires a separate Watcher.
|
|
@@ -300,11 +341,13 @@ Recommended Windows example:
|
|
|
300
341
|
"agents": {
|
|
301
342
|
"opencode": {
|
|
302
343
|
"command": "opencode",
|
|
303
|
-
"args": ["run", "{prompt}"]
|
|
344
|
+
"args": ["run", "{prompt}"],
|
|
345
|
+
"envAllowlist": []
|
|
304
346
|
},
|
|
305
347
|
"codex": {
|
|
306
348
|
"command": "codex",
|
|
307
|
-
"args": ["exec", "--cd", "{repo}", "{prompt}"]
|
|
349
|
+
"args": ["exec", "--cd", "{repo}", "{prompt}"],
|
|
350
|
+
"envAllowlist": []
|
|
308
351
|
}
|
|
309
352
|
},
|
|
310
353
|
"allowedTestCommands": [
|
|
@@ -333,6 +376,7 @@ Configuration fields:
|
|
|
333
376
|
| `tasksDir` | Yes | Task and result directory, normally `.patchwarden/tasks`. |
|
|
334
377
|
| `toolProfile` | No | `full`, `chatgpt_core`, `chatgpt_direct`, or `chatgpt_search`; use `full` for local clients and `chatgpt_search` for compact discovery-driven clients. |
|
|
335
378
|
| `agents` | Yes | Execution-agent allowlist; supports `{repo}` and `{prompt}` placeholders. |
|
|
379
|
+
| `agents.<name>.envAllowlist` | No | Provider environment variable names explicitly forwarded to that agent; none are inherited by default. Tunnel and HTTP owner credentials are always blocked. |
|
|
336
380
|
| `allowedTestCommands` | Yes | Exact allowlist for independent verification commands. |
|
|
337
381
|
| `repoAllowedTestCommands` | No | Extra exact commands keyed by workspace-relative repository path; wildcards are unsupported. |
|
|
338
382
|
| `maxReadFileBytes` | Yes | Maximum bytes returned by one MCP file read. |
|
|
@@ -349,12 +393,17 @@ Important configuration rules:
|
|
|
349
393
|
- If you use backslashes, escape them as `D:\\path\\to\\project`.
|
|
350
394
|
- Do not set `workspaceRoot` to a drive root, home directory, Desktop,
|
|
351
395
|
Downloads, or Documents.
|
|
396
|
+
- Configuration loading fails closed when `workspaceRoot` is missing,
|
|
397
|
+
inaccessible, not a directory, or one of those unsafe broad roots.
|
|
352
398
|
- `plansDir` and `tasksDir` are resolved relative to `workspaceRoot`.
|
|
353
399
|
- `repo_path` must stay inside `workspaceRoot` and cannot escape with `..`.
|
|
354
400
|
- `allowedTestCommands` uses exact matching; similar commands are not
|
|
355
401
|
automatically authorized.
|
|
356
402
|
- Repository-specific commands come only from trusted local configuration;
|
|
357
403
|
a target repository cannot authorize itself through `package.json`.
|
|
404
|
+
- Every execution agent must be explicitly registered. Provider credentials or
|
|
405
|
+
proxy variables are forwarded only when their names appear in that agent's
|
|
406
|
+
`envAllowlist`; owner credentials cannot be allow-listed.
|
|
358
407
|
- Configuration may contain private paths and should not be committed.
|
|
359
408
|
|
|
360
409
|
Set the configuration path:
|
|
@@ -463,11 +512,26 @@ configured under `agents` is available.
|
|
|
463
512
|
|
|
464
513
|
## Connect ChatGPT
|
|
465
514
|
|
|
515
|
+
> The current ChatGPT terms are **developer-mode app / Plugins**. Older docs and UI builds called this a Connector.
|
|
516
|
+
|
|
517
|
+
### Eight-step desktop setup
|
|
518
|
+
|
|
519
|
+
1. Confirm that the OpenAI Platform account has Tunnel access and enable developer mode in the target ChatGPT workspace.
|
|
520
|
+
2. Open [Platform Tunnel settings](https://platform.openai.com/settings/organization/tunnels), create a Tunnel, and associate the target ChatGPT workspace.
|
|
521
|
+
3. Start PatchWarden Desktop and detect or choose an existing `tunnel-client.exe` under **Settings → MCP and Tunnel**. The app never downloads or executes new software automatically.
|
|
522
|
+
4. Enter the Core Tunnel ID and the dedicated Tunnel runtime API key. This credential is used as `CONTROL_PLANE_API_KEY`; it is **not** the `OPENAI_API_KEY` used by ordinary applications.
|
|
523
|
+
5. Select environment proxy, no proxy, or a credential-free HTTP/HTTPS/SOCKS5 (Mixed) proxy, then confirm that its port is reachable.
|
|
524
|
+
6. Choose **Configure and verify Core**. Desktop initializes the `patchwarden` profile, runs `tunnel-client doctor --explain --json`, and saves the credential with Windows DPAPI only after validation succeeds; then start Core.
|
|
525
|
+
7. On **Getting Started**, confirm Tunnel ready and Watcher healthy, and verify that `chatgpt_core` exposes the fixed 26-tool catalog. Direct is optional; when disabled, Start All starts Core and reports Direct as skipped.
|
|
526
|
+
8. In ChatGPT **Settings → Plugins**, create a developer-mode app and choose the Tunnel. Reconnect it, open a new chat, and call `health_check`.
|
|
527
|
+
|
|
528
|
+
The first-run wizard also offers **Local MCP**. That route configures the safe workspace and a local MCP client, and can skip the Platform/ChatGPT Tunnel portions of steps 1, 2, 4, 5, 7, and 8.
|
|
529
|
+
|
|
466
530
|
Recommended Windows path:
|
|
467
531
|
|
|
468
532
|
```text
|
|
469
533
|
ChatGPT Web
|
|
470
|
-
→ ChatGPT Connector
|
|
534
|
+
→ ChatGPT developer-mode app / Plugins (formerly Connector)
|
|
471
535
|
→ OpenAI Secure MCP Tunnel
|
|
472
536
|
→ PatchWarden stdio MCP
|
|
473
537
|
→ Watcher
|
|
@@ -512,7 +576,7 @@ Runtime status is stored under:
|
|
|
512
576
|
This directory contains PIDs, health state, and redacted diagnostics. It must
|
|
513
577
|
not contain the API key or Tunnel ID.
|
|
514
578
|
|
|
515
|
-
When creating the ChatGPT
|
|
579
|
+
When creating the ChatGPT developer-mode app in Plugins:
|
|
516
580
|
|
|
517
581
|
- Select the tunnel **Channel**.
|
|
518
582
|
- Choose **None** for authentication unless you implemented OAuth.
|
|
@@ -687,13 +751,20 @@ mean the task is wrong.
|
|
|
687
751
|
| `progress.md` | Progress reported by the agent. |
|
|
688
752
|
| `result.md` | Human-readable execution report. |
|
|
689
753
|
| `result.json` | Structured result, paths, changes, warnings, and next steps. |
|
|
690
|
-
| `diff.patch` |
|
|
754
|
+
| `diff.patch` | Up to 20 MiB of task change evidence; credential-like values are redacted before persistence and truncation is explicit. |
|
|
691
755
|
| `artifact_manifest.json` | Generated artifact paths, types, sizes, and SHA-256 hashes. |
|
|
692
756
|
| `file-stats.json` | Per-file addition and deletion statistics. |
|
|
693
757
|
| `verify.json` | Structured record for every independent verification command. |
|
|
694
758
|
| `verify.log` | Human-readable independent verification output. |
|
|
695
759
|
| `test.log` | Test output captured during agent execution. |
|
|
696
760
|
|
|
761
|
+
Client-facing task artifact reads are limited by `maxReadFileBytes`; diff,
|
|
762
|
+
summary, and log-tail surfaces read bounded prefixes or suffixes. `audit_task`
|
|
763
|
+
scans at most 200 Markdown files and 4 MiB of documentation and returns a
|
|
764
|
+
warning when that budget is reached. Persistent invocation and reconciliation
|
|
765
|
+
logs use cross-process locked, bounded append and retain recent content with an
|
|
766
|
+
explicit truncation marker when full.
|
|
767
|
+
|
|
697
768
|
An agent saying “published” or “pushed” is not reliable remote evidence.
|
|
698
769
|
Verify GitHub, npm, tags, and releases against the live platform state.
|
|
699
770
|
|
|
@@ -778,10 +849,51 @@ available from PowerShell:
|
|
|
778
849
|
.\PatchWarden.cmd restart all
|
|
779
850
|
.\PatchWarden.cmd status all
|
|
780
851
|
.\PatchWarden.cmd kill all
|
|
781
|
-
.\Stop-PatchWarden.cmd
|
|
852
|
+
.\scripts\launchers\Stop-PatchWarden.cmd
|
|
782
853
|
```
|
|
783
854
|
|
|
784
|
-
For daily desktop use, start with `PatchWarden-Desktop.cmd`; it starts the tray and keeps Control Center available without opening extra browser windows. Use `PatchWarden-Control-Tray.cmd --foreground` only for tray debugging, `PatchWarden-Control.cmd` for the full local Web dashboard, and `Stop-PatchWarden.cmd` for one-click shutdown of Core/Direct, Control Center, and the tray.
|
|
855
|
+
For daily desktop use, start with `scripts\launchers\PatchWarden-Desktop.cmd`; it starts the tray and keeps Control Center available without opening extra browser windows. Use `scripts\launchers\PatchWarden-Control-Tray.cmd --foreground` only for tray debugging, `scripts\launchers\PatchWarden-Control.cmd` for the full local Web dashboard, and `scripts\launchers\Stop-PatchWarden.cmd` for one-click shutdown of Core/Direct, Control Center, and the tray.
|
|
856
|
+
|
|
857
|
+
### Windows installer
|
|
858
|
+
|
|
859
|
+
PatchWarden Desktop ships as an installer and a no-install ZIP. It provides an Electron window,
|
|
860
|
+
first-run workspace setup, a system tray, and desktop settings while reusing
|
|
861
|
+
the same loopback Control Center and bounded control APIs. Electron and builder
|
|
862
|
+
dependencies remain isolated in the private `desktop/` package and are not
|
|
863
|
+
included in the public `patchwarden` npm package.
|
|
864
|
+
|
|
865
|
+
The installer still requires Windows x64, Node.js 18+, and tunnel-client. The
|
|
866
|
+
first run performs bounded discovery through `PATH`, current-user locations,
|
|
867
|
+
and the area next to the workspace. If it is missing, the read-only console
|
|
868
|
+
remains available and **Settings > MCP and tunnel** provides a dedicated file
|
|
869
|
+
picker plus SHA256 guidance. The app never downloads or runs new software
|
|
870
|
+
automatically. Settings also exposes the explicit Direct switch and
|
|
871
|
+
environment, none, or manual proxy modes; manual URLs support only http,
|
|
872
|
+
https, or socks5 without embedded credentials. Start/restart reports success
|
|
873
|
+
only after health/ready and the Core watcher have been verified.
|
|
874
|
+
Desktop supports Codex, OpenCode, Claude Code, Gemini CLI, GitHub Copilot CLI,
|
|
875
|
+
Qwen Code, Kimi Code, and Aider. It reads only model fields from agent settings,
|
|
876
|
+
never credentials.
|
|
877
|
+
|
|
878
|
+
```powershell
|
|
879
|
+
npm.cmd install --prefix desktop --cache .\.npm-cache
|
|
880
|
+
npm.cmd run desktop:test
|
|
881
|
+
npm.cmd run desktop:preflight
|
|
882
|
+
npm.cmd run desktop:package
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
The installer, portable ZIP, and SHA256 file are written to `release\desktop`. The first
|
|
886
|
+
release is unsigned and has no automatic updater, so Windows SmartScreen may
|
|
887
|
+
show an unknown-publisher warning. Verify the GitHub Release source and SHA256.
|
|
888
|
+
See [docs/desktop-app.md](docs/desktop-app.md) for installation, runtime, and
|
|
889
|
+
uninstall details.
|
|
890
|
+
|
|
891
|
+
`desktop:preflight` uses a unique output directory for clean builds, complete
|
|
892
|
+
unit and desktop tests, npm package-surface validation, an Electron directory
|
|
893
|
+
package, an isolated 26-tool runtime check, and unpacked UI/single-instance
|
|
894
|
+
smoke evidence. It writes `preflight-report.json` and `preflight-report.md`.
|
|
895
|
+
Before release, run `npm.cmd run desktop:preflight:release` from a clean
|
|
896
|
+
checkout; it rejects any uncommitted path.
|
|
785
897
|
|
|
786
898
|
The old single-purpose launchers remain under `scripts/launchers/` as a
|
|
787
899
|
compatibility layer. Personal launchers live under `.local/launchers/` and
|
|
@@ -1002,6 +1114,13 @@ creation. `export_task_evidence_pack` writes bounded `evidence.json` and
|
|
|
1002
1114
|
`EVIDENCE.md` files under `.patchwarden/evidence-packs/<lineage_id>/` without
|
|
1003
1115
|
stdout/stderr tails, full diffs, verification logs, or sensitive file content.
|
|
1004
1116
|
|
|
1117
|
+
Goal Session state changes are serialized by a shared cross-process mutation
|
|
1118
|
+
lock and committed atomically. A non-empty Goal automatically becomes
|
|
1119
|
+
`completed` after every subgoal is accepted. `create_subgoal_task` treats the
|
|
1120
|
+
Goal's stored `repo_path` as authoritative and rejects a caller-supplied mismatch
|
|
1121
|
+
with `goal_repo_mismatch`; isolated worktrees are created from that repository,
|
|
1122
|
+
and create/merge/discard share a repository lifecycle lock.
|
|
1123
|
+
|
|
1005
1124
|
`full` additionally provides:
|
|
1006
1125
|
|
|
1007
1126
|
- `get_plan`
|
|
@@ -1021,6 +1140,12 @@ session, read and search source files, apply hash-bound JSON patches, run
|
|
|
1021
1140
|
exactly allowlisted verification commands or a bounded verification bundle, finalize the evidence, and audit
|
|
1022
1141
|
the result without a local execution agent.
|
|
1023
1142
|
|
|
1143
|
+
Direct patch and sync operations accept only size-bounded UTF-8 text, count
|
|
1144
|
+
patch limits in UTF-8 bytes, reject credential-like results, revalidate hashes
|
|
1145
|
+
immediately before replacement, and serialize patch/sync/verify/finalize/audit
|
|
1146
|
+
for each session. Direct still does not expose shell, delete, rename, commit,
|
|
1147
|
+
push, publish, or deployment operations.
|
|
1148
|
+
|
|
1024
1149
|
Enable it in the trusted local configuration while keeping the ordinary Core
|
|
1025
1150
|
profile unchanged:
|
|
1026
1151
|
|
|
@@ -1062,9 +1187,10 @@ Primary protections:
|
|
|
1062
1187
|
- Agent commands and argument templates must be configured in advance.
|
|
1063
1188
|
- Verification commands must exactly match the allowlist.
|
|
1064
1189
|
- File access is contained to `workspaceRoot`.
|
|
1065
|
-
- Sensitive filenames and obvious credential-read plans are blocked
|
|
1066
|
-
|
|
1067
|
-
-
|
|
1190
|
+
- Sensitive filenames and obvious credential-read plans are blocked;
|
|
1191
|
+
`.patchwarden/` does not bypass this check.
|
|
1192
|
+
- Credential-like diff content is redacted before persistence and marks the task as a policy violation.
|
|
1193
|
+
- HTTP services bind only to `127.0.0.1` and reject non-loopback Host headers.
|
|
1068
1194
|
- The Runner does not automatically commit, push, publish, or reset.
|
|
1069
1195
|
|
|
1070
1196
|
Protect these local paths:
|
|
@@ -1153,9 +1279,10 @@ and release-asset checksums independently.
|
|
|
1153
1279
|
|
|
1154
1280
|
## Related documentation
|
|
1155
1281
|
|
|
1156
|
-
- [
|
|
1157
|
-
- [v0.6.
|
|
1158
|
-
- [v0.6.
|
|
1282
|
+
- [Windows Desktop installer](docs/desktop-app.md)
|
|
1283
|
+
- [v0.6.4 release notes](docs/archive/releases/release-v0.6.4.md)
|
|
1284
|
+
- [v0.6.1 release notes](docs/archive/releases/release-v0.6.1.md)
|
|
1285
|
+
- [v0.6.0 release notes](docs/archive/releases/release-v0.6.0.md)
|
|
1159
1286
|
- [ChatGPT usage guide](docs/chatgpt-usage.md)
|
|
1160
1287
|
- [Migration guide](docs/migration-from-safe-bifrost.md)
|
|
1161
1288
|
- [ChatGPT Connector demo](docs/demo.md)
|
package/README.md
CHANGED
|
@@ -8,20 +8,27 @@
|
|
|
8
8
|
[](https://nodejs.org/)
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
[CHANGELOG](CHANGELOG.md)、[迁移指南](docs/migration-from-safe-bifrost.md)和
|
|
13
|
-
[发布检查清单](docs/release-checklist.md)。GitHub Release / npm 发布状态需要在发布前单独核对。
|
|
11
|
+
**让 ChatGPT、Codex 等 MCP 客户端负责规划与验收,让本地编程 Agent 在明确的安全边界内执行,并留下可审计证据。**
|
|
14
12
|
|
|
15
13
|
PatchWarden 是一个面向本地编程 Agent 的安全 MCP 桥接器。上游的
|
|
16
14
|
ChatGPT、Codex、OpenCode 或其他 MCP 客户端负责规划与验收,
|
|
17
15
|
PatchWarden 负责把计划保存成工作区内任务,再由预先配置的本地 Agent
|
|
18
16
|
执行,并返回结果、代码差异和独立测试记录。
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
[下载 Windows 安装版 v1.6.0](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Setup-1.6.0-x64.exe)
|
|
19
|
+
· [免安装 ZIP](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Portable-1.6.0-x64.zip)
|
|
20
|
+
· [校验文件](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Desktop-SHA256SUMS.txt)
|
|
21
|
+
· [三分钟快速开始](#三分钟快速开始)
|
|
22
|
+
· [Discussions](https://github.com/jiezeng2004-design/PatchWarden/discussions)
|
|
23
|
+
|
|
24
|
+

|
|
21
25
|
|
|
22
|
-
>
|
|
26
|
+
<sub>PatchWarden Desktop 真实首启界面,来自隐私安全的桌面 smoke 验收;截图未使用真实工作区、账号或凭据。</sub>
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
当前源码版本:**v1.6.1**;当前 Windows Release:**v1.6.0**;npm `latest`:**v1.5.1**。
|
|
29
|
+
Windows 首次体验推荐上面的安装版;npm/CLI 用户请固定已发布版本。查看
|
|
30
|
+
[CHANGELOG](CHANGELOG.md)、[迁移指南](docs/migration-from-safe-bifrost.md)和
|
|
31
|
+
[发布检查清单](docs/release-checklist.md)。
|
|
25
32
|
|
|
26
33
|
> [!IMPORTANT]
|
|
27
34
|
> PatchWarden 不是通用远程 Shell。MCP 客户端不能随意执行命令:
|
|
@@ -33,7 +40,7 @@ PatchWarden 负责把计划保存成工作区内任务,再由预先配置的
|
|
|
33
40
|
- [它解决什么问题](#它解决什么问题)
|
|
34
41
|
- [运行结构](#运行结构)
|
|
35
42
|
- [环境要求](#环境要求)
|
|
36
|
-
- [
|
|
43
|
+
- [三分钟快速开始](#三分钟快速开始)
|
|
37
44
|
- [完整配置说明](#完整配置说明)
|
|
38
45
|
- [接入 OpenCode](#接入-opencode)
|
|
39
46
|
- [接入 Codex](#接入-codex)
|
|
@@ -58,9 +65,9 @@ PatchWarden 负责把计划保存成工作区内任务,再由预先配置的
|
|
|
58
65
|
- 每个任务必须指定位于 `workspaceRoot` 内的 `repo_path`。
|
|
59
66
|
- Agent 启动命令来自本地配置,而不是来自模型输入。
|
|
60
67
|
- 测试命令必须精确匹配 `allowedTestCommands`。
|
|
61
|
-
-
|
|
68
|
+
- 任务完成后保存结构化结果、有界且脱敏的差异、文件统计和独立验证记录。
|
|
62
69
|
- 工作区外出现变化时,任务会标记为作用域违规,而不是悄悄接受。
|
|
63
|
-
- `.env`、Token、SSH 密钥、Cookie
|
|
70
|
+
- `.patchwarden/` 不是敏感路径豁免区;`.env`、Token、SSH 密钥、Cookie、凭据文件等敏感名称无论位于哪一层目录都不可读。
|
|
64
71
|
|
|
65
72
|
适合的场景:
|
|
66
73
|
|
|
@@ -134,9 +141,33 @@ where.exe codex
|
|
|
134
141
|
应用程序,它不一定是可供 PatchWarden 调用的 Codex CLI。请安装或指定真正的
|
|
135
142
|
CLI,或者先把 OpenCode 配置为执行 Agent。
|
|
136
143
|
|
|
137
|
-
##
|
|
144
|
+
## 三分钟快速开始
|
|
145
|
+
|
|
146
|
+
如果已经安装 Node.js 18+ 和至少一个本地编程 Agent,这条 Windows 路径的目标是
|
|
147
|
+
在三分钟内完成首次只读健康检查。首次体验不需要配置 ChatGPT Tunnel。
|
|
138
148
|
|
|
139
|
-
### 方案 A
|
|
149
|
+
### 方案 A:Windows 安装版(首次体验推荐)
|
|
150
|
+
|
|
151
|
+
1. 下载 [Windows 安装版 v1.6.0](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Setup-1.6.0-x64.exe)
|
|
152
|
+
和 [SHA256 校验文件](https://github.com/jiezeng2004-design/PatchWarden/releases/download/v1.6.0/PatchWarden-Desktop-SHA256SUMS.txt)。
|
|
153
|
+
2. 在 PowerShell 中校验安装包:
|
|
154
|
+
|
|
155
|
+
```powershell
|
|
156
|
+
Get-FileHash .\PatchWarden-Setup-1.6.0-x64.exe -Algorithm SHA256
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
当前发布值应为 `77d655545925ae283a0caed0fff12554debac15b54c5decf1ae8f3867703058e`;
|
|
160
|
+
仍应以同一 Release 的校验文件为准。安装包尚未代码签名,Windows SmartScreen
|
|
161
|
+
可能显示“未知发布者”。
|
|
162
|
+
|
|
163
|
+
3. 安装并打开 PatchWarden Desktop,选择一个只包含项目的专用工作区。
|
|
164
|
+
4. 首屏选择 **本地 MCP**,确认检测到的 Agent,让只读健康检查完成。
|
|
165
|
+
|
|
166
|
+
成功标志:向导能够进入只读控制台,显示所选工作区,并完成 Agent 与运行环境检查。
|
|
167
|
+
安装成功或遇到阻塞时,请到 [Discussions](https://github.com/jiezeng2004-design/PatchWarden/discussions)
|
|
168
|
+
记录操作系统、Node.js 版本、使用的 Agent 和卡住的步骤。
|
|
169
|
+
|
|
170
|
+
### 方案 B:从源码运行(开发者)
|
|
140
171
|
|
|
141
172
|
源码方式最适合完整使用 Watcher、Windows 一键启动器和诊断脚本。
|
|
142
173
|
|
|
@@ -171,7 +202,7 @@ npm.cmd run watch
|
|
|
171
202
|
|
|
172
203
|
保持该窗口运行,再按照后文配置 OpenCode、Codex 或 ChatGPT Connector。
|
|
173
204
|
|
|
174
|
-
### 方案
|
|
205
|
+
### 方案 C:使用 npm 包
|
|
175
206
|
|
|
176
207
|
npm 包适合让 MCP 客户端通过固定版本启动 PatchWarden。为了执行任务,
|
|
177
208
|
仍然必须另外启动 Watcher。
|
|
@@ -213,11 +244,13 @@ Copy-Item .\examples\config.example.json .\patchwarden.config.json
|
|
|
213
244
|
"agents": {
|
|
214
245
|
"opencode": {
|
|
215
246
|
"command": "opencode",
|
|
216
|
-
"args": ["run", "{prompt}"]
|
|
247
|
+
"args": ["run", "{prompt}"],
|
|
248
|
+
"envAllowlist": []
|
|
217
249
|
},
|
|
218
250
|
"codex": {
|
|
219
251
|
"command": "codex",
|
|
220
|
-
"args": ["exec", "--cd", "{repo}", "{prompt}"]
|
|
252
|
+
"args": ["exec", "--cd", "{repo}", "{prompt}"],
|
|
253
|
+
"envAllowlist": []
|
|
221
254
|
}
|
|
222
255
|
},
|
|
223
256
|
"allowedTestCommands": [
|
|
@@ -246,6 +279,7 @@ Copy-Item .\examples\config.example.json .\patchwarden.config.json
|
|
|
246
279
|
| `tasksDir` | 是 | 任务和结果目录,通常使用 `.patchwarden/tasks`。 |
|
|
247
280
|
| `toolProfile` | 否 | `full`、`chatgpt_core`、`chatgpt_direct` 或 `chatgpt_search`;本地客户端推荐 `full`,动态工具发现场景使用 `chatgpt_search`。 |
|
|
248
281
|
| `agents` | 是 | 可执行 Agent 白名单;支持 `{repo}` 和 `{prompt}` 占位符。 |
|
|
282
|
+
| `agents.<name>.envAllowlist` | 否 | 显式传给该 Agent 的 provider 环境变量名;默认不继承。Tunnel owner token 禁止透传。 |
|
|
249
283
|
| `allowedTestCommands` | 是 | 独立验证命令白名单,调用时必须精确匹配。 |
|
|
250
284
|
| `repoAllowedTestCommands` | 否 | 按工作区相对仓库路径增加精确验证命令;不支持通配符。 |
|
|
251
285
|
| `maxReadFileBytes` | 是 | MCP 单次文件读取上限。 |
|
|
@@ -369,6 +403,21 @@ PATCHWARDEN_TOOL_PROFILE = "full"
|
|
|
369
403
|
|
|
370
404
|
## 接入 ChatGPT Connector
|
|
371
405
|
|
|
406
|
+
> 当前 ChatGPT 术语为 **developer-mode app / Plugins**;旧版文档与部分界面曾称为 Connector。新配置请以 Plugins 为准。
|
|
407
|
+
|
|
408
|
+
### 桌面版八步新手流程
|
|
409
|
+
|
|
410
|
+
1. 确认 OpenAI Platform 账号具有 Tunnel 权限,并在目标 ChatGPT workspace 开启 developer mode。
|
|
411
|
+
2. 打开 [Platform Tunnel 设置](https://platform.openai.com/settings/organization/tunnels),创建 Tunnel,并关联目标 ChatGPT workspace。
|
|
412
|
+
3. 启动 PatchWarden Desktop,在“设置 → MCP 与隧道”检测或选择现有的 `tunnel-client.exe`;应用不会自动下载或执行新软件。
|
|
413
|
+
4. 输入 Core Tunnel ID 与专用 Tunnel runtime API key。该凭据对应 `CONTROL_PLANE_API_KEY`,**不是**普通应用使用的 `OPENAI_API_KEY`。
|
|
414
|
+
5. 配置环境代理、无代理或不含凭据的 HTTP/HTTPS/SOCKS5(Mixed)代理,并先确认代理端口可达。
|
|
415
|
+
6. 点击“配置并验证 Core”。桌面端初始化 `patchwarden` profile,运行 `tunnel-client doctor --explain --json`,验证成功后才用 Windows DPAPI 保存凭据;随后启动 Core。
|
|
416
|
+
7. 在“开始使用”确认 Tunnel ready、Watcher healthy,并确认 `chatgpt_core` 发现固定的 26 个工具。Direct 是设置页中的可选高级能力,未启用时“全部启动”只启动 Core。
|
|
417
|
+
8. 在 ChatGPT **Settings → Plugins** 创建 developer-mode app,选择刚创建的 Tunnel;重新连接后新建对话,调用 `health_check` 验证。
|
|
418
|
+
|
|
419
|
+
首次引导也可选择“本地 MCP”。该路线只配置安全工作区和本地 MCP 客户端,可以跳过第 1、2、4、5、7、8 步中的 Platform/ChatGPT Tunnel 操作。
|
|
420
|
+
|
|
372
421
|
推荐的 Windows 链路:
|
|
373
422
|
|
|
374
423
|
```text
|
|
@@ -572,19 +621,25 @@ ChatGPT 任务应优先选择前三个守护模板:只读诊断使用 `inspect
|
|
|
572
621
|
| `progress.md` | Agent 写入的进度记录。 |
|
|
573
622
|
| `result.md` | 人类可读的执行报告。 |
|
|
574
623
|
| `result.json` | 结构化结果、路径、变更、警告和后续建议。 |
|
|
575
|
-
| `diff.patch` |
|
|
624
|
+
| `diff.patch` | 最多 20 MiB 的任务差异证据;疑似凭据会在落盘前脱敏,超限会明确标记截断。 |
|
|
576
625
|
| `artifact_manifest.json` | 构建或发布产物的路径、类型、大小与 SHA-256。 |
|
|
577
626
|
| `file-stats.json` | 文件级增删统计。 |
|
|
578
627
|
| `verify.json` | 每条独立验证命令的结构化记录。 |
|
|
579
628
|
| `verify.log` | 独立验证的可读日志。 |
|
|
580
629
|
| `test.log` | Agent 执行过程中产生的测试输出。 |
|
|
581
630
|
|
|
631
|
+
面向客户端的任务产物读取受 `maxReadFileBytes` 限制;diff、summary 与日志 tail
|
|
632
|
+
只读取有界前缀或尾部。`audit_task` 最多扫描 200 个 Markdown 文件和 4 MiB 文档内容,
|
|
633
|
+
达到预算会返回 warning。invocation/reconcile 等持续日志使用跨进程锁内的有界追加,
|
|
634
|
+
超限时保留最近内容并写入明确的截断标记。
|
|
635
|
+
|
|
582
636
|
本地 Agent 声称“已推送”“已发布”不属于可靠的远程证据。GitHub、npm、
|
|
583
637
|
Tag 和 Release 必须再用对应平台的实时状态核验。
|
|
584
638
|
|
|
585
639
|
## HTTP MCP 模式
|
|
586
640
|
|
|
587
|
-
HTTP Server 只绑定 `127.0.0.1`,默认端口 7331
|
|
641
|
+
HTTP Server 只绑定 `127.0.0.1`,默认端口 7331,不会直接监听局域网;
|
|
642
|
+
HTTP MCP 与 Control Center 同时拒绝非 `127.0.0.1`/`localhost` 的 Host,防止 DNS rebinding 绕过回环边界。
|
|
588
643
|
|
|
589
644
|
终端 1,启动 Watcher:
|
|
590
645
|
|
|
@@ -659,10 +714,43 @@ Direct 两种模式的启动、停止、重启与状态。也可以在 PowerShel
|
|
|
659
714
|
.\PatchWarden.cmd restart all
|
|
660
715
|
.\PatchWarden.cmd status all
|
|
661
716
|
.\PatchWarden.cmd kill all
|
|
662
|
-
.\Stop-PatchWarden.cmd
|
|
717
|
+
.\scripts\launchers\Stop-PatchWarden.cmd
|
|
663
718
|
```
|
|
664
719
|
|
|
665
|
-
日常桌面入口:`PatchWarden-Desktop.cmd` 启动托盘并确保 Control Center 可用,不自动打开额外浏览器窗口。只有调试托盘时才使用 `PatchWarden-Control-Tray.cmd --foreground`;需要完整 Web 控制台时打开 `PatchWarden-Control.cmd`;需要一键收尾时使用 `Stop-PatchWarden.cmd` 关闭 Core/Direct、Control Center 和托盘。
|
|
720
|
+
日常桌面入口:`scripts\launchers\PatchWarden-Desktop.cmd` 启动托盘并确保 Control Center 可用,不自动打开额外浏览器窗口。只有调试托盘时才使用 `scripts\launchers\PatchWarden-Control-Tray.cmd --foreground`;需要完整 Web 控制台时打开 `scripts\launchers\PatchWarden-Control.cmd`;需要一键收尾时使用 `scripts\launchers\Stop-PatchWarden.cmd` 关闭 Core/Direct、Control Center 和托盘。
|
|
721
|
+
|
|
722
|
+
### Windows 安装版
|
|
723
|
+
|
|
724
|
+
公开分发可以构建 PatchWarden Desktop 安装包和免安装 ZIP。它提供 Electron
|
|
725
|
+
独立窗口、首次工作区引导、系统托盘和设置页,同时继续复用相同的
|
|
726
|
+
loopback Control Center 与安全控制 API。桌面依赖隔离在私有的
|
|
727
|
+
`desktop/` 子包中,不进入 `patchwarden` npm 包。
|
|
728
|
+
|
|
729
|
+
安装版仍要求 Windows x64、Node.js 18+ 和 tunnel-client。首次启动会在
|
|
730
|
+
`PATH`、当前用户目录和工作区附近做有界检测;未找到时可进入只读控制台,
|
|
731
|
+
再从“设置 -> MCP 与隧道”选择 `tunnel-client.exe` 并查看 SHA256 校验步骤。
|
|
732
|
+
应用不会自动下载或运行新软件。设置页还提供 Direct 显式开关,以及环境代理、
|
|
733
|
+
无代理、手动代理三种模式;手动代理只接受不含凭据的 http/https/socks5 URL。
|
|
734
|
+
启动和重启只有在 health/ready 与 Core Watcher 验证通过后才会报告成功。
|
|
735
|
+
桌面端支持 Codex、OpenCode、Claude Code、Gemini CLI、GitHub Copilot CLI、
|
|
736
|
+
Qwen Code、Kimi Code 和 Aider;只读取各 Agent 配置中的模型字段,不读取凭据。
|
|
737
|
+
|
|
738
|
+
```powershell
|
|
739
|
+
npm.cmd install --prefix desktop --cache .\.npm-cache
|
|
740
|
+
npm.cmd run desktop:test
|
|
741
|
+
npm.cmd run desktop:preflight
|
|
742
|
+
npm.cmd run desktop:package
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
安装包、免安装 ZIP 与 SHA256 文件输出到 `release\desktop`。首版不包含自动更新或
|
|
746
|
+
代码签名,Windows SmartScreen 可能提示未知发布者;发布前必须核对
|
|
747
|
+
GitHub Release 来源和 SHA256。完整安装、运行与卸载说明见
|
|
748
|
+
[docs/desktop-app.md](docs/desktop-app.md)。
|
|
749
|
+
|
|
750
|
+
`desktop:preflight` 会使用唯一目录完成 clean build、完整单测、桌面测试、npm 包面、
|
|
751
|
+
Electron 目录包、仓库外 26-tool manifest 与隔离 unpacked UI/单实例验收,并生成
|
|
752
|
+
`preflight-report.json` / `preflight-report.md`。正式发布前必须在干净 checkout 运行
|
|
753
|
+
`npm.cmd run desktop:preflight:release`;该命令发现未提交路径时会直接阻断。
|
|
666
754
|
|
|
667
755
|
旧的单用途入口保留在 `scripts/launchers/` 作为兼容层;个人入口位于
|
|
668
756
|
`.local/launchers/`,并继续被 Git 和发布包排除。`stop` / `restart` 会同时检查
|
|
@@ -758,7 +846,7 @@ PatchWarden Dashboard (Control Center) 提供以下主要页面:
|
|
|
758
846
|
|
|
759
847
|
- **控制台 (Dashboard)**: 系统总览,包含 Repo selector、Health Score、服务状态、Release 卡片、Project Policy、Lineage、Evidence Pack、Stale 任务提示、最近任务列表、系统状态(含 Copy diagnostics)。
|
|
760
848
|
- **任务面板 (Tasks)**: 任务列表,支持按 repo_path / status / acceptance_status / warning type / agent / date range 过滤,每行提供 safe_result / safe_audit / safe_test_summary / safe_diff_summary 快捷操作。
|
|
761
|
-
- **任务详情 (Task Detail)**: 默认展示 safe 摘要(safe_result / safe_test_summary / safe_diff_summary / safe_audit
|
|
849
|
+
- **任务详情 (Task Detail)**: 默认展示 safe 摘要(safe_result / safe_test_summary / safe_diff_summary / safe_audit),配置上限内的 result / diff / test log 在折叠的高级区按需加载。
|
|
762
850
|
- **Direct 会话 (Direct Sessions)**: 按 active / finalized / audited / expired 分组,提供 safe_direct_summary / safe_finalize_direct_session / safe_audit_direct_session 快捷操作。
|
|
763
851
|
- **审计日志 / Warnings (Audit)**: 按 warning 类型聚合,显示 affected tasks / severity / recommended action。
|
|
764
852
|
- **工作区 (Workspace)**: workspace 一级目录与项目列表。
|
|
@@ -769,7 +857,7 @@ PatchWarden Dashboard (Control Center) 提供以下主要页面:
|
|
|
769
857
|
1. 在 Dashboard 顶部选择目标 repo。
|
|
770
858
|
2. 查看 Health Score 确认系统健康。
|
|
771
859
|
3. 在最近任务列表点击 safe_result 快捷查看任务摘要。
|
|
772
|
-
4. 打开 Task Detail 进行 safe-first
|
|
860
|
+
4. 打开 Task Detail 进行 safe-first 验收,仅在需要时展开高级区查看有界日志。
|
|
773
861
|
5. 使用 Lineage Detail 查看 run_task_loop 的成功/失败原因。
|
|
774
862
|
6. 验收完成后导出 Evidence Pack。
|
|
775
863
|
7. Direct 会话用于独立验证,完成后 finalize + audit。
|
|
@@ -894,6 +982,12 @@ creation. `export_task_evidence_pack` writes bounded `evidence.json` and
|
|
|
894
982
|
`EVIDENCE.md` files under `.patchwarden/evidence-packs/<lineage_id>/` without
|
|
895
983
|
stdout/stderr tails, full diffs, verification logs, or sensitive file content.
|
|
896
984
|
|
|
985
|
+
Goal Session 的状态变更通过共享的跨进程 mutation lock 串行化并原子落盘;
|
|
986
|
+
非空 Goal 的所有子目标都被 `accept_subgoal` 接受后,Goal 会自动转为 `completed`。
|
|
987
|
+
`create_subgoal_task` 以 Goal 已保存的 `repo_path` 为权威,调用方传入其他仓库会以
|
|
988
|
+
`goal_repo_mismatch` 拒绝;隔离 worktree 也从该仓库创建,且 create/merge/discard
|
|
989
|
+
共用仓库级 lifecycle lock。
|
|
990
|
+
|
|
897
991
|
`get_project_policy` 是 v1.3 的只读策略入口,返回 `.patchwarden/project-policy.json`
|
|
898
992
|
的有界 effective policy 与 release readiness,不会扩大命令白名单。v1.3 的
|
|
899
993
|
`release_check`、`release_prepare`、`release_verify`、`release_cleanup` 仅在 `full`
|
|
@@ -997,6 +1091,9 @@ Direct 模式在受控 session 内执行,具有以下硬性限制:
|
|
|
997
1091
|
- 禁止修改 `node_modules`
|
|
998
1092
|
- 禁止手动修改 release/dist
|
|
999
1093
|
- 禁止修改二进制文件
|
|
1094
|
+
- 只修改大小受限的 UTF-8 文本;补丁按 UTF-8 字节计数
|
|
1095
|
+
- 补丁或同步结果包含疑似凭据时拒绝写入
|
|
1096
|
+
- 同一 session 的 patch、sync、verify、finalize、audit 串行化
|
|
1000
1097
|
- 所有操作限制在 `workspaceRoot` 和 session repo 内
|
|
1001
1098
|
|
|
1002
1099
|
### 不支持内容
|
|
@@ -1022,9 +1119,9 @@ PatchWarden 的主要保护:
|
|
|
1022
1119
|
- Agent 命令和参数模板必须预先配置。
|
|
1023
1120
|
- 验证命令必须精确匹配白名单。
|
|
1024
1121
|
- 文件访问被限制在 `workspaceRoot` 内。
|
|
1025
|
-
-
|
|
1026
|
-
-
|
|
1027
|
-
- HTTP
|
|
1122
|
+
- 敏感文件名和明显的凭据读取计划会被阻止;`.patchwarden/` 不会绕过该检查。
|
|
1123
|
+
- 任务差异中的疑似密钥值会在落盘前脱敏,并把任务标记为策略违规。
|
|
1124
|
+
- HTTP 服务只绑定 `127.0.0.1`,并拒绝非回环 Host。
|
|
1028
1125
|
- Runner 不会自动 commit、push、发布或重置仓库。
|
|
1029
1126
|
|
|
1030
1127
|
需要保护的本地路径:
|