@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,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']
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import {
|
|
3
|
+
transcript_record,
|
|
4
|
+
type TranscriptBlock,
|
|
5
|
+
type TranscriptContent,
|
|
6
|
+
} from '#scripts/lib/transcript-record'
|
|
2
7
|
import { z } from 'zod'
|
|
3
8
|
|
|
4
9
|
// Reading the content blocks out of a session transcript.
|
|
@@ -18,27 +23,7 @@ import { z } from 'zod'
|
|
|
18
23
|
const CONTENT_ITEM_SCHEMA = z.object({ text: z.string().nullish() })
|
|
19
24
|
const RESULT_CONTENT_SCHEMA = z.union([z.string(), z.array(CONTENT_ITEM_SCHEMA)])
|
|
20
25
|
|
|
21
|
-
|
|
22
|
-
// the whole array it sits in, and with it every other block on that line — an entire assistant turn
|
|
23
|
-
// dropped from the table because one tool wrote a shape this reader had not seen. A block that
|
|
24
|
-
// parses to nothing contributes nothing, which is the cost it should have.
|
|
25
|
-
const BLOCK_SCHEMA = z.object({
|
|
26
|
-
type: z.string().nullish(),
|
|
27
|
-
text: z.string().nullish(),
|
|
28
|
-
name: z.string().nullish(),
|
|
29
|
-
input: z.unknown().nullish(),
|
|
30
|
-
content: RESULT_CONTENT_SCHEMA.nullish(),
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
const LINE_CONTENT_SCHEMA = z.union([z.string(), z.array(BLOCK_SCHEMA)])
|
|
34
|
-
const MESSAGE_SCHEMA = z.object({ content: LINE_CONTENT_SCHEMA.nullish() })
|
|
35
|
-
const CONTENT_LINE_SCHEMA = z.object({ type: z.string(), message: MESSAGE_SCHEMA.nullish() })
|
|
36
|
-
|
|
37
|
-
type RawBlock = z.infer<typeof BLOCK_SCHEMA>
|
|
38
|
-
|
|
39
|
-
const TEXT_TYPE = 'text'
|
|
40
|
-
const TOOL_USE_TYPE = 'tool_use'
|
|
41
|
-
const TOOL_RESULT_TYPE = 'tool_result'
|
|
26
|
+
const { TEXT_TYPE, TOOL_USE_TYPE, TOOL_RESULT_TYPE } = transcript_record
|
|
42
27
|
const BASH_TOOL = 'Bash'
|
|
43
28
|
const COMMAND_KEY = 'command'
|
|
44
29
|
|
|
@@ -71,7 +56,7 @@ function split_bash_input(input: unknown): { command: string; rest: string } {
|
|
|
71
56
|
}
|
|
72
57
|
}
|
|
73
58
|
|
|
74
|
-
function to_tool_use(block:
|
|
59
|
+
function to_tool_use(block: TranscriptBlock): ContentBlock {
|
|
75
60
|
const tool_name = block.name ?? ''
|
|
76
61
|
const is_bash = tool_name === BASH_TOOL
|
|
77
62
|
const { command, rest } = is_bash
|
|
@@ -83,31 +68,33 @@ function to_tool_use(block: RawBlock): ContentBlock {
|
|
|
83
68
|
|
|
84
69
|
// A tool result is either a plain string or a list of blocks. Only the textual items are counted:
|
|
85
70
|
// an image block carries no text here, and inventing a size for it would put a made-up number in a
|
|
86
|
-
// table whose whole purpose is to be compared against another run's.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
71
|
+
// table whose whole purpose is to be compared against another run's. A body of neither shape
|
|
72
|
+
// contributes nothing rather than dropping the line it sits on.
|
|
73
|
+
function result_text(content: unknown): string {
|
|
74
|
+
const parsed = RESULT_CONTENT_SCHEMA.safeParse(content)
|
|
75
|
+
if (!parsed.success) return ''
|
|
76
|
+
if (typeof parsed.data === 'string') return parsed.data
|
|
77
|
+
|
|
78
|
+
return parsed.data.map((item) => item.text ?? '').join('')
|
|
91
79
|
}
|
|
92
80
|
|
|
93
81
|
// Everything that is not a tool call: a result contributes its textual content, and anything else —
|
|
94
82
|
// text, thinking, a block type this reader has never seen — contributes its `text`, which for
|
|
95
83
|
// thinking is the empty string Claude Code writes there.
|
|
96
|
-
function to_plain_block(block:
|
|
84
|
+
function to_plain_block(block: TranscriptBlock): ContentBlock {
|
|
97
85
|
const base = { type: block.type ?? '', tool_name: '', command: '' }
|
|
98
|
-
const text =
|
|
99
|
-
block.type === TOOL_RESULT_TYPE ? result_text(block.content ?? '') : (block.text ?? '')
|
|
86
|
+
const text = block.type === TOOL_RESULT_TYPE ? result_text(block.content) : (block.text ?? '')
|
|
100
87
|
|
|
101
88
|
return { ...base, text }
|
|
102
89
|
}
|
|
103
90
|
|
|
104
|
-
function to_block(block:
|
|
91
|
+
function to_block(block: TranscriptBlock): ContentBlock {
|
|
105
92
|
return block.type === TOOL_USE_TYPE ? to_tool_use(block) : to_plain_block(block)
|
|
106
93
|
}
|
|
107
94
|
|
|
108
95
|
// A user turn whose content is a bare string — the prompt itself, plus whatever a `UserPromptSubmit`
|
|
109
96
|
// hook injected into it. Counted as text, which is what it is.
|
|
110
|
-
function to_blocks(content: string | ReadonlyArray<
|
|
97
|
+
function to_blocks(content: string | ReadonlyArray<TranscriptBlock>): Array<ContentBlock> {
|
|
111
98
|
if (typeof content === 'string') {
|
|
112
99
|
return [{ type: TEXT_TYPE, tool_name: '', command: '', text: content }]
|
|
113
100
|
}
|
|
@@ -116,13 +103,11 @@ function to_blocks(content: string | ReadonlyArray<RawBlock>): Array<ContentBloc
|
|
|
116
103
|
}
|
|
117
104
|
|
|
118
105
|
// A blank line, a line that is not JSON, and a line carrying no message content are one answer:
|
|
119
|
-
// nothing to count. With
|
|
106
|
+
// nothing to count. With the block schema accepting anything object-shaped, the only line lost whole
|
|
120
107
|
// is one that is not JSON at all — which `cost-usage.ts` already counts as unparseable, so
|
|
121
108
|
// reporting it again here would double one missing-data figure.
|
|
122
|
-
function content_of(line: string):
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return parsed.success ? (parsed.data.message?.content ?? undefined) : undefined
|
|
109
|
+
function content_of(line: string): TranscriptContent | undefined {
|
|
110
|
+
return transcript_record.parse(line)?.message?.content ?? undefined
|
|
126
111
|
}
|
|
127
112
|
|
|
128
113
|
function parse_line(line: string): Array<ContentBlock> {
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { agent_role_profile, type AgentProvider } from '#scripts/agent/agent-role-profile'
|
|
4
2
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
3
|
import { codex_usage } from './codex-usage'
|
|
@@ -20,7 +18,6 @@ import { transcript_cwd } from './transcript-cwd'
|
|
|
20
18
|
// `backlogrun` / `halfrun` / `pre-gate-cut` ask, and the `josh time` run-timing report keeps the
|
|
21
19
|
// hand-off aggregates used to compare the shared context-cut threshold.
|
|
22
20
|
|
|
23
|
-
const ARGV_OFFSET = 2
|
|
24
21
|
const FAILURE_EXIT_CODE = 1
|
|
25
22
|
const USAGE = 'Usage: josh cost (--cut | --over <tokens-per-request>) [--path <dir>]'
|
|
26
23
|
// The read-only verdict's third answer, beside `cost_verdict`'s over/under: a session that cannot be
|
|
@@ -29,6 +26,12 @@ const UNMEASURABLE_VERDICT = 'unmeasurable'
|
|
|
29
26
|
|
|
30
27
|
type CostVerdict = ReturnType<typeof cost_verdict.classify> | typeof UNMEASURABLE_VERDICT
|
|
31
28
|
|
|
29
|
+
interface SessionFigures {
|
|
30
|
+
verdict: CostVerdict
|
|
31
|
+
cost: number | undefined
|
|
32
|
+
threshold: number
|
|
33
|
+
}
|
|
34
|
+
|
|
32
35
|
interface Options {
|
|
33
36
|
over?: number
|
|
34
37
|
// The target project whose transcripts to read, or absent for this process's own working
|
|
@@ -243,6 +246,28 @@ function verdict_of(measurement: OverMeasurement | undefined): CostVerdict {
|
|
|
243
246
|
return cost_verdict.classify(measurement, CONTEXT_CUT_THRESHOLD)
|
|
244
247
|
}
|
|
245
248
|
|
|
249
|
+
// The verdict with the figures it was decided on — the newest request's billed input and the shared
|
|
250
|
+
// threshold — so a report that cites the verdict quotes the same numbers rather than re-measuring.
|
|
251
|
+
// An unmeasurable session has no cost to quote, which is `undefined`, never `0`.
|
|
252
|
+
function figures_of(measurement: OverMeasurement | undefined): SessionFigures {
|
|
253
|
+
const verdict = verdict_of(measurement)
|
|
254
|
+
const is_priced = measurement !== undefined && verdict !== UNMEASURABLE_VERDICT
|
|
255
|
+
const cost = is_priced ? cost_verdict.per_request_cost(measurement) : undefined
|
|
256
|
+
|
|
257
|
+
return { verdict, cost, threshold: CONTEXT_CUT_THRESHOLD }
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// The `--cut` verdict and its figures as a value, printing nothing. `run:report --handoff` quotes the
|
|
261
|
+
// figures in the hand-off report; `session_verdict` reads the verdict alone.
|
|
262
|
+
function session_figures(
|
|
263
|
+
cwd: string = process.cwd(),
|
|
264
|
+
environment: Environment = process.env,
|
|
265
|
+
): SessionFigures {
|
|
266
|
+
const provider = provider_of(environment)
|
|
267
|
+
|
|
268
|
+
return figures_of(provider === undefined ? undefined : measure(cwd, provider, environment))
|
|
269
|
+
}
|
|
270
|
+
|
|
246
271
|
// The `--cut` verdict as a value, printing nothing. `run:status` bundles
|
|
247
272
|
// this beside the issue state and the carry record, so it needs the token rather than the exit code
|
|
248
273
|
// `run` returns. `unmeasurable` is the read-only counterpart of `report_empty` / the empty-session
|
|
@@ -252,10 +277,7 @@ function session_verdict(
|
|
|
252
277
|
cwd: string = process.cwd(),
|
|
253
278
|
environment: Environment = process.env,
|
|
254
279
|
): CostVerdict {
|
|
255
|
-
|
|
256
|
-
if (provider === undefined) return UNMEASURABLE_VERDICT
|
|
257
|
-
|
|
258
|
-
return verdict_of(measure(cwd, provider, environment))
|
|
280
|
+
return session_figures(cwd, environment).verdict
|
|
259
281
|
}
|
|
260
282
|
|
|
261
283
|
function run_context(
|
|
@@ -294,20 +316,15 @@ function run(
|
|
|
294
316
|
return run_over(target, context.over, context.provider, environment)
|
|
295
317
|
}
|
|
296
318
|
|
|
297
|
-
function main(argv: ReadonlyArray<string>): void {
|
|
298
|
-
process.exitCode = run(argv)
|
|
299
|
-
}
|
|
300
|
-
|
|
301
319
|
const cost_cli = {
|
|
302
320
|
UNMEASURABLE_VERDICT,
|
|
303
321
|
USAGE,
|
|
304
322
|
parse_options,
|
|
305
323
|
to_threshold,
|
|
306
324
|
run,
|
|
325
|
+
session_figures,
|
|
307
326
|
session_verdict,
|
|
308
327
|
}
|
|
309
328
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
export type { CostVerdict, Options }
|
|
329
|
+
export type { CostVerdict, Options, SessionFigures }
|
|
313
330
|
export { cost_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { cost_cli } from './cost-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh cost` entry, kept apart from `cost-cli.ts` because `implementation-cut.ts` imports that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = cost_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -26,8 +26,9 @@ interface DelegatableStep {
|
|
|
26
26
|
// Where the pre-implementation reading stops being cheaper in the main line.
|
|
27
27
|
//
|
|
28
28
|
// **A count, not a forecast.** The reads are counted as they are made rather than predicted before
|
|
29
|
-
// the investigation starts, so nothing here rests on guessing how large it will be.
|
|
30
|
-
//
|
|
29
|
+
// the investigation starts, so nothing here rests on guessing how large it will be. It is where the
|
|
30
|
+
// guard refuses, not a budget: a run that knows its subject needs reading delegates before the first
|
|
31
|
+
// read (`run:prep`, #4345). Two stray files the run will not edit are tolerated, because delegating costs two extra main-line turns — one to
|
|
31
32
|
// write the brief, one to read the result, about 18 seconds at roughly 8.8 s of model
|
|
32
33
|
// wait per turn — and below the threshold that round trip costs more than carrying the text.
|
|
33
34
|
const INVESTIGATION_FILE_THRESHOLD = 3
|
|
@@ -38,6 +39,15 @@ const INVESTIGATION_FILE_THRESHOLD = 3
|
|
|
38
39
|
// target, in the main line and sends the continuing sweep to a unit.
|
|
39
40
|
const INVESTIGATION_SEARCH_TURN_THRESHOLD = 3
|
|
40
41
|
|
|
42
|
+
// `.claude/agents/investigator.md`; a consumer receives it through the plugin as `kit:investigator`.
|
|
43
|
+
const INVESTIGATOR_AGENT = 'investigator'
|
|
44
|
+
|
|
45
|
+
// The limit and the remedy, worded once: the guard's refusal and `run:prep`'s entry notice both print
|
|
46
|
+
// them, so a run told the step up front is told the same step the refusal would name.
|
|
47
|
+
const INVESTIGATION_LIMIT = `${String(INVESTIGATION_FILE_THRESHOLD)} files read and not edited, or ${String(INVESTIGATION_SEARCH_TURN_THRESHOLD)} search turns, since the last delegated unit`
|
|
48
|
+
// Only the dispatch resets the count, so the step names no `josh delegate` call before it (#4345).
|
|
49
|
+
const INVESTIGATION_STEP = `Dispatch the \`${INVESTIGATOR_AGENT}\` agent (\`kit:${INVESTIGATOR_AGENT}\` in a consumer); it returns \`file:line\` citations, never the file text.`
|
|
50
|
+
|
|
41
51
|
// The enumeration. Short on purpose: every entry had to name a verifier, and most candidates could
|
|
42
52
|
// not (below).
|
|
43
53
|
const DELEGATABLE_STEPS: ReadonlyArray<DelegatableStep> = [
|
|
@@ -59,12 +69,12 @@ const DELEGATABLE_STEPS: ReadonlyArray<DelegatableStep> = [
|
|
|
59
69
|
{
|
|
60
70
|
name: 'followup-filing',
|
|
61
71
|
// The late-run follow-up filing chain — `issue:file` (which scouts, lints, labels and runs
|
|
62
|
-
// epic:bundle itself) → epic --add — is a dependency chain
|
|
72
|
+
// epic:bundle itself) → epic --add — is a dependency chain the batching guard
|
|
63
73
|
// correctly keeps one call per step, and what makes it expensive is the ~340k context it runs in
|
|
64
74
|
// at the tail of a run, not the step count. A fresh unit runs the same
|
|
65
75
|
// chain at a small context, and the review round cap already composed the finding text, so what
|
|
66
76
|
// the unit is handed is mechanical: run the commands and act on their deterministic answers. This
|
|
67
|
-
// is not
|
|
77
|
+
// is not the batching guard's business — delegation only moves the chain to a cheaper context.
|
|
68
78
|
does: 'run the late-run follow-up filing chain in an isolated unit — issue:file (scout, lint, labels, epic:bundle), then epic --add — given the finding text the parent already composed, and return the new Issue number and the epic:bundle answer',
|
|
69
79
|
verifier:
|
|
70
80
|
"the parent reads the filed Issue from GitHub with `pnpm josh issue:state <new>`, not the unit's summary; a follow-up reported filed but not created is still absent, the way `epic-child`'s reported-done-but-not-merged child is still open. The finding text came from the parent and `issue:file`'s steps are deterministic, so the unit's work is the mechanical execution `issue:state` confirms",
|
|
@@ -181,7 +191,10 @@ function reason_for(name: string): string {
|
|
|
181
191
|
const delegation_policy = {
|
|
182
192
|
DELEGATE_VERDICT,
|
|
183
193
|
INVESTIGATION_FILE_THRESHOLD,
|
|
194
|
+
INVESTIGATION_LIMIT,
|
|
184
195
|
INVESTIGATION_SEARCH_TURN_THRESHOLD,
|
|
196
|
+
INVESTIGATION_STEP,
|
|
197
|
+
INVESTIGATOR_AGENT,
|
|
185
198
|
KEEP_VERDICT,
|
|
186
199
|
DELEGATABLE_STEPS,
|
|
187
200
|
REJECTED_STEPS,
|