devrites 6.0.3 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +24 -9
- package/SECURITY.md +9 -6
- package/bin/devrites.mjs +28 -12
- package/docs/adr/0035-claude-root-leaves-plan-mode.md +33 -0
- package/docs/adr/0036-archive-recall-is-a-read-time-query.md +32 -0
- package/docs/adr/README.md +4 -2
- package/docs/cli.md +25 -2
- package/docs/command-map.md +10 -8
- package/docs/engine/commands.md +10 -7
- package/docs/harness-compliance.md +2 -2
- package/docs/orchestration.md +5 -4
- package/docs/release.md +4 -4
- package/docs/skills.md +2 -2
- package/engine/commands.go +1 -1
- package/engine/help.go +10 -6
- package/engine/internal/acceptance/cli.go +4 -1
- package/engine/internal/acceptance/exec.go +11 -11
- package/engine/internal/devritespaths/paths.go +5 -0
- package/engine/internal/hostpack/hostpack.go +48 -3
- package/engine/internal/install/apply.go +68 -1
- package/engine/internal/install/binary.go +4 -0
- package/engine/internal/install/install.go +25 -15
- package/engine/internal/install/merge.go +287 -123
- package/engine/internal/install/preflight.go +71 -1
- package/engine/internal/install/uninstall.go +7 -1
- package/engine/internal/install/update.go +7 -3
- package/engine/internal/lib/claims.go +30 -14
- package/engine/internal/lib/cli_observe.go +6 -0
- package/engine/internal/lib/context.go +35 -12
- package/engine/internal/lib/diffscope.go +79 -3
- package/engine/internal/lib/dispatch.go +78 -12
- package/engine/internal/lib/drift.go +9 -2
- package/engine/internal/lib/handoff.go +14 -5
- package/engine/internal/lib/metrics.go +103 -10
- package/engine/internal/lib/migrate.go +30 -12
- package/engine/internal/lib/next.go +22 -2
- package/engine/internal/lib/observe_summary.go +8 -0
- package/engine/internal/lib/open_visual.go +3 -1
- package/engine/internal/lib/recall.go +355 -0
- package/engine/internal/lib/regression.go +20 -0
- package/engine/internal/lib/resolve.go +96 -53
- package/engine/internal/lib/secretscan.go +24 -1
- package/engine/internal/lib/taskgraph.go +31 -1
- package/engine/internal/lib/util.go +18 -7
- package/engine/internal/lib/windows.go +68 -15
- package/engine/internal/markdowntext/markdowntext.go +45 -6
- package/engine/internal/notes/cli.go +5 -3
- package/engine/internal/notes/notes.go +8 -3
- package/engine/internal/overhaul/admit/run.go +16 -12
- package/engine/internal/overhaul/overhaul.go +1 -0
- package/engine/internal/overhaul/records/check.go +52 -9
- package/engine/internal/overhaul/render/run.go +3 -2
- package/engine/internal/overhaul/snapshot/run.go +2 -2
- package/engine/internal/parallel/git.go +5 -6
- package/engine/internal/parallel/ops.go +3 -0
- package/engine/internal/parallel/pathdisjoint.go +9 -4
- package/engine/internal/release/release.go +11 -9
- package/engine/internal/safepath/safepath.go +17 -1
- package/engine/internal/state/budgets.go +8 -4
- package/engine/internal/state/feature.go +3 -1
- package/engine/internal/state/observation.go +12 -7
- package/engine/internal/state/taskgraph.go +67 -12
- package/engine/internal/state/write.go +7 -1
- package/engine/main.go +6 -2
- package/pack/.claude/agents/_shared/composition-overhaul.md +2 -0
- package/pack/.claude/agents/devrites-devex-reviewer.md +5 -0
- package/pack/.claude/agents/devrites-evidence-scout.md +4 -0
- package/pack/.claude/agents/devrites-plan-reviewer.md +4 -1
- package/pack/.claude/agents/devrites-slice-wright.md +4 -1
- package/pack/.claude/agents/overhaul-implementer.md +1 -0
- package/pack/.claude/settings.json +4 -4
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-audit/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-browser-proof/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +3 -2
- package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/intent-map.md +3 -3
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
- package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +2 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +13 -0
- package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
- package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/.claude/skills/overhaul/references/orchestration.md +6 -2
- package/pack/.claude/skills/overhaul/references/records.md +8 -3
- package/pack/.claude/skills/rite/SKILL.md +4 -3
- package/pack/.claude/skills/rite/reference/menu.md +6 -5
- package/pack/.claude/skills/rite-adopt/SKILL.md +4 -3
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +6 -5
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +2 -1
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/.claude/skills/rite-build/reference/output.md +1 -1
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +2 -0
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +19 -0
- package/pack/.claude/skills/rite-converge/SKILL.md +4 -3
- package/pack/.claude/skills/rite-customize/SKILL.md +1 -1
- package/pack/.claude/skills/rite-define/SKILL.md +3 -2
- package/pack/.claude/skills/rite-doctor/SKILL.md +12 -6
- package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/.claude/skills/rite-explain/SKILL.md +1 -1
- package/pack/.claude/skills/rite-fast/SKILL.md +3 -1
- package/pack/.claude/skills/rite-handoff/SKILL.md +4 -3
- package/pack/.claude/skills/rite-learn/SKILL.md +2 -2
- package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
- package/pack/.claude/skills/rite-plan/reference/slicing.md +3 -1
- package/pack/.claude/skills/rite-pov/SKILL.md +1 -1
- package/pack/.claude/skills/rite-pr-feedback/SKILL.md +5 -4
- package/pack/.claude/skills/rite-pressure-test/SKILL.md +7 -5
- package/pack/.claude/skills/rite-prototype/SKILL.md +1 -1
- package/pack/.claude/skills/rite-quick/SKILL.md +10 -5
- package/pack/.claude/skills/rite-resolve/SKILL.md +3 -3
- package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
- package/pack/.claude/skills/rite-review/SKILL.md +2 -1
- package/pack/.claude/skills/rite-seal/SKILL.md +3 -3
- package/pack/.claude/skills/rite-seal/reference/go-no-go.md +2 -0
- package/pack/.claude/skills/rite-seal/reference/seal-template.md +5 -2
- package/pack/.claude/skills/rite-ship/reference/close-out.md +3 -2
- package/pack/.claude/skills/rite-spec/SKILL.md +4 -1
- package/pack/.claude/skills/rite-status/SKILL.md +1 -1
- package/pack/.claude/skills/rite-temper/reference/significance.md +2 -0
- package/pack/.claude/skills/rite-upgrade/SKILL.md +4 -2
- package/pack/.claude/skills/rite-vet/SKILL.md +3 -2
- package/pack/.claude/skills/rite-vet/reference/artifacts.md +1 -1
- package/pack/.claude/skills/rite-watch-pr/SKILL.md +1 -1
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -1
- package/pack/generated/claude/agents/devrites-devex-reviewer.md +5 -0
- package/pack/generated/claude/agents/devrites-evidence-scout.md +4 -0
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +4 -1
- package/pack/generated/claude/agents/devrites-slice-wright.md +4 -1
- package/pack/generated/claude/agents/overhaul-backend-engineer.md +2 -0
- package/pack/generated/claude/agents/overhaul-boundary.md +2 -0
- package/pack/generated/claude/agents/overhaul-craft.md +2 -0
- package/pack/generated/claude/agents/overhaul-frontend-engineer.md +2 -0
- package/pack/generated/claude/agents/overhaul-implementer.md +3 -0
- package/pack/generated/claude/agents/overhaul-recon.md +2 -0
- package/pack/generated/claude/agents/overhaul-specialist.md +2 -0
- package/pack/generated/claude/agents/overhaul-verifier.md +2 -0
- package/pack/generated/claude/settings.json +4 -4
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +3 -2
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +3 -3
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
- package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +2 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +13 -0
- package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
- package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/claude/skills/overhaul/references/orchestration.md +6 -2
- package/pack/generated/claude/skills/overhaul/references/records.md +8 -3
- package/pack/generated/claude/skills/rite/SKILL.md +4 -3
- package/pack/generated/claude/skills/rite/reference/menu.md +6 -5
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +4 -3
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +6 -5
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +2 -1
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/generated/claude/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +2 -0
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +19 -0
- package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -3
- package/pack/generated/claude/skills/rite-customize/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-define/SKILL.md +3 -2
- package/pack/generated/claude/skills/rite-doctor/SKILL.md +12 -6
- package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-fast/SKILL.md +3 -1
- package/pack/generated/claude/skills/rite-handoff/SKILL.md +4 -3
- package/pack/generated/claude/skills/rite-learn/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +3 -1
- package/pack/generated/claude/skills/rite-pov/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +5 -4
- package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +7 -5
- package/pack/generated/claude/skills/rite-prototype/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-quick/SKILL.md +10 -5
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +3 -3
- package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
- package/pack/generated/claude/skills/rite-review/SKILL.md +2 -1
- package/pack/generated/claude/skills/rite-seal/SKILL.md +3 -3
- package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +2 -0
- package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +5 -2
- package/pack/generated/claude/skills/rite-ship/reference/close-out.md +3 -2
- package/pack/generated/claude/skills/rite-spec/SKILL.md +4 -1
- package/pack/generated/claude/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-temper/reference/significance.md +2 -0
- package/pack/generated/claude/skills/rite-upgrade/SKILL.md +4 -2
- package/pack/generated/claude/skills/rite-vet/SKILL.md +3 -2
- package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +1 -1
- package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -1
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +7 -7
- package/pack/generated/codex/agents/devrites-devex-reviewer.toml +6 -1
- package/pack/generated/codex/agents/devrites-evidence-scout.toml +4 -0
- package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +1 -1
- package/pack/generated/codex/agents/devrites-plan-drafter.toml +3 -3
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +5 -2
- package/pack/generated/codex/agents/devrites-proof-runner.toml +2 -2
- package/pack/generated/codex/agents/devrites-security-auditor.toml +1 -1
- package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +1 -1
- package/pack/generated/codex/agents/devrites-slice-wright.toml +8 -5
- package/pack/generated/codex/agents/devrites-test-analyst.toml +5 -5
- package/pack/generated/codex/agents/devrites-upgrade-planner.toml +1 -1
- package/pack/generated/codex/agents/fast-builder.toml +3 -3
- package/pack/generated/codex/agents/fast-critic.toml +3 -3
- package/pack/generated/codex/agents/overhaul-backend-engineer.toml +2 -0
- package/pack/generated/codex/agents/overhaul-boundary.toml +2 -0
- package/pack/generated/codex/agents/overhaul-craft.toml +2 -0
- package/pack/generated/codex/agents/overhaul-frontend-engineer.toml +2 -0
- package/pack/generated/codex/agents/overhaul-implementer.toml +2 -0
- package/pack/generated/codex/agents/overhaul-recon.toml +2 -0
- package/pack/generated/codex/agents/overhaul-specialist.toml +2 -0
- package/pack/generated/codex/agents/overhaul-verifier.toml +2 -0
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +3 -2
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +3 -3
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
- package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
- package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
- package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +2 -0
- package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +13 -0
- package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
- package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/codex/skills/overhaul/SKILL.md +15 -15
- package/pack/generated/codex/skills/overhaul/references/audit-domains.md +2 -2
- package/pack/generated/codex/skills/overhaul/references/orchestration.md +11 -7
- package/pack/generated/codex/skills/overhaul/references/records.md +8 -3
- package/pack/generated/codex/skills/rite/SKILL.md +4 -3
- package/pack/generated/codex/skills/rite/reference/menu.md +6 -5
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +4 -3
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +7 -6
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +2 -1
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
- package/pack/generated/codex/skills/rite-build/SKILL.md +2 -2
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/generated/codex/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +2 -0
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +20 -1
- package/pack/generated/codex/skills/rite-clarify/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-converge/SKILL.md +5 -4
- package/pack/generated/codex/skills/rite-customize/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-define/SKILL.md +4 -3
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +12 -6
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-fast/SKILL.md +8 -6
- package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +4 -3
- package/pack/generated/codex/skills/rite-learn/SKILL.md +2 -2
- package/pack/generated/codex/skills/rite-plan/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +2 -0
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +3 -1
- package/pack/generated/codex/skills/rite-polish/SKILL.md +2 -2
- package/pack/generated/codex/skills/rite-pov/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -4
- package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -5
- package/pack/generated/codex/skills/rite-prototype/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-prove/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-quick/SKILL.md +11 -6
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +3 -3
- package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +4 -5
- package/pack/generated/codex/skills/rite-review/SKILL.md +3 -2
- package/pack/generated/codex/skills/rite-seal/SKILL.md +4 -4
- package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +2 -0
- package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +5 -2
- package/pack/generated/codex/skills/rite-ship/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-ship/reference/close-out.md +3 -2
- package/pack/generated/codex/skills/rite-spec/SKILL.md +5 -2
- package/pack/generated/codex/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-temper/SKILL.md +2 -2
- package/pack/generated/codex/skills/rite-temper/reference/significance.md +2 -0
- package/pack/generated/codex/skills/rite-upgrade/SKILL.md +4 -2
- package/pack/generated/codex/skills/rite-vet/SKILL.md +4 -3
- package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +1 -1
- package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +1 -1
- package/pack/generated/devin/AGENTS.md +1 -1
- package/pack/generated/devin/agents/devrites-devex-reviewer.md +5 -0
- package/pack/generated/devin/agents/devrites-evidence-scout.md +4 -0
- package/pack/generated/devin/agents/devrites-plan-reviewer.md +4 -1
- package/pack/generated/devin/agents/devrites-slice-wright.md +4 -1
- package/pack/generated/devin/agents/overhaul-backend-engineer.md +2 -0
- package/pack/generated/devin/agents/overhaul-boundary.md +2 -0
- package/pack/generated/devin/agents/overhaul-craft.md +2 -0
- package/pack/generated/devin/agents/overhaul-frontend-engineer.md +2 -0
- package/pack/generated/devin/agents/overhaul-implementer.md +2 -0
- package/pack/generated/devin/agents/overhaul-recon.md +2 -0
- package/pack/generated/devin/agents/overhaul-specialist.md +2 -0
- package/pack/generated/devin/agents/overhaul-verifier.md +2 -0
- package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +3 -2
- package/pack/generated/devin/skills/devrites-doubt/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-frontend-craft/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-interview/SKILL.md +2 -2
- package/pack/generated/devin/skills/devrites-lib/reference/intent-map.md +3 -3
- package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
- package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +8 -7
- package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +1 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/code-review.md +1 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/performance.md +2 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +13 -0
- package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
- package/pack/generated/devin/skills/devrites-prose-craft/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-source-driven/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/devin/skills/overhaul/SKILL.md +15 -15
- package/pack/generated/devin/skills/overhaul/references/audit-domains.md +2 -2
- package/pack/generated/devin/skills/overhaul/references/orchestration.md +11 -7
- package/pack/generated/devin/skills/overhaul/references/records.md +8 -3
- package/pack/generated/devin/skills/rite/SKILL.md +4 -3
- package/pack/generated/devin/skills/rite/reference/menu.md +6 -5
- package/pack/generated/devin/skills/rite-adopt/SKILL.md +4 -3
- package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +8 -7
- package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +1 -1
- package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +2 -1
- package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +3 -2
- package/pack/generated/devin/skills/rite-build/SKILL.md +2 -2
- package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +2 -2
- package/pack/generated/devin/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +1 -1
- package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +2 -0
- package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +20 -1
- package/pack/generated/devin/skills/rite-clarify/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-converge/SKILL.md +5 -4
- package/pack/generated/devin/skills/rite-customize/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-define/SKILL.md +4 -3
- package/pack/generated/devin/skills/rite-doctor/SKILL.md +12 -6
- package/pack/generated/devin/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/generated/devin/skills/rite-explain/SKILL.md +3 -3
- package/pack/generated/devin/skills/rite-explain/reference/intake.md +1 -1
- package/pack/generated/devin/skills/rite-fast/SKILL.md +8 -6
- package/pack/generated/devin/skills/rite-frame/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-handoff/SKILL.md +4 -3
- package/pack/generated/devin/skills/rite-learn/SKILL.md +2 -2
- package/pack/generated/devin/skills/rite-plan/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +2 -0
- package/pack/generated/devin/skills/rite-plan/reference/slicing.md +3 -1
- package/pack/generated/devin/skills/rite-polish/SKILL.md +2 -2
- package/pack/generated/devin/skills/rite-pov/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-pr-feedback/SKILL.md +5 -4
- package/pack/generated/devin/skills/rite-pressure-test/SKILL.md +7 -5
- package/pack/generated/devin/skills/rite-prototype/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-prove/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-quick/SKILL.md +11 -6
- package/pack/generated/devin/skills/rite-resolve/SKILL.md +4 -4
- package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +4 -5
- package/pack/generated/devin/skills/rite-review/SKILL.md +3 -2
- package/pack/generated/devin/skills/rite-seal/SKILL.md +4 -4
- package/pack/generated/devin/skills/rite-seal/reference/go-no-go.md +2 -0
- package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +5 -2
- package/pack/generated/devin/skills/rite-ship/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-ship/reference/close-out.md +3 -2
- package/pack/generated/devin/skills/rite-spec/SKILL.md +5 -2
- package/pack/generated/devin/skills/rite-spec/reference/investigation.md +1 -1
- package/pack/generated/devin/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-temper/SKILL.md +3 -3
- package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +1 -1
- package/pack/generated/devin/skills/rite-temper/reference/significance.md +3 -1
- package/pack/generated/devin/skills/rite-upgrade/SKILL.md +4 -2
- package/pack/generated/devin/skills/rite-vet/SKILL.md +4 -3
- package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +1 -1
- package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +2 -2
- package/pack/generated/devin/skills/rite-watch-pr/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +1 -1
- package/pack/generated/omp/agents/devrites-code-reviewer.md +7 -7
- package/pack/generated/omp/agents/devrites-devex-reviewer.md +6 -1
- package/pack/generated/omp/agents/devrites-evidence-scout.md +4 -0
- package/pack/generated/omp/agents/devrites-frontend-reviewer.md +1 -1
- package/pack/generated/omp/agents/devrites-plan-drafter.md +3 -3
- package/pack/generated/omp/agents/devrites-plan-reviewer.md +5 -2
- package/pack/generated/omp/agents/devrites-proof-runner.md +2 -2
- package/pack/generated/omp/agents/devrites-security-auditor.md +1 -1
- package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +1 -1
- package/pack/generated/omp/agents/devrites-slice-wright.md +8 -5
- package/pack/generated/omp/agents/devrites-test-analyst.md +5 -5
- package/pack/generated/omp/agents/devrites-upgrade-planner.md +1 -1
- package/pack/generated/omp/agents/fast-builder.md +3 -3
- package/pack/generated/omp/agents/fast-critic.md +3 -3
- package/pack/generated/omp/agents/overhaul-backend-engineer.md +2 -0
- package/pack/generated/omp/agents/overhaul-boundary.md +2 -0
- package/pack/generated/omp/agents/overhaul-craft.md +2 -0
- package/pack/generated/omp/agents/overhaul-frontend-engineer.md +2 -0
- package/pack/generated/omp/agents/overhaul-implementer.md +2 -0
- package/pack/generated/omp/agents/overhaul-recon.md +2 -0
- package/pack/generated/omp/agents/overhaul-specialist.md +2 -0
- package/pack/generated/omp/agents/overhaul-verifier.md +2 -0
- package/pack/generated/omp/commands/rite-resolve.md +1 -1
- package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +4 -4
- package/pack/generated/omp/skills/devrites-audit/SKILL.md +5 -5
- package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +5 -5
- package/pack/generated/omp/skills/devrites-browser-proof/reference/browser-performance.md +1 -1
- package/pack/generated/omp/skills/devrites-browser-proof/reference/visual-verdict.md +1 -1
- package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +7 -6
- package/pack/generated/omp/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +1 -1
- package/pack/generated/omp/skills/devrites-doubt/SKILL.md +6 -6
- package/pack/generated/omp/skills/devrites-frontend-craft/SKILL.md +3 -3
- package/pack/generated/omp/skills/devrites-frontend-craft/reference/craft.md +1 -1
- package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +4 -4
- package/pack/generated/omp/skills/devrites-frontend-craft/reference/fullstack.md +1 -1
- package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +8 -8
- package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +2 -2
- package/pack/generated/omp/skills/devrites-frontend-craft/reference/shape.md +2 -2
- package/pack/generated/omp/skills/devrites-interview/SKILL.md +3 -3
- package/pack/generated/omp/skills/devrites-lib/reference/intent-map.md +4 -4
- package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +8 -7
- package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +13 -12
- package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +6 -6
- package/pack/generated/omp/skills/devrites-lib/reference/standards/browser-proof-checklist.md +2 -2
- package/pack/generated/omp/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/code-review.md +3 -3
- package/pack/generated/omp/skills/devrites-lib/reference/standards/coding-style.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +2 -2
- package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +3 -3
- package/pack/generated/omp/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
- package/pack/generated/omp/skills/devrites-lib/reference/standards/debug-recovery.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/developer-experience.md +8 -3
- package/pack/generated/omp/skills/devrites-lib/reference/standards/glossary.md +3 -3
- package/pack/generated/omp/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
- package/pack/generated/omp/skills/devrites-lib/reference/standards/performance.md +3 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/prose-style.md +4 -4
- package/pack/generated/omp/skills/devrites-lib/reference/standards/release/ship-checklist.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/review/README.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/review/ci-workflows.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/review/react.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/review/stack-profile.md +5 -5
- package/pack/generated/omp/skills/devrites-lib/reference/standards/skill-authoring.md +15 -3
- package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +3 -3
- package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +14 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/verification-methods.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/index.md +2 -2
- package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +12 -8
- package/pack/generated/omp/skills/devrites-prose-craft/SKILL.md +4 -4
- package/pack/generated/omp/skills/devrites-prose-craft/reference/examples.md +1 -1
- package/pack/generated/omp/skills/devrites-source-driven/SKILL.md +3 -3
- package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +10 -10
- package/pack/generated/omp/skills/devrites-ux-shape/reference/brief-template.md +3 -3
- package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +1 -1
- package/pack/generated/omp/skills/overhaul/references/orchestration.md +6 -2
- package/pack/generated/omp/skills/overhaul/references/records.md +8 -3
- package/pack/generated/omp/skills/rite/SKILL.md +8 -7
- package/pack/generated/omp/skills/rite/reference/menu.md +6 -5
- package/pack/generated/omp/skills/rite-adopt/SKILL.md +6 -5
- package/pack/generated/omp/skills/rite-adopt/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +11 -10
- package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +1 -1
- package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +4 -3
- package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
- package/pack/generated/omp/skills/rite-build/SKILL.md +7 -7
- package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +4 -2
- package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +2 -2
- package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +2 -2
- package/pack/generated/omp/skills/rite-build/reference/frontend-trigger.md +1 -1
- package/pack/generated/omp/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +4 -4
- package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +8 -6
- package/pack/generated/omp/skills/rite-build/reference/tdd.md +1 -1
- package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +27 -8
- package/pack/generated/omp/skills/rite-clarify/SKILL.md +4 -4
- package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-converge/SKILL.md +16 -15
- package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +4 -4
- package/pack/generated/omp/skills/rite-customize/SKILL.md +2 -2
- package/pack/generated/omp/skills/rite-define/SKILL.md +25 -24
- package/pack/generated/omp/skills/rite-define/reference/anti-patterns.md +2 -2
- package/pack/generated/omp/skills/rite-define/reference/gates.md +2 -2
- package/pack/generated/omp/skills/rite-doctor/SKILL.md +12 -6
- package/pack/generated/omp/skills/rite-dogfood/SKILL.md +5 -5
- package/pack/generated/omp/skills/rite-explain/SKILL.md +7 -7
- package/pack/generated/omp/skills/rite-explain/reference/intake.md +1 -1
- package/pack/generated/omp/skills/rite-fast/SKILL.md +12 -10
- package/pack/generated/omp/skills/rite-fast/reference/artifacts.md +1 -1
- package/pack/generated/omp/skills/rite-frame/SKILL.md +6 -6
- package/pack/generated/omp/skills/rite-frame/reference/failure-modes.md +4 -4
- package/pack/generated/omp/skills/rite-handoff/SKILL.md +7 -6
- package/pack/generated/omp/skills/rite-learn/SKILL.md +6 -6
- package/pack/generated/omp/skills/rite-plan/SKILL.md +8 -8
- package/pack/generated/omp/skills/rite-plan/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +3 -1
- package/pack/generated/omp/skills/rite-plan/reference/slicing.md +6 -4
- package/pack/generated/omp/skills/rite-plan/reference/task-breakdown.md +1 -1
- package/pack/generated/omp/skills/rite-polish/SKILL.md +6 -6
- package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +9 -9
- package/pack/generated/omp/skills/rite-polish/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-polish/reference/backend-polish.md +2 -2
- package/pack/generated/omp/skills/rite-polish/reference/browser-polish-evidence.md +1 -1
- package/pack/generated/omp/skills/rite-polish/reference/code.md +8 -8
- package/pack/generated/omp/skills/rite-polish/reference/design-memory.md +3 -3
- package/pack/generated/omp/skills/rite-polish/reference/design-system-discovery.md +1 -1
- package/pack/generated/omp/skills/rite-polish/reference/harden-checklist.md +1 -1
- package/pack/generated/omp/skills/rite-polish/reference/ledger.md +3 -3
- package/pack/generated/omp/skills/rite-polish/reference/ui.md +1 -1
- package/pack/generated/omp/skills/rite-pov/SKILL.md +2 -2
- package/pack/generated/omp/skills/rite-pr-feedback/SKILL.md +6 -5
- package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +9 -7
- package/pack/generated/omp/skills/rite-prototype/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-prove/SKILL.md +13 -13
- package/pack/generated/omp/skills/rite-prove/reference/acceptance-proof.md +7 -7
- package/pack/generated/omp/skills/rite-prove/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +3 -3
- package/pack/generated/omp/skills/rite-prove/reference/failure-triage.md +2 -2
- package/pack/generated/omp/skills/rite-quick/SKILL.md +19 -14
- package/pack/generated/omp/skills/rite-resolve/SKILL.md +6 -6
- package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +4 -5
- package/pack/generated/omp/skills/rite-review/SKILL.md +23 -22
- package/pack/generated/omp/skills/rite-review/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-review/reference/cognitive-load.md +2 -2
- package/pack/generated/omp/skills/rite-review/reference/nielsen-heuristics.md +1 -1
- package/pack/generated/omp/skills/rite-review/reference/performance-checklist.md +1 -1
- package/pack/generated/omp/skills/rite-review/reference/performance-review.md +1 -1
- package/pack/generated/omp/skills/rite-review/reference/security-review.md +2 -2
- package/pack/generated/omp/skills/rite-seal/SKILL.md +11 -11
- package/pack/generated/omp/skills/rite-seal/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +3 -3
- package/pack/generated/omp/skills/rite-seal/reference/go-no-go.md +3 -1
- package/pack/generated/omp/skills/rite-seal/reference/output.md +1 -1
- package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +4 -4
- package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +5 -2
- package/pack/generated/omp/skills/rite-ship/SKILL.md +7 -7
- package/pack/generated/omp/skills/rite-ship/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-ship/reference/close-out.md +5 -4
- package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +2 -2
- package/pack/generated/omp/skills/rite-ship/reference/rollout.md +3 -3
- package/pack/generated/omp/skills/rite-spec/SKILL.md +17 -14
- package/pack/generated/omp/skills/rite-spec/reference/anti-patterns.md +1 -1
- package/pack/generated/omp/skills/rite-spec/reference/investigation.md +3 -3
- package/pack/generated/omp/skills/rite-spec/reference/question-protocol.md +1 -1
- package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +2 -2
- package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +8 -8
- package/pack/generated/omp/skills/rite-status/SKILL.md +2 -2
- package/pack/generated/omp/skills/rite-temper/SKILL.md +13 -13
- package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +2 -2
- package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -3
- package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +3 -3
- package/pack/generated/omp/skills/rite-temper/reference/significance.md +4 -2
- package/pack/generated/omp/skills/rite-upgrade/SKILL.md +7 -5
- package/pack/generated/omp/skills/rite-vet/SKILL.md +14 -13
- package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +2 -2
- package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +3 -3
- package/pack/generated/omp/skills/rite-vet/reference/depth.md +3 -3
- package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +5 -5
- package/pack/generated/omp/skills/rite-watch-pr/SKILL.md +2 -2
- package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +1 -1
- package/pack/generated/pi/agents/devrites-devex-reviewer.md +5 -0
- package/pack/generated/pi/agents/devrites-evidence-scout.md +4 -0
- package/pack/generated/pi/agents/devrites-plan-reviewer.md +4 -1
- package/pack/generated/pi/agents/devrites-slice-wright.md +4 -1
- package/pack/generated/pi/agents/overhaul-backend-engineer.md +2 -0
- package/pack/generated/pi/agents/overhaul-boundary.md +2 -0
- package/pack/generated/pi/agents/overhaul-craft.md +2 -0
- package/pack/generated/pi/agents/overhaul-frontend-engineer.md +2 -0
- package/pack/generated/pi/agents/overhaul-implementer.md +2 -0
- package/pack/generated/pi/agents/overhaul-recon.md +2 -0
- package/pack/generated/pi/agents/overhaul-specialist.md +2 -0
- package/pack/generated/pi/agents/overhaul-verifier.md +2 -0
- package/pack/generated/pi/prompts/rite-resolve.md +1 -1
- package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +3 -2
- package/pack/generated/pi/skills/devrites-doubt/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-interview/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +3 -3
- package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
- package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
- package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +2 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +13 -0
- package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
- package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/pi/skills/overhaul/SKILL.md +15 -15
- package/pack/generated/pi/skills/overhaul/references/audit-domains.md +2 -2
- package/pack/generated/pi/skills/overhaul/references/orchestration.md +11 -7
- package/pack/generated/pi/skills/overhaul/references/records.md +8 -3
- package/pack/generated/pi/skills/rite/SKILL.md +4 -3
- package/pack/generated/pi/skills/rite/reference/menu.md +6 -5
- package/pack/generated/pi/skills/rite-adopt/SKILL.md +4 -3
- package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +7 -6
- package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +2 -1
- package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
- package/pack/generated/pi/skills/rite-build/SKILL.md +2 -2
- package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/generated/pi/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +1 -1
- package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +2 -0
- package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +20 -1
- package/pack/generated/pi/skills/rite-clarify/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-converge/SKILL.md +5 -4
- package/pack/generated/pi/skills/rite-customize/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-define/SKILL.md +4 -3
- package/pack/generated/pi/skills/rite-doctor/SKILL.md +12 -6
- package/pack/generated/pi/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/generated/pi/skills/rite-explain/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-fast/SKILL.md +8 -6
- package/pack/generated/pi/skills/rite-frame/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-handoff/SKILL.md +4 -3
- package/pack/generated/pi/skills/rite-learn/SKILL.md +2 -2
- package/pack/generated/pi/skills/rite-plan/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +2 -0
- package/pack/generated/pi/skills/rite-plan/reference/slicing.md +3 -1
- package/pack/generated/pi/skills/rite-polish/SKILL.md +2 -2
- package/pack/generated/pi/skills/rite-pov/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +5 -4
- package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +7 -5
- package/pack/generated/pi/skills/rite-prototype/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-prove/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-quick/SKILL.md +11 -6
- package/pack/generated/pi/skills/rite-resolve/SKILL.md +3 -3
- package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +4 -5
- package/pack/generated/pi/skills/rite-review/SKILL.md +3 -2
- package/pack/generated/pi/skills/rite-seal/SKILL.md +4 -4
- package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +2 -0
- package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +5 -2
- package/pack/generated/pi/skills/rite-ship/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-ship/reference/close-out.md +3 -2
- package/pack/generated/pi/skills/rite-spec/SKILL.md +5 -2
- package/pack/generated/pi/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-temper/SKILL.md +2 -2
- package/pack/generated/pi/skills/rite-temper/reference/significance.md +2 -0
- package/pack/generated/pi/skills/rite-upgrade/SKILL.md +4 -2
- package/pack/generated/pi/skills/rite-vet/SKILL.md +4 -3
- package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +1 -1
- package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +1 -1
- package/package.json +3 -2
- package/scripts/build-host-artifacts.sh +13 -0
- package/scripts/codex-generate.sh +5 -1
- package/scripts/devin-generate.sh +4 -3
- package/scripts/install-lib.sh +5 -0
- package/scripts/omp-generate.sh +23 -1
- package/scripts/pi-generate.sh +2 -2
- package/engine/cmd/releasepack/main_test.go +0 -239
- package/engine/harnessmatrix_test.go +0 -46
- package/engine/help_test.go +0 -241
- package/engine/internal/acceptance/acceptance_test.go +0 -946
- package/engine/internal/devritespaths/paths_test.go +0 -128
- package/engine/internal/fsutil/copy_test.go +0 -154
- package/engine/internal/gate/gate_test.go +0 -865
- package/engine/internal/gate/readiness_binding_test.go +0 -443
- package/engine/internal/gitenv/env_test.go +0 -48
- package/engine/internal/hostpack/hostpack_test.go +0 -269
- package/engine/internal/install/install_test.go +0 -1741
- package/engine/internal/install/workspace_advisory_test.go +0 -54
- package/engine/internal/lib/candidate_test.go +0 -506
- package/engine/internal/lib/claims_test.go +0 -267
- package/engine/internal/lib/closeout_test.go +0 -266
- package/engine/internal/lib/context_next_test.go +0 -860
- package/engine/internal/lib/cursor_compat_test.go +0 -65
- package/engine/internal/lib/detect_test.go +0 -118
- package/engine/internal/lib/drift_test.go +0 -135
- package/engine/internal/lib/dup_test.go +0 -666
- package/engine/internal/lib/environment_report_test.go +0 -54
- package/engine/internal/lib/evidencefresh_test.go +0 -120
- package/engine/internal/lib/handoff_test.go +0 -83
- package/engine/internal/lib/manifest_union_test.go +0 -251
- package/engine/internal/lib/metrics_test.go +0 -28
- package/engine/internal/lib/migrate_test.go +0 -213
- package/engine/internal/lib/observe_budgets_test.go +0 -396
- package/engine/internal/lib/open_visual_test.go +0 -291
- package/engine/internal/lib/regression_test.go +0 -282
- package/engine/internal/lib/resolve_remediation_test.go +0 -192
- package/engine/internal/lib/secretscan_test.go +0 -556
- package/engine/internal/lib/slicecheck_test.go +0 -170
- package/engine/internal/lib/taskgraph_test.go +0 -353
- package/engine/internal/lib/triggers_test.go +0 -23
- package/engine/internal/lib/util_test.go +0 -148
- package/engine/internal/lib/visual_outline_test.go +0 -189
- package/engine/internal/lib/windows_test.go +0 -420
- package/engine/internal/lib/workspace_read_test.go +0 -102
- package/engine/internal/markdowntext/markdowntext_fuzz_test.go +0 -36
- package/engine/internal/markdowntext/markdowntext_test.go +0 -58
- package/engine/internal/markdowntext/testdata/structural.json +0 -277
- package/engine/internal/notes/notes_test.go +0 -545
- package/engine/internal/overhaul/admit/admit_test.go +0 -204
- package/engine/internal/overhaul/admit/packet_test.go +0 -223
- package/engine/internal/overhaul/bench/run_test.go +0 -316
- package/engine/internal/overhaul/ovio/ovio_test.go +0 -75
- package/engine/internal/overhaul/packet/packet_test.go +0 -263
- package/engine/internal/overhaul/records/init_test.go +0 -96
- package/engine/internal/overhaul/records/records_test.go +0 -696
- package/engine/internal/overhaul/records/run_test.go +0 -77
- package/engine/internal/overhaul/render/run_test.go +0 -928
- package/engine/internal/overhaul/score/run_test.go +0 -636
- package/engine/internal/overhaul/snapshot/run_test.go +0 -718
- package/engine/internal/parallel/cli_test.go +0 -91
- package/engine/internal/parallel/ops_test.go +0 -939
- package/engine/internal/parallel/parallel_test.go +0 -645
- package/engine/internal/parallel/pathdisjoint_fuzz_test.go +0 -43
- package/engine/internal/parallel/pathdisjoint_test.go +0 -193
- package/engine/internal/parallel/select_test.go +0 -95
- package/engine/internal/parallel/testdata/fuzz/FuzzPathDisjoint/a449b81b4711b7b4 +0 -3
- package/engine/internal/reason/reason_test.go +0 -37
- package/engine/internal/release/release_test.go +0 -181
- package/engine/internal/rootfacts/facts_test.go +0 -364
- package/engine/internal/safepath/safepath_fuzz_test.go +0 -21
- package/engine/internal/safepath/safepath_test.go +0 -69
- package/engine/internal/safepath/safepath_windows_test.go +0 -26
- package/engine/internal/state/acceptance_test.go +0 -57
- package/engine/internal/state/budgets_test.go +0 -135
- package/engine/internal/state/cmd/workflowmanifest/main_test.go +0 -96
- package/engine/internal/state/concurrency_test.go +0 -184
- package/engine/internal/state/cursor_fuzz_test.go +0 -80
- package/engine/internal/state/cursor_test.go +0 -276
- package/engine/internal/state/observation_test.go +0 -961
- package/engine/internal/state/observation_unix_test.go +0 -68
- package/engine/internal/state/state_test.go +0 -986
- package/engine/internal/state/taskgraph_fuzz_test.go +0 -38
- package/engine/internal/state/taskgraph_test.go +0 -43
- package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/114b28f68c1fa4db +0 -4
- package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/378a0f2218e812ea +0 -4
- package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/39eaa26fcb481e3c +0 -4
- package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/776ca1dc0143acf0 +0 -4
- package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/9295930c1ebb81df +0 -4
- package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/a60de309dc33be0d +0 -4
- package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f04dc7b06ef7c99f +0 -4
- package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f3000ac510878bd6 +0 -4
- package/engine/internal/state/testdata/fuzz/FuzzWorkspaceSchemaRow/a75aabb9f2a847d5 +0 -2
- package/engine/internal/state/workspaceschema_fuzz_test.go +0 -27
- package/engine/internal/state/workspaceschema_test.go +0 -101
- package/engine/internal/state/write_test.go +0 -136
- package/engine/internal/version/version_test.go +0 -29
- package/engine/internal/workflow/commands_test.go +0 -18
- package/engine/note_routing_test.go +0 -95
- package/engine/observation_contract_test.go +0 -175
- package/engine/root_routing_test.go +0 -340
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
package lib
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"errors"
|
|
5
|
+
"fmt"
|
|
6
|
+
"io"
|
|
7
|
+
"io/fs"
|
|
8
|
+
"os"
|
|
9
|
+
"path/filepath"
|
|
10
|
+
"regexp"
|
|
11
|
+
"sort"
|
|
12
|
+
"strconv"
|
|
13
|
+
"strings"
|
|
14
|
+
"time"
|
|
15
|
+
"unicode"
|
|
16
|
+
|
|
17
|
+
"github.com/devrites/devrites/internal/devritespaths"
|
|
18
|
+
"github.com/devrites/devrites/internal/markdowntext"
|
|
19
|
+
"github.com/devrites/devrites/internal/parallel"
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
// RecallUsage is the help and usage-error text for `recall`.
|
|
23
|
+
const RecallUsage = `usage: devrites-engine recall --paths <p1,p2,...> [--paths <p>]... [--limit n]
|
|
24
|
+
|
|
25
|
+
Lists archived features (.devrites/archive/<slug>/) whose touched-files.md
|
|
26
|
+
candidate manifest covers a queried project-relative path: exact or as a
|
|
27
|
+
directory prefix, case-folded. Ranked by overlap count, then newest archive
|
|
28
|
+
directory mtime, then slug; --limit caps the features shown (default 10).
|
|
29
|
+
Each feature prints up to 8 pointers (then "+N more"): decisions.md DEC-###
|
|
30
|
+
entries and ## Carry-forward constraints bullets whose Files: overlap (or a
|
|
31
|
+
constraint naming no files), and review.md/seal.md/drift.md lines that mention
|
|
32
|
+
a queried path. Fenced examples are ignored. Pointer files are relative to
|
|
33
|
+
.devrites. Read-only: computed on every call; nothing is written, cached, or
|
|
34
|
+
indexed. An unreadable archive entry prints "unreadable:" and the scan goes on.
|
|
35
|
+
Exit 0 ok (including no archive or no match), 1 invalid archive directory, 2 usage.`
|
|
36
|
+
|
|
37
|
+
const (
|
|
38
|
+
recallDefaultLimit = 10
|
|
39
|
+
recallPointerCap = 8
|
|
40
|
+
recallClipRunes = 120
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
// recallPointerFiles are scanned in this order; decisions.md is structural,
|
|
44
|
+
// the rest are searched for path mentions.
|
|
45
|
+
var recallPointerFiles = []string{"decisions.md", "review.md", "seal.md", "drift.md"}
|
|
46
|
+
|
|
47
|
+
var recallDecisionHeading = regexp.MustCompile(`^#{1,6}[ \t]+DEC-[0-9]+`)
|
|
48
|
+
|
|
49
|
+
type recallFeature struct {
|
|
50
|
+
slug string
|
|
51
|
+
dir string
|
|
52
|
+
mtime time.Time
|
|
53
|
+
matched []string // queried paths the manifest covers, in query order
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// RunRecall answers "what did earlier features decide or find about these
|
|
57
|
+
// paths" by reading the archive on every call (ADR-0014/ADR-0022 forbid an
|
|
58
|
+
// engine index or ledger). It never writes, not even a metric.
|
|
59
|
+
func RunRecall(root string, args []string, stdout, stderr io.Writer) int {
|
|
60
|
+
queries, limit, ok := parseRecallArgs(args, stderr)
|
|
61
|
+
if !ok {
|
|
62
|
+
return 2
|
|
63
|
+
}
|
|
64
|
+
archiveDir, err := devritespaths.ArchiveDirChecked(root)
|
|
65
|
+
if err != nil {
|
|
66
|
+
fmt.Fprintf(stderr, "recall: invalid archive directory: %v\n", err)
|
|
67
|
+
return 1
|
|
68
|
+
}
|
|
69
|
+
entries, err := os.ReadDir(archiveDir)
|
|
70
|
+
if errors.Is(err, fs.ErrNotExist) {
|
|
71
|
+
fmt.Fprintln(stdout, "recall: no archive")
|
|
72
|
+
return 0
|
|
73
|
+
}
|
|
74
|
+
if err != nil {
|
|
75
|
+
fmt.Fprintf(stderr, "recall: read archive: %v\n", err)
|
|
76
|
+
return 1
|
|
77
|
+
}
|
|
78
|
+
var features []recallFeature
|
|
79
|
+
var unreadable []string
|
|
80
|
+
for _, entry := range entries {
|
|
81
|
+
name := entry.Name()
|
|
82
|
+
// Hidden scratch dirs and stray files are not archived features.
|
|
83
|
+
if strings.HasPrefix(name, ".") || entry.Type().IsRegular() {
|
|
84
|
+
continue
|
|
85
|
+
}
|
|
86
|
+
label := "archive/" + name
|
|
87
|
+
dir, err := devritespaths.ExistingArchivedFeatureDirChecked(root, name)
|
|
88
|
+
if err != nil {
|
|
89
|
+
unreadable = append(unreadable, fmt.Sprintf("%s (%v)", label, err))
|
|
90
|
+
continue
|
|
91
|
+
}
|
|
92
|
+
raw, err := readBoundedRegularFile(filepath.Join(dir, "touched-files.md"), maxCandidateManifestBytes)
|
|
93
|
+
if errors.Is(err, fs.ErrNotExist) {
|
|
94
|
+
continue // never built: touched nothing
|
|
95
|
+
}
|
|
96
|
+
var rows []candidateRow
|
|
97
|
+
if err == nil {
|
|
98
|
+
rows, err = parseCandidateManifest(raw)
|
|
99
|
+
}
|
|
100
|
+
if err != nil {
|
|
101
|
+
unreadable = append(unreadable, fmt.Sprintf("%s/touched-files.md (%v)", label, err))
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
matched := recallMatched(queries, rows)
|
|
105
|
+
if len(matched) == 0 {
|
|
106
|
+
continue
|
|
107
|
+
}
|
|
108
|
+
feature := recallFeature{slug: name, dir: dir, matched: matched}
|
|
109
|
+
if info, err := entry.Info(); err == nil {
|
|
110
|
+
feature.mtime = info.ModTime()
|
|
111
|
+
}
|
|
112
|
+
features = append(features, feature)
|
|
113
|
+
}
|
|
114
|
+
sort.SliceStable(features, func(i, j int) bool {
|
|
115
|
+
a, b := features[i], features[j]
|
|
116
|
+
if len(a.matched) != len(b.matched) {
|
|
117
|
+
return len(a.matched) > len(b.matched)
|
|
118
|
+
}
|
|
119
|
+
if !a.mtime.Equal(b.mtime) {
|
|
120
|
+
return a.mtime.After(b.mtime)
|
|
121
|
+
}
|
|
122
|
+
return a.slug < b.slug
|
|
123
|
+
})
|
|
124
|
+
if len(features) == 0 {
|
|
125
|
+
fmt.Fprintln(stdout, "recall: no archived feature touched these paths")
|
|
126
|
+
} else {
|
|
127
|
+
fmt.Fprintf(stdout, "recall: %d archived feature(s) touched these paths\n", len(features))
|
|
128
|
+
if len(features) > limit {
|
|
129
|
+
fmt.Fprintf(stdout, "recall: truncated to %d feature(s) (--limit)\n", limit)
|
|
130
|
+
features = features[:limit]
|
|
131
|
+
}
|
|
132
|
+
for _, f := range features {
|
|
133
|
+
fmt.Fprintf(stdout, "feature %s overlap=%d paths=%s\n", f.slug, len(f.matched), strings.Join(f.matched, ","))
|
|
134
|
+
writeRecallPointers(stdout, f.dir, "archive/"+f.slug, queries)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
for _, line := range unreadable {
|
|
138
|
+
fmt.Fprintf(stdout, "unreadable: %s\n", line)
|
|
139
|
+
}
|
|
140
|
+
return 0
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
func parseRecallArgs(args []string, stderr io.Writer) ([]string, int, bool) {
|
|
144
|
+
limit := recallDefaultLimit
|
|
145
|
+
var queries []string
|
|
146
|
+
seen := map[string]bool{}
|
|
147
|
+
for i := 0; i < len(args); i++ {
|
|
148
|
+
switch args[i] {
|
|
149
|
+
case "--paths":
|
|
150
|
+
value := argAt(args, i+1)
|
|
151
|
+
i++
|
|
152
|
+
if strings.TrimSpace(value) == "" || strings.HasPrefix(value, "-") {
|
|
153
|
+
fmt.Fprintln(stderr, "recall: --paths requires a comma-separated path list (not a flag)")
|
|
154
|
+
return nil, 0, false
|
|
155
|
+
}
|
|
156
|
+
for _, raw := range strings.Split(value, ",") {
|
|
157
|
+
if strings.TrimSpace(raw) == "" {
|
|
158
|
+
continue
|
|
159
|
+
}
|
|
160
|
+
path, err := parallel.NormalizePath(raw)
|
|
161
|
+
if err == nil && strings.HasPrefix(path, "-") {
|
|
162
|
+
err = fmt.Errorf("path must not look like a flag: %q", raw)
|
|
163
|
+
}
|
|
164
|
+
if err != nil {
|
|
165
|
+
fmt.Fprintf(stderr, "recall: --paths: %v\n", err)
|
|
166
|
+
return nil, 0, false
|
|
167
|
+
}
|
|
168
|
+
if key := strings.ToLower(path); !seen[key] {
|
|
169
|
+
seen[key] = true
|
|
170
|
+
queries = append(queries, path)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
case "--limit":
|
|
174
|
+
n, err := strconv.Atoi(argAt(args, i+1))
|
|
175
|
+
if err != nil || n < 1 {
|
|
176
|
+
fmt.Fprintf(stderr, "recall: --limit expects a positive integer, got %q\n", argAt(args, i+1))
|
|
177
|
+
return nil, 0, false
|
|
178
|
+
}
|
|
179
|
+
limit = n
|
|
180
|
+
i++
|
|
181
|
+
default:
|
|
182
|
+
fmt.Fprintf(stderr, "recall: unexpected argument %q\n%s\n", args[i], RecallUsage)
|
|
183
|
+
return nil, 0, false
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if len(queries) == 0 {
|
|
187
|
+
fmt.Fprintln(stderr, RecallUsage)
|
|
188
|
+
return nil, 0, false
|
|
189
|
+
}
|
|
190
|
+
return queries, limit, true
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// recallMatched returns the queries covered by a manifest row, folding case
|
|
194
|
+
// and matching directory prefixes with the claim-overlap rule.
|
|
195
|
+
func recallMatched(queries []string, rows []candidateRow) []string {
|
|
196
|
+
var matched []string
|
|
197
|
+
for _, q := range queries {
|
|
198
|
+
for _, row := range rows {
|
|
199
|
+
if claimPathsOverlap(row.path, q) {
|
|
200
|
+
matched = append(matched, q)
|
|
201
|
+
break
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return matched
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
func writeRecallPointers(w io.Writer, dir, label string, queries []string) {
|
|
209
|
+
var pointers, unreadable []string
|
|
210
|
+
for _, name := range recallPointerFiles {
|
|
211
|
+
raw, err := readBoundedRegularFile(filepath.Join(dir, name), maxCandidateArtifactBytes)
|
|
212
|
+
if errors.Is(err, fs.ErrNotExist) {
|
|
213
|
+
continue
|
|
214
|
+
}
|
|
215
|
+
if err == nil {
|
|
216
|
+
raw, err = markdowntext.Structural(raw)
|
|
217
|
+
}
|
|
218
|
+
if err != nil {
|
|
219
|
+
unreadable = append(unreadable, fmt.Sprintf("%s/%s (%v)", label, name, err))
|
|
220
|
+
continue
|
|
221
|
+
}
|
|
222
|
+
lines := strings.Split(string(raw), "\n")
|
|
223
|
+
var hits []int
|
|
224
|
+
if name == "decisions.md" {
|
|
225
|
+
hits = recallDecisionHits(lines, queries)
|
|
226
|
+
} else {
|
|
227
|
+
for i, line := range lines {
|
|
228
|
+
if recallMentions(line, queries) {
|
|
229
|
+
hits = append(hits, i)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
for _, i := range hits {
|
|
234
|
+
pointers = append(pointers, fmt.Sprintf("%s/%s:%d %s", label, name, i+1, clipRunes(strings.TrimSpace(lines[i]), recallClipRunes)))
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
for i, p := range pointers {
|
|
238
|
+
if i == recallPointerCap {
|
|
239
|
+
fmt.Fprintf(w, " +%d more\n", len(pointers)-recallPointerCap)
|
|
240
|
+
break
|
|
241
|
+
}
|
|
242
|
+
fmt.Fprintf(w, " %s\n", p)
|
|
243
|
+
}
|
|
244
|
+
for _, u := range unreadable {
|
|
245
|
+
fmt.Fprintf(w, " unreadable: %s\n", u)
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// recallDecisionHits returns the line indexes of DEC-### headings whose
|
|
250
|
+
// Files: field overlaps the queries, and of carry-forward constraint bullets
|
|
251
|
+
// that overlap or name no files. Fenced lines arrive already blanked.
|
|
252
|
+
func recallDecisionHits(lines []string, queries []string) []int {
|
|
253
|
+
var hits []int
|
|
254
|
+
dec, decDone, carry := -1, false, false
|
|
255
|
+
for i, line := range lines {
|
|
256
|
+
trimmed := strings.TrimSpace(line)
|
|
257
|
+
rest := strings.TrimLeft(trimmed, "#")
|
|
258
|
+
if level := len(trimmed) - len(rest); level > 0 && (rest == "" || rest[0] == ' ' || rest[0] == '\t') {
|
|
259
|
+
dec, decDone = -1, false
|
|
260
|
+
if recallDecisionHeading.MatchString(trimmed) {
|
|
261
|
+
dec = i
|
|
262
|
+
}
|
|
263
|
+
// As in handoff's dead ends, a ### subheading stays in the section.
|
|
264
|
+
if level <= 2 {
|
|
265
|
+
carry = strings.EqualFold(trimmed, "## Carry-forward constraints")
|
|
266
|
+
}
|
|
267
|
+
continue
|
|
268
|
+
}
|
|
269
|
+
if dec >= 0 {
|
|
270
|
+
if files, ok := recallFilesField(trimmed); ok && !decDone && recallOverlaps(files, queries) {
|
|
271
|
+
hits = append(hits, dec)
|
|
272
|
+
decDone = true
|
|
273
|
+
}
|
|
274
|
+
continue
|
|
275
|
+
}
|
|
276
|
+
entry, ok := strings.CutPrefix(trimmed, "- ")
|
|
277
|
+
if !carry || !ok || strings.TrimSpace(entry) == "" {
|
|
278
|
+
continue
|
|
279
|
+
}
|
|
280
|
+
var files []string
|
|
281
|
+
if at := strings.LastIndex(entry, "Files:"); at >= 0 {
|
|
282
|
+
files = recallPathList(entry[at+len("Files:"):])
|
|
283
|
+
}
|
|
284
|
+
if len(files) == 0 || recallOverlaps(files, queries) {
|
|
285
|
+
hits = append(hits, i)
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return hits
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// recallFilesField parses a `Files:` field line such as "- Files: a, b" or
|
|
292
|
+
// "**Files:** `a` `b`".
|
|
293
|
+
func recallFilesField(trimmed string) ([]string, bool) {
|
|
294
|
+
s := strings.TrimLeft(trimmed, "-*+ \t")
|
|
295
|
+
if !strings.HasPrefix(strings.ToLower(s), "files:") {
|
|
296
|
+
return nil, false
|
|
297
|
+
}
|
|
298
|
+
return recallPathList(strings.TrimLeft(s[len("files:"):], "* \t")), true
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
func recallPathList(s string) []string {
|
|
302
|
+
switch strings.ToLower(strings.TrimSpace(s)) {
|
|
303
|
+
case "", "none", "n/a", "-", "—":
|
|
304
|
+
return nil
|
|
305
|
+
}
|
|
306
|
+
var out []string
|
|
307
|
+
for _, field := range strings.FieldsFunc(s, func(r rune) bool { return r == ',' || r == ';' || unicode.IsSpace(r) }) {
|
|
308
|
+
field = strings.TrimSuffix(strings.Trim(field, "`'\"()[]"), ".")
|
|
309
|
+
if path, err := parallel.NormalizePath(field); err == nil {
|
|
310
|
+
out = append(out, path)
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return out
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
func recallOverlaps(files, queries []string) bool {
|
|
317
|
+
for _, f := range files {
|
|
318
|
+
for _, q := range queries {
|
|
319
|
+
if claimPathsOverlap(f, q) {
|
|
320
|
+
return true
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return false
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// recallMentions reports a case-folded occurrence of a queried path that is
|
|
328
|
+
// not part of a longer path: "src/a.go" matches "`src/a.go:12`" but not
|
|
329
|
+
// "mysrc/a.go", "lib/src/a.go", or "src/a.gox".
|
|
330
|
+
func recallMentions(line string, queries []string) bool {
|
|
331
|
+
lower := strings.ToLower(line)
|
|
332
|
+
for _, q := range queries {
|
|
333
|
+
q = strings.ToLower(q)
|
|
334
|
+
for from := 0; from < len(lower); {
|
|
335
|
+
at := strings.Index(lower[from:], q)
|
|
336
|
+
if at < 0 {
|
|
337
|
+
break
|
|
338
|
+
}
|
|
339
|
+
start, end := from+at, from+at+len(q)
|
|
340
|
+
before := start == 0 || !recallPathByte(lower[start-1])
|
|
341
|
+
after := end == len(lower) || lower[end] == '/' || !recallPathByte(lower[end]) ||
|
|
342
|
+
lower[end] == '.' && (end+1 == len(lower) || !recallPathByte(lower[end+1]))
|
|
343
|
+
if before && after {
|
|
344
|
+
return true
|
|
345
|
+
}
|
|
346
|
+
from = start + 1
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return false
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
func recallPathByte(c byte) bool {
|
|
353
|
+
return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' ||
|
|
354
|
+
c == '_' || c == '-' || c == '.' || c == '/' || c >= 0x80
|
|
355
|
+
}
|
|
@@ -7,7 +7,9 @@ import (
|
|
|
7
7
|
"os"
|
|
8
8
|
"path/filepath"
|
|
9
9
|
"regexp"
|
|
10
|
+
"slices"
|
|
10
11
|
"sort"
|
|
12
|
+
"strconv"
|
|
11
13
|
"strings"
|
|
12
14
|
"time"
|
|
13
15
|
|
|
@@ -49,6 +51,8 @@ var doneSliceStates = map[string]bool{
|
|
|
49
51
|
var (
|
|
50
52
|
regressACRe = regexp.MustCompile(`(?im)^[ \t]*- \[([xX ])\] (AC-\d+)`)
|
|
51
53
|
regressSliceRe = regexp.MustCompile(`(?m)^## (SLICE-\d+)\b[^\n]*`)
|
|
54
|
+
regressBuiltRe = regexp.MustCompile(`(?m)^[ \t]*[-*] \[[xX]\][^\n]*`)
|
|
55
|
+
regressSliceIDRe = regexp.MustCompile(`(?i)\b(?:SLICE-|Slice )(\d+)\b`)
|
|
52
56
|
regressStatusRe = regexp.MustCompile(`(?im)^Status:[ \t]*([^\s]+)`)
|
|
53
57
|
regressQHeaderRe = regexp.MustCompile(`(?im)^## (q-\d{4}-\d{2}-\d{2}-\d+)\b`)
|
|
54
58
|
regressQStatusRe = regexp.MustCompile(`(?im)^status:[ \t]*([^\s]+)`)
|
|
@@ -170,6 +174,22 @@ func fingerprintWorkspace(root, slug, workspace string) (progressFingerprint, er
|
|
|
170
174
|
if err == nil {
|
|
171
175
|
fp.DoneSlices = doneSlices(masked)
|
|
172
176
|
}
|
|
177
|
+
// The canonical slice grammar has no Status field: Build records the
|
|
178
|
+
// built list in state.md as checked items naming the slice.
|
|
179
|
+
masked, err = maskedArtifact(workspace, "state.md")
|
|
180
|
+
note("state.md", err)
|
|
181
|
+
if err == nil {
|
|
182
|
+
for _, item := range regressBuiltRe.FindAllString(masked, -1) {
|
|
183
|
+
for _, m := range regressSliceIDRe.FindAllStringSubmatch(item, -1) {
|
|
184
|
+
// `SLICE-001` and `Slice 1` name the same slice.
|
|
185
|
+
n, _ := strconv.Atoi(m[1])
|
|
186
|
+
id := fmt.Sprintf("SLICE-%03d", n)
|
|
187
|
+
if !slices.Contains(fp.DoneSlices, id) {
|
|
188
|
+
fp.DoneSlices = append(fp.DoneSlices, id)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
173
193
|
|
|
174
194
|
raw, err := os.ReadFile(filepath.Join(workspace, acceptance.GatesFile)) // #nosec G304 -- workspace artifact
|
|
175
195
|
note(acceptance.GatesFile, err)
|
|
@@ -6,10 +6,12 @@ import (
|
|
|
6
6
|
"os"
|
|
7
7
|
"path/filepath"
|
|
8
8
|
"regexp"
|
|
9
|
+
"slices"
|
|
9
10
|
"strings"
|
|
10
11
|
"time"
|
|
11
12
|
|
|
12
13
|
"github.com/devrites/devrites/internal/fsutil"
|
|
14
|
+
"github.com/devrites/devrites/internal/markdowntext"
|
|
13
15
|
"github.com/devrites/devrites/internal/state"
|
|
14
16
|
"github.com/devrites/devrites/internal/workflow"
|
|
15
17
|
)
|
|
@@ -39,16 +41,17 @@ func Resolve(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
39
41
|
return fail(stderr, err.Error(), 3)
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
human
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
44
|
+
const usage = `Usage: devrites-engine state resolve [--human] <qid> "<answer>" | state resolve [--human] --drop <qid> ["<reason>"] | state resolve [--human] --batch <file>`
|
|
45
|
+
human := slices.Contains(args, "--human")
|
|
46
|
+
args = slices.DeleteFunc(slices.Clone(args), func(arg string) bool { return arg == "--human" })
|
|
46
47
|
var mode, qid, payload string
|
|
48
|
+
maxArgs := 2
|
|
47
49
|
switch first := argAt(args, 0); first {
|
|
48
50
|
case "--drop":
|
|
49
51
|
mode = "drop"
|
|
50
52
|
qid = argAt(args, 1)
|
|
51
53
|
payload = argAt(args, 2)
|
|
54
|
+
maxArgs = 3
|
|
52
55
|
if payload == "" {
|
|
53
56
|
payload = "dropped"
|
|
54
57
|
}
|
|
@@ -59,7 +62,7 @@ func Resolve(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
59
62
|
return fail(stderr, "Batch file not found: "+payload, 5)
|
|
60
63
|
}
|
|
61
64
|
case "":
|
|
62
|
-
return fail(stderr,
|
|
65
|
+
return fail(stderr, usage, 5)
|
|
63
66
|
default:
|
|
64
67
|
mode = "answer"
|
|
65
68
|
qid = first
|
|
@@ -68,6 +71,11 @@ func Resolve(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
68
71
|
return fail(stderr, "Answer text required for "+qid, 5)
|
|
69
72
|
}
|
|
70
73
|
}
|
|
74
|
+
// An unknown flag or a stray argument must never be recorded as a qid or
|
|
75
|
+
// an answer.
|
|
76
|
+
if len(args) > maxArgs || strings.HasPrefix(qid, "-") || mode != "batch" && strings.HasPrefix(payload, "--") {
|
|
77
|
+
return fail(stderr, usage, 5)
|
|
78
|
+
}
|
|
71
79
|
|
|
72
80
|
code := 0
|
|
73
81
|
if err := state.WithFeatureLock(root, slug, func() error {
|
|
@@ -107,31 +115,49 @@ func resolveMutation(mode, qid, payload, qfile, sfile string, human bool, stdout
|
|
|
107
115
|
if err != nil {
|
|
108
116
|
return fail(stderr, "Batch file not found: "+payload, 5)
|
|
109
117
|
}
|
|
118
|
+
// Every line is parsed and applied in memory first, so a bad line
|
|
119
|
+
// leaves questions.md untouched instead of half-resolved.
|
|
120
|
+
type batchEntry struct{ qid, status, text string }
|
|
121
|
+
var entries []batchEntry
|
|
110
122
|
for _, line := range batchLines(data) {
|
|
123
|
+
line = strings.TrimSpace(line)
|
|
111
124
|
if line == "" || strings.HasPrefix(line, "#") {
|
|
112
125
|
continue
|
|
113
126
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
127
|
+
status := "answered"
|
|
128
|
+
if rest, ok := strings.CutPrefix(line, "--drop "); ok {
|
|
129
|
+
status, line = "dropped", rest
|
|
130
|
+
}
|
|
131
|
+
bid, text, ok := strings.Cut(line, ":")
|
|
132
|
+
bid = strings.TrimSpace(bid)
|
|
133
|
+
if !ok || bid == "" || strings.HasPrefix(bid, "-") {
|
|
134
|
+
return fail(stderr, "Malformed batch line (want `<qid>: <answer>` or `--drop <qid>: <reason>`): "+line, 5)
|
|
135
|
+
}
|
|
136
|
+
entries = append(entries, batchEntry{bid, status, strings.TrimPrefix(text, " ")})
|
|
137
|
+
}
|
|
138
|
+
// #nosec G304 -- questions.md path inside the feature workspace
|
|
139
|
+
qdata, err := os.ReadFile(qfile)
|
|
140
|
+
if err != nil {
|
|
141
|
+
return fail(stderr, "questions.md missing at "+qfile, 2)
|
|
142
|
+
}
|
|
143
|
+
lines := splitLinesNoTrailing(qdata)
|
|
144
|
+
for _, entry := range entries {
|
|
145
|
+
var code int
|
|
146
|
+
if lines, code = applyResolution(lines, entry.qid, entry.status, entry.text, human, stderr); code != 0 {
|
|
147
|
+
return code
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if err := fsutil.WriteFileAtomic(qfile, joinRecords(lines), 0o644); err != nil {
|
|
151
|
+
return fail(stderr, err.Error(), 1)
|
|
152
|
+
}
|
|
153
|
+
for _, entry := range entries {
|
|
154
|
+
if err := clearAwaiting(sfile, entry.qid); err != nil {
|
|
155
|
+
return fail(stderr, err.Error(), 1)
|
|
156
|
+
}
|
|
157
|
+
if entry.status == "dropped" {
|
|
158
|
+
fmt.Fprintf(stdout, "Dropped: %s: %s\n", entry.qid, entry.text)
|
|
125
159
|
} else {
|
|
126
|
-
|
|
127
|
-
ans = strings.TrimPrefix(ans, " ")
|
|
128
|
-
if code := resolveQuestion(qfile, bid, "answered", ans, human, stderr); code != 0 {
|
|
129
|
-
return code
|
|
130
|
-
}
|
|
131
|
-
if err := clearAwaiting(sfile, bid); err != nil {
|
|
132
|
-
return fail(stderr, err.Error(), 1)
|
|
133
|
-
}
|
|
134
|
-
fmt.Fprintf(stdout, "Resolved: %s\n", bid)
|
|
160
|
+
fmt.Fprintf(stdout, "Resolved: %s\n", entry.qid)
|
|
135
161
|
}
|
|
136
162
|
}
|
|
137
163
|
}
|
|
@@ -171,16 +197,6 @@ func batchLines(data []byte) []string {
|
|
|
171
197
|
return lines
|
|
172
198
|
}
|
|
173
199
|
|
|
174
|
-
// splitColon splits s at the first ':', returning the parts before and after it
|
|
175
|
-
// (both the whole string when there is no ':').
|
|
176
|
-
func splitColon(s string) (before, after string) {
|
|
177
|
-
before, after, ok := strings.Cut(s, ":")
|
|
178
|
-
if !ok {
|
|
179
|
-
return s, s
|
|
180
|
-
}
|
|
181
|
-
return before, after
|
|
182
|
-
}
|
|
183
|
-
|
|
184
200
|
// clockNow is the resolve command's single wall-clock read. DEVRITES_NOW accepts
|
|
185
201
|
// an RFC-3339 timestamp or YYYY-MM-DD date so tests can keep date-derived
|
|
186
202
|
// question IDs stable. See ADR-0006.
|
|
@@ -210,16 +226,9 @@ func resolveQuestion(qfile, qid, status, answer string, human bool, stderr io.Wr
|
|
|
210
226
|
if err != nil {
|
|
211
227
|
return fail(stderr, "questions.md missing at "+qfile, 2)
|
|
212
228
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
updated, found, notOpen := rewriteQuestionFields(splitLinesNoTrailing(data), target, status, answer, ts, human)
|
|
218
|
-
if !found {
|
|
219
|
-
return fail(stderr, "qid not found: "+qid, 3)
|
|
220
|
-
}
|
|
221
|
-
if notOpen {
|
|
222
|
-
return fail(stderr, "qid not open (already answered/dropped): "+qid, 4)
|
|
229
|
+
updated, code := applyResolution(splitLinesNoTrailing(data), qid, status, answer, human, stderr)
|
|
230
|
+
if code != 0 {
|
|
231
|
+
return code
|
|
223
232
|
}
|
|
224
233
|
if err := fsutil.WriteFileAtomic(qfile, joinRecords(updated), 0o644); err != nil {
|
|
225
234
|
return fail(stderr, err.Error(), 1)
|
|
@@ -228,10 +237,35 @@ func resolveQuestion(qfile, qid, status, answer string, human bool, stderr io.Wr
|
|
|
228
237
|
return 0
|
|
229
238
|
}
|
|
230
239
|
|
|
240
|
+
// applyResolution rewrites the <qid> block in the questions.md lines in memory.
|
|
241
|
+
// Returns 0, or 3 (qid not found) / 4 (qid not open), writing the message on
|
|
242
|
+
// failure.
|
|
243
|
+
func applyResolution(lines []string, qid, status, answer string, human bool, stderr io.Writer) ([]string, int) {
|
|
244
|
+
// Locate blocks on the fence-masked text, as the readiness gate does, so a
|
|
245
|
+
// fenced example is never rewritten and never shadows the real question.
|
|
246
|
+
var visible []string
|
|
247
|
+
if len(lines) > 0 {
|
|
248
|
+
masked, err := markdowntext.Structural([]byte(strings.Join(lines, "\n")))
|
|
249
|
+
if err != nil {
|
|
250
|
+
return nil, fail(stderr, "questions.md is not readable Markdown: "+err.Error(), 1)
|
|
251
|
+
}
|
|
252
|
+
visible = strings.Split(string(masked), "\n")
|
|
253
|
+
}
|
|
254
|
+
target := regexp.MustCompile(`^## ` + regexp.QuoteMeta(qid) + `([[:space:]]|$)`)
|
|
255
|
+
updated, found, notOpen := rewriteQuestionFields(lines, visible, target, status, oneLine(answer), nowUTC(), human)
|
|
256
|
+
if !found {
|
|
257
|
+
return nil, fail(stderr, "qid not found: "+qid, 3)
|
|
258
|
+
}
|
|
259
|
+
if notOpen {
|
|
260
|
+
return nil, fail(stderr, "qid not open (already answered/dropped): "+qid, 4)
|
|
261
|
+
}
|
|
262
|
+
return updated, 0
|
|
263
|
+
}
|
|
264
|
+
|
|
231
265
|
var (
|
|
232
266
|
qHeaderRe = regexp.MustCompile(`(?i)^## q-`)
|
|
233
|
-
statusLineRe = regexp.MustCompile(
|
|
234
|
-
statusStrip = regexp.MustCompile(
|
|
267
|
+
statusLineRe = regexp.MustCompile(`(?i)^status:`)
|
|
268
|
+
statusStrip = regexp.MustCompile(`(?i)^status:[[:space:]]*`)
|
|
235
269
|
answeredAtRe = regexp.MustCompile(`^answered_at:`)
|
|
236
270
|
answerRe = regexp.MustCompile(`^answer:`)
|
|
237
271
|
answeredByRe = regexp.MustCompile(`(?i)^[[:space:]]*answered_by:`)
|
|
@@ -241,8 +275,9 @@ var (
|
|
|
241
275
|
// block, sets status and rewrites any answered_at/answer lines already present. It
|
|
242
276
|
// reports whether the block was found and whether it was already not open (an
|
|
243
277
|
// attempt to re-answer). A target block with no status line at all gets a full set
|
|
244
|
-
// of closing fields appended.
|
|
245
|
-
|
|
278
|
+
// of closing fields appended. Structure is matched on visible (lines with
|
|
279
|
+
// fenced blocks masked, same length); unmatched lines are copied from lines.
|
|
280
|
+
func rewriteQuestionFields(lines, visible []string, target *regexp.Regexp, status, answer, ts string, human bool) (out []string, found, notOpen bool) {
|
|
246
281
|
inQ := false
|
|
247
282
|
statusSeen, answeredAtSeen, answerSeen, answeredBySeen := false, false, false, false
|
|
248
283
|
closeBlock := func() {
|
|
@@ -262,7 +297,8 @@ func rewriteQuestionFields(lines []string, target *regexp.Regexp, status, answer
|
|
|
262
297
|
out = append(out, "answered_by: human")
|
|
263
298
|
}
|
|
264
299
|
}
|
|
265
|
-
for
|
|
300
|
+
for i, original := range lines {
|
|
301
|
+
line := visible[i]
|
|
266
302
|
switch {
|
|
267
303
|
case qHeaderRe.MatchString(line):
|
|
268
304
|
closeBlock()
|
|
@@ -271,11 +307,18 @@ func rewriteQuestionFields(lines []string, target *regexp.Regexp, status, answer
|
|
|
271
307
|
if inQ {
|
|
272
308
|
found = true
|
|
273
309
|
}
|
|
274
|
-
out = append(out,
|
|
310
|
+
out = append(out, original)
|
|
311
|
+
case inQ && hdrSpaceRe.MatchString(line):
|
|
312
|
+
// Any level-two heading ends the question block, as the gate reads it.
|
|
313
|
+
closeBlock()
|
|
314
|
+
inQ = false
|
|
315
|
+
out = append(out, original)
|
|
275
316
|
case inQ && statusLineRe.MatchString(line):
|
|
276
317
|
statusSeen = true
|
|
277
318
|
cur := statusStrip.ReplaceAllString(line, "")
|
|
278
|
-
|
|
319
|
+
// Trim and fold case the way the readiness gate does, so a
|
|
320
|
+
// question the gate counts as open is always resolvable.
|
|
321
|
+
if !strings.EqualFold(strings.TrimSpace(cur), "open") {
|
|
279
322
|
out = append(out, "status: "+cur)
|
|
280
323
|
inQ = false
|
|
281
324
|
notOpen = true
|
|
@@ -294,7 +337,7 @@ func rewriteQuestionFields(lines []string, target *regexp.Regexp, status, answer
|
|
|
294
337
|
out = append(out, "answered_by: human")
|
|
295
338
|
}
|
|
296
339
|
default:
|
|
297
|
-
out = append(out,
|
|
340
|
+
out = append(out, original)
|
|
298
341
|
}
|
|
299
342
|
}
|
|
300
343
|
closeBlock()
|
|
@@ -147,7 +147,7 @@ func SecretScan(root string, args []string, stdin io.Reader, stdout, stderr io.W
|
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
if !staged && slug == "" && !readStdin {
|
|
150
|
-
changed, err :=
|
|
150
|
+
changed, err := gitChangedAndUntrackedNames(project)
|
|
151
151
|
if err != nil {
|
|
152
152
|
fmt.Fprintln(stderr, "secret-scan: cannot inspect changed paths")
|
|
153
153
|
return 2
|
|
@@ -191,6 +191,29 @@ func SecretScan(root string, args []string, stdin io.Reader, stdout, stderr io.W
|
|
|
191
191
|
return writeSecretScanResult(findings, stdout, stderr)
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
+
// gitChangedAndUntrackedNames lists every path that differs from HEAD (staged
|
|
195
|
+
// or not) plus untracked, non-ignored files. On an unborn branch every tracked
|
|
196
|
+
// path is staged, so the index diff stands in for the HEAD diff. Both lists
|
|
197
|
+
// are relative to project, which scanWorktreePaths joins them onto.
|
|
198
|
+
func gitChangedAndUntrackedNames(project string) ([]string, error) {
|
|
199
|
+
changed, err := gitDiffNames(project, "--relative", "HEAD", "--")
|
|
200
|
+
if err != nil {
|
|
201
|
+
if changed, err = gitDiffNames(project, "--relative", "--cached"); err != nil {
|
|
202
|
+
return nil, err
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
out, err := runGitCommand(project, nil, "ls-files", "--others", "--exclude-standard", "-z")
|
|
206
|
+
if err != nil {
|
|
207
|
+
return nil, err
|
|
208
|
+
}
|
|
209
|
+
for _, path := range strings.Split(string(out), "\x00") {
|
|
210
|
+
if path != "" {
|
|
211
|
+
changed = append(changed, path)
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return changed, nil
|
|
215
|
+
}
|
|
216
|
+
|
|
194
217
|
func projectDir(root string) string {
|
|
195
218
|
if filepath.Base(root) == ".devrites" {
|
|
196
219
|
return filepath.Dir(root)
|