devrites 5.4.0 → 5.6.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 +12 -0
- package/README.md +8 -6
- package/docs/command-map.md +2 -2
- package/docs/engine/state-schema.md +12 -0
- package/docs/flow.md +4 -0
- package/docs/orchestration.md +5 -2
- package/engine/commands.go +2 -2
- package/engine/internal/devritespaths/paths.go +18 -0
- package/engine/internal/gate/gate.go +78 -0
- package/engine/internal/gate/gate_test.go +118 -0
- package/engine/internal/hostpack/hostpack.go +45 -6
- package/engine/internal/hostpack/hostpack_test.go +29 -13
- package/engine/internal/install/apply.go +14 -5
- package/engine/internal/install/install.go +8 -2
- package/engine/internal/install/install_test.go +12 -5
- package/engine/internal/install/merge.go +5 -0
- package/engine/internal/install/preflight.go +20 -2
- package/engine/internal/install/uninstall.go +5 -0
- package/engine/internal/install/update.go +1 -1
- package/engine/internal/lib/candidate.go +7 -3
- package/engine/internal/lib/manifest_union.go +326 -0
- package/engine/internal/lib/manifest_union_test.go +214 -0
- package/engine/internal/lib/observe_budgets.go +73 -0
- package/engine/internal/lib/observe_budgets_test.go +142 -0
- package/engine/internal/lib/observe_summary.go +74 -13
- package/engine/internal/lib/workspace_read.go +11 -6
- package/engine/internal/state/budgets.go +163 -0
- package/engine/internal/state/budgets_test.go +42 -0
- package/engine/internal/state/cursor.go +16 -10
- package/engine/internal/state/observation.go +50 -4
- package/engine/internal/state/status.go +38 -26
- package/engine/internal/state/taskgraph.go +23 -0
- package/engine/main.go +32 -13
- package/engine/root_routing_test.go +3 -1
- package/install.sh +4 -1
- package/pack/.claude/agents/devrites-code-reviewer.md +9 -6
- package/pack/.claude/agents/devrites-doubt-reviewer.md +6 -0
- package/pack/.claude/agents/devrites-plan-reviewer.md +7 -1
- package/pack/.claude/agents/devrites-slice-wright.md +42 -46
- package/pack/.claude/agents/devrites-test-analyst.md +9 -4
- package/pack/.claude/agents/devrites-upgrade-planner.md +9 -1
- package/pack/.claude/settings.json +17 -0
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +2 -2
- package/pack/.claude/skills/devrites-doubt/SKILL.md +9 -17
- package/pack/.claude/skills/devrites-lib/reference/candidate-integrity.md +34 -35
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +1 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +19 -8
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +33 -1
- package/pack/.claude/skills/rite-build/SKILL.md +26 -19
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +1 -1
- package/pack/.claude/skills/rite-build/reference/parallel-batch.md +90 -40
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +79 -59
- package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +14 -15
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +8 -8
- package/pack/.claude/skills/rite-define/SKILL.md +4 -1
- package/pack/.claude/skills/rite-plan/SKILL.md +4 -1
- package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +21 -0
- package/pack/.claude/skills/rite-plan/reference/slicing.md +117 -15
- package/pack/.claude/skills/rite-prove/SKILL.md +20 -22
- package/pack/.claude/skills/rite-review/SKILL.md +23 -16
- package/pack/.claude/skills/rite-seal/SKILL.md +8 -8
- package/pack/.claude/skills/rite-seal/reference/final-evidence.md +6 -5
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +13 -13
- package/pack/.claude/skills/rite-ship/SKILL.md +3 -0
- package/pack/.claude/skills/rite-ship/reference/close-out.md +16 -2
- package/pack/.claude/skills/rite-ship/reference/git-ship.md +14 -5
- package/pack/.claude/skills/rite-spec/SKILL.md +6 -0
- package/pack/.claude/skills/rite-spec/reference/state-workspace.md +6 -0
- package/pack/.claude/skills/rite-status/SKILL.md +4 -1
- package/pack/.claude/skills/rite-temper/SKILL.md +14 -11
- package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +14 -13
- package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +3 -4
- package/pack/.claude/skills/rite-upgrade/SKILL.md +11 -2
- package/pack/.claude/skills/rite-vet/SKILL.md +22 -15
- package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +11 -9
- package/pack/.claude/skills/rite-vet/reference/depth.md +6 -7
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +39 -14
- package/pack/generated/README.md +5 -1
- package/pack/generated/claude/agents/devrites-code-reviewer.md +9 -6
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +6 -0
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +7 -1
- package/pack/generated/claude/agents/devrites-slice-wright.md +42 -46
- package/pack/generated/claude/agents/devrites-test-analyst.md +9 -4
- package/pack/generated/claude/agents/devrites-upgrade-planner.md +9 -1
- package/pack/generated/claude/settings.json +17 -0
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +2 -2
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +9 -17
- package/pack/generated/claude/skills/devrites-lib/reference/candidate-integrity.md +34 -35
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +1 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +19 -8
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +33 -1
- package/pack/generated/claude/skills/rite-build/SKILL.md +26 -19
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +90 -40
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +79 -59
- package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +14 -15
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +8 -8
- package/pack/generated/claude/skills/rite-define/SKILL.md +4 -1
- package/pack/generated/claude/skills/rite-plan/SKILL.md +4 -1
- package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +21 -0
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +117 -15
- package/pack/generated/claude/skills/rite-prove/SKILL.md +20 -22
- package/pack/generated/claude/skills/rite-review/SKILL.md +23 -16
- package/pack/generated/claude/skills/rite-seal/SKILL.md +8 -8
- package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +6 -5
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +13 -13
- package/pack/generated/claude/skills/rite-ship/SKILL.md +3 -0
- package/pack/generated/claude/skills/rite-ship/reference/close-out.md +16 -2
- package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +14 -5
- package/pack/generated/claude/skills/rite-spec/SKILL.md +6 -0
- package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +6 -0
- package/pack/generated/claude/skills/rite-status/SKILL.md +4 -1
- package/pack/generated/claude/skills/rite-temper/SKILL.md +14 -11
- package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +14 -13
- package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +3 -4
- package/pack/generated/claude/skills/rite-upgrade/SKILL.md +11 -2
- package/pack/generated/claude/skills/rite-vet/SKILL.md +22 -15
- package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +11 -9
- package/pack/generated/claude/skills/rite-vet/reference/depth.md +6 -7
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +39 -14
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +9 -6
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +6 -0
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +7 -1
- package/pack/generated/codex/agents/devrites-slice-wright.toml +42 -46
- package/pack/generated/codex/agents/devrites-test-analyst.toml +9 -4
- package/pack/generated/codex/agents/devrites-upgrade-planner.toml +9 -1
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +2 -2
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +9 -17
- package/pack/generated/codex/skills/devrites-lib/reference/candidate-integrity.md +34 -35
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -0
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +19 -8
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +33 -1
- package/pack/generated/codex/skills/rite-build/SKILL.md +26 -19
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +90 -40
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +79 -59
- package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +14 -15
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +8 -8
- package/pack/generated/codex/skills/rite-define/SKILL.md +4 -1
- package/pack/generated/codex/skills/rite-plan/SKILL.md +4 -1
- package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +21 -0
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +117 -15
- package/pack/generated/codex/skills/rite-prove/SKILL.md +20 -22
- package/pack/generated/codex/skills/rite-review/SKILL.md +23 -16
- package/pack/generated/codex/skills/rite-seal/SKILL.md +8 -8
- package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +6 -5
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +13 -13
- package/pack/generated/codex/skills/rite-ship/SKILL.md +3 -0
- package/pack/generated/codex/skills/rite-ship/reference/close-out.md +16 -2
- package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +14 -5
- package/pack/generated/codex/skills/rite-spec/SKILL.md +6 -0
- package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +6 -0
- package/pack/generated/codex/skills/rite-status/SKILL.md +4 -1
- package/pack/generated/codex/skills/rite-temper/SKILL.md +14 -11
- package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +14 -13
- package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +3 -4
- package/pack/generated/codex/skills/rite-upgrade/SKILL.md +11 -2
- package/pack/generated/codex/skills/rite-vet/SKILL.md +22 -15
- package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +11 -9
- package/pack/generated/codex/skills/rite-vet/reference/depth.md +6 -7
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +39 -14
- package/pack/generated/omp/agents/devrites-code-reviewer.md +9 -6
- package/pack/generated/omp/agents/devrites-doubt-reviewer.md +6 -0
- package/pack/generated/omp/agents/devrites-plan-reviewer.md +7 -1
- package/pack/generated/omp/agents/devrites-slice-wright.md +42 -46
- package/pack/generated/omp/agents/devrites-test-analyst.md +9 -4
- package/pack/generated/omp/agents/devrites-upgrade-planner.md +9 -1
- package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +2 -2
- package/pack/generated/omp/skills/devrites-doubt/SKILL.md +9 -17
- package/pack/generated/omp/skills/devrites-lib/reference/candidate-integrity.md +34 -35
- package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
- package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
- package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +1 -0
- package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
- package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
- package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +19 -8
- package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +33 -1
- package/pack/generated/omp/skills/rite-build/SKILL.md +26 -19
- package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +1 -1
- package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +90 -40
- package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +79 -59
- package/pack/generated/omp/skills/rite-build/reference/spec-drift-guard.md +14 -15
- package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +8 -8
- package/pack/generated/omp/skills/rite-define/SKILL.md +4 -1
- package/pack/generated/omp/skills/rite-plan/SKILL.md +4 -1
- package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +21 -0
- package/pack/generated/omp/skills/rite-plan/reference/slicing.md +117 -15
- package/pack/generated/omp/skills/rite-prove/SKILL.md +20 -22
- package/pack/generated/omp/skills/rite-review/SKILL.md +23 -16
- package/pack/generated/omp/skills/rite-seal/SKILL.md +8 -8
- package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +6 -5
- package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +13 -13
- package/pack/generated/omp/skills/rite-ship/SKILL.md +3 -0
- package/pack/generated/omp/skills/rite-ship/reference/close-out.md +16 -2
- package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +14 -5
- package/pack/generated/omp/skills/rite-spec/SKILL.md +6 -0
- package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +6 -0
- package/pack/generated/omp/skills/rite-status/SKILL.md +4 -1
- package/pack/generated/omp/skills/rite-temper/SKILL.md +14 -11
- package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +14 -13
- package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -4
- package/pack/generated/omp/skills/rite-upgrade/SKILL.md +11 -2
- package/pack/generated/omp/skills/rite-vet/SKILL.md +22 -15
- package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +11 -9
- package/pack/generated/omp/skills/rite-vet/reference/depth.md +6 -7
- package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +39 -14
- package/pack/generated/pi/AGENTS.md +22 -0
- package/pack/generated/pi/agents/devrites-code-reviewer.md +142 -0
- package/pack/generated/pi/agents/devrites-devex-reviewer.md +124 -0
- package/pack/generated/pi/agents/devrites-doubt-reviewer.md +88 -0
- package/pack/generated/pi/agents/devrites-evidence-scout.md +72 -0
- package/pack/generated/pi/agents/devrites-frontend-reviewer.md +116 -0
- package/pack/generated/pi/agents/devrites-performance-reviewer.md +115 -0
- package/pack/generated/pi/agents/devrites-plan-drafter.md +99 -0
- package/pack/generated/pi/agents/devrites-plan-reviewer.md +142 -0
- package/pack/generated/pi/agents/devrites-proof-runner.md +74 -0
- package/pack/generated/pi/agents/devrites-retrospector.md +61 -0
- package/pack/generated/pi/agents/devrites-security-auditor.md +109 -0
- package/pack/generated/pi/agents/devrites-simplifier-reviewer.md +94 -0
- package/pack/generated/pi/agents/devrites-slice-wright.md +204 -0
- package/pack/generated/pi/agents/devrites-spec-reviewer.md +96 -0
- package/pack/generated/pi/agents/devrites-strategy-reviewer.md +100 -0
- package/pack/generated/pi/agents/devrites-test-analyst.md +94 -0
- package/pack/generated/pi/agents/devrites-upgrade-planner.md +89 -0
- package/pack/generated/pi/prompts/rite-adopt.md +5 -0
- package/pack/generated/pi/prompts/rite-autocomplete.md +5 -0
- package/pack/generated/pi/prompts/rite-build.md +5 -0
- package/pack/generated/pi/prompts/rite-clarify.md +5 -0
- package/pack/generated/pi/prompts/rite-converge.md +5 -0
- package/pack/generated/pi/prompts/rite-customize.md +5 -0
- package/pack/generated/pi/prompts/rite-define.md +5 -0
- package/pack/generated/pi/prompts/rite-doctor.md +5 -0
- package/pack/generated/pi/prompts/rite-dogfood.md +5 -0
- package/pack/generated/pi/prompts/rite-explain.md +5 -0
- package/pack/generated/pi/prompts/rite-frame.md +5 -0
- package/pack/generated/pi/prompts/rite-handoff.md +5 -0
- package/pack/generated/pi/prompts/rite-learn.md +5 -0
- package/pack/generated/pi/prompts/rite-plan.md +5 -0
- package/pack/generated/pi/prompts/rite-polish.md +5 -0
- package/pack/generated/pi/prompts/rite-pov.md +5 -0
- package/pack/generated/pi/prompts/rite-pr-feedback.md +5 -0
- package/pack/generated/pi/prompts/rite-pressure-test.md +5 -0
- package/pack/generated/pi/prompts/rite-prototype.md +5 -0
- package/pack/generated/pi/prompts/rite-prove.md +5 -0
- package/pack/generated/pi/prompts/rite-quick.md +5 -0
- package/pack/generated/pi/prompts/rite-resolve.md +5 -0
- package/pack/generated/pi/prompts/rite-review.md +5 -0
- package/pack/generated/pi/prompts/rite-seal.md +5 -0
- package/pack/generated/pi/prompts/rite-ship.md +5 -0
- package/pack/generated/pi/prompts/rite-spec.md +5 -0
- package/pack/generated/pi/prompts/rite-status.md +5 -0
- package/pack/generated/pi/prompts/rite-temper.md +5 -0
- package/pack/generated/pi/prompts/rite-upgrade.md +5 -0
- package/pack/generated/pi/prompts/rite-vet.md +5 -0
- package/pack/generated/pi/prompts/rite-watch-pr.md +5 -0
- package/pack/generated/pi/prompts/rite-zoom-out.md +5 -0
- package/pack/generated/pi/prompts/rite.md +5 -0
- package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +63 -0
- package/pack/generated/pi/skills/devrites-audit/SKILL.md +50 -0
- package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +76 -0
- package/pack/generated/pi/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
- package/pack/generated/pi/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +96 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/trace.md +25 -0
- package/pack/generated/pi/skills/devrites-doubt/SKILL.md +79 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +86 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/craft.md +63 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/design-references.md +116 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/fullstack.md +46 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/quality-standards.md +294 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/reuse-first.md +53 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/shape.md +56 -0
- package/pack/generated/pi/skills/devrites-interview/SKILL.md +102 -0
- package/pack/generated/pi/skills/devrites-lib/SKILL.md +58 -0
- package/pack/generated/pi/skills/devrites-lib/reference/candidate-integrity.md +42 -0
- package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +64 -0
- package/pack/generated/pi/skills/devrites-lib/reference/orchestration-profiles.md +27 -0
- package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +73 -0
- package/pack/generated/pi/skills/devrites-lib/reference/reply-contract.md +88 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/README.md +60 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +398 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +99 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/anti-patterns.md +48 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/browser-proof-checklist.md +24 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +50 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +108 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/coding-style.md +48 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/context-hygiene.md +109 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +167 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +118 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/debug-recovery.md +28 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/definition-of-done.md +19 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/deprecation.md +31 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/development-workflow.md +29 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/documentation.md +43 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/edge-case-trace.md +92 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/elicitation.md +85 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/error-handling.md +47 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/git-workflow.md +49 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/hooks.md +25 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/integration-reliability.md +102 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/observability.md +88 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/one-shot-actions.md +97 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/patterns.md +68 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +51 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/principles.md +42 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/prose-style.md +123 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/release/ship-checklist.md +8 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/repository-topology.md +80 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/review-checklist.md +12 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/security-checklist.md +25 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/security.md +202 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +209 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/spec-grammar.md +197 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/test-proof-checklist.md +13 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +212 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/tooling.md +92 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/workflow-artifacts.md +427 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/code.md +44 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/comparison.md +42 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/diagram.md +51 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/index.md +66 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/input.md +46 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/outline-template.md +106 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/plan.md +48 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/slides.md +40 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/table.md +42 -0
- package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +267 -0
- package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +73 -0
- package/pack/generated/pi/skills/devrites-prose-craft/reference/banned-phrases.md +132 -0
- package/pack/generated/pi/skills/devrites-prose-craft/reference/examples.md +131 -0
- package/pack/generated/pi/skills/devrites-prose-craft/reference/structures.md +196 -0
- package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +52 -0
- package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +134 -0
- package/pack/generated/pi/skills/devrites-ux-shape/reference/brief-template.md +108 -0
- package/pack/generated/pi/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
- package/pack/generated/pi/skills/rite/SKILL.md +148 -0
- package/pack/generated/pi/skills/rite/reference/menu.md +48 -0
- package/pack/generated/pi/skills/rite-adopt/SKILL.md +52 -0
- package/pack/generated/pi/skills/rite-adopt/reference/adoption.md +19 -0
- package/pack/generated/pi/skills/rite-adopt/reference/anti-patterns.md +19 -0
- package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +132 -0
- package/pack/generated/pi/skills/rite-autocomplete/reference/decision-policy.md +41 -0
- package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +148 -0
- package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +92 -0
- package/pack/generated/pi/skills/rite-build/SKILL.md +96 -0
- package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +145 -0
- package/pack/generated/pi/skills/rite-build/reference/anti-patterns.md +23 -0
- package/pack/generated/pi/skills/rite-build/reference/checkpoint-protocol.md +120 -0
- package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +44 -0
- package/pack/generated/pi/skills/rite-build/reference/frontend-trigger.md +39 -0
- package/pack/generated/pi/skills/rite-build/reference/one-slice-cycle.md +50 -0
- package/pack/generated/pi/skills/rite-build/reference/output.md +33 -0
- package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +205 -0
- package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +87 -0
- package/pack/generated/pi/skills/rite-build/reference/spec-drift-guard.md +84 -0
- package/pack/generated/pi/skills/rite-build/reference/tdd.md +27 -0
- package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +89 -0
- package/pack/generated/pi/skills/rite-clarify/SKILL.md +99 -0
- package/pack/generated/pi/skills/rite-clarify/reference/anti-patterns.md +24 -0
- package/pack/generated/pi/skills/rite-clarify/reference/decision-coverage.md +55 -0
- package/pack/generated/pi/skills/rite-converge/SKILL.md +145 -0
- package/pack/generated/pi/skills/rite-converge/reference/anti-patterns.md +35 -0
- package/pack/generated/pi/skills/rite-converge/reference/convergence-assessment.md +65 -0
- package/pack/generated/pi/skills/rite-customize/SKILL.md +60 -0
- package/pack/generated/pi/skills/rite-define/SKILL.md +169 -0
- package/pack/generated/pi/skills/rite-define/reference/anti-patterns.md +26 -0
- package/pack/generated/pi/skills/rite-define/reference/gates.md +154 -0
- package/pack/generated/pi/skills/rite-define/reference/plan-template.md +149 -0
- package/pack/generated/pi/skills/rite-doctor/SKILL.md +69 -0
- package/pack/generated/pi/skills/rite-dogfood/SKILL.md +55 -0
- package/pack/generated/pi/skills/rite-explain/SKILL.md +152 -0
- package/pack/generated/pi/skills/rite-explain/reference/intake.md +89 -0
- package/pack/generated/pi/skills/rite-frame/SKILL.md +115 -0
- package/pack/generated/pi/skills/rite-frame/reference/failure-modes.md +66 -0
- package/pack/generated/pi/skills/rite-handoff/SKILL.md +97 -0
- package/pack/generated/pi/skills/rite-handoff/reference/handoff-template.md +44 -0
- package/pack/generated/pi/skills/rite-learn/SKILL.md +72 -0
- package/pack/generated/pi/skills/rite-plan/SKILL.md +186 -0
- package/pack/generated/pi/skills/rite-plan/reference/anti-patterns.md +34 -0
- package/pack/generated/pi/skills/rite-plan/reference/dependency-graph.md +48 -0
- package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +105 -0
- package/pack/generated/pi/skills/rite-plan/reference/slicing.md +167 -0
- package/pack/generated/pi/skills/rite-plan/reference/task-breakdown.md +42 -0
- package/pack/generated/pi/skills/rite-polish/SKILL.md +104 -0
- package/pack/generated/pi/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/generated/pi/skills/rite-polish/reference/anti-ai-slop.md +187 -0
- package/pack/generated/pi/skills/rite-polish/reference/anti-patterns.md +30 -0
- package/pack/generated/pi/skills/rite-polish/reference/backend-polish.md +80 -0
- package/pack/generated/pi/skills/rite-polish/reference/browser-polish-evidence.md +33 -0
- package/pack/generated/pi/skills/rite-polish/reference/code.md +82 -0
- package/pack/generated/pi/skills/rite-polish/reference/design-memory.md +117 -0
- package/pack/generated/pi/skills/rite-polish/reference/design-system-discovery.md +8 -0
- package/pack/generated/pi/skills/rite-polish/reference/harden-checklist.md +109 -0
- package/pack/generated/pi/skills/rite-polish/reference/ledger.md +65 -0
- package/pack/generated/pi/skills/rite-polish/reference/ui.md +137 -0
- package/pack/generated/pi/skills/rite-pov/SKILL.md +58 -0
- package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +54 -0
- package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +67 -0
- package/pack/generated/pi/skills/rite-prototype/SKILL.md +104 -0
- package/pack/generated/pi/skills/rite-prove/SKILL.md +120 -0
- package/pack/generated/pi/skills/rite-prove/reference/acceptance-proof.md +88 -0
- package/pack/generated/pi/skills/rite-prove/reference/anti-patterns.md +25 -0
- package/pack/generated/pi/skills/rite-prove/reference/browser-proof.md +51 -0
- package/pack/generated/pi/skills/rite-prove/reference/failure-triage.md +43 -0
- package/pack/generated/pi/skills/rite-prove/reference/proof-ladder.md +28 -0
- package/pack/generated/pi/skills/rite-prove/reference/test-command-discovery.md +30 -0
- package/pack/generated/pi/skills/rite-quick/SKILL.md +82 -0
- package/pack/generated/pi/skills/rite-resolve/SKILL.md +95 -0
- package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +118 -0
- package/pack/generated/pi/skills/rite-review/SKILL.md +170 -0
- package/pack/generated/pi/skills/rite-review/reference/anti-patterns.md +32 -0
- package/pack/generated/pi/skills/rite-review/reference/cognitive-load.md +90 -0
- package/pack/generated/pi/skills/rite-review/reference/feature-scoped-review.md +26 -0
- package/pack/generated/pi/skills/rite-review/reference/five-axis-review.md +66 -0
- package/pack/generated/pi/skills/rite-review/reference/nielsen-heuristics.md +126 -0
- package/pack/generated/pi/skills/rite-review/reference/performance-checklist.md +80 -0
- package/pack/generated/pi/skills/rite-review/reference/performance-review.md +14 -0
- package/pack/generated/pi/skills/rite-review/reference/security-review.md +42 -0
- package/pack/generated/pi/skills/rite-seal/SKILL.md +75 -0
- package/pack/generated/pi/skills/rite-seal/reference/anti-patterns.md +29 -0
- package/pack/generated/pi/skills/rite-seal/reference/final-evidence.md +41 -0
- package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +29 -0
- package/pack/generated/pi/skills/rite-seal/reference/output.md +5 -0
- package/pack/generated/pi/skills/rite-seal/reference/phase-contract.md +47 -0
- package/pack/generated/pi/skills/rite-seal/reference/risk-and-rollback.md +56 -0
- package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +27 -0
- package/pack/generated/pi/skills/rite-ship/SKILL.md +88 -0
- package/pack/generated/pi/skills/rite-ship/reference/anti-patterns.md +28 -0
- package/pack/generated/pi/skills/rite-ship/reference/close-out.md +68 -0
- package/pack/generated/pi/skills/rite-ship/reference/git-ship.md +120 -0
- package/pack/generated/pi/skills/rite-ship/reference/rollout.md +62 -0
- package/pack/generated/pi/skills/rite-ship/reference/ship-template.md +39 -0
- package/pack/generated/pi/skills/rite-spec/SKILL.md +150 -0
- package/pack/generated/pi/skills/rite-spec/reference/acceptance-criteria.md +31 -0
- package/pack/generated/pi/skills/rite-spec/reference/ai-spec-template.md +40 -0
- package/pack/generated/pi/skills/rite-spec/reference/anti-patterns.md +27 -0
- package/pack/generated/pi/skills/rite-spec/reference/interview-patterns.md +56 -0
- package/pack/generated/pi/skills/rite-spec/reference/investigation.md +83 -0
- package/pack/generated/pi/skills/rite-spec/reference/question-protocol.md +36 -0
- package/pack/generated/pi/skills/rite-spec/reference/references-intake.md +62 -0
- package/pack/generated/pi/skills/rite-spec/reference/spec-checklists.md +89 -0
- package/pack/generated/pi/skills/rite-spec/reference/spec-template.md +154 -0
- package/pack/generated/pi/skills/rite-spec/reference/state-workspace.md +227 -0
- package/pack/generated/pi/skills/rite-status/SKILL.md +57 -0
- package/pack/generated/pi/skills/rite-temper/SKILL.md +130 -0
- package/pack/generated/pi/skills/rite-temper/reference/anti-patterns.md +30 -0
- package/pack/generated/pi/skills/rite-temper/reference/review-dimensions.md +66 -0
- package/pack/generated/pi/skills/rite-temper/reference/scope-modes.md +53 -0
- package/pack/generated/pi/skills/rite-temper/reference/significance.md +46 -0
- package/pack/generated/pi/skills/rite-temper/reference/strategy-template.md +90 -0
- package/pack/generated/pi/skills/rite-upgrade/SKILL.md +121 -0
- package/pack/generated/pi/skills/rite-vet/SKILL.md +193 -0
- package/pack/generated/pi/skills/rite-vet/reference/anti-patterns.md +43 -0
- package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +202 -0
- package/pack/generated/pi/skills/rite-vet/reference/cross-model.md +19 -0
- package/pack/generated/pi/skills/rite-vet/reference/depth.md +59 -0
- package/pack/generated/pi/skills/rite-vet/reference/eng-lenses.md +48 -0
- package/pack/generated/pi/skills/rite-vet/reference/review-axes.md +201 -0
- package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +85 -0
- package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +69 -0
- package/package.json +3 -2
- package/scripts/build-host-artifacts.sh +54 -4
- package/scripts/codex-generate.sh +6 -0
- package/scripts/pi-generate.sh +198 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to DevRites are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and DevRites adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases are generated automatically by [semantic-release](https://semantic-release.gitbook.io/) from Conventional Commits on `main`.
|
|
4
4
|
|
|
5
|
+
## [5.6.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.5.0...v5.6.0) (2026-09-13)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
* **rite:** add pi as fourth host target ([#69](https://github.com/ViktorsBaikers/DevRites/issues/69)) ([8249a6b](https://github.com/ViktorsBaikers/DevRites/commit/8249a6b9d5bef3dfd2411089fdcd34845f535b12))
|
|
10
|
+
|
|
11
|
+
## [5.5.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.4.0...v5.5.0) (2026-09-13)
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
* **rite:** cap parallel batch width and chain deferred ship ([#68](https://github.com/ViktorsBaikers/DevRites/issues/68)) ([d023dfa](https://github.com/ViktorsBaikers/DevRites/commit/d023dfa742d5b6f5a9775c21308cd4731d6858f9))
|
|
16
|
+
|
|
5
17
|
## [5.4.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.3.0...v5.4.0) (2026-09-13)
|
|
6
18
|
|
|
7
19
|
### Added
|
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@ project-conventional push, tag, or PR action, and archive the workspace.
|
|
|
33
33
|
Unattended runs may create local WIP checkpoint commits along the way, but they
|
|
34
34
|
remain local unless Ship's disclosed plan includes an approved remote action.
|
|
35
35
|
|
|
36
|
-
**Status:** [`v5.
|
|
36
|
+
**Status:** [`v5.6.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v5.6.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
|
|
37
37
|
|
|
38
38
|
This is the latest published release; `main` may contain unreleased work.
|
|
39
39
|
|
|
@@ -47,8 +47,8 @@ Run this from the root of your project. Node.js 18 or later is required.
|
|
|
47
47
|
npx devrites@latest
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
The installer adds project-local support for Claude Code
|
|
51
|
-
write skills, agents, or hooks to `~/.claude
|
|
50
|
+
The installer adds project-local support for Claude Code, Codex, omp, and pi.
|
|
51
|
+
It does not write skills, agents, or hooks to `~/.claude`, `~/.codex`, or `~/.pi`.
|
|
52
52
|
|
|
53
53
|
### 2. Choose the smallest route
|
|
54
54
|
|
|
@@ -78,8 +78,9 @@ proof and next action.
|
|
|
78
78
|
## How the lifecycle works
|
|
79
79
|
|
|
80
80
|
Claude Code supports both `/rite <verb>` and `/rite-<verb>`. Codex uses the same
|
|
81
|
-
forms with `$`: `$rite <verb>` and `$rite-<verb>`.
|
|
82
|
-
|
|
81
|
+
forms with `$`: `$rite <verb>` and `$rite-<verb>`. omp and pi use the Claude
|
|
82
|
+
slash forms (on pi they run as prompt templates under `.pi/prompts`, with
|
|
83
|
+
`/skill:rite-<verb>` equivalent). The menu and direct forms run the same skill.
|
|
83
84
|
|
|
84
85
|
| # | Stage | Direct command | What happens |
|
|
85
86
|
| ---: | --- | --- | --- |
|
|
@@ -294,7 +295,8 @@ Useful install flags:
|
|
|
294
295
|
| `--target DIR` | Use another project directory. |
|
|
295
296
|
| `--dry-run` | Show planned file operations without changing anything. |
|
|
296
297
|
| `--force` | Replace or remove foreign or customized managed files. The installer still rejects symlinks and path escapes. |
|
|
297
|
-
| `--no-codex` | Skip `.agents`, `.codex`, and `AGENTS.md`
|
|
298
|
+
| `--no-codex` | Skip `.agents`, `.codex`, and the Codex `AGENTS.md` block. |
|
|
299
|
+
| `--no-pi` | Skip `.pi` skills, agents, prompt commands, and the pi `AGENTS.md` block. |
|
|
298
300
|
| `--no-agents` | Skip hook-free native specialist profiles. |
|
|
299
301
|
| `--no-skills` | Skip skills and their bundled standards. |
|
|
300
302
|
| `--no-binary` | Do not keep the shared `devrites-engine` binary in a user or system bin directory. |
|
package/docs/command-map.md
CHANGED
|
@@ -41,8 +41,8 @@ The Go surface is intentionally closed and deterministic:
|
|
|
41
41
|
| Lane | Commands | Owner |
|
|
42
42
|
|---|---|---|
|
|
43
43
|
| Candidate and deterministic checks | `check candidate`, `check readiness [--emit-binding]`, `check seal`, `check task-graph`, `check path-disjoint`, `check skill-trust`, `check indexes` | Candidate validates/hashes the strict project manifest; readiness checks phase files, the required `tasks.md` slice graph, or emits the vetted Build-input binding; seal checks final files/open gates, that graph and binding, then exact candidate bindings. `check indexes` reports install manifest and optional code-index directory presence as JSON. |
|
|
44
|
-
| Workspace observation | `observe summary`, `orient` | JSON workspace snapshot for agents; `orient` is an alias for `observe summary`. |
|
|
45
|
-
| Atomic workspace state | `state resolve`, `state close`, `migrate [--dry-run] [--answer id=choice]` | Go owns answer/drop/batch resolution, transactional close, and fail-closed v5 schema normalization. |
|
|
44
|
+
| Workspace observation | `observe summary`, `orient`, `observe slice <slug> <SLICE-ID>` | JSON workspace snapshot for agents (cursor, task graph, `artifact_budgets`, `bulk_files`); `orient` is an alias for `observe summary`. `observe slice` prints one `SLICE-###` section of `tasks.md` so Build reads a slice, not the file. |
|
|
45
|
+
| Atomic workspace state | `state resolve`, `state merge-manifest`, `state close`, `migrate [--dry-run] [--answer id=choice]` | Go owns answer/drop/batch resolution, the recorded predecessor-chain manifest union for a release milestone, transactional close, and fail-closed v5 schema normalization. |
|
|
46
46
|
| Security | `secret-scan` | `/rite-ship`, safe hooks, or an operator scans staged blobs, stdin, or touched files. |
|
|
47
47
|
| Install/operator | `install`, `update`, `uninstall`, `version` | Direct update acquires latest; npm/bootstrap may supply local candidates; the engine performs manifest-owned local changes. |
|
|
48
48
|
| Native policy | no engine command | Skills/root own spec grammar re-read, qid allocation, Clarify cursor edits, AFK/recovery accounting, and read-only `/rite-doctor`. |
|
|
@@ -147,6 +147,18 @@ There is no recovery-counter artifact. The caller and recovery loop count at
|
|
|
147
147
|
most three failed attempts per causal fingerprint from current context and the
|
|
148
148
|
recorded `## Dead ends` / `evidence.md`, then stop before a fourth.
|
|
149
149
|
|
|
150
|
+
For a deferred-ship continuation chain (`.devrites/AFK` `continue_sequence`),
|
|
151
|
+
three optional cursor fields carry the chain: `sequence_parent` (the immediately
|
|
152
|
+
preceding workspace slug), `sequence_position` (1-based ordinal), and
|
|
153
|
+
`sequence_workspaces_remaining` (slots the chain may still open). The controlling
|
|
154
|
+
root seeds them once per continuation workspace from the recorded parent and the
|
|
155
|
+
parent's counter; values only decrease, malformed values fail closed, and a
|
|
156
|
+
workspace without a recorded parent/position is not a sequence member. The
|
|
157
|
+
release milestone additionally carries `sequence_role: release`, which makes
|
|
158
|
+
`check candidate` and `check seal` require its manifest to cover the whole
|
|
159
|
+
recorded chain (built by `state merge-manifest`).
|
|
160
|
+
`observe summary`/`orient` surface them under `sequence`.
|
|
161
|
+
|
|
150
162
|
<!-- authority:state-tracking:start -->
|
|
151
163
|
Git-tracked shared state: `.devrites/specs/`. Per-clone runtime state: `.devrites/work/`, `.devrites/archive/`, `.devrites/ACTIVE`.
|
|
152
164
|
<!-- authority:state-tracking:end -->
|
package/docs/flow.md
CHANGED
|
@@ -351,6 +351,10 @@ erDiagram
|
|
|
351
351
|
string status "running | awaiting_human | blocked | done"
|
|
352
352
|
string active_slice "N: name"
|
|
353
353
|
int afk_slices_remaining "root-owned; never negative; one charge per green built slice"
|
|
354
|
+
string sequence_parent "deferred-ship chain: preceding workspace slug"
|
|
355
|
+
int sequence_position "1-based ordinal in the recorded continuation chain"
|
|
356
|
+
int sequence_workspaces_remaining "chain slots still open after this workspace; never negative"
|
|
357
|
+
string sequence_role "release on the release milestone; gates then require the chain union"
|
|
354
358
|
string return_phase "durable later-phase clarify return"
|
|
355
359
|
string return_next_action "restored only after fresh CLEAR"
|
|
356
360
|
block awaiting_human "qid, gate, question, proposed, raised_at (only when paused)"
|
package/docs/orchestration.md
CHANGED
|
@@ -127,8 +127,11 @@ conflict, extra paths, moved base, or cleanup failure stops with worktree eviden
|
|
|
127
127
|
preserved. No ad hoc copy/cherry-pick/merge occurs from the read-only root.
|
|
128
128
|
|
|
129
129
|
Isolation does not authorize same-worktree throughput. Parallel writers are allowed
|
|
130
|
-
**only** under `/rite-build
|
|
131
|
-
and a control `parallel-lease.md` apply (
|
|
130
|
+
**only** under the `/rite-build` batch path when path-disjoint eligibility, abort-batch,
|
|
131
|
+
and a control `parallel-lease.md` apply. `--parallel N` (or the AFK sentinel
|
|
132
|
+
`max_parallel`, default cap 10 under `/rite-autocomplete`) is a **cap**: each round runs
|
|
133
|
+
the largest eligible set, recomputes after every integrate, and repeats until no pending
|
|
134
|
+
slice remains; fewer than two eligible slices fall back to the serial cycle (see
|
|
132
135
|
[`parallel-batch.md`](../pack/.claude/skills/rite-build/reference/parallel-batch.md)).
|
|
133
136
|
Same-worktree multi-writer and root-emulated worktrees remain forbidden; default
|
|
134
137
|
`/rite-build` stays one writer across linked worktrees.
|
package/engine/commands.go
CHANGED
|
@@ -31,7 +31,7 @@ func rootModeFor(command string, args []string) rootMode {
|
|
|
31
31
|
return rootLenient
|
|
32
32
|
case "state":
|
|
33
33
|
switch subcommand {
|
|
34
|
-
case "resolve", "close":
|
|
34
|
+
case "resolve", "merge-manifest", "close":
|
|
35
35
|
return rootStrict
|
|
36
36
|
}
|
|
37
37
|
return rootUnused
|
|
@@ -49,7 +49,7 @@ func rootModeFor(command string, args []string) rootMode {
|
|
|
49
49
|
return rootStrictUsage
|
|
50
50
|
case "observe":
|
|
51
51
|
switch subcommand {
|
|
52
|
-
case "summary":
|
|
52
|
+
case "summary", "slice":
|
|
53
53
|
return rootStrictUsage
|
|
54
54
|
}
|
|
55
55
|
return rootUnused
|
|
@@ -16,9 +16,12 @@ const (
|
|
|
16
16
|
ClaudeSkillsTarget = ".claude/skills"
|
|
17
17
|
CodexSkillsTarget = ".agents/skills"
|
|
18
18
|
OmpSkillsTarget = ".omp/skills"
|
|
19
|
+
PiSkillsTarget = ".pi/skills"
|
|
19
20
|
ClaudeAgentsTarget = ".claude/agents"
|
|
20
21
|
CodexAgentsTarget = ".codex/agents"
|
|
21
22
|
OmpAgentsTarget = ".omp/agents"
|
|
23
|
+
PiAgentsTarget = ".pi/agents"
|
|
24
|
+
PiPromptsTarget = ".pi/prompts"
|
|
22
25
|
ClaudeWorkflowsTarget = ".claude/workflows"
|
|
23
26
|
|
|
24
27
|
ManifestName = ".claude/devrites.manifest"
|
|
@@ -118,6 +121,21 @@ func ArchiveDirChecked(root string) (string, error) {
|
|
|
118
121
|
return checkedCanonicalDir(root, filepath.Join(root, "archive"), "archive", "")
|
|
119
122
|
}
|
|
120
123
|
|
|
124
|
+
// ExistingArchivedFeatureDirChecked resolves an archived feature directory that
|
|
125
|
+
// must already exist. A live workspace never satisfies this lookup; callers
|
|
126
|
+
// that accept either location try ExistingFeatureDirChecked first.
|
|
127
|
+
func ExistingArchivedFeatureDirChecked(root, slug string) (string, error) {
|
|
128
|
+
if !validSlug(slug) {
|
|
129
|
+
return "", fmt.Errorf("DRV-WORKSPACE-INVALID: %q is not a feature slug", slug)
|
|
130
|
+
}
|
|
131
|
+
candidate := filepath.Join(root, "archive", slug)
|
|
132
|
+
resolved, err := checkedCanonicalDir(root, candidate, filepath.Join("archive", slug), "")
|
|
133
|
+
if err != nil {
|
|
134
|
+
return "", err
|
|
135
|
+
}
|
|
136
|
+
return resolved, nil
|
|
137
|
+
}
|
|
138
|
+
|
|
121
139
|
func checkedCanonicalDir(root, candidate, parent, slug string) (string, error) {
|
|
122
140
|
resolvedRoot, err := safepath.ResolveExisting(root)
|
|
123
141
|
if err != nil {
|
|
@@ -51,9 +51,38 @@ func Check(kind Kind, root, slug string) (*Result, error) {
|
|
|
51
51
|
if err != nil {
|
|
52
52
|
return nil, fmt.Errorf("gate %s: %w", kind, err)
|
|
53
53
|
}
|
|
54
|
+
for _, problem := range unsanctionedRootFiles(observation) {
|
|
55
|
+
result.StateProblems = append(result.StateProblems, "placement: "+problem)
|
|
56
|
+
// Keep a more specific reason (readiness-stale) when the observation
|
|
57
|
+
// already blocked; only an otherwise-passing gate takes the generic one.
|
|
58
|
+
if !result.Blocked {
|
|
59
|
+
result.Blocked = true
|
|
60
|
+
result.ReasonID = ResultReasonID(kind, true)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
54
63
|
return result, nil
|
|
55
64
|
}
|
|
56
65
|
|
|
66
|
+
// unsanctionedRootFiles blocks a workspace-root file the schema does not place
|
|
67
|
+
// there and is over the packet ceiling. `packets/` owns by-reference dispatch
|
|
68
|
+
// packets and admitted accounts (<= 64 KiB each) and `history/` owns relocated
|
|
69
|
+
// narrative, so a large stray file in the root is misplaced payload — the shape
|
|
70
|
+
// that let a real workspace reach 71 MB, 83% of it reviewer packets and traces
|
|
71
|
+
// (see context-hygiene.md dispatch packets and its failing case).
|
|
72
|
+
func unsanctionedRootFiles(observation *state.WorkspaceObservation) []string {
|
|
73
|
+
var problems []string
|
|
74
|
+
for _, file := range observation.RootFiles() {
|
|
75
|
+
if state.SanctionedRootFile(file.Name) || file.Bytes <= state.PacketMaxBytes {
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
problems = append(problems, fmt.Sprintf(
|
|
79
|
+
"%s is %d bytes in the workspace root; move dispatch packets and accounts to packets/ (<= %d bytes each), closed narrative to history/ via /rite-plan revise, and never persist transcripts anywhere in .devrites/",
|
|
80
|
+
file.Name, file.Bytes, state.PacketMaxBytes,
|
|
81
|
+
))
|
|
82
|
+
}
|
|
83
|
+
return problems
|
|
84
|
+
}
|
|
85
|
+
|
|
57
86
|
func checkObservation(kind Kind, observation *state.WorkspaceObservation) (*Result, error) {
|
|
58
87
|
phase, err := observation.DeclaredPhase()
|
|
59
88
|
if err != nil {
|
|
@@ -109,6 +138,28 @@ func checkObservation(kind Kind, observation *state.WorkspaceObservation) (*Resu
|
|
|
109
138
|
blocked = true
|
|
110
139
|
}
|
|
111
140
|
}
|
|
141
|
+
if len(missingFiles) == 0 {
|
|
142
|
+
for _, problem := range artifactBudgetProblems(observation, policy) {
|
|
143
|
+
stateProblems = append(stateProblems, "budget: "+problem)
|
|
144
|
+
blocked = true
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Deliberately not gated on missingFiles: a file over the read cap IS missing,
|
|
148
|
+
// so the budget comparison below can never reach it. Missing already blocks it;
|
|
149
|
+
// name the size remedies too so the signal is actionable rather than a bare cap.
|
|
150
|
+
for _, artifact := range policy.RequiredArtifacts {
|
|
151
|
+
fact, ok := observation.Fact(artifact)
|
|
152
|
+
if !ok {
|
|
153
|
+
continue
|
|
154
|
+
}
|
|
155
|
+
if diagnostic, has := fact.Diagnostic(); has && diagnostic.Code == state.DiagnosticFileTooLarge {
|
|
156
|
+
stateProblems = append(stateProblems, fmt.Sprintf(
|
|
157
|
+
"budget: %s exceeds the %d-byte artifact cap; relocate history (history/<file>-<YYYYMMDD>.md) or split the feature via /rite-plan revise|course-correct",
|
|
158
|
+
artifact, state.MaxArtifactBytes,
|
|
159
|
+
))
|
|
160
|
+
blocked = true
|
|
161
|
+
}
|
|
162
|
+
}
|
|
112
163
|
if len(missingFiles) == 0 && phaseRequiresReadinessBinding(policy) {
|
|
113
164
|
expected, bindingErr := verifyReadinessBinding(observation)
|
|
114
165
|
if bindingErr != nil {
|
|
@@ -142,6 +193,33 @@ func checkObservation(kind Kind, observation *state.WorkspaceObservation) (*Resu
|
|
|
142
193
|
return result, nil
|
|
143
194
|
}
|
|
144
195
|
|
|
196
|
+
// artifactBudgetProblems blocks a required artifact only on a material overshoot
|
|
197
|
+
// (>= state.BudgetBlockFactor of a line or byte budget) with no structural
|
|
198
|
+
// `Budget override:` line. Smaller overshoots stay advisory and are reported by
|
|
199
|
+
// `orient`.
|
|
200
|
+
func artifactBudgetProblems(observation *state.WorkspaceObservation, policy state.PhasePolicy) []string {
|
|
201
|
+
var problems []string
|
|
202
|
+
for _, artifact := range policy.RequiredArtifacts {
|
|
203
|
+
fact, ok := observation.Fact(artifact)
|
|
204
|
+
if !ok || fact.State() != state.ArtifactPresent {
|
|
205
|
+
continue
|
|
206
|
+
}
|
|
207
|
+
if !state.ArtifactBudgetGateApplies(string(artifact)) {
|
|
208
|
+
continue
|
|
209
|
+
}
|
|
210
|
+
status, ok := state.ArtifactBudget(string(artifact), fact.Bytes())
|
|
211
|
+
if !ok || !status.Material || status.Override {
|
|
212
|
+
continue
|
|
213
|
+
}
|
|
214
|
+
problems = append(problems, fmt.Sprintf(
|
|
215
|
+
"%s is %d lines/%d bytes, at or above %gx its %d-line/%d-byte budget; relocate history (history/<file>-<YYYYMMDD>.md) or split the feature via /rite-plan revise|course-correct, or record a structural `Budget override: <reason>` line",
|
|
216
|
+
status.File, status.Lines, status.Bytes, state.BudgetBlockFactor,
|
|
217
|
+
status.LineBudget, status.ByteBudget,
|
|
218
|
+
))
|
|
219
|
+
}
|
|
220
|
+
return problems
|
|
221
|
+
}
|
|
222
|
+
|
|
145
223
|
func acceptanceMapProblems(observation *state.WorkspaceObservation, policy state.PhasePolicy) []string {
|
|
146
224
|
requireTasks := phaseRequiresTasks(policy)
|
|
147
225
|
requireTestPlan := phaseRequiresTestPlan(policy)
|
|
@@ -636,3 +636,121 @@ func writeWorkFeature(t *testing.T, root, slug string, files map[string]string)
|
|
|
636
636
|
testutil.WriteFile(t, filepath.Join(root, "work", slug, name), content)
|
|
637
637
|
}
|
|
638
638
|
}
|
|
639
|
+
|
|
640
|
+
func TestCheckBlocksMaterialBudgetOvershootWithoutOverride(t *testing.T) {
|
|
641
|
+
root := t.TempDir()
|
|
642
|
+
writeCompleteGateFeature(t, root, "oversized", state.PhaseBuild, state.PhaseBuild, "none\n")
|
|
643
|
+
workspace := filepath.Join(root, "work", "oversized")
|
|
644
|
+
oversized := "# Tasks\n\n## SLICE-001 A\nDependencies: none\n\n" + strings.Repeat("long line of planning prose\n", 500)
|
|
645
|
+
testutil.WriteFile(t, filepath.Join(workspace, "tasks.md"), oversized)
|
|
646
|
+
binding := mustReadinessBinding(t, root, "oversized")
|
|
647
|
+
testutil.AppendFile(t, filepath.Join(workspace, "eng-review.md"), "\n"+binding+"\n")
|
|
648
|
+
|
|
649
|
+
res, err := Check(Readiness, root, "oversized")
|
|
650
|
+
if err != nil {
|
|
651
|
+
t.Fatal(err)
|
|
652
|
+
}
|
|
653
|
+
if !res.Blocked {
|
|
654
|
+
t.Fatalf("blocked=false, want true")
|
|
655
|
+
}
|
|
656
|
+
joined := strings.Join(res.StateProblems, "\n")
|
|
657
|
+
if !strings.Contains(joined, "budget: tasks.md is") || !strings.Contains(joined, "Budget override") {
|
|
658
|
+
t.Fatalf("StateProblems=%q", joined)
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
testutil.AppendFile(t, filepath.Join(workspace, "tasks.md"), "\nBudget override: vendored requirement matrix, relocation pending\n")
|
|
662
|
+
res, err = Check(Readiness, root, "oversized")
|
|
663
|
+
if err != nil {
|
|
664
|
+
t.Fatal(err)
|
|
665
|
+
}
|
|
666
|
+
if strings.Contains(strings.Join(res.StateProblems, "\n"), "budget: tasks.md") {
|
|
667
|
+
t.Fatalf("override did not clear the budget problem: %v", res.StateProblems)
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
func TestCheckKeepsNonMaterialOvershootAdvisory(t *testing.T) {
|
|
672
|
+
root := t.TempDir()
|
|
673
|
+
writeCompleteGateFeature(t, root, "slightly-over", state.PhaseBuild, state.PhaseBuild, "none\n")
|
|
674
|
+
workspace := filepath.Join(root, "work", "slightly-over")
|
|
675
|
+
// 300 lines against a 280-line budget: over, but below the material factor.
|
|
676
|
+
testutil.WriteFile(t, filepath.Join(workspace, "tasks.md"), testutil.CanonicalTasksMarkdown+"\n"+strings.Repeat("note\n", 200))
|
|
677
|
+
binding := mustReadinessBinding(t, root, "slightly-over")
|
|
678
|
+
testutil.AppendFile(t, filepath.Join(workspace, "eng-review.md"), "\n"+binding+"\n")
|
|
679
|
+
|
|
680
|
+
res, err := Check(Readiness, root, "slightly-over")
|
|
681
|
+
if err != nil {
|
|
682
|
+
t.Fatal(err)
|
|
683
|
+
}
|
|
684
|
+
if strings.Contains(strings.Join(res.StateProblems, "\n"), "budget:") {
|
|
685
|
+
t.Fatalf("non-material overshoot must stay advisory: %v", res.StateProblems)
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
func TestCheckBlocksOversizedPacketInWorkspaceRoot(t *testing.T) {
|
|
690
|
+
root := t.TempDir()
|
|
691
|
+
writeCompleteGateFeature(t, root, "stray", state.PhaseBuild, state.PhaseBuild, "none\n")
|
|
692
|
+
workspace := filepath.Join(root, "work", "stray")
|
|
693
|
+
binding := mustReadinessBinding(t, root, "stray")
|
|
694
|
+
testutil.AppendFile(t, filepath.Join(workspace, "eng-review.md"), "\n"+binding+"\n")
|
|
695
|
+
|
|
696
|
+
// Sanctioned conditional artifact over the ceiling: placement stays legal.
|
|
697
|
+
testutil.WriteFile(t, filepath.Join(workspace, "references.md"),
|
|
698
|
+
"# refs\n\n"+strings.Repeat("reference line\n", 6000))
|
|
699
|
+
// Unsanctioned root payload over the ceiling: blocked.
|
|
700
|
+
testutil.WriteFile(t, filepath.Join(workspace, "vet-review-input-031.json"),
|
|
701
|
+
strings.Repeat("x", state.PacketMaxBytes+1))
|
|
702
|
+
|
|
703
|
+
res, err := Check(Readiness, root, "stray")
|
|
704
|
+
if err != nil {
|
|
705
|
+
t.Fatal(err)
|
|
706
|
+
}
|
|
707
|
+
joined := strings.Join(res.StateProblems, "\n")
|
|
708
|
+
if !res.Blocked || !strings.Contains(joined, "placement: vet-review-input-031.json") {
|
|
709
|
+
t.Fatalf("blocked=%v StateProblems=%q", res.Blocked, joined)
|
|
710
|
+
}
|
|
711
|
+
if !strings.Contains(joined, "packets/") {
|
|
712
|
+
t.Fatalf("remediation must name packets/: %q", joined)
|
|
713
|
+
}
|
|
714
|
+
if strings.Contains(joined, "references.md") {
|
|
715
|
+
t.Fatalf("sanctioned root artifact must not be treated as misplaced: %q", joined)
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
func TestCheckNamesSizeRemediesForArtifactOverReadCap(t *testing.T) {
|
|
720
|
+
root := t.TempDir()
|
|
721
|
+
writeCompleteGateFeature(t, root, "huge", state.PhaseBuild, state.PhaseBuild, "none\n")
|
|
722
|
+
workspace := filepath.Join(root, "work", "huge")
|
|
723
|
+
// Over the read cap, so the artifact cannot be measured against its line budget.
|
|
724
|
+
// No binding: an over-cap file cannot be hashed into one, and this asserts the
|
|
725
|
+
// size signal alone rather than a passing gate.
|
|
726
|
+
testutil.WriteFile(t, filepath.Join(workspace, "tasks.md"),
|
|
727
|
+
"# Tasks\n\n"+strings.Repeat("n\n", state.MaxArtifactBytes/2+1))
|
|
728
|
+
|
|
729
|
+
res, err := Check(Readiness, root, "huge")
|
|
730
|
+
if err != nil {
|
|
731
|
+
t.Fatal(err)
|
|
732
|
+
}
|
|
733
|
+
joined := strings.Join(res.StateProblems, "\n")
|
|
734
|
+
if !res.Blocked || !strings.Contains(joined, "budget: tasks.md exceeds the") {
|
|
735
|
+
t.Fatalf("blocked=%v StateProblems=%q", res.Blocked, joined)
|
|
736
|
+
}
|
|
737
|
+
if !strings.Contains(joined, "history/") || !strings.Contains(joined, "/rite-plan") {
|
|
738
|
+
t.Fatalf("size remedies must be named: %q", joined)
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
func TestCheckLeavesProofLedgerOvershootAdvisory(t *testing.T) {
|
|
743
|
+
root := t.TempDir()
|
|
744
|
+
writeCompleteGateFeature(t, root, "big-ledger", state.PhaseProve, state.PhaseProve, "none\n")
|
|
745
|
+
workspace := filepath.Join(root, "work", "big-ledger")
|
|
746
|
+
testutil.WriteFile(t, filepath.Join(workspace, "evidence.md"), strings.Repeat("EVID-001 proof line\n", 800))
|
|
747
|
+
testutil.WriteFile(t, filepath.Join(workspace, "touched-files.md"), strings.Repeat("trail line\n", 600))
|
|
748
|
+
|
|
749
|
+
res, err := Check(Readiness, root, "big-ledger")
|
|
750
|
+
if err != nil {
|
|
751
|
+
t.Fatal(err)
|
|
752
|
+
}
|
|
753
|
+
if joined := strings.Join(res.StateProblems, "\n"); strings.Contains(joined, "budget:") {
|
|
754
|
+
t.Fatalf("proof ledgers must stay advisory: %v", res.StateProblems)
|
|
755
|
+
}
|
|
756
|
+
}
|
|
@@ -17,9 +17,12 @@ const (
|
|
|
17
17
|
ClaudeSkillsTarget = devritespaths.ClaudeSkillsTarget
|
|
18
18
|
CodexSkillsTarget = devritespaths.CodexSkillsTarget
|
|
19
19
|
OmpSkillsTarget = devritespaths.OmpSkillsTarget
|
|
20
|
+
PiSkillsTarget = devritespaths.PiSkillsTarget
|
|
20
21
|
ClaudeAgentsTarget = devritespaths.ClaudeAgentsTarget
|
|
21
22
|
CodexAgentsTarget = devritespaths.CodexAgentsTarget
|
|
22
23
|
OmpAgentsTarget = devritespaths.OmpAgentsTarget
|
|
24
|
+
PiAgentsTarget = devritespaths.PiAgentsTarget
|
|
25
|
+
PiPromptsTarget = devritespaths.PiPromptsTarget
|
|
23
26
|
ClaudeWorkflowsTarget = devritespaths.ClaudeWorkflowsTarget
|
|
24
27
|
)
|
|
25
28
|
|
|
@@ -87,6 +90,15 @@ var ClaudeSettingsMerge = JSONMerge{
|
|
|
87
90
|
DryRunText: ".claude/settings.json (DevRites permissions)",
|
|
88
91
|
}
|
|
89
92
|
|
|
93
|
+
var PiAgentsMerge = MarkerMerge{
|
|
94
|
+
TargetRel: "AGENTS.md",
|
|
95
|
+
PayloadRel: "pi/AGENTS.md",
|
|
96
|
+
Begin: "<!-- BEGIN DEVRITES PI -->",
|
|
97
|
+
End: "<!-- END DEVRITES PI -->",
|
|
98
|
+
MarkerRel: ".claude/devrites.pi-agents-merge",
|
|
99
|
+
MarkerText: "AGENTS.md contains a DevRites managed block between BEGIN/END DEVRITES PI markers.",
|
|
100
|
+
}
|
|
101
|
+
|
|
90
102
|
var CodexConfigMerge = MarkerMerge{
|
|
91
103
|
TargetRel: ".codex/config.toml",
|
|
92
104
|
PayloadRel: "codex/config.toml",
|
|
@@ -108,7 +120,14 @@ var managedMerges = []ManagedMerge{
|
|
|
108
120
|
TargetRel: CodexAgentsMerge.TargetRel,
|
|
109
121
|
Begin: CodexAgentsMerge.Begin,
|
|
110
122
|
End: CodexAgentsMerge.End,
|
|
111
|
-
DryRun: "AGENTS.md DevRites block",
|
|
123
|
+
DryRun: "AGENTS.md DevRites Codex block",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
MarkerRel: PiAgentsMerge.MarkerRel,
|
|
127
|
+
TargetRel: PiAgentsMerge.TargetRel,
|
|
128
|
+
Begin: PiAgentsMerge.Begin,
|
|
129
|
+
End: PiAgentsMerge.End,
|
|
130
|
+
DryRun: "AGENTS.md DevRites pi block",
|
|
112
131
|
},
|
|
113
132
|
{
|
|
114
133
|
MarkerRel: CodexConfigMerge.MarkerRel,
|
|
@@ -125,7 +144,7 @@ var managedMerges = []ManagedMerge{
|
|
|
125
144
|
LegacyCodexHooksMerge,
|
|
126
145
|
}
|
|
127
146
|
|
|
128
|
-
func RequiredPayload(withCodex, withOmp bool) []string {
|
|
147
|
+
func RequiredPayload(withCodex, withOmp, withPi bool) []string {
|
|
129
148
|
required := []string{
|
|
130
149
|
"claude/skills",
|
|
131
150
|
"claude/agents",
|
|
@@ -147,11 +166,19 @@ func RequiredPayload(withCodex, withOmp bool) []string {
|
|
|
147
166
|
"omp/.omp-plugin/plugin.json",
|
|
148
167
|
)
|
|
149
168
|
}
|
|
169
|
+
if withPi {
|
|
170
|
+
required = append(required,
|
|
171
|
+
"pi/skills",
|
|
172
|
+
"pi/agents",
|
|
173
|
+
"pi/prompts",
|
|
174
|
+
"pi/AGENTS.md",
|
|
175
|
+
)
|
|
176
|
+
}
|
|
150
177
|
return required
|
|
151
178
|
}
|
|
152
179
|
|
|
153
|
-
func ValidatePayload(payload fs.FS, withCodex, withOmp bool) error {
|
|
154
|
-
for _, rel := range RequiredPayload(withCodex, withOmp) {
|
|
180
|
+
func ValidatePayload(payload fs.FS, withCodex, withOmp, withPi bool) error {
|
|
181
|
+
for _, rel := range RequiredPayload(withCodex, withOmp, withPi) {
|
|
155
182
|
if _, err := fs.Stat(payload, rel); err != nil {
|
|
156
183
|
return fmt.Errorf("missing %s", rel)
|
|
157
184
|
}
|
|
@@ -159,7 +186,7 @@ func ValidatePayload(payload fs.FS, withCodex, withOmp bool) error {
|
|
|
159
186
|
return nil
|
|
160
187
|
}
|
|
161
188
|
|
|
162
|
-
func InstallTrees(withSkills, withAgents, withCodex, withOmp bool) []Tree {
|
|
189
|
+
func InstallTrees(withSkills, withAgents, withCodex, withOmp, withPi bool) []Tree {
|
|
163
190
|
var trees []Tree
|
|
164
191
|
if withSkills {
|
|
165
192
|
trees = append(trees, Tree{PayloadPrefix: "claude/skills", TargetPrefix: ClaudeSkillsTarget})
|
|
@@ -169,6 +196,12 @@ func InstallTrees(withSkills, withAgents, withCodex, withOmp bool) []Tree {
|
|
|
169
196
|
if withOmp {
|
|
170
197
|
trees = append(trees, Tree{PayloadPrefix: "omp/skills", TargetPrefix: OmpSkillsTarget})
|
|
171
198
|
}
|
|
199
|
+
if withPi {
|
|
200
|
+
trees = append(trees,
|
|
201
|
+
Tree{PayloadPrefix: "pi/skills", TargetPrefix: PiSkillsTarget},
|
|
202
|
+
Tree{PayloadPrefix: "pi/prompts", TargetPrefix: PiPromptsTarget},
|
|
203
|
+
)
|
|
204
|
+
}
|
|
172
205
|
}
|
|
173
206
|
if withAgents {
|
|
174
207
|
trees = append(trees, Tree{PayloadPrefix: "claude/agents", TargetPrefix: ClaudeAgentsTarget})
|
|
@@ -178,6 +211,9 @@ func InstallTrees(withSkills, withAgents, withCodex, withOmp bool) []Tree {
|
|
|
178
211
|
if withOmp {
|
|
179
212
|
trees = append(trees, Tree{PayloadPrefix: "omp/agents", TargetPrefix: OmpAgentsTarget})
|
|
180
213
|
}
|
|
214
|
+
if withPi {
|
|
215
|
+
trees = append(trees, Tree{PayloadPrefix: "pi/agents", TargetPrefix: PiAgentsTarget})
|
|
216
|
+
}
|
|
181
217
|
}
|
|
182
218
|
if withSkills && withAgents {
|
|
183
219
|
trees = append(trees, Tree{PayloadPrefix: "claude/workflows", TargetPrefix: ClaudeWorkflowsTarget})
|
|
@@ -185,7 +221,7 @@ func InstallTrees(withSkills, withAgents, withCodex, withOmp bool) []Tree {
|
|
|
185
221
|
return trees
|
|
186
222
|
}
|
|
187
223
|
|
|
188
|
-
func AliasTargets(alias Alias, withCodex, withOmp bool) []string {
|
|
224
|
+
func AliasTargets(alias Alias, withCodex, withOmp, withPi bool) []string {
|
|
189
225
|
targets := []string{filepath.ToSlash(filepath.Join(ClaudeSkillsTarget, alias.Name, "SKILL.md"))}
|
|
190
226
|
if withCodex {
|
|
191
227
|
targets = append(targets, filepath.ToSlash(filepath.Join(CodexSkillsTarget, alias.Name, "SKILL.md")))
|
|
@@ -193,6 +229,9 @@ func AliasTargets(alias Alias, withCodex, withOmp bool) []string {
|
|
|
193
229
|
if withOmp {
|
|
194
230
|
targets = append(targets, filepath.ToSlash(filepath.Join(OmpSkillsTarget, alias.Name, "SKILL.md")))
|
|
195
231
|
}
|
|
232
|
+
if withPi {
|
|
233
|
+
targets = append(targets, filepath.ToSlash(filepath.Join(PiSkillsTarget, alias.Name, "SKILL.md")))
|
|
234
|
+
}
|
|
196
235
|
return targets
|
|
197
236
|
}
|
|
198
237
|
|
|
@@ -21,70 +21,86 @@ func TestValidatePayloadRequiresClaudeAndCodexFiles(t *testing.T) {
|
|
|
21
21
|
"omp/skills/rite/SKILL.md": {},
|
|
22
22
|
"omp/agents/devrites-code-reviewer.md": {},
|
|
23
23
|
"omp/.omp-plugin/plugin.json": {},
|
|
24
|
+
"pi/skills/rite/SKILL.md": {},
|
|
25
|
+
"pi/agents/devrites-code-reviewer.md": {},
|
|
26
|
+
"pi/prompts/rite.md": {},
|
|
27
|
+
"pi/AGENTS.md": {},
|
|
24
28
|
}
|
|
25
|
-
if err := ValidatePayload(payload, true, true); err != nil {
|
|
29
|
+
if err := ValidatePayload(payload, true, true, true); err != nil {
|
|
26
30
|
t.Fatal(err)
|
|
27
31
|
}
|
|
28
32
|
delete(payload, "codex/config.toml")
|
|
29
|
-
err := ValidatePayload(payload, true, true)
|
|
33
|
+
err := ValidatePayload(payload, true, true, true)
|
|
30
34
|
if err == nil || !strings.Contains(err.Error(), "missing codex/config.toml") {
|
|
31
35
|
t.Fatalf("ValidatePayload error = %v, want missing codex/config.toml", err)
|
|
32
36
|
}
|
|
33
|
-
if err := ValidatePayload(payload, false, true); err != nil {
|
|
37
|
+
if err := ValidatePayload(payload, false, true, true); err != nil {
|
|
34
38
|
t.Fatalf("claude-only payload should not require codex files: %v", err)
|
|
35
39
|
}
|
|
36
40
|
delete(payload, "omp/.omp-plugin/plugin.json")
|
|
37
|
-
err = ValidatePayload(payload, false, true)
|
|
41
|
+
err = ValidatePayload(payload, false, true, true)
|
|
38
42
|
if err == nil || !strings.Contains(err.Error(), "missing omp/.omp-plugin/plugin.json") {
|
|
39
43
|
t.Fatalf("ValidatePayload error = %v, want missing omp/.omp-plugin/plugin.json", err)
|
|
40
44
|
}
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
delete(payload, "pi/prompts/rite.md")
|
|
46
|
+
err = ValidatePayload(payload, false, false, true)
|
|
47
|
+
if err == nil || !strings.Contains(err.Error(), "missing pi/prompts") {
|
|
48
|
+
t.Fatalf("ValidatePayload error = %v, want missing pi/prompts", err)
|
|
49
|
+
}
|
|
50
|
+
if err := ValidatePayload(payload, false, false, false); err != nil {
|
|
51
|
+
t.Fatalf("claude-only payload should not require omp or pi files: %v", err)
|
|
43
52
|
}
|
|
44
53
|
}
|
|
45
54
|
|
|
46
55
|
func TestInstallTreesMapPayloadsToTargets(t *testing.T) {
|
|
47
|
-
got := InstallTrees(true, true, true, true)
|
|
56
|
+
got := InstallTrees(true, true, true, true, true)
|
|
48
57
|
want := []Tree{
|
|
49
58
|
{PayloadPrefix: "claude/skills", TargetPrefix: ".claude/skills"},
|
|
50
59
|
{PayloadPrefix: "codex/skills", TargetPrefix: ".agents/skills"},
|
|
51
60
|
{PayloadPrefix: "omp/skills", TargetPrefix: ".omp/skills"},
|
|
61
|
+
{PayloadPrefix: "pi/skills", TargetPrefix: ".pi/skills"},
|
|
62
|
+
{PayloadPrefix: "pi/prompts", TargetPrefix: ".pi/prompts"},
|
|
52
63
|
{PayloadPrefix: "claude/agents", TargetPrefix: ".claude/agents"},
|
|
53
64
|
{PayloadPrefix: "codex/agents", TargetPrefix: ".codex/agents"},
|
|
54
65
|
{PayloadPrefix: "omp/agents", TargetPrefix: ".omp/agents"},
|
|
66
|
+
{PayloadPrefix: "pi/agents", TargetPrefix: ".pi/agents"},
|
|
55
67
|
{PayloadPrefix: "claude/workflows", TargetPrefix: ".claude/workflows"},
|
|
56
68
|
}
|
|
57
69
|
if !reflect.DeepEqual(got, want) {
|
|
58
70
|
t.Fatalf("InstallTrees() = %#v, want %#v", got, want)
|
|
59
71
|
}
|
|
60
|
-
for _, trees := range [][]Tree{InstallTrees(true, false, true, true), InstallTrees(false, true, true, true)} {
|
|
72
|
+
for _, trees := range [][]Tree{InstallTrees(true, false, true, true, true), InstallTrees(false, true, true, true, true)} {
|
|
61
73
|
for _, tree := range trees {
|
|
62
74
|
if tree.PayloadPrefix == "claude/workflows" {
|
|
63
75
|
t.Fatal("Claude workflow installed without both skills and agents")
|
|
64
76
|
}
|
|
65
77
|
}
|
|
66
78
|
}
|
|
67
|
-
for _, tree := range InstallTrees(true, true, true, false) {
|
|
79
|
+
for _, tree := range InstallTrees(true, true, true, false, false) {
|
|
68
80
|
if strings.HasPrefix(tree.TargetPrefix, ".omp/") {
|
|
69
81
|
t.Fatalf("omp tree installed with withOmp=false: %#v", tree)
|
|
70
82
|
}
|
|
83
|
+
if strings.HasPrefix(tree.TargetPrefix, ".pi/") {
|
|
84
|
+
t.Fatalf("pi tree installed with withPi=false: %#v", tree)
|
|
85
|
+
}
|
|
71
86
|
}
|
|
72
87
|
}
|
|
73
88
|
|
|
74
89
|
func TestAliasTargetsIncludeOmpWhenEnabled(t *testing.T) {
|
|
75
|
-
got := AliasTargets(Alias{Name: "define"}, true, true)
|
|
90
|
+
got := AliasTargets(Alias{Name: "define"}, true, true, true)
|
|
76
91
|
want := []string{
|
|
77
92
|
".claude/skills/define/SKILL.md",
|
|
78
93
|
".agents/skills/define/SKILL.md",
|
|
79
94
|
".omp/skills/define/SKILL.md",
|
|
95
|
+
".pi/skills/define/SKILL.md",
|
|
80
96
|
}
|
|
81
97
|
if !reflect.DeepEqual(got, want) {
|
|
82
98
|
t.Fatalf("AliasTargets() = %#v, want %#v", got, want)
|
|
83
99
|
}
|
|
84
|
-
got = AliasTargets(Alias{Name: "define"}, true, false)
|
|
100
|
+
got = AliasTargets(Alias{Name: "define"}, true, false, false)
|
|
85
101
|
for _, rel := range got {
|
|
86
|
-
if strings.HasPrefix(rel, ".omp/") {
|
|
87
|
-
t.Fatalf("
|
|
102
|
+
if strings.HasPrefix(rel, ".omp/") || strings.HasPrefix(rel, ".pi/") {
|
|
103
|
+
t.Fatalf("disabled-host alias installed: %s", rel)
|
|
88
104
|
}
|
|
89
105
|
}
|
|
90
106
|
}
|