@khoavu882/doflow 2.0.0-beta.5 → 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 -2
- 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/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-compact.sh +23 -27
- package/core/harnesses/claude/hooks/session-end.sh +23 -10
- package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
- 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/post-edit-lint.impl.sh +3 -1
- package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
- package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
- package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
- 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 +1 -0
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +1 -0
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +1 -0
- package/core/harnesses/kiro/hooks/session-start.sh +1 -0
- package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
- package/core/harnesses/pi/extensions/doflow-guard.js +8 -0
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +0 -1
- package/core/harnesses/shared/hooks/bridge/bridge.sh +102 -9
- package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
- package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
- package/core/harnesses/shared/hooks/bridge/respond.sh +10 -2
- package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +48 -15
- package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
- package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
- package/core/harnesses/shared/hooks/policies/deny-json.sh +2 -11
- 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 +63 -40
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +3 -2
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +213 -12
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +114 -38
- package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
- package/core/harnesses/shared/hooks/policies/stop-check.sh +20 -9
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +5 -2
- package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
- package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
- package/core/harnesses/shared/hooks/stream-hook-runner.js +47 -8
- package/core/harnesses/shared/locator/doflow-run +2 -3
- package/core/registry/advice.json +3 -3
- package/core/registry/assets.json +55 -82
- package/core/registry/capabilities.json +12 -0
- package/core/registry/contracts.json +58 -31
- 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 +1442 -363
- package/core/registry/lifecycle.json +485 -304
- 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 +679 -31
- 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 +149 -34
- 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 +18 -17
- 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 +15 -58
- 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 +26 -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 +4 -7
- package/core/shared/skills/do-plan/SKILL.md +26 -15
- 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 +143 -66
- package/src/adapters/claude/index.js +24 -4
- package/src/adapters/codex/agents.js +25 -15
- package/src/adapters/codex/index.js +48 -13
- package/src/adapters/codex/native-projection.js +6 -2
- package/src/adapters/copilot/index.js +58 -23
- package/src/adapters/copy-tree.js +290 -44
- 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 +23 -12
- package/src/adapters/opencode/index.js +8 -8
- package/src/adapters/pi/hooks.js +2 -1
- package/src/adapters/pi/index.js +14 -7
- package/src/adapters/resolve-source.js +26 -2
- package/src/cli/commands/install.js +2 -1
- 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 +2 -1
- package/src/cli/index.js +322 -29
- package/src/cli/runtime-commands.js +209 -57
- 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 +20 -3
- package/src/lifecycle/hook-tier.js +160 -0
- package/src/lifecycle/index.js +412 -78
- package/src/lifecycle/retired-harnesses.js +318 -0
- package/src/lifecycle/view.js +35 -15
- package/src/registry/index.js +551 -26
- 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 +20 -11
- 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 +13 -7
- package/src/runtime/cli.js +196 -19
- package/src/runtime/config-home.js +42 -0
- package/src/runtime/context/arbitrate.js +767 -0
- package/src/runtime/context/delivery-store.js +4 -6
- package/src/runtime/context/emission-rules.js +118 -0
- package/src/runtime/context/identity.js +227 -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 +154 -78
- 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-ledger.js +34 -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 +33 -3
- 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 +2 -2
- 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 +46 -5
- package/src/runtime/research-request.js +50 -25
- package/src/runtime/retrieval-plan.js +10 -30
- package/src/runtime/retrieval-record.js +75 -5
- 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 +60 -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 +1 -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 +176 -55
- package/src/runtime/task-sources.js +147 -0
- package/src/runtime/task-state.js +374 -64
- 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/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 -10
- package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
- package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
- package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
- package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
- 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 -7
- package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
- 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 -251
- package/src/adapters/gemini/index.js +0 -429
|
@@ -13,6 +13,7 @@ const {
|
|
|
13
13
|
buildDiscover,
|
|
14
14
|
PROVIDER,
|
|
15
15
|
} = require('./views.js');
|
|
16
|
+
const { identityFields } = require('../context/identity.js');
|
|
16
17
|
const {
|
|
17
18
|
shortTime,
|
|
18
19
|
formatMs,
|
|
@@ -23,139 +24,11 @@ const {
|
|
|
23
24
|
} = require('./render.js');
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
|
-
*
|
|
27
|
-
* `
|
|
28
|
-
*
|
|
29
|
-
* Records a task's span: the events that happened inside it, how long it took, how many tokens it
|
|
30
|
-
* consumed. Ported from observed behaviour (plan decision D3): the event record shape, the trace
|
|
31
|
-
* key names, the six-decimal cost rounding and the default per-token rates are unchanged.
|
|
32
|
-
*
|
|
33
|
-
* Plan task C.3 added the second half of this file: the date-partitioned run ledger (FR-011) and
|
|
34
|
-
* its three inspection views (FR-012). `TaskRunTelemetry` captures one *task's* span in memory;
|
|
35
|
-
* `RunLedger` is the on-disk record of *dispatched runs*, written by `doflow-run` and by any
|
|
36
|
-
* runtime call that names the capability it used.
|
|
37
|
-
*
|
|
38
|
-
* Three defects are fixed rather than reproduced, each explained at its site:
|
|
39
|
-
* 1. Duration came from `time.time()`, a wall clock that an NTP step or a DST change can move
|
|
40
|
-
* backwards mid-run, producing negative or inflated durations.
|
|
41
|
-
* 2. `estimated_cost_usd` was computed from two hard-coded rates regardless of which model the
|
|
42
|
-
* trace named, so the number was presented as measured cost for models it did not price.
|
|
43
|
-
* 3. `export_trace` returned the live `events` array, so a caller mutating the exported trace
|
|
44
|
-
* silently rewrote the recorder's history.
|
|
27
|
+
* The date-partitioned run ledger (FR-011) and its three inspection views (FR-012). `RunLedger` is
|
|
28
|
+
* the on-disk record of *dispatched runs*, written by `doflow-run` and by any runtime call that
|
|
29
|
+
* names the capability it used.
|
|
45
30
|
*/
|
|
46
31
|
|
|
47
|
-
/**
|
|
48
|
-
* The Python's literal rates, kept as the default so an existing caller sees the same number.
|
|
49
|
-
* They price one specific model; a trace naming a different one gets a cost only if the caller
|
|
50
|
-
* supplies its rates, because inventing a price for an unpriced model is inventing a metric.
|
|
51
|
-
*/
|
|
52
|
-
const DEFAULT_TOKEN_RATES = Object.freeze({
|
|
53
|
-
inputPerToken: 0.000003,
|
|
54
|
-
outputPerToken: 0.000015,
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const COST_DECIMALS = 6;
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* @param {number} value
|
|
61
|
-
* @returns {number} rounded to six decimals, matching the Python's `round(x, 6)`
|
|
62
|
-
*/
|
|
63
|
-
function roundCost(value ) {
|
|
64
|
-
const factor = 10 ** COST_DECIMALS;
|
|
65
|
-
return Math.round(value * factor) / factor;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
class TaskRunTelemetry {
|
|
69
|
-
taskId ;
|
|
70
|
-
agent ;
|
|
71
|
-
model ;
|
|
72
|
-
rates ;
|
|
73
|
-
events ;
|
|
74
|
-
clock ;
|
|
75
|
-
startedAtMs ;
|
|
76
|
-
startedAt ;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* @param {string} taskId
|
|
80
|
-
* @param {Object|string} [options] a string is accepted for parity with the Python's positional
|
|
81
|
-
* `agent` argument
|
|
82
|
-
* @param {string} [options.agent='codex']
|
|
83
|
-
* @param {string} [options.model='default']
|
|
84
|
-
* @param {{inputPerToken: number, outputPerToken: number}|null} [options.rates]
|
|
85
|
-
* @param {Function} [options.clock] injection seam for tests; returns elapsed milliseconds
|
|
86
|
-
*/
|
|
87
|
-
constructor(taskId , options = {}) {
|
|
88
|
-
const opts = typeof options === 'string' ? { agent: options } : options;
|
|
89
|
-
this.taskId = taskId;
|
|
90
|
-
this.agent = opts.agent || 'codex';
|
|
91
|
-
this.model = opts.model || 'default';
|
|
92
|
-
this.rates = opts.rates === undefined ? DEFAULT_TOKEN_RATES : opts.rates;
|
|
93
|
-
this.events = [];
|
|
94
|
-
|
|
95
|
-
// Defect fix (1): a monotonic source. `Date.now()` (like Python's `time.time()`) can step
|
|
96
|
-
// backwards, and a negative duration in a benchmark record is worse than no duration.
|
|
97
|
-
this.clock = opts.clock || (() => Number(process.hrtime.bigint() / 1000000n));
|
|
98
|
-
this.startedAtMs = this.clock();
|
|
99
|
-
this.startedAt = new Date().toISOString();
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Appends a structured event to the span.
|
|
104
|
-
* @param {string} eventType
|
|
105
|
-
* @param {Object} [details={}]
|
|
106
|
-
* @returns {Object} the recorded event
|
|
107
|
-
*/
|
|
108
|
-
recordEvent(eventType , details = {}) {
|
|
109
|
-
const event = {
|
|
110
|
-
timestamp: new Date().toISOString(),
|
|
111
|
-
type: eventType,
|
|
112
|
-
details,
|
|
113
|
-
};
|
|
114
|
-
this.events.push(event);
|
|
115
|
-
return event;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Milliseconds elapsed since the recorder was constructed.
|
|
120
|
-
* @returns {number}
|
|
121
|
-
*/
|
|
122
|
-
elapsedMs() {
|
|
123
|
-
return Math.max(0, this.clock() - this.startedAtMs);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Compiles the run's trace record.
|
|
128
|
-
* @param {boolean} success
|
|
129
|
-
* @param {number} [inputTokens=0]
|
|
130
|
-
* @param {number} [outputTokens=0]
|
|
131
|
-
* @returns {Object} trace record
|
|
132
|
-
*/
|
|
133
|
-
exportTrace(success , inputTokens = 0, outputTokens = 0) {
|
|
134
|
-
// Defect fix (2): cost is only reported when rates are known for this run. The default rates
|
|
135
|
-
// reproduce the Python's number exactly; a caller that clears them (`rates: null`) gets `null`
|
|
136
|
-
// rather than a confident figure derived from another model's price list.
|
|
137
|
-
const estimatedCostUsd = this.rates
|
|
138
|
-
? roundCost(inputTokens * this.rates.inputPerToken + outputTokens * this.rates.outputPerToken)
|
|
139
|
-
: null;
|
|
140
|
-
|
|
141
|
-
return {
|
|
142
|
-
taskId: this.taskId,
|
|
143
|
-
agent: this.agent,
|
|
144
|
-
model: this.model,
|
|
145
|
-
success: Boolean(success),
|
|
146
|
-
startedAt: this.startedAt,
|
|
147
|
-
durationMs: this.elapsedMs(),
|
|
148
|
-
inputTokens,
|
|
149
|
-
outputTokens,
|
|
150
|
-
estimatedCostUsd,
|
|
151
|
-
eventCount: this.events.length,
|
|
152
|
-
// Defect fix (3): a copy. The Python handed out its internal list, so an exported trace and
|
|
153
|
-
// the recorder aliased the same array.
|
|
154
|
-
events: this.events.map((e) => ({ ...e })),
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
32
|
// ---------------------------------------------------------------------------------- run ledger
|
|
160
33
|
//
|
|
161
34
|
// The ledger is one JSONL file per UTC date under `<config>/state/runs/`, appended to by
|
|
@@ -197,8 +70,15 @@ const RUN_FIELDS =
|
|
|
197
70
|
{ key: 'inputBytes', wire: 'input_bytes', type: 'uint' },
|
|
198
71
|
{ key: 'outputBytes', wire: 'output_bytes', type: 'uint' },
|
|
199
72
|
{ key: 'retryCount', wire: 'retry_count', type: 'uint' },
|
|
73
|
+
// Session identity (082 IC-034): filled by RunLedger#append from the environment only.
|
|
74
|
+
{ key: 'run', wire: 'run', type: 'token' },
|
|
75
|
+
{ key: 'lineage', wire: 'lineage', type: 'token' },
|
|
76
|
+
{ key: 'attempt', wire: 'attempt', type: 'token' },
|
|
200
77
|
]);
|
|
201
78
|
|
|
79
|
+
/** The identity keys a caller may not supply: the environment is their one source (DEC-042). */
|
|
80
|
+
const IDENTITY_KEYS = Object.freeze(['run', 'lineage', 'attempt']);
|
|
81
|
+
|
|
202
82
|
/**
|
|
203
83
|
* Identifiers only. No space, no quote, no slash, no dot-dot — a capability id (`code.exact-search`)
|
|
204
84
|
* and a provider id (`semble.search`) fit; a file path, a query string, a command line, a URL and
|
|
@@ -219,6 +99,26 @@ function runsDir(configDir ) {
|
|
|
219
99
|
return path.join(configDir, 'state', RUNS_DIRNAME);
|
|
220
100
|
}
|
|
221
101
|
|
|
102
|
+
/**
|
|
103
|
+
* Returns the path before the first `.doflow` segment, else `dir`.
|
|
104
|
+
* @param {string} dir
|
|
105
|
+
* @returns {string}
|
|
106
|
+
*/
|
|
107
|
+
function outerProjectRoot(dir ) {
|
|
108
|
+
if (!dir || typeof dir !== 'string') return dir;
|
|
109
|
+
const segments = dir.split(/[/\\]/);
|
|
110
|
+
const idx = segments.indexOf('.doflow');
|
|
111
|
+
if (idx === -1) return dir;
|
|
112
|
+
const before = segments.slice(0, idx);
|
|
113
|
+
if (before.length === 1 && before[0] === '') return dir.startsWith('\\') ? '\\' : '/';
|
|
114
|
+
if (before.length === 1 && /^[A-Za-z]:$/.test(before[0])) {
|
|
115
|
+
const sep = dir.length > 2 && dir[2] === '/' ? '/' : '\\';
|
|
116
|
+
return before[0] + sep;
|
|
117
|
+
}
|
|
118
|
+
const sep = dir.includes('\\') && !dir.includes('/') ? '\\' : dir.includes('/') ? '/' : path.sep;
|
|
119
|
+
return before.join(sep) || '.';
|
|
120
|
+
}
|
|
121
|
+
|
|
222
122
|
/**
|
|
223
123
|
* Mirrors the dispatcher's own `resolve_config_dir` (design §4.1) so a view reads the same ledger
|
|
224
124
|
* the dispatcher wrote. Resolving from `process.cwd()` alone would miss every run recorded by a
|
|
@@ -250,10 +150,12 @@ function resolveRunsLocation({ start, global: forceGlobal = false, env = process
|
|
|
250
150
|
const candidate = path.join(dir, '.doflow');
|
|
251
151
|
searched.push(candidate);
|
|
252
152
|
let found = false;
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
153
|
+
if (!dir.split(/[/\\]/).includes('.doflow')) {
|
|
154
|
+
try {
|
|
155
|
+
found = fsImpl.statSync(path.join(candidate, containing)).isDirectory();
|
|
156
|
+
} catch {
|
|
157
|
+
found = false; // Not readable is the same as not there for a lookup that must not throw.
|
|
158
|
+
}
|
|
257
159
|
}
|
|
258
160
|
if (found) return { dir: runsDir(candidate), configDir: candidate, origin: 'project', searched };
|
|
259
161
|
const parent = path.dirname(dir);
|
|
@@ -340,6 +242,7 @@ class RunLedger {
|
|
|
340
242
|
fsImpl ;
|
|
341
243
|
clock ;
|
|
342
244
|
dir ;
|
|
245
|
+
env ;
|
|
343
246
|
|
|
344
247
|
/**
|
|
345
248
|
* @param {Object} [options]
|
|
@@ -347,10 +250,12 @@ class RunLedger {
|
|
|
347
250
|
* @param {string} [options.configDir] an install root (`<project>/.doflow`)
|
|
348
251
|
* @param {Object} [options.fsImpl=fs]
|
|
349
252
|
* @param {Function} [options.clock] returns the current Date; injection seam for tests
|
|
253
|
+
* @param {Object} [options.env=process.env] the one source of `run`, `lineage` and `attempt`
|
|
350
254
|
*/
|
|
351
|
-
constructor({ dir, configDir, fsImpl = fs, clock = () => new Date() } = {}) {
|
|
255
|
+
constructor({ dir, configDir, fsImpl = fs, clock = () => new Date(), env = process.env } = {}) {
|
|
352
256
|
this.fsImpl = fsImpl;
|
|
353
257
|
this.clock = clock;
|
|
258
|
+
this.env = env;
|
|
354
259
|
if (dir) this.dir = path.resolve(dir);
|
|
355
260
|
else if (configDir) this.dir = runsDir(path.resolve(configDir));
|
|
356
261
|
else this.dir = resolveRunsLocation({ fsImpl }).dir;
|
|
@@ -358,15 +263,34 @@ class RunLedger {
|
|
|
358
263
|
|
|
359
264
|
/**
|
|
360
265
|
* Appends one metadata record. Always succeeds: an unwritable state directory degrades
|
|
361
|
-
* observability, never the run being observed.
|
|
266
|
+
* observability, never the run being observed. `run`, `lineage` and `attempt` come from
|
|
267
|
+
* `this.env` only; a caller-supplied value is dropped and named in `dropped` (IC-034).
|
|
362
268
|
* @param {Object} event
|
|
363
269
|
* @returns {{written: boolean, file?: string, record?: Object, dropped: string[], reason?: string}}
|
|
364
270
|
*/
|
|
365
271
|
append(event ) {
|
|
366
|
-
|
|
272
|
+
let input = event;
|
|
273
|
+
const supplied = [];
|
|
274
|
+
if (event && typeof event === 'object' && !Array.isArray(event)) {
|
|
275
|
+
input = { ...event };
|
|
276
|
+
for (const key of IDENTITY_KEYS) {
|
|
277
|
+
if (Object.prototype.hasOwnProperty.call(input, key)) { supplied.push(key); delete input[key]; }
|
|
278
|
+
}
|
|
279
|
+
Object.assign(input, identityFields(this.env));
|
|
280
|
+
}
|
|
281
|
+
const sanitized = sanitizeRunEvent(input, { now: this.clock() });
|
|
282
|
+
const { record, reason } = sanitized;
|
|
283
|
+
const dropped = [...supplied, ...sanitized.dropped];
|
|
367
284
|
if (!record) return { written: false, dropped, reason };
|
|
368
285
|
try {
|
|
369
286
|
this.fsImpl.mkdirSync(this.dir, { recursive: true });
|
|
287
|
+
// Warm the hook telemetry store while the Node side already has the project state writable.
|
|
288
|
+
// The hook retains its own mkdir fallback; a telemetry directory fault must not affect the
|
|
289
|
+
// run-ledger append or the command being observed.
|
|
290
|
+
try {
|
|
291
|
+
const { telemetryOff } = require('./telemetry.js');
|
|
292
|
+
if (!telemetryOff(this.env)) this.fsImpl.mkdirSync(path.join(this.dir, 'telemetry'));
|
|
293
|
+
} catch { /* best effort */ }
|
|
370
294
|
const file = path.join(this.dir, `${record.timestamp.slice(0, 10)}.jsonl`);
|
|
371
295
|
this.fsImpl.appendFileSync(file, `${JSON.stringify(record)}\n`, 'utf8');
|
|
372
296
|
return { written: true, file, record, dropped };
|
|
@@ -607,11 +531,10 @@ function handleDiscoverCommand({ json = false, days = null, global: useGlobal =
|
|
|
607
531
|
}
|
|
608
532
|
|
|
609
533
|
module.exports = {
|
|
610
|
-
TaskRunTelemetry,
|
|
611
|
-
DEFAULT_TOKEN_RATES,
|
|
612
534
|
RunLedger,
|
|
613
535
|
runsDir,
|
|
614
536
|
resolveRunsLocation,
|
|
537
|
+
outerProjectRoot,
|
|
615
538
|
sanitizeRunEvent,
|
|
616
539
|
normalizeRunRecord,
|
|
617
540
|
groupSessions,
|