@joshuafolkken/kit 1.1050.0 → 1.1128.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 +20 -12
- package/.claude/skills/workflow-commands/background-commands.md +36 -84
- 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 +30 -33
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
- 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 +8 -6
- package/.claude/skills/workflow-commands/halfrun.md +19 -21
- 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 +8 -16
- 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/pre-gate-cut.md +4 -8
- 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/split-assessment.md +4 -18
- package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-node/action.yml +33 -0
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +2 -3
- package/.github/workflows/ci.yml +31 -134
- package/.github/workflows/dependabot-auto-merge.yml +1 -0
- package/.github/workflows/pr-classification.yml +6 -44
- package/.github/workflows/production.yml +1 -0
- package/.github/workflows/publish.yml +43 -47
- package/.github/workflows/sonar-qube.yml +41 -4
- package/.pnpmfile.mjs +29 -0
- package/AGENTS.md +5 -2
- package/CLAUDE.md +33 -27
- package/GEMINI.md +5 -2
- package/README.md +66 -20
- package/SECURITY.md +37 -6
- package/cspell/index.yaml +6 -1
- package/dist/CLAUDE.basic.md +6 -6
- package/dist/CLAUDE.md +33 -27
- package/dist/CLAUDE.static.md +6 -6
- package/dist/config-merge/index.js +48 -12
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
- package/dist/hooks/codex-hook-adapter.js +12 -48
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +280 -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 +192 -333
- package/dist/josh.js +240 -148
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +70 -78
- package/eslint/rules/promise.js +5 -0
- package/eslint/rules/unicorn.js +3 -2
- package/package.json +26 -5
- package/pnpm-workspace.yaml +5 -7
- package/prompts/collaboration-workflow/glossary.md +17 -0
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/issue-template.md +1 -1
- package/prompts/collaboration-workflow/operating-rules.md +5 -5
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- 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 +6 -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-arrival.ts +30 -10
- package/scripts/backlog/backlog-budget-cli.ts +15 -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 +6 -19
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +30 -19
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +39 -10
- 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/parse-jsonc.ts +33 -3
- package/scripts/config-merge/patch-json-key.ts +13 -6
- 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 +3 -10
- 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 +6 -10
- package/scripts/doctor/doctor-io.ts +9 -13
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/backlogrun-parent-read-set.ts +12 -1
- package/scripts/document/document-byte-budget.ts +5 -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 +21 -7
- package/scripts/document/entry-read-set.ts +32 -8
- package/scripts/document/lane-child-read-set.ts +8 -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 +9 -3
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +4 -2
- 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 +8 -22
- 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 +13 -10
- 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-issue-write.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
- 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 +6 -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-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-spawn-sync.ts +65 -0
- package/scripts/git/git-spawn.ts +5 -4
- 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} +2 -7
- 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-file-action.ts +54 -0
- package/scripts/init/init-logic-migrate.ts +35 -17
- package/scripts/init/init-logic-secretlint.ts +1 -1
- package/scripts/init/init-logic.ts +10 -19
- package/scripts/init/init.ts +11 -71
- package/scripts/init/kit-written-paths.ts +2 -0
- package/scripts/init/project-profile.ts +9 -17
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +3 -1
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +64 -23
- 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-backlinks.ts +7 -14
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +12 -8
- 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 +7 -14
- 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 +21 -6
- package/scripts/issue/measure-rerun-cli.ts +74 -15
- 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 +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 +3 -3
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/run-github-prerequisite.ts +3 -6
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +46 -19
- 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 +5 -4
- 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 +31 -27
- 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 +7 -1
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/cli-flags.ts +31 -2
- package/scripts/lib/error-message.ts +12 -1
- 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/line-targets.ts +0 -11
- package/scripts/lines/lines-command.ts +5 -4
- 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 +3 -10
- 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 +2 -2
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +28 -21
- package/scripts/registry-migration/migrate.ts +25 -14
- package/scripts/release/github-release-cli.ts +19 -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 +38 -5
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/release/release-worktree.ts +97 -2
- 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-checkout.ts +3 -2
- 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 +10 -17
- 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/early-heartbeat.ts +4 -3
- 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 +22 -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 +20 -9
- 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-args.ts +8 -12
- 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-args.ts +1 -6
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +2 -6
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +133 -25
- package/scripts/run/run-entry-stop.ts +104 -0
- 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-emit.ts +7 -2
- 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 +29 -6
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +2 -6
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +7 -23
- 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 +4 -2
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +6 -3
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-args.ts +20 -4
- package/scripts/run/run-progress-cli.ts +35 -36
- package/scripts/run/run-progress-clock.ts +10 -35
- 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 +29 -19
- 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-probe.ts +4 -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 +3 -16
- 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 +6 -2
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -13
- 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 +18 -12
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/pack-hook.ts +92 -0
- 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-ai-files.ts +4 -0
- 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-changed.ts +13 -16
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +3 -9
- 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-commands.ts +11 -1
- package/scripts/version/version-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/CLAUDE.basic.md +6 -6
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/ci.yml +16 -82
- package/templates/workflows/dependabot-auto-merge.yml +6 -3
- package/templates/workflows/github-release.yml +79 -0
- package/tsconfig.sonar.json +4 -22
- 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.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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
2
|
+
import { run_ship_detach } from '#scripts/run/run-ship-detach'
|
|
3
|
+
import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
4
|
+
|
|
5
|
+
// Whether a lane has handed its post-implementation region to the detached ship (joshuafolkken/kit#2962).
|
|
6
|
+
//
|
|
7
|
+
// **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
|
|
8
|
+
// gate, the review and the merge, and notifies on its own outcome, so the `Stop` hook's demand for a
|
|
9
|
+
// `confirmation` notify and `lane-park`'s refusal of that notify only bought a "nothing needed"
|
|
10
|
+
// Telegram and a wasted turn — measured on 2026-10-02 as 43 demands, 21 refusals and ~94 extra turns.
|
|
11
|
+
// Both hooks read this one predicate, so they cannot disagree about whether the lane was handed off.
|
|
12
|
+
//
|
|
13
|
+
// **Running, never merely recorded.** A ship that failed hands its region back to the child, whose
|
|
14
|
+
// record then reads `failed`; that child is waiting again and owes the notify, so only a live
|
|
15
|
+
// supervisor counts as a hand-off.
|
|
16
|
+
|
|
17
|
+
// A detached ship for `issue` is live in the repository `directory` belongs to — the single reading
|
|
18
|
+
// `lane:await`, `run:merge` and the two stop hooks share.
|
|
19
|
+
function is_ship_running(issue: string, directory: string): boolean {
|
|
20
|
+
const repository = git_common_directory.repository(directory)
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
repository !== undefined && run_ship_detach.read_result(repository, issue)?.result === 'running'
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// This session is the dispatched lane child for `directory` and its own ship is running.
|
|
28
|
+
function is_handed_off(directory: string, source: MarkerSource = process.env): boolean {
|
|
29
|
+
const issue = lane_child_marker.marked_issue(source)
|
|
30
|
+
|
|
31
|
+
if (issue === undefined || !lane_child_marker.is_child_of(directory, source)) return false
|
|
32
|
+
|
|
33
|
+
return is_ship_running(issue, directory)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const lane_handoff = { is_handed_off, is_ship_running }
|
|
37
|
+
|
|
38
|
+
export { lane_handoff }
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { parseArgs } from 'node:util'
|
|
4
3
|
import { josh_command } from '#scripts/josh/josh-run'
|
|
4
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
|
+
import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
5
6
|
import { execa } from 'execa'
|
|
6
7
|
|
|
7
8
|
// `josh lane:launch <issue> [--stash <message>]` — one composite command for a `backlogrun` lane-start
|
|
@@ -34,21 +35,15 @@ interface LaunchContext {
|
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
function read_context(argv: ReadonlyArray<string>): LaunchContext | undefined {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (issue === undefined || rest.length > 0 || !ISSUE_PATTERN.test(issue)) return undefined
|
|
47
|
-
|
|
48
|
-
return { issue, stash: parsed.values.stash }
|
|
49
|
-
} catch {
|
|
50
|
-
return undefined
|
|
51
|
-
}
|
|
38
|
+
const parsed = cli_flags.arguments_of(argv, OPTIONS)
|
|
39
|
+
|
|
40
|
+
if (parsed === undefined) return undefined
|
|
41
|
+
|
|
42
|
+
const [issue, ...rest] = parsed.positionals
|
|
43
|
+
|
|
44
|
+
if (issue === undefined || rest.length > 0 || !ISSUE_PATTERN.test(issue)) return undefined
|
|
45
|
+
|
|
46
|
+
return { issue, stash: parsed.values.stash }
|
|
52
47
|
}
|
|
53
48
|
|
|
54
49
|
// The pop brought in the `pnpm-lock.yaml` `josh latest` rewrote, so this one lane installs a second
|
|
@@ -57,6 +52,7 @@ function read_context(argv: ReadonlyArray<string>): LaunchContext | undefined {
|
|
|
57
52
|
async function install(directory: string): Promise<boolean> {
|
|
58
53
|
const result = await execa(PNPM, ['--dir', directory, 'install', '--frozen-lockfile'], {
|
|
59
54
|
reject: false,
|
|
55
|
+
timeout: INSTALL_TIMEOUT_MS,
|
|
60
56
|
})
|
|
61
57
|
|
|
62
58
|
if ((result.exitCode ?? FAILURE_EXIT_CODE) === SUCCESS_EXIT_CODE) return true
|
|
@@ -82,29 +78,37 @@ async function prepare(stash: string | undefined, directory: string): Promise<bo
|
|
|
82
78
|
return await install(directory)
|
|
83
79
|
}
|
|
84
80
|
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
|
|
81
|
+
// Where the chain ended. `unopened` is a `lane:open` refusal — no lane was taken; `failed` is a step
|
|
82
|
+
// after it, which leaves the opened lane holding a seat, so a caller cannot read the two alike
|
|
83
|
+
// (joshuafolkken/kit#3027).
|
|
84
|
+
type LaunchOutcome = { kind: 'launched'; pid: string } | { kind: 'unopened' } | { kind: 'failed' }
|
|
85
|
+
|
|
86
|
+
const UNOPENED: LaunchOutcome = { kind: 'unopened' }
|
|
87
|
+
const FAILED: LaunchOutcome = { kind: 'failed' }
|
|
88
|
+
|
|
89
|
+
// The launch chain in-process. The CLI prints the pid; `backlog:drive` launches through this same
|
|
90
|
+
// chain (joshuafolkken/kit#2508).
|
|
91
|
+
async function launch_lane(context: LaunchContext): Promise<LaunchOutcome> {
|
|
88
92
|
const opened = await josh_command.josh_run(['lane:open', context.issue], should_forward_stderr)
|
|
89
93
|
|
|
90
|
-
if (opened.code !== SUCCESS_EXIT_CODE) return
|
|
94
|
+
if (opened.code !== SUCCESS_EXIT_CODE) return UNOPENED
|
|
91
95
|
|
|
92
|
-
if (!(await prepare(context.stash, opened.out))) return
|
|
96
|
+
if (!(await prepare(context.stash, opened.out))) return FAILED
|
|
93
97
|
|
|
94
98
|
const dispatched = await josh_command.josh_run(
|
|
95
99
|
['lane:dispatch', context.issue],
|
|
96
100
|
should_forward_stderr,
|
|
97
101
|
)
|
|
98
102
|
|
|
99
|
-
return dispatched.code === SUCCESS_EXIT_CODE ? dispatched.out :
|
|
103
|
+
return dispatched.code === SUCCESS_EXIT_CODE ? { kind: 'launched', pid: dispatched.out } : FAILED
|
|
100
104
|
}
|
|
101
105
|
|
|
102
106
|
async function launch(context: LaunchContext): Promise<number> {
|
|
103
|
-
const
|
|
107
|
+
const outcome = await launch_lane(context)
|
|
104
108
|
|
|
105
|
-
if (
|
|
109
|
+
if (outcome.kind !== 'launched') return FAILURE_EXIT_CODE
|
|
106
110
|
|
|
107
|
-
console.info(pid)
|
|
111
|
+
console.info(outcome.pid)
|
|
108
112
|
|
|
109
113
|
return SUCCESS_EXIT_CODE
|
|
110
114
|
}
|
|
@@ -125,9 +129,9 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
125
129
|
process.exitCode = await run(argv)
|
|
126
130
|
}
|
|
127
131
|
|
|
128
|
-
const lane_launch_cli = {
|
|
132
|
+
const lane_launch_cli = { launch_lane, read_context, run }
|
|
129
133
|
|
|
130
134
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
131
135
|
|
|
132
|
-
export type { LaunchContext }
|
|
136
|
+
export type { LaunchContext, LaunchOutcome }
|
|
133
137
|
export { lane_launch_cli }
|
|
@@ -217,6 +217,14 @@ async function list_lanes(): Promise<Array<LaneInfo>> {
|
|
|
217
217
|
return lanes.toSorted((left, right) => Number(left.issue) - Number(right.issue))
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
+
// The lanes a parent is still waiting on. A stranded lane has no child working in it, so it is not
|
|
221
|
+
// in-flight — the one definition the watcher guard and the headless stop rule both read.
|
|
222
|
+
async function has_lanes_in_flight(): Promise<boolean> {
|
|
223
|
+
const lanes = await list_lanes()
|
|
224
|
+
|
|
225
|
+
return lanes.some((lane) => !lane.is_stranded)
|
|
226
|
+
}
|
|
227
|
+
|
|
220
228
|
/** The seats live lanes hold — what a new lane's seat has to avoid. */
|
|
221
229
|
function used_seats(lanes: ReadonlyArray<LaneInfo>): Array<number> {
|
|
222
230
|
return lanes.map((lane) => lane.seat).filter((seat): seat is number => seat !== undefined)
|
|
@@ -246,6 +254,7 @@ async function find_open_lane(issue: string): Promise<LaneInfo | undefined> {
|
|
|
246
254
|
const lane_registry = {
|
|
247
255
|
find_lane,
|
|
248
256
|
find_open_lane,
|
|
257
|
+
has_lanes_in_flight,
|
|
249
258
|
list_lanes,
|
|
250
259
|
main_repository_root,
|
|
251
260
|
parse_block,
|
|
@@ -17,7 +17,9 @@ async function wait_for_ship(issue: string, prior_launch: string | undefined): P
|
|
|
17
17
|
if (read === undefined || read.launch_id === prior_launch) return 'none'
|
|
18
18
|
|
|
19
19
|
while (read.result === 'running') {
|
|
20
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
20
21
|
await sleep(POLL_MS)
|
|
22
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
21
23
|
read = await current(issue)
|
|
22
24
|
if (read === undefined) return 'abnormal'
|
|
23
25
|
}
|
|
@@ -48,6 +48,7 @@ async function is_approved(lane_directory: string, nonce: string): Promise<boole
|
|
|
48
48
|
const decision = read(lane_directory, nonce)?.decision
|
|
49
49
|
if (decision !== undefined) return decision === 'approved'
|
|
50
50
|
|
|
51
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
51
52
|
await new Promise((resolve) => setTimeout(resolve, APPROVAL_POLL_MS))
|
|
52
53
|
}
|
|
53
54
|
|
|
@@ -58,6 +59,6 @@ function remove(lane_directory: string, nonce: string): void {
|
|
|
58
59
|
stamp_file.remove_stamp(target(lane_directory, nonce))
|
|
59
60
|
}
|
|
60
61
|
|
|
61
|
-
const openai_lane_supervisor_decision = { approve, cancel, is_approved, remove
|
|
62
|
+
const openai_lane_supervisor_decision = { approve, cancel, is_approved, remove }
|
|
62
63
|
|
|
63
64
|
export { openai_lane_supervisor_decision }
|
|
@@ -4,6 +4,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
4
4
|
import { agent_argv } from '#scripts/agent/agent-argv'
|
|
5
5
|
import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
6
6
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
7
|
+
import { process_owner_schema } from '#scripts/josh/process-owner'
|
|
7
8
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
9
|
import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
|
|
9
10
|
import { run_cut, type RunCut } from '#scripts/run/run-cut'
|
|
@@ -22,11 +23,12 @@ const CHILD_POLL_MS = 250
|
|
|
22
23
|
const CLAIM_POLL_MS = 50
|
|
23
24
|
const CLAIM_POLL_LIMIT = 40
|
|
24
25
|
const SUPERVISOR_SCRIPT = fileURLToPath(new URL('openai-lane-supervisor-cli.ts', import.meta.url))
|
|
25
|
-
|
|
26
|
+
// The shared owner pair, with the pid narrowed: this record is written only by a live supervisor, so a
|
|
27
|
+
// pid that is not a real one marks it as corrupt rather than as a dead owner.
|
|
28
|
+
const owner_schema = process_owner_schema.extend({
|
|
26
29
|
issue: z.string(),
|
|
27
30
|
nonce: z.string(),
|
|
28
31
|
pid: z.number().int().positive(),
|
|
29
|
-
process_start: z.string().optional(),
|
|
30
32
|
})
|
|
31
33
|
const state_schema = z.object({
|
|
32
34
|
owner_nonce: z.string(),
|
|
@@ -81,6 +83,7 @@ async function wait_for_active(lane_directory: string): Promise<SupervisorOwner
|
|
|
81
83
|
for (let attempt = 0; attempt < CLAIM_POLL_LIMIT; attempt += 1) {
|
|
82
84
|
const owner = active(lane_directory)
|
|
83
85
|
if (owner !== undefined) return owner
|
|
86
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
84
87
|
await new Promise((resolve) => setTimeout(resolve, CLAIM_POLL_MS))
|
|
85
88
|
}
|
|
86
89
|
|
|
@@ -298,6 +301,7 @@ async function wait_for_inherited_child(
|
|
|
298
301
|
child_process_start: string | undefined,
|
|
299
302
|
): Promise<void> {
|
|
300
303
|
while (process_identity.is_same_process(child_pid, child_process_start) !== false) {
|
|
304
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
301
305
|
await new Promise((resolve) => setTimeout(resolve, CHILD_POLL_MS))
|
|
302
306
|
}
|
|
303
307
|
}
|
|
@@ -350,10 +354,8 @@ const openai_lane_supervisor = {
|
|
|
350
354
|
approve: openai_lane_supervisor_decision.approve,
|
|
351
355
|
cancel: openai_lane_supervisor_decision.cancel,
|
|
352
356
|
claim,
|
|
353
|
-
decision_path: openai_lane_supervisor_decision.target,
|
|
354
357
|
marker_path,
|
|
355
358
|
new_nonce: randomUUID,
|
|
356
|
-
read,
|
|
357
359
|
release,
|
|
358
360
|
state_path,
|
|
359
361
|
supervise,
|
|
@@ -6,6 +6,7 @@ import { agent_argv } from '#scripts/agent/agent-argv'
|
|
|
6
6
|
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
7
7
|
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
8
8
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
9
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
9
10
|
import { detached_launch } from '#scripts/run/detached-launch'
|
|
10
11
|
import { run_ship_review } from '#scripts/run/run-ship-review'
|
|
11
12
|
import { z } from 'zod'
|
|
@@ -102,7 +103,9 @@ function write_response(target: string, body: z.infer<typeof response_schema>):
|
|
|
102
103
|
async function launched(lane: LaneInfo, round: ReviewRound): Promise<boolean> {
|
|
103
104
|
try {
|
|
104
105
|
return await launch_review(lane, round)
|
|
105
|
-
} catch {
|
|
106
|
+
} catch (error) {
|
|
107
|
+
error_text.trace_swallowed('openai_review_broker.launched', error)
|
|
108
|
+
|
|
106
109
|
return false
|
|
107
110
|
}
|
|
108
111
|
}
|
|
@@ -138,9 +141,11 @@ async function serve(
|
|
|
138
141
|
|
|
139
142
|
if (received?.session === session && received.nonce !== last_nonce) {
|
|
140
143
|
last_nonce = received.nonce
|
|
144
|
+
// eslint-disable-next-line no-await-in-loop -- requests are served one at a time, in arrival order
|
|
141
145
|
await process_request(lane, response, received, state)
|
|
142
146
|
}
|
|
143
147
|
|
|
148
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
144
149
|
await sleep(POLL_MS)
|
|
145
150
|
}
|
|
146
151
|
}
|
|
@@ -232,6 +237,7 @@ async function wait_response(target: string, session: string, nonce: string): Pr
|
|
|
232
237
|
const verdict = response_verdict(read_record(target, response_schema), session, nonce)
|
|
233
238
|
if (verdict !== 'wait') return verdict === 'success'
|
|
234
239
|
|
|
240
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
235
241
|
await sleep(POLL_MS)
|
|
236
242
|
}
|
|
237
243
|
|
|
@@ -70,6 +70,7 @@ async function drain<Item, Result>(
|
|
|
70
70
|
const [index, item] = entry
|
|
71
71
|
|
|
72
72
|
try {
|
|
73
|
+
// eslint-disable-next-line no-await-in-loop -- one consumer runs one task at a time; the pool's width is the concurrency
|
|
73
74
|
pool.results.push({ index, value: await worker(item, index) })
|
|
74
75
|
} catch (error) {
|
|
75
76
|
pool.failures.push(error)
|
package/scripts/lib/cli-flags.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseArgs, type ParseArgsConfig } from 'node:util'
|
|
1
|
+
import { parseArgs, type ParseArgsConfig, type ParseArgsOptionsConfig } from 'node:util'
|
|
2
2
|
|
|
3
3
|
// Argument reading for the commands under `scripts/`.
|
|
4
4
|
//
|
|
@@ -32,6 +32,35 @@ function parse_or_undefined<T extends ParseArgsConfig>(
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
// The two shapes every command reads `argv` in: flags alone, or flags beside positionals. Both are
|
|
36
|
+
// strict, so an unknown flag is `undefined` rather than a silently ignored typo; the commands had each
|
|
37
|
+
// carried a one-line wrapper spelling these out (joshuafolkken/kit#3072).
|
|
38
|
+
type FlagsOnly<T extends ParseArgsOptionsConfig> = ReturnType<
|
|
39
|
+
typeof parseArgs<{ args: Array<string>; options: T }>
|
|
40
|
+
>
|
|
41
|
+
type WithPositionals<T extends ParseArgsOptionsConfig> = ReturnType<
|
|
42
|
+
typeof parseArgs<{ args: Array<string>; options: T; allowPositionals: true }>
|
|
43
|
+
>
|
|
44
|
+
|
|
45
|
+
function values_of<T extends ParseArgsOptionsConfig>(
|
|
46
|
+
argv: ReadonlyArray<string>,
|
|
47
|
+
options: T,
|
|
48
|
+
): FlagsOnly<T>['values'] | undefined {
|
|
49
|
+
return parse_or_undefined({ args: [...argv], options })?.values
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function arguments_of<T extends ParseArgsOptionsConfig>(
|
|
53
|
+
argv: ReadonlyArray<string>,
|
|
54
|
+
options: T,
|
|
55
|
+
): WithPositionals<T> | undefined {
|
|
56
|
+
return parse_or_undefined({ args: [...argv], options, allowPositionals: true })
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A string option's value, or `undefined` where the flag was absent or parsed as anything else.
|
|
60
|
+
function string_of(value: unknown): string | undefined {
|
|
61
|
+
return typeof value === 'string' ? value : undefined
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const cli_flags = { refuse_unknown_flags, parse_or_undefined, values_of, arguments_of, string_of }
|
|
36
65
|
|
|
37
66
|
export { cli_flags }
|
|
@@ -4,6 +4,17 @@ function message_of(error: unknown): string {
|
|
|
4
4
|
return error instanceof Error ? error.message : String(error)
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const DEBUG_ENV_KEY = 'JOSH_DEBUG'
|
|
8
|
+
|
|
9
|
+
// A catch that folds a failure into a state verdict — "dirty", "not merged", "not written" — leaves no
|
|
10
|
+
// trace of why by default, so a wrong verdict cannot be followed back to its cause (joshuafolkken/kit#3067).
|
|
11
|
+
// `JOSH_DEBUG` set to any non-blank value writes the swallowed reason to stderr; unset, nothing changes.
|
|
12
|
+
function trace_swallowed(where: string, error: unknown): void {
|
|
13
|
+
if ((process.env[DEBUG_ENV_KEY] ?? '').trim() === '') return
|
|
14
|
+
|
|
15
|
+
process.stderr.write(`josh debug: ${where}: ${message_of(error)}\n`)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const error_text = { message_of, trace_swallowed }
|
|
8
19
|
|
|
9
20
|
export { error_text }
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// Reading JSON that may not be JSON (joshuafolkken/kit#1151).
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// answers "could not read this" rather than throwing, because a single bad line
|
|
6
|
-
// whole report. They had begun to carry a copy of the same try/catch each; this is the
|
|
3
|
+
// Readers under `scripts/` parse text that a defect, a truncated write or an older format can make
|
|
4
|
+
// unparseable — a transcript line, a settings file, an MCP declaration, a lock record, CLI output —
|
|
5
|
+
// and every one of them answers "could not read this" rather than throwing, because a single bad line
|
|
6
|
+
// must not fail a whole report. They had begun to carry a copy of the same try/catch each; this is the
|
|
7
|
+
// one copy, and `is_record` beside it is the one object test (joshuafolkken/kit#2986).
|
|
7
8
|
|
|
8
9
|
function parse_or_undefined(text: string): unknown {
|
|
9
10
|
try {
|
package/scripts/lib/poll.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// One bounded polling loop and one sleep, in one place.
|
|
2
2
|
//
|
|
3
|
-
// **Three modules had already written the same three-line `sleep`** — `
|
|
3
|
+
// **Three modules had already written the same three-line `sleep`** — `gh/git-pr-checks.ts`,
|
|
4
4
|
// `eval/eval-run.ts` and `propagate/propagate-publish.ts` — and the release command's tag watch
|
|
5
5
|
// (joshuafolkken/kit#1169) would have been the fourth. `CLAUDE.md` → "No clones — single-source"
|
|
6
6
|
// reads an existing duplication as the signal to single-source it rather than as a license to add to
|
|
@@ -43,8 +43,10 @@ async function poll_until(is_done: () => Promise<boolean>, options: PollOptions)
|
|
|
43
43
|
const wait = options.sleeper ?? sleep
|
|
44
44
|
|
|
45
45
|
for (let attempt = 0; attempt < options.attempts; attempt += 1) {
|
|
46
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
46
47
|
if (await is_done()) return true
|
|
47
48
|
|
|
49
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
48
50
|
await wait_between(wait, options.interval_ms, attempt, options.attempts)
|
|
49
51
|
}
|
|
50
52
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FETCH_TIMEOUT_MS } from './timeouts'
|
|
2
|
+
|
|
3
|
+
// **The one place in `scripts/` that calls the global `fetch`** (joshuafolkken/kit#2981). Every request
|
|
4
|
+
// carries a time limit, so a stalled connection rejects instead of holding an unattended run forever;
|
|
5
|
+
// `timed-fetch-usage.test.ts` refuses a direct `fetch` call anywhere else. The signal also bounds the
|
|
6
|
+
// body read, because the response stream aborts with it.
|
|
7
|
+
async function timed_fetch(
|
|
8
|
+
url: string,
|
|
9
|
+
init: Omit<RequestInit, 'signal'> = {},
|
|
10
|
+
timeout_ms: number = FETCH_TIMEOUT_MS,
|
|
11
|
+
): Promise<Response> {
|
|
12
|
+
return await fetch(url, { ...init, signal: AbortSignal.timeout(timeout_ms) })
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { timed_fetch }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Shared time limits for the calls that leave the process — a network request or a spawned command.
|
|
2
|
+
// An unattended run (a lane, `followup`, a backlog drain) that waits on a request or a command with no
|
|
3
|
+
// limit stays stuck where it stopped and never comes back (joshuafolkken/kit#2981), so every such
|
|
4
|
+
// call takes one of these, and a value used in more than one place is named once here.
|
|
5
|
+
|
|
6
|
+
// One HTTP request to a registry, an API or a webhook.
|
|
7
|
+
const FETCH_TIMEOUT_MS = 10_000
|
|
8
|
+
// A short command that only answers a question (`gh --version`, `pnpm config get`).
|
|
9
|
+
const COMMAND_TIMEOUT_MS = 30_000
|
|
10
|
+
// A `pnpm install`, which can download the whole dependency tree on a cold store.
|
|
11
|
+
const INSTALL_TIMEOUT_MS = 600_000
|
|
12
|
+
|
|
13
|
+
export { COMMAND_TIMEOUT_MS, FETCH_TIMEOUT_MS, INSTALL_TIMEOUT_MS }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
1
2
|
import { json_object_schema } from '#scripts/lib/schemas'
|
|
2
3
|
import { load, loadAll, YAMLException } from 'js-yaml'
|
|
3
4
|
|
|
@@ -25,8 +26,9 @@ function parse_yaml(content: string): Record<string, unknown> {
|
|
|
25
26
|
return json_object_schema.parse(raw)
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
// A YAML mapping parses to the same plain object a JSON object does, so the test is `json_value`'s.
|
|
28
30
|
function is_mapping_document(value: unknown): value is Record<string, unknown> {
|
|
29
|
-
return
|
|
31
|
+
return json_value.is_record(value)
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
// pnpm 11 writes pnpm-lock.yaml as a multi-document stream (the package-manager document, then the
|
|
@@ -40,10 +40,6 @@ const LS_FILES_FLAGS: ReadonlyArray<string> = [
|
|
|
40
40
|
'-z',
|
|
41
41
|
]
|
|
42
42
|
const NUL = '\0'
|
|
43
|
-
// `--show-toplevel` prints the absolute repository (or worktree) root from anywhere inside it, so the
|
|
44
|
-
// root-relative names `--full-name` returns resolve to the right absolute paths wherever the command
|
|
45
|
-
// was invoked.
|
|
46
|
-
const SHOW_TOPLEVEL: ReadonlyArray<string> = ['rev-parse', '--show-toplevel']
|
|
47
43
|
|
|
48
44
|
function is_lint_target(relative_path: string): boolean {
|
|
49
45
|
return LINT_EXTENSIONS.has(path.extname(relative_path))
|
|
@@ -53,12 +49,6 @@ function split_names(output: string): ReadonlyArray<string> {
|
|
|
53
49
|
return output.split(NUL).filter((name) => name.length > 0)
|
|
54
50
|
}
|
|
55
51
|
|
|
56
|
-
// `git_spawn.read` is the one place ordinary git commands are spawned from, so this reuses it rather
|
|
57
|
-
// than growing a second spawn site (joshuafolkken/kit#1640).
|
|
58
|
-
async function repo_root(): Promise<string> {
|
|
59
|
-
return await git_spawn.read([...SHOW_TOPLEVEL])
|
|
60
|
-
}
|
|
61
|
-
|
|
62
52
|
// The names resolve against the repository `root`, never the process cwd: `--full-name` prints them
|
|
63
53
|
// relative to the root wherever the command runs, so resolving against cwd would double the prefix
|
|
64
54
|
// and drop every file when the command is invoked from a subdirectory.
|
|
@@ -73,7 +63,6 @@ async function lint_target_files(root: string): Promise<ReadonlyArray<string>> {
|
|
|
73
63
|
const line_targets = {
|
|
74
64
|
is_lint_target,
|
|
75
65
|
lint_target_files,
|
|
76
|
-
repo_root,
|
|
77
66
|
split_names,
|
|
78
67
|
}
|
|
79
68
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { git_command } from '#scripts/git/git-command'
|
|
4
5
|
import { line_budget, type FileBudget, type LineBudget } from './line-budget'
|
|
5
6
|
import { line_targets } from './line-targets'
|
|
6
7
|
|
|
@@ -122,10 +123,11 @@ function render(budgets: ReadonlyArray<FileBudget>, project_root: string): strin
|
|
|
122
123
|
return [header(budgets), ...rows_for(budgets, project_root)].join('\n')
|
|
123
124
|
}
|
|
124
125
|
|
|
125
|
-
// The scan resolves the repository root first — `budgets_for` and the row display both key off it
|
|
126
|
-
//
|
|
126
|
+
// The scan resolves the repository root first — `budgets_for` and the row display both key off it, and
|
|
127
|
+
// `git ls-files --full-name` names files relative to it — so a run started from a subdirectory reports
|
|
128
|
+
// the same files as one started from the root.
|
|
127
129
|
async function run_scan(): Promise<number> {
|
|
128
|
-
const root = await
|
|
130
|
+
const root = await git_command.repository_root()
|
|
129
131
|
const budgets = await scan_budgets(root)
|
|
130
132
|
|
|
131
133
|
process.stdout.write(`${render(budgets, root)}\n`)
|
|
@@ -161,7 +163,6 @@ const lines_command = {
|
|
|
161
163
|
header,
|
|
162
164
|
near_limit_budgets,
|
|
163
165
|
not_counted_reason,
|
|
164
|
-
render,
|
|
165
166
|
row,
|
|
166
167
|
rows_for,
|
|
167
168
|
run_lines,
|
|
@@ -99,6 +99,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
99
99
|
process.exitCode = await run_related_lint(process.argv.slice(changed_file_scope.ARGV_START))
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
const lint_related = {
|
|
102
|
+
const lint_related = { run_related_lint }
|
|
103
103
|
|
|
104
104
|
export { lint_related }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { gh_spawn } from '#scripts/gh/gh-spawn'
|
|
2
|
+
import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
2
3
|
import { z } from 'zod'
|
|
3
4
|
|
|
4
5
|
const TELEGRAM_API_BASE = 'https://api.telegram.org'
|
|
@@ -193,7 +194,7 @@ function build_text(input: TelegramSendInput): string {
|
|
|
193
194
|
|
|
194
195
|
async function post_message(config: TelegramConfig, text: string): Promise<void> {
|
|
195
196
|
const url = `${TELEGRAM_API_BASE}/bot${config.bot_token}/sendMessage`
|
|
196
|
-
const response = await
|
|
197
|
+
const response = await timed_fetch(url, {
|
|
197
198
|
method: 'POST',
|
|
198
199
|
headers: { 'Content-Type': 'application/json' },
|
|
199
200
|
body: JSON.stringify({ chat_id: config.chat_id, text }),
|
|
@@ -412,7 +413,6 @@ async function stranded(input: StrandedInput): Promise<boolean> {
|
|
|
412
413
|
}
|
|
413
414
|
|
|
414
415
|
const telegram_notify = {
|
|
415
|
-
REPO_LOOKUP_TIMEOUT_MS,
|
|
416
416
|
confirm,
|
|
417
417
|
send,
|
|
418
418
|
send_or_report,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { parseArgs } from 'node:util'
|
|
4
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
5
|
+
import { git_gh_repo } from '#scripts/gh/git-gh-repo'
|
|
6
|
+
import { github_issue_url, type IssueUrlTarget } from '#scripts/gh/github-issue-url'
|
|
7
|
+
import { git_error } from '#scripts/git/git-error'
|
|
4
8
|
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
5
|
-
import { git_error } from './git-error'
|
|
6
|
-
import { git_gh_issue_read } from './git-gh-issue-read'
|
|
7
|
-
import { git_gh_repo } from './git-gh-repo'
|
|
8
|
-
import { github_issue_url, type IssueUrlTarget } from './github-issue-url'
|
|
9
9
|
import { telegram_notify } from './telegram-notify'
|
|
10
10
|
import { telegram_test_logic, type CliValues, type ResolvedContext } from './telegram-test-logic'
|
|
11
11
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
2
|
-
import type { OpenPull } from '#scripts/
|
|
3
|
-
import { git_pr_checks } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import type { OpenPull } from '#scripts/gh/git-gh-pr-auto-merge'
|
|
3
|
+
import { git_pr_checks } from '#scripts/gh/git-pr-checks'
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
5
|
|
|
6
6
|
// **A flush pull request lands whether or not the flush that opened it is still alive**
|