devrites 3.2.28 → 4.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/CHANGELOG.md +16 -144
- package/NOTICE.md +6 -5
- package/README.md +187 -95
- package/SECURITY.md +103 -79
- package/bin/devrites.mjs +140 -24
- package/docs/adr/0003-gate-model-hitl-pause.md +1 -1
- package/docs/adr/0013-native-codex-agent-orchestration.md +74 -0
- package/docs/adr/0014-native-host-hook-boundary.md +64 -0
- package/docs/adr/0015-read-only-root-native-orchestration.md +96 -0
- package/docs/adr/0016-codex-writer-fail-closed.md +53 -0
- package/docs/adr/0017-native-codex-writer-agent.md +63 -0
- package/docs/adr/0018-native-sandbox-instruction-writer-boundary.md +66 -0
- package/docs/adr/0019-native-boundary-with-deterministic-gates.md +48 -0
- package/docs/adr/0020-thin-engine-native-orchestration-boundary.md +54 -0
- package/docs/adr/0021-observable-workspace-compatibility.md +49 -0
- package/docs/adr/0022-native-orchestration-thin-engine.md +90 -0
- package/docs/adr/0023-native-workspace-reads-line-output.md +71 -0
- package/docs/adr/0024-native-policy-offline-installer-boundary.md +111 -0
- package/docs/adr/0025-evidence-gated-workspace-upgrades.md +64 -0
- package/docs/adr/0026-content-bound-proof-and-bounded-inputs.md +169 -0
- package/docs/adr/0027-content-bound-build-readiness.md +77 -0
- package/docs/adr/README.md +26 -11
- package/docs/agents/domain.md +2 -1
- package/docs/agents/issue-driven-rites.md +1 -1
- package/docs/architecture.md +191 -103
- package/docs/candidate-integrity.md +138 -0
- package/docs/capability-surface-selection.md +15 -5
- package/docs/cli.md +139 -92
- package/docs/command-map.md +88 -63
- package/docs/engine/commands.md +115 -507
- package/docs/engine/state-schema.md +94 -113
- package/docs/engine/workspace-schema.md +169 -229
- package/docs/flow.md +113 -68
- package/docs/harness-compliance.md +29 -56
- package/docs/markdown-instruction-upgrade-2026-08-02.md +302 -0
- package/docs/orchestration.md +136 -149
- package/docs/porting-to-a-new-harness.md +22 -7
- package/docs/quick-reference.md +21 -8
- package/docs/release.md +47 -4
- package/docs/skills.md +111 -72
- package/docs/templates/CRITIC_REVIEW_PACKET_TEMPLATE.md +2 -0
- package/docs/upstream-workflow-benchmark-2026-08-01.md +655 -0
- package/docs/usage.md +99 -65
- package/engine/Makefile +1 -2
- package/engine/cmd/releasepack/main.go +45 -25
- package/engine/cmd/releasepack/main_test.go +69 -0
- package/engine/commands.go +8 -258
- package/engine/harnessmatrix_test.go +28 -41
- package/engine/internal/devritespaths/paths.go +12 -28
- package/engine/internal/fsutil/copy.go +8 -0
- package/engine/internal/gate/gate.go +104 -105
- package/engine/internal/gate/gate_test.go +94 -84
- package/engine/internal/gate/readiness_binding.go +203 -0
- package/engine/internal/gate/readiness_binding_test.go +271 -0
- package/engine/internal/gitenv/env.go +46 -0
- package/engine/internal/gitenv/env_test.go +48 -0
- package/engine/internal/hostpack/hostpack.go +16 -20
- package/engine/internal/hostpack/hostpack_test.go +6 -6
- package/engine/internal/install/install.go +289 -511
- package/engine/internal/install/install_test.go +218 -306
- package/engine/internal/lib/candidate.go +475 -0
- package/engine/internal/lib/candidate_test.go +503 -0
- package/engine/internal/lib/closeout.go +17 -21
- package/engine/internal/lib/closeout_test.go +23 -0
- package/engine/internal/lib/cursor_compat_test.go +12 -75
- package/engine/internal/lib/evidencefresh.go +58 -47
- package/engine/internal/lib/evidencefresh_test.go +120 -0
- package/engine/internal/lib/resolve.go +13 -35
- package/engine/internal/lib/resolve_remediation_test.go +5 -17
- package/engine/internal/lib/secretscan.go +432 -0
- package/engine/internal/lib/secretscan_test.go +555 -0
- package/engine/internal/lib/util.go +24 -65
- package/engine/internal/lib/util_test.go +44 -0
- package/engine/internal/markdowntext/markdowntext.go +108 -0
- package/engine/internal/markdowntext/markdowntext_test.go +58 -0
- package/engine/internal/markdowntext/testdata/structural.json +27 -0
- package/engine/internal/reason/reason.go +2 -123
- package/engine/internal/reason/reason_test.go +4 -2
- package/engine/internal/rootfacts/facts.go +6 -8
- package/engine/internal/rootfacts/facts_test.go +20 -0
- package/engine/internal/state/cmd/workflowmanifest/main.go +10 -12
- package/engine/internal/state/cursor.go +53 -14
- package/engine/internal/state/cursor_test.go +57 -0
- package/engine/internal/state/feature.go +64 -154
- package/engine/internal/state/schema.go +24 -50
- package/engine/internal/state/state_test.go +151 -140
- package/engine/internal/state/status.go +4 -17
- package/engine/internal/state/workflow_manifest.json +9 -89
- package/engine/main.go +73 -502
- package/engine/root_routing_test.go +183 -212
- package/engine/testdata/fixtures/basic/devrites-root/{features/auth-tokens/feature.md → work/auth-tokens/README.md} +0 -1
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/architecture.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/assumptions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/brief.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/decision-coverage.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/eng-review.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/questions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/{features/auth-tokens/status.md → work/auth-tokens/state.md} +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/test-plan.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/traceability.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/{features/search-ranking/feature.md → work/search-ranking/README.md} +0 -1
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/assumptions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/brief.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/decisions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/questions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/state.md +2 -0
- package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +1 -1
- package/engine/testdata/golden/TestParityCloseOut/active_slug_cleared.golden +1 -1
- package/engine/tests/adr_0003_gate_exit_code_test.go +2 -2
- package/engine/tests/adr_0011_define_plan_test.go +2 -2
- package/engine/tests/adr_0027_readiness_binding_test.go +106 -0
- package/engine/tests/cli_test.go +24 -107
- package/engine/tests/gate_test.go +177 -200
- package/engine/tests/meta_test.go +5 -35
- package/engine/tests/parity_closeout_test.go +12 -12
- package/engine/tests/parity_resolve_test.go +6 -16
- package/engine/tests/parity_test.go +8 -302
- package/install.sh +201 -34
- package/pack/.claude/agents/devrites-code-reviewer.md +9 -18
- package/pack/.claude/agents/devrites-devex-reviewer.md +10 -18
- package/pack/.claude/agents/devrites-doubt-reviewer.md +10 -20
- package/pack/.claude/agents/devrites-evidence-scout.md +14 -26
- package/pack/.claude/agents/devrites-frontend-reviewer.md +9 -15
- package/pack/.claude/agents/devrites-performance-reviewer.md +13 -21
- package/pack/.claude/agents/devrites-plan-drafter.md +24 -28
- package/pack/.claude/agents/devrites-plan-reviewer.md +30 -47
- package/pack/.claude/agents/devrites-proof-runner.md +41 -47
- package/pack/.claude/agents/devrites-retrospector.md +34 -79
- package/pack/.claude/agents/devrites-security-auditor.md +9 -17
- package/pack/.claude/agents/devrites-simplifier-reviewer.md +9 -18
- package/pack/.claude/agents/devrites-slice-wright.md +44 -62
- package/pack/.claude/agents/devrites-spec-reviewer.md +38 -50
- package/pack/.claude/agents/devrites-strategy-reviewer.md +10 -19
- package/pack/.claude/agents/devrites-test-analyst.md +22 -21
- package/pack/.claude/agents/devrites-upgrade-planner.md +52 -71
- package/pack/.claude/settings.json +12 -100
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -2
- package/pack/.claude/skills/devrites-audit/SKILL.md +6 -9
- package/pack/.claude/skills/devrites-browser-proof/SKILL.md +0 -1
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +21 -27
- package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +22 -33
- package/pack/.claude/skills/devrites-doubt/SKILL.md +4 -6
- package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -2
- package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +2 -1
- package/pack/.claude/skills/devrites-interview/SKILL.md +31 -36
- package/pack/.claude/skills/devrites-lib/SKILL.md +37 -66
- package/pack/.claude/skills/devrites-lib/reference/candidate-integrity.md +51 -0
- package/pack/.claude/skills/devrites-lib/reference/intent-map.md +20 -12
- package/pack/.claude/skills/devrites-lib/reference/orchestration-profiles.md +22 -0
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +35 -110
- package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +26 -93
- package/pack/.claude/skills/devrites-lib/reference/standards/README.md +6 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +43 -34
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +90 -216
- package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +9 -28
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +13 -11
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +59 -54
- package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -5
- package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +29 -143
- package/pack/.claude/skills/devrites-lib/reference/standards/release/ship-checklist.md +5 -6
- package/pack/.claude/skills/devrites-lib/reference/standards/security.md +13 -31
- package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +112 -82
- package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +71 -45
- package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +22 -11
- package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +15 -24
- package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +106 -37
- package/pack/.claude/skills/devrites-prose-craft/SKILL.md +3 -4
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +3 -4
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +3 -3
- package/pack/.claude/skills/rite/SKILL.md +12 -13
- package/pack/.claude/skills/rite/reference/menu.md +11 -11
- package/pack/.claude/skills/rite-adopt/SKILL.md +29 -84
- package/pack/.claude/skills/rite-adopt/reference/adoption.md +16 -50
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +65 -54
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +24 -17
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +18 -21
- package/pack/.claude/skills/rite-build/SKILL.md +28 -34
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +36 -34
- package/pack/.claude/skills/rite-build/reference/anti-patterns.md +5 -19
- package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +10 -9
- package/pack/.claude/skills/rite-build/reference/checkpoint.md +17 -17
- package/pack/.claude/skills/rite-build/reference/frontend-trigger.md +3 -3
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +11 -14
- package/pack/.claude/skills/rite-build/reference/output.md +14 -24
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +49 -188
- package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +43 -133
- package/pack/.claude/skills/rite-clarify/SKILL.md +46 -40
- package/pack/.claude/skills/rite-clarify/reference/decision-coverage.md +4 -10
- package/pack/.claude/skills/rite-converge/SKILL.md +9 -33
- package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +2 -2
- package/pack/.claude/skills/rite-customize/SKILL.md +34 -50
- package/pack/.claude/skills/rite-define/SKILL.md +34 -58
- package/pack/.claude/skills/rite-define/reference/plan-template.md +15 -0
- package/pack/.claude/skills/rite-doctor/SKILL.md +52 -64
- package/pack/.claude/skills/rite-dogfood/SKILL.md +1 -2
- package/pack/.claude/skills/rite-explain/SKILL.md +1 -20
- package/pack/.claude/skills/rite-frame/SKILL.md +1 -7
- package/pack/.claude/skills/rite-frame/reference/failure-modes.md +1 -1
- package/pack/.claude/skills/rite-handoff/SKILL.md +1 -2
- package/pack/.claude/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/.claude/skills/rite-learn/SKILL.md +44 -104
- package/pack/.claude/skills/rite-plan/SKILL.md +14 -26
- package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +4 -1
- package/pack/.claude/skills/rite-polish/SKILL.md +20 -28
- package/pack/.claude/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/{generated/claude/skills/rite-ship → .claude/skills/rite-polish}/reference/design-memory.md +23 -21
- package/pack/.claude/skills/rite-polish/reference/ledger.md +62 -0
- package/pack/.claude/skills/rite-pov/SKILL.md +28 -32
- package/pack/.claude/skills/rite-pr-feedback/SKILL.md +0 -1
- package/pack/.claude/skills/rite-pressure-test/SKILL.md +6 -13
- package/pack/.claude/skills/rite-prototype/SKILL.md +0 -6
- package/pack/.claude/skills/rite-prove/SKILL.md +73 -68
- package/pack/.claude/skills/rite-prove/reference/acceptance-proof.md +34 -30
- package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +15 -14
- package/pack/.claude/skills/rite-quick/SKILL.md +5 -19
- package/pack/.claude/skills/rite-resolve/SKILL.md +4 -21
- package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +2 -2
- package/pack/.claude/skills/rite-review/SKILL.md +34 -57
- package/pack/.claude/skills/rite-seal/SKILL.md +54 -87
- package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +2 -2
- package/pack/.claude/skills/rite-seal/reference/final-evidence.md +31 -56
- package/pack/.claude/skills/rite-seal/reference/go-no-go.md +27 -51
- package/pack/.claude/skills/rite-seal/reference/output.md +2 -4
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +42 -140
- package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +2 -2
- package/pack/.claude/skills/rite-seal/reference/seal-template.md +17 -28
- package/pack/.claude/skills/rite-ship/SKILL.md +65 -93
- package/pack/.claude/skills/rite-ship/reference/anti-patterns.md +4 -1
- package/pack/.claude/skills/rite-ship/reference/close-out.md +4 -12
- package/pack/.claude/skills/rite-ship/reference/git-ship.md +86 -48
- package/pack/.claude/skills/rite-ship/reference/ship-template.md +22 -16
- package/pack/.claude/skills/rite-spec/SKILL.md +62 -95
- package/pack/.claude/skills/rite-spec/reference/investigation.md +1 -4
- package/pack/.claude/skills/rite-spec/reference/question-protocol.md +21 -20
- package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +16 -17
- package/pack/.claude/skills/rite-spec/reference/spec-template.md +47 -49
- package/pack/.claude/skills/rite-spec/reference/state-workspace.md +28 -13
- package/pack/.claude/skills/rite-status/SKILL.md +30 -88
- package/pack/.claude/skills/rite-temper/SKILL.md +12 -31
- package/pack/.claude/skills/rite-upgrade/SKILL.md +86 -101
- package/pack/.claude/skills/rite-vet/SKILL.md +88 -117
- package/pack/.claude/skills/rite-vet/reference/artifacts.md +56 -50
- package/pack/.claude/skills/rite-vet/reference/cross-model.md +15 -39
- package/pack/.claude/skills/rite-vet/reference/depth.md +2 -2
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +3 -6
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +0 -6
- package/pack/generated/README.md +2 -2
- package/pack/generated/claude/agents/devrites-code-reviewer.md +9 -18
- package/pack/generated/claude/agents/devrites-devex-reviewer.md +10 -18
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +10 -20
- package/pack/generated/claude/agents/devrites-evidence-scout.md +14 -26
- package/pack/generated/claude/agents/devrites-frontend-reviewer.md +9 -15
- package/pack/generated/claude/agents/devrites-performance-reviewer.md +13 -21
- package/pack/generated/claude/agents/devrites-plan-drafter.md +24 -28
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +30 -47
- package/pack/generated/claude/agents/devrites-proof-runner.md +41 -47
- package/pack/generated/claude/agents/devrites-retrospector.md +34 -79
- package/pack/generated/claude/agents/devrites-security-auditor.md +9 -17
- package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +9 -18
- package/pack/generated/claude/agents/devrites-slice-wright.md +44 -62
- package/pack/generated/claude/agents/devrites-spec-reviewer.md +38 -50
- package/pack/generated/claude/agents/devrites-strategy-reviewer.md +10 -19
- package/pack/generated/claude/agents/devrites-test-analyst.md +22 -21
- package/pack/generated/claude/agents/devrites-upgrade-planner.md +52 -71
- package/pack/generated/claude/settings.json +12 -100
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -2
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +6 -9
- package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +0 -1
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +21 -27
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +22 -33
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +4 -6
- package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -2
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +2 -1
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +31 -36
- package/pack/generated/claude/skills/devrites-lib/SKILL.md +37 -66
- package/pack/generated/claude/skills/devrites-lib/reference/candidate-integrity.md +51 -0
- package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +20 -12
- package/pack/generated/claude/skills/devrites-lib/reference/orchestration-profiles.md +22 -0
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +35 -110
- package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +26 -93
- package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +6 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +43 -34
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +90 -216
- package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +9 -28
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +13 -11
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +59 -54
- package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -5
- package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +29 -143
- package/pack/generated/claude/skills/devrites-lib/reference/standards/release/ship-checklist.md +5 -6
- package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +13 -31
- package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +112 -82
- package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +71 -45
- package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +22 -11
- package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +15 -24
- package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +106 -37
- package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +3 -4
- package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +3 -4
- package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +3 -3
- package/pack/generated/claude/skills/rite/SKILL.md +12 -13
- package/pack/generated/claude/skills/rite/reference/menu.md +11 -11
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +29 -84
- package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +16 -50
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +65 -54
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +24 -17
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +18 -21
- package/pack/generated/claude/skills/rite-build/SKILL.md +28 -34
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +36 -34
- package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +5 -19
- package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +10 -9
- package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +17 -17
- package/pack/generated/claude/skills/rite-build/reference/frontend-trigger.md +3 -3
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +11 -14
- package/pack/generated/claude/skills/rite-build/reference/output.md +14 -24
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +49 -188
- package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +43 -133
- package/pack/generated/claude/skills/rite-clarify/SKILL.md +46 -40
- package/pack/generated/claude/skills/rite-clarify/reference/decision-coverage.md +4 -10
- package/pack/generated/claude/skills/rite-converge/SKILL.md +9 -33
- package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +2 -2
- package/pack/generated/claude/skills/rite-customize/SKILL.md +34 -50
- package/pack/generated/claude/skills/rite-define/SKILL.md +34 -58
- package/pack/generated/claude/skills/rite-define/reference/plan-template.md +15 -0
- package/pack/generated/claude/skills/rite-doctor/SKILL.md +52 -64
- package/pack/generated/claude/skills/rite-dogfood/SKILL.md +1 -2
- package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -20
- package/pack/generated/claude/skills/rite-frame/SKILL.md +1 -7
- package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +1 -1
- package/pack/generated/claude/skills/rite-handoff/SKILL.md +1 -2
- package/pack/generated/claude/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/claude/skills/rite-learn/SKILL.md +44 -104
- package/pack/generated/claude/skills/rite-plan/SKILL.md +14 -26
- package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +4 -1
- package/pack/generated/claude/skills/rite-polish/SKILL.md +20 -28
- package/pack/generated/claude/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/generated/{codex/skills/rite-ship → claude/skills/rite-polish}/reference/design-memory.md +23 -21
- package/pack/generated/claude/skills/rite-polish/reference/ledger.md +62 -0
- package/pack/generated/claude/skills/rite-pov/SKILL.md +28 -32
- package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +0 -1
- package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +6 -13
- package/pack/generated/claude/skills/rite-prototype/SKILL.md +0 -6
- package/pack/generated/claude/skills/rite-prove/SKILL.md +73 -68
- package/pack/generated/claude/skills/rite-prove/reference/acceptance-proof.md +34 -30
- package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +15 -14
- package/pack/generated/claude/skills/rite-quick/SKILL.md +5 -19
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +4 -21
- package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +2 -2
- package/pack/generated/claude/skills/rite-review/SKILL.md +34 -57
- package/pack/generated/claude/skills/rite-seal/SKILL.md +54 -87
- package/pack/generated/claude/skills/rite-seal/reference/anti-patterns.md +2 -2
- package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +31 -56
- package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +27 -51
- package/pack/generated/claude/skills/rite-seal/reference/output.md +2 -4
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +42 -140
- package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +2 -2
- package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +17 -28
- package/pack/generated/claude/skills/rite-ship/SKILL.md +65 -93
- package/pack/generated/claude/skills/rite-ship/reference/anti-patterns.md +4 -1
- package/pack/generated/claude/skills/rite-ship/reference/close-out.md +4 -12
- package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +86 -48
- package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +22 -16
- package/pack/generated/claude/skills/rite-spec/SKILL.md +62 -95
- package/pack/generated/claude/skills/rite-spec/reference/investigation.md +1 -4
- package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +21 -20
- package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +16 -17
- package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +47 -49
- package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +28 -13
- package/pack/generated/claude/skills/rite-status/SKILL.md +30 -88
- package/pack/generated/claude/skills/rite-temper/SKILL.md +12 -31
- package/pack/generated/claude/skills/rite-upgrade/SKILL.md +86 -101
- package/pack/generated/claude/skills/rite-vet/SKILL.md +88 -117
- package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +56 -50
- package/pack/generated/claude/skills/rite-vet/reference/cross-model.md +15 -39
- package/pack/generated/claude/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +3 -6
- package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +0 -6
- package/pack/generated/codex/AGENTS.md +5 -4
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +8 -27
- package/pack/generated/codex/agents/devrites-devex-reviewer.toml +9 -27
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +9 -29
- package/pack/generated/codex/agents/devrites-evidence-scout.toml +14 -36
- package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +8 -24
- package/pack/generated/codex/agents/devrites-performance-reviewer.toml +12 -30
- package/pack/generated/codex/agents/devrites-plan-drafter.toml +24 -38
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +30 -57
- package/pack/generated/codex/agents/devrites-proof-runner.toml +41 -57
- package/pack/generated/codex/agents/devrites-retrospector.toml +34 -89
- package/pack/generated/codex/agents/devrites-security-auditor.toml +8 -26
- package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +8 -27
- package/pack/generated/codex/agents/devrites-slice-wright.toml +44 -71
- package/pack/generated/codex/agents/devrites-spec-reviewer.toml +38 -60
- package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +9 -28
- package/pack/generated/codex/agents/devrites-test-analyst.toml +21 -30
- package/pack/generated/codex/agents/devrites-upgrade-planner.toml +52 -81
- package/pack/generated/codex/config.toml +7 -0
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -21
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +6 -28
- package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +1 -21
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +21 -46
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +22 -33
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +4 -25
- package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +1 -21
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +2 -1
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +32 -56
- package/pack/generated/codex/skills/devrites-lib/SKILL.md +38 -86
- package/pack/generated/codex/skills/devrites-lib/reference/candidate-integrity.md +51 -0
- package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +20 -12
- package/pack/generated/codex/skills/devrites-lib/reference/orchestration-profiles.md +22 -0
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +35 -110
- package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +26 -93
- package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +6 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +43 -34
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +90 -216
- package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +9 -28
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +13 -11
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +59 -54
- package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -5
- package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +29 -143
- package/pack/generated/codex/skills/devrites-lib/reference/standards/release/ship-checklist.md +5 -6
- package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +13 -31
- package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +112 -82
- package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +71 -45
- package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +22 -11
- package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +15 -24
- package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +106 -37
- package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +3 -23
- package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +3 -23
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +3 -22
- package/pack/generated/codex/skills/rite/SKILL.md +12 -32
- package/pack/generated/codex/skills/rite/reference/menu.md +11 -11
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +29 -103
- package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +16 -50
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +65 -73
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +24 -17
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +18 -21
- package/pack/generated/codex/skills/rite-build/SKILL.md +28 -53
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +36 -34
- package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +5 -19
- package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +10 -9
- package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +17 -17
- package/pack/generated/codex/skills/rite-build/reference/frontend-trigger.md +3 -3
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +11 -14
- package/pack/generated/codex/skills/rite-build/reference/output.md +14 -24
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +49 -188
- package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +43 -133
- package/pack/generated/codex/skills/rite-clarify/SKILL.md +46 -59
- package/pack/generated/codex/skills/rite-clarify/reference/decision-coverage.md +4 -10
- package/pack/generated/codex/skills/rite-converge/SKILL.md +9 -52
- package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +2 -2
- package/pack/generated/codex/skills/rite-customize/SKILL.md +32 -67
- package/pack/generated/codex/skills/rite-define/SKILL.md +34 -77
- package/pack/generated/codex/skills/rite-define/reference/plan-template.md +15 -0
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +52 -83
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +1 -21
- package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -39
- package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -26
- package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +1 -1
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +1 -21
- package/pack/generated/codex/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/codex/skills/rite-learn/SKILL.md +44 -123
- package/pack/generated/codex/skills/rite-plan/SKILL.md +14 -45
- package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +4 -1
- package/pack/generated/codex/skills/rite-polish/SKILL.md +20 -47
- package/pack/generated/codex/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/{.claude/skills/rite-ship → generated/codex/skills/rite-polish}/reference/design-memory.md +23 -21
- package/pack/generated/codex/skills/rite-polish/reference/ledger.md +62 -0
- package/pack/generated/codex/skills/rite-pov/SKILL.md +28 -51
- package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +0 -20
- package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +6 -32
- package/pack/generated/codex/skills/rite-prototype/SKILL.md +0 -25
- package/pack/generated/codex/skills/rite-prove/SKILL.md +73 -87
- package/pack/generated/codex/skills/rite-prove/reference/acceptance-proof.md +34 -30
- package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +15 -14
- package/pack/generated/codex/skills/rite-quick/SKILL.md +5 -38
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +4 -40
- package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +2 -2
- package/pack/generated/codex/skills/rite-review/SKILL.md +34 -76
- package/pack/generated/codex/skills/rite-seal/SKILL.md +51 -103
- package/pack/generated/codex/skills/rite-seal/reference/anti-patterns.md +2 -2
- package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +31 -56
- package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +27 -51
- package/pack/generated/codex/skills/rite-seal/reference/output.md +2 -4
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +42 -140
- package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +2 -2
- package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +17 -28
- package/pack/generated/codex/skills/rite-ship/SKILL.md +65 -112
- package/pack/generated/codex/skills/rite-ship/reference/anti-patterns.md +4 -1
- package/pack/generated/codex/skills/rite-ship/reference/close-out.md +4 -12
- package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +86 -48
- package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +22 -16
- package/pack/generated/codex/skills/rite-spec/SKILL.md +62 -114
- package/pack/generated/codex/skills/rite-spec/reference/investigation.md +1 -4
- package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +21 -20
- package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +16 -17
- package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +47 -49
- package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +28 -13
- package/pack/generated/codex/skills/rite-status/SKILL.md +30 -107
- package/pack/generated/codex/skills/rite-temper/SKILL.md +12 -50
- package/pack/generated/codex/skills/rite-upgrade/SKILL.md +86 -120
- package/pack/generated/codex/skills/rite-vet/SKILL.md +88 -136
- package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +56 -50
- package/pack/generated/codex/skills/rite-vet/reference/cross-model.md +15 -39
- package/pack/generated/codex/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +3 -6
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +0 -25
- package/package.json +6 -5
- package/scripts/build-host-artifacts.sh +5 -9
- package/scripts/codex-generate.sh +18 -278
- package/scripts/install-lib.sh +121 -34
- package/uninstall.sh +19 -17
- package/update.sh +26 -18
- package/docs/engine/agent-contract.md +0 -172
- package/docs/extensions.md +0 -178
- package/engine/git_guard.go +0 -187
- package/engine/git_guard_test.go +0 -283
- package/engine/harnessmatrix.go +0 -60
- package/engine/hookpolicy.go +0 -113
- package/engine/hookpolicy_test.go +0 -160
- package/engine/hooks.go +0 -677
- package/engine/hooks_agent_dispatch.go +0 -1726
- package/engine/hooks_events_test.go +0 -431
- package/engine/hooks_workspace.go +0 -1196
- package/engine/internal/doctor/doctor.go +0 -306
- package/engine/internal/doctor/doctor_test.go +0 -252
- package/engine/internal/forge/forge.go +0 -938
- package/engine/internal/forge/forge_test.go +0 -576
- package/engine/internal/forge/git.go +0 -245
- package/engine/internal/forge/liveness_unix.go +0 -48
- package/engine/internal/forge/liveness_windows.go +0 -67
- package/engine/internal/forge/manifest.go +0 -402
- package/engine/internal/harness/compliance.go +0 -96
- package/engine/internal/harness/harness.go +0 -301
- package/engine/internal/harness/harness_test.go +0 -124
- package/engine/internal/iohooks/detach_other.go +0 -11
- package/engine/internal/iohooks/detach_unix.go +0 -11
- package/engine/internal/iohooks/iohooks.go +0 -839
- package/engine/internal/iohooks/iohooks_test.go +0 -561
- package/engine/internal/lib/adoption.go +0 -659
- package/engine/internal/lib/adoption_test.go +0 -121
- package/engine/internal/lib/analyze.go +0 -232
- package/engine/internal/lib/archivesearch.go +0 -125
- package/engine/internal/lib/archivesearch_test.go +0 -138
- package/engine/internal/lib/budget.go +0 -172
- package/engine/internal/lib/buildreadiness.go +0 -111
- package/engine/internal/lib/checkacceptance.go +0 -176
- package/engine/internal/lib/clarifyreturn.go +0 -91
- package/engine/internal/lib/clarifyreturn_test.go +0 -123
- package/engine/internal/lib/command_other.go +0 -7
- package/engine/internal/lib/command_unix.go +0 -24
- package/engine/internal/lib/context.go +0 -280
- package/engine/internal/lib/conventions.go +0 -449
- package/engine/internal/lib/coverage.go +0 -145
- package/engine/internal/lib/dispatchwaive.go +0 -31
- package/engine/internal/lib/dispatchwaive_test.go +0 -23
- package/engine/internal/lib/doubtcoverage.go +0 -78
- package/engine/internal/lib/extensions.go +0 -622
- package/engine/internal/lib/extensions_test.go +0 -305
- package/engine/internal/lib/footprint.go +0 -239
- package/engine/internal/lib/gitauthority.go +0 -601
- package/engine/internal/lib/gitauthority_test.go +0 -346
- package/engine/internal/lib/jsonout.go +0 -129
- package/engine/internal/lib/jsonout_test.go +0 -73
- package/engine/internal/lib/lanes.go +0 -112
- package/engine/internal/lib/learnings.go +0 -397
- package/engine/internal/lib/learnings_inject_test.go +0 -77
- package/engine/internal/lib/learnings_remediation_test.go +0 -24
- package/engine/internal/lib/ledger.go +0 -311
- package/engine/internal/lib/ledger_test.go +0 -186
- package/engine/internal/lib/mutationgate.go +0 -89
- package/engine/internal/lib/observability_test.go +0 -358
- package/engine/internal/lib/overrides.go +0 -164
- package/engine/internal/lib/overrides_test.go +0 -112
- package/engine/internal/lib/preamble.go +0 -159
- package/engine/internal/lib/preamble_questions_test.go +0 -10
- package/engine/internal/lib/progress.go +0 -210
- package/engine/internal/lib/provenance.go +0 -462
- package/engine/internal/lib/provenance_test.go +0 -154
- package/engine/internal/lib/readiness_contract.json +0 -118
- package/engine/internal/lib/readinessartifact.go +0 -533
- package/engine/internal/lib/readinessartifact_test.go +0 -422
- package/engine/internal/lib/reconcile.go +0 -1496
- package/engine/internal/lib/reconcile_test.go +0 -1071
- package/engine/internal/lib/recoveryattempts.go +0 -298
- package/engine/internal/lib/recoveryattempts_test.go +0 -215
- package/engine/internal/lib/reviewers.go +0 -143
- package/engine/internal/lib/reviewers_test.go +0 -45
- package/engine/internal/lib/reviewerstats.go +0 -199
- package/engine/internal/lib/reviewerstats_test.go +0 -104
- package/engine/internal/lib/reviewintegrity.go +0 -143
- package/engine/internal/lib/reviewintegrity_test.go +0 -103
- package/engine/internal/lib/runbook.go +0 -295
- package/engine/internal/lib/runbook_context_test.go +0 -182
- package/engine/internal/lib/session.go +0 -1020
- package/engine/internal/lib/session_test.go +0 -177
- package/engine/internal/lib/specparse.go +0 -125
- package/engine/internal/lib/specskeleton.go +0 -79
- package/engine/internal/lib/specvalidate.go +0 -391
- package/engine/internal/lib/specvalidate_test.go +0 -185
- package/engine/internal/lib/stuck.go +0 -206
- package/engine/internal/lib/templates/conventions_drift.tmpl +0 -6
- package/engine/internal/lib/templates/conventions_ledger_header.md +0 -6
- package/engine/internal/lib/templates/conventions_orient_header.txt +0 -1
- package/engine/internal/lib/testintegrity.go +0 -199
- package/engine/internal/lib/testintegrity_test.go +0 -149
- package/engine/internal/lib/tickafk.go +0 -86
- package/engine/internal/migrate/migrate.go +0 -279
- package/engine/internal/migrate/migrate_test.go +0 -157
- package/engine/internal/orient/firstrun.go +0 -50
- package/engine/internal/orient/firstrun_test.go +0 -72
- package/engine/internal/orient/orient.go +0 -69
- package/engine/internal/orient/orient_test.go +0 -25
- package/engine/internal/profile/profile.go +0 -284
- package/engine/internal/profile/profile_test.go +0 -13
- package/engine/internal/state/clarify_transition.go +0 -165
- package/engine/internal/state/clarify_transition_test.go +0 -130
- package/engine/internal/state/snapshot.go +0 -457
- package/engine/internal/toolpolicy/classifier.go +0 -533
- package/engine/internal/toolpolicy/classifier_test.go +0 -424
- package/engine/internal/toolpolicy/git.go +0 -616
- package/engine/internal/toolpolicy/scanner.go +0 -382
- package/engine/observability_cli_test.go +0 -52
- package/engine/profile_test.go +0 -76
- package/engine/subagent_orient_context.txt +0 -8
- package/engine/testdata/golden/TestParityA1Guard/devrites-edit-allowed.golden +0 -1
- package/engine/testdata/golden/TestParityA1Guard/no-window-silent.golden +0 -1
- package/engine/testdata/golden/TestParityA1Guard/non-edit-tool.golden +0 -1
- package/engine/testdata/golden/TestParityA1Guard/observe-mode-silent.golden +0 -1
- package/engine/testdata/golden/TestParityA1Guard/source-edit-enforce-denies.golden +0 -2
- package/engine/testdata/golden/TestParityA1Guard/subagent-allowed.golden +0 -1
- package/engine/testdata/golden/TestParityAnalyze/noactive.golden +0 -1
- package/engine/testdata/golden/TestParityAnalyze/slug=covered.golden +0 -15
- package/engine/testdata/golden/TestParityAnalyze/slug=dangling.golden +0 -16
- package/engine/testdata/golden/TestParityAnalyze/slug=ghost.golden +0 -1
- package/engine/testdata/golden/TestParityAnalyze/slug=noac.golden +0 -15
- package/engine/testdata/golden/TestParityAnalyze/slug=order.golden +0 -17
- package/engine/testdata/golden/TestParityAnalyze/slug=orphan.golden +0 -16
- package/engine/testdata/golden/TestParityAnalyze/slug=uncovered.golden +0 -16
- package/engine/testdata/golden/TestParityBudget/default-active.golden +0 -4
- package/engine/testdata/golden/TestParityBudget/extra-md.golden +0 -5
- package/engine/testdata/golden/TestParityBudget/no-active.golden +0 -1
- package/engine/testdata/golden/TestParityBudget/no-feature.golden +0 -1
- package/engine/testdata/golden/TestParityBudget/over-advisory.golden +0 -6
- package/engine/testdata/golden/TestParityBudget/over-strict.golden +0 -6
- package/engine/testdata/golden/TestParityBudget/within.golden +0 -6
- package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +0 -2
- package/engine/testdata/golden/TestParityBuildReadiness/arg=approvenone.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=await.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=blocked.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=clarifyopen.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +0 -2
- package/engine/testdata/golden/TestParityBuildReadiness/arg=ghost.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=legacycontract.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=noapprove.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=noclarify.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=novet.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=stalevet.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +0 -2
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +0 -2
- package/engine/testdata/golden/TestParityBuildReadiness/arg=vetnotready.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=blank-section.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=empty.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-dropped.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-ok.golden +0 -2
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-unchecked.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-gap.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-ok.golden +0 -2
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=no-seal.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=no-section.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=nonexistent.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance.golden +0 -1
- package/engine/testdata/golden/TestParityCoverage/arg=flat.golden +0 -7
- package/engine/testdata/golden/TestParityCoverage/arg=full.golden +0 -10
- package/engine/testdata/golden/TestParityCoverage/arg=nonexistent.golden +0 -1
- package/engine/testdata/golden/TestParityCoverage/arg=nospec.golden +0 -1
- package/engine/testdata/golden/TestParityCoverage/arg=speconly.golden +0 -9
- package/engine/testdata/golden/TestParityCoverage.golden +0 -1
- package/engine/testdata/golden/TestParityCursor/bare.golden +0 -3
- package/engine/testdata/golden/TestParityCursor/full-afk.golden +0 -6
- package/engine/testdata/golden/TestParityCursor/full-hitl.golden +0 -5
- package/engine/testdata/golden/TestParityCursor/no-active.golden +0 -1
- package/engine/testdata/golden/TestParityCursor/red.golden +0 -5
- package/engine/testdata/golden/TestParityCursor/zerogates.golden +0 -5
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=doubted.golden +0 -2
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=ghost.golden +0 -2
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing.golden +0 -3
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nodoubt.golden +0 -4
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nolog.golden +0 -2
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nowright.golden +0 -2
- package/engine/testdata/golden/TestParityDoubtCoverage.golden +0 -1
- package/engine/testdata/golden/TestParityMutationGate/active-slug.golden +0 -3
- package/engine/testdata/golden/TestParityMutationGate/explicit-slug.golden +0 -3
- package/engine/testdata/golden/TestParityMutationGate/ghost.golden +0 -1
- package/engine/testdata/golden/TestParityOrientSilentPath.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/bad-mode.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/check-clean/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/check-clean.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/check-no-base.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/check-no-claimed/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/check-violation/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/check-violation.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/close-window/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/close-window.golden +0 -3
- package/engine/testdata/golden/TestParityReconcile/not-git.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/snapshot/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/snapshot-no-allowlist.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityRedwatch/fail-writes-red.golden +0 -2
- package/engine/testdata/golden/TestParityRedwatch/non-bash-tool.golden +0 -1
- package/engine/testdata/golden/TestParityRedwatch/non-test-command.golden +0 -1
- package/engine/testdata/golden/TestParityRedwatch/pass-clears-red.golden +0 -1
- package/engine/testdata/golden/TestParityResolve/next-qid.golden +0 -2
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-devrites-agent-denies.golden +0 -2
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-non-devrites-allows.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-subagent-type-only-allows.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-git-commit.golden +0 -2
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-mutating.golden +0 -2
- package/engine/testdata/golden/TestParityReviewerReadonly/non-bash-tool.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/non-tool-input.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/observe-mutating-silent.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/safe-bash-command.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=dup.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=empty.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=flat.golden +0 -2
- package/engine/testdata/golden/TestParitySpecValidate/arg=nonexistent.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=noscenario.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=noshall.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=nothen.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid/spec.md.golden +0 -2
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid.golden +0 -2
- package/engine/testdata/golden/TestParitySpecValidate.golden +0 -1
- package/engine/testdata/golden/TestParityStatusline/full-afk.golden +0 -2
- package/engine/testdata/golden/TestParityStatusline/full-hitl.golden +0 -2
- package/engine/testdata/golden/TestParityStatusline/no-active.golden +0 -1
- package/engine/testdata/golden/TestParityStatusline/nophase.golden +0 -2
- package/engine/testdata/golden/TestParityStatusline/red.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/bad-cmd.golden +0 -1
- package/engine/testdata/golden/TestParityStuckCheck/custom-window-2.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/dominant.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/few.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/ghost.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/identical.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/no-cmd.golden +0 -1
- package/engine/testdata/golden/TestParityStuckCheck/no-slug.golden +0 -1
- package/engine/testdata/golden/TestParityStuckCheck/nolog.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/pingpong.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/varied.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-04-identical.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-2.5-varied4.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-4x-varied4.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-leadspace-varied4.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-plus4-identical.golden +0 -2
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent-subagent-type-key.golden +0 -2
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent.golden +0 -2
- package/engine/testdata/golden/TestParitySubagentOrient/garbage-input.golden +0 -1
- package/engine/testdata/golden/TestParitySubagentOrient/non-devrites-agent.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/assertion-dropped.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/clean.golden +0 -2
- package/engine/testdata/golden/TestParityTestIntegrity/deleted.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/ghost-workspace.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/not-git.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/skip-added.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/budget1/state.md.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/budget1.golden +0 -2
- package/engine/testdata/golden/TestParityTickAfk/budget3/state.md.golden +0 -5
- package/engine/testdata/golden/TestParityTickAfk/budget3.golden +0 -2
- package/engine/testdata/golden/TestParityTickAfk/bulletPipe/state.md.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/bulletPipe.golden +0 -2
- package/engine/testdata/golden/TestParityTickAfk/missingField/state.md.golden +0 -3
- package/engine/testdata/golden/TestParityTickAfk/missingField.golden +0 -2
- package/engine/testdata/golden/TestParityTickAfk/missingFile.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/nonNumeric/state.md.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/nonNumeric.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/none/state.md.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/none.golden +0 -2
- package/engine/testdata/golden/TestParityWrightScope/agent-required-non-wright.golden +0 -1
- package/engine/testdata/golden/TestParityWrightScope/devrites-edit-denied.golden +0 -2
- package/engine/testdata/golden/TestParityWrightScope/in-scope-allowed.golden +0 -1
- package/engine/testdata/golden/TestParityWrightScope/non-edit-tool.golden +0 -1
- package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +0 -2
- package/engine/testdata/golden/TestParityWrightScope/out-of-scope-observe-silent.golden +0 -1
- package/engine/testdata/golden/TestSpecSkeleton/missing-some.golden +0 -2
- package/engine/testdata/golden/TestSpecSkeleton/present-all.golden +0 -2
- package/engine/testdata/golden/TestStuckLogHashParity.golden +0 -1
- package/engine/tests/adr_0006_clock_seam_test.go +0 -36
- package/engine/tests/budget_test.go +0 -88
- package/engine/tests/canonical_ac_ids_test.go +0 -44
- package/engine/tests/concurrency_cli_test.go +0 -131
- package/engine/tests/conventions_test.go +0 -106
- package/engine/tests/doctor_cli_test.go +0 -223
- package/engine/tests/forge_cli_test.go +0 -463
- package/engine/tests/hook_test.go +0 -2778
- package/engine/tests/hooks_io_test.go +0 -309
- package/engine/tests/json_contract_test.go +0 -224
- package/engine/tests/lib_parity_test.go +0 -930
- package/engine/tests/migrate_cli_test.go +0 -195
- package/engine/tests/parity_analyze_test.go +0 -55
- package/engine/tests/parity_buildreadiness_test.go +0 -199
- package/engine/tests/parity_learnings_test.go +0 -89
- package/engine/tests/parity_mutationgate_test.go +0 -36
- package/engine/tests/parity_reconcile_test.go +0 -94
- package/engine/tests/parity_testintegrity_test.go +0 -65
- package/engine/tests/parity_tickafk_test.go +0 -83
- package/engine/validatepack.go +0 -192
- package/engine/validatepack_test.go +0 -79
- package/engine/validatepackskills.go +0 -181
- package/engine/validatepackskills_test.go +0 -171
- package/pack/.claude/agents/devrites-forge-judge.md +0 -118
- package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +0 -44
- package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +0 -52
- package/pack/.claude/skills/rite-build/reference/evidence-standard.md +0 -45
- package/pack/.claude/skills/rite-build/reference/forge.md +0 -210
- package/pack/.claude/skills/rite-seal/reference/conventions-ledger.md +0 -60
- package/pack/.claude/skills/rite-ship/reference/adr-promotion.md +0 -9
- package/pack/.claude/skills/rite-ship/reference/ledger.md +0 -56
- package/pack/generated/claude/agents/devrites-forge-judge.md +0 -118
- package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +0 -44
- package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +0 -52
- package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +0 -45
- package/pack/generated/claude/skills/rite-build/reference/forge.md +0 -210
- package/pack/generated/claude/skills/rite-seal/reference/conventions-ledger.md +0 -60
- package/pack/generated/claude/skills/rite-ship/reference/adr-promotion.md +0 -9
- package/pack/generated/claude/skills/rite-ship/reference/ledger.md +0 -56
- package/pack/generated/codex/agents/devrites-forge-judge.toml +0 -128
- package/pack/generated/codex/hooks.json +0 -185
- package/pack/generated/codex/skills/devrites-api-interface/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-audit/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-browser-proof/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-debug-recovery/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-doubt/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-frontend-craft/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-interview/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +0 -44
- package/pack/generated/codex/skills/devrites-prose-craft/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +0 -71
- package/pack/generated/codex/skills/devrites-refresh-indexes/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-source-driven/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-ux-shape/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +0 -45
- package/pack/generated/codex/skills/rite-build/reference/forge.md +0 -210
- package/pack/generated/codex/skills/rite-seal/reference/conventions-ledger.md +0 -60
- package/pack/generated/codex/skills/rite-ship/reference/adr-promotion.md +0 -9
- package/pack/generated/codex/skills/rite-ship/reference/ledger.md +0 -56
- package/scripts/build-binaries.sh +0 -75
- package/scripts/build-release-tarball.sh +0 -105
- package/scripts/check-authority-drift.py +0 -125
- package/scripts/check-cross-refs.py +0 -139
- package/scripts/check-generated-skill-budget.mjs +0 -42
- package/scripts/check-instruction-size-baseline.mjs +0 -88
- package/scripts/check-invocation-integrity.py +0 -115
- package/scripts/check-no-global-writes.sh +0 -66
- package/scripts/check-no-personal-paths.py +0 -50
- package/scripts/check-npm-audit.mjs +0 -110
- package/scripts/check-reference-governance.mjs +0 -83
- package/scripts/check-reply-contract.sh +0 -64
- package/scripts/check-rule-uniqueness.sh +0 -45
- package/scripts/devrites-detect.sh +0 -176
- package/scripts/grade-feature.sh +0 -204
- package/scripts/live-hosts/agent-result.schema.json +0 -231
- package/scripts/live-hosts/claude.sh +0 -87
- package/scripts/live-hosts/codex.sh +0 -85
- package/scripts/live-hosts/common.sh +0 -113
- package/scripts/live-hosts/fake-host.py +0 -257
- package/scripts/live-hosts/host-transport.py +0 -286
- package/scripts/npm-audit-exceptions.json +0 -26
- package/scripts/pin.sh +0 -249
- package/scripts/release-check.sh +0 -75
- package/scripts/run-agent-contract-evals.py +0 -1380
- package/scripts/run-behavioral-evals.sh +0 -196
- package/scripts/run-evals.sh +0 -132
- package/scripts/run-live-behavioral-evals.py +0 -1310
- package/scripts/run-outcome-evals.sh +0 -454
- package/scripts/run-routing-evals.py +0 -342
- package/scripts/run-tests.mjs +0 -232
- package/scripts/scan-pack-security.py +0 -209
- package/scripts/scan-supply-chain-iocs.py +0 -127
- package/scripts/skill-pruning-audit.mjs +0 -121
- package/scripts/skills-inventory.mjs +0 -125
- package/scripts/supply-chain-iocs.json +0 -11
- package/scripts/sync-version.sh +0 -54
- package/scripts/validate-agent-composition.py +0 -57
- package/scripts/validate-command-parity.py +0 -70
- package/scripts/validate-frontmatter.py +0 -218
- package/scripts/validate-skill-anatomy.py +0 -139
- package/scripts/validate-workflow-security.py +0 -184
- package/scripts/validate-workspace-schema.py +0 -800
- package/scripts/validate.sh +0 -354
- package/scripts/workflow_schema.py +0 -69
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/auth-tokens/decisions.md +0 -0
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/auth-tokens/plan.md +0 -0
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/auth-tokens/spec.md +0 -0
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/auth-tokens/tasks.md +0 -0
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/search-ranking/spec.md +0 -0
package/update.sh
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# update.sh -
|
|
2
|
+
# update.sh - acquire a release locally, then hand it to the offline updater.
|
|
3
3
|
set -u
|
|
4
4
|
|
|
5
|
-
SELF_DIR="
|
|
5
|
+
SELF_DIR=""
|
|
6
|
+
SCRIPT_SOURCE="${BASH_SOURCE[0]:-}"
|
|
7
|
+
if [ -n "$SCRIPT_SOURCE" ] && [ -f "$SCRIPT_SOURCE" ]; then
|
|
8
|
+
SELF_DIR="$(cd "$(dirname "$SCRIPT_SOURCE")" 2>/dev/null && pwd -P)" || SELF_DIR=""
|
|
9
|
+
fi
|
|
6
10
|
DEVRITES_REPO="${DEVRITES_REPO:-ViktorsBaikers/DevRites}"
|
|
7
11
|
DEVRITES_REF="${DEVRITES_REF:-}"
|
|
8
12
|
|
|
@@ -11,20 +15,12 @@ delegate_bootstrap() {
|
|
|
11
15
|
echo "error: bootstrap re-exec did not find pack/ - aborting to avoid a loop." >&2
|
|
12
16
|
exit 1
|
|
13
17
|
fi
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
ref="${ref:-main}"
|
|
21
|
-
url="https://raw.githubusercontent.com/$DEVRITES_REPO/$ref/install.sh"
|
|
22
|
-
tmp="$(mktemp 2>/dev/null || echo "${TMPDIR:-/tmp}/devrites-install.$$")"
|
|
23
|
-
curl -fsSL -o "$tmp" "$url" || { echo "error: could not download DevRites bootstrap from $url" >&2; rm -f "$tmp"; exit 1; }
|
|
24
|
-
bash "$tmp" update "$@"
|
|
25
|
-
rc="$?"
|
|
26
|
-
rm -f "$tmp"
|
|
27
|
-
exit "$rc"
|
|
18
|
+
[ -n "$SELF_DIR" ] && [ -f "$SELF_DIR/install.sh" ] || {
|
|
19
|
+
echo "error: update requires the canonical install bootstrap; run the documented curl command for install.sh." >&2
|
|
20
|
+
exit 1
|
|
21
|
+
}
|
|
22
|
+
bash "$SELF_DIR/install.sh" update "$@"
|
|
23
|
+
exit "$?"
|
|
28
24
|
}
|
|
29
25
|
|
|
30
26
|
if [ -z "$SELF_DIR" ] || [ ! -d "$SELF_DIR/pack" ]; then
|
|
@@ -35,6 +31,18 @@ INSTALL_LIB="$SELF_DIR/scripts/install-lib.sh"
|
|
|
35
31
|
[ -f "$INSTALL_LIB" ] || { echo "error: extracted bundle is missing scripts/install-lib.sh" >&2; exit 1; }
|
|
36
32
|
. "$INSTALL_LIB"
|
|
37
33
|
|
|
38
|
-
|
|
34
|
+
DR_ENGINE_PATH=""; DR_ENGINE_TMP=""
|
|
35
|
+
trap dr_cleanup_engine EXIT
|
|
36
|
+
trap 'exit 1' HUP INT TERM
|
|
37
|
+
dr_acquire_engine "$SELF_DIR" update "$DEVRITES_REPO" || { echo "error: could not acquire a version-compatible devrites-engine${DR_ACQUIRE_FAILURE:+ ($DR_ACQUIRE_FAILURE)}." >&2; exit 1; }
|
|
38
|
+
ENGINE="$DR_ENGINE_PATH"
|
|
39
|
+
PAYLOAD="${DEVRITES_HOST_ARTIFACT_DIR:-$SELF_DIR/pack/generated}"
|
|
40
|
+
if [ ! -d "$PAYLOAD/claude/skills" ] || [ ! -d "$PAYLOAD/codex/skills" ] || [ ! -f "$PAYLOAD/codex/config.toml" ]; then
|
|
41
|
+
BUILDER="$SELF_DIR/scripts/build-host-artifacts.sh"
|
|
42
|
+
[ -f "$BUILDER" ] || { echo "error: generated update payload missing at $PAYLOAD and builder missing at $BUILDER" >&2; exit 1; }
|
|
43
|
+
DEVRITES_HOST_ARTIFACT_DIR="$PAYLOAD" bash "$BUILDER" >/dev/null || { echo "error: could not generate update payload at $PAYLOAD" >&2; exit 1; }
|
|
44
|
+
fi
|
|
39
45
|
export DEVRITES_ENGINE_CLI="$ENGINE"
|
|
40
|
-
|
|
46
|
+
"$ENGINE" update --source-dir "$SELF_DIR" --payload-dir "$PAYLOAD" "$@"
|
|
47
|
+
rc="$?"
|
|
48
|
+
exit "$rc"
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
# `devrites-engine` agent contract (`--json`)
|
|
2
|
-
|
|
3
|
-
An unattended driver, such as the AFK loop, a CI step, or a local script,
|
|
4
|
-
needs a stable result format instead of prose that may change. The read commands
|
|
5
|
-
used by AFK accept `--json` and write a stable envelope to stdout. The flag does
|
|
6
|
-
not change the command's logic or exit code.
|
|
7
|
-
|
|
8
|
-
## Which commands accept `--json`
|
|
9
|
-
|
|
10
|
-
An unattended run branches on this set:
|
|
11
|
-
|
|
12
|
-
`status` · `readiness` · `seal` · `spec-validate` · `evidence-fresh` · `preamble` ·
|
|
13
|
-
`coverage` · `analyze` · `doctor` · `ledger` (`diff` / `validate` / `list` / `show`)
|
|
14
|
-
|
|
15
|
-
Other subcommands, including hooks, `footprint`, `tick-afk`, and mutating
|
|
16
|
-
commands, do not accept `--json` because drivers do not use their output for a
|
|
17
|
-
decision. Only machine-read decision results expose the flag.
|
|
18
|
-
|
|
19
|
-
Exception: `snapshot`, `context show --json`, and
|
|
20
|
-
`reviewer-stats report --json` are already direct structured reports, not
|
|
21
|
-
envelopes. `context show --json` emits `root`, `project`, `activeWorkspace`,
|
|
22
|
-
`source`, `hostCommands`, and `status` so wrappers can tell where DevRites will
|
|
23
|
-
act; reviewer stats emits the deterministic per-reviewer dispatch verdicts.
|
|
24
|
-
|
|
25
|
-
## Envelope
|
|
26
|
-
|
|
27
|
-
```json
|
|
28
|
-
{
|
|
29
|
-
"schema": "devrites-command/v1",
|
|
30
|
-
"command": "spec-validate",
|
|
31
|
-
"ok": false,
|
|
32
|
-
"exitCode": 1,
|
|
33
|
-
"data": { "text": "<the command's verbatim stdout>" },
|
|
34
|
-
"diagnostics": [
|
|
35
|
-
{
|
|
36
|
-
"code": "spec_validate_delta_mismatch",
|
|
37
|
-
"severity": "error",
|
|
38
|
-
"message": "Requirement \"Dark mode\" (line 2) is marked ADDED but already exists in ledger capability \"theming\"",
|
|
39
|
-
"path": ".devrites/work/feat/spec.md",
|
|
40
|
-
"line": 2
|
|
41
|
-
}
|
|
42
|
-
]
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
| field | meaning |
|
|
47
|
-
| ----- | ------- |
|
|
48
|
-
| `schema` | `devrites-command/v1` |
|
|
49
|
-
| `command` | the subcommand that ran |
|
|
50
|
-
| `ok` | `exitCode == 0`: the one boolean a driver branches on |
|
|
51
|
-
| `exitCode` | the process exit code (authoritative; see the table below) |
|
|
52
|
-
| `reason_id` | optional rule-owned outcome ID; currently emitted by lifecycle gates |
|
|
53
|
-
| `data.text` | the command's human-readable stdout, verbatim and lossless (omitted when empty) |
|
|
54
|
-
| `diagnostics[]` | one entry per stderr line, classified (omitted when none) |
|
|
55
|
-
|
|
56
|
-
`data.text` contains the complete text-mode output. Structured consumers read
|
|
57
|
-
`ok`, `exitCode`, and `diagnostics` and ignore `data.text`; human readers can do
|
|
58
|
-
the reverse.
|
|
59
|
-
|
|
60
|
-
## Diagnostics and reasons
|
|
61
|
-
|
|
62
|
-
| field | meaning |
|
|
63
|
-
| ----- | ------- |
|
|
64
|
-
| `code` | stable, greppable slug (see catalog) |
|
|
65
|
-
| `severity` | `error` · `warning` · `info` |
|
|
66
|
-
| `message` | the finding, with any `<path>:` prefix and `(line N)` suffix lifted into fields |
|
|
67
|
-
| `path` | source path, when the finding named one |
|
|
68
|
-
| `line` | 1-based line, when the finding named one |
|
|
69
|
-
|
|
70
|
-
`diagnostics[].code` remains compatible with existing consumers. Some older
|
|
71
|
-
codes are coarse or classified from stderr shape. New automation should prefer
|
|
72
|
-
the top-level `reason_id` when present: its value comes from the rule that made
|
|
73
|
-
the decision, so editing human wording cannot change it.
|
|
74
|
-
|
|
75
|
-
## Exit-code contract
|
|
76
|
-
|
|
77
|
-
| code | meaning |
|
|
78
|
-
| ---- | ------- |
|
|
79
|
-
| `0` | ok / gate passed / valid |
|
|
80
|
-
| `1` | a content violation: a grammar or delta error (`spec-validate`, `ledger validate`) |
|
|
81
|
-
| `2` | usage error (bad args, unknown command) |
|
|
82
|
-
| `3` | blocked: a completeness-gate pause or a `doctor` version-skew refuse; a **pause, not a crash** |
|
|
83
|
-
| `5` | a required input is missing (e.g. no `spec.md`) |
|
|
84
|
-
|
|
85
|
-
Exit `3` is the AFK pause signal: resolve the reported gap and retry.
|
|
86
|
-
|
|
87
|
-
## Diagnostic-code catalog
|
|
88
|
-
|
|
89
|
-
Codes are `<command>_<kind>`. v1 is deliberately coarse so consumers can match on
|
|
90
|
-
the prefix while the catalog grows specific kinds:
|
|
91
|
-
|
|
92
|
-
| code | emitted by | means |
|
|
93
|
-
| ---- | ---------- | ----- |
|
|
94
|
-
| `spec_validate_grammar` | `spec-validate` | a SHALL / WHEN / THEN / Scenario grammar violation |
|
|
95
|
-
| `spec_validate_delta_mismatch` | `spec-validate --against` | an ADDED that already exists, or a MODIFIED/REMOVED that doesn't |
|
|
96
|
-
| `ledger_grammar` | `ledger validate` | a ledger spec fails the grammar |
|
|
97
|
-
| `<command>_error` / `_warning` / `_info` | any | an unclassified stderr line at that severity |
|
|
98
|
-
|
|
99
|
-
New specific codes append to this table. The `<command>_<severity>` fallback
|
|
100
|
-
represents future stderr lines without a code change.
|
|
101
|
-
`engine/tests/json_contract_test.go` checks every AFK-parsed command so each
|
|
102
|
-
`--json` run remains one parseable JSON document whose `exitCode` and `ok` match
|
|
103
|
-
the process result.
|
|
104
|
-
|
|
105
|
-
## Execution provenance: `devrites-event/v1`
|
|
106
|
-
|
|
107
|
-
The engine appends a compact event to the existing `.devrites/timeline.jsonl`.
|
|
108
|
-
When an active workspace exists, it appends the same event to that workspace's
|
|
109
|
-
`events.jsonl`. There is no second store and no migration: older unversioned
|
|
110
|
-
timeline rows remain readable beside v1 rows.
|
|
111
|
-
|
|
112
|
-
```json
|
|
113
|
-
{
|
|
114
|
-
"schema": "devrites-event/v1",
|
|
115
|
-
"ts": "2026-07-23T12:34:56Z",
|
|
116
|
-
"run_id": "drv-run-v1:0123456789abcdef0123456789abcdef",
|
|
117
|
-
"boundary": "lifecycle-gate",
|
|
118
|
-
"root_source": "DEVRITES_ROOT",
|
|
119
|
-
"workspace": ".devrites/work/auth-tokens",
|
|
120
|
-
"phase_before": "build",
|
|
121
|
-
"event": "readiness",
|
|
122
|
-
"rule_ids": ["DRV-GATE-READINESS-MISSING"],
|
|
123
|
-
"evidence_paths": [".devrites/work/auth-tokens/test-plan.md"],
|
|
124
|
-
"phase_after": "build",
|
|
125
|
-
"execution_mode": "none",
|
|
126
|
-
"guard_strength": "n/a",
|
|
127
|
-
"reason_id": "DRV-GATE-READINESS-MISSING",
|
|
128
|
-
"outcome": "blocked",
|
|
129
|
-
"host": "engine"
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
The v1 validator accepts only:
|
|
134
|
-
|
|
135
|
-
- `execution_mode`: `named` · `generic` · `inline` · `none` (`inline` remains
|
|
136
|
-
readable for historical telemetry; current specialist dispatch never emits it);
|
|
137
|
-
- `guard_strength`: `enforced` · `observed` · `unavailable` · `bypassed` · `n/a`;
|
|
138
|
-
- `host`: `engine` · `claude` · `codex`;
|
|
139
|
-
- registered `DRV-*` reason and rule IDs;
|
|
140
|
-
- canonical phases and project-relative workspace/evidence paths.
|
|
141
|
-
|
|
142
|
-
Events never contain prompts, commands, tool or source bodies, answers, free
|
|
143
|
-
text, secrets, usernames, or absolute paths. A bad or unwritable event affects
|
|
144
|
-
metrics only. Root, gate, and hook decisions do not depend on the event write.
|
|
145
|
-
|
|
146
|
-
The first live boundaries are root selection, readiness/seal, hook guards, and
|
|
147
|
-
destructive-Git policy.
|
|
148
|
-
Hook records distinguish an enforced denial from an observe-only finding, an
|
|
149
|
-
unavailable adapter/input, and an intentional bypass. Forge binding denials and
|
|
150
|
-
the opt-in WebFetch ingestion warning use the same schema.
|
|
151
|
-
|
|
152
|
-
### Reason registry
|
|
153
|
-
|
|
154
|
-
`engine/internal/reason` is the Go source of truth. Current lifecycle matrix
|
|
155
|
-
reasons are:
|
|
156
|
-
|
|
157
|
-
| reason ID | owner |
|
|
158
|
-
| --- | --- |
|
|
159
|
-
| `DRV-GATE-READINESS-PASSED` / `DRV-GATE-READINESS-MISSING` | readiness gate |
|
|
160
|
-
| `DRV-GATE-SEAL-PASSED` / `DRV-GATE-SEAL-MISSING` | seal gate |
|
|
161
|
-
| `DRV-HOOK-STOP-*` | Stop rest-point rules and loop/input handling |
|
|
162
|
-
| `DRV-HOOK-REVIEWER-READONLY-*` | reviewer mutation guard |
|
|
163
|
-
| `DRV-HOOK-A1-*` | main-thread build write guard |
|
|
164
|
-
| `DRV-HOOK-WRIGHT-*` | wright scope and forbidden-operation guard |
|
|
165
|
-
| `DRV-HOOK-FORGE-BINDING-DENIED` | Forge manifest/worker binding |
|
|
166
|
-
| `DRV-HOOK-INGEST-WARNING` | opt-in WebFetch warning trial |
|
|
167
|
-
| `DRV-GIT-AMBIGUOUS-*` / `DRV-GIT-INPUT-TOO-LARGE` | direct-literal Git parser boundary |
|
|
168
|
-
| `DRV-GIT-DESTRUCTIVE-*` | destructive-operation classifier |
|
|
169
|
-
| `DRV-GIT-AUTHORITY-*` / `DRV-GIT-WORKSPACE-UNAVAILABLE` | exact one-shot authority and replay gate |
|
|
170
|
-
| `DRV-AGENT-*` | named/generic execution, historical inline telemetry, and result reconciliation |
|
|
171
|
-
|
|
172
|
-
Add a reason to that registry before an emitting rule or eval depends on it.
|
package/docs/extensions.md
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
# Extending DevRites with project extensions and reviewer overrides
|
|
2
|
-
|
|
3
|
-
DevRites ships a fixed, authored pack of rites, reviewers, and standards. The extension sync
|
|
4
|
-
surface is currently **Claude Code-only**; Codex extension mirrors are not generated. Two project-local
|
|
5
|
-
surfaces let a Claude Code project tune the pack **without forking it**: both live in the data plane
|
|
6
|
-
(`.devrites/`), both are git-diffable, and both are held to the same contracts the shipped pack is.
|
|
7
|
-
|
|
8
|
-
They answer two different questions:
|
|
9
|
-
|
|
10
|
-
| Surface | Question it answers | Lives in |
|
|
11
|
-
|---|---|---|
|
|
12
|
-
| **Extensions** | "Add a *new* rite or reviewer / domain." | `.devrites/extensions/<name>/` |
|
|
13
|
-
| **Overrides** | "Reshape a *shipped* reviewer's emphasis." | `.devrites/overrides/<agent>.md` |
|
|
14
|
-
|
|
15
|
-
The guiding invariant for both: **a shipped gate is never weakened by a customization.** An
|
|
16
|
-
extension earns parity by passing the same validator as the pack; an override may raise the bar,
|
|
17
|
-
never lower it. The deterministic engine gates (`seal`, `review-integrity`, `check-acceptance`, …)
|
|
18
|
-
do not read either surface: they stay authoritative regardless of what a project adds.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Extensions: add a rite or reviewer
|
|
23
|
-
|
|
24
|
-
A project extension is a directory under `.devrites/extensions/`:
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
.devrites/extensions/<name>/
|
|
28
|
-
skill/SKILL.md (optional) a user rite/skill: needs name + description frontmatter
|
|
29
|
-
agent.md (optional) a user reviewer agent: needs name + description frontmatter
|
|
30
|
-
component.yaml (optional) npx-managed component manifest + safety bounds
|
|
31
|
-
provenance.json (optional) source/author/review metadata for shared extensions
|
|
32
|
-
extension.yaml (optional) metadata: aliases (prior names, so a rename doesn't orphan)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
An extension provides a skill, an agent, or both. It is held to the same schema as the shipped
|
|
36
|
-
pack. DevRites refuses malformed extensions rather than installing part of one.
|
|
37
|
-
|
|
38
|
-
### Commands
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
devrites-engine extensions list # enumerate extensions and what each provides
|
|
42
|
-
devrites-engine extensions validate # schema-check every extension (exit 1 on a violation)
|
|
43
|
-
devrites-engine extensions sync # mirror valid extensions into .claude/ for Claude Code
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
- **`validate`** checks each declared skill/agent carries `name:` + `description:` frontmatter, that
|
|
47
|
-
an extension provides at least one artifact, and that no two extensions claim the same skill/agent
|
|
48
|
-
name. If `component.yaml` is present, it must declare an npm-managed, project-local component:
|
|
49
|
-
`distribution: npx-managed`, `scope: project-local`, project-local write roots only, and safety
|
|
50
|
-
fields that do **not** weaken gates, bypass `type-GO`, or run executables. If `provenance.json`
|
|
51
|
-
is present it must be valid JSON with `source`, `author`, `created_at`, and optional
|
|
52
|
-
`confidence` (`0..1`) / `reviewed_by`; `/rite-doctor` warns when an extension ships artifacts
|
|
53
|
-
without provenance. V2 manifests may
|
|
54
|
-
also declare `tier`, `requires`, `owns`, and `surface`; dependencies must be acyclic, and anything
|
|
55
|
-
in `owns` that collides with the first-party `rite-`/`devrites-` namespaces is refused. If a
|
|
56
|
-
malformed extension declares a review/gate-like surface, validation warns that the surface is
|
|
57
|
-
inactive until the schema is fixed. Validation remains fail-open, but reports the problem.
|
|
58
|
-
- **`sync`** validates first, then mirrors `skill/` → `.claude/skills/<name>/` and `agent.md` →
|
|
59
|
-
`.claude/agents/<name>.md`, where the Claude harness discovers them. Idempotent. It refuses to
|
|
60
|
-
sync a set that fails validation.
|
|
61
|
-
- **`aliases`** (in `extension.yaml`) carry an extension's prior names forward across a rename, so a
|
|
62
|
-
project's references don't orphan.
|
|
63
|
-
|
|
64
|
-
### Component manifest
|
|
65
|
-
|
|
66
|
-
Public schemas live in [`../schemas/`](../schemas/): `extension-component.schema.json` and
|
|
67
|
-
`provenance.schema.json` for extension metadata, plus workspace/hook schemas for editor tooling.
|
|
68
|
-
|
|
69
|
-
`component.yaml` is DevRites' native extension, preset, and bundle metadata.
|
|
70
|
-
It is **not** a plugin package descriptor; it documents what the npm-installed engine may copy or
|
|
71
|
-
validate inside the current project.
|
|
72
|
-
|
|
73
|
-
```yaml
|
|
74
|
-
schema_version: "1.1"
|
|
75
|
-
kind: extension
|
|
76
|
-
id: audit-lite # must match .devrites/extensions/<name>/ when present
|
|
77
|
-
version: 0.1.0
|
|
78
|
-
tier: standard # core | standard | full
|
|
79
|
-
requires: [] # other local extension ids; acyclic
|
|
80
|
-
owns:
|
|
81
|
-
skills: [audit-lite]
|
|
82
|
-
agents: []
|
|
83
|
-
surface:
|
|
84
|
-
clusters: [review]
|
|
85
|
-
safety:
|
|
86
|
-
may_weaken_gates: false
|
|
87
|
-
executable: false
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Legacy `component:` / `permissions:` manifests still validate. The validator refuses global homes
|
|
91
|
-
(`~/.claude/**`, `~/.codex/**`), plugin-store distribution names, non-project scopes, unknown/cyclic
|
|
92
|
-
extension dependencies, first-party ownership collisions, and any manifest that claims it can weaken
|
|
93
|
-
a gate, run executables, or bypass `type-GO`.
|
|
94
|
-
|
|
95
|
-
### Declarative checks
|
|
96
|
-
|
|
97
|
-
`component.yaml` may declare **checks**: non-executable, one-line instructions the data plane
|
|
98
|
-
surfaces at a lifecycle gate:
|
|
99
|
-
|
|
100
|
-
```yaml
|
|
101
|
-
checks:
|
|
102
|
-
- at: seal
|
|
103
|
-
instruction: Run the license scan and record the result in evidence.md
|
|
104
|
-
doc: docs/license-scan.md # optional pointer to the project's own procedure
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
- A check is an **instruction the in-session model addresses**, never a command the engine runs.
|
|
108
|
-
The deterministic engine gates still do not read extensions, and `executable: false` still holds.
|
|
109
|
-
- Checks are **additive-only**: they can raise the bar at a gate, never lower one (same rule as
|
|
110
|
-
overrides). `/rite-seal` treats a declared `at: seal` check that is neither addressed nor
|
|
111
|
-
skip-justified in `seal.md` as an **Important** finding on the review's completeness.
|
|
112
|
-
- Checks in an extension that fails validation are inactive. `extensions validate`
|
|
113
|
-
reports the problem without blocking unrelated work.
|
|
114
|
-
|
|
115
|
-
### Workflow
|
|
116
|
-
|
|
117
|
-
Use `/rite-customize extension <name>` for guided authoring, or do it by hand:
|
|
118
|
-
|
|
119
|
-
1. Author the extension under `.devrites/extensions/<name>/`.
|
|
120
|
-
2. `devrites-engine extensions validate` until clean.
|
|
121
|
-
3. `devrites-engine extensions sync` to mirror it into `.claude/`.
|
|
122
|
-
4. `/rite-doctor` validates extensions on every health check and hands you the fix if one regresses.
|
|
123
|
-
|
|
124
|
-
### Harness scope
|
|
125
|
-
|
|
126
|
-
`sync` targets the **Claude Code-only** layout (`.claude/skills`, `.claude/agents`), which that host
|
|
127
|
-
auto-discovers. It does not generate Codex mirrors, so project extensions are unavailable to Codex
|
|
128
|
-
unless an operator maintains an equivalent Codex surface independently. The `.md` → `.codex/agents/*.toml` conversion,
|
|
129
|
-
path rewriting, hook/config blocks, and skills-list description stubbing are deliberately limited to
|
|
130
|
-
the generated shipped pack artifacts so extension sync does not become a second Codex generator.
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Overrides: reshape a shipped reviewer
|
|
135
|
-
|
|
136
|
-
An override is a single Markdown file named for the agent it targets:
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
.devrites/overrides/devrites-code-reviewer.md
|
|
140
|
-
.devrites/overrides/devrites-security-auditor.md
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
Each shipped reviewer, after loading its governing standards, reads
|
|
144
|
-
`.devrites/overrides/<its-name>.md` if present and applies it as project-specific
|
|
145
|
-
emphasis or house rules. For example, a `devrites-code-reviewer.md`
|
|
146
|
-
override that says "always flag any use of the deprecated `legacyClient` as Important."
|
|
147
|
-
|
|
148
|
-
### The one rule
|
|
149
|
-
|
|
150
|
-
An override may **add** checks or **raise** weight. It may **never** relax a gate, waive a standard,
|
|
151
|
-
or lower a severity floor. A Critical stays a Critical. Overrides are reviewer *input*, not
|
|
152
|
-
permission. The engine gates don't read them at all, so an override literally cannot disable a gate;
|
|
153
|
-
the linter exists to catch one that *tries to talk a reviewer into it*.
|
|
154
|
-
|
|
155
|
-
### Commands
|
|
156
|
-
|
|
157
|
-
Use `/rite-customize override <agent>` for guided authoring, or manage files directly:
|
|
158
|
-
|
|
159
|
-
```bash
|
|
160
|
-
devrites-engine overrides list # enumerate override files and the agent each targets
|
|
161
|
-
devrites-engine overrides validate # flag empty overrides and any that read like a gate waiver (exit 1)
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
`validate` trips on subversion phrasing ("ignore the gate", "treat any Critical as a Suggestion",
|
|
165
|
-
"waive review") and on an override targeting an agent that isn't installed (an orphan warning).
|
|
166
|
-
`/rite-doctor` runs it on every health check.
|
|
167
|
-
|
|
168
|
-
### Template overrides
|
|
169
|
-
|
|
170
|
-
Future template/preset work uses `.devrites/overrides/templates/*.md` as the project-local override
|
|
171
|
-
layer. `devrites-engine overrides validate` already applies the same anti-subversion scan to those
|
|
172
|
-
files and adds required-term checks for high-risk lifecycle templates:
|
|
173
|
-
|
|
174
|
-
- `seal.md` must still mention `type-GO` and `NO-GO`.
|
|
175
|
-
- `ship.md` must still mention `type-GO`.
|
|
176
|
-
|
|
177
|
-
This keeps the extension point useful without letting a project template erase the gates that make
|
|
178
|
-
DevRites safe.
|
package/engine/git_guard.go
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"fmt"
|
|
5
|
-
"io"
|
|
6
|
-
"os"
|
|
7
|
-
"strings"
|
|
8
|
-
|
|
9
|
-
"github.com/devrites/devrites/internal/harness"
|
|
10
|
-
"github.com/devrites/devrites/internal/lib"
|
|
11
|
-
"github.com/devrites/devrites/internal/orient"
|
|
12
|
-
drvreason "github.com/devrites/devrites/internal/reason"
|
|
13
|
-
"github.com/devrites/devrites/internal/toolpolicy"
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
const gitGuardSuffix = " (devrites-git-guard)"
|
|
17
|
-
|
|
18
|
-
// hookGitGuard denies ambiguous high-impact Git and requires an exact, fresh,
|
|
19
|
-
// consumed-on-attempt authority record for an unambiguous destructive command.
|
|
20
|
-
func hookGitGuard(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
21
|
-
in := h.ParsePreToolInput(stdin)
|
|
22
|
-
if !isShellTool(in.ToolName) || strings.TrimSpace(in.Command) == "" {
|
|
23
|
-
return exitOK
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
classified := toolpolicy.ClassifyGitCommand(in.Command)
|
|
27
|
-
if classified.Verdict == toolpolicy.VerdictSafe {
|
|
28
|
-
return exitOK
|
|
29
|
-
}
|
|
30
|
-
classifierReasons := gitClassifierReasons(classified)
|
|
31
|
-
if classified.Verdict == toolpolicy.VerdictAmbiguous {
|
|
32
|
-
primary := gitReasonID(classified.ReasonID, drvreason.GitAuthorityUnavailable)
|
|
33
|
-
root, slug := gitGuardWorkspace()
|
|
34
|
-
recordGitPolicy(root, slug, h, primary, classifierReasons, lib.OutcomeDenied)
|
|
35
|
-
return emitGitDeny(h, stdout, stderr,
|
|
36
|
-
fmt.Sprintf("DevRites denied an ambiguous high-impact Git request (%s). %s%s",
|
|
37
|
-
primary, classified.Remediation, gitGuardSuffix))
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
root, slug := gitGuardWorkspace()
|
|
41
|
-
if root == "" {
|
|
42
|
-
return emitGitDeny(h, stdout, stderr,
|
|
43
|
-
"DevRites cannot authorize destructive Git without an active DevRites workspace ("+
|
|
44
|
-
string(drvreason.GitWorkspaceUnavailable)+")."+gitGuardSuffix)
|
|
45
|
-
}
|
|
46
|
-
if slug == "" {
|
|
47
|
-
recordGitPolicy(root, "", h, drvreason.GitWorkspaceUnavailable, classifierReasons, lib.OutcomeDenied)
|
|
48
|
-
return emitGitDeny(h, stdout, stderr,
|
|
49
|
-
"DevRites cannot authorize destructive Git without an active DevRites workspace ("+
|
|
50
|
-
string(drvreason.GitWorkspaceUnavailable)+")."+gitGuardSuffix)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
decision := lib.AuthorizeGitOperation(root, slug, classified.Digest, destructiveClassifierReasons(classified))
|
|
54
|
-
if decision.Allowed {
|
|
55
|
-
out, err := h.PreToolAllow("DevRites consumed one fresh exact-operation Git authorization (" +
|
|
56
|
-
string(decision.ReasonID) + ")." + gitGuardSuffix)
|
|
57
|
-
if err != nil {
|
|
58
|
-
recordGitPolicy(root, slug, h, drvreason.GitAuthorityUnavailable, classifierReasons, lib.OutcomeDenied)
|
|
59
|
-
return exitOK
|
|
60
|
-
}
|
|
61
|
-
fmt.Fprintln(stdout, out)
|
|
62
|
-
recordGitPolicy(root, slug, h, decision.ReasonID, classifierReasons, lib.OutcomeAllowed)
|
|
63
|
-
return exitOK
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
recordGitPolicy(root, slug, h, decision.ReasonID, classifierReasons, lib.OutcomeDenied)
|
|
67
|
-
return emitGitDeny(h, stdout, stderr, gitAuthorityDenyMessage(decision))
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
func gitGuardWorkspace() (string, string) {
|
|
71
|
-
root, err := orient.ResolveRoot(os.Getenv("DEVRITES_ROOT"))
|
|
72
|
-
if err != nil {
|
|
73
|
-
return "", ""
|
|
74
|
-
}
|
|
75
|
-
slug, err := orient.ActiveSlug(root)
|
|
76
|
-
if err != nil {
|
|
77
|
-
return root, ""
|
|
78
|
-
}
|
|
79
|
-
return root, slug
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
func emitGitDeny(h harness.Harness, stdout, stderr io.Writer, message string) int {
|
|
83
|
-
out, err := h.PreToolDeny(message)
|
|
84
|
-
if err != nil {
|
|
85
|
-
debugf(stderr, "git-guard decision unavailable")
|
|
86
|
-
return exitOK
|
|
87
|
-
}
|
|
88
|
-
fmt.Fprintln(stdout, out)
|
|
89
|
-
return exitOK
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
func gitAuthorityDenyMessage(decision lib.GitAuthorityDecision) string {
|
|
93
|
-
reasonID := string(decision.ReasonID)
|
|
94
|
-
switch decision.ReasonID {
|
|
95
|
-
case drvreason.GitAuthorityPending, drvreason.GitAuthorityExpired, drvreason.GitAuthorityReplayed:
|
|
96
|
-
if decision.QuestionID != "" {
|
|
97
|
-
return fmt.Sprintf(
|
|
98
|
-
`DevRites requires one fresh exact-operation Git authorization (%s). Resolve %s with /rite-resolve %s "%s", then retry.%s`,
|
|
99
|
-
reasonID, decision.QuestionID, decision.QuestionID, lib.GitAuthorityAnswer, gitGuardSuffix)
|
|
100
|
-
}
|
|
101
|
-
case drvreason.GitAuthorityRefused:
|
|
102
|
-
return fmt.Sprintf("DevRites denied this destructive Git operation because its exact authorization was refused (%s).%s",
|
|
103
|
-
reasonID, gitGuardSuffix)
|
|
104
|
-
case drvreason.GitAuthorityCorrupt:
|
|
105
|
-
return fmt.Sprintf("DevRites denied destructive Git because its authority record or consumption ledger "+
|
|
106
|
-
"is invalid (%s). Repair the workspace authority state before retrying.%s",
|
|
107
|
-
reasonID, gitGuardSuffix)
|
|
108
|
-
case drvreason.GitWorkspaceUnavailable:
|
|
109
|
-
return fmt.Sprintf("DevRites cannot authorize destructive Git without an active DevRites workspace (%s).%s",
|
|
110
|
-
reasonID, gitGuardSuffix)
|
|
111
|
-
}
|
|
112
|
-
return fmt.Sprintf("DevRites could not persist or consume destructive Git authority (%s). Repair the workspace or hook, then retry.%s",
|
|
113
|
-
reasonID, gitGuardSuffix)
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
func destructiveClassifierReasons(classified toolpolicy.Result) []toolpolicy.ReasonID {
|
|
117
|
-
seen := map[toolpolicy.ReasonID]bool{}
|
|
118
|
-
var out []toolpolicy.ReasonID
|
|
119
|
-
for _, finding := range classified.Findings {
|
|
120
|
-
if finding.Verdict != toolpolicy.VerdictDestructive || seen[finding.ReasonID] {
|
|
121
|
-
continue
|
|
122
|
-
}
|
|
123
|
-
seen[finding.ReasonID] = true
|
|
124
|
-
out = append(out, finding.ReasonID)
|
|
125
|
-
}
|
|
126
|
-
return out
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
func gitClassifierReasons(classified toolpolicy.Result) []drvreason.ID {
|
|
130
|
-
seen := map[drvreason.ID]bool{}
|
|
131
|
-
var out []drvreason.ID
|
|
132
|
-
for _, finding := range classified.Findings {
|
|
133
|
-
id := gitReasonID(finding.ReasonID, "")
|
|
134
|
-
if id == "" || seen[id] {
|
|
135
|
-
continue
|
|
136
|
-
}
|
|
137
|
-
seen[id] = true
|
|
138
|
-
out = append(out, id)
|
|
139
|
-
}
|
|
140
|
-
if len(out) == 0 {
|
|
141
|
-
if id := gitReasonID(classified.ReasonID, ""); id != "" {
|
|
142
|
-
out = append(out, id)
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return out
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
func gitReasonID(value toolpolicy.ReasonID, fallback drvreason.ID) drvreason.ID {
|
|
149
|
-
id, err := drvreason.Parse(string(value))
|
|
150
|
-
if err != nil {
|
|
151
|
-
return fallback
|
|
152
|
-
}
|
|
153
|
-
return id
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
func recordGitPolicy(root, slug string, h harness.Harness, primary drvreason.ID, classifier []drvreason.ID, outcome lib.EventOutcome) {
|
|
157
|
-
if root == "" || !drvreason.Known(primary) {
|
|
158
|
-
return
|
|
159
|
-
}
|
|
160
|
-
ev := lib.NewEventV1(lib.BoundaryGitPolicy, "git-guard", primary)
|
|
161
|
-
ev.GuardStrength = lib.GuardEnforced
|
|
162
|
-
ev.Outcome = outcome
|
|
163
|
-
ev.Host = lib.EventHost(h)
|
|
164
|
-
if ev.Host != lib.HostClaude && ev.Host != lib.HostCodex {
|
|
165
|
-
ev.Host = lib.HostEngine
|
|
166
|
-
}
|
|
167
|
-
ev.RuleIDs = []drvreason.ID{primary}
|
|
168
|
-
for _, id := range classifier {
|
|
169
|
-
if len(ev.RuleIDs) == 16 {
|
|
170
|
-
break
|
|
171
|
-
}
|
|
172
|
-
duplicate := false
|
|
173
|
-
for _, existing := range ev.RuleIDs {
|
|
174
|
-
if existing == id {
|
|
175
|
-
duplicate = true
|
|
176
|
-
break
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if !duplicate {
|
|
180
|
-
ev.RuleIDs = append(ev.RuleIDs, id)
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
if err := lib.BindEventWorkspace(root, slug, &ev); err != nil {
|
|
184
|
-
return
|
|
185
|
-
}
|
|
186
|
-
_ = lib.AppendEventV1(root, ev)
|
|
187
|
-
}
|