@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
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
//
|
|
16
16
|
// Only SELECTED servers are imported, so the cost is proportional to what is installed: a
|
|
17
17
|
// one-server install pays for one doc, and an install with none produces no file at all.
|
|
18
|
-
function renderMcpIndex(selectedServers
|
|
18
|
+
function renderMcpIndex(selectedServers ) {
|
|
19
19
|
if (!selectedServers || selectedServers.length === 0) return null;
|
|
20
20
|
const lines = ['# MCP short flags — this install'];
|
|
21
21
|
for (const server of selectedServers) {
|
|
@@ -5,30 +5,30 @@
|
|
|
5
5
|
// Registry lifecycle policies are logical intent. This projection reports what a
|
|
6
6
|
// harness may render and any human prerequisite; native event serialization stays
|
|
7
7
|
// in the owning harness adapter.
|
|
8
|
-
const { harnessFor } = require('../registry/index.
|
|
8
|
+
const { harnessFor } = require('../registry/index.js');
|
|
9
9
|
|
|
10
10
|
const POLICY_STATUSES = new Set(['supported', 'different', 'unavailable', 'prerequisite']);
|
|
11
11
|
|
|
12
|
-
function unique(values
|
|
12
|
+
function unique(values ) { return [...new Set(values.filter(Boolean))]; }
|
|
13
13
|
|
|
14
|
-
function policyFor(registry
|
|
15
|
-
const policy = registry?.lifecycle?.find((item
|
|
14
|
+
function policyFor(registry , id ) {
|
|
15
|
+
const policy = registry?.lifecycle?.find((item ) => item.id === id);
|
|
16
16
|
if (!policy) throw new Error(`Unknown lifecycle policy '${id}'`);
|
|
17
17
|
return policy;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
function renderPolicy(policy
|
|
20
|
+
function renderPolicy(policy , harness ) {
|
|
21
21
|
const mapping = policy?.mappings?.[harness.id];
|
|
22
22
|
if (!mapping) throw new Error(`Lifecycle policy '${policy.id}' has no mapping for '${harness.id}'`);
|
|
23
|
-
const requiredCapabilities = (policy.requires || []).map((capability
|
|
23
|
+
const requiredCapabilities = (policy.requires || []).map((capability ) => {
|
|
24
24
|
const declaration = harness.capabilities?.[capability];
|
|
25
25
|
if (!declaration) throw new Error(`Lifecycle policy '${policy.id}' requires unknown '${harness.id}' capability '${capability}'`);
|
|
26
26
|
return [capability, declaration];
|
|
27
27
|
});
|
|
28
|
-
const unavailableCapability = requiredCapabilities.find(([, declaration]
|
|
28
|
+
const unavailableCapability = requiredCapabilities.find(([, declaration] ) => declaration.status === 'unavailable');
|
|
29
29
|
const prerequisites = unique([
|
|
30
30
|
...(mapping.prerequisites || []),
|
|
31
|
-
...requiredCapabilities.flatMap(([, declaration]
|
|
31
|
+
...requiredCapabilities.flatMap(([, declaration] ) => declaration.prerequisites || []),
|
|
32
32
|
]);
|
|
33
33
|
const capabilityStatus = unavailableCapability ? 'unavailable' : mapping.status;
|
|
34
34
|
const unavailable = capabilityStatus === 'unavailable';
|
|
@@ -60,14 +60,14 @@ function renderPolicy(policy: any, harness: any): any {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/** Render policy status data for one harness without calling an adapter or writing state. */
|
|
63
|
-
function renderPolicies(registry
|
|
63
|
+
function renderPolicies(registry , { harness: harnessId, policyIds } = {}) {
|
|
64
64
|
if (!harnessId) throw new Error('A harness id is required to render lifecycle policies');
|
|
65
65
|
const harness = harnessFor(registry, harnessId);
|
|
66
66
|
const policies = policyIds === undefined || policyIds === null
|
|
67
67
|
? registry.lifecycle
|
|
68
|
-
: policyIds.map((id
|
|
68
|
+
: policyIds.map((id ) => policyFor(registry, id));
|
|
69
69
|
if (!Array.isArray(policies)) throw new Error('Lifecycle policies must be an array');
|
|
70
|
-
return Object.freeze(policies.map((policy
|
|
70
|
+
return Object.freeze(policies.map((policy ) => renderPolicy(policy, harness)));
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
module.exports = { POLICY_STATUSES, policyFor, renderPolicy, renderPolicies };
|
|
@@ -8,21 +8,21 @@
|
|
|
8
8
|
const fs = require('node:fs');
|
|
9
9
|
const os = require('node:os');
|
|
10
10
|
const path = require('node:path');
|
|
11
|
-
const { parseToml } = require('../helper/toml.
|
|
12
|
-
const { createAdapterRegistry } = require('../adapters/index.
|
|
13
|
-
const { declaredHarnessPaths } = require('../helper/harness-paths.
|
|
14
|
-
const claudeAdapter = require('../adapters/claude/index.
|
|
15
|
-
const codexAdapter = require('../adapters/codex/index.
|
|
16
|
-
const { createGeminiAdapter } = require('../adapters/gemini/index.
|
|
17
|
-
const { createOpenCodeAdapter } = require('../adapters/opencode/index.
|
|
18
|
-
const { createPiAdapter } = require('../adapters/pi/index.
|
|
19
|
-
const { createCopilotAdapter } = require('../adapters/copilot/index.
|
|
20
|
-
const { createKiroAdapter } = require('../adapters/kiro/index.
|
|
21
|
-
const { createAntigravityAdapter } = require('../adapters/antigravity/index.
|
|
22
|
-
const { planLifecycle } = require('./index.
|
|
23
|
-
const { stateRoot, readLedger, defaultLedger } = require('../state/index.
|
|
24
|
-
const { selectAssets } = require('../registry/index.
|
|
25
|
-
const { defaultLock, readLock, writeLock, diffLocks, removeLock, pinnedSelections } = require('../state/lockfile.
|
|
11
|
+
const { parseToml } = require('../helper/toml.js');
|
|
12
|
+
const { createAdapterRegistry } = require('../adapters/index.js');
|
|
13
|
+
const { declaredHarnessPaths } = require('../helper/harness-paths.js');
|
|
14
|
+
const claudeAdapter = require('../adapters/claude/index.js');
|
|
15
|
+
const codexAdapter = require('../adapters/codex/index.js');
|
|
16
|
+
const { createGeminiAdapter } = require('../adapters/gemini/index.js');
|
|
17
|
+
const { createOpenCodeAdapter } = require('../adapters/opencode/index.js');
|
|
18
|
+
const { createPiAdapter } = require('../adapters/pi/index.js');
|
|
19
|
+
const { createCopilotAdapter } = require('../adapters/copilot/index.js');
|
|
20
|
+
const { createKiroAdapter } = require('../adapters/kiro/index.js');
|
|
21
|
+
const { createAntigravityAdapter } = require('../adapters/antigravity/index.js');
|
|
22
|
+
const { planLifecycle } = require('./index.js');
|
|
23
|
+
const { stateRoot, readLedger, defaultLedger } = require('../state/index.js');
|
|
24
|
+
const { selectAssets } = require('../registry/index.js');
|
|
25
|
+
const { defaultLock, readLock, writeLock, diffLocks, removeLock, pinnedSelections } = require('../state/lockfile.js');
|
|
26
26
|
// Tolerant because the projected runtime under `.doflow/runtime/` ships bin/, src/ and
|
|
27
27
|
// core/registry/ but no package.json — see the `runtime.*` assets in core/registry/assets.json.
|
|
28
28
|
// A hard require here would make every Node-backed verb fail in an install, which is the exact
|
|
@@ -32,9 +32,9 @@ function loadPkg() {
|
|
|
32
32
|
}
|
|
33
33
|
const pkg = loadPkg();
|
|
34
34
|
|
|
35
|
-
function codexScope(scope
|
|
35
|
+
function codexScope(scope ) { return scope.global ? 'global' : 'project'; }
|
|
36
36
|
|
|
37
|
-
function codexConfigResources(repoRoot
|
|
37
|
+
function codexConfigResources(repoRoot , fsImpl ) {
|
|
38
38
|
const configSrc = path.join(repoRoot, 'core', 'harnesses', 'codex', 'config', 'config.toml');
|
|
39
39
|
const parsed = parseToml(fsImpl.readFileSync(configSrc, 'utf8'));
|
|
40
40
|
return [...parsed.entries.entries()].map(([identity, entry]) => ({
|
|
@@ -48,7 +48,7 @@ function codexConfigResources(repoRoot: any, fsImpl: any) {
|
|
|
48
48
|
* mutation path until every native adapter has CLI-level parity.
|
|
49
49
|
* `registry` is loaded once per command (by the caller) and threaded through here rather than
|
|
50
50
|
* reloaded — the same registry also resolves every harness's MCP selection for that command. */
|
|
51
|
-
function registryLifecycleView({ registry, scope, targets, mcpSelections = {}, mcpAdoptable = {}, retainedMcpIds = [], operation, repoRoot, force = false, adopt = false, permissions = false, statusline = false, fsImpl = fs }
|
|
51
|
+
function registryLifecycleView({ registry, scope, targets, mcpSelections = {}, mcpAdoptable = {}, retainedMcpIds = [], operation, repoRoot, force = false, adopt = false, permissions = false, statusline = false, fsImpl = fs } ) {
|
|
52
52
|
const lifecycleScope = codexScope(scope);
|
|
53
53
|
const scopeRoot = scope.global ? os.homedir() : path.resolve(scope.projectRoot);
|
|
54
54
|
const neutralStateRoot = stateRoot({ scope: lifecycleScope, projectRoot: scopeRoot, homeDir: scopeRoot });
|
|
@@ -79,11 +79,11 @@ function registryLifecycleView({ registry, scope, targets, mcpSelections = {}, m
|
|
|
79
79
|
return { registry, stateRoot: neutralStateRoot, ledger, plan, adapters };
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
function printRegistryLifecycle(view
|
|
82
|
+
function printRegistryLifecycle(view , prefix = '[PLAN]') {
|
|
83
83
|
console.log(`${prefix} Registry lifecycle: ${view.plan.changes.length} native change(s), ${view.plan.conflicts.length} conflict(s), ${view.plan.prerequisites.length} prerequisite(s)`);
|
|
84
84
|
for (const target of view.plan.targets) {
|
|
85
85
|
console.log(`${prefix} ${target.harness}: ${target.changes.length} change(s)${target.conflicts.length ? `; conflicts: ${target.conflicts.join('; ')}` : ''}`);
|
|
86
|
-
const hookChange = target.changes.find((change
|
|
86
|
+
const hookChange = target.changes.find((change ) => change.nativeComponent === 'hooks');
|
|
87
87
|
if (hookChange?.nativePlan?.trust?.required) {
|
|
88
88
|
console.log(`${prefix} ${target.harness} hooks trust: ${hookChange.nativePlan.trust.status} (review required in ${target.harness})`);
|
|
89
89
|
}
|
|
@@ -94,7 +94,7 @@ function printRegistryLifecycle(view: any, prefix = '[PLAN]') {
|
|
|
94
94
|
|
|
95
95
|
/** Prints the plan's notices after a real run. Independent of whether anything changed: a no-op
|
|
96
96
|
* reinstall of a harness that has a gap must still say so. */
|
|
97
|
-
function printPlanNotices(view
|
|
97
|
+
function printPlanNotices(view ) {
|
|
98
98
|
for (const { harness, notice } of view.plan.notices) console.log(`[INFO] ${harness}: ${notice}`);
|
|
99
99
|
}
|
|
100
100
|
|
|
@@ -103,7 +103,7 @@ function printPlanNotices(view: any) {
|
|
|
103
103
|
* src/targets.js — so a future non-lifecycle target doesn't silently gain lifecycle behavior. */
|
|
104
104
|
const LIFECYCLE_HARNESSES = ['claude', 'codex', 'gemini', 'opencode', 'pi', 'copilot', 'kiro', 'antigravity'];
|
|
105
105
|
|
|
106
|
-
function assertSafeRegistryPlan(view
|
|
106
|
+
function assertSafeRegistryPlan(view ) {
|
|
107
107
|
if (view.plan.safe) return;
|
|
108
108
|
for (const conflict of view.plan.conflicts) console.error(`[ERROR] ${conflict.harness} lifecycle refused: ${conflict.reason}`);
|
|
109
109
|
for (const prerequisite of view.plan.prerequisites) console.error(`[ERROR] ${prerequisite.harness} lifecycle prerequisite: ${prerequisite.prerequisite}`);
|
|
@@ -119,9 +119,9 @@ function assertSafeRegistryPlan(view: any) {
|
|
|
119
119
|
* selections carry over for pinned harnesses and are replaced by the rows this run resolved, `[]`
|
|
120
120
|
* included. Assets are recomputed from the registry for every pinned harness. `null` when no harness
|
|
121
121
|
* stays pinned. */
|
|
122
|
-
function lockDocument({ registry, scope, scopeRoot, previous = null, ledger, plannedTargets = [], mcpSelections = {}, sourceVersion = pkg.version, now = new Date() }
|
|
123
|
-
const held = new Set((ledger?.resources ?? []).map((resource
|
|
124
|
-
const pinned = [...new Set([...(previous?.targets ?? []).map((entry
|
|
122
|
+
function lockDocument({ registry, scope, scopeRoot, previous = null, ledger, plannedTargets = [], mcpSelections = {}, sourceVersion = pkg.version, now = new Date() } ) {
|
|
123
|
+
const held = new Set((ledger?.resources ?? []).map((resource ) => resource?.harness));
|
|
124
|
+
const pinned = [...new Set([...(previous?.targets ?? []).map((entry ) => entry.harness), ...plannedTargets])]
|
|
125
125
|
.filter((harness) => held.has(harness)).sort();
|
|
126
126
|
if (!pinned.length) return null;
|
|
127
127
|
const assets = [];
|
|
@@ -145,13 +145,13 @@ function lockDocument({ registry, scope, scopeRoot, previous = null, ledger, pla
|
|
|
145
145
|
/** Describe the reviewable delta between the pinned lock and the next one: "created" for a first
|
|
146
146
|
* pin, "unchanged" when nothing pinned differs, "cleared" when nothing remains pinned, else a count
|
|
147
147
|
* of the changed rows. */
|
|
148
|
-
function lockDelta(previous
|
|
148
|
+
function lockDelta(previous , next ) {
|
|
149
149
|
if (!next) return previous ? { changed: true, summary: 'cleared' } : { changed: false, summary: 'unchanged' };
|
|
150
150
|
if (!previous) return { changed: true, summary: 'created' };
|
|
151
151
|
const diff = diffLocks(previous, next);
|
|
152
152
|
if (diff.clean) return { changed: false, summary: 'unchanged' };
|
|
153
153
|
const count = ['targets', 'assets']
|
|
154
|
-
.flatMap((section) => Object.values
|
|
154
|
+
.flatMap((section) => Object.values (diff[section]).map((list ) => list.length))
|
|
155
155
|
.reduce((sum, n) => sum + n, 0)
|
|
156
156
|
+ diff.mcpSelections.changed.length + (diff.meta.sourceVersion ? 1 : 0);
|
|
157
157
|
return { changed: true, summary: `${count} change(s)` };
|
|
@@ -160,7 +160,7 @@ function lockDelta(previous: any, next: any) {
|
|
|
160
160
|
/** Persist the lock for a completed command and return its delta against what was pinned before.
|
|
161
161
|
* An unchanged lock is left byte for byte, so routine re-runs neither rewrite the file nor
|
|
162
162
|
* manufacture noise; a `null` lock removes the file. */
|
|
163
|
-
function recordLock(scopeArgs
|
|
163
|
+
function recordLock(scopeArgs , next , { fsImpl = fs } = {}) {
|
|
164
164
|
const delta = lockDelta(readLock(scopeArgs, { fsImpl }), next);
|
|
165
165
|
if (delta.changed) {
|
|
166
166
|
if (next) writeLock(scopeArgs, next, { fsImpl });
|