@khoavu882/doflow 2.0.0-beta.3 → 2.0.0-beta.5
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/bin/doflow.js +2 -2
- package/core/.antigravity-plugin/plugin.json +0 -1
- package/core/.claude-plugin/plugin.json +1 -1
- package/core/.codex-plugin/plugin.json +1 -1
- package/core/.plugin/plugin.json +1 -1
- package/core/harnesses/claude/hooks/mcp-tool-guard.sh +7 -17
- package/core/harnesses/claude/hooks/pre-bash-guard.sh +7 -17
- package/core/harnesses/claude/hooks/pre-implement-gate.sh +7 -18
- package/core/harnesses/claude/hooks/session-start.sh +5 -3
- package/core/harnesses/claude/hooks/stop-check.sh +5 -3
- package/core/harnesses/claude/hooks/subagent-audit.sh +5 -5
- package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -3
- package/core/harnesses/codex/hooks/mcp-tool-guard.sh +7 -15
- package/core/harnesses/codex/hooks/pre-bash-guard.sh +7 -15
- package/core/harnesses/codex/hooks/pre-implement-gate.sh +7 -16
- package/core/harnesses/codex/hooks/session-start.sh +5 -3
- package/core/harnesses/codex/hooks/stop-check.sh +6 -5
- package/core/harnesses/codex/hooks/subagent-audit.sh +17 -6
- package/core/harnesses/codex/hooks/user-prompt-submit.sh +5 -4
- package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +7 -18
- package/core/harnesses/gemini/hooks/pre-bash-guard.sh +7 -18
- package/core/harnesses/gemini/hooks/pre-implement-gate.sh +7 -19
- package/core/harnesses/gemini/hooks/session-start.sh +5 -3
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +20 -5
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +20 -5
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +20 -5
- package/core/harnesses/kiro/hooks/session-start.sh +11 -5
- package/core/harnesses/kiro/hooks/stop-check.sh +21 -30
- package/core/harnesses/pi/extensions/doflow-guard.js +159 -0
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +27 -11
- package/core/harnesses/shared/hooks/adapters/antigravity.js +14 -57
- package/core/harnesses/shared/hooks/bridge/bridge.sh +184 -0
- package/core/harnesses/shared/hooks/bridge/envelope.jq +60 -0
- package/core/harnesses/shared/hooks/bridge/respond.sh +62 -0
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +4 -2
- package/core/harnesses/shared/hooks/policies/contract.sh +75 -0
- package/core/harnesses/shared/hooks/policies/deny-json.sh +39 -4
- package/core/harnesses/shared/hooks/policies/lib.sh +4 -2
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +46 -34
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +75 -25
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +67 -73
- package/core/harnesses/shared/hooks/policies/session-context.sh +37 -7
- package/core/harnesses/shared/hooks/policies/stop-check.sh +42 -15
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +35 -5
- package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +40 -7
- package/core/harnesses/shared/hooks/stream-hook-runner.js +69 -181
- package/core/registry/assets.json +19 -0
- package/core/registry/contracts.json +2 -2
- package/core/registry/harnesses.json +196 -10
- package/core/registry/lifecycle.json +2626 -7
- package/core/registry/storage.json +110 -83
- package/core/registry/verification.json +1 -1
- package/core/shared/scripts/doflow/bash/render-puml.sh +2 -2
- package/core/shared/scripts/doflow/bin/doflow-run +10 -6
- package/core/shared/skills/do-design/SKILL.md +6 -6
- package/core/shared/skills/do-execute-plan/SKILL.md +11 -10
- package/core/shared/skills/do-execute-plan/references/readiness_gate.md +2 -0
- package/core/shared/skills/do-execute-plan/references/scaffold.md +2 -2
- package/core/shared/skills/do-implement/SKILL.md +3 -2
- package/core/shared/skills/do-plan/SKILL.md +7 -8
- package/package.json +4 -2
- package/src/adapters/antigravity/{index.ts → index.js} +141 -105
- package/src/adapters/claude/{index.ts → index.js} +63 -49
- package/src/adapters/claude/{mcp.ts → mcp.js} +16 -16
- package/src/adapters/codex/{agents.ts → agents.js} +24 -24
- package/src/adapters/codex/{config.ts → config.js} +49 -49
- package/src/adapters/codex/{hooks.ts → hooks.js} +62 -27
- package/src/adapters/codex/{index.ts → index.js} +148 -105
- package/src/adapters/codex/{mcp.ts → mcp.js} +38 -38
- package/src/adapters/codex/{native-projection.ts → native-projection.js} +5 -5
- package/src/adapters/copilot/{index.ts → index.js} +42 -42
- package/src/adapters/{copy-tree.ts → copy-tree.js} +74 -74
- package/src/adapters/gemini/{hooks.ts → hooks.js} +78 -37
- package/src/adapters/gemini/{index.ts → index.js} +96 -57
- package/src/adapters/{hook-commands.ts → hook-commands.js} +8 -8
- package/src/adapters/{index.ts → index.js} +13 -13
- package/src/adapters/kiro/{index.ts → index.js} +49 -35
- package/src/adapters/{mcp-entries.ts → mcp-entries.js} +55 -55
- package/src/adapters/opencode/{index.ts → index.js} +52 -52
- package/src/adapters/pi/hooks.js +119 -0
- package/src/adapters/pi/{index.ts → index.js} +64 -39
- package/src/adapters/pi/{json-members.ts → json-members.js} +23 -23
- package/src/adapters/pi/{mcp.ts → mcp.js} +70 -70
- package/src/adapters/{resolve-source.ts → resolve-source.js} +1 -1
- package/src/cli/commands/{install.ts → install.js} +25 -25
- package/src/cli/commands/{list-backups.ts → list-backups.js} +4 -4
- package/src/cli/commands/{reconcile.ts → reconcile.js} +19 -19
- package/src/cli/commands/{remove.ts → remove.js} +10 -10
- package/src/cli/commands/{rollback.ts → rollback.js} +17 -17
- package/src/cli/commands/{self-update.ts → self-update.js} +3 -3
- package/src/cli/commands/{status.ts → status.js} +24 -24
- package/src/cli/commands/{tools.ts → tools.js} +16 -16
- package/src/cli/commands/{update.ts → update.js} +20 -20
- package/src/cli/{index.ts → index.js} +43 -31
- package/src/cli/{runtime-commands.ts → runtime-commands.js} +97 -58
- package/src/cli/{shared.ts → shared.js} +40 -40
- package/src/helper/{bash-helper.ts → bash-helper.js} +7 -7
- package/src/helper/{git.ts → git.js} +2 -2
- package/src/helper/{guardrails.ts → guardrails.js} +10 -10
- package/src/helper/{harness-paths.ts → harness-paths.js} +24 -24
- package/src/helper/{marker-merge.ts → marker-merge.js} +4 -4
- package/src/helper/{prompt.ts → prompt.js} +5 -5
- package/src/helper/{repo-root.ts → repo-root.js} +2 -2
- package/src/helper/{settings-merge.ts → settings-merge.js} +27 -27
- package/src/helper/{settings-scope.ts → settings-scope.js} +3 -3
- package/src/helper/{toml.ts → toml.js} +48 -48
- package/src/install/{backup-set.ts → backup-set.js} +16 -16
- package/src/install/{backup.ts → backup.js} +65 -65
- package/src/install/{context.ts → context.js} +15 -15
- package/src/install/{manifest.ts → manifest.js} +27 -27
- package/src/install/{mcp.ts → mcp.js} +30 -30
- package/src/install/{paths.ts → paths.js} +15 -15
- package/src/install/{targets.ts → targets.js} +10 -10
- package/src/install/{tool-lifecycle.ts → tool-lifecycle.js} +20 -20
- package/src/lifecycle/{bash-availability.ts → bash-availability.js} +1 -1
- package/src/lifecycle/coverage.js +57 -0
- package/src/lifecycle/hook-step.js +61 -0
- package/src/lifecycle/{index.ts → index.js} +160 -146
- package/src/lifecycle/{mcp-index.ts → mcp-index.js} +1 -1
- package/src/lifecycle/{policies.ts → policies.js} +11 -11
- package/src/lifecycle/{view.ts → view.js} +28 -28
- package/src/registry/{index.ts → index.js} +195 -66
- package/src/release/build-package.js +91 -0
- package/src/release/changelog-section.js +70 -0
- package/src/release/{sync-plugin-versions.ts → sync-plugin-versions.js} +4 -4
- package/src/runtime/advice/{cli.ts → cli.js} +31 -31
- package/src/runtime/advice/{client.ts → client.js} +44 -44
- package/src/runtime/advice/{config.ts → config.js} +16 -16
- package/src/runtime/advice/{doctor.ts → doctor.js} +32 -32
- package/src/runtime/advice/{endpoint-guard.ts → endpoint-guard.js} +20 -20
- package/src/runtime/advice/{kinds.ts → kinds.js} +16 -16
- package/src/runtime/advice/providers/{ollama-systemone.ts → ollama-systemone.js} +21 -21
- package/src/runtime/advice/{record.ts → record.js} +19 -19
- package/src/runtime/advice/{registry.ts → registry.js} +16 -16
- package/src/runtime/advice/{strength.ts → strength.js} +7 -7
- package/src/runtime/{brief-tools.ts → brief-tools.js} +50 -50
- package/src/runtime/{c4-project.ts → c4-project.js} +27 -27
- package/src/runtime/candidate.js +505 -0
- package/src/runtime/{capability-router.ts → capability-router.js} +39 -39
- package/src/runtime/{checkouts.ts → checkouts.js} +21 -21
- package/src/runtime/{claims.ts → claims.js} +44 -35
- package/src/runtime/{cli-result.ts → cli-result.js} +15 -8
- package/src/runtime/{cli.ts → cli.js} +59 -292
- package/src/runtime/{command-detect.ts → command-detect.js} +47 -47
- package/src/runtime/context/budget.js +203 -0
- package/src/runtime/context/compose.js +1367 -0
- package/src/runtime/context/delivery-store.js +102 -0
- package/src/runtime/context/mandatory.js +594 -0
- package/src/runtime/context/pointer.js +142 -0
- package/src/runtime/context-pack.js +1277 -0
- package/src/runtime/{decision-register.ts → decision-register.js} +67 -67
- package/src/runtime/evidence-fields.js +39 -0
- package/src/runtime/{evidence-ledger.ts → evidence-ledger.js} +32 -25
- package/src/runtime/failure/{capture.ts → capture.js} +29 -29
- package/src/runtime/failure/{classifier.ts → classifier.js} +4 -4
- package/src/runtime/failure/{cli.ts → cli.js} +30 -30
- package/src/runtime/failure/{home.ts → home.js} +6 -6
- package/src/runtime/failure/{store.ts → store.js} +32 -32
- package/src/runtime/{feature-resolve.ts → feature-resolve.js} +6 -6
- package/src/runtime/{freshness.ts → freshness.js} +59 -22
- package/src/runtime/{health.ts → health.js} +72 -72
- package/src/runtime/{history-compactor.ts → history-compactor.js} +25 -25
- package/src/runtime/{implementation-gate.ts → implementation-gate.js} +30 -30
- package/src/runtime/inventory/{coverage.ts → coverage.js} +10 -10
- package/src/runtime/inventory/{identity.ts → identity.js} +2 -2
- package/src/runtime/inventory/{index.ts → index.js} +36 -36
- package/src/runtime/inventory/{precedence.ts → precedence.js} +2 -2
- package/src/runtime/inventory/{read-scopes.ts → read-scopes.js} +9 -9
- package/src/runtime/inventory/{siblings.ts → siblings.js} +15 -15
- package/src/runtime/knowledge/{chunker.ts → chunker.js} +12 -12
- package/src/runtime/knowledge/{hybrid.ts → hybrid.js} +17 -17
- package/src/runtime/knowledge/{index-store.ts → index-store.js} +23 -23
- package/src/runtime/knowledge/{retrieval.ts → retrieval.js} +27 -27
- package/src/runtime/{leak-scan.ts → leak-scan.js} +12 -12
- package/src/runtime/lifecycle/{cli.ts → cli.js} +32 -32
- package/src/runtime/lifecycle/{event-store.ts → event-store.js} +48 -48
- package/src/runtime/lifecycle/{fold.ts → fold.js} +41 -41
- package/src/runtime/lifecycle/{followup.ts → followup.js} +54 -54
- package/src/runtime/lifecycle/{goal.ts → goal.js} +50 -50
- package/src/runtime/lifecycle/{intent-writer.ts → intent-writer.js} +5 -5
- package/src/runtime/lifecycle/{overview.ts → overview.js} +47 -47
- package/src/runtime/lifecycle/{release.ts → release.js} +29 -29
- package/src/runtime/lifecycle/{report-store.ts → report-store.js} +25 -25
- package/src/runtime/lifecycle/{retention.ts → retention.js} +37 -37
- package/src/runtime/lifecycle/{root.ts → root.js} +9 -9
- package/src/runtime/lifecycle/{status.ts → status.js} +64 -64
- package/src/runtime/lifecycle/{store-upkeep.ts → store-upkeep.js} +46 -46
- package/src/runtime/{locator-resolve.ts → locator-resolve.js} +7 -7
- package/src/runtime/{mask.ts → mask.js} +22 -22
- package/src/runtime/{mcp-consultations.ts → mcp-consultations.js} +54 -54
- package/src/runtime/{mcp-reach.ts → mcp-reach.js} +24 -24
- package/src/runtime/{model-router.ts → model-router.js} +20 -20
- package/src/runtime/{outcome.ts → outcome.js} +27 -27
- package/src/runtime/{reach.ts → reach.js} +21 -21
- package/src/runtime/{readiness-record.ts → readiness-record.js} +12 -12
- package/src/runtime/{readiness.ts → readiness.js} +113 -43
- package/src/runtime/{recovery.ts → recovery.js} +15 -15
- package/src/runtime/{research-request.ts → research-request.js} +34 -34
- package/src/runtime/{retrieval-plan.ts → retrieval-plan.js} +453 -104
- package/src/runtime/retrieval-record.js +223 -0
- package/src/runtime/scaffold/{artifacts.ts → artifacts.js} +22 -19
- package/src/runtime/scaffold/{fingerprint.ts → fingerprint.js} +3 -3
- package/src/runtime/scaffold/{generate.ts → generate.js} +109 -109
- package/src/runtime/scaffold/{languages.ts → languages.js} +34 -34
- package/src/runtime/source-version.js +289 -0
- package/src/runtime/storage/{cli.ts → cli.js} +9 -9
- package/src/runtime/storage/{engine.ts → engine.js} +37 -37
- package/src/runtime/storage/{registry.ts → registry.js} +19 -19
- package/src/runtime/storage/{roots.ts → roots.js} +8 -8
- package/src/runtime/storage/{rules.ts → rules.js} +26 -26
- package/src/runtime/storage/{upkeep.ts → upkeep.js} +35 -35
- package/src/runtime/storage/{work-status.ts → work-status.js} +39 -39
- package/src/runtime/{task-attempts.ts → task-attempts.js} +62 -62
- package/src/runtime/{task-classifier.ts → task-classifier.js} +34 -34
- package/src/runtime/{task-scope.ts → task-scope.js} +40 -15
- package/src/runtime/{task-state.ts → task-state.js} +86 -21
- package/src/runtime/trace/{indicators.ts → indicators.js} +22 -22
- package/src/runtime/trace/{ledger.ts → ledger.js} +42 -42
- package/src/runtime/trace/{render.ts → render.js} +7 -7
- package/src/runtime/trace/{views.ts → views.js} +40 -40
- package/src/runtime/verification/{contract-runner.ts → contract-runner.js} +23 -23
- package/src/runtime/verification/{engine.ts → engine.js} +143 -143
- package/src/runtime/verification/{registry.ts → registry.js} +6 -6
- package/src/runtime/verification/{scope-bound.ts → scope-bound.js} +50 -50
- package/src/runtime/verification/{test-selection.ts → test-selection.js} +28 -28
- package/src/runtime/{workflow-engine.ts → workflow-engine.js} +50 -50
- package/src/runtime/{workflow-orchestrator.ts → workflow-orchestrator.js} +91 -91
- package/src/runtime/{worktree.ts → worktree.js} +31 -31
- package/src/state/{index.ts → index.js} +26 -26
- package/src/state/{lockfile.ts → lockfile.js} +20 -20
- package/src/state/{run-lock.ts → run-lock.js} +44 -44
- package/core/.antigravity-plugin/hooks.json +0 -39
- package/core/harnesses/shared/hooks/adapters/arg-fields.js +0 -19
- package/core/harnesses/shared/hooks/adapters/gemini.js +0 -114
- package/core/harnesses/shared/hooks/hooks.json +0 -47
- package/src/runtime/context-pack.ts +0 -492
|
@@ -46,7 +46,7 @@ const TIMEOUT_EXIT_CODE = 124;
|
|
|
46
46
|
* @param {*} value
|
|
47
47
|
* @returns {string}
|
|
48
48
|
*/
|
|
49
|
-
function truncate(value
|
|
49
|
+
function truncate(value ) {
|
|
50
50
|
if (typeof value !== 'string') return '';
|
|
51
51
|
if (value.length <= MAX_STREAM_CHARS) return value;
|
|
52
52
|
// Keep the TAIL, not the head, and say so.
|
|
@@ -77,8 +77,8 @@ const TAP_NOT_OK = /^\s*not ok\b(?:\s+\d+)?(?:\s*-\s*)?(.*)$/gm;
|
|
|
77
77
|
* @param {string} text
|
|
78
78
|
* @returns {Array<string>} unique identifiers, bounded by MAX_FAILED_TESTS
|
|
79
79
|
*/
|
|
80
|
-
function extractFailedTests(text
|
|
81
|
-
const seen = new Set
|
|
80
|
+
function extractFailedTests(text ) {
|
|
81
|
+
const seen = new Set ();
|
|
82
82
|
for (const match of text.matchAll(TAP_NOT_OK)) {
|
|
83
83
|
const name = match[1].trim();
|
|
84
84
|
if (name === '' || /#\s*(?:SKIP|TODO)\b/i.test(name)) continue;
|
|
@@ -89,12 +89,12 @@ function extractFailedTests(text: string): string[] {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
class VerificationContractRunner {
|
|
92
|
-
cwd
|
|
93
|
-
defaultTimeoutMs
|
|
94
|
-
exec
|
|
95
|
-
fsImpl
|
|
96
|
-
logDir
|
|
97
|
-
logWriteWarned
|
|
92
|
+
cwd ;
|
|
93
|
+
defaultTimeoutMs ;
|
|
94
|
+
exec ;
|
|
95
|
+
fsImpl ;
|
|
96
|
+
logDir ;
|
|
97
|
+
logWriteWarned ;
|
|
98
98
|
|
|
99
99
|
/**
|
|
100
100
|
* @param {Object|string} [options] a string is accepted for parity with the Python's positional
|
|
@@ -103,7 +103,7 @@ class VerificationContractRunner {
|
|
|
103
103
|
* @param {number} [options.defaultTimeoutMs=60000]
|
|
104
104
|
* @param {Function} [options.exec] injection seam for tests; same contract as `spawnSync`
|
|
105
105
|
*/
|
|
106
|
-
constructor(options
|
|
106
|
+
constructor(options = {}) {
|
|
107
107
|
const opts = typeof options === 'string' ? { cwd: options } : options;
|
|
108
108
|
this.cwd = opts.cwd || process.cwd();
|
|
109
109
|
this.defaultTimeoutMs = opts.defaultTimeoutMs || DEFAULT_TIMEOUT_MS;
|
|
@@ -123,7 +123,7 @@ class VerificationContractRunner {
|
|
|
123
123
|
* @param {string} stderr
|
|
124
124
|
* @returns {string|null} the log path, or null when the log could not be written
|
|
125
125
|
*/
|
|
126
|
-
persistLog(name
|
|
126
|
+
persistLog(name , command , stdout , stderr ) {
|
|
127
127
|
try {
|
|
128
128
|
this.fsImpl.mkdirSync(this.logDir, { recursive: true });
|
|
129
129
|
const safe = name.replace(/[^A-Za-z0-9._-]+/g, '_');
|
|
@@ -132,7 +132,7 @@ class VerificationContractRunner {
|
|
|
132
132
|
`# check: ${name}\n# command: ${command}\n--- stdout ---\n${stdout || ''}\n--- stderr ---\n${stderr || ''}\n`,
|
|
133
133
|
'utf8');
|
|
134
134
|
return file;
|
|
135
|
-
} catch (error
|
|
135
|
+
} catch (error ) {
|
|
136
136
|
// An unwritable log directory must not turn a completed check into an error — the check's
|
|
137
137
|
// verdict stands; only the pointer is missing, and its null says so. But a chronic
|
|
138
138
|
// permissions problem should not be invisible either: say so once per runner, on stderr so
|
|
@@ -154,7 +154,7 @@ class VerificationContractRunner {
|
|
|
154
154
|
* @param {string} [stdout]
|
|
155
155
|
* @param {string} [stderr]
|
|
156
156
|
*/
|
|
157
|
-
decorate(result
|
|
157
|
+
decorate(result , command , stdout , stderr ) {
|
|
158
158
|
const full = `${stdout || ''}\n${stderr || ''}`;
|
|
159
159
|
if (result.status === 'FAIL') {
|
|
160
160
|
const failedTests = extractFailedTests(full);
|
|
@@ -162,7 +162,7 @@ class VerificationContractRunner {
|
|
|
162
162
|
}
|
|
163
163
|
const truncated = (stdout || '').length > MAX_STREAM_CHARS || (stderr || '').length > MAX_STREAM_CHARS;
|
|
164
164
|
if ((result.status === 'FAIL' || truncated) && full.trim() !== '') {
|
|
165
|
-
result.logPath = this.persistLog(result.name, command, stdout
|
|
165
|
+
result.logPath = this.persistLog(result.name, command, stdout , stderr );
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
|
|
@@ -177,7 +177,7 @@ class VerificationContractRunner {
|
|
|
177
177
|
* evaluations — a recovery retry must observe live behaviour, so each pass passes a fresh map.
|
|
178
178
|
* @returns {Object} check result
|
|
179
179
|
*/
|
|
180
|
-
runCheck(name
|
|
180
|
+
runCheck(name , command , timeoutMs = this.defaultTimeoutMs, dedupeCache = null) {
|
|
181
181
|
const checkName = name || 'unnamed_check';
|
|
182
182
|
|
|
183
183
|
// Defect fix (1): the Python defaulted a missing command to `true`, so a typo in a contract
|
|
@@ -196,12 +196,12 @@ class VerificationContractRunner {
|
|
|
196
196
|
if (dedupeCache && dedupeCache.has(dedupeKey)) {
|
|
197
197
|
return { ...dedupeCache.get(dedupeKey), name: checkName, deduplicated: true };
|
|
198
198
|
}
|
|
199
|
-
const remember = (result
|
|
199
|
+
const remember = (result ) => {
|
|
200
200
|
if (dedupeCache) dedupeCache.set(dedupeKey, result);
|
|
201
201
|
return result;
|
|
202
202
|
};
|
|
203
203
|
|
|
204
|
-
let res
|
|
204
|
+
let res ;
|
|
205
205
|
try {
|
|
206
206
|
res = this.exec(command, {
|
|
207
207
|
shell: true,
|
|
@@ -214,7 +214,7 @@ class VerificationContractRunner {
|
|
|
214
214
|
// past anything a check legitimately prints. Only the first 2,000 chars are ever kept.
|
|
215
215
|
maxBuffer: 64 * 1024 * 1024,
|
|
216
216
|
});
|
|
217
|
-
} catch (error
|
|
217
|
+
} catch (error ) {
|
|
218
218
|
// Mirrors the Python's bare `except Exception` arm: an unspawnable command is a FAIL, not a
|
|
219
219
|
// thrown error that aborts the whole contract.
|
|
220
220
|
return remember({
|
|
@@ -263,7 +263,7 @@ class VerificationContractRunner {
|
|
|
263
263
|
const exitCode = res.status === null || res.status === undefined ? 1 : res.status;
|
|
264
264
|
const passed = res.status === 0;
|
|
265
265
|
|
|
266
|
-
const result
|
|
266
|
+
const result = {
|
|
267
267
|
name: checkName,
|
|
268
268
|
command,
|
|
269
269
|
status: passed ? 'PASS' : 'FAIL',
|
|
@@ -283,7 +283,7 @@ class VerificationContractRunner {
|
|
|
283
283
|
* @param {Array<{name?: string, command?: string, timeoutMs?: number}>} checks
|
|
284
284
|
* @returns {{ status: string, checks: Array<Object>, failedChecks: Array<string>, timestamp: string, reason?: string }}
|
|
285
285
|
*/
|
|
286
|
-
evaluateContract(checks
|
|
286
|
+
evaluateContract(checks ) {
|
|
287
287
|
if (!Array.isArray(checks)) {
|
|
288
288
|
throw new Error('evaluateContract expects an array of checks');
|
|
289
289
|
}
|
|
@@ -303,10 +303,10 @@ class VerificationContractRunner {
|
|
|
303
303
|
};
|
|
304
304
|
}
|
|
305
305
|
|
|
306
|
-
const results
|
|
307
|
-
const failedChecks
|
|
306
|
+
const results = [];
|
|
307
|
+
const failedChecks = [];
|
|
308
308
|
let overallStatus = 'PASS';
|
|
309
|
-
const dedupeCache = new Map
|
|
309
|
+
const dedupeCache = new Map (); // one evaluation, one cache — a retry pass starts fresh
|
|
310
310
|
|
|
311
311
|
for (const chk of checks) {
|
|
312
312
|
const name = (chk && chk.name) || 'unnamed_check';
|