devrites 3.0.6 → 3.1.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 +18 -0
- package/README.md +67 -45
- package/SECURITY.md +31 -29
- package/docs/adr/0001-go-engine-as-control-plane.md +1 -1
- package/docs/adr/0002-dual-host-harness.md +1 -1
- package/docs/adr/0004-state-schema-phases-sections.md +1 -2
- package/docs/adr/0006-clock-seam-and-engine-ci-gates.md +3 -4
- package/docs/adr/0009-prebuild-decision-coverage-and-readiness.md +67 -0
- package/docs/adr/0010-agent-first-fresh-context-orchestration.md +71 -0
- package/docs/adr/0011-define-plan-transition-rights.md +28 -0
- package/docs/adr/README.md +3 -0
- package/docs/agents/triage-labels.md +7 -7
- package/docs/architecture.md +157 -140
- package/docs/cli.md +41 -12
- package/docs/command-map.md +49 -35
- package/docs/engine/agent-contract.md +92 -15
- package/docs/engine/commands.md +242 -72
- package/docs/engine/state-schema.md +52 -23
- package/docs/engine/workspace-schema.md +94 -15
- package/docs/extensions.md +1 -1
- package/docs/flow.md +80 -50
- package/docs/harness-compliance.md +29 -5
- package/docs/orchestration.md +107 -79
- package/docs/quick-reference.md +7 -3
- package/docs/release.md +4 -3
- package/docs/skills.md +64 -38
- package/docs/usage.md +57 -38
- package/engine/cmd/releasepack/main.go +219 -0
- package/engine/cmd/releasepack/main_test.go +170 -0
- package/engine/commands.go +170 -23
- package/engine/git_guard.go +187 -0
- package/engine/git_guard_test.go +283 -0
- package/engine/hookpolicy.go +53 -55
- package/engine/hookpolicy_test.go +91 -1
- package/engine/hooks.go +296 -75
- package/engine/hooks_events_test.go +276 -6
- package/engine/hooks_workspace.go +640 -159
- package/engine/internal/devritespaths/paths.go +65 -10
- package/engine/internal/devritespaths/paths_test.go +110 -0
- package/engine/internal/doctor/doctor.go +153 -23
- package/engine/internal/doctor/doctor_test.go +74 -0
- package/engine/internal/forge/forge.go +940 -0
- package/engine/internal/forge/forge_test.go +576 -0
- package/engine/internal/forge/git.go +245 -0
- package/engine/internal/forge/liveness_unix.go +48 -0
- package/engine/internal/forge/liveness_windows.go +67 -0
- package/engine/internal/forge/manifest.go +402 -0
- package/engine/internal/gate/gate.go +90 -71
- package/engine/internal/gate/gate_test.go +71 -2
- package/engine/internal/harness/compliance.go +18 -24
- package/engine/internal/harness/harness.go +37 -44
- package/engine/internal/harness/harness_test.go +21 -5
- package/engine/internal/install/install.go +575 -58
- package/engine/internal/install/install_test.go +490 -9
- package/engine/internal/iohooks/iohooks.go +350 -59
- package/engine/internal/iohooks/iohooks_test.go +421 -1
- package/engine/internal/lib/buildreadiness.go +35 -18
- package/engine/internal/lib/clarifyreturn.go +91 -0
- package/engine/internal/lib/clarifyreturn_test.go +123 -0
- package/engine/internal/lib/context.go +54 -15
- package/engine/internal/lib/cursor_compat_test.go +8 -0
- package/engine/internal/lib/extensions.go +2 -3
- package/engine/internal/lib/gitauthority.go +601 -0
- package/engine/internal/lib/gitauthority_test.go +346 -0
- package/engine/internal/lib/jsonout.go +25 -11
- package/engine/internal/lib/jsonout_test.go +16 -0
- package/engine/internal/lib/lanes.go +14 -8
- package/engine/internal/lib/observability_test.go +358 -0
- package/engine/internal/lib/packageexistence.go +151 -35
- package/engine/internal/lib/packageexistence_test.go +163 -0
- package/engine/internal/lib/progress.go +11 -9
- package/engine/internal/lib/provenance.go +462 -0
- package/engine/internal/lib/provenance_test.go +154 -0
- package/engine/internal/lib/readiness_contract.json +111 -0
- package/engine/internal/lib/readinessartifact.go +510 -0
- package/engine/internal/lib/readinessartifact_test.go +321 -0
- package/engine/internal/lib/reconcile.go +712 -88
- package/engine/internal/lib/reconcile_test.go +335 -16
- package/engine/internal/lib/recoveryattempts.go +298 -0
- package/engine/internal/lib/recoveryattempts_test.go +215 -0
- package/engine/internal/lib/resolve.go +23 -19
- package/engine/internal/lib/runbook_context_test.go +20 -0
- package/engine/internal/lib/session.go +701 -9
- package/engine/internal/lib/session_test.go +80 -13
- package/engine/internal/lib/testintegrity.go +33 -37
- package/engine/internal/lib/testintegrity_test.go +63 -1
- package/engine/internal/migrate/migrate.go +81 -1
- package/engine/internal/migrate/migrate_test.go +22 -1
- package/engine/internal/reason/reason.go +180 -0
- package/engine/internal/reason/reason_test.go +35 -0
- package/engine/internal/rootfacts/facts.go +466 -0
- package/engine/internal/rootfacts/facts_test.go +306 -0
- package/engine/internal/safepath/safepath.go +55 -0
- package/engine/internal/safepath/safepath_test.go +69 -0
- package/engine/internal/safepath/safepath_windows_test.go +26 -0
- package/engine/internal/state/clarify_transition.go +165 -0
- package/engine/internal/state/clarify_transition_test.go +130 -0
- package/engine/internal/state/cmd/workflowmanifest/main.go +12 -8
- package/engine/internal/state/cursor.go +58 -0
- package/engine/internal/state/cursor_test.go +42 -1
- package/engine/internal/state/feature.go +35 -48
- package/engine/internal/state/schema.go +90 -37
- package/engine/internal/state/snapshot.go +18 -2
- package/engine/internal/state/state_test.go +187 -7
- package/engine/internal/state/status.go +48 -11
- package/engine/internal/state/workflow_manifest.json +231 -50
- package/engine/internal/toolpolicy/classifier.go +533 -0
- package/engine/internal/toolpolicy/classifier_test.go +424 -0
- package/engine/internal/toolpolicy/git.go +616 -0
- package/engine/internal/toolpolicy/scanner.go +382 -0
- package/engine/main.go +160 -77
- package/engine/observability_cli_test.go +52 -0
- package/engine/root_routing_test.go +277 -0
- 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=noclarify.golden +1 -0
- package/engine/testdata/golden/TestParityBuildReadiness/arg=novet.golden +1 -0
- package/engine/testdata/golden/TestParityBuildReadiness/arg=stalevet.golden +1 -0
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=vetnotready.golden +1 -0
- package/engine/testdata/golden/TestParityProgress/arg=allbuilt.golden +1 -1
- package/engine/testdata/golden/TestParityProgress/arg=done.golden +1 -1
- package/engine/testdata/golden/TestParityProgress/arg=mid.golden +1 -1
- package/engine/testdata/golden/TestParityProgress/arg=nophase.golden +1 -1
- package/engine/testdata/golden/TestParityProgress/arg=noslice.golden +1 -1
- package/engine/testdata/golden/TestParityProgress/arg=plan.golden +1 -1
- package/engine/testdata/golden/TestParityProgress/arg=seal.golden +1 -1
- package/engine/testdata/golden/TestParityReconcile/check-clean.golden +1 -1
- package/engine/testdata/golden/TestParityReconcile/inline-fallback.golden +1 -0
- package/engine/testdata/golden/TestParityReconcile/snapshot-no-allowlist.golden +1 -0
- package/engine/testdata/golden/TestParityWrightScope/devrites-edit-denied.golden +2 -0
- package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +1 -1
- package/engine/tests/adr_0011_define_plan_test.go +30 -0
- package/engine/tests/budget_test.go +19 -8
- package/engine/tests/concurrency_cli_test.go +7 -1
- package/engine/tests/doctor_cli_test.go +148 -2
- package/engine/tests/forge_cli_test.go +463 -0
- package/engine/tests/gate_test.go +63 -8
- package/engine/tests/hook_test.go +260 -8
- package/engine/tests/hooks_io_test.go +94 -3
- package/engine/tests/json_contract_test.go +127 -2
- package/engine/tests/migrate_cli_test.go +2 -2
- package/engine/tests/parity_buildreadiness_test.go +141 -10
- package/engine/tests/parity_learnings_test.go +16 -17
- package/engine/tests/parity_reconcile_test.go +20 -17
- package/engine/tests/parity_resolve_test.go +12 -11
- package/engine/tests/parity_test.go +21 -17
- package/pack/.claude/agents/devrites-code-reviewer.md +62 -48
- package/pack/.claude/agents/devrites-devex-reviewer.md +69 -53
- package/pack/.claude/agents/devrites-doubt-reviewer.md +29 -22
- package/pack/.claude/agents/devrites-evidence-scout.md +69 -0
- package/pack/.claude/agents/devrites-forge-judge.md +74 -61
- package/pack/.claude/agents/devrites-frontend-reviewer.md +48 -39
- package/pack/.claude/agents/devrites-performance-reviewer.md +49 -40
- package/pack/.claude/agents/devrites-plan-drafter.md +71 -0
- package/pack/.claude/agents/devrites-plan-reviewer.md +80 -47
- package/pack/.claude/agents/devrites-proof-runner.md +74 -0
- package/pack/.claude/agents/devrites-retrospector.md +48 -45
- package/pack/.claude/agents/devrites-security-auditor.md +46 -36
- package/pack/.claude/agents/devrites-simplifier-reviewer.md +50 -46
- package/pack/.claude/agents/devrites-slice-wright.md +153 -165
- package/pack/.claude/agents/devrites-spec-reviewer.md +34 -32
- package/pack/.claude/agents/devrites-strategy-reviewer.md +63 -34
- package/pack/.claude/agents/devrites-test-analyst.md +40 -30
- package/pack/.claude/settings.json +2 -1
- package/pack/.claude/skills/devrites-audit/SKILL.md +40 -61
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +24 -13
- package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
- package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
- package/pack/.claude/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
- package/pack/.claude/skills/devrites-doubt/SKILL.md +25 -17
- package/pack/.claude/skills/devrites-interview/SKILL.md +53 -52
- package/pack/.claude/skills/devrites-lib/SKILL.md +11 -9
- package/pack/.claude/skills/devrites-lib/reference/intent-map.md +3 -2
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
- package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +8 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/README.md +38 -55
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +198 -190
- package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
- package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
- package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +16 -52
- package/pack/.claude/skills/devrites-lib/reference/standards/coding-style.md +2 -10
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +23 -18
- package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +17 -57
- package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
- package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
- package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -14
- package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +9 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +0 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +1 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/security.md +17 -7
- package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +1 -27
- package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +46 -50
- package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +23 -10
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +23 -22
- package/pack/.claude/skills/rite/SKILL.md +8 -6
- package/pack/.claude/skills/rite/reference/menu.md +8 -6
- package/pack/.claude/skills/rite-adopt/SKILL.md +33 -37
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +33 -28
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +21 -21
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
- package/pack/.claude/skills/rite-build/SKILL.md +35 -30
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +38 -38
- package/pack/.claude/skills/rite-build/reference/evidence-standard.md +10 -0
- package/pack/.claude/skills/rite-build/reference/forge.md +186 -156
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +96 -175
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +129 -134
- package/pack/.claude/skills/rite-clarify/SKILL.md +89 -0
- package/pack/.claude/skills/rite-clarify/reference/decision-coverage.md +59 -0
- package/pack/.claude/skills/rite-converge/SKILL.md +35 -25
- package/pack/.claude/skills/rite-define/SKILL.md +57 -32
- package/pack/.claude/skills/rite-define/reference/gates.md +16 -15
- package/pack/.claude/skills/rite-define/reference/plan-template.md +16 -8
- package/pack/.claude/skills/rite-frame/reference/failure-modes.md +22 -24
- package/pack/.claude/skills/rite-plan/SKILL.md +44 -16
- package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +4 -0
- package/pack/.claude/skills/rite-polish/SKILL.md +27 -23
- package/pack/.claude/skills/rite-prototype/SKILL.md +25 -26
- package/pack/.claude/skills/rite-prove/SKILL.md +27 -17
- package/pack/.claude/skills/rite-resolve/SKILL.md +12 -11
- package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +3 -0
- package/pack/.claude/skills/rite-review/SKILL.md +37 -28
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +27 -92
- package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +13 -0
- package/pack/.claude/skills/rite-ship/reference/design-memory.md +31 -36
- package/pack/.claude/skills/rite-spec/SKILL.md +84 -135
- package/pack/.claude/skills/rite-spec/reference/investigation.md +37 -33
- package/pack/.claude/skills/rite-spec/reference/question-protocol.md +6 -2
- package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +25 -24
- package/pack/.claude/skills/rite-spec/reference/spec-template.md +9 -2
- package/pack/.claude/skills/rite-spec/reference/state-workspace.md +13 -3
- package/pack/.claude/skills/rite-temper/SKILL.md +62 -47
- package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +24 -22
- package/pack/.claude/skills/rite-vet/SKILL.md +110 -113
- package/pack/.claude/skills/rite-vet/reference/artifacts.md +42 -9
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +39 -37
- package/pack/generated/claude/agents/devrites-code-reviewer.md +62 -48
- package/pack/generated/claude/agents/devrites-devex-reviewer.md +69 -53
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +29 -22
- package/pack/generated/claude/agents/devrites-evidence-scout.md +69 -0
- package/pack/generated/claude/agents/devrites-forge-judge.md +74 -61
- package/pack/generated/claude/agents/devrites-frontend-reviewer.md +48 -39
- package/pack/generated/claude/agents/devrites-performance-reviewer.md +49 -40
- package/pack/generated/claude/agents/devrites-plan-drafter.md +71 -0
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +80 -47
- package/pack/generated/claude/agents/devrites-proof-runner.md +74 -0
- package/pack/generated/claude/agents/devrites-retrospector.md +48 -45
- package/pack/generated/claude/agents/devrites-security-auditor.md +46 -36
- package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +50 -46
- package/pack/generated/claude/agents/devrites-slice-wright.md +153 -165
- package/pack/generated/claude/agents/devrites-spec-reviewer.md +34 -32
- package/pack/generated/claude/agents/devrites-strategy-reviewer.md +63 -34
- package/pack/generated/claude/agents/devrites-test-analyst.md +40 -30
- package/pack/generated/claude/settings.json +2 -1
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +40 -61
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +24 -13
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +25 -17
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +53 -52
- package/pack/generated/claude/skills/devrites-lib/SKILL.md +11 -9
- package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +3 -2
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
- package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +8 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +38 -55
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +198 -190
- package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
- package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +16 -52
- package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +2 -10
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +23 -18
- package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +17 -57
- package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
- package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
- package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -14
- package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +9 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +0 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +1 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +17 -7
- package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +1 -27
- package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +46 -50
- package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +23 -10
- package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +23 -22
- package/pack/generated/claude/skills/rite/SKILL.md +8 -6
- package/pack/generated/claude/skills/rite/reference/menu.md +8 -6
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +33 -37
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +33 -28
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +21 -21
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
- package/pack/generated/claude/skills/rite-build/SKILL.md +35 -30
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +38 -38
- package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +10 -0
- package/pack/generated/claude/skills/rite-build/reference/forge.md +186 -156
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +96 -175
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +129 -134
- package/pack/generated/claude/skills/rite-clarify/SKILL.md +89 -0
- package/pack/generated/claude/skills/rite-clarify/reference/decision-coverage.md +59 -0
- package/pack/generated/claude/skills/rite-converge/SKILL.md +35 -25
- package/pack/generated/claude/skills/rite-define/SKILL.md +57 -32
- package/pack/generated/claude/skills/rite-define/reference/gates.md +16 -15
- package/pack/generated/claude/skills/rite-define/reference/plan-template.md +16 -8
- package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +22 -24
- package/pack/generated/claude/skills/rite-plan/SKILL.md +44 -16
- package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +4 -0
- package/pack/generated/claude/skills/rite-polish/SKILL.md +27 -23
- package/pack/generated/claude/skills/rite-prototype/SKILL.md +25 -26
- package/pack/generated/claude/skills/rite-prove/SKILL.md +27 -17
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +12 -11
- package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +3 -0
- package/pack/generated/claude/skills/rite-review/SKILL.md +37 -28
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +27 -92
- package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +13 -0
- package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +31 -36
- package/pack/generated/claude/skills/rite-spec/SKILL.md +84 -135
- package/pack/generated/claude/skills/rite-spec/reference/investigation.md +37 -33
- package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +6 -2
- package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +25 -24
- package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +9 -2
- package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +13 -3
- package/pack/generated/claude/skills/rite-temper/SKILL.md +62 -47
- package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +24 -22
- package/pack/generated/claude/skills/rite-vet/SKILL.md +110 -113
- package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +42 -9
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +39 -37
- package/pack/generated/codex/AGENTS.md +5 -2
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +69 -47
- package/pack/generated/codex/agents/devrites-devex-reviewer.toml +75 -51
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +35 -20
- package/pack/generated/codex/agents/devrites-evidence-scout.toml +75 -0
- package/pack/generated/codex/agents/devrites-forge-judge.toml +80 -59
- package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +54 -37
- package/pack/generated/codex/agents/devrites-performance-reviewer.toml +55 -38
- package/pack/generated/codex/agents/devrites-plan-drafter.toml +77 -0
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +82 -47
- package/pack/generated/codex/agents/devrites-proof-runner.toml +80 -0
- package/pack/generated/codex/agents/devrites-retrospector.toml +54 -43
- package/pack/generated/codex/agents/devrites-security-auditor.toml +53 -35
- package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +56 -44
- package/pack/generated/codex/agents/devrites-slice-wright.toml +159 -163
- package/pack/generated/codex/agents/devrites-spec-reviewer.toml +40 -30
- package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +65 -34
- package/pack/generated/codex/agents/devrites-test-analyst.toml +46 -28
- package/pack/generated/codex/hooks.json +4 -14
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +7 -3
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +47 -64
- package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +7 -3
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +31 -16
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +32 -20
- package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +7 -3
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +60 -55
- package/pack/generated/codex/skills/devrites-lib/SKILL.md +18 -12
- package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +3 -2
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
- package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +8 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +38 -55
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +198 -190
- package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
- package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +16 -52
- package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +2 -10
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +23 -18
- package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +17 -57
- package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
- package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
- package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -14
- package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +9 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +0 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +1 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +17 -7
- package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +1 -27
- package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +46 -50
- package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +23 -10
- package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +7 -3
- package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +7 -3
- package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +29 -24
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite/SKILL.md +19 -13
- package/pack/generated/codex/skills/rite/reference/menu.md +8 -6
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +40 -40
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +40 -31
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +21 -21
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
- package/pack/generated/codex/skills/rite-build/SKILL.md +42 -33
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +38 -38
- package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +10 -0
- package/pack/generated/codex/skills/rite-build/reference/forge.md +186 -156
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +4 -3
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +96 -175
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +129 -134
- package/pack/generated/codex/skills/rite-clarify/SKILL.md +105 -0
- package/pack/generated/codex/skills/rite-clarify/reference/decision-coverage.md +59 -0
- package/pack/generated/codex/skills/rite-converge/SKILL.md +42 -28
- package/pack/generated/codex/skills/rite-customize/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-define/SKILL.md +64 -35
- package/pack/generated/codex/skills/rite-define/reference/gates.md +16 -15
- package/pack/generated/codex/skills/rite-define/reference/plan-template.md +16 -8
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-explain/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-frame/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +22 -24
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-learn/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-plan/SKILL.md +51 -19
- package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +5 -1
- package/pack/generated/codex/skills/rite-polish/SKILL.md +34 -26
- package/pack/generated/codex/skills/rite-pov/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-prototype/SKILL.md +32 -29
- package/pack/generated/codex/skills/rite-prove/SKILL.md +34 -20
- package/pack/generated/codex/skills/rite-quick/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +19 -14
- package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +3 -0
- package/pack/generated/codex/skills/rite-review/SKILL.md +44 -31
- package/pack/generated/codex/skills/rite-seal/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +27 -92
- package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +13 -0
- package/pack/generated/codex/skills/rite-ship/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +31 -36
- package/pack/generated/codex/skills/rite-spec/SKILL.md +91 -138
- package/pack/generated/codex/skills/rite-spec/reference/investigation.md +37 -33
- package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +6 -2
- package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +25 -24
- package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +9 -2
- package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +13 -3
- package/pack/generated/codex/skills/rite-status/SKILL.md +7 -3
- package/pack/generated/codex/skills/rite-temper/SKILL.md +69 -50
- package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +24 -22
- package/pack/generated/codex/skills/rite-vet/SKILL.md +117 -116
- package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +42 -9
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +40 -38
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +7 -3
- package/package.json +1 -1
- package/scripts/build-release-tarball.sh +32 -15
- package/scripts/check-authority-drift.py +125 -0
- package/scripts/check-instruction-size-baseline.mjs +19 -11
- package/scripts/check-invocation-integrity.py +2 -0
- package/scripts/codex-generate.sh +69 -33
- package/scripts/grade-feature.sh +121 -40
- package/scripts/live-hosts/agent-result.schema.json +230 -0
- package/scripts/live-hosts/claude.sh +87 -0
- package/scripts/live-hosts/codex.sh +81 -0
- package/scripts/live-hosts/common.sh +113 -0
- package/scripts/live-hosts/fake-host.py +264 -0
- package/scripts/live-hosts/host-transport.py +287 -0
- package/scripts/release-check.sh +5 -1
- package/scripts/run-agent-contract-evals.py +1380 -0
- package/scripts/run-behavioral-evals.sh +24 -30
- package/scripts/run-evals.sh +1 -5
- package/scripts/run-live-behavioral-evals.py +1274 -144
- package/scripts/run-outcome-evals.sh +414 -88
- package/scripts/run-tests.mjs +30 -2
- package/scripts/skills-inventory.mjs +1 -1
- package/scripts/validate-workflow-security.py +39 -20
- package/scripts/validate-workspace-schema.py +362 -10
- package/scripts/validate.sh +21 -15
- package/engine/testdata/golden/TestParityWrightScope/devrites-edit-allowed.golden +0 -1
- /package/engine/testdata/golden/{TestParityReconcile/check-no-claimed.golden → TestParityBuildReadiness/arg=clarifyopen.golden} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devrites",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "DevRites: a disciplined senior-engineer workflow pack for Claude Code and Codex",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"homepage": "https://github.com/ViktorsBaikers/DevRites#readme",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# Build the
|
|
3
|
-
#
|
|
4
|
-
#
|
|
2
|
+
# Build the archive that semantic-release attaches to a GitHub Release.
|
|
3
|
+
# It extracts to `devrites-v<version>/` with the pack, engine, scripts,
|
|
4
|
+
# documentation, and install tools.
|
|
5
5
|
#
|
|
6
6
|
# Usage: build-release-tarball.sh <version>
|
|
7
7
|
set -euo pipefail
|
|
@@ -11,20 +11,31 @@ if [[ -z "$VERSION" ]]; then
|
|
|
11
11
|
echo "usage: build-release-tarball.sh <version>" >&2
|
|
12
12
|
exit 1
|
|
13
13
|
fi
|
|
14
|
+
if [[ ! "$VERSION" =~ ^[0-9A-Za-z][0-9A-Za-z._+-]*$ ]]; then
|
|
15
|
+
echo "error: version must be a portable release asset name" >&2
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
14
18
|
|
|
15
|
-
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
19
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"
|
|
16
20
|
DIST="${DEVRITES_RELEASE_DIST_DIR:-$ROOT/dist}"
|
|
17
21
|
NAME="devrites-v${VERSION}"
|
|
18
|
-
STAGE="$DIST/$NAME"
|
|
19
22
|
|
|
20
23
|
cd "$ROOT"
|
|
24
|
+
mkdir -p "$DIST"
|
|
25
|
+
DIST="$(cd "$DIST" && pwd -P)"
|
|
26
|
+
case "$DIST/" in
|
|
27
|
+
"$ROOT/pack/"* | "$ROOT/engine/"* | "$ROOT/scripts/"* | "$ROOT/mcp/"* | "$ROOT/docs/"*)
|
|
28
|
+
echo "error: release output directory overlaps the release payload" >&2
|
|
29
|
+
exit 1
|
|
30
|
+
;;
|
|
31
|
+
esac
|
|
32
|
+
STAGE="$(mktemp -d "$DIST/.devrites-release-stage.XXXXXX")"
|
|
33
|
+
cleanup() { rm -rf "$STAGE"; }
|
|
34
|
+
trap cleanup EXIT
|
|
21
35
|
|
|
22
36
|
echo "Building release tarball: ${NAME}.tar.gz"
|
|
23
37
|
|
|
24
|
-
|
|
25
|
-
mkdir -p "$STAGE"
|
|
26
|
-
|
|
27
|
-
# Files and directories shipped to end-users.
|
|
38
|
+
# Release contents.
|
|
28
39
|
PAYLOAD=(
|
|
29
40
|
pack
|
|
30
41
|
engine
|
|
@@ -60,17 +71,23 @@ for item in "${PAYLOAD[@]}"; do
|
|
|
60
71
|
fi
|
|
61
72
|
done
|
|
62
73
|
|
|
63
|
-
#
|
|
74
|
+
# Include the same prebuilt host artifacts as the npm package.
|
|
64
75
|
DEVRITES_HOST_ARTIFACT_DIR="$STAGE/pack/generated" bash "$ROOT/scripts/build-host-artifacts.sh" >/dev/null
|
|
65
76
|
|
|
66
|
-
#
|
|
77
|
+
# Remove development files copied with the payload.
|
|
67
78
|
rm -rf "$STAGE/docs/internal" "$STAGE/scripts/.cache" 2>/dev/null || true
|
|
68
79
|
|
|
69
|
-
|
|
70
|
-
|
|
80
|
+
(
|
|
81
|
+
cd "$ROOT/engine"
|
|
82
|
+
go run ./cmd/releasepack \
|
|
83
|
+
-root "$STAGE" \
|
|
84
|
+
-output "$DIST/${NAME}.tar.gz" \
|
|
85
|
+
-prefix "$NAME" \
|
|
86
|
+
-epoch "${SOURCE_DATE_EPOCH:-0}"
|
|
87
|
+
)
|
|
71
88
|
|
|
72
|
-
#
|
|
73
|
-
#
|
|
89
|
+
# Write a sibling checksum for install.sh to verify when available.
|
|
90
|
+
# Store only "<sha256> <filename>" so verification works from any directory.
|
|
74
91
|
(
|
|
75
92
|
cd "$DIST"
|
|
76
93
|
if command -v shasum >/dev/null 2>&1; then
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Compare generated JSON authorities with their short documentation blocks."""
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import json
|
|
6
|
+
import re
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def table(headers, rows):
|
|
12
|
+
return "\n".join(
|
|
13
|
+
[
|
|
14
|
+
"| " + " | ".join(headers) + " |",
|
|
15
|
+
"| " + " | ".join("---" for _ in headers) + " |",
|
|
16
|
+
*["| " + " | ".join(row) + " |" for row in rows],
|
|
17
|
+
]
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def replace_block(path, name, wanted, write):
|
|
22
|
+
text = path.read_text()
|
|
23
|
+
start = f"<!-- authority:{name}:start -->"
|
|
24
|
+
end = f"<!-- authority:{name}:end -->"
|
|
25
|
+
pattern = re.compile(re.escape(start) + r"\n.*?\n" + re.escape(end), re.DOTALL)
|
|
26
|
+
replacement = f"{start}\n{wanted}\n{end}"
|
|
27
|
+
if not pattern.search(text):
|
|
28
|
+
raise ValueError(f"{path}: missing {name} authority markers")
|
|
29
|
+
if pattern.search(text).group(0) == replacement:
|
|
30
|
+
return
|
|
31
|
+
if write:
|
|
32
|
+
path.write_text(pattern.sub(replacement, text, count=1))
|
|
33
|
+
return
|
|
34
|
+
raise ValueError(f"{path}: {name} authority block is stale")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def main():
|
|
38
|
+
parser = argparse.ArgumentParser()
|
|
39
|
+
parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parents[1])
|
|
40
|
+
parser.add_argument("--write", action="store_true")
|
|
41
|
+
args = parser.parse_args()
|
|
42
|
+
root = args.root.resolve()
|
|
43
|
+
|
|
44
|
+
manifest = json.loads((root / "engine/internal/state/workflow_manifest.json").read_text())
|
|
45
|
+
readiness = json.loads((root / "engine/internal/lib/readiness_contract.json").read_text())
|
|
46
|
+
phases = manifest["phases"]
|
|
47
|
+
reasons = readiness["reasons"]
|
|
48
|
+
policy = manifest["authorityPolicy"]
|
|
49
|
+
|
|
50
|
+
ids = [phase["id"] for phase in phases]
|
|
51
|
+
rights = [phase["transitionRight"] for phase in phases]
|
|
52
|
+
if len(ids) != len(set(ids)) or len(rights) != len(set(rights)):
|
|
53
|
+
raise ValueError("workflow manifest has duplicate phase IDs or transition rights")
|
|
54
|
+
resumes = {phase["id"]: phase.get("resumeVerb", "") for phase in phases}
|
|
55
|
+
if resumes.get("define") != "define" or resumes.get("plan") != "vet":
|
|
56
|
+
raise ValueError("workflow manifest violates ADR-0011 define/plan routing")
|
|
57
|
+
codes = [reason["code"] for reason in reasons]
|
|
58
|
+
if len(codes) != len(set(codes)):
|
|
59
|
+
raise ValueError("readiness contract has duplicate exit codes")
|
|
60
|
+
|
|
61
|
+
lifecycle = "`" + " → ".join(phase.upper() for phase in ids) + "`"
|
|
62
|
+
phase_rows = []
|
|
63
|
+
for phase in phases:
|
|
64
|
+
required = ", ".join(f"`{section}`" for section in phase.get("requiredSections", [])) or "*(none)*"
|
|
65
|
+
resume = f"`/rite-{phase['resumeVerb']}`" if phase.get("resumeVerb") else "*(terminal)*"
|
|
66
|
+
phase_rows.append([f"`{phase['id']}`", resume, required, phase["transitionRight"]])
|
|
67
|
+
reason_rows = [
|
|
68
|
+
[
|
|
69
|
+
f"`{reason['code']}`",
|
|
70
|
+
f"`{reason['id']}`",
|
|
71
|
+
reason["condition"],
|
|
72
|
+
f"`/rite-{reason['remediationVerb']}`" if reason["remediationVerb"] else "*(none)*",
|
|
73
|
+
]
|
|
74
|
+
for reason in reasons
|
|
75
|
+
]
|
|
76
|
+
tracking = (
|
|
77
|
+
"Git-tracked shared state: "
|
|
78
|
+
+ ", ".join(f"`{path}`" for path in policy["trackedState"])
|
|
79
|
+
+ ". Per-clone runtime state: "
|
|
80
|
+
+ ", ".join(f"`{path}`" for path in policy["localState"])
|
|
81
|
+
+ "."
|
|
82
|
+
)
|
|
83
|
+
clarify_rows = [[f"`{item['field']}`", item["policy"]] for item in manifest["clarifyReturnFields"]]
|
|
84
|
+
|
|
85
|
+
blocks = [
|
|
86
|
+
("docs/quick-reference.md", "lifecycle", lifecycle),
|
|
87
|
+
("docs/engine/state-schema.md", "schema-version", f"`schemaVersion: {manifest['schemaVersion']}`."),
|
|
88
|
+
(
|
|
89
|
+
"docs/engine/state-schema.md",
|
|
90
|
+
"phase-contract",
|
|
91
|
+
table(["phase", "normal resume", "required sections", "transition right"], phase_rows),
|
|
92
|
+
),
|
|
93
|
+
("docs/engine/state-schema.md", "state-tracking", tracking),
|
|
94
|
+
(
|
|
95
|
+
"docs/engine/state-schema.md",
|
|
96
|
+
"clarify-return-fields",
|
|
97
|
+
table(["field", "policy"], clarify_rows),
|
|
98
|
+
),
|
|
99
|
+
(
|
|
100
|
+
"docs/cli.md",
|
|
101
|
+
"readiness-reasons",
|
|
102
|
+
table(["exit", "reason", "condition", "remediation"], reason_rows),
|
|
103
|
+
),
|
|
104
|
+
("SECURITY.md", "principles-trust", policy["principlesTrust"]),
|
|
105
|
+
(
|
|
106
|
+
"pack/.claude/skills/devrites-lib/reference/standards/core.md",
|
|
107
|
+
"principles-trust",
|
|
108
|
+
policy["principlesTrust"],
|
|
109
|
+
),
|
|
110
|
+
]
|
|
111
|
+
for relative, name, wanted in blocks:
|
|
112
|
+
replace_block(root / relative, name, wanted, args.write)
|
|
113
|
+
|
|
114
|
+
state_schema = (root / "docs/engine/state-schema.md").read_text()
|
|
115
|
+
if re.search(r"schema(?:Version| version| v)[: ]+1\b", state_schema, re.IGNORECASE):
|
|
116
|
+
raise ValueError("docs/engine/state-schema.md still claims schema v1")
|
|
117
|
+
print("authority-drift: current docs match workflow and readiness authorities")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
if __name__ == "__main__":
|
|
121
|
+
try:
|
|
122
|
+
main()
|
|
123
|
+
except (KeyError, OSError, ValueError, json.JSONDecodeError) as exc:
|
|
124
|
+
print(f"authority-drift: {exc}", file=sys.stderr)
|
|
125
|
+
sys.exit(1)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
//
|
|
2
|
+
// Track canonical instruction files individually and skills as a group.
|
|
3
3
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { dirname, join, relative, resolve } from 'node:path';
|
|
5
5
|
|
|
@@ -12,6 +12,7 @@ function option(name, fallback) {
|
|
|
12
12
|
const root = resolve(option('--root', defaultRoot));
|
|
13
13
|
const baselinePath = resolve(option('--baseline', join(root, 'tests', 'instruction-size-baseline.json')));
|
|
14
14
|
const write = argv.includes('--write');
|
|
15
|
+
const ratchetLimit = 855_000;
|
|
15
16
|
|
|
16
17
|
function lfBytes(text) {
|
|
17
18
|
return Buffer.byteLength(text.replace(/\r\n/g, '\n'));
|
|
@@ -28,12 +29,7 @@ function markdownFiles(dir) {
|
|
|
28
29
|
return files;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
function collect() {
|
|
32
|
-
const roots = [
|
|
33
|
-
join(root, 'pack', '.claude', 'skills'),
|
|
34
|
-
join(root, 'pack', '.claude', 'agents'),
|
|
35
|
-
join(root, 'pack', '.claude', 'rules'),
|
|
36
|
-
];
|
|
32
|
+
function collect(roots) {
|
|
37
33
|
const out = {};
|
|
38
34
|
for (const file of roots.flatMap(markdownFiles)) {
|
|
39
35
|
out[relative(root, file)] = lfBytes(readFileSync(file, 'utf8'));
|
|
@@ -41,13 +37,25 @@ function collect() {
|
|
|
41
37
|
return Object.fromEntries(Object.entries(out).sort(([a], [b]) => a.localeCompare(b)));
|
|
42
38
|
}
|
|
43
39
|
|
|
44
|
-
const
|
|
45
|
-
const
|
|
40
|
+
const skillRoot = join(root, 'pack', '.claude', 'skills');
|
|
41
|
+
const files = collect([
|
|
42
|
+
skillRoot,
|
|
43
|
+
join(root, 'pack', '.claude', 'agents'),
|
|
44
|
+
join(root, 'pack', '.claude', 'rules'),
|
|
45
|
+
]);
|
|
46
|
+
const skillFiles = collect([skillRoot]);
|
|
47
|
+
const totalBytes = Object.values(skillFiles).reduce((sum, bytes) => sum + bytes, 0);
|
|
46
48
|
const current = { version: 2, total_bytes: totalBytes, files };
|
|
49
|
+
if (totalBytes > ratchetLimit) {
|
|
50
|
+
console.error(`FAIL: canonical skill Markdown is ${totalBytes} bytes (ratchet ${ratchetLimit})`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
47
53
|
if (write) {
|
|
48
54
|
mkdirSync(dirname(baselinePath), { recursive: true });
|
|
49
55
|
writeFileSync(baselinePath, JSON.stringify(current, null, 2) + '\n');
|
|
50
|
-
console.log(
|
|
56
|
+
console.log(
|
|
57
|
+
`instruction-size: wrote ${relative(root, baselinePath)} (${Object.keys(files).length} instruction files, ${totalBytes} skill bytes)`,
|
|
58
|
+
);
|
|
51
59
|
process.exit(0);
|
|
52
60
|
}
|
|
53
61
|
|
|
@@ -75,5 +83,5 @@ for (const file of Object.keys(baseline.files)) {
|
|
|
75
83
|
if (totalBytes > baseline.total_bytes) {
|
|
76
84
|
fail(`aggregate instruction payload grew by ${totalBytes - baseline.total_bytes} bytes (${baseline.total_bytes} -> ${totalBytes})`);
|
|
77
85
|
}
|
|
78
|
-
console.log(`instruction-size: ${Object.keys(files).length} files checked, ${totalBytes} bytes`);
|
|
86
|
+
console.log(`instruction-size: ${Object.keys(files).length} instruction files checked, ${totalBytes} skill bytes`);
|
|
79
87
|
process.exit(failures ? 1 : 0);
|
|
@@ -26,6 +26,8 @@ NONSKILL = {
|
|
|
26
26
|
"devrites-engine",
|
|
27
27
|
# a git commit-trailer marker ("[devrites-context]" body in a WIP checkpoint), not a skill
|
|
28
28
|
"devrites-context",
|
|
29
|
+
# typed contract schemas and a generated-hook diagnostic marker, not skills
|
|
30
|
+
"devrites-forge", "devrites-git-authority", "devrites-codex-leaf-guard",
|
|
29
31
|
}
|
|
30
32
|
# names a skill deliberately mentions as NON-existent (self-documenting prose).
|
|
31
33
|
DOCUMENTED_NONEXISTENT = {"rite-use"}
|
|
@@ -8,16 +8,28 @@ gen_codex_markdown_file() {
|
|
|
8
8
|
local _src="$1" _out="$2"
|
|
9
9
|
mkdir -p "$(dirname "$_out")"
|
|
10
10
|
sed -E \
|
|
11
|
+
-e 's#(pack/)?\.claude/agents/devrites-\{security-auditor,performance-reviewer,simplifier-reviewer\}\.md#.codex/agents/devrites-security-auditor.toml`, `.codex/agents/devrites-performance-reviewer.toml`, or `.codex/agents/devrites-simplifier-reviewer.toml#g' \
|
|
12
|
+
-e 's#(\.\./)+agents/devrites-\{security-auditor,performance-reviewer,simplifier-reviewer\}\.md#.codex/agents/devrites-security-auditor.toml`, `.codex/agents/devrites-performance-reviewer.toml`, or `.codex/agents/devrites-simplifier-reviewer.toml#g' \
|
|
11
13
|
-e 's#pack/\.claude/skills/devrites-lib/scripts/#.agents/skills/devrites-lib/scripts/#g' \
|
|
12
14
|
-e 's#pack/\.claude/skills/#.agents/skills/#g' \
|
|
13
|
-
-e 's#pack/\.claude/agents/(
|
|
15
|
+
-e 's#pack/\.claude/agents/([A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
|
|
14
16
|
-e 's#pack/\.claude/agents/#.codex/agents/#g' \
|
|
15
17
|
-e 's#\.claude/skills/devrites-lib/scripts/#.agents/skills/devrites-lib/scripts/#g' \
|
|
16
18
|
-e 's#\.claude/skills/#.agents/skills/#g' \
|
|
17
|
-
-e 's#\.claude/agents/(
|
|
19
|
+
-e 's#\.claude/agents/([A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
|
|
18
20
|
-e 's#\.claude/agents/#.codex/agents/#g' \
|
|
19
|
-
-e 's
|
|
20
|
-
-e 's
|
|
21
|
+
-e 's#(\.\./)+agents/([A-Za-z0-9_-]+)\.md#.codex/agents/\2.toml#g' \
|
|
22
|
+
-e 's#\.codex/agents/([A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
|
|
23
|
+
-e 's#Host mapping: Claude Code uses `Agent` \(`Task` is its legacy alias\); Codex uses#Host mapping: Codex fresh-context dispatch uses#g' \
|
|
24
|
+
-e 's#`Agent` call#`spawn_agent` call#g' \
|
|
25
|
+
-e 's#Task breakdown#Work-item breakdown#g' \
|
|
26
|
+
-e 's#(^|[^A-Za-z0-9_])Task([^A-Za-z0-9_]|$)#\1spawn_agent\2#g' \
|
|
27
|
+
-e 's#dispatch `devrites-source-driven`#invoke `devrites-source-driven`#g' \
|
|
28
|
+
-e 's#Dispatch `devrites-source-driven`#Invoke `devrites-source-driven`#g' \
|
|
29
|
+
-e 's#pass-through dispatch to the matching `rite-<verb>` skill#pass-through invocation of the matching `rite-<verb>` skill#g' \
|
|
30
|
+
-e 's#verb dispatches to the matching `rite-<verb>` skill#verb invokes the matching `rite-<verb>` skill#g' \
|
|
31
|
+
-e 's#the dispatch map only#the invocation map only#g' \
|
|
32
|
+
-e 's#→ dispatch per the table above#→ invoke the matching skill per the table above#g' \
|
|
21
33
|
-e 's#(^|[^A-Za-z0-9_./-])/(rite(-[a-z0-9-]+)?)([^A-Za-z0-9_-]|$)#\1$\2\4#g' \
|
|
22
34
|
"$_src" > "$_out"
|
|
23
35
|
}
|
|
@@ -26,11 +38,11 @@ gen_codex_skill_file() {
|
|
|
26
38
|
_src="$1"; _out="$2"; _internal="${3:-0}"
|
|
27
39
|
_tmp="$TMP_GEN_DIR/codex-skill-raw-$(basename "$(dirname "$_src")").md"
|
|
28
40
|
mkdir -p "$(dirname "$_out")"
|
|
29
|
-
#
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
41
|
+
# Give the 12 internal skills a short description in the Codex mirror. Codex
|
|
42
|
+
# uses descriptions for its 2% implicit-matching budget, but these skills are
|
|
43
|
+
# invoked by name. Shorter internal descriptions leave that budget for the
|
|
44
|
+
# public rite-* skills. Keep explicit invocation and each SKILL.md body
|
|
45
|
+
# unchanged.
|
|
34
46
|
awk -v internal="$_internal" '
|
|
35
47
|
BEGIN { fm = 0; inserted = 0 }
|
|
36
48
|
NR == 1 && $0 == "---" { print; fm = 1; next }
|
|
@@ -47,9 +59,13 @@ gen_codex_skill_file() {
|
|
|
47
59
|
print ""
|
|
48
60
|
print "- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them."
|
|
49
61
|
print "- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation."
|
|
50
|
-
print "-
|
|
51
|
-
print "-
|
|
52
|
-
print "-
|
|
62
|
+
print "- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch."
|
|
63
|
+
print "- For every DevRites specialist or writer dispatch, first call `spawn_agent` with the named `devrites-<role>` custom role. The matching project contract is `.codex/agents/devrites-<role>.toml`."
|
|
64
|
+
print "- If `spawn_agent` is callable but a named read-only role is unavailable, use generic `explorer` only when the host proves that run has a runtime-enforced read-only sandbox. Tell it to read `.codex/agents/devrites-<role>.toml`, follow its `developer_instructions`, and execute the unchanged packet. A missing read-only custom role is not evidence that spawning is unavailable."
|
|
65
|
+
print "- Never dispatch generic `worker` for `devrites-slice-wright` unless the host proves that worker run carries exact DevRites identity and the same `.wright-allowlist` enforcement as the named role. Codex reports a generic run as `agent_type=worker`, so the generated global hooks cannot prove that binding. Reject that unsafe rung and use the documented labelled inline wright path with `.reconcile-inline` plus the full reconcile gate."
|
|
66
|
+
print "- If the host cannot prove the generic explorer is runtime read-only, reject that rung too. Only when no spawn primitive exists or a higher-priority policy rejects a safe spawn may the root run the documented discipline inline. Label it `independence: fallback`, never call it independent, and apply every fallback risk gate. An unbound generic wright or unconfined generic explorer is such a safety rejection, not evidence that no agents exist."
|
|
67
|
+
print "- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete."
|
|
68
|
+
print "- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement."
|
|
53
69
|
print "- When this skill asks a HITL question via `AskUserQuestion`: Codex'\''s equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK'\''s contract, gated by the `.devrites/AFK` sentinel."
|
|
54
70
|
print ""
|
|
55
71
|
fm = 0
|
|
@@ -62,7 +78,7 @@ gen_codex_skill_file() {
|
|
|
62
78
|
print ""
|
|
63
79
|
print "## Codex compatibility"
|
|
64
80
|
print ""
|
|
65
|
-
print "Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards
|
|
81
|
+
print "Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Invocation runs a skill inline; dispatch starts a fresh agent with `spawn_agent` and must be awaited. Try the named `devrites-<role>` first. A missing read-only role may fall back to generic `explorer` reading `.codex/agents/devrites-<role>.toml` only when the host proves runtime-enforced read-only sandboxing. Never use generic `worker` for the wright unless exact DevRites identity and `.wright-allowlist` enforcement are proven; Codex `agent_type=worker` does not prove them, so use the labelled inline `.reconcile-inline` path with full reconciliation. Other inline fallback requires spawning itself to be unavailable or a safe spawn to be rejected by higher-priority policy. Trust `.codex/hooks.json` and the inline hooks in `.codex/agents/devrites-*.toml` with `/hooks` before relying on hooks."
|
|
66
82
|
}
|
|
67
83
|
}
|
|
68
84
|
' "$_src" > "$_tmp"
|
|
@@ -73,6 +89,17 @@ toml_escape() {
|
|
|
73
89
|
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
|
|
74
90
|
}
|
|
75
91
|
|
|
92
|
+
gen_codex_leaf_hook_toml() {
|
|
93
|
+
local _active_agent="$1" _required_var="$2" _subcommand="$3" _status="$4" _command
|
|
94
|
+
_command="cd \"\$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || { printf '%s\\n' 'DevRites: cannot resolve the project root for a declared Codex leaf. (devrites-codex-leaf-guard)' >&2; exit 2; }; DEVRITES_AGENT_RUN=1 DEVRITES_ACTIVE_AGENT=${_active_agent} ${_required_var}=1 devrites-engine hook ${_subcommand} --harness=codex; rc=\$?; case \"\$rc\" in 0) exit 0 ;; 2) exit 2 ;; *) printf '%s\\n' 'DevRites: declared Codex leaf guard unavailable or crashed; install or repair devrites-engine. (devrites-codex-leaf-guard)' >&2; exit 2 ;; esac"
|
|
95
|
+
printf '\n[[hooks.PreToolUse]]\n'
|
|
96
|
+
printf 'matcher = "Bash|Shell|sh|exec_command|run_command|Edit|Write|MultiEdit|NotebookEdit|apply_patch|exec|js|python|computer|computer_use|write_stdin|run_code|Agent|Task|spawn_agent|delegate|dispatch_agent|create_agent"\n\n'
|
|
97
|
+
printf '[[hooks.PreToolUse.hooks]]\n'
|
|
98
|
+
printf 'type = "command"\n'
|
|
99
|
+
printf "command = '''%s'''\n" "$_command"
|
|
100
|
+
printf 'statusMessage = "%s"\n' "$_status"
|
|
101
|
+
}
|
|
102
|
+
|
|
76
103
|
# Generate a Codex custom-agent TOML file from a Claude Code markdown agent.
|
|
77
104
|
# Codex does not consume .claude/agents/*.md directly; it loads project agents
|
|
78
105
|
# from .codex/agents/*.toml.
|
|
@@ -106,6 +133,22 @@ gen_codex_agent() {
|
|
|
106
133
|
gen_codex_markdown_file "$_body_tmp" "$_body_codex"
|
|
107
134
|
cat "$_body_codex"
|
|
108
135
|
printf "\n%s\n" "'''"
|
|
136
|
+
case "$_name" in
|
|
137
|
+
devrites-slice-wright)
|
|
138
|
+
gen_codex_leaf_hook_toml \
|
|
139
|
+
"$_name" \
|
|
140
|
+
"DEVRITES_WRIGHT_AGENT_REQUIRED" \
|
|
141
|
+
"wright-scope" \
|
|
142
|
+
"DevRites: checking slice-wright boundary"
|
|
143
|
+
;;
|
|
144
|
+
*)
|
|
145
|
+
gen_codex_leaf_hook_toml \
|
|
146
|
+
"$_name" \
|
|
147
|
+
"DEVRITES_REVIEWER_AGENT_REQUIRED" \
|
|
148
|
+
"reviewer-readonly" \
|
|
149
|
+
"DevRites: checking reviewer read-only boundary"
|
|
150
|
+
;;
|
|
151
|
+
esac
|
|
109
152
|
} > "$_out"
|
|
110
153
|
}
|
|
111
154
|
|
|
@@ -126,13 +169,16 @@ This project has DevRites installed for both Claude Code and Codex.
|
|
|
126
169
|
- DevRites runtime helpers run through the installed `devrites-engine` binary.
|
|
127
170
|
- Before using any DevRites workflow skill, read `.agents/skills/devrites-lib/reference/standards/core.md`. Load other `.agents/skills/devrites-lib/reference/standards/*.md` files when the skill or rule index asks for them. These are DevRites engineering standards, not Codex exec-policy `.rules` files.
|
|
128
171
|
- Custom Codex subagents generated from the DevRites review agents live in `.codex/agents`.
|
|
129
|
-
-
|
|
172
|
+
- In DevRites guidance, **invoke** means run a skill inline in the current context; **dispatch** means start a fresh agent with `spawn_agent`, wait for it, and reconcile its result.
|
|
173
|
+
- For a DevRites dispatch, first use the named `devrites-<role>` custom role. If a read-only role is unavailable but `spawn_agent` still works, use generic `explorer` only when the host proves runtime-enforced read-only sandboxing; tell it to read `.codex/agents/devrites-<role>.toml` before executing the unchanged packet.
|
|
174
|
+
- Do not use generic `worker` for the wright unless exact DevRites identity and `.wright-allowlist` enforcement are proven. Codex exposes that fallback as `agent_type=worker`, which the generated leaf hooks intentionally do not treat as a declared DevRites run. Reject the unsafe worker rung and use the documented labelled inline `.reconcile-inline` path with full reconciliation.
|
|
175
|
+
- Other inline work is allowed only when no spawn primitive exists or higher-priority policy rejects a safe spawn; label it `independence: fallback`, never independent. A missing read-only custom role alone is not such a rejection, but an unconfined generic explorer is.
|
|
130
176
|
- Claude Code agent hook metadata is not active in Codex. The generated Codex agents preserve read-only intent with Codex sandbox settings where possible; still follow DevRites' scope and no-mutation rules explicitly.
|
|
131
177
|
|
|
132
178
|
## Workflow contract
|
|
133
179
|
|
|
134
180
|
- Keep all feature state in `.devrites/work/<slug>/` and preserve `.devrites/ACTIVE`.
|
|
135
|
-
- Follow the DevRites lifecycle: frame -> spec -> temper -> define -> plan -> vet -> build -> converge -> prove -> polish -> review -> seal -> ship -> done.
|
|
181
|
+
- Follow the DevRites lifecycle: frame -> spec -> clarify -> temper -> define -> plan -> vet -> build -> converge -> prove -> polish -> review -> seal -> ship -> done.
|
|
136
182
|
- Claims of completion need recorded evidence in the feature workspace, not confidence alone.
|
|
137
183
|
<!-- END DEVRITES CODEX -->
|
|
138
184
|
EOF
|
|
@@ -145,18 +191,13 @@ gen_codex_hooks_json() {
|
|
|
145
191
|
"hooks": {
|
|
146
192
|
"PreToolUse": [
|
|
147
193
|
{
|
|
148
|
-
"matcher": "Bash",
|
|
194
|
+
"matcher": "Bash|Shell|sh|exec_command|run_command",
|
|
149
195
|
"hooks": [
|
|
150
196
|
{
|
|
151
197
|
"type": "command",
|
|
152
|
-
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec
|
|
153
|
-
"statusMessage": "DevRites: checking
|
|
154
|
-
}
|
|
155
|
-
]
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
"matcher": "Bash",
|
|
159
|
-
"hooks": [
|
|
198
|
+
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook git-guard --harness=codex",
|
|
199
|
+
"statusMessage": "DevRites: checking destructive Git authority"
|
|
200
|
+
},
|
|
160
201
|
{
|
|
161
202
|
"type": "command",
|
|
162
203
|
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook allow --harness=codex",
|
|
@@ -171,11 +212,6 @@ gen_codex_hooks_json() {
|
|
|
171
212
|
"type": "command",
|
|
172
213
|
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook a1-guard --harness=codex",
|
|
173
214
|
"statusMessage": "DevRites: checking build write boundary"
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
"type": "command",
|
|
177
|
-
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec env DEVRITES_WRIGHT_AGENT_REQUIRED=1 devrites-engine hook wright-scope --harness=codex",
|
|
178
|
-
"statusMessage": "DevRites: checking slice file scope"
|
|
179
215
|
}
|
|
180
216
|
]
|
|
181
217
|
}
|
|
@@ -293,8 +329,8 @@ gen_codex_hooks_json() {
|
|
|
293
329
|
}
|
|
294
330
|
}
|
|
295
331
|
EOF
|
|
296
|
-
#
|
|
297
|
-
#
|
|
298
|
-
# UserPromptSubmit/SubagentStop/Stop
|
|
299
|
-
#
|
|
332
|
+
# Codex has no SessionEnd hook event. Its lifecycle events are
|
|
333
|
+
# SessionStart/SubagentStart/PreToolUse/PermissionRequest/PostToolUse/PreCompact/
|
|
334
|
+
# PostCompact/UserPromptSubmit/SubagentStop/Stop. The `hook event session-end`
|
|
335
|
+
# trace remains Claude-only until Codex adds that event.
|
|
300
336
|
}
|