@joshuafolkken/kit 1.1229.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 +24 -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 +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- 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/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- 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-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.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-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- 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 +213 -197
- 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 -201
- package/dist/josh.js +540 -137
- 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 +4 -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 +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- 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 +313 -0
- 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 +60 -53
- 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 +12 -8
- 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 +35 -0
- 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 +49 -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 +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- 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 +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- 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 +32 -34
- 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 +33 -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 +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- 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 +10 -10
- 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 +20 -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 +44 -30
- 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 +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -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 +140 -0
- 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-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- 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 +68 -37
- 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 +10 -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 +172 -43
- 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 +62 -48
- 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 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- 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 +13 -21
- 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 -328
- 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 +129 -98
- 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/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- 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,21 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { auto_ok_cli } from '#scripts/auto-ok/auto-ok-cli'
|
|
4
|
-
import { epic_index } from '#scripts/epic/epic-index'
|
|
5
|
-
import type { EpicNextResult } from '#scripts/epic/epic-report'
|
|
6
|
-
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
7
|
-
import { open_issue_schema, type OpenIssueData } from '#scripts/git/git-schemas'
|
|
8
|
-
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
9
4
|
import { run_invocation } from '#scripts/run/run-invocation'
|
|
10
5
|
import { backlog_named } from './backlog-named'
|
|
11
|
-
import { backlog_next
|
|
12
|
-
import { backlog_plan, type NamedPlan
|
|
13
|
-
import type
|
|
6
|
+
import { backlog_next } from './backlog-next'
|
|
7
|
+
import { backlog_plan, type NamedPlan } from './backlog-plan'
|
|
8
|
+
import { backlog_plan_read, type OpenListing, type Plan } from './backlog-plan-read'
|
|
14
9
|
import { backlog_scope } from './backlog-scope'
|
|
15
10
|
import { backlog_waves } from './backlog-waves'
|
|
16
11
|
|
|
17
|
-
// `josh backlog:plan` — the whole backlog as a plan a person reads before a run starts
|
|
18
|
-
// (joshuafolkken/kit#1652).
|
|
12
|
+
// `josh backlog:plan` — the whole backlog as a plan a person reads before a run starts.
|
|
19
13
|
//
|
|
20
14
|
// `backlog:next` already answers what may start, and a `backlogrun` acted on that answer one ask at a
|
|
21
15
|
// time, so nothing ever showed the shape of the run: the order, which issue waits on which, what is
|
|
@@ -33,13 +27,12 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
33
27
|
const FAILURE_EXIT_CODE = 1
|
|
34
28
|
|
|
35
29
|
// The keyword `run_invocation` parses a named-issue prefix behind, reused rather than parsing `#N`
|
|
36
|
-
// again here so the `0` / leading-zero / safe-integer rules stay single-sourced
|
|
30
|
+
// again here so the `0` / leading-zero / safe-integer rules stay single-sourced.
|
|
37
31
|
const NAMED_COMMAND = 'backlogrun'
|
|
38
32
|
// The flag that runs the named list and stops, mirrored here so the plan the person reads before the
|
|
39
|
-
// run shows the same scope the run will take
|
|
33
|
+
// run shows the same scope the run will take.
|
|
40
34
|
const ONLY_FLAG = '--only'
|
|
41
|
-
// The flag that renders the run's order wave by wave instead of the pool's sections
|
|
42
|
-
// (joshuafolkken/kit#2778).
|
|
35
|
+
// The flag that renders the run's order wave by wave instead of the pool's sections.
|
|
43
36
|
const WAVES_FLAG = '--waves'
|
|
44
37
|
|
|
45
38
|
const USAGE =
|
|
@@ -76,7 +69,7 @@ function without_flags(argv: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
|
76
69
|
// The one start-time refusal: `--only` with no named issues has nothing to run. `backlog_named` is the
|
|
77
70
|
// single source of that decision, so the plan and the run refuse it alike. The refusal turns only on
|
|
78
71
|
// whether anything was named, so the items are built with `is_epic: false` — which item is an epic is
|
|
79
|
-
// decided by the run at dispatch time, not here
|
|
72
|
+
// decided by the run at dispatch time, not here.
|
|
80
73
|
function only_refusal(named: ReadonlyArray<number>, is_only: boolean): string | undefined {
|
|
81
74
|
const items = named.map((issue) => ({ issue, is_epic: false }))
|
|
82
75
|
const startup = backlog_named.startup(items, is_only)
|
|
@@ -84,9 +77,8 @@ function only_refusal(named: ReadonlyArray<number>, is_only: boolean): string |
|
|
|
84
77
|
return startup.kind === 'refused' ? startup.reason : undefined
|
|
85
78
|
}
|
|
86
79
|
|
|
87
|
-
// A failed open listing is not "nothing is out of scope". Reported rather than rendered around,
|
|
88
|
-
//
|
|
89
|
-
// than no answer.
|
|
80
|
+
// A failed open listing is not "nothing is out of scope". Reported rather than rendered around,
|
|
81
|
+
// because a confident absence built on a read that failed is worse than no answer.
|
|
90
82
|
const OPEN_UNREADABLE_MESSAGE =
|
|
91
83
|
"Could not read this repository's open issues, so the out-of-scope half of the plan cannot be told from an empty one. Check `gh auth status` and ask again."
|
|
92
84
|
|
|
@@ -95,82 +87,14 @@ const OPEN_UNREADABLE_MESSAGE =
|
|
|
95
87
|
// every other one. Reported as a gap, the way `backlog:next` reports its own truncated listings.
|
|
96
88
|
const OPEN_TRUNCATED_MESSAGE = `⚠ The open-issue listing stopped at ${String(auto_ok_cli.LISTING_LIMIT)} rows, so the out-of-scope section is partial, some titles are missing, and a blocker that has since closed can still be named. The plan below is incomplete.`
|
|
97
89
|
|
|
98
|
-
interface Plan {
|
|
99
|
-
result: EpicNextResult
|
|
100
|
-
repo: string
|
|
101
|
-
exclude: ReadonlyArray<number>
|
|
102
|
-
// Which **opted-in** epic is withholding which issue, narrowed by the same function the pool
|
|
103
|
-
// decided membership with (joshuafolkken/kit#1668). Without it the scope layer had no branch for
|
|
104
|
-
// "an epic is offering this one instead", so every opted-in row it could not place was reported as
|
|
105
|
-
// past the listing cap. Carrying the *whole* index here instead would move that misreport rather
|
|
106
|
-
// than remove it: the sentence would name an epic that is withholding nothing.
|
|
107
|
-
tracked: ReadonlyMap<number, number>
|
|
108
|
-
// The rows the offer's cap bounds and the paths each issue restructures, so `--waves` cuts each
|
|
109
|
-
// wave where `backlog:next` does (joshuafolkken/kit#2928, joshuafolkken/kit#3221).
|
|
110
|
-
scope: GateScope
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// The listing plus whether it was cut. Carried together because the rows alone cannot say whether
|
|
114
|
-
// what is missing from them is absent or merely past the cap.
|
|
115
|
-
interface OpenListing {
|
|
116
|
-
rows: ReadonlyArray<OpenIssueData>
|
|
117
|
-
is_capped: boolean
|
|
118
|
-
}
|
|
119
|
-
|
|
120
90
|
// Which rendering was asked for: the named prefix the sections lead with, or the waves.
|
|
121
91
|
interface PlanView {
|
|
122
92
|
named: NamedPlan
|
|
123
93
|
is_waves: boolean
|
|
124
94
|
}
|
|
125
95
|
|
|
126
|
-
// The same reads and the same classification `backlog:next` makes, through the same two functions.
|
|
127
|
-
// `undefined` is a failure it has already reported.
|
|
128
|
-
async function classify(
|
|
129
|
-
opted_in: OptedIn,
|
|
130
|
-
exclude: ReadonlyArray<number>,
|
|
131
|
-
): Promise<Plan | undefined> {
|
|
132
|
-
const context = await backlog_next.context_of(opted_in, exclude)
|
|
133
|
-
|
|
134
|
-
if (context === undefined) return undefined
|
|
135
|
-
|
|
136
|
-
const result = await backlog_next.resolve(context)
|
|
137
|
-
|
|
138
|
-
if (result === undefined) return undefined
|
|
139
|
-
|
|
140
|
-
return {
|
|
141
|
-
result,
|
|
142
|
-
repo: context.repo,
|
|
143
|
-
exclude,
|
|
144
|
-
tracked: epic_index.withheld_children(context.tracking.index, context.opted_in.issues),
|
|
145
|
-
scope: backlog_next.gate_scope(context),
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Every open issue, read once. It carries both halves the plan needs and the pool does not hold: the
|
|
150
|
-
// titles, and the set the out-of-scope rows are subtracted from. One read serves both, so the plan
|
|
151
|
-
// costs exactly one `gh` call more than the answer it is rendering.
|
|
152
|
-
async function fetch_open(): Promise<OpenListing | undefined> {
|
|
153
|
-
const { json, is_capped } = await git_gh_command.issue_list_recent(auto_ok_cli.LISTING_LIMIT)
|
|
154
|
-
|
|
155
|
-
if (json === undefined) return undefined
|
|
156
|
-
|
|
157
|
-
const read = read_json_listing(json, open_issue_schema)
|
|
158
|
-
|
|
159
|
-
return read.kind === 'read' ? { rows: read.rows, is_capped } : undefined
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// A cut listing cannot say an issue is closed, only that it was not read — so the blocker filter is
|
|
163
|
-
// switched off rather than fed a set that would silently report standing blockers as gone.
|
|
164
|
-
function context_of(plan: Plan, listing: OpenListing): PlanContext {
|
|
165
|
-
return {
|
|
166
|
-
repo: plan.repo,
|
|
167
|
-
titles: backlog_scope.titles_of(listing.rows),
|
|
168
|
-
open_numbers: listing.is_capped ? undefined : backlog_scope.open_numbers_of(listing.rows),
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
96
|
function print_plan(plan: Plan, listing: OpenListing, view: PlanView): void {
|
|
173
|
-
const context = context_of(plan, listing)
|
|
97
|
+
const context = backlog_plan_read.context_of(plan, listing)
|
|
174
98
|
|
|
175
99
|
if (view.is_waves) {
|
|
176
100
|
console.info(backlog_waves.format_waves(plan.result, context, plan.scope))
|
|
@@ -185,7 +109,7 @@ function print_plan(plan: Plan, listing: OpenListing, view: PlanView): void {
|
|
|
185
109
|
}
|
|
186
110
|
|
|
187
111
|
async function report(plan: Plan, view: PlanView): Promise<number> {
|
|
188
|
-
const listing = await fetch_open()
|
|
112
|
+
const listing = await backlog_plan_read.fetch_open()
|
|
189
113
|
|
|
190
114
|
if (listing === undefined) {
|
|
191
115
|
console.error(OPEN_UNREADABLE_MESSAGE)
|
|
@@ -216,7 +140,7 @@ async function run_plan(rest: ReadonlyArray<string>, view: PlanView): Promise<nu
|
|
|
216
140
|
return FAILURE_EXIT_CODE
|
|
217
141
|
}
|
|
218
142
|
|
|
219
|
-
const plan = await classify(opted_in, options.exclude ?? [])
|
|
143
|
+
const plan = await backlog_plan_read.classify(opted_in, options.exclude ?? [])
|
|
220
144
|
|
|
221
145
|
return plan === undefined ? FAILURE_EXIT_CODE : await report(plan, view)
|
|
222
146
|
}
|
|
@@ -242,7 +166,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
242
166
|
const rest = without_flags(argv)
|
|
243
167
|
// Read the named block from the *original* argv, so `--only` placed before the `#N` block breaks the
|
|
244
168
|
// leading block exactly as the run grammar does — the plan then refuses an ordering the run refuses,
|
|
245
|
-
// rather than promising a scope the resumed invocation would stop on
|
|
169
|
+
// rather than promising a scope the resumed invocation would stop on.
|
|
246
170
|
const named = named_of(argv)
|
|
247
171
|
const refusal = refusal_of(named, rest, is_only, is_waves)
|
|
248
172
|
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { auto_ok_cli } from '#scripts/auto-ok/auto-ok-cli'
|
|
2
|
+
import { epic_index } from '#scripts/epic/epic-index'
|
|
3
|
+
import type { EpicNextResult } from '#scripts/epic/epic-report'
|
|
4
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
|
+
import { open_issue_schema, type OpenIssueData } from '#scripts/git/git-schemas'
|
|
6
|
+
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
7
|
+
import { backlog_next, type OptedIn } from './backlog-next'
|
|
8
|
+
import type { PlanContext } from './backlog-plan'
|
|
9
|
+
import type { GateScope } from './backlog-rank'
|
|
10
|
+
import { backlog_scope } from './backlog-scope'
|
|
11
|
+
|
|
12
|
+
// The reads a backlog plan is drawn from — `backlog:plan`'s and `run:board`'s.
|
|
13
|
+
// Moved out of `backlog-plan-cli.ts` so the board places each issue through the very classification the
|
|
14
|
+
// plan prints, rather than a second copy of it that could promise a different order.
|
|
15
|
+
|
|
16
|
+
interface Plan {
|
|
17
|
+
result: EpicNextResult
|
|
18
|
+
repo: string
|
|
19
|
+
exclude: ReadonlyArray<number>
|
|
20
|
+
// Which **opted-in** epic is withholding which issue, narrowed by the same function the pool
|
|
21
|
+
// decided membership with. Without it the scope layer had no branch for
|
|
22
|
+
// "an epic is offering this one instead", so every opted-in row it could not place was reported as
|
|
23
|
+
// past the listing cap. Carrying the *whole* index here instead would move that misreport rather
|
|
24
|
+
// than remove it: the sentence would name an epic that is withholding nothing.
|
|
25
|
+
tracked: ReadonlyMap<number, number>
|
|
26
|
+
// The rows the offer's cap bounds and the paths each issue declares, so `--waves` cuts each
|
|
27
|
+
// wave where `backlog:next` does.
|
|
28
|
+
scope: GateScope
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// The listing plus whether it was cut. Carried together because the rows alone cannot say whether
|
|
32
|
+
// what is missing from them is absent or merely past the cap.
|
|
33
|
+
interface OpenListing {
|
|
34
|
+
rows: ReadonlyArray<OpenIssueData>
|
|
35
|
+
is_capped: boolean
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// A plan with the open listing it is rendered against.
|
|
39
|
+
interface PlanRead {
|
|
40
|
+
plan: Plan
|
|
41
|
+
listing: OpenListing
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The same reads and the same classification `backlog:next` makes, through the same two functions.
|
|
45
|
+
// `undefined` is a failure it has already reported.
|
|
46
|
+
async function classify(
|
|
47
|
+
opted_in: OptedIn,
|
|
48
|
+
exclude: ReadonlyArray<number>,
|
|
49
|
+
): Promise<Plan | undefined> {
|
|
50
|
+
const context = await backlog_next.context_of(opted_in, exclude)
|
|
51
|
+
|
|
52
|
+
if (context === undefined) return undefined
|
|
53
|
+
|
|
54
|
+
const result = await backlog_next.resolve(context)
|
|
55
|
+
|
|
56
|
+
if (result === undefined) return undefined
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
result,
|
|
60
|
+
repo: context.repo,
|
|
61
|
+
exclude,
|
|
62
|
+
tracked: epic_index.withheld_children(context.tracking.index, context.opted_in.issues),
|
|
63
|
+
scope: backlog_next.gate_scope(context),
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Every open issue, read once. It carries both halves the plan needs and the pool does not hold: the
|
|
68
|
+
// titles, and the set the out-of-scope rows are subtracted from. One read serves both, so the plan
|
|
69
|
+
// costs exactly one `gh` call more than the answer it is rendering.
|
|
70
|
+
async function fetch_open(): Promise<OpenListing | undefined> {
|
|
71
|
+
const { json, is_capped } = await git_gh_command.issue_list_recent(auto_ok_cli.LISTING_LIMIT)
|
|
72
|
+
|
|
73
|
+
if (json === undefined) return undefined
|
|
74
|
+
|
|
75
|
+
const read = read_json_listing(json, open_issue_schema)
|
|
76
|
+
|
|
77
|
+
return read.kind === 'read' ? { rows: read.rows, is_capped } : undefined
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// A cut listing cannot say an issue is closed, only that it was not read — so the blocker filter is
|
|
81
|
+
// switched off rather than fed a set that would silently report standing blockers as gone.
|
|
82
|
+
function context_of(plan: Plan, listing: OpenListing): PlanContext {
|
|
83
|
+
return {
|
|
84
|
+
repo: plan.repo,
|
|
85
|
+
titles: backlog_scope.titles_of(listing.rows),
|
|
86
|
+
open_numbers: listing.is_capped ? undefined : backlog_scope.open_numbers_of(listing.rows),
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The whole read, end to end, for a caller that only needs to know whether it succeeded — `run:board`
|
|
91
|
+
// keeps its previous plan on `undefined` rather than drawing an empty one.
|
|
92
|
+
async function with_listing(plan: Plan | undefined): Promise<PlanRead | undefined> {
|
|
93
|
+
if (plan === undefined) return undefined
|
|
94
|
+
|
|
95
|
+
const listing = await fetch_open()
|
|
96
|
+
|
|
97
|
+
return listing === undefined ? undefined : { plan, listing }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function read_plan(exclude: ReadonlyArray<number> = []): Promise<PlanRead | undefined> {
|
|
101
|
+
const opted_in = await auto_ok_cli.fetch_opted_in()
|
|
102
|
+
|
|
103
|
+
if (opted_in.kind !== 'read') return undefined
|
|
104
|
+
|
|
105
|
+
return await with_listing(await classify(opted_in, exclude))
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const backlog_plan_read = { classify, context_of, fetch_open, read_plan }
|
|
109
|
+
|
|
110
|
+
export { backlog_plan_read }
|
|
111
|
+
export type { OpenListing, Plan, PlanRead }
|
|
@@ -7,7 +7,7 @@ import { issue_cite } from '#scripts/issue/issue-cite'
|
|
|
7
7
|
import { has_label_name, IN_PROGRESS_LABEL, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
|
|
8
8
|
import type { OutOfScopeRow } from './backlog-scope'
|
|
9
9
|
|
|
10
|
-
// The plan a person reads before a `backlogrun` starts
|
|
10
|
+
// The plan a person reads before a `backlogrun` starts.
|
|
11
11
|
//
|
|
12
12
|
// `backlog:next` answers the **next** question — which numbers may start now — and its report is
|
|
13
13
|
// shaped for the loop that consumes it. This renders the **whole** picture from the same classified
|
|
@@ -20,11 +20,11 @@ const ROW_INDENT_WIDTH = 4
|
|
|
20
20
|
const ROW_INDENT = ' '.repeat(ROW_INDENT_WIDTH)
|
|
21
21
|
const NOTHING = `${ROW_INDENT}(none)`
|
|
22
22
|
|
|
23
|
-
// The named-issue prefix of a `backlogrun #N1 #N2
|
|
23
|
+
// The named-issue prefix of a `backlogrun #N1 #N2 …`: these run one at a
|
|
24
24
|
// time, in the order they were typed, before anything in the pool below is picked up.
|
|
25
25
|
const NAMED_HEADING = 'Named issues — run in order first, one at a time, then the backlog:'
|
|
26
|
-
// `--only` runs the named list and stops, so its heading says the pool is not drained
|
|
27
|
-
//
|
|
26
|
+
// `--only` runs the named list and stops, so its heading says the pool is not drained.
|
|
27
|
+
// The plan then shows the named section alone.
|
|
28
28
|
const ONLY_NAMED_HEADING =
|
|
29
29
|
'Named issues — run in order, one at a time, then stop (`--only`; the opted-in backlog is not run):'
|
|
30
30
|
const READY_HEADING =
|
|
@@ -57,16 +57,16 @@ interface PlanContext {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// A child elsewhere is qualified, because a bare number would name *this* repository's issue of that
|
|
60
|
-
// number — a different issue
|
|
61
|
-
// a `blocked_by` edge is named by the same rule the child itself is. This repository's issue is cited
|
|
62
|
-
//
|
|
60
|
+
// number — a different issue. Takes the reference rather than the child, so
|
|
61
|
+
// a `blocked_by` edge is named by the same rule the child itself is. This repository's issue is cited:
|
|
62
|
+
// the plan is copied into a report verbatim, so the line it prints is the
|
|
63
63
|
// citation the report carries.
|
|
64
64
|
function cite_of(reference: IssueReference, repo: string, title: string | undefined): string {
|
|
65
65
|
const number = String(reference.number)
|
|
66
66
|
|
|
67
67
|
return reference.repo === repo
|
|
68
68
|
? issue_cite.reference(repo, number, title)
|
|
69
|
-
:
|
|
69
|
+
: issue_cite.plain(number, reference.repo)
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
function reference_of(reference: IssueReference, repo: string): string {
|
|
@@ -84,10 +84,10 @@ function join_row(reference: string, note: string): string {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
// A `run:solo` child is marked beside its number, so a person reading the plan sees which issues
|
|
87
|
-
// `backlog:next` will start alone before the run starts
|
|
87
|
+
// `backlog:next` will start alone before the run starts.
|
|
88
88
|
const SOLO_MARK = `[${RUN_SOLO_LABEL}]`
|
|
89
89
|
// A child with neither `run:solo` nor `run:lane` is one `backlog:next` withholds everything for until
|
|
90
|
-
// it is judged
|
|
90
|
+
// it is judged, so the plan says which ones before the run asks.
|
|
91
91
|
const UNTRIAGED_MARK = '[untriaged]'
|
|
92
92
|
|
|
93
93
|
function mark_of(child: EpicChild): string | undefined {
|
|
@@ -260,6 +260,7 @@ const backlog_plan = {
|
|
|
260
260
|
WAITING_HEADING,
|
|
261
261
|
format_plan,
|
|
262
262
|
format_unusable,
|
|
263
|
+
is_standing,
|
|
263
264
|
marked_reference,
|
|
264
265
|
row_of,
|
|
265
266
|
section,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
NEEDS_DECISION_LABEL,
|
|
15
15
|
} from '#scripts/issue/issue-labels'
|
|
16
16
|
|
|
17
|
-
// The candidate pool `josh backlog:next` answers from
|
|
17
|
+
// The candidate pool `josh backlog:next` answers from.
|
|
18
18
|
//
|
|
19
19
|
// Two sources feed one pool: the opted-in issues no epic tracks, and the children of the epics whose
|
|
20
20
|
// **root** carries `auto-ok`. Splitting them apart lives here so the command itself stays a list of
|
|
@@ -26,8 +26,8 @@ import {
|
|
|
26
26
|
const EPIC_LABELS: ReadonlySet<string> = new Set([EPIC_LABEL])
|
|
27
27
|
// The labels that put a withheld row in the "needs a person" bucket rather than the "waiting on
|
|
28
28
|
// time" one. `already-done` belongs with `needs-decision` because no amount of waiting moves it: the
|
|
29
|
-
// work is merged and the close is Tier C, so a person is the only thing that resolves it
|
|
30
|
-
//
|
|
29
|
+
// work is merged and the close is Tier C, so a person is the only thing that resolves it.
|
|
30
|
+
// Read as `time`, it would be reported as something that resolves itself
|
|
31
31
|
// and nobody would ever be told to close it.
|
|
32
32
|
const DECISION_LABELS: ReadonlySet<string> = new Set([NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL])
|
|
33
33
|
|
|
@@ -35,7 +35,7 @@ const DECISION_LABELS: ReadonlySet<string> = new Set([NEEDS_DECISION_LABEL, ALRE
|
|
|
35
35
|
// instead, the ones the caller has named as done, and the repository the rows belong to.
|
|
36
36
|
//
|
|
37
37
|
// `tracked` is the narrowed set `epic_index.withheld_children` builds, not every child an epic
|
|
38
|
-
// tracks
|
|
38
|
+
// tracks — the narrowing itself is defined there, once, for this half and
|
|
39
39
|
// `auto-ok:next` alike.
|
|
40
40
|
// Child number to every open epic whose task list names it — `epic_index.build_tracking_index`.
|
|
41
41
|
type TrackingIndex = ReadonlyMap<number, ReadonlyArray<number>>
|
|
@@ -47,7 +47,7 @@ interface StandaloneContext {
|
|
|
47
47
|
tracked: ReadonlyMap<number, number>
|
|
48
48
|
exclude: ReadonlyArray<number>
|
|
49
49
|
repo: string
|
|
50
|
-
// Every issue this backlog may run
|
|
50
|
+
// Every issue this backlog may run. A row whose open blocker is outside it
|
|
51
51
|
// waits on a person rather than on time, exactly as an epic child's does.
|
|
52
52
|
running: ReadonlySet<string>
|
|
53
53
|
}
|
|
@@ -77,7 +77,7 @@ function epic_keys_of(tracking: TrackingIndex, repo: string): ReadonlySet<string
|
|
|
77
77
|
return new Set([...tracking.values()].flat().map((number) => epic_graph.key_of({ repo, number })))
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
// The set with every epic that tracks a member added, nested epics included
|
|
80
|
+
// The set with every epic that tracks a member added, nested epics included.
|
|
81
81
|
// An epic is a container rather than work, so it is never run itself — but it closes once its children
|
|
82
82
|
// do, so a row blocked by it waits on time exactly when one of those children is in this run.
|
|
83
83
|
function with_tracking_epics(
|
|
@@ -136,8 +136,8 @@ function settle_standalone(
|
|
|
136
136
|
// classification covers all of them and the verdict is decided once rather than per source.
|
|
137
137
|
//
|
|
138
138
|
// `repo` stamps the row itself, never its blockers: issue numbers are unique per repository, so a
|
|
139
|
-
// blocker read bare resolves against the *reading* repository and names a different issue there
|
|
140
|
-
//
|
|
139
|
+
// blocker read bare resolves against the *reading* repository and names a different issue there.
|
|
140
|
+
// `epic_issue.blocker_references_of` is the epic side's own resolution —
|
|
141
141
|
// `repository_url` when the node names one, this repository only as the fallback an unqualified
|
|
142
142
|
// relation has always meant — and it is reused rather than repeated.
|
|
143
143
|
function to_child(issue: OpenIssueData, repo: string): EpicChild {
|
|
@@ -155,7 +155,7 @@ function to_children(issues: ReadonlyArray<OpenIssueData>, repo: string): Array<
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
// The epics whose `auto-ok` stands for their children — the opted-in roots and, transitively, every
|
|
158
|
-
// nested epic reached through their task lists
|
|
158
|
+
// nested epic reached through their task lists.
|
|
159
159
|
//
|
|
160
160
|
// The roots come out of the opted-in listing itself: an epic that carries `auto-ok` is a row in that
|
|
161
161
|
// listing which also carries `epic`, so no second listing reads an epic's labels. From each root the
|
|
@@ -177,8 +177,7 @@ function standalone_rows(issues: ReadonlyArray<OpenIssueData>): ReadonlyArray<Op
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
// A row an **opted-in** epic tracks belongs to that epic's order and never to the standalone half —
|
|
180
|
-
// the
|
|
181
|
-
// are actually going to offer their children and applied here for the same reason. Which rows those
|
|
180
|
+
// limited to the epics that are actually going to offer their children. Which rows those
|
|
182
181
|
// are is `epic_index.withheld_children`'s answer, not a second test made here. A row the caller
|
|
183
182
|
// excluded is out of the pool entirely rather than merely unoffered: it has just merged.
|
|
184
183
|
function is_considered(issue: OpenIssueData, context: ConsideredContext): boolean {
|
|
@@ -193,7 +192,7 @@ function is_considered(issue: OpenIssueData, context: ConsideredContext): boolea
|
|
|
193
192
|
// and everything else — a standing blocker, a run already in progress — resolves on its own and is
|
|
194
193
|
// waiting on time.
|
|
195
194
|
//
|
|
196
|
-
// **The display's cap is not applied here
|
|
195
|
+
// **The display's cap is not applied here**. Cut at this point, a sixth
|
|
197
196
|
// runnable `run:solo` issue never reached the gate that holds back what is ranked below it, so the
|
|
198
197
|
// cap is applied after that gate instead (`backlog-rank.ts`). A row past it is still reported as
|
|
199
198
|
// waiting and offered by a later ask, so the backlog drains without it ever being lost.
|
|
@@ -221,8 +220,8 @@ function classify_standalone(
|
|
|
221
220
|
}
|
|
222
221
|
}
|
|
223
222
|
|
|
224
|
-
// Every issue the backlog may run: each opted-in epic's children and the standalone rows
|
|
225
|
-
//
|
|
223
|
+
// Every issue the backlog may run: each opted-in epic's children and the standalone rows.
|
|
224
|
+
// A child is opted in through its epic's `auto-ok` even where it carries none
|
|
226
225
|
// of its own, which is why the set is built from the graphs that were read rather than from labels. A
|
|
227
226
|
// standalone row a person has to resolve is left out, so a row waiting on it waits for that person too;
|
|
228
227
|
// an epic child in the same state is taken out by `epic_next_views.settle_views`. An open epic with a
|
|
@@ -4,18 +4,18 @@ import { epic_rank } from '#scripts/epic/epic-rank'
|
|
|
4
4
|
import type { EpicNextResult } from '#scripts/epic/epic-report'
|
|
5
5
|
import { epic_solo, type SoloGate, type SoloSelection } from '#scripts/epic/epic-solo'
|
|
6
6
|
import { git_next_issues } from '#scripts/issue/git-next-issues'
|
|
7
|
-
import {
|
|
7
|
+
import { backlog_overlap, type Declared } from './backlog-overlap'
|
|
8
8
|
|
|
9
|
-
// What the backlog offers, in the order it is decided
|
|
9
|
+
// What the backlog offers, in the order it is decided: rank, then the
|
|
10
10
|
// `run:solo` gate, then the cap. `backlog:next` and `backlog:plan --waves` both call `select`, so the
|
|
11
11
|
// plan's first wave is what the run starts into an idle repository rather than an order the run never
|
|
12
12
|
// takes.
|
|
13
13
|
//
|
|
14
|
-
// **The cap comes last.**
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
14
|
+
// **The cap comes last.** Applied while the standalone half is classified, before the gate, it would
|
|
15
|
+
// cut a `run:solo` issue ranked sixth or lower before the gate could see it — and offer the issues
|
|
16
|
+
// below it past it. Cut after the gate, the cap only ever removes what the gate would have offered,
|
|
17
|
+
// so it cannot hide a waiting `run:solo` issue from it. It bounds only the standalone rows; an epic's
|
|
18
|
+
// children are never capped.
|
|
19
19
|
|
|
20
20
|
// Every child the classification placed, in the order it placed them: the ranked candidates first,
|
|
21
21
|
// then the waiting ones, then the ones waiting on a person.
|
|
@@ -79,18 +79,18 @@ interface OfferInput {
|
|
|
79
79
|
repo: string
|
|
80
80
|
// The keys of the standalone rows — the ones the cap bounds.
|
|
81
81
|
standalone: ReadonlySet<string>
|
|
82
|
-
// The paths each issue
|
|
83
|
-
//
|
|
82
|
+
// The paths each issue declares; two candidates whose paths overlap are not offered together.
|
|
83
|
+
// Absent, nothing is separated.
|
|
84
84
|
declared?: Declared
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
// The
|
|
87
|
+
// The overlap separation runs before the cap, for the reason the gate does: the cap only ever
|
|
88
88
|
// removes what would otherwise be offered.
|
|
89
89
|
function select(input: OfferInput): SoloSelection {
|
|
90
90
|
const ranked = rank(input.candidates, input.pool)
|
|
91
91
|
const { read, repo } = input
|
|
92
92
|
const gated = epic_solo.select(ranked, read, repo)
|
|
93
|
-
const separated =
|
|
93
|
+
const separated = backlog_overlap.separate(gated, input.declared ?? new Map(), { read, repo })
|
|
94
94
|
|
|
95
95
|
return cap(separated, input.standalone)
|
|
96
96
|
}
|
|
@@ -23,11 +23,15 @@ interface ReadyPorts {
|
|
|
23
23
|
ready_issues: () => Promise<ReadonlyArray<string>>
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
// The lanes in use: the open worktrees an interruption has not stranded. `josh lane:limit` prints it.
|
|
27
|
+
async function live_lane_count(): Promise<number> {
|
|
27
28
|
const lanes = await lane_registry.list_lanes()
|
|
28
|
-
const live = lanes.filter((lane) => !lane.is_stranded).length
|
|
29
29
|
|
|
30
|
-
return
|
|
30
|
+
return lanes.filter((lane) => !lane.is_stranded).length
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function free_under(limit: number): Promise<number> {
|
|
34
|
+
return lane_capacity.free_lanes(limit, await live_lane_count())
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
// Free lanes right now: the limit less the live lanes. An unreadable limit reads as no free lane — the
|
|
@@ -40,25 +44,25 @@ async function free_under(limit: number): Promise<number> {
|
|
|
40
44
|
// (`backlog:next`) is gated behind a free lane, so a network read here would defeat that design. The
|
|
41
45
|
// two can diverge, but only toward over-counting live lanes → fewer free lanes, the safe direction.
|
|
42
46
|
async function free_lane_count(): Promise<number> {
|
|
43
|
-
const limit = lane_capacity.lane_limit()
|
|
47
|
+
const limit = await lane_capacity.lane_limit()
|
|
44
48
|
|
|
45
49
|
if (limit.kind !== 'limit') return NO_FREE
|
|
46
50
|
|
|
47
51
|
return await free_under(limit.limit)
|
|
48
52
|
}
|
|
49
53
|
|
|
50
|
-
// **The drive's count throws on an unreadable limit
|
|
54
|
+
// **The drive's count throws on an unreadable limit**. The drive launches no
|
|
51
55
|
// more than this count, so the safe-direction zero above would leave it launching nothing and reporting
|
|
52
56
|
// nothing for good; a bad setting is the hard error `lane_capacity` says it is, ending the drive loudly.
|
|
53
57
|
async function drive_free_lane_count(): Promise<number> {
|
|
54
|
-
const limit = lane_capacity.lane_limit()
|
|
58
|
+
const limit = await lane_capacity.lane_limit()
|
|
55
59
|
|
|
56
60
|
if (limit.kind !== 'limit') throw new Error(limit.problem)
|
|
57
61
|
|
|
58
62
|
return await free_under(limit.limit)
|
|
59
63
|
}
|
|
60
64
|
|
|
61
|
-
// **A `--only` run has no pool to drain
|
|
65
|
+
// **A `--only` run has no pool to drain**. `backlog:next` lists the opted-in
|
|
62
66
|
// pool, and a `--only` run's work is its named list — issues and epics that run in order through their
|
|
63
67
|
// own step, never through the pick-up ask — so a ready pool issue is neither a stall nor an ask it owes.
|
|
64
68
|
// Without a `--only` record the pool is the run's, whole.
|
|
@@ -67,7 +71,7 @@ function drains_pool(carry: RunCarry | undefined): boolean {
|
|
|
67
71
|
}
|
|
68
72
|
|
|
69
73
|
// The `backlog:next` read, or `undefined` for a `--only` run, which answers none before paying for the
|
|
70
|
-
// network read. A bounded read
|
|
74
|
+
// network read. A bounded read keeps stderr piped: the arrival probe reads once
|
|
71
75
|
// a minute, and a forwarded refusal would fill the watcher's output.
|
|
72
76
|
async function read_backlog_next(timeout_ms?: number): Promise<JoshResult | undefined> {
|
|
73
77
|
if (!drains_pool(await run_headless.current_carry())) return undefined
|
|
@@ -95,7 +99,7 @@ async function read_ready(ports: ReadyPorts = DEFAULT_PORTS): Promise<ReadyReadi
|
|
|
95
99
|
}
|
|
96
100
|
|
|
97
101
|
// `undefined` unless there is both runnable work and a lane for it — the only state worth a line. Each
|
|
98
|
-
// issue is a number-link against `slug
|
|
102
|
+
// issue is a number-link against `slug`: the parent copies this line into its
|
|
99
103
|
// report, so a bare `#N` here is the citation the Stop guard sends back.
|
|
100
104
|
function ready_line(reading: ReadyReading, slug: string | undefined): string | undefined {
|
|
101
105
|
if (reading.issues.length === NONE || reading.free_lanes <= NO_FREE) return undefined
|
|
@@ -141,7 +145,7 @@ async function print_ready_line(
|
|
|
141
145
|
|
|
142
146
|
// The line `epic --add` prints once a child entered an epic while a `backlogrun` parent drives this
|
|
143
147
|
// checkout: a filing made mid-run joins the pool the moment it is placed, so the parent asks now rather
|
|
144
|
-
// than on the next wake
|
|
148
|
+
// than on the next wake. The recommendation commands (`issue:scout`,
|
|
145
149
|
// `epic:bundle`) carry none — before the insertion the child is in no pool the ask could find.
|
|
146
150
|
const OFFER_HINT =
|
|
147
151
|
'↻ backlogrun parent: a child just entered an epic — run `pnpm josh backlog:offer` next, so a ' +
|
|
@@ -163,6 +167,7 @@ const backlog_ready = {
|
|
|
163
167
|
read_backlog_next,
|
|
164
168
|
print_offer_hint,
|
|
165
169
|
free_lane_count,
|
|
170
|
+
live_lane_count,
|
|
166
171
|
drive_free_lane_count,
|
|
167
172
|
drains_pool,
|
|
168
173
|
print_ready_line,
|
|
@@ -1,29 +1,28 @@
|
|
|
1
1
|
import type { EpicNextResult } from '#scripts/epic/epic-report'
|
|
2
2
|
import type { OpenIssueData } from '#scripts/git/git-schemas'
|
|
3
3
|
import { AUTO_OK_LABEL, EPIC_LABEL, has_any_label } from '#scripts/issue/issue-labels'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
5
|
|
|
5
|
-
// Which open issues the backlog will not run, and why
|
|
6
|
+
// Which open issues the backlog will not run, and why.
|
|
6
7
|
//
|
|
7
8
|
// **The set is a subtraction, never a second membership rule.** Everything open that the pool did not
|
|
8
9
|
// classify is out of scope, so this cannot drift from what `backlog:next` offers the way a
|
|
9
10
|
// re-implemented "is it opted in" test would. What is decided per row is only the sentence saying
|
|
10
11
|
// why, and each of those is read off a label rather than judged.
|
|
11
12
|
//
|
|
12
|
-
// It exists because
|
|
13
|
-
//
|
|
14
|
-
// not tell "not opted in" from "the backlog has not reached it yet".
|
|
13
|
+
// It exists because an issue without `auto-ok` never enters the pool at all, so without this a person
|
|
14
|
+
// watching a `backlogrun` could not tell "not opted in" from "the backlog has not reached it yet".
|
|
15
15
|
//
|
|
16
|
-
// A child of an epic whose root lacks `auto-ok` is
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
// the
|
|
20
|
-
// `opted_in_reason` below.
|
|
16
|
+
// A child of an epic whose root lacks `auto-ok` is not one of those — its own label carries it into
|
|
17
|
+
// the standalone half, so it is offered rather than explained. What is explained here is the child of
|
|
18
|
+
// an epic that **is** opted in and that the epic did not place, and telling that apart from a row past
|
|
19
|
+
// the listing cap is the whole of `opted_in_reason` below.
|
|
21
20
|
|
|
22
21
|
const EPIC_LABELS: ReadonlySet<string> = new Set([EPIC_LABEL])
|
|
23
22
|
const AUTO_OK_LABELS: ReadonlySet<string> = new Set([AUTO_OK_LABEL])
|
|
24
23
|
|
|
25
24
|
const NO_OPT_IN_REASON = 'not opted in — no `auto-ok` label'
|
|
26
|
-
//
|
|
25
|
+
// This does not speak for the children: an epic that did not opt in
|
|
27
26
|
// offers none of them, but each child carrying `auto-ok` of its own is offered by the standalone
|
|
28
27
|
// half. Saying "its children are not offered" here would contradict the plan's own ready section.
|
|
29
28
|
const EPIC_NOT_OPTED_IN_REASON =
|
|
@@ -31,13 +30,13 @@ const EPIC_NOT_OPTED_IN_REASON =
|
|
|
31
30
|
const EPIC_ROOT_REASON = 'epic root — a container, so its children are planned instead of it'
|
|
32
31
|
const OPTED_IN_UNPLACED_REASON = 'opted in, but past the listing cap this ask could read'
|
|
33
32
|
|
|
34
|
-
// The cap is what the row above says, and it
|
|
35
|
-
//
|
|
33
|
+
// The cap is what the row above says, and it is not said of every opted-in row the plan could not
|
|
34
|
+
// place — only of the ones the cap has to do with. An issue an
|
|
36
35
|
// opted-in epic tracks is offered through that epic and not standalone, so when the epic did not
|
|
37
36
|
// place it either, the epic is the fact worth naming and the cap is a misreport a reader acts on:
|
|
38
37
|
// "past the cap" reads as "the next ask will offer it", and the next ask never does.
|
|
39
38
|
function epic_tracked_reason(epic: number): string {
|
|
40
|
-
return `tracked by epic
|
|
39
|
+
return `tracked by epic ${session_cite.issue(epic)}, which offers it instead of the standalone half`
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
// `--exclude` drops an issue from every bucket, so an excluded one lands here. Named for what it is,
|
|
@@ -55,8 +54,8 @@ interface ScopeContext {
|
|
|
55
54
|
repo: string
|
|
56
55
|
exclude: ReadonlyArray<number>
|
|
57
56
|
// Which **opted-in** epic is withholding which issue — `epic_index.withheld_children`'s own answer,
|
|
58
|
-
// the one the pool decided membership from, so the sentence and the decision cannot disagree
|
|
59
|
-
//
|
|
57
|
+
// the one the pool decided membership from, so the sentence and the decision cannot disagree.
|
|
58
|
+
// A row in here is one an epic is genuinely offering instead.
|
|
60
59
|
tracked: ReadonlyMap<number, number>
|
|
61
60
|
}
|
|
62
61
|
|