@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
4
|
+
import { lint_related_scope } from '#scripts/lint/lint-related-scope'
|
|
5
|
+
import { gate_plan } from './gate-plan'
|
|
6
|
+
import { input_fingerprint } from './input-fingerprint'
|
|
7
|
+
import { toolchain_inputs } from './toolchain-inputs'
|
|
8
|
+
|
|
9
|
+
// **What each verification depends on, declared once** (joshuafolkken/kit#4495). Every reuse of a
|
|
10
|
+
// verdict — the whole gate (`gate-skip.ts`), one check (`check-reuse.ts`), a scoped record
|
|
11
|
+
// (`scoped-green.ts`) and the since-green narrowing (`since-green.ts`) — answers from the declaration
|
|
12
|
+
// here — the paths through `check-inputs.ts`, the tools and environment through `fingerprint` — so a
|
|
13
|
+
// new reuse picks a declaration rather than writing its own invalidation.
|
|
14
|
+
//
|
|
15
|
+
// A declaration names:
|
|
16
|
+
// - `is_input` — whether a path is a content input; `undefined` leaves it to `reads`.
|
|
17
|
+
// - `reads` — `matched`: the inputs are the paths `is_input` accepts. `recorded`: the inputs are the
|
|
18
|
+
// files a run read, as the run recorded them — the test-read map (joshuafolkken/kit#4314), whose
|
|
19
|
+
// file digests are `input-fingerprint.ts`'s — so a path is an input only when some recorded test
|
|
20
|
+
// reads it.
|
|
21
|
+
// - `is_config` — the files that configure the check: one that moves invalidates the verdict whatever
|
|
22
|
+
// else moved, and stops the since-green narrowing.
|
|
23
|
+
// - `tools` — the packages whose installed version runs the check.
|
|
24
|
+
// - `env` — the environment variables whose value changes the verdict.
|
|
25
|
+
//
|
|
26
|
+
// **A check with no declaration always runs**: `cspell` reads every text file and `behavior` reads a
|
|
27
|
+
// transcript outside the tree. Naming inputs for either would be a guess, and a wrong guess is a check
|
|
28
|
+
// reported green without having run. **The declarations over-approximate, never under**: a path in
|
|
29
|
+
// doubt is an input. `metrics` reads the scripts it counts, the approvals under
|
|
30
|
+
// `.josh/metrics-accepted/` (JSON) and the Markdown it measures (joshuafolkken/kit#4085). `lint` is
|
|
31
|
+
// prettier plus eslint, so its inputs are the sources plus every file prettier formats, less what
|
|
32
|
+
// prettier's own ignore files leave out — prettier answers that itself (`check-inputs.ts`).
|
|
33
|
+
|
|
34
|
+
const GIT_IGNORE = '.gitignore'
|
|
35
|
+
const PRETTIER_IGNORE = '.prettierignore'
|
|
36
|
+
const PRETTIER_IGNORE_FILES = [GIT_IGNORE, PRETTIER_IGNORE] as const
|
|
37
|
+
|
|
38
|
+
// A manifest or lock file moves the installed tools (`toolchain-inputs.ts`, the list every kept result
|
|
39
|
+
// shares), and an ignore or editor file moves what prettier formats — a configuration of every
|
|
40
|
+
// declared check.
|
|
41
|
+
const MANIFEST = 'package.json'
|
|
42
|
+
|
|
43
|
+
const TOOLCHAIN_FILES: ReadonlySet<string> = new Set([
|
|
44
|
+
...toolchain_inputs.PACKAGE_FILES.map((relative) => path.basename(relative)),
|
|
45
|
+
'.editorconfig',
|
|
46
|
+
...PRETTIER_IGNORE_FILES,
|
|
47
|
+
])
|
|
48
|
+
|
|
49
|
+
const PRETTIER_CONFIG_PREFIX = '.prettierrc'
|
|
50
|
+
|
|
51
|
+
// A file name starting with one of these configures the TypeScript program a check compiles, and the
|
|
52
|
+
// test runner for the unit step.
|
|
53
|
+
const COMPILER_CONFIG_PREFIXES = ['tsconfig', 'svelte.config.'] as const
|
|
54
|
+
const TEST_CONFIG_PREFIXES = [...COMPILER_CONFIG_PREFIXES, 'vitest.config.', 'vite.config.']
|
|
55
|
+
|
|
56
|
+
// A file name starting with one of these, or a path under one of the directories, configures prettier,
|
|
57
|
+
// eslint or the TypeScript program its type-aware rules read. Prettier keys its cache on the options
|
|
58
|
+
// too, so a changed `prettier.config.*` re-checks every file the whole-tree run reads.
|
|
59
|
+
const LINT_CONFIG_PREFIXES = ['eslint.config.', 'prettier.config.', ...COMPILER_CONFIG_PREFIXES]
|
|
60
|
+
const LINT_CONFIG_DIRECTORIES: ReadonlySet<string> = new Set(['eslint', 'prettier', 'tsconfig'])
|
|
61
|
+
|
|
62
|
+
const SOURCE_EXTENSIONS: ReadonlySet<string> = new Set([
|
|
63
|
+
'.ts',
|
|
64
|
+
'.tsx',
|
|
65
|
+
'.mts',
|
|
66
|
+
'.cts',
|
|
67
|
+
'.js',
|
|
68
|
+
'.jsx',
|
|
69
|
+
'.mjs',
|
|
70
|
+
'.cjs',
|
|
71
|
+
'.svelte',
|
|
72
|
+
'.vue',
|
|
73
|
+
'.json',
|
|
74
|
+
'.jsonc',
|
|
75
|
+
])
|
|
76
|
+
|
|
77
|
+
const MARKDOWN_EXTENSION = '.md'
|
|
78
|
+
// `NODE_OPTIONS` is left out: package managers and hooks set it differently around the same check,
|
|
79
|
+
// and it tunes the runtime rather than what a check answers.
|
|
80
|
+
const COMMON_ENV = ['NODE_ENV'] as const
|
|
81
|
+
const ABSENT = 'absent'
|
|
82
|
+
|
|
83
|
+
type Environment = Readonly<Record<string, string | undefined>>
|
|
84
|
+
|
|
85
|
+
// Whether prettier would leave `relative` out; `false` when prettier cannot be asked, which keeps the
|
|
86
|
+
// path an input.
|
|
87
|
+
type PrettierIgnored = (relative: string) => Promise<boolean>
|
|
88
|
+
|
|
89
|
+
type FileTest = (relative: string, is_ignored: PrettierIgnored) => Promise<boolean>
|
|
90
|
+
|
|
91
|
+
type InputReads = 'matched' | 'recorded'
|
|
92
|
+
|
|
93
|
+
interface InputDeclaration {
|
|
94
|
+
readonly is_input: FileTest | undefined
|
|
95
|
+
readonly reads: InputReads
|
|
96
|
+
readonly is_config: (relative: string) => boolean
|
|
97
|
+
readonly tools: ReadonlyArray<string>
|
|
98
|
+
readonly env: ReadonlyArray<string>
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function is_source(relative: string): boolean {
|
|
102
|
+
return SOURCE_EXTENSIONS.has(path.extname(relative))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function is_lint_input(relative: string, is_ignored: PrettierIgnored): Promise<boolean> {
|
|
106
|
+
if (is_source(relative)) return true
|
|
107
|
+
if (!lint_related_scope.is_lintable(relative)) return false
|
|
108
|
+
|
|
109
|
+
return !(await is_ignored(relative))
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function is_source_input(relative: string): Promise<boolean> {
|
|
113
|
+
return is_source(relative)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function is_metrics_input(relative: string): Promise<boolean> {
|
|
117
|
+
return is_source(relative) || path.extname(relative) === MARKDOWN_EXTENSION
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function configures_toolchain(relative: string): boolean {
|
|
121
|
+
const name = path.basename(relative)
|
|
122
|
+
|
|
123
|
+
return TOOLCHAIN_FILES.has(name) || name.startsWith(PRETTIER_CONFIG_PREFIX)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function names_any(relative: string, prefixes: ReadonlyArray<string>): boolean {
|
|
127
|
+
const name = path.basename(relative)
|
|
128
|
+
|
|
129
|
+
return configures_toolchain(relative) || prefixes.some((prefix) => name.startsWith(prefix))
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function configures_compiler(relative: string): boolean {
|
|
133
|
+
return names_any(relative, COMPILER_CONFIG_PREFIXES)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function configures_tests(relative: string): boolean {
|
|
137
|
+
return names_any(relative, TEST_CONFIG_PREFIXES)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function configures_lint(relative: string): boolean {
|
|
141
|
+
const [top = ''] = relative.split('/', 1)
|
|
142
|
+
|
|
143
|
+
return LINT_CONFIG_DIRECTORIES.has(top) || names_any(relative, LINT_CONFIG_PREFIXES)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const LINT: InputDeclaration = {
|
|
147
|
+
is_input: is_lint_input,
|
|
148
|
+
reads: 'matched',
|
|
149
|
+
is_config: configures_lint,
|
|
150
|
+
tools: ['prettier', 'eslint', 'typescript'],
|
|
151
|
+
env: COMMON_ENV,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const UNIT: InputDeclaration = {
|
|
155
|
+
is_input: undefined,
|
|
156
|
+
reads: 'recorded',
|
|
157
|
+
is_config: configures_tests,
|
|
158
|
+
tools: ['vitest', 'typescript'],
|
|
159
|
+
env: [...COMMON_ENV, 'TZ'],
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function compiled(is_input: FileTest): InputDeclaration {
|
|
163
|
+
return {
|
|
164
|
+
is_input,
|
|
165
|
+
reads: 'matched',
|
|
166
|
+
is_config: configures_compiler,
|
|
167
|
+
tools: ['typescript'],
|
|
168
|
+
env: COMMON_ENV,
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const DECLARATIONS: ReadonlyMap<string, InputDeclaration> = new Map([
|
|
173
|
+
[gate_plan.LINT_LABEL, LINT],
|
|
174
|
+
[gate_plan.TYPE_CHECK_LABEL, compiled(is_source_input)],
|
|
175
|
+
[gate_plan.EXPORTS_LABEL, compiled(is_source_input)],
|
|
176
|
+
[gate_plan.METRICS_LABEL, compiled(is_metrics_input)],
|
|
177
|
+
[gate_plan.UNIT_LABEL, UNIT],
|
|
178
|
+
])
|
|
179
|
+
|
|
180
|
+
function declaration_of(label: string): InputDeclaration | undefined {
|
|
181
|
+
return DECLARATIONS.get(label)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function is_declared(label: string): boolean {
|
|
185
|
+
return DECLARATIONS.has(label)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Whether any of `relatives` (repository-root relative) configures the check `label` — `true` for an
|
|
189
|
+
// undeclared one, which no narrowing can read past.
|
|
190
|
+
function configures(label: string, relatives: ReadonlyArray<string>): boolean {
|
|
191
|
+
const declaration = DECLARATIONS.get(label)
|
|
192
|
+
|
|
193
|
+
return declaration === undefined || relatives.some((relative) => declaration.is_config(relative))
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function tool_version(root: string, tool: string): string {
|
|
197
|
+
try {
|
|
198
|
+
const manifest: unknown = JSON.parse(
|
|
199
|
+
readFileSync(path.join(root, 'node_modules', tool, MANIFEST), 'utf8'),
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
return typeof manifest === 'object' && manifest !== null && 'version' in manifest
|
|
203
|
+
? String(manifest.version)
|
|
204
|
+
: ABSENT
|
|
205
|
+
} catch {
|
|
206
|
+
return ABSENT
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function entries_of(
|
|
211
|
+
declaration: InputDeclaration,
|
|
212
|
+
root: string,
|
|
213
|
+
environment: Environment,
|
|
214
|
+
): ReadonlyArray<string> {
|
|
215
|
+
return [
|
|
216
|
+
...declaration.tools.map((tool) => `tool:${tool}=${tool_version(root, tool)}`),
|
|
217
|
+
...declaration.env.map((name) => `env:${name}=${environment[name] ?? ABSENT}`),
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// **The fingerprint of what the checks `labels` read beside the files**: the installed version of every
|
|
222
|
+
// declared tool and the value of every declared environment variable, sorted into one digest. The
|
|
223
|
+
// file contents are the record's own file map (`file-map-stamp.ts`) and the merge base its `base`, so a
|
|
224
|
+
// reuse matches all three. One label answers a check's record; every declared label the whole gate's.
|
|
225
|
+
function fingerprint(
|
|
226
|
+
labels: ReadonlyArray<string>,
|
|
227
|
+
root: string = PROJECT_ROOT,
|
|
228
|
+
environment: Environment = process.env,
|
|
229
|
+
): string {
|
|
230
|
+
const declarations = labels.flatMap((label) => DECLARATIONS.get(label) ?? [])
|
|
231
|
+
const entries = new Set(
|
|
232
|
+
declarations.flatMap((declaration) => entries_of(declaration, root, environment)),
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
return input_fingerprint.of_entries(entries)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const DECLARED_LABELS: ReadonlyArray<string> = [...DECLARATIONS.keys()]
|
|
239
|
+
|
|
240
|
+
const verification_inputs = {
|
|
241
|
+
configures,
|
|
242
|
+
declaration_of,
|
|
243
|
+
DECLARED_LABELS,
|
|
244
|
+
fingerprint,
|
|
245
|
+
is_declared,
|
|
246
|
+
PRETTIER_IGNORE_FILES,
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export type { InputDeclaration, InputReads, PrettierIgnored }
|
|
250
|
+
export { verification_inputs }
|
|
@@ -1,14 +1,101 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const TRUSTED_ASSOCIATIONS: ReadonlySet<string> = new Set(['OWNER', 'MEMBER', 'COLLABORATOR'])
|
|
6
|
-
const TRUSTED_LIST = [...TRUSTED_ASSOCIATIONS].join(' / ')
|
|
1
|
+
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
|
+
import { parse_json } from '#scripts/git/parse-json-array'
|
|
4
|
+
import { z } from 'zod'
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
// Whose words kit acts on: the author of an issue or a comment who can write to the repository. On a
|
|
7
|
+
// public repository anyone can file an issue or comment, so a body kit runs (`josh measure:rerun`) or
|
|
8
|
+
// copies into the ledger (`review:record`) is taken only from an author with write access — and an
|
|
9
|
+
// unknown author is not a trusted one.
|
|
10
|
+
//
|
|
11
|
+
// **`author_association` alone does not say "can write"** (joshuafolkken/kit#4037). `OWNER` does, so it
|
|
12
|
+
// is trusted without a request. `MEMBER` is any member of the owning org, whatever their access to this
|
|
13
|
+
// repository, and `COLLABORATOR` includes outside collaborators with read or triage access only — so
|
|
14
|
+
// those two are asked of the collaborator-permission endpoint, once per login per process, and trusted
|
|
15
|
+
// only on a write role. A lookup that fails is not trust.
|
|
16
|
+
const OWNER = 'OWNER'
|
|
17
|
+
const ASKED_ASSOCIATIONS: ReadonlySet<string> = new Set(['MEMBER', 'COLLABORATOR'])
|
|
18
|
+
const WRITE_ROLES: ReadonlySet<string> = new Set(['admin', 'maintain', 'write'])
|
|
19
|
+
// A GitHub user login, an Enterprise Managed User's `name_shortcode` included — it is placed in a REST
|
|
20
|
+
// path, so anything else (a `[bot]` login, a slash) is refused before a request is made.
|
|
21
|
+
const LOGIN_PATTERN = /^[\da-z](?:[\w-]*[\da-z])?$/iu
|
|
22
|
+
const TRUSTED_LIST = 'OWNER, or MEMBER / COLLABORATOR with write access'
|
|
23
|
+
|
|
24
|
+
const permission_schema = z.looseObject({
|
|
25
|
+
permission: z.string().nullish(),
|
|
26
|
+
role_name: z.string().nullish(),
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
// `timeout_ms` bounds the lookup for a caller inside a hook's own timeout (`issue-watch`).
|
|
30
|
+
interface Author {
|
|
31
|
+
login: string | undefined
|
|
32
|
+
association: string | null | undefined
|
|
33
|
+
timeout_ms?: number | undefined
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const answers = new Map<string, Promise<boolean | undefined>>()
|
|
37
|
+
|
|
38
|
+
function permission_path(login: string): string {
|
|
39
|
+
return `${git_gh_api_path.repo_api_path()}/collaborators/${login}/permission`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// `role_name` names `maintain` exactly; `permission` folds it into `write`, so either answers.
|
|
43
|
+
function has_write_role(raw: string): boolean {
|
|
44
|
+
const parsed = parse_json.parse_json_object_or_undefined(raw, permission_schema)
|
|
45
|
+
const roles = [parsed?.role_name, parsed?.permission]
|
|
46
|
+
|
|
47
|
+
return roles.some((role) => typeof role === 'string' && WRITE_ROLES.has(role))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// `undefined` for a lookup that failed, which is not an answer.
|
|
51
|
+
async function ask_permission(login: string, timeout_ms?: number): Promise<boolean | undefined> {
|
|
52
|
+
try {
|
|
53
|
+
const raw = await git_gh_exec.exec_gh_api({ path: permission_path(login), timeout_ms })
|
|
54
|
+
|
|
55
|
+
return has_write_role(raw)
|
|
56
|
+
} catch {
|
|
57
|
+
return undefined
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A failed lookup is not remembered: the backlog driver keeps one process for hours, so one dropped
|
|
62
|
+
// request would otherwise leave that author unanswered until it restarts. Only the caller's own
|
|
63
|
+
// request is evicted, never a newer one another caller has stored since.
|
|
64
|
+
async function can_write(login: string, timeout_ms?: number): Promise<boolean | undefined> {
|
|
65
|
+
const asked = answers.get(login) ?? ask_permission(login, timeout_ms)
|
|
66
|
+
|
|
67
|
+
answers.set(login, asked)
|
|
68
|
+
|
|
69
|
+
const has_write = await asked
|
|
70
|
+
|
|
71
|
+
if (has_write === undefined && answers.get(login) === asked) answers.delete(login)
|
|
72
|
+
|
|
73
|
+
return has_write
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function is_user_login(login: string | undefined): login is string {
|
|
77
|
+
return login !== undefined && LOGIN_PATTERN.test(login)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function is_asked(author: Author): boolean {
|
|
81
|
+
return ASKED_ASSOCIATIONS.has(author.association ?? '') && is_user_login(author.login)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// `undefined` when the lookup failed: neither trusted nor refused, for a caller that must not settle a
|
|
85
|
+
// permanent answer on it (`review-comment-round`).
|
|
86
|
+
async function trust_of(author: Author): Promise<boolean | undefined> {
|
|
87
|
+
if (author.association === OWNER) return true
|
|
88
|
+
if (author.login === undefined || !is_asked(author)) return false
|
|
89
|
+
|
|
90
|
+
return await can_write(author.login, author.timeout_ms)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// A lookup that failed is not trust.
|
|
94
|
+
async function is_trusted(author: Author): Promise<boolean> {
|
|
95
|
+
return (await trust_of(author)) === true
|
|
10
96
|
}
|
|
11
97
|
|
|
12
|
-
const gh_author_association = { TRUSTED_LIST, is_trusted }
|
|
98
|
+
const gh_author_association = { TRUSTED_LIST, is_trusted, trust_of }
|
|
13
99
|
|
|
100
|
+
export type { Author }
|
|
14
101
|
export { gh_author_association }
|
|
@@ -20,8 +20,10 @@ interface ClassifiedFindings {
|
|
|
20
20
|
infos: ReadonlyArray<ClassifiedFinding>
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
// Only the app accounts (`type: Bot`): a bare `claude` / `coderabbitai` is an ordinary user login
|
|
24
|
+
// anyone could register, and its comment is not an AI review.
|
|
25
|
+
const CLAUDE_AUTHORS: ReadonlySet<string> = new Set(['claude[bot]'])
|
|
26
|
+
const CODERABBIT_AUTHORS: ReadonlySet<string> = new Set(['coderabbitai[bot]'])
|
|
25
27
|
|
|
26
28
|
const CLAUDE_BLOCKER_HEADINGS: ReadonlyArray<RegExp> = [
|
|
27
29
|
/^#{2,4}\s+Issues\b/mu,
|
|
@@ -28,6 +28,13 @@ function issue_api_path(issue_number: string, repo?: string): string {
|
|
|
28
28
|
return `${issues_api_path(repo)}/${issue_number}`
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
// One issue's labels — a pull request is an issue to this endpoint. Named here because the label
|
|
32
|
+
// writes and reads in `git-gh-issue-write.ts` and the CI classification read in `pr-classification.ts`
|
|
33
|
+
// all address it.
|
|
34
|
+
function issue_labels_api_path(issue_number: string, repo?: string): string {
|
|
35
|
+
return `${issue_api_path(issue_number, repo)}/labels`
|
|
36
|
+
}
|
|
37
|
+
|
|
31
38
|
// The dependency relations, which REST serves from their own endpoint rather than inside the issue.
|
|
32
39
|
// Named here because three call sites address it — the read in `git-gh-issue-read.ts` and both
|
|
33
40
|
// writes in `git-gh-issue-write.ts`.
|
|
@@ -90,6 +97,12 @@ function commit_status_api_path(commit_sha: string, repo?: string): string {
|
|
|
90
97
|
return `${commit_api_path(commit_sha, repo)}/status`
|
|
91
98
|
}
|
|
92
99
|
|
|
100
|
+
// The rules that apply to one branch, from every ruleset that targets it — readable without the
|
|
101
|
+
// admin access the classic branch protection endpoint needs.
|
|
102
|
+
function branch_rules_api_path(branch_name: string, repo?: string): string {
|
|
103
|
+
return `${repo_api_path(repo)}/rules/branches/${branch_name}`
|
|
104
|
+
}
|
|
105
|
+
|
|
93
106
|
// A single tag reference. REST answers 404 when the tag does not exist, which is the whole of the
|
|
94
107
|
// question the release command's tag watch asks.
|
|
95
108
|
function tag_reference_api_path(tag: string, repo?: string): string {
|
|
@@ -109,6 +122,7 @@ const git_gh_api_path = {
|
|
|
109
122
|
release_by_tag_api_path,
|
|
110
123
|
issues_api_path,
|
|
111
124
|
issue_api_path,
|
|
125
|
+
issue_labels_api_path,
|
|
112
126
|
blocked_by_api_path,
|
|
113
127
|
issue_comments_api_path,
|
|
114
128
|
pulls_api_path,
|
|
@@ -119,6 +133,7 @@ const git_gh_api_path = {
|
|
|
119
133
|
commit_api_path,
|
|
120
134
|
commit_check_runs_api_path,
|
|
121
135
|
commit_status_api_path,
|
|
136
|
+
branch_rules_api_path,
|
|
122
137
|
}
|
|
123
138
|
|
|
124
139
|
export { git_gh_api_path, FULL_PAGE_QUERY }
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
import { FULL_PAGE_QUERY, git_gh_api_path } from './git-gh-api-path'
|
|
4
|
+
import { git_gh_exec } from './git-gh-exec'
|
|
5
|
+
|
|
6
|
+
// The status check contexts the base branch's rules require, which is what lets the merge gate tell
|
|
7
|
+
// a pull request held only by a slow optional check — GitHub's default-setup `CodeQL` — from one
|
|
8
|
+
// still waiting on a check that guards the merge (joshuafolkken/kit#4351).
|
|
9
|
+
//
|
|
10
|
+
// **An empty answer keeps the gate strict, so every gap folds into it.** With no required context
|
|
11
|
+
// known, `git-pr-checks-eval.ts` waits for `CLEAN` exactly as it did before, so a repository with no
|
|
12
|
+
// ruleset, a token the endpoint answers 403 to, or a rate limit costs the wait time it always did and
|
|
13
|
+
// never a merge past a check nobody declared optional.
|
|
14
|
+
|
|
15
|
+
const REQUIRED_STATUS_CHECKS_RULE = 'required_status_checks'
|
|
16
|
+
|
|
17
|
+
const required_check_schema = z.looseObject({ context: z.string() })
|
|
18
|
+
|
|
19
|
+
const rule_parameters_schema = z.looseObject({
|
|
20
|
+
required_status_checks: z.array(required_check_schema).optional(),
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const branch_rule_schema = z.looseObject({
|
|
24
|
+
type: z.string(),
|
|
25
|
+
parameters: rule_parameters_schema.nullish(),
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
type BranchRule = z.infer<typeof branch_rule_schema>
|
|
29
|
+
|
|
30
|
+
// A branch's rules do not change while one command waits on a pull request, so a read is remembered
|
|
31
|
+
// for the life of the command; one that failed is not, and the next poll asks again.
|
|
32
|
+
const required_contexts_by_branch = new Map<string, Array<string>>()
|
|
33
|
+
|
|
34
|
+
function forget_branch_rules(): void {
|
|
35
|
+
required_contexts_by_branch.clear()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function to_required_contexts(rules: ReadonlyArray<BranchRule>): Array<string> {
|
|
39
|
+
return rules
|
|
40
|
+
.filter((rule) => rule.type === REQUIRED_STATUS_CHECKS_RULE)
|
|
41
|
+
.flatMap((rule) => rule.parameters?.required_status_checks ?? [])
|
|
42
|
+
.map((check) => check.context)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function fetch_required_contexts(branch_name: string): Promise<Array<string> | undefined> {
|
|
46
|
+
const raw_json = await git_gh_exec.exec_gh_api({
|
|
47
|
+
path: `${git_gh_api_path.branch_rules_api_path(branch_name)}${FULL_PAGE_QUERY}`,
|
|
48
|
+
should_paginate: true,
|
|
49
|
+
})
|
|
50
|
+
const rules = parse_json_array_or_undefined(raw_json, branch_rule_schema)
|
|
51
|
+
|
|
52
|
+
return rules === undefined ? undefined : to_required_contexts(rules)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function read_required_contexts(branch_name: string | undefined): Promise<Array<string>> {
|
|
56
|
+
if (branch_name === undefined) return []
|
|
57
|
+
const cached = required_contexts_by_branch.get(branch_name)
|
|
58
|
+
if (cached !== undefined) return cached
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const contexts = await fetch_required_contexts(branch_name)
|
|
62
|
+
if (contexts === undefined) return []
|
|
63
|
+
required_contexts_by_branch.set(branch_name, contexts)
|
|
64
|
+
|
|
65
|
+
return contexts
|
|
66
|
+
} catch {
|
|
67
|
+
return []
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const git_gh_branch_rules = { read_required_contexts }
|
|
72
|
+
|
|
73
|
+
export { git_gh_branch_rules, read_required_contexts, forget_branch_rules }
|
|
@@ -19,7 +19,8 @@ const ETAG_HEADER = /^etag: *(?<etag>[^\r\n]+)/imu
|
|
|
19
19
|
type ConditionalRead =
|
|
20
20
|
| { kind: 'unchanged' }
|
|
21
21
|
| { kind: 'changed'; etag: string | undefined; body: string }
|
|
22
|
-
|
|
22
|
+
// `cause` is gh's own failure where there was one, for a caller that reports it.
|
|
23
|
+
| { kind: 'unreadable'; cause?: unknown }
|
|
23
24
|
|
|
24
25
|
const UNCHANGED: ConditionalRead = { kind: 'unchanged' }
|
|
25
26
|
const UNREADABLE: ConditionalRead = { kind: 'unreadable' }
|
|
@@ -56,7 +57,9 @@ async function read_conditional(
|
|
|
56
57
|
try {
|
|
57
58
|
return to_read(await git_gh_exec.exec_gh_command(to_args(path, etag), timeout_ms))
|
|
58
59
|
} catch (error) {
|
|
59
|
-
return failure_status(error) === NOT_MODIFIED_STATUS
|
|
60
|
+
return failure_status(error) === NOT_MODIFIED_STATUS
|
|
61
|
+
? UNCHANGED
|
|
62
|
+
: { kind: 'unreadable', cause: error }
|
|
60
63
|
}
|
|
61
64
|
}
|
|
62
65
|
|
|
@@ -281,7 +281,11 @@ async function issue_view_json(
|
|
|
281
281
|
// `repo` reads a child in another repository. Cross-repository children are read this way rather
|
|
282
282
|
// than from a local checkout: their state is a GitHub fact, and requiring a clone to learn it is
|
|
283
283
|
// what kept the auto-close from ever running on such an epic.
|
|
284
|
-
|
|
284
|
+
//
|
|
285
|
+
// `body` rides along because `epic:next` holds a child until its declared start time
|
|
286
|
+
// (joshuafolkken/kit#4007); the REST issue endpoint answers it in the same response, so it costs no
|
|
287
|
+
// request.
|
|
288
|
+
const STATE_AND_RELATIONS_FIELDS = 'number,state,labels,blockedBy,body'
|
|
285
289
|
|
|
286
290
|
async function issue_get_state_and_relations(
|
|
287
291
|
issue_number: string,
|