@joshuafolkken/kit 1.1050.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/workflow-commands/SKILL.md +19 -11
- package/.claude/skills/workflow-commands/background-commands.md +4 -3
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
- package/.claude/skills/workflow-commands/backlogrun-progress.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +1 -1
- 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 +1 -1
- 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 +3 -3
- 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 +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +33 -38
- 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-HJIISEAC.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-7ZPFAVR7.js} +7 -88
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-E54KGFEQ.js} +2 -2
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M2XDCUKD.js} +997 -478
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-NKOG3XAV.js} +150 -153
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-OIZUHPJI.js} +2 -2
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-UD24EAIL.js} +2084 -1412
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +178 -324
- package/dist/josh.js +162 -119
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +34 -58
- package/eslint/rules/promise.js +5 -0
- package/package.json +9 -4
- 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 +3 -3
- package/prompts/collaboration-workflow/rule-delivery.md +1 -1
- package/prompts/collaboration-workflow/turn-batching.md +3 -3
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +25 -22
- 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 +11 -3
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +0 -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 +6 -16
- 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 +9 -15
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- 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 +5 -2
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +85 -9
- 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 +0 -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 +4 -5
- 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 +10 -2
- 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 +9 -8
- 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 +2 -2
- 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 +3 -2
- 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-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-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +2 -2
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push.ts +1 -1
- 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 +1 -0
- 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-file.ts +2 -0
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard.ts +22 -4
- 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 +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +1 -0
- 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 +3 -3
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +0 -2
- 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 +8 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/{git → issue}/issue-rank.ts +1 -1
- 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 -0
- 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 +8 -1
- 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 +6 -0
- 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-cli.ts +1 -4
- 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/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-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +0 -2
- package/scripts/propagate/propagate-steps.ts +3 -5
- package/scripts/propagate/propagate-targets.ts +0 -4
- package/scripts/propagate/propagate.ts +0 -4
- 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 +0 -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 +4 -16
- package/scripts/review/review-brief-cli.ts +23 -6
- package/scripts/review/review-brief.ts +21 -8
- 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 +0 -3
- 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 +0 -1
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-park.ts +13 -6
- 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/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 +2 -2
- 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 +0 -1
- 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 +1 -2
- package/scripts/run/run-progress.ts +1 -2
- 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 +21 -3
- 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 +1 -1
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +18 -4
- package/scripts/run/run-ship-review.ts +11 -0
- package/scripts/run/run-ship-scoped.ts +1 -0
- package/scripts/run/run-ship-steps.ts +1 -1
- package/scripts/run/run-ship.ts +0 -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 +2 -3
- 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 +0 -1
- 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 +2 -2
- 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-remote.ts +3 -3
- 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,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,
|
|
@@ -9,6 +9,7 @@ import { epic_graph, type EpicChild } from './epic-graph'
|
|
|
9
9
|
import { epic_rank } from './epic-rank'
|
|
10
10
|
import type { EpicVerdict } from './epic-report'
|
|
11
11
|
import { epic_solo } from './epic-solo'
|
|
12
|
+
import { epic_solo_stale } from './epic-solo-stale'
|
|
12
13
|
import { epic_triage, type TriageVerdict } from './epic-triage'
|
|
13
14
|
|
|
14
15
|
// Which children a repository has room to start right now (joshuafolkken/kit#1491).
|
|
@@ -168,6 +169,7 @@ async function collect(
|
|
|
168
169
|
for (const pool of pools) {
|
|
169
170
|
if (children.length >= wanted) break
|
|
170
171
|
|
|
172
|
+
// eslint-disable-next-line no-await-in-loop -- pools are asked in order until enough children are found
|
|
171
173
|
const answer = await ask_pool(pool, wanted - children.length)
|
|
172
174
|
|
|
173
175
|
children.push(...answer.children)
|
|
@@ -228,7 +230,13 @@ async function offer_for_repo(
|
|
|
228
230
|
|
|
229
231
|
if (triage !== undefined) return triage
|
|
230
232
|
|
|
231
|
-
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
|
+
|
|
232
240
|
const free = free_lanes(read, request.limit)
|
|
233
241
|
|
|
234
242
|
if (free === NO_LANES) {
|
|
@@ -245,15 +253,8 @@ async function offer_for_repo(
|
|
|
245
253
|
}
|
|
246
254
|
|
|
247
255
|
const epic_lane_offer = {
|
|
248
|
-
is_held,
|
|
249
|
-
free_lanes,
|
|
250
|
-
wanted_of,
|
|
251
256
|
combine_verdicts,
|
|
252
|
-
candidates_in,
|
|
253
|
-
unseen_candidates,
|
|
254
257
|
dedupe_pools,
|
|
255
|
-
withheld_message,
|
|
256
|
-
collect,
|
|
257
258
|
offer_for_repo,
|
|
258
259
|
}
|
|
259
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,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { issue_rank } from '#scripts/
|
|
1
|
+
import { issue_rank } from '#scripts/issue/issue-rank'
|
|
2
2
|
import { epic_graph, type EpicChild } from './epic-graph'
|
|
3
3
|
|
|
4
4
|
// `issue-rank.ts`'s keys over graph children (joshuafolkken/kit#2928), for both offer paths that hand
|
|
@@ -32,6 +32,6 @@ function rank(
|
|
|
32
32
|
}))
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
const epic_rank = {
|
|
35
|
+
const epic_rank = { rank }
|
|
36
36
|
|
|
37
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,
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { setTimeout as sleep } from 'node:timers/promises'
|
|
2
|
+
import type { OpenIssueData } from '#scripts/git/schemas'
|
|
3
|
+
import { has_any_label, IN_PROGRESS_LABEL, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
|
|
4
|
+
import { lane_await } from '#scripts/lane/lane-await'
|
|
5
|
+
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
6
|
+
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
7
|
+
import type { BusyRead } from './epic-busy'
|
|
8
|
+
|
|
9
|
+
// A `run:solo` holder nothing is running for (joshuafolkken/kit#3017).
|
|
10
|
+
//
|
|
11
|
+
// A running `run:solo` issue lets nothing new start (`epic-solo.ts`), and "running" is read off the
|
|
12
|
+
// `in-progress` label alone. A label nothing removed — a child that parked itself, then had its
|
|
13
|
+
// `needs-decision` lifted by a person — therefore held the whole backlog: every candidate went to
|
|
14
|
+
// `waiting`, no lane was running to release it, and `backlog:offer` booked the run `exhausted`.
|
|
15
|
+
//
|
|
16
|
+
// **What decides it is the child's process, not its lane.** The lane of a child that parked itself
|
|
17
|
+
// stays open after the child has ended, so an open lane is no evidence of a run; the process pattern
|
|
18
|
+
// `lane:await` and `run:liveness` read is. A matching process keeps the holder, whatever its lane.
|
|
19
|
+
//
|
|
20
|
+
// **A missing process releases only what this machine dispatched, and only once re-confirmed.** The
|
|
21
|
+
// process read sees this machine alone, and a session a person started by hand matches no lane
|
|
22
|
+
// pattern, so an absent process is evidence of an ended run only for a holder with a lane here. A
|
|
23
|
+
// boundary cut drops the process for a moment before its resume takes over, so the absence is read
|
|
24
|
+
// again after `lane_await.RECONFIRM_MS` — the window `lane:await` measured for that handoff. Every
|
|
25
|
+
// doubt keeps the holder: a wrongly kept label waits, a wrongly released one runs beside a solo run.
|
|
26
|
+
//
|
|
27
|
+
// Only `run:solo` holders are released: theirs is the one label that blocks every candidate. A stale
|
|
28
|
+
// ordinary holder spends one lane, which `epic_busy.lanes_full_message` already names.
|
|
29
|
+
|
|
30
|
+
const SOLO_LABELS: ReadonlySet<string> = new Set([RUN_SOLO_LABEL])
|
|
31
|
+
|
|
32
|
+
interface StaleRelease {
|
|
33
|
+
read: BusyRead
|
|
34
|
+
notice?: string
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function is_absent_solo(issue: OpenIssueData): boolean {
|
|
38
|
+
if (!has_any_label(issue.labels, SOLO_LABELS)) return false
|
|
39
|
+
|
|
40
|
+
return !lane_await.is_process_running_default(String(issue.number))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The issue numbers of this checkout's lanes. A listing that cannot be read names none, which keeps
|
|
44
|
+
// every holder.
|
|
45
|
+
async function local_lanes(): Promise<ReadonlySet<string>> {
|
|
46
|
+
try {
|
|
47
|
+
const lanes = await lane_registry.list_lanes()
|
|
48
|
+
|
|
49
|
+
return new Set(lanes.map((lane) => lane.issue))
|
|
50
|
+
} catch {
|
|
51
|
+
return new Set()
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function settle(): Promise<void> {
|
|
56
|
+
await sleep(lane_await.RECONFIRM_MS)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Read through this object so a test can stand in for the git listing and the re-confirm wait.
|
|
60
|
+
const io = { local_lanes, settle }
|
|
61
|
+
|
|
62
|
+
async function find_stale(
|
|
63
|
+
issues: ReadonlyArray<OpenIssueData>,
|
|
64
|
+
): Promise<ReadonlyArray<OpenIssueData>> {
|
|
65
|
+
const absent = issues.filter((issue) => is_absent_solo(issue))
|
|
66
|
+
|
|
67
|
+
if (absent.length === 0) return []
|
|
68
|
+
|
|
69
|
+
const lanes = await io.local_lanes()
|
|
70
|
+
const dispatched = absent.filter((issue) => lanes.has(String(issue.number)))
|
|
71
|
+
|
|
72
|
+
if (dispatched.length === 0) return []
|
|
73
|
+
|
|
74
|
+
await io.settle()
|
|
75
|
+
|
|
76
|
+
return dispatched.filter((issue) => is_absent_solo(issue))
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function stale_message(stale: ReadonlyArray<OpenIssueData>, repo: string): string {
|
|
80
|
+
const named = stale.map((issue) => `#${String(issue.number)}`).join(', ')
|
|
81
|
+
|
|
82
|
+
return issue_citation.linkify(
|
|
83
|
+
`${named} carries \`${RUN_SOLO_LABEL}\` and \`${IN_PROGRESS_LABEL}\`, but no process of it is running in ${repo} — the \`${IN_PROGRESS_LABEL}\` label is stale, so it does not hold the backlog. Remove the label once you have confirmed nothing is running it.`,
|
|
84
|
+
repo,
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// The read with every stale `run:solo` holder taken out, and the sentence naming them. A read with no
|
|
89
|
+
// holder left is `idle`, exactly as `epic_busy.parse_listing` answers an empty listing.
|
|
90
|
+
async function release(read: BusyRead, repo: string): Promise<StaleRelease> {
|
|
91
|
+
if (read.kind !== 'busy') return { read }
|
|
92
|
+
|
|
93
|
+
const stale = await find_stale(read.issues)
|
|
94
|
+
|
|
95
|
+
if (stale.length === 0) return { read }
|
|
96
|
+
|
|
97
|
+
const holders = read.issues.filter((issue) => !stale.includes(issue))
|
|
98
|
+
const released: BusyRead =
|
|
99
|
+
holders.length > 0 ? { kind: 'busy', issues: holders } : { kind: 'idle' }
|
|
100
|
+
|
|
101
|
+
return { read: released, notice: stale_message(stale, repo) }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const epic_solo_stale = { io, release }
|
|
105
|
+
|
|
106
|
+
export type { StaleRelease }
|
|
107
|
+
export { epic_solo_stale }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { has_any_label, has_label_name, RUN_SOLO_LABEL } from '#scripts/
|
|
1
|
+
import { has_any_label, has_label_name, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
|
|
2
2
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
3
3
|
import { epic_busy, type BusyRead } from './epic-busy'
|
|
4
4
|
import type { EpicChild } from './epic-graph'
|
|
@@ -15,7 +15,8 @@ import { epic_report, type EpicNextResult } from './epic-report'
|
|
|
15
15
|
// `epic:next --lanes` (a named epic's children, `epic-lane-offer.ts`). One rule, so the two cannot
|
|
16
16
|
// disagree about what may start beside what.
|
|
17
17
|
//
|
|
18
|
-
// Three rules, all against the repository's `in-progress` holders (`epic_busy.read_repository
|
|
18
|
+
// Three rules, all against the repository's `in-progress` holders (`epic_busy.read_repository`, with
|
|
19
|
+
// a stale `run:solo` holder taken out by `epic_solo_stale.release` — joshuafolkken/kit#3017):
|
|
19
20
|
// a running `run:solo` issue lets nothing new start; a `run:solo` candidate starts only into an idle
|
|
20
21
|
// repository and then alone; and nothing ranked below a waiting `run:solo` candidate is offered past
|
|
21
22
|
// it, so it is not starved by the lanes it is waiting on. A listing that could not be read is not an
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { has_label_name, RUN_LANE_LABEL, RUN_SOLO_LABEL } from '#scripts/
|
|
1
|
+
import { has_label_name, RUN_LANE_LABEL, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
|
|
2
2
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
3
3
|
import type { EpicChild } from './epic-graph'
|
|
4
4
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { EPIC_LABEL, has_label_name } from '#scripts/git/issue-labels'
|
|
2
1
|
import { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
3
2
|
import { epic_subject_schema } from '#scripts/git/schemas'
|
|
3
|
+
import { EPIC_LABEL, has_label_name } from '#scripts/issue/issue-labels'
|
|
4
4
|
import { epic_parse, type DeclarationState } from './epic-parse'
|
|
5
5
|
|
|
6
6
|
// The four requirements an epic has to satisfy are otherwise enforced only by an agent reading the
|