@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { cases_interaction_scan, type Findings } from './cases-interaction-scan'
|
|
3
4
|
import { cases, type Boundary } from './cases-logic'
|
|
4
5
|
|
|
5
|
-
// `josh cases <path...>` — print the I/O boundaries the changed paths cross and the
|
|
6
|
-
// each owes. The
|
|
7
|
-
// them; the required cases go on stderr so a person sees them without a
|
|
8
|
-
// The logic and the vocabulary live in `cases-logic.ts
|
|
6
|
+
// `josh cases <path...>` — print the I/O boundaries the changed paths cross, the shared state and the
|
|
7
|
+
// environment they depend on, and the abnormal cases each owes. The tokens go on stdout so
|
|
8
|
+
// `$(pnpm josh cases …)` reads them; the required cases go on stderr so a person sees them without a
|
|
9
|
+
// shell parsing around them. The logic and the vocabulary live in `cases-logic.ts` and
|
|
10
|
+
// `cases-interaction.ts`; everything here is the invocation.
|
|
9
11
|
|
|
10
12
|
const ARGV_OFFSET = 2
|
|
11
13
|
const USAGE = 'Usage: josh cases <path...>'
|
|
@@ -13,19 +15,27 @@ const FAILURE_EXIT_CODE = 1
|
|
|
13
15
|
|
|
14
16
|
function report_none(): number {
|
|
15
17
|
console.info(cases.NONE)
|
|
16
|
-
console.error(
|
|
18
|
+
console.error(
|
|
19
|
+
'no network, process, filesystem, time, shared-state or environment boundary crossed',
|
|
20
|
+
)
|
|
17
21
|
|
|
18
22
|
return 0
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
console.
|
|
25
|
+
// The interaction lines come first, as `report:template` places them at the head of "if it breaks".
|
|
26
|
+
function report_crossed(boundaries: ReadonlyArray<Boundary>, findings: Findings): number {
|
|
27
|
+
console.info([...boundaries, ...cases_interaction_scan.interactions_of(findings)].join(' '))
|
|
28
|
+
|
|
29
|
+
for (const line of cases_interaction_scan.lines_for(findings)) console.error(line)
|
|
30
|
+
|
|
31
|
+
if (boundaries.length > 0) {
|
|
32
|
+
console.error(`required abnormal cases: ${cases.cases_for(boundaries).join(' / ')}`)
|
|
33
|
+
}
|
|
24
34
|
|
|
25
35
|
return 0
|
|
26
36
|
}
|
|
27
37
|
|
|
28
|
-
function run(argv: ReadonlyArray<string>): number {
|
|
38
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
29
39
|
if (argv.length === 0) {
|
|
30
40
|
console.error(USAGE)
|
|
31
41
|
|
|
@@ -33,16 +43,18 @@ function run(argv: ReadonlyArray<string>): number {
|
|
|
33
43
|
}
|
|
34
44
|
|
|
35
45
|
const boundaries = cases.boundaries_in(argv)
|
|
46
|
+
const findings = await cases_interaction_scan.scan(argv)
|
|
47
|
+
const is_crossed = boundaries.length + cases_interaction_scan.interactions_of(findings).length > 0
|
|
36
48
|
|
|
37
|
-
return
|
|
49
|
+
return is_crossed ? report_crossed(boundaries, findings) : report_none()
|
|
38
50
|
}
|
|
39
51
|
|
|
40
|
-
function main(argv: ReadonlyArray<string>): void {
|
|
41
|
-
process.exitCode = run(argv)
|
|
52
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
53
|
+
process.exitCode = await run(argv)
|
|
42
54
|
}
|
|
43
55
|
|
|
44
56
|
const cases_cli = { run }
|
|
45
57
|
|
|
46
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
58
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
47
59
|
|
|
48
60
|
export { cases_cli }
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { git_grep_hits, type GrepResult } from '#scripts/git/git-grep-hits'
|
|
3
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
4
|
+
import {
|
|
5
|
+
cases_interaction,
|
|
6
|
+
type Interaction,
|
|
7
|
+
type StatePath,
|
|
8
|
+
type Wording,
|
|
9
|
+
} from './cases-interaction'
|
|
10
|
+
|
|
11
|
+
// The I/O half of `josh cases`' interaction boundaries (joshuafolkken/kit#4491): read the changed
|
|
12
|
+
// sources, then search the rest of the repository for each state path they name — by its literal and
|
|
13
|
+
// by every constant this source binds it to — so the summary lists the other readers and writers as
|
|
14
|
+
// `file:line`. Tests are left out of the search: a fixture path is not a second writer at run time.
|
|
15
|
+
|
|
16
|
+
const SOURCE_EXTENSIONS: ReadonlySet<string> = new Set(['.ts', '.js', '.mjs', '.cjs', '.svelte'])
|
|
17
|
+
const SOURCE_PATHSPECS: ReadonlyArray<string> = [
|
|
18
|
+
'*.ts',
|
|
19
|
+
'*.js',
|
|
20
|
+
'*.mjs',
|
|
21
|
+
'*.cjs',
|
|
22
|
+
'*.svelte',
|
|
23
|
+
':(exclude)*.test.ts',
|
|
24
|
+
]
|
|
25
|
+
const WHOLE_WORD = ['-w']
|
|
26
|
+
const MAX_OTHERS = 10
|
|
27
|
+
|
|
28
|
+
interface SharedState {
|
|
29
|
+
path: string
|
|
30
|
+
others: ReadonlyArray<string>
|
|
31
|
+
has_failed: boolean
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface Findings {
|
|
35
|
+
states: ReadonlyArray<SharedState>
|
|
36
|
+
variables: ReadonlyArray<string>
|
|
37
|
+
residents: ReadonlyArray<string>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function is_source(file: string): boolean {
|
|
41
|
+
return SOURCE_EXTENSIONS.has(path.extname(file))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function repo_relative(file: string): string {
|
|
45
|
+
return path.relative(process.cwd(), path.resolve(file))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// A module that declares its own constant of the same name holds its own state, not this one.
|
|
49
|
+
async function constant_hits(name: string): Promise<GrepResult> {
|
|
50
|
+
const result = await git_grep_hits.search(name, WHOLE_WORD, SOURCE_PATHSPECS)
|
|
51
|
+
const declaration = new RegExp(String.raw`\b(?:const|let|var)\s+${name}\b`, 'u')
|
|
52
|
+
const declaring = new Set(
|
|
53
|
+
result.hits.filter((hit) => declaration.test(hit.excerpt)).map((hit) => hit.path),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return { ...result, hits: result.hits.filter((hit) => !declaring.has(hit.path)) }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function shared_state(state: StatePath, own: ReadonlySet<string>): Promise<SharedState> {
|
|
60
|
+
const results = await Promise.all([
|
|
61
|
+
git_grep_hits.search(state.path, [], SOURCE_PATHSPECS),
|
|
62
|
+
...state.constants.map(async (name) => await constant_hits(name)),
|
|
63
|
+
])
|
|
64
|
+
const sites = results
|
|
65
|
+
.flatMap((result) => result.hits)
|
|
66
|
+
.filter((hit) => !own.has(hit.path))
|
|
67
|
+
.map((hit) => `${hit.path}:${hit.line}`)
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
path: state.path,
|
|
71
|
+
others: [...new Set(sites)],
|
|
72
|
+
has_failed: results.some((result) => result.has_failed),
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function scan(paths: ReadonlyArray<string>): Promise<Findings> {
|
|
77
|
+
const content = paths
|
|
78
|
+
.filter((file) => is_source(file))
|
|
79
|
+
.map((file) => file_reader.read_if_readable(file) ?? '')
|
|
80
|
+
.join('\n')
|
|
81
|
+
const own = new Set(paths.map((file) => repo_relative(file)))
|
|
82
|
+
const states = await Promise.all(
|
|
83
|
+
cases_interaction.state_paths_in(content).map(async (state) => await shared_state(state, own)),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
return { states, ...cases_interaction.environment_in(content) }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function interactions_of(findings: Findings): ReadonlyArray<Interaction> {
|
|
90
|
+
const has_environment = findings.variables.length + findings.residents.length > 0
|
|
91
|
+
const crossed = { state: findings.states.length > 0, env: has_environment }
|
|
92
|
+
|
|
93
|
+
return cases_interaction.INTERACTIONS.filter((interaction) => crossed[interaction])
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function others_text(state: SharedState, words: Wording): string {
|
|
97
|
+
if (state.has_failed) return words.search_failed
|
|
98
|
+
if (state.others.length === 0) return words.no_others
|
|
99
|
+
|
|
100
|
+
const shown = state.others.slice(0, MAX_OTHERS)
|
|
101
|
+
const rest = state.others.length - shown.length
|
|
102
|
+
|
|
103
|
+
return rest > 0 ? `${shown.join(', ')}, +${String(rest)}` : shown.join(', ')
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function line(label: string, subject: string, owed: ReadonlyArray<string>): string {
|
|
107
|
+
return `${label} ${subject}: ${owed.join(' / ')}`
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// One line per state, variable and resident process, in that order — each carries its own subject,
|
|
111
|
+
// so the reader sees whose cases they are without a second table.
|
|
112
|
+
function lines_for(findings: Findings, lang?: string): ReadonlyArray<string> {
|
|
113
|
+
const words = cases_interaction.wording(lang)
|
|
114
|
+
const state_lines = findings.states.map((state) =>
|
|
115
|
+
line(
|
|
116
|
+
words.state,
|
|
117
|
+
`\`${state.path}\` (${words.others}: ${others_text(state, words)})`,
|
|
118
|
+
words.state_cases,
|
|
119
|
+
),
|
|
120
|
+
)
|
|
121
|
+
const variable_lines = findings.variables.map((name) =>
|
|
122
|
+
line(words.variable, `\`${name}\``, words.variable_cases),
|
|
123
|
+
)
|
|
124
|
+
const resident_lines = findings.residents.map((name) =>
|
|
125
|
+
line(words.resident, `\`${name}\``, words.resident_cases),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
return [...state_lines, ...variable_lines, ...resident_lines]
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const cases_interaction_scan = { scan, interactions_of, lines_for }
|
|
132
|
+
|
|
133
|
+
export type { Findings, SharedState }
|
|
134
|
+
export { cases_interaction_scan }
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { session_language } from '#scripts/josh/session-language'
|
|
2
|
+
|
|
3
|
+
// `josh cases`' two interaction boundaries (joshuafolkken/kit#4491), read off the changed source with
|
|
4
|
+
// no I/O: the persistent state paths it names (`state`) and the environment it reads (`env`). The four
|
|
5
|
+
// I/O boundaries in `cases-logic.ts` name what a call can return; these name who else shares the
|
|
6
|
+
// state or the environment — the breakages found only after a merge, in another component's run.
|
|
7
|
+
|
|
8
|
+
type Interaction = 'state' | 'env'
|
|
9
|
+
|
|
10
|
+
interface StatePath {
|
|
11
|
+
// The literal as written, cut before a template placeholder so a search finds its fixed head.
|
|
12
|
+
path: string
|
|
13
|
+
// The constants this source binds the literal to — the names another module reaches it through.
|
|
14
|
+
constants: ReadonlyArray<string>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface Environment {
|
|
18
|
+
variables: ReadonlyArray<string>
|
|
19
|
+
residents: ReadonlyArray<string>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface Binding {
|
|
23
|
+
name: string
|
|
24
|
+
value: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface Wording {
|
|
28
|
+
state: string
|
|
29
|
+
variable: string
|
|
30
|
+
resident: string
|
|
31
|
+
others: string
|
|
32
|
+
no_others: string
|
|
33
|
+
search_failed: string
|
|
34
|
+
state_cases: ReadonlyArray<string>
|
|
35
|
+
variable_cases: ReadonlyArray<string>
|
|
36
|
+
resident_cases: ReadonlyArray<string>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const INTERACTIONS: ReadonlyArray<Interaction> = ['state', 'env']
|
|
40
|
+
const QUOTED_LITERAL = /(?<quote>['"`])(?<literal>[^'"`\s]+)\k<quote>/gu
|
|
41
|
+
// A path under `.josh/` with something after the slash, a named lock file, or a `josh-<name>-` file
|
|
42
|
+
// prefix — the temporary-directory records (lane state, ledger, run events) are named that way. The
|
|
43
|
+
// bare `.josh/` root names every state at once, and a bare `.lock` suffix matches every lock in the
|
|
44
|
+
// repository; a `josh-` name with no trailing hyphen is a tag or a keychain service, not a file.
|
|
45
|
+
const STATE_PATH = /(?:\.josh\/[^/])|(?:[^/]\.lock$)|(?:^josh-[a-z][\w-]*-$)/u
|
|
46
|
+
const PLACEHOLDER = /\$\{|<|\*/u
|
|
47
|
+
const CONSTANT_BINDING =
|
|
48
|
+
/\b(?:const|let)\s+(?<name>[A-Za-z_]\w*)\s*(?::[^=\n]+)?=\s*(?<quote>['"`])(?<value>[^'"`\n]+)\k<quote>/gu
|
|
49
|
+
const ENV_MARK = 'process.env'
|
|
50
|
+
const ENV_LITERAL_KEY =
|
|
51
|
+
/\bprocess\.env\.(?<dotted>[A-Za-z_]\w*)|\b(?:process\.env|environment)\[\s*['"](?<quoted>\w+)['"]\s*\]/gu
|
|
52
|
+
// The `environment: X = process.env` default-parameter form reads `environment[KEY]` through a
|
|
53
|
+
// constant, so a key held in a constant is resolved against this source's own bindings.
|
|
54
|
+
const ENV_CONSTANT_KEY = /\b(?:process\.env|environment)\[\s*(?<key>[A-Za-z_]\w*)\s*\]/gu
|
|
55
|
+
const ENV_NAME = /^[A-Z][A-Z0-9_]*$/u
|
|
56
|
+
// A daemon or a beacon named as an identifier or a module (`eslint-daemon`, `daemon_status`), never
|
|
57
|
+
// the bare word, so prose about "the daemon" does not fire the boundary.
|
|
58
|
+
const RESIDENT = /\b[\w-]*(?:[_-](?:daemon|beacon)|(?:daemon|beacon)[_-])[\w-]*/giu
|
|
59
|
+
// A source names one daemon in many identifiers (`spawn_daemon`, `DAEMON_STOP`); its cases are the
|
|
60
|
+
// kind's, so the kind is the subject.
|
|
61
|
+
const RESIDENT_KIND = /daemon|beacon/iu
|
|
62
|
+
const SLASH = '/'
|
|
63
|
+
|
|
64
|
+
const JAPANESE: Wording = {
|
|
65
|
+
state: '共有状態',
|
|
66
|
+
variable: '環境変数',
|
|
67
|
+
resident: '常駐プロセス',
|
|
68
|
+
others: '他の読み書き',
|
|
69
|
+
no_others: 'なし',
|
|
70
|
+
search_failed: '検索失敗',
|
|
71
|
+
state_cases: [
|
|
72
|
+
'他の書き手との並行書き込み',
|
|
73
|
+
'他の読み手が古い形式・途中の状態を読む',
|
|
74
|
+
'自分が書く前に他の書き手が消す',
|
|
75
|
+
],
|
|
76
|
+
variable_cases: [
|
|
77
|
+
'未設定',
|
|
78
|
+
'親プロセスから継承した値(例 GIT_DIR)',
|
|
79
|
+
'lane の work tree と main で値が違う',
|
|
80
|
+
],
|
|
81
|
+
resident_cases: [
|
|
82
|
+
'常駐プロセスが古い',
|
|
83
|
+
'常駐プロセスが不在',
|
|
84
|
+
'lane の work tree と main で別のプロセスに繋がる',
|
|
85
|
+
],
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const ENGLISH: Wording = {
|
|
89
|
+
state: 'shared state',
|
|
90
|
+
variable: 'environment variable',
|
|
91
|
+
resident: 'resident process',
|
|
92
|
+
others: 'also read or written by',
|
|
93
|
+
no_others: 'none',
|
|
94
|
+
search_failed: 'search failed',
|
|
95
|
+
state_cases: [
|
|
96
|
+
'concurrent write by another writer',
|
|
97
|
+
'another reader reads an old format or a partial state',
|
|
98
|
+
'another writer deletes it before this write',
|
|
99
|
+
],
|
|
100
|
+
variable_cases: [
|
|
101
|
+
'unset',
|
|
102
|
+
'value inherited from the parent process (e.g. GIT_DIR)',
|
|
103
|
+
'differs between the lane work tree and main',
|
|
104
|
+
],
|
|
105
|
+
resident_cases: [
|
|
106
|
+
'resident process is stale',
|
|
107
|
+
'resident process is absent',
|
|
108
|
+
'the lane work tree and main reach different processes',
|
|
109
|
+
],
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function fixed_head(literal: string): string {
|
|
113
|
+
const placeholder = PLACEHOLDER.exec(literal)
|
|
114
|
+
|
|
115
|
+
const head = placeholder === null ? literal : literal.slice(0, placeholder.index)
|
|
116
|
+
|
|
117
|
+
// `.josh/observations/` and `.josh/observations` name one state, so both search as the latter.
|
|
118
|
+
return head.endsWith(SLASH) ? head.slice(0, -1) : head
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function bindings(content: string): ReadonlyArray<Binding> {
|
|
122
|
+
return [...content.matchAll(CONSTANT_BINDING)].map((match) => ({
|
|
123
|
+
name: match.groups?.['name'] ?? '',
|
|
124
|
+
value: match.groups?.['value'] ?? '',
|
|
125
|
+
}))
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function state_literals(content: string): ReadonlyArray<string> {
|
|
129
|
+
const heads = [...content.matchAll(QUOTED_LITERAL)].map((match) =>
|
|
130
|
+
fixed_head(match.groups?.['literal'] ?? ''),
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
return [...new Set(heads.filter((head) => STATE_PATH.test(head)))]
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function state_paths_in(content: string): ReadonlyArray<StatePath> {
|
|
137
|
+
const declared = bindings(content)
|
|
138
|
+
|
|
139
|
+
return state_literals(content).map((path) => ({
|
|
140
|
+
path,
|
|
141
|
+
constants: declared
|
|
142
|
+
.filter((binding) => fixed_head(binding.value) === path)
|
|
143
|
+
.map((binding) => binding.name),
|
|
144
|
+
}))
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function constant_keys(content: string): ReadonlyArray<string> {
|
|
148
|
+
const values = new Map(bindings(content).map((binding) => [binding.name, binding.value]))
|
|
149
|
+
const keys = [...content.matchAll(ENV_CONSTANT_KEY)].map((match) =>
|
|
150
|
+
values.get(match.groups?.['key'] ?? ''),
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
return keys.filter((name): name is string => name !== undefined && ENV_NAME.test(name))
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// A source that hands `process.env` on whole, naming no variable, still reads the environment.
|
|
157
|
+
function variables_in(content: string): ReadonlyArray<string> {
|
|
158
|
+
if (!content.includes(ENV_MARK)) return []
|
|
159
|
+
|
|
160
|
+
const literal = [...content.matchAll(ENV_LITERAL_KEY)].map(
|
|
161
|
+
(match) => match.groups?.['dotted'] ?? match.groups?.['quoted'] ?? '',
|
|
162
|
+
)
|
|
163
|
+
const names = [...new Set([...literal, ...constant_keys(content)])]
|
|
164
|
+
|
|
165
|
+
return names.length === 0 ? [ENV_MARK] : names
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function environment_in(content: string): Environment {
|
|
169
|
+
const residents = [...content.matchAll(RESIDENT)].map((match) =>
|
|
170
|
+
(RESIDENT_KIND.exec(match[0])?.[0] ?? '').toLowerCase(),
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
return { variables: variables_in(content), residents: [...new Set(residents)] }
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function wording(lang: string = session_language.DEFAULT_SESSION_LANG): Wording {
|
|
177
|
+
return session_language.is_japanese(lang) ? JAPANESE : ENGLISH
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const cases_interaction = { INTERACTIONS, state_paths_in, environment_in, wording }
|
|
181
|
+
|
|
182
|
+
export type { Environment, Interaction, StatePath, Wording }
|
|
183
|
+
export { cases_interaction }
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { session_language } from '#scripts/josh/session-language'
|
|
1
2
|
import { file_reader } from '#scripts/lib/read-file'
|
|
3
|
+
import { cases_interaction } from './cases-interaction'
|
|
2
4
|
|
|
3
5
|
// `josh cases <path...>`: read the changed paths and answer which I/O
|
|
4
6
|
// boundaries the code crosses — network, process start, filesystem — then name the abnormal cases
|
|
5
7
|
// that boundary always owes. The unit suite blocks network by construction
|
|
6
|
-
// (`
|
|
8
|
+
// (`tools/test/test-network-guard.ts`), so a boundary's abnormal cases never run there; this makes
|
|
7
9
|
// the declaration side name them instead, read off the diff rather than off judgement.
|
|
8
10
|
// `prompts/collaboration-workflow/report-format.md` is the single source of where the answer goes —
|
|
9
11
|
// the second tier of the case-based test declaration ("if it breaks").
|
|
@@ -17,6 +19,8 @@ interface BoundaryDefinition {
|
|
|
17
19
|
pattern: RegExp
|
|
18
20
|
// The abnormal cases this boundary always owes, so they land in the second tier.
|
|
19
21
|
cases: ReadonlyArray<string>
|
|
22
|
+
// The same cases for an English session, in the same order.
|
|
23
|
+
english_cases: ReadonlyArray<string>
|
|
20
24
|
}
|
|
21
25
|
|
|
22
26
|
const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
|
|
@@ -27,6 +31,14 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
|
|
|
27
31
|
// would fire `network` on every markdown edit and defeat the oracle.
|
|
28
32
|
pattern: /\b(?:fetch|axios|undici|node:https?|XMLHttpRequest)\b/u,
|
|
29
33
|
cases: ['非200', 'タイムアウト', '接続断', '空レスポンス', '不正JSON', 'レート制限'],
|
|
34
|
+
english_cases: [
|
|
35
|
+
'non-200',
|
|
36
|
+
'timeout',
|
|
37
|
+
'connection drop',
|
|
38
|
+
'empty response',
|
|
39
|
+
'invalid JSON',
|
|
40
|
+
'rate limit',
|
|
41
|
+
],
|
|
30
42
|
},
|
|
31
43
|
{
|
|
32
44
|
boundary: 'process',
|
|
@@ -36,6 +48,7 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
|
|
|
36
48
|
pattern:
|
|
37
49
|
/\b(?:child_process|execSync|execFileSync|spawnSync)\b|\b(?:exec|execFile|spawn)\s*\(/u,
|
|
38
50
|
cases: ['非ゼロ終了', 'タイムアウト', '標準エラー出力', '実行ファイル不在'],
|
|
51
|
+
english_cases: ['non-zero exit', 'timeout', 'stderr output', 'missing executable'],
|
|
39
52
|
},
|
|
40
53
|
{
|
|
41
54
|
boundary: 'fs',
|
|
@@ -45,6 +58,13 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
|
|
|
45
58
|
pattern:
|
|
46
59
|
/\b(?:node:fs|fs\/promises|readFileSync|writeFileSync)\b|\b(?:readFile|writeFile|mkdir|unlink|readdir|rm)\s*\(/u,
|
|
47
60
|
cases: ['ファイル不在', '権限エラー', '空ファイル', '不正な内容', '並行書き込み'],
|
|
61
|
+
english_cases: [
|
|
62
|
+
'missing file',
|
|
63
|
+
'permission error',
|
|
64
|
+
'empty file',
|
|
65
|
+
'invalid content',
|
|
66
|
+
'concurrent write',
|
|
67
|
+
],
|
|
48
68
|
},
|
|
49
69
|
{
|
|
50
70
|
boundary: 'time',
|
|
@@ -57,6 +77,12 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
|
|
|
57
77
|
pattern:
|
|
58
78
|
/\b(?:setInterval|setTimeout|setImmediate|schedule|reschedule|retry)\s*\(|\b(?:cron|crontab|heartbeat|watchdog|liveness)\b/u,
|
|
59
79
|
cases: ['期待した事象が到来しない', '期限超過', '重複発火', '再試行が尽きる'],
|
|
80
|
+
english_cases: [
|
|
81
|
+
'awaited event never arrives',
|
|
82
|
+
'deadline exceeded',
|
|
83
|
+
'duplicate firing',
|
|
84
|
+
'retries exhausted',
|
|
85
|
+
],
|
|
60
86
|
},
|
|
61
87
|
]
|
|
62
88
|
|
|
@@ -76,17 +102,24 @@ function boundaries_in(paths: ReadonlyArray<string>): ReadonlyArray<Boundary> {
|
|
|
76
102
|
)
|
|
77
103
|
}
|
|
78
104
|
|
|
79
|
-
// The abnormal cases owed by the given boundaries, in the fixed boundary order
|
|
80
|
-
function cases_for(
|
|
105
|
+
// The abnormal cases owed by the given boundaries, in the fixed boundary order and in `lang`.
|
|
106
|
+
function cases_for(
|
|
107
|
+
boundaries: ReadonlyArray<Boundary>,
|
|
108
|
+
lang: string = session_language.DEFAULT_SESSION_LANG,
|
|
109
|
+
): ReadonlyArray<string> {
|
|
110
|
+
const is_japanese = session_language.is_japanese(lang)
|
|
111
|
+
|
|
81
112
|
return BOUNDARIES.filter((definition) => boundaries.includes(definition.boundary)).flatMap(
|
|
82
|
-
(definition) => definition.cases,
|
|
113
|
+
(definition) => (is_japanese ? definition.cases : definition.english_cases),
|
|
83
114
|
)
|
|
84
115
|
}
|
|
85
116
|
|
|
86
|
-
// The fixed verdict vocabulary the command can print — the
|
|
87
|
-
// decision-oracle test asserts its registered
|
|
117
|
+
// The fixed verdict vocabulary the command can print — the four boundary tokens, the two interaction
|
|
118
|
+
// tokens (`cases-interaction.ts`) and `none`. The decision-oracle test asserts its registered
|
|
119
|
+
// vocabulary equals this.
|
|
88
120
|
const VOCABULARY: ReadonlyArray<string> = [
|
|
89
121
|
...BOUNDARIES.map((definition) => definition.boundary),
|
|
122
|
+
...cases_interaction.INTERACTIONS,
|
|
90
123
|
NONE,
|
|
91
124
|
]
|
|
92
125
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { pr_classification } from './pr-classification'
|
|
4
|
+
|
|
5
|
+
// The `josh pr:classification` entry, kept apart from `pr-classification.ts` because other modules
|
|
6
|
+
// import that one: a bundle is one file, so a main guard there would fire for every command that
|
|
7
|
+
// carries it (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const event_path = process.env['GITHUB_EVENT_PATH']
|
|
10
|
+
if (!event_path) throw new Error('GITHUB_EVENT_PATH is required')
|
|
11
|
+
|
|
12
|
+
const error = pr_classification.check_event(event_path)
|
|
13
|
+
|
|
14
|
+
if (error) {
|
|
15
|
+
console.error(`::error::${error}`)
|
|
16
|
+
process.exitCode = 1
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs'
|
|
2
|
-
import {
|
|
2
|
+
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
3
3
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
4
4
|
import {
|
|
5
5
|
BREAKING_CHANGE_LABEL as BREAKING,
|
|
6
|
+
BUG_LABEL,
|
|
6
7
|
BUGFIX_LABEL as BUGFIX,
|
|
7
8
|
RELEASE_CLASSIFICATION_NAMES as CLASSIFICATION_LABELS,
|
|
8
9
|
ENHANCEMENT_LABEL,
|
|
@@ -12,13 +13,13 @@ import { error_text } from '#scripts/lib/error-message'
|
|
|
12
13
|
import { z } from 'zod'
|
|
13
14
|
|
|
14
15
|
const CLASSIFICATION_SET: ReadonlySet<string> = new Set(CLASSIFICATION_LABELS)
|
|
15
|
-
const ISSUE_BUG_LABEL = 'bug'
|
|
16
16
|
// The line an Issue body declares its release classification with. A body written by a script
|
|
17
17
|
// (`josh propagate`'s upgrade issue) builds it with `declaration`, so the writer and this parser share
|
|
18
18
|
// one format.
|
|
19
19
|
const DECLARATION_PREFIX = '- リリース分類: '
|
|
20
20
|
const DECLARATION = new RegExp(`^${DECLARATION_PREFIX}(.+)$`, 'gmu')
|
|
21
21
|
const LEGACY_LABELS: ReadonlySet<string> = new Set(['semver-major', 'semver-minor'])
|
|
22
|
+
const LABEL_NAMES_FILTER = '.[].name'
|
|
22
23
|
|
|
23
24
|
const LABEL = z.object({ name: z.string() })
|
|
24
25
|
const USER = z.object({ login: z.string() })
|
|
@@ -70,7 +71,7 @@ function issue_candidates(issue_json: string): ReadonlyArray<ReleaseClassificati
|
|
|
70
71
|
|
|
71
72
|
if (unknown.length > 0) throw new Error(`Unknown release classification: ${unknown.join(', ')}`)
|
|
72
73
|
|
|
73
|
-
if (names.includes(
|
|
74
|
+
if (names.includes(BUG_LABEL) && !candidates.includes(BREAKING)) {
|
|
74
75
|
candidates.push(BUGFIX)
|
|
75
76
|
}
|
|
76
77
|
|
|
@@ -96,10 +97,14 @@ function select_issue_classification(issue_json: string): ReleaseClassification
|
|
|
96
97
|
// payload, that run fails, and when it lands in the newer check suite GitHub keeps its red result —
|
|
97
98
|
// a rerun replays the same payload and fails again.
|
|
98
99
|
function fetch_current_labels(repository: string, pull_number: number): ReadonlyArray<string> {
|
|
99
|
-
const path =
|
|
100
|
+
const path = git_gh_api_path.issue_labels_api_path(String(pull_number), repository)
|
|
100
101
|
|
|
101
102
|
try {
|
|
102
|
-
const names = git_gh_exec.exec_gh_api_sync({
|
|
103
|
+
const names = git_gh_exec.exec_gh_api_sync({
|
|
104
|
+
path,
|
|
105
|
+
should_paginate: true,
|
|
106
|
+
jq_filter: LABEL_NAMES_FILTER,
|
|
107
|
+
})
|
|
103
108
|
|
|
104
109
|
return names.split('\n').filter((name) => name !== '')
|
|
105
110
|
} catch (error) {
|
|
@@ -119,18 +124,6 @@ function check_event(
|
|
|
119
124
|
return classification_error(labels, event.pull_request.user.login)
|
|
120
125
|
}
|
|
121
126
|
|
|
122
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
123
|
-
const event_path = process.env['GITHUB_EVENT_PATH']
|
|
124
|
-
if (!event_path) throw new Error('GITHUB_EVENT_PATH is required')
|
|
125
|
-
|
|
126
|
-
const error = check_event(event_path)
|
|
127
|
-
|
|
128
|
-
if (error) {
|
|
129
|
-
console.error(`::error::${error}`)
|
|
130
|
-
process.exitCode = 1
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
127
|
const pr_classification = {
|
|
135
128
|
classification_error,
|
|
136
129
|
check_event,
|
|
@@ -17,7 +17,7 @@ import { clone_fingerprint } from './clone-fingerprint'
|
|
|
17
17
|
// which is what makes two identical relative paths in different repositories a cross-repository clone.
|
|
18
18
|
|
|
19
19
|
// The directories a package keeps its source in; whichever exist are scanned.
|
|
20
|
-
const SOURCE_ROOTS = ['scripts', 'src']
|
|
20
|
+
const SOURCE_ROOTS = ['scripts', 'tools', 'src']
|
|
21
21
|
const SOURCE_EXTENSION = '.ts'
|
|
22
22
|
// Test files and declarations are not product code, so a shared test helper is not a clone to report.
|
|
23
23
|
const IGNORED_SUFFIXES = ['.test.ts', '.svelte.test.ts', '.d.ts']
|