@joshuafolkken/kit 1.1035.0 → 1.1094.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/verify-ui/SKILL.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +21 -13
- package/.claude/skills/workflow-commands/background-commands.md +5 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
- package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
- package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +6 -4
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +3 -3
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +3 -2
- package/.claude/skills/workflow-commands/halfrun.md +16 -19
- package/.claude/skills/workflow-commands/issue-comments.md +2 -2
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +1 -1
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +44 -89
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +24 -4
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +21 -0
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +42 -48
- package/.github/workflows/sonar-qube.yml +37 -4
- package/AGENTS.md +12 -2
- package/CLAUDE.md +15 -16
- package/GEMINI.md +14 -2
- package/README.md +59 -18
- package/SECURITY.md +36 -6
- package/cspell/index.yaml +2 -1
- package/dist/CLAUDE.md +15 -16
- package/dist/config-merge/index.js +15 -3
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
- package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
- package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
- package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
- package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
- package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +15 -34
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +23 -16
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +188 -509
- package/dist/josh.js +166 -225
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +412 -64
- package/eslint/rules/promise.js +5 -0
- package/package.json +13 -8
- package/prompts/collaboration-workflow/file-edits.md +6 -53
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/operating-rules.md +4 -4
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +4 -4
- package/prompts/collaboration-workflow/rule-delivery.md +5 -36
- package/prompts/collaboration-workflow/shell-body.md +7 -9
- package/prompts/collaboration-workflow/turn-batching.md +21 -37
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +36 -36
- package/prompts/collaboration-workflow.md +5 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +12 -4
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +2 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +15 -25
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +32 -22
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +6 -8
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +34 -17
- package/scripts/backlog/backlog-rank.ts +106 -0
- package/scripts/backlog/backlog-ready.ts +19 -3
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +47 -31
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +92 -11
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +0 -3
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +11 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +4 -6
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/document-byte-budget.ts +8 -9
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +13 -4
- package/scripts/document/lane-child-read-set.ts +1 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +1 -0
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +1 -1
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +5 -4
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +20 -30
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +37 -0
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +32 -30
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-command.ts +1 -1
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-execa-error.ts +6 -1
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +24 -6
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push-transport.ts +12 -69
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn.ts +79 -3
- package/scripts/git/git-ssh-keepalive.ts +74 -0
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +4 -2
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-cli.ts +15 -0
- package/scripts/hooks/format-edited-file.ts +4 -9
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard-cli.ts +21 -0
- package/scripts/hooks/pretool-guard.ts +36 -19
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-logic.ts +7 -0
- package/scripts/init/init.ts +0 -3
- package/scripts/init/project-profile.ts +6 -11
- package/scripts/init/start-exec.ts +8 -2
- package/scripts/init/start-plan.ts +18 -5
- package/scripts/init/start-setup-pr.ts +52 -25
- package/scripts/init/start-steps.ts +42 -9
- package/scripts/init/start.ts +40 -10
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +3 -3
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +37 -8
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +19 -3
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +2 -2
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +20 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/issue/issue-rank.ts +89 -0
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +1 -1
- package/scripts/issue/measure-rerun-cli.ts +1 -1
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -102
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +10 -3
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +7 -1
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +2 -2
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +3 -6
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-child-marker.ts +16 -2
- package/scripts/lane/lane-cli.ts +33 -18
- package/scripts/lane/lane-close.ts +1 -3
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +21 -11
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/lane-report.ts +10 -4
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +3 -0
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/lines-command.ts +0 -1
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +0 -2
- package/scripts/propagate/propagate-plan.ts +185 -0
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -3
- package/scripts/propagate/propagate-steps.ts +19 -6
- package/scripts/propagate/propagate-targets.ts +13 -6
- package/scripts/propagate/propagate.ts +60 -46
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +0 -1
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +1 -2
- package/scripts/registry-migration/migrate.ts +19 -9
- package/scripts/release/github-release-cli.ts +8 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +2 -3
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +48 -16
- package/scripts/review/review-brief-cli.ts +72 -8
- package/scripts/review/review-brief.ts +67 -9
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +1 -1
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +6 -2
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +1 -2
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/issue-fold.ts +1 -2
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-carry-conflict.ts +1 -2
- package/scripts/rules/lane-park.ts +14 -8
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/pre-gate-cut.ts +2 -2
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +13 -5
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +1 -1
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +101 -24
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +24 -8
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +25 -5
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +1 -1
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +5 -13
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +143 -0
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +2 -2
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-cli.ts +4 -7
- package/scripts/run/run-progress-clock.ts +6 -34
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +3 -3
- package/scripts/run/run-progress.ts +22 -10
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +27 -77
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +87 -0
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +23 -30
- package/scripts/run/run-ship-review.ts +20 -0
- package/scripts/run/run-ship-scoped.ts +45 -0
- package/scripts/run/run-ship-stage.ts +5 -1
- package/scripts/run/run-ship-steps.ts +105 -0
- package/scripts/run/run-ship.ts +2 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +1 -1
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +2 -1
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -5
- package/scripts/run/run-wake-describe.ts +19 -1
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +9 -7
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +0 -2
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +2 -3
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +97 -0
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-commands.ts +5 -4
- package/scripts/version/version-remote.ts +28 -14
- package/scripts/version/version-targets.ts +4 -4
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/dependabot-auto-merge.yml +5 -3
- package/templates/workflows/github-release.yml +81 -0
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
|
@@ -8,6 +8,7 @@ interface StartOptions {
|
|
|
8
8
|
is_yes: boolean
|
|
9
9
|
is_github: boolean
|
|
10
10
|
visibility: Visibility
|
|
11
|
+
init_command: string | undefined
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
type StartStep = 'git_init' | 'initialize' | 'commit' | 'repository' | 'labels' | 'setup_pr'
|
|
@@ -137,20 +138,31 @@ function github_consent(
|
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
|
|
141
|
+
// A run whose initialize step was handed to a caller's command names that command wherever the step
|
|
142
|
+
// is printed, so the plan, the progress and a failure all say what actually runs (#2872).
|
|
143
|
+
function step_labels(init_command: string | undefined): Readonly<Record<StartStep, string>> {
|
|
144
|
+
if (init_command === undefined) return STEP_LABELS
|
|
145
|
+
|
|
146
|
+
return { ...STEP_LABELS, initialize: `Initialize with ${init_command}` }
|
|
147
|
+
}
|
|
148
|
+
|
|
140
149
|
// What a failed run prints, so the user can tell how far it got before deciding how to resume.
|
|
141
150
|
function progress_report(
|
|
142
151
|
failed: StartStep,
|
|
143
152
|
completed: ReadonlyArray<StartStep>,
|
|
144
153
|
cause: string,
|
|
154
|
+
labels: Readonly<Record<StartStep, string>> = STEP_LABELS,
|
|
145
155
|
): string {
|
|
146
|
-
const done =
|
|
147
|
-
completed.length === 0 ? 'nothing' : completed.map((step) => STEP_LABELS[step]).join('; ')
|
|
156
|
+
const done = completed.length === 0 ? 'nothing' : completed.map((step) => labels[step]).join('; ')
|
|
148
157
|
|
|
149
|
-
return `josh start stopped at: ${
|
|
158
|
+
return `josh start stopped at: ${labels[failed]}\nCompleted: ${done}\nCause: ${cause}`
|
|
150
159
|
}
|
|
151
160
|
|
|
152
|
-
function plan_summary(
|
|
153
|
-
|
|
161
|
+
function plan_summary(
|
|
162
|
+
steps: ReadonlyArray<StartStep>,
|
|
163
|
+
labels: Readonly<Record<StartStep, string>> = STEP_LABELS,
|
|
164
|
+
): string {
|
|
165
|
+
const lines = steps.map((step, index) => ` ${String(index + 1)}. ${labels[step]}`)
|
|
154
166
|
|
|
155
167
|
return ['josh start will:', ...lines].join('\n')
|
|
156
168
|
}
|
|
@@ -161,6 +173,7 @@ const start_plan = {
|
|
|
161
173
|
github_consent,
|
|
162
174
|
progress_report,
|
|
163
175
|
plan_summary,
|
|
176
|
+
step_labels,
|
|
164
177
|
STEP_LABELS,
|
|
165
178
|
}
|
|
166
179
|
export { start_plan }
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { git_gh_api_path } from '#scripts/
|
|
2
|
-
import { git_gh_exec } from '#scripts/
|
|
3
|
-
import { git_gh_issue_write } 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
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
4
|
+
import { git_pr } from '#scripts/gh/git-pr'
|
|
5
|
+
import { github_issue_url } from '#scripts/gh/github-issue-url'
|
|
4
6
|
import { git_issue, type IssueInfo } from '#scripts/git/git-issue'
|
|
5
|
-
import {
|
|
6
|
-
import { github_issue_url } from '#scripts/git/github-issue-url'
|
|
7
|
-
import { IGNORE_FOR_RELEASE_LABEL } from '#scripts/git/issue-labels'
|
|
7
|
+
import { IGNORE_FOR_RELEASE_LABEL } from '#scripts/issue/issue-labels'
|
|
8
8
|
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
9
9
|
import { kit_written_paths } from './kit-written-paths'
|
|
10
10
|
import { start_exec } from './start-exec'
|
|
@@ -12,15 +12,22 @@ import { start_exec } from './start-exec'
|
|
|
12
12
|
const SETUP_TITLE = `Set up ${KIT_PACKAGE_NAME}`
|
|
13
13
|
const SETUP_BODY = [
|
|
14
14
|
`Adds the files \`josh start\` wrote while setting up ${KIT_PACKAGE_NAME}, so main carries the`,
|
|
15
|
-
'rules, settings and workflows every later Issue is run with. Only the files
|
|
16
|
-
'pull request; anything else in the working tree is left as it was.',
|
|
15
|
+
'rules, settings and workflows every later Issue is run with. Only the files the setup wrote are in',
|
|
16
|
+
'the pull request; anything else in the working tree is left as it was.',
|
|
17
17
|
].join('\n')
|
|
18
|
+
const NAME_ONLY = '--name-only'
|
|
18
19
|
const NOTHING_TO_COMMIT = 'The kit setup has no changes to commit, so no pull request was opened.'
|
|
19
20
|
const OPEN_SETUP_ISSUES_QUERY = `?state=open&labels=${IGNORE_FOR_RELEASE_LABEL}&per_page=100`
|
|
20
21
|
const FIRST_SETUP_ISSUE_FILTER = `[.[] | select(.title == "${SETUP_TITLE}") | .number][0] // empty`
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
// Listings are read NUL-separated (`-z`), so a path is never quoted — a name a caller's initialize
|
|
24
|
+
// command wrote need not be ASCII the way kit's own are (#2872).
|
|
25
|
+
function paths_of(output: string | undefined): Array<string> {
|
|
26
|
+
return (output ?? '').split('\0').filter((listed) => listed.length > 0)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function listing(args: ReadonlyArray<string>, root: string): Array<string> {
|
|
30
|
+
return paths_of(start_exec.read_output('git', [...args, '-z'], root))
|
|
24
31
|
}
|
|
25
32
|
|
|
26
33
|
function setup_issue(issue_number: string): IssueInfo {
|
|
@@ -42,17 +49,18 @@ function is_setup_branch(branch: string | undefined): boolean {
|
|
|
42
49
|
}
|
|
43
50
|
|
|
44
51
|
// Untracked files the ignore rules let through, plus tracked files the setup changed — two plain
|
|
45
|
-
// listings, so nothing has to be parsed out of `git status`.
|
|
46
|
-
// quoting of other names never hides one.
|
|
52
|
+
// listings, so nothing has to be parsed out of `git status`.
|
|
47
53
|
function changed_paths(root: string): Array<string> {
|
|
48
|
-
const untracked =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
const untracked = listing(['ls-files', '--others', '--exclude-standard'], root)
|
|
55
|
+
const modified = listing(['diff', NAME_ONLY, 'HEAD'], root)
|
|
56
|
+
|
|
57
|
+
return [...untracked, ...modified]
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// On the setup branch a failed commit left, that run's `git add` already staged its files, so they
|
|
61
|
+
// read as changed before this run's command ran — the staged ones count as setup output (#2872).
|
|
62
|
+
function carried_paths(root: string, current: string | undefined): Array<string> {
|
|
63
|
+
return is_setup_branch(current) ? listing(['diff', NAME_ONLY, '--cached'], root) : []
|
|
56
64
|
}
|
|
57
65
|
|
|
58
66
|
// The Issue carries the release classification the pull request is opened with, so the PR step finds
|
|
@@ -113,10 +121,30 @@ function commit_kit_paths(paths: ReadonlyArray<string>, issue: IssueInfo, root:
|
|
|
113
121
|
start_exec.run('git', ['commit', '--message', issue.commit_message, '--', ...paths], root)
|
|
114
122
|
}
|
|
115
123
|
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
124
|
+
// A caller's initialize command writes files kit cannot name, so with a `baseline` — what was already
|
|
125
|
+
// changed before that command ran — everything changed since joins kit's own files, while a change
|
|
126
|
+
// the user had made before the run still stays out (#2872).
|
|
127
|
+
function setup_paths(
|
|
128
|
+
root: string,
|
|
129
|
+
baseline: ReadonlyArray<string> | undefined,
|
|
130
|
+
current: string | undefined,
|
|
131
|
+
): Array<string> {
|
|
132
|
+
const changed = changed_paths(root)
|
|
133
|
+
const kit_paths = kit_written_paths.select(changed)
|
|
134
|
+
|
|
135
|
+
if (baseline === undefined) return kit_paths
|
|
136
|
+
|
|
137
|
+
const carried = carried_paths(root, current)
|
|
138
|
+
const written = changed.filter((path) => !baseline.includes(path) || carried.includes(path))
|
|
139
|
+
|
|
140
|
+
return [...new Set([...kit_paths, ...written])]
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Issue → branch → only the setup's files committed → push → pull request. The merge is left to a
|
|
144
|
+
// person: it is the one step that changes main.
|
|
145
|
+
async function open(root: string, baseline?: ReadonlyArray<string>): Promise<void> {
|
|
146
|
+
const current = start_exec.read_output('git', ['symbolic-ref', '--short', 'HEAD'], root)
|
|
147
|
+
const paths = setup_paths(root, baseline, current)
|
|
120
148
|
|
|
121
149
|
if (paths.length === 0) {
|
|
122
150
|
console.info(NOTHING_TO_COMMIT)
|
|
@@ -124,7 +152,6 @@ async function open(root: string): Promise<void> {
|
|
|
124
152
|
return
|
|
125
153
|
}
|
|
126
154
|
|
|
127
|
-
const current = start_exec.read_output('git', ['symbolic-ref', '--short', 'HEAD'], root)
|
|
128
155
|
const issue = resolve_issue(current)
|
|
129
156
|
|
|
130
157
|
switch_to(issue.branch_name, current, root)
|
|
@@ -2,6 +2,7 @@ import path from 'node:path'
|
|
|
2
2
|
import { error_text } from '#scripts/lib/error-message'
|
|
3
3
|
import { repository_labels } from '#scripts/repo/repository-labels'
|
|
4
4
|
import { self_sync_guard } from '#scripts/self-sync-guard/self-sync-guard-logic'
|
|
5
|
+
import { parseCommandString } from 'execa'
|
|
5
6
|
import { main as init_main } from './init'
|
|
6
7
|
import { PACKAGE_DIR } from './init-paths'
|
|
7
8
|
import { kit_setup_state } from './kit-setup-state'
|
|
@@ -14,6 +15,11 @@ interface StepContext {
|
|
|
14
15
|
root: string
|
|
15
16
|
profile: ProjectProfile
|
|
16
17
|
visibility: Visibility
|
|
18
|
+
init_command: string | undefined
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface RunContext extends StepContext {
|
|
22
|
+
baseline: ReadonlyArray<string> | undefined
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
const DEFAULT_BRANCH = 'main'
|
|
@@ -22,7 +28,7 @@ const GH_INSTALL_HINT =
|
|
|
22
28
|
const GH_AUTH_HINT =
|
|
23
29
|
'GitHub CLI is not signed in. Run gh auth login, then run josh start again. Nothing was changed.'
|
|
24
30
|
|
|
25
|
-
const { succeeds, read_output, run } = start_exec
|
|
31
|
+
const { succeeds, read_output, run, run_local } = start_exec
|
|
26
32
|
|
|
27
33
|
function read_git_state(root: string, shape: ProjectShape): GitState {
|
|
28
34
|
const { has_git, has_github } = shape
|
|
@@ -67,8 +73,19 @@ function create_git_repository(context: StepContext): void {
|
|
|
67
73
|
}
|
|
68
74
|
|
|
69
75
|
// The same setup `josh init` runs, called rather than copied, with the profile the user confirmed.
|
|
76
|
+
// A toolkit that layers its files over kit's (`josh-app init`) names its own setup instead, so every
|
|
77
|
+
// other step and guard stays here rather than in a copy of this command (#2872). That command runs
|
|
78
|
+
// without a shell, is given the same profile, and a non-zero exit stops the run before the commit.
|
|
70
79
|
function initialize(context: StepContext): void {
|
|
71
|
-
|
|
80
|
+
if (context.init_command === undefined) {
|
|
81
|
+
init_main(['--profile', context.profile])
|
|
82
|
+
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const [command = '', ...args] = parseCommandString(context.init_command)
|
|
87
|
+
|
|
88
|
+
run_local(command, [...args, '--profile', context.profile], context.root)
|
|
72
89
|
}
|
|
73
90
|
|
|
74
91
|
function commit_all(context: StepContext): void {
|
|
@@ -97,11 +114,22 @@ function add_missing_labels(): void {
|
|
|
97
114
|
|
|
98
115
|
// Main already has a history here, so the setup reaches it the way every other change does: through
|
|
99
116
|
// an Issue and a pull request a person merges (joshuafolkken/kit#2816).
|
|
100
|
-
async function open_setup_pull_request(context:
|
|
101
|
-
await start_setup_pr.open(context.root)
|
|
117
|
+
async function open_setup_pull_request(context: RunContext): Promise<void> {
|
|
118
|
+
await start_setup_pr.open(context.root, context.baseline)
|
|
102
119
|
}
|
|
103
120
|
|
|
104
|
-
|
|
121
|
+
// What was already changed before a caller's initialize command ran, read only when the setup pull
|
|
122
|
+
// request will need to tell that command's files from the user's own (#2872).
|
|
123
|
+
function baseline_of(
|
|
124
|
+
steps: ReadonlyArray<StartStep>,
|
|
125
|
+
context: StepContext,
|
|
126
|
+
): ReadonlyArray<string> | undefined {
|
|
127
|
+
if (context.init_command === undefined || !steps.includes('setup_pr')) return undefined
|
|
128
|
+
|
|
129
|
+
return start_setup_pr.changed_paths(context.root)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
type StepAction = (context: RunContext) => void | Promise<void>
|
|
105
133
|
|
|
106
134
|
const STEP_ACTIONS: Readonly<Record<StartStep, StepAction>> = {
|
|
107
135
|
git_init: create_git_repository,
|
|
@@ -114,24 +142,29 @@ const STEP_ACTIONS: Readonly<Record<StartStep, StepAction>> = {
|
|
|
114
142
|
|
|
115
143
|
async function run_step(
|
|
116
144
|
step: StartStep,
|
|
117
|
-
context:
|
|
145
|
+
context: RunContext,
|
|
118
146
|
completed: ReadonlyArray<StartStep>,
|
|
119
147
|
): Promise<void> {
|
|
120
148
|
try {
|
|
121
149
|
await STEP_ACTIONS[step](context)
|
|
122
150
|
} catch (error) {
|
|
123
151
|
const cause = error_text.message_of(error)
|
|
152
|
+
const labels = start_plan.step_labels(context.init_command)
|
|
124
153
|
|
|
125
|
-
throw new Error(start_plan.progress_report(step, completed, cause), { cause: error })
|
|
154
|
+
throw new Error(start_plan.progress_report(step, completed, cause, labels), { cause: error })
|
|
126
155
|
}
|
|
127
156
|
}
|
|
128
157
|
|
|
129
158
|
async function run_steps(steps: ReadonlyArray<StartStep>, context: StepContext): Promise<void> {
|
|
159
|
+
const labels = start_plan.step_labels(context.init_command)
|
|
160
|
+
const run_context: RunContext = { ...context, baseline: baseline_of(steps, context) }
|
|
161
|
+
|
|
130
162
|
for (const [index, step] of steps.entries()) {
|
|
131
163
|
const position = `${String(index + 1)}/${String(steps.length)}`
|
|
132
164
|
|
|
133
|
-
console.info(`\n[${position}] ${
|
|
134
|
-
await
|
|
165
|
+
console.info(`\n[${position}] ${labels[step]}`)
|
|
166
|
+
// eslint-disable-next-line no-await-in-loop -- each step builds on what the earlier ones set up
|
|
167
|
+
await run_step(step, run_context, steps.slice(0, index))
|
|
135
168
|
}
|
|
136
169
|
}
|
|
137
170
|
|
package/scripts/init/start.ts
CHANGED
|
@@ -14,7 +14,9 @@ import { start_steps } from './start-steps'
|
|
|
14
14
|
|
|
15
15
|
const ARGUMENT_START_INDEX = 2
|
|
16
16
|
const READY_MESSAGE = 'GitHub workflow ready. Use kickoff new in your assistant to plan an Issue.'
|
|
17
|
-
const START_USAGE =
|
|
17
|
+
const START_USAGE =
|
|
18
|
+
'josh start [--profile basic|full] [--yes] [--github] [--public] [--init-command <command>]'
|
|
19
|
+
const INIT_COMMAND_FLAG = '--init-command'
|
|
18
20
|
const YES_FLAG = '--yes'
|
|
19
21
|
const GITHUB_FLAG = '--github'
|
|
20
22
|
const PUBLIC_FLAG = '--public'
|
|
@@ -26,16 +28,42 @@ interface Prepared {
|
|
|
26
28
|
choices: Choices
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
interface InitCommandSplit {
|
|
32
|
+
init_command: string | undefined
|
|
33
|
+
rest: ReadonlyArray<string>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// A value that is blank or another flag means the command itself was left out, which would otherwise
|
|
37
|
+
// swallow the next switch or hand the initialize step nothing to run.
|
|
38
|
+
function is_command_value(value: string | undefined): value is string {
|
|
39
|
+
return value !== undefined && value.trim() !== '' && !value.startsWith('-')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The command arrives as the one argument after its flag and is removed together with it.
|
|
43
|
+
function split_init_command(args: ReadonlyArray<string>): InitCommandSplit {
|
|
44
|
+
const index = args.indexOf(INIT_COMMAND_FLAG)
|
|
45
|
+
|
|
46
|
+
if (index === -1) return { init_command: undefined, rest: args }
|
|
47
|
+
|
|
48
|
+
const value = args[index + 1]
|
|
49
|
+
|
|
50
|
+
if (!is_command_value(value)) throw new Error(`Usage: ${START_USAGE}`)
|
|
51
|
+
|
|
52
|
+
return { init_command: value, rest: args.filter((_, at) => at !== index && at !== index + 1) }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The switches and the initialize command are peeled off first, so what remains is exactly the
|
|
56
|
+
// `--profile` pair `josh init` accepts — one parser for the profile in both commands.
|
|
31
57
|
function parse_start_options(args: ReadonlyArray<string>): StartOptions {
|
|
32
|
-
const
|
|
58
|
+
const { init_command, rest } = split_init_command(args)
|
|
59
|
+
const profile_args = rest.filter((argument) => !SWITCHES.has(argument))
|
|
33
60
|
|
|
34
61
|
return {
|
|
35
62
|
profile: project_profile.requested_profile(profile_args, START_USAGE),
|
|
36
|
-
is_yes:
|
|
37
|
-
is_github:
|
|
38
|
-
visibility:
|
|
63
|
+
is_yes: rest.includes(YES_FLAG),
|
|
64
|
+
is_github: rest.includes(GITHUB_FLAG),
|
|
65
|
+
visibility: rest.includes(PUBLIC_FLAG) ? 'public' : 'private',
|
|
66
|
+
init_command,
|
|
39
67
|
}
|
|
40
68
|
}
|
|
41
69
|
|
|
@@ -83,11 +111,13 @@ function prepare(args: ReadonlyArray<string>, is_tty: boolean, root: string): Pr
|
|
|
83
111
|
async function main(args: ReadonlyArray<string>, is_tty: boolean): Promise<void> {
|
|
84
112
|
const { steps, interaction, choices } = prepare(args, is_tty, process.cwd())
|
|
85
113
|
|
|
86
|
-
console.info(start_plan.plan_summary(steps))
|
|
87
|
-
const profile = await resolve_profile(choices, interaction)
|
|
88
114
|
const { root, options } = choices
|
|
115
|
+
const { visibility, init_command } = options
|
|
116
|
+
|
|
117
|
+
console.info(start_plan.plan_summary(steps, start_plan.step_labels(init_command)))
|
|
118
|
+
const profile = await resolve_profile(choices, interaction)
|
|
89
119
|
|
|
90
|
-
await start_steps.run_steps(steps, { root, profile, visibility
|
|
120
|
+
await start_steps.run_steps(steps, { root, profile, visibility, init_command })
|
|
91
121
|
console.info(`\n${READY_MESSAGE}`)
|
|
92
122
|
}
|
|
93
123
|
|
|
@@ -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 { git_gh_exec } from '#scripts/
|
|
4
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
6
6
|
import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
|
|
7
7
|
import { issue_label_schema } from '#scripts/git/schemas'
|
|
8
8
|
import { z } from 'zod'
|
|
@@ -160,7 +160,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
160
160
|
process.exitCode = await run(argv)
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
const defect_rate_cli = { USAGE, read_days, search_path, measure_window, run
|
|
163
|
+
const defect_rate_cli = { USAGE, read_days, search_path, measure_window, run }
|
|
164
164
|
|
|
165
165
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
166
166
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { has_label_name, INTERRUPT_ROUTE_LABEL } from '#scripts/git/issue-labels'
|
|
2
1
|
import { behavior_change_lint } from './behavior-change-lint'
|
|
2
|
+
import { has_label_name, INTERRUPT_ROUTE_LABEL } from './issue-labels'
|
|
3
3
|
import { markdown_section } from './markdown-section'
|
|
4
4
|
|
|
5
5
|
// The defect rate of merged work over a window (joshuafolkken/kit#2449): issues filed as defects
|
|
@@ -132,7 +132,6 @@ const defect_rate = {
|
|
|
132
132
|
filed_query,
|
|
133
133
|
format,
|
|
134
134
|
is_above_baseline,
|
|
135
|
-
is_behavior_change,
|
|
136
135
|
is_defect,
|
|
137
136
|
kind_of,
|
|
138
137
|
measure,
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { git_gh_command } from '
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { parse_json_array_safe } from '#scripts/git/parse-json-array'
|
|
3
|
+
import { open_issue_schema, type OpenIssueData } from '#scripts/git/schemas'
|
|
2
4
|
import { has_any_label, NOT_DIRECTLY_RUNNABLE_LABELS } from './issue-labels'
|
|
3
|
-
import {
|
|
4
|
-
import { open_issue_schema, type OpenIssueData } from './schemas'
|
|
5
|
+
import { issue_rank, type DependencyRow } from './issue-rank'
|
|
5
6
|
|
|
6
7
|
// The next-issues display printed when a workflow completes (#821): up to five open issues in
|
|
7
8
|
// priority order, so the user picks the next run from the completion output instead of opening the
|
|
8
9
|
// issue list. Priority is recency — a newer issue usually encodes the most current understanding
|
|
9
|
-
// of the backlog — with the label-based exclusions below.
|
|
10
|
+
// of the backlog — with the label-based exclusions below, under the ranking keys `issue-rank.ts`
|
|
11
|
+
// defines (joshuafolkken/kit#2928).
|
|
10
12
|
//
|
|
11
13
|
// `prioritize` is also the order `epicrun` picks up `auto-ok` issues in (joshuafolkken/kit#906).
|
|
12
14
|
// The two ask one question — which open issue outside an epic is run next — so they share one
|
|
@@ -37,6 +39,34 @@ function compare_newest_first(first: OpenIssueData, second: OpenIssueData): numb
|
|
|
37
39
|
return first.createdAt < second.createdAt ? 1 : -1
|
|
38
40
|
}
|
|
39
41
|
|
|
42
|
+
// A row's blockers by number. **Lossy across repositories**: a blocker elsewhere sharing a number
|
|
43
|
+
// with a row here counts as one of its dependents. The listings this ranks are one repository's own,
|
|
44
|
+
// and `backlog:next` re-ranks its offer from the qualified graph (`backlog-rank.ts`), so the cost is a
|
|
45
|
+
// display row placed one slot off rather than a run started early.
|
|
46
|
+
function dependency_row(issue: OpenIssueData): DependencyRow {
|
|
47
|
+
return {
|
|
48
|
+
key: String(issue.number),
|
|
49
|
+
blockers: (issue.blockedBy?.nodes ?? []).map((blocker) => String(blocker.number)),
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Every candidate in rank order, uncapped. `backlog:next` takes this rather than `prioritize`, so the
|
|
54
|
+
// `run:solo` gate sees the whole ranking before anything is cut (joshuafolkken/kit#2928).
|
|
55
|
+
function order(
|
|
56
|
+
issues: ReadonlyArray<OpenIssueData>,
|
|
57
|
+
completed_issue_number?: number,
|
|
58
|
+
): Array<OpenIssueData> {
|
|
59
|
+
const candidates = issues
|
|
60
|
+
.filter((issue) => is_candidate(issue, completed_issue_number))
|
|
61
|
+
.toSorted(compare_newest_first)
|
|
62
|
+
const dependents = issue_rank.count_dependents(candidates.map((issue) => dependency_row(issue)))
|
|
63
|
+
|
|
64
|
+
return issue_rank.rank(candidates, (issue) => ({
|
|
65
|
+
labels: (issue.labels ?? []).map((label) => label.name),
|
|
66
|
+
dependents: dependents.get(String(issue.number)) ?? 0,
|
|
67
|
+
}))
|
|
68
|
+
}
|
|
69
|
+
|
|
40
70
|
// **This display deliberately does not drop a blocked issue, and the `auto-ok` pickup deliberately
|
|
41
71
|
// does.** They share this ordering and differ on the set, which reads as an inconsistency and is not
|
|
42
72
|
// one (joshuafolkken/kit#1005).
|
|
@@ -50,10 +80,7 @@ function prioritize(
|
|
|
50
80
|
issues: ReadonlyArray<OpenIssueData>,
|
|
51
81
|
completed_issue_number?: number,
|
|
52
82
|
): Array<OpenIssueData> {
|
|
53
|
-
return issues
|
|
54
|
-
.filter((issue) => is_candidate(issue, completed_issue_number))
|
|
55
|
-
.toSorted(compare_newest_first)
|
|
56
|
-
.slice(0, DISPLAY_LIMIT)
|
|
83
|
+
return order(issues, completed_issue_number).slice(0, DISPLAY_LIMIT)
|
|
57
84
|
}
|
|
58
85
|
|
|
59
86
|
// Empty input yields no lines at all — a bare header with nothing under it reads as an error.
|
|
@@ -90,6 +117,8 @@ async function fetch_next_issue_lines(completed_issue_number?: number): Promise<
|
|
|
90
117
|
}
|
|
91
118
|
|
|
92
119
|
const git_next_issues = {
|
|
120
|
+
DISPLAY_LIMIT,
|
|
121
|
+
order,
|
|
93
122
|
prioritize,
|
|
94
123
|
format_lines,
|
|
95
124
|
fetch_next_issue_lines,
|
|
@@ -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))
|
|
@@ -40,6 +40,23 @@ function citation_line(slug: string, number: string, summary: string): string {
|
|
|
40
40
|
return `[#${number}](${issue_url(slug, number)})${SUMMARY_SEPARATOR}${summary}`
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
// How a listing names one issue, given what it already holds (joshuafolkken/kit#2943). A progress
|
|
44
|
+
// command's output is copied into a report verbatim, so the line it prints is the citation the report
|
|
45
|
+
// carries: the full form when the title is in hand, the bare number-link when only the repository is,
|
|
46
|
+
// and the plain `#N` only when the repository could not be read at all.
|
|
47
|
+
type IssueCiter = (number: string) => string
|
|
48
|
+
|
|
49
|
+
function citer(slug: string | undefined, titles: ReadonlyMap<string, string>): IssueCiter {
|
|
50
|
+
return function cite(number: string): string {
|
|
51
|
+
if (slug === undefined) return `#${number}`
|
|
52
|
+
const title = titles.get(number)
|
|
53
|
+
|
|
54
|
+
return title === undefined
|
|
55
|
+
? `[#${number}](${issue_url(slug, number)})`
|
|
56
|
+
: citation_line(slug, number, title)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
43
60
|
function qualified_target(token: string): CiteTarget | undefined {
|
|
44
61
|
const match = REPO_QUALIFIED.exec(token)
|
|
45
62
|
if (match === null) return undefined
|
|
@@ -88,15 +105,14 @@ function no_repo_line(target: CiteTarget): string {
|
|
|
88
105
|
}
|
|
89
106
|
|
|
90
107
|
const issue_cite = {
|
|
91
|
-
SUMMARY_SEPARATOR,
|
|
92
108
|
citation_line,
|
|
109
|
+
citer,
|
|
93
110
|
issue_url,
|
|
94
|
-
label,
|
|
95
111
|
missing_line,
|
|
96
112
|
no_repo_line,
|
|
97
113
|
parse_target,
|
|
98
114
|
unreadable_line,
|
|
99
115
|
}
|
|
100
116
|
|
|
101
|
-
export type { CiteTarget }
|
|
117
|
+
export type { CiteTarget, IssueCiter }
|
|
102
118
|
export { issue_cite }
|
|
@@ -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
|