@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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
case $
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
3
|
+
_DOFLOW_SRC=${0//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_POLDIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
|
|
3
4
|
# pre-implementation-gate.sh — Canonical Policy Library: PreToolUse(Edit|Write|...)
|
|
4
5
|
# backstop for the doflow implement gate. The HARD half of the one enforced
|
|
5
6
|
# gate (the other half is the prompt-level do-prereqs.sh inside
|
|
@@ -27,7 +28,7 @@ case $0 in */*) _DOFLOW_POLDIR=${0%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
|
|
|
27
28
|
# Canonical Policy Script Contract (design.md §4):
|
|
28
29
|
# env DOFLOW_PROJECT_DIR (repo root, if the front door sets it),
|
|
29
30
|
# DOFLOW_AGENT (harness id, informational only here),
|
|
30
|
-
# CLAUDE_CONFIG_DIR / CLAUDE_PROJECT_DIR /
|
|
31
|
+
# CLAUDE_CONFIG_DIR / CLAUDE_PROJECT_DIR / CODEX_HOME
|
|
31
32
|
# (each already read by the harness-specific dispatcher this policy
|
|
32
33
|
# replaces — kept so an unmodified front door still resolves its own
|
|
33
34
|
# harness's do-paths.sh resolver)
|
|
@@ -35,7 +36,7 @@ case $0 in */*) _DOFLOW_POLDIR=${0%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
|
|
|
35
36
|
# exit exit 2 + doflow_decide deny = deny; other faults per IC-011. A front
|
|
36
37
|
# door translates this into its native response shape.
|
|
37
38
|
#
|
|
38
|
-
# Reconciliation note (022-normalize-hooks, Phase A): claude/
|
|
39
|
+
# Reconciliation note (022-normalize-hooks, Phase A): claude/codex/kiro
|
|
39
40
|
# each shipped a separately-adapted copy of this gate; antigravity's copy
|
|
40
41
|
# additionally never depended on a do-paths.sh resolver at all — it computed
|
|
41
42
|
# feature_dir itself from the current branch name and checked the three
|
|
@@ -139,13 +140,11 @@ RESOLVER_CANDIDATES=(
|
|
|
139
140
|
"$ROOT/.doflow/scripts/doflow/bash/do-paths.sh"
|
|
140
141
|
"$ROOT/.claude/scripts/doflow/bash/do-paths.sh"
|
|
141
142
|
"$ROOT/.codex/scripts/doflow/bash/do-paths.sh"
|
|
142
|
-
"$ROOT/.gemini/scripts/doflow/bash/do-paths.sh"
|
|
143
143
|
"$ROOT/.kiro/scripts/doflow/bash/do-paths.sh"
|
|
144
144
|
"$HOME/.doflow/scripts/doflow/bash/do-paths.sh"
|
|
145
145
|
"${CLAUDE_CONFIG_DIR:-$HOME/.claude}/scripts/doflow/bash/do-paths.sh"
|
|
146
146
|
"${CLAUDE_PROJECT_DIR:-}/.claude/scripts/doflow/bash/do-paths.sh"
|
|
147
147
|
"${CODEX_HOME:-$HOME/.codex}/scripts/doflow/bash/do-paths.sh"
|
|
148
|
-
"${GEMINI_CONFIG_DIR:-$HOME/.gemini}/scripts/doflow/bash/do-paths.sh"
|
|
149
148
|
"$HOME/.kiro/scripts/doflow/bash/do-paths.sh"
|
|
150
149
|
)
|
|
151
150
|
|
|
@@ -163,11 +162,14 @@ has_plan=""
|
|
|
163
162
|
if [ -n "$RESOLVER" ]; then
|
|
164
163
|
json=$("$RESOLVER" --json 2>/dev/null) || json=""
|
|
165
164
|
if [ -n "$json" ]; then
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
165
|
+
# One jq run for all five fields, one per line (none of them can hold a newline).
|
|
166
|
+
{
|
|
167
|
+
IFS= read -r feature_dir
|
|
168
|
+
IFS= read -r repo_root
|
|
169
|
+
IFS= read -r has_requirement
|
|
170
|
+
IFS= read -r has_design
|
|
171
|
+
IFS= read -r has_plan
|
|
172
|
+
} < <(printf '%s' "$json" | jq -r '(.feature_dir // ""), (.repo_root // ""), (.has_requirement // false), (.has_design // false), (.has_plan // false)' 2>/dev/null) || true
|
|
171
173
|
fi
|
|
172
174
|
fi
|
|
173
175
|
|
|
@@ -247,18 +249,41 @@ real_path() {
|
|
|
247
249
|
repo_real=$(cd -P "$repo_root" 2>/dev/null && pwd) || repo_real="$repo_root"
|
|
248
250
|
|
|
249
251
|
# Only source files inside this repo are gated: edits to doflow artifacts are
|
|
250
|
-
# always allowed,
|
|
252
|
+
# always allowed, an absolute path elsewhere is not this repo's, and neither is a
|
|
253
|
+
# path git ignores.
|
|
251
254
|
GATED=false
|
|
252
255
|
while IFS= read -r file; do
|
|
253
256
|
[ -z "$file" ] && continue
|
|
254
|
-
|
|
257
|
+
# A ".." segment can lead out of agent-docs (agent-docs/../src/x), so such a path is judged by
|
|
258
|
+
# its real path below, never by the text before the "..".
|
|
259
|
+
case "/$file/" in
|
|
260
|
+
*/../*) ;;
|
|
261
|
+
*) case "$file" in *"/agent-docs/"*|agent-docs/*) continue ;; esac ;;
|
|
262
|
+
esac
|
|
263
|
+
check="$file"
|
|
255
264
|
case "$file" in
|
|
256
265
|
/*)
|
|
257
266
|
real=$(real_path "$file") || real="$file"
|
|
258
|
-
case "$real" in *"/agent-docs/"*) continue ;; esac
|
|
267
|
+
case "/$real/" in */../*) ;; *) case "$real" in *"/agent-docs/"*) continue ;; esac ;; esac
|
|
259
268
|
case "$real" in "$repo_real"/*) ;; *) continue ;; esac
|
|
269
|
+
check="$real"
|
|
270
|
+
;;
|
|
271
|
+
*)
|
|
272
|
+
real=$(real_path "$repo_root/$file") || real="$repo_root/$file"
|
|
273
|
+
# real_path folds a ".." only through directories that exist, so one left in it is not folded.
|
|
274
|
+
case "/$file/" in */../*) case "/$real/" in */../*) ;; *) case "${real#"$repo_real"}/" in */agent-docs/*) continue ;; esac ;; esac ;; esac
|
|
260
275
|
;;
|
|
261
276
|
esac
|
|
277
|
+
# A path git ignores (a local config file such as .mcp.json) is not source. check-ignore
|
|
278
|
+
# without --no-index answers "not ignored" for a tracked file, so tracked source stays gated.
|
|
279
|
+
# The skip never applies to DoFlow's own state or gate artifacts: .doflow/ is gitignored, and
|
|
280
|
+
# skipping it would let an edit forge a readiness record. Any `.doflow` or `agent-docs/doflow`
|
|
281
|
+
# segment of the real path, or of the path as written (a `..` the resolver could not fold), keeps it gated.
|
|
282
|
+
# The same holds for the do-paths.sh resolver the gate runs (any RESOLVER_CANDIDATES path, whichever
|
|
283
|
+
# harness directory holds it, ignored or not): rewriting it can make the gate find no feature.
|
|
284
|
+
case "/$file/" in */.doflow/*|*/agent-docs/doflow/*|*/../*|*/scripts/doflow/bash/do-paths.sh/) GATED=true; break ;; esac
|
|
285
|
+
case "${real#"$repo_real"}/" in */.doflow/*|*/agent-docs/doflow/*|*/scripts/doflow/bash/do-paths.sh/) GATED=true; break ;; esac
|
|
286
|
+
git -C "$repo_root" check-ignore -q -- "$check" 2>/dev/null && continue
|
|
262
287
|
GATED=true
|
|
263
288
|
break
|
|
264
289
|
done <<< "$FILES"
|
|
@@ -304,25 +329,71 @@ checkouts() {
|
|
|
304
329
|
return 0
|
|
305
330
|
}
|
|
306
331
|
|
|
307
|
-
#
|
|
308
|
-
|
|
309
|
-
|
|
332
|
+
# Whether two files hold the same bytes.
|
|
333
|
+
same_bytes() {
|
|
334
|
+
if command -v cmp >/dev/null 2>&1; then cmp -s "$1" "$2"; else [ "$(cat "$1")" = "$(cat "$2")" ]; fi
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
# Whether the flat record $1 of a namespaced task may be read as feature $2's
|
|
338
|
+
# (115 D-3): it names that feature (featureSlug on a run, slug on a readiness
|
|
339
|
+
# record) or none. A file that does not parse names nobody.
|
|
340
|
+
flat_is_ours() {
|
|
341
|
+
local named
|
|
342
|
+
named=$(jq -r '[.featureSlug, .slug] | map(select(type == "string" and . != "")) | first // empty' "$1" 2>/dev/null) || return 1
|
|
343
|
+
[ -z "$named" ] || [ "$named" = "$2" ]
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
# The task's record of store $2 (readiness | orchestration) under checkout $1,
|
|
347
|
+
# keyed by feature $3 as the runtime keys it (115 C-1): <store>/<feature>/<id>.json
|
|
348
|
+
# for a task id other than the feature's slug, else the flat file; the flat file
|
|
349
|
+
# of a namespaced task only when it is this feature's or names none. Sets HIT.
|
|
350
|
+
HIT=""
|
|
351
|
+
record_in() {
|
|
352
|
+
local store="$1/.doflow/state/$2"
|
|
353
|
+
HIT=""
|
|
354
|
+
if [ -n "$3" ] && [ "$3" != "$task_id" ]; then
|
|
355
|
+
if [ -f "$store/$3/$task_id.json" ]; then HIT="$store/$3/$task_id.json"; return 0; fi
|
|
356
|
+
[ -f "$store/$task_id.json" ] && flat_is_ours "$store/$task_id.json" "$3" && HIT="$store/$task_id.json"
|
|
357
|
+
return 0
|
|
358
|
+
fi
|
|
359
|
+
[ -f "$store/$task_id.json" ] && HIT="$store/$task_id.json"
|
|
360
|
+
return 0
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
# The task's readiness record, keyed by feature $1. From a linked worktree the
|
|
364
|
+
# main checkout's comes first, since every record lives there (115 IC-004), and
|
|
365
|
+
# a copy at the same path here with other bytes refuses (C-3). Else this
|
|
366
|
+
# checkout's, else exactly one other checkout's; held in two or more others it
|
|
367
|
+
# cannot be told which is meant -> allow.
|
|
310
368
|
FOUND=""
|
|
311
369
|
find_state() {
|
|
312
|
-
local
|
|
370
|
+
local root count=0 copy
|
|
313
371
|
FOUND=""
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
372
|
+
if [ -f "$repo_root/.git" ]; then
|
|
373
|
+
checkouts
|
|
374
|
+
if [ -n "$MAIN" ]; then
|
|
375
|
+
record_in "$MAIN" readiness "$1"
|
|
376
|
+
if [ -n "$HIT" ]; then
|
|
377
|
+
copy="$repo_root${HIT#"$MAIN"}"
|
|
378
|
+
if [ -f "$copy" ] && ! same_bytes "$copy" "$HIT"; then
|
|
379
|
+
printf "doflow gate readiness-before-implementation: task '%s' has a readiness record in this worktree (%s) that differs from the main checkout's (%s). Next: keep one of the two and remove the other, then re-run. Nothing was changed.\n" "$task_id" "$copy" "$HIT" >&2
|
|
380
|
+
doflow_decide deny readiness-store-conflict
|
|
381
|
+
exit 2
|
|
382
|
+
fi
|
|
383
|
+
FOUND="$HIT"
|
|
384
|
+
return 0
|
|
385
|
+
fi
|
|
386
|
+
fi
|
|
387
|
+
fi
|
|
388
|
+
record_in "$repo_root" readiness "$1"
|
|
389
|
+
if [ -n "$HIT" ]; then FOUND="$HIT"; return 0; fi
|
|
317
390
|
checkouts
|
|
318
391
|
for root in ${OTHERS[@]+"${OTHERS[@]}"}; do
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
done
|
|
323
|
-
[ -n "$hit" ] || continue
|
|
392
|
+
[ "$root" = "$MAIN" ] && continue
|
|
393
|
+
record_in "$root" readiness "$1"
|
|
394
|
+
[ -n "$HIT" ] || continue
|
|
324
395
|
count=$((count + 1))
|
|
325
|
-
FOUND="$
|
|
396
|
+
FOUND="$HIT"
|
|
326
397
|
done
|
|
327
398
|
[ "$count" -le 1 ] || exit 0
|
|
328
399
|
}
|
|
@@ -338,18 +409,26 @@ run_feature() {
|
|
|
338
409
|
return 0
|
|
339
410
|
}
|
|
340
411
|
|
|
412
|
+
# The feature the task's records are keyed by, as the runtime keys them
|
|
413
|
+
# (featureSlugFor): a task id that names a feature folder in this checkout is
|
|
414
|
+
# its own feature, else the branch's.
|
|
415
|
+
run_key="$slug"
|
|
416
|
+
[ -d "$repo_root/agent-docs/doflow/$task_id" ] && run_key="$task_id"
|
|
417
|
+
|
|
341
418
|
# The task's run: this checkout's, else the one other checkout's run of the same
|
|
342
419
|
# feature. A run with the same id for another feature is a different task.
|
|
343
420
|
find_run() {
|
|
344
|
-
local
|
|
421
|
+
local root count=0
|
|
345
422
|
FOUND=""
|
|
346
|
-
|
|
423
|
+
record_in "$repo_root" orchestration "$run_key"
|
|
424
|
+
if [ -n "$HIT" ]; then FOUND="$HIT"; return 0; fi
|
|
347
425
|
checkouts
|
|
348
426
|
for root in ${OTHERS[@]+"${OTHERS[@]}"}; do
|
|
349
|
-
|
|
350
|
-
[
|
|
427
|
+
record_in "$root" orchestration "$run_key"
|
|
428
|
+
[ -n "$HIT" ] || continue
|
|
429
|
+
[ "$(run_feature "$HIT")" = "$run_key" ] || continue
|
|
351
430
|
count=$((count + 1))
|
|
352
|
-
FOUND="$
|
|
431
|
+
FOUND="$HIT"
|
|
353
432
|
done
|
|
354
433
|
[ "$count" -le 1 ] || exit 0
|
|
355
434
|
}
|
|
@@ -443,13 +522,10 @@ if [ -n "$RUN" ]; then
|
|
|
443
522
|
fi
|
|
444
523
|
|
|
445
524
|
# The record, where the runtime looks: under the feature's namespace (the run's
|
|
446
|
-
# own feature when it recorded one), then flat;
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
else
|
|
451
|
-
find_state ".doflow/state/readiness/$task_id.json"
|
|
452
|
-
fi
|
|
525
|
+
# own feature when it recorded one), then flat; the main checkout first from a
|
|
526
|
+
# linked worktree, else this checkout first.
|
|
527
|
+
record_slug="${run_slug:-$run_key}"
|
|
528
|
+
find_state "$record_slug"
|
|
453
529
|
record_state=""; record_class=""; record_at=""
|
|
454
530
|
if [ -n "$FOUND" ]; then
|
|
455
531
|
record_info=$(jq -r '(.state // ""), (.taskClass // ""), (.evaluatedAt // "")' "$FOUND" 2>/dev/null) || exit 0
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
case $
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
3
|
+
_DOFLOW_SRC=${0//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_POLDIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
|
|
3
4
|
# session-context.sh — Canonical Policy Library: SessionStart guard policy
|
|
4
5
|
#
|
|
5
6
|
# Fires when a harness starts a new session. Captures git state into a
|
|
@@ -61,9 +62,36 @@ if [ "$ENVELOPE_CLASS" = unsupported ] || [ "$ENVELOPE_CLASS" = missing ]; then
|
|
|
61
62
|
fi
|
|
62
63
|
CWD=$(json_field "$INPUT" ".cwd")
|
|
63
64
|
|
|
65
|
+
package_verify_async() {
|
|
66
|
+
local home="${HOME:-}" lock run config_dir detach=""
|
|
67
|
+
[ -n "$home" ] || return 0
|
|
68
|
+
lock="$home/.doflow/doflow.lock"
|
|
69
|
+
[ -f "$lock" ] || return 0
|
|
70
|
+
jq -e '(.packages // []) | length > 0' "$lock" >/dev/null 2>&1 || return 0
|
|
71
|
+
config_dir="${CLAUDE_CONFIG_DIR:-$home/.claude}"
|
|
72
|
+
command -v setsid >/dev/null 2>&1 && detach="setsid"
|
|
73
|
+
for run in \
|
|
74
|
+
"$home/.doflow/scripts/doflow/bin/doflow-run" \
|
|
75
|
+
"$config_dir/scripts/doflow/bin/doflow-run"
|
|
76
|
+
do
|
|
77
|
+
[ -x "$run" ] || continue
|
|
78
|
+
( cd "$home/.doflow" 2>/dev/null && nohup $detach "$run" package --action verify </dev/null >/dev/null 2>&1 ) >/dev/null 2>&1 3>&- 5>&- &
|
|
79
|
+
return 0
|
|
80
|
+
done
|
|
81
|
+
return 0
|
|
82
|
+
}
|
|
83
|
+
|
|
64
84
|
# Guard: if we can't determine the session, nothing to do
|
|
65
85
|
[[ -z "$SESSION_ID" ]] && exit 0
|
|
66
86
|
|
|
87
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write, but the
|
|
88
|
+
# storage upkeep still starts (086 IC-010).
|
|
89
|
+
if [[ -z "$SESSION_DIR" ]]; then
|
|
90
|
+
package_verify_async
|
|
91
|
+
storage_upkeep_async "$CWD"
|
|
92
|
+
exit 0
|
|
93
|
+
fi
|
|
94
|
+
|
|
67
95
|
SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
|
|
68
96
|
|
|
69
97
|
# Clean up stale injected flag from a prior crashed session
|
|
@@ -167,5 +195,6 @@ fi
|
|
|
167
195
|
mkdir -p "$(dirname "$SESSIONS_LOG")"
|
|
168
196
|
echo "$TIMESTAMP START $SESSION_ID ${CWD:-unknown}" >> "$SESSIONS_LOG"
|
|
169
197
|
|
|
198
|
+
package_verify_async
|
|
170
199
|
storage_upkeep_async "$CWD"
|
|
171
200
|
exit 0
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
case $
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
3
|
+
_DOFLOW_SRC=${0//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_POLDIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
|
|
3
4
|
# stop-check.sh — Canonical Policy Library: Stop hook
|
|
4
5
|
#
|
|
5
6
|
# Two responsibilities:
|
|
@@ -84,7 +85,8 @@ TRANSCRIPT_PATH=$(json_field "$INPUT" ".transcript_path")
|
|
|
84
85
|
|
|
85
86
|
# ── 1. Lint dispatch (only when we have a session-scoped edited-files queue) ──
|
|
86
87
|
|
|
87
|
-
|
|
88
|
+
# With no config home (SESSION_DIR empty) there is no queue to read; the stub check below still runs.
|
|
89
|
+
if [ -n "$SESSION_ID" ] && [ -n "$SESSION_DIR" ]; then
|
|
88
90
|
SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
|
|
89
91
|
EDITED_FILES="$SESSION_PATH/edited-files.txt"
|
|
90
92
|
PROC_FILE="$SESSION_PATH/edited-files.txt.proc"
|
|
@@ -104,12 +106,14 @@ if [ -n "$SESSION_ID" ]; then
|
|
|
104
106
|
# The resolver for the leak-scan verb. Absent install -> the scan is
|
|
105
107
|
# skipped, like every other tool below: this hook has never required
|
|
106
108
|
# anything to be present.
|
|
109
|
+
# HOME may be unset (an absolute XDG_CONFIG_HOME alone gives a config home): its candidates drop out.
|
|
107
110
|
DOFLOW_RUN=""
|
|
111
|
+
claude_dir="${CLAUDE_CONFIG_DIR:-${HOME:+$HOME/.claude}}"
|
|
108
112
|
for candidate in \
|
|
109
|
-
"${
|
|
110
|
-
"$HOME/.doflow/scripts/doflow/bin/doflow-run"
|
|
113
|
+
"${claude_dir:+$claude_dir/scripts/doflow/bin/doflow-run}" \
|
|
114
|
+
"${HOME:+$HOME/.doflow/scripts/doflow/bin/doflow-run}"
|
|
111
115
|
do
|
|
112
|
-
[ -x "$candidate" ] && { DOFLOW_RUN="$candidate"; break; }
|
|
116
|
+
[ -n "$candidate" ] && [ -x "$candidate" ] && { DOFLOW_RUN="$candidate"; break; }
|
|
113
117
|
done
|
|
114
118
|
|
|
115
119
|
while IFS= read -r path; do
|
|
@@ -187,9 +191,10 @@ fi
|
|
|
187
191
|
|
|
188
192
|
# The payload's own last_assistant_message is the response being stopped on. A present key
|
|
189
193
|
# (even null or empty) is authoritative: the transcript is only read when the key is absent.
|
|
190
|
-
# jq filter for the transcript fallback: one JSON object per line, assistant text from
|
|
194
|
+
# jq filter for the transcript fallback: one JSON object per line, assistant text from four
|
|
191
195
|
# shapes — Claude Code (.message with text blocks), Codex rollout (response_item .payload with
|
|
192
|
-
# output_text blocks)
|
|
196
|
+
# output_text blocks), Copilot CLI events.jsonl (type assistant.message, .data.content a string) and
|
|
197
|
+
# the flat {role,content} line. A partial or foreign line yields "".
|
|
193
198
|
read -r -d '' LAST_ASSISTANT_JQ <<'JQ' || true
|
|
194
199
|
def text: if type == "string" then .
|
|
195
200
|
elif type == "array" then [ .[]? | objects | select(.type == "text" or .type == "output_text") | .text | strings ] | join("\n")
|
|
@@ -197,6 +202,7 @@ def text: if type == "string" then .
|
|
|
197
202
|
[ inputs | fromjson? | objects
|
|
198
203
|
| if ((.message | objects | .role) // null) == "assistant" then .message.content
|
|
199
204
|
elif .type == "response_item" and ((.payload | objects | .role) // null) == "assistant" then .payload.content
|
|
205
|
+
elif .type == "assistant.message" then .data.content
|
|
200
206
|
elif .role == "assistant" then .content
|
|
201
207
|
else empty end
|
|
202
208
|
| text | select(length > 0) ] | last // ""
|
|
@@ -274,10 +280,15 @@ if grep -qiE -- "$STUB_PATTERN" <<<"$STUB_TEXT" 2>/dev/null; then
|
|
|
274
280
|
# Block a given message once: the continuation that follows is judged on new text, and a
|
|
275
281
|
# harness with no stop_hook_active would otherwise be blocked on this one forever. State is
|
|
276
282
|
# per session, or per transcript when the harness sends no session_id; any failure here
|
|
277
|
-
# leaves the block in force only for this call.
|
|
283
|
+
# leaves the block in force only for this call. With no config home there is no state store, so
|
|
284
|
+
# this policy cannot remember a block and allows the stop.
|
|
285
|
+
[ -n "$SESSION_DIR" ] || exit 0
|
|
278
286
|
GUARD_KEY="$SESSION_ID"
|
|
279
287
|
[ -z "$GUARD_KEY" ] && GUARD_KEY="t$(printf '%s' "$TRANSCRIPT_PATH" | cksum | cut -d' ' -f1)"
|
|
280
|
-
GUARD_FILE="
|
|
288
|
+
GUARD_FILE=""
|
|
289
|
+
if [ -n "$SESSION_DIR" ]; then
|
|
290
|
+
GUARD_FILE="$(ensure_session_dir "$GUARD_KEY" 2>/dev/null)/stop-last-blocked" || GUARD_FILE=""
|
|
291
|
+
fi
|
|
281
292
|
MESSAGE_SUM=$(printf '%s' "$LAST_ASSISTANT_CONTENT" | cksum 2>/dev/null) || MESSAGE_SUM=""
|
|
282
293
|
if [ -n "$MESSAGE_SUM" ] && [ -n "$GUARD_FILE" ] && [ "$(cat "$GUARD_FILE" 2>/dev/null)" = "$MESSAGE_SUM" ]; then
|
|
283
294
|
exit 0
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
case $
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
3
|
+
_DOFLOW_SRC=${0//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_POLDIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_POLDIR=. ;; esac
|
|
3
4
|
# subagent-audit.sh — Canonical Policy Library: SubagentStart + SubagentStop hook
|
|
4
5
|
# (pure observability, no deny path)
|
|
5
6
|
#
|
|
6
7
|
# 022-hooks-remaining-duplication: claude and codex's copies were byte-identical — moved here as
|
|
7
|
-
# the single canonical copy.
|
|
8
|
+
# the single canonical copy.
|
|
8
9
|
#
|
|
9
10
|
# Appends {timestamp, session_id, event, agent_type, agent_id} to a session-scoped audit log.
|
|
10
11
|
# Today there is zero record of which of the installed agents/ specialists actually run, how often, or
|
|
@@ -56,6 +57,8 @@ fi
|
|
|
56
57
|
|
|
57
58
|
# Guard: if we can't determine the session, nothing to do
|
|
58
59
|
[[ -z "$SESSION_ID" ]] && exit 0
|
|
60
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
|
|
61
|
+
[[ -n "$SESSION_DIR" ]] || exit 0
|
|
59
62
|
|
|
60
63
|
EVENT=$(json_field "$INPUT" ".hook_event_name")
|
|
61
64
|
AGENT_TYPE=$(json_field "$INPUT" ".agent_type")
|