devrites 5.10.1 → 5.11.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 +13 -0
- package/README.md +24 -10
- package/bin/devrites.mjs +2 -0
- package/docs/cli.md +4 -1
- package/docs/command-map.md +7 -5
- package/docs/engine/commands.md +7 -5
- package/docs/orchestration.md +5 -2
- package/docs/skills.md +10 -4
- package/docs/usage.md +3 -1
- package/engine/commands.go +3 -0
- package/engine/help.go +190 -0
- package/engine/help_test.go +98 -0
- package/engine/internal/devritespaths/paths.go +2 -0
- package/engine/internal/hostpack/hostpack.go +39 -5
- package/engine/internal/hostpack/hostpack_test.go +27 -13
- package/engine/internal/install/apply.go +17 -4
- package/engine/internal/install/install.go +9 -2
- package/engine/internal/install/install_test.go +15 -2
- package/engine/internal/install/preflight.go +8 -2
- package/engine/internal/install/update.go +1 -1
- package/engine/internal/parallel/cli.go +90 -32
- package/engine/internal/parallel/cli_test.go +32 -0
- package/engine/main.go +15 -8
- package/engine/root_routing_test.go +4 -0
- package/install.sh +4 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +15 -8
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +10 -5
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +12 -7
- package/pack/.claude/skills/rite-build/SKILL.md +3 -1
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +4 -3
- package/pack/.claude/skills/rite-build/reference/parallel-batch.md +3 -1
- package/pack/.claude/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/README.md +4 -2
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +15 -8
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +10 -5
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +12 -7
- package/pack/generated/claude/skills/rite-build/SKILL.md +3 -1
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +4 -3
- package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +3 -1
- package/pack/generated/claude/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +15 -8
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +10 -5
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +12 -7
- package/pack/generated/codex/skills/rite-build/SKILL.md +3 -1
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +4 -3
- package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +3 -1
- package/pack/generated/codex/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/devin/AGENTS.md +23 -0
- package/pack/generated/devin/agents/devrites-code-reviewer.md +145 -0
- package/pack/generated/devin/agents/devrites-devex-reviewer.md +126 -0
- package/pack/generated/devin/agents/devrites-doubt-reviewer.md +91 -0
- package/pack/generated/devin/agents/devrites-evidence-scout.md +77 -0
- package/pack/generated/devin/agents/devrites-frontend-reviewer.md +119 -0
- package/pack/generated/devin/agents/devrites-performance-reviewer.md +117 -0
- package/pack/generated/devin/agents/devrites-plan-drafter.md +102 -0
- package/pack/generated/devin/agents/devrites-plan-reviewer.md +144 -0
- package/pack/generated/devin/agents/devrites-proof-runner.md +76 -0
- package/pack/generated/devin/agents/devrites-retrospector.md +64 -0
- package/pack/generated/devin/agents/devrites-security-auditor.md +112 -0
- package/pack/generated/devin/agents/devrites-simplifier-reviewer.md +97 -0
- package/pack/generated/devin/agents/devrites-slice-wright.md +219 -0
- package/pack/generated/devin/agents/devrites-spec-reviewer.md +99 -0
- package/pack/generated/devin/agents/devrites-strategy-reviewer.md +102 -0
- package/pack/generated/devin/agents/devrites-test-analyst.md +97 -0
- package/pack/generated/devin/agents/devrites-upgrade-planner.md +91 -0
- package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +64 -0
- package/pack/generated/devin/skills/devrites-audit/SKILL.md +51 -0
- package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +77 -0
- package/pack/generated/devin/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
- package/pack/generated/devin/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +97 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/trace.md +25 -0
- package/pack/generated/devin/skills/devrites-doubt/SKILL.md +80 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/SKILL.md +87 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/craft.md +63 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/design-references.md +116 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/fullstack.md +46 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/quality-standards.md +294 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/reuse-first.md +53 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/shape.md +56 -0
- package/pack/generated/devin/skills/devrites-interview/SKILL.md +103 -0
- package/pack/generated/devin/skills/devrites-lib/SKILL.md +57 -0
- package/pack/generated/devin/skills/devrites-lib/reference/candidate-integrity.md +42 -0
- package/pack/generated/devin/skills/devrites-lib/reference/intent-map.md +64 -0
- package/pack/generated/devin/skills/devrites-lib/reference/orchestration-profiles.md +27 -0
- package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +73 -0
- package/pack/generated/devin/skills/devrites-lib/reference/reply-contract.md +88 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/README.md +60 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +415 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +99 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/anti-patterns.md +48 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/browser-proof-checklist.md +24 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/ci-cd.md +50 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/code-review.md +108 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/coding-style.md +48 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/context-hygiene.md +109 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +167 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/data-integrity.md +118 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/debug-recovery.md +28 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/definition-of-done.md +19 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/deprecation.md +31 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/development-workflow.md +29 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/documentation.md +43 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/edge-case-trace.md +92 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/elicitation.md +85 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/error-handling.md +47 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/git-workflow.md +49 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/hooks.md +25 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/integration-reliability.md +102 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/observability.md +88 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/one-shot-actions.md +97 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/patterns.md +68 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/performance.md +51 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/principles.md +42 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/prose-style.md +123 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/release/ship-checklist.md +8 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/repository-topology.md +80 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/review-checklist.md +12 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/security-checklist.md +25 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/security.md +202 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/skill-authoring.md +209 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/spec-grammar.md +197 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/test-proof-checklist.md +13 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +212 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/tooling.md +92 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/workflow-artifacts.md +427 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/code.md +44 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/comparison.md +42 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/diagram.md +51 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/index.md +66 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/input.md +46 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/outline-template.md +106 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/plan.md +48 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/slides.md +40 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/table.md +42 -0
- package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +267 -0
- package/pack/generated/devin/skills/devrites-prose-craft/SKILL.md +74 -0
- package/pack/generated/devin/skills/devrites-prose-craft/reference/banned-phrases.md +132 -0
- package/pack/generated/devin/skills/devrites-prose-craft/reference/examples.md +131 -0
- package/pack/generated/devin/skills/devrites-prose-craft/reference/structures.md +196 -0
- package/pack/generated/devin/skills/devrites-source-driven/SKILL.md +53 -0
- package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +135 -0
- package/pack/generated/devin/skills/devrites-ux-shape/reference/brief-template.md +108 -0
- package/pack/generated/devin/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
- package/pack/generated/devin/skills/rite/SKILL.md +148 -0
- package/pack/generated/devin/skills/rite/reference/menu.md +48 -0
- package/pack/generated/devin/skills/rite-adopt/SKILL.md +51 -0
- package/pack/generated/devin/skills/rite-adopt/reference/adoption.md +19 -0
- package/pack/generated/devin/skills/rite-adopt/reference/anti-patterns.md +19 -0
- package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +142 -0
- package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +43 -0
- package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +151 -0
- package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +97 -0
- package/pack/generated/devin/skills/rite-build/SKILL.md +102 -0
- package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +148 -0
- package/pack/generated/devin/skills/rite-build/reference/anti-patterns.md +27 -0
- package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +120 -0
- package/pack/generated/devin/skills/rite-build/reference/checkpoint.md +56 -0
- package/pack/generated/devin/skills/rite-build/reference/frontend-trigger.md +39 -0
- package/pack/generated/devin/skills/rite-build/reference/one-slice-cycle.md +51 -0
- package/pack/generated/devin/skills/rite-build/reference/output.md +33 -0
- package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +214 -0
- package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +89 -0
- package/pack/generated/devin/skills/rite-build/reference/spec-drift-guard.md +84 -0
- package/pack/generated/devin/skills/rite-build/reference/tdd.md +27 -0
- package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +96 -0
- package/pack/generated/devin/skills/rite-clarify/SKILL.md +98 -0
- package/pack/generated/devin/skills/rite-clarify/reference/anti-patterns.md +24 -0
- package/pack/generated/devin/skills/rite-clarify/reference/decision-coverage.md +55 -0
- package/pack/generated/devin/skills/rite-converge/SKILL.md +144 -0
- package/pack/generated/devin/skills/rite-converge/reference/anti-patterns.md +35 -0
- package/pack/generated/devin/skills/rite-converge/reference/convergence-assessment.md +65 -0
- package/pack/generated/devin/skills/rite-customize/SKILL.md +60 -0
- package/pack/generated/devin/skills/rite-define/SKILL.md +168 -0
- package/pack/generated/devin/skills/rite-define/reference/anti-patterns.md +26 -0
- package/pack/generated/devin/skills/rite-define/reference/gates.md +159 -0
- package/pack/generated/devin/skills/rite-define/reference/plan-template.md +149 -0
- package/pack/generated/devin/skills/rite-doctor/SKILL.md +68 -0
- package/pack/generated/devin/skills/rite-dogfood/SKILL.md +55 -0
- package/pack/generated/devin/skills/rite-explain/SKILL.md +152 -0
- package/pack/generated/devin/skills/rite-explain/reference/intake.md +89 -0
- package/pack/generated/devin/skills/rite-frame/SKILL.md +114 -0
- package/pack/generated/devin/skills/rite-frame/reference/failure-modes.md +66 -0
- package/pack/generated/devin/skills/rite-handoff/SKILL.md +97 -0
- package/pack/generated/devin/skills/rite-handoff/reference/handoff-template.md +44 -0
- package/pack/generated/devin/skills/rite-learn/SKILL.md +72 -0
- package/pack/generated/devin/skills/rite-plan/SKILL.md +185 -0
- package/pack/generated/devin/skills/rite-plan/reference/anti-patterns.md +34 -0
- package/pack/generated/devin/skills/rite-plan/reference/dependency-graph.md +48 -0
- package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +105 -0
- package/pack/generated/devin/skills/rite-plan/reference/slicing.md +168 -0
- package/pack/generated/devin/skills/rite-plan/reference/task-breakdown.md +42 -0
- package/pack/generated/devin/skills/rite-polish/SKILL.md +105 -0
- package/pack/generated/devin/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/generated/devin/skills/rite-polish/reference/anti-ai-slop.md +187 -0
- package/pack/generated/devin/skills/rite-polish/reference/anti-patterns.md +30 -0
- package/pack/generated/devin/skills/rite-polish/reference/backend-polish.md +80 -0
- package/pack/generated/devin/skills/rite-polish/reference/browser-polish-evidence.md +33 -0
- package/pack/generated/devin/skills/rite-polish/reference/code.md +82 -0
- package/pack/generated/devin/skills/rite-polish/reference/design-memory.md +117 -0
- package/pack/generated/devin/skills/rite-polish/reference/design-system-discovery.md +8 -0
- package/pack/generated/devin/skills/rite-polish/reference/harden-checklist.md +109 -0
- package/pack/generated/devin/skills/rite-polish/reference/ledger.md +65 -0
- package/pack/generated/devin/skills/rite-polish/reference/ui.md +137 -0
- package/pack/generated/devin/skills/rite-pov/SKILL.md +57 -0
- package/pack/generated/devin/skills/rite-pr-feedback/SKILL.md +54 -0
- package/pack/generated/devin/skills/rite-pressure-test/SKILL.md +66 -0
- package/pack/generated/devin/skills/rite-prototype/SKILL.md +104 -0
- package/pack/generated/devin/skills/rite-prove/SKILL.md +122 -0
- package/pack/generated/devin/skills/rite-prove/reference/acceptance-proof.md +88 -0
- package/pack/generated/devin/skills/rite-prove/reference/anti-patterns.md +25 -0
- package/pack/generated/devin/skills/rite-prove/reference/browser-proof.md +51 -0
- package/pack/generated/devin/skills/rite-prove/reference/failure-triage.md +43 -0
- package/pack/generated/devin/skills/rite-prove/reference/proof-ladder.md +28 -0
- package/pack/generated/devin/skills/rite-prove/reference/test-command-discovery.md +30 -0
- package/pack/generated/devin/skills/rite-quick/SKILL.md +81 -0
- package/pack/generated/devin/skills/rite-resolve/SKILL.md +98 -0
- package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +118 -0
- package/pack/generated/devin/skills/rite-review/SKILL.md +171 -0
- package/pack/generated/devin/skills/rite-review/reference/anti-patterns.md +32 -0
- package/pack/generated/devin/skills/rite-review/reference/cognitive-load.md +90 -0
- package/pack/generated/devin/skills/rite-review/reference/feature-scoped-review.md +26 -0
- package/pack/generated/devin/skills/rite-review/reference/five-axis-review.md +66 -0
- package/pack/generated/devin/skills/rite-review/reference/nielsen-heuristics.md +126 -0
- package/pack/generated/devin/skills/rite-review/reference/performance-checklist.md +80 -0
- package/pack/generated/devin/skills/rite-review/reference/performance-review.md +14 -0
- package/pack/generated/devin/skills/rite-review/reference/security-review.md +42 -0
- package/pack/generated/devin/skills/rite-seal/SKILL.md +74 -0
- package/pack/generated/devin/skills/rite-seal/reference/anti-patterns.md +29 -0
- package/pack/generated/devin/skills/rite-seal/reference/final-evidence.md +41 -0
- package/pack/generated/devin/skills/rite-seal/reference/go-no-go.md +29 -0
- package/pack/generated/devin/skills/rite-seal/reference/output.md +5 -0
- package/pack/generated/devin/skills/rite-seal/reference/phase-contract.md +47 -0
- package/pack/generated/devin/skills/rite-seal/reference/risk-and-rollback.md +56 -0
- package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +27 -0
- package/pack/generated/devin/skills/rite-ship/SKILL.md +87 -0
- package/pack/generated/devin/skills/rite-ship/reference/anti-patterns.md +28 -0
- package/pack/generated/devin/skills/rite-ship/reference/close-out.md +68 -0
- package/pack/generated/devin/skills/rite-ship/reference/git-ship.md +120 -0
- package/pack/generated/devin/skills/rite-ship/reference/rollout.md +62 -0
- package/pack/generated/devin/skills/rite-ship/reference/ship-template.md +39 -0
- package/pack/generated/devin/skills/rite-spec/SKILL.md +149 -0
- package/pack/generated/devin/skills/rite-spec/reference/acceptance-criteria.md +31 -0
- package/pack/generated/devin/skills/rite-spec/reference/ai-spec-template.md +40 -0
- package/pack/generated/devin/skills/rite-spec/reference/anti-patterns.md +27 -0
- package/pack/generated/devin/skills/rite-spec/reference/interview-patterns.md +56 -0
- package/pack/generated/devin/skills/rite-spec/reference/investigation.md +83 -0
- package/pack/generated/devin/skills/rite-spec/reference/question-protocol.md +36 -0
- package/pack/generated/devin/skills/rite-spec/reference/references-intake.md +62 -0
- package/pack/generated/devin/skills/rite-spec/reference/spec-checklists.md +89 -0
- package/pack/generated/devin/skills/rite-spec/reference/spec-template.md +154 -0
- package/pack/generated/devin/skills/rite-spec/reference/state-workspace.md +227 -0
- package/pack/generated/devin/skills/rite-status/SKILL.md +57 -0
- package/pack/generated/devin/skills/rite-temper/SKILL.md +129 -0
- package/pack/generated/devin/skills/rite-temper/reference/anti-patterns.md +30 -0
- package/pack/generated/devin/skills/rite-temper/reference/review-dimensions.md +66 -0
- package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +53 -0
- package/pack/generated/devin/skills/rite-temper/reference/significance.md +46 -0
- package/pack/generated/devin/skills/rite-temper/reference/strategy-template.md +90 -0
- package/pack/generated/devin/skills/rite-upgrade/SKILL.md +121 -0
- package/pack/generated/devin/skills/rite-vet/SKILL.md +192 -0
- package/pack/generated/devin/skills/rite-vet/reference/anti-patterns.md +43 -0
- package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +202 -0
- package/pack/generated/devin/skills/rite-vet/reference/cross-model.md +19 -0
- package/pack/generated/devin/skills/rite-vet/reference/depth.md +59 -0
- package/pack/generated/devin/skills/rite-vet/reference/eng-lenses.md +48 -0
- package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +201 -0
- package/pack/generated/devin/skills/rite-watch-pr/SKILL.md +84 -0
- package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +69 -0
- package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +15 -8
- package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +10 -5
- package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +12 -7
- package/pack/generated/omp/skills/rite-build/SKILL.md +3 -1
- package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +4 -3
- package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +3 -1
- package/pack/generated/omp/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +15 -8
- package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +10 -5
- package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +12 -7
- package/pack/generated/pi/skills/rite-build/SKILL.md +3 -1
- package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +4 -3
- package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +3 -1
- package/pack/generated/pi/skills/rite-define/reference/plan-template.md +1 -1
- package/package.json +4 -2
- package/scripts/build-host-artifacts.sh +48 -5
- package/scripts/devin-generate.sh +222 -0
- package/update.sh +2 -1
|
@@ -37,13 +37,13 @@ func runPathDisjoint(args []string, stdin io.Reader, stdout, stderr io.Writer) i
|
|
|
37
37
|
switch args[i] {
|
|
38
38
|
case "--root":
|
|
39
39
|
if i+1 >= len(args) {
|
|
40
|
-
fmt.Fprintln(stderr,
|
|
40
|
+
fmt.Fprintln(stderr, usagePathDisjoint)
|
|
41
41
|
return ExitUsage
|
|
42
42
|
}
|
|
43
43
|
i++
|
|
44
44
|
root = args[i]
|
|
45
|
-
case "-h", "--help":
|
|
46
|
-
fmt.Fprintln(stdout,
|
|
45
|
+
case "-h", "-help", "--help":
|
|
46
|
+
fmt.Fprintln(stdout, usagePathDisjoint)
|
|
47
47
|
return ExitOK
|
|
48
48
|
default:
|
|
49
49
|
if args[i] != "-" && strings.HasPrefix(args[i], "-") {
|
|
@@ -73,7 +73,6 @@ func runPathDisjoint(args []string, stdin io.Reader, stdout, stderr io.Writer) i
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
func cmdSelect(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
76
|
-
const usage = "usage: parallel select --cap <1-10> [--root <dir>] [<json-file>|-]"
|
|
77
76
|
root := ""
|
|
78
77
|
jsonPath := "-"
|
|
79
78
|
capN := 0
|
|
@@ -82,14 +81,14 @@ func cmdSelect(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
82
81
|
switch args[i] {
|
|
83
82
|
case "--root":
|
|
84
83
|
if i+1 >= len(args) {
|
|
85
|
-
fmt.Fprintln(stderr,
|
|
84
|
+
fmt.Fprintln(stderr, usageSelect)
|
|
86
85
|
return ExitUsage
|
|
87
86
|
}
|
|
88
87
|
i++
|
|
89
88
|
root = args[i]
|
|
90
89
|
case "--cap":
|
|
91
90
|
if i+1 >= len(args) {
|
|
92
|
-
fmt.Fprintln(stderr,
|
|
91
|
+
fmt.Fprintln(stderr, usageSelect)
|
|
93
92
|
return ExitUsage
|
|
94
93
|
}
|
|
95
94
|
i++
|
|
@@ -100,8 +99,8 @@ func cmdSelect(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
100
99
|
}
|
|
101
100
|
capN = n
|
|
102
101
|
sawCap = true
|
|
103
|
-
case "-h", "--help":
|
|
104
|
-
fmt.Fprintln(stdout,
|
|
102
|
+
case "-h", "-help", "--help":
|
|
103
|
+
fmt.Fprintln(stdout, usageSelect)
|
|
105
104
|
return ExitOK
|
|
106
105
|
default:
|
|
107
106
|
if args[i] != "-" && strings.HasPrefix(args[i], "-") {
|
|
@@ -112,7 +111,7 @@ func cmdSelect(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
112
111
|
}
|
|
113
112
|
}
|
|
114
113
|
if !sawCap {
|
|
115
|
-
fmt.Fprintln(stderr,
|
|
114
|
+
fmt.Fprintln(stderr, usageSelect)
|
|
116
115
|
return ExitUsage
|
|
117
116
|
}
|
|
118
117
|
data, err := readJSONInput(jsonPath, stdin)
|
|
@@ -166,7 +165,7 @@ func runParallel(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
166
165
|
return runPathDisjoint(rest, stdin, stdout, stderr)
|
|
167
166
|
case "select":
|
|
168
167
|
return cmdSelect(rest, stdin, stdout, stderr)
|
|
169
|
-
case "-h", "--help", "help":
|
|
168
|
+
case "-h", "-help", "--help", "help":
|
|
170
169
|
fmt.Fprintln(stdout, parallelUsage())
|
|
171
170
|
return ExitOK
|
|
172
171
|
default:
|
|
@@ -175,6 +174,20 @@ func runParallel(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
175
174
|
}
|
|
176
175
|
}
|
|
177
176
|
|
|
177
|
+
const (
|
|
178
|
+
usageCreate = "usage: parallel create --root --slug --batch --base --json"
|
|
179
|
+
usageRecordGreen = "usage: parallel record-green --root --slug --slice --commit"
|
|
180
|
+
usageAbort = "usage: parallel abort --root --slug"
|
|
181
|
+
usageIntegrate = "usage: parallel integrate --root --slug [--apply-to-control]"
|
|
182
|
+
usageCleanup = "usage: parallel cleanup --root --slug [--force]"
|
|
183
|
+
usageStatus = "usage: parallel status --root --slug"
|
|
184
|
+
usageLeaseWrite = "usage: parallel lease-write --root --slug --json"
|
|
185
|
+
usageLeaseRead = "usage: parallel lease-read --root --slug [--field name]"
|
|
186
|
+
usageLeaseClear = "usage: parallel lease-clear --root --slug"
|
|
187
|
+
usagePathDisjoint = "usage: check path-disjoint [--root <dir>] [<json-file>|-]"
|
|
188
|
+
usageSelect = "usage: parallel select --cap <1-10> [--root <dir>] [<json-file>|-]"
|
|
189
|
+
)
|
|
190
|
+
|
|
178
191
|
func parallelUsage() string {
|
|
179
192
|
return strings.TrimSpace(`usage: parallel <subcommand> [options]
|
|
180
193
|
|
|
@@ -194,9 +207,40 @@ Subcommands:
|
|
|
194
207
|
Exit codes: 0 ok, 2 usage, 3 blocked`)
|
|
195
208
|
}
|
|
196
209
|
|
|
210
|
+
// CommandUsage is the usage text for `parallel <name>`. An empty or unknown
|
|
211
|
+
// name returns the family usage.
|
|
212
|
+
func CommandUsage(name string) string {
|
|
213
|
+
switch name {
|
|
214
|
+
case "create":
|
|
215
|
+
return usageCreate
|
|
216
|
+
case "record-green":
|
|
217
|
+
return usageRecordGreen
|
|
218
|
+
case "abort":
|
|
219
|
+
return usageAbort
|
|
220
|
+
case "integrate":
|
|
221
|
+
return usageIntegrate
|
|
222
|
+
case "cleanup":
|
|
223
|
+
return usageCleanup
|
|
224
|
+
case "status":
|
|
225
|
+
return usageStatus
|
|
226
|
+
case "lease-write", "write-lease":
|
|
227
|
+
return usageLeaseWrite
|
|
228
|
+
case "lease-read", "read-lease":
|
|
229
|
+
return usageLeaseRead
|
|
230
|
+
case "lease-clear", "clear-lease":
|
|
231
|
+
return usageLeaseClear
|
|
232
|
+
case "check-disjoint", "path-disjoint":
|
|
233
|
+
return usagePathDisjoint
|
|
234
|
+
case "select":
|
|
235
|
+
return usageSelect
|
|
236
|
+
default:
|
|
237
|
+
return parallelUsage()
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
197
241
|
type flagSet struct {
|
|
198
242
|
Root, Slug, Batch, Base, Slice, Commit, JSON, Field, Session string
|
|
199
|
-
ApplyToControl, Force
|
|
243
|
+
ApplyToControl, Force, Help bool
|
|
200
244
|
}
|
|
201
245
|
|
|
202
246
|
func parseFlags(args []string, stderr io.Writer) (flagSet, []string, int) {
|
|
@@ -271,6 +315,8 @@ func parseFlags(args []string, stderr io.Writer) (flagSet, []string, int) {
|
|
|
271
315
|
f.ApplyToControl = true
|
|
272
316
|
case "--force":
|
|
273
317
|
f.Force = true
|
|
318
|
+
case "-h", "-help", "--help":
|
|
319
|
+
f.Help = true
|
|
274
320
|
default:
|
|
275
321
|
// No parallel subcommand takes positional args; anything
|
|
276
322
|
// unrecognized (typo'd flag, stray word) is a usage error, not
|
|
@@ -283,6 +329,18 @@ func parseFlags(args []string, stderr io.Writer) (flagSet, []string, int) {
|
|
|
283
329
|
return f, nil, ExitOK
|
|
284
330
|
}
|
|
285
331
|
|
|
332
|
+
func parseFlagsOrHelp(args []string, stdout, stderr io.Writer, usage string) (flagSet, int, bool) {
|
|
333
|
+
f, _, code := parseFlags(args, stderr)
|
|
334
|
+
if code != ExitOK {
|
|
335
|
+
return f, code, true
|
|
336
|
+
}
|
|
337
|
+
if f.Help {
|
|
338
|
+
fmt.Fprintln(stdout, usage)
|
|
339
|
+
return f, ExitOK, true
|
|
340
|
+
}
|
|
341
|
+
return f, ExitOK, false
|
|
342
|
+
}
|
|
343
|
+
|
|
286
344
|
func requireRootSlug(f flagSet, stderr io.Writer) int {
|
|
287
345
|
if f.Root == "" || f.Slug == "" {
|
|
288
346
|
fmt.Fprintln(stderr, "parallel: --root and --slug are required")
|
|
@@ -303,8 +361,8 @@ func readJSONInput(path string, stdin io.Reader) ([]byte, error) {
|
|
|
303
361
|
}
|
|
304
362
|
|
|
305
363
|
func cmdCreate(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
306
|
-
f,
|
|
307
|
-
if
|
|
364
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageCreate)
|
|
365
|
+
if done {
|
|
308
366
|
return code
|
|
309
367
|
}
|
|
310
368
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
@@ -314,7 +372,7 @@ func cmdCreate(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
314
372
|
return code
|
|
315
373
|
}
|
|
316
374
|
if f.Batch == "" || f.Base == "" || f.JSON == "" {
|
|
317
|
-
fmt.Fprintln(stderr,
|
|
375
|
+
fmt.Fprintln(stderr, usageCreate)
|
|
318
376
|
return ExitUsage
|
|
319
377
|
}
|
|
320
378
|
data, err := readJSONInput(f.JSON, stdin)
|
|
@@ -359,8 +417,8 @@ func rejectUnsupportedFlags(f flagSet, stderr io.Writer, force, applyToControl b
|
|
|
359
417
|
}
|
|
360
418
|
|
|
361
419
|
func cmdRecordGreen(args []string, stdout, stderr io.Writer) int {
|
|
362
|
-
f,
|
|
363
|
-
if
|
|
420
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageRecordGreen)
|
|
421
|
+
if done {
|
|
364
422
|
return code
|
|
365
423
|
}
|
|
366
424
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
@@ -370,7 +428,7 @@ func cmdRecordGreen(args []string, stdout, stderr io.Writer) int {
|
|
|
370
428
|
return code
|
|
371
429
|
}
|
|
372
430
|
if f.Slice == "" || f.Commit == "" {
|
|
373
|
-
fmt.Fprintln(stderr,
|
|
431
|
+
fmt.Fprintln(stderr, usageRecordGreen)
|
|
374
432
|
return ExitUsage
|
|
375
433
|
}
|
|
376
434
|
lease, err := RecordGreen(f.Root, f.Slug, f.Slice, f.Commit)
|
|
@@ -383,8 +441,8 @@ func cmdRecordGreen(args []string, stdout, stderr io.Writer) int {
|
|
|
383
441
|
}
|
|
384
442
|
|
|
385
443
|
func cmdAbort(args []string, stdout, stderr io.Writer) int {
|
|
386
|
-
f,
|
|
387
|
-
if
|
|
444
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageAbort)
|
|
445
|
+
if done {
|
|
388
446
|
return code
|
|
389
447
|
}
|
|
390
448
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
@@ -403,8 +461,8 @@ func cmdAbort(args []string, stdout, stderr io.Writer) int {
|
|
|
403
461
|
}
|
|
404
462
|
|
|
405
463
|
func cmdIntegrate(args []string, stdout, stderr io.Writer) int {
|
|
406
|
-
f,
|
|
407
|
-
if
|
|
464
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageIntegrate)
|
|
465
|
+
if done {
|
|
408
466
|
return code
|
|
409
467
|
}
|
|
410
468
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
@@ -427,8 +485,8 @@ func cmdIntegrate(args []string, stdout, stderr io.Writer) int {
|
|
|
427
485
|
}
|
|
428
486
|
|
|
429
487
|
func cmdCleanup(args []string, stdout, stderr io.Writer) int {
|
|
430
|
-
f,
|
|
431
|
-
if
|
|
488
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageCleanup)
|
|
489
|
+
if done {
|
|
432
490
|
return code
|
|
433
491
|
}
|
|
434
492
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
@@ -454,8 +512,8 @@ func cmdCleanup(args []string, stdout, stderr io.Writer) int {
|
|
|
454
512
|
}
|
|
455
513
|
|
|
456
514
|
func cmdStatus(args []string, stdout, stderr io.Writer) int {
|
|
457
|
-
f,
|
|
458
|
-
if
|
|
515
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageStatus)
|
|
516
|
+
if done {
|
|
459
517
|
return code
|
|
460
518
|
}
|
|
461
519
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
@@ -474,15 +532,15 @@ func cmdStatus(args []string, stdout, stderr io.Writer) int {
|
|
|
474
532
|
}
|
|
475
533
|
|
|
476
534
|
func cmdLeaseWrite(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
477
|
-
f,
|
|
478
|
-
if
|
|
535
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageLeaseWrite)
|
|
536
|
+
if done {
|
|
479
537
|
return code
|
|
480
538
|
}
|
|
481
539
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
482
540
|
return code
|
|
483
541
|
}
|
|
484
542
|
if f.JSON == "" {
|
|
485
|
-
fmt.Fprintln(stderr,
|
|
543
|
+
fmt.Fprintln(stderr, usageLeaseWrite)
|
|
486
544
|
return ExitUsage
|
|
487
545
|
}
|
|
488
546
|
data, err := readJSONInput(f.JSON, stdin)
|
|
@@ -516,8 +574,8 @@ func cmdLeaseWrite(args []string, stdin io.Reader, stdout, stderr io.Writer) int
|
|
|
516
574
|
}
|
|
517
575
|
|
|
518
576
|
func cmdLeaseRead(args []string, stdout, stderr io.Writer) int {
|
|
519
|
-
f,
|
|
520
|
-
if
|
|
577
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageLeaseRead)
|
|
578
|
+
if done {
|
|
521
579
|
return code
|
|
522
580
|
}
|
|
523
581
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
@@ -567,8 +625,8 @@ func cmdLeaseRead(args []string, stdout, stderr io.Writer) int {
|
|
|
567
625
|
}
|
|
568
626
|
|
|
569
627
|
func cmdLeaseClear(args []string, stdout, stderr io.Writer) int {
|
|
570
|
-
f,
|
|
571
|
-
if
|
|
628
|
+
f, code, done := parseFlagsOrHelp(args, stdout, stderr, usageLeaseClear)
|
|
629
|
+
if done {
|
|
572
630
|
return code
|
|
573
631
|
}
|
|
574
632
|
if code := requireRootSlug(f, stderr); code != ExitOK {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
package parallel
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"bytes"
|
|
5
|
+
"strings"
|
|
6
|
+
"testing"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
func TestParallelCreateHelp(t *testing.T) {
|
|
10
|
+
var stdout, stderr bytes.Buffer
|
|
11
|
+
code := Run("parallel", []string{"create", "--help"}, strings.NewReader(""), &stdout, &stderr)
|
|
12
|
+
if code != ExitOK {
|
|
13
|
+
t.Fatalf("code=%d stderr=%q", code, stderr.String())
|
|
14
|
+
}
|
|
15
|
+
if stderr.Len() != 0 {
|
|
16
|
+
t.Fatalf("stderr=%q", stderr.String())
|
|
17
|
+
}
|
|
18
|
+
if got := stdout.String(); !strings.Contains(got, usageCreate) {
|
|
19
|
+
t.Fatalf("stdout=%q, want %q", got, usageCreate)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func TestParallelCreateUnknownArgumentStillErrors(t *testing.T) {
|
|
24
|
+
var stdout, stderr bytes.Buffer
|
|
25
|
+
code := Run("parallel", []string{"create", "--nope"}, strings.NewReader(""), &stdout, &stderr)
|
|
26
|
+
if code != ExitUsage {
|
|
27
|
+
t.Fatalf("code=%d, want %d", code, ExitUsage)
|
|
28
|
+
}
|
|
29
|
+
if !strings.Contains(stderr.String(), `unknown argument "--nope"`) {
|
|
30
|
+
t.Fatalf("stderr=%q", stderr.String())
|
|
31
|
+
}
|
|
32
|
+
}
|
package/engine/main.go
CHANGED
|
@@ -71,6 +71,9 @@ func run(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
71
71
|
fmt.Fprint(stderr, usage)
|
|
72
72
|
return exitUsage
|
|
73
73
|
}
|
|
74
|
+
if text, ok := commandHelp(args); ok {
|
|
75
|
+
return writeHelp(stdout, text)
|
|
76
|
+
}
|
|
74
77
|
root, rootExit, err := resolveRootFor(args[0], args[1:])
|
|
75
78
|
if err != nil {
|
|
76
79
|
fmt.Fprintf(stderr, "devrites: root selection: %v\n", err)
|
|
@@ -113,7 +116,7 @@ func run(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
113
116
|
|
|
114
117
|
func cmdCheck(root string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
115
118
|
if len(args) == 0 {
|
|
116
|
-
fmt.
|
|
119
|
+
fmt.Fprint(stderr, checkUsage)
|
|
117
120
|
return exitUsage
|
|
118
121
|
}
|
|
119
122
|
sub, rest := args[0], args[1:]
|
|
@@ -138,7 +141,7 @@ func cmdCheck(root string, args []string, stdin io.Reader, stdout, stderr io.Wri
|
|
|
138
141
|
|
|
139
142
|
func cmdCandidate(root string, args []string, stdout, stderr io.Writer) int {
|
|
140
143
|
if len(args) != 1 {
|
|
141
|
-
fmt.Fprintln(stderr,
|
|
144
|
+
fmt.Fprintln(stderr, candidateUsage)
|
|
142
145
|
return exitUsage
|
|
143
146
|
}
|
|
144
147
|
digest, files, err := lib.CandidateIdentity(root, args[0])
|
|
@@ -156,7 +159,7 @@ func cmdCandidate(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
156
159
|
|
|
157
160
|
func cmdState(root string, args []string, stdout, stderr io.Writer) int {
|
|
158
161
|
if len(args) == 0 {
|
|
159
|
-
fmt.
|
|
162
|
+
fmt.Fprint(stderr, stateUsage)
|
|
160
163
|
return exitUsage
|
|
161
164
|
}
|
|
162
165
|
switch args[0] {
|
|
@@ -178,7 +181,11 @@ func cmdState(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
178
181
|
func cmdGate(root string, kind gate.Kind, args []string, stdout, stderr io.Writer) int {
|
|
179
182
|
emitBinding := kind == gate.Readiness && len(args) == 2 && args[0] == "--emit-binding"
|
|
180
183
|
if !emitBinding && len(args) != 1 {
|
|
181
|
-
|
|
184
|
+
if kind == gate.Readiness {
|
|
185
|
+
fmt.Fprintln(stderr, readinessUsage)
|
|
186
|
+
} else {
|
|
187
|
+
fmt.Fprintln(stderr, sealUsage)
|
|
188
|
+
}
|
|
182
189
|
return exitUsage
|
|
183
190
|
}
|
|
184
191
|
if emitBinding {
|
|
@@ -219,7 +226,7 @@ func cmdGate(root string, kind gate.Kind, args []string, stdout, stderr io.Write
|
|
|
219
226
|
|
|
220
227
|
func cmdTaskGraph(root string, args []string, stdout, stderr io.Writer) int {
|
|
221
228
|
if len(args) != 1 {
|
|
222
|
-
fmt.Fprintln(stderr,
|
|
229
|
+
fmt.Fprintln(stderr, taskGraphUsage)
|
|
223
230
|
return exitUsage
|
|
224
231
|
}
|
|
225
232
|
return lib.RunTaskGraphCheck(root, args[0], stdout, stderr)
|
|
@@ -227,7 +234,7 @@ func cmdTaskGraph(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
227
234
|
|
|
228
235
|
func cmdSkillTrust(args []string, stdout, stderr io.Writer) int {
|
|
229
236
|
if len(args) != 1 {
|
|
230
|
-
fmt.Fprintln(stderr,
|
|
237
|
+
fmt.Fprintln(stderr, skillTrustUsage)
|
|
231
238
|
return exitUsage
|
|
232
239
|
}
|
|
233
240
|
return lib.RunSkillTrustCheck(args[0], stdout, stderr)
|
|
@@ -235,7 +242,7 @@ func cmdSkillTrust(args []string, stdout, stderr io.Writer) int {
|
|
|
235
242
|
|
|
236
243
|
func cmdObserve(root string, args []string, stdout, stderr io.Writer) int {
|
|
237
244
|
if len(args) == 0 {
|
|
238
|
-
fmt.
|
|
245
|
+
fmt.Fprint(stderr, observeUsage)
|
|
239
246
|
return exitUsage
|
|
240
247
|
}
|
|
241
248
|
switch args[0] {
|
|
@@ -251,7 +258,7 @@ func cmdObserve(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
251
258
|
return lib.RunObserveSummary(root, slug, stdout, stderr)
|
|
252
259
|
case "slice":
|
|
253
260
|
if len(args) != 3 {
|
|
254
|
-
fmt.Fprintln(stderr,
|
|
261
|
+
fmt.Fprintln(stderr, observeSliceUsage)
|
|
255
262
|
return exitUsage
|
|
256
263
|
}
|
|
257
264
|
return lib.RunObserveSlice(root, args[1], args[2], stdout, stderr)
|
|
@@ -25,6 +25,10 @@ func TestRootModeForCoversReadAndWriteSurfaces(t *testing.T) {
|
|
|
25
25
|
{name: "observe summary", command: "observe", args: []string{"summary"}, want: rootStrictUsage},
|
|
26
26
|
{name: "observe slice", command: "observe", args: []string{"slice"}, want: rootStrictUsage},
|
|
27
27
|
{name: "orient", command: "orient", want: rootStrictUsage},
|
|
28
|
+
{name: "orient help", command: "orient", args: []string{"--help"}, want: rootUnused},
|
|
29
|
+
{name: "check candidate help", command: "check", args: []string{"candidate", "--help"}, want: rootUnused},
|
|
30
|
+
{name: "state help flag", command: "state", args: []string{"--help"}, want: rootUnused},
|
|
31
|
+
{name: "migrate help", command: "migrate", args: []string{"--help"}, want: rootUnused},
|
|
28
32
|
{name: "check indexes", command: "check", args: []string{"indexes"}, want: rootLenient},
|
|
29
33
|
{name: "resolve", command: "state", args: []string{"resolve"}, want: rootStrict},
|
|
30
34
|
{name: "close", command: "state", args: []string{"close"}, want: rootStrict},
|
package/install.sh
CHANGED
|
@@ -307,10 +307,13 @@ PAYLOAD="${DEVRITES_HOST_ARTIFACT_DIR:-$SELF_DIR/pack/generated}"
|
|
|
307
307
|
if [ ! -d "$PAYLOAD/claude/skills" ] || [ ! -d "$PAYLOAD/codex/skills" ] ||
|
|
308
308
|
[ ! -d "$PAYLOAD/pi/skills" ] || [ ! -d "$PAYLOAD/pi/agents" ] ||
|
|
309
309
|
[ ! -d "$PAYLOAD/pi/prompts" ] ||
|
|
310
|
+
[ ! -d "$PAYLOAD/devin/skills" ] || [ ! -d "$PAYLOAD/devin/agents" ] ||
|
|
310
311
|
[ ! -f "$PAYLOAD/claude/skills/devrites-lib/reference/standards/agents.md" ] ||
|
|
311
312
|
[ ! -f "$PAYLOAD/codex/skills/devrites-lib/reference/standards/agents.md" ] ||
|
|
312
313
|
[ ! -f "$PAYLOAD/pi/skills/devrites-lib/reference/standards/agents.md" ] ||
|
|
313
|
-
[ ! -f "$PAYLOAD/
|
|
314
|
+
[ ! -f "$PAYLOAD/devin/skills/devrites-lib/reference/standards/agents.md" ] ||
|
|
315
|
+
[ ! -f "$PAYLOAD/codex/config.toml" ] || [ ! -f "$PAYLOAD/pi/AGENTS.md" ] ||
|
|
316
|
+
[ ! -f "$PAYLOAD/devin/AGENTS.md" ]; then
|
|
314
317
|
BUILDER="$SELF_DIR/scripts/build-host-artifacts.sh"
|
|
315
318
|
[ -f "$BUILDER" ] || {
|
|
316
319
|
echo "error: generated install payload missing at $PAYLOAD and builder missing at $BUILDER" >&2
|
|
@@ -56,14 +56,14 @@ max_minutes: 120 # wall-clock minutes in one host activation
|
|
|
56
56
|
max_review_queue: 8 # unresolved review/gate items admitted before fan-out stops
|
|
57
57
|
# max_tokens: 200000 # optional stricter host-observed token cap
|
|
58
58
|
# max_cost_usd: 10 # optional stricter host-observed cost cap
|
|
59
|
-
notify: "ntfy.sh/my-topic" # shell command; examples: rite-build/reference/afk-discipline.md
|
|
59
|
+
notify: "ntfy.sh/my-topic" # shell command; examples: .claude/skills/rite-build/reference/afk-discipline.md
|
|
60
60
|
allow_gates: [advisory, validating] # gate severities AFK auto-handles (auto-picks the recommended option)
|
|
61
61
|
continue_sequence: true # after Seal GO, open the next recorded continuation
|
|
62
62
|
max_workspaces: 5 # workspaces one armed sequence may open
|
|
63
|
-
max_parallel: 10 # cap on
|
|
63
|
+
max_parallel: 10 # unattended default cap; `--parallel N` on this invocation wins and may rewrite only this field
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
The file is **read-only config**: never rewritten in place
|
|
66
|
+
The file is **read-only config**: never rewritten in place, except `/rite-autocomplete --parallel N` writes or replaces only `max_parallel: N`. `max_slices` is the initial
|
|
67
67
|
budget; the mutable remaining count is the `state.md` cursor
|
|
68
68
|
`afk_slices_remaining` (`AFK slices remaining: <n>` in the released bullet
|
|
69
69
|
form), owned by the controlling root. Recognize either spelling and preserve
|
|
@@ -119,11 +119,18 @@ candidate manifest to cover the whole recorded chain — run
|
|
|
119
119
|
- Every human-owned, safety, access, exhaustion, and `NO-GO` condition still stops the
|
|
120
120
|
run exactly as without this field.
|
|
121
121
|
|
|
122
|
-
`max_parallel`
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
122
|
+
`max_parallel` is the unattended default batch cap only when this invocation does
|
|
123
|
+
not contain `--parallel N`; `1` forces the serial cycle only in that default
|
|
124
|
+
case. An exact `--parallel N` on `/rite-autocomplete` or `/rite-build` is the
|
|
125
|
+
batch cap for this run: do not consult leftover sentinel `max_parallel`, and do
|
|
126
|
+
not treat `max_parallel: 1` as serial. `/rite-autocomplete --parallel N` writes
|
|
127
|
+
or replaces only that field so later ticks keep the cap; `/rite-build --parallel N`
|
|
128
|
+
wins for that invocation without rewriting the sentinel. Never write `max_slices`
|
|
129
|
+
from `--max-slices`. **Failing case:** `/rite-autocomplete --parallel 5` honors a
|
|
130
|
+
leftover `max_parallel: 1` and stays serial.
|
|
131
|
+
Unattended runs take the largest eligible set ≤ that cap and recompute after
|
|
132
|
+
every completed round (serial slice or parallel integrate)
|
|
133
|
+
([parallel-batch.md § Dynamic selection and re-batching](../../../rite-build/reference/parallel-batch.md#dynamic-selection-and-re-batching)).
|
|
127
134
|
|
|
128
135
|
## Unattended resource envelope
|
|
129
136
|
|
|
@@ -87,18 +87,23 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
87
87
|
3. **Arm AFK once.** Apply the loop's
|
|
88
88
|
[one-write AFK contract](reference/loop.md#arm-afk-once): preserve valid
|
|
89
89
|
existing bytes or create the sentinel once (`allow_gates: [advisory, validating]`); never
|
|
90
|
-
rewrite it after Vet
|
|
90
|
+
rewrite it after Vet except to write or replace only `max_parallel: N` when
|
|
91
|
+
this invocation contains `--parallel N`. Preserve an existing sentinel
|
|
92
|
+
byte-for-byte otherwise. **Failing case:** leftover `max_parallel: 1` keeps
|
|
93
|
+
the run serial after `--parallel 5`.
|
|
91
94
|
**Completion:** a valid read-only AFK sentinel exists.
|
|
92
95
|
4. **Drive phases.** Follow [the loop](reference/loop.md): `/rite-spec` →
|
|
93
96
|
`/rite-clarify` → `/rite-temper` → `/rite-define` → `/rite-vet` →
|
|
94
97
|
`/rite-build` batch loop → `/rite-prove` → `/rite-polish` →
|
|
95
98
|
`/rite-review` → `/rite-seal`. Read and execute each skill; durable files, not
|
|
96
99
|
chat, carry state. Apply the mutable post-vet budget before first Build.
|
|
97
|
-
Build runs the largest eligible path-disjoint batch (cap:
|
|
98
|
-
sentinel `max_parallel`, else 10) and recomputes after
|
|
99
|
-
pending slice remains; a one-slice round is serial for that round only, then
|
|
100
|
+
Build runs the largest eligible path-disjoint batch (cap: this invocation's
|
|
101
|
+
`--parallel N`, else sentinel `max_parallel`, else 10) and recomputes after
|
|
102
|
+
every completed round until no pending slice remains; a one-slice round is serial for that round only, then
|
|
100
103
|
selection runs again (host isolation still forces serial when concurrent writers
|
|
101
|
-
cannot be separated).
|
|
104
|
+
cannot be separated). When `--parallel N`
|
|
105
|
+
is present, pass it into `/rite-build` and do not consult leftover sentinel
|
|
106
|
+
`max_parallel`.
|
|
102
107
|
**Completion:** loop reaches Seal GO or persists a valid stop before any later phase.
|
|
103
108
|
5. **Apply stops.** At every gate use
|
|
104
109
|
[stop-conditions.md](reference/stop-conditions.md). A `blocked` label alone is not a stop condition:
|
|
@@ -17,18 +17,21 @@ allow_gates: [advisory, validating]
|
|
|
17
17
|
# max_slices / max_agents / max_minutes / max_review_queue omitted: unlimited
|
|
18
18
|
# continue_sequence: true # opt-in: chain recorded continuations after Seal GO
|
|
19
19
|
# max_workspaces: 5 # sequence budget when chaining
|
|
20
|
-
# max_parallel: 10 #
|
|
20
|
+
# max_parallel: 10 # default cap when this invocation omits `--parallel N`; `--parallel N` wins and rewrites only this field
|
|
21
21
|
# max_tokens: <N>
|
|
22
22
|
# max_cost_usd: <amount>
|
|
23
23
|
# notify: "<cmd>"
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
Read an existing sentinel first. Preserve it byte-for-byte when valid
|
|
26
|
+
Read an existing sentinel first. Preserve it byte-for-byte when valid, except
|
|
27
|
+
when this invocation contains `--parallel N`: then write or replace only
|
|
28
|
+
`max_parallel: N` and leave every other key unchanged. Stop if the sentinel is
|
|
27
29
|
malformed. Do not stop because it names `max_slices` / `max_agents` /
|
|
28
30
|
`max_minutes` / `max_review_queue` or only `[advisory]`. If absent, write it
|
|
29
|
-
once after clarity
|
|
30
|
-
It is read-only: never rewrite it after Vet or reset it on resume. Leftover
|
|
31
|
-
|
|
31
|
+
once after clarity, and include `max_parallel: N` when that flag is present.
|
|
32
|
+
Never write `max_slices` from `--max-slices`. It is otherwise read-only: never rewrite it after Vet or reset it on resume. Leftover `expires_at` is ignored
|
|
33
|
+
and never rewritten. **Failing case:** leftover `max_parallel: 1` keeps the run
|
|
34
|
+
serial after `--parallel 5`.
|
|
32
35
|
|
|
33
36
|
### Derive the mutable post-vet budget
|
|
34
37
|
|
|
@@ -44,7 +47,9 @@ readiness check first; reject overlap. Do not stop on `max_agents`,
|
|
|
44
47
|
gets fresh activation-local counters but retains durable slice/recovery state.
|
|
45
48
|
|
|
46
49
|
When driving `/rite-build`, ignore afk-discipline remaining-0, `--max-slices`,
|
|
47
|
-
and parallel AFK headroom
|
|
50
|
+
and parallel AFK headroom as stop conditions. Pass this invocation's
|
|
51
|
+
`--parallel N` into `/rite-build` when present; leftover sentinel
|
|
52
|
+
`max_parallel` is then not the cap. Close validating questions and blocking questions
|
|
48
53
|
that already name a ranked recommended option (recommended pick via
|
|
49
54
|
`devrites-engine state resolve`) instead of queuing them or handing
|
|
50
55
|
`/rite-resolve` to the user. Escalating, irreversible-risk, access, and
|
|
@@ -61,7 +66,7 @@ Workspace files carry state; chat does not. Read and execute each phase skill:
|
|
|
61
66
|
| 3 | `/rite-temper` | harden, reduce, or expand; irreversible risk still pauses |
|
|
62
67
|
| 4 | `/rite-define` | approved plan/tasks/traceability |
|
|
63
68
|
| 5 | `/rite-vet` | every plan; derive mutable budget after READY |
|
|
64
|
-
| 6 | `/rite-build` batch loop | largest eligible path-disjoint set (cap 10; one-slice round when <2 eligible); recompute after each round; charge once per green built slice |
|
|
69
|
+
| 6 | `/rite-build` batch loop | largest eligible path-disjoint set (cap: this invocation's `--parallel N`, else sentinel `max_parallel`, else 10; one-slice round when <2 eligible); recompute after each round; charge once per green built slice |
|
|
65
70
|
| 7 | `/rite-prove` | all slices built; approved proof; recovery on red |
|
|
66
71
|
| 8 | `/rite-polish` | re-prove after code edits |
|
|
67
72
|
| 9 | `/rite-review` | in-scope correction then fresh proof |
|
|
@@ -64,7 +64,9 @@ filled, and recomputes after every completed round (serial slice or parallel
|
|
|
64
64
|
integrate) until no pending slice remains
|
|
65
65
|
([`parallel-batch.md` § Dynamic selection](reference/parallel-batch.md#dynamic-selection-and-re-batching)).
|
|
66
66
|
Unattended runs (`/rite-autocomplete`, `.devrites/AFK` `max_parallel`) repeat batches
|
|
67
|
-
inside the same run; HITL stops after each batch.
|
|
67
|
+
inside the same run; HITL stops after each batch. This invocation's `--parallel N`
|
|
68
|
+
is the cap: leftover sentinel `max_parallel` is not consulted. Autocomplete with
|
|
69
|
+
that flag also writes or replaces only `max_parallel: N`. Non-integer/`N≤0`/`N>10` hard refuse.
|
|
68
70
|
All-green (independent review + proof) then integrate as one local `WIP(<slug>):`
|
|
69
71
|
commit per sibling onto the current control branch (never pushed). Do not
|
|
70
72
|
integrate a sibling because the wright returned. A red/gap sibling gets a bounded repair
|
|
@@ -16,9 +16,10 @@ control; irreversible work (destructive/auth/public API) always pauses.
|
|
|
16
16
|
The controlling root owns the cap:
|
|
17
17
|
|
|
18
18
|
1. **Before every dispatch**, re-read `.devrites/AFK`, `state.md`, and the
|
|
19
|
-
selected slice.
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
selected slice. This invocation's `--parallel N` is the cap when present;
|
|
20
|
+
leftover sentinel `max_parallel` is not consulted in that case. When that
|
|
21
|
+
flag or sentinel `max_parallel` is greater than 1, recompute `N_eff` via
|
|
22
|
+
`parallel select` before the next dispatch — a prior one-slice round does not keep the run serial. A configured `max_slices` and any existing
|
|
22
23
|
`afk_slices_remaining` value, including its released bullet form, must each
|
|
23
24
|
be a decimal nonnegative integer. A missing
|
|
24
25
|
`state.md` or malformed configured value fails closed; an omitted cap is the
|
|
@@ -9,6 +9,7 @@ Opt-in only. Default `/rite-build` stays [`one-slice-cycle.md`](one-slice-cycle.
|
|
|
9
9
|
| omitted / `--parallel 1` | Serial one-slice |
|
|
10
10
|
| `--parallel N` (**2≤N≤10**) | N is a **cap**, not a quota: run the largest eligible set ≤ N |
|
|
11
11
|
| non-integer / `N≤0` / `N>10` | Hard refuse (no silent clamp) |
|
|
12
|
+
| Autocomplete `--parallel N` | N is the cap for this run; leftover sentinel `max_parallel` is ignored, then `/rite-autocomplete` writes or replaces only `max_parallel: N` |
|
|
12
13
|
| Autocomplete, no flag | Same path, cap from sentinel `max_parallel` else 10; serial only when ineligible |
|
|
13
14
|
|
|
14
15
|
AFK caps `N`. Charge green siblings once after integrate; abort /
|
|
@@ -21,7 +22,8 @@ Size each batch by what is runnable **now**, never by the requested number:
|
|
|
21
22
|
|
|
22
23
|
```text
|
|
23
24
|
N_eff = min(
|
|
24
|
-
cap -- --parallel N
|
|
25
|
+
cap -- this invocation's --parallel N (wins over leftover sentinel max_parallel)
|
|
26
|
+
| else sentinel max_parallel | else 10 (autocomplete default)
|
|
25
27
|
eligible set -- dependency-satisfied pending slices, pairwise path-disjoint
|
|
26
28
|
AFK headroom -- remaining max_slices, max_agents, max_minutes, review queue
|
|
27
29
|
host capacity -- concurrent worktree writers + the runtime isolation table
|
|
@@ -14,7 +14,7 @@ Spec: ./spec.md Decision coverage: ./decision-coverage.md Date: <date>
|
|
|
14
14
|
- Language/runtime/version: <...>
|
|
15
15
|
- Frameworks/libraries: <...>
|
|
16
16
|
- Storage/data: <...>
|
|
17
|
-
- Test commands: <discovered runner commands; discovery contract: rite-prove/reference/test-command-discovery.md>
|
|
17
|
+
- Test commands: <discovered runner commands; discovery contract: .claude/skills/rite-prove/reference/test-command-discovery.md>
|
|
18
18
|
- Target/platform/constraints: <...>
|
|
19
19
|
- Approach-affecting product/constraint unknowns route to `/rite-clarify`;
|
|
20
20
|
`[NEEDS CLARIFICATION]` blocks approval.
|
package/pack/generated/README.md
CHANGED
|
@@ -10,7 +10,9 @@ This directory is generated by `scripts/build-host-artifacts.sh`.
|
|
|
10
10
|
- `pi/` contains pi-native skill mirrors, pi-subagents Markdown agents,
|
|
11
11
|
prompt templates preserving the `/rite*` commands, and an `AGENTS.md`
|
|
12
12
|
bridge block.
|
|
13
|
+
- `devin/` contains Devin CLI skill mirrors, custom subagent profiles with
|
|
14
|
+
`allowed-tools` allowlists, and an `AGENTS.md` bridge block.
|
|
13
15
|
|
|
14
16
|
Do not edit these files by hand. Edit `pack/.claude/`,
|
|
15
|
-
`scripts/codex-generate.sh`, `scripts/omp-generate.sh`,
|
|
16
|
-
`scripts/pi-generate.sh`, then rebuild.
|
|
17
|
+
`scripts/codex-generate.sh`, `scripts/omp-generate.sh`,
|
|
18
|
+
`scripts/pi-generate.sh`, or `scripts/devin-generate.sh`, then rebuild.
|