@joshuafolkken/kit 1.1240.0 → 1.1370.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/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +216 -202
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
1
2
|
import {
|
|
2
3
|
epic_audit_logic,
|
|
3
4
|
type AuditFinding,
|
|
@@ -8,19 +9,18 @@ import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
|
8
9
|
import { epic_nested } from './epic-nested'
|
|
9
10
|
|
|
10
11
|
// The five cross-child checks. Each takes the children and returns findings — four of them reading
|
|
11
|
-
// the bodies, and the fifth
|
|
12
|
+
// the bodies, and the fifth reading a child's labels instead.
|
|
12
13
|
//
|
|
13
14
|
// Warnings and errors are kept apart deliberately. An error is a contradiction that will stall the
|
|
14
15
|
// implementation whatever anyone decides — an acceptance criterion that needs something built later.
|
|
15
16
|
// A warning is a thing a reader has to look at: a child mentioning another child may be a real
|
|
16
17
|
// missing dependency or a perfectly good design note about what comes next, and the machine cannot
|
|
17
18
|
// tell. Making that an error would make legitimate notes unwritable, so the machine's job is to
|
|
18
|
-
// stop the omission going unnoticed, not to decide
|
|
19
|
+
// stop the omission going unnoticed, not to decide.
|
|
19
20
|
//
|
|
20
21
|
// Every reference these checks read carries the repository it lives in, and every match is on
|
|
21
22
|
// repository and number both. A number alone names a different issue in every repository, so a
|
|
22
|
-
// cross-repository child citing `#40`
|
|
23
|
-
// (joshuafolkken/kit#1014).
|
|
23
|
+
// cross-repository child citing `#40` would be checked against *this* repository's issue 40.
|
|
24
24
|
|
|
25
25
|
const IMPLICIT_DEPENDENCY = 'implicit dependency'
|
|
26
26
|
const ORDER_CONTRADICTION = 'order contradiction'
|
|
@@ -61,14 +61,9 @@ function find_sibling(
|
|
|
61
61
|
|
|
62
62
|
// Whether anything orders these two, in either direction.
|
|
63
63
|
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
// contradiction would have failed the audit with no edit to either issue that could ever clear it.
|
|
68
|
-
// joshuafolkken/kit#1126 made such an order recordable and readable, so the premise stopped holding
|
|
69
|
-
// and joshuafolkken/kit#1128 removed the exemption: every pair is asked the same question now, and
|
|
70
|
-
// `depends_on` walks a cross-repository chain by identity exactly as it walks a local one. What keeps
|
|
71
|
-
// that from failing epics written before the capability existed is the finding's *level* rather than
|
|
64
|
+
// Every pair is asked the same question, a cross-repository pair included: `depends_on` walks a
|
|
65
|
+
// cross-repository chain by identity exactly as it walks a local one. What keeps that from failing
|
|
66
|
+
// epics written before a cross-repository order was recordable is the finding's *level* rather than
|
|
72
67
|
// a blind spot — see `order_level`.
|
|
73
68
|
function is_ordered(
|
|
74
69
|
index: ReadonlyMap<string, EpicChild>,
|
|
@@ -131,9 +126,8 @@ function reported_pairs(
|
|
|
131
126
|
// Check 1 — a child talks about another child, and neither declares a dependency on the other.
|
|
132
127
|
//
|
|
133
128
|
// A declared dependency in *either* direction is enough: `#864 depends on #863` makes `#863`'s note
|
|
134
|
-
// about `#864` an ordinary forward reference. What this catches is
|
|
135
|
-
//
|
|
136
|
-
// on both and the epic declaring them independent.
|
|
129
|
+
// about `#864` an ordinary forward reference. What this catches is two children each citing the
|
|
130
|
+
// other's deliverable, with `blocked_by` empty on both and the epic declaring them independent.
|
|
137
131
|
function find_implicit_dependencies(
|
|
138
132
|
children: ReadonlyArray<AuditChild>,
|
|
139
133
|
current_repo: string,
|
|
@@ -157,28 +151,24 @@ function find_implicit_dependencies(
|
|
|
157
151
|
|
|
158
152
|
// Check 2 — a child's acceptance criteria name another child, with no dependency in either
|
|
159
153
|
// direction. The criteria are where a child states what it must deliver, so a name there with
|
|
160
|
-
// nothing ordering the two is
|
|
161
|
-
//
|
|
154
|
+
// nothing ordering the two is a contradiction: the criteria require deliverables of children the
|
|
155
|
+
// graph lets it run before.
|
|
162
156
|
//
|
|
163
157
|
// A declared dependency the *other* way is suppressed, and that suppression is what keeps the check
|
|
164
158
|
// honest. `#860`'s criteria say `#864` will extend a hook it provides, and `#864` is declared to
|
|
165
|
-
// depend on `#860` — a forward reference, and satisfiable exactly as written.
|
|
166
|
-
// real epic: without this, four of the run's five errors were forward references of that shape.
|
|
159
|
+
// depend on `#860` — a forward reference, and satisfiable exactly as written.
|
|
167
160
|
//
|
|
168
161
|
// The level depends on whether the pair can still run out of order. What makes an undeclared order a
|
|
169
162
|
// contradiction is that the criteria's child *can run first*, and **either end closing is enough to
|
|
170
163
|
// make that sentence false**: a closed naming child has already run, and a closed named child has
|
|
171
164
|
// already delivered what the criteria ask for, so nothing is left to run before it. An epic that ever
|
|
172
165
|
// forgot to declare an order would otherwise fail its audit forever — which stops every future
|
|
173
|
-
// `epicrun` on it at the first step, for something that can no longer stall anything.
|
|
174
|
-
// real epic: `epic:next` handed back a runnable child while the audit was red.
|
|
166
|
+
// `epicrun` on it at the first step, for something that can no longer stall anything.
|
|
175
167
|
//
|
|
176
|
-
// **
|
|
177
|
-
//
|
|
178
|
-
//
|
|
179
|
-
//
|
|
180
|
-
// declaring an order nobody decided, and both destroy the record. joshuafolkken/kit#1262 sat red on
|
|
181
|
-
// exactly that shape while nothing in it could run out of order.
|
|
168
|
+
// **One closed end is enough, not both.** Requiring both would bite on the ordinary way an epic's
|
|
169
|
+
// children cite each other — a closed child's criteria naming an open sibling **as evidence** — and
|
|
170
|
+
// there is no way out of it once the naming child has closed: the alternatives are editing a closed
|
|
171
|
+
// body to remove the numbers or declaring an order nobody decided, and both destroy the record.
|
|
182
172
|
//
|
|
183
173
|
// **Demoted rather than dropped**, and the choice is not cosmetic. Dropping the finding does not
|
|
184
174
|
// shorten the report: the acceptance criteria are part of the body, so the same pair falls straight
|
|
@@ -232,16 +222,16 @@ function order_message(
|
|
|
232
222
|
// **Either child closed**: the pair can no longer run out of order, so the finding cannot describe
|
|
233
223
|
// anything that will happen.
|
|
234
224
|
//
|
|
235
|
-
// **A pair in two repositories
|
|
236
|
-
//
|
|
237
|
-
//
|
|
225
|
+
// **A pair in two repositories**: epics written before a cross-repository order was recordable
|
|
226
|
+
// carry such pairs, so an error would fail the audit `epicrun` runs before its first child and stop
|
|
227
|
+
// every one of them.
|
|
238
228
|
//
|
|
239
229
|
// **Be clear about what the warning does and does not buy.** It does *not* make the run safe: the
|
|
240
230
|
// finding fires precisely when nothing orders the pair, so there is no relation for `epic:next` to
|
|
241
|
-
// read and the child is offered as runnable — it can start before the work it cites.
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
// means recording the relation; `josh epic --add` cannot write it yet
|
|
231
|
+
// read and the child is offered as runnable — it can start before the work it cites. It makes the gap
|
|
232
|
+
// said out loud rather than silent. Making it safe means stopping, and stopping is what the recorded
|
|
233
|
+
// decision declined for epics that predate the capability. Clearing one
|
|
234
|
+
// means recording the relation; `josh epic --add` cannot write it yet, so
|
|
245
235
|
// until then it is the `dependencies/blocked_by` endpoint by hand.
|
|
246
236
|
function order_level(child: AuditChild, other: AuditChild, is_settled: boolean): FindingLevel {
|
|
247
237
|
if (is_settled) return 'warning'
|
|
@@ -349,11 +339,11 @@ function find_orphans(
|
|
|
349
339
|
.map((issue_number) => ({
|
|
350
340
|
level: 'warning' as const,
|
|
351
341
|
check: ORPHAN_CHILD,
|
|
352
|
-
message:
|
|
342
|
+
message: `${issue_cite.plain(issue_number)} names this epic as its parent but is not in its task list.`,
|
|
353
343
|
}))
|
|
354
344
|
}
|
|
355
345
|
|
|
356
|
-
// Check 5 — a task-list row pointing at another epic
|
|
346
|
+
// Check 5 — a task-list row pointing at another epic. What the question is,
|
|
357
347
|
// and what it deliberately is not, is `epic-nested.ts`; this half is what the audit does with the
|
|
358
348
|
// answer.
|
|
359
349
|
//
|
|
@@ -392,7 +382,7 @@ function find_nested_epics(
|
|
|
392
382
|
|
|
393
383
|
// Check 6 — the epic itself is closed while children it tracks are still open. Unlike the five
|
|
394
384
|
// checks above, this one reads the *root's* state against its children rather than the children
|
|
395
|
-
// against each other
|
|
385
|
+
// against each other.
|
|
396
386
|
//
|
|
397
387
|
// **An error, not a warning.** A closed epic never surfaces its children in the backlog — the epic
|
|
398
388
|
// opt-in only fires while the epic is open — so an open child of a closed epic is stranded: it is
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
4
|
import { issue_read } from '#scripts/issue/issue-read'
|
|
5
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
|
+
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
5
7
|
import { epic_audit_logic, type AuditFinding, type ReferenceState } from './epic-audit'
|
|
6
8
|
import { epic_audit_checks, type AuditChild } from './epic-audit-checks'
|
|
7
9
|
import { epic_audit_orphans, type ClaimingSearch } from './epic-audit-orphans'
|
|
@@ -16,15 +18,14 @@ import { epic_next } from './epic-next'
|
|
|
16
18
|
import { epic_parse, type DependencyLink } from './epic-parse'
|
|
17
19
|
|
|
18
20
|
// `josh epic:audit <E>` — read an epic's children against each other and report what contradicts
|
|
19
|
-
// what
|
|
21
|
+
// what.
|
|
20
22
|
|
|
21
23
|
const FAILURE_EXIT_CODE = 1
|
|
22
24
|
const ARGV_OFFSET = 2
|
|
23
25
|
const USAGE = 'Usage: josh epic:audit <epic-number>'
|
|
24
26
|
// Check 3 filters the issues the children cite down to this owner's repositories, so a repository
|
|
25
27
|
// name it could not read silently dropped every qualified reference and reported nothing. A check
|
|
26
|
-
// that disables itself without saying so is worse than one that fails: the report reads clean
|
|
27
|
-
// (joshuafolkken/kit#1016).
|
|
28
|
+
// that disables itself without saying so is worse than one that fails: the report reads clean.
|
|
28
29
|
const UNREADABLE_REPO =
|
|
29
30
|
'Could not read this repository as `owner/name`, so a reference could not be resolved against it — check `gh auth status` and that this checkout has a GitHub remote.'
|
|
30
31
|
|
|
@@ -35,7 +36,7 @@ const UNREADABLE_REPO =
|
|
|
35
36
|
// The scope comes from `epic_fetch.scope_for`, the same convention the state and relation reads
|
|
36
37
|
// follow, rather than a second spelling here. Without it a cross-repository child's body was read
|
|
37
38
|
// from *this* repository's issue of that number, and all four body-reading checks then ran against
|
|
38
|
-
// the wrong text
|
|
39
|
+
// the wrong text.
|
|
39
40
|
async function attach_bodies(
|
|
40
41
|
children: ReadonlyArray<AuditChild>,
|
|
41
42
|
repo: string,
|
|
@@ -59,7 +60,7 @@ async function attach_bodies(
|
|
|
59
60
|
// Each one is asked of the repository whose body named it, through the same `epic_fetch.scope_for`
|
|
60
61
|
// every other read goes through, and the answers are keyed by that repository and number both. Asked
|
|
61
62
|
// unqualified, a cross-repository child's `#40` was answered by *this* repository's issue 40 — a
|
|
62
|
-
// different issue, whose state then decided the warning
|
|
63
|
+
// different issue, whose state then decided the warning.
|
|
63
64
|
async function resolve_reference_states(
|
|
64
65
|
referenced: ReadonlyArray<IssueReference>,
|
|
65
66
|
current_repo: string,
|
|
@@ -85,8 +86,8 @@ async function resolve_reference_states(
|
|
|
85
86
|
|
|
86
87
|
// The issues the children cite that are not children themselves — the ones check 3 resolves.
|
|
87
88
|
//
|
|
88
|
-
// A reference in a repository this owner does not own is left out rather than probed,
|
|
89
|
-
//
|
|
89
|
+
// A reference in a repository this owner does not own is left out rather than probed, exactly as
|
|
90
|
+
// `fetch_external_children` does: a body mentioning a
|
|
90
91
|
// third party's issue must not send this command to their tracker.
|
|
91
92
|
function outside_references(
|
|
92
93
|
children: ReadonlyArray<AuditChild>,
|
|
@@ -110,14 +111,14 @@ interface AuditInput {
|
|
|
110
111
|
epic_number: number
|
|
111
112
|
// The `owner/repo` the command runs in. A reference is written bare when it names an issue here
|
|
112
113
|
// and `owner/repo#N` when it does not, so the reader is never handed a number that resolves
|
|
113
|
-
// somewhere else
|
|
114
|
+
// somewhere else.
|
|
114
115
|
repo: string
|
|
115
116
|
children: ReadonlyArray<AuditChild>
|
|
116
117
|
tracked: ReadonlyArray<number>
|
|
117
118
|
reference_states: ReadonlyMap<string, ReferenceState>
|
|
118
119
|
// The orphan search's whole outcome, not just what it found: a listing that failed and a listing
|
|
119
120
|
// the page ceiling cut short are both reported, because `[]` here is indistinguishable from
|
|
120
|
-
// "nothing claims this epic"
|
|
121
|
+
// "nothing claims this epic".
|
|
121
122
|
claiming: ClaimingSearch
|
|
122
123
|
anomalies: ReadonlyArray<AuditFinding>
|
|
123
124
|
// Computed before the implicit-dependency check so that check can skip the pairs already reported
|
|
@@ -125,15 +126,14 @@ interface AuditInput {
|
|
|
125
126
|
// arrive twice.
|
|
126
127
|
contradictions: ReadonlyArray<AuditFinding>
|
|
127
128
|
// The declared orders check 6 may speak about, already resolved to children and narrowed to the
|
|
128
|
-
// open, local pairs
|
|
129
|
+
// open, local pairs.
|
|
129
130
|
order_pairs: ReadonlyArray<OrderPair>
|
|
130
131
|
// The epic's `## Decisions` section, and the comments on those pairs' ends — the two places a
|
|
131
132
|
// placement decision is recorded, and therefore the whole of what check 6 reads.
|
|
132
133
|
decisions: string
|
|
133
134
|
order_comments: ReadonlyMap<string, ReadonlyArray<string>>
|
|
134
135
|
// Whether the epic's own state is confirmed closed. An unreadable state is `false`, so the
|
|
135
|
-
// closed-epic-with-open-children check never fires on a lookup that did not answer
|
|
136
|
-
// (joshuafolkken/kit#2337).
|
|
136
|
+
// closed-epic-with-open-children check never fires on a lookup that did not answer.
|
|
137
137
|
is_epic_closed: boolean
|
|
138
138
|
}
|
|
139
139
|
|
|
@@ -186,7 +186,7 @@ function audit(input: AuditInput): AuditResult {
|
|
|
186
186
|
])
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
-
// The graph anomalies, taken from
|
|
189
|
+
// The graph anomalies, taken from the graph's own detection rather than re-derived here —
|
|
190
190
|
// including its rule for whether the body declares an order at all, which is imported rather than
|
|
191
191
|
// restated for exactly the drift this comment warns about.
|
|
192
192
|
function graph_anomalies(
|
|
@@ -242,18 +242,18 @@ async function read_order_comments(
|
|
|
242
242
|
)
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
-
// Why a snapshot yields nothing to audit, with the two reasons told apart
|
|
245
|
+
// Why a snapshot yields nothing to audit, with the two reasons told apart.
|
|
246
246
|
// A body nobody could read parses to zero children exactly as an unpopulated task list does, so
|
|
247
247
|
// without this the audit reported an epic it never read as one tracking no children — and sent the
|
|
248
248
|
// reader to fill in a task list that is already there.
|
|
249
249
|
function no_children_reason(snapshot: EpicSnapshot, epic_number: number): string | undefined {
|
|
250
|
+
const epic = session_cite.issue(epic_number, undefined, snapshot.repo)
|
|
251
|
+
|
|
250
252
|
if (snapshot.body_failure !== undefined) {
|
|
251
|
-
return `Could not read the body of
|
|
253
|
+
return `Could not read the body of ${epic}. Its task list is what names the children — check \`gh auth status\` and the connection.`
|
|
252
254
|
}
|
|
253
255
|
|
|
254
|
-
if (snapshot.child_numbers.length === 0) {
|
|
255
|
-
return `#${String(epic_number)} tracks no children in a task list.`
|
|
256
|
-
}
|
|
256
|
+
if (snapshot.child_numbers.length === 0) return `${epic} tracks no children in a task list.`
|
|
257
257
|
|
|
258
258
|
return undefined
|
|
259
259
|
}
|
|
@@ -261,8 +261,7 @@ function no_children_reason(snapshot: EpicSnapshot, epic_number: number): string
|
|
|
261
261
|
// Whether the epic's own state is confirmed closed. Read through the same `scope_for` every other
|
|
262
262
|
// read goes through, so a cross-repository epic is asked of its own repository rather than this one.
|
|
263
263
|
// A read that came back shaped wrong, or a state that is not `CLOSED`, both answer `false`: the
|
|
264
|
-
// finding it feeds is an error, and one must never be manufactured from a lookup that did not answer
|
|
265
|
-
// (joshuafolkken/kit#2337).
|
|
264
|
+
// finding it feeds is an error, and one must never be manufactured from a lookup that did not answer.
|
|
266
265
|
async function read_epic_closed(epic_number: number, scope?: string): Promise<boolean> {
|
|
267
266
|
const raw = await git_gh_command.issue_get_state_and_relations(String(epic_number), scope)
|
|
268
267
|
const parsed = epic_issue.parse_epic_issue(raw)
|
|
@@ -322,7 +321,7 @@ async function report_audit(epic_number: number, repo: string): Promise<number>
|
|
|
322
321
|
if (input === undefined) return FAILURE_EXIT_CODE
|
|
323
322
|
const result = audit(input)
|
|
324
323
|
|
|
325
|
-
console.info(epic_audit_report.format_report(result))
|
|
324
|
+
console.info(issue_citation.linkify(epic_audit_report.format_report(result), repo))
|
|
326
325
|
|
|
327
326
|
return result.exit_code
|
|
328
327
|
}
|
|
@@ -350,7 +349,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
350
349
|
// `process.exitCode` rather than `process.exit()`: the answer goes to standard output and a write to
|
|
351
350
|
// a pipe is asynchronous on macOS, so exiting can tear the process down before it drains. This
|
|
352
351
|
// command's answer is what a workflow reads and acts on, which is exactly that pipe. The same shape
|
|
353
|
-
// is in `scripts/cost-runtime/cost-cli.ts`, which met the truncation first
|
|
352
|
+
// is in `scripts/cost-runtime/cost-cli.ts`, which met the truncation first.
|
|
354
353
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
355
354
|
process.exitCode = await run(argv)
|
|
356
355
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { cutoff_of, PAGE_CEILING_CAUSE, type ScanCutoff } from '#scripts/git/listing-cutoff'
|
|
3
3
|
import { parse_json_array_safe } from '#scripts/git/parse-json-array'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
5
|
import { z } from 'zod'
|
|
5
6
|
import { epic_audit_logic, type AuditFinding, type FindingLevel } from './epic-audit'
|
|
6
7
|
import type { EpicSnapshot } from './epic-fetch'
|
|
@@ -10,8 +11,7 @@ import { epic_parse } from './epic-parse'
|
|
|
10
11
|
// task list does not track. It would never be run, and the epic would close without it.
|
|
11
12
|
//
|
|
12
13
|
// Split from the command because it shares nothing with the rest of it — the other three checks read
|
|
13
|
-
// the children the epic already names, while this one searches for issues the epic does *not* name
|
|
14
|
-
// (joshuafolkken/kit#1016).
|
|
14
|
+
// the children the epic already names, while this one searches for issues the epic does *not* name.
|
|
15
15
|
|
|
16
16
|
const SEARCH_LIMIT = 50
|
|
17
17
|
const PARENT_MARKERS: ReadonlyArray<string> = ['親:', 'Parent:', '親:']
|
|
@@ -36,10 +36,10 @@ function has_parent_marker(line: string): boolean {
|
|
|
36
36
|
// every such issue as an orphan.
|
|
37
37
|
//
|
|
38
38
|
// The number is read through the same reference parse the checks use, so a parent line (a PARENT_MARKERS
|
|
39
|
-
// prefix) such as `owner/other#858` names that repository's epic and not this one's
|
|
39
|
+
// prefix) such as `owner/other#858` names that repository's epic and not this one's.
|
|
40
40
|
// The known set is this repository alone — a parent line names this epic or it names nothing here —
|
|
41
41
|
// and it is passed rather than omitted so a repository whose own name contains a dot still recognizes
|
|
42
|
-
// `joshuafolkken/site.com#858
|
|
42
|
+
// `joshuafolkken/site.com#858`.
|
|
43
43
|
function names_this_epic(line: string, epic_number: number, repo: string): boolean {
|
|
44
44
|
return epic_audit_logic
|
|
45
45
|
.parse_issue_references(line, repo, epic_audit_logic.known_repos([], repo))
|
|
@@ -54,12 +54,12 @@ function claims_parent(body: string | null, epic_number: number, repo: string):
|
|
|
54
54
|
|
|
55
55
|
// Why the scan stopped before the end of the open backlog, or that it did not. Both cutoffs hide the
|
|
56
56
|
// same thing — an older issue naming this epic — and they are told apart only so the report can say
|
|
57
|
-
// which one to raise
|
|
57
|
+
// which one to raise.
|
|
58
58
|
//
|
|
59
|
-
// The vocabulary is `listing-cutoff.ts`'s
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
59
|
+
// The vocabulary is `listing-cutoff.ts`'s, because every caller of the listing asks this question
|
|
60
|
+
// and a second definition of "I saw everything" is the clone `CLAUDE.md` prohibits. `page_ceiling`
|
|
61
|
+
// is the paging's; `row_limit` here means `SEARCH_LIMIT` body mentions of `#<epic>` came back and
|
|
62
|
+
// the scan stopped there.
|
|
63
63
|
|
|
64
64
|
// What the search found, and what it could not cover. The `read` / `unreadable` vocabulary is
|
|
65
65
|
// `git-gh-issue-read.ts`'s, and the union rather than a flag beside the numbers is deliberate: a
|
|
@@ -70,14 +70,13 @@ type ClaimingSearch =
|
|
|
70
70
|
// Open issues naming this epic as their parent. Searched rather than derived, because an orphan is
|
|
71
71
|
// by definition absent from the one list that would otherwise name it.
|
|
72
72
|
//
|
|
73
|
-
// A failed search
|
|
74
|
-
//
|
|
75
|
-
// this epic" looks like, so a rate limit
|
|
76
|
-
//
|
|
77
|
-
// answer is now carried out and reported instead (joshuafolkken/kit#1033).
|
|
73
|
+
// A failed search is not answered with `[]`, even though an unavailable search is no evidence of an
|
|
74
|
+
// orphan. That is true of the *finding* and false of the *report*: `[]` is what "no issue claims
|
|
75
|
+
// this epic" looks like, so a rate limit would arrive as a clean audit — a "could not read" read as
|
|
76
|
+
// "there is nothing". The answer is carried out and reported instead.
|
|
78
77
|
async function find_claiming_issues(epic_number: number, repo: string): Promise<ClaimingSearch> {
|
|
79
78
|
const { json, is_capped } = await git_gh_command.issue_search_body(
|
|
80
|
-
|
|
79
|
+
issue_cite.plain(epic_number),
|
|
81
80
|
SEARCH_LIMIT,
|
|
82
81
|
)
|
|
83
82
|
if (json === undefined) return { kind: 'unreadable' }
|
|
@@ -103,7 +102,7 @@ function search_finding(level: FindingLevel, message: string): Array<AuditFindin
|
|
|
103
102
|
//
|
|
104
103
|
// Either cutoff is a **warning**: the scan *did* run, over the newest issues, and an orphan is
|
|
105
104
|
// normally an issue filed minutes ago. That is something to read rather than a check that did not
|
|
106
|
-
// happen — the level `epic:bundle` reports its own `⚠ … cap` at
|
|
105
|
+
// happen — the level `epic:bundle` reports its own `⚠ … cap` at.
|
|
107
106
|
function search_findings(search: ClaimingSearch): Array<AuditFinding> {
|
|
108
107
|
if (search.kind === 'unreadable') return search_finding('error', UNREADABLE_SEARCH)
|
|
109
108
|
if (search.cutoff === 'page_ceiling') return search_finding('warning', CAPPED_BY_ISSUES)
|
|
@@ -122,7 +121,7 @@ function claimed_numbers(search: ClaimingSearch): Array<number> {
|
|
|
122
121
|
// The task-list numbers that name issues in *this* repository. `snapshot.child_numbers` appends the
|
|
123
122
|
// cross-repository children's numbers, and an orphan is recognized by number alone — so a local
|
|
124
123
|
// issue whose number collided with a child in another repository was accepted as tracked and never
|
|
125
|
-
// reported
|
|
124
|
+
// reported. Read with the same parser `epic_fetch` reads the local rows
|
|
126
125
|
// with, which never matches a `- [ ] owner/repo#N` row.
|
|
127
126
|
function locally_tracked(snapshot: EpicSnapshot): Array<number> {
|
|
128
127
|
return epic_parse.parse_task_list_issue_numbers(snapshot.body)
|
|
@@ -3,16 +3,13 @@ import type { AuditChild } from './epic-audit-checks'
|
|
|
3
3
|
import { epic_graph, type IssueReference } from './epic-graph'
|
|
4
4
|
import type { DependencyLink } from './epic-parse'
|
|
5
5
|
|
|
6
|
-
// Check 6 — a declared order between two open children that nobody wrote a reason for
|
|
7
|
-
// (joshuafolkken/kit#1712).
|
|
6
|
+
// Check 6 — a declared order between two open children that nobody wrote a reason for.
|
|
8
7
|
//
|
|
9
8
|
// **Every other check looks the other way.** They report a dependency the epic *omitted* — prose or
|
|
10
9
|
// acceptance criteria naming a sibling with nothing ordering the two. Not one of them reads the
|
|
11
|
-
// declaration itself, so a chain somebody typed by hand
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// it stood and after it was deleted. It was found because a person asked why the backlog had gone
|
|
15
|
-
// single-file, which is not a mechanism.
|
|
10
|
+
// declaration itself, so without this check a chain somebody typed by hand passes the audit exactly
|
|
11
|
+
// as a justified one does — serializing otherwise independent children through `backlogrun #E`
|
|
12
|
+
// with **0 errors** reported.
|
|
16
13
|
//
|
|
17
14
|
// **Where a reason lives is already settled**, so this check does not invent a place to look:
|
|
18
15
|
// `josh epic --add --decision-file` writes the record to the epic's `## Decisions` **and** as a
|
|
@@ -51,7 +48,7 @@ function find_child(
|
|
|
51
48
|
// finding would be wrong about rather than merely noisy:
|
|
52
49
|
//
|
|
53
50
|
// **Both ends open.** A settled order can no longer stall anything, which is the same reason
|
|
54
|
-
// `order_level` demotes a settled contradiction
|
|
51
|
+
// `order_level` demotes a settled contradiction.
|
|
55
52
|
// **Both ends in the repository the audit runs in.** The comment listing reads that repository and
|
|
56
53
|
// takes no `--repo` (`git-gh-issue-read.ts`), so a cross-repository end's record cannot be read at
|
|
57
54
|
// all and every such order would be reported as unjustified whatever its author wrote.
|
|
@@ -136,20 +133,18 @@ function is_justified(input: RationaleInput, pair: OrderPair): boolean {
|
|
|
136
133
|
)
|
|
137
134
|
}
|
|
138
135
|
|
|
139
|
-
// **An error rather than a warning
|
|
140
|
-
// recorded.
|
|
136
|
+
// **An error rather than a warning.**
|
|
141
137
|
//
|
|
142
|
-
// A warning would not be read:
|
|
138
|
+
// A warning would not be read: a real epic can carry hundreds of them, and the whole reason this check
|
|
143
139
|
// exists is that a false order was invisible. The counter-argument is `order_level`'s doctrine —
|
|
144
140
|
// where the machine cannot tell whether something is wrong, it warns — and it does not reach this
|
|
145
141
|
// check, because what is asserted here is not "this order is wrong". It is "this order's reason is
|
|
146
142
|
// not recorded", which is a fact about the repository's own rule that a placement decision is
|
|
147
143
|
// written down, not a judgement about the order.
|
|
148
144
|
//
|
|
149
|
-
// What makes the level affordable is that both remedies are
|
|
150
|
-
// deletes the order, and `--decision-file` on either command records the reason
|
|
151
|
-
//
|
|
152
|
-
// to the hand edit `CLAUDE.md` forbids.
|
|
145
|
+
// What makes the level affordable is that both remedies are one command: `josh epic --remove`
|
|
146
|
+
// deletes the order, and `--decision-file` on either command records the reason, so an error never
|
|
147
|
+
// sends the reader to the hand edit `CLAUDE.md` forbids.
|
|
153
148
|
function unjustified_message(pair: OrderPair, current_repo: string): string {
|
|
154
149
|
const blocker = epic_graph.format_reference(pair.blocker, current_repo)
|
|
155
150
|
const blocked = epic_graph.format_reference(pair.blocked, current_repo)
|
|
@@ -5,8 +5,7 @@ import { epic_graph, type GraphAnomaly, type IssueReference } from './epic-graph
|
|
|
5
5
|
//
|
|
6
6
|
// Only errors decide the exit code. A warning is something a reader has to look at, not something a
|
|
7
7
|
// gate may fail on: check 1 fires on a legitimate forward reference as readily as on a real missing
|
|
8
|
-
// dependency, and a gate that failed on both would make design notes unwritable
|
|
9
|
-
// (joshuafolkken/kit#870).
|
|
8
|
+
// dependency, and a gate that failed on both would make design notes unwritable.
|
|
10
9
|
|
|
11
10
|
const SUCCESS_EXIT_CODE = 0
|
|
12
11
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -34,9 +33,7 @@ function anomaly_findings(anomalies: ReadonlyArray<GraphAnomaly>): Array<AuditFi
|
|
|
34
33
|
// command that acts on it.
|
|
35
34
|
//
|
|
36
35
|
// Each one is written with the repository it lives in. `- [ ] sveltejs/kit#7`, refused by the owner
|
|
37
|
-
// restriction,
|
|
38
|
-
// — the one message joshuafolkken/kit#1014 left resolving against the wrong repository
|
|
39
|
-
// (joshuafolkken/kit#1016).
|
|
36
|
+
// restriction, reported as `Could not read #7` would send the reader to this repository's issue 7.
|
|
40
37
|
function unreadable_findings(
|
|
41
38
|
missing: ReadonlyArray<IssueReference>,
|
|
42
39
|
current_repo: string,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { markdown_section } from '#scripts/issue/markdown-section'
|
|
2
|
+
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
2
3
|
import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
3
4
|
|
|
4
5
|
// Reading an epic's children against each other.
|
|
5
6
|
//
|
|
6
|
-
// `epic:check` verifies one epic's *format
|
|
7
|
-
//
|
|
8
|
-
// `epic:check` reported all four of its requirements as passing throughout (joshuafolkken/kit#870).
|
|
7
|
+
// `epic:check` verifies one epic's *format*, not that the children agree: an epic can pass every
|
|
8
|
+
// format requirement while carrying contradictions that would stall the implementation.
|
|
9
9
|
//
|
|
10
10
|
// The graph's own properties — a cycle, and a body that declares one order while the relations
|
|
11
11
|
// record another — are already detected by `epic:next` for its own purposes. This module is a
|
|
@@ -21,11 +21,11 @@ const REFERENCE_PATTERN = /#(\d+)\b/gu
|
|
|
21
21
|
// What may appear in the `owner/repo` written in front of a `#`: exactly the set the previous
|
|
22
22
|
// lookbehind refused a bare reference after, plus the `.` a repository name may legitimately contain.
|
|
23
23
|
//
|
|
24
|
-
// The dot is where this parse and the task-list parse
|
|
24
|
+
// The dot is where this parse and the task-list parse could disagree. `epic_parse`'s
|
|
25
25
|
// `EXTERNAL_REFERENCE_SOURCE` allows one, so `- [ ] owner/site.com#40` is tracked as a genuine
|
|
26
|
-
// cross-repository child;
|
|
27
|
-
//
|
|
28
|
-
//
|
|
26
|
+
// cross-repository child; excluded here, a sibling quoting `owner/site.com#40` would read back as
|
|
27
|
+
// `com` — no repository — and every check would skip it in silence: a child that can be tracked but
|
|
28
|
+
// never cited.
|
|
29
29
|
//
|
|
30
30
|
// Nothing in the syntax separates `owner/site.com` from a path written in prose: `prompts/review.md`
|
|
31
31
|
// has the same shape, and reading it as a repository is the misread the exclusion was there to
|
|
@@ -81,8 +81,7 @@ function is_repo_shape(parts: ReadonlyArray<string>): boolean {
|
|
|
81
81
|
// repositories this epic actually spans. `owner/site.com#40` is read when the epic tracks a child
|
|
82
82
|
// there, and `prompts/review.md#5` is not read at all, because no epic tracks a repository by that
|
|
83
83
|
// name. That makes the set of children that can be *tracked* and the set that can be *cited* the same
|
|
84
|
-
// set,
|
|
85
|
-
// widening the pattern outright would have brought back.
|
|
84
|
+
// set, without admitting the path misread that widening the pattern outright would bring back.
|
|
86
85
|
function reference_repo(
|
|
87
86
|
prefix: string,
|
|
88
87
|
repo: string,
|
|
@@ -127,8 +126,7 @@ function unique_references(references: ReadonlyArray<IssueReference>): Array<Iss
|
|
|
127
126
|
// `owner/name` whose body this is: an unqualified `#N` there names that repository's issue N.
|
|
128
127
|
//
|
|
129
128
|
// `known` names the repositories the epic in hand spans, and only a dotted name consults it —
|
|
130
|
-
// see `reference_repo`. A caller with no epic in view passes nothing and gets the dotless reading
|
|
131
|
-
// which is what every caller got before joshuafolkken/kit#1016.
|
|
129
|
+
// see `reference_repo`. A caller with no epic in view passes nothing and gets the dotless reading.
|
|
132
130
|
function parse_issue_references(
|
|
133
131
|
text: string,
|
|
134
132
|
repo: string,
|
|
@@ -148,7 +146,7 @@ function parse_issue_references(
|
|
|
148
146
|
// The repositories an epic actually spans, which is what settles a dotted name written in prose:
|
|
149
147
|
// `owner/site.com#40` is a reference when a child lives there and a path otherwise. Built from the
|
|
150
148
|
// children rather than supplied, so a caller cannot hand the parse a set that disagrees with the
|
|
151
|
-
// epic being read
|
|
149
|
+
// epic being read.
|
|
152
150
|
function known_repos(
|
|
153
151
|
children: ReadonlyArray<IssueReference>,
|
|
154
152
|
current_repo: string,
|
|
@@ -159,8 +157,14 @@ function known_repos(
|
|
|
159
157
|
// The issue numbers a piece of prose refers to *in its own repository*. Kept as the narrower reading
|
|
160
158
|
// of the same parse rather than a second one: `epic:bundle` compares two issues' references by
|
|
161
159
|
// number and has no cross-repository notion to compare with.
|
|
160
|
+
//
|
|
161
|
+
// **Only the body's own prose is read**: a number inside a fenced block or on
|
|
162
|
+
// a quote line is pasted material — command output in a reproduction, a quoted comment — not the
|
|
163
|
+
// author naming that issue. Counting it bundled a draft into an unrelated epic because a `lane:list`
|
|
164
|
+
// output in its fence happened to list one of that epic's children. The exclusion is the stop guard's
|
|
165
|
+
// citation reading (`issue_citation.prose_lines`), shared rather than restated.
|
|
162
166
|
function parse_references(text: string, repo = ''): Array<number> {
|
|
163
|
-
return parse_issue_references(text, repo)
|
|
167
|
+
return parse_issue_references(issue_citation.prose_lines(text).join('\n'), repo)
|
|
164
168
|
.filter((reference) => reference.repo === repo)
|
|
165
169
|
.map((reference) => reference.number)
|
|
166
170
|
}
|
|
@@ -201,7 +205,7 @@ function collect_blockers(
|
|
|
201
205
|
}
|
|
202
206
|
|
|
203
207
|
// Both ends are named by identity — repository plus number — because an epic can track two children
|
|
204
|
-
// whose numbers collide across repositories
|
|
208
|
+
// whose numbers collide across repositories.
|
|
205
209
|
function depends_on(
|
|
206
210
|
index: ReadonlyMap<string, EpicChild>,
|
|
207
211
|
node: EpicChild,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
1
2
|
import { UNORDERED_DEPENDENCIES } from './epic-parse'
|
|
2
3
|
import { DEPENDENCY_ARROW, to_issue_reference } from './epic-reference'
|
|
3
4
|
|
|
@@ -10,7 +11,7 @@ const RATIONALE_PLACEHOLDER = '<why the work was split this way>'
|
|
|
10
11
|
// Where a creation records its reasoning, including the reasoning for the order `--ordered` declares.
|
|
11
12
|
// Exported because `epic:audit`'s unjustified-order check reads it as one of the places a declared
|
|
12
13
|
// order's reason may live, and a second spelling of the heading is one that comes to disagree with
|
|
13
|
-
// the writer
|
|
14
|
+
// the writer.
|
|
14
15
|
const SPLIT_RATIONALE_HEADING = '## Split rationale'
|
|
15
16
|
// One child declares no order, so there is nothing for the record below to name.
|
|
16
17
|
const CHAIN_MINIMUM_LENGTH = 2
|
|
@@ -38,7 +39,7 @@ function format_dependencies(children: ReadonlyArray<number>, is_ordered: boolea
|
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
// The command that runs the batch. `backlogrun #E --only` takes the epic itself rather than a list of
|
|
41
|
-
// children
|
|
42
|
+
// children: it re-reads the state from GitHub each
|
|
42
43
|
// round, so an interrupted run resumes without anyone retyping the remaining numbers, and a child that
|
|
43
44
|
// needs a decision is parked rather than ending the run. `--only` runs exactly the epic's children and
|
|
44
45
|
// stops, which is the scope the removed `epicrun #E` keyword had.
|
|
@@ -46,13 +47,13 @@ function format_dependencies(children: ReadonlyArray<number>, is_ordered: boolea
|
|
|
46
47
|
// The epic number is not known while its own body is being built, so the placeholder is filled in by
|
|
47
48
|
// `format_run_command` once the issue exists. Bodies written before this change still say
|
|
48
49
|
// `epicrun …` or `queue …`; nothing reads the `Execution` section — the auto-close reads the task
|
|
49
|
-
// list and `epic:check` never looks at it — so those epics are unaffected
|
|
50
|
+
// list and `epic:check` never looks at it — so those epics are unaffected.
|
|
50
51
|
const EPIC_PLACEHOLDER = '<this epic>'
|
|
51
52
|
|
|
52
53
|
function format_run_command(epic_number: number | undefined): string {
|
|
53
54
|
const epic = epic_number === undefined ? EPIC_PLACEHOLDER : String(epic_number)
|
|
54
55
|
|
|
55
|
-
return `backlogrun
|
|
56
|
+
return `backlogrun ${issue_cite.plain(epic)} --only`
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
// A backlink to the Issue this split came from, when the split originated in another repository.
|
|
@@ -70,14 +71,13 @@ function to_rationale(rationale: string): string {
|
|
|
70
71
|
return trimmed.length > 0 ? trimmed : RATIONALE_PLACEHOLDER
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
// The record that `--ordered` itself is the decision behind the chain it writes
|
|
74
|
-
// (joshuafolkken/kit#1712).
|
|
74
|
+
// The record that `--ordered` itself is the decision behind the chain it writes.
|
|
75
75
|
//
|
|
76
76
|
// **Without it every `--ordered` epic is born failing its own audit.** `epic:audit`'s
|
|
77
|
-
// unjustified-order check asks where a declared order's reason was recorded, and
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
77
|
+
// unjustified-order check asks where a declared order's reason was recorded, and the split rationale
|
|
78
|
+
// explains the split in prose that need not name a single issue number — so without this record the
|
|
79
|
+
// check finds nothing for any of the links and `backlogrun #E` stops at its audit on a brand-new
|
|
80
|
+
// epic created exactly as documented.
|
|
81
81
|
//
|
|
82
82
|
// **It is a real record, not a formality.** `--ordered` is a person stating the order deliberately,
|
|
83
83
|
// and this says so, when, and where the reasoning is — which is exactly what the check exists to
|