@khoavu882/doflow 2.0.0-beta.5 → 2.0.1
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 +16 -16
- package/bin/doflow.js +22 -12
- 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/mcp-tool-guard.sh +4 -1
- 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/pre-implement-gate.sh +4 -1
- 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 +26 -9
- 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/hooks.json +0 -10
- package/core/harnesses/codex/hooks/lib.sh +44 -25
- package/core/harnesses/codex/hooks/mcp-tool-guard.sh +4 -1
- 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/pre-implement-gate.sh +4 -1
- 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 +94 -0
- package/core/harnesses/copilot/hooks/doflow-mcp-tool-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 +51 -0
- package/core/harnesses/kiro/agents/doflow.json +1 -11
- package/core/harnesses/kiro/hooks/doflow.json +0 -10
- package/core/harnesses/kiro/hooks/lib.sh +26 -6
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +8 -3
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +8 -3
- 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 +11 -2
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +1 -2
- package/core/harnesses/shared/hooks/adapters/antigravity.js +1 -1
- package/core/harnesses/shared/hooks/bridge/bridge.sh +126 -23
- 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 +16 -2
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +49 -16
- 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 +20 -7
- 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-policy.conf +1 -1
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +7 -8
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +132 -57
- package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
- package/core/harnesses/shared/hooks/policies/stop-check.sh +27 -15
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +6 -3
- 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 +58 -20
- 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 +35 -0
- package/core/registry/gates.json +32 -0
- package/core/registry/guidance-caps.json +40 -0
- package/core/registry/harnesses.json +1445 -366
- package/core/registry/intake.json +53 -0
- package/core/registry/lifecycle.json +599 -996
- 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/intake-category/files/category.json +8 -0
- package/core/registry/package-templates/intake-category/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 +272 -0
- package/core/registry/storage.json +687 -31
- package/core/registry/telemetry.json +236 -0
- package/core/registry/transcripts.json +142 -0
- package/core/registry/verification.json +76 -6
- 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 +3 -2
- package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +19 -1
- 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 +49 -5
- package/core/shared/scripts/doflow/bin/doflow-run +152 -34
- package/core/shared/skills/do/SKILL.md +14 -12
- 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 +45 -97
- package/core/shared/skills/do-brainstorm/references/handoff_branches.md +36 -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 +48 -148
- 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 +23 -20
- package/core/shared/skills/do-diagnose/SKILL.md +18 -6
- package/core/shared/skills/do-document/SKILL.md +12 -1
- package/core/shared/skills/do-document/references/deep_research.md +1 -2
- package/core/shared/skills/do-document/references/embedded-research.md +19 -7
- package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
- package/core/shared/skills/do-execute-plan/SKILL.md +19 -60
- 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 +16 -2
- 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 +10 -11
- package/core/shared/skills/do-flow/references/task_classes.md +5 -5
- package/core/shared/skills/do-git/SKILL.md +4 -0
- package/core/shared/skills/do-implement/SKILL.md +13 -14
- package/core/shared/skills/do-plan/SKILL.md +34 -20
- 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/shared/workflows/do-flow-chain.md +2 -0
- 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 +46 -5
- package/src/adapters/codex/agents.js +25 -15
- package/src/adapters/codex/hooks.js +39 -3
- package/src/adapters/codex/index.js +61 -13
- package/src/adapters/codex/native-projection.js +6 -2
- package/src/adapters/copilot/index.js +58 -23
- package/src/adapters/copy-tree.js +291 -46
- 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 +22 -3
- package/src/cli/commands/ui.js +99 -0
- package/src/cli/commands/update.js +2 -1
- package/src/cli/index.js +337 -32
- package/src/cli/runtime-commands.js +220 -60
- 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 +4 -16
- 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 +472 -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/pointer.js +67 -12
- 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 +158 -79
- 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 +52 -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 +624 -18
- package/src/runtime/history-compactor.js +13 -3
- package/src/runtime/implementation-gate.js +281 -26
- package/src/runtime/intake/engine.js +677 -0
- package/src/runtime/intake/index.js +136 -0
- package/src/runtime/intake/manifest.js +140 -0
- package/src/runtime/intake/taxonomy.js +206 -0
- 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 +88 -10
- package/src/runtime/lifecycle/event-store.js +8 -6
- package/src/runtime/lifecycle/followup.js +38 -7
- package/src/runtime/lifecycle/overview.js +26 -2
- 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 +487 -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/attendance.js +137 -0
- package/src/runtime/roadmap/facts.js +479 -0
- package/src/runtime/roadmap/gates.js +273 -0
- package/src/runtime/roadmap/loop.js +1719 -0
- package/src/runtime/roadmap/merge.js +390 -0
- package/src/runtime/roadmap/rows.js +1122 -0
- package/src/runtime/roadmap/seed.js +1063 -0
- package/src/runtime/roadmap/worktree-cleanup.js +147 -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 +85 -14
- 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 +373 -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/verb-view.js +267 -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 -54
- 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 +256 -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 +610 -67
- 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/claude/hooks/pre-bash-guard.sh +0 -10
- package/core/harnesses/codex/hooks/pre-bash-guard.sh +0 -10
- 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/harnesses/kiro/hooks/pre-bash-guard.sh +0 -24
- package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +0 -91
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +0 -378
- 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,4 +1,14 @@
|
|
|
1
1
|
def nonempty($v): if ($v | type) == "string" and $v != "" then $v else null end;
|
|
2
|
+
def valid_model_id($v):
|
|
3
|
+
($v | type) == "string" and ($v | length) >= 1 and ($v | length) <= 120 and
|
|
4
|
+
($v | test("^[A-Za-z0-9][A-Za-z0-9 ._:/@()\\[\\]#+-]*$")) and
|
|
5
|
+
(($v | endswith(" ")) | not);
|
|
6
|
+
def model_identity($v):
|
|
7
|
+
if ($v | type) != "string" then {}
|
|
8
|
+
elif valid_model_id($v) then {model:$v}
|
|
9
|
+
else {modelUnparsed:true} end;
|
|
10
|
+
# Same reading as identity.ts and policies/identity.sh: ASCII-lowercased, main or worker kept, any other non-empty value is worker. Unset or empty stays null.
|
|
11
|
+
def norm_role($v): if ($v | type) == "string" and $v != "" then ($v | ascii_downcase) as $l | if $l == "main" or $l == "worker" then $l else "worker" end else null end;
|
|
2
12
|
def put($o; $k; $v): if $v == null then $o else $o + {($k): $v} end;
|
|
3
13
|
def event_name($fallback): if (.hook_event_name | type) == "string" then .hook_event_name else $fallback end;
|
|
4
14
|
def path_values($obj; $keys): first([$keys[] as $k | $obj[$k] | select(type == "string" and length > 0)][]) // null | if . == null then null else [.] end;
|
|
@@ -12,26 +22,31 @@ def event_operation($e):
|
|
|
12
22
|
elif $e == "Stop" or $e == "stop" then "stop"
|
|
13
23
|
elif $e == "SubagentStart" then "subagent-start"
|
|
14
24
|
elif $e == "SubagentStop" then "subagent-stop"
|
|
15
|
-
elif $e == "PreCompact"
|
|
16
|
-
elif $e == "PostToolUse"
|
|
25
|
+
elif $e == "PreCompact" then "compact"
|
|
26
|
+
elif $e == "PostToolUse" then "post-tool"
|
|
17
27
|
else "tool" end;
|
|
18
28
|
def canonical_tool($name; $harness):
|
|
19
29
|
if ($name | type) != "string" then {operation:"tool"}
|
|
20
|
-
elif (($harness == "claude" or $harness == "codex" or $harness == "kiro") and ($name | test("^mcp__"))) or (
|
|
21
|
-
elif (($harness == "claude" or $harness == "codex" or $harness == "kiro") and (["Edit","Write","MultiEdit","apply_patch"] | index($name)) != null) or ($harness == "
|
|
22
|
-
elif (($harness == "claude" or $harness == "codex" or $harness == "kiro"
|
|
30
|
+
elif (($harness == "claude" or $harness == "codex" or $harness == "kiro" or $harness == "copilot") and ($name | test("^mcp__"))) or ($harness == "antigravity" and ($name | test("^mcp_"))) or ($harness == "pi" and ($name | test("^mcp__"))) then {operation:"mcp",tool:$name}
|
|
31
|
+
elif (($harness == "claude" or $harness == "codex" or $harness == "kiro" or $harness == "copilot") and (["Edit","Write","MultiEdit","apply_patch"] | index($name)) != null) or ($harness == "antigravity" and (["write_to_file","replace_file_content","multi_replace_file_content","edit_file","write_file","create_file","replace_file","replace","Edit","Write","MultiEdit","apply_patch"] | index($name)) != null) or ($harness == "pi" and (["edit","write"] | index($name)) != null) then {operation:"edit",tool:$name}
|
|
32
|
+
elif (($harness == "claude" or $harness == "codex" or $harness == "kiro" or $harness == "copilot") and $name == "Bash") or ($harness == "antigravity" and (["run_command","run_shell_command","Bash","bash"] | index($name)) != null) or ($harness == "pi" and $name == "bash") then {operation:"command",tool:$name}
|
|
23
33
|
else {operation:"tool",tool:$name} end;
|
|
24
34
|
def decode_claude:
|
|
25
35
|
(canonical_tool(.tool_name // ""; "claude")) as $t |
|
|
26
|
-
if
|
|
27
|
-
|
|
36
|
+
(if event_name($event) == "SessionStart" then model_identity(.model) else {} end) as $model |
|
|
37
|
+
if .tool_name == null then {operation: event_operation($event), identity: (session_identity(.session_id) + $model)}
|
|
38
|
+
else {operation:$t.operation, tool:$t.tool, paths:(if $t.operation == "edit" then path_values(.tool_input; ["file_path"]) else null end), command:(if $t.operation == "command" then string_value(.tool_input; ["command"]) else null end), identity:(session_identity(.session_id) + $model)} end;
|
|
28
39
|
def decode_codex:
|
|
29
40
|
decode_claude as $d |
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
41
|
+
(model_identity(.model)) as $model |
|
|
42
|
+
(if .tool_name == "apply_patch" then $d + {patch:(string_value(.tool_input; ["command"]))} else $d end) |
|
|
43
|
+
.identity += $model;
|
|
44
|
+
# Copilot CLI payloads (normalised to the Claude shape by the front door) carry no model, so the
|
|
45
|
+
# envelope names none, whatever a payload happens to hold under .model.
|
|
46
|
+
def decode_copilot:
|
|
47
|
+
decode_claude as $d |
|
|
48
|
+
(if .tool_name == "apply_patch" then $d + {patch:(string_value(.tool_input; ["command"]))} else $d end) |
|
|
49
|
+
.identity |= del(.model, .modelUnparsed);
|
|
35
50
|
def decode_kiro:
|
|
36
51
|
(if ((.tool_name // "") | type) == "string" and ((.tool_name // "") | startswith("mcp_")) then {operation:"mcp",tool:.tool_name}
|
|
37
52
|
elif ((.tool_name // "") | type) == "string" and ((.tool_name // "") | test("^@[^/]+/.+")) then
|
|
@@ -40,21 +55,75 @@ def decode_kiro:
|
|
|
40
55
|
if .tool_name == null then {operation:event_operation($event),identity:session_identity(.session_id)}
|
|
41
56
|
else {operation:$t.operation,tool:$t.tool,paths:(if $t.operation == "edit" then path_values(.tool_input; ["file_path"]) else null end),command:(if $t.operation == "command" then string_value(.tool_input; ["command"]) else null end),identity:session_identity(.session_id)} end;
|
|
42
57
|
def decode_antigravity:
|
|
43
|
-
|
|
58
|
+
(model_identity(.modelName)) as $model |
|
|
59
|
+
(session_identity(if (.session_id | type) == "string" and .session_id != "" then .session_id else .conversationId end) + $model) as $identity |
|
|
60
|
+
if .toolCall == null then {operation:event_operation($event),identity:$identity}
|
|
44
61
|
else (canonical_tool(.toolCall.name // ""; "antigravity")) as $t |
|
|
45
|
-
{operation:$t.operation,tool:$t.tool,paths:(if $t.operation == "edit" then path_values(.toolCall.args; ["AbsolutePath","TargetFile","Path","file_path","path"]) else null end),command:(if $t.operation == "command" then string_value(.toolCall.args; ["CommandLine","command"]) else null end),identity
|
|
62
|
+
{operation:$t.operation,tool:$t.tool,paths:(if $t.operation == "edit" then path_values(.toolCall.args; ["AbsolutePath","TargetFile","Path","file_path","path"]) else null end),command:(if $t.operation == "command" then string_value(.toolCall.args; ["CommandLine","command"]) else null end),identity:$identity} end;
|
|
46
63
|
def decode_pi:
|
|
47
64
|
(canonical_tool(.toolName // ""; "pi")) as $t |
|
|
48
|
-
{operation:$t.operation,tool:$t.tool,paths:(if $t.operation == "edit" then path_values(.input; ["path"]) else null end),command:(if $t.operation == "command" then string_value(.input; ["command"]) else null end),identity:session_identity(.sessionId),correlation:(correlation(.toolCallId;.parentToolCallId))};
|
|
65
|
+
{operation:$t.operation,tool:$t.tool,paths:(if $t.operation == "edit" then path_values(.input; ["path"]) else null end),command:(if $t.operation == "command" then string_value(.input; ["command"]) else null end),identity:(session_identity(.sessionId) + model_identity(.model)),correlation:(correlation(.toolCallId;.parentToolCallId))};
|
|
66
|
+
# IC-005: only this closed vocabulary enters telemetry. The policy envelope keeps its command.
|
|
67
|
+
def command_segment_class:
|
|
68
|
+
gsub("^\\s+|\\s+$"; "") | sub("^([A-Za-z_][A-Za-z0-9_]*=[^\\s]*\\s+)+"; "") |
|
|
69
|
+
if test("^cd\\s+") then "none"
|
|
70
|
+
elif test("^(doflow-run|doflow) verify( |$)") then "verify.verb"
|
|
71
|
+
elif test("^(npm|pnpm|yarn|bun)( run)? test$|^node --test( --[^ ]+)*( test/?)?$|^pytest( -[^ ]+)*$|^go test \\./\\.\\.\\.$|^cargo test$") then "test.full"
|
|
72
|
+
elif test("^(npm|pnpm|yarn|bun)( run)? test |^node --test |^pytest |^go test |^cargo test ") then "test.scoped"
|
|
73
|
+
elif test("(^| )(jest|vitest|mocha|playwright test)( |$)|^(npm|pnpm|yarn|bun) run test:[^ ]+") then "test.other"
|
|
74
|
+
else "none" end;
|
|
75
|
+
def classify($cmd):
|
|
76
|
+
try (if ($cmd | type) != "string" then "none" else
|
|
77
|
+
["verify.verb", "test.full", "test.scoped", "test.other", "none"] as $rank |
|
|
78
|
+
[$cmd | splits("&&|\\|\\||;|\\|") | command_segment_class | . as $c | $rank | index($c)] |
|
|
79
|
+
(min // 4) as $best | $rank[$best]
|
|
80
|
+
end) catch "none";
|
|
81
|
+
# Telemetry tuple (IC-003): the first line in explicit `--arg mode encode`, read and stripped by
|
|
82
|
+
# bridge.sh. Every telemetry expression sits inside the `try`, so a fault here yields {dft:1} and
|
|
83
|
+
# never reaches the envelope; exactly one value comes out whatever the inside yields.
|
|
84
|
+
def dft_token($v): if ($v | type) == "string" and ($v | test("^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$")) then $v else null end;
|
|
85
|
+
def dft_id($v): if ($v | type) == "string" and ($v | test("^[A-Za-z0-9][A-Za-z0-9_-]{0,55}$")) then $v else null end;
|
|
86
|
+
def dft_tuple_base($native; $d):
|
|
87
|
+
if $ENV.DOFLOW_TELEMETRY == "off" then {dft:1} else
|
|
88
|
+
[try (now as $n | ($n | floor) as $s |
|
|
89
|
+
{dft:1, date:($s | strftime("%Y-%m-%d")),
|
|
90
|
+
timestamp:(($s | strftime("%Y-%m-%dT%H:%M:%S")) + "." + (((($n - $s) * 1000 | floor) + 1000 | tostring)[1:]) + "Z"),
|
|
91
|
+
session:dft_token($d.identity.session),
|
|
92
|
+
tool:(if $d.operation == "mcp" then null else dft_token($d.tool) end),
|
|
93
|
+
tool_call_id:dft_token(if $harness == "pi" then $native.toolCallId elif $harness == "claude" or $harness == "codex" then $native.tool_use_id else null end),
|
|
94
|
+
run:(dft_id($ENV.DOFLOW_RUN_ID) | if . == "local" then null else . end),
|
|
95
|
+
lineage:dft_id($ENV.DOFLOW_LINEAGE_ID),
|
|
96
|
+
attempt:($ENV.DOFLOW_ATTEMPT | if type == "string" and test("^[1-9][0-9]{0,3}$") then tonumber else null end),
|
|
97
|
+
role:norm_role($ENV.DOFLOW_SESSION_ROLE),
|
|
98
|
+
worker_run:($ENV.DOFLOW_WORKER_RUN | if type == "string" and test("\\Aw-[0-9a-f]{12}\\z") then . else null end)}) catch {dft:1}]
|
|
99
|
+
| if length == 1 then .[0] else {dft:1} end end;
|
|
100
|
+
def dft_tuple($native; $d):
|
|
101
|
+
dft_tuple_base($native; $d) |
|
|
102
|
+
[try (
|
|
103
|
+
if . == {dft:1} then . else
|
|
104
|
+
(if $ARGS.named.mode == "observe" then . + {duration_ms:null, tool_duration_ms:($native.duration_ms |
|
|
105
|
+
if type == "number" and . >= 0 and . <= 9007199254740991 and . == floor then . else null end)} else . + {tool_duration_ms:null} end) |
|
|
106
|
+
if $ARGS.named.mode == "observe" and $d.operation == "command"
|
|
107
|
+
then . + {test_class:classify($d.command)} else . + {test_class:null} end
|
|
108
|
+
end) catch {dft:1}] | if length == 1 then .[0] else {dft:1} end;
|
|
49
109
|
if ($ARGS.named.mode // "encode") == "minimal" then {doflow_event:{version:(1),harness:$harness,event:(event_name($event)),operation:event_operation($event)}} elif type != "object" then . else
|
|
50
110
|
. as $native |
|
|
51
111
|
($ENV.DOFLOW_TASK_ID | nonempty(.)) as $task |
|
|
52
112
|
($ENV.DOFLOW_RUN_ID | nonempty(.)) as $run |
|
|
53
113
|
($ENV.DOFLOW_ATTEMPT | try tonumber catch null) as $attempt |
|
|
54
|
-
(
|
|
55
|
-
(
|
|
114
|
+
($ENV.DOFLOW_LINEAGE_ID | nonempty(.)) as $lineage |
|
|
115
|
+
($ENV.DOFLOW_WORKTREE | nonempty(.)) as $worktree |
|
|
116
|
+
norm_role($ENV.DOFLOW_SESSION_ROLE) as $role |
|
|
117
|
+
(if $harness == "claude" then decode_claude elif $harness == "codex" then decode_codex elif $harness == "kiro" then decode_kiro elif $harness == "copilot" then decode_copilot elif $harness == "antigravity" then decode_antigravity elif $harness == "pi" then decode_pi else {operation:"tool"} end) as $d |
|
|
118
|
+
if $ARGS.named.mode == "observe" then
|
|
119
|
+
if $harness == "claude" and $d.operation == "command" and $native.hook_event_name == $event and
|
|
120
|
+
($event == "PostToolUse" or $event == "PostToolUseFailure")
|
|
121
|
+
then dft_tuple($native; $d) else {dft:1} end
|
|
122
|
+
else
|
|
56
123
|
({version:1,harness:$harness,event:(event_name($event)),operation:$d.operation,tool:$d.tool,paths:$d.paths,command:$d.command,patch:$d.patch,taskId:$task,
|
|
57
|
-
identity:($d.identity + {run:$run,attempt:$attempt,role:$role} | with_entries(select(.value != null)) | if length > 0 then . else null end),
|
|
124
|
+
identity:($d.identity + {run:$run,attempt:$attempt,lineage:$lineage,role:$role,worktree:$worktree} | with_entries(select(.value != null)) | if length > 0 then . else null end),
|
|
58
125
|
correlation:(($d.correlation // {}) | with_entries(select(.value != null)) | if length > 0 then . else null end) } | with_entries(select(.value != null))) as $envelope |
|
|
126
|
+
(if $ARGS.named.mode == "encode" then dft_tuple($native; $d) else empty end),
|
|
59
127
|
$native + {doflow_event:$envelope}
|
|
128
|
+
end
|
|
60
129
|
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
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
|
+
# observe-model.sh — the shared bridge step `observe-model` (row 120 IC-005).
|
|
4
|
+
#
|
|
5
|
+
# Defines doflow_observe_model <harness> <envelope>. Sourcing defines it only. bridge.sh calls it once
|
|
6
|
+
# per event, after the envelope is built, in a subshell with every stream discarded:
|
|
7
|
+
#
|
|
8
|
+
# ( . "<bridge-dir>/observe-model.sh" && doflow_observe_model "$harness" "$payload" ) >/dev/null 2>&1 </dev/null || true
|
|
9
|
+
#
|
|
10
|
+
# so it never changes the decision, the exit code or the output, and every I/O error is ignored.
|
|
11
|
+
#
|
|
12
|
+
# When the envelope carries identity.model and a session id it records the model in one file under
|
|
13
|
+
# lib.sh's STATE_DIR (<config home>/doflow/session-env):
|
|
14
|
+
# - main session (DOFLOW_SESSION_ROLE unset or main): primary/<cwd_hash cwd>/<harness>/<sessionKey>.json,
|
|
15
|
+
# where cwd is the payload's absolute `cwd`, else the hook's working directory;
|
|
16
|
+
# - worker (any other role, identity.sh's reading) with a launched identity (DOFLOW_RUN_ID other
|
|
17
|
+
# than `local`, DOFLOW_LINEAGE_ID and DOFLOW_ATTEMPT, identity.sh's patterns):
|
|
18
|
+
# worker-model/L.<run>.<lineage>.<attempt>.json. A worker without one writes nothing.
|
|
19
|
+
# sessionKey is the first 16 hex of the sha256 of the session id's bytes. The file holds exactly
|
|
20
|
+
# {"schema":1,"harness":"<id>","model":"<model-id>","event":"<event>","observedAt":"<UTC>","session":"<sessionKey>"}
|
|
21
|
+
# and is written only when absent or when its model differs: a tmp file in the same folder, then a
|
|
22
|
+
# rename, mode 0600. With no config home, no sha256 tool or a link in place of the file, nothing.
|
|
23
|
+
# The storage stores model-observations and worker-model-observations bound both folders.
|
|
24
|
+
|
|
25
|
+
_DOFLOW_SRC=${BASH_SOURCE[0]//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_OBSERVE_DIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_OBSERVE_DIR=. ;; esac
|
|
26
|
+
|
|
27
|
+
doflow_observe_model() {
|
|
28
|
+
local harness="${1:-}" envelope="${2:-}" fields="" model="" model_json="" session="" cwd="" event="" now=""
|
|
29
|
+
local key="" dir="" file="" current="" tmp="" run="${DOFLOW_RUN_ID:-}" lineage="${DOFLOW_LINEAGE_ID:-}" attempt="${DOFLOW_ATTEMPT:-}"
|
|
30
|
+
case "$harness" in ''|*[!a-z0-9-]*) return 0 ;; esac
|
|
31
|
+
# lib.sh gives STATE_DIR (the config-home rule), cwd_hash and identity.sh's role reading.
|
|
32
|
+
. "$_DOFLOW_OBSERVE_DIR/../policies/lib.sh" || return 0
|
|
33
|
+
[ -n "${STATE_DIR:-}" ] || return 0
|
|
34
|
+
fields=$(printf '%s\n' "$envelope" | jq -r '
|
|
35
|
+
def text: type == "string" and length > 0 and (test("[[:cntrl:]]") | not);
|
|
36
|
+
.doflow_event as $e
|
|
37
|
+
| select(($e.identity.model | text) and ($e.identity.session | text))
|
|
38
|
+
| $e.identity.model, ($e.identity.model | tojson), $e.identity.session,
|
|
39
|
+
(if (.cwd | text) and (.cwd | startswith("/")) then .cwd else "-" end),
|
|
40
|
+
($e.event | tojson), (now | strftime("%Y-%m-%dT%H:%M:%SZ"))' 2>/dev/null) || return 0
|
|
41
|
+
{ IFS= read -r model && IFS= read -r model_json && IFS= read -r session && IFS= read -r cwd \
|
|
42
|
+
&& IFS= read -r event && IFS= read -r now; } <<<"$fields" || return 0
|
|
43
|
+
|
|
44
|
+
if command -v sha256sum >/dev/null 2>&1; then key=$(printf '%s' "$session" | sha256sum | cut -c1-16)
|
|
45
|
+
elif command -v shasum >/dev/null 2>&1; then key=$(printf '%s' "$session" | shasum -a 256 | cut -c1-16)
|
|
46
|
+
else return 0; fi
|
|
47
|
+
[[ $key =~ ^[0-9a-f]{16}$ ]] || return 0
|
|
48
|
+
|
|
49
|
+
_doflow_role_resolve
|
|
50
|
+
if [ "$_DF_ROLE" = main ]; then
|
|
51
|
+
case "$cwd" in /*) ;; *) cwd=$PWD ;; esac
|
|
52
|
+
dir="$STATE_DIR/primary/$(cwd_hash "$cwd")/$harness"
|
|
53
|
+
file="$dir/$key.json"
|
|
54
|
+
else
|
|
55
|
+
[ "$run" != local ] && [[ $run =~ ^[A-Za-z0-9][A-Za-z0-9_-]{0,55}$ ]] || return 0
|
|
56
|
+
[[ $lineage =~ ^[A-Za-z0-9][A-Za-z0-9_-]{0,55}$ ]] && [[ $attempt =~ ^[1-9][0-9]{0,3}$ ]] || return 0
|
|
57
|
+
dir="$STATE_DIR/worker-model"
|
|
58
|
+
file="$dir/L.$run.$lineage.$attempt.json"
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
[ ! -L "$file" ] || return 0
|
|
62
|
+
if [ -f "$file" ]; then
|
|
63
|
+
current=$(jq -r 'if (.model | type) == "string" then .model else empty end' "$file" 2>/dev/null) || current=""
|
|
64
|
+
[ "$current" != "$model" ] || return 0
|
|
65
|
+
fi
|
|
66
|
+
umask 077
|
|
67
|
+
mkdir -p "$dir" || return 0
|
|
68
|
+
tmp="$file.tmp.$$"
|
|
69
|
+
if printf '{"schema":1,"harness":"%s","model":%s,"event":%s,"observedAt":"%s","session":"%s"}\n' \
|
|
70
|
+
"$harness" "$model_json" "$event" "$now" "$key" >"$tmp" && mv -f "$tmp" "$file"; then
|
|
71
|
+
return 0
|
|
72
|
+
fi
|
|
73
|
+
rm -f "$tmp"
|
|
74
|
+
return 0
|
|
75
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
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
|
|
2
3
|
# Native hook response renderers for the shared lifecycle bridge.
|
|
3
|
-
|
|
4
|
+
_DOFLOW_SRC=${BASH_SOURCE[0]//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_RESPOND_DIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_RESPOND_DIR=. ;; esac
|
|
4
5
|
. "$_DOFLOW_RESPOND_DIR/../policies/deny-json.sh"
|
|
5
6
|
|
|
6
7
|
doflow_bridge_native_event_var() {
|
|
@@ -28,7 +29,6 @@ doflow_render_response() {
|
|
|
28
29
|
if [ "$outcome" = deny ]; then
|
|
29
30
|
case "$harness:$event" in
|
|
30
31
|
claude:PreToolUse|codex:PreToolUse) emit_pretooluse_deny_nested "$reason" || return $?; return 0 ;;
|
|
31
|
-
gemini:BeforeTool) emit_pretooluse_deny_flat "$reason"; return 0 ;;
|
|
32
32
|
kiro:PreToolUse) printf '%s' "$reason" >&2; return 2 ;;
|
|
33
33
|
antigravity:PreToolUse)
|
|
34
34
|
if command -v jq >/dev/null 2>&1; then jq -cn --arg reason "$reason" '{decision:"deny",reason:$reason}'
|
|
@@ -38,6 +38,14 @@ doflow_render_response() {
|
|
|
38
38
|
if command -v jq >/dev/null 2>&1; then jq -cn --arg reason "$reason" '{decision:"continue",reason:$reason}'
|
|
39
39
|
else printf '{"decision":"continue","reason":%s}\n' "$( _doflow_json_reason "$reason" )"; fi
|
|
40
40
|
return $? ;;
|
|
41
|
+
copilot:PreToolUse)
|
|
42
|
+
if command -v jq >/dev/null 2>&1; then jq -cn --arg reason "$reason" '{permissionDecision:"deny",permissionDecisionReason:$reason}'
|
|
43
|
+
else printf '{"permissionDecision":"deny","permissionDecisionReason":%s}\n' "$( _doflow_json_reason "$reason" )"; fi
|
|
44
|
+
return $? ;;
|
|
45
|
+
copilot:Stop)
|
|
46
|
+
if command -v jq >/dev/null 2>&1; then jq -cn --arg reason "$reason" '{decision:"block",reason:$reason}'
|
|
47
|
+
else printf '{"decision":"block","reason":%s}\n' "$( _doflow_json_reason "$reason" )"; fi
|
|
48
|
+
return $? ;;
|
|
41
49
|
pi:tool_call)
|
|
42
50
|
if command -v jq >/dev/null 2>&1; then jq -cn --arg reason "$reason" '{block:true,reason:$reason}'
|
|
43
51
|
else printf '{"block":true,"reason":%s}\n' "$( _doflow_json_reason "$reason" )"; fi
|
|
@@ -53,6 +61,12 @@ doflow_render_response() {
|
|
|
53
61
|
*) printf '%s\n' "$reason" >&2; return 2 ;;
|
|
54
62
|
esac
|
|
55
63
|
fi
|
|
64
|
+
if [ -n "${6:-}" ]; then
|
|
65
|
+
case "$harness:$event" in
|
|
66
|
+
claude:PreToolUse|codex:PreToolUse) emit_pretooluse_advice "$6" || return $?; return 0 ;;
|
|
67
|
+
claude:Stop|codex:Stop|codex:stop) emit_stop_advice "$6" || return $?; return 0 ;;
|
|
68
|
+
esac
|
|
69
|
+
fi
|
|
56
70
|
case "$harness:$event" in
|
|
57
71
|
codex:Stop|codex:stop) printf '%s\n' '{}' ;;
|
|
58
72
|
antigravity:PreToolUse) printf '%s\n' '{"decision":"allow"}' ;;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# example its pattern file is missing). It exists only to be sourced, in a subshell with all output
|
|
7
7
|
# discarded, from inside a branch where the policy already fails open:
|
|
8
8
|
#
|
|
9
|
-
# ( . "<policy-dir>/capture-failure.sh"; doflow_capture_failure
|
|
9
|
+
# ( . "<policy-dir>/capture-failure.sh"; doflow_capture_failure mcp-tool-guard contract-missing ) >/dev/null 2>&1 || true
|
|
10
10
|
#
|
|
11
11
|
# The subshell keeps anything this file does away from the policy, which runs with `set -uo pipefail`,
|
|
12
12
|
# does not source lib.sh and would change exit codes under `set -e`. So this file:
|
|
@@ -16,29 +16,60 @@
|
|
|
16
16
|
# - never rotates the file (rotation is done by the Node writers only, DEC-019);
|
|
17
17
|
# - never blocks, never changes the policy's decision, and swallows every error.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
_DOFLOW_SRC=${BASH_SOURCE[0]//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_CAPTURE_FAILURE_DIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_CAPTURE_FAILURE_DIR=. ;; esac
|
|
20
20
|
# The line holds only the policy name and the point name from DoFlow's own code, the working
|
|
21
21
|
# directory, the harness name and the install version: never the tool call, its arguments or stdin.
|
|
22
|
-
# It is a no-op when no
|
|
23
|
-
# while capture is off (
|
|
24
|
-
#
|
|
22
|
+
# It is a no-op when there is no config home (neither XDG_CONFIG_HOME nor HOME is set to an absolute
|
|
23
|
+
# path; doflow_config_home below) and while capture is off (DOFLOW_FAILURE_CAPTURE=off|0|false|no,
|
|
24
|
+
# the `off` sentinel file, or a `failure.capture` value other than "on" in <config home>/settings.json,
|
|
25
|
+
# read by doflow_lex_capture below), the same rules the Node writer follows (IC-011, IC-014, IC-005).
|
|
26
|
+
# The two marked blocks are byte-identical to the ones in bin/doflow-run.
|
|
27
|
+
|
|
28
|
+
# BEGIN doflow-config-home v1 (rule: src/runtime/config-home.js; checked by test/guards/settings.test.js)
|
|
29
|
+
doflow_config_home() {
|
|
30
|
+
DOFLOW_HOME=""
|
|
31
|
+
case "${XDG_CONFIG_HOME:-}" in
|
|
32
|
+
/*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;;
|
|
33
|
+
[A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;; esac ;;
|
|
34
|
+
esac
|
|
35
|
+
case "${HOME:-}" in
|
|
36
|
+
/*) DOFLOW_HOME="${HOME}/.config/doflow" ;;
|
|
37
|
+
[A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${HOME}/.config/doflow" ;; esac ;;
|
|
38
|
+
esac
|
|
39
|
+
return 0
|
|
40
|
+
}
|
|
41
|
+
# END doflow-config-home v1
|
|
42
|
+
|
|
43
|
+
# BEGIN doflow-settings-lexical v1 (rule: src/runtime/settings/lexical.js; checked by test/guards/settings.test.js)
|
|
44
|
+
doflow_lex_capture() {
|
|
45
|
+
local f="${1:-}" text="" rest="" d=""
|
|
46
|
+
local re='"failure\.capture"[[:space:]]*:[[:space:]]*("[^"]*"|[^,}"[:space:]]*)'
|
|
47
|
+
DOFLOW_LEX_CAPTURE=""
|
|
48
|
+
if [ ! -e "$f" ]; then
|
|
49
|
+
# Missing is no setting, unless the folder holding it cannot be searched (Node: EACCES is off).
|
|
50
|
+
d="${f%/*}"
|
|
51
|
+
if [ -n "$d" ] && [ "$d" != "$f" ] && [ -d "$d" ] && [ ! -x "$d" ]; then DOFLOW_LEX_CAPTURE="off"; fi
|
|
52
|
+
return 0
|
|
53
|
+
fi
|
|
54
|
+
if [ ! -f "$f" ] || [ ! -r "$f" ]; then DOFLOW_LEX_CAPTURE="off"; return 0; fi
|
|
55
|
+
IFS= read -r -d '' text < "$f" || true
|
|
56
|
+
rest="$text"
|
|
57
|
+
while [[ $rest =~ $re ]]; do
|
|
58
|
+
if [ "${BASH_REMATCH[1]}" = '"on"' ]; then DOFLOW_LEX_CAPTURE="${DOFLOW_LEX_CAPTURE:-on}"; else DOFLOW_LEX_CAPTURE="off"; fi
|
|
59
|
+
rest="${rest#*"${BASH_REMATCH[0]}"}"
|
|
60
|
+
done
|
|
61
|
+
return 0
|
|
62
|
+
}
|
|
63
|
+
# END doflow-settings-lexical v1
|
|
25
64
|
|
|
26
65
|
doflow_capture_failure() {
|
|
27
66
|
local policy="${1:-}" point="${2:-}"
|
|
28
67
|
local LC_ALL=C # byte-wise lengths and cuts; scoped to this function
|
|
29
68
|
local home="" setting="" version="" harness="" project="" cwd="" hp="" at="" line="" here="" dir=""
|
|
30
69
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
*) return 0 ;;
|
|
35
|
-
esac
|
|
36
|
-
else
|
|
37
|
-
case "${HOME:-}" in
|
|
38
|
-
/*) home="$HOME/.config/doflow/failures" ;;
|
|
39
|
-
*) return 0 ;;
|
|
40
|
-
esac
|
|
41
|
-
fi
|
|
70
|
+
doflow_config_home
|
|
71
|
+
[ -n "$DOFLOW_HOME" ] || return 0
|
|
72
|
+
home="$DOFLOW_HOME/failures"
|
|
42
73
|
|
|
43
74
|
# Case-insensitive, whitespace trimmed at the ends only: the same reading the Node writer has.
|
|
44
75
|
setting="$(printf '%s' "${DOFLOW_FAILURE_CAPTURE:-}" | tr '[:upper:]' '[:lower:]')" || return 0
|
|
@@ -48,6 +79,8 @@ doflow_capture_failure() {
|
|
|
48
79
|
off|0|false|no) return 0 ;;
|
|
49
80
|
esac
|
|
50
81
|
[ -f "$home/off" ] && return 0
|
|
82
|
+
doflow_lex_capture "$DOFLOW_HOME/settings.json"
|
|
83
|
+
[ "$DOFLOW_LEX_CAPTURE" = off ] && return 0
|
|
51
84
|
|
|
52
85
|
[[ "$policy" =~ ^[a-z][a-z0-9-]{0,39}$ ]] || policy="unknown"
|
|
53
86
|
[[ "$point" =~ ^[A-Za-z][A-Za-z0-9._:-]{0,39}$ ]] || return 0
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# IC-001 (feature 116): shared PreCompact text builder; sourced, not executed.
|
|
3
|
+
|
|
4
|
+
doflow_compact_text() {
|
|
5
|
+
local CWD="${1:-}"
|
|
6
|
+
local preserve branch sha uncommitted recent text
|
|
7
|
+
|
|
8
|
+
preserve='Preserve: decisions made, files modified, open questions, planned next steps, acceptance criteria and pending verification of the active task.'
|
|
9
|
+
|
|
10
|
+
if [[ -n "$CWD" ]] && is_git_worktree "$CWD"; then
|
|
11
|
+
branch=$(git_branch_of "$CWD" || echo "")
|
|
12
|
+
sha=$(git_short_sha_of "$CWD" || echo "")
|
|
13
|
+
uncommitted=$(git_uncommitted_count_of "$CWD" || echo "0")
|
|
14
|
+
recent=$(run_with_timeout 1 -- git -C "$CWD" log --format="%h %s" -2 2>/dev/null \
|
|
15
|
+
| awk 'NR>1{printf " | "}{printf "%s",$0}' || echo "")
|
|
16
|
+
|
|
17
|
+
text=$(printf '%s\nInclude in compact summary:\n- git branch: %s sha: %s\n- uncommitted files: %s\n- cwd: %s\n- recent commits: %s' \
|
|
18
|
+
"$preserve" "${branch:-unknown}" "${sha:-unknown}" "$uncommitted" "${CWD:-unknown}" "${recent:-none}")
|
|
19
|
+
else
|
|
20
|
+
text=$(printf '%s\nInclude in compact summary:\n- cwd: %s (not a git repository)' \
|
|
21
|
+
"$preserve" "${CWD:-unknown}")
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# The cap is 490 BYTES in every locale: LC_ALL=C makes the substring and length below count bytes,
|
|
25
|
+
# where a UTF-8 locale would count characters. A cut can then end inside a multi-byte character, so
|
|
26
|
+
# a trailing partial UTF-8 sequence is dropped (FU-tsq77m).
|
|
27
|
+
local LC_ALL=C cut i b need
|
|
28
|
+
cut="${text:0:490}"
|
|
29
|
+
i=$(( ${#cut} - 1 ))
|
|
30
|
+
# Walk back over at most three continuation bytes (0x80-0xBF) to the byte that starts the last character.
|
|
31
|
+
while [[ $i -ge 1 && $(( ${#cut} - i )) -le 3 ]]; do
|
|
32
|
+
printf -v b '%d' "'${cut:i:1}"
|
|
33
|
+
b=$(( b & 255 )) # the shell may print a byte above 127 as a negative number (bash 3.2) or a code unit
|
|
34
|
+
[[ $b -ge 128 && $b -lt 192 ]] || break
|
|
35
|
+
i=$(( i - 1 ))
|
|
36
|
+
done
|
|
37
|
+
printf -v b '%d' "'${cut:i:1}"
|
|
38
|
+
b=$(( b & 255 ))
|
|
39
|
+
need=1
|
|
40
|
+
[[ $b -ge 192 ]] && need=2
|
|
41
|
+
[[ $b -ge 224 ]] && need=3
|
|
42
|
+
[[ $b -ge 240 ]] && need=4
|
|
43
|
+
[[ $(( ${#cut} - i )) -lt $need ]] && cut="${cut:0:i}"
|
|
44
|
+
DF_COMPACT_TEXT="$cut"
|
|
45
|
+
return 0
|
|
46
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
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
|
|
2
3
|
# contract.sh — shared decision and envelope contract for canonical policies.
|
|
3
4
|
#
|
|
4
5
|
# This file is sourced by policy scripts. It sets no shell options, installs no traps, reads no
|
|
@@ -43,6 +44,7 @@ doflow_read_envelope() {
|
|
|
43
44
|
DF_ENV_TOOL=
|
|
44
45
|
DF_ENV_PATHS=
|
|
45
46
|
DF_ENV_COMMAND=
|
|
47
|
+
DF_ENV_CWD=
|
|
46
48
|
DF_ENV_PATCH=
|
|
47
49
|
DF_ENV_ROOT=
|
|
48
50
|
DF_ENV_TASK=
|
|
@@ -67,6 +69,7 @@ doflow_read_envelope() {
|
|
|
67
69
|
shellvar("DF_ENV_TOOL"; field("tool")),
|
|
68
70
|
shellvar("DF_ENV_PATHS"; ([$fields.paths[]? | select(type == "string")] | join("\n"))),
|
|
69
71
|
shellvar("DF_ENV_COMMAND"; field("command")),
|
|
72
|
+
shellvar("DF_ENV_CWD"; ($object.cwd // "") | if type=="string" then . else "" end),
|
|
70
73
|
shellvar("DF_ENV_PATCH"; field("patch")),
|
|
71
74
|
shellvar("DF_ENV_ROOT"; field("projectRoot")),
|
|
72
75
|
shellvar("DF_ENV_TASK"; field("taskId"))][]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
|
|
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
|
+
# deny-json.sh — shared PreToolUse deny-JSON and advice-JSON emitters for front-door dispatchers.
|
|
3
4
|
#
|
|
4
5
|
# Deliberately carries no `set` directive (unlike lib.sh, which sets -euo
|
|
5
6
|
# pipefail on source): a front door needs `set -e` OFF while it captures a
|
|
@@ -10,7 +11,7 @@
|
|
|
10
11
|
#
|
|
11
12
|
# Usage: source "<policy-dir>/deny-json.sh"
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
_DOFLOW_SRC=${BASH_SOURCE[0]//\\//}; case $_DOFLOW_SRC in */*) _DOFLOW_DENY_JSON_DIR=${_DOFLOW_SRC%/*} ;; *) _DOFLOW_DENY_JSON_DIR=. ;; esac
|
|
14
15
|
|
|
15
16
|
# Escape a string as a JSON string body without external tools. Work bytewise so
|
|
16
17
|
# every control byte is handled the same way regardless of the caller's locale.
|
|
@@ -53,12 +54,24 @@ emit_pretooluse_deny_nested() {
|
|
|
53
54
|
fi
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
#
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
# Advice emitters (D1, advise-only hooks). An advisory outcome never changes a decision; these put its
|
|
58
|
+
# one line where a harness shows it. Claude/Codex PreToolUse: additionalContext reaches the model, and
|
|
59
|
+
# carries no permissionDecision, so the user's own permission prompt still applies. Claude/Codex Stop:
|
|
60
|
+
# systemMessage is shown to the user and, unlike additionalContext, does not continue the turn.
|
|
61
|
+
emit_pretooluse_advice() {
|
|
62
|
+
local line="$1"
|
|
63
|
+
if command -v jq >/dev/null 2>&1; then
|
|
64
|
+
jq -n --arg line "$line" '{hookSpecificOutput: {hookEventName: "PreToolUse", additionalContext: $line}}'
|
|
65
|
+
else
|
|
66
|
+
printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","additionalContext":%s}}\n' "$(_doflow_json_reason "$line")"
|
|
67
|
+
fi
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
emit_stop_advice() {
|
|
71
|
+
local line="$1"
|
|
59
72
|
if command -v jq >/dev/null 2>&1; then
|
|
60
|
-
jq -n --arg
|
|
73
|
+
jq -n --arg line "$line" '{systemMessage: $line}'
|
|
61
74
|
else
|
|
62
|
-
printf '{"
|
|
75
|
+
printf '{"systemMessage":%s}\n' "$(_doflow_json_reason "$line")"
|
|
63
76
|
fi
|
|
64
77
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Generated by node src/runtime/context/emission-rules.js --write. Do not edit.
|
|
2
|
+
# rules-digest: sha256:3f344067dc5466521e89700b8ca03c5729dfe2e3bc0896629d4e08a5395dd4bb
|
|
3
|
+
DF_RULES_VERSION=1
|
|
4
|
+
DF_RULES_MAX_BYTES_DEFAULT=16384
|
|
5
|
+
DF_RULES_SUMMARY_CAP=4000
|
|
6
|
+
DF_RULES_SUMMARY_READ=65536
|
|
7
|
+
doflow_emission_rule() {
|
|
8
|
+
# $1 = event.segment, $2 = vector: input values joined with ':' in IC-002 order
|
|
9
|
+
case "$1|$2" in
|
|
10
|
+
'compact-instructions.instructions|main') DF_ACTION=include ;;
|
|
11
|
+
'compact-instructions.instructions|worker') DF_ACTION=include ;;
|
|
12
|
+
'compact-meta.meta|main:default-main') DF_ACTION=write ;;
|
|
13
|
+
'compact-store.summary|main:default-main') DF_ACTION=write ;;
|
|
14
|
+
'compact-store.summary|main:launched') DF_ACTION=write ;;
|
|
15
|
+
'compact-store.summary|worker:launched') DF_ACTION=write ;;
|
|
16
|
+
'delta.pack|true') DF_ACTION=include ;;
|
|
17
|
+
'launch.grant|fits:false') DF_ACTION=whole ;;
|
|
18
|
+
'launch.grant|fits:true') DF_ACTION=whole ;;
|
|
19
|
+
'launch.grant|over:false') DF_ACTION=pointer ;;
|
|
20
|
+
'launch.pack|false') DF_ACTION=include ;;
|
|
21
|
+
'launch.slot|false') DF_ACTION=claim ;;
|
|
22
|
+
'launch.summary|main:false:pending') DF_ACTION=truncate ;;
|
|
23
|
+
'launch.summary|worker:false:pending') DF_ACTION=truncate ;;
|
|
24
|
+
'legacy-adopt.legacy|main:default-main:false:false:true') DF_ACTION=adopt ;;
|
|
25
|
+
'prompt.git|main:false') DF_ACTION=include ;;
|
|
26
|
+
'prompt.grant|false:fits:false') DF_ACTION=whole ;;
|
|
27
|
+
'prompt.grant|false:fits:true') DF_ACTION=whole ;;
|
|
28
|
+
'prompt.grant|false:over:false') DF_ACTION=pointer ;;
|
|
29
|
+
'prompt.nudge|main:nudge') DF_ACTION=include ;;
|
|
30
|
+
'prompt.slot|false') DF_ACTION=claim ;;
|
|
31
|
+
'prompt.summary|main:default-main:false:false:pending') DF_ACTION=truncate ;;
|
|
32
|
+
'prompt.summary|main:launched:false:false:pending') DF_ACTION=truncate ;;
|
|
33
|
+
'prompt.summary|worker:launched:false:false:pending') DF_ACTION=truncate ;;
|
|
34
|
+
'prompt.warning|main:false:false:true') DF_ACTION=include ;;
|
|
35
|
+
*) DF_ACTION=skip ;;
|
|
36
|
+
esac
|
|
37
|
+
}
|