@khoavu882/doflow 2.0.0-beta.4 → 2.0.0
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/README.md +12 -11
- package/bin/doflow.js +21 -11
- package/core/.antigravity-plugin/plugin.json +1 -3
- 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/lib.sh +43 -24
- package/core/harnesses/claude/hooks/mcp-tool-guard.sh +7 -17
- package/core/harnesses/claude/hooks/permission-audit.sh +3 -0
- package/core/harnesses/claude/hooks/post-compact.sh +35 -32
- package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
- package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
- package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
- package/core/harnesses/claude/hooks/pre-bash-guard.sh +7 -17
- package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
- package/core/harnesses/claude/hooks/pre-implement-gate.sh +7 -18
- package/core/harnesses/claude/hooks/session-end.sh +23 -10
- package/core/harnesses/claude/hooks/session-start.sh +5 -3
- package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
- 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/claude/settings/settings.json +18 -0
- package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
- package/core/harnesses/codex/agents/core-implementer.toml +1 -0
- package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
- package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
- package/core/harnesses/codex/agents/research-writer.toml +1 -1
- package/core/harnesses/codex/agents/reviewer.toml +10 -0
- package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
- package/core/harnesses/codex/agents/system-architect.toml +1 -1
- package/core/harnesses/codex/hooks/lib.sh +44 -25
- package/core/harnesses/codex/hooks/mcp-tool-guard.sh +7 -15
- package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
- package/core/harnesses/codex/hooks/pre-bash-guard.sh +7 -15
- package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
- package/core/harnesses/codex/hooks/pre-implement-gate.sh +7 -16
- package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
- 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 +18 -6
- package/core/harnesses/codex/hooks/user-prompt-submit.sh +5 -4
- package/core/harnesses/copilot/hooks/doflow-lib.sh +93 -0
- package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-pre-bash-guard.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow.json +57 -0
- package/core/harnesses/kiro/agents/doflow.json +1 -1
- package/core/harnesses/kiro/hooks/lib.sh +26 -6
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +21 -5
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +21 -5
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +21 -5
- package/core/harnesses/kiro/hooks/session-start.sh +12 -5
- package/core/harnesses/kiro/hooks/stop-check.sh +22 -30
- package/core/harnesses/pi/extensions/doflow-guard.js +167 -0
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +27 -12
- package/core/harnesses/shared/hooks/adapters/antigravity.js +14 -57
- package/core/harnesses/shared/hooks/bridge/bridge.sh +277 -0
- package/core/harnesses/shared/hooks/bridge/envelope.jq +129 -0
- package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
- package/core/harnesses/shared/hooks/bridge/respond.sh +70 -0
- package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +51 -16
- package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
- package/core/harnesses/shared/hooks/policies/contract.sh +78 -0
- package/core/harnesses/shared/hooks/policies/deny-json.sh +35 -9
- package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
- package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
- package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
- package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
- package/core/harnesses/shared/hooks/policies/lib.sh +65 -40
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +48 -35
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +284 -33
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +180 -110
- package/core/harnesses/shared/hooks/policies/session-context.sh +66 -7
- package/core/harnesses/shared/hooks/policies/stop-check.sh +61 -23
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +39 -6
- package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
- package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +97 -159
- package/core/harnesses/shared/hooks/stream-hook-runner.js +114 -187
- package/core/harnesses/shared/locator/doflow-run +2 -3
- package/core/registry/advice.json +3 -3
- package/core/registry/assets.json +72 -80
- package/core/registry/capabilities.json +12 -0
- package/core/registry/contracts.json +60 -33
- package/core/registry/contribution-points.json +32 -0
- package/core/registry/gates.json +32 -0
- package/core/registry/guidance-caps.json +40 -0
- package/core/registry/harnesses.json +1542 -277
- package/core/registry/lifecycle.json +2837 -37
- package/core/registry/mcp.json +5 -1
- package/core/registry/models.json +7 -1
- package/core/registry/package-templates/README.md +19 -0
- package/core/registry/package-templates/agent/files/agent.md +9 -0
- package/core/registry/package-templates/agent/template.json +4 -0
- package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
- package/core/registry/package-templates/capability-provider/template.json +11 -0
- package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
- package/core/registry/package-templates/debate-preset/template.json +4 -0
- package/core/registry/package-templates/review-preset/files/preset.json +30 -0
- package/core/registry/package-templates/review-preset/template.json +4 -0
- package/core/registry/package-templates/skill/files/SKILL.md +8 -0
- package/core/registry/package-templates/skill/template.json +4 -0
- package/core/registry/package-templates/worker/files/worker.json +92 -0
- package/core/registry/package-templates/worker/template.json +11 -0
- package/core/registry/packages/doflow/doflow-package.json +15 -0
- package/core/registry/packages/doflow/presets/debate-3.json +26 -0
- package/core/registry/protocols.json +61 -0
- package/core/registry/routes.json +17 -0
- package/core/registry/rules.json +431 -0
- package/core/registry/settings.json +276 -0
- package/core/registry/storage.json +701 -30
- package/core/registry/telemetry.json +236 -0
- package/core/registry/transcripts.json +142 -0
- package/core/registry/verification.json +76 -1
- package/core/registry/workflows.json +55 -0
- package/core/shared/agent-specs/core-implementer.md +3 -0
- package/core/shared/agent-specs/delivery-lead.md +68 -0
- package/core/shared/agent-specs/quality-guardian.md +5 -1
- package/core/shared/agent-specs/research-writer.md +10 -3
- package/core/shared/agent-specs/reviewer.md +53 -0
- package/core/shared/agent-specs/spec-analyst.md +5 -6
- package/core/shared/agent-specs/system-architect.md +5 -1
- package/core/shared/guidance/DOFLOW_CORE.md +1 -5
- package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
- package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
- package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
- package/core/shared/guidance/pointers/codex.md +1 -4
- package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
- package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
- package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
- package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
- package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
- package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
- package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
- package/core/shared/guidance/references/ORCHESTRATION.md +1 -2
- package/core/shared/guidance/rules/RULES.md +45 -0
- package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
- package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
- package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
- package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
- package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
- package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
- package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
- package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
- package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
- package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
- package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
- package/core/shared/scripts/doflow/bash/validate-artifacts.sh +48 -4
- package/core/shared/scripts/doflow/bin/doflow-run +154 -35
- package/core/shared/skills/do/SKILL.md +12 -10
- package/core/shared/skills/do/references/advice_calls.md +26 -0
- package/core/shared/skills/do/references/pm_routing.md +1 -2
- package/core/shared/skills/do/references/program_mode.md +31 -0
- package/core/shared/skills/do-brainstorm/SKILL.md +20 -74
- package/core/shared/skills/do-brainstorm/references/handoff_branches.md +35 -0
- package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
- package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
- package/core/shared/skills/do-code-review/SKILL.md +41 -144
- package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
- package/core/shared/skills/do-code-review/references/tools.md +90 -0
- package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
- package/core/shared/skills/do-design/SKILL.md +24 -23
- package/core/shared/skills/do-diagnose/SKILL.md +14 -4
- package/core/shared/skills/do-document/SKILL.md +11 -1
- package/core/shared/skills/do-document/references/deep_research.md +1 -2
- package/core/shared/skills/do-document/references/embedded-research.md +18 -6
- package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
- package/core/shared/skills/do-execute-plan/SKILL.md +17 -59
- package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
- package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
- package/core/shared/skills/do-execute-plan/references/readiness_gate.md +28 -1
- package/core/shared/skills/do-execute-plan/references/run_position.md +13 -1
- package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
- package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
- package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
- package/core/shared/skills/do-flow/SKILL.md +8 -9
- package/core/shared/skills/do-flow/references/task_classes.md +2 -2
- package/core/shared/skills/do-git/SKILL.md +4 -0
- package/core/shared/skills/do-implement/SKILL.md +7 -9
- package/core/shared/skills/do-plan/SKILL.md +29 -19
- package/core/shared/skills/do-test/SKILL.md +7 -4
- package/core/shared/templates/doflow/constitution-template.md +9 -3
- package/core/shared/templates/doflow/data-model-template.md +1 -1
- package/core/shared/templates/doflow/design-template.md +113 -16
- package/core/shared/templates/doflow/plan-template.md +11 -10
- package/core/shared/templates/doflow/question-log-template.md +14 -2
- package/core/shared/templates/doflow/requirement-template.md +1 -1
- package/core/worker-evidence/antigravity/checks.json +14 -0
- package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
- package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
- package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
- package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
- package/core/worker-evidence/codex/checks.json +38 -0
- package/package.json +10 -6
- package/src/adapters/antigravity/index.js +226 -113
- package/src/adapters/claude/index.js +39 -5
- package/src/adapters/codex/agents.js +25 -15
- package/src/adapters/codex/hooks.js +40 -5
- package/src/adapters/codex/index.js +100 -22
- package/src/adapters/codex/native-projection.js +6 -2
- package/src/adapters/copilot/index.js +58 -23
- package/src/adapters/copy-tree.js +294 -48
- package/src/adapters/guidance-manifest.js +71 -0
- package/src/adapters/guidance-pointer.js +19 -0
- package/src/adapters/hook-commands.js +6 -10
- package/src/adapters/index.js +1 -0
- package/src/adapters/kiro/index.js +38 -13
- package/src/adapters/opencode/index.js +8 -8
- package/src/adapters/pi/hooks.js +120 -0
- package/src/adapters/pi/index.js +48 -16
- package/src/adapters/resolve-source.js +26 -2
- package/src/cli/commands/install.js +3 -2
- package/src/cli/commands/reconcile.js +53 -9
- package/src/cli/commands/remove.js +2 -2
- package/src/cli/commands/rollback.js +6 -3
- package/src/cli/commands/self-update.js +18 -9
- package/src/cli/commands/status.js +21 -2
- package/src/cli/commands/ui.js +99 -0
- package/src/cli/commands/update.js +3 -2
- package/src/cli/index.js +338 -33
- package/src/cli/runtime-commands.js +243 -52
- package/src/cli/shared.js +0 -2
- package/src/helper/git.js +1 -1
- package/src/helper/guardrails.js +1 -1
- package/src/helper/marker-merge.js +31 -13
- package/src/helper/package-ids.js +37 -0
- package/src/helper/semver.js +94 -0
- package/src/install/backup.js +105 -15
- package/src/install/context.js +1 -1
- package/src/install/targets.js +31 -16
- package/src/lifecycle/coverage.js +74 -0
- package/src/lifecycle/hook-step.js +61 -0
- package/src/lifecycle/hook-tier.js +160 -0
- package/src/lifecycle/index.js +434 -86
- package/src/lifecycle/retired-harnesses.js +318 -0
- package/src/lifecycle/view.js +35 -15
- package/src/registry/index.js +686 -32
- package/src/registry/worker-ids.js +45 -0
- package/src/release/build-package.js +0 -3
- package/src/release/docs-blocks.js +492 -0
- package/src/release/preflight.js +425 -0
- package/src/release/rehearse.js +401 -0
- package/src/release/release-workflow.js +733 -0
- package/src/release/sync-plugin-versions.js +43 -7
- package/src/runtime/advice/bench-gate.js +25 -0
- package/src/runtime/advice/cli.js +59 -16
- package/src/runtime/advice/client.js +32 -9
- package/src/runtime/advice/config.js +98 -133
- package/src/runtime/advice/doctor.js +1 -1
- package/src/runtime/advice/elevation.js +97 -0
- package/src/runtime/advice/endpoint-guard.js +9 -3
- package/src/runtime/advice/mode.js +37 -0
- package/src/runtime/advice/record.js +18 -5
- package/src/runtime/advice/registry.js +4 -1
- package/src/runtime/advice/shadow-config.js +229 -0
- package/src/runtime/advice/shadow-dispatcher.js +276 -0
- package/src/runtime/brief-rules.js +81 -0
- package/src/runtime/brief-tools.js +111 -34
- package/src/runtime/candidate.js +514 -0
- package/src/runtime/capabilities/executor.js +450 -0
- package/src/runtime/capabilities/loopback.js +41 -0
- package/src/runtime/capabilities/sanitizer.js +88 -0
- package/src/runtime/capability-router.js +135 -3
- package/src/runtime/checkouts.js +73 -11
- package/src/runtime/claims.js +27 -12
- package/src/runtime/cli-result.js +11 -4
- package/src/runtime/cli.js +221 -277
- package/src/runtime/config-home.js +42 -0
- package/src/runtime/context/arbitrate.js +767 -0
- package/src/runtime/context/budget.js +203 -0
- package/src/runtime/context/compose.js +1367 -0
- package/src/runtime/context/delivery-store.js +100 -0
- package/src/runtime/context/emission-rules.js +118 -0
- package/src/runtime/context/identity.js +227 -0
- package/src/runtime/context/mandatory.js +594 -0
- package/src/runtime/context/pointer.js +142 -0
- package/src/runtime/context/primary-command.js +117 -0
- package/src/runtime/context/primary.js +344 -0
- package/src/runtime/context/summary-store.js +655 -0
- package/src/runtime/context-pack.js +1106 -245
- package/src/runtime/decision-register.js +13 -4
- package/src/runtime/dispatch/admission.js +392 -0
- package/src/runtime/dispatch/attempt-end.js +274 -0
- package/src/runtime/dispatch/command.js +628 -0
- package/src/runtime/dispatch/controls.js +904 -0
- package/src/runtime/dispatch/envelope.js +276 -0
- package/src/runtime/dispatch/grants.js +310 -0
- package/src/runtime/dispatch/integrate.js +617 -0
- package/src/runtime/dispatch/loop.js +1835 -0
- package/src/runtime/dispatch/store.js +352 -0
- package/src/runtime/dispatch/verify-run.js +201 -0
- package/src/runtime/evidence-fields.js +39 -0
- package/src/runtime/evidence-ledger.js +41 -7
- package/src/runtime/failure/capture.js +3 -1
- package/src/runtime/failure/cli.js +25 -9
- package/src/runtime/failure/home.js +57 -30
- package/src/runtime/failure/store.js +7 -2
- package/src/runtime/feature-pointer.js +174 -0
- package/src/runtime/feature-resolve.js +13 -2
- package/src/runtime/fleet/command.js +77 -0
- package/src/runtime/fleet/projects.js +178 -0
- package/src/runtime/fleet/tree.js +383 -0
- package/src/runtime/freshness.js +77 -10
- package/src/runtime/git-memo.js +46 -0
- package/src/runtime/guidance/ablation.js +427 -0
- package/src/runtime/health.js +565 -17
- package/src/runtime/history-compactor.js +13 -3
- package/src/runtime/implementation-gate.js +277 -22
- package/src/runtime/inventory/coverage.js +1 -1
- package/src/runtime/inventory/index.js +1 -1
- package/src/runtime/inventory/precedence.js +2 -2
- package/src/runtime/inventory/siblings.js +6 -4
- package/src/runtime/knowledge/code-corpus.js +277 -0
- package/src/runtime/knowledge/code-lexical.js +130 -0
- package/src/runtime/knowledge/code-retrieval.js +307 -0
- package/src/runtime/knowledge/code-validation.js +106 -0
- package/src/runtime/knowledge/gp3-gate.js +74 -0
- package/src/runtime/knowledge/graph-adapter.js +288 -0
- package/src/runtime/knowledge/graph-fallback.js +394 -0
- package/src/runtime/knowledge/hybrid.js +136 -8
- package/src/runtime/knowledge/retrieval.js +34 -1
- package/src/runtime/knowledge/rtk-compress.js +77 -0
- package/src/runtime/knowledge/semble-bridge.py +106 -0
- package/src/runtime/knowledge/semble-lifecycle.js +114 -0
- package/src/runtime/knowledge/semble-provider.js +365 -0
- package/src/runtime/lifecycle/cli.js +16 -6
- package/src/runtime/lifecycle/event-store.js +8 -6
- package/src/runtime/lifecycle/followup.js +6 -1
- package/src/runtime/lifecycle/overview.js +24 -1
- package/src/runtime/lifecycle/report-store.js +8 -10
- package/src/runtime/lifecycle/retention.js +95 -31
- package/src/runtime/lifecycle/root.js +9 -1
- package/src/runtime/lifecycle/status.js +34 -17
- package/src/runtime/lifecycle/store-upkeep.js +56 -7
- package/src/runtime/mask.js +134 -7
- package/src/runtime/mcp-consultations.js +40 -6
- package/src/runtime/model-router.js +79 -7
- package/src/runtime/models/catalogue.js +191 -0
- package/src/runtime/models/command.js +153 -0
- package/src/runtime/off-words.js +12 -0
- package/src/runtime/outcome.js +3 -3
- package/src/runtime/packages/command.js +1009 -0
- package/src/runtime/packages/contributions.js +116 -0
- package/src/runtime/packages/digest.js +132 -0
- package/src/runtime/packages/fetch.js +182 -0
- package/src/runtime/packages/grants.js +192 -0
- package/src/runtime/packages/index-file.js +134 -0
- package/src/runtime/packages/instruction.js +90 -0
- package/src/runtime/packages/manifest.js +331 -0
- package/src/runtime/packages/points.js +477 -0
- package/src/runtime/packages/programs.js +216 -0
- package/src/runtime/packages/scaffold.js +277 -0
- package/src/runtime/packages/source.js +90 -0
- package/src/runtime/packages/state.js +164 -0
- package/src/runtime/packages/store.js +449 -0
- package/src/runtime/packages/tar.js +106 -0
- package/src/runtime/packages/view.js +406 -0
- package/src/runtime/plan-check.js +59 -0
- package/src/runtime/plan-content.js +324 -0
- package/src/runtime/policy-init.js +118 -0
- package/src/runtime/profiles/doctor.js +96 -0
- package/src/runtime/profiles/resolve.js +244 -0
- package/src/runtime/profiles/rollback.js +254 -0
- package/src/runtime/profiles/sampler.js +41 -0
- package/src/runtime/readiness-record.js +16 -11
- package/src/runtime/readiness.js +127 -16
- package/src/runtime/research-request.js +50 -25
- package/src/runtime/retrieval-plan.js +402 -73
- package/src/runtime/retrieval-record.js +293 -0
- package/src/runtime/review/command.js +246 -0
- package/src/runtime/review/dominance.js +68 -0
- package/src/runtime/review/findings.js +434 -0
- package/src/runtime/review/identity.js +255 -0
- package/src/runtime/review/protocol-command.js +109 -0
- package/src/runtime/review/protocols.js +405 -0
- package/src/runtime/review/resolve-protocol.js +302 -0
- package/src/runtime/review/start.js +530 -0
- package/src/runtime/roadmap/facts.js +479 -0
- package/src/runtime/roadmap/gates.js +270 -0
- package/src/runtime/roadmap/loop.js +1636 -0
- package/src/runtime/roadmap/merge.js +381 -0
- package/src/runtime/roadmap/rows.js +1113 -0
- package/src/runtime/roadmap/seed.js +951 -0
- package/src/runtime/rules-report.js +336 -0
- package/src/runtime/scaffold/artifacts.js +63 -9
- package/src/runtime/scaffold/generate.js +21 -9
- package/src/runtime/settings/autopilot.js +106 -0
- package/src/runtime/settings/cli.js +280 -0
- package/src/runtime/settings/config-write.js +314 -0
- package/src/runtime/settings/files.js +271 -0
- package/src/runtime/settings/legacy.js +154 -0
- package/src/runtime/settings/lexical.js +56 -0
- package/src/runtime/settings/prepared-run.js +269 -0
- package/src/runtime/settings/project-layers.js +118 -0
- package/src/runtime/settings/refs.js +288 -0
- package/src/runtime/settings/registry.js +553 -0
- package/src/runtime/settings/resolve.js +713 -0
- package/src/runtime/settings/shared.js +37 -0
- package/src/runtime/settings/worker-billing.js +107 -0
- package/src/runtime/settings/write.js +269 -0
- package/src/runtime/slot-command.js +78 -0
- package/src/runtime/slots.js +671 -0
- package/src/runtime/source-version.js +290 -0
- package/src/runtime/state-root.js +217 -0
- package/src/runtime/storage/cli.js +12 -5
- package/src/runtime/storage/engine.js +9 -2
- package/src/runtime/storage/registry.js +14 -1
- package/src/runtime/storage/roots.js +66 -16
- package/src/runtime/storage/rules.js +82 -10
- package/src/runtime/storage/upkeep.js +10 -2
- package/src/runtime/storage/work-status.js +245 -26
- package/src/runtime/task-attempts.js +589 -69
- package/src/runtime/task-classifier.js +47 -11
- package/src/runtime/task-graph.js +373 -0
- package/src/runtime/task-run.js +778 -0
- package/src/runtime/task-scope.js +202 -56
- package/src/runtime/task-sources.js +147 -0
- package/src/runtime/task-state.js +440 -65
- package/src/runtime/team/admission.js +301 -0
- package/src/runtime/team/envelope.js +324 -0
- package/src/runtime/team/review-guard.js +156 -0
- package/src/runtime/trace/analyze.js +427 -0
- package/src/runtime/trace/baseline.js +770 -0
- package/src/runtime/trace/ledger.js +63 -140
- package/src/runtime/trace/otlp-export.js +568 -0
- package/src/runtime/trace/otlp-map.js +481 -0
- package/src/runtime/trace/spans.js +745 -0
- package/src/runtime/trace/telemetry.js +225 -0
- package/src/runtime/trace/views.js +1 -0
- package/src/runtime/transcripts/command.js +98 -0
- package/src/runtime/transcripts/cursor.js +326 -0
- package/src/runtime/transcripts/read.js +126 -0
- package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
- package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
- package/src/runtime/transcripts/readers/copilot-events.js +90 -0
- package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
- package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
- package/src/runtime/transcripts/registry.js +161 -0
- package/src/runtime/transcripts/stats.js +161 -0
- package/src/runtime/verification/check-key.js +628 -0
- package/src/runtime/verification/contract-runner.js +546 -11
- package/src/runtime/verification/engine.js +499 -9
- package/src/runtime/verification/impact.js +617 -0
- package/src/runtime/verification/inflight.js +205 -0
- package/src/runtime/verification/registry.js +176 -0
- package/src/runtime/verification/reuse.js +184 -0
- package/src/runtime/verification/telemetry-emit.js +254 -0
- package/src/runtime/verification/test-selection.js +67 -7
- package/src/runtime/worker/active.js +90 -0
- package/src/runtime/worker/cancel.js +222 -0
- package/src/runtime/worker/catalogue.js +122 -0
- package/src/runtime/worker/command.js +677 -0
- package/src/runtime/worker/evidence.js +288 -0
- package/src/runtime/worker/launch.js +288 -0
- package/src/runtime/worker/models.js +137 -0
- package/src/runtime/worker/parsers.js +218 -0
- package/src/runtime/worker/probes/index.js +706 -0
- package/src/runtime/worker/process-tree.js +415 -0
- package/src/runtime/worker/quota.js +43 -0
- package/src/runtime/worker/readiness.js +713 -0
- package/src/runtime/worker/run-store.js +166 -0
- package/src/runtime/worker/supervisor.js +541 -0
- package/src/runtime/worker/worktree-check.js +252 -0
- package/src/runtime/workflow-engine.js +5 -1
- package/src/runtime/workflow-orchestrator.js +578 -63
- package/src/runtime/worktree.js +149 -22
- package/src/state/index.js +1 -1
- package/src/state/lockfile.js +64 -10
- package/src/state/run-lock.js +1 -1
- package/types/node-commonjs.d.ts +106 -7
- package/core/.antigravity-plugin/hooks.json +0 -39
- package/core/harnesses/gemini/hooks/hooks.json +0 -77
- package/core/harnesses/gemini/hooks/lib.sh +0 -302
- package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -21
- package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
- package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -21
- package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
- package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -22
- package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
- package/core/harnesses/gemini/hooks/session-end.sh +0 -5
- package/core/harnesses/gemini/hooks/session-start.sh +0 -5
- package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
- 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/core/shared/guidance/FLAGS.md +0 -25
- package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
- package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
- package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
- package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
- package/src/adapters/gemini/hooks.js +0 -210
- package/src/adapters/gemini/index.js +0 -390
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The named references a settings key may point at (086 IC-001, DD-1): the one place the settings
|
|
7
|
+
* registry reaches into another registry for a value it must not copy. `valuesRef` names a list of
|
|
8
|
+
* allowed values, `orderRef` names that list ranked narrowest first, `defaultRef` names a default.
|
|
9
|
+
* There is no other per-key code here; a key that needs another reference adds a function below and
|
|
10
|
+
* a row to `REF_META`.
|
|
11
|
+
*
|
|
12
|
+
* advice.providerIds core/registry/advice.json providers[].id
|
|
13
|
+
* advice.providerDefaultEndpoint core/registry/advice.json providers[id = advice.provider].defaultEndpoint
|
|
14
|
+
* storage.lifecycleEventsDefaultHours core/registry/storage.json stores[lifecycle-events].bound.defaultHours
|
|
15
|
+
* models.tierIds core/registry/models.json dispatchTiers.tiers
|
|
16
|
+
* protocols.reviewPresetIds core/registry/protocols.json 'auto', then order.review, then the review
|
|
17
|
+
* presets active packages contribute (122 IC-014)
|
|
18
|
+
* protocols.reviewPresetOrder core/registry/protocols.json order.review with 'auto' right after the
|
|
19
|
+
* preset of depth 'deep'; never a contributed id
|
|
20
|
+
* protocols.debatePresetIds core/registry/protocols.json order.debate, then the contributed debate presets
|
|
21
|
+
* protocols.lensIds core/registry/protocols.json lenses[].id
|
|
22
|
+
* harnesses.primaryIds 'unknown', then core/registry/harnesses.json harnesses[].id in order
|
|
23
|
+
* harnesses.ids core/registry/harnesses.json harnesses[].id in order
|
|
24
|
+
* workers.ids known worker ids from core/registry/harnesses.json
|
|
25
|
+
* workers.defaultRungs shipped worker ids from that file, then 'primary'
|
|
26
|
+
* packages.ids 'doflow' then the ids the global doflow.lock records under `packages`
|
|
27
|
+
* (122 IC-011); a missing, v1 or unreadable lock adds none
|
|
28
|
+
*
|
|
29
|
+
* Where `auto` ranks: `auto` follows the risk rule, which picks the preset of depth `deep` or the one
|
|
30
|
+
* of depth `single` (resolve-protocol.ts `idOfDepth`), so the deep preset is the strictest it can
|
|
31
|
+
* pick. A preset at or above the deep one in order.review is at least as strict as anything `auto`
|
|
32
|
+
* gives and ranks above it; every preset below the deep one ranks below it. A preset a package adds
|
|
33
|
+
* above review-deep therefore needs no settings edit.
|
|
34
|
+
*
|
|
35
|
+
* A contributed preset (122 IC-014) is a value a person may name, never a rank: it is in the value lists and not in
|
|
36
|
+
* the order, so no strictest-pick path (`auto`, `order[0]`, the floor walk) can reach it, and the narrow-only fold
|
|
37
|
+
* compares it by dominance (resolve.ts). The contributed ids come from the merged view (`loadProtocols`) of the same
|
|
38
|
+
* runtime root, or from `createRefs({ protocols })`, a merged registry a caller passes; an unusable view adds none.
|
|
39
|
+
*
|
|
40
|
+
* `packages.ids` is read from the machine, not from the runtime root: the global lock under `homeDir` (the account
|
|
41
|
+
* home by default). An id a project file names that this machine has not recorded is not an error (a project file
|
|
42
|
+
* travels); the key declares `unknownMembers: warn` and the settings loader reports it.
|
|
43
|
+
*
|
|
44
|
+
* protocols.json is held to `validateProtocols` before any of its refs resolves, so a ref never hands
|
|
45
|
+
* out ids from a registry the review verbs would refuse. Sources are read on first use and cached for
|
|
46
|
+
* the life of the returned resolver. A failure throws an Error that names the file and the field and
|
|
47
|
+
* never carries file text.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
const nodeFs = require('node:fs');
|
|
51
|
+
const os = require('node:os');
|
|
52
|
+
const path = require('node:path');
|
|
53
|
+
const { REPO_ROOT } = require('../../helper/repo-root.js');
|
|
54
|
+
const { validateProtocols, contributedPresetIds } = require('../review/protocols.js');
|
|
55
|
+
const { readLock } = require('../../state/lockfile.js');
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
/** Values of the keys a ref depends on (`dependsOn`), by key name. */
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
/** The merged protocol registry (core plus active packages), or null when it cannot be loaded. */
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
const ADVICE_FILE = 'core/registry/advice.json';
|
|
66
|
+
const STORAGE_FILE = 'core/registry/storage.json';
|
|
67
|
+
const PROTOCOLS_FILE = 'core/registry/protocols.json';
|
|
68
|
+
const HARNESSES_FILE = 'core/registry/harnesses.json';
|
|
69
|
+
const MODELS_FILE = 'core/registry/models.json';
|
|
70
|
+
|
|
71
|
+
/** What each ref is and which keys' values it needs, so the loader can detect a cycle without resolving. */
|
|
72
|
+
const REF_META = Object.freeze({
|
|
73
|
+
'advice.providerIds': { kind: 'values', dependsOn: [] },
|
|
74
|
+
'advice.providerDefaultEndpoint': { kind: 'default', dependsOn: ['advice.provider'] },
|
|
75
|
+
'storage.lifecycleEventsDefaultHours': { kind: 'default', dependsOn: [] },
|
|
76
|
+
'models.tierIds': { kind: 'values', dependsOn: [] },
|
|
77
|
+
'protocols.reviewPresetIds': { kind: 'values', dependsOn: [] },
|
|
78
|
+
'protocols.reviewPresetOrder': { kind: 'order', dependsOn: [] },
|
|
79
|
+
'protocols.debatePresetIds': { kind: 'values', dependsOn: [] },
|
|
80
|
+
'protocols.lensIds': { kind: 'values', dependsOn: [] },
|
|
81
|
+
'harnesses.primaryIds': { kind: 'values', dependsOn: [] },
|
|
82
|
+
'harnesses.ids': { kind: 'values', dependsOn: [] },
|
|
83
|
+
'workers.ids': { kind: 'values', dependsOn: [] },
|
|
84
|
+
'workers.defaultRungs': { kind: 'default', dependsOn: [] },
|
|
85
|
+
'packages.ids': { kind: 'values', dependsOn: [] },
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
/** The depth label of the strictest preset the risk rule picks (resolve-protocol.ts step 1). */
|
|
89
|
+
const RISK_STRICTEST_DEPTH = 'deep';
|
|
90
|
+
|
|
91
|
+
function providers(source ) {
|
|
92
|
+
const list = source(ADVICE_FILE)?.providers;
|
|
93
|
+
if (!Array.isArray(list)) throw new Error(`${ADVICE_FILE} providers must be an array`);
|
|
94
|
+
return list;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function adviceProviderIds(source ) {
|
|
98
|
+
const ids = providers(source).map((p ) => p?.id);
|
|
99
|
+
if (ids.length === 0 || ids.some((id ) => typeof id !== 'string' || !id)) {
|
|
100
|
+
throw new Error(`${ADVICE_FILE} providers[].id must be non-empty strings`);
|
|
101
|
+
}
|
|
102
|
+
return ids;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function adviceProviderDefaultEndpoint(source , deps ) {
|
|
106
|
+
const id = deps['advice.provider'];
|
|
107
|
+
const endpoint = providers(source).find((p ) => p?.id === id)?.defaultEndpoint;
|
|
108
|
+
if (typeof endpoint !== 'string' || !endpoint) throw new Error(`${ADVICE_FILE} has no defaultEndpoint for the provider`);
|
|
109
|
+
return endpoint;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function storageLifecycleEventsDefaultHours(source ) {
|
|
113
|
+
const stores = source(STORAGE_FILE)?.stores;
|
|
114
|
+
const hours = (Array.isArray(stores) ? stores : []).find((s ) => s?.id === 'lifecycle-events')?.bound?.defaultHours;
|
|
115
|
+
if (!Number.isSafeInteger(hours) || hours < 1) throw new Error(`${STORAGE_FILE} lifecycle-events bound.defaultHours must be a positive integer`);
|
|
116
|
+
return hours;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* `pick(data)` from protocols.json, once the picked field has the ref's shape (an Error naming that
|
|
121
|
+
* field) and the whole file passes `validateProtocols` (an Error naming the file, never its text).
|
|
122
|
+
*/
|
|
123
|
+
function fromProtocols (source , pick ) {
|
|
124
|
+
const data = source(PROTOCOLS_FILE);
|
|
125
|
+
const picked = pick(data);
|
|
126
|
+
const checked = validateProtocols(data);
|
|
127
|
+
if (!checked.ok) throw new Error(`${PROTOCOLS_FILE} fails validateProtocols (${checked.errors.length} error(s))`);
|
|
128
|
+
return picked;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** A non-empty list of non-empty strings, or an Error naming the file and `field`. */
|
|
132
|
+
function idList(list , field ) {
|
|
133
|
+
if (!Array.isArray(list) || list.length === 0 || list.some((id ) => typeof id !== 'string' || !id)) {
|
|
134
|
+
throw new Error(`${PROTOCOLS_FILE} ${field} must be a non-empty list of non-empty strings`);
|
|
135
|
+
}
|
|
136
|
+
return list;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** The ids active packages contribute to `kind`, none when the merged view is unusable. */
|
|
140
|
+
function contributed(merged , kind ) {
|
|
141
|
+
const registry = merged();
|
|
142
|
+
return registry ? contributedPresetIds(registry, kind) : [];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** `review.preset` may be `auto`, any core review preset id (IC-006) or a contributed one (122 IC-014). */
|
|
146
|
+
function protocolsReviewPresetIds(source , _deps , merged ) {
|
|
147
|
+
return ['auto', ...fromProtocols(source, (data) => idList(data?.order?.review, 'order.review')), ...contributed(merged, 'review')];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** The `review.preset` values narrowest (strictest) first; the header says where `auto` goes and why. Core ids only. */
|
|
151
|
+
function protocolsReviewPresetOrder(source ) {
|
|
152
|
+
const order = fromProtocols(source, (data) => idList(data?.order?.review, 'order.review'));
|
|
153
|
+
const presets = source(PROTOCOLS_FILE).presets;
|
|
154
|
+
const deep = order.findIndex((id) => presets[id]?.depth === RISK_STRICTEST_DEPTH);
|
|
155
|
+
if (deep === -1) throw new Error(`${PROTOCOLS_FILE} order.review has no preset of depth '${RISK_STRICTEST_DEPTH}'`);
|
|
156
|
+
const single = order.findIndex((id) => presets[id]?.depth === 'single');
|
|
157
|
+
if (single !== -1) {
|
|
158
|
+
return [...order.slice(0, single), 'auto', ...order.slice(single)];
|
|
159
|
+
}
|
|
160
|
+
return [...order.slice(0, deep + 1), 'auto', ...order.slice(deep + 1)];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function protocolsDebatePresetIds(source , _deps , merged ) {
|
|
164
|
+
return [...fromProtocols(source, (data) => idList(data?.order?.debate, 'order.debate')), ...contributed(merged, 'debate')];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function protocolsLensIds(source ) {
|
|
168
|
+
return fromProtocols(source, (data) => {
|
|
169
|
+
const lenses = data?.lenses;
|
|
170
|
+
return idList(Array.isArray(lenses) ? lenses.map((l ) => l?.id) : null, 'lenses[].id');
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** `primary.harness` may be `unknown` (undeclared) or any registry harness id. */
|
|
175
|
+
function harnessesIds(source ) {
|
|
176
|
+
const list = source(HARNESSES_FILE)?.harnesses;
|
|
177
|
+
const ids = Array.isArray(list) ? list.map((h ) => h?.id) : [];
|
|
178
|
+
if (ids.length === 0 || ids.some((id ) => typeof id !== 'string' || !id)) {
|
|
179
|
+
throw new Error(`${HARNESSES_FILE} harnesses[].id must be non-empty strings`);
|
|
180
|
+
}
|
|
181
|
+
return ids;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function harnessesPrimaryIds(source ) {
|
|
185
|
+
return ['unknown', ...harnessesIds(source)];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** 127 IC-005: the retired harness ids (`id`, `replacement`) harnesses.json records; none when it records none. */
|
|
189
|
+
function retiredHarnesses(source ) {
|
|
190
|
+
const list = source(HARNESSES_FILE)?.retired;
|
|
191
|
+
return (Array.isArray(list) ? list : [])
|
|
192
|
+
.filter((entry ) => typeof entry?.id === 'string' && typeof entry?.replacement === 'string')
|
|
193
|
+
.map((entry ) => ({ id: entry.id, replacement: entry.replacement }));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** IC-003: schema membership comes from the worker catalogue, loaded only on demand. */
|
|
197
|
+
function workersIds(source ) {
|
|
198
|
+
const { knownWorkerIds } = require('../../registry/worker-ids.js');
|
|
199
|
+
const { harnesses } = source(HARNESSES_FILE);
|
|
200
|
+
return knownWorkerIds({ registry: { harnesses } }).ids;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** IC-003: the unset list contains shipped workers and the primary rung. */
|
|
204
|
+
function workersDefaultRungs(source ) {
|
|
205
|
+
const { shippedWorkerIds } = require('../../registry/worker-ids.js');
|
|
206
|
+
const { harnesses } = source(HARNESSES_FILE);
|
|
207
|
+
return [...shippedWorkerIds({ harnesses }), 'primary'];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** IC-002: model tiers come from the registry as distinct non-empty strings. */
|
|
211
|
+
function modelsTierIds(source ) {
|
|
212
|
+
const tiers = source(MODELS_FILE)?.dispatchTiers?.tiers;
|
|
213
|
+
if (!Array.isArray(tiers) || tiers.length === 0
|
|
214
|
+
|| tiers.some((tier ) => typeof tier !== 'string' || !tier)
|
|
215
|
+
|| new Set(tiers).size !== tiers.length) {
|
|
216
|
+
throw new Error(`${MODELS_FILE} dispatchTiers.tiers must be a non-empty list of distinct non-empty strings`);
|
|
217
|
+
}
|
|
218
|
+
return tiers;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** The bundled package's id (core/registry/contribution-points.json `bundled`), always a valid member. */
|
|
222
|
+
const BUNDLED_PACKAGE_ID = 'doflow';
|
|
223
|
+
|
|
224
|
+
/** `doflow`, then the ids the global lock records. A lock that cannot be read adds none: settings must still load. */
|
|
225
|
+
function packagesIds(_source , _deps , _merged , homeDir , fsImpl ) {
|
|
226
|
+
let recorded = [];
|
|
227
|
+
try { recorded = readLock({ scope: 'global', homeDir }, { fsImpl })?.packages ?? []; } catch { /* the lock is reported by the verbs that own it */ }
|
|
228
|
+
const ids = (Array.isArray(recorded) ? recorded : []).map((row ) => row?.id).filter((id ) => typeof id === 'string' && id && id !== BUNDLED_PACKAGE_ID);
|
|
229
|
+
return [BUNDLED_PACKAGE_ID, ...new Set (ids )];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const RESOLVERS = Object.freeze({
|
|
233
|
+
'advice.providerIds': adviceProviderIds,
|
|
234
|
+
'advice.providerDefaultEndpoint': adviceProviderDefaultEndpoint,
|
|
235
|
+
'storage.lifecycleEventsDefaultHours': storageLifecycleEventsDefaultHours,
|
|
236
|
+
'models.tierIds': modelsTierIds,
|
|
237
|
+
'protocols.reviewPresetIds': protocolsReviewPresetIds,
|
|
238
|
+
'protocols.reviewPresetOrder': protocolsReviewPresetOrder,
|
|
239
|
+
'protocols.debatePresetIds': protocolsDebatePresetIds,
|
|
240
|
+
'protocols.lensIds': protocolsLensIds,
|
|
241
|
+
'harnesses.primaryIds': harnessesPrimaryIds,
|
|
242
|
+
'harnesses.ids': harnessesIds,
|
|
243
|
+
'workers.ids': workersIds,
|
|
244
|
+
'workers.defaultRungs': workersDefaultRungs,
|
|
245
|
+
'packages.ids': packagesIds,
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
function createRefs({ repoRoot = REPO_ROOT, fsImpl = nodeFs, protocols, homeDir } = {}) {
|
|
256
|
+
const cache = new Map ();
|
|
257
|
+
const source = (file) => {
|
|
258
|
+
if (!cache.has(file)) {
|
|
259
|
+
let parsed ;
|
|
260
|
+
try { parsed = JSON.parse(fsImpl.readFileSync(path.join(repoRoot, file), 'utf8')); }
|
|
261
|
+
catch { throw new Error(`${file} could not be read as JSON`); }
|
|
262
|
+
cache.set(file, parsed);
|
|
263
|
+
}
|
|
264
|
+
return cache.get(file);
|
|
265
|
+
};
|
|
266
|
+
let mergedRegistry ;
|
|
267
|
+
const merged = () => {
|
|
268
|
+
if (mergedRegistry === undefined) {
|
|
269
|
+
if (protocols !== undefined) mergedRegistry = protocols;
|
|
270
|
+
else {
|
|
271
|
+
try {
|
|
272
|
+
const loaded = require('../review/protocols.js').loadProtocols({ repoRoot, fsImpl });
|
|
273
|
+
mergedRegistry = loaded.ok ? loaded.registry : null;
|
|
274
|
+
} catch { mergedRegistry = null; }
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return mergedRegistry;
|
|
278
|
+
};
|
|
279
|
+
return {
|
|
280
|
+
retired: () => retiredHarnesses(source),
|
|
281
|
+
resolve(name, deps = {}) {
|
|
282
|
+
if (!Object.hasOwn(RESOLVERS, name)) throw new Error(`unknown settings ref '${name}'`);
|
|
283
|
+
return RESOLVERS[name](source, deps, merged, homeDir ?? os.homedir(), fsImpl);
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
module.exports = { REF_META, createRefs };
|