@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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { backlog_budget, type BudgetInput } from './backlog-budget'
|
|
2
|
+
|
|
3
|
+
// The idle watch as a window a person can read: when the run began waiting on
|
|
4
|
+
// an empty backlog, when the wait ends, and which bound ends it. Without it the moment the wait began
|
|
5
|
+
// would live only in `backlog:drive`'s memory as `--active`, so a reader of the event stream could
|
|
6
|
+
// tell the run was waiting but not until when. The budget names the
|
|
7
|
+
// window, `backlog:offer` records it as an `idle` event, and `run:board` reads it back — all through the
|
|
8
|
+
// text written and parsed here, so the three never spell it differently.
|
|
9
|
+
|
|
10
|
+
type IdleBound = 'idle' | 'whole-run'
|
|
11
|
+
|
|
12
|
+
interface IdleWindow {
|
|
13
|
+
since_ms: number
|
|
14
|
+
until_ms: number
|
|
15
|
+
// Which bound ends the wait: the idle budget running out, or the whole-run bound arriving first.
|
|
16
|
+
bound: IdleBound
|
|
17
|
+
// When the watching loop last asked the backlog — the poll the next one is counted from.
|
|
18
|
+
asked_ms: number
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const TEXT_PATTERN =
|
|
22
|
+
/^idle since (?<since>\S+) until (?<until>\S+) \((?<bound>idle|whole-run)\) asked (?<asked>\S+)$/u
|
|
23
|
+
const IDLE_BOUND: IdleBound = 'idle'
|
|
24
|
+
const WHOLE_RUN_BOUND: IdleBound = 'whole-run'
|
|
25
|
+
|
|
26
|
+
// The window an idle watch opened at `active_at_ms` runs for, as asked at `now_ms`, or `undefined` when
|
|
27
|
+
// the watch is off. The wait ends at the earlier of the idle budget and the whole-run bound — the order
|
|
28
|
+
// `decide` applies.
|
|
29
|
+
function window_of(input: BudgetInput): IdleWindow | undefined {
|
|
30
|
+
if (input.idle_budget_ms === undefined) return undefined
|
|
31
|
+
|
|
32
|
+
const idle_until = input.active_at_ms + input.idle_budget_ms
|
|
33
|
+
const run_until = input.started_at_ms + backlog_budget.WHOLE_RUN_BUDGET_MS
|
|
34
|
+
const bound = run_until < idle_until ? WHOLE_RUN_BOUND : IDLE_BOUND
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
since_ms: input.active_at_ms,
|
|
38
|
+
until_ms: Math.min(idle_until, run_until),
|
|
39
|
+
bound,
|
|
40
|
+
asked_ms: input.now_ms,
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function iso_of(ms: number): string {
|
|
45
|
+
return new Date(ms).toISOString()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function text_of(window: IdleWindow): string {
|
|
49
|
+
const { since_ms, until_ms, bound, asked_ms } = window
|
|
50
|
+
|
|
51
|
+
return `idle since ${iso_of(since_ms)} until ${iso_of(until_ms)} (${bound}) asked ${iso_of(asked_ms)}`
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function is_bound(value: string | undefined): value is IdleBound {
|
|
55
|
+
return value === IDLE_BOUND || value === WHOLE_RUN_BOUND
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// A malformed stamp reads as no window rather than as `NaN`, so a mangled line is never drawn.
|
|
59
|
+
function window_from(groups: Record<string, string>, bound: IdleBound): IdleWindow | undefined {
|
|
60
|
+
const since_ms = Date.parse(String(groups['since']))
|
|
61
|
+
const until_ms = Date.parse(String(groups['until']))
|
|
62
|
+
const asked_ms = Date.parse(String(groups['asked']))
|
|
63
|
+
|
|
64
|
+
return Number.isNaN(since_ms + until_ms + asked_ms)
|
|
65
|
+
? undefined
|
|
66
|
+
: { since_ms, until_ms, bound, asked_ms }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function parse(text: string): IdleWindow | undefined {
|
|
70
|
+
const groups = TEXT_PATTERN.exec(text)?.groups
|
|
71
|
+
|
|
72
|
+
if (groups === undefined || !is_bound(groups['bound'])) return undefined
|
|
73
|
+
|
|
74
|
+
return window_from(groups, groups['bound'])
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The next time the watching loop asks the backlog again: one `IDLE_POLL_MINUTES` after the ask the
|
|
78
|
+
// stream recorded, never past the end of the wait — the interval `idle_watch_reason` tells the loop.
|
|
79
|
+
function next_check_ms(window: IdleWindow): number {
|
|
80
|
+
const poll_ms = backlog_budget.IDLE_POLL_MINUTES * backlog_budget.MS_PER_MINUTE
|
|
81
|
+
|
|
82
|
+
return Math.min(window.asked_ms + poll_ms, window.until_ms)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const backlog_idle = { next_check_ms, parse, text_of, window_of }
|
|
86
|
+
|
|
87
|
+
export { backlog_idle }
|
|
88
|
+
export type { IdleBound, IdleWindow }
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
// The named-issue prefix of a `backlogrun` invocation
|
|
1
|
+
// The named-issue prefix of a `backlogrun` invocation. `backlogrun #N1 #N2 …`
|
|
2
2
|
// runs the issues typed after the keyword in the order they were typed, one at a time, and only once
|
|
3
3
|
// they are all done does the opted-in backlog drain. This module is the single source of that order
|
|
4
4
|
// and of what a failure partway through it does, so the plan a person reads (`backlog:plan`) and the
|
|
5
5
|
// loop that runs it (`backlogrun.md`) cannot disagree.
|
|
6
6
|
//
|
|
7
|
-
// **
|
|
8
|
-
//
|
|
9
|
-
// that follows it, under one authorization and one carried budget.
|
|
7
|
+
// **One command carries both the named prefix and the backlog that follows it**, under one
|
|
8
|
+
// authorization and one carried budget, rather than a separate entry point for the sequential run.
|
|
10
9
|
//
|
|
11
|
-
// **A named item is a single issue or an epic
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
// whole-epic execution at the granularity of one named item.
|
|
10
|
+
// **A named item is a single issue or an epic.** A single-issue item is one `fullrun`; an epic item
|
|
11
|
+
// runs every child in dependency order, across the free lanes, and is done only once every child has
|
|
12
|
+
// been processed — merged or parked. The run does not advance to the next named item until the epic
|
|
13
|
+
// item is complete, so a whole epic executes at the granularity of one named item.
|
|
16
14
|
|
|
17
15
|
const NAMED_KIND = 'named'
|
|
18
16
|
const BACKLOG_KIND = 'backlog'
|
|
@@ -51,12 +49,11 @@ type PlanStep = NamedStep | BacklogStep
|
|
|
51
49
|
// A named issue that could not finish parks like any other child; what is specific to a sequential run
|
|
52
50
|
// is that the issues declared *after* it are not started — the order was the point of naming them. What
|
|
53
51
|
// follows is the pool by default, or nothing under `--only`, so the run then drains the opted-in
|
|
54
|
-
// backlog or ends
|
|
52
|
+
// backlog or ends.
|
|
55
53
|
//
|
|
56
54
|
// **This skip only applies to a single-issue item.** An epic item does not park as a unit — its
|
|
57
55
|
// children park individually and the epic item completes anyway (`epic_item_outcome`), so a parked
|
|
58
|
-
// epic child, which is never in the named list, skips nothing and the run advances to the next item
|
|
59
|
-
// (joshuafolkken/kit#1985).
|
|
56
|
+
// epic child, which is never in the named list, skips nothing and the run advances to the next item.
|
|
60
57
|
interface FailureOutcome {
|
|
61
58
|
parked: number
|
|
62
59
|
skipped: ReadonlyArray<number>
|
|
@@ -65,8 +62,7 @@ interface FailureOutcome {
|
|
|
65
62
|
|
|
66
63
|
// The completion of one epic named item. It runs every child and finishes once each has been
|
|
67
64
|
// processed; the children that parked are carried here so the completion report can list them, and the
|
|
68
|
-
// item is complete regardless — a parked child never holds up the next named item
|
|
69
|
-
// (joshuafolkken/kit#1985).
|
|
65
|
+
// item is complete regardless — a parked child never holds up the next named item.
|
|
70
66
|
interface EpicItemOutcome {
|
|
71
67
|
epic: number
|
|
72
68
|
parked: ReadonlyArray<number>
|
|
@@ -130,7 +126,7 @@ function after_failure(
|
|
|
130
126
|
// An epic named item is complete once every child has been processed — merged or parked. The parked
|
|
131
127
|
// children are carried out so the completion report can list them, and the item is complete either
|
|
132
128
|
// way: a parked epic child does not hold up the next named item, which is `epicrun`'s park-and-continue
|
|
133
|
-
// at the granularity of one named epic item
|
|
129
|
+
// at the granularity of one named epic item.
|
|
134
130
|
function epic_item_outcome(
|
|
135
131
|
epic: number,
|
|
136
132
|
children: ReadonlyArray<EpicChildOutcome>,
|
|
@@ -15,18 +15,17 @@ import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
|
15
15
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
16
16
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
17
17
|
import { backlog_defect_priority } from './backlog-defect-priority'
|
|
18
|
+
import { backlog_overlap } from './backlog-overlap'
|
|
18
19
|
import { backlog_pool } from './backlog-pool'
|
|
19
20
|
import { backlog_rank, type GateScope } from './backlog-rank'
|
|
20
|
-
import { backlog_restructure } from './backlog-restructure'
|
|
21
21
|
|
|
22
|
-
// `josh backlog:next` — what the whole opted-in backlog may run next
|
|
22
|
+
// `josh backlog:next` — what the whole opted-in backlog may run next.
|
|
23
23
|
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
// So there was no route that asked the backlog itself what may start.
|
|
24
|
+
// Neither half alone can give the answer. `epic:next` has the dependency graph and the execution
|
|
25
|
+
// wave, but its input is **one epic's task list**. `auto-ok:next` sees the whole backlog, but it
|
|
26
|
+
// orders by the display's newest-first ranking and reads no dependency at all.
|
|
28
27
|
//
|
|
29
|
-
// This command is that
|
|
28
|
+
// This command is the route that asks the backlog itself what may start, and it is glue rather than a third implementation: the epic half runs
|
|
30
29
|
// through `epic:next`'s own read → classify → report pipeline unchanged, the standalone half through
|
|
31
30
|
// `auto-ok:next`'s own listing and runnability rules, and the verdict comes from
|
|
32
31
|
// `epic_report.decide_verdict` so it cannot drift from what `epic:next` means by the same word.
|
|
@@ -48,7 +47,7 @@ const READ_FAILURES: Readonly<Record<Exclude<OptedInRead['kind'], 'read'>, strin
|
|
|
48
47
|
unreadable: auto_ok_cli.UNREADABLE_MESSAGE,
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
// What `retry` says that `error` cannot
|
|
50
|
+
// What `retry` says that `error` cannot.
|
|
52
51
|
//
|
|
53
52
|
// The anomaly `epic:next` raises for a child it could not read tells the reader to check
|
|
54
53
|
// `gh auth status` and that the issue exists — correct for the failure it was written for, and
|
|
@@ -68,7 +67,7 @@ const RETRY_MESSAGE =
|
|
|
68
67
|
// member none of them can produce — and `VERDICT_LINES` a line nothing ever prints. The token is a
|
|
69
68
|
// backlog-level answer about the transport, not a reading of one epic's graph.
|
|
70
69
|
//
|
|
71
|
-
// `triage` is `epic:next`'s word as well as this command's
|
|
70
|
+
// `triage` is `epic:next`'s word as well as this command's, but it is decided
|
|
72
71
|
// after the graph is read rather than from it, so it stays `epic_triage`'s type too.
|
|
73
72
|
type BacklogVerdict = EpicVerdict | 'retry' | TriageVerdict
|
|
74
73
|
|
|
@@ -100,7 +99,7 @@ interface PoolContext {
|
|
|
100
99
|
//
|
|
101
100
|
// **The tokens are scoped to this repository, which is `epic:next --repo`'s shape exactly.** An epic
|
|
102
101
|
// may track a child elsewhere, and a bare number would send the loop reading this to *this*
|
|
103
|
-
// repository's issue of that number — a different issue
|
|
102
|
+
// repository's issue of that number — a different issue. Qualifying it
|
|
104
103
|
// instead was tried and is worse: `--exclude` parses bare integers, so a loop feeding a qualified
|
|
105
104
|
// token back would be answered with a usage error rather than an exclusion. So a child elsewhere
|
|
106
105
|
// stays out of the tokens, and `run` becomes `wait` when this repository has none — the same mapping
|
|
@@ -134,7 +133,7 @@ function warn_gaps(context: PoolContext, has_answer: boolean): void {
|
|
|
134
133
|
function report(result: EpicNextResult, context: PoolContext): number {
|
|
135
134
|
warn_gaps(context, result.verdict === 'run')
|
|
136
135
|
// The explanation names epics and children as `#N` (`tracked by epic #N`); linkified so the text a
|
|
137
|
-
// run reads carries clickable references rather than bare ones
|
|
136
|
+
// run reads carries clickable references rather than bare ones. The stdout
|
|
138
137
|
// tokens below are bare numbers by contract — a loop feeds them back to `--exclude` — so they are
|
|
139
138
|
// left untouched.
|
|
140
139
|
const explanation = epic_report.format_result(result, context.repo)
|
|
@@ -178,8 +177,7 @@ function combine(views: ReadonlyArray<EpicView>, context: PoolContext): EpicNext
|
|
|
178
177
|
})
|
|
179
178
|
|
|
180
179
|
// The same checkout map `epic:next` hands `build_result`. Without it every bundle heading reads
|
|
181
|
-
// `(no local checkout)`, including this repository's own
|
|
182
|
-
// fixed on that path.
|
|
180
|
+
// `(no local checkout)`, including this repository's own.
|
|
183
181
|
return epic_report.build_result(
|
|
184
182
|
backlog_pool.merge_classifications(from_epics, from_standalone),
|
|
185
183
|
[
|
|
@@ -192,8 +190,7 @@ function combine(views: ReadonlyArray<EpicView>, context: PoolContext): EpicNext
|
|
|
192
190
|
|
|
193
191
|
// The epic half and the standalone half settled against each other: an epic child a person has to
|
|
194
192
|
// resolve can make a standalone row wait on that person, and that row can in turn hold an epic child.
|
|
195
|
-
// Each pass only shrinks the set, so the walk ends at the first pass that removes nothing
|
|
196
|
-
// (joshuafolkken/kit#1943).
|
|
193
|
+
// Each pass only shrinks the set, so the walk ends at the first pass that removes nothing.
|
|
197
194
|
function settled_views(
|
|
198
195
|
reads: ReadonlyArray<EpicRead>,
|
|
199
196
|
running: ReadonlySet<string>,
|
|
@@ -215,7 +212,7 @@ function settled_views(
|
|
|
215
212
|
// walk rather than the only one.
|
|
216
213
|
//
|
|
217
214
|
// The running set covers the standalone rows as well as every read graph, so an epic child waiting on
|
|
218
|
-
// an opted-in standalone issue waits rather than stops
|
|
215
|
+
// an opted-in standalone issue waits rather than stops.
|
|
219
216
|
function views_from(reads: ReadonlyArray<EpicRead>, context: PoolContext): ReadonlyArray<EpicView> {
|
|
220
217
|
if (reads.length === 0) return []
|
|
221
218
|
|
|
@@ -230,8 +227,8 @@ function views_from(reads: ReadonlyArray<EpicRead>, context: PoolContext): Reado
|
|
|
230
227
|
|
|
231
228
|
// The reads and the classification, with none of the printing `backlog:next` then does with them.
|
|
232
229
|
//
|
|
233
|
-
// `backlog:plan` renders this same pool as a plan a person reads before the run starts
|
|
234
|
-
//
|
|
230
|
+
// `backlog:plan` renders this same pool as a plan a person reads before the run starts,
|
|
231
|
+
// so the seam is cut here rather than a second read-and-classify path
|
|
235
232
|
// being written beside it: the plan and the run cannot disagree about what may start, because there
|
|
236
233
|
// is one answer and two renderings of it. `undefined` is the refusal — already reported.
|
|
237
234
|
async function resolve(context: PoolContext): Promise<EpicNextResult | undefined> {
|
|
@@ -249,7 +246,7 @@ async function resolve(context: PoolContext): Promise<EpicNextResult | undefined
|
|
|
249
246
|
}
|
|
250
247
|
|
|
251
248
|
// The defect priority and the ranking keys are applied here rather than when printing, so
|
|
252
|
-
// `backlog:plan` shows the order the run takes
|
|
249
|
+
// `backlog:plan` shows the order the run takes. The
|
|
253
250
|
// ranking goes last: its sort is stable, so the defect order survives as its final key.
|
|
254
251
|
const ordered = await backlog_defect_priority.prioritize(
|
|
255
252
|
combine(views_from(reads, context), context),
|
|
@@ -261,11 +258,10 @@ async function resolve(context: PoolContext): Promise<EpicNextResult | undefined
|
|
|
261
258
|
|
|
262
259
|
// Whether the `error` verdict is really a transport failure wearing the graph's clothes.
|
|
263
260
|
//
|
|
264
|
-
// **The answer comes from the reads that failed, not from a request made afterwards
|
|
265
|
-
//
|
|
266
|
-
//
|
|
267
|
-
//
|
|
268
|
-
// already healed. Judging one request from a different one cannot be made reliable, so the failed
|
|
261
|
+
// **The answer comes from the reads that failed, not from a request made afterwards**. A later
|
|
262
|
+
// reachability probe can answer `reachable` after a connection that dropped for a few hundred
|
|
263
|
+
// milliseconds already failed the read, leaving the verdict `error` for a fault that had already
|
|
264
|
+
// healed. Judging one request from a different one cannot be made reliable, so the failed
|
|
269
265
|
// request carries its own nature instead: `epic:next` marks the anomaly from the status GitHub wrote
|
|
270
266
|
// on the failed response, and this reads the mark.
|
|
271
267
|
function is_transport_failure(result: EpicNextResult): boolean {
|
|
@@ -300,19 +296,19 @@ function standalone_keys(context: PoolContext): ReadonlySet<string> {
|
|
|
300
296
|
}
|
|
301
297
|
|
|
302
298
|
// The running lanes still carry the pickup label, so the opted-in listing holds their bodies too —
|
|
303
|
-
// which is what lets a candidate be held back from a
|
|
304
|
-
//
|
|
299
|
+
// which is what lets a candidate be held back from a path a running lane already declares.
|
|
300
|
+
// `backlog:plan --waves` reads the same scope, so its first wave is this offer.
|
|
305
301
|
function gate_scope(context: PoolContext): GateScope {
|
|
306
302
|
return {
|
|
307
303
|
standalone: standalone_keys(context),
|
|
308
|
-
declared:
|
|
304
|
+
declared: backlog_overlap.declared_of(context.opted_in.issues),
|
|
309
305
|
}
|
|
310
306
|
}
|
|
311
307
|
|
|
312
308
|
// The `run:solo` gate is applied here rather than in `resolve`, because `backlog:plan` shares
|
|
313
|
-
// `resolve` and a plan made before the run lists everything
|
|
309
|
+
// `resolve` and a plan made before the run lists everything. The holders are
|
|
314
310
|
// read only on a `run` answer — the one answer the gate can change. The cap follows the gate
|
|
315
|
-
// (`backlog-rank.ts
|
|
311
|
+
// (`backlog-rank.ts`).
|
|
316
312
|
async function gate_solo(result: EpicNextResult, context: PoolContext): Promise<EpicNextResult> {
|
|
317
313
|
if (result.verdict !== 'run') return result
|
|
318
314
|
|
|
@@ -331,7 +327,7 @@ async function gate_solo(result: EpicNextResult, context: PoolContext): Promise<
|
|
|
331
327
|
return gated.result
|
|
332
328
|
}
|
|
333
329
|
|
|
334
|
-
// An untriaged candidate withholds every candidate
|
|
330
|
+
// An untriaged candidate withholds every candidate. Checked before the
|
|
335
331
|
// `run:solo` gate, which cannot be applied to an issue whose label is not recorded yet; the numbers go
|
|
336
332
|
// to standard error, the one token to standard output.
|
|
337
333
|
function report_triage(context: PoolContext, untriaged: ReadonlyArray<EpicChild>): number {
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { josh_command } from '#scripts/josh/josh-run'
|
|
4
4
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
5
6
|
import { rule_value_cache } from '#scripts/rules/rule-value-cache'
|
|
6
7
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
7
8
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
8
9
|
import { z } from 'zod'
|
|
9
10
|
import { backlog_offer, type OfferAnswer } from './backlog-offer'
|
|
10
11
|
|
|
11
|
-
// `josh backlog:offer` — one composite command for a `backlogrun` loop-head event
|
|
12
|
-
//
|
|
12
|
+
// `josh backlog:offer` — one composite command for a `backlogrun` loop-head event.
|
|
13
|
+
// Without it the loop spends a turn on `backlog:next` and a second turn feeding
|
|
13
14
|
// its answer, translated to a word by hand, into `backlog:budget`; the parent's context is largest
|
|
14
15
|
// here, so collapsing the two saves the turn where a turn costs the most — the same reasoning
|
|
15
|
-
// `run:merge`
|
|
16
|
+
// `run:merge` collapses a merge event on.
|
|
16
17
|
//
|
|
17
18
|
// **The contract matches the path-decided commands': stdout carries the budget verdict on its first
|
|
18
19
|
// line**, then — only on `run` — the issue numbers to start, one per line, so a loop reads the branch
|
|
@@ -28,7 +29,7 @@ const DEFAULT_COUNT = 0
|
|
|
28
29
|
const RUN_VERDICT = 'run'
|
|
29
30
|
const BUDGET_JSON_KEY = 'budget'
|
|
30
31
|
// The one budget verdict and mapped answer that name a drain, plus the running count that means the run
|
|
31
|
-
// has nothing of its own in flight
|
|
32
|
+
// has nothing of its own in flight. Read together in `mark_drain`.
|
|
32
33
|
const WATCH_VERDICT = 'watch'
|
|
33
34
|
const STOP_VERDICT = 'stop'
|
|
34
35
|
const EXHAUSTED_ANSWER = 'exhausted'
|
|
@@ -124,27 +125,26 @@ const budget_read_schema = z.object({
|
|
|
124
125
|
[BUDGET_JSON_KEY]: z.string(),
|
|
125
126
|
reason: z.string(),
|
|
126
127
|
is_finish: z.boolean(),
|
|
128
|
+
idle: z.string().optional(),
|
|
127
129
|
})
|
|
128
130
|
|
|
129
131
|
interface BudgetRead {
|
|
130
132
|
verdict: string
|
|
131
133
|
reason: string
|
|
132
134
|
is_finish: boolean
|
|
135
|
+
// The idle watch's window, as `backlog_idle.text_of` wrote it, when the budget opened one.
|
|
136
|
+
idle?: string | undefined
|
|
133
137
|
}
|
|
134
138
|
|
|
135
139
|
function budget_of(out: string): BudgetRead | undefined {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
: undefined
|
|
146
|
-
} catch {
|
|
147
|
-
return undefined
|
|
140
|
+
const read = json_value.parse_with(out, budget_read_schema)
|
|
141
|
+
if (read === undefined) return undefined
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
verdict: read[BUDGET_JSON_KEY],
|
|
145
|
+
reason: read.reason,
|
|
146
|
+
is_finish: read.is_finish,
|
|
147
|
+
idle: read.idle,
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
|
|
@@ -192,13 +192,12 @@ function refuse(): number {
|
|
|
192
192
|
|
|
193
193
|
// The drain: the backlog is empty (`exhausted`) and nothing of the run's own is in flight, so the run is
|
|
194
194
|
// about to open its idle watch or stop with `--idle 0`. Marking once per drain with `emit_once`
|
|
195
|
-
// is what lets `run:step` fire the end-of-run retrospective *before* the watch rather than after it
|
|
196
|
-
//
|
|
195
|
+
// is what lets `run:step` fire the end-of-run retrospective *before* the watch rather than after it,
|
|
196
|
+
// so the improvement issues the retrospective files are what the watch then
|
|
197
197
|
// picks up. A watch that opened while children were still merging (`running > 0`) is not this drain: the
|
|
198
198
|
// retrospective waits for the true idle, and the marker is emitted from the loop head for the same
|
|
199
199
|
// reason `run:merge` emits its own events — the command that detects the event owns writing it.
|
|
200
|
-
// Returns whether this call wrote the marker, so `backlog:drive` stops once per drain
|
|
201
|
-
// (joshuafolkken/kit#2508).
|
|
200
|
+
// Returns whether this call wrote the marker, so `backlog:drive` stops once per drain.
|
|
202
201
|
async function mark_drain(verdict: string, answer: string, running: number): Promise<boolean> {
|
|
203
202
|
if (answer !== EXHAUSTED_ANSWER || running !== NO_RUNNING) return false
|
|
204
203
|
if (verdict !== WATCH_VERDICT && verdict !== STOP_VERDICT) return false
|
|
@@ -226,6 +225,12 @@ async function decide(values: ParsedValues, counts: OfferCounts): Promise<number
|
|
|
226
225
|
|
|
227
226
|
await mark_drain(decision.verdict, offer.answer, counts.running)
|
|
228
227
|
|
|
228
|
+
// The idle window with the ask that read it, once per watching poll, so `run:board` counts the next
|
|
229
|
+
// check from the poll that ran rather than guessing one.
|
|
230
|
+
if (decision.idle !== undefined) {
|
|
231
|
+
await run_event_stream_emit.emit_changed(run_event_stream.EVENT_KIND.IDLE, decision.idle)
|
|
232
|
+
}
|
|
233
|
+
|
|
229
234
|
return emit(decision, offer, values.json === true)
|
|
230
235
|
}
|
|
231
236
|
|
|
@@ -236,9 +241,9 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
236
241
|
|
|
237
242
|
// The loop head is the one place `rule:value` is read from: once per iteration, the parent's
|
|
238
243
|
// context still small, so a rule that never fires shows up as a printed row rather than as
|
|
239
|
-
// something a person has to remember to measure
|
|
240
|
-
// reading and refreshes it in a detached process, so the offer never waits on the measurement
|
|
241
|
-
//
|
|
244
|
+
// something a person has to remember to measure. It prints the cached
|
|
245
|
+
// reading and refreshes it in a detached process, so the offer never waits on the measurement,
|
|
246
|
+
// and it never fails, so a broken reading never stops the backlog.
|
|
242
247
|
rule_value_cache.emit()
|
|
243
248
|
|
|
244
249
|
const counts = counts_of(values)
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
1
2
|
import type { BacklogAnswer } from './backlog-budget'
|
|
2
3
|
import { backlog_next } from './backlog-next'
|
|
3
4
|
|
|
4
|
-
// The mechanical half of `josh backlog:offer
|
|
5
|
+
// The mechanical half of `josh backlog:offer`: turn what `backlog:next`
|
|
5
6
|
// answered — its stdout tokens and its exit code — into the one word `backlog:budget` is then asked
|
|
6
7
|
// with, plus the issue numbers to start and the consecutive-retry count carried to the next ask.
|
|
7
8
|
//
|
|
8
9
|
// **The mapping is `docs/josh-commands-backlog.md` → "`josh backlog:offer`", held here so it cannot
|
|
9
10
|
// drift.** It fixes which `backlog:next` answer becomes which `backlog:budget` word, and it carries two
|
|
10
|
-
// context branches an agent
|
|
11
|
-
// has children in flight and `exhausted` when it has none, and `retry` is `blocked` until the
|
|
12
|
-
// consecutive one, which is `unreadable`. Both are decided from a count here rather than from a
|
|
13
|
-
// judgement
|
|
11
|
+
// context branches an agent would otherwise apply by hand every iteration: `wait` is `blocked` while
|
|
12
|
+
// this run has children in flight and `exhausted` when it has none, and `retry` is `blocked` until the
|
|
13
|
+
// third consecutive one, which is `unreadable`. Both are decided from a count here rather than from a
|
|
14
|
+
// judgement.
|
|
14
15
|
|
|
15
16
|
// Three consecutive `retry` answers end the run: below that a transport hiccup is re-asked, at it the
|
|
16
17
|
// outage is not a hiccup. "`josh backlog:offer`" is the single source of the count.
|
|
17
18
|
const RETRY_LIMIT = 3
|
|
18
19
|
const FAILURE_EXIT_CODE = 1
|
|
19
20
|
const NO_RETRIES = 0
|
|
20
|
-
const NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
21
21
|
|
|
22
22
|
const TOKENS = backlog_next.VERDICT_TOKENS
|
|
23
23
|
|
|
@@ -70,7 +70,7 @@ function from_verdict(token: string, running: number, retries: number): OfferAns
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
function is_numbers(tokens: ReadonlyArray<string>): boolean {
|
|
73
|
-
return tokens.length > 0 && tokens.every((token) =>
|
|
73
|
+
return tokens.length > 0 && tokens.every((token) => issue_number_shape.is_issue_number(token))
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
// **Read the exit code before the tokens.** Exit 1 is "the listing could not be read", which is never
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { BusyRead } from '#scripts/epic/epic-busy'
|
|
2
|
+
import type { EpicChild } from '#scripts/epic/epic-graph'
|
|
3
|
+
import type { SoloSelection } from '#scripts/epic/epic-solo'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
|
+
|
|
6
|
+
// Which candidates may not run side by side because their bodies declare overlapping paths.
|
|
7
|
+
// joshuafolkken/kit#3221 held back only a path both bodies named beside a move, split, rename or
|
|
8
|
+
// delete verb, on the reading that a plain overlap always merged mechanically. It did not:
|
|
9
|
+
// joshuafolkken/kit#3582 named `scripts/lines/effective-limit.ts`, joshuafolkken/kit#3586 named
|
|
10
|
+
// `scripts/lines/**`, and the two lanes met a content conflict that stopped the second ship
|
|
11
|
+
// (joshuafolkken/kit#3617). So any overlap now holds the later one back — the same file named by
|
|
12
|
+
// both, or a path inside the other's directory glob. A directory one segment deep (`scripts/`) is
|
|
13
|
+
// too broad to count, and an issue reference (`owner/repo#N`) is not a path. A dotted token with no
|
|
14
|
+
// `/` is a file only when its extension is one this repository keeps at the root — otherwise
|
|
15
|
+
// `session_cite.issue` or `process.env` would claim a path and serialize unrelated lanes.
|
|
16
|
+
const CODE_SPAN = /`([^`\s]+)`/gu
|
|
17
|
+
const LINE_SUFFIX = /:\d+(?:[-:]\d+)?$/u
|
|
18
|
+
const FILE_EXTENSION = /\.[a-z]\w*$/iu
|
|
19
|
+
const ROOT_FILE_EXTENSION = /\.(?:[cm]?[jt]sx?|svelte|jsonc?|md|ya?ml|css|html|sh|toml|txt)$/u
|
|
20
|
+
const GLOB = '*'
|
|
21
|
+
const ISSUE_MARK = '#'
|
|
22
|
+
const SEPARATOR = '/'
|
|
23
|
+
const MIN_DIRECTORY_DEPTH = 2
|
|
24
|
+
|
|
25
|
+
// The paths each issue declares, by issue number. A directory ends in `/`; anything else is a file.
|
|
26
|
+
type Declared = ReadonlyMap<number, ReadonlySet<string>>
|
|
27
|
+
|
|
28
|
+
interface DeclaringIssue {
|
|
29
|
+
number: number
|
|
30
|
+
body?: string | undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// `scripts/lines/**` and `scripts/lines/*.ts` declare `scripts/lines/`; a path with no glob is itself.
|
|
34
|
+
function without_glob(path: string): string {
|
|
35
|
+
const glob = path.indexOf(GLOB)
|
|
36
|
+
|
|
37
|
+
return glob === -1 ? path : path.slice(0, path.lastIndexOf(SEPARATOR, glob) + 1)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function is_narrow(directory: string): boolean {
|
|
41
|
+
return directory.split(SEPARATOR).filter(Boolean).length >= MIN_DIRECTORY_DEPTH
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function is_file(path: string): boolean {
|
|
45
|
+
return (path.includes(SEPARATOR) ? FILE_EXTENSION : ROOT_FILE_EXTENSION).test(path)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function claim_of(path: string): string | undefined {
|
|
49
|
+
if (path.endsWith(SEPARATOR)) return is_narrow(path) ? path : undefined
|
|
50
|
+
|
|
51
|
+
return is_file(path) ? path : undefined
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The backticked files and directories `body` declares.
|
|
55
|
+
function declared_paths(body: string): ReadonlySet<string> {
|
|
56
|
+
const tokens = [...body.matchAll(CODE_SPAN)].map((match) => match[1] ?? '')
|
|
57
|
+
const paths = tokens
|
|
58
|
+
.filter((token) => !token.includes(ISSUE_MARK))
|
|
59
|
+
.map((token) => claim_of(without_glob(token.replace(LINE_SUFFIX, ''))))
|
|
60
|
+
|
|
61
|
+
return new Set(paths.filter((path) => path !== undefined))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function declared_of(issues: ReadonlyArray<DeclaringIssue>): Declared {
|
|
65
|
+
return new Map(issues.map((issue) => [issue.number, declared_paths(issue.body ?? '')]))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function contains(outer: string, inner: string): boolean {
|
|
69
|
+
return outer.endsWith(SEPARATOR) ? inner.startsWith(outer) : outer === inner
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function overlaps(left: string, right: string): boolean {
|
|
73
|
+
return contains(left, right) || contains(right, left)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface SeparateContext {
|
|
77
|
+
read: BusyRead
|
|
78
|
+
repo: string
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The path each running lane declares, mapped to the issue that holds it.
|
|
82
|
+
function running_claims(declared: Declared, read: BusyRead): Map<string, number> {
|
|
83
|
+
const holders = read.kind === 'busy' ? read.issues.map((issue) => issue.number) : []
|
|
84
|
+
const pairs = holders.flatMap((number) =>
|
|
85
|
+
[...(declared.get(number) ?? [])].map((path): [string, number] => [path, number]),
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
return new Map(pairs)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function paths_of(child: EpicChild, declared: Declared, repo: string): ReadonlySet<string> {
|
|
92
|
+
if (child.repo !== repo) return new Set()
|
|
93
|
+
|
|
94
|
+
return declared.get(child.number) ?? new Set()
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
interface Clash {
|
|
98
|
+
path: string
|
|
99
|
+
claimed: string
|
|
100
|
+
holder: number
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function clash_of(
|
|
104
|
+
claims: ReadonlyMap<string, number>,
|
|
105
|
+
paths: ReadonlySet<string>,
|
|
106
|
+
): Clash | undefined {
|
|
107
|
+
const clashes = [...paths].flatMap((path) =>
|
|
108
|
+
[...claims]
|
|
109
|
+
.filter(([claimed]) => overlaps(claimed, path))
|
|
110
|
+
.map(([claimed, holder]): Clash => ({ path, claimed, holder })),
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
return clashes[0]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function clash_note(child: EpicChild, clash: Clash): string {
|
|
117
|
+
const waiting = session_cite.issue(child.number, undefined, child.repo)
|
|
118
|
+
const holder = session_cite.issue(clash.holder, undefined, child.repo)
|
|
119
|
+
|
|
120
|
+
return `${waiting} waits: its \`${clash.path}\` overlaps \`${clash.claimed}\`, which ${holder} declares.`
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
interface Walk {
|
|
124
|
+
claims: Map<string, number>
|
|
125
|
+
offered: Array<EpicChild>
|
|
126
|
+
withheld: Array<EpicChild>
|
|
127
|
+
notes: Array<string>
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function visit(walk: Walk, child: EpicChild, paths: ReadonlySet<string>): void {
|
|
131
|
+
const clash = clash_of(walk.claims, paths)
|
|
132
|
+
|
|
133
|
+
if (clash === undefined) {
|
|
134
|
+
walk.offered.push(child)
|
|
135
|
+
for (const path of paths) walk.claims.set(path, child.number)
|
|
136
|
+
|
|
137
|
+
return
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
walk.withheld.push(child)
|
|
141
|
+
walk.notes.push(clash_note(child, clash))
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function merged_notice(
|
|
145
|
+
notice: string | undefined,
|
|
146
|
+
notes: ReadonlyArray<string>,
|
|
147
|
+
): string | undefined {
|
|
148
|
+
const parts = notice === undefined ? notes : [notice, ...notes]
|
|
149
|
+
|
|
150
|
+
return parts.length === 0 ? undefined : parts.join('\n')
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// `selection` with every offered candidate that declares a path overlapping one a running lane or
|
|
154
|
+
// an earlier candidate already declares moved to `withheld`, in offer order.
|
|
155
|
+
function separate(
|
|
156
|
+
selection: SoloSelection,
|
|
157
|
+
declared: Declared,
|
|
158
|
+
context: SeparateContext,
|
|
159
|
+
): SoloSelection {
|
|
160
|
+
const walk: Walk = {
|
|
161
|
+
claims: running_claims(declared, context.read),
|
|
162
|
+
offered: [],
|
|
163
|
+
withheld: [],
|
|
164
|
+
notes: [],
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
for (const child of selection.offered) visit(walk, child, paths_of(child, declared, context.repo))
|
|
168
|
+
|
|
169
|
+
const notice = merged_notice(selection.notice, walk.notes)
|
|
170
|
+
const withheld = [...walk.withheld, ...selection.withheld]
|
|
171
|
+
|
|
172
|
+
return { offered: walk.offered, withheld, ...(notice !== undefined && { notice }) }
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const backlog_overlap = { declared_of, declared_paths, separate }
|
|
176
|
+
|
|
177
|
+
export { backlog_overlap }
|
|
178
|
+
export type { Declared }
|