@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,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 { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
5
5
|
import { z } from 'zod'
|
|
6
6
|
import { issue_backlinks, type UpstreamEntry } from './issue-backlinks'
|
|
@@ -90,8 +90,4 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
90
90
|
process.exitCode = await run(argv)
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
const issue_backlinks_cli = { run, USAGE }
|
|
94
|
-
|
|
95
93
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
96
|
-
|
|
97
|
-
export { issue_backlinks_cli }
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { parseArgs } from 'node:util'
|
|
4
|
-
import { git_gh_command } from '#scripts/
|
|
5
|
-
import type { IssueRead } from '#scripts/
|
|
4
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
|
+
import type { IssueRead } from '#scripts/gh/git-gh-issue-read'
|
|
6
6
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
7
7
|
import { z } from 'zod'
|
|
8
8
|
import { issue_cite, type CiteTarget } from './issue-cite'
|
|
@@ -145,12 +145,8 @@ async function main(args: ReadonlyArray<string>): Promise<void> {
|
|
|
145
145
|
|
|
146
146
|
const issue_cite_cli = {
|
|
147
147
|
USAGE,
|
|
148
|
-
main,
|
|
149
148
|
parse_targets,
|
|
150
|
-
parse_title,
|
|
151
|
-
report,
|
|
152
149
|
run,
|
|
153
|
-
to_line,
|
|
154
150
|
}
|
|
155
151
|
|
|
156
152
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
BREAKING_CHANGE_LABEL,
|
|
3
|
-
BUG_LABEL,
|
|
4
|
-
ENHANCEMENT_LABEL,
|
|
5
|
-
has_label_name,
|
|
6
|
-
} from '#scripts/git/issue-labels'
|
|
7
1
|
import { issue_bug_label } from './issue-bug-label'
|
|
2
|
+
import { BREAKING_CHANGE_LABEL, BUG_LABEL, ENHANCEMENT_LABEL, has_label_name } from './issue-labels'
|
|
8
3
|
import { markdown_section } from './markdown-section'
|
|
9
4
|
|
|
10
5
|
const FEATURE_DECLARATIONS = ['- 目的: 機能追加', '- 目的: 機能改善']
|
|
@@ -62,10 +57,7 @@ function problems(body: string): ReadonlyArray<string> {
|
|
|
62
57
|
}
|
|
63
58
|
|
|
64
59
|
const issue_classification = {
|
|
65
|
-
BREAKING_DECLARATION,
|
|
66
60
|
CLASSIFICATION_LABELS,
|
|
67
|
-
FEATURE_DECLARATIONS,
|
|
68
|
-
NON_BUG_DECLARATION,
|
|
69
61
|
labels_for,
|
|
70
62
|
problems,
|
|
71
63
|
required_labels,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
|
+
import { git_gh_repo } from '#scripts/gh/git-gh-repo'
|
|
1
4
|
import { git_closes_keyword } from '#scripts/git/git-closes-keyword'
|
|
2
|
-
import { git_gh_api_path } from '#scripts/git/git-gh-api-path'
|
|
3
|
-
import { git_gh_exec } from '#scripts/git/git-gh-exec'
|
|
4
|
-
import { git_gh_repo } from '#scripts/git/git-gh-repo'
|
|
5
5
|
import { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
6
6
|
import { z } from 'zod'
|
|
7
7
|
|
|
@@ -88,6 +88,6 @@ async function read_closing_pr(issue: string): Promise<string | undefined> {
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
const issue_closing_pr = {
|
|
91
|
+
const issue_closing_pr = { read_closing_pr }
|
|
92
92
|
|
|
93
93
|
export { issue_closing_pr }
|
|
@@ -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 { cli_body } from '#scripts/josh/cli-body'
|
|
5
5
|
import { error_text } from '#scripts/lib/error-message'
|
|
6
6
|
|
|
@@ -89,7 +89,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
89
89
|
process.exitCode = await run(argv)
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
const issue_comment_cli = { USAGE,
|
|
92
|
+
const issue_comment_cli = { USAGE, run }
|
|
93
93
|
|
|
94
94
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
95
95
|
|
|
@@ -3,10 +3,10 @@ import { readFile } from 'node:fs/promises'
|
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
4
|
import { repo_party } from '#scripts/discovery/repo-party'
|
|
5
5
|
import { epic_bundle_cli } from '#scripts/epic/epic-bundle-cli'
|
|
6
|
-
import { git_gh_command } from '#scripts/
|
|
7
|
-
import { git_gh_exec } from '#scripts/
|
|
8
|
-
import { git_gh_issue_write } from '#scripts/
|
|
9
|
-
import { github_issue_url } from '#scripts/
|
|
6
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
7
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
8
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
9
|
+
import { github_issue_url } from '#scripts/gh/github-issue-url'
|
|
10
10
|
import { error_text } from '#scripts/lib/error-message'
|
|
11
11
|
import { issue_file, type FileArguments } from './issue-file'
|
|
12
12
|
import { issue_lint_cli } from './issue-lint-cli'
|
|
@@ -182,7 +182,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
182
182
|
process.exitCode = await run(argv)
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
const issue_file_cli = {
|
|
185
|
+
const issue_file_cli = { THIRD_PARTY_MESSAGE, run }
|
|
186
186
|
|
|
187
187
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
188
188
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { parseArgs } from 'node:util'
|
|
2
2
|
import { epic_issue } from '#scripts/epic/epic-issue'
|
|
3
|
-
import { github_issue_url } from '#scripts/
|
|
4
|
-
import { DEPTH_LABEL_ORDER, FILING_ROUTE_LABELS, has_label_name } from '#scripts/git/issue-labels'
|
|
3
|
+
import { github_issue_url } from '#scripts/gh/github-issue-url'
|
|
5
4
|
import { issue_backlinks } from './issue-backlinks'
|
|
6
5
|
import { issue_classification } from './issue-classification'
|
|
6
|
+
import { DEPTH_LABEL_ORDER, FILING_ROUTE_LABELS, has_label_name } from './issue-labels'
|
|
7
7
|
import { markdown_section } from './markdown-section'
|
|
8
8
|
|
|
9
9
|
// The decisions behind `josh issue:file` (joshuafolkken/kit#2808), kept apart from the command that
|
|
@@ -90,7 +90,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
90
90
|
process.exitCode = await run(argv)
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
const issue_fold_cli = {
|
|
93
|
+
const issue_fold_cli = { read_arguments, size_verdict, run }
|
|
94
94
|
|
|
95
95
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
96
96
|
|
|
@@ -74,7 +74,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
74
74
|
process.exitCode = await run(argv)
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
const issue_fold_existing_cli = { run
|
|
77
|
+
const issue_fold_existing_cli = { run }
|
|
78
78
|
|
|
79
79
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
80
80
|
|
|
@@ -6,6 +6,11 @@ const BUG_LABEL = 'bug'
|
|
|
6
6
|
const ENHANCEMENT_LABEL = 'enhancement'
|
|
7
7
|
const BREAKING_CHANGE_LABEL = 'breaking-change'
|
|
8
8
|
const IN_PROGRESS_LABEL = 'in-progress'
|
|
9
|
+
// Applied by `kickoff` once its plan is on the issue, so the next command's `run:entry` reads the issue
|
|
10
|
+
// as planned and starts at the implementation rather than planning again (joshuafolkken/kit#3042).
|
|
11
|
+
// Namespaced like `run:solo`: a bare `planned` is a common roadmap label a person may already apply,
|
|
12
|
+
// and reading one as kickoff's mark would skip the planning that never happened.
|
|
13
|
+
const PLANNED_LABEL = 'run:planned'
|
|
9
14
|
// Parks a child that cannot advance without a person deciding something. `epic:next` is what reads
|
|
10
15
|
// it: a parked child is why a run reports "nothing left that time will fix" rather than waiting
|
|
11
16
|
// forever (joshuafolkken/kit#860).
|
|
@@ -207,6 +212,7 @@ const WORKFLOW_LABELS: ReadonlyArray<LabelDefinition> = [
|
|
|
207
212
|
description: 'Tracks a batch of child issues from one split',
|
|
208
213
|
},
|
|
209
214
|
{ name: IN_PROGRESS_LABEL, color: '0075ca', description: 'Work is actively in progress' },
|
|
215
|
+
{ name: PLANNED_LABEL, color: 'c2e0c6', description: 'kickoff posted the plan' },
|
|
210
216
|
{
|
|
211
217
|
name: RUN_SOLO_LABEL,
|
|
212
218
|
color: 'b60205',
|
|
@@ -328,6 +334,7 @@ const ALL_LABELS: ReadonlySet<string> = new Set([
|
|
|
328
334
|
ENHANCEMENT_LABEL,
|
|
329
335
|
BREAKING_CHANGE_LABEL,
|
|
330
336
|
IN_PROGRESS_LABEL,
|
|
337
|
+
PLANNED_LABEL,
|
|
331
338
|
NEEDS_DECISION_LABEL,
|
|
332
339
|
AUTO_OK_LABEL,
|
|
333
340
|
NEEDS_HUMAN_REVIEW_LABEL,
|
|
@@ -375,6 +382,7 @@ export {
|
|
|
375
382
|
NEEDS_HUMAN_REVIEW_LABEL,
|
|
376
383
|
NOT_DIRECTLY_RUNNABLE_LABELS,
|
|
377
384
|
OTHER_CHANGE_LABEL,
|
|
385
|
+
PLANNED_LABEL,
|
|
378
386
|
PRIORITY_HIGH_LABEL,
|
|
379
387
|
RELEASE_CLASSIFICATION_LABELS,
|
|
380
388
|
RELEASE_CLASSIFICATION_NAMES,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { git_gh_api_path } from '#scripts/
|
|
2
|
-
import { git_gh_exec } from '#scripts/
|
|
1
|
+
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
3
|
|
|
4
4
|
// Whether an issue was closed by a merge, read from its REST timeline (joshuafolkken/kit#2701). The
|
|
5
5
|
// issue's own `state_reason` cannot tell: a pull request's `closes #N` and a person's "Close as
|
|
@@ -83,7 +83,7 @@ function rank<T>(items: ReadonlyArray<T>, row_of: (item: T) => RankRow): Array<T
|
|
|
83
83
|
.map((entry) => entry.item)
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
const issue_rank = {
|
|
86
|
+
const issue_rank = { count_dependents, rank }
|
|
87
87
|
|
|
88
88
|
export { issue_rank }
|
|
89
89
|
export type { DependencyRow, RankRow }
|
|
@@ -1,8 +1,9 @@
|
|
|
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 { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
5
5
|
import { issue_read, type IssueComment, type IssueFields } from './issue-read'
|
|
6
|
+
import { issue_report_failures, type ReadFailureKind } from './issue-report-failures'
|
|
6
7
|
|
|
7
8
|
// `josh issue:read <N> [<N> ...]` — the body *and* the comments of every issue named, in one call
|
|
8
9
|
// (joshuafolkken/kit#1715).
|
|
@@ -25,7 +26,6 @@ import { issue_read, type IssueComment, type IssueFields } from './issue-read'
|
|
|
25
26
|
// "no comments" — the block says which of the two it holds, because §2g's rule is that the later text
|
|
26
27
|
// wins, and a comment nobody read cannot win anything.
|
|
27
28
|
|
|
28
|
-
const SUCCESS_EXIT_CODE = 0
|
|
29
29
|
const FAILURE_EXIT_CODE = 1
|
|
30
30
|
const ARGV_OFFSET = 2
|
|
31
31
|
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
@@ -35,8 +35,7 @@ const BLOCK_SEPARATOR = '\n\n---\n\n'
|
|
|
35
35
|
// process, and an unbounded fan-out is answered with secondary rate limiting rather than with issues.
|
|
36
36
|
const READ_CONCURRENCY = 8
|
|
37
37
|
const ISSUE_FIELDS = 'title,state,body'
|
|
38
|
-
|
|
39
|
-
type ReadFailureKind = 'missing' | 'unreadable'
|
|
38
|
+
const FAILURE_TERMS = { success_kind: 'issue', misreading: 'the issue is empty' } as const
|
|
40
39
|
|
|
41
40
|
interface IssueContent {
|
|
42
41
|
fields: IssueFields
|
|
@@ -69,16 +68,6 @@ function parse_numbers(argv: ReadonlyArray<string>): ReadonlyArray<string> | und
|
|
|
69
68
|
return [...new Set(numbers)]
|
|
70
69
|
}
|
|
71
70
|
|
|
72
|
-
function report_failure(kind: ReadFailureKind, issue_number: string): void {
|
|
73
|
-
if (kind === 'missing') {
|
|
74
|
-
console.error(`✖ issue #${issue_number} does not resolve — check the number and the repository`)
|
|
75
|
-
} else {
|
|
76
|
-
console.error(
|
|
77
|
-
`✖ could not read issue #${issue_number} — a rate limit, expired auth, or a dropped connection. This is not "the issue is empty"`,
|
|
78
|
-
)
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
71
|
// The comments are read beside the fields rather than after them: the two requests need nothing from
|
|
83
72
|
// one another, and reading them in sequence would put back one of the two round trips this command
|
|
84
73
|
// exists to remove.
|
|
@@ -126,34 +115,6 @@ function issue_blocks(report: IssueReport): ReadonlyArray<string> {
|
|
|
126
115
|
return [issue_read.format_issue(report.issue_number, fields, comments)]
|
|
127
116
|
}
|
|
128
117
|
|
|
129
|
-
function print_issues(reports: ReadonlyArray<IssueReport>): void {
|
|
130
|
-
const blocks = reports.flatMap((report) => issue_blocks(report))
|
|
131
|
-
|
|
132
|
-
if (blocks.length === 0) return
|
|
133
|
-
|
|
134
|
-
console.info(blocks.join(BLOCK_SEPARATOR))
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function report_one_failure(report: IssueReport): boolean {
|
|
138
|
-
if (report.result.kind === 'issue') return false
|
|
139
|
-
|
|
140
|
-
report_failure(report.result.kind, report.issue_number)
|
|
141
|
-
|
|
142
|
-
return true
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Every number that produced no issue is named, so a caller is told which ones it has no answer for
|
|
146
|
-
// rather than being left to subtract the printed blocks from what it asked.
|
|
147
|
-
function report_failures(reports: ReadonlyArray<IssueReport>): number {
|
|
148
|
-
let has_failure = false
|
|
149
|
-
|
|
150
|
-
for (const report of reports) {
|
|
151
|
-
has_failure = report_one_failure(report) || has_failure
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return has_failure ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
155
|
-
}
|
|
156
|
-
|
|
157
118
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
158
119
|
const issue_numbers = parse_numbers(argv)
|
|
159
120
|
|
|
@@ -165,9 +126,12 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
165
126
|
|
|
166
127
|
const reports = await read_all(issue_numbers)
|
|
167
128
|
|
|
168
|
-
|
|
129
|
+
issue_report_failures.print_blocks(
|
|
130
|
+
reports.flatMap((report) => issue_blocks(report)),
|
|
131
|
+
BLOCK_SEPARATOR,
|
|
132
|
+
)
|
|
169
133
|
|
|
170
|
-
return report_failures(reports)
|
|
134
|
+
return issue_report_failures.report_failures(reports, FAILURE_TERMS)
|
|
171
135
|
}
|
|
172
136
|
|
|
173
137
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
@@ -175,10 +139,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
175
139
|
}
|
|
176
140
|
|
|
177
141
|
const issue_read_cli = {
|
|
178
|
-
BLOCK_SEPARATOR,
|
|
179
|
-
ISSUE_FIELDS,
|
|
180
142
|
USAGE,
|
|
181
|
-
main,
|
|
182
143
|
parse_numbers,
|
|
183
144
|
read_block,
|
|
184
145
|
run,
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// The failure report `issue:read` and `issue:state` share (joshuafolkken/kit#3046). Both read a batch
|
|
2
|
+
// of numbers, print a block for each one that answered, and name every one that did not; only the
|
|
3
|
+
// result kind that counts as an answer and what a gap must not be mistaken for differ between them.
|
|
4
|
+
|
|
5
|
+
const SUCCESS_EXIT_CODE = 0
|
|
6
|
+
const FAILURE_EXIT_CODE = 1
|
|
7
|
+
|
|
8
|
+
// The two failure kinds a read can end in, kept apart all the way to the report: `missing` is the
|
|
9
|
+
// number resolving to nothing and `unreadable` is a read that failed, and the documents ask a
|
|
10
|
+
// caller to report the two differently. Folding them together to simplify the batch would destroy
|
|
11
|
+
// exactly that distinction.
|
|
12
|
+
type ReadFailureKind = 'missing' | 'unreadable'
|
|
13
|
+
|
|
14
|
+
interface NumberReport<K extends string> {
|
|
15
|
+
issue_number: string
|
|
16
|
+
result: { kind: K | ReadFailureKind }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface FailureTerms<K extends string> {
|
|
20
|
+
success_kind: K
|
|
21
|
+
// What a failed read would be misread as if it were printed silently — "the issue is empty".
|
|
22
|
+
misreading: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function print_blocks(blocks: ReadonlyArray<string>, separator: string): void {
|
|
26
|
+
if (blocks.length === 0) return
|
|
27
|
+
|
|
28
|
+
console.info(blocks.join(separator))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// A number that resolves to nothing is an answer — a typo, or another repository's number quoted in
|
|
32
|
+
// prose — and it is reported as one. Everything else is a gap, and the message says so, because the
|
|
33
|
+
// caller's next move differs: a gap is retried, an answer is not.
|
|
34
|
+
function report_failure(kind: ReadFailureKind, issue_number: string, misreading: string): void {
|
|
35
|
+
if (kind === 'missing') {
|
|
36
|
+
console.error(`✖ issue #${issue_number} does not resolve — check the number and the repository`)
|
|
37
|
+
} else {
|
|
38
|
+
console.error(
|
|
39
|
+
`✖ could not read issue #${issue_number} — a rate limit, expired auth, or a dropped connection. This is not "${misreading}"`,
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function is_failure_kind(kind: string): kind is ReadFailureKind {
|
|
45
|
+
return kind === 'missing' || kind === 'unreadable'
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function report_one_failure<K extends string>(
|
|
49
|
+
report: NumberReport<K>,
|
|
50
|
+
terms: FailureTerms<K>,
|
|
51
|
+
): boolean {
|
|
52
|
+
const { kind } = report.result
|
|
53
|
+
|
|
54
|
+
if (!is_failure_kind(kind)) return false
|
|
55
|
+
|
|
56
|
+
report_failure(kind, report.issue_number, terms.misreading)
|
|
57
|
+
|
|
58
|
+
return true
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Every number that produced no answer is named, so a caller is told which ones it has no answer for
|
|
62
|
+
// rather than being left to subtract the printed blocks from what it asked. A single failure makes
|
|
63
|
+
// the exit code non-zero.
|
|
64
|
+
function report_failures<K extends string>(
|
|
65
|
+
reports: ReadonlyArray<NumberReport<K>>,
|
|
66
|
+
terms: FailureTerms<K>,
|
|
67
|
+
): number {
|
|
68
|
+
let has_failure = false
|
|
69
|
+
|
|
70
|
+
for (const report of reports) {
|
|
71
|
+
has_failure = report_one_failure(report, terms) || has_failure
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return has_failure ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const issue_report_failures = { print_blocks, report_failures }
|
|
78
|
+
|
|
79
|
+
export type { ReadFailureKind }
|
|
80
|
+
export { issue_report_failures }
|
|
@@ -5,7 +5,7 @@ import { epic_audit_logic } from '#scripts/epic/epic-audit'
|
|
|
5
5
|
import { epic_bundle, type BacklogIssue, type BundleDecision } from '#scripts/epic/epic-bundle'
|
|
6
6
|
import { epic_bundle_cli } from '#scripts/epic/epic-bundle-cli'
|
|
7
7
|
import { epic_bundle_gaps } from '#scripts/epic/epic-bundle-gaps'
|
|
8
|
-
import { git_gh_command } from '#scripts/
|
|
8
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
9
9
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
10
10
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
11
11
|
import {
|
|
@@ -403,16 +403,10 @@ const issue_scout_cli = {
|
|
|
403
403
|
NO_REFERENCE_LINE,
|
|
404
404
|
CLOSED_UNREADABLE_LINE,
|
|
405
405
|
CLOSED_CEILING_LINE,
|
|
406
|
-
DRAFT_NUMBER,
|
|
407
406
|
read_arguments,
|
|
408
407
|
with_draft_body,
|
|
409
|
-
draft_of,
|
|
410
|
-
format_duplicates,
|
|
411
|
-
format_epic_decision,
|
|
412
|
-
format_report,
|
|
413
408
|
scout,
|
|
414
409
|
run,
|
|
415
|
-
main,
|
|
416
410
|
}
|
|
417
411
|
|
|
418
412
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -1,9 +1,9 @@
|
|
|
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 { PAGE_CEILING_CAUSE } from '#scripts/git/listing-cutoff'
|
|
4
3
|
import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
|
|
5
4
|
import { issue_label_schema } from '#scripts/git/schemas'
|
|
6
5
|
import { z } from 'zod'
|
|
6
|
+
import { EPIC_LABEL, has_any_label } from './issue-labels'
|
|
7
7
|
import type { ScoutIssue } from './issue-scout'
|
|
8
8
|
|
|
9
9
|
// The closed half of `issue:scout`'s duplicate scan (joshuafolkken/kit#1679), held apart from the CLI
|
|
@@ -1,7 +1,8 @@
|
|
|
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 { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
5
|
+
import { issue_report_failures, type ReadFailureKind } from './issue-report-failures'
|
|
5
6
|
import { issue_state, type IssueState } from './issue-state'
|
|
6
7
|
|
|
7
8
|
// `josh issue:state <N> [<N> ...]` — print each issue's state and labels, in the spelling the
|
|
@@ -25,7 +26,6 @@ import { issue_state, type IssueState } from './issue-state'
|
|
|
25
26
|
// answer as "not CLOSED" would report a child as failed because nobody could reach GitHub. The two
|
|
26
27
|
// are told apart here and neither is a state.
|
|
27
28
|
|
|
28
|
-
const SUCCESS_EXIT_CODE = 0
|
|
29
29
|
const FAILURE_EXIT_CODE = 1
|
|
30
30
|
const ARGV_OFFSET = 2
|
|
31
31
|
const REPO_FLAG = '--repo'
|
|
@@ -43,18 +43,13 @@ const READ_CONCURRENCY = 8
|
|
|
43
43
|
// The two fields, under the names `gh issue view --json` gave them. `git-gh-issue-rest.ts` maps them
|
|
44
44
|
// back from REST, which is what keeps `OPEN` / `CLOSED` / `MERGED` out of this file.
|
|
45
45
|
const STATE_FIELDS = 'state,labels'
|
|
46
|
+
const FAILURE_TERMS = { success_kind: 'state', misreading: 'the issue is open' } as const
|
|
46
47
|
|
|
47
48
|
interface StateRequest {
|
|
48
49
|
issue_numbers: ReadonlyArray<string>
|
|
49
50
|
repo?: string
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
// The two failure kinds a read can end in, kept apart all the way to the report: `missing` is the
|
|
53
|
-
// number resolving to nothing and `unreadable` is a read that failed, and the documents ask a
|
|
54
|
-
// caller to report the two differently. Folding them together to simplify the batch would destroy
|
|
55
|
-
// exactly that distinction.
|
|
56
|
-
type ReadFailureKind = 'missing' | 'unreadable'
|
|
57
|
-
|
|
58
53
|
// One issue's state, or the failure kind. Named for export because `run:prep` reads the state beside
|
|
59
54
|
// the body and the dependency-update scope (joshuafolkken/kit#1978), reusing this read rather than a
|
|
60
55
|
// second one that would drift from the `human_review` decision `parse_issue_state` owns.
|
|
@@ -146,19 +141,6 @@ function parse_request(argv: ReadonlyArray<string>): StateRequest | undefined {
|
|
|
146
141
|
return repo_flag.kind === 'named' ? { issue_numbers, repo: repo_flag.repo } : { issue_numbers }
|
|
147
142
|
}
|
|
148
143
|
|
|
149
|
-
// A number that resolves to nothing is an answer — a typo, or another repository's number quoted in
|
|
150
|
-
// prose — and it is reported as one. Everything else is a gap, and the message says so, because the
|
|
151
|
-
// caller's next move differs: a gap is retried, an answer is not.
|
|
152
|
-
function report_failure(kind: ReadFailureKind, issue_number: string): void {
|
|
153
|
-
if (kind === 'missing') {
|
|
154
|
-
console.error(`✖ issue #${issue_number} does not resolve — check the number and the repository`)
|
|
155
|
-
} else {
|
|
156
|
-
console.error(
|
|
157
|
-
`✖ could not read issue #${issue_number} — a rate limit, expired auth, or a dropped connection. This is not "the issue is open"`,
|
|
158
|
-
)
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
144
|
// One number's read, reduced to what the report needs and nothing printed yet. Separating the two
|
|
163
145
|
// is what lets the whole batch be in flight at once: the numbers are independent, so reading them
|
|
164
146
|
// one after the other spends a round trip per number for no reason.
|
|
@@ -206,30 +188,7 @@ function print_states(reports: ReadonlyArray<IssueReport>): void {
|
|
|
206
188
|
const should_attribute = reports.length > 1
|
|
207
189
|
const blocks = reports.flatMap((report) => state_blocks(report, should_attribute))
|
|
208
190
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
console.info(blocks.join(BLOCK_SEPARATOR))
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
function report_one_failure(report: IssueReport): boolean {
|
|
215
|
-
if (report.result.kind === 'state') return false
|
|
216
|
-
|
|
217
|
-
report_failure(report.result.kind, report.issue_number)
|
|
218
|
-
|
|
219
|
-
return true
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Every number that produced no state is named, so a caller is told which ones it has no answer for
|
|
223
|
-
// rather than being left to subtract the printed blocks from what it asked. A single failure still
|
|
224
|
-
// makes the exit code non-zero, exactly as it did when only one number could be passed.
|
|
225
|
-
function report_failures(reports: ReadonlyArray<IssueReport>): number {
|
|
226
|
-
let has_failure = false
|
|
227
|
-
|
|
228
|
-
for (const report of reports) {
|
|
229
|
-
has_failure = report_one_failure(report) || has_failure
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
return has_failure ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
191
|
+
issue_report_failures.print_blocks(blocks, BLOCK_SEPARATOR)
|
|
233
192
|
}
|
|
234
193
|
|
|
235
194
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
@@ -245,7 +204,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
245
204
|
|
|
246
205
|
print_states(reports)
|
|
247
206
|
|
|
248
|
-
return report_failures(reports)
|
|
207
|
+
return issue_report_failures.report_failures(reports, FAILURE_TERMS)
|
|
249
208
|
}
|
|
250
209
|
|
|
251
210
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { has_any_label, NEEDS_HUMAN_REVIEW_LABEL } from '#scripts/git/issue-labels'
|
|
2
1
|
import { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
3
2
|
import { z } from 'zod'
|
|
3
|
+
import { has_any_label, NEEDS_HUMAN_REVIEW_LABEL } from './issue-labels'
|
|
4
4
|
|
|
5
5
|
// The answer `josh issue:state` prints, kept apart from the reading and the printing so the shape of
|
|
6
6
|
// the report is decided by one pure function (joshuafolkken/kit#1054).
|
|
@@ -96,10 +96,6 @@ function format_attributed_issue_state(issue_number: string, state: IssueState):
|
|
|
96
96
|
|
|
97
97
|
const issue_state = {
|
|
98
98
|
NO_LABELS,
|
|
99
|
-
STATE_LABEL,
|
|
100
|
-
LABELS_LABEL,
|
|
101
|
-
HUMAN_REVIEW_LABEL_LINE,
|
|
102
|
-
ISSUE_LABEL,
|
|
103
99
|
parse_issue_state,
|
|
104
100
|
format_issue_state,
|
|
105
101
|
format_attributed_issue_state,
|
|
@@ -68,6 +68,6 @@ function section_lines(body: string, heading: string): ReadonlyArray<string> {
|
|
|
68
68
|
return end === -1 ? rest : rest.slice(0, end)
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
const markdown_section = { section_lines,
|
|
71
|
+
const markdown_section = { section_lines, has_line, has_unfenced_line }
|
|
72
72
|
|
|
73
73
|
export { markdown_section }
|
|
@@ -90,7 +90,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
90
90
|
process.exitCode = await run(argv[0], new Date())
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
const measure_rerun_cli = { run
|
|
93
|
+
const measure_rerun_cli = { run }
|
|
94
94
|
|
|
95
95
|
const ARGV_OFFSET = 2
|
|
96
96
|
|
|
@@ -53,7 +53,7 @@ function has_command_output(body: string, heading: string = REPRODUCTION_HEADING
|
|
|
53
53
|
return reproduction.has_command && reproduction.has_output
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
const reproduction_measure = {
|
|
56
|
+
const reproduction_measure = { has_command_output }
|
|
57
57
|
|
|
58
58
|
export type { Reproduction }
|
|
59
59
|
export { reproduction_measure }
|
package/scripts/josh/cli-body.ts
CHANGED