devrites 3.0.5 → 3.0.7
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 +21 -0
- package/README.md +282 -533
- package/SECURITY.md +26 -26
- package/docs/adr/README.md +7 -9
- package/docs/agents/domain.md +5 -5
- package/docs/agents/issue-driven-rites.md +1 -1
- package/docs/agents/issue-tracker.md +1 -1
- package/docs/agents/triage-labels.md +2 -2
- package/docs/architecture.md +45 -45
- package/docs/cli.md +11 -11
- package/docs/command-map.md +33 -33
- package/docs/engine/agent-contract.md +6 -6
- package/docs/engine/commands.md +66 -65
- package/docs/engine/state-schema.md +15 -15
- package/docs/engine/workspace-schema.md +7 -7
- package/docs/extensions.md +17 -17
- package/docs/flow.md +17 -17
- package/docs/harness-compliance.md +2 -2
- package/docs/orchestration.md +21 -20
- package/docs/release.md +22 -5
- package/docs/research/go-authoritative-workflow-schema-and-quality-2026-07-20.md +3 -3
- package/docs/skills.md +77 -52
- package/docs/usage.md +33 -32
- package/engine/Makefile +2 -2
- package/engine/commands.go +3 -3
- package/engine/harnessmatrix.go +2 -2
- package/engine/hookpolicy.go +9 -9
- package/engine/hooks.go +11 -11
- package/engine/hooks_workspace.go +11 -11
- package/engine/internal/doctor/doctor.go +7 -7
- package/engine/internal/gate/gate.go +11 -11
- package/engine/internal/harness/compliance.go +1 -1
- package/engine/internal/harness/harness.go +7 -7
- package/engine/internal/install/install.go +95 -24
- package/engine/internal/install/install_test.go +111 -3
- package/engine/internal/iohooks/detach_unix.go +1 -1
- package/engine/internal/iohooks/iohooks.go +8 -8
- package/engine/internal/lib/adoption.go +1 -1
- package/engine/internal/lib/analyze.go +15 -15
- package/engine/internal/lib/archivesearch.go +3 -3
- package/engine/internal/lib/budget.go +3 -3
- package/engine/internal/lib/buildreadiness.go +6 -6
- package/engine/internal/lib/checkacceptance.go +10 -10
- package/engine/internal/lib/closeout.go +5 -5
- package/engine/internal/lib/conventions.go +3 -3
- package/engine/internal/lib/coverage.go +4 -4
- package/engine/internal/lib/doubtcoverage.go +9 -9
- package/engine/internal/lib/evidencefresh.go +6 -6
- package/engine/internal/lib/extensions.go +9 -9
- package/engine/internal/lib/footprint.go +13 -13
- package/engine/internal/lib/jsonout.go +2 -2
- package/engine/internal/lib/lanes.go +2 -2
- package/engine/internal/lib/learnings.go +9 -9
- package/engine/internal/lib/ledger.go +8 -8
- package/engine/internal/lib/ledger_test.go +5 -5
- package/engine/internal/lib/mutationgate.go +4 -4
- package/engine/internal/lib/overrides.go +9 -9
- package/engine/internal/lib/overrides_test.go +2 -2
- package/engine/internal/lib/packageexistence.go +5 -5
- package/engine/internal/lib/preamble.go +6 -6
- package/engine/internal/lib/progress.go +5 -5
- package/engine/internal/lib/reconcile.go +80 -20
- package/engine/internal/lib/reconcile_test.go +13 -5
- package/engine/internal/lib/resolve.go +3 -3
- package/engine/internal/lib/reviewerstats.go +2 -2
- package/engine/internal/lib/reviewintegrity.go +13 -13
- package/engine/internal/lib/reviewintegrity_test.go +6 -6
- package/engine/internal/lib/runbook.go +1 -1
- package/engine/internal/lib/session.go +1 -1
- package/engine/internal/lib/session_test.go +2 -2
- package/engine/internal/lib/specparse.go +4 -4
- package/engine/internal/lib/specskeleton.go +2 -2
- package/engine/internal/lib/specvalidate.go +13 -13
- package/engine/internal/lib/stuck.go +13 -13
- package/engine/internal/lib/templates/conventions_ledger_header.md +1 -1
- package/engine/internal/lib/templates/conventions_orient_header.txt +1 -1
- package/engine/internal/lib/testintegrity.go +9 -9
- package/engine/internal/lib/tickafk.go +4 -4
- package/engine/internal/migrate/migrate.go +2 -2
- package/engine/internal/migrate/migrate_test.go +1 -0
- package/engine/internal/orient/firstrun.go +8 -8
- package/engine/internal/orient/orient.go +5 -5
- package/engine/internal/state/concurrency_test.go +4 -4
- package/engine/internal/state/feature.go +6 -6
- package/engine/internal/state/lock_unix.go +1 -1
- package/engine/internal/state/schema.go +1 -1
- package/engine/internal/state/snapshot.go +2 -2
- package/engine/internal/state/write.go +1 -1
- package/engine/internal/version/version.go +1 -1
- package/engine/main.go +5 -5
- package/engine/subagent_orient_context.txt +4 -4
- package/engine/testdata/golden/TestParityA1Guard/source-edit-enforce-denies.golden +1 -1
- package/engine/testdata/golden/TestParityAnalyze/slug=covered.golden +2 -2
- package/engine/testdata/golden/TestParityAnalyze/slug=dangling.golden +3 -3
- package/engine/testdata/golden/TestParityAnalyze/slug=noac.golden +2 -2
- package/engine/testdata/golden/TestParityAnalyze/slug=order.golden +4 -4
- package/engine/testdata/golden/TestParityAnalyze/slug=orphan.golden +3 -3
- package/engine/testdata/golden/TestParityAnalyze/slug=uncovered.golden +3 -3
- package/engine/testdata/golden/TestParityBudget/extra-md.golden +1 -1
- package/engine/testdata/golden/TestParityBudget/over-advisory.golden +1 -1
- package/engine/testdata/golden/TestParityBudget/over-strict.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +1 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-ok.golden +1 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-ok.golden +1 -1
- package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +1 -1
- package/engine/testdata/golden/TestParityCoverage/arg=speconly.golden +2 -2
- package/engine/testdata/golden/TestParityCursor/bare.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/full-afk.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/full-hitl.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/red.golden +2 -2
- package/engine/testdata/golden/TestParityCursor/zerogates.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=ghost.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=inline.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing-inline.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nodoubt.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nolog.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/mine-no-archive.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/mine.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/nudge.golden +1 -1
- package/engine/testdata/golden/TestParityMutationGate/active-slug.golden +1 -1
- package/engine/testdata/golden/TestParityMutationGate/explicit-slug.golden +1 -1
- package/engine/testdata/golden/TestParityPackageExistence/declared.golden +1 -1
- package/engine/testdata/golden/TestParityPackageExistence/default-import-subpath.golden +1 -1
- package/engine/testdata/golden/TestParityReconcile/check-clean.golden +1 -1
- package/engine/testdata/golden/TestParityRedwatch/fail-writes-red.golden +1 -1
- package/engine/testdata/golden/TestParityResolve/answer/state.md.golden +1 -1
- package/engine/testdata/golden/TestParityResolve/batch.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-devrites-agent-denies.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-git-commit.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-mutating.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=flat.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid/spec.md.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/custom-window-2.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/dominant.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/few.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/ghost.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/identical.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/nolog.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/pingpong.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/varied.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-04-identical.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-2.5-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-4x-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-leadspace-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-plus4-identical.golden +1 -1
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent-subagent-type-key.golden +1 -1
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent.golden +1 -1
- package/engine/testdata/golden/TestParityTestIntegrity/clean.golden +1 -1
- package/engine/testdata/golden/TestParityTickAfk/missingField.golden +1 -1
- package/engine/testdata/golden/TestParityTickAfk/none.golden +1 -1
- package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +1 -1
- package/engine/testdata/golden/TestSpecSkeleton/missing-some.golden +1 -1
- package/engine/testdata/golden/TestSpecSkeleton/present-all.golden +1 -1
- package/engine/tests/adr_0004_required_by_phase_test.go +2 -2
- package/engine/tests/adr_0006_clock_seam_test.go +1 -1
- package/engine/tests/budget_test.go +1 -1
- package/engine/tests/canonical_ac_ids_test.go +2 -2
- package/engine/tests/cli_test.go +1 -1
- package/engine/tests/concurrency_cli_test.go +1 -1
- package/engine/tests/gate_test.go +4 -4
- package/engine/tests/hook_test.go +3 -3
- package/engine/tests/hooks_io_test.go +1 -1
- package/engine/tests/lib_parity_test.go +29 -29
- package/engine/tests/meta_test.go +2 -2
- package/engine/tests/parity_closeout_test.go +1 -1
- package/engine/tests/parity_learnings_test.go +2 -2
- package/engine/tests/parity_mutationgate_test.go +2 -2
- package/engine/tests/parity_resolve_test.go +1 -1
- package/engine/tests/parity_test.go +3 -3
- package/engine/tests/parity_tickafk_test.go +1 -1
- package/engine/validatepack.go +5 -5
- package/engine/validatepackskills.go +9 -9
- package/pack/.claude/agents/devrites-code-reviewer.md +21 -22
- package/pack/.claude/agents/devrites-devex-reviewer.md +17 -17
- package/pack/.claude/agents/devrites-doubt-reviewer.md +6 -6
- package/pack/.claude/agents/devrites-forge-judge.md +26 -26
- package/pack/.claude/agents/devrites-frontend-reviewer.md +17 -17
- package/pack/.claude/agents/devrites-performance-reviewer.md +19 -18
- package/pack/.claude/agents/devrites-plan-reviewer.md +29 -27
- package/pack/.claude/agents/devrites-retrospector.md +19 -19
- package/pack/.claude/agents/devrites-security-auditor.md +15 -15
- package/pack/.claude/agents/devrites-simplifier-reviewer.md +14 -14
- package/pack/.claude/agents/devrites-slice-wright.md +52 -51
- package/pack/.claude/agents/devrites-spec-reviewer.md +11 -11
- package/pack/.claude/agents/devrites-strategy-reviewer.md +21 -21
- package/pack/.claude/agents/devrites-test-analyst.md +13 -13
- package/pack/.claude/settings.json +1 -1
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +12 -12
- package/pack/.claude/skills/devrites-audit/SKILL.md +7 -7
- package/pack/.claude/skills/devrites-browser-proof/SKILL.md +16 -16
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +14 -14
- package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/.claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/.claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/.claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/.claude/skills/devrites-doubt/SKILL.md +14 -14
- package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +18 -18
- package/pack/.claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/.claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/.claude/skills/devrites-interview/SKILL.md +27 -27
- package/pack/.claude/skills/devrites-lib/SKILL.md +18 -18
- package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/.claude/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/.claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/.claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +10 -10
- package/pack/.claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/.claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/.claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/.claude/skills/devrites-prose-craft/SKILL.md +5 -5
- package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +8 -8
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +33 -33
- package/pack/.claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/.claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/.claude/skills/rite/SKILL.md +7 -7
- package/pack/.claude/skills/rite/reference/menu.md +6 -6
- package/pack/.claude/skills/rite-adopt/SKILL.md +15 -15
- package/pack/.claude/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/.claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +14 -14
- package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/.claude/skills/rite-build/SKILL.md +22 -22
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/.claude/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/.claude/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/.claude/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/.claude/skills/rite-build/reference/forge.md +28 -29
- package/pack/.claude/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/.claude/skills/rite-build/reference/output.md +1 -1
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/.claude/skills/rite-build/reference/tdd.md +6 -6
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/.claude/skills/rite-converge/SKILL.md +17 -17
- package/pack/.claude/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/.claude/skills/rite-customize/SKILL.md +2 -2
- package/pack/.claude/skills/rite-define/SKILL.md +25 -25
- package/pack/.claude/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/.claude/skills/rite-define/reference/gates.md +13 -13
- package/pack/.claude/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/.claude/skills/rite-doctor/SKILL.md +11 -11
- package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/.claude/skills/rite-explain/SKILL.md +22 -22
- package/pack/.claude/skills/rite-explain/reference/intake.md +16 -16
- package/pack/.claude/skills/rite-frame/SKILL.md +22 -22
- package/pack/.claude/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/.claude/skills/rite-handoff/SKILL.md +12 -12
- package/pack/.claude/skills/rite-learn/SKILL.md +23 -23
- package/pack/.claude/skills/rite-plan/SKILL.md +21 -21
- package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/.claude/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/.claude/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/.claude/skills/rite-polish/SKILL.md +11 -11
- package/pack/.claude/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/.claude/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/.claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/.claude/skills/rite-polish/reference/code.md +26 -26
- package/pack/.claude/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/.claude/skills/rite-polish/reference/ui.md +23 -23
- package/pack/.claude/skills/rite-pov/SKILL.md +3 -3
- package/pack/.claude/skills/rite-pr-feedback/SKILL.md +2 -2
- package/pack/.claude/skills/rite-pressure-test/SKILL.md +14 -14
- package/pack/.claude/skills/rite-prototype/SKILL.md +13 -13
- package/pack/.claude/skills/rite-prove/SKILL.md +17 -17
- package/pack/.claude/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/.claude/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/.claude/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/.claude/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/.claude/skills/rite-quick/SKILL.md +22 -22
- package/pack/.claude/skills/rite-resolve/SKILL.md +18 -18
- package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/.claude/skills/rite-review/SKILL.md +34 -34
- package/pack/.claude/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/.claude/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/.claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/.claude/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/.claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/.claude/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/.claude/skills/rite-review/reference/security-review.md +9 -9
- package/pack/.claude/skills/rite-seal/SKILL.md +26 -26
- package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/.claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/.claude/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/.claude/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/.claude/skills/rite-ship/SKILL.md +12 -12
- package/pack/.claude/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/.claude/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/.claude/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/.claude/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/.claude/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/.claude/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/.claude/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/.claude/skills/rite-spec/SKILL.md +45 -45
- package/pack/.claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/.claude/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/.claude/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/.claude/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/.claude/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/.claude/skills/rite-status/SKILL.md +13 -13
- package/pack/.claude/skills/rite-temper/SKILL.md +29 -29
- package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/.claude/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/.claude/skills/rite-temper/reference/significance.md +10 -10
- package/pack/.claude/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/.claude/skills/rite-vet/SKILL.md +31 -31
- package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/.claude/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/.claude/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/.claude/skills/rite-vet/reference/depth.md +14 -14
- package/pack/.claude/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +18 -18
- package/pack/generated/claude/agents/devrites-code-reviewer.md +21 -22
- package/pack/generated/claude/agents/devrites-devex-reviewer.md +17 -17
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +6 -6
- package/pack/generated/claude/agents/devrites-forge-judge.md +26 -26
- package/pack/generated/claude/agents/devrites-frontend-reviewer.md +17 -17
- package/pack/generated/claude/agents/devrites-performance-reviewer.md +19 -18
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +29 -27
- package/pack/generated/claude/agents/devrites-retrospector.md +19 -19
- package/pack/generated/claude/agents/devrites-security-auditor.md +15 -15
- package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +14 -14
- package/pack/generated/claude/agents/devrites-slice-wright.md +52 -51
- package/pack/generated/claude/agents/devrites-spec-reviewer.md +11 -11
- package/pack/generated/claude/agents/devrites-strategy-reviewer.md +21 -21
- package/pack/generated/claude/agents/devrites-test-analyst.md +13 -13
- package/pack/generated/claude/settings.json +1 -1
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +12 -12
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +7 -7
- package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +16 -16
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +14 -14
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +14 -14
- package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +18 -18
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +27 -27
- package/pack/generated/claude/skills/devrites-lib/SKILL.md +18 -18
- package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/generated/claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +10 -10
- package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/generated/claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/generated/claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +5 -5
- package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
- package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +8 -8
- package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +33 -33
- package/pack/generated/claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/generated/claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/generated/claude/skills/rite/SKILL.md +7 -7
- package/pack/generated/claude/skills/rite/reference/menu.md +6 -6
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +15 -15
- package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/generated/claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +14 -14
- package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/generated/claude/skills/rite-build/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/forge.md +28 -29
- package/pack/generated/claude/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/generated/claude/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/tdd.md +6 -6
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/generated/claude/skills/rite-converge/SKILL.md +17 -17
- package/pack/generated/claude/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/generated/claude/skills/rite-customize/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-define/SKILL.md +25 -25
- package/pack/generated/claude/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/generated/claude/skills/rite-define/reference/gates.md +13 -13
- package/pack/generated/claude/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/claude/skills/rite-doctor/SKILL.md +11 -11
- package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-explain/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-explain/reference/intake.md +16 -16
- package/pack/generated/claude/skills/rite-frame/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/generated/claude/skills/rite-handoff/SKILL.md +12 -12
- package/pack/generated/claude/skills/rite-learn/SKILL.md +23 -23
- package/pack/generated/claude/skills/rite-plan/SKILL.md +21 -21
- package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/generated/claude/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/generated/claude/skills/rite-polish/SKILL.md +11 -11
- package/pack/generated/claude/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/generated/claude/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/generated/claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/generated/claude/skills/rite-polish/reference/code.md +26 -26
- package/pack/generated/claude/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/generated/claude/skills/rite-polish/reference/ui.md +23 -23
- package/pack/generated/claude/skills/rite-pov/SKILL.md +3 -3
- package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +14 -14
- package/pack/generated/claude/skills/rite-prototype/SKILL.md +13 -13
- package/pack/generated/claude/skills/rite-prove/SKILL.md +17 -17
- package/pack/generated/claude/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/generated/claude/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/generated/claude/skills/rite-quick/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +18 -18
- package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/generated/claude/skills/rite-review/SKILL.md +34 -34
- package/pack/generated/claude/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/generated/claude/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/generated/claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/generated/claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/generated/claude/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/generated/claude/skills/rite-review/reference/security-review.md +9 -9
- package/pack/generated/claude/skills/rite-seal/SKILL.md +26 -26
- package/pack/generated/claude/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/generated/claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/generated/claude/skills/rite-ship/SKILL.md +12 -12
- package/pack/generated/claude/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/generated/claude/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/generated/claude/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/generated/claude/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/generated/claude/skills/rite-spec/SKILL.md +45 -45
- package/pack/generated/claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/generated/claude/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/generated/claude/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/generated/claude/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/generated/claude/skills/rite-status/SKILL.md +13 -13
- package/pack/generated/claude/skills/rite-temper/SKILL.md +29 -29
- package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/generated/claude/skills/rite-temper/reference/significance.md +10 -10
- package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/generated/claude/skills/rite-vet/SKILL.md +31 -31
- package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/generated/claude/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/generated/claude/skills/rite-vet/reference/depth.md +14 -14
- package/pack/generated/claude/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +18 -18
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +21 -22
- package/pack/generated/codex/agents/devrites-devex-reviewer.toml +17 -17
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +6 -6
- package/pack/generated/codex/agents/devrites-forge-judge.toml +26 -26
- package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +17 -17
- package/pack/generated/codex/agents/devrites-performance-reviewer.toml +19 -18
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +29 -27
- package/pack/generated/codex/agents/devrites-retrospector.toml +19 -19
- package/pack/generated/codex/agents/devrites-security-auditor.toml +15 -15
- package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +14 -14
- package/pack/generated/codex/agents/devrites-slice-wright.toml +52 -51
- package/pack/generated/codex/agents/devrites-spec-reviewer.toml +11 -11
- package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +21 -21
- package/pack/generated/codex/agents/devrites-test-analyst.toml +13 -13
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +15 -15
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +10 -10
- package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +19 -19
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +17 -17
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +17 -17
- package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +20 -20
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/SKILL.md +21 -21
- package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/generated/codex/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +10 -10
- package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/generated/codex/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/generated/codex/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +8 -8
- package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +9 -9
- package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +11 -11
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +36 -36
- package/pack/generated/codex/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/generated/codex/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/generated/codex/skills/rite/SKILL.md +10 -10
- package/pack/generated/codex/skills/rite/reference/menu.md +6 -6
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +18 -18
- package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/generated/codex/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +17 -17
- package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/generated/codex/skills/rite-build/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/forge.md +28 -29
- package/pack/generated/codex/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/generated/codex/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/tdd.md +6 -6
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/generated/codex/skills/rite-converge/SKILL.md +20 -20
- package/pack/generated/codex/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/generated/codex/skills/rite-customize/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-define/SKILL.md +28 -28
- package/pack/generated/codex/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/generated/codex/skills/rite-define/reference/gates.md +13 -13
- package/pack/generated/codex/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +14 -14
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-explain/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-explain/reference/intake.md +16 -16
- package/pack/generated/codex/skills/rite-frame/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +15 -15
- package/pack/generated/codex/skills/rite-learn/SKILL.md +26 -26
- package/pack/generated/codex/skills/rite-plan/SKILL.md +24 -24
- package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/generated/codex/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/generated/codex/skills/rite-polish/SKILL.md +14 -14
- package/pack/generated/codex/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/generated/codex/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/generated/codex/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/generated/codex/skills/rite-polish/reference/code.md +26 -26
- package/pack/generated/codex/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/generated/codex/skills/rite-polish/reference/ui.md +23 -23
- package/pack/generated/codex/skills/rite-pov/SKILL.md +6 -6
- package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +17 -17
- package/pack/generated/codex/skills/rite-prototype/SKILL.md +16 -16
- package/pack/generated/codex/skills/rite-prove/SKILL.md +20 -20
- package/pack/generated/codex/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/generated/codex/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/generated/codex/skills/rite-quick/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +21 -21
- package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/generated/codex/skills/rite-review/SKILL.md +37 -37
- package/pack/generated/codex/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/generated/codex/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/generated/codex/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/generated/codex/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/generated/codex/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/generated/codex/skills/rite-review/reference/security-review.md +9 -9
- package/pack/generated/codex/skills/rite-seal/SKILL.md +29 -29
- package/pack/generated/codex/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/generated/codex/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/generated/codex/skills/rite-ship/SKILL.md +15 -15
- package/pack/generated/codex/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/generated/codex/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/generated/codex/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/generated/codex/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/generated/codex/skills/rite-spec/SKILL.md +48 -48
- package/pack/generated/codex/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/generated/codex/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/generated/codex/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/generated/codex/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/generated/codex/skills/rite-status/SKILL.md +16 -16
- package/pack/generated/codex/skills/rite-temper/SKILL.md +32 -32
- package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/generated/codex/skills/rite-temper/reference/significance.md +10 -10
- package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/generated/codex/skills/rite-vet/SKILL.md +34 -34
- package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/generated/codex/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/generated/codex/skills/rite-vet/reference/depth.md +14 -14
- package/pack/generated/codex/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +21 -21
- package/package.json +2 -2
- package/scripts/build-binaries.sh +1 -1
- package/scripts/build-host-artifacts.sh +1 -1
- package/scripts/build-release-tarball.sh +1 -1
- package/scripts/check-cross-refs.py +8 -8
- package/scripts/check-invocation-integrity.py +4 -4
- package/scripts/check-no-global-writes.sh +2 -2
- package/scripts/check-reply-contract.sh +1 -1
- package/scripts/check-rule-uniqueness.sh +2 -2
- package/scripts/codex-generate.sh +5 -5
- package/scripts/devrites-detect.sh +33 -33
- package/scripts/eval-runner.py +7 -7
- package/scripts/grade-feature.sh +14 -14
- package/scripts/install-lib.sh +2 -2
- package/scripts/pin.sh +12 -12
- package/scripts/run-behavioral-evals.sh +12 -12
- package/scripts/run-evals.sh +1 -1
- package/scripts/run-outcome-evals.sh +12 -12
- package/scripts/scan-pack-security.py +4 -4
- package/scripts/scan-supply-chain-iocs.py +7 -7
- package/scripts/skills-inventory.mjs +7 -8
- package/scripts/sync-version.sh +2 -2
- package/scripts/validate-workflow-security.py +12 -6
- package/scripts/validate-workspace-schema.py +2 -2
- package/scripts/validate.sh +7 -7
package/engine/hookpolicy.go
CHANGED
|
@@ -7,7 +7,7 @@ import (
|
|
|
7
7
|
|
|
8
8
|
// Hook control plane.
|
|
9
9
|
//
|
|
10
|
-
// Every wired hook has a canonical id
|
|
10
|
+
// Every wired hook has a canonical id: its `hook <name>` CLI verb (allow,
|
|
11
11
|
// orient, stop-gate, …). That id is the addressable handle for two orthogonal
|
|
12
12
|
// runtime controls, both read from the environment so an operator tunes safety
|
|
13
13
|
// vs speed without editing any JSON:
|
|
@@ -17,7 +17,7 @@ import (
|
|
|
17
17
|
//
|
|
18
18
|
// The profile is a floor: a hook runs when its tier is at or below the active
|
|
19
19
|
// profile AND it is not in the kill list. Everything else short-circuits to a
|
|
20
|
-
// clean fail-open no-op in cmdHook
|
|
20
|
+
// clean fail-open no-op in cmdHook: identical to the inline `command -v … ||
|
|
21
21
|
// exit 0` guard, so a disabled hook is indistinguishable from an absent binary.
|
|
22
22
|
//
|
|
23
23
|
// A SEPARATE axis is enforce-vs-observe: the OBSERVE-by-default guards (a1-guard,
|
|
@@ -31,23 +31,23 @@ type hookTier int
|
|
|
31
31
|
|
|
32
32
|
const (
|
|
33
33
|
tierMinimal hookTier = iota // orientation-only; never blocks or mutates flow
|
|
34
|
-
tierStandard // the default working set
|
|
34
|
+
tierStandard // the default working set: gates, guards, caches
|
|
35
35
|
tierStrict // reserved for experimental/aggressive hooks
|
|
36
36
|
)
|
|
37
37
|
|
|
38
38
|
// hookRegistry maps each canonical hook id to the profile tier that first
|
|
39
39
|
// activates it. A name absent from the registry is treated as tierMinimal
|
|
40
|
-
// (always active)
|
|
40
|
+
// (always active): fail-open: an unrecognised hook is never silently disabled
|
|
41
41
|
// by the profile mechanism.
|
|
42
42
|
var hookRegistry = map[string]hookTier{
|
|
43
|
-
// minimal
|
|
43
|
+
// minimal: orientation and auto-approval, which never interrupt work.
|
|
44
44
|
"allow": tierMinimal,
|
|
45
45
|
"orient": tierMinimal,
|
|
46
46
|
"subagent-orient": tierMinimal,
|
|
47
47
|
"cursor": tierMinimal,
|
|
48
48
|
"statusline": tierMinimal,
|
|
49
49
|
|
|
50
|
-
// standard
|
|
50
|
+
// standard: the default gates, guards, sentinels and caches.
|
|
51
51
|
"a1-guard": tierStandard,
|
|
52
52
|
"stop-gate": tierStandard,
|
|
53
53
|
"reviewer-readonly": tierStandard,
|
|
@@ -62,7 +62,7 @@ var hookRegistry = map[string]hookTier{
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
// hookProfileTier resolves DEVRITES_HOOK_PROFILE to a tier, defaulting to
|
|
65
|
-
// standard on empty or unrecognised input (fail-open
|
|
65
|
+
// standard on empty or unrecognised input (fail-open: a typo never silently
|
|
66
66
|
// strips the working set below default).
|
|
67
67
|
func hookProfileTier() hookTier {
|
|
68
68
|
switch strings.ToLower(strings.TrimSpace(os.Getenv("DEVRITES_HOOK_PROFILE"))) {
|
|
@@ -83,7 +83,7 @@ func hookActive(name string) bool {
|
|
|
83
83
|
}
|
|
84
84
|
tier, known := hookRegistry[name]
|
|
85
85
|
if !known {
|
|
86
|
-
return true // unknown id
|
|
86
|
+
return true // unknown id: never disabled by profile
|
|
87
87
|
}
|
|
88
88
|
return tier <= hookProfileTier()
|
|
89
89
|
}
|
|
@@ -105,7 +105,7 @@ func hookDisabled(name string) bool {
|
|
|
105
105
|
|
|
106
106
|
// hookEnforce reports whether an OBSERVE-default guard should block rather than
|
|
107
107
|
// log. It is true when the guard's own DEVRITES_*=enforce var is set, OR when
|
|
108
|
-
// the strict profile is active
|
|
108
|
+
// the strict profile is active: strict enforces every guard at once.
|
|
109
109
|
func hookEnforce(specificVar string) bool {
|
|
110
110
|
if os.Getenv(specificVar) == "enforce" {
|
|
111
111
|
return true
|
package/engine/hooks.go
CHANGED
|
@@ -22,13 +22,13 @@ import (
|
|
|
22
22
|
// The engine's inline shell guard handles a missing binary; this handles a
|
|
23
23
|
// present binary run outside a workspace.
|
|
24
24
|
func hookOrient(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
25
|
-
// The SessionStart payload is drained but unused
|
|
25
|
+
// The SessionStart payload is drained but unused: orientation is a pure read
|
|
26
26
|
// of the workspace files, not a function of the harness's stdin.
|
|
27
27
|
_, _ = io.Copy(io.Discard, stdin)
|
|
28
28
|
|
|
29
29
|
root, err := orient.ResolveRoot(os.Getenv("DEVRITES_ROOT"))
|
|
30
30
|
if err != nil {
|
|
31
|
-
return exitOK // not a DevRites workspace
|
|
31
|
+
return exitOK // not a DevRites workspace: silent no-op
|
|
32
32
|
}
|
|
33
33
|
text, has, err := orient.Digest(root)
|
|
34
34
|
if err != nil {
|
|
@@ -58,7 +58,7 @@ func hookOrient(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) in
|
|
|
58
58
|
func hookStopGate(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
59
59
|
in := h.ParseStopInput(stdin)
|
|
60
60
|
if in.StopHookActive {
|
|
61
|
-
return exitOK // already re-entered this stop cycle
|
|
61
|
+
return exitOK // already re-entered this stop cycle: let it stop
|
|
62
62
|
}
|
|
63
63
|
root, err := orient.ResolveRoot(os.Getenv("DEVRITES_ROOT"))
|
|
64
64
|
if err != nil {
|
|
@@ -89,7 +89,7 @@ func hookStopGate(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer)
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// allowReason is the auto-approval message the allow hook emits.
|
|
92
|
-
const allowReason = "DevRites read-only orientation/gate command
|
|
92
|
+
const allowReason = "DevRites read-only orientation/gate command: auto-approved by the devrites-allow hook"
|
|
93
93
|
|
|
94
94
|
var allowReadonlyCommands = map[string]bool{
|
|
95
95
|
"check-acceptance": true,
|
|
@@ -213,10 +213,10 @@ func safeAllowArg(arg string) bool {
|
|
|
213
213
|
// reviewerReadonlyDenyReason is the exact denial message
|
|
214
214
|
// devrites-reviewer-readonly.sh emits. It must stay byte-identical to keep the
|
|
215
215
|
// parity oracle green.
|
|
216
|
-
const reviewerReadonlyDenyReason = "DevRites: reviewers are read-only. This Bash command can mutate or exfiltrate; inspect with Read/Grep/Glob and return findings
|
|
216
|
+
const reviewerReadonlyDenyReason = "DevRites: reviewers are read-only. This Bash command can mutate or exfiltrate; inspect with Read/Grep/Glob and return findings: do not modify the tree or reach the network. (devrites-reviewer-readonly)"
|
|
217
217
|
|
|
218
218
|
// reviewerMutateRe matches a Bash command that could mutate the tree or reach the
|
|
219
|
-
// network
|
|
219
|
+
// network: the deny-list ported verbatim from devrites-reviewer-readonly.sh. A
|
|
220
220
|
// fresh-context reviewer reads untrusted source, so a silent write/exfil path is
|
|
221
221
|
// a prompt-injection surface (standards/security.md). pack-scan-ignore: this is
|
|
222
222
|
// the hook's own defensive deny-list, not a payload.
|
|
@@ -225,7 +225,7 @@ const reviewerReadonlyDenyReason = "DevRites: reviewers are read-only. This Bash
|
|
|
225
225
|
// this matches against the WHOLE command, while the bash hook's
|
|
226
226
|
// `read -r tool cmd agent_type` truncates the command at its first newline and so
|
|
227
227
|
// only ever scans line 1. A reviewer running a multi-line Bash whose later lines
|
|
228
|
-
// mutate (e.g. `cat x\nsed -i …`) slips past the bash hook but is denied here
|
|
228
|
+
// mutate (e.g. `cat x\nsed -i …`) slips past the bash hook but is denied here:
|
|
229
229
|
// intentional hardening of a latent bash bug, not a parity regression. (RE2's
|
|
230
230
|
// `[[:space:]]` already matches `\n`, so no `(?m)` flag is needed for the `-i$`
|
|
231
231
|
// alternative to fire at an interior line break.)
|
|
@@ -240,7 +240,7 @@ func hookReviewerReadonly(h harness.Harness, stdin io.Reader, stdout, stderr io.
|
|
|
240
240
|
if err != nil {
|
|
241
241
|
return exitOK
|
|
242
242
|
}
|
|
243
|
-
// Fast path: a payload with no tool call is not ours
|
|
243
|
+
// Fast path: a payload with no tool call is not ours: mirrors the script's
|
|
244
244
|
// `case "$input" in *'"tool_name"'*`.
|
|
245
245
|
if !bytes.Contains(data, []byte(`"tool_name"`)) {
|
|
246
246
|
return exitOK
|
|
@@ -300,19 +300,19 @@ var subagentOrientContext string
|
|
|
300
300
|
// hookSubagentOrient injects the DevRites discipline into every devrites-* subagent
|
|
301
301
|
// at spawn: a spawned subagent starts in a fresh context and neither auto-loads the
|
|
302
302
|
// rite-* framework nor discovers skills the way the main thread does. It mirrors
|
|
303
|
-
// devrites-subagent-orient.sh
|
|
303
|
+
// devrites-subagent-orient.sh: fire only for devrites-* agents, emit a fixed
|
|
304
304
|
// context envelope, stay silent + fail-open otherwise.
|
|
305
305
|
func hookSubagentOrient(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
306
306
|
agentType := h.SubagentAgentType(stdin)
|
|
307
307
|
if !strings.HasPrefix(agentType, "devrites-") {
|
|
308
|
-
return exitOK // not a DevRites subagent (or no identity)
|
|
308
|
+
return exitOK // not a DevRites subagent (or no identity): silent no-op
|
|
309
309
|
}
|
|
310
310
|
out, err := h.SubagentStartContext(strings.ReplaceAll(subagentOrientContext, "\r\n", "\n"))
|
|
311
311
|
if err != nil {
|
|
312
312
|
debugf(stderr, "subagent-orient: %v", err)
|
|
313
313
|
return exitOK
|
|
314
314
|
}
|
|
315
|
-
// No trailing newline
|
|
315
|
+
// No trailing newline: matches the script's `node ... process.stdout.write`.
|
|
316
316
|
fmt.Fprint(stdout, out)
|
|
317
317
|
return exitOK
|
|
318
318
|
}
|
|
@@ -41,7 +41,7 @@ func resolveWorkspaceDir(root, slug string) string {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
// resolveWorkspace resolves the active feature's directory.
|
|
44
|
-
// ok is false
|
|
44
|
+
// ok is false (a silent no-op) when there is no .devrites root or no active
|
|
45
45
|
// feature, keeping the hooks fail-open outside a DevRites workspace.
|
|
46
46
|
func resolveWorkspace() (root, slug, dir string, ok bool) {
|
|
47
47
|
root, err := orient.ResolveRoot(os.Getenv("DEVRITES_ROOT"))
|
|
@@ -74,8 +74,8 @@ type auqEventJSON struct {
|
|
|
74
74
|
// bloats the timeline.
|
|
75
75
|
const auqFieldMax = 300
|
|
76
76
|
|
|
77
|
-
// hookAUQ deterministically captures an AskUserQuestion exchange
|
|
78
|
-
// question with the user's chosen answer
|
|
77
|
+
// hookAUQ deterministically captures an AskUserQuestion exchange: every
|
|
78
|
+
// question with the user's chosen answer: into the session trace, so HITL
|
|
79
79
|
// decisions are recorded at the substrate rather than trusted to the model's
|
|
80
80
|
// bookkeeping. Capture only: it never tunes, blocks, or replies. Fail-open like
|
|
81
81
|
// every workspace hook: unparseable payload, unknown response shape, or no
|
|
@@ -192,7 +192,7 @@ func hookHandoffSnapshot(stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
192
192
|
next, _ := state.CursorField(stateLines, state.CursorNextAction)
|
|
193
193
|
stamp := time.Now().UTC().Format(time.RFC3339)
|
|
194
194
|
var b strings.Builder
|
|
195
|
-
fmt.Fprintf(&b, "\n## Handoff snapshot
|
|
195
|
+
fmt.Fprintf(&b, "\n## Handoff snapshot: %s\n", stamp)
|
|
196
196
|
fmt.Fprintf(&b, "- Feature: %s\n", slug)
|
|
197
197
|
if phase != "" {
|
|
198
198
|
fmt.Fprintf(&b, "- Phase: %s\n", phase)
|
|
@@ -229,7 +229,7 @@ func hookCursor(stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
229
229
|
afk, _ = state.CursorField(stateLines, state.CursorAFKSlicesRemaining)
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
-
fmt.Fprintf(stdout, "DevRites cursor
|
|
232
|
+
fmt.Fprintf(stdout, "DevRites cursor: active feature: %s\n", slug)
|
|
233
233
|
if status != "" {
|
|
234
234
|
fmt.Fprintf(stdout, " status: %s\n", status)
|
|
235
235
|
}
|
|
@@ -241,7 +241,7 @@ func hookCursor(stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
241
241
|
fmt.Fprintf(stdout, " AFK slices remaining: %s\n", afk)
|
|
242
242
|
}
|
|
243
243
|
if wsIsFile(filepath.Join(dir, ".red")) {
|
|
244
|
-
fmt.Fprintln(stdout, " ⚠ tests/build RED
|
|
244
|
+
fmt.Fprintln(stdout, " ⚠ tests/build RED: resolve before stopping")
|
|
245
245
|
}
|
|
246
246
|
return exitOK
|
|
247
247
|
}
|
|
@@ -281,7 +281,7 @@ var (
|
|
|
281
281
|
redPassRe = regexp.MustCompile(`(?im)PASS(ED)?|0[[:space:]]+(failed|failing|errors?)|all tests passed|BUILD SUCC(ESS|EEDED)|succeeded|no (errors|problems|issues)|(^|[^a-z])ok([^a-z]|$)|✓`)
|
|
282
282
|
)
|
|
283
283
|
|
|
284
|
-
const redReasonFmt = "DevRites: tests/build are RED (%s). Fix to green or record the failure + next step in state.md before stopping
|
|
284
|
+
const redReasonFmt = "DevRites: tests/build are RED (%s). Fix to green or record the failure + next step in state.md before stopping: the Stop gate blocks an end-of-turn while .red is set."
|
|
285
285
|
|
|
286
286
|
// hookRedwatch is the fail-on-red sentinel (PostToolUse Bash). After a test / build
|
|
287
287
|
// / lint command it sets or clears <featureDir>/.red so the Stop gate can refuse to
|
|
@@ -339,7 +339,7 @@ func redwatchSafe(cmd string) string {
|
|
|
339
339
|
// node regex the shell guards use.
|
|
340
340
|
var patchPathRe = regexp.MustCompile(`(?m)^\*\*\* (?:(?:Add|Update|Delete) File|Move to): (.+)$`)
|
|
341
341
|
|
|
342
|
-
// isEditTool reports whether a tool can write source
|
|
342
|
+
// isEditTool reports whether a tool can write source: the Edit family plus
|
|
343
343
|
// Codex's apply_patch.
|
|
344
344
|
func isEditTool(tool string) bool {
|
|
345
345
|
switch tool {
|
|
@@ -364,10 +364,10 @@ func underDevrites(abs, root string) bool {
|
|
|
364
364
|
return strings.HasPrefix(abs, root+string(filepath.Separator))
|
|
365
365
|
}
|
|
366
366
|
|
|
367
|
-
const a1DenyReason = "DevRites A1: the orchestrator must not edit source mid-build
|
|
367
|
+
const a1DenyReason = "DevRites A1: the orchestrator must not edit source mid-build: the slice-wright is the only writer. Re-dispatch the wright (continue it once) or stop + escalate; do not patch the code yourself. (devrites-a1-guard)"
|
|
368
368
|
|
|
369
369
|
// hookA1Guard keeps the /rite-build orchestrator from editing source while a slice
|
|
370
|
-
// is mid-build
|
|
370
|
+
// is mid-build: the slice-wright (a subagent) is the only sanctioned writer of
|
|
371
371
|
// code. Ported from devrites-a1-guard.sh onto the new schema: FAIL-OPEN, OBSERVE by
|
|
372
372
|
// default (logs to .a1-guard.log), blocking only when the build window is open, the
|
|
373
373
|
// edit is source from the MAIN thread, and enforce mode is on.
|
|
@@ -451,7 +451,7 @@ func hookA1Guard(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) i
|
|
|
451
451
|
return exitOK
|
|
452
452
|
}
|
|
453
453
|
|
|
454
|
-
const wrightDenyReason = "DevRites scope: this path is not in touched-files.md. Build only the slice contract; if the slice genuinely needs this file, return an Escalation so the orchestrator routes it through the Spec Drift Guard
|
|
454
|
+
const wrightDenyReason = "DevRites scope: this path is not in touched-files.md. Build only the slice contract; if the slice genuinely needs this file, return an Escalation so the orchestrator routes it through the Spec Drift Guard: do not widen scope yourself. (devrites-wright-scope)"
|
|
455
455
|
|
|
456
456
|
// hookWrightScope fences the slice-wright to its slice: it denies an Edit/Write to a
|
|
457
457
|
// path not listed in the feature's touched-files.md. Ported from
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// Package doctor reports the version triangle
|
|
2
|
-
// DevRites pack, and the on-disk .devrites state schema
|
|
1
|
+
// Package doctor reports the version triangle: the engine binary, the installed
|
|
2
|
+
// DevRites pack, and the on-disk .devrites state schema, and a clear skew
|
|
3
3
|
// verdict. Version skew is a leading cause of silent breakage; doctor turns it
|
|
4
4
|
// into one legible line. Everything here is a read; doctor never mutates state.
|
|
5
5
|
package doctor
|
|
@@ -16,7 +16,7 @@ import (
|
|
|
16
16
|
)
|
|
17
17
|
|
|
18
18
|
// Unknown is the pack value reported when the installed pack version can't be
|
|
19
|
-
// discovered
|
|
19
|
+
// discovered: skew against an unknown pack is not asserted.
|
|
20
20
|
const Unknown = "unknown"
|
|
21
21
|
|
|
22
22
|
// Report is the resolved version triangle plus its verdict.
|
|
@@ -45,7 +45,7 @@ func Diagnose(projectDir, root string) (*Report, error) {
|
|
|
45
45
|
return nil, fmt.Errorf("read state schema: %w", err)
|
|
46
46
|
}
|
|
47
47
|
if stateSchema == 0 {
|
|
48
|
-
// Nothing on disk declares a version
|
|
48
|
+
// Nothing on disk declares a version: treat it as the current schema;
|
|
49
49
|
// undeclared state is read as the engine's own version.
|
|
50
50
|
stateSchema = state.SchemaVersion
|
|
51
51
|
}
|
|
@@ -61,10 +61,10 @@ func Diagnose(projectDir, root string) (*Report, error) {
|
|
|
61
61
|
switch {
|
|
62
62
|
case r.StateSchema > r.BinarySchema:
|
|
63
63
|
r.Refuse = true
|
|
64
|
-
r.Verdict = fmt.Sprintf("REFUSE: state schema v%d is newer than this binary supports (v%d)
|
|
64
|
+
r.Verdict = fmt.Sprintf("REFUSE: state schema v%d is newer than this binary supports (v%d): update devrites",
|
|
65
65
|
r.StateSchema, r.BinarySchema)
|
|
66
66
|
case r.packSkew():
|
|
67
|
-
r.Verdict = fmt.Sprintf("WARN: binary %s is older than the installed pack %s
|
|
67
|
+
r.Verdict = fmt.Sprintf("WARN: binary %s is older than the installed pack %s: update the devrites-engine binary",
|
|
68
68
|
r.Binary, r.Pack)
|
|
69
69
|
default:
|
|
70
70
|
r.Verdict = "ok: binary, pack, and state schema are compatible"
|
|
@@ -131,7 +131,7 @@ func driftChecks(projectDir string) []string {
|
|
|
131
131
|
checks = append(checks, "WARN: .claude/settings.json exists but does not reference devrites-engine hooks")
|
|
132
132
|
}
|
|
133
133
|
} else if isDir(filepath.Join(projectDir, ".claude")) {
|
|
134
|
-
checks = append(checks, "WARN: .claude/settings.json missing
|
|
134
|
+
checks = append(checks, "WARN: .claude/settings.json missing: Claude hooks/statusline may be absent")
|
|
135
135
|
}
|
|
136
136
|
if isDir(filepath.Join(projectDir, ".claude", "skills")) && !isDir(filepath.Join(projectDir, ".agents", "skills")) {
|
|
137
137
|
checks = append(checks, "WARN: Claude skills installed but Codex skill mirror .agents/skills is missing")
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Enforcement is phase-relative, gate-scoped, and transition-fired: a gate
|
|
4
4
|
// checks only the sections required to make its transition, and only when it is
|
|
5
|
-
// run
|
|
5
|
+
// run: never on every tool call. A block is a HITL pause (a structured
|
|
6
6
|
// "missing X" the human resolves and retries), never a crash. Judgment gates
|
|
7
7
|
// stay advisory; these deterministic gates are the ones allowed to block.
|
|
8
8
|
package gate
|
|
@@ -23,10 +23,10 @@ type Kind string
|
|
|
23
23
|
|
|
24
24
|
const (
|
|
25
25
|
// Readiness checks the sections required to LEAVE the feature's current
|
|
26
|
-
// phase
|
|
26
|
+
// phase: the gate fired when advancing to the next phase.
|
|
27
27
|
Readiness Kind = "readiness"
|
|
28
28
|
// Seal checks the full seal-phase requirement set regardless of the
|
|
29
|
-
// feature's current phase
|
|
29
|
+
// feature's current phase: the final completeness gate before shipping.
|
|
30
30
|
Seal Kind = "seal"
|
|
31
31
|
)
|
|
32
32
|
|
|
@@ -44,7 +44,7 @@ type Result struct {
|
|
|
44
44
|
// Check runs a gate against feature <slug> under root, reading the files
|
|
45
45
|
// directly (the files are always the source of truth, so a gate never trusts a
|
|
46
46
|
// possibly-stale cache). It returns an error only for a genuinely broken request
|
|
47
|
-
// (unknown slug, unreadable state)
|
|
47
|
+
// (unknown slug, unreadable state): a legitimately incomplete feature is a
|
|
48
48
|
// Result with Blocked set, not an error.
|
|
49
49
|
func Check(kind Kind, root, slug string) (*Result, error) {
|
|
50
50
|
f, err := state.LoadFeature(root, slug)
|
|
@@ -68,7 +68,7 @@ func Check(kind Kind, root, slug string) (*Result, error) {
|
|
|
68
68
|
|
|
69
69
|
// Render produces the deterministic, greppable gate output (with a trailing
|
|
70
70
|
// newline). A block names exactly the missing sections and the resolve step, so
|
|
71
|
-
// a human
|
|
71
|
+
// a human (or an AFK agent) knows precisely what to fix.
|
|
72
72
|
func (r *Result) Render() string {
|
|
73
73
|
var b strings.Builder
|
|
74
74
|
fmt.Fprintf(&b, "gate: %s\n", r.Kind)
|
|
@@ -92,10 +92,10 @@ func (r *Result) Render() string {
|
|
|
92
92
|
// StopGate evaluates the stop-hook rest-point invariant for the active feature:
|
|
93
93
|
// a feature that CLAIMS completion (it has advanced to seal, ship, or done)
|
|
94
94
|
// must not have an empty proof section. This is a rest-point check, NOT
|
|
95
|
-
// whole-feature completeness
|
|
95
|
+
// whole-feature completeness: normal in-progress incompleteness never trips it,
|
|
96
96
|
// so a mid-build turn is never blocked.
|
|
97
97
|
//
|
|
98
|
-
// It returns a zero StopResult (Blocked false)
|
|
98
|
+
// It returns a zero StopResult (Blocked false) (silent, no block) when there
|
|
99
99
|
// is no active feature or the workspace can't be read, keeping the stop hook
|
|
100
100
|
// fail-open.
|
|
101
101
|
func StopGate(root string) (StopResult, error) {
|
|
@@ -108,7 +108,7 @@ func StopGate(root string) (StopResult, error) {
|
|
|
108
108
|
return StopResult{}, nil // fail-open: a broken workspace never wedges Stop
|
|
109
109
|
}
|
|
110
110
|
// Fail-on-red: the redwatch hook marks a known-red suite by writing .red. A turn
|
|
111
|
-
// must not rest while it is set
|
|
111
|
+
// must not rest while it is set: evidence over confidence. This is a rest-point
|
|
112
112
|
// invariant (a concrete, provable inconsistency), not whole-feature completeness.
|
|
113
113
|
featureDir := devritespaths.FeatureDir(root, slug)
|
|
114
114
|
if _, statErr := os.Stat(filepath.Join(featureDir, ".red")); statErr == nil {
|
|
@@ -116,7 +116,7 @@ func StopGate(root string) (StopResult, error) {
|
|
|
116
116
|
Slug: slug,
|
|
117
117
|
Blocked: true,
|
|
118
118
|
Reason: fmt.Sprintf(
|
|
119
|
-
"feature %q has tests/build RED (.red is set)
|
|
119
|
+
"feature %q has tests/build RED (.red is set): fix to green, or record the failure and next step, before stopping",
|
|
120
120
|
slug),
|
|
121
121
|
}, nil
|
|
122
122
|
}
|
|
@@ -125,7 +125,7 @@ func StopGate(root string) (StopResult, error) {
|
|
|
125
125
|
Slug: slug,
|
|
126
126
|
Blocked: true,
|
|
127
127
|
Reason: fmt.Sprintf(
|
|
128
|
-
"feature %q has open %s human question(s) in questions.md but state.md is not awaiting_human
|
|
128
|
+
"feature %q has open %s human question(s) in questions.md but state.md is not awaiting_human: surface the gate before stopping",
|
|
129
129
|
slug, strings.Join(gates, "/")),
|
|
130
130
|
}, nil
|
|
131
131
|
}
|
|
@@ -135,7 +135,7 @@ func StopGate(root string) (StopResult, error) {
|
|
|
135
135
|
Slug: slug,
|
|
136
136
|
Blocked: true,
|
|
137
137
|
Reason: fmt.Sprintf(
|
|
138
|
-
"feature %q is at phase %q but proof.md is empty
|
|
138
|
+
"feature %q is at phase %q but proof.md is empty: record acceptance evidence, or move the phase back, before stopping",
|
|
139
139
|
slug, f.Phase),
|
|
140
140
|
}, nil
|
|
141
141
|
}
|
|
@@ -95,7 +95,7 @@ func RenderMatrix() string {
|
|
|
95
95
|
}
|
|
96
96
|
b.WriteString("\nTiers: **Native** (the harness exposes and delivers the surface directly; policy notes state whether it blocks) · **Adapter-backed** ")
|
|
97
97
|
b.WriteString("(supported through a translation shim) · **Instruction-backed** ")
|
|
98
|
-
b.WriteString("(no runtime surface
|
|
98
|
+
b.WriteString("(no runtime surface: rides on a directive the model may under-fire) · ")
|
|
99
99
|
b.WriteString("**Conditional** (native but gated on an operator precondition).\n\n")
|
|
100
100
|
b.WriteString(MatrixEndMarker)
|
|
101
101
|
return b.String()
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// One binary serves both Claude Code and Codex. The shared gate/orientation
|
|
4
4
|
// logic lives in the middle (internal/orient, internal/gate); this package
|
|
5
5
|
// translates each harness's hook stdin schema and its exit/decision convention.
|
|
6
|
-
// The engine never calls a model
|
|
6
|
+
// The engine never calls a model: these adapters only shape stdin/stdout.
|
|
7
7
|
package harness
|
|
8
8
|
|
|
9
9
|
import (
|
|
@@ -93,7 +93,7 @@ type StopInput struct {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
// ParseStopInput decodes a Stop hook's stdin. An empty or malformed payload is
|
|
96
|
-
// not an error
|
|
96
|
+
// not an error: it decodes to the zero value (StopHookActive false), so a
|
|
97
97
|
// harness that sends nothing simply gets a first-pass gate check. This keeps the
|
|
98
98
|
// hook fail-open: bad stdin never crashes it.
|
|
99
99
|
func (h Harness) ParseStopInput(r io.Reader) StopInput {
|
|
@@ -107,8 +107,8 @@ func (h Harness) ParseStopInput(r io.Reader) StopInput {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
// PreToolInput is the subset of a PreToolUse hook's stdin the reviewer-readonly
|
|
110
|
-
// guard reads: which tool is about to run, its command, and
|
|
111
|
-
// agent-scoping gate
|
|
110
|
+
// guard reads: which tool is about to run, its command, and: for the optional
|
|
111
|
+
// agent-scoping gate: the calling subagent's name. Every field is best-effort:
|
|
112
112
|
// a hook that can't identify the tool simply falls through to its silent no-op.
|
|
113
113
|
type PreToolInput struct {
|
|
114
114
|
ToolName string
|
|
@@ -118,7 +118,7 @@ type PreToolInput struct {
|
|
|
118
118
|
|
|
119
119
|
// ParsePreToolInput decodes a PreToolUse payload. Like ParseStopInput it never
|
|
120
120
|
// errors: an empty or malformed payload decodes to the zero value so a guard hook
|
|
121
|
-
// stays fail-open. AgentType reads `agent_type` ONLY
|
|
121
|
+
// stays fail-open. AgentType reads `agent_type` ONLY: matching
|
|
122
122
|
// devrites-reviewer-readonly.sh's node parse exactly (it does not consult the
|
|
123
123
|
// subagent_type / agentType aliases; SubagentAgentType does, for the subagent
|
|
124
124
|
// hook that needs them).
|
|
@@ -145,7 +145,7 @@ func (h Harness) ParsePreToolInput(r io.Reader) PreToolInput {
|
|
|
145
145
|
|
|
146
146
|
// SubagentAgentType decodes just the spawned subagent's name from a SubagentStart
|
|
147
147
|
// payload, reading whichever of agent_type / subagent_type / agentType the harness
|
|
148
|
-
// populates (Claude and Codex differ)
|
|
148
|
+
// populates (Claude and Codex differ): the exact 3-way fallback
|
|
149
149
|
// devrites-subagent-orient.sh uses. Never errors: bad stdin yields "".
|
|
150
150
|
func (h Harness) SubagentAgentType(r io.Reader) string {
|
|
151
151
|
var raw struct {
|
|
@@ -198,7 +198,7 @@ type preToolEnvelope struct {
|
|
|
198
198
|
// GuardInput is the fuller PreToolUse / PostToolUse payload the write-guards read:
|
|
199
199
|
// the tool + its command / target path, the calling subagent's identity (both the
|
|
200
200
|
// agent_id Claude sends and the agent_type Codex sends), and the tool's response
|
|
201
|
-
// text (for the post-hooks that inspect output). Best-effort
|
|
201
|
+
// text (for the post-hooks that inspect output). Best-effort: bad stdin yields
|
|
202
202
|
// the zero value so a guard stays fail-open.
|
|
203
203
|
type GuardInput struct {
|
|
204
204
|
ToolName string
|
|
@@ -16,6 +16,7 @@ import (
|
|
|
16
16
|
"os/exec"
|
|
17
17
|
"path/filepath"
|
|
18
18
|
"reflect"
|
|
19
|
+
"runtime"
|
|
19
20
|
"slices"
|
|
20
21
|
"sort"
|
|
21
22
|
"strings"
|
|
@@ -30,6 +31,7 @@ import (
|
|
|
30
31
|
|
|
31
32
|
const ManifestName = devritespaths.ManifestName
|
|
32
33
|
const defaultRepo = "ViktorsBaikers/DevRites"
|
|
34
|
+
const githubBaseURL = "https://github.com"
|
|
33
35
|
|
|
34
36
|
type Mode string
|
|
35
37
|
|
|
@@ -69,15 +71,17 @@ type stats struct {
|
|
|
69
71
|
}
|
|
70
72
|
|
|
71
73
|
type runner struct {
|
|
72
|
-
opts
|
|
73
|
-
target
|
|
74
|
-
payload
|
|
75
|
-
payloadFS
|
|
76
|
-
source
|
|
77
|
-
manifest
|
|
78
|
-
records
|
|
79
|
-
prev
|
|
80
|
-
stats
|
|
74
|
+
opts Options
|
|
75
|
+
target string
|
|
76
|
+
payload string
|
|
77
|
+
payloadFS fs.FS
|
|
78
|
+
source string
|
|
79
|
+
manifest []string
|
|
80
|
+
records map[string]string
|
|
81
|
+
prev map[string]bool
|
|
82
|
+
stats stats
|
|
83
|
+
releaseBinaryTag string
|
|
84
|
+
preparedBinary string
|
|
81
85
|
}
|
|
82
86
|
|
|
83
87
|
func DefaultOptions(mode Mode) Options {
|
|
@@ -849,7 +853,20 @@ func runUpdate(opts Options) error {
|
|
|
849
853
|
if opts.DryRun {
|
|
850
854
|
next.DryRun = true
|
|
851
855
|
}
|
|
852
|
-
|
|
856
|
+
r, err := newRunner(next)
|
|
857
|
+
if err != nil {
|
|
858
|
+
return fmt.Errorf("prepare installer: %w", err)
|
|
859
|
+
}
|
|
860
|
+
r.releaseBinaryTag = latestTag
|
|
861
|
+
if next.WithBinary && os.Getenv("DEVRITES_NO_BINARY") != "1" && !next.DryRun {
|
|
862
|
+
staged, cleanup, err := r.acquireBinary(latestTag, githubBaseURL)
|
|
863
|
+
if err != nil {
|
|
864
|
+
return fmt.Errorf("prepare engine binary: %w", err)
|
|
865
|
+
}
|
|
866
|
+
defer cleanup()
|
|
867
|
+
r.preparedBinary = staged
|
|
868
|
+
}
|
|
869
|
+
return r.install()
|
|
853
870
|
}
|
|
854
871
|
|
|
855
872
|
func resolveUpdateTag(opts Options) (string, error) {
|
|
@@ -1185,6 +1202,8 @@ func containsDevritesHook(v any) bool {
|
|
|
1185
1202
|
|
|
1186
1203
|
func isDevritesHooksComment(comment string) bool {
|
|
1187
1204
|
return comment == "DevRites hooks" ||
|
|
1205
|
+
strings.HasPrefix(comment, "DevRites hooks: every event invokes the global `devrites-engine` engine binary") ||
|
|
1206
|
+
strings.HasPrefix(comment, "DevRites hooks: auto-approve the read-only orientation/gate scripts") ||
|
|
1188
1207
|
strings.HasPrefix(comment, "DevRites hooks — every event invokes the global `devrites-engine` engine binary") ||
|
|
1189
1208
|
strings.HasPrefix(comment, "DevRites hooks — auto-approve the read-only orientation/gate scripts") ||
|
|
1190
1209
|
strings.HasPrefix(comment, "DevRites hooks for Codex. Project hooks load only after")
|
|
@@ -1295,24 +1314,24 @@ func (r *runner) installBinary() error {
|
|
|
1295
1314
|
return nil
|
|
1296
1315
|
}
|
|
1297
1316
|
}
|
|
1298
|
-
staged, cleanup
|
|
1299
|
-
if
|
|
1300
|
-
|
|
1301
|
-
|
|
1317
|
+
staged, cleanup := r.preparedBinary, func() {}
|
|
1318
|
+
if staged == "" {
|
|
1319
|
+
var err error
|
|
1320
|
+
staged, cleanup, err = r.acquireBinary(tag, githubBaseURL)
|
|
1321
|
+
if err != nil {
|
|
1322
|
+
return r.binaryInstallFailure(err)
|
|
1323
|
+
}
|
|
1302
1324
|
}
|
|
1303
1325
|
defer cleanup()
|
|
1304
1326
|
if err := os.MkdirAll(filepath.Dir(dest), 0o755); err != nil {
|
|
1305
|
-
|
|
1306
|
-
return nil
|
|
1327
|
+
return r.binaryInstallFailure(err)
|
|
1307
1328
|
}
|
|
1308
1329
|
data, err := os.ReadFile(staged)
|
|
1309
1330
|
if err != nil {
|
|
1310
|
-
|
|
1311
|
-
return nil
|
|
1331
|
+
return r.binaryInstallFailure(err)
|
|
1312
1332
|
}
|
|
1313
1333
|
if err := fsutil.WriteFileAtomic(dest, data, 0o755); err != nil {
|
|
1314
|
-
|
|
1315
|
-
return nil
|
|
1334
|
+
return r.binaryInstallFailure(err)
|
|
1316
1335
|
}
|
|
1317
1336
|
_ = os.Chmod(dest, 0o755)
|
|
1318
1337
|
fmt.Fprintf(r.opts.Stdout, " engine binary: installed %s\n", dest)
|
|
@@ -1322,12 +1341,23 @@ func (r *runner) installBinary() error {
|
|
|
1322
1341
|
return nil
|
|
1323
1342
|
}
|
|
1324
1343
|
|
|
1325
|
-
func (r *runner)
|
|
1344
|
+
func (r *runner) binaryInstallFailure(err error) error {
|
|
1345
|
+
if r.preparedBinary != "" {
|
|
1346
|
+
return err
|
|
1347
|
+
}
|
|
1348
|
+
fmt.Fprintf(r.opts.Stderr, "warning: engine binary: %v - hooks fail open until you install it.\n", err)
|
|
1349
|
+
return nil
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
func (r *runner) acquireBinary(tag, baseURL string) (string, func(), error) {
|
|
1326
1353
|
if v := os.Getenv("DEVRITES_ENGINE_CLI"); v != "" {
|
|
1327
1354
|
if exists(v) {
|
|
1328
|
-
|
|
1355
|
+
if r.releaseBinaryTag == "" || strings.TrimPrefix(engineVersion(v), "v") == strings.TrimPrefix(r.releaseBinaryTag, "v") {
|
|
1356
|
+
return v, func() {}, nil
|
|
1357
|
+
}
|
|
1358
|
+
} else {
|
|
1359
|
+
return "", func() {}, fmt.Errorf("DEVRITES_ENGINE_CLI points to a missing binary: %s", v)
|
|
1329
1360
|
}
|
|
1330
|
-
return "", func() {}, fmt.Errorf("DEVRITES_ENGINE_CLI points to a missing binary: %s", v)
|
|
1331
1361
|
}
|
|
1332
1362
|
tmp, err := os.MkdirTemp("", "devrites-engine-*")
|
|
1333
1363
|
if err != nil {
|
|
@@ -1335,19 +1365,60 @@ func (r *runner) acquireBinary(tag string) (string, func(), error) {
|
|
|
1335
1365
|
}
|
|
1336
1366
|
cleanup := func() { _ = os.RemoveAll(tmp) }
|
|
1337
1367
|
staged := filepath.Join(tmp, "devrites-engine")
|
|
1368
|
+
var releaseErr error
|
|
1369
|
+
if r.releaseBinaryTag != "" && os.Getenv("DEVRITES_UPDATE_BUNDLE") == "" {
|
|
1370
|
+
repo := os.Getenv("DEVRITES_REPO")
|
|
1371
|
+
if repo == "" {
|
|
1372
|
+
repo = defaultRepo
|
|
1373
|
+
}
|
|
1374
|
+
downloaded, err := downloadReleaseBinary(baseURL, repo, r.releaseBinaryTag, staged)
|
|
1375
|
+
if err == nil {
|
|
1376
|
+
return staged, cleanup, nil
|
|
1377
|
+
}
|
|
1378
|
+
if downloaded {
|
|
1379
|
+
return "", cleanup, err
|
|
1380
|
+
}
|
|
1381
|
+
releaseErr = err
|
|
1382
|
+
}
|
|
1338
1383
|
if r.source != "" && exists(filepath.Join(r.source, "engine", "go.mod")) {
|
|
1339
1384
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
|
|
1340
1385
|
defer cancel()
|
|
1341
|
-
cmd := exec.CommandContext(ctx, "go", "build", "-trimpath", "-ldflags", "-s -w -X github.com/devrites/devrites/internal/version.Version="+tag, "-o", staged, ".")
|
|
1386
|
+
cmd := exec.CommandContext(ctx, "go", "build", "-buildvcs=false", "-trimpath", "-ldflags", "-s -w -X github.com/devrites/devrites/internal/version.Version="+tag, "-o", staged, ".")
|
|
1342
1387
|
cmd.Dir = filepath.Join(r.source, "engine")
|
|
1343
1388
|
if out, err := cmd.CombinedOutput(); err != nil {
|
|
1389
|
+
if releaseErr != nil {
|
|
1390
|
+
return "", cleanup, fmt.Errorf("could not download release binary: %v; source fallback failed: %w: %s", releaseErr, err, strings.TrimSpace(string(out)))
|
|
1391
|
+
}
|
|
1344
1392
|
return "", cleanup, fmt.Errorf("could not build from source: %w: %s", err, strings.TrimSpace(string(out)))
|
|
1345
1393
|
}
|
|
1346
1394
|
return staged, cleanup, nil
|
|
1347
1395
|
}
|
|
1396
|
+
if releaseErr != nil {
|
|
1397
|
+
return "", cleanup, fmt.Errorf("could not obtain a binary: %v; no Go source fallback", releaseErr)
|
|
1398
|
+
}
|
|
1348
1399
|
return "", cleanup, fmt.Errorf("could not obtain a binary (no DEVRITES_ENGINE_CLI handoff, no Go source)")
|
|
1349
1400
|
}
|
|
1350
1401
|
|
|
1402
|
+
func downloadReleaseBinary(baseURL, repo, tag, dest string) (bool, error) {
|
|
1403
|
+
asset := fmt.Sprintf("devrites-%s-%s", runtime.GOOS, runtime.GOARCH)
|
|
1404
|
+
if runtime.GOOS == "windows" {
|
|
1405
|
+
asset += ".exe"
|
|
1406
|
+
}
|
|
1407
|
+
url := fmt.Sprintf("%s/%s/releases/download/%s/%s", strings.TrimRight(baseURL, "/"), repo, tag, asset)
|
|
1408
|
+
if err := iohooks.DownloadFile(url, dest); err != nil {
|
|
1409
|
+
return false, fmt.Errorf("download %s: %w", asset, err)
|
|
1410
|
+
}
|
|
1411
|
+
sumPath := dest + ".sha256"
|
|
1412
|
+
defer os.Remove(sumPath)
|
|
1413
|
+
if err := iohooks.DownloadFile(url+".sha256", sumPath); err != nil {
|
|
1414
|
+
return true, fmt.Errorf("could not verify release binary %s: missing checksum: %w", asset, err)
|
|
1415
|
+
}
|
|
1416
|
+
if err := verifySHA256(dest, sumPath); err != nil {
|
|
1417
|
+
return true, fmt.Errorf("could not verify release binary %s: %w", asset, err)
|
|
1418
|
+
}
|
|
1419
|
+
return true, nil
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1351
1422
|
func (r *runner) removeBinary() error {
|
|
1352
1423
|
if r.opts.KeepBinary {
|
|
1353
1424
|
fmt.Fprintln(r.opts.Stdout, " kept the global devrites-engine binary (--keep-binary).")
|