@joshuafolkken/kit 1.1240.0 → 1.1373.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 +52 -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 +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- 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-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- 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-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- 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 +195 -181
- 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 +282 -95
- 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 +17 -11
- 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 +30 -5
- 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 +21 -7
- 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/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -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 +6 -7
- 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 +26 -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 +64 -18
- package/scripts/run/run-step.ts +107 -51
- 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
|
@@ -20,9 +20,9 @@ import { epic_parse } from './epic-parse'
|
|
|
20
20
|
import { epic_report, type EpicNextResult } from './epic-report'
|
|
21
21
|
|
|
22
22
|
// `josh epic:next <E…>` — which of the named epics' children can be started right now, bundled per
|
|
23
|
-
// repository, and what the rest are waiting on
|
|
23
|
+
// repository, and what the rest are waiting on.
|
|
24
24
|
//
|
|
25
|
-
// **Several epics answer as one
|
|
25
|
+
// **Several epics answer as one**. Every leading argument is an epic
|
|
26
26
|
// reference, and their children merge into one candidate pool per repository — so a repository with
|
|
27
27
|
// six free lanes fills them from every named epic rather than from whichever one was typed first.
|
|
28
28
|
// The merge itself, and why the priority order is the order they were named, is
|
|
@@ -33,17 +33,14 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
33
33
|
const FAILURE_EXIT_CODE = 1
|
|
34
34
|
const ARGV_OFFSET = 2
|
|
35
35
|
// Asking for every free lane (`--lanes`) is opt-in, so the answer stays one token for a caller that
|
|
36
|
-
// has not been changed. `--repo` alone
|
|
37
|
-
// changed for it is *when* that number appears, not how many arrive (joshuafolkken/kit#1491).
|
|
36
|
+
// has not been changed. `--repo` alone prints exactly one number.
|
|
38
37
|
const OPTIONS = { repo: { type: 'string' }, lanes: { type: 'boolean' } } as const
|
|
39
38
|
const USAGE =
|
|
40
39
|
'Usage: josh epic:next <epic-number|owner/repo#number>... [--repo <owner/repo>] [--lanes]'
|
|
41
|
-
// A repository that could not be read is refused rather than stood in for.
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
// dependent before its prerequisite. The old placeholder was harmless only while every blocker
|
|
46
|
-
// inherited the child's own repository — it matched itself.
|
|
40
|
+
// A repository that could not be read is refused rather than stood in for. A blocker carries the
|
|
41
|
+
// repository it lives in, so a placeholder on the children would key them as `unknown/unknown#N`
|
|
42
|
+
// while their blockers keep their real names: every relation misses, `from_blockers([])` calls the
|
|
43
|
+
// child runnable, and an unattended run starts a dependent before its prerequisite.
|
|
47
44
|
const UNKNOWN_REPO =
|
|
48
45
|
'Could not read this repository from `git remote`, so the children cannot be keyed by repository — check `gh auth status` and that this is a checkout with an `origin` remote.'
|
|
49
46
|
const EXTERNAL_NOTICE = 'Note: this epic tracks children in other repositories.'
|
|
@@ -55,7 +52,7 @@ const UNCHECKED_EXCLUSION =
|
|
|
55
52
|
|
|
56
53
|
interface NextOptions {
|
|
57
54
|
// Every epic named, in the order they were named — which is the order their children then take
|
|
58
|
-
// free lanes in
|
|
55
|
+
// free lanes in. Each reference carries the repository the *epic* lives
|
|
59
56
|
// in when it was qualified (`owner/repo#858`).
|
|
60
57
|
references?: ReadonlyArray<EpicReference>
|
|
61
58
|
// The repository to narrow the candidates to (`--repo`).
|
|
@@ -93,9 +90,9 @@ function with_repo(
|
|
|
93
90
|
}
|
|
94
91
|
|
|
95
92
|
// The positional arguments are epic references and the flags are options, so `epic:next 858 909 --repo
|
|
96
|
-
// X` reads two epics and `epic:next 858 --repo X` still reads one
|
|
93
|
+
// X` reads two epics and `epic:next 858 --repo X` still reads one. The read is
|
|
97
94
|
// strict: an unknown flag reaches the usage line rather than being ignored, and a value that is itself
|
|
98
|
-
// a flag is no value at all — `--repo --lanes`
|
|
95
|
+
// a flag is no value at all — `--repo --lanes` must not narrow to a repository literally named
|
|
99
96
|
// `--lanes` and report `No runnable child in --lanes` with exit 0.
|
|
100
97
|
//
|
|
101
98
|
// `--lanes` without `--repo` is refused rather than ignored: the lane count is a property of one
|
|
@@ -118,10 +115,10 @@ function parse_options(argv: ReadonlyArray<string>): NextOptions {
|
|
|
118
115
|
// leaves whatever it blocks looking unblocked.
|
|
119
116
|
//
|
|
120
117
|
// Each one is named with the repository it lives in, through the same writer the audit uses: an epic
|
|
121
|
-
// tracking `- [ ] sveltejs/kit#7`
|
|
122
|
-
// repository's issue 7
|
|
123
|
-
// **The epic's own body failing to read is its own anomaly, ahead of the children's
|
|
124
|
-
//
|
|
118
|
+
// tracking `- [ ] sveltejs/kit#7` reporting `Could not read #7` would send a reader to this
|
|
119
|
+
// repository's issue 7, a different issue or none.
|
|
120
|
+
// **The epic's own body failing to read is its own anomaly, ahead of the children's**.
|
|
121
|
+
// Without it the failure is silent: a body that never arrived parses to
|
|
125
122
|
// zero children, the epic is dropped from the views as an unpopulated one, no anomaly is raised, and
|
|
126
123
|
// the verdict falls through to `complete` — which `backlog:next` prints as `none`, so the run reports
|
|
127
124
|
// the backlog exhausted over one request that never left the machine. It is checked first because a
|
|
@@ -153,8 +150,8 @@ function unreadable_anomaly(snapshot: EpicSnapshot): GraphAnomaly | undefined {
|
|
|
153
150
|
// every correct relation as undeclared.
|
|
154
151
|
//
|
|
155
152
|
// Deliberately a disjunction where `epic:check` takes exactly one of the two: a body declaring both
|
|
156
|
-
// a chain and the `None — ...` literal is a contradiction, and reporting it is the check's job
|
|
157
|
-
//
|
|
153
|
+
// a chain and the `None — ...` literal is a contradiction, and reporting it is the check's job.
|
|
154
|
+
// Refusing to hand out work here as well would stop an unattended run on a
|
|
158
155
|
// body whose declared chain and recorded relations agree — a worse outcome than following the chain
|
|
159
156
|
// the run's own `epic:check` already flagged.
|
|
160
157
|
function is_order_declared(body: string | undefined, links: ReadonlyArray<unknown>): boolean {
|
|
@@ -178,7 +175,7 @@ function decide(
|
|
|
178
175
|
)
|
|
179
176
|
: [unreadable]
|
|
180
177
|
// The cross-repository resolver, not the default one: a blocker in another repository is not
|
|
181
|
-
// finished when it closes, only when its release is published
|
|
178
|
+
// finished when it closes, only when its release is published.
|
|
182
179
|
const classification = epic_classify.classify_children(
|
|
183
180
|
snapshot.children,
|
|
184
181
|
epic_cross_repo.resolve_cross_repo,
|
|
@@ -203,8 +200,8 @@ function repo_verdict(verdict: LaneOffer['verdict']): LaneOffer['verdict'] {
|
|
|
203
200
|
}
|
|
204
201
|
|
|
205
202
|
// The confirmed candidates' numbers, one per line, or the verdict that stands in their place when
|
|
206
|
-
// there was no free lane or the relations listing withheld every one of them
|
|
207
|
-
//
|
|
203
|
+
// there was no free lane or the relations listing withheld every one of them.
|
|
204
|
+
// Standard output carries numbers or a verdict and nothing else, so
|
|
208
205
|
// `child=$(josh epic:next … --repo …)` is unchanged for the caller that asked for one child — which
|
|
209
206
|
// is every caller that did not pass `--lanes`.
|
|
210
207
|
function report_offer(offer: LaneOffer): number {
|
|
@@ -222,23 +219,22 @@ function report_offer(offer: LaneOffer): number {
|
|
|
222
219
|
}
|
|
223
220
|
|
|
224
221
|
// The candidates, once the repository has been asked **how many lanes it already has running** —
|
|
225
|
-
// whichever epic those belong to
|
|
226
|
-
// joshuafolkken/kit#1491). The invariant is per *repository* rather than per epic, and it is a
|
|
222
|
+
// whichever epic those belong to, counted rather than excluded. The invariant is per *repository* rather than per epic, and it is a
|
|
227
223
|
// ceiling on how many children run there at once rather than a lock on the whole checkout.
|
|
228
224
|
//
|
|
229
225
|
// Asked only when there *is* a candidate: consulted on `stop` or `complete` too, an unrelated
|
|
230
226
|
// `in-progress` issue would turn a finished epic into a permanent `wait`, and neither of those
|
|
231
227
|
// verdicts is about to start anything. It also never reaches a third party's tracker, since a child
|
|
232
|
-
// in a repository with another owner is refused before it is read
|
|
228
|
+
// in a repository with another owner is refused before it is read.
|
|
233
229
|
//
|
|
234
230
|
// **A read that failed answers `wait` too** — never a child, and not an error either
|
|
235
231
|
// (`epic-busy.ts` records why both wrong answers are wrong). **So does a listing that was cut
|
|
236
|
-
// short**:
|
|
232
|
+
// short**: the page ceiling bounds this listing as well, and a short
|
|
237
233
|
// listing with no visible holder is not "nothing is running".
|
|
238
234
|
//
|
|
239
235
|
// One pool per named epic, in the order they were named. Nothing below this line knows what an epic
|
|
240
236
|
// is (`epic-lane-offer.ts` records why), so the whole cost of running several of them is here: build
|
|
241
|
-
// the pools, and let the scheduler spend the free lanes across them
|
|
237
|
+
// the pools, and let the scheduler spend the free lanes across them.
|
|
242
238
|
async function offer_children(
|
|
243
239
|
views: ReadonlyArray<EpicView>,
|
|
244
240
|
request: LaneRequest,
|
|
@@ -287,7 +283,7 @@ async function report_single(
|
|
|
287
283
|
// The aggregate listing does not consult the repository-level exclusion — `--repo` is what asks a
|
|
288
284
|
// repository whether it is busy, and doing it here would be one listing per repository for a report
|
|
289
285
|
// nobody branches on. Said out loud rather than left implicit: this output names runnable children,
|
|
290
|
-
// and the `--repo` form may answer `wait` for the very same child
|
|
286
|
+
// and the `--repo` form may answer `wait` for the very same child.
|
|
291
287
|
function note_unchecked_exclusion(views: ReadonlyArray<EpicView>): void {
|
|
292
288
|
if (epic_next_views.combined_verdict(views) === 'run') console.error(UNCHECKED_EXCLUSION)
|
|
293
289
|
}
|
|
@@ -295,7 +291,7 @@ function note_unchecked_exclusion(views: ReadonlyArray<EpicView>): void {
|
|
|
295
291
|
// One block per epic, and the notice printed once for all of them rather than once each: it says
|
|
296
292
|
// what this listing does not check, which is the same sentence however many graphs it covers. The
|
|
297
293
|
// listing names each epic and its children as `#N`, linkified against the current repository so the
|
|
298
|
-
// output a run reads carries clickable references rather than bare ones
|
|
294
|
+
// output a run reads carries clickable references rather than bare ones.
|
|
299
295
|
function report_aggregate(views: ReadonlyArray<EpicView>, current_repo: string): number {
|
|
300
296
|
note_unchecked_exclusion(views)
|
|
301
297
|
|
|
@@ -339,7 +335,7 @@ async function report(
|
|
|
339
335
|
return report_aggregate(views, current_repo)
|
|
340
336
|
}
|
|
341
337
|
|
|
342
|
-
// The checkout each repository's children would be run in comes from
|
|
338
|
+
// The checkout each repository's children would be run in comes from the workspace map. A
|
|
343
339
|
// repository absent from it is reported without a path rather than cloned.
|
|
344
340
|
//
|
|
345
341
|
// **Every epic is classified against the same reset**, not one reset each: `reset_reported` and
|
|
@@ -352,7 +348,7 @@ async function report_epics(
|
|
|
352
348
|
): Promise<number> {
|
|
353
349
|
if (options.repo === undefined) return await report(views, undefined, current_repo)
|
|
354
350
|
|
|
355
|
-
const choice = lane_capacity.lane_limit()
|
|
351
|
+
const choice = await lane_capacity.lane_limit()
|
|
356
352
|
if (choice.kind === 'problem') return refuse(choice.problem)
|
|
357
353
|
|
|
358
354
|
return await report(
|
|
@@ -364,7 +360,7 @@ async function report_epics(
|
|
|
364
360
|
|
|
365
361
|
// One view per named epic, classified against one shared registry read. `running` is every named
|
|
366
362
|
// epic's children unless a caller that runs more — `backlog:next` — passes its own set, so a blocker
|
|
367
|
-
// in another named epic waits rather than stops
|
|
363
|
+
// in another named epic waits rather than stops.
|
|
368
364
|
function views_of(
|
|
369
365
|
reads: ReadonlyArray<EpicRead>,
|
|
370
366
|
running = epic_outside_blocker.running_keys(reads.flatMap((read) => read.snapshot.children)),
|
|
@@ -423,7 +419,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
423
419
|
// `process.exitCode` rather than `process.exit()`, for the reason `scripts/cost-runtime/cost-cli.ts` records:
|
|
424
420
|
// the answer goes to standard output and a write to a pipe is asynchronous on macOS, so exiting can
|
|
425
421
|
// tear the process down before it drains. This command's contract is `answer=$(pnpm josh epic:next
|
|
426
|
-
// <E>)`, which is exactly that pipe
|
|
422
|
+
// <E>)`, which is exactly that pipe.
|
|
427
423
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
428
424
|
process.exitCode = await run(argv)
|
|
429
425
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
1
2
|
import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
2
3
|
|
|
3
|
-
// A blocker no graph in this invocation tracks, weighed rather than ignored
|
|
4
|
+
// A blocker no graph in this invocation tracks, weighed rather than ignored.
|
|
4
5
|
//
|
|
5
|
-
//
|
|
6
|
-
// another epic's open issue
|
|
7
|
-
//
|
|
6
|
+
// A relation pointing outside the epic is weighed rather than announced and dropped, so a child
|
|
7
|
+
// waiting on another epic's open issue is not offered as runnable, whatever `blocked-by` says. What
|
|
8
|
+
// decides the
|
|
8
9
|
// answer is whether *this run* can finish the blocker: an open blocker the run also runs is `time`
|
|
9
10
|
// (waiting resolves it), one it does not is `human` (only a person can), and a blocker whose state was
|
|
10
11
|
// never read is `time` rather than runnable, because an unknown is never read as finished.
|
|
@@ -15,12 +16,12 @@ import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
|
15
16
|
//
|
|
16
17
|
// `inherit` is the ordinary answer: the blocker is not finished, so this child's fate is the
|
|
17
18
|
// blocker's fate. `time` and `human` are for a dependency that is unresolved for a reason the
|
|
18
|
-
// blocker's own state does not show —
|
|
19
|
-
//
|
|
19
|
+
// blocker's own state does not show — a blocker that is closed but whose package has not been
|
|
20
|
+
// published yet is `time`.
|
|
20
21
|
type DependencyVerdict = 'resolved' | 'time' | 'human' | 'inherit'
|
|
21
22
|
|
|
22
|
-
// The extension point
|
|
23
|
-
//
|
|
23
|
+
// The extension point, replaced wholesale to add the publish condition; the default knows only that
|
|
24
|
+
// a closed blocker is a finished one.
|
|
24
25
|
type ResolveDependency = (blocker: EpicChild, blocked: EpicChild) => DependencyVerdict
|
|
25
26
|
|
|
26
27
|
type OutsideCategory = 'time' | 'human'
|
|
@@ -39,11 +40,11 @@ interface OutsideAnswer {
|
|
|
39
40
|
const CLOSED = 'CLOSED'
|
|
40
41
|
|
|
41
42
|
function name_of(child: EpicChild): string {
|
|
42
|
-
return
|
|
43
|
+
return session_cite.issue(child.number, undefined, child.repo)
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
// A closed reference as the child record a resolver takes, so a closed blocker in another repository
|
|
46
|
-
// still waits for its release exactly as a tracked one does
|
|
47
|
+
// still waits for its release exactly as a tracked one does.
|
|
47
48
|
function as_closed_child(reference: IssueReference): EpicChild {
|
|
48
49
|
return {
|
|
49
50
|
number: reference.number,
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
|
|
1
3
|
// An epic Issue tracks its children as a markdown task list (`- [ ] #101`). Only that syntax
|
|
2
4
|
// counts as tracked: GitHub auto-checks such an entry when the referenced Issue closes, whereas a
|
|
3
5
|
// bare `#101` reference produces a cross-link with no progress tracking.
|
|
4
6
|
//
|
|
5
7
|
// The source is shared by the whole-body scan and the single-line test rather than written twice: a
|
|
6
8
|
// rewriter has to recognize exactly the rows the reader counts, and two copies of this pattern would
|
|
7
|
-
// be two chances to disagree about what a tracked row is
|
|
9
|
+
// be two chances to disagree about what a tracked row is.
|
|
8
10
|
const TASK_LIST_ISSUE_SOURCE = String.raw`^[ \t]*[-*+][ \t]+\[[ xX]\][ \t]+#(\d+)\b`
|
|
9
11
|
const TASK_LIST_ISSUE_PATTERN = new RegExp(TASK_LIST_ISSUE_SOURCE, 'gmu')
|
|
10
12
|
const TASK_LIST_LINE_PATTERN = new RegExp(TASK_LIST_ISSUE_SOURCE, 'u')
|
|
11
13
|
|
|
12
14
|
// A task list may also reference an Issue in another repository (`owner/repo#101`, or a full URL).
|
|
13
|
-
//
|
|
14
|
-
// against their own repository, and the pattern below extracts which repository and which issue.
|
|
15
|
+
// Such a reference is read against its own repository, and the pattern below extracts which repository and which issue.
|
|
15
16
|
// `owner/repo#101` on its own. The row patterns below are built from this source, so what counts as
|
|
16
17
|
// a cross-repository reference has one definition — a second copy would let a form the task list
|
|
17
|
-
// accepts be refused where a person types it, or the reverse
|
|
18
|
+
// accepts be refused where a person types it, or the reverse.
|
|
18
19
|
const EXTERNAL_REFERENCE_SOURCE = String.raw`([\w.-]+)\/([\w.-]+)#(\d+)`
|
|
19
20
|
const EXTERNAL_REFERENCE_PATTERN = new RegExp(`^${EXTERNAL_REFERENCE_SOURCE}$`, 'u')
|
|
20
21
|
const TASK_LIST_ROW_SOURCE = String.raw`^[ \t]*[-*+][ \t]+\[[ xX]\][ \t]+`
|
|
@@ -39,12 +40,12 @@ const FENCE_LINE_PATTERN = /^[ \t]*(?:`{3,}|~{3,})/u
|
|
|
39
40
|
// A chain between two Issue references (`#101 -> #102`, or the arrow written as `→`), read for its
|
|
40
41
|
// links. `epic:next` compares what the body declares against the `blocked-by` relations actually
|
|
41
42
|
// recorded, and a body that says one order while the relations say another must stop the run rather
|
|
42
|
-
// than silently follow either
|
|
43
|
+
// than silently follow either.
|
|
43
44
|
//
|
|
44
|
-
// Only a line that is *nothing but* a chain counts, optionally behind a list marker.
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
45
|
+
// Only a line that is *nothing but* a chain counts, optionally behind a list marker. A Dependencies
|
|
46
|
+
// section may be followed by a prose line recommending an execution order — e.g.
|
|
47
|
+
// `recommended order: #869 -> #863 -> …`. Those arrows are a suggestion, not a declaration, and
|
|
48
|
+
// reading them as one reports disagreements that do not exist.
|
|
48
49
|
const DECLARED_CHAIN_LINE = /^(?:[-*+][ \t]+)?#\d+(?:[ \t]*(?:->|→)[ \t]*#\d+)+$/u
|
|
49
50
|
const CHAIN_REFERENCE_PATTERN = /#(\d+)/gu
|
|
50
51
|
|
|
@@ -59,7 +60,7 @@ const CLOSED_STATE = 'CLOSED'
|
|
|
59
60
|
// Which lines a body predicate is allowed to read: `false` for a fence line and for everything
|
|
60
61
|
// between a pair of them. Returned as a mask rather than a filtered string because a rewriter has to
|
|
61
62
|
// put lines back where it found them, and it must skip exactly the lines the readers skip — two
|
|
62
|
-
// separate fence walks would be two chances to disagree
|
|
63
|
+
// separate fence walks would be two chances to disagree.
|
|
63
64
|
//
|
|
64
65
|
// Toggling on each fence line keeps this linear — a single regex spanning the block would backtrack.
|
|
65
66
|
// An unterminated fence swallows the rest of the body, which fails safe: fewer children means the
|
|
@@ -141,7 +142,7 @@ function to_external_child(match: RegExpMatchArray): ExternalChild | undefined {
|
|
|
141
142
|
|
|
142
143
|
// A bare `owner/repo#101`, as a person types it — the same shape the task-list rows carry, read
|
|
143
144
|
// from a command argument rather than from a body. It reuses `to_external_child` so the two cannot
|
|
144
|
-
// disagree about which owner and repository names are acceptable
|
|
145
|
+
// disagree about which owner and repository names are acceptable.
|
|
145
146
|
function parse_external_reference(text: string): ExternalChild | undefined {
|
|
146
147
|
const match = EXTERNAL_REFERENCE_PATTERN.exec(text.trim())
|
|
147
148
|
if (match === null) return undefined
|
|
@@ -157,7 +158,7 @@ function match_external(body: string, pattern: RegExp): Array<ExternalChild> {
|
|
|
157
158
|
|
|
158
159
|
// Every cross-repository child the task list tracks, in both spellings. Reported as `owner/repo`
|
|
159
160
|
// plus a number rather than a URL, which is the form the repository map takes and the form the
|
|
160
|
-
// read's REST path is built from
|
|
161
|
+
// read's REST path is built from.
|
|
161
162
|
function parse_external_task_list_children(body: string | undefined): Array<ExternalChild> {
|
|
162
163
|
if (body === undefined) return []
|
|
163
164
|
const stripped = strip_fenced_blocks(body)
|
|
@@ -168,7 +169,7 @@ function parse_external_task_list_children(body: string | undefined): Array<Exte
|
|
|
168
169
|
const seen = new Set<string>()
|
|
169
170
|
|
|
170
171
|
return found.filter((child) => {
|
|
171
|
-
const key =
|
|
172
|
+
const key = issue_cite.plain(child.number, child.repo)
|
|
172
173
|
const is_new = !seen.has(key)
|
|
173
174
|
|
|
174
175
|
seen.add(key)
|
|
@@ -194,7 +195,7 @@ function has_unordered_declaration(body: string | undefined): boolean {
|
|
|
194
195
|
// Whether one line, on its own, is part of a machine-readable `Dependencies` declaration — a chain or
|
|
195
196
|
// the unordered sentence. It lives here beside the two patterns it tests rather than in either of the
|
|
196
197
|
// modules that rewrite a body, because both of them need it and a second copy is where one comes to
|
|
197
|
-
// disagree with the parser about what counts as a declaration
|
|
198
|
+
// disagree with the parser about what counts as a declaration.
|
|
198
199
|
function is_declaration_line(line: string): boolean {
|
|
199
200
|
const trimmed = line.trim()
|
|
200
201
|
|
|
@@ -227,7 +228,7 @@ function chain_links(references: ReadonlyArray<number>): Array<DependencyLink> {
|
|
|
227
228
|
// Every declared chain, one entry per chain line, each holding its references in the order written.
|
|
228
229
|
// Read at this granularity rather than as a flat link list because an insertion has to know *which*
|
|
229
230
|
// chain a target sits in: two disjoint chains and one branching chain produce the same links, and
|
|
230
|
-
// only the line structure tells them apart
|
|
231
|
+
// only the line structure tells them apart.
|
|
231
232
|
//
|
|
232
233
|
// Fenced blocks are stripped first for the reason they are everywhere else: a quoted template's
|
|
233
234
|
// sample chain is an illustration.
|
|
@@ -251,13 +252,11 @@ function parse_dependency_links(body: string | undefined): Array<DependencyLink>
|
|
|
251
252
|
// warning, which need to tell "the order was never recorded" from "there is no order".
|
|
252
253
|
//
|
|
253
254
|
// Answered from the chains above rather than from a pattern of its own, because a second pattern is
|
|
254
|
-
// a second answer:
|
|
255
|
-
//
|
|
256
|
-
//
|
|
257
|
-
//
|
|
258
|
-
// the
|
|
259
|
-
// (`epic-add-body.ts` protects an arrow outside the `Dependencies` section as prose) — so the
|
|
260
|
-
// three readers of one body now recognize the same lines, instead of two patterns that could
|
|
255
|
+
// a second answer: scanning the whole body for a bare `#N -> #M` would let a rationale paragraph
|
|
256
|
+
// recommending an execution order make an epic declared `None — the children are independent`
|
|
257
|
+
// report as ordered. The link reader applies the same narrowing, and `epic --add` writes on that
|
|
258
|
+
// judgement too (`epic-add-body.ts` protects an arrow outside the `Dependencies` section as prose) —
|
|
259
|
+
// so the three readers of one body recognize the same lines, instead of two patterns that could
|
|
261
260
|
// disagree about which line is a declaration. They still answer different questions of those lines:
|
|
262
261
|
// a self-loop (`#101 -> #101`) is a declaration here and yields no link, since `chain_links` drops
|
|
263
262
|
// an edge from an issue to itself.
|
|
@@ -283,8 +282,7 @@ function read_declaration(body: string | undefined): DeclarationState {
|
|
|
283
282
|
|
|
284
283
|
// Whether that declaration says something a machine can act on: exactly one of the two forms, never
|
|
285
284
|
// both. A body carrying a chain *and* the `None — ...` literal declares an order and declares that
|
|
286
|
-
// there is none,
|
|
287
|
-
// other (joshuafolkken/kit#1155). Single-sourced here because `epic:check`, `epic --add` and
|
|
285
|
+
// there is none, so `epic:check` must not pass it. Single-sourced here because `epic:check`, `epic --add` and
|
|
288
286
|
// `epic --promote` all mean this same question, and three copies of the disjunction were three
|
|
289
287
|
// chances to accept a body the check rejects.
|
|
290
288
|
function is_declaration_readable(state: DeclarationState): boolean {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
1
2
|
import { epic_body } from './epic-body'
|
|
2
3
|
import { epic_parse } from './epic-parse'
|
|
3
4
|
|
|
@@ -33,7 +34,7 @@ function has_conflicting_tracking(body: string | undefined): boolean {
|
|
|
33
34
|
function conflict_reason(body: string | undefined): string {
|
|
34
35
|
if (body?.includes(PROMOTED_HEADING) === true) return 'it already carries the epic sections'
|
|
35
36
|
const tracked = epic_parse.parse_task_list_issue_numbers(body)
|
|
36
|
-
const list = tracked.map((child) =>
|
|
37
|
+
const list = tracked.map((child) => session_cite.issue(child)).join(', ')
|
|
37
38
|
|
|
38
39
|
return `its body already tracks ${list} as a task list, which would become a second child list`
|
|
39
40
|
}
|
|
@@ -61,7 +62,7 @@ function build_promoted_body(input: PromoteInput): string {
|
|
|
61
62
|
// the children: a declaration-shaped line already present in the issue being promoted is carried
|
|
62
63
|
// into the epic verbatim, and an unordered promotion then adds the `None — ...` literal beside it,
|
|
63
64
|
// so the body would declare an order and declare that there is none. Reported as "does not track
|
|
64
|
-
// every child", that state left nothing to act on
|
|
65
|
+
// every child", that state left nothing to act on.
|
|
65
66
|
function declaration_error(body: string): string | undefined {
|
|
66
67
|
const state = epic_parse.read_declaration(body)
|
|
67
68
|
if (epic_parse.is_declaration_readable(state)) return undefined
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { issue_rank } from '#scripts/issue/issue-rank'
|
|
2
2
|
import { epic_graph, type EpicChild } from './epic-graph'
|
|
3
3
|
|
|
4
|
-
// `issue-rank.ts`'s keys over graph children
|
|
4
|
+
// `issue-rank.ts`'s keys over graph children, for both offer paths that hand
|
|
5
5
|
// out children: `backlog:next` (`backlog-rank.ts`) and a named epic's `epic:next --lanes`
|
|
6
6
|
// (`epic-lane-offer.ts`). One ranking, so the two cannot disagree about which child goes first.
|
|
7
7
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
2
3
|
import { epic_fetch } from './epic-fetch'
|
|
3
4
|
import { epic_graph, type EpicChild } from './epic-graph'
|
|
4
5
|
import { epic_parse } from './epic-parse'
|
|
@@ -8,14 +9,14 @@ import { epic_validate, type EpicSubject } from './epic-validate'
|
|
|
8
9
|
//
|
|
9
10
|
// `--add` and `--remove` need exactly the same three things before they may compute anything: the
|
|
10
11
|
// epic's labels and body, the repository a declared bare number names, and every child with its
|
|
11
|
-
// native relations. They
|
|
12
|
-
//
|
|
12
|
+
// native relations. They share this one read because a second copy is where one of them comes to
|
|
13
|
+
// accept a graph the other refuses.
|
|
13
14
|
|
|
14
|
-
// Refused rather than stood in for, and both callers *write*.
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
15
|
+
// Refused rather than stood in for, and both callers *write*. A plan filters recorded relations by
|
|
16
|
+
// the declared repository, so a placeholder drops every one of them: the "reconcile them before
|
|
17
|
+
// inserting" guard never fires, the superseded link is never dropped, and relations that already
|
|
18
|
+
// exist are re-POSTed — leaving the epic in exactly the mismatched state `epic:audit` refuses to run
|
|
19
|
+
// on.
|
|
19
20
|
const UNKNOWN_REPO =
|
|
20
21
|
"Could not read this repository from `git remote`, so the epic's relations cannot be keyed by repository — check `gh auth status` and that this is a checkout with an `origin` remote."
|
|
21
22
|
|
|
@@ -56,7 +57,8 @@ async function read_recorded(
|
|
|
56
57
|
// The epic and its current graph, or the reason neither could be read.
|
|
57
58
|
async function read_epic(epic_number: number): Promise<EpicReading | { error: string }> {
|
|
58
59
|
const subject = await read_subject(epic_number)
|
|
59
|
-
|
|
60
|
+
const unread = `Could not read issue ${session_cite.issue(epic_number)}.`
|
|
61
|
+
if (subject === undefined) return { error: unread }
|
|
60
62
|
|
|
61
63
|
const recorded = await read_recorded(subject.body)
|
|
62
64
|
if ('error' in recorded) return { error: recorded.error }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
2
3
|
import { epic_add_body } from './epic-add-body'
|
|
3
4
|
import { epic_chains } from './epic-chains'
|
|
4
5
|
import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
@@ -8,8 +9,7 @@ import { format_dependency_links } from './epic-reference'
|
|
|
8
9
|
import { epic_relations } from './epic-relations'
|
|
9
10
|
|
|
10
11
|
// `josh epic --reconcile <E>` — bring an epic's `## Dependencies` declaration and its native
|
|
11
|
-
// `blocked-by` relations back into agreement, without a hand edit and without recording a decision
|
|
12
|
-
// (joshuafolkken/kit#2235).
|
|
12
|
+
// `blocked-by` relations back into agreement, without a hand edit and without recording a decision.
|
|
13
13
|
//
|
|
14
14
|
// `--add` and `--remove` refuse the moment the two disagree, and `backlog:next` reports the graph
|
|
15
15
|
// unusable, so the only exit was to edit the epic body by hand — the very edit those commands exist
|
|
@@ -36,7 +36,7 @@ interface ReconcilePlanInput {
|
|
|
36
36
|
body: string | undefined
|
|
37
37
|
// The epic's children with their native relations, exactly as `epic_read` reads them.
|
|
38
38
|
recorded: ReadonlyArray<EpicChild>
|
|
39
|
-
// The epic's own repository — what a declared bare number names
|
|
39
|
+
// The epic's own repository — what a declared bare number names.
|
|
40
40
|
repo: string
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -60,7 +60,7 @@ function to_chain(link: DependencyLink): Array<number> {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
// A blocker of `blocked`, keyed to the epic's own repository so a declared bare number names the
|
|
63
|
-
// right issue
|
|
63
|
+
// right issue.
|
|
64
64
|
function to_blocker(link: DependencyLink, repo: string): IssueReference {
|
|
65
65
|
return { repo, number: link.blocker }
|
|
66
66
|
}
|
|
@@ -161,7 +161,7 @@ function build_reconcile_plan(input: ReconcilePlanInput): ReconcilePlan {
|
|
|
161
161
|
// refused the mismatched epic agree on its order.
|
|
162
162
|
function report_agreement(epic_number: number): void {
|
|
163
163
|
console.info(
|
|
164
|
-
`${RECONCILED}
|
|
164
|
+
`${RECONCILED} ${session_cite.issue(epic_number)} — epic:audit and backlog:next now agree on this epic's order.`,
|
|
165
165
|
)
|
|
166
166
|
}
|
|
167
167
|
|
|
@@ -169,7 +169,9 @@ function report_declared(epic_number: number, declare: ReadonlyArray<DependencyL
|
|
|
169
169
|
if (declare.length === 0) return
|
|
170
170
|
|
|
171
171
|
console.info(
|
|
172
|
-
|
|
172
|
+
session_cite.text(
|
|
173
|
+
`📋 Declared ${format_dependency_links(declare)} in epic ${session_cite.issue(epic_number)} to match the recorded relations.`,
|
|
174
|
+
),
|
|
173
175
|
)
|
|
174
176
|
}
|
|
175
177
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
1
2
|
import type { DependencyLink } from './epic-parse'
|
|
2
3
|
|
|
3
4
|
// How an issue and a dependency between two of them are written down.
|
|
@@ -5,7 +6,7 @@ import type { DependencyLink } from './epic-parse'
|
|
|
5
6
|
// Both spellings had accumulated a copy per module — the body generator, the graph, the chain model
|
|
6
7
|
// and the insertion planner each rendered `#N` and `#B -> #M` themselves. They are one-liners, which
|
|
7
8
|
// is exactly why the copies spread; and a link rendered one way in a message and another way as a
|
|
8
|
-
// dedup key is a difference nothing would report
|
|
9
|
+
// dedup key is a difference nothing would report.
|
|
9
10
|
|
|
10
11
|
const DEPENDENCY_ARROW = ' -> '
|
|
11
12
|
// How a list of references is written out. One definition rather than a `join` per caller: the
|
|
@@ -14,7 +15,7 @@ const DEPENDENCY_ARROW = ' -> '
|
|
|
14
15
|
const REFERENCE_SEPARATOR = ', '
|
|
15
16
|
|
|
16
17
|
function to_issue_reference(issue_number: number): string {
|
|
17
|
-
return
|
|
18
|
+
return issue_cite.plain(issue_number)
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
function format_dependency_link(link: DependencyLink): string {
|
|
@@ -27,7 +28,7 @@ function join_references(references: ReadonlyArray<string>): string {
|
|
|
27
28
|
|
|
28
29
|
// A list of links, in the same form a single one takes. One definition rather than a `map().join()`
|
|
29
30
|
// per caller: the insertion planner and the relation reporter now print the same list side by side,
|
|
30
|
-
// and two spellings of it would read as two different things
|
|
31
|
+
// and two spellings of it would read as two different things.
|
|
31
32
|
function format_dependency_links(links: ReadonlyArray<DependencyLink>): string {
|
|
32
33
|
return join_references(links.map((link) => format_dependency_link(link)))
|
|
33
34
|
}
|
|
@@ -37,7 +38,7 @@ function format_issue_references(issue_numbers: ReadonlyArray<number>): string {
|
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
// The `blocked-by` relations a positioned `--add` dropped, named the same way wherever they are
|
|
40
|
-
// reported — on stdout and inside the `--decision-file` record
|
|
41
|
+
// reported — on stdout and inside the `--decision-file` record. One string
|
|
41
42
|
// rather than two, because the two are read side by side: a reader comparing the console against the
|
|
42
43
|
// record must not have to decide whether two spellings mean the same thing.
|
|
43
44
|
//
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
1
2
|
import { error_text } from '#scripts/lib/error-message'
|
|
2
3
|
import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
3
4
|
import { epic_parse } from './epic-parse'
|
|
4
5
|
|
|
5
|
-
//
|
|
6
|
-
// become a verdict.
|
|
6
|
+
// A second look at the relations, taken only where the first one is about to become a verdict.
|
|
7
7
|
//
|
|
8
8
|
// `read_blocked_by` answers from the issue's own `issue_dependencies_summary` when that summary says
|
|
9
9
|
// zero, which is what keeps a pass over the whole backlog to one request per issue that declares a
|
|
10
|
-
// blocker
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
// #1106 -> #1111`, and exited 1. An unattended run stops there, on a graph with nothing to fix.
|
|
10
|
+
// blocker. The summary is GitHub's count, and it can disagree with the listing it counts: a summary
|
|
11
|
+
// can read `total_blocked_by: 0` while `dependencies/blocked_by` returns a blocker whose re-POST is
|
|
12
|
+
// refused with `Target issue has already been taken` — the relation is real and only the counter is
|
|
13
|
+
// wrong. Trusting that counter, `epic:next` reads the epic as self-contradictory, prints `declared
|
|
14
|
+
// but not recorded`, and exits 1. An unattended run stops there, on a graph with nothing to fix.
|
|
16
15
|
//
|
|
17
16
|
// It corrects nothing else. A relation that is genuinely absent still comes back absent, and the
|
|
18
|
-
// mismatch is still reported — the point is that the report is
|
|
17
|
+
// mismatch is still reported — the point is that the report is about the relations rather than
|
|
19
18
|
// about a counter.
|
|
20
19
|
|
|
21
20
|
// A body may legitimately be ahead of its relations — an epic written before `josh` recorded them,
|
|
@@ -37,7 +36,7 @@ type BlockersReader = (child: EpicChild) => Promise<Array<IssueReference>>
|
|
|
37
36
|
// Restricted to `declared_repo` because a declared link is written as a bare number, which names an
|
|
38
37
|
// issue in the epic's own repository — `epic_graph` matches those by number alone. An epic tracking
|
|
39
38
|
// both `#40` and `owner/other#40` would otherwise have the second child re-read on the first one's
|
|
40
|
-
// account, and its relations replaced with a different issue's
|
|
39
|
+
// account, and its relations replaced with a different issue's.
|
|
41
40
|
function suspect_children(
|
|
42
41
|
children: ReadonlyArray<EpicChild>,
|
|
43
42
|
body: string | undefined,
|
|
@@ -61,7 +60,7 @@ async function reread_child(child: EpicChild, read_blockers: BlockersReader): Pr
|
|
|
61
60
|
const reason = error_text.message_of(error)
|
|
62
61
|
|
|
63
62
|
console.warn(
|
|
64
|
-
`⚠ could not re-read the blockers of
|
|
63
|
+
`⚠ could not re-read the blockers of ${session_cite.issue(child.number, undefined, child.repo)}: ${reason}\n` +
|
|
65
64
|
' a mismatch reported below may be this read failing rather than a missing relation',
|
|
66
65
|
)
|
|
67
66
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
2
3
|
import type { DependencyLink } from './epic-parse'
|
|
3
4
|
import { format_dependency_links } from './epic-reference'
|
|
4
5
|
|
|
@@ -7,11 +8,10 @@ import { format_dependency_links } from './epic-reference'
|
|
|
7
8
|
// The relation is a nicety, not part of the contract: losing it costs only the native link, while
|
|
8
9
|
// the Issue and its task list are already correct. A failure is therefore counted and reported
|
|
9
10
|
// rather than aborting a batch that is otherwise fine. It no longer depends on the gh CLI's version
|
|
10
|
-
// — the relation is written through the REST dependencies endpoint
|
|
11
|
+
// — the relation is written through the REST dependencies endpoint.
|
|
11
12
|
//
|
|
12
13
|
// Shared by epic creation and `--add` rather than written once per caller: both apply the same
|
|
13
|
-
// relations for the same reason, and a second copy would be the place a fix is forgotten
|
|
14
|
-
// (joshuafolkken/kit#890).
|
|
14
|
+
// relations for the same reason, and a second copy would be the place a fix is forgotten.
|
|
15
15
|
|
|
16
16
|
type RelationAction = 'record' | 'drop'
|
|
17
17
|
|
|
@@ -41,10 +41,9 @@ function describe_action(action: RelationAction): string {
|
|
|
41
41
|
return action === 'record' ? 'recorded' : 'removed'
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
// What happened, and to which pairs.
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
// joshuafolkken/kit#1080 were caught only by whoever thought to open the epic body afterwards. The
|
|
44
|
+
// What happened, and to which pairs. A count on its own cannot be checked: an insertion that
|
|
45
|
+
// recorded an order nobody declared would print the same `1 blocked-by relation(s) recorded.` as a
|
|
46
|
+
// correct one, so an invented chain would be caught only by whoever opened the epic body. The
|
|
48
47
|
// links are named in the `#blocker -> #blocked` form the declaration itself uses, so the reader
|
|
49
48
|
// compares like with like.
|
|
50
49
|
//
|
|
@@ -63,7 +62,9 @@ function format_relation_report(input: {
|
|
|
63
62
|
if (input.links.length === 0) return `🔗 No blocked-by relation was ${verb}.`
|
|
64
63
|
|
|
65
64
|
if (input.failures === 0) {
|
|
66
|
-
return
|
|
65
|
+
return session_cite.text(
|
|
66
|
+
`🔗 ${total} blocked-by relation(s) ${verb}: ${format_dependency_links(input.links)}.`,
|
|
67
|
+
)
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
return `⚠️ ${String(input.failures)} of ${total} blocked-by relation(s) could not be ${verb}; the epic body is intact.`
|