@joshuafolkken/kit 1.1035.0 → 1.1094.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/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/verify-ui/SKILL.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +21 -13
- package/.claude/skills/workflow-commands/background-commands.md +5 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
- package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
- package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +6 -4
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +3 -3
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +3 -2
- package/.claude/skills/workflow-commands/halfrun.md +16 -19
- package/.claude/skills/workflow-commands/issue-comments.md +2 -2
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +1 -1
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +44 -89
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +24 -4
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +21 -0
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +42 -48
- package/.github/workflows/sonar-qube.yml +37 -4
- package/AGENTS.md +12 -2
- package/CLAUDE.md +15 -16
- package/GEMINI.md +14 -2
- package/README.md +59 -18
- package/SECURITY.md +36 -6
- package/cspell/index.yaml +2 -1
- package/dist/CLAUDE.md +15 -16
- package/dist/config-merge/index.js +15 -3
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
- package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
- package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
- package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
- package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
- package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +15 -34
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +23 -16
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +188 -509
- package/dist/josh.js +166 -225
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +412 -64
- package/eslint/rules/promise.js +5 -0
- package/package.json +13 -8
- package/prompts/collaboration-workflow/file-edits.md +6 -53
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/operating-rules.md +4 -4
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +4 -4
- package/prompts/collaboration-workflow/rule-delivery.md +5 -36
- package/prompts/collaboration-workflow/shell-body.md +7 -9
- package/prompts/collaboration-workflow/turn-batching.md +21 -37
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +36 -36
- package/prompts/collaboration-workflow.md +5 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +12 -4
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +2 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +15 -25
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +32 -22
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +6 -8
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +34 -17
- package/scripts/backlog/backlog-rank.ts +106 -0
- package/scripts/backlog/backlog-ready.ts +19 -3
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +47 -31
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +92 -11
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +0 -3
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +11 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +4 -6
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/document-byte-budget.ts +8 -9
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +13 -4
- package/scripts/document/lane-child-read-set.ts +1 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +1 -0
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +1 -1
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +5 -4
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +20 -30
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +37 -0
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +32 -30
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-command.ts +1 -1
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-execa-error.ts +6 -1
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +24 -6
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push-transport.ts +12 -69
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn.ts +79 -3
- package/scripts/git/git-ssh-keepalive.ts +74 -0
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +4 -2
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-cli.ts +15 -0
- package/scripts/hooks/format-edited-file.ts +4 -9
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard-cli.ts +21 -0
- package/scripts/hooks/pretool-guard.ts +36 -19
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-logic.ts +7 -0
- package/scripts/init/init.ts +0 -3
- package/scripts/init/project-profile.ts +6 -11
- package/scripts/init/start-exec.ts +8 -2
- package/scripts/init/start-plan.ts +18 -5
- package/scripts/init/start-setup-pr.ts +52 -25
- package/scripts/init/start-steps.ts +42 -9
- package/scripts/init/start.ts +40 -10
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +3 -3
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +37 -8
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +19 -3
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +2 -2
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +20 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/issue/issue-rank.ts +89 -0
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +1 -1
- package/scripts/issue/measure-rerun-cli.ts +1 -1
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -102
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +10 -3
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +7 -1
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +2 -2
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +3 -6
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-child-marker.ts +16 -2
- package/scripts/lane/lane-cli.ts +33 -18
- package/scripts/lane/lane-close.ts +1 -3
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +21 -11
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/lane-report.ts +10 -4
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +3 -0
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/lines-command.ts +0 -1
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +0 -2
- package/scripts/propagate/propagate-plan.ts +185 -0
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -3
- package/scripts/propagate/propagate-steps.ts +19 -6
- package/scripts/propagate/propagate-targets.ts +13 -6
- package/scripts/propagate/propagate.ts +60 -46
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +0 -1
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +1 -2
- package/scripts/registry-migration/migrate.ts +19 -9
- package/scripts/release/github-release-cli.ts +8 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +2 -3
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +48 -16
- package/scripts/review/review-brief-cli.ts +72 -8
- package/scripts/review/review-brief.ts +67 -9
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +1 -1
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +6 -2
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +1 -2
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/issue-fold.ts +1 -2
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-carry-conflict.ts +1 -2
- package/scripts/rules/lane-park.ts +14 -8
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/pre-gate-cut.ts +2 -2
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +13 -5
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +1 -1
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +101 -24
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +24 -8
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +25 -5
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +1 -1
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +5 -13
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +143 -0
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +2 -2
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-cli.ts +4 -7
- package/scripts/run/run-progress-clock.ts +6 -34
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +3 -3
- package/scripts/run/run-progress.ts +22 -10
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +27 -77
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +87 -0
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +23 -30
- package/scripts/run/run-ship-review.ts +20 -0
- package/scripts/run/run-ship-scoped.ts +45 -0
- package/scripts/run/run-ship-stage.ts +5 -1
- package/scripts/run/run-ship-steps.ts +105 -0
- package/scripts/run/run-ship.ts +2 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +1 -1
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +2 -1
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -5
- package/scripts/run/run-wake-describe.ts +19 -1
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +9 -7
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +0 -2
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +2 -3
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +97 -0
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-commands.ts +5 -4
- package/scripts/version/version-remote.ts +28 -14
- package/scripts/version/version-targets.ts +4 -4
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/dependabot-auto-merge.yml +5 -3
- package/templates/workflows/github-release.yml +81 -0
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { git_gh_command } from '#scripts/
|
|
3
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
4
|
import { cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
|
|
5
5
|
import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
|
|
6
6
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
3
3
|
import { epic_audit_logic } from './epic-audit'
|
|
4
4
|
import type { BacklogIssue } from './epic-bundle'
|
|
@@ -181,11 +181,7 @@ async function referenced_candidates(
|
|
|
181
181
|
|
|
182
182
|
const epic_bundle_referenced = {
|
|
183
183
|
REFERENCED_LOOKUP_LIMIT,
|
|
184
|
-
LOOKUP_CONCURRENCY,
|
|
185
184
|
referenced_lookups,
|
|
186
|
-
is_failed_read,
|
|
187
|
-
to_backlog_issue,
|
|
188
|
-
is_usable_candidate,
|
|
189
185
|
collect_referenced,
|
|
190
186
|
fetch_referenced,
|
|
191
187
|
referenced_candidates,
|
|
@@ -294,12 +294,8 @@ const epic_bundle = {
|
|
|
294
294
|
names_in_body,
|
|
295
295
|
NO_SIGNAL_REASON,
|
|
296
296
|
already_tracked_reason,
|
|
297
|
-
SPREAD_REASON,
|
|
298
|
-
has_mutual_reference,
|
|
299
297
|
has_recorded_dependency,
|
|
300
298
|
is_strong_signal,
|
|
301
|
-
find_candidates,
|
|
302
|
-
candidate_epics,
|
|
303
299
|
decide_bundle,
|
|
304
300
|
bundle_dependency_links,
|
|
305
301
|
bundle_children,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
3
|
+
import { open_issue_schema, type OpenIssueData } from '#scripts/git/schemas'
|
|
2
4
|
import {
|
|
3
5
|
ALREADY_DONE_LABEL,
|
|
4
6
|
has_any_label,
|
|
5
7
|
IN_PROGRESS_LABEL,
|
|
6
8
|
NEEDS_DECISION_LABEL,
|
|
7
|
-
} from '#scripts/
|
|
8
|
-
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
9
|
-
import { open_issue_schema, type OpenIssueData } from '#scripts/git/schemas'
|
|
9
|
+
} from '#scripts/issue/issue-labels'
|
|
10
10
|
|
|
11
11
|
// How much of a repository's parallelism is already spoken for — asked of the *repository*, never of
|
|
12
12
|
// the epic (joshuafolkken/kit#925), and counted rather than treated as a yes/no since
|
|
@@ -194,7 +194,6 @@ const epic_busy = {
|
|
|
194
194
|
unreadable_message,
|
|
195
195
|
truncated_message,
|
|
196
196
|
busy_reason,
|
|
197
|
-
format_holders,
|
|
198
197
|
is_parked,
|
|
199
198
|
parse_listing,
|
|
200
199
|
read_repository,
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
has_label_name,
|
|
4
4
|
IN_PROGRESS_LABEL,
|
|
5
5
|
NEEDS_DECISION_LABEL,
|
|
6
|
-
} from '#scripts/
|
|
6
|
+
} from '#scripts/issue/issue-labels'
|
|
7
7
|
import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
8
8
|
import { epic_nested } from './epic-nested'
|
|
9
9
|
import {
|
|
@@ -44,7 +44,7 @@ function resolve_by_state(blocker: EpicChild): DependencyVerdict {
|
|
|
44
44
|
// Case-insensitive, through the shared comparison rather than `Array.includes`. GitHub keeps the
|
|
45
45
|
// casing a label was created with and treats `Epic` and `epic` as one label, so a repository that
|
|
46
46
|
// predates these scripts can answer with either spelling — and a child read by eye against the
|
|
47
|
-
// lowercase string is one this classification never sees (`scripts/
|
|
47
|
+
// lowercase string is one this classification never sees (`scripts/issue/issue-labels.ts`).
|
|
48
48
|
function has_label(child: EpicChild, label: string): boolean {
|
|
49
49
|
return has_label_name(child.labels, label)
|
|
50
50
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
3
3
|
import { rest_comment_schema, type RestCommentData } from '#scripts/git/schemas'
|
|
4
4
|
import { epic_parse, type ExternalChild } from './epic-parse'
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
2
|
-
import { EPIC_LABEL } from '#scripts/git/issue-labels'
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
2
|
import { cutoff_cause, cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
|
|
4
3
|
import {
|
|
5
4
|
parse_json_array_or_undefined,
|
|
6
5
|
parse_json_object_safe,
|
|
7
6
|
} from '#scripts/git/parse-json-array'
|
|
8
7
|
import { epic_child_schema, epic_issue_schema, type EpicChildData } from '#scripts/git/schemas'
|
|
8
|
+
import { EPIC_LABEL } from '#scripts/issue/issue-labels'
|
|
9
9
|
import { error_text } from '#scripts/lib/error-message'
|
|
10
10
|
import { epic_close_comment } from './epic-close-comment'
|
|
11
11
|
import { epic_parse, type ExternalChild } from './epic-parse'
|
|
@@ -296,6 +296,7 @@ async function close_parents_of(
|
|
|
296
296
|
const closed: Array<number> = []
|
|
297
297
|
|
|
298
298
|
for (const epic of parents_of(open_epics, child_number)) {
|
|
299
|
+
// eslint-disable-next-line no-await-in-loop -- each close updates the evaluated set the next one reads
|
|
299
300
|
const number = await close_if_unseen(epic, child_number, evaluated)
|
|
300
301
|
if (number !== undefined) closed.push(number)
|
|
301
302
|
}
|
|
@@ -311,6 +312,7 @@ async function close_next_level(
|
|
|
311
312
|
const next: Array<number> = []
|
|
312
313
|
|
|
313
314
|
for (const child_number of frontier) {
|
|
315
|
+
// eslint-disable-next-line no-await-in-loop -- each close updates the evaluated set the next one reads
|
|
314
316
|
next.push(...(await close_parents_of(open_epics, child_number, evaluated)))
|
|
315
317
|
}
|
|
316
318
|
|
|
@@ -328,6 +330,7 @@ async function cascade_close(
|
|
|
328
330
|
|
|
329
331
|
for (let depth = 0; depth < MAX_CASCADE_DEPTH; depth++) {
|
|
330
332
|
if (frontier.length === 0) return
|
|
333
|
+
// eslint-disable-next-line no-await-in-loop -- the cascade closes one level before reading the next
|
|
331
334
|
frontier = await close_next_level(open_epics, frontier, evaluated)
|
|
332
335
|
}
|
|
333
336
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { repo_map_logic } from '#scripts/discovery/repo-map-logic'
|
|
2
2
|
import { repo_origin } from '#scripts/discovery/repo-origin'
|
|
3
|
-
import { git_gh_api_path } from '#scripts/
|
|
4
|
-
import { git_gh_exec } from '#scripts/
|
|
3
|
+
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
4
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
5
5
|
import { propagate_publish } from '#scripts/propagate/propagate-publish'
|
|
6
6
|
import { derive_versions_endpoint } from '#scripts/version/version-command-config'
|
|
7
7
|
import { load } from 'js-yaml'
|
|
@@ -336,11 +336,9 @@ function is_same_owner_repo(repo: string, current_owner: string): boolean {
|
|
|
336
336
|
|
|
337
337
|
const epic_cross_repo = {
|
|
338
338
|
publishes_nothing,
|
|
339
|
-
read_manifest,
|
|
340
339
|
read_default_branch_version,
|
|
341
340
|
reset_publish_cache,
|
|
342
341
|
package_name_for,
|
|
343
|
-
is_published,
|
|
344
342
|
resolve_cross_repo,
|
|
345
343
|
owner_of,
|
|
346
344
|
is_same_owner_repo,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
2
|
-
import type { IssueReadFailure } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import type { IssueReadFailure } from '#scripts/gh/git-gh-issue-read'
|
|
3
3
|
import { epic_cross_repo } from './epic-cross-repo'
|
|
4
4
|
import type { EpicChild, IssueReference } from './epic-graph'
|
|
5
5
|
import { epic_issue, type EpicIssue } from './epic-issue'
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
2
|
-
import { EPIC_LABEL, has_any_label } from '#scripts/git/issue-labels'
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
2
|
import { cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
|
|
4
3
|
import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
|
|
5
4
|
import type { OpenIssueData } from '#scripts/git/schemas'
|
|
5
|
+
import { EPIC_LABEL, has_any_label } from '#scripts/issue/issue-labels'
|
|
6
6
|
import { z } from 'zod'
|
|
7
7
|
import { epic_parse } from './epic-parse'
|
|
8
8
|
|
|
@@ -200,7 +200,6 @@ const epic_index = {
|
|
|
200
200
|
build_epic_index,
|
|
201
201
|
build_tracking_index,
|
|
202
202
|
fetch_epics,
|
|
203
|
-
opted_in_epic_numbers,
|
|
204
203
|
reachable_epic_numbers,
|
|
205
204
|
withheld_children,
|
|
206
205
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_issue_rest } from '#scripts/
|
|
1
|
+
import { git_gh_issue_rest } from '#scripts/gh/git-gh-issue-rest'
|
|
2
2
|
import { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
3
3
|
import { blocked_by_schema } from '#scripts/git/schemas'
|
|
4
4
|
import { z } from 'zod'
|
|
@@ -77,18 +77,6 @@ function blocker_references_of(
|
|
|
77
77
|
)
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
// The same blockers as bare numbers, for the callers that predate the qualified read: the planner and
|
|
81
|
-
// the bundler. A projection of the read above rather than a second unwrapping of the connection.
|
|
82
|
-
//
|
|
83
|
-
// **The number alone is lossy, and those callers inherit that.** A blocker in another repository
|
|
84
|
-
// collapses to its number here and can then match a local issue that happens to share it —
|
|
85
|
-
// joshuafolkken/kit#1130 carries the case, which is `epic:bundle` reading a false relation and
|
|
86
|
-
// recording one onto the wrong issue. It predates joshuafolkken/kit#1126 rather than being introduced
|
|
87
|
-
// by it, and threading the repository through the bundler is its own change with its own reach.
|
|
88
|
-
function blockers_of(issue: EpicIssue): Array<number> {
|
|
89
|
-
return blocker_references_of(issue).map((blocker) => blocker.number)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
80
|
function label_names(issue: EpicIssue): Array<string> {
|
|
93
81
|
return issue.labels.map((label) => label.name)
|
|
94
82
|
}
|
|
@@ -157,9 +145,7 @@ function parse_epic_reference(raw = ''): EpicReference | undefined {
|
|
|
157
145
|
const epic_issue = {
|
|
158
146
|
CLOSED,
|
|
159
147
|
blocker_references_of,
|
|
160
|
-
UNKNOWN_STATE,
|
|
161
148
|
parse_epic_issue,
|
|
162
|
-
blockers_of,
|
|
163
149
|
label_names,
|
|
164
150
|
normalize_state,
|
|
165
151
|
is_open,
|
|
@@ -6,8 +6,10 @@ import {
|
|
|
6
6
|
type RepoAnswer,
|
|
7
7
|
} from './epic-candidate-confirm'
|
|
8
8
|
import { epic_graph, type EpicChild } from './epic-graph'
|
|
9
|
+
import { epic_rank } from './epic-rank'
|
|
9
10
|
import type { EpicVerdict } from './epic-report'
|
|
10
11
|
import { epic_solo } from './epic-solo'
|
|
12
|
+
import { epic_solo_stale } from './epic-solo-stale'
|
|
11
13
|
import { epic_triage, type TriageVerdict } from './epic-triage'
|
|
12
14
|
|
|
13
15
|
// Which children a repository has room to start right now (joshuafolkken/kit#1491).
|
|
@@ -107,6 +109,15 @@ function candidates_in(pool: RepoPool, repo: string): RepoPool {
|
|
|
107
109
|
return { ...pool, candidates: pool.candidates.filter((child) => child.repo === repo) }
|
|
108
110
|
}
|
|
109
111
|
|
|
112
|
+
// A pool's candidates for the repository in `epic_rank.rank` order — the ranking `backlog:next` offers
|
|
113
|
+
// in (joshuafolkken/kit#2928), counted against the pool's own graph. **Within a pool, not across
|
|
114
|
+
// pools**: the pool order is the order a person named the epics in, and that stays the outer key.
|
|
115
|
+
function ranked_in(pool: RepoPool, repo: string): RepoPool {
|
|
116
|
+
const scoped = candidates_in(pool, repo)
|
|
117
|
+
|
|
118
|
+
return { ...scoped, candidates: epic_rank.rank(scoped.candidates, pool.context.children) }
|
|
119
|
+
}
|
|
120
|
+
|
|
110
121
|
// One pool's candidates, minus every one an earlier pool already carries. `seen` is mutated rather
|
|
111
122
|
// than rebuilt because the earlier pools' claim is what the later one is filtered against.
|
|
112
123
|
function unseen_candidates(pool: RepoPool, seen: Set<string>): RepoPool {
|
|
@@ -158,6 +169,7 @@ async function collect(
|
|
|
158
169
|
for (const pool of pools) {
|
|
159
170
|
if (children.length >= wanted) break
|
|
160
171
|
|
|
172
|
+
// eslint-disable-next-line no-await-in-loop -- pools are asked in order until enough children are found
|
|
161
173
|
const answer = await ask_pool(pool, wanted - children.length)
|
|
162
174
|
|
|
163
175
|
children.push(...answer.children)
|
|
@@ -184,24 +196,6 @@ function solo_offer(
|
|
|
184
196
|
return { ...answer, children: offered, notice: offered_notice(offered, read, request) }
|
|
185
197
|
}
|
|
186
198
|
|
|
187
|
-
// The confirmation walk stops at the free-lane count, so a `run:solo` candidate ranked past it — or
|
|
188
|
-
// in a pool past it — would never reach `solo_offer` to be preferred. Into an idle repository the
|
|
189
|
-
// first pool holding one is asked first, with it at its head through the same `epic_solo.prefer` the
|
|
190
|
-
// offer applies (joshuafolkken/kit#2778). The candidate stays in its own pool, because a pool carries
|
|
191
|
-
// the graph it is confirmed against.
|
|
192
|
-
function solo_first(pools: ReadonlyArray<RepoPool>, read: BusyRead): ReadonlyArray<RepoPool> {
|
|
193
|
-
if (read.kind !== 'idle') return pools
|
|
194
|
-
|
|
195
|
-
const index = pools.findIndex((pool) => pool.candidates.some((child) => epic_solo.is_solo(child)))
|
|
196
|
-
const pool = pools[index]
|
|
197
|
-
|
|
198
|
-
if (pool === undefined) return pools
|
|
199
|
-
|
|
200
|
-
const lifted = { ...pool, candidates: epic_solo.prefer(pool.candidates, read) }
|
|
201
|
-
|
|
202
|
-
return [lifted, ...pools.filter((other) => other !== pool)]
|
|
203
|
-
}
|
|
204
|
-
|
|
205
199
|
// The repository is asked how full it is **before** any candidate is confirmed, for the reason
|
|
206
200
|
// joshuafolkken/kit#1121 records: a repository with no free lane is handed nothing, so the relations
|
|
207
201
|
// request that would confirm a candidate there buys an answer nobody reads — and a polling `epicrun`
|
|
@@ -236,7 +230,13 @@ async function offer_for_repo(
|
|
|
236
230
|
|
|
237
231
|
if (triage !== undefined) return triage
|
|
238
232
|
|
|
239
|
-
const read = await
|
|
233
|
+
const { read, notice } = await epic_solo_stale.release(
|
|
234
|
+
await epic_busy.read_repository(request.repo),
|
|
235
|
+
request.repo,
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
if (notice !== undefined) console.error(notice)
|
|
239
|
+
|
|
240
240
|
const free = free_lanes(read, request.limit)
|
|
241
241
|
|
|
242
242
|
if (free === NO_LANES) {
|
|
@@ -247,24 +247,14 @@ async function offer_for_repo(
|
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
249
|
|
|
250
|
-
const for_repo =
|
|
251
|
-
dedupe_pools(pools.map((pool) => candidates_in(pool, request.repo))),
|
|
252
|
-
read,
|
|
253
|
-
)
|
|
250
|
+
const for_repo = dedupe_pools(pools.map((pool) => ranked_in(pool, request.repo)))
|
|
254
251
|
|
|
255
252
|
return solo_offer(await collect(for_repo, wanted_of(request, free)), read, request)
|
|
256
253
|
}
|
|
257
254
|
|
|
258
255
|
const epic_lane_offer = {
|
|
259
|
-
is_held,
|
|
260
|
-
free_lanes,
|
|
261
|
-
wanted_of,
|
|
262
256
|
combine_verdicts,
|
|
263
|
-
candidates_in,
|
|
264
|
-
unseen_candidates,
|
|
265
257
|
dedupe_pools,
|
|
266
|
-
withheld_message,
|
|
267
|
-
collect,
|
|
268
258
|
offer_for_repo,
|
|
269
259
|
}
|
|
270
260
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EPIC_LABEL, has_label_name } from '#scripts/
|
|
1
|
+
import { EPIC_LABEL, has_label_name } from '#scripts/issue/issue-labels'
|
|
2
2
|
import type { EpicChild } from './epic-graph'
|
|
3
3
|
|
|
4
4
|
// Whether a task-list row points at another epic (joshuafolkken/kit#1476).
|
|
@@ -118,6 +118,7 @@ async function read_snapshots(
|
|
|
118
118
|
const notices: Array<string> = []
|
|
119
119
|
|
|
120
120
|
for (const reference of unique_references(references, current_repo)) {
|
|
121
|
+
// eslint-disable-next-line no-await-in-loop -- the first refusal ends the read, so later reads are not spent
|
|
121
122
|
const outcome = await read_one(reference, current_repo)
|
|
122
123
|
|
|
123
124
|
if (outcome.refusal !== undefined) return { reads, notices, refusal: outcome.refusal }
|
|
@@ -129,11 +130,8 @@ async function read_snapshots(
|
|
|
129
130
|
|
|
130
131
|
const epic_next_read = {
|
|
131
132
|
FOREIGN_EPIC,
|
|
132
|
-
epic_repo_of,
|
|
133
133
|
childless,
|
|
134
134
|
unique_references,
|
|
135
|
-
is_childless,
|
|
136
|
-
read_one,
|
|
137
135
|
read_snapshots,
|
|
138
136
|
}
|
|
139
137
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
4
|
-
import { git_gh_command } from '#scripts/
|
|
4
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
5
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
6
6
|
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
7
7
|
import { lane_capacity } from '#scripts/lane/lane-capacity'
|
|
@@ -441,27 +441,18 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
441
441
|
}
|
|
442
442
|
|
|
443
443
|
const epic_next = {
|
|
444
|
-
USAGE,
|
|
445
444
|
EXTERNAL_NOTICE,
|
|
446
445
|
FOREIGN_EPIC,
|
|
447
|
-
body_anomaly,
|
|
448
|
-
unreadable_anomaly,
|
|
449
446
|
is_order_declared,
|
|
450
447
|
repo_verdict,
|
|
451
|
-
offer_children,
|
|
452
|
-
report_offer,
|
|
453
448
|
UNCHECKED_EXCLUSION,
|
|
454
449
|
split_at_flag,
|
|
455
|
-
parse_references,
|
|
456
450
|
parse_options,
|
|
457
|
-
note_external,
|
|
458
451
|
refuse_reads,
|
|
459
452
|
views_of,
|
|
460
453
|
run_epics,
|
|
461
454
|
decide,
|
|
462
455
|
report,
|
|
463
|
-
run,
|
|
464
|
-
main,
|
|
465
456
|
}
|
|
466
457
|
|
|
467
458
|
// `.env` is read here rather than through the dispatcher's `tsx_arguments`: declaring any would
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
import { epic_body } from './epic-body'
|
|
2
2
|
import { epic_parse } from './epic-parse'
|
|
3
3
|
|
|
4
|
-
// Promoting an existing issue into an epic.
|
|
5
|
-
//
|
|
6
|
-
// The discussion that concluded "this is really several issues" is almost always *inside* an
|
|
7
|
-
// existing issue, and that discussion is usually the split rationale itself. Creating a separate
|
|
8
|
-
// epic leaves two issues tracking one topic, so the promotion appends the epic's sections to the
|
|
9
|
-
// body rather than replacing it (joshuafolkken/kit#865).
|
|
10
|
-
|
|
11
|
-
const EPIC_SECTION_MARKER = '## Progress'
|
|
12
4
|
const PROMOTED_HEADING = '## Split into children'
|
|
13
5
|
|
|
14
6
|
interface PromoteInput {
|
|
@@ -90,7 +82,6 @@ function find_tracking_error(body: string, children: ReadonlyArray<number>): str
|
|
|
90
82
|
}
|
|
91
83
|
|
|
92
84
|
const epic_promote = {
|
|
93
|
-
EPIC_SECTION_MARKER,
|
|
94
85
|
PROMOTED_HEADING,
|
|
95
86
|
has_conflicting_tracking,
|
|
96
87
|
conflict_reason,
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { issue_rank } from '#scripts/issue/issue-rank'
|
|
2
|
+
import { epic_graph, type EpicChild } from './epic-graph'
|
|
3
|
+
|
|
4
|
+
// `issue-rank.ts`'s keys over graph children (joshuafolkken/kit#2928), for both offer paths that hand
|
|
5
|
+
// out children: `backlog:next` (`backlog-rank.ts`) and a named epic's `epic:next --lanes`
|
|
6
|
+
// (`epic-lane-offer.ts`). One ranking, so the two cannot disagree about which child goes first.
|
|
7
|
+
|
|
8
|
+
const CLOSED = 'CLOSED'
|
|
9
|
+
|
|
10
|
+
// How many open issues of the pool wait on each child. Only the pool is counted: it is every issue the
|
|
11
|
+
// caller may run, and an issue outside it is not one this ranking can start sooner.
|
|
12
|
+
function dependents_of(pool: ReadonlyArray<EpicChild>): ReadonlyMap<string, number> {
|
|
13
|
+
return issue_rank.count_dependents(
|
|
14
|
+
pool
|
|
15
|
+
.filter((child) => child.state !== CLOSED)
|
|
16
|
+
.map((child) => ({
|
|
17
|
+
key: epic_graph.key_of(child),
|
|
18
|
+
blockers: child.blocked_by.map((blocker) => epic_graph.blocker_key(blocker)),
|
|
19
|
+
})),
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function rank(
|
|
24
|
+
children: ReadonlyArray<EpicChild>,
|
|
25
|
+
pool: ReadonlyArray<EpicChild>,
|
|
26
|
+
): Array<EpicChild> {
|
|
27
|
+
const dependents = dependents_of(pool)
|
|
28
|
+
|
|
29
|
+
return issue_rank.rank(children, (child) => ({
|
|
30
|
+
labels: child.labels,
|
|
31
|
+
dependents: dependents.get(epic_graph.key_of(child)) ?? 0,
|
|
32
|
+
}))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const epic_rank = { rank }
|
|
36
|
+
|
|
37
|
+
export { epic_rank }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { epic_fetch } from './epic-fetch'
|
|
3
3
|
import { epic_graph, type EpicChild } from './epic-graph'
|
|
4
4
|
import { epic_parse } from './epic-parse'
|
|
@@ -65,7 +65,6 @@ async function read_epic(epic_number: number): Promise<EpicReading | { error: st
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
const epic_read = {
|
|
68
|
-
UNKNOWN_REPO,
|
|
69
68
|
read_epic,
|
|
70
69
|
}
|
|
71
70
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { epic_add_body } from './epic-add-body'
|
|
3
3
|
import { epic_chains } from './epic-chains'
|
|
4
4
|
import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
@@ -54,20 +54,8 @@ function format_replaced_relations(links: ReadonlyArray<DependencyLink>): string
|
|
|
54
54
|
return `Replaced blocked-by: ${join_references(quoted)}.`
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
DEPENDENCY_ARROW,
|
|
59
|
-
REFERENCE_SEPARATOR,
|
|
60
|
-
to_issue_reference,
|
|
61
|
-
join_references,
|
|
62
|
-
format_dependency_link,
|
|
63
|
-
format_dependency_links,
|
|
64
|
-
format_issue_references,
|
|
65
|
-
format_replaced_relations,
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export type { IssueReference } from '#scripts/git/issue-reference'
|
|
57
|
+
export type { IssueReference } from '#scripts/issue/issue-reference'
|
|
69
58
|
export {
|
|
70
|
-
epic_reference,
|
|
71
59
|
DEPENDENCY_ARROW,
|
|
72
60
|
REFERENCE_SEPARATOR,
|
|
73
61
|
to_issue_reference,
|
|
@@ -103,7 +103,7 @@ async function recheck_missing_relations(
|
|
|
103
103
|
)
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
const epic_relation_recheck = { recheck_missing_relations,
|
|
106
|
+
const epic_relation_recheck = { recheck_missing_relations, RECHECK_LIMIT }
|
|
107
107
|
|
|
108
108
|
export type { BlockersReader }
|
|
109
109
|
export { epic_relation_recheck }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { epic_decision } from './epic-decision'
|
|
3
3
|
import { epic_read } from './epic-read'
|
|
4
4
|
import { format_dependency_links } from './epic-reference'
|
package/scripts/epic/epic-run.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
2
|
-
import { EPIC_LABEL } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { EPIC_LABEL } from '#scripts/issue/issue-labels'
|
|
3
3
|
import { epic_body } from './epic-body'
|
|
4
4
|
import { epic_promote } from './epic-promote'
|
|
5
5
|
import { epic_relations } from './epic-relations'
|
|
@@ -213,7 +213,6 @@ async function check_epic(epic_number: number): Promise<number> {
|
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
const epic_run = {
|
|
216
|
-
parse_created_number,
|
|
217
216
|
create_epic,
|
|
218
217
|
promote_epic,
|
|
219
218
|
check_epic,
|