@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,131 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
investigation_reads
|
|
3
|
-
} from "./chunk-H5HVWYXK.js";
|
|
4
|
-
import {
|
|
5
|
-
lane_guard_policy
|
|
6
|
-
} from "./chunk-SHGPANFB.js";
|
|
7
|
-
import {
|
|
8
|
-
hook_decision
|
|
9
|
-
} from "./chunk-J47HU5H5.js";
|
|
10
|
-
import {
|
|
11
|
-
time_spans
|
|
12
|
-
} from "./chunk-AS74OU3D.js";
|
|
13
|
-
import {
|
|
14
|
-
json_value
|
|
15
|
-
} from "./chunk-E7OIKX5Z.js";
|
|
16
|
-
|
|
17
|
-
// scripts/delegation/duplicate-read-guard.ts
|
|
18
|
-
import { statSync } from "node:fs";
|
|
19
|
-
import { text } from "node:stream/consumers";
|
|
20
|
-
import { fileURLToPath } from "node:url";
|
|
21
|
-
var SWITCH_ENV_KEY = "JOSH_DUPLICATE_READ_GUARD";
|
|
22
|
-
var LANE_GUARD_ID = "duplicate-read";
|
|
23
|
-
var STAMP_PREFIX = "josh-duplicate-read-guard-";
|
|
24
|
-
var NOTICE_STAMP_PREFIX = "josh-duplicate-read-notice-";
|
|
25
|
-
var READ_TOOL = "Read";
|
|
26
|
-
var GLOB_CHARACTERS = /[*?]/u;
|
|
27
|
-
var REASON = `\u26D4 duplicate read: this file was already read in this session and has not changed since (its mtime predates that read), so reading it again returns nothing new. Scroll up to the earlier result instead of re-reading it. A read with a new offset/limit, or of a file that has since changed, is allowed; set \`JOSH_DUPLICATE_READ_GUARD=off\` to disable this guard.`;
|
|
28
|
-
var NOTICE = `\u26A0 duplicate read: this file was already read in this session and has not changed since, so re-reading it returns nothing new \u2014 scroll up to the earlier result instead of re-reading it. Set \`JOSH_DUPLICATE_READ_GUARD=off\` to silence this.`;
|
|
29
|
-
function is_paginated(input) {
|
|
30
|
-
return input["offset"] !== void 0 || input["limit"] !== void 0;
|
|
31
|
-
}
|
|
32
|
-
function names_one_file(file_path) {
|
|
33
|
-
return typeof file_path === "string" && file_path !== "" && !GLOB_CHARACTERS.test(file_path);
|
|
34
|
-
}
|
|
35
|
-
function read_target(call) {
|
|
36
|
-
if (call.name !== READ_TOOL || !json_value.is_record(call.input)) return void 0;
|
|
37
|
-
const { input } = call;
|
|
38
|
-
if (is_paginated(input) || !names_one_file(input["file_path"])) return void 0;
|
|
39
|
-
return investigation_reads.resolved(input["file_path"]);
|
|
40
|
-
}
|
|
41
|
-
function is_refusable_call(call) {
|
|
42
|
-
return read_target(call) !== void 0;
|
|
43
|
-
}
|
|
44
|
-
function is_successful_read(span) {
|
|
45
|
-
const is_read = investigation_reads.READ_TOOLS.has(span.label);
|
|
46
|
-
return is_read && span.outcome !== time_spans.FAILED_OUTCOME;
|
|
47
|
-
}
|
|
48
|
-
function reads_target(span, target) {
|
|
49
|
-
return span.targets.some((one) => investigation_reads.resolved(one) === target);
|
|
50
|
-
}
|
|
51
|
-
function last_read_ms(spans, target) {
|
|
52
|
-
const times = spans.filter((span) => is_successful_read(span) && reads_target(span, target)).map((span) => span.ended_ms);
|
|
53
|
-
return times.length === 0 ? hook_decision.NEVER_MS : Math.max(...times);
|
|
54
|
-
}
|
|
55
|
-
function file_mtime_ms(target) {
|
|
56
|
-
try {
|
|
57
|
-
return statSync(target).mtimeMs;
|
|
58
|
-
} catch {
|
|
59
|
-
return void 0;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function read_window(tail, target) {
|
|
63
|
-
const { spans, started_ms } = time_spans.parse_timeline(tail);
|
|
64
|
-
return { last_ms: last_read_ms(spans, target), window_start_ms: started_ms };
|
|
65
|
-
}
|
|
66
|
-
function is_unchanged_reread(last_ms, mtime) {
|
|
67
|
-
if (mtime === void 0 || last_ms === hook_decision.NEVER_MS) return false;
|
|
68
|
-
return mtime < last_ms;
|
|
69
|
-
}
|
|
70
|
-
function is_rearmed(window, fired_at_ms) {
|
|
71
|
-
if (fired_at_ms === hook_decision.NEVER_MS || fired_at_ms < window.window_start_ms) return true;
|
|
72
|
-
return window.last_ms > fired_at_ms;
|
|
73
|
-
}
|
|
74
|
-
function is_redundant_reread(tail, call, fired_at_ms) {
|
|
75
|
-
const target = read_target(call);
|
|
76
|
-
if (target === void 0) return false;
|
|
77
|
-
const window = read_window(tail, target);
|
|
78
|
-
if (!is_unchanged_reread(window.last_ms, file_mtime_ms(target))) return false;
|
|
79
|
-
return is_rearmed(window, fired_at_ms);
|
|
80
|
-
}
|
|
81
|
-
function duplicate_mode() {
|
|
82
|
-
return lane_guard_policy.mode_here(LANE_GUARD_ID);
|
|
83
|
-
}
|
|
84
|
-
function is_candidate(call) {
|
|
85
|
-
return is_refusable_call(call) && duplicate_mode() !== "off";
|
|
86
|
-
}
|
|
87
|
-
function should_block_here(tail, call, refused_at_ms) {
|
|
88
|
-
if (duplicate_mode() !== "refuse") return false;
|
|
89
|
-
return is_redundant_reread(tail, call, refused_at_ms);
|
|
90
|
-
}
|
|
91
|
-
function should_notify_here(tail, call, notified_at_ms) {
|
|
92
|
-
if (duplicate_mode() !== "notice") return false;
|
|
93
|
-
return is_redundant_reread(tail, call, notified_at_ms);
|
|
94
|
-
}
|
|
95
|
-
var GUARD = hook_decision.create_transcript_guard({
|
|
96
|
-
prefix: STAMP_PREFIX,
|
|
97
|
-
switch_key: SWITCH_ENV_KEY,
|
|
98
|
-
is_candidate,
|
|
99
|
-
should_block: should_block_here,
|
|
100
|
-
reason: REASON,
|
|
101
|
-
notify: {
|
|
102
|
-
prefix: NOTICE_STAMP_PREFIX,
|
|
103
|
-
should_notify: should_notify_here,
|
|
104
|
-
text: () => NOTICE
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
var duplicate_read_refusal = GUARD.refusal;
|
|
108
|
-
var duplicate_read_outcome = GUARD.outcome;
|
|
109
|
-
var { is_enabled, refusal_path } = GUARD;
|
|
110
|
-
var notice_refusal_path = hook_decision.create_refusal_stamp(NOTICE_STAMP_PREFIX).path;
|
|
111
|
-
var { deny_envelope, DISABLED_VALUES } = hook_decision;
|
|
112
|
-
var duplicate_reads = {
|
|
113
|
-
REASON,
|
|
114
|
-
NOTICE
|
|
115
|
-
};
|
|
116
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
117
|
-
if (process.stdin.isTTY) hook_decision.report_no_payload("duplicate-read:guard");
|
|
118
|
-
else hook_decision.write_outcome(await text(process.stdin), duplicate_read_outcome);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export {
|
|
122
|
-
SWITCH_ENV_KEY,
|
|
123
|
-
duplicate_read_refusal,
|
|
124
|
-
duplicate_read_outcome,
|
|
125
|
-
is_enabled,
|
|
126
|
-
refusal_path,
|
|
127
|
-
notice_refusal_path,
|
|
128
|
-
deny_envelope,
|
|
129
|
-
DISABLED_VALUES,
|
|
130
|
-
duplicate_reads
|
|
131
|
-
};
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import {
|
|
3
|
-
DISABLED_VALUES,
|
|
4
|
-
SWITCH_ENV_KEY,
|
|
5
|
-
deny_envelope,
|
|
6
|
-
duplicate_read_outcome,
|
|
7
|
-
duplicate_read_refusal,
|
|
8
|
-
duplicate_reads,
|
|
9
|
-
is_enabled,
|
|
10
|
-
notice_refusal_path,
|
|
11
|
-
refusal_path
|
|
12
|
-
} from "./chunk-YYPI7SJZ.js";
|
|
13
|
-
import "./chunk-H5HVWYXK.js";
|
|
14
|
-
import "./chunk-SHGPANFB.js";
|
|
15
|
-
import "./chunk-J47HU5H5.js";
|
|
16
|
-
import "./chunk-AS74OU3D.js";
|
|
17
|
-
import "./chunk-K4EOONYM.js";
|
|
18
|
-
import "./chunk-E7OIKX5Z.js";
|
|
19
|
-
import "./chunk-DGT54IH5.js";
|
|
20
|
-
export {
|
|
21
|
-
DISABLED_VALUES,
|
|
22
|
-
SWITCH_ENV_KEY,
|
|
23
|
-
deny_envelope,
|
|
24
|
-
duplicate_read_outcome,
|
|
25
|
-
duplicate_read_refusal,
|
|
26
|
-
duplicate_reads,
|
|
27
|
-
is_enabled,
|
|
28
|
-
notice_refusal_path,
|
|
29
|
-
refusal_path
|
|
30
|
-
};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import {
|
|
3
|
-
DISABLED_VALUES,
|
|
4
|
-
NOTICE,
|
|
5
|
-
SWITCH_ENV_KEY,
|
|
6
|
-
deny_envelope,
|
|
7
|
-
investigation_notice_path,
|
|
8
|
-
investigation_outcome,
|
|
9
|
-
investigation_refusal,
|
|
10
|
-
is_enabled,
|
|
11
|
-
load_environment_file,
|
|
12
|
-
refusal_path
|
|
13
|
-
} from "./chunk-K4LMBQC2.js";
|
|
14
|
-
import "./chunk-H5HVWYXK.js";
|
|
15
|
-
import "./chunk-SHGPANFB.js";
|
|
16
|
-
import "./chunk-J47HU5H5.js";
|
|
17
|
-
import "./chunk-AS74OU3D.js";
|
|
18
|
-
import "./chunk-K4EOONYM.js";
|
|
19
|
-
import "./chunk-E7OIKX5Z.js";
|
|
20
|
-
import "./chunk-DGT54IH5.js";
|
|
21
|
-
export {
|
|
22
|
-
DISABLED_VALUES,
|
|
23
|
-
NOTICE,
|
|
24
|
-
SWITCH_ENV_KEY,
|
|
25
|
-
deny_envelope,
|
|
26
|
-
investigation_notice_path,
|
|
27
|
-
investigation_outcome,
|
|
28
|
-
investigation_refusal,
|
|
29
|
-
is_enabled,
|
|
30
|
-
load_environment_file,
|
|
31
|
-
refusal_path
|
|
32
|
-
};
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { backlog_stalled } from './backlog-stalled'
|
|
4
|
-
import { backlog_stalled_detect } from './backlog-stalled-detect'
|
|
5
|
-
|
|
6
|
-
// `josh backlog:stalled` — read the three conditions once and print the verdict.
|
|
7
|
-
// This is the manual and testable face of the detector `stop-guard.ts` runs
|
|
8
|
-
// on every stop; both call the one `detect_and_report`, so the command and the hook can never drift.
|
|
9
|
-
//
|
|
10
|
-
// **It reports, it never stops.** The exit code is always success — a stall is a state to surface, not
|
|
11
|
-
// an error to fail on — so a caller (a person, a test, a wired hook) reads the verdict off stdout and is
|
|
12
|
-
// never halted by it. An unreadable record prints `unreadable` for the same reason: the run carries on.
|
|
13
|
-
|
|
14
|
-
const SUCCESS_EXIT_CODE = 0
|
|
15
|
-
|
|
16
|
-
async function main(): Promise<void> {
|
|
17
|
-
try {
|
|
18
|
-
console.info(await backlog_stalled_detect.detect_and_report())
|
|
19
|
-
} catch {
|
|
20
|
-
console.info(backlog_stalled.UNREADABLE)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
process.exitCode = SUCCESS_EXIT_CODE
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const backlog_stalled_cli = { main }
|
|
27
|
-
|
|
28
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
29
|
-
|
|
30
|
-
export { backlog_stalled_cli }
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// The three figures a cost report prints — a dollar amount, a token count, a percentage share — and
|
|
2
|
-
// the precision each uses. Shared by the run-tree report modules and by `josh time`'s reports, which
|
|
3
|
-
// render the same figures.
|
|
4
|
-
|
|
5
|
-
const USD_DECIMALS = 4
|
|
6
|
-
const PERCENT_SCALE = 100
|
|
7
|
-
const PERCENT_DECIMALS = 1
|
|
8
|
-
|
|
9
|
-
function format_usd(usd: number): string {
|
|
10
|
-
return `$${usd.toFixed(USD_DECIMALS)}`
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function format_tokens(count: number): string {
|
|
14
|
-
return count.toLocaleString('en-US')
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function format_share(part: number, whole: number): string {
|
|
18
|
-
if (whole === 0) return 'n/a'
|
|
19
|
-
|
|
20
|
-
return `${((part / whole) * PERCENT_SCALE).toFixed(PERCENT_DECIMALS)}%`
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const cost_format = {
|
|
24
|
-
format_usd,
|
|
25
|
-
format_tokens,
|
|
26
|
-
format_share,
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export { cost_format }
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// The two references `josh init` writes into a basic project, under the paths they had while the
|
|
2
|
-
// basic profile was named static. kit still ships both old paths so an earlier
|
|
3
|
-
// project keeps working; re-running `josh init` moves the project onto the new ones, which is what
|
|
4
|
-
// lets the old paths be retired once projects have moved.
|
|
5
|
-
const RENAMED_REFERENCES: ReadonlyArray<readonly [RegExp, string]> = [
|
|
6
|
-
[
|
|
7
|
-
/@node_modules\/@joshuafolkken\/kit\/dist\/CLAUDE\.static\.md(?![\w.])/gu,
|
|
8
|
-
'@node_modules/@joshuafolkken/kit/dist/CLAUDE.basic.md',
|
|
9
|
-
],
|
|
10
|
-
[/@joshuafolkken\/kit\/prettier\/static(?=['"])/gu, '@joshuafolkken/kit/prettier/basic'],
|
|
11
|
-
]
|
|
12
|
-
|
|
13
|
-
function migrate_basic_paths(content: string): string {
|
|
14
|
-
let migrated = content
|
|
15
|
-
|
|
16
|
-
for (const [pattern, replacement] of RENAMED_REFERENCES) {
|
|
17
|
-
migrated = migrated.replaceAll(pattern, () => replacement)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return migrated
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const basic_path_migration = { migrate_basic_paths }
|
|
24
|
-
export { basic_path_migration }
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
|
-
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
5
|
-
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
6
|
-
import { z } from 'zod'
|
|
7
|
-
import { issue_backlinks, type UpstreamEntry } from './issue-backlinks'
|
|
8
|
-
|
|
9
|
-
// `josh issue:backlinks <N>` — read origin issue N, then the upstream issues it lists, and print one
|
|
10
|
-
// of `ok` / `missing-origin` / `missing-upstream` / `wrong-heading`, exiting non-zero on anything but
|
|
11
|
-
// `ok` so it works as a gate.
|
|
12
|
-
|
|
13
|
-
const SUCCESS_EXIT_CODE = 0
|
|
14
|
-
const FAILURE_EXIT_CODE = 1
|
|
15
|
-
const ARGV_OFFSET = 2
|
|
16
|
-
const REF_PATTERN = /^([\w.-]+\/[\w.-]+)#(\d+)$/u
|
|
17
|
-
const BODY_FIELD = 'body'
|
|
18
|
-
const USAGE = 'Usage: josh issue:backlinks <issue-number>'
|
|
19
|
-
const READ_FAILURE = '✖ could not read an issue body — a rate limit, expired auth, or a bad number'
|
|
20
|
-
const body_schema = z.object({ body: z.string().nullish() })
|
|
21
|
-
|
|
22
|
-
function parse_body(raw_json: string | undefined): string | undefined {
|
|
23
|
-
if (raw_json === undefined) return undefined
|
|
24
|
-
const parsed = parse_json_object_or_undefined(raw_json, body_schema)
|
|
25
|
-
|
|
26
|
-
return parsed === undefined ? undefined : (parsed.body ?? '')
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async function read_body(issue_number: string, repo?: string): Promise<string | undefined> {
|
|
30
|
-
return parse_body(await git_gh_command.issue_view_json(issue_number, BODY_FIELD, repo))
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async function read_upstream(reference: string): Promise<UpstreamEntry | undefined> {
|
|
34
|
-
const match = REF_PATTERN.exec(reference)
|
|
35
|
-
if (match === null) return undefined
|
|
36
|
-
|
|
37
|
-
const [, repo, number = ''] = match
|
|
38
|
-
const body = await read_body(number, repo)
|
|
39
|
-
|
|
40
|
-
return body === undefined ? undefined : { ref: reference, body }
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async function read_upstreams(
|
|
44
|
-
references: ReadonlyArray<string>,
|
|
45
|
-
): Promise<ReadonlyArray<UpstreamEntry> | undefined> {
|
|
46
|
-
const entries = await Promise.all(
|
|
47
|
-
references.map(async (reference) => await read_upstream(reference)),
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
return entries.every((entry) => entry !== undefined) ? entries : undefined
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async function classify(issue_number: string): Promise<string | undefined> {
|
|
54
|
-
const origin_body = await read_body(issue_number)
|
|
55
|
-
if (origin_body === undefined) return undefined
|
|
56
|
-
|
|
57
|
-
if (!issue_backlinks.needs_upstreams(origin_body)) {
|
|
58
|
-
return issue_backlinks.classify_backlinks(origin_body, [])
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const upstreams = await read_upstreams(issue_backlinks.upstream_refs(origin_body))
|
|
62
|
-
if (upstreams === undefined) return undefined
|
|
63
|
-
|
|
64
|
-
return issue_backlinks.classify_backlinks(origin_body, upstreams)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
68
|
-
const [issue_number] = argv
|
|
69
|
-
|
|
70
|
-
if (issue_number === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)) {
|
|
71
|
-
console.error(USAGE)
|
|
72
|
-
|
|
73
|
-
return FAILURE_EXIT_CODE
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const verdict = await classify(issue_number)
|
|
77
|
-
|
|
78
|
-
if (verdict === undefined) {
|
|
79
|
-
console.error(READ_FAILURE)
|
|
80
|
-
|
|
81
|
-
return FAILURE_EXIT_CODE
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
console.info(verdict)
|
|
85
|
-
|
|
86
|
-
return verdict === 'ok' ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
90
|
-
process.exitCode = await run(argv)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { CommandEntry } from './josh-command-types'
|
|
2
|
-
|
|
3
|
-
// The `PreToolUse` guard registry, split out of `josh-commands-ai.ts` so that file stays under its
|
|
4
|
-
// 300-code-line limit, exactly as `LANE_COMMANDS` and `SPLIT_COMMANDS` were for the same reason.
|
|
5
|
-
// It is spread into
|
|
6
|
-
// `AI_COMMANDS` so the guards stay grouped with the other AI tools.
|
|
7
|
-
//
|
|
8
|
-
// **None declare `tsx_arguments`, for the reason `batch:guard` declares none**:
|
|
9
|
-
// declaring any disqualifies a command from in-process dispatch, and these run in front of every read
|
|
10
|
-
// or shell call. Each script calls `process.loadEnvFile` itself instead, through `hook-decision.ts`.
|
|
11
|
-
|
|
12
|
-
/* eslint-disable @typescript-eslint/naming-convention */
|
|
13
|
-
const GUARD_COMMANDS: Record<string, CommandEntry> = {
|
|
14
|
-
'investigation:guard': {
|
|
15
|
-
script: 'scripts/delegation/investigation-guard.ts',
|
|
16
|
-
description:
|
|
17
|
-
'Claude Code hook: refuse a read once the unedited-read threshold is reached again (reads the tool call on stdin)',
|
|
18
|
-
category: 'AI tools',
|
|
19
|
-
reference: ['', 'automation', ['none']],
|
|
20
|
-
},
|
|
21
|
-
'duplicate-read:guard': {
|
|
22
|
-
script: 'scripts/delegation/duplicate-read-guard.ts',
|
|
23
|
-
description:
|
|
24
|
-
'Claude Code hook: refuse a second whole-file read of a path whose content has not changed since the run last read it (reads the tool call on stdin)',
|
|
25
|
-
category: 'AI tools',
|
|
26
|
-
reference: ['', 'automation', ['none']],
|
|
27
|
-
},
|
|
28
|
-
'rule:guard': {
|
|
29
|
-
script: 'scripts/rules/rule-guard.ts',
|
|
30
|
-
description:
|
|
31
|
-
'Claude Code hook: deliver a trigger-delivered rule at the call that binds it (reads the tool call on stdin)',
|
|
32
|
-
category: 'AI tools',
|
|
33
|
-
reference: ['', 'automation', ['none']],
|
|
34
|
-
},
|
|
35
|
-
}
|
|
36
|
-
/* eslint-enable @typescript-eslint/naming-convention */
|
|
37
|
-
|
|
38
|
-
export { GUARD_COMMANDS }
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { FAIL_EXIT_CODE, type BufferedProcessResult } from '#scripts/lib/buffered-process'
|
|
2
|
-
import type { ESLint } from 'eslint'
|
|
3
|
-
|
|
4
|
-
// Some rules read other files, and the lint cache keys a verdict on the linted file's own content.
|
|
5
|
-
// So once the other file is fixed, the untouched one keeps its cached error until its own content
|
|
6
|
-
// changes. `import/no-cycle` did it first (joshuafolkken/kit#3641): a cycle closed by editing one
|
|
7
|
-
// side stayed reported on the other. The type-aware rules do it too (joshuafolkken/kit#3667): a call
|
|
8
|
-
// to a function its module did not export yet stays `no-unsafe-call` after the export is added.
|
|
9
|
-
//
|
|
10
|
-
// A red lint run therefore re-reads its cached report: the files reported for a rule that reads
|
|
11
|
-
// other files are linted once more without the cache, and their fresh results replace the cached
|
|
12
|
-
// ones. A green run never reaches this, so the green path costs what it did.
|
|
13
|
-
//
|
|
14
|
-
// Which rules those are is the rule's own statement, never a list kept here: a type-aware rule
|
|
15
|
-
// declares `requiresTypeChecking`, and the `import` plugin's rules resolve the modules they name.
|
|
16
|
-
// That plugin answers to two names: the base config registers it as `import`, and its own preset —
|
|
17
|
-
// whose rules a hand-authored `.js` file keeps — as `import-x`.
|
|
18
|
-
//
|
|
19
|
-
// Only a stale red is re-read. A stale green — the other file broke, the untouched one still
|
|
20
|
-
// answers clean — is not something a report can point at; the type check is what catches it.
|
|
21
|
-
//
|
|
22
|
-
// That holds for a run narrowed to one change's files as much as for the whole tree: the change can
|
|
23
|
-
// hold both files, and the one a later edit leaves alone keeps its cached report.
|
|
24
|
-
//
|
|
25
|
-
// The cached run is asked again through the Node API rather than read off the first run's report:
|
|
26
|
-
// that report is the stylish text, and taking a file out of it means re-deriving its problem
|
|
27
|
-
// counts. The second asking is answered from the cache the first one just wrote.
|
|
28
|
-
const IMPORT_RULE_PATTERN = /^import(?:-x)?\//u
|
|
29
|
-
const FORMATTER = 'stylish'
|
|
30
|
-
const UNCACHED_SUFFIX = '.uncached'
|
|
31
|
-
|
|
32
|
-
type RulesMeta = ESLint.LintResultData['rulesMeta']
|
|
33
|
-
|
|
34
|
-
interface Linters {
|
|
35
|
-
cached: ESLint
|
|
36
|
-
fresh: ESLint
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
interface CrossFileRecheckOptions {
|
|
40
|
-
cache_file: string
|
|
41
|
-
// What the run linted — the whole tree, or one change's files — so the cached run is asked the
|
|
42
|
-
// question it was asked the first time.
|
|
43
|
-
patterns: ReadonlyArray<string>
|
|
44
|
-
// What the fixture test varies: the directory linted and the configuration it is linted with.
|
|
45
|
-
eslint_options?: ESLint.Options
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// The exit code is eslint's "finished and reported problems", not any failure: a run that could not
|
|
49
|
-
// finish — a configuration that does not load, a rule that threw — exits 2, and asking it again
|
|
50
|
-
// throws the same error here, ahead of both buffered reports.
|
|
51
|
-
function is_red(result: BufferedProcessResult): boolean {
|
|
52
|
-
return result.exit_code === FAIL_EXIT_CODE
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// `requiresTypeChecking` is typescript-eslint's convention, which other type-aware plugins follow;
|
|
56
|
-
// eslint's own type for a rule's docs does not name it.
|
|
57
|
-
function is_type_aware(documentation: object | undefined): boolean {
|
|
58
|
-
if (documentation === undefined) return false
|
|
59
|
-
|
|
60
|
-
return 'requiresTypeChecking' in documentation && documentation.requiresTypeChecking === true
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// A problem with no rule is the parser's, about the file itself.
|
|
64
|
-
function reads_other_files(rule_id: string | null, rules_meta: RulesMeta): boolean {
|
|
65
|
-
if (rule_id === null) return false
|
|
66
|
-
|
|
67
|
-
return IMPORT_RULE_PATTERN.test(rule_id) || is_type_aware(rules_meta[rule_id]?.docs)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function suspects_of(linter: ESLint, cached: Array<ESLint.LintResult>): Array<string> {
|
|
71
|
-
const rules_meta = linter.getRulesMetaForResults(cached)
|
|
72
|
-
|
|
73
|
-
return cached
|
|
74
|
-
.filter((result) =>
|
|
75
|
-
result.messages.some((message) => reads_other_files(message.ruleId, rules_meta)),
|
|
76
|
-
)
|
|
77
|
-
.map((result) => result.filePath)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function cached_options(options: CrossFileRecheckOptions): ESLint.Options {
|
|
81
|
-
return {
|
|
82
|
-
...options.eslint_options,
|
|
83
|
-
cache: true,
|
|
84
|
-
cacheStrategy: 'content',
|
|
85
|
-
cacheLocation: options.cache_file,
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// A linter that runs without a cache deletes the cache file it would have used, and that defaults to
|
|
90
|
-
// the very file the lint run keeps. So the uncached linter is pointed at a sibling path nothing
|
|
91
|
-
// ever writes: the re-reading must not cost the next run its whole cache.
|
|
92
|
-
function fresh_options(options: CrossFileRecheckOptions): ESLint.Options {
|
|
93
|
-
return {
|
|
94
|
-
...options.eslint_options,
|
|
95
|
-
cache: false,
|
|
96
|
-
cacheLocation: `${options.cache_file}${UNCACHED_SUFFIX}`,
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// `eslint` is loaded here, only past a red report: it is an optional peer a basic-profile
|
|
101
|
-
// consumer may not have, and this module is imported by the entry of every `josh lint`, which has to
|
|
102
|
-
// reach its skip notice there.
|
|
103
|
-
async function create_linters(options: CrossFileRecheckOptions): Promise<Linters> {
|
|
104
|
-
const eslint = await import('eslint')
|
|
105
|
-
|
|
106
|
-
return {
|
|
107
|
-
cached: new eslint.ESLint(cached_options(options)),
|
|
108
|
-
fresh: new eslint.ESLint(fresh_options(options)),
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async function lint_fresh(
|
|
113
|
-
linter: ESLint,
|
|
114
|
-
suspects: Array<string>,
|
|
115
|
-
): Promise<Map<string, ESLint.LintResult>> {
|
|
116
|
-
const fresh = await linter.lintFiles(suspects)
|
|
117
|
-
|
|
118
|
-
return new Map(fresh.map((result) => [result.filePath, result]))
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
async function report(
|
|
122
|
-
linter: ESLint,
|
|
123
|
-
results: Array<ESLint.LintResult>,
|
|
124
|
-
): Promise<Pick<BufferedProcessResult, 'output' | 'exit_code'>> {
|
|
125
|
-
const formatter = await linter.loadFormatter(FORMATTER)
|
|
126
|
-
const is_failed = results.some((result) => result.errorCount > 0)
|
|
127
|
-
|
|
128
|
-
return { output: await formatter.format(results), exit_code: is_failed ? FAIL_EXIT_CODE : 0 }
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// A red about rules that read nothing else is handed back as the run reported it: its cached
|
|
132
|
-
// verdicts are about the files they are keyed on.
|
|
133
|
-
async function verify(
|
|
134
|
-
result: BufferedProcessResult,
|
|
135
|
-
options: CrossFileRecheckOptions,
|
|
136
|
-
): Promise<BufferedProcessResult> {
|
|
137
|
-
if (!is_red(result)) return result
|
|
138
|
-
const started_at = performance.now()
|
|
139
|
-
const linters = await create_linters(options)
|
|
140
|
-
const cached = await linters.cached.lintFiles([...options.patterns])
|
|
141
|
-
const suspects = suspects_of(linters.cached, cached)
|
|
142
|
-
if (suspects.length === 0) return result
|
|
143
|
-
const fresh = await lint_fresh(linters.fresh, suspects)
|
|
144
|
-
const verified = await report(
|
|
145
|
-
linters.fresh,
|
|
146
|
-
cached.map((entry) => fresh.get(entry.filePath) ?? entry),
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
return { ...verified, elapsed_ms: result.elapsed_ms + performance.now() - started_at }
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const cross_file_recheck = { verify }
|
|
153
|
-
|
|
154
|
-
export type { CrossFileRecheckOptions }
|
|
155
|
-
export { cross_file_recheck }
|