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,365 +0,0 @@
|
|
|
1
|
-
# PatchWarden Roadmap Execution And Acceptance Plan
|
|
2
|
-
|
|
3
|
-
> Created: 2026-07-09
|
|
4
|
-
> Source document: `C:\Users\zengjie\Downloads\PatchWarden_项目推进与外部PR路线图.docx`
|
|
5
|
-
> Scope: feasibility check, executable steps, and acceptance commands for PatchWarden-first ecosystem work.
|
|
6
|
-
|
|
7
|
-
## Conclusion
|
|
8
|
-
|
|
9
|
-
The roadmap is feasible, but it needs two corrections before execution:
|
|
10
|
-
|
|
11
|
-
1. `v1.5.1` is not published yet. Local source is `1.5.1`, but GitHub Release and npm `latest` are still `v1.5.0`.
|
|
12
|
-
2. Goal Session is not a greenfield feature. PatchWarden already has Goal/Subgoal tools; the next valuable work is final report export, Spec Kit import, and better evidence mapping.
|
|
13
|
-
|
|
14
|
-
Therefore the execution order should be:
|
|
15
|
-
|
|
16
|
-
1. P0: close and publish `v1.5.1` safely.
|
|
17
|
-
2. P1: finish Evidence Pack v2 and public-facing docs.
|
|
18
|
-
3. P2: submit external PRs in low-risk order: MCP Inspector, AgentSeal, then Spec Kit.
|
|
19
|
-
4. P3: move to OpenCode/OpenHands/Aider integration docs after PatchWarden has published evidence to point at.
|
|
20
|
-
|
|
21
|
-
Codex is responsible for implementation submission and acceptance verification. The user only needs to approve destructive, credentialed, or external-write actions when required by local policy.
|
|
22
|
-
|
|
23
|
-
## Current Verified State
|
|
24
|
-
|
|
25
|
-
Checked from `D:\ai_agent\Reasonix\reasonix_program\PatchWarden` on 2026-07-09:
|
|
26
|
-
|
|
27
|
-
- Branch: `codex/patchwarden-v1.5.0`
|
|
28
|
-
- HEAD: `cc27e6a Add OSS application evidence materials`
|
|
29
|
-
- Worktree: dirty before this plan was added; preserve existing user changes.
|
|
30
|
-
- `package.json`: `patchwarden@1.5.1`
|
|
31
|
-
- GitHub Release latest: `v1.5.0`
|
|
32
|
-
- npm `patchwarden`: `version=1.5.0`, `dist-tags.latest=1.5.0`
|
|
33
|
-
- PR #24: open draft, CI passing, branch behind `main`
|
|
34
|
-
- Local gates run successfully:
|
|
35
|
-
- `npm.cmd run build`
|
|
36
|
-
- `npm.cmd run test:unit`
|
|
37
|
-
- `npm.cmd run doctor:ci`
|
|
38
|
-
- `npm.cmd run verify:package`
|
|
39
|
-
|
|
40
|
-
## P0: v1.5.1 Trusted Release
|
|
41
|
-
|
|
42
|
-
### Objective
|
|
43
|
-
|
|
44
|
-
Make `v1.5.1` a real published version, not just a local source version.
|
|
45
|
-
|
|
46
|
-
### Execution
|
|
47
|
-
|
|
48
|
-
```powershell
|
|
49
|
-
git status --short --branch
|
|
50
|
-
gh pr view 24 --repo jiezeng2004-design/PatchWarden --json number,title,state,isDraft,mergeStateStatus,headRefName,headRefOid,baseRefName,statusCheckRollup,url
|
|
51
|
-
npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
|
|
52
|
-
gh release view --repo jiezeng2004-design/PatchWarden --json tagName,name,isDraft,isPrerelease,publishedAt,url
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
If PR #24 is still behind `main`, update the branch without overwriting local work:
|
|
56
|
-
|
|
57
|
-
```powershell
|
|
58
|
-
git fetch origin main
|
|
59
|
-
git rebase origin/main
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
If `git fetch` fails with Windows credential errors, stop and repair Git credential/proxy state before retrying. Do not work around it by force-pushing or resetting.
|
|
63
|
-
|
|
64
|
-
After branch update:
|
|
65
|
-
|
|
66
|
-
```powershell
|
|
67
|
-
npm.cmd ci
|
|
68
|
-
npm.cmd run build
|
|
69
|
-
npm.cmd run test:unit
|
|
70
|
-
npm.cmd run test:mcp
|
|
71
|
-
npm.cmd run test:http-mcp
|
|
72
|
-
npm.cmd run doctor:ci
|
|
73
|
-
npm.cmd run verify:package
|
|
74
|
-
npm.cmd test
|
|
75
|
-
npm.cmd run pack:clean
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Submission
|
|
79
|
-
|
|
80
|
-
Codex owns:
|
|
81
|
-
|
|
82
|
-
- push updated branch
|
|
83
|
-
- mark PR #24 ready for review only after local gates pass
|
|
84
|
-
- monitor GitHub Actions
|
|
85
|
-
- merge only through PR when checks are green
|
|
86
|
-
- create tag and GitHub Release for `v1.5.1`
|
|
87
|
-
- publish npm package only after npm auth is confirmed without exposing tokens
|
|
88
|
-
|
|
89
|
-
### Acceptance
|
|
90
|
-
|
|
91
|
-
```powershell
|
|
92
|
-
gh pr view 24 --repo jiezeng2004-design/PatchWarden --json state,mergeStateStatus,statusCheckRollup
|
|
93
|
-
gh release view v1.5.1 --repo jiezeng2004-design/PatchWarden --json tagName,name,isDraft,isPrerelease,publishedAt,url
|
|
94
|
-
npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Pass criteria:
|
|
98
|
-
|
|
99
|
-
- PR merged.
|
|
100
|
-
- GitHub Release `v1.5.1` exists and is not draft.
|
|
101
|
-
- npm `version` is `1.5.1`.
|
|
102
|
-
- npm `dist-tags.latest` is `1.5.1`.
|
|
103
|
-
- release notes do not claim anything not verified by CI/GitHub/npm.
|
|
104
|
-
|
|
105
|
-
## P1: Evidence Pack v2
|
|
106
|
-
|
|
107
|
-
### Objective
|
|
108
|
-
|
|
109
|
-
Make Evidence Pack the project signature capability: bounded human summary plus structured machine-readable evidence.
|
|
110
|
-
|
|
111
|
-
### Current Gap
|
|
112
|
-
|
|
113
|
-
Current export writes:
|
|
114
|
-
|
|
115
|
-
- `.patchwarden/evidence-packs/<lineage_id>/evidence.json`
|
|
116
|
-
- `.patchwarden/evidence-packs/<lineage_id>/EVIDENCE.md`
|
|
117
|
-
|
|
118
|
-
The roadmap asks for richer named artifacts:
|
|
119
|
-
|
|
120
|
-
- `risk.json`
|
|
121
|
-
- `verify.json`
|
|
122
|
-
- `diffstat.json`
|
|
123
|
-
- `lineage.json`
|
|
124
|
-
- `attestation.json`
|
|
125
|
-
- `redactions.json`
|
|
126
|
-
|
|
127
|
-
This is feasible as an incremental schema upgrade, not a rewrite.
|
|
128
|
-
|
|
129
|
-
### Execution
|
|
130
|
-
|
|
131
|
-
Primary files:
|
|
132
|
-
|
|
133
|
-
- `src/tools/evidencePack.ts`
|
|
134
|
-
- `src/tools/taskLineage.ts`
|
|
135
|
-
- `src/tools/registry.ts`
|
|
136
|
-
- `src/tools/toolRegistry.ts`
|
|
137
|
-
- `src/test/unit/evidence-pack.test.ts` or existing v1.5 evidence tests
|
|
138
|
-
- `docs/evidence-pack-schema.md`
|
|
139
|
-
- `docs/lineage-evidence-pack-workflow.md`
|
|
140
|
-
|
|
141
|
-
Implementation rules:
|
|
142
|
-
|
|
143
|
-
- Keep exports bounded.
|
|
144
|
-
- Do not include full stdout, stderr, full diff, secrets, `.env`, tokens, cookies, browser state, or credential paths.
|
|
145
|
-
- Store redaction metadata as categories and reasons, not raw hidden values.
|
|
146
|
-
- Include PatchWarden version, commit, package version, Node version, OS, tool profile, and schema epoch in attestation.
|
|
147
|
-
|
|
148
|
-
### Acceptance
|
|
149
|
-
|
|
150
|
-
```powershell
|
|
151
|
-
npm.cmd run build
|
|
152
|
-
npm.cmd run test:unit
|
|
153
|
-
npm.cmd run doctor:ci
|
|
154
|
-
npm.cmd run verify:package
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
Additional manual acceptance:
|
|
158
|
-
|
|
159
|
-
- Run or reuse a `run_task_loop` lineage.
|
|
160
|
-
- Export Evidence Pack.
|
|
161
|
-
- Confirm all v2 files exist.
|
|
162
|
-
- Confirm `EVIDENCE.md` is readable and bounded.
|
|
163
|
-
- Confirm `redactions.json` does not contain raw secrets.
|
|
164
|
-
- Confirm no `.patchwarden/evidence-packs` output is included in npm package.
|
|
165
|
-
|
|
166
|
-
## P1: README And Docs Readiness
|
|
167
|
-
|
|
168
|
-
### Objective
|
|
169
|
-
|
|
170
|
-
Make the repository understandable to external users before sending traffic from external PRs.
|
|
171
|
-
|
|
172
|
-
### Execution
|
|
173
|
-
|
|
174
|
-
Add or align these docs:
|
|
175
|
-
|
|
176
|
-
- `docs/why-patchwarden.md`
|
|
177
|
-
- `docs/evidence-pack-schema.md`
|
|
178
|
-
- `docs/spec-kit-integration.md`
|
|
179
|
-
- `docs/agentseal-integration.md`
|
|
180
|
-
- `docs/mcp-inspector-testing.md`
|
|
181
|
-
- `docs/opencode-worker.md`
|
|
182
|
-
- `docs/openhands-worker.md`
|
|
183
|
-
- `docs/threat-model.md` already exists; update instead of duplicating.
|
|
184
|
-
|
|
185
|
-
README front page should preserve these sections:
|
|
186
|
-
|
|
187
|
-
1. one-line positioning
|
|
188
|
-
2. architecture diagram
|
|
189
|
-
3. why PatchWarden is not a remote shell
|
|
190
|
-
4. five-minute demo
|
|
191
|
-
5. Evidence Pack screenshot or text sample
|
|
192
|
-
6. supported agents
|
|
193
|
-
7. safety boundaries
|
|
194
|
-
8. ecosystem adaptation
|
|
195
|
-
|
|
196
|
-
### Acceptance
|
|
197
|
-
|
|
198
|
-
```powershell
|
|
199
|
-
npm.cmd run build
|
|
200
|
-
npm.cmd run check:brand
|
|
201
|
-
npm.cmd run doctor:ci
|
|
202
|
-
npm.cmd run verify:package
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
Pass criteria:
|
|
206
|
-
|
|
207
|
-
- README does not say `v1.5.1` is published until npm and GitHub confirm it.
|
|
208
|
-
- Docs explain safety boundaries before external integrations.
|
|
209
|
-
- Examples use placeholders for published versions unless release truth exists.
|
|
210
|
-
|
|
211
|
-
## P2: External PR Batch 1
|
|
212
|
-
|
|
213
|
-
### 1. MCP Inspector
|
|
214
|
-
|
|
215
|
-
Why first: it is directly relevant, low-risk, and the upstream project is a testing tool for MCP servers.
|
|
216
|
-
|
|
217
|
-
PR shape:
|
|
218
|
-
|
|
219
|
-
- `docs: add CLI smoke testing example for MCP servers`
|
|
220
|
-
- Generic first; PatchWarden only as one example if appropriate.
|
|
221
|
-
|
|
222
|
-
Execution:
|
|
223
|
-
|
|
224
|
-
```powershell
|
|
225
|
-
git clone https://github.com/modelcontextprotocol/inspector.git
|
|
226
|
-
cd inspector
|
|
227
|
-
git checkout -b docs/cli-smoke-testing-example
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
Codex then inspects upstream contribution rules, edits docs only, runs upstream docs/lint/test commands, pushes fork branch, opens PR, and monitors CI.
|
|
231
|
-
|
|
232
|
-
Acceptance:
|
|
233
|
-
|
|
234
|
-
- Upstream tests or docs checks pass.
|
|
235
|
-
- PR avoids promotional wording.
|
|
236
|
-
- PR can stand alone without PatchWarden.
|
|
237
|
-
|
|
238
|
-
### 2. AgentSeal
|
|
239
|
-
|
|
240
|
-
Why second: AgentSeal scans dangerous agent skills and MCP configs, which matches PatchWarden policy/config detection.
|
|
241
|
-
|
|
242
|
-
PR shape:
|
|
243
|
-
|
|
244
|
-
- `feat: detect PatchWarden MCP configs and project policies`
|
|
245
|
-
- or `docs: add guarded local agent execution pattern` if code detector scope is too broad.
|
|
246
|
-
|
|
247
|
-
Execution:
|
|
248
|
-
|
|
249
|
-
```powershell
|
|
250
|
-
git clone https://github.com/getagentseal/agentseal.git
|
|
251
|
-
cd agentseal
|
|
252
|
-
git checkout -b detect/patchwarden-policy
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
Codex then inspects `CONTRIBUTING.md`, existing probes, and tests before choosing code or docs scope.
|
|
256
|
-
|
|
257
|
-
Acceptance:
|
|
258
|
-
|
|
259
|
-
- Detector recognizes `.patchwarden/config.json` and `project-policy.json` without reading secrets.
|
|
260
|
-
- Tests cover positive and negative fixtures.
|
|
261
|
-
- PR describes a general safety pattern, not just PatchWarden marketing.
|
|
262
|
-
|
|
263
|
-
### 3. PatchWarden Compatibility Docs
|
|
264
|
-
|
|
265
|
-
Why third: after first two external drafts, PatchWarden should document how to reproduce those workflows.
|
|
266
|
-
|
|
267
|
-
Execution:
|
|
268
|
-
|
|
269
|
-
```powershell
|
|
270
|
-
npm.cmd run build
|
|
271
|
-
npm.cmd run doctor:ci
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
Add:
|
|
275
|
-
|
|
276
|
-
- `docs/mcp-inspector-testing.md`
|
|
277
|
-
- `docs/agentseal-integration.md`
|
|
278
|
-
|
|
279
|
-
Acceptance:
|
|
280
|
-
|
|
281
|
-
- Commands are runnable on Windows PowerShell.
|
|
282
|
-
- Docs link to real upstream PRs or issues after submission.
|
|
283
|
-
|
|
284
|
-
## P2: External PR Batch 2
|
|
285
|
-
|
|
286
|
-
### Spec Kit
|
|
287
|
-
|
|
288
|
-
Why after Evidence Pack v2: Spec Kit is a strong fit, but PatchWarden needs a stable evidence schema before proposing integration.
|
|
289
|
-
|
|
290
|
-
PR shape:
|
|
291
|
-
|
|
292
|
-
- `docs: add evidence pack pattern for spec-driven development`
|
|
293
|
-
- or `walkthrough: verify implemented tasks with an external MCP safety layer`
|
|
294
|
-
|
|
295
|
-
Execution:
|
|
296
|
-
|
|
297
|
-
```powershell
|
|
298
|
-
git clone https://github.com/github/spec-kit.git
|
|
299
|
-
cd spec-kit
|
|
300
|
-
git checkout -b docs/evidence-verification-pattern
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
Acceptance:
|
|
304
|
-
|
|
305
|
-
- PR maps spec -> tasks -> implementation -> evidence verification.
|
|
306
|
-
- PatchWarden appears only as an example implementation.
|
|
307
|
-
- Upstream docs checks pass.
|
|
308
|
-
|
|
309
|
-
## P3: External PR Batch 3
|
|
310
|
-
|
|
311
|
-
### OpenCode / OpenHands / Aider
|
|
312
|
-
|
|
313
|
-
These are feasible but should not be first:
|
|
314
|
-
|
|
315
|
-
- OpenCode has high traffic and a large repo; start with docs-only external supervisor pattern.
|
|
316
|
-
- OpenHands is transitioning source ownership; inspect current repo structure before choosing target.
|
|
317
|
-
- Aider is mature CLI tooling; a safe wrapper pattern is useful but should follow a published PatchWarden example.
|
|
318
|
-
|
|
319
|
-
Acceptance for each:
|
|
320
|
-
|
|
321
|
-
- Upstream contribution rules inspected.
|
|
322
|
-
- PR is useful without requiring PatchWarden.
|
|
323
|
-
- CI or documented local checks pass.
|
|
324
|
-
- PatchWarden README links back only after PR exists.
|
|
325
|
-
|
|
326
|
-
## Issue Backlog To Create
|
|
327
|
-
|
|
328
|
-
Create these as GitHub issues after P0 release truth is clean:
|
|
329
|
-
|
|
330
|
-
1. `fix: close v1.5.1 release truth gap`
|
|
331
|
-
2. `feat: add Evidence Pack v2 artifact schema`
|
|
332
|
-
3. `docs: add Evidence Pack v2 schema reference`
|
|
333
|
-
4. `feat: export goal final report`
|
|
334
|
-
5. `feat: import Spec Kit tasks into Goal Session`
|
|
335
|
-
6. `docs: add MCP Inspector CLI smoke testing guide`
|
|
336
|
-
7. `docs: add AgentSeal compatibility guide`
|
|
337
|
-
8. `docs: add OpenCode worker integration guide`
|
|
338
|
-
9. `docs: add OpenHands worker integration guide`
|
|
339
|
-
10. `docs: add external PR roadmap and ecosystem compatibility matrix`
|
|
340
|
-
|
|
341
|
-
## Global Acceptance Rules
|
|
342
|
-
|
|
343
|
-
For every internal PatchWarden PR:
|
|
344
|
-
|
|
345
|
-
```powershell
|
|
346
|
-
npm.cmd run build
|
|
347
|
-
npm.cmd run test:unit
|
|
348
|
-
npm.cmd run test:mcp
|
|
349
|
-
npm.cmd run test:http-mcp
|
|
350
|
-
npm.cmd run doctor:ci
|
|
351
|
-
npm.cmd run verify:package
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
Before release:
|
|
355
|
-
|
|
356
|
-
```powershell
|
|
357
|
-
npm.cmd ci
|
|
358
|
-
npm.cmd test
|
|
359
|
-
npm.cmd run pack:clean
|
|
360
|
-
gh pr checks <PR_NUMBER> --repo jiezeng2004-design/PatchWarden --watch
|
|
361
|
-
gh release view v<version> --repo jiezeng2004-design/PatchWarden --json tagName,isDraft,publishedAt,url
|
|
362
|
-
npm.cmd view patchwarden version dist-tags --json --cache "$env:TEMP\patchwarden-npm-cache"
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
Never mark release work complete unless GitHub Release and npm registry truth both match the intended version.
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import { strict as assert } from "node:assert";
|
|
3
|
-
import {
|
|
4
|
-
evaluateAcceptance,
|
|
5
|
-
verdictToStatus,
|
|
6
|
-
type AcceptanceEvidence,
|
|
7
|
-
} from "../../goal/acceptanceEngine.js";
|
|
8
|
-
import { renderAcceptanceMarkdown } from "../../goal/acceptanceTemplate.js";
|
|
9
|
-
|
|
10
|
-
// ── Helpers ───────────────────────────────────────────────────────
|
|
11
|
-
|
|
12
|
-
function makeEvidence(overrides: Partial<AcceptanceEvidence> = {}): AcceptanceEvidence {
|
|
13
|
-
return {
|
|
14
|
-
task_id: "task_test_001",
|
|
15
|
-
task_status: "done_by_agent",
|
|
16
|
-
result_md_exists: true,
|
|
17
|
-
result_json_exists: true,
|
|
18
|
-
verify_json_exists: true,
|
|
19
|
-
test_log_exists: true,
|
|
20
|
-
git_diff_exists: true,
|
|
21
|
-
verify_status: "passed",
|
|
22
|
-
new_out_of_scope_changes: [],
|
|
23
|
-
goal: null,
|
|
24
|
-
scope: null,
|
|
25
|
-
forbidden: null,
|
|
26
|
-
verification: null,
|
|
27
|
-
done_evidence: null,
|
|
28
|
-
artifact_status: "collected",
|
|
29
|
-
release_claims_unverified: false,
|
|
30
|
-
checks: [
|
|
31
|
-
{ name: "task_status", result: "pass", detail: "Task status is done_by_agent." },
|
|
32
|
-
{ name: "result_md_exists", result: "pass", detail: "result.md found." },
|
|
33
|
-
{ name: "verify_status", result: "pass", detail: "Verification passed." },
|
|
34
|
-
],
|
|
35
|
-
...overrides,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ── Tests ─────────────────────────────────────────────────────────
|
|
40
|
-
|
|
41
|
-
describe("acceptanceEngine", () => {
|
|
42
|
-
|
|
43
|
-
describe("evaluateAcceptance — 基础场景", () => {
|
|
44
|
-
|
|
45
|
-
it("所有检查通过 → ACCEPTED", () => {
|
|
46
|
-
const evidence = makeEvidence();
|
|
47
|
-
const result = evaluateAcceptance(evidence);
|
|
48
|
-
assert.equal(result.verdict, "ACCEPTED");
|
|
49
|
-
assert.equal(result.acceptance_status, "accepted");
|
|
50
|
-
assert.equal(result.fail_checks.length, 0);
|
|
51
|
-
assert.equal(result.warn_checks.length, 0);
|
|
52
|
-
assert.ok(result.reason.includes("All acceptance checks passed"));
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("存在 fail 级检查项 → REJECTED", () => {
|
|
56
|
-
const evidence = makeEvidence({
|
|
57
|
-
checks: [
|
|
58
|
-
{ name: "task_status", result: "pass", detail: "ok" },
|
|
59
|
-
{ name: "result_md_exists", result: "fail", detail: "result.md is missing." },
|
|
60
|
-
{ name: "verify_status", result: "pass", detail: "ok" },
|
|
61
|
-
],
|
|
62
|
-
});
|
|
63
|
-
const result = evaluateAcceptance(evidence);
|
|
64
|
-
assert.equal(result.verdict, "REJECTED");
|
|
65
|
-
assert.equal(result.acceptance_status, "rejected");
|
|
66
|
-
assert.equal(result.fail_checks.length, 1);
|
|
67
|
-
assert.equal(result.fail_checks[0].name, "result_md_exists");
|
|
68
|
-
assert.ok(result.reason.includes("fail-level"));
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it("存在 warn 级检查项(无 fail)→ NEEDS_FIX", () => {
|
|
72
|
-
const evidence = makeEvidence({
|
|
73
|
-
checks: [
|
|
74
|
-
{ name: "task_status", result: "pass", detail: "ok" },
|
|
75
|
-
{ name: "git_diff_exists", result: "warn", detail: "git.diff is missing." },
|
|
76
|
-
{ name: "test_log_exists", result: "warn", detail: "test.log is missing." },
|
|
77
|
-
],
|
|
78
|
-
});
|
|
79
|
-
const result = evaluateAcceptance(evidence);
|
|
80
|
-
assert.equal(result.verdict, "NEEDS_FIX");
|
|
81
|
-
assert.equal(result.acceptance_status, "needs_fix");
|
|
82
|
-
assert.equal(result.warn_checks.length, 2);
|
|
83
|
-
assert.ok(result.reason.includes("warn-level"));
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("存在 release claims 但无法验证 → BLOCKED_BY_APPROVAL(即使有 warn)", () => {
|
|
87
|
-
const evidence = makeEvidence({
|
|
88
|
-
release_claims_unverified: true,
|
|
89
|
-
checks: [
|
|
90
|
-
{ name: "task_status", result: "pass", detail: "ok" },
|
|
91
|
-
{ name: "release_claims_unverified", result: "warn", detail: "Found release claims." },
|
|
92
|
-
],
|
|
93
|
-
});
|
|
94
|
-
const result = evaluateAcceptance(evidence);
|
|
95
|
-
assert.equal(result.verdict, "BLOCKED_BY_APPROVAL");
|
|
96
|
-
assert.equal(result.acceptance_status, "blocked");
|
|
97
|
-
assert.ok(result.reason.includes("Release claims"));
|
|
98
|
-
assert.ok(result.required_evidence.some((e) => e.includes("Verify remote")));
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it("fail 级检查项优先于 release claims", () => {
|
|
102
|
-
const evidence = makeEvidence({
|
|
103
|
-
release_claims_unverified: true,
|
|
104
|
-
checks: [
|
|
105
|
-
{ name: "task_status", result: "fail", detail: "Task failed." },
|
|
106
|
-
{ name: "release_claims_unverified", result: "warn", detail: "Found release claims." },
|
|
107
|
-
],
|
|
108
|
-
});
|
|
109
|
-
const result = evaluateAcceptance(evidence);
|
|
110
|
-
assert.equal(result.verdict, "REJECTED");
|
|
111
|
-
assert.equal(result.acceptance_status, "rejected");
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it("多个 fail 级检查项全部收集", () => {
|
|
115
|
-
const evidence = makeEvidence({
|
|
116
|
-
checks: [
|
|
117
|
-
{ name: "result_md_exists", result: "fail", detail: "missing" },
|
|
118
|
-
{ name: "verify_status", result: "fail", detail: "failed" },
|
|
119
|
-
{ name: "scope_changes", result: "fail", detail: "out of scope" },
|
|
120
|
-
],
|
|
121
|
-
});
|
|
122
|
-
const result = evaluateAcceptance(evidence);
|
|
123
|
-
assert.equal(result.verdict, "REJECTED");
|
|
124
|
-
assert.equal(result.fail_checks.length, 3);
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
describe("verdictToStatus", () => {
|
|
129
|
-
it("ACCEPTED → accepted", () => {
|
|
130
|
-
assert.equal(verdictToStatus("ACCEPTED"), "accepted");
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it("REJECTED → rejected", () => {
|
|
134
|
-
assert.equal(verdictToStatus("REJECTED"), "rejected");
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it("NEEDS_FIX → needs_fix", () => {
|
|
138
|
-
assert.equal(verdictToStatus("NEEDS_FIX"), "needs_fix");
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it("BLOCKED_BY_APPROVAL → blocked", () => {
|
|
142
|
-
assert.equal(verdictToStatus("BLOCKED_BY_APPROVAL"), "blocked");
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
describe("evaluateAcceptance — next_suggested_task", () => {
|
|
147
|
-
it("ACCEPTED 的 next_suggested_task 包含 'accepted'", () => {
|
|
148
|
-
const result = evaluateAcceptance(makeEvidence());
|
|
149
|
-
assert.ok(result.next_suggested_task.includes("accepted"));
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it("REJECTED 的 next_suggested_task 包含 fail 检查名", () => {
|
|
153
|
-
const result = evaluateAcceptance(makeEvidence({
|
|
154
|
-
checks: [{ name: "result_md_exists", result: "fail", detail: "missing" }],
|
|
155
|
-
}));
|
|
156
|
-
assert.ok(result.next_suggested_task.includes("result_md_exists"));
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it("NEEDS_FIX 的 next_suggested_task 包含 warn 检查名", () => {
|
|
160
|
-
const result = evaluateAcceptance(makeEvidence({
|
|
161
|
-
checks: [{ name: "git_diff_exists", result: "warn", detail: "missing" }],
|
|
162
|
-
}));
|
|
163
|
-
assert.ok(result.next_suggested_task.includes("git_diff_exists"));
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it("BLOCKED_BY_APPROVAL 的 next_suggested_task 包含 'verify'", () => {
|
|
167
|
-
const result = evaluateAcceptance(makeEvidence({ release_claims_unverified: true }));
|
|
168
|
-
assert.ok(result.next_suggested_task.toLowerCase().includes("verify"));
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
describe("evaluateAcceptance — reasons 可追溯", () => {
|
|
173
|
-
it("REJECTED 的 reasons 包含 [FAIL] 前缀", () => {
|
|
174
|
-
const result = evaluateAcceptance(makeEvidence({
|
|
175
|
-
checks: [{ name: "result_md_exists", result: "fail", detail: "missing" }],
|
|
176
|
-
}));
|
|
177
|
-
assert.ok(result.reasons.some((r) => r.includes("[FAIL]")));
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it("NEEDS_FIX 的 reasons 包含 [WARN] 前缀", () => {
|
|
181
|
-
const result = evaluateAcceptance(makeEvidence({
|
|
182
|
-
checks: [{ name: "git_diff_exists", result: "warn", detail: "missing" }],
|
|
183
|
-
}));
|
|
184
|
-
assert.ok(result.reasons.some((r) => r.includes("[WARN]")));
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it("BLOCKED_BY_APPROVAL 的 reasons 包含 [BLOCKED] 前缀", () => {
|
|
188
|
-
const result = evaluateAcceptance(makeEvidence({ release_claims_unverified: true }));
|
|
189
|
-
assert.ok(result.reasons.some((r) => r.includes("[BLOCKED]")));
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it("ACCEPTED 的 reasons 非空", () => {
|
|
193
|
-
const result = evaluateAcceptance(makeEvidence());
|
|
194
|
-
assert.ok(result.reasons.length > 0);
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
describe("renderAcceptanceMarkdown", () => {
|
|
199
|
-
it("生成包含 verdict 的 ACCEPTANCE.md 内容", () => {
|
|
200
|
-
const evidence = makeEvidence();
|
|
201
|
-
const result = evaluateAcceptance(evidence);
|
|
202
|
-
const md = renderAcceptanceMarkdown("task_test_001", result, evidence);
|
|
203
|
-
assert.ok(md.includes("# Acceptance Report — task_test_001"));
|
|
204
|
-
assert.ok(md.includes("**ACCEPTED**"));
|
|
205
|
-
assert.ok(md.includes("## Evidence Summary"));
|
|
206
|
-
assert.ok(md.includes("## Verdict"));
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it("REJECTED 的 Markdown 包含 fail 检查", () => {
|
|
210
|
-
const evidence = makeEvidence({
|
|
211
|
-
checks: [{ name: "result_md_exists", result: "fail", detail: "missing" }],
|
|
212
|
-
});
|
|
213
|
-
const result = evaluateAcceptance(evidence);
|
|
214
|
-
const md = renderAcceptanceMarkdown("task_test_002", result, evidence);
|
|
215
|
-
assert.ok(md.includes("**REJECTED**"));
|
|
216
|
-
assert.ok(md.includes("## Fail-Level Checks"));
|
|
217
|
-
assert.ok(md.includes("result_md_exists"));
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it("NEEDS_FIX 的 Markdown 包含 warn 检查", () => {
|
|
221
|
-
const evidence = makeEvidence({
|
|
222
|
-
checks: [{ name: "git_diff_exists", result: "warn", detail: "missing" }],
|
|
223
|
-
});
|
|
224
|
-
const result = evaluateAcceptance(evidence);
|
|
225
|
-
const md = renderAcceptanceMarkdown("task_test_003", result, evidence);
|
|
226
|
-
assert.ok(md.includes("**NEEDS_FIX**"));
|
|
227
|
-
assert.ok(md.includes("## Warn-Level Checks"));
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it("BLOCKED 的 Markdown 包含 required_evidence", () => {
|
|
231
|
-
const evidence = makeEvidence({ release_claims_unverified: true });
|
|
232
|
-
const result = evaluateAcceptance(evidence);
|
|
233
|
-
const md = renderAcceptanceMarkdown("task_test_004", result, evidence);
|
|
234
|
-
assert.ok(md.includes("**BLOCKED_BY_APPROVAL**"));
|
|
235
|
-
assert.ok(md.includes("## Required Evidence"));
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it("有 goal/scope 时显示 Task Acceptance Criteria", () => {
|
|
239
|
-
const evidence = makeEvidence({
|
|
240
|
-
goal: "Implement feature X",
|
|
241
|
-
scope: ["src/feature.ts"],
|
|
242
|
-
forbidden: [".env"],
|
|
243
|
-
verification: ["npm test"],
|
|
244
|
-
done_evidence: ["result.md", "test.log"],
|
|
245
|
-
});
|
|
246
|
-
const result = evaluateAcceptance(evidence);
|
|
247
|
-
const md = renderAcceptanceMarkdown("task_test_005", result, evidence);
|
|
248
|
-
assert.ok(md.includes("## Task Acceptance Criteria"));
|
|
249
|
-
assert.ok(md.includes("Implement feature X"));
|
|
250
|
-
assert.ok(md.includes("src/feature.ts"));
|
|
251
|
-
assert.ok(md.includes(".env"));
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
it("无 goal/scope 时不显示 Task Acceptance Criteria section", () => {
|
|
255
|
-
const evidence = makeEvidence();
|
|
256
|
-
const result = evaluateAcceptance(evidence);
|
|
257
|
-
const md = renderAcceptanceMarkdown("task_test_006", result, evidence);
|
|
258
|
-
assert.ok(!md.includes("## Task Acceptance Criteria"));
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
});
|