devrites 3.0.4 → 3.0.6
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 +40 -1
- package/README.md +280 -521
- package/SECURITY.md +91 -77
- package/docs/adr/README.md +7 -9
- package/docs/agents/domain.md +5 -5
- package/docs/agents/issue-driven-rites.md +5 -5
- package/docs/agents/issue-tracker.md +1 -1
- package/docs/agents/triage-labels.md +2 -2
- package/docs/architecture.md +101 -85
- package/docs/capability-surface-selection.md +3 -1
- package/docs/cli.md +20 -13
- package/docs/command-map.md +39 -35
- package/docs/engine/agent-contract.md +11 -9
- package/docs/engine/commands.md +92 -78
- package/docs/engine/state-schema.md +23 -19
- package/docs/engine/workspace-schema.md +12 -11
- package/docs/extensions.md +17 -17
- package/docs/flow.md +34 -23
- package/docs/harness-compliance.md +2 -2
- package/docs/orchestration.md +21 -20
- package/docs/porting-to-a-new-harness.md +6 -2
- package/docs/release.md +30 -12
- package/docs/research/go-authoritative-workflow-schema-and-quality-2026-07-20.md +3 -3
- package/docs/skills.md +77 -52
- package/docs/templates/CRITIC_REVIEW_PACKET_TEMPLATE.md +35 -0
- package/docs/usage.md +56 -45
- package/engine/Makefile +2 -2
- package/engine/commands.go +3 -3
- package/engine/harnessmatrix.go +2 -2
- package/engine/hookpolicy.go +9 -9
- package/engine/hooks.go +11 -11
- package/engine/hooks_workspace.go +11 -11
- package/engine/internal/doctor/doctor.go +7 -7
- package/engine/internal/gate/gate.go +11 -11
- package/engine/internal/harness/compliance.go +1 -1
- package/engine/internal/harness/harness.go +7 -7
- package/engine/internal/install/install.go +2 -0
- package/engine/internal/install/install_test.go +3 -3
- package/engine/internal/iohooks/detach_unix.go +1 -1
- package/engine/internal/iohooks/iohooks.go +8 -8
- package/engine/internal/lib/adoption.go +1 -1
- package/engine/internal/lib/analyze.go +15 -15
- package/engine/internal/lib/archivesearch.go +3 -3
- package/engine/internal/lib/budget.go +3 -3
- package/engine/internal/lib/buildreadiness.go +6 -6
- package/engine/internal/lib/checkacceptance.go +10 -10
- package/engine/internal/lib/closeout.go +5 -5
- package/engine/internal/lib/conventions.go +3 -3
- package/engine/internal/lib/coverage.go +4 -4
- package/engine/internal/lib/doubtcoverage.go +9 -9
- package/engine/internal/lib/evidencefresh.go +6 -6
- package/engine/internal/lib/extensions.go +9 -9
- package/engine/internal/lib/footprint.go +13 -13
- package/engine/internal/lib/jsonout.go +2 -2
- package/engine/internal/lib/lanes.go +2 -2
- package/engine/internal/lib/learnings.go +9 -9
- package/engine/internal/lib/ledger.go +8 -8
- package/engine/internal/lib/ledger_test.go +5 -5
- package/engine/internal/lib/mutationgate.go +4 -4
- package/engine/internal/lib/overrides.go +9 -9
- package/engine/internal/lib/overrides_test.go +2 -2
- package/engine/internal/lib/packageexistence.go +732 -55
- package/engine/internal/lib/packageexistence_test.go +343 -0
- package/engine/internal/lib/preamble.go +6 -6
- package/engine/internal/lib/progress.go +5 -5
- package/engine/internal/lib/reconcile.go +80 -20
- package/engine/internal/lib/reconcile_test.go +13 -5
- package/engine/internal/lib/resolve.go +3 -3
- package/engine/internal/lib/reviewerstats.go +2 -2
- package/engine/internal/lib/reviewintegrity.go +13 -13
- package/engine/internal/lib/reviewintegrity_test.go +6 -6
- package/engine/internal/lib/runbook.go +1 -1
- package/engine/internal/lib/session.go +1 -1
- package/engine/internal/lib/session_test.go +2 -2
- package/engine/internal/lib/specparse.go +4 -4
- package/engine/internal/lib/specskeleton.go +2 -2
- package/engine/internal/lib/specvalidate.go +13 -13
- package/engine/internal/lib/stuck.go +13 -13
- package/engine/internal/lib/templates/conventions_ledger_header.md +1 -1
- package/engine/internal/lib/templates/conventions_orient_header.txt +1 -1
- package/engine/internal/lib/testintegrity.go +9 -9
- package/engine/internal/lib/tickafk.go +4 -4
- package/engine/internal/lib/util.go +1 -1
- package/engine/internal/migrate/migrate.go +2 -2
- package/engine/internal/migrate/migrate_test.go +1 -0
- package/engine/internal/orient/firstrun.go +8 -8
- package/engine/internal/orient/orient.go +5 -5
- package/engine/internal/state/concurrency_test.go +4 -4
- package/engine/internal/state/feature.go +6 -6
- package/engine/internal/state/lock_unix.go +1 -1
- package/engine/internal/state/schema.go +1 -1
- package/engine/internal/state/snapshot.go +2 -2
- package/engine/internal/state/write.go +1 -1
- package/engine/internal/version/version.go +1 -1
- package/engine/main.go +5 -5
- package/engine/subagent_orient_context.txt +4 -4
- package/engine/testdata/golden/TestParityA1Guard/source-edit-enforce-denies.golden +1 -1
- package/engine/testdata/golden/TestParityAnalyze/slug=covered.golden +2 -2
- package/engine/testdata/golden/TestParityAnalyze/slug=dangling.golden +3 -3
- package/engine/testdata/golden/TestParityAnalyze/slug=noac.golden +2 -2
- package/engine/testdata/golden/TestParityAnalyze/slug=order.golden +4 -4
- package/engine/testdata/golden/TestParityAnalyze/slug=orphan.golden +3 -3
- package/engine/testdata/golden/TestParityAnalyze/slug=uncovered.golden +3 -3
- package/engine/testdata/golden/TestParityBudget/extra-md.golden +1 -1
- package/engine/testdata/golden/TestParityBudget/over-advisory.golden +1 -1
- package/engine/testdata/golden/TestParityBudget/over-strict.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +1 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-ok.golden +1 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-ok.golden +1 -1
- package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +1 -1
- package/engine/testdata/golden/TestParityCoverage/arg=speconly.golden +2 -2
- package/engine/testdata/golden/TestParityCursor/bare.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/full-afk.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/full-hitl.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/red.golden +2 -2
- package/engine/testdata/golden/TestParityCursor/zerogates.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=ghost.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=inline.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing-inline.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nodoubt.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nolog.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/mine-no-archive.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/mine.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/nudge.golden +1 -1
- package/engine/testdata/golden/TestParityMutationGate/active-slug.golden +1 -1
- package/engine/testdata/golden/TestParityMutationGate/explicit-slug.golden +1 -1
- package/engine/testdata/golden/TestParityPackageExistence/declared.golden +1 -1
- package/engine/testdata/golden/TestParityPackageExistence/default-import-subpath.golden +1 -1
- package/engine/testdata/golden/TestParityReconcile/check-clean.golden +1 -1
- package/engine/testdata/golden/TestParityRedwatch/fail-writes-red.golden +1 -1
- package/engine/testdata/golden/TestParityResolve/answer/state.md.golden +1 -1
- package/engine/testdata/golden/TestParityResolve/batch.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-devrites-agent-denies.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-git-commit.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-mutating.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=flat.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid/spec.md.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/custom-window-2.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/dominant.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/few.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/ghost.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/identical.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/nolog.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/pingpong.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/varied.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-04-identical.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-2.5-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-4x-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-leadspace-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-plus4-identical.golden +1 -1
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent-subagent-type-key.golden +1 -1
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent.golden +1 -1
- package/engine/testdata/golden/TestParityTestIntegrity/clean.golden +1 -1
- package/engine/testdata/golden/TestParityTickAfk/missingField.golden +1 -1
- package/engine/testdata/golden/TestParityTickAfk/none.golden +1 -1
- package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +1 -1
- package/engine/testdata/golden/TestSpecSkeleton/missing-some.golden +1 -1
- package/engine/testdata/golden/TestSpecSkeleton/present-all.golden +1 -1
- package/engine/tests/adr_0004_required_by_phase_test.go +2 -2
- package/engine/tests/adr_0006_clock_seam_test.go +1 -1
- package/engine/tests/budget_test.go +1 -1
- package/engine/tests/canonical_ac_ids_test.go +2 -2
- package/engine/tests/cli_test.go +1 -1
- package/engine/tests/concurrency_cli_test.go +1 -1
- package/engine/tests/gate_test.go +4 -4
- package/engine/tests/hook_test.go +3 -3
- package/engine/tests/hooks_io_test.go +1 -1
- package/engine/tests/lib_parity_test.go +29 -29
- package/engine/tests/meta_test.go +2 -2
- package/engine/tests/parity_closeout_test.go +1 -1
- package/engine/tests/parity_learnings_test.go +2 -2
- package/engine/tests/parity_mutationgate_test.go +2 -2
- package/engine/tests/parity_resolve_test.go +1 -1
- package/engine/tests/parity_test.go +3 -3
- package/engine/tests/parity_tickafk_test.go +1 -1
- package/engine/validatepack.go +5 -5
- package/engine/validatepackskills.go +9 -9
- package/pack/.claude/agents/devrites-code-reviewer.md +21 -22
- package/pack/.claude/agents/devrites-devex-reviewer.md +17 -17
- package/pack/.claude/agents/devrites-doubt-reviewer.md +6 -6
- package/pack/.claude/agents/devrites-forge-judge.md +26 -26
- package/pack/.claude/agents/devrites-frontend-reviewer.md +17 -17
- package/pack/.claude/agents/devrites-performance-reviewer.md +19 -18
- package/pack/.claude/agents/devrites-plan-reviewer.md +29 -27
- package/pack/.claude/agents/devrites-retrospector.md +19 -19
- package/pack/.claude/agents/devrites-security-auditor.md +15 -15
- package/pack/.claude/agents/devrites-simplifier-reviewer.md +14 -14
- package/pack/.claude/agents/devrites-slice-wright.md +52 -51
- package/pack/.claude/agents/devrites-spec-reviewer.md +11 -11
- package/pack/.claude/agents/devrites-strategy-reviewer.md +21 -21
- package/pack/.claude/agents/devrites-test-analyst.md +13 -13
- package/pack/.claude/settings.json +1 -1
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +12 -12
- package/pack/.claude/skills/devrites-audit/SKILL.md +7 -7
- package/pack/.claude/skills/devrites-browser-proof/SKILL.md +16 -16
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +14 -14
- package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/.claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/.claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/.claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/.claude/skills/devrites-doubt/SKILL.md +14 -14
- package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +18 -18
- package/pack/.claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/.claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/.claude/skills/devrites-interview/SKILL.md +27 -27
- package/pack/.claude/skills/devrites-lib/SKILL.md +25 -27
- package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +11 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/.claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/.claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
- package/pack/.claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/.claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/.claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/.claude/skills/devrites-prose-craft/SKILL.md +5 -5
- package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +8 -8
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +33 -33
- package/pack/.claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/.claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/.claude/skills/rite/SKILL.md +13 -14
- package/pack/.claude/skills/rite/reference/menu.md +10 -10
- package/pack/.claude/skills/rite-adopt/SKILL.md +17 -18
- package/pack/.claude/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/.claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +14 -14
- package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/.claude/skills/rite-build/SKILL.md +22 -22
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/.claude/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/.claude/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/.claude/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/.claude/skills/rite-build/reference/forge.md +28 -29
- package/pack/.claude/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/.claude/skills/rite-build/reference/output.md +1 -1
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/.claude/skills/rite-build/reference/tdd.md +6 -6
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/.claude/skills/rite-converge/SKILL.md +17 -17
- package/pack/.claude/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/.claude/skills/rite-customize/SKILL.md +2 -2
- package/pack/.claude/skills/rite-define/SKILL.md +25 -25
- package/pack/.claude/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/.claude/skills/rite-define/reference/gates.md +13 -13
- package/pack/.claude/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/.claude/skills/rite-doctor/SKILL.md +11 -11
- package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/.claude/skills/rite-explain/SKILL.md +22 -22
- package/pack/.claude/skills/rite-explain/reference/intake.md +16 -16
- package/pack/.claude/skills/rite-frame/SKILL.md +22 -22
- package/pack/.claude/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/.claude/skills/rite-handoff/SKILL.md +12 -12
- package/pack/.claude/skills/rite-learn/SKILL.md +23 -23
- package/pack/.claude/skills/rite-plan/SKILL.md +21 -21
- package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/.claude/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/.claude/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/.claude/skills/rite-polish/SKILL.md +11 -11
- package/pack/.claude/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/.claude/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/.claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/.claude/skills/rite-polish/reference/code.md +26 -26
- package/pack/.claude/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/.claude/skills/rite-polish/reference/ui.md +23 -23
- package/pack/.claude/skills/rite-pov/SKILL.md +3 -3
- package/pack/.claude/skills/rite-pr-feedback/SKILL.md +2 -2
- package/pack/.claude/skills/rite-pressure-test/SKILL.md +14 -14
- package/pack/.claude/skills/rite-prototype/SKILL.md +13 -13
- package/pack/.claude/skills/rite-prove/SKILL.md +17 -17
- package/pack/.claude/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/.claude/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/.claude/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/.claude/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/.claude/skills/rite-quick/SKILL.md +22 -22
- package/pack/.claude/skills/rite-resolve/SKILL.md +18 -18
- package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/.claude/skills/rite-review/SKILL.md +34 -34
- package/pack/.claude/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/.claude/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/.claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/.claude/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/.claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/.claude/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/.claude/skills/rite-review/reference/security-review.md +9 -9
- package/pack/.claude/skills/rite-seal/SKILL.md +26 -26
- package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/.claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/.claude/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/.claude/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/.claude/skills/rite-ship/SKILL.md +12 -12
- package/pack/.claude/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/.claude/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/.claude/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/.claude/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/.claude/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/.claude/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/.claude/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/.claude/skills/rite-spec/SKILL.md +45 -45
- package/pack/.claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/.claude/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/.claude/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/.claude/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/.claude/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/.claude/skills/rite-status/SKILL.md +13 -13
- package/pack/.claude/skills/rite-temper/SKILL.md +29 -29
- package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/.claude/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/.claude/skills/rite-temper/reference/significance.md +10 -10
- package/pack/.claude/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/.claude/skills/rite-vet/SKILL.md +31 -31
- package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/.claude/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/.claude/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/.claude/skills/rite-vet/reference/depth.md +14 -14
- package/pack/.claude/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +18 -18
- package/pack/generated/claude/agents/devrites-code-reviewer.md +21 -22
- package/pack/generated/claude/agents/devrites-devex-reviewer.md +17 -17
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +6 -6
- package/pack/generated/claude/agents/devrites-forge-judge.md +26 -26
- package/pack/generated/claude/agents/devrites-frontend-reviewer.md +17 -17
- package/pack/generated/claude/agents/devrites-performance-reviewer.md +19 -18
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +29 -27
- package/pack/generated/claude/agents/devrites-retrospector.md +19 -19
- package/pack/generated/claude/agents/devrites-security-auditor.md +15 -15
- package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +14 -14
- package/pack/generated/claude/agents/devrites-slice-wright.md +52 -51
- package/pack/generated/claude/agents/devrites-spec-reviewer.md +11 -11
- package/pack/generated/claude/agents/devrites-strategy-reviewer.md +21 -21
- package/pack/generated/claude/agents/devrites-test-analyst.md +13 -13
- package/pack/generated/claude/settings.json +1 -1
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +12 -12
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +7 -7
- package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +16 -16
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +14 -14
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +14 -14
- package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +18 -18
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +27 -27
- package/pack/generated/claude/skills/devrites-lib/SKILL.md +25 -27
- package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +11 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/generated/claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
- package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/generated/claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/generated/claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +5 -5
- package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
- package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +8 -8
- package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +33 -33
- package/pack/generated/claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/generated/claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/generated/claude/skills/rite/SKILL.md +13 -14
- package/pack/generated/claude/skills/rite/reference/menu.md +10 -10
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +17 -18
- package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/generated/claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +14 -14
- package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/generated/claude/skills/rite-build/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/forge.md +28 -29
- package/pack/generated/claude/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/generated/claude/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/tdd.md +6 -6
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/generated/claude/skills/rite-converge/SKILL.md +17 -17
- package/pack/generated/claude/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/generated/claude/skills/rite-customize/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-define/SKILL.md +25 -25
- package/pack/generated/claude/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/generated/claude/skills/rite-define/reference/gates.md +13 -13
- package/pack/generated/claude/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/claude/skills/rite-doctor/SKILL.md +11 -11
- package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-explain/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-explain/reference/intake.md +16 -16
- package/pack/generated/claude/skills/rite-frame/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/generated/claude/skills/rite-handoff/SKILL.md +12 -12
- package/pack/generated/claude/skills/rite-learn/SKILL.md +23 -23
- package/pack/generated/claude/skills/rite-plan/SKILL.md +21 -21
- package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/generated/claude/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/generated/claude/skills/rite-polish/SKILL.md +11 -11
- package/pack/generated/claude/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/generated/claude/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/generated/claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/generated/claude/skills/rite-polish/reference/code.md +26 -26
- package/pack/generated/claude/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/generated/claude/skills/rite-polish/reference/ui.md +23 -23
- package/pack/generated/claude/skills/rite-pov/SKILL.md +3 -3
- package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +14 -14
- package/pack/generated/claude/skills/rite-prototype/SKILL.md +13 -13
- package/pack/generated/claude/skills/rite-prove/SKILL.md +17 -17
- package/pack/generated/claude/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/generated/claude/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/generated/claude/skills/rite-quick/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +18 -18
- package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/generated/claude/skills/rite-review/SKILL.md +34 -34
- package/pack/generated/claude/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/generated/claude/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/generated/claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/generated/claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/generated/claude/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/generated/claude/skills/rite-review/reference/security-review.md +9 -9
- package/pack/generated/claude/skills/rite-seal/SKILL.md +26 -26
- package/pack/generated/claude/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/generated/claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/generated/claude/skills/rite-ship/SKILL.md +12 -12
- package/pack/generated/claude/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/generated/claude/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/generated/claude/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/generated/claude/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/generated/claude/skills/rite-spec/SKILL.md +45 -45
- package/pack/generated/claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/generated/claude/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/generated/claude/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/generated/claude/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/generated/claude/skills/rite-status/SKILL.md +13 -13
- package/pack/generated/claude/skills/rite-temper/SKILL.md +29 -29
- package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/generated/claude/skills/rite-temper/reference/significance.md +10 -10
- package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/generated/claude/skills/rite-vet/SKILL.md +31 -31
- package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/generated/claude/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/generated/claude/skills/rite-vet/reference/depth.md +14 -14
- package/pack/generated/claude/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +18 -18
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +21 -22
- package/pack/generated/codex/agents/devrites-devex-reviewer.toml +17 -17
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +6 -6
- package/pack/generated/codex/agents/devrites-forge-judge.toml +26 -26
- package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +17 -17
- package/pack/generated/codex/agents/devrites-performance-reviewer.toml +19 -18
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +29 -27
- package/pack/generated/codex/agents/devrites-retrospector.toml +19 -19
- package/pack/generated/codex/agents/devrites-security-auditor.toml +15 -15
- package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +14 -14
- package/pack/generated/codex/agents/devrites-slice-wright.toml +52 -51
- package/pack/generated/codex/agents/devrites-spec-reviewer.toml +11 -11
- package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +21 -21
- package/pack/generated/codex/agents/devrites-test-analyst.toml +13 -13
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +15 -15
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +10 -10
- package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +19 -19
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +17 -17
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +17 -17
- package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +20 -20
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/SKILL.md +28 -30
- package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +11 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/generated/codex/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
- package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/generated/codex/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/generated/codex/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +8 -8
- package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +9 -9
- package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +11 -11
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +36 -36
- package/pack/generated/codex/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/generated/codex/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/generated/codex/skills/rite/SKILL.md +16 -17
- package/pack/generated/codex/skills/rite/reference/menu.md +10 -10
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +20 -21
- package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/generated/codex/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +17 -17
- package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/generated/codex/skills/rite-build/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/forge.md +28 -29
- package/pack/generated/codex/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/generated/codex/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/tdd.md +6 -6
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/generated/codex/skills/rite-converge/SKILL.md +20 -20
- package/pack/generated/codex/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/generated/codex/skills/rite-customize/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-define/SKILL.md +28 -28
- package/pack/generated/codex/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/generated/codex/skills/rite-define/reference/gates.md +13 -13
- package/pack/generated/codex/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +14 -14
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-explain/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-explain/reference/intake.md +16 -16
- package/pack/generated/codex/skills/rite-frame/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +15 -15
- package/pack/generated/codex/skills/rite-learn/SKILL.md +26 -26
- package/pack/generated/codex/skills/rite-plan/SKILL.md +24 -24
- package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/generated/codex/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/generated/codex/skills/rite-polish/SKILL.md +14 -14
- package/pack/generated/codex/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/generated/codex/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/generated/codex/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/generated/codex/skills/rite-polish/reference/code.md +26 -26
- package/pack/generated/codex/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/generated/codex/skills/rite-polish/reference/ui.md +23 -23
- package/pack/generated/codex/skills/rite-pov/SKILL.md +6 -6
- package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +17 -17
- package/pack/generated/codex/skills/rite-prototype/SKILL.md +16 -16
- package/pack/generated/codex/skills/rite-prove/SKILL.md +20 -20
- package/pack/generated/codex/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/generated/codex/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/generated/codex/skills/rite-quick/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +21 -21
- package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/generated/codex/skills/rite-review/SKILL.md +37 -37
- package/pack/generated/codex/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/generated/codex/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/generated/codex/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/generated/codex/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/generated/codex/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/generated/codex/skills/rite-review/reference/security-review.md +9 -9
- package/pack/generated/codex/skills/rite-seal/SKILL.md +29 -29
- package/pack/generated/codex/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/generated/codex/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/generated/codex/skills/rite-ship/SKILL.md +15 -15
- package/pack/generated/codex/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/generated/codex/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/generated/codex/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/generated/codex/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/generated/codex/skills/rite-spec/SKILL.md +48 -48
- package/pack/generated/codex/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/generated/codex/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/generated/codex/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/generated/codex/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/generated/codex/skills/rite-status/SKILL.md +16 -16
- package/pack/generated/codex/skills/rite-temper/SKILL.md +32 -32
- package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/generated/codex/skills/rite-temper/reference/significance.md +10 -10
- package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/generated/codex/skills/rite-vet/SKILL.md +34 -34
- package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/generated/codex/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/generated/codex/skills/rite-vet/reference/depth.md +14 -14
- package/pack/generated/codex/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +21 -21
- package/package.json +2 -2
- package/scripts/build-binaries.sh +1 -1
- package/scripts/build-host-artifacts.sh +1 -1
- package/scripts/build-release-tarball.sh +1 -1
- package/scripts/check-cross-refs.py +8 -8
- package/scripts/check-invocation-integrity.py +4 -4
- package/scripts/check-no-global-writes.sh +2 -2
- package/scripts/check-reply-contract.sh +1 -1
- package/scripts/check-rule-uniqueness.sh +2 -2
- package/scripts/codex-generate.sh +5 -5
- package/scripts/devrites-detect.sh +33 -33
- package/scripts/eval-runner.py +7 -7
- package/scripts/grade-feature.sh +14 -14
- package/scripts/install-lib.sh +2 -2
- package/scripts/pin.sh +12 -12
- package/scripts/run-behavioral-evals.sh +12 -12
- package/scripts/run-evals.sh +1 -1
- package/scripts/run-outcome-evals.sh +12 -12
- package/scripts/scan-pack-security.py +4 -4
- package/scripts/scan-supply-chain-iocs.py +7 -7
- package/scripts/skills-inventory.mjs +21 -4
- package/scripts/sync-version.sh +2 -2
- package/scripts/validate-workflow-security.py +12 -6
- package/scripts/validate-workspace-schema.py +2 -2
- package/scripts/validate.sh +7 -7
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
package lib
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"bytes"
|
|
5
|
+
"os"
|
|
6
|
+
"os/exec"
|
|
7
|
+
"path/filepath"
|
|
8
|
+
"strings"
|
|
9
|
+
"testing"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
func TestPackageExistenceJavaScriptWorkspaces(t *testing.T) {
|
|
13
|
+
tests := []struct {
|
|
14
|
+
name string
|
|
15
|
+
sourcePath string
|
|
16
|
+
workingDir string
|
|
17
|
+
importLine string
|
|
18
|
+
files map[string]string
|
|
19
|
+
wantCode int
|
|
20
|
+
wantFinding string
|
|
21
|
+
}{
|
|
22
|
+
{
|
|
23
|
+
name: "nested workspace",
|
|
24
|
+
sourcePath: "frontend/src/example.ts",
|
|
25
|
+
workingDir: "frontend",
|
|
26
|
+
importLine: `import { Dialog } from "@ark-ui/svelte/dialog";`,
|
|
27
|
+
files: map[string]string{
|
|
28
|
+
"frontend/package.json": `{"dependencies":{"@ark-ui/svelte":"^5.22.1"}}`,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "scoped package subpath",
|
|
33
|
+
sourcePath: "app/src/example.ts",
|
|
34
|
+
importLine: `import value from "@scope/package/subpath";`,
|
|
35
|
+
files: map[string]string{
|
|
36
|
+
"app/package.json": `{"devDependencies":{"@scope/package":"1.0.0"}}`,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "wildcard alias",
|
|
41
|
+
sourcePath: "frontend/src/example.ts",
|
|
42
|
+
importLine: `import Button from "$lib/components/button";`,
|
|
43
|
+
files: map[string]string{
|
|
44
|
+
"frontend/package.json": `{}`,
|
|
45
|
+
"frontend/tsconfig.json": "{\n // SvelteKit generates the inherited aliases.\n \"extends\": \"./.svelte-kit/tsconfig.json\"\n}",
|
|
46
|
+
"frontend/.svelte-kit/tsconfig.json": `{"compilerOptions":{"paths":{"$lib/*":["../src/lib/*"]}}}`,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "exact alias",
|
|
51
|
+
sourcePath: "frontend/src/example.ts",
|
|
52
|
+
importLine: `import library from "$lib";`,
|
|
53
|
+
files: map[string]string{
|
|
54
|
+
"frontend/package.json": `{}`,
|
|
55
|
+
"frontend/tsconfig.json": `{"compilerOptions":{"paths":{"$lib":["./src/lib"]}}}`,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "package shaped alias",
|
|
60
|
+
sourcePath: "frontend/src/example.svelte",
|
|
61
|
+
importLine: `import { css } from "styled-system/css";`,
|
|
62
|
+
files: map[string]string{
|
|
63
|
+
"frontend/package.json": `{}`,
|
|
64
|
+
"frontend/jsconfig.json": `{"compilerOptions":{"paths":{"styled-system/*":["./styled-system/*"]}}}`,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "undeclared dependency",
|
|
69
|
+
sourcePath: "frontend/src/example.ts",
|
|
70
|
+
importLine: `import missing from "definitely-missing-package";`,
|
|
71
|
+
files: map[string]string{"frontend/package.json": `{}`},
|
|
72
|
+
wantCode: 3,
|
|
73
|
+
wantFinding: "definitely-missing-package",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "sibling isolation",
|
|
77
|
+
sourcePath: "workspace-a/src/example.ts",
|
|
78
|
+
importLine: `import sibling from "sibling-only-package";`,
|
|
79
|
+
files: map[string]string{
|
|
80
|
+
"workspace-a/package.json": `{}`,
|
|
81
|
+
"workspace-b/package.json": `{"dependencies":{"sibling-only-package":"1.0.0"}}`,
|
|
82
|
+
},
|
|
83
|
+
wantCode: 3,
|
|
84
|
+
wantFinding: "sibling-only-package",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "malformed config does not allow alias",
|
|
88
|
+
sourcePath: "frontend/src/example.ts",
|
|
89
|
+
importLine: `import { css } from "styled-system/css";`,
|
|
90
|
+
files: map[string]string{
|
|
91
|
+
"frontend/package.json": `{}`,
|
|
92
|
+
"frontend/tsconfig.json": `{"compilerOptions":{"paths":{"styled-system/*":["./styled-system/*"]}}`,
|
|
93
|
+
},
|
|
94
|
+
wantCode: 3,
|
|
95
|
+
wantFinding: "styled-system",
|
|
96
|
+
},
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
for _, test := range tests {
|
|
100
|
+
t.Run(test.name, func(t *testing.T) {
|
|
101
|
+
repo := t.TempDir()
|
|
102
|
+
writePackageExistenceFile(t, repo, "Cargo.toml", "[package]\nname = \"fixture\"\nversion = \"0.1.0\"\n")
|
|
103
|
+
writePackageExistenceFile(t, repo, test.sourcePath, "// baseline\n")
|
|
104
|
+
for path, content := range test.files {
|
|
105
|
+
writePackageExistenceFile(t, repo, path, content+"\n")
|
|
106
|
+
}
|
|
107
|
+
gitPackageExistence(t, repo, "init", "-q")
|
|
108
|
+
gitPackageExistence(t, repo, "config", "user.email", "test@example.com")
|
|
109
|
+
gitPackageExistence(t, repo, "config", "user.name", "Test")
|
|
110
|
+
gitPackageExistence(t, repo, "add", ".")
|
|
111
|
+
gitPackageExistence(t, repo, "commit", "-qm", "baseline")
|
|
112
|
+
if err := os.MkdirAll(featureDir(repo, "feat"), 0o755); err != nil {
|
|
113
|
+
t.Fatal(err)
|
|
114
|
+
}
|
|
115
|
+
writePackageExistenceFile(t, repo, test.sourcePath, "// baseline\n"+test.importLine+"\n")
|
|
116
|
+
t.Chdir(filepath.Join(repo, test.workingDir))
|
|
117
|
+
|
|
118
|
+
var stdout, stderr bytes.Buffer
|
|
119
|
+
gotCode := PackageExistence(repo, []string{"feat"}, &stdout, &stderr)
|
|
120
|
+
if gotCode != test.wantCode {
|
|
121
|
+
t.Fatalf("code = %d, want %d\nstdout: %s\nstderr: %s", gotCode, test.wantCode, stdout.String(), stderr.String())
|
|
122
|
+
}
|
|
123
|
+
if test.wantFinding != "" && !strings.Contains(stderr.String(), test.wantFinding) {
|
|
124
|
+
t.Fatalf("stderr does not name %q: %s", test.wantFinding, stderr.String())
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
func TestPackageExistenceNonJavaScriptWorkspaces(t *testing.T) {
|
|
131
|
+
tests := []struct {
|
|
132
|
+
name string
|
|
133
|
+
sourcePath string
|
|
134
|
+
addedSource string
|
|
135
|
+
files map[string]string
|
|
136
|
+
wantCode int
|
|
137
|
+
wantFinding string
|
|
138
|
+
}{
|
|
139
|
+
{
|
|
140
|
+
name: "go import block rejects undeclared module",
|
|
141
|
+
sourcePath: "main.go",
|
|
142
|
+
addedSource: "package main\n\nimport (\n\t\"definitely.invalid/missing\"\n)\n",
|
|
143
|
+
files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n"},
|
|
144
|
+
wantCode: 3,
|
|
145
|
+
wantFinding: "definitely.invalid/missing",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: "go modules do not collide by hostname",
|
|
149
|
+
sourcePath: "main.go",
|
|
150
|
+
addedSource: "package main\n\nimport \"github.com/evil/missing\"\n",
|
|
151
|
+
files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n\nrequire github.com/good/pkg v1.0.0\n"},
|
|
152
|
+
wantCode: 3,
|
|
153
|
+
wantFinding: "github.com/evil/missing",
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: "nested go module declaration",
|
|
157
|
+
sourcePath: "backend/main.go",
|
|
158
|
+
addedSource: "package main\n\nimport \"github.com/good/pkg/sub\"\n",
|
|
159
|
+
files: map[string]string{
|
|
160
|
+
"Cargo.toml": "[package]\nname = \"root\"\nversion = \"0.1.0\"\n",
|
|
161
|
+
"backend/go.mod": "module example.com/backend\n\ngo 1.26\n\nrequire github.com/good/pkg v1.0.0\n",
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: "go standard library subpackage",
|
|
166
|
+
sourcePath: "main.go",
|
|
167
|
+
addedSource: "package main\n\nimport \"encoding/json\"\n",
|
|
168
|
+
files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n"},
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: "go standard library typo remains undeclared",
|
|
172
|
+
sourcePath: "main.go",
|
|
173
|
+
addedSource: "package main\n\nimport \"encoding/josn\"\n",
|
|
174
|
+
files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n"},
|
|
175
|
+
wantCode: 3,
|
|
176
|
+
wantFinding: "encoding/josn",
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: "malformed go manifest does not declare import",
|
|
180
|
+
sourcePath: "main.go",
|
|
181
|
+
addedSource: "package main\n\nimport \"github.com/missing/pkg\"\n",
|
|
182
|
+
files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n\nrequire (\n github.com/missing/pkg v1.0.0\n"},
|
|
183
|
+
wantCode: 3,
|
|
184
|
+
wantFinding: "github.com/missing/pkg",
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: "rust rejects undeclared crate",
|
|
188
|
+
sourcePath: "src/main.rs",
|
|
189
|
+
addedSource: "use definitely_missing_crate::Thing;\n",
|
|
190
|
+
files: map[string]string{"Cargo.toml": "[package]\nname = \"fixture\"\nversion = \"0.1.0\"\n\n[dependencies]\n"},
|
|
191
|
+
wantCode: 3,
|
|
192
|
+
wantFinding: "definitely_missing_crate",
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "nested rust dependency and hyphen normalization",
|
|
196
|
+
sourcePath: "crates/app/src/main.rs",
|
|
197
|
+
addedSource: "use serde_json::Value;\n",
|
|
198
|
+
files: map[string]string{
|
|
199
|
+
"Cargo.toml": "[workspace]\nmembers = [\"crates/app\"]\n",
|
|
200
|
+
"crates/app/Cargo.toml": "[package]\nname = \"app\"\nversion = \"0.1.0\"\n\n[dependencies.serde-json]\nversion = \"1\"\n",
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: "python dotted import uses top-level module",
|
|
205
|
+
sourcePath: "app.py",
|
|
206
|
+
addedSource: "from requests.sessions import Session\n",
|
|
207
|
+
files: map[string]string{"requirements.txt": "requests==2.32.0\n"},
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: "python standard library module",
|
|
211
|
+
sourcePath: "app.py",
|
|
212
|
+
addedSource: "import asyncio\n",
|
|
213
|
+
files: map[string]string{"requirements.txt": "requests==2.32.0\n"},
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: "nested python manifest declaration",
|
|
217
|
+
sourcePath: "backend/app.py",
|
|
218
|
+
addedSource: "import requests\n",
|
|
219
|
+
files: map[string]string{
|
|
220
|
+
"Cargo.toml": "[package]\nname = \"root\"\nversion = \"0.1.0\"\n",
|
|
221
|
+
"backend/requirements.txt": "requests==2.32.0\n",
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
name: "pyproject dependency declaration",
|
|
226
|
+
sourcePath: "service/app.py",
|
|
227
|
+
addedSource: "import requests\n",
|
|
228
|
+
files: map[string]string{
|
|
229
|
+
"service/pyproject.toml": "[project]\ndependencies = [\n \"requests[socks]>=2.32\",\n]\n",
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
name: "pipfile dependency declaration",
|
|
234
|
+
sourcePath: "service/app.py",
|
|
235
|
+
addedSource: "import requests\n",
|
|
236
|
+
files: map[string]string{
|
|
237
|
+
"service/Pipfile": "[packages]\nrequests = \"*\"\n",
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
name: "malformed pyproject does not declare import",
|
|
242
|
+
sourcePath: "service/app.py",
|
|
243
|
+
addedSource: "import definitely_missing\n",
|
|
244
|
+
files: map[string]string{
|
|
245
|
+
"service/pyproject.toml": "[project]\ndependencies = [\n \"definitely_missing\"\n",
|
|
246
|
+
},
|
|
247
|
+
wantCode: 3,
|
|
248
|
+
wantFinding: "definitely_missing",
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
name: "python multiple imports reject undeclared module",
|
|
252
|
+
sourcePath: "app.py",
|
|
253
|
+
addedSource: "import requests, definitely_missing\n",
|
|
254
|
+
files: map[string]string{"requirements.txt": "requests==2.32.0\n"},
|
|
255
|
+
wantCode: 3,
|
|
256
|
+
wantFinding: "definitely_missing",
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
name: "comments and other ecosystems do not declare python imports",
|
|
260
|
+
sourcePath: "app.py",
|
|
261
|
+
addedSource: "import definitely_missing\n",
|
|
262
|
+
files: map[string]string{
|
|
263
|
+
"Cargo.toml": "[package]\nname = \"definitely_missing\"\nversion = \"0.1.0\"\n",
|
|
264
|
+
"requirements.txt": "# definitely_missing is intentionally absent\n",
|
|
265
|
+
},
|
|
266
|
+
wantCode: 3,
|
|
267
|
+
wantFinding: "definitely_missing",
|
|
268
|
+
},
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
for _, test := range tests {
|
|
272
|
+
t.Run(test.name, func(t *testing.T) {
|
|
273
|
+
repo := t.TempDir()
|
|
274
|
+
for path, content := range test.files {
|
|
275
|
+
writePackageExistenceFile(t, repo, path, content)
|
|
276
|
+
}
|
|
277
|
+
writePackageExistenceFile(t, repo, test.sourcePath, "// baseline\n")
|
|
278
|
+
gitPackageExistence(t, repo, "init", "-q")
|
|
279
|
+
gitPackageExistence(t, repo, "config", "user.email", "test@example.com")
|
|
280
|
+
gitPackageExistence(t, repo, "config", "user.name", "Test")
|
|
281
|
+
gitPackageExistence(t, repo, "add", ".")
|
|
282
|
+
gitPackageExistence(t, repo, "commit", "-qm", "baseline")
|
|
283
|
+
if err := os.MkdirAll(featureDir(repo, "feat"), 0o755); err != nil {
|
|
284
|
+
t.Fatal(err)
|
|
285
|
+
}
|
|
286
|
+
writePackageExistenceFile(t, repo, test.sourcePath, test.addedSource)
|
|
287
|
+
t.Chdir(repo)
|
|
288
|
+
|
|
289
|
+
var stdout, stderr bytes.Buffer
|
|
290
|
+
gotCode := PackageExistence(repo, []string{"feat"}, &stdout, &stderr)
|
|
291
|
+
if gotCode != test.wantCode {
|
|
292
|
+
t.Fatalf("code = %d, want %d\nstdout: %s\nstderr: %s", gotCode, test.wantCode, stdout.String(), stderr.String())
|
|
293
|
+
}
|
|
294
|
+
if test.wantFinding != "" && !strings.Contains(stderr.String(), test.wantFinding) {
|
|
295
|
+
t.Fatalf("stderr does not name %q: %s", test.wantFinding, stderr.String())
|
|
296
|
+
}
|
|
297
|
+
})
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
func TestPackageExistenceGenericResolverFailsClosed(t *testing.T) {
|
|
302
|
+
repo := t.TempDir()
|
|
303
|
+
writePackageExistenceFile(t, repo, "package.json", `{"dependencies":{"definitely-missing-package":"1.0.0"}}`)
|
|
304
|
+
writePackageExistenceFile(t, repo, "src/example.custom", "// baseline\n")
|
|
305
|
+
gitPackageExistence(t, repo, "init", "-q")
|
|
306
|
+
gitPackageExistence(t, repo, "config", "user.email", "test@example.com")
|
|
307
|
+
gitPackageExistence(t, repo, "config", "user.name", "Test")
|
|
308
|
+
gitPackageExistence(t, repo, "add", ".")
|
|
309
|
+
gitPackageExistence(t, repo, "commit", "-qm", "baseline")
|
|
310
|
+
if err := os.MkdirAll(featureDir(repo, "feat"), 0o755); err != nil {
|
|
311
|
+
t.Fatal(err)
|
|
312
|
+
}
|
|
313
|
+
writePackageExistenceFile(t, repo, "src/example.custom", "import \"definitely-missing-package\"\n")
|
|
314
|
+
t.Chdir(repo)
|
|
315
|
+
|
|
316
|
+
var stdout, stderr bytes.Buffer
|
|
317
|
+
gotCode := PackageExistence(repo, []string{"feat"}, &stdout, &stderr)
|
|
318
|
+
if gotCode != 3 {
|
|
319
|
+
t.Fatalf("code = %d, want 3\nstdout: %s\nstderr: %s", gotCode, stdout.String(), stderr.String())
|
|
320
|
+
}
|
|
321
|
+
if !strings.Contains(stderr.String(), "definitely-missing-package") {
|
|
322
|
+
t.Fatalf("stderr does not name unresolved import: %s", stderr.String())
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
func writePackageExistenceFile(t *testing.T, root, path, content string) {
|
|
327
|
+
t.Helper()
|
|
328
|
+
fullPath := filepath.Join(root, filepath.FromSlash(path))
|
|
329
|
+
if err := os.MkdirAll(filepath.Dir(fullPath), 0o755); err != nil {
|
|
330
|
+
t.Fatal(err)
|
|
331
|
+
}
|
|
332
|
+
if err := os.WriteFile(fullPath, []byte(content), 0o644); err != nil {
|
|
333
|
+
t.Fatal(err)
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
func gitPackageExistence(t *testing.T, root string, args ...string) {
|
|
338
|
+
t.Helper()
|
|
339
|
+
cmd := exec.Command("git", append([]string{"-C", root}, args...)...)
|
|
340
|
+
if out, err := cmd.CombinedOutput(); err != nil {
|
|
341
|
+
t.Fatalf("git %s: %v\n%s", strings.Join(args, " "), err, out)
|
|
342
|
+
}
|
|
343
|
+
}
|
|
@@ -11,7 +11,7 @@ import (
|
|
|
11
11
|
"github.com/devrites/devrites/internal/workflow"
|
|
12
12
|
)
|
|
13
13
|
|
|
14
|
-
// spaceChars is the POSIX [[:space:]] set under the C locale
|
|
14
|
+
// spaceChars is the POSIX [[:space:]] set under the C locale: the collation the
|
|
15
15
|
// parity oracle pins (LC_ALL=C), so trimming matches the bash awk/sed exactly.
|
|
16
16
|
const spaceChars = " \t\n\v\f\r"
|
|
17
17
|
|
|
@@ -22,7 +22,7 @@ func featureDir(root, slug string) string {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// activeSlug reads the active-feature pointer at <root>/ACTIVE (trimmed), or ""
|
|
25
|
-
// when absent
|
|
25
|
+
// when absent: the new-schema replacement for the old .devrites/ACTIVE lookup.
|
|
26
26
|
func activeSlug(root string) string {
|
|
27
27
|
slug, err := devritespaths.ActiveSlug(root)
|
|
28
28
|
if err != nil {
|
|
@@ -32,7 +32,7 @@ func activeSlug(root string) string {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// preambleArtifacts is the fixed order preamble.sh scans for present artifacts.
|
|
35
|
-
// It is NOT sorted
|
|
35
|
+
// It is NOT sorted: the display order is the workflow order, so the port keeps
|
|
36
36
|
// the literal list.
|
|
37
37
|
var preambleArtifacts = []string{
|
|
38
38
|
"brief", "spec", "references", "strategy", "plan", "tasks", "eng-review",
|
|
@@ -41,7 +41,7 @@ var preambleArtifacts = []string{
|
|
|
41
41
|
"polish-report", "review", "seal", "ship", "handoff",
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
// Preamble prints the active feature's workspace state
|
|
44
|
+
// Preamble prints the active feature's workspace state: the orientation every
|
|
45
45
|
// workspace-operating rite-* skill runs first (step 0). Read-only. root is the
|
|
46
46
|
// .devrites directory; slug defaults to the active feature at <root>/ACTIVE.
|
|
47
47
|
// Always exits 0: orientation is never a hard dependency.
|
|
@@ -63,7 +63,7 @@ func Preamble(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
63
63
|
|
|
64
64
|
if state, err := os.ReadFile(filepath.Join(workDir, "state.md")); err == nil {
|
|
65
65
|
fmt.Fprintln(stdout, "### state.md")
|
|
66
|
-
// Emit the file verbatim, like `cat
|
|
66
|
+
// Emit the file verbatim, like `cat`: no added trailing newline.
|
|
67
67
|
_, _ = stdout.Write(state)
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -148,7 +148,7 @@ func isHeadingLine(line string) bool {
|
|
|
148
148
|
|
|
149
149
|
// splitLinesNoTrailing splits data into lines on '\n', dropping a single trailing
|
|
150
150
|
// newline's empty final element so a "\n"-terminated file yields N lines, not N+1
|
|
151
|
-
//
|
|
151
|
+
// : matching how awk/grep iterate records.
|
|
152
152
|
func splitLinesNoTrailing(data []byte) []string {
|
|
153
153
|
s := string(data)
|
|
154
154
|
s = strings.TrimSuffix(s, "\n")
|
|
@@ -12,18 +12,18 @@ import (
|
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
// State-parsing patterns ported verbatim from progress.sh's awk. Each name-strip
|
|
15
|
-
// sub is anchored (^ or $), so it matches at most once per line
|
|
15
|
+
// sub is anchored (^ or $), so it matches at most once per line: ReplaceAllString
|
|
16
16
|
// is therefore equivalent to awk's single-match sub.
|
|
17
17
|
var (
|
|
18
18
|
sliceCheckRe = regexp.MustCompile(`^- \[[^\]]*\][[:space:]]*`) // drop "- [x] "
|
|
19
19
|
sliceNameRe = regexp.MustCompile(`^Slice[[:space:]]*[0-9]+:[[:space:]]*`) // drop "Slice N: "
|
|
20
20
|
sliceStateRe = regexp.MustCompile(`[[:space:]]+(built|pending)[[:space:]]*$`)
|
|
21
|
-
sliceSepRe = regexp.MustCompile(`[[:space:]]+[^[:alnum:][:space:]]+[[:space:]]*$`) // drop "
|
|
21
|
+
sliceSepRe = regexp.MustCompile(`[[:space:]]+[^[:alnum:][:space:]]+[[:space:]]*$`) // drop " · "
|
|
22
22
|
sliceCheckedRe = regexp.MustCompile(`\[[xX]\]`)
|
|
23
23
|
sliceHeadingRe = regexp.MustCompile(`^##[[:space:]]+(SLICE-[0-9]{3})(?:[[:space:]]+(.*))?$`)
|
|
24
24
|
)
|
|
25
25
|
|
|
26
|
-
// Progress renders the active feature's position
|
|
26
|
+
// Progress renders the active feature's position: the deterministic footer every
|
|
27
27
|
// workspace-operating rite-* skill prints last. Read-only. Prints nothing and
|
|
28
28
|
// exits 0 when there is no active workspace, so pre-spec callers stay silent. root
|
|
29
29
|
// is the .devrites directory; slug defaults to the active feature at <root>/ACTIVE.
|
|
@@ -38,7 +38,7 @@ func Progress(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
38
38
|
workDir := featureDir(root, slug)
|
|
39
39
|
statePath := filepath.Join(workDir, "state.md")
|
|
40
40
|
if slug == "" || !isFile(statePath) {
|
|
41
|
-
return 0 // silent
|
|
41
|
+
return 0 // silent: no active workspace
|
|
42
42
|
}
|
|
43
43
|
stateBytes, err := os.ReadFile(statePath)
|
|
44
44
|
if err != nil {
|
|
@@ -180,7 +180,7 @@ func parsePhase(lines []string) string {
|
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
// tallySlices reads the "## Slice progress" block: total slice lines, how many are
|
|
183
|
-
// checked, and the display name of the last checked one
|
|
183
|
+
// checked, and the display name of the last checked one: the awk in progress.sh.
|
|
184
184
|
func tallySlices(lines []string) (total, built int, lastbuilt string) {
|
|
185
185
|
inp := false
|
|
186
186
|
for _, line := range lines {
|
|
@@ -9,7 +9,7 @@ import (
|
|
|
9
9
|
"strings"
|
|
10
10
|
)
|
|
11
11
|
|
|
12
|
-
// Reconcile enforces that the orchestrator never edits source itself
|
|
12
|
+
// Reconcile enforces that the orchestrator never edits source itself: only the
|
|
13
13
|
// dispatched slice-wright writes code and tests, while the orchestrator writes
|
|
14
14
|
// bookkeeping under .devrites/. `snapshot` records the working tree just before
|
|
15
15
|
// the wright runs; `check` diffs it afterward and flags any changed path that is
|
|
@@ -17,8 +17,8 @@ import (
|
|
|
17
17
|
// <root>/features/<slug>.
|
|
18
18
|
//
|
|
19
19
|
// 0 clean check, snapshot written, inline fallback, or skipped (not a git repo)
|
|
20
|
-
// 5 VIOLATION
|
|
21
|
-
// 6 setup error
|
|
20
|
+
// 5 VIOLATION: source changed outside the wright's claimed set
|
|
21
|
+
// 6 setup error: bad args, missing snapshot, or missing claimed manifest
|
|
22
22
|
func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
23
23
|
mode := argAt(args, 0)
|
|
24
24
|
slug := argAt(args, 1)
|
|
@@ -29,7 +29,7 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
29
29
|
cwd, _ := os.Getwd()
|
|
30
30
|
gitRoot := gitToplevel(cwd)
|
|
31
31
|
if gitRoot == "" {
|
|
32
|
-
fmt.Fprintln(stderr, "reconcile: not a git repo
|
|
32
|
+
fmt.Fprintln(stderr, "reconcile: not a git repo: gate skipped, verify the diff by hand.")
|
|
33
33
|
return 0
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -37,28 +37,37 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
37
37
|
base := filepath.Join(d, ".reconcile-base")
|
|
38
38
|
claimed := filepath.Join(d, ".reconcile-claimed")
|
|
39
39
|
inline := filepath.Join(d, ".reconcile-inline")
|
|
40
|
+
objects := filepath.Join(d, ".reconcile-objects")
|
|
40
41
|
|
|
41
42
|
if slug == "" || !isDir(d) {
|
|
42
43
|
s := slug
|
|
43
44
|
if s == "" {
|
|
44
45
|
s = "<unset>"
|
|
45
46
|
}
|
|
46
|
-
fmt.Fprintf(stderr, "reconcile: no active workspace (slug=%s)
|
|
47
|
+
fmt.Fprintf(stderr, "reconcile: no active workspace (slug=%s): nothing to reconcile.\n", s)
|
|
47
48
|
return 6
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
closeWindow := func() {
|
|
51
|
+
closeWindow := func() {
|
|
52
|
+
_ = os.Remove(base)
|
|
53
|
+
_ = os.Remove(claimed)
|
|
54
|
+
_ = os.Remove(inline)
|
|
55
|
+
_ = os.RemoveAll(objects)
|
|
56
|
+
}
|
|
51
57
|
|
|
52
58
|
switch mode {
|
|
53
59
|
case "snapshot":
|
|
54
60
|
_ = os.Remove(inline) // clear any stale sentinel / prior-slice manifest
|
|
55
61
|
_ = os.Remove(claimed)
|
|
56
|
-
|
|
62
|
+
_ = os.RemoveAll(objects)
|
|
63
|
+
tree, err := worktreeTree(gitRoot, objects)
|
|
57
64
|
if err != nil {
|
|
65
|
+
_ = os.RemoveAll(objects)
|
|
58
66
|
fmt.Fprintf(stderr, "reconcile: cannot snapshot worktree: %v\n", err)
|
|
59
67
|
return 6
|
|
60
68
|
}
|
|
61
69
|
if err := os.WriteFile(base, []byte(tree+"\n"), 0o644); err != nil {
|
|
70
|
+
_ = os.RemoveAll(objects)
|
|
62
71
|
fmt.Fprintf(stderr, "reconcile: cannot write snapshot: %v\n", err)
|
|
63
72
|
return 6
|
|
64
73
|
}
|
|
@@ -67,16 +76,16 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
67
76
|
|
|
68
77
|
case "check":
|
|
69
78
|
if isFile(inline) {
|
|
70
|
-
fmt.Fprintln(stderr, "reconcile: inline-fallback run (no wright dispatched)
|
|
79
|
+
fmt.Fprintln(stderr, "reconcile: inline-fallback run (no wright dispatched): gate skipped.")
|
|
71
80
|
closeWindow()
|
|
72
81
|
return 0
|
|
73
82
|
}
|
|
74
83
|
if !isFile(base) {
|
|
75
|
-
fmt.Fprintln(stderr, `reconcile: no snapshot (.reconcile-base)
|
|
84
|
+
fmt.Fprintln(stderr, `reconcile: no snapshot (.reconcile-base): run "devrites-engine reconcile snapshot" before dispatch.`)
|
|
76
85
|
return 6
|
|
77
86
|
}
|
|
78
87
|
if !isFile(claimed) {
|
|
79
|
-
fmt.Fprintln(stderr, "reconcile: no claimed manifest (.reconcile-claimed)
|
|
88
|
+
fmt.Fprintln(stderr, "reconcile: no claimed manifest (.reconcile-claimed): write the wright Files-changed paths first.")
|
|
80
89
|
return 6
|
|
81
90
|
}
|
|
82
91
|
baseBytes, err := os.ReadFile(base)
|
|
@@ -86,19 +95,34 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
86
95
|
}
|
|
87
96
|
baseTree := strings.TrimSpace(string(baseBytes))
|
|
88
97
|
if baseTree == "" {
|
|
89
|
-
fmt.Fprintln(stderr, "reconcile: empty snapshot (.reconcile-base)
|
|
98
|
+
fmt.Fprintln(stderr, "reconcile: empty snapshot (.reconcile-base): re-run \"devrites-engine reconcile snapshot\" before dispatch.")
|
|
99
|
+
return 6
|
|
100
|
+
}
|
|
101
|
+
if !isDir(objects) {
|
|
102
|
+
fmt.Fprintln(stderr, "reconcile: missing snapshot object database (.reconcile-objects): re-run \"devrites-engine reconcile snapshot\" before dispatch.")
|
|
90
103
|
return 6
|
|
91
104
|
}
|
|
92
|
-
nowTree, err := worktreeTree(gitRoot)
|
|
105
|
+
nowTree, err := worktreeTree(gitRoot, objects)
|
|
93
106
|
if err != nil {
|
|
94
107
|
fmt.Fprintf(stderr, "reconcile: cannot capture worktree: %v\n", err)
|
|
95
108
|
return 6
|
|
96
109
|
}
|
|
110
|
+
diff := exec.Command("git", "-C", gitRoot, "diff", "--name-only", baseTree, nowTree)
|
|
111
|
+
diff.Env, err = reconcileGitEnv(gitRoot, objects)
|
|
112
|
+
if err != nil {
|
|
113
|
+
fmt.Fprintf(stderr, "reconcile: cannot compare worktree: %v\n", err)
|
|
114
|
+
return 6
|
|
115
|
+
}
|
|
116
|
+
diffOut, err := diff.CombinedOutput()
|
|
117
|
+
if err != nil {
|
|
118
|
+
fmt.Fprintf(stderr, "reconcile: cannot compare worktree: git diff --name-only: %v: %s\n", err, strings.TrimSpace(string(diffOut)))
|
|
119
|
+
return 6
|
|
120
|
+
}
|
|
97
121
|
|
|
98
122
|
claimedSet := claimedPaths(claimed)
|
|
99
123
|
viol := 0
|
|
100
124
|
var violist strings.Builder
|
|
101
|
-
for _, f := range
|
|
125
|
+
for _, f := range splitLinesNoTrailing(diffOut) {
|
|
102
126
|
if f == "" || strings.HasPrefix(f, ".devrites/") {
|
|
103
127
|
continue
|
|
104
128
|
}
|
|
@@ -108,13 +132,13 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
108
132
|
}
|
|
109
133
|
}
|
|
110
134
|
if viol > 0 {
|
|
111
|
-
fmt.Fprintf(stderr, "reconcile: STOP
|
|
135
|
+
fmt.Fprintf(stderr, "reconcile: STOP: %d source file(s) changed OUTSIDE the wright (A1 breach):\n", viol)
|
|
112
136
|
fmt.Fprint(stderr, violist.String())
|
|
113
137
|
fmt.Fprintln(stderr, "The orchestrator must NOT edit source. Re-dispatch the wright (continue it once) or revert these.")
|
|
114
138
|
return 5
|
|
115
139
|
}
|
|
116
140
|
closeWindow()
|
|
117
|
-
fmt.Fprintln(stdout, "reconcile: OK
|
|
141
|
+
fmt.Fprintln(stdout, "reconcile: OK: every source change is the wright's; orchestrator touched only bookkeeping.")
|
|
118
142
|
return 0
|
|
119
143
|
|
|
120
144
|
default:
|
|
@@ -132,23 +156,36 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
132
156
|
// snapshot and the check would then record that same sha, the diff would come
|
|
133
157
|
// back empty, and the gate would report OK on precisely the A1 breach it exists
|
|
134
158
|
// to catch. Surface the error and let the caller fail closed.
|
|
135
|
-
func worktreeTree(gitRoot string) (string, error) {
|
|
159
|
+
func worktreeTree(gitRoot, objectDir string) (string, error) {
|
|
136
160
|
idx := filepath.Join(os.TempDir(), fmt.Sprintf("devrites-reconcile-%d.idx", os.Getpid()))
|
|
137
161
|
_ = os.Remove(idx)
|
|
138
162
|
defer func() { _ = os.Remove(idx) }()
|
|
139
|
-
|
|
163
|
+
if err := os.MkdirAll(objectDir, 0o700); err != nil {
|
|
164
|
+
return "", fmt.Errorf("create object directory: %w", err)
|
|
165
|
+
}
|
|
166
|
+
env, err := reconcileGitEnv(gitRoot, objectDir)
|
|
167
|
+
if err != nil {
|
|
168
|
+
return "", err
|
|
169
|
+
}
|
|
170
|
+
env = append(env, "GIT_INDEX_FILE="+idx)
|
|
140
171
|
|
|
141
172
|
add := exec.Command("git", "-C", gitRoot, "add", "-A")
|
|
142
173
|
add.Env = env
|
|
143
|
-
|
|
144
|
-
if err
|
|
174
|
+
addOut, err := add.CombinedOutput()
|
|
175
|
+
if err != nil {
|
|
176
|
+
if detail := strings.TrimSpace(string(addOut)); detail != "" {
|
|
177
|
+
return "", fmt.Errorf("git add -A: %w: %s", err, detail)
|
|
178
|
+
}
|
|
145
179
|
return "", fmt.Errorf("git add -A: %w", err)
|
|
146
180
|
}
|
|
147
181
|
|
|
148
182
|
write := exec.Command("git", "-C", gitRoot, "write-tree")
|
|
149
183
|
write.Env = env
|
|
150
|
-
out, err := write.
|
|
184
|
+
out, err := write.CombinedOutput()
|
|
151
185
|
if err != nil {
|
|
186
|
+
if detail := strings.TrimSpace(string(out)); detail != "" {
|
|
187
|
+
return "", fmt.Errorf("git write-tree: %w: %s", err, detail)
|
|
188
|
+
}
|
|
152
189
|
return "", fmt.Errorf("git write-tree: %w", err)
|
|
153
190
|
}
|
|
154
191
|
tree := strings.TrimSpace(string(out))
|
|
@@ -158,6 +195,29 @@ func worktreeTree(gitRoot string) (string, error) {
|
|
|
158
195
|
return tree, nil
|
|
159
196
|
}
|
|
160
197
|
|
|
198
|
+
func reconcileGitEnv(gitRoot, objectDir string) ([]string, error) {
|
|
199
|
+
common := exec.Command("git", "-C", gitRoot, "rev-parse", "--git-common-dir")
|
|
200
|
+
out, err := common.CombinedOutput()
|
|
201
|
+
if err != nil {
|
|
202
|
+
return nil, fmt.Errorf("git rev-parse --git-common-dir: %w: %s", err, strings.TrimSpace(string(out)))
|
|
203
|
+
}
|
|
204
|
+
commonDir := strings.TrimSpace(string(out))
|
|
205
|
+
if !filepath.IsAbs(commonDir) {
|
|
206
|
+
commonDir = filepath.Join(gitRoot, commonDir)
|
|
207
|
+
}
|
|
208
|
+
alternates := []string{filepath.Join(commonDir, "objects")}
|
|
209
|
+
if inherited := os.Getenv("GIT_OBJECT_DIRECTORY"); inherited != "" {
|
|
210
|
+
alternates = append(alternates, inherited)
|
|
211
|
+
}
|
|
212
|
+
if inherited := os.Getenv("GIT_ALTERNATE_OBJECT_DIRECTORIES"); inherited != "" {
|
|
213
|
+
alternates = append(alternates, inherited)
|
|
214
|
+
}
|
|
215
|
+
return append(os.Environ(),
|
|
216
|
+
"GIT_OBJECT_DIRECTORY="+objectDir,
|
|
217
|
+
"GIT_ALTERNATE_OBJECT_DIRECTORIES="+strings.Join(alternates, string(os.PathListSeparator)),
|
|
218
|
+
), nil
|
|
219
|
+
}
|
|
220
|
+
|
|
161
221
|
// claimedPaths reads the .reconcile-claimed manifest into a set of the exact
|
|
162
222
|
// paths the wright reported changing.
|
|
163
223
|
func claimedPaths(path string) map[string]struct{} {
|