@joshuafolkken/kit 1.1471.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 +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- 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 +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- 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-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- 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 +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- 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 +6 -7
- 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 +54 -7
- 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 +39 -8
- 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 +69 -0
- 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 +137 -18
- 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 +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- 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 +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- 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 +31 -60
- 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 +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- 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 +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- 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 +65 -129
- 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-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- 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/gh/git-pr.ts +13 -1
- 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 +78 -0
- package/scripts/git/main-merge.ts +39 -14
- 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 +5 -16
- 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 +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- 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 +60 -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 +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- 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 +7 -13
- 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 +19 -25
- 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/markdown-section.ts +19 -5
- 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 +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- 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 +31 -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 +112 -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 +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- 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 +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- 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 +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- 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 +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- 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-preserve.ts +29 -1
- 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 +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- 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 +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- 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 +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- 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 +14 -5
- 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 +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -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 +12 -11
- 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 +4 -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-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -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 +82 -16
- 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 +67 -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 +90 -3
- 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 +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -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 +76 -7
- 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/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- 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 +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- 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 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- 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 +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- 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 +118 -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 +240 -61
- 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 +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- 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 -47
- 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 +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -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 +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- 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-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- 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 +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- 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-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- 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 +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- 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 +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- 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-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -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 +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- 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 +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- 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 +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- 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-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- 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 +55 -6
- 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 +54 -21
- 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 +71 -137
- 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 +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- 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 +10 -3
- 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-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- 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/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 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_cli } from './init'
|
|
4
|
+
|
|
5
|
+
// The `josh init` entry, kept apart from `init.ts` because other modules import that one: a bundle is
|
|
6
|
+
// one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186). `run_cli` sets its own exit code.
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
run_cli(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
package/scripts/init/init.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
3
2
|
import path from 'node:path'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
3
|
import { resolve_local_bin } from '#scripts/build/local-bin'
|
|
6
4
|
import { doctor_io } from '#scripts/doctor/doctor-io'
|
|
7
5
|
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
8
7
|
import { package_version_schema, with_package_manager_schema } from '#scripts/lib/schemas'
|
|
9
8
|
import { auto_merge_setting } from '#scripts/repo/auto-merge-setting'
|
|
10
9
|
import { pack_hook } from '#scripts/safe-chain/pack-hook'
|
|
11
|
-
import { project_config } from '#scripts/safe-chain/project-config'
|
|
12
10
|
import { security_updates } from '#scripts/security/security-updates'
|
|
13
11
|
import { did_refuse_self_run } from '#scripts/self-sync-guard/self-sync-refusal'
|
|
12
|
+
import { file_content } from '#scripts/sync/file-content'
|
|
14
13
|
import { sync } from '#scripts/sync/sync'
|
|
15
14
|
import { package_manager_version } from '#scripts/version/package-manager-version'
|
|
16
15
|
import { execaSync } from 'execa'
|
|
@@ -28,10 +27,8 @@ import { package_manager_pin } from './package-manager-pin'
|
|
|
28
27
|
import { project_profile, type ProjectProfile, type ProjectShape } from './project-profile'
|
|
29
28
|
import { working_tree } from './working-tree'
|
|
30
29
|
|
|
31
|
-
const PACKAGE_JSON = 'package.json'
|
|
32
30
|
const KIT_PACKAGE_NAME = '@joshuafolkken/kit'
|
|
33
31
|
const LEFTHOOK_BIN = 'lefthook'
|
|
34
|
-
const ARGUMENT_START_INDEX = 2
|
|
35
32
|
const INSTALL_HINT = '→ run `pnpm install` to install what package.json lists'
|
|
36
33
|
const INIT_USAGE = 'josh init [--profile basic|full] [--no-install] [--dry-run]'
|
|
37
34
|
|
|
@@ -152,7 +149,7 @@ function merge_project_package_json(shape: ProjectShape): void {
|
|
|
152
149
|
return
|
|
153
150
|
}
|
|
154
151
|
|
|
155
|
-
|
|
152
|
+
file_content.write_contained(package_json_path, merged)
|
|
156
153
|
console.info(` ✔ ${is_existing ? 'updated' : 'created'} package.json`)
|
|
157
154
|
}
|
|
158
155
|
|
|
@@ -230,7 +227,7 @@ function initialize_project(shape: ProjectShape): void {
|
|
|
230
227
|
|
|
231
228
|
run_ai_file_actions(shape)
|
|
232
229
|
pack_hook.sync_pack_hook(PROJECT_ROOT, PACKAGE_DIR)
|
|
233
|
-
if (shape.profile === 'full')
|
|
230
|
+
if (shape.profile === 'full') sync.sync_release_window_mirrors(PROJECT_ROOT)
|
|
234
231
|
}
|
|
235
232
|
|
|
236
233
|
// A tool `init` just listed is absent until the user installs it — and `josh lint` then fails on it
|
|
@@ -337,10 +334,6 @@ function run_cli(args: ReadonlyArray<string>): void {
|
|
|
337
334
|
}
|
|
338
335
|
}
|
|
339
336
|
|
|
340
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
341
|
-
run_cli(process.argv.slice(ARGUMENT_START_INDEX))
|
|
342
|
-
}
|
|
343
|
-
|
|
344
337
|
const init = {
|
|
345
338
|
copy_ai_file: init_ai_copy.copy_ai_file,
|
|
346
339
|
apply_package_json_merges,
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
2
2
|
import { z } from 'zod'
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const PACKAGE_JSON = 'package.json'
|
|
3
|
+
import { PACKAGE_DIR } from './init-paths'
|
|
6
4
|
|
|
7
5
|
const kit_manifest_schema = z.object({
|
|
8
6
|
peerDependencies: z.record(z.string(), z.string()).default({}),
|
|
@@ -12,9 +10,7 @@ const kit_manifest_schema = z.object({
|
|
|
12
10
|
type KitManifest = z.infer<typeof kit_manifest_schema>
|
|
13
11
|
|
|
14
12
|
function read_kit_manifest(): KitManifest {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return kit_manifest_schema.parse(JSON.parse(content))
|
|
13
|
+
return package_manifest.read_manifest(PACKAGE_DIR, kit_manifest_schema)
|
|
18
14
|
}
|
|
19
15
|
|
|
20
16
|
// The version kit's own devDependencies carry for each name, so a consumer runs the toolchain kit
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
1
2
|
import { PACK_HOOK_FILE } from '#scripts/safe-chain/pack-hook'
|
|
2
3
|
import { PROJECT_CONFIG_FILE } from '#scripts/safe-chain/project-config'
|
|
3
4
|
import { managed_config_scope } from '#scripts/sync/managed-config-scope'
|
|
4
5
|
import { BASIC_PRETTIER_CONFIG } from './init-actions'
|
|
5
6
|
import { CLAUDE_MD_FILENAME } from './init-ai-copy'
|
|
6
7
|
|
|
7
|
-
const MANIFEST_FILE = 'package.json'
|
|
8
8
|
const LOCKFILE = 'pnpm-lock.yaml'
|
|
9
9
|
|
|
10
10
|
// The paths `josh init` writes beyond what `managed_config_scope` enumerates. They stay out of that
|
|
@@ -15,7 +15,7 @@ const SETUP_ONLY_PATHS: ReadonlySet<string> = new Set([
|
|
|
15
15
|
BASIC_PRETTIER_CONFIG,
|
|
16
16
|
PROJECT_CONFIG_FILE,
|
|
17
17
|
PACK_HOOK_FILE,
|
|
18
|
-
|
|
18
|
+
PACKAGE_JSON,
|
|
19
19
|
LOCKFILE,
|
|
20
20
|
])
|
|
21
21
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { existsSync, readdirSync,
|
|
1
|
+
import { existsSync, readdirSync, type Dirent } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { repo_origin } from '#scripts/discovery/repo-origin'
|
|
4
4
|
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
5
5
|
import { json_value } from '#scripts/lib/json-value'
|
|
6
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
6
7
|
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
8
|
+
import { z } from 'zod'
|
|
7
9
|
import { kit_written_paths } from './kit-written-paths'
|
|
8
10
|
import { own_formatter } from './own-formatter'
|
|
9
11
|
import { workflow_mark } from './workflow-mark'
|
|
@@ -76,9 +78,8 @@ function requested_profile(
|
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
function read_manifest(root: string): Record<string, unknown> | undefined {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const parsed: unknown = JSON.parse(readFileSync(filename, 'utf8'))
|
|
81
|
+
if (!existsSync(package_manifest.manifest_path(root))) return undefined
|
|
82
|
+
const parsed = package_manifest.read_manifest(root, z.unknown())
|
|
82
83
|
|
|
83
84
|
if (!json_value.is_record(parsed)) throw new Error('package.json must contain an object')
|
|
84
85
|
|
|
@@ -12,7 +12,8 @@ import { string_array_schema } from '#scripts/lib/schemas'
|
|
|
12
12
|
// `*.json`; a consumer whose `extends` still points at the old path would never be repaired by the
|
|
13
13
|
// ensure-based merge — an `@joshuafolkken/*` tsconfig entry is already present, so nothing is added
|
|
14
14
|
// — hence the rewrite here. Scoped to `@joshuafolkken/*/tsconfig/*` paths so an unrelated
|
|
15
|
-
// project-local `.jsonc` config is left alone.
|
|
15
|
+
// project-local `.jsonc` config is left alone. Removable from kit 2.0.0; a consumer still extended
|
|
16
|
+
// a `.jsonc` preset at joshuafolkken/kit#4187.
|
|
16
17
|
const LEGACY_PRESET_ENTRY = /@joshuafolkken\/[^/]+\/tsconfig\/[^/]+\.jsonc$/u
|
|
17
18
|
const LEGACY_SUFFIX = '.jsonc'
|
|
18
19
|
const CURRENT_SUFFIX = '.json'
|
|
@@ -13,7 +13,7 @@ const VSCODE_TASKS_FILENAME = 'tasks.json'
|
|
|
13
13
|
|
|
14
14
|
// A label kit once shipped a task under, mapped to the label that replaced it. A consumer's task still
|
|
15
15
|
// carrying the retired label is the same kit task under its old name, so it is replaced in place — an
|
|
16
|
-
// append would leave the retired
|
|
16
|
+
// append would leave the retired task beside its successor.
|
|
17
17
|
const RETIRED_LABELS: ReadonlyMap<unknown, string> = new Map([
|
|
18
18
|
['josh: run event watch', 'josh: run board'],
|
|
19
19
|
])
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import type { IssueRead } from '#scripts/gh/git-gh-issue-read'
|
|
3
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
4
|
+
import { parse_json } from '#scripts/git/parse-json-array'
|
|
5
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
6
|
+
import { run_prep_locate } from '#scripts/run/run-prep-locate'
|
|
7
|
+
import { z } from 'zod'
|
|
8
|
+
import { defect_origin, type Candidate, type Merge, type TargetMerges } from './defect-origin'
|
|
9
|
+
import { issue_read_cli } from './issue-read-cli'
|
|
10
|
+
import { session_cite } from './session-cite'
|
|
11
|
+
|
|
12
|
+
const SUCCESS_EXIT_CODE = 0
|
|
13
|
+
const FAILURE_EXIT_CODE = 1
|
|
14
|
+
const USAGE = 'Usage: pnpm josh defect:origin <N>'
|
|
15
|
+
const UNREADABLE_MESSAGE = 'Could not read the issue, so no origin candidate is listed:'
|
|
16
|
+
const UNSEARCHABLE_MESSAGE = 'Could not search the merge history for'
|
|
17
|
+
|
|
18
|
+
const filed_schema = z.object({ createdAt: z.string() })
|
|
19
|
+
|
|
20
|
+
interface IssueText {
|
|
21
|
+
text: string
|
|
22
|
+
filed_at: string | undefined
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// A target that git cannot search is named on stderr and contributes nothing, rather than ending the
|
|
26
|
+
// listing or passing for a target no merge touched.
|
|
27
|
+
async function read_merges(
|
|
28
|
+
target: string,
|
|
29
|
+
arguments_: Array<string>,
|
|
30
|
+
): Promise<ReadonlyArray<Merge>> {
|
|
31
|
+
try {
|
|
32
|
+
return defect_origin.parse_merges(await git_spawn.read(arguments_))
|
|
33
|
+
} catch {
|
|
34
|
+
console.error(`${UNSEARCHABLE_MESSAGE} ${target}`)
|
|
35
|
+
|
|
36
|
+
return []
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// A path is looked up by pathspec; a name no path matches, by the merges that added or removed it.
|
|
41
|
+
async function merges_for(target: string, before: string | undefined): Promise<TargetMerges> {
|
|
42
|
+
const by_path = await read_merges(target, defect_origin.path_arguments(target, before))
|
|
43
|
+
const merges =
|
|
44
|
+
by_path.length > 0
|
|
45
|
+
? by_path
|
|
46
|
+
: await read_merges(target, defect_origin.pickaxe_arguments(target, before))
|
|
47
|
+
|
|
48
|
+
return { target, merges }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function candidates_for(issue: IssueText): Promise<ReadonlyArray<Candidate>> {
|
|
52
|
+
const targets = run_prep_locate.extract_targets(issue.text)
|
|
53
|
+
const found = await Promise.all(
|
|
54
|
+
targets.map(async (target) => await merges_for(target, issue.filed_at)),
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
return defect_origin.rank(found)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function listing(issue_number: string, issue: IssueText): Promise<string> {
|
|
61
|
+
return defect_origin.format(issue_number, await candidates_for(issue))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// An unreadable filing time leaves the log unbounded rather than listing nothing.
|
|
65
|
+
function filed_at_of(read: IssueRead): string | undefined {
|
|
66
|
+
if (read.kind !== 'read') return undefined
|
|
67
|
+
|
|
68
|
+
return parse_json.parse_json_object_or_undefined(read.json, filed_schema)?.createdAt
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The body and trusted comments as `issue:read` prints them, and when the issue was filed; the
|
|
72
|
+
// failure kind when the issue could not be read.
|
|
73
|
+
async function read_issue(issue_number: string): Promise<IssueText | string> {
|
|
74
|
+
const [read, filed] = await Promise.all([
|
|
75
|
+
issue_read_cli.read_block(issue_number),
|
|
76
|
+
git_gh_command.issue_view_json_classified(issue_number, 'createdAt'),
|
|
77
|
+
])
|
|
78
|
+
|
|
79
|
+
return read.kind === 'ok' ? { text: read.block, filed_at: filed_at_of(filed) } : read.kind
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
83
|
+
const [issue_number = ''] = argv
|
|
84
|
+
|
|
85
|
+
if (argv.length !== 1 || !issue_number_shape.is_issue_number(issue_number)) {
|
|
86
|
+
console.error(USAGE)
|
|
87
|
+
|
|
88
|
+
return FAILURE_EXIT_CODE
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const issue = await read_issue(issue_number)
|
|
92
|
+
|
|
93
|
+
if (typeof issue === 'string') {
|
|
94
|
+
console.error(`${UNREADABLE_MESSAGE} ${issue}`)
|
|
95
|
+
|
|
96
|
+
return FAILURE_EXIT_CODE
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.info(session_cite.text(await listing(issue_number, issue)))
|
|
100
|
+
|
|
101
|
+
return SUCCESS_EXIT_CODE
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const defect_origin_cli = { USAGE, run }
|
|
105
|
+
|
|
106
|
+
export { defect_origin_cli }
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { issue_bug_label } from './issue-bug-label'
|
|
2
|
+
import { markdown_section } from './markdown-section'
|
|
3
|
+
|
|
4
|
+
// The origin line a bug body declares under its background heading: the merged pull request that
|
|
5
|
+
// introduced the defect, or "unknown" with the reason it could not be traced. `defect:report` groups
|
|
6
|
+
// defects by it, so a bug filed without one is a defect nobody can attribute.
|
|
7
|
+
|
|
8
|
+
const ORIGIN_PREFIX = '- 原因:'
|
|
9
|
+
const PR_LINE = /^- 原因: #(?<pr>\d+)$/u
|
|
10
|
+
const UNKNOWN_LINE = /^- 原因: 不明((?<reason>[^)]*))$/u
|
|
11
|
+
const MISSING_ORIGIN =
|
|
12
|
+
'missing origin line: a `- 種別: 不具合` body declares `- 原因: #<PR>` or `- 原因: 不明(<reason>)` under ## 背景 (`pnpm josh defect:origin <N>` lists candidates)'
|
|
13
|
+
const MALFORMED_ORIGIN =
|
|
14
|
+
'malformed origin line: write `- 原因: #<PR>` or `- 原因: 不明(<reason>)` with a non-empty reason'
|
|
15
|
+
|
|
16
|
+
type DefectOrigin = { kind: 'pr'; pr: number } | { kind: 'unknown'; reason: string }
|
|
17
|
+
|
|
18
|
+
function origin_lines(body: string): ReadonlyArray<string> {
|
|
19
|
+
const background = markdown_section.section_lines(body, '## 背景').join('\n')
|
|
20
|
+
|
|
21
|
+
return markdown_section
|
|
22
|
+
.unfenced_lines(background)
|
|
23
|
+
.map((line) => line.trim())
|
|
24
|
+
.filter((line) => line.startsWith(ORIGIN_PREFIX))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function parse_unknown(line: string): DefectOrigin | undefined {
|
|
28
|
+
const reason = (UNKNOWN_LINE.exec(line)?.groups?.['reason'] ?? '').trim()
|
|
29
|
+
|
|
30
|
+
return reason === '' ? undefined : { kind: 'unknown', reason }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function parse_line(line: string): DefectOrigin | undefined {
|
|
34
|
+
const pr = PR_LINE.exec(line)?.groups?.['pr']
|
|
35
|
+
|
|
36
|
+
return pr === undefined ? parse_unknown(line) : { kind: 'pr', pr: Number(pr) }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The declared origin, or `undefined` when the body carries no well-formed origin line.
|
|
40
|
+
function parse(body: string): DefectOrigin | undefined {
|
|
41
|
+
const [first] = origin_lines(body)
|
|
42
|
+
|
|
43
|
+
return first === undefined ? undefined : parse_line(first)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Why a bug body's origin line is refused, or `undefined` when it is not a bug or the line is sound.
|
|
47
|
+
function problem(body: string): string | undefined {
|
|
48
|
+
if (!issue_bug_label.is_bug_fix(body)) return undefined
|
|
49
|
+
|
|
50
|
+
const lines = origin_lines(body)
|
|
51
|
+
|
|
52
|
+
if (lines.length === 0) return MISSING_ORIGIN
|
|
53
|
+
|
|
54
|
+
return lines.every((line) => parse_line(line) !== undefined) ? undefined : MALFORMED_ORIGIN
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const defect_origin_line = { MALFORMED_ORIGIN, MISSING_ORIGIN, parse, problem }
|
|
58
|
+
|
|
59
|
+
export type { DefectOrigin }
|
|
60
|
+
export { defect_origin_line }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { defect_origin_cli } from './defect-origin-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh defect:origin` entry, kept apart from `defect-origin-cli.ts` so a bundle carrying that
|
|
6
|
+
// module never fires this guard (joshuafolkken/kit#4186).
|
|
7
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
8
|
+
const ARGV_OFFSET = 2
|
|
9
|
+
|
|
10
|
+
process.exitCode = await defect_origin_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
11
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { issue_cite } from './issue-cite'
|
|
2
|
+
|
|
3
|
+
// Candidate origins for a defect: the merged pull requests that last changed what its issue names.
|
|
4
|
+
// Each backticked path or identifier is looked up in the first-parent merge history — a path by
|
|
5
|
+
// pathspec, anything else by `-S` — and the merges are folded per pull request, newest first. The
|
|
6
|
+
// command only proposes; the filer decides which line to write.
|
|
7
|
+
|
|
8
|
+
const FIELD = '\u{1F}'
|
|
9
|
+
const RECORD = '\u{1E}'
|
|
10
|
+
const LOG_FORMAT = `--format=%cI${FIELD}%s${FIELD}%b${RECORD}`
|
|
11
|
+
const MERGE_RECORD = new RegExp(
|
|
12
|
+
String.raw`^(?<merged_at>[^${FIELD}]*)${FIELD}Merge pull request #(?<pr>\d+) from [^${FIELD}]*${FIELD}(?<title>[^\n]*)`,
|
|
13
|
+
'u',
|
|
14
|
+
)
|
|
15
|
+
const LOG_LIMIT = '--max-count=5'
|
|
16
|
+
const MAX_CANDIDATES = 5
|
|
17
|
+
const DATE_LENGTH = 'YYYY-MM-DD'.length
|
|
18
|
+
const ORIGIN_HINT = '`- 原因: #<PR>`'
|
|
19
|
+
const NO_CANDIDATES = '(no merged pull request changed what the issue names)'
|
|
20
|
+
|
|
21
|
+
interface Merge {
|
|
22
|
+
pr: number
|
|
23
|
+
merged_at: string
|
|
24
|
+
title: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface Candidate extends Merge {
|
|
28
|
+
targets: ReadonlyArray<string>
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface TargetMerges {
|
|
32
|
+
target: string
|
|
33
|
+
merges: ReadonlyArray<Merge>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const BASE_ARGUMENTS = ['log', '--first-parent', '--merges', '--diff-merges=first-parent', '-s']
|
|
37
|
+
|
|
38
|
+
// A merge after the issue was filed cannot have introduced what it reports, so `before` bounds the log.
|
|
39
|
+
function base_arguments(before: string | undefined): Array<string> {
|
|
40
|
+
const bound = before === undefined ? [] : [`--before=${before}`]
|
|
41
|
+
|
|
42
|
+
return [...BASE_ARGUMENTS, ...bound, LOG_LIMIT, LOG_FORMAT]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function path_arguments(target: string, before?: string): Array<string> {
|
|
46
|
+
return [...base_arguments(before), '--', `:(glob)**/${target}`]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function pickaxe_arguments(target: string, before?: string): Array<string> {
|
|
50
|
+
return [...base_arguments(before), `-S${target}`]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The merge's date, its pull request read off the subject, and the title — the body's first line.
|
|
54
|
+
function parse_record(record: string): Merge | undefined {
|
|
55
|
+
const groups = MERGE_RECORD.exec(record.trim())?.groups
|
|
56
|
+
|
|
57
|
+
if (groups === undefined) return undefined
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
pr: Number(groups['pr']),
|
|
61
|
+
merged_at: String(groups['merged_at']),
|
|
62
|
+
title: String(groups['title']),
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function parse_merges(output: string): ReadonlyArray<Merge> {
|
|
67
|
+
return output
|
|
68
|
+
.split(RECORD)
|
|
69
|
+
.map((record) => parse_record(record))
|
|
70
|
+
.filter((merge) => merge !== undefined)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function fold(found: ReadonlyArray<TargetMerges>): Map<number, Candidate> {
|
|
74
|
+
const by_pr = new Map<number, Candidate>()
|
|
75
|
+
|
|
76
|
+
for (const { target, merges } of found) {
|
|
77
|
+
for (const merge of merges) {
|
|
78
|
+
const targets = by_pr.get(merge.pr)?.targets ?? []
|
|
79
|
+
|
|
80
|
+
by_pr.set(merge.pr, { ...merge, targets: [...targets, target] })
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return by_pr
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The pull requests behind every target's merges, newest merge first, at most five.
|
|
88
|
+
function rank(found: ReadonlyArray<TargetMerges>): ReadonlyArray<Candidate> {
|
|
89
|
+
return [...fold(found).values()]
|
|
90
|
+
.toSorted((left, right) => right.merged_at.localeCompare(left.merged_at))
|
|
91
|
+
.slice(0, MAX_CANDIDATES)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function format_candidate(candidate: Candidate): string {
|
|
95
|
+
const date = candidate.merged_at.slice(0, DATE_LENGTH)
|
|
96
|
+
const changed = candidate.targets.join(', ')
|
|
97
|
+
|
|
98
|
+
return `${issue_cite.plain(candidate.pr)} ${date} ${candidate.title}\n changed: ${changed}`
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function format(issue_number: string, candidates: ReadonlyArray<Candidate>): string {
|
|
102
|
+
const header = `origin candidates for ${issue_cite.plain(issue_number)} (newest first; declare one as ${ORIGIN_HINT}):`
|
|
103
|
+
const lines =
|
|
104
|
+
candidates.length === 0
|
|
105
|
+
? [NO_CANDIDATES]
|
|
106
|
+
: candidates.map((candidate) => format_candidate(candidate))
|
|
107
|
+
|
|
108
|
+
return [header, ...lines].join('\n')
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const defect_origin = { format, parse_merges, path_arguments, pickaxe_arguments, rank }
|
|
112
|
+
|
|
113
|
+
export type { Candidate, Merge, TargetMerges }
|
|
114
|
+
export { defect_origin }
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
1
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
5
2
|
import { issue_label_schema } from '#scripts/git/git-schemas'
|
|
6
3
|
import { parse_json } from '#scripts/git/parse-json-array'
|
|
4
|
+
import { shared_cache, type CacheSlot } from '#scripts/josh/shared-cache'
|
|
7
5
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
8
|
-
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
9
6
|
import { z } from 'zod'
|
|
10
7
|
import { defect_rate, type DefectRate, type RateIssue } from './defect-rate'
|
|
11
8
|
|
|
12
|
-
const SUCCESS_EXIT_CODE = 0
|
|
13
|
-
const FAILURE_EXIT_CODE = 1
|
|
14
9
|
const PER_PAGE = '100'
|
|
15
10
|
const FIRST_PAGE = 1
|
|
16
11
|
const SECOND_PAGE = 2
|
|
@@ -19,22 +14,23 @@ const SEARCH_RESULT_CEILING = 1000
|
|
|
19
14
|
// The search API allows 30 requests a minute; both searches together stay at the ~10 requests the
|
|
20
15
|
// sequential walk made, so this bounds only how many are in flight at once.
|
|
21
16
|
const PAGE_CONCURRENCY = 4
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// variable and `1.5` are refused rather than read as a window nobody asked for.
|
|
32
|
-
const DAYS_PATTERN = /^[1-9]\d*$/u
|
|
33
|
-
// Ten years — far past any window worth asking for, and far inside the Date range, so an absurd value
|
|
34
|
-
// is refused with the usage instead of crashing the window's date conversion.
|
|
35
|
-
const MAX_WINDOW_DAYS = 3650
|
|
17
|
+
const MS_PER_MINUTE = 60_000
|
|
18
|
+
const CACHE_TTL_MINUTES = 15
|
|
19
|
+
// A 14-day rate does not move within a quarter of an hour, and every `backlog:next` / `backlog:plan`
|
|
20
|
+
// a backlogrun's drive, probe and board make asks it — each costing two or more search requests
|
|
21
|
+
// against the 30-a-minute limit (joshuafolkken/kit#4550).
|
|
22
|
+
const RATE_CACHE: CacheSlot = {
|
|
23
|
+
prefix: 'josh-defect-rate-',
|
|
24
|
+
ttl_ms: CACHE_TTL_MINUTES * MS_PER_MINUTE,
|
|
25
|
+
}
|
|
36
26
|
|
|
37
|
-
const
|
|
27
|
+
const defect_rate_schema = z.object({
|
|
28
|
+
days: z.number(),
|
|
29
|
+
since: z.string(),
|
|
30
|
+
defects: z.number(),
|
|
31
|
+
enhancements: z.number(),
|
|
32
|
+
is_capped: z.boolean(),
|
|
33
|
+
})
|
|
38
34
|
|
|
39
35
|
const search_item_schema = z.object({
|
|
40
36
|
body: z.string().nullish(),
|
|
@@ -55,20 +51,6 @@ interface SearchResult {
|
|
|
55
51
|
is_capped: boolean
|
|
56
52
|
}
|
|
57
53
|
|
|
58
|
-
function read_days(argv: ReadonlyArray<string>): number | undefined {
|
|
59
|
-
const values = cli_flags.values_of(argv, OPTIONS)
|
|
60
|
-
|
|
61
|
-
if (values === undefined) return undefined
|
|
62
|
-
|
|
63
|
-
const raw = values.days ?? String(defect_rate.DEFAULT_WINDOW_DAYS)
|
|
64
|
-
|
|
65
|
-
if (!DAYS_PATTERN.test(raw)) return undefined
|
|
66
|
-
|
|
67
|
-
const days = Number(raw)
|
|
68
|
-
|
|
69
|
-
return days <= MAX_WINDOW_DAYS ? days : undefined
|
|
70
|
-
}
|
|
71
|
-
|
|
72
54
|
function search_path(query: string, page: number = FIRST_PAGE): string {
|
|
73
55
|
const parameters = new URLSearchParams({ q: query, per_page: PER_PAGE })
|
|
74
56
|
|
|
@@ -136,14 +118,11 @@ async function search(query: string): Promise<SearchResult | undefined> {
|
|
|
136
118
|
}
|
|
137
119
|
}
|
|
138
120
|
|
|
139
|
-
|
|
140
|
-
// this same measurement, so the two cannot disagree about the rate.
|
|
141
|
-
async function measure_window(
|
|
121
|
+
async function measure_uncached(
|
|
142
122
|
repo: string,
|
|
143
123
|
days: number,
|
|
144
|
-
|
|
124
|
+
since: string,
|
|
145
125
|
): Promise<DefectRate | undefined> {
|
|
146
|
-
const since = defect_rate.window_start(now_ms, days)
|
|
147
126
|
const [filed, completed] = await Promise.all([
|
|
148
127
|
search(defect_rate.filed_query(repo, since)),
|
|
149
128
|
search(defect_rate.completed_query(repo, since)),
|
|
@@ -162,46 +141,23 @@ async function measure_window(
|
|
|
162
141
|
})
|
|
163
142
|
}
|
|
164
143
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
for (const line of defect_rate.format(measured)) console.info(line)
|
|
175
|
-
|
|
176
|
-
return SUCCESS_EXIT_CODE
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
async function run(argv: ReadonlyArray<string>, now_ms: number = Date.now()): Promise<number> {
|
|
180
|
-
const days = read_days(argv)
|
|
181
|
-
|
|
182
|
-
if (days === undefined) {
|
|
183
|
-
console.error(USAGE)
|
|
184
|
-
|
|
185
|
-
return FAILURE_EXIT_CODE
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const repo = await git_gh_command.repo_get_name_with_owner()
|
|
189
|
-
|
|
190
|
-
if (repo === undefined) {
|
|
191
|
-
console.error(UNKNOWN_REPO_MESSAGE)
|
|
192
|
-
|
|
193
|
-
return FAILURE_EXIT_CODE
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return await report(repo, days, now_ms)
|
|
197
|
-
}
|
|
144
|
+
// The rate over a window, or `undefined` when either search could not be read. `backlog:next` asks it.
|
|
145
|
+
// Shared across processes for `CACHE_TTL_MINUTES`; an unread rate is not kept.
|
|
146
|
+
async function measure_window(
|
|
147
|
+
repo: string,
|
|
148
|
+
days: number,
|
|
149
|
+
now_ms: number,
|
|
150
|
+
): Promise<DefectRate | undefined> {
|
|
151
|
+
const since = defect_rate.window_start(now_ms, days)
|
|
152
|
+
const key = [repo, String(days), since].join(' ')
|
|
198
153
|
|
|
199
|
-
|
|
200
|
-
|
|
154
|
+
return await shared_cache.remember(
|
|
155
|
+
{ slot: RATE_CACHE, key, schema: defect_rate_schema },
|
|
156
|
+
async () => await measure_uncached(repo, days, since),
|
|
157
|
+
now_ms,
|
|
158
|
+
)
|
|
201
159
|
}
|
|
202
160
|
|
|
203
|
-
const defect_rate_cli = {
|
|
204
|
-
|
|
205
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
161
|
+
const defect_rate_cli = { RATE_CACHE, search_path, measure_window }
|
|
206
162
|
|
|
207
163
|
export { defect_rate_cli }
|
|
@@ -119,28 +119,12 @@ function rate_text(result: DefectRate): string {
|
|
|
119
119
|
return `${rate.toFixed(RATE_DIGITS)} (${String(result.defects)} / ${String(result.enhancements)})`
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
function format(result: DefectRate): ReadonlyArray<string> {
|
|
123
|
-
const lines = [
|
|
124
|
-
`Defect rate over the last ${String(result.days)} days (since ${result.since}): ${rate_text(result)}`,
|
|
125
|
-
` Defects filed: ${String(result.defects)} — labelled ${DEFECT_LABELS.join(' / ')} or declared \`${DEFECT_DECLARATION_LINE}\``,
|
|
126
|
-
` Enhancements completed: ${String(result.enhancements)} — labelled ${ENHANCEMENT_LABEL}, closed as completed`,
|
|
127
|
-
]
|
|
128
|
-
|
|
129
|
-
if (!result.is_capped) return lines
|
|
130
|
-
|
|
131
|
-
return [
|
|
132
|
-
...lines,
|
|
133
|
-
'⚠ The search stopped before the end of the window; both counts are lower bounds.',
|
|
134
|
-
]
|
|
135
|
-
}
|
|
136
|
-
|
|
137
122
|
const defect_rate = {
|
|
138
123
|
BASELINE_RATE,
|
|
139
124
|
DEFAULT_WINDOW_DAYS,
|
|
140
125
|
DEFECT_DECLARATION_LINE,
|
|
141
126
|
completed_query,
|
|
142
127
|
filed_query,
|
|
143
|
-
format,
|
|
144
128
|
is_above_baseline,
|
|
145
129
|
is_defect,
|
|
146
130
|
kind_of,
|