devrites 6.0.4 → 6.1.1
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/architecture.md +3 -1
- package/docs/cli.md +25 -2
- package/docs/command-map.md +10 -8
- package/docs/engine/commands.md +6 -3
- 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 +24 -7
- package/engine/internal/lib/diffscope.go +79 -3
- package/engine/internal/lib/dispatch.go +34 -7
- package/engine/internal/lib/drift.go +9 -2
- package/engine/internal/lib/handoff.go +14 -5
- package/engine/internal/lib/metrics.go +29 -9
- package/engine/internal/lib/migrate.go +30 -12
- package/engine/internal/lib/next.go +22 -2
- 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 +5 -1
- 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/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 +8 -6
- 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/reply-contract.md +12 -15
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
- 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/core.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/one-shot-actions.md +7 -6
- 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 +17 -14
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +9 -6
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +6 -3
- package/pack/.claude/skills/rite-build/reference/parallel-batch.md +5 -5
- 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/SKILL.md +1 -1
- 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-prove/SKILL.md +4 -2
- package/pack/.claude/skills/rite-prove/reference/failure-triage.md +2 -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-spec/reference/state-workspace.md +2 -2
- 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/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 +8 -6
- 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/reply-contract.md +12 -15
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
- 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/core.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/one-shot-actions.md +7 -6
- 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 +17 -14
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +9 -6
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +6 -3
- package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +5 -5
- 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/SKILL.md +1 -1
- 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-prove/SKILL.md +4 -2
- package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +2 -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-spec/reference/state-workspace.md +2 -2
- 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 +5 -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 +8 -6
- 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/reply-contract.md +12 -15
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
- 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 +2 -2
- 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/one-shot-actions.md +7 -6
- 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 +18 -15
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +9 -6
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
- package/pack/generated/codex/skills/rite-build/SKILL.md +2 -2
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +6 -3
- package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +6 -6
- 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 +2 -2
- 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 +5 -3
- package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +2 -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-spec/reference/state-workspace.md +2 -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/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 +8 -6
- 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/reply-contract.md +12 -15
- package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +33 -13
- 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 +2 -2
- 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/one-shot-actions.md +7 -6
- 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 +19 -16
- package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +1 -1
- package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +9 -6
- package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +26 -22
- package/pack/generated/devin/skills/rite-build/SKILL.md +2 -2
- package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +6 -3
- package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +2 -2
- package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +6 -6
- 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 +2 -2
- 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 +5 -3
- package/pack/generated/devin/skills/rite-prove/reference/failure-triage.md +2 -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-spec/reference/state-workspace.md +2 -2
- 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 +5 -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 +12 -10
- 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/reply-contract.md +12 -15
- package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +38 -18
- 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 +4 -4
- 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/one-shot-actions.md +7 -6
- 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 +22 -19
- package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +1 -1
- package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +11 -8
- package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
- package/pack/generated/omp/skills/rite-build/SKILL.md +7 -7
- package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +7 -4
- 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/parallel-batch.md +9 -9
- package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +6 -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 +9 -9
- 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 +17 -15
- 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 +4 -3
- 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 +10 -10
- 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/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 +8 -6
- 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/reply-contract.md +12 -15
- package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
- 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 +2 -2
- 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/one-shot-actions.md +7 -6
- 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 +18 -15
- package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +9 -6
- package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
- package/pack/generated/pi/skills/rite-build/SKILL.md +2 -2
- package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +6 -3
- package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +6 -6
- 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 +2 -2
- 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 +5 -3
- package/pack/generated/pi/skills/rite-prove/reference/failure-triage.md +2 -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-spec/reference/state-workspace.md +2 -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 -912
- 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 -428
- 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
|
@@ -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)
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
package lib
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"strings"
|
|
6
|
+
|
|
7
|
+
"github.com/devrites/devrites/internal/state"
|
|
8
|
+
)
|
|
4
9
|
|
|
5
10
|
// TaskSlice is one SLICE-### block parsed from tasks.md.
|
|
6
11
|
type TaskSlice = state.TaskSlice
|
|
@@ -21,3 +26,28 @@ func CheckTaskGraph(root, slug string) (TaskGraphResult, error) {
|
|
|
21
26
|
}
|
|
22
27
|
return ParseTaskGraph(raw), nil
|
|
23
28
|
}
|
|
29
|
+
|
|
30
|
+
// edgeAdvisories names each dependency edge that does not say what crosses it:
|
|
31
|
+
// no `(via <interface>)`, or a via the dependency's Consumes / Produces lacks.
|
|
32
|
+
// An edge the dependent reads nothing across only serializes work.
|
|
33
|
+
func edgeAdvisories(graph TaskGraphResult) []string {
|
|
34
|
+
produces := make(map[string]string, len(graph.Slices))
|
|
35
|
+
for _, s := range graph.Slices {
|
|
36
|
+
produces[s.ID] = s.ConsumesProduces
|
|
37
|
+
}
|
|
38
|
+
var lines []string
|
|
39
|
+
for _, s := range graph.Slices {
|
|
40
|
+
for _, dep := range s.Dependencies {
|
|
41
|
+
via := s.Via[dep]
|
|
42
|
+
switch {
|
|
43
|
+
case via == "":
|
|
44
|
+
lines = append(lines, fmt.Sprintf(`ADVISORY edge: %s -> %s names no crossing interface (add "(via <interface>)" or drop the edge)`, s.ID, dep))
|
|
45
|
+
case produces[dep] == "":
|
|
46
|
+
lines = append(lines, fmt.Sprintf("ADVISORY edge: %s -> %s via %q but %s declares no Consumes / Produces", s.ID, dep, via, dep))
|
|
47
|
+
case !strings.Contains(strings.ToLower(produces[dep]), strings.ToLower(via)):
|
|
48
|
+
lines = append(lines, fmt.Sprintf("ADVISORY edge: %s -> %s via %q is not in %s Consumes / Produces", s.ID, dep, via, dep))
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return lines
|
|
53
|
+
}
|
|
@@ -94,13 +94,15 @@ func runGitCommandIO(dir string, env []string, input []byte, stdout io.Writer, a
|
|
|
94
94
|
"PAGER=cat",
|
|
95
95
|
"LC_ALL=C",
|
|
96
96
|
)
|
|
97
|
-
|
|
97
|
+
// stderr gets its own buffer: git warnings (e.g. core.autocrlf) must never
|
|
98
|
+
// be parsed as output, only reported when the command fails.
|
|
99
|
+
var output, errOutput cappedGitOutput
|
|
98
100
|
if stdout == nil {
|
|
99
101
|
cmd.Stdout = &output
|
|
100
102
|
} else {
|
|
101
103
|
cmd.Stdout = stdout
|
|
102
104
|
}
|
|
103
|
-
cmd.Stderr = &
|
|
105
|
+
cmd.Stderr = &errOutput
|
|
104
106
|
err := cmd.Run()
|
|
105
107
|
if err == nil {
|
|
106
108
|
if output.truncated {
|
|
@@ -116,8 +118,8 @@ func runGitCommandIO(dir string, env []string, input []byte, stdout io.Writer, a
|
|
|
116
118
|
if ctx.Err() != nil {
|
|
117
119
|
err = ctx.Err()
|
|
118
120
|
}
|
|
119
|
-
detail :=
|
|
120
|
-
if
|
|
121
|
+
detail := errOutput.String()
|
|
122
|
+
if errOutput.truncated {
|
|
121
123
|
detail += "\n[git output truncated]"
|
|
122
124
|
}
|
|
123
125
|
return nil, &gitCommandError{
|
|
@@ -130,13 +132,21 @@ func runGitCommandIO(dir string, env []string, input []byte, stdout io.Writer, a
|
|
|
130
132
|
|
|
131
133
|
// gitDiffNames lists the paths that differ, relative to gitRoot. With one ref it
|
|
132
134
|
// diffs the working tree against that ref; with two it diffs the two tree objects.
|
|
135
|
+
// Renames are split into their deletion and addition so both names surface, and
|
|
136
|
+
// -z keeps non-ASCII paths unquoted.
|
|
133
137
|
func gitDiffNames(gitRoot string, refs ...string) ([]string, error) {
|
|
134
|
-
args := append([]string{"diff", "--name-only"}, refs...)
|
|
138
|
+
args := append([]string{"diff", "--name-only", "--no-renames", "-z"}, refs...)
|
|
135
139
|
out, err := runGitCommand(gitRoot, nil, args...)
|
|
136
140
|
if err != nil {
|
|
137
141
|
return nil, err
|
|
138
142
|
}
|
|
139
|
-
|
|
143
|
+
var paths []string
|
|
144
|
+
for _, path := range strings.Split(string(out), "\x00") {
|
|
145
|
+
if path != "" {
|
|
146
|
+
paths = append(paths, path)
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return paths, nil
|
|
140
150
|
}
|
|
141
151
|
|
|
142
152
|
// argAt returns args[i] or "": the Go analogue of bash's ${N:-} positional reads.
|
|
@@ -159,8 +169,9 @@ func activeSlug(root string) string {
|
|
|
159
169
|
return slug
|
|
160
170
|
}
|
|
161
171
|
|
|
172
|
+
// splitLinesNoTrailing splits data into lines, treating CRLF as LF.
|
|
162
173
|
func splitLinesNoTrailing(data []byte) []string {
|
|
163
|
-
value := strings.TrimSuffix(string(data), "\n")
|
|
174
|
+
value := strings.TrimSuffix(strings.ReplaceAll(string(data), "\r\n", "\n"), "\n")
|
|
164
175
|
if value == "" {
|
|
165
176
|
return nil
|
|
166
177
|
}
|
|
@@ -50,12 +50,14 @@ Exit 0 clean or fully waived, 3 unwaived markers or blocked.`
|
|
|
50
50
|
// deferralTokenRe catches uppercase comment markers: TODO, FIXME, XXX, HACK.
|
|
51
51
|
var deferralTokenRe = regexp.MustCompile(`(?:^|[^A-Za-z0-9_])(TODO|FIXME|XXX|HACK)(?:[^A-Za-z0-9_]|$)`)
|
|
52
52
|
|
|
53
|
-
// deferralIdioms are
|
|
53
|
+
// deferralIdioms are signals for skipped tests and stub bodies. An idiom that
|
|
54
|
+
// starts with an identifier character matches only at a word start, so
|
|
55
|
+
// os.Exit( is not xit( and benefit( is not fit(.
|
|
54
56
|
var deferralIdioms = []string{
|
|
55
57
|
"t.Skip(", "t.Skipf(",
|
|
56
58
|
"test.skip(", "it.skip(", "describe.skip(", "context.skip(",
|
|
57
59
|
"xit(", "xdescribe(", "xtest(", "xcontext(", "fit(", "fdescribe(",
|
|
58
|
-
"pytest.mark.skip", "unittest.skip", "SkipTest",
|
|
60
|
+
"pytest.mark.skip", "pytest.skip(", "pytest.xfail(", "unittest.skip", "SkipTest",
|
|
59
61
|
"@Disabled", "#[ignore]",
|
|
60
62
|
"todo!(", "unimplemented!(",
|
|
61
63
|
"NotImplementedError",
|
|
@@ -104,7 +106,7 @@ type windowWaiver struct {
|
|
|
104
106
|
func windowsMarkers(line string) []string {
|
|
105
107
|
var idioms []string
|
|
106
108
|
for _, idiom := range deferralIdioms {
|
|
107
|
-
if
|
|
109
|
+
if containsIdiom(line, idiom) {
|
|
108
110
|
idioms = append(idioms, idiom)
|
|
109
111
|
}
|
|
110
112
|
}
|
|
@@ -128,6 +130,37 @@ func windowsMarkers(line string) []string {
|
|
|
128
130
|
return out
|
|
129
131
|
}
|
|
130
132
|
|
|
133
|
+
// containsIdiom reports whether idiom occurs in line at a word start.
|
|
134
|
+
func containsIdiom(line, idiom string) bool {
|
|
135
|
+
for i := 0; ; {
|
|
136
|
+
j := strings.Index(line[i:], idiom)
|
|
137
|
+
if j < 0 {
|
|
138
|
+
return false
|
|
139
|
+
}
|
|
140
|
+
at := i + j
|
|
141
|
+
if at == 0 || !isIdentByte(idiom[0]) || !isIdentByte(line[at-1]) {
|
|
142
|
+
return true
|
|
143
|
+
}
|
|
144
|
+
i = at + 1
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
func isIdentByte(b byte) bool {
|
|
149
|
+
return b == '_' || b >= '0' && b <= '9' || b >= 'a' && b <= 'z' || b >= 'A' && b <= 'Z'
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// diffHeaderPath decodes a `--- `/`+++ ` header path, unquoting git's C-style
|
|
153
|
+
// quoting of non-ASCII and special characters.
|
|
154
|
+
func diffHeaderPath(raw string) string {
|
|
155
|
+
p := strings.TrimSpace(raw)
|
|
156
|
+
if strings.HasPrefix(p, `"`) {
|
|
157
|
+
if decoded, err := strconv.Unquote(p); err == nil {
|
|
158
|
+
return decoded
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return p
|
|
162
|
+
}
|
|
163
|
+
|
|
131
164
|
// isTestPath reports whether a project-relative path names a test source file.
|
|
132
165
|
func isTestPath(p string) bool {
|
|
133
166
|
base := path.Base(p)
|
|
@@ -157,9 +190,9 @@ func removedTestHits(diff string) []windowHit {
|
|
|
157
190
|
case strings.HasPrefix(line, "diff --git "):
|
|
158
191
|
inHeader, deleted, file = true, false, ""
|
|
159
192
|
case inHeader && strings.HasPrefix(line, "--- "):
|
|
160
|
-
oldPath = strings.TrimPrefix(
|
|
193
|
+
oldPath = strings.TrimPrefix(diffHeaderPath(line[4:]), "a/")
|
|
161
194
|
case inHeader && strings.HasPrefix(line, "+++ "):
|
|
162
|
-
newPath :=
|
|
195
|
+
newPath := diffHeaderPath(line[4:])
|
|
163
196
|
if newPath == "/dev/null" {
|
|
164
197
|
deleted = true
|
|
165
198
|
if isTestPath(oldPath) {
|
|
@@ -203,8 +236,7 @@ func addedLinesFromDiff(diff string) ([]windowHit, map[string]bool) {
|
|
|
203
236
|
for _, line := range strings.Split(diff, "\n") {
|
|
204
237
|
switch {
|
|
205
238
|
case strings.HasPrefix(line, "+++ "):
|
|
206
|
-
p :=
|
|
207
|
-
p = strings.Trim(p, `"`)
|
|
239
|
+
p := diffHeaderPath(strings.TrimPrefix(line, "+++ "))
|
|
208
240
|
if p == "/dev/null" {
|
|
209
241
|
path = ""
|
|
210
242
|
continue
|
|
@@ -272,14 +304,16 @@ func windowsHits(opts diffScopeOpts) ([]windowHit, error) {
|
|
|
272
304
|
dir = opts.root
|
|
273
305
|
}
|
|
274
306
|
var hits []windowHit
|
|
275
|
-
|
|
307
|
+
// Repository diff config (color, external diff, textconv, mnemonic or no
|
|
308
|
+
// prefixes) must not reshape the patch this parser reads.
|
|
309
|
+
diffArgs := []string{"diff", "--no-ext-diff", "--no-textconv", "--no-color", "--src-prefix=a/", "--dst-prefix=b/"}
|
|
276
310
|
switch opts.mode {
|
|
277
311
|
case "staged":
|
|
278
|
-
diffArgs =
|
|
312
|
+
diffArgs = append(diffArgs, "--cached", "-M", "-U0", "--")
|
|
279
313
|
case "base":
|
|
280
|
-
diffArgs =
|
|
314
|
+
diffArgs = append(diffArgs, opts.base, "-M", "-U0", "--")
|
|
281
315
|
default:
|
|
282
|
-
diffArgs =
|
|
316
|
+
diffArgs = append(diffArgs, "HEAD", "-M", "-U0", "--")
|
|
283
317
|
}
|
|
284
318
|
diff, err := runGitCommand(dir, nil, diffArgs...)
|
|
285
319
|
var diffPaths map[string]bool
|
|
@@ -293,6 +327,9 @@ func windowsHits(opts diffScopeOpts) ([]windowHit, error) {
|
|
|
293
327
|
default:
|
|
294
328
|
return nil, err
|
|
295
329
|
}
|
|
330
|
+
// Git paths are repo-root-relative; the project's own workspace may sit
|
|
331
|
+
// in a subdirectory ("sub/.devrites") when the project is nested.
|
|
332
|
+
control := devritesRepoPrefix(dir, opts.root)
|
|
296
333
|
if opts.mode == "worktree" {
|
|
297
334
|
// Whole files whose diff produced no hunks: staged additions land in
|
|
298
335
|
// `git diff HEAD`, untracked files never do — scan those in full.
|
|
@@ -307,17 +344,26 @@ func windowsHits(opts diffScopeOpts) ([]windowHit, error) {
|
|
|
307
344
|
}
|
|
308
345
|
repo := strings.TrimSpace(string(repoRoot))
|
|
309
346
|
for _, p := range status {
|
|
310
|
-
if diffPaths[p] || strings.HasPrefix(p, "
|
|
347
|
+
if diffPaths[p] || strings.HasPrefix(p, control+"/") {
|
|
311
348
|
continue
|
|
312
349
|
}
|
|
313
350
|
hits = scanWholeFile(repo, p, hits)
|
|
314
351
|
}
|
|
315
352
|
}
|
|
353
|
+
// windows.md rows name project-relative paths, so hits are rebased from
|
|
354
|
+
// the repository root onto the project directory that holds control.
|
|
355
|
+
project := path.Dir(control)
|
|
316
356
|
var kept []windowHit
|
|
317
357
|
for _, h := range hits {
|
|
318
|
-
if
|
|
319
|
-
|
|
358
|
+
if strings.HasPrefix(h.Path, control+"/") {
|
|
359
|
+
continue
|
|
320
360
|
}
|
|
361
|
+
if project != "." {
|
|
362
|
+
if rel, err := filepath.Rel(filepath.FromSlash(project), filepath.FromSlash(h.Path)); err == nil {
|
|
363
|
+
h.Path = filepath.ToSlash(rel)
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
kept = append(kept, h)
|
|
321
367
|
}
|
|
322
368
|
return kept, nil
|
|
323
369
|
}
|
|
@@ -362,7 +408,7 @@ func parseWindowsWaivers(raw string) (map[windowWaiver]int, []string) {
|
|
|
362
408
|
// parseWindowsArgs accepts the diff-scope mode flags plus a slug; the allowlist
|
|
363
409
|
// flags do not apply to marker scanning.
|
|
364
410
|
func parseWindowsArgs(root string, args []string, stderr io.Writer) (diffScopeOpts, int) {
|
|
365
|
-
opts := diffScopeOpts{mode: "worktree",
|
|
411
|
+
opts := diffScopeOpts{mode: "worktree", root: root}
|
|
366
412
|
var positional []string
|
|
367
413
|
for i := 0; i < len(args); i++ {
|
|
368
414
|
switch args[i] {
|
|
@@ -376,6 +422,10 @@ func parseWindowsArgs(root string, args []string, stderr io.Writer) (diffScopeOp
|
|
|
376
422
|
case "--base":
|
|
377
423
|
opts.mode = "base"
|
|
378
424
|
opts.base = argAt(args, i+1)
|
|
425
|
+
if strings.HasPrefix(opts.base, "-") {
|
|
426
|
+
fmt.Fprintln(stderr, "windows: --base requires a ref (not a flag)")
|
|
427
|
+
return opts, 2
|
|
428
|
+
}
|
|
379
429
|
i++
|
|
380
430
|
case "--cwd":
|
|
381
431
|
opts.cwd = argAt(args, i+1)
|
|
@@ -393,6 +443,9 @@ func parseWindowsArgs(root string, args []string, stderr io.Writer) (diffScopeOp
|
|
|
393
443
|
return opts, 2
|
|
394
444
|
}
|
|
395
445
|
opts.slug = positional[0]
|
|
446
|
+
if opts.phase == "" {
|
|
447
|
+
opts.phase = cursorPhase(root, opts.slug)
|
|
448
|
+
}
|
|
396
449
|
return opts, 0
|
|
397
450
|
}
|
|
398
451
|
|
|
@@ -54,6 +54,16 @@ func Structural(input []byte) ([]byte, error) {
|
|
|
54
54
|
start = closeEnd + 1
|
|
55
55
|
continue
|
|
56
56
|
}
|
|
57
|
+
} else if fence, closeEnd := markerLineFence(input, line, lineEnd, afterBlank || anchor >= 0); closeEnd >= 0 {
|
|
58
|
+
anchor, afterBlank = -1, false
|
|
59
|
+
if !loneCR(input[start:closeEnd]) {
|
|
60
|
+
mask(out[start+fence : closeEnd])
|
|
61
|
+
}
|
|
62
|
+
if closeEnd == len(input) {
|
|
63
|
+
break
|
|
64
|
+
}
|
|
65
|
+
start = closeEnd + 1
|
|
66
|
+
continue
|
|
57
67
|
} else {
|
|
58
68
|
column, ok := topLevelItem(line)
|
|
59
69
|
if ok && (afterBlank || anchor >= 0) {
|
|
@@ -167,23 +177,52 @@ func fenceStart(line []byte, limit int) (int, bool) {
|
|
|
167
177
|
return start, columns <= limit && start < len(line) && (line[start] == '`' || line[start] == '~')
|
|
168
178
|
}
|
|
169
179
|
|
|
180
|
+
// markerLineFence handles a top-level list item whose content opens a fence
|
|
181
|
+
// (`- ```bash`). It returns the fence's byte offset in line and the end offset
|
|
182
|
+
// of the closer, or -1 unless a closer at the item's content column follows
|
|
183
|
+
// and every line before it stays inside the item. Without this, an indented
|
|
184
|
+
// closer would reopen a top-level fence and mask the rest of the file.
|
|
185
|
+
// Ordered items other than 1 cannot interrupt a paragraph, so they need
|
|
186
|
+
// separated (a preceding blank line or list item).
|
|
187
|
+
func markerLineFence(input, line []byte, lineEnd int, separated bool) (int, int) {
|
|
188
|
+
column, next, ok := itemContent(line)
|
|
189
|
+
if !ok || (!separated && line[0] >= '2' && line[0] <= '9') {
|
|
190
|
+
return 0, -1
|
|
191
|
+
}
|
|
192
|
+
marker, width, ok := openingFence(line[next:], 0)
|
|
193
|
+
if !ok {
|
|
194
|
+
return 0, -1
|
|
195
|
+
}
|
|
196
|
+
return next, listFenceEnd(input, lineEnd, marker, width, column, column)
|
|
197
|
+
}
|
|
198
|
+
|
|
170
199
|
// topLevelItem returns the content column of a list item whose marker sits at
|
|
171
200
|
// column 0 and whose content is neither another list marker, a heading marker,
|
|
172
201
|
// a fence nor part of a thematic break.
|
|
173
202
|
func topLevelItem(line []byte) (int, bool) {
|
|
174
|
-
|
|
203
|
+
column, next, ok := itemContent(line)
|
|
204
|
+
if !ok || startsBlock(line[next:]) {
|
|
175
205
|
return 0, false
|
|
176
206
|
}
|
|
207
|
+
return column, true
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// itemContent returns the content column and byte offset of a list item whose
|
|
211
|
+
// marker sits at column 0.
|
|
212
|
+
func itemContent(line []byte) (int, int, bool) {
|
|
213
|
+
if len(line) < 2 || isThematicBreak(line) {
|
|
214
|
+
return 0, 0, false
|
|
215
|
+
}
|
|
177
216
|
markerEnd := 1
|
|
178
217
|
switch c := line[0]; {
|
|
179
218
|
case c == '-' || c == '*' || c == '+':
|
|
180
219
|
case c >= '1' && c <= '9' && line[1] == '.':
|
|
181
220
|
markerEnd = 2
|
|
182
221
|
default:
|
|
183
|
-
return 0, false
|
|
222
|
+
return 0, 0, false
|
|
184
223
|
}
|
|
185
224
|
if markerEnd >= len(line) || (line[markerEnd] != ' ' && line[markerEnd] != '\t') {
|
|
186
|
-
return 0, false
|
|
225
|
+
return 0, 0, false
|
|
187
226
|
}
|
|
188
227
|
column, next := markerEnd, markerEnd
|
|
189
228
|
for next < len(line) && (line[next] == ' ' || line[next] == '\t') {
|
|
@@ -194,10 +233,10 @@ func topLevelItem(line []byte) (int, bool) {
|
|
|
194
233
|
}
|
|
195
234
|
next++
|
|
196
235
|
}
|
|
197
|
-
if next == len(line) || column-markerEnd > 4
|
|
198
|
-
return 0, false
|
|
236
|
+
if next == len(line) || column-markerEnd > 4 {
|
|
237
|
+
return 0, 0, false
|
|
199
238
|
}
|
|
200
|
-
return column, true
|
|
239
|
+
return column, next, true
|
|
201
240
|
}
|
|
202
241
|
|
|
203
242
|
// startsBlock reports content that opens a list marker, heading or fence.
|
|
@@ -93,11 +93,13 @@ func cmdAdd(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
93
93
|
}
|
|
94
94
|
slug := args[0]
|
|
95
95
|
subject := filepath.ToSlash(oneLine(args[1]))
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
// ParseNotes trims attribute values, so a value is stored trimmed and a
|
|
97
|
+
// whitespace-only one is blank.
|
|
98
|
+
quote := strings.TrimSpace(oneLine(args[2]))
|
|
99
|
+
title := strings.TrimSpace(oneLine(args[3]))
|
|
98
100
|
body := ""
|
|
99
101
|
if len(args) == 5 {
|
|
100
|
-
body = oneLine(args[4])
|
|
102
|
+
body = strings.TrimSpace(oneLine(args[4]))
|
|
101
103
|
}
|
|
102
104
|
if err := ValidateSubject(subject); err != nil {
|
|
103
105
|
fmt.Fprintf(stderr, "note add: %v\n", err)
|