@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
|
@@ -7,19 +7,19 @@ import { issue_backlinks } from './issue-backlinks'
|
|
|
7
7
|
import { issue_classification } from './issue-classification'
|
|
8
8
|
import {
|
|
9
9
|
AUTO_OK_LABEL,
|
|
10
|
-
DEPTH_LABEL_ORDER,
|
|
11
10
|
FILING_ROUTE_LABELS,
|
|
12
11
|
has_label_name,
|
|
13
12
|
RUN_LANE_LABEL,
|
|
14
13
|
RUN_SOLO_LABEL,
|
|
15
14
|
} from './issue-labels'
|
|
15
|
+
import { issue_not_before_label } from './issue-not-before-label'
|
|
16
|
+
import { issue_priority } from './issue-priority'
|
|
16
17
|
import { markdown_section } from './markdown-section'
|
|
17
18
|
|
|
18
19
|
// The decisions behind `josh issue:file`, kept apart from the command that
|
|
19
20
|
// reads the network so each one is a pure answer a test can pin. The filing steps are the command's
|
|
20
21
|
// arguments: a label the filing owes is a required option rather than a line to remember.
|
|
21
22
|
|
|
22
|
-
const DEPTH_PREFIX = 'depth:'
|
|
23
23
|
const ROUTE_PREFIX = 'route:'
|
|
24
24
|
const LIST_SEPARATOR = ','
|
|
25
25
|
const WORD_SEPARATOR = /\s+/u
|
|
@@ -32,7 +32,6 @@ const DIGIT = /\d/u
|
|
|
32
32
|
interface FileArguments {
|
|
33
33
|
title: string
|
|
34
34
|
body_file: string
|
|
35
|
-
depth: string
|
|
36
35
|
route: string | undefined
|
|
37
36
|
labels: ReadonlyArray<string>
|
|
38
37
|
repo: string | undefined
|
|
@@ -48,7 +47,6 @@ interface FileArguments {
|
|
|
48
47
|
|
|
49
48
|
const OPTIONS = {
|
|
50
49
|
'body-file': { type: 'string' },
|
|
51
|
-
depth: { type: 'string' },
|
|
52
50
|
route: { type: 'string' },
|
|
53
51
|
label: { type: 'string', multiple: true },
|
|
54
52
|
repo: { type: 'string' },
|
|
@@ -58,8 +56,8 @@ const OPTIONS = {
|
|
|
58
56
|
release: { type: 'boolean' },
|
|
59
57
|
} as const
|
|
60
58
|
|
|
61
|
-
// The label a `--
|
|
62
|
-
//
|
|
59
|
+
// The label a `--route` value names, or `undefined` when it names none — read against the route
|
|
60
|
+
// labels `issue-labels.ts` defines, so the command cannot apply a route nobody provisions.
|
|
63
61
|
function label_of(
|
|
64
62
|
prefix: string,
|
|
65
63
|
value: string | undefined,
|
|
@@ -97,18 +95,15 @@ function has_text(value: string | undefined): value is string {
|
|
|
97
95
|
return value !== undefined && value.trim() !== ''
|
|
98
96
|
}
|
|
99
97
|
|
|
100
|
-
// The labelled half of the arguments, or `undefined` when a
|
|
101
|
-
//
|
|
102
|
-
function labelled_of(
|
|
103
|
-
values: ParsedValues,
|
|
104
|
-
): Pick<FileArguments, 'depth' | 'route' | 'distinct'> | undefined {
|
|
105
|
-
const depth = label_of(DEPTH_PREFIX, values.depth, DEPTH_LABEL_ORDER)
|
|
98
|
+
// The labelled half of the arguments, or `undefined` when a route or `--distinct` entry is not one the
|
|
99
|
+
// command knows.
|
|
100
|
+
function labelled_of(values: ParsedValues): Pick<FileArguments, 'route' | 'distinct'> | undefined {
|
|
106
101
|
const route = route_of(values)
|
|
107
102
|
const distinct = distinct_numbers(values.distinct ?? [])
|
|
108
103
|
|
|
109
|
-
if (route === false ||
|
|
104
|
+
if (route === false || distinct === undefined) return undefined
|
|
110
105
|
|
|
111
|
-
return {
|
|
106
|
+
return { route, distinct }
|
|
112
107
|
}
|
|
113
108
|
|
|
114
109
|
function arguments_of(values: ParsedValues, title: string | undefined): FileArguments | undefined {
|
|
@@ -144,14 +139,19 @@ function is_undeclared_classification(label: string, body: string): boolean {
|
|
|
144
139
|
return is_classification && !has_label_name(issue_classification.required_labels(body), label)
|
|
145
140
|
}
|
|
146
141
|
|
|
147
|
-
// Every label the filing carries: the
|
|
142
|
+
// Every label the filing carries: the route when there is one, the classification labels
|
|
148
143
|
// the body declares (`issue_classification.labels_for`, which merges case-insensitively), then any
|
|
149
144
|
// extra `--label`, then `auto-ok` when the filing is judged in (`issue-auto-ok.ts`) and no `--label`
|
|
150
|
-
// already named it
|
|
145
|
+
// already named it, `not-before` while the body's start time is ahead (`issue-not-before-label.ts`), and
|
|
146
|
+
// the declared priority's label unless a `--label` typed one (`issue-priority.ts`).
|
|
147
|
+
// One request applies them all, so no label is a separate step to forget.
|
|
151
148
|
function labels_of(args: FileArguments, body: string, is_auto_ok = false): ReadonlyArray<string> {
|
|
152
149
|
const extra = args.labels.filter((label) => !is_undeclared_classification(label, body))
|
|
153
|
-
const declared = [
|
|
154
|
-
const labels =
|
|
150
|
+
const declared = [...(args.route === undefined ? [] : [args.route]), ...extra]
|
|
151
|
+
const labels = issue_priority.with_label(
|
|
152
|
+
issue_not_before_label.with_label(issue_classification.labels_for(body, declared), body),
|
|
153
|
+
body,
|
|
154
|
+
)
|
|
155
155
|
|
|
156
156
|
if (!is_auto_ok || has_label_name(labels, AUTO_OK_LABEL)) return labels
|
|
157
157
|
|
|
@@ -168,7 +168,7 @@ function triage_problem(labels: ReadonlyArray<string>): string | undefined {
|
|
|
168
168
|
|
|
169
169
|
if (!is_owed) return undefined
|
|
170
170
|
|
|
171
|
-
return `an \`${AUTO_OK_LABEL}\` filing needs \`--label ${RUN_LANE_LABEL}\` or \`--label ${RUN_SOLO_LABEL}\` — \`${RUN_SOLO_LABEL}\` only for a defect in kit's own verification that makes unrelated PRs answer wrongly on main
|
|
171
|
+
return `an \`${AUTO_OK_LABEL}\` filing needs \`--label ${RUN_LANE_LABEL}\` or \`--label ${RUN_SOLO_LABEL}\` — \`${RUN_SOLO_LABEL}\` only for a defect in kit's own verification that makes unrelated PRs answer wrongly on main on every run (\`backlogrun-lanes.md\`), else \`${RUN_LANE_LABEL}\` — a flaky one takes \`${RUN_LANE_LABEL}\` and \`priority:critical\``
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
function is_same_repository(target: string, current: string): boolean {
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { git_command } from '#scripts/git/git-command'
|
|
4
1
|
import { path_decision } from '#scripts/josh/path-decision'
|
|
5
2
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
6
3
|
import { split_assess, type SplitVerdict } from '#scripts/split/split-assess'
|
|
4
|
+
import { split_measure } from '#scripts/split/split-measure'
|
|
7
5
|
import { issue_fold, type FoldVerdict } from './issue-fold'
|
|
8
6
|
|
|
9
7
|
// `josh issue:fold "<title>" "<title>" …` — before a run files a second finding, answer whether the
|
|
@@ -15,7 +13,6 @@ import { issue_fold, type FoldVerdict } from './issue-fold'
|
|
|
15
13
|
// `--not-separable` when the findings are really one deliverable. The verdict logic is in
|
|
16
14
|
// `issue-fold.ts`; everything here is the invocation.
|
|
17
15
|
|
|
18
|
-
const ARGV_OFFSET = 2
|
|
19
16
|
const USAGE = 'Usage: josh issue:fold "<title>" "<title>" … [--not-separable] [--json]'
|
|
20
17
|
const JSON_KEY = 'fold'
|
|
21
18
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -58,7 +55,7 @@ function read_arguments(argv: ReadonlyArray<string>): FoldArguments | undefined
|
|
|
58
55
|
// rather than folding on no evidence. `issue:file` asks it too.
|
|
59
56
|
async function size_verdict(): Promise<SplitVerdict | undefined> {
|
|
60
57
|
try {
|
|
61
|
-
const measurement =
|
|
58
|
+
const measurement = await split_measure.read_branch()
|
|
62
59
|
|
|
63
60
|
return measurement.files === 0 ? undefined : measurement.verdict
|
|
64
61
|
} catch {
|
|
@@ -91,12 +88,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
91
88
|
return 0
|
|
92
89
|
}
|
|
93
90
|
|
|
94
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
95
|
-
process.exitCode = await run(argv)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
91
|
const issue_fold_cli = { REASONS, read_arguments, size_verdict, run }
|
|
99
92
|
|
|
100
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
101
|
-
|
|
102
93
|
export { issue_fold_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_fold_cli } from './issue-fold-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:fold` entry, kept apart from `issue-fold-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_fold_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
// The workflow label names, defined once. The epic auto-close, the epic validator, the issue-prep
|
|
2
2
|
// labeler and the next-issues display all key on these exact strings, and a drifted copy would
|
|
3
3
|
// fail silently — an epic filtered on the wrong name is simply never closed or never excluded.
|
|
4
|
+
//
|
|
5
|
+
// **A new label is defined here and added to `REPOSITORY_LABELS`**, so `josh start` and `josh sync`
|
|
6
|
+
// create it; a label deliberately not provisioned goes into `EXEMPT_FROM_PROVISIONING` with its
|
|
7
|
+
// reason. Every other module imports the constant rather than spelling the name —
|
|
8
|
+
// `issue-label-scan.test.ts` fails on a `*_LABEL` constant missing from `ALL_LABELS`, on a label name
|
|
9
|
+
// spelled outside this module, and on a label call naming a label `ALL_LABELS` does not hold.
|
|
4
10
|
const EPIC_LABEL = 'epic'
|
|
5
11
|
const BUG_LABEL = 'bug'
|
|
6
12
|
const ENHANCEMENT_LABEL = 'enhancement'
|
|
@@ -15,6 +21,11 @@ const PLANNED_LABEL = 'run:planned'
|
|
|
15
21
|
// it: a parked child is why a run reports "nothing left that time will fix" rather than waiting
|
|
16
22
|
// forever.
|
|
17
23
|
const NEEDS_DECISION_LABEL = 'needs-decision'
|
|
24
|
+
// Parks a child the `backlogrun` driver could not finish mechanically — its session ended unfinished, or
|
|
25
|
+
// its ship hit the relaunch cap. **Not `needs-decision`**: nothing is asked of a person beyond fixing the
|
|
26
|
+
// cause and removing it, so the board and the idle report keep it out of the decisions they list. Parked
|
|
27
|
+
// all the same, so a child failing on one cause is not handed straight back until the cause is fixed.
|
|
28
|
+
const RUN_STALLED_LABEL = 'run:stalled'
|
|
18
29
|
// Marks an issue whose defect reaches the verification path, so it runs with nothing beside it.
|
|
19
30
|
// A run applies it from the verification-path enumeration in `backlogrun-lanes.md`;
|
|
20
31
|
// `backlog:next` enforces it (`backlog-solo.ts`), so the rule no longer rests on a judgement at
|
|
@@ -24,11 +35,15 @@ const RUN_SOLO_LABEL = 'run:solo'
|
|
|
24
35
|
// Without it an issue lacking `run:solo` could mean "judged parallel" or
|
|
25
36
|
// "never judged", and `backlog:next` withholds the second (`epic-triage.ts`).
|
|
26
37
|
const RUN_LANE_LABEL = 'run:lane'
|
|
27
|
-
// Puts an issue at the head of the backlog's ranking
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
38
|
+
// Puts an issue at the head of the backlog's ranking, below `priority:critical`. `issue:file` applies
|
|
39
|
+
// it from the body's priority declaration at its high level (`issue-priority.ts`), a person may apply it by
|
|
40
|
+
// hand, and **only a person removes it**: a run that could clear it could undo the person's ordering.
|
|
41
|
+
// Read by `issue-rank.ts`, the one place the ranking keys are decided.
|
|
31
42
|
const PRIORITY_HIGH_LABEL = 'priority:high'
|
|
43
|
+
// Ranks above `priority:high` — an urgent defect (one of the interrupt-filing conditions) or a lane
|
|
44
|
+
// speed-up worth at least a tenth of a merge's median lane time. Applied from the urgent declaration;
|
|
45
|
+
// it never interrupts a running lane, only takes the next free one. Only a person removes it.
|
|
46
|
+
const PRIORITY_CRITICAL_LABEL = 'priority:critical'
|
|
32
47
|
// Opts one issue outside any epic into unattended execution. **Only a
|
|
33
48
|
// person applies it.** `epicrun #<E>` approves the merges inside `#<E>`; this label is the only way
|
|
34
49
|
// a person extends that approval past the epic's edge, so a label an AI could apply to itself would
|
|
@@ -64,6 +79,10 @@ const NEEDS_HUMAN_REVIEW_LABEL = 'needs-human-review'
|
|
|
64
79
|
// takes it off, because taking it off asserts the work is *not* done, which is the same claim in
|
|
65
80
|
// reverse and is no more a run's to make.
|
|
66
81
|
const ALREADY_DONE_LABEL = 'already-done'
|
|
82
|
+
// The mark of a measurement-only Issue a run closed itself (`josh issue:measured`). No pull request
|
|
83
|
+
// closes such an Issue, so the merge reference a sweep reads is missing; this label is what tells the
|
|
84
|
+
// run's own close from a person's, so every sweep counts it as merged (`issue-merged.ts`).
|
|
85
|
+
const MEASURED_LABEL = 'measured'
|
|
67
86
|
// Marks the Issue that tracks a repository's next release. An Issue whose
|
|
68
87
|
// change reaches a consumer only once published is linked to it as a `blocked_by` blocker
|
|
69
88
|
// (`josh issue:release`), so "merged but not yet released" is visible in the backlog. A run applies
|
|
@@ -71,16 +90,28 @@ const ALREADY_DONE_LABEL = 'already-done'
|
|
|
71
90
|
// and only a person opts it into unattended execution.
|
|
72
91
|
const RELEASE_LABEL = 'release'
|
|
73
92
|
// A person's mark for work set aside for now; `issue-auto-ok.ts` reads it as an exclusion. Applied by
|
|
74
|
-
// hand
|
|
93
|
+
// hand, so it is provisioned: a person cannot apply a label the repository does not have.
|
|
75
94
|
const DEFERRED_LABEL = 'deferred'
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
|
|
95
|
+
// A copy of the body's start-time declaration while that time is still ahead (`issue-not-before.ts`), so a
|
|
96
|
+
// listing tells an issue that waits on the clock from one that can start. The body stays the source:
|
|
97
|
+
// `issue-not-before-label.ts` applies and removes it. Only `run:merge` reads it as a reason to wait,
|
|
98
|
+
// and only where the body itself could not be read (`run-merge-steps.ts`).
|
|
99
|
+
const NOT_BEFORE_LABEL = 'not-before'
|
|
100
|
+
|
|
101
|
+
// The labels that park an open issue: a run never starts or restarts it, and only a person lifts
|
|
102
|
+
// them — `needs-decision` waits for an answer, `run:stalled` for a mechanical cause to be fixed, and
|
|
103
|
+
// `already-done` for the close. The run that applied any of them committed nothing, so the checkout
|
|
104
|
+
// is clean. Held once because the merge, the board, the pool, the classification and the liveness
|
|
105
|
+
// read all ask "is this child parked", and a copy that missed a label would answer differently.
|
|
106
|
+
const PARKED_LABELS: ReadonlySet<string> = new Set([
|
|
107
|
+
NEEDS_DECISION_LABEL,
|
|
108
|
+
RUN_STALLED_LABEL,
|
|
109
|
+
ALREADY_DONE_LABEL,
|
|
110
|
+
])
|
|
79
111
|
|
|
80
|
-
// The
|
|
112
|
+
// The labels that mean an open issue must not be handed to a run as it stands: an `epic`
|
|
81
113
|
// tracks a batch and is never run directly (its children are), `in-progress` is already claimed by
|
|
82
|
-
// a running workflow, `
|
|
83
|
-
// person, and `already-done` names work that is already merged. Held here rather than in either
|
|
114
|
+
// a running workflow, and a parked issue (`PARKED_LABELS`) waits on a person. Held here rather than in either
|
|
84
115
|
// caller because both the next-issues display and the `auto-ok` pickup ask the same question, and
|
|
85
116
|
// two copies would answer it differently the first time one of them gained another label.
|
|
86
117
|
//
|
|
@@ -91,8 +122,7 @@ const REVIEW_ROUND2_SKIPPED_LABEL = 'review-round2-skipped'
|
|
|
91
122
|
const NOT_DIRECTLY_RUNNABLE_LABELS: ReadonlySet<string> = new Set([
|
|
92
123
|
EPIC_LABEL,
|
|
93
124
|
IN_PROGRESS_LABEL,
|
|
94
|
-
|
|
95
|
-
ALREADY_DONE_LABEL,
|
|
125
|
+
...PARKED_LABELS,
|
|
96
126
|
])
|
|
97
127
|
|
|
98
128
|
// Filing-route labels, applied at filing time so the backlog's composition — a review-cap
|
|
@@ -149,61 +179,6 @@ const FILING_ROUTE_LABELS: ReadonlyArray<{
|
|
|
149
179
|
},
|
|
150
180
|
]
|
|
151
181
|
|
|
152
|
-
// The depth of an issue's subject, recorded as a label at filing time.
|
|
153
|
-
//
|
|
154
|
-
// **The definition is not here.** `.claude/skills/workflow-commands/observation-filing.md` → "The depth test",
|
|
155
|
-
// is the single source: depth 0 is what a consumer of this package touches, depth 1 the run
|
|
156
|
-
// orchestration that executes an Issue, depth 2 what measures a run. These constants are the
|
|
157
|
-
// recording of that table, never a second copy of it — a label whose description restated the rule
|
|
158
|
-
// would be the clone `CLAUDE.md` prohibits, and the descriptions below therefore name the section
|
|
159
|
-
// rather than paraphrase it.
|
|
160
|
-
//
|
|
161
|
-
// **Why a label at all.** The share of open issues at depth 0 is a measured target, and without a
|
|
162
|
-
// recorded depth it could only be obtained by reading every open issue's body by hand — hand counts
|
|
163
|
-
// disagree on the denominator and are not comparable, which is the failure a recorded label removes.
|
|
164
|
-
//
|
|
165
|
-
// **The depth is read off the subject, so a run applies it.** Unlike `auto-ok` and
|
|
166
|
-
// `needs-human-review` this is not a person's judgement about authorization; it is the same reading
|
|
167
|
-
// `observation-filing.md` already asks a run to make before it files, and none of the three withholds or widens anything
|
|
168
|
-
// a run may do.
|
|
169
|
-
const DEPTH_0_LABEL = 'depth:0'
|
|
170
|
-
const DEPTH_1_LABEL = 'depth:1'
|
|
171
|
-
const DEPTH_2_LABEL = 'depth:2'
|
|
172
|
-
|
|
173
|
-
// Ordered shallowest first, which is what makes `depth_label_of` deterministic: an issue carrying
|
|
174
|
-
// more than one depth label counts as the **lowest** depth present, the one closest to the consumer.
|
|
175
|
-
// Without a fixed tie-break the same listing measured twice could answer differently.
|
|
176
|
-
const DEPTH_LABEL_ORDER: ReadonlyArray<string> = [DEPTH_0_LABEL, DEPTH_1_LABEL, DEPTH_2_LABEL]
|
|
177
|
-
|
|
178
|
-
// The metadata `gh api ... labels` needs, in the shape `FILING_ROUTE_LABELS` above uses and for the
|
|
179
|
-
// same reason: applying a label at issue-creation auto-creates it with a generated color and no
|
|
180
|
-
// description, so provisioning from here is what gives each one a stable color a reader can scan by.
|
|
181
|
-
// Green, amber and pale blue, so the consumer-facing depth is the one that stands out in a listing.
|
|
182
|
-
//
|
|
183
|
-
// **`josh issue:file` provisions them** through `repository_labels.ensure_labels` before its create
|
|
184
|
-
// call, so no document carries a creation command to keep in step.
|
|
185
|
-
const DEPTH_LABELS: ReadonlyArray<{
|
|
186
|
-
name: string
|
|
187
|
-
color: string
|
|
188
|
-
description: string
|
|
189
|
-
}> = [
|
|
190
|
-
{
|
|
191
|
-
name: DEPTH_0_LABEL,
|
|
192
|
-
color: '0e8a16',
|
|
193
|
-
description: 'Depth 0 — what a consumer of this package touches (observation-filing.md)',
|
|
194
|
-
},
|
|
195
|
-
{
|
|
196
|
-
name: DEPTH_1_LABEL,
|
|
197
|
-
color: 'fbc02d',
|
|
198
|
-
description: 'Depth 1 — the run orchestration that executes an Issue (observation-filing.md)',
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
name: DEPTH_2_LABEL,
|
|
202
|
-
color: 'c5def5',
|
|
203
|
-
description: 'Depth 2 — what measures a run (observation-filing.md)',
|
|
204
|
-
},
|
|
205
|
-
]
|
|
206
|
-
|
|
207
182
|
interface LabelDefinition {
|
|
208
183
|
name: string
|
|
209
184
|
color: string
|
|
@@ -234,6 +209,11 @@ const WORKFLOW_LABELS: ReadonlyArray<LabelDefinition> = [
|
|
|
234
209
|
color: '0e8a16',
|
|
235
210
|
description: 'Judged safe to run beside others in a backlogrun',
|
|
236
211
|
},
|
|
212
|
+
{
|
|
213
|
+
name: PRIORITY_CRITICAL_LABEL,
|
|
214
|
+
color: 'b60205',
|
|
215
|
+
description: 'Offered before priority:high in a backlogrun; only a person removes it',
|
|
216
|
+
},
|
|
237
217
|
{
|
|
238
218
|
name: PRIORITY_HIGH_LABEL,
|
|
239
219
|
color: 'e99695',
|
|
@@ -254,6 +234,12 @@ const WORKFLOW_LABELS: ReadonlyArray<LabelDefinition> = [
|
|
|
254
234
|
color: 'd93f0b',
|
|
255
235
|
description: 'Parked: needs a decision before it can run',
|
|
256
236
|
},
|
|
237
|
+
{
|
|
238
|
+
name: RUN_STALLED_LABEL,
|
|
239
|
+
color: 'e99d42',
|
|
240
|
+
description:
|
|
241
|
+
'Parked: the driver could not finish it mechanically — no decision; fix the cause and remove',
|
|
242
|
+
},
|
|
257
243
|
{
|
|
258
244
|
name: NEEDS_HUMAN_REVIEW_LABEL,
|
|
259
245
|
color: 'd93f0b',
|
|
@@ -265,13 +251,22 @@ const WORKFLOW_LABELS: ReadonlyArray<LabelDefinition> = [
|
|
|
265
251
|
description: 'Verified already merged — a person closes it',
|
|
266
252
|
},
|
|
267
253
|
{
|
|
268
|
-
name:
|
|
269
|
-
color: '
|
|
270
|
-
description: '
|
|
254
|
+
name: MEASURED_LABEL,
|
|
255
|
+
color: '6f42c1',
|
|
256
|
+
description: 'Measurement-only — a run recorded the result and closed it',
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
name: DEFERRED_LABEL,
|
|
260
|
+
color: 'd4c5f9',
|
|
261
|
+
description: 'Set aside for now; never opted in to unattended execution',
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
name: NOT_BEFORE_LABEL,
|
|
265
|
+
color: 'bfd4f2',
|
|
266
|
+
description: "Waiting: the body's 実施可能日 has not arrived yet",
|
|
271
267
|
},
|
|
272
268
|
{ name: BUG_LABEL, color: 'd73a4a', description: "Something isn't working" },
|
|
273
269
|
...FILING_ROUTE_LABELS,
|
|
274
|
-
...DEPTH_LABELS,
|
|
275
270
|
]
|
|
276
271
|
|
|
277
272
|
// The pull request release classifications `pr-classification.yml` requires exactly one of.
|
|
@@ -350,13 +345,9 @@ function has_label_name(labels: ReadonlyArray<string>, wanted: string): boolean
|
|
|
350
345
|
return label_name_of(labels, wanted) !== undefined
|
|
351
346
|
}
|
|
352
347
|
|
|
353
|
-
//
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
function depth_label_of(labels: ReadonlyArray<LabelReference> | undefined): string | undefined {
|
|
357
|
-
const names = new Set((labels ?? []).map((label) => label.name.toLowerCase()))
|
|
358
|
-
|
|
359
|
-
return DEPTH_LABEL_ORDER.find((name) => names.has(name))
|
|
348
|
+
// Whether label names carry any park label (`PARKED_LABELS`), compared as `has_label_name` does.
|
|
349
|
+
function has_parked_label(labels: ReadonlyArray<string>): boolean {
|
|
350
|
+
return [...PARKED_LABELS].some((label) => has_label_name(labels, label))
|
|
360
351
|
}
|
|
361
352
|
|
|
362
353
|
// Every workflow label this package manages. The label-reference scan
|
|
@@ -372,21 +363,22 @@ const ALL_LABELS: ReadonlySet<string> = new Set([
|
|
|
372
363
|
IN_PROGRESS_LABEL,
|
|
373
364
|
PLANNED_LABEL,
|
|
374
365
|
NEEDS_DECISION_LABEL,
|
|
366
|
+
RUN_STALLED_LABEL,
|
|
375
367
|
AUTO_OK_LABEL,
|
|
376
368
|
NEEDS_HUMAN_REVIEW_LABEL,
|
|
377
369
|
ALREADY_DONE_LABEL,
|
|
370
|
+
MEASURED_LABEL,
|
|
371
|
+
DEFERRED_LABEL,
|
|
372
|
+
PRIORITY_CRITICAL_LABEL,
|
|
378
373
|
PRIORITY_HIGH_LABEL,
|
|
379
374
|
RELEASE_LABEL,
|
|
375
|
+
NOT_BEFORE_LABEL,
|
|
380
376
|
INTERRUPT_ROUTE_LABEL,
|
|
381
377
|
REVIEW_CAP_ROUTE_LABEL,
|
|
382
|
-
REVIEW_ROUND2_SKIPPED_LABEL,
|
|
383
378
|
RUN_LANE_LABEL,
|
|
384
379
|
RUN_SOLO_LABEL,
|
|
385
380
|
SPLIT_ROUTE_LABEL,
|
|
386
381
|
TIER_A_ROUTE_LABEL,
|
|
387
|
-
DEPTH_0_LABEL,
|
|
388
|
-
DEPTH_1_LABEL,
|
|
389
|
-
DEPTH_2_LABEL,
|
|
390
382
|
BUGFIX_LABEL,
|
|
391
383
|
OTHER_CHANGE_LABEL,
|
|
392
384
|
IGNORE_FOR_RELEASE_LABEL,
|
|
@@ -406,36 +398,35 @@ export {
|
|
|
406
398
|
BUGFIX_LABEL,
|
|
407
399
|
BREAKING_CHANGE_LABEL,
|
|
408
400
|
DEFERRED_LABEL,
|
|
409
|
-
depth_label_of,
|
|
410
|
-
DEPTH_0_LABEL,
|
|
411
|
-
DEPTH_1_LABEL,
|
|
412
|
-
DEPTH_2_LABEL,
|
|
413
|
-
DEPTH_LABEL_ORDER,
|
|
414
|
-
DEPTH_LABELS,
|
|
415
401
|
ENHANCEMENT_LABEL,
|
|
416
402
|
EPIC_LABEL,
|
|
417
403
|
EXEMPT_FROM_PROVISIONING,
|
|
418
404
|
FILING_ROUTE_LABELS,
|
|
419
405
|
has_any_label,
|
|
420
406
|
has_label_name,
|
|
407
|
+
has_parked_label,
|
|
421
408
|
IGNORE_FOR_RELEASE_LABEL,
|
|
422
409
|
IN_PROGRESS_LABEL,
|
|
423
410
|
INTERRUPT_ROUTE_LABEL,
|
|
424
411
|
label_name_of,
|
|
412
|
+
MEASURED_LABEL,
|
|
425
413
|
NEEDS_DECISION_LABEL,
|
|
426
414
|
NEEDS_HUMAN_REVIEW_LABEL,
|
|
415
|
+
NOT_BEFORE_LABEL,
|
|
427
416
|
NOT_DIRECTLY_RUNNABLE_LABELS,
|
|
428
417
|
OTHER_CHANGE_LABEL,
|
|
418
|
+
PARKED_LABELS,
|
|
429
419
|
PLANNED_LABEL,
|
|
420
|
+
PRIORITY_CRITICAL_LABEL,
|
|
430
421
|
PRIORITY_HIGH_LABEL,
|
|
431
422
|
RELEASE_CLASSIFICATION_LABELS,
|
|
432
423
|
RELEASE_CLASSIFICATION_NAMES,
|
|
433
424
|
RELEASE_LABEL,
|
|
434
425
|
REPOSITORY_LABELS,
|
|
435
426
|
REVIEW_CAP_ROUTE_LABEL,
|
|
436
|
-
REVIEW_ROUND2_SKIPPED_LABEL,
|
|
437
427
|
RUN_LANE_LABEL,
|
|
438
428
|
RUN_SOLO_LABEL,
|
|
429
|
+
RUN_STALLED_LABEL,
|
|
439
430
|
SPLIT_ROUTE_LABEL,
|
|
440
431
|
TIER_A_ROUTE_LABEL,
|
|
441
432
|
WORKFLOW_LABELS,
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { readFile } from 'node:fs/promises'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
4
2
|
import { behavior_change_lint } from './behavior-change-lint'
|
|
5
3
|
import { expected_effect_lint } from './expected-effect-lint'
|
|
6
4
|
import { issue_classification } from './issue-classification'
|
|
7
5
|
import { issue_lint } from './issue-lint'
|
|
6
|
+
import { issue_not_before } from './issue-not-before'
|
|
8
7
|
|
|
9
8
|
// `josh issue:lint <path>` — read an Issue body from a file and print `ok`, or every template problem
|
|
10
9
|
// one per line, exiting non-zero. It reads a path rather than stdin so it can
|
|
@@ -28,6 +27,7 @@ function problems(body: string): ReadonlyArray<string> {
|
|
|
28
27
|
...behavior_change_lint.problems(body),
|
|
29
28
|
...expected_effect_lint.problems(body),
|
|
30
29
|
...issue_classification.problems(body),
|
|
30
|
+
...issue_not_before.problems(body),
|
|
31
31
|
]
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -56,14 +56,6 @@ async function run(body_path: string | undefined): Promise<number> {
|
|
|
56
56
|
return report(problems(body), body)
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
60
|
-
process.exitCode = await run(argv[0])
|
|
61
|
-
}
|
|
62
|
-
|
|
63
59
|
const issue_lint_cli = { problems, run }
|
|
64
60
|
|
|
65
|
-
const ARGV_OFFSET = 2
|
|
66
|
-
|
|
67
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
68
|
-
|
|
69
61
|
export { issue_lint_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_lint_cli } from './issue-lint-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:lint` entry, kept apart from `issue-lint-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 PATH_ARGUMENT_INDEX = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await issue_lint_cli.run(process.argv[PATH_ARGUMENT_INDEX])
|
|
12
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { epic_close } from '#scripts/epic/epic-close'
|
|
4
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
|
+
import { issue_evidence_exit } from '#scripts/issue/issue-evidence-exit'
|
|
6
|
+
import { MEASURED_LABEL } from '#scripts/issue/issue-labels'
|
|
7
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
|
+
|
|
9
|
+
// `josh issue:measured <N> --evidence-file <path>` — the completion of a measurement-only Issue
|
|
10
|
+
// (`issue-comments.md` → "A measurement-only Issue"): the result comment, the
|
|
11
|
+
// `measured` label, the close and the `run:release`, in that order (`issue-evidence-exit.ts`).
|
|
12
|
+
//
|
|
13
|
+
// **The close is the run's own**: such an Issue changes no code, so no pull request's `closes #N`
|
|
14
|
+
// can close it, and an OPEN child `run:merge` reads as `failed` and parks with `run:stalled`. A
|
|
15
|
+
// CLOSED one it reads as `merged` (`run-merge.ts` → `classify_child`). The label goes on before the
|
|
16
|
+
// close because it is what every sweep — `run:carry --end`, `run:tidy` — tells this close from a
|
|
17
|
+
// person's by (`issue-merged.ts`); a close without it would be one they never count as merged.
|
|
18
|
+
|
|
19
|
+
const ARGV_OFFSET = 2
|
|
20
|
+
|
|
21
|
+
async function apply_label(issue_number: string): Promise<boolean> {
|
|
22
|
+
const write = await git_gh_command.issue_apply_label(issue_number, MEASURED_LABEL)
|
|
23
|
+
|
|
24
|
+
if (!write.is_applied) console.error(`${MEASURED_LABEL} not applied: ${write.reason}`)
|
|
25
|
+
|
|
26
|
+
return write.is_applied
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// A closed measurement may be its epic's last child, and no `followup` runs for it — so the epic
|
|
30
|
+
// auto-close is run here, through the one entry every child close takes (`epic-close.ts`).
|
|
31
|
+
async function close_issue(issue_number: string): Promise<boolean> {
|
|
32
|
+
const is_closed = await git_gh_command.issue_close(issue_number, undefined)
|
|
33
|
+
|
|
34
|
+
if (is_closed) await epic_close.close_completed_epics({ issue_number, is_merged: true })
|
|
35
|
+
else console.error(`Issue ${session_cite.issue(issue_number)} not closed`)
|
|
36
|
+
|
|
37
|
+
return is_closed
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function label_and_close(issue_number: string): Promise<boolean> {
|
|
41
|
+
return (await apply_label(issue_number)) && (await close_issue(issue_number))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
45
|
+
return await issue_evidence_exit.run(argv, { command: 'issue:measured', finish: label_and_close })
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
49
|
+
process.exitCode = await run(argv)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const issue_measured_cli = { run }
|
|
53
|
+
|
|
54
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
55
|
+
|
|
56
|
+
export { issue_measured_cli }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
2
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
|
+
import { MEASURED_LABEL } from '#scripts/issue/issue-labels'
|
|
3
4
|
|
|
4
5
|
// Whether an issue was closed by a merge, read from its REST timeline. The
|
|
5
6
|
// issue's own `state_reason` cannot tell: a pull request's `closes #N` and a person's "Close as
|
|
@@ -8,9 +9,15 @@ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
|
8
9
|
// pull request. A manual "completed" close still reads as merged when a merged pull request also
|
|
9
10
|
// references the issue — the one case the timeline cannot separate — and every other doubt falls to
|
|
10
11
|
// `false`, because a sweep deletes work on this answer.
|
|
12
|
+
//
|
|
13
|
+
// **A measurement-only issue stands in for the merge with its `measured` label**: it changes no code,
|
|
14
|
+
// so no pull request closes it, and `josh issue:measured` labels it before closing it. A completed
|
|
15
|
+
// close while the label is on is the run's own, so every sweep reading this answer agrees on it.
|
|
11
16
|
|
|
12
17
|
const CLOSED_EVENT = 'closed'
|
|
13
18
|
const REOPENED_EVENT = 'reopened'
|
|
19
|
+
const LABELED_EVENT = 'labeled'
|
|
20
|
+
const UNLABELED_EVENT = 'unlabeled'
|
|
14
21
|
const MERGED_REFERENCE = 'merged-reference'
|
|
15
22
|
// A close by a pull request's `closes #N` carries no reason in the timeline; a person's "Close as
|
|
16
23
|
// completed" carries `completed`. Any other reason — `not_planned`, `duplicate` — is not a merge, and
|
|
@@ -19,13 +26,16 @@ const COMPLETED_REASONS: ReadonlySet<string> = new Set(['', 'completed'])
|
|
|
19
26
|
const FIELD_SEPARATOR = '\t'
|
|
20
27
|
const LINE_SEPARATOR = '\n'
|
|
21
28
|
// One `<event>\t<state_reason>` line per closed/reopened event, and a `merged-reference` line per
|
|
22
|
-
// merged pull request that cross-references the issue
|
|
29
|
+
// merged pull request that cross-references the issue, and a `labeled` / `unlabeled` line per change of
|
|
30
|
+
// the `measured` label — the kinds the answer reads.
|
|
23
31
|
const TIMELINE_FILTER = [
|
|
24
32
|
'.[]',
|
|
25
33
|
'| if .event == "cross-referenced" and .source.issue.pull_request.merged_at != null',
|
|
26
34
|
String.raw`then "${MERGED_REFERENCE}\t"`,
|
|
27
35
|
`elif .event == "${CLOSED_EVENT}" or .event == "${REOPENED_EVENT}"`,
|
|
28
36
|
String.raw`then "\(.event)\t\(.state_reason // "")"`,
|
|
37
|
+
`elif (.event == "${LABELED_EVENT}" or .event == "${UNLABELED_EVENT}") and .label.name == "${MEASURED_LABEL}"`,
|
|
38
|
+
String.raw`then "\(.event)\t"`,
|
|
29
39
|
'else empty end',
|
|
30
40
|
].join(' ')
|
|
31
41
|
|
|
@@ -45,6 +55,13 @@ function parse_rows(raw: string): Array<TimelineRow> {
|
|
|
45
55
|
})
|
|
46
56
|
}
|
|
47
57
|
|
|
58
|
+
// The last `labeled` / `unlabeled` event of the `measured` label is whether it is on now.
|
|
59
|
+
function is_measured(rows: ReadonlyArray<TimelineRow>): boolean {
|
|
60
|
+
const last = rows.findLast((row) => row.event === LABELED_EVENT || row.event === UNLABELED_EVENT)
|
|
61
|
+
|
|
62
|
+
return last?.event === LABELED_EVENT
|
|
63
|
+
}
|
|
64
|
+
|
|
48
65
|
// The last closed/reopened event is the issue's current state, so a reopened issue is not merged
|
|
49
66
|
// even with a merged reference from an earlier attempt.
|
|
50
67
|
function is_merged_close(rows: ReadonlyArray<TimelineRow>): boolean {
|
|
@@ -52,7 +69,7 @@ function is_merged_close(rows: ReadonlyArray<TimelineRow>): boolean {
|
|
|
52
69
|
|
|
53
70
|
if (last?.event !== CLOSED_EVENT || !COMPLETED_REASONS.has(last.reason)) return false
|
|
54
71
|
|
|
55
|
-
return rows.some((row) => row.event === MERGED_REFERENCE)
|
|
72
|
+
return is_measured(rows) || rows.some((row) => row.event === MERGED_REFERENCE)
|
|
56
73
|
}
|
|
57
74
|
|
|
58
75
|
// `undefined` when the timeline could not be read, so a caller that keeps the answer can tell "not
|