@joshuafolkken/kit 1.1514.0 → 1.1784.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/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { defect_origin_line } from './defect-origin-line'
|
|
2
|
+
|
|
3
|
+
// Defects grouped by the pull request each one's origin line names: how many per pull request, per
|
|
4
|
+
// change kind, and per area of the tree it touched, plus how many each pull request that added a
|
|
5
|
+
// mechanism drew within a week of merging. Read from the bodies and the pull requests' files only,
|
|
6
|
+
// so nothing here asks for a judgement.
|
|
7
|
+
|
|
8
|
+
const WEEK_DAYS = 7
|
|
9
|
+
const MS_PER_DAY = 86_400_000
|
|
10
|
+
const WEEK_MS = WEEK_DAYS * MS_PER_DAY
|
|
11
|
+
const SCRIPTS_ROOT = 'scripts'
|
|
12
|
+
// `scripts/<dir>` — the two leading segments of a path under `scripts/`.
|
|
13
|
+
const SCRIPT_AREA_DEPTH = 2
|
|
14
|
+
const ROOT_AREA = '(root)'
|
|
15
|
+
const UNREAD_AREA = '(pull request not read)'
|
|
16
|
+
const TEST_FILE = /\.(?:test|e2e)\.ts$|\.snap$/u
|
|
17
|
+
// The run's own records — observations, accepted metrics — which nearly every merge adds, so they
|
|
18
|
+
// say nothing about what the pull request changed.
|
|
19
|
+
const RUN_RECORD_ROOT = '.josh/'
|
|
20
|
+
|
|
21
|
+
type ChangeKind = 'add' | 'fix' | 'remove'
|
|
22
|
+
|
|
23
|
+
interface ReportIssue {
|
|
24
|
+
number: number
|
|
25
|
+
created_at: string
|
|
26
|
+
body: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface PrFile {
|
|
30
|
+
filename: string
|
|
31
|
+
status: string
|
|
32
|
+
additions: number
|
|
33
|
+
deletions: number
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface OriginPr {
|
|
37
|
+
pr: number
|
|
38
|
+
merged_at: string
|
|
39
|
+
kind: ChangeKind
|
|
40
|
+
areas: ReadonlyArray<string>
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface Attributed {
|
|
44
|
+
issue: ReportIssue
|
|
45
|
+
pr: number
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface DefectReport {
|
|
49
|
+
by_pr: ReadonlyMap<number, number>
|
|
50
|
+
by_kind: ReadonlyMap<string, number>
|
|
51
|
+
by_area: ReadonlyMap<string, number>
|
|
52
|
+
unknown: number
|
|
53
|
+
undeclared: number
|
|
54
|
+
added_within_week: ReadonlyMap<number, number>
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function changed(files: ReadonlyArray<PrFile>): ReadonlyArray<PrFile> {
|
|
58
|
+
return files.filter((file) => !file.filename.startsWith(RUN_RECORD_ROOT))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A pull request that brought in a new non-test file added a mechanism; one that took out more than it
|
|
62
|
+
// put in removed; anything else changed what was there.
|
|
63
|
+
function change_kind(files: ReadonlyArray<PrFile>): ChangeKind {
|
|
64
|
+
const source = changed(files).filter((file) => !TEST_FILE.test(file.filename))
|
|
65
|
+
|
|
66
|
+
if (source.some((file) => file.status === 'added')) return 'add'
|
|
67
|
+
|
|
68
|
+
const added = source.reduce((sum, file) => sum + file.additions, 0)
|
|
69
|
+
const removed = source.reduce((sum, file) => sum + file.deletions, 0)
|
|
70
|
+
|
|
71
|
+
return removed > added ? 'remove' : 'fix'
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// `scripts/<dir>` for a script, the top-level directory otherwise, and one bucket for root files.
|
|
75
|
+
function area_of(filename: string): string {
|
|
76
|
+
const segments = filename.split('/')
|
|
77
|
+
|
|
78
|
+
if (segments.length === 1) return ROOT_AREA
|
|
79
|
+
|
|
80
|
+
const is_script = segments[0] === SCRIPTS_ROOT && segments.length > SCRIPT_AREA_DEPTH
|
|
81
|
+
const depth = is_script ? SCRIPT_AREA_DEPTH : 1
|
|
82
|
+
|
|
83
|
+
return segments.slice(0, depth).join('/')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function areas(files: ReadonlyArray<PrFile>): ReadonlyArray<string> {
|
|
87
|
+
return [...new Set(changed(files).map((file) => area_of(file.filename)))]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function increment<K>(counts: Map<K, number>, key: K): void {
|
|
91
|
+
counts.set(key, (counts.get(key) ?? 0) + 1)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function count_by<K>(
|
|
95
|
+
items: ReadonlyArray<Attributed>,
|
|
96
|
+
keys: (item: Attributed) => ReadonlyArray<K>,
|
|
97
|
+
): Map<K, number> {
|
|
98
|
+
const counts = new Map<K, number>()
|
|
99
|
+
|
|
100
|
+
for (const item of items) for (const key of keys(item)) increment(counts, key)
|
|
101
|
+
|
|
102
|
+
return counts
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function within_week(issue: ReportIssue, origin: OriginPr): boolean {
|
|
106
|
+
const elapsed = Date.parse(issue.created_at) - Date.parse(origin.merged_at)
|
|
107
|
+
|
|
108
|
+
return elapsed >= 0 && elapsed <= WEEK_MS
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function attribute(issue: ReportIssue): Attributed | undefined {
|
|
112
|
+
const origin = defect_origin_line.parse(issue.body)
|
|
113
|
+
|
|
114
|
+
return origin?.kind === 'pr' ? { issue, pr: origin.pr } : undefined
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function attributed(issues: ReadonlyArray<ReportIssue>): ReadonlyArray<Attributed> {
|
|
118
|
+
return issues.map((issue) => attribute(issue)).filter((item) => item !== undefined)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Every pull request an origin line names, once — what the report has to read.
|
|
122
|
+
function origin_prs(issues: ReadonlyArray<ReportIssue>): ReadonlyArray<number> {
|
|
123
|
+
return [...new Set(attributed(issues).map(({ pr }) => pr))]
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function soon_after_adding(
|
|
127
|
+
items: ReadonlyArray<Attributed>,
|
|
128
|
+
prs: ReadonlyMap<number, OriginPr>,
|
|
129
|
+
): Map<number, number> {
|
|
130
|
+
return count_by(items, ({ issue, pr }) => {
|
|
131
|
+
const origin = prs.get(pr)
|
|
132
|
+
|
|
133
|
+
return origin?.kind === 'add' && within_week(issue, origin) ? [pr] : []
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function count_origins(issues: ReadonlyArray<ReportIssue>, kind: 'unknown' | undefined): number {
|
|
138
|
+
return issues.filter((issue) => defect_origin_line.parse(issue.body)?.kind === kind).length
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function aggregate(
|
|
142
|
+
issues: ReadonlyArray<ReportIssue>,
|
|
143
|
+
prs: ReadonlyMap<number, OriginPr>,
|
|
144
|
+
): DefectReport {
|
|
145
|
+
const items = attributed(issues)
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
by_pr: count_by(items, ({ pr }) => [pr]),
|
|
149
|
+
by_kind: count_by(items, ({ pr }) => [prs.get(pr)?.kind ?? UNREAD_AREA]),
|
|
150
|
+
by_area: count_by(items, ({ pr }) => prs.get(pr)?.areas ?? [UNREAD_AREA]),
|
|
151
|
+
unknown: count_origins(issues, 'unknown'),
|
|
152
|
+
undeclared: count_origins(issues, undefined),
|
|
153
|
+
added_within_week: soon_after_adding(items, prs),
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const defect_report = { aggregate, area_of, areas, change_kind, origin_prs, WEEK_DAYS }
|
|
158
|
+
|
|
159
|
+
export type { ChangeKind, DefectReport, OriginPr, PrFile, ReportIssue }
|
|
160
|
+
export { defect_report }
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
|
+
import { issue_evidence_exit } from '#scripts/issue/issue-evidence-exit'
|
|
5
|
+
import { ALREADY_DONE_LABEL } from '#scripts/issue/issue-labels'
|
|
6
|
+
import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
|
|
7
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
|
+
|
|
9
|
+
// `josh issue:already-done <N> --evidence-file <path>` — the exit for an Issue whose work is already
|
|
10
|
+
// merged (`issue-comments.md` → "When the work turns out to be already merged"): the evidence
|
|
11
|
+
// comment, the `already-done` label and the `run:release`, in that order (`issue-evidence-exit.ts`).
|
|
12
|
+
//
|
|
13
|
+
// The label is provisioned by `josh start`, so nothing here creates it.
|
|
14
|
+
// **The Issue is never closed**: closing is a person's (Tier C), and the label is the run's exit.
|
|
15
|
+
//
|
|
16
|
+
// **A follow-up measurement is refused before anything is written** (joshuafolkken/kit#4504): its body
|
|
17
|
+
// declares the sample wait (`issue_sample_gate.DECLARATION`, read as `not-before` reads it), and its
|
|
18
|
+
// exit is `josh issue:measured`, which closes it — this one would leave it OPEN and the lane parked.
|
|
19
|
+
|
|
20
|
+
const ARGV_OFFSET = 2
|
|
21
|
+
|
|
22
|
+
function refusal_of(issue_number: string, body: string | undefined): string | undefined {
|
|
23
|
+
const cite = session_cite.issue(issue_number)
|
|
24
|
+
if (body === undefined) return `Issue ${cite} body not read; nothing written`
|
|
25
|
+
if (issue_sample_gate.cited_number(body) === undefined) return undefined
|
|
26
|
+
|
|
27
|
+
return `Issue ${cite} is a follow-up measurement (\`${issue_sample_gate.DECLARATION}\`): run \`josh issue:measured ${issue_number} --evidence-file <path>\` instead; nothing written`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function admit(issue_number: string): Promise<boolean> {
|
|
31
|
+
const refusal = refusal_of(issue_number, await git_gh_command.issue_get_body(issue_number))
|
|
32
|
+
|
|
33
|
+
if (refusal !== undefined) console.error(refusal)
|
|
34
|
+
|
|
35
|
+
return refusal === undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function apply_label(issue_number: string): Promise<boolean> {
|
|
39
|
+
const write = await git_gh_command.issue_apply_label(issue_number, ALREADY_DONE_LABEL)
|
|
40
|
+
|
|
41
|
+
if (!write.is_applied) console.error(`${ALREADY_DONE_LABEL} not applied: ${write.reason}`)
|
|
42
|
+
|
|
43
|
+
return write.is_applied
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
47
|
+
return await issue_evidence_exit.run(argv, {
|
|
48
|
+
command: 'issue:already-done',
|
|
49
|
+
finish: apply_label,
|
|
50
|
+
admit,
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
55
|
+
process.exitCode = await run(argv)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const issue_already_done_cli = { run }
|
|
59
|
+
|
|
60
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
61
|
+
|
|
62
|
+
export { issue_already_done_cli }
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
|
|
3
|
+
// One text written to an issue: **into the body when the body is blank, as a comment otherwise.**
|
|
4
|
+
// Two writers make this decision — `followup`'s completion notice and `issue:plan`'s plan — and a copy
|
|
5
|
+
// per caller is how the two would come to disagree about what "blank" means.
|
|
6
|
+
//
|
|
7
|
+
// A body that could not be read is not blank: overwriting a body nobody saw could erase a person's
|
|
8
|
+
// text, so an unreadable body falls to a comment, which loses nothing.
|
|
9
|
+
|
|
10
|
+
type Destination = 'body' | 'comment'
|
|
11
|
+
|
|
12
|
+
interface PostOutcome {
|
|
13
|
+
destination: Destination
|
|
14
|
+
url: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function is_blank_body(body: string | undefined): boolean {
|
|
18
|
+
return body?.trim().length === 0
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// `repo` (`owner/name`) addresses an issue in another repository; left out, the checkout's own.
|
|
22
|
+
async function post(issue_number: string, text: string, repo?: string): Promise<PostOutcome> {
|
|
23
|
+
const current_body = await git_gh_command.issue_get_body(issue_number, repo)
|
|
24
|
+
|
|
25
|
+
if (is_blank_body(current_body)) {
|
|
26
|
+
const url = await git_gh_command.issue_edit_body(issue_number, text, repo)
|
|
27
|
+
|
|
28
|
+
return { destination: 'body', url }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
destination: 'comment',
|
|
33
|
+
url: await git_gh_command.issue_comment(issue_number, text, repo),
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const issue_body_or_comment = { post }
|
|
38
|
+
|
|
39
|
+
export { issue_body_or_comment }
|
|
40
|
+
export type { Destination, PostOutcome }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
2
|
import type { IssueRead } from '#scripts/gh/git-gh-issue-read'
|
|
5
3
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
@@ -24,7 +22,6 @@ import { issue_cite, type CiteTarget } from './issue-cite'
|
|
|
24
22
|
|
|
25
23
|
const SUCCESS_EXIT_CODE = 0
|
|
26
24
|
const FAILURE_EXIT_CODE = 1
|
|
27
|
-
const ARGV_OFFSET = 2
|
|
28
25
|
// The same bound `issue:read` puts on its batch read: every read is a `gh` process, and an unbounded
|
|
29
26
|
// fan-out is answered with secondary rate limiting rather than with titles.
|
|
30
27
|
const READ_CONCURRENCY = 8
|
|
@@ -160,10 +157,6 @@ async function run(args: ReadonlyArray<string>): Promise<number> {
|
|
|
160
157
|
return report(cited)
|
|
161
158
|
}
|
|
162
159
|
|
|
163
|
-
async function main(args: ReadonlyArray<string>): Promise<void> {
|
|
164
|
-
process.exitCode = await run(args)
|
|
165
|
-
}
|
|
166
|
-
|
|
167
160
|
const issue_cite_cli = {
|
|
168
161
|
USAGE,
|
|
169
162
|
cite,
|
|
@@ -171,6 +164,4 @@ const issue_cite_cli = {
|
|
|
171
164
|
run,
|
|
172
165
|
}
|
|
173
166
|
|
|
174
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
175
|
-
|
|
176
167
|
export { issue_cite_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_cite_cli } from './issue-cite-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:cite` entry, kept apart from `issue-cite-cli.ts` because other modules import that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await issue_cite_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { defect_origin_line } from './defect-origin-line'
|
|
1
2
|
import { issue_bug_label } from './issue-bug-label'
|
|
2
3
|
import { BREAKING_CHANGE_LABEL, BUG_LABEL, ENHANCEMENT_LABEL, has_label_name } from './issue-labels'
|
|
3
4
|
import { markdown_section } from './markdown-section'
|
|
@@ -44,16 +45,20 @@ function bug_classification_problem(body: string): string | undefined {
|
|
|
44
45
|
return undefined
|
|
45
46
|
}
|
|
46
47
|
|
|
47
|
-
function
|
|
48
|
-
const classification_problem = bug_classification_problem(body)
|
|
49
|
-
const found: Array<string> = []
|
|
50
|
-
|
|
51
|
-
if (classification_problem !== undefined) found.push(classification_problem)
|
|
48
|
+
function label_conflict(body: string): string | undefined {
|
|
52
49
|
const labels = required_labels(body)
|
|
53
50
|
|
|
54
|
-
|
|
51
|
+
return labels.includes(BUG_LABEL) && labels.includes(ENHANCEMENT_LABEL) ? CONFLICT : undefined
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
55
|
+
const found = [
|
|
56
|
+
bug_classification_problem(body),
|
|
57
|
+
label_conflict(body),
|
|
58
|
+
defect_origin_line.problem(body),
|
|
59
|
+
]
|
|
55
60
|
|
|
56
|
-
return found
|
|
61
|
+
return found.filter((problem) => problem !== undefined)
|
|
57
62
|
}
|
|
58
63
|
|
|
59
64
|
const issue_classification = {
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
2
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
3
|
import { cli_body } from '#scripts/josh/cli-body'
|
|
@@ -19,7 +17,6 @@ import { error_text } from '#scripts/lib/error-message'
|
|
|
19
17
|
|
|
20
18
|
const SUCCESS_EXIT_CODE = 0
|
|
21
19
|
const FAILURE_EXIT_CODE = 1
|
|
22
|
-
const ARGV_OFFSET = 2
|
|
23
20
|
const BODY_FLAG = '--body'
|
|
24
21
|
const BODY_FILE_FLAG = '--body-file'
|
|
25
22
|
const USAGE = `Usage: josh issue:comment <issue-number> ${BODY_FLAG} <text> | ${BODY_FILE_FLAG} <path>`
|
|
@@ -33,23 +30,12 @@ interface CommentRequest {
|
|
|
33
30
|
// ignored. `cli_body.resolve` owns the both-flags-at-once refusal and the file read.
|
|
34
31
|
const OPTIONS = { body: { type: 'string' }, 'body-file': { type: 'string' } } as const
|
|
35
32
|
|
|
36
|
-
// The number is the one positional, and it must be a real issue number: a missing, malformed or
|
|
37
|
-
// second one refuses the whole call rather than posting to some other issue.
|
|
38
|
-
function single_issue_number(positionals: ReadonlyArray<string>): string | undefined {
|
|
39
|
-
const [issue_number, ...rest] = positionals
|
|
40
|
-
const is_single = rest.length === 0 && issue_number !== undefined
|
|
41
|
-
|
|
42
|
-
return is_single && issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)
|
|
43
|
-
? issue_number
|
|
44
|
-
: undefined
|
|
45
|
-
}
|
|
46
|
-
|
|
47
33
|
// `resolve` may throw when both body flags are given, which `run` reports — the message names the two
|
|
48
34
|
// flags a caller must pick between.
|
|
49
35
|
function parse_request(argv: ReadonlyArray<string>): CommentRequest | undefined {
|
|
50
36
|
const parsed = cli_flags.arguments_of(argv, OPTIONS)
|
|
51
37
|
if (parsed === undefined) return undefined
|
|
52
|
-
const issue_number =
|
|
38
|
+
const issue_number = issue_number_shape.single_of(parsed.positionals)
|
|
53
39
|
if (issue_number === undefined) return undefined
|
|
54
40
|
|
|
55
41
|
const body = cli_body.resolve({
|
|
@@ -67,11 +53,16 @@ function parse_request(argv: ReadonlyArray<string>): CommentRequest | undefined
|
|
|
67
53
|
// A both-flags refusal and a file-read failure both surface as an `Error` from `resolve`, and its
|
|
68
54
|
// message already names the flags or the resolved path — so it is printed as-is and `USAGE` is
|
|
69
55
|
// withheld. `undefined` is the other refusal: a bad number or an empty body, which `USAGE` explains.
|
|
70
|
-
|
|
56
|
+
// `usage` is the caller's: `run:park` parks with the same issue number and body, so it reads them here
|
|
57
|
+
// and prints its own usage on a refusal.
|
|
58
|
+
function resolve_request(
|
|
59
|
+
argv: ReadonlyArray<string>,
|
|
60
|
+
usage: string = USAGE,
|
|
61
|
+
): CommentRequest | undefined {
|
|
71
62
|
try {
|
|
72
63
|
const request = parse_request(argv)
|
|
73
64
|
|
|
74
|
-
if (request === undefined) console.error(
|
|
65
|
+
if (request === undefined) console.error(usage)
|
|
75
66
|
|
|
76
67
|
return request
|
|
77
68
|
} catch (error) {
|
|
@@ -93,12 +84,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
93
84
|
return SUCCESS_EXIT_CODE
|
|
94
85
|
}
|
|
95
86
|
|
|
96
|
-
|
|
97
|
-
process.exitCode = await run(argv)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const issue_comment_cli = { USAGE, run }
|
|
101
|
-
|
|
102
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
87
|
+
const issue_comment_cli = { USAGE, resolve_request, run }
|
|
103
88
|
|
|
89
|
+
export type { CommentRequest }
|
|
104
90
|
export { issue_comment_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_comment_cli } from './issue-comment-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:comment` entry, kept apart from `issue-comment-cli.ts` because other modules import
|
|
6
|
+
// that one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await issue_comment_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
3
|
+
import { cli_body } from '#scripts/josh/cli-body'
|
|
4
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
+
import { run_hold_cli } from '#scripts/run/hold/run-hold-cli'
|
|
7
|
+
|
|
8
|
+
// The shape every evidence exit shares — `josh issue:already-done` and `josh issue:measured`: the
|
|
9
|
+
// evidence comment, the exit's own finishing write, then the `run:release`, in that order.
|
|
10
|
+
//
|
|
11
|
+
// **The order is the point.** The finishing write without the comment is an uncited claim, so the
|
|
12
|
+
// comment goes first and each step runs only once the one before it landed — a failure stops there
|
|
13
|
+
// and names the step.
|
|
14
|
+
|
|
15
|
+
const FAILURE_EXIT_CODE = 1
|
|
16
|
+
const EVIDENCE_FILE_FLAG = '--evidence-file'
|
|
17
|
+
const OPTIONS = { 'evidence-file': { type: 'string' } } as const
|
|
18
|
+
|
|
19
|
+
interface EvidenceRequest {
|
|
20
|
+
issue_number: string
|
|
21
|
+
evidence: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// `admit`, when given, runs once the request parsed and before the first write: an exit that does not
|
|
25
|
+
// fit the Issue refuses there, with nothing written.
|
|
26
|
+
interface EvidenceExit {
|
|
27
|
+
command: string
|
|
28
|
+
finish: (issue_number: string) => Promise<boolean>
|
|
29
|
+
admit?: (issue_number: string) => Promise<boolean>
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// An evidence file that is empty or whitespace only is refused before anything is written: a comment
|
|
33
|
+
// with no citations is not the finding an exit is for. The throw carries the reason to `run`.
|
|
34
|
+
function parse_request(argv: ReadonlyArray<string>): EvidenceRequest | undefined {
|
|
35
|
+
const parsed = cli_flags.arguments_of(argv, OPTIONS)
|
|
36
|
+
if (parsed === undefined) return undefined
|
|
37
|
+
const issue_number = issue_number_shape.single_of(parsed.positionals)
|
|
38
|
+
const file_path = parsed.values['evidence-file']
|
|
39
|
+
if (issue_number === undefined || file_path === undefined) return undefined
|
|
40
|
+
const evidence = cli_body.read_file_or_stdin(file_path).trim()
|
|
41
|
+
if (evidence.length === 0) throw new Error(`Evidence file is empty: ${file_path}`)
|
|
42
|
+
|
|
43
|
+
return { issue_number, evidence }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// A file-read failure or an empty file is an `Error` naming the path, printed as-is; every other
|
|
47
|
+
// refusal is `undefined`, which the usage line explains.
|
|
48
|
+
function resolve_request(
|
|
49
|
+
argv: ReadonlyArray<string>,
|
|
50
|
+
command: string,
|
|
51
|
+
): EvidenceRequest | undefined {
|
|
52
|
+
try {
|
|
53
|
+
const request = parse_request(argv)
|
|
54
|
+
|
|
55
|
+
if (request === undefined) {
|
|
56
|
+
console.error(`Usage: josh ${command} <issue-number> ${EVIDENCE_FILE_FLAG} <path>`)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return request
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error(error_text.message_of(error))
|
|
62
|
+
|
|
63
|
+
return undefined
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function post_evidence(request: EvidenceRequest): Promise<boolean> {
|
|
68
|
+
try {
|
|
69
|
+
console.info(await git_gh_command.issue_comment(request.issue_number, request.evidence))
|
|
70
|
+
|
|
71
|
+
return true
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.error(`Evidence comment not posted: ${error_text.message_of(error)}`)
|
|
74
|
+
|
|
75
|
+
return false
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Each write runs only once the one before it landed: `&&` stops at the first that did not.
|
|
80
|
+
async function write_exit(request: EvidenceRequest, exit: EvidenceExit): Promise<boolean> {
|
|
81
|
+
return (await post_evidence(request)) && (await exit.finish(request.issue_number))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function is_admitted(request: EvidenceRequest, exit: EvidenceExit): Promise<boolean> {
|
|
85
|
+
return exit.admit === undefined || (await exit.admit(request.issue_number))
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function run(argv: ReadonlyArray<string>, exit: EvidenceExit): Promise<number> {
|
|
89
|
+
const request = resolve_request(argv, exit.command)
|
|
90
|
+
if (request === undefined || !(await is_admitted(request, exit))) return FAILURE_EXIT_CODE
|
|
91
|
+
|
|
92
|
+
return (await write_exit(request, exit))
|
|
93
|
+
? await run_hold_cli.run(['--release', request.issue_number])
|
|
94
|
+
: FAILURE_EXIT_CODE
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const issue_evidence_exit = { run }
|
|
98
|
+
|
|
99
|
+
export type { EvidenceExit }
|
|
100
|
+
export { issue_evidence_exit }
|
|
@@ -14,20 +14,24 @@ import { repository_labels } from '#scripts/repo/repository-labels'
|
|
|
14
14
|
import { run_event_filed } from '#scripts/run/event/run-event-filed'
|
|
15
15
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
16
16
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
17
|
+
import { run_hold_member } from '#scripts/run/hold/run-hold-member'
|
|
17
18
|
import { issue_auto_ok } from './issue-auto-ok'
|
|
18
19
|
import { issue_cite } from './issue-cite'
|
|
19
20
|
import { issue_file, type FileArguments } from './issue-file'
|
|
20
21
|
import { issue_file_fold } from './issue-file-fold'
|
|
21
22
|
import { issue_lint_cli } from './issue-lint-cli'
|
|
23
|
+
import { issue_priority } from './issue-priority'
|
|
22
24
|
import { issue_release_cli } from './issue-release-cli'
|
|
25
|
+
import { issue_sample_source } from './issue-sample-source'
|
|
23
26
|
import { issue_scout_cli } from './issue-scout-cli'
|
|
24
27
|
import { issue_wip } from './issue-wip'
|
|
25
28
|
|
|
26
|
-
// `josh issue:file "<title>" --body-file <path>
|
|
29
|
+
// `josh issue:file "<title>" --body-file <path> [--route <route>] [--label <name>]…
|
|
27
30
|
// [--repo <owner/repo>] [--distinct <N,…>] [--over-cap] [--no-auto-ok] [--release]` — file an Issue
|
|
28
31
|
// with every filing step run in order: the third-party refusal, the body
|
|
29
32
|
// lint, the `## Origin` check for another repository, the `auto-ok` decision
|
|
30
|
-
// with the run label it owes, the
|
|
33
|
+
// with the run label it owes, the start condition read as a pull request, the fold question against
|
|
34
|
+
// the run's earlier
|
|
31
35
|
// filings, the WIP cap count, the
|
|
32
36
|
// duplicate scout, the missing workflow labels created, the create call
|
|
33
37
|
// carrying every label, the release link on `--release`, and `epic:bundle`.
|
|
@@ -37,7 +41,7 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
37
41
|
const FAILURE_EXIT_CODE = 1
|
|
38
42
|
const ARGV_OFFSET = 2
|
|
39
43
|
const USAGE =
|
|
40
|
-
'Usage: josh issue:file "<title>" --body-file <path>
|
|
44
|
+
'Usage: josh issue:file "<title>" --body-file <path> [--route <tier-a|split|interrupt|review-cap>] [--label <name>]… [--repo <owner/repo>] [--distinct <N,…>] [--over-cap] [--no-auto-ok] [--release]'
|
|
41
45
|
const UNKNOWN_REPO_MESSAGE =
|
|
42
46
|
'Could not read this repository from `git remote`, so the filing has no repository to compare against — check `gh auth status`.'
|
|
43
47
|
const THIRD_PARTY_MESSAGE =
|
|
@@ -77,6 +81,7 @@ function refusals_of(filing: Filing): ReadonlyArray<string> {
|
|
|
77
81
|
const problems = [
|
|
78
82
|
...issue_lint_cli.problems(filing.body),
|
|
79
83
|
issue_auto_ok.declaration_problem(filing.body),
|
|
84
|
+
issue_priority.problem(filing.body, filing.args.labels),
|
|
80
85
|
issue_file.origin_problem(filing.body, filing.target, filing.current),
|
|
81
86
|
]
|
|
82
87
|
|
|
@@ -223,8 +228,9 @@ async function place(url: string, target: string): Promise<void> {
|
|
|
223
228
|
}
|
|
224
229
|
|
|
225
230
|
// Every filing lands on the run's event stream: this is the one filing path, so
|
|
226
|
-
// one append here reaches `run:board` from every route. A filing outside a run lands too
|
|
227
|
-
//
|
|
231
|
+
// one append here reaches `run:board` from every route. A filing outside a run lands too, unmarked as
|
|
232
|
+
// the run's (`run_hold_member`), and the board counts only the marked ones; the append is best-effort,
|
|
233
|
+
// as every emit is.
|
|
228
234
|
async function record(url: string, filing: Filing, labels: ReadonlyArray<string>): Promise<void> {
|
|
229
235
|
const number = String(issue_number_of(url))
|
|
230
236
|
const reference = issue_cite.plain(
|
|
@@ -233,7 +239,9 @@ async function record(url: string, filing: Filing, labels: ReadonlyArray<string>
|
|
|
233
239
|
)
|
|
234
240
|
const found_during = await issue_file_fold.finder()
|
|
235
241
|
const kind = run_event_filed.kind_of(labels)
|
|
236
|
-
const
|
|
242
|
+
const is_run = await run_hold_member.is_run_member()
|
|
243
|
+
const { title } = filing.args
|
|
244
|
+
const text = run_event_filed.text_of({ reference, kind, title, found_during, is_run })
|
|
237
245
|
|
|
238
246
|
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.FILED, text)
|
|
239
247
|
}
|
|
@@ -247,6 +255,20 @@ function is_admitted(filing: Filing): boolean {
|
|
|
247
255
|
return false
|
|
248
256
|
}
|
|
249
257
|
|
|
258
|
+
// The start condition's citation read against GitHub — after the local refusals, before any listing.
|
|
259
|
+
async function is_source_clear(filing: Filing): Promise<boolean> {
|
|
260
|
+
const is_here = issue_file.is_same_repository(filing.target, filing.current)
|
|
261
|
+
const problem = await issue_sample_source.problem(
|
|
262
|
+
filing.body,
|
|
263
|
+
is_here ? undefined : filing.target,
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
if (problem === undefined) return true
|
|
267
|
+
console.error(`✖ ${problem}`)
|
|
268
|
+
|
|
269
|
+
return false
|
|
270
|
+
}
|
|
271
|
+
|
|
250
272
|
async function send(filing: Filing, labels: ReadonlyArray<string>): Promise<number> {
|
|
251
273
|
const url = await create(filing, labels)
|
|
252
274
|
|
|
@@ -270,7 +292,7 @@ async function is_clear(filing: Filing): Promise<boolean> {
|
|
|
270
292
|
}
|
|
271
293
|
|
|
272
294
|
async function file(filing: Filing): Promise<number> {
|
|
273
|
-
if (!is_admitted(filing)) return FAILURE_EXIT_CODE
|
|
295
|
+
if (!is_admitted(filing) || !(await is_source_clear(filing))) return FAILURE_EXIT_CODE
|
|
274
296
|
const labels = labels_of(filing)
|
|
275
297
|
|
|
276
298
|
if (labels === undefined || !(await is_clear(filing))) return FAILURE_EXIT_CODE
|