@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
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
// way, so the slicing lives in one place rather than being written twice.
|
|
4
4
|
|
|
5
5
|
const HEADING_PREFIX = '## '
|
|
6
|
+
// A body saved from GitHub's web editor ends its lines with CRLF; a kept `\r` would end every line's
|
|
7
|
+
// text with it and defeat each `$`-anchored match downstream.
|
|
8
|
+
const LINE_BREAK_PATTERN = /\r?\n/u
|
|
6
9
|
|
|
7
10
|
function is_heading(line: string): boolean {
|
|
8
11
|
return line.trimStart().startsWith(HEADING_PREFIX)
|
|
@@ -29,21 +32,31 @@ function next_fence(line: string, fence: string): string | undefined {
|
|
|
29
32
|
return undefined
|
|
30
33
|
}
|
|
31
34
|
|
|
32
|
-
function
|
|
35
|
+
function lines_of(body: string): ReadonlyArray<string> {
|
|
36
|
+
return body.split(LINE_BREAK_PATTERN)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The body's lines with every fenced line, fences included, blanked. Indentation is kept, so a list
|
|
40
|
+
// item's indented continuation survives.
|
|
41
|
+
function fence_free_lines(body: string): ReadonlyArray<string> {
|
|
33
42
|
let fence = ''
|
|
34
43
|
const visible: Array<string> = []
|
|
35
44
|
|
|
36
|
-
for (const line of body
|
|
45
|
+
for (const line of lines_of(body)) {
|
|
37
46
|
const next = next_fence(line, fence)
|
|
38
|
-
const visible_line = line.replace(/^(?: {4}|\t).*/u, '')
|
|
39
47
|
|
|
40
|
-
visible.push(next === undefined && fence === '' ?
|
|
48
|
+
visible.push(next === undefined && fence === '' ? line : '')
|
|
41
49
|
fence = next ?? fence
|
|
42
50
|
}
|
|
43
51
|
|
|
44
52
|
return visible
|
|
45
53
|
}
|
|
46
54
|
|
|
55
|
+
// As `fence_free_lines`, with an indented code line (4 spaces or a tab) blanked too.
|
|
56
|
+
function unfenced_lines(body: string): ReadonlyArray<string> {
|
|
57
|
+
return fence_free_lines(body).map((line) => line.replace(/^(?: {4}|\t).*/u, ''))
|
|
58
|
+
}
|
|
59
|
+
|
|
47
60
|
function has_unfenced_line(body: string, text: string): boolean {
|
|
48
61
|
return unfenced_lines(body).some((line) => line.trim() === text)
|
|
49
62
|
}
|
|
@@ -59,7 +72,7 @@ function section_lines_matching(
|
|
|
59
72
|
body: string,
|
|
60
73
|
is_target: (line: string) => boolean,
|
|
61
74
|
): ReadonlyArray<string> {
|
|
62
|
-
const lines = body
|
|
75
|
+
const lines = lines_of(body)
|
|
63
76
|
const visible = unfenced_lines(body)
|
|
64
77
|
const start = visible.findIndex((line) => is_target(line))
|
|
65
78
|
|
|
@@ -80,6 +93,7 @@ function section_lines(body: string, heading: string): ReadonlyArray<string> {
|
|
|
80
93
|
const markdown_section = {
|
|
81
94
|
section_lines,
|
|
82
95
|
section_lines_matching,
|
|
96
|
+
fence_free_lines,
|
|
83
97
|
unfenced_lines,
|
|
84
98
|
has_line,
|
|
85
99
|
has_unfenced_line,
|
|
@@ -24,7 +24,7 @@ import { session_cite } from './session-cite'
|
|
|
24
24
|
|
|
25
25
|
const FAILURE_EXIT_CODE = 1
|
|
26
26
|
const ARGV_OFFSET = 2
|
|
27
|
-
const ISSUE_FIELDS = 'body,author_association'
|
|
27
|
+
const ISSUE_FIELDS = 'body,author_association,user'
|
|
28
28
|
const UNKNOWN_ASSOCIATION = 'unknown'
|
|
29
29
|
const USAGE = 'Usage: josh measure:rerun <issue-number>'
|
|
30
30
|
const NO_BASELINE = 'no `command → value` baseline found in ## ベースライン — nothing to re-run'
|
|
@@ -36,6 +36,7 @@ const MEASURE_TIMEOUT_MS = 60_000
|
|
|
36
36
|
const issue_schema = z.object({
|
|
37
37
|
body: z.string().nullish(),
|
|
38
38
|
author_association: z.string().nullish(),
|
|
39
|
+
user: z.looseObject({ login: z.string() }).nullish(),
|
|
39
40
|
})
|
|
40
41
|
|
|
41
42
|
type IssueFields = z.infer<typeof issue_schema>
|
|
@@ -88,6 +89,15 @@ async function read_issue(issue_number: string): Promise<IssueFields | undefined
|
|
|
88
89
|
return json === undefined ? undefined : parse_json_object_or_undefined(json, issue_schema)
|
|
89
90
|
}
|
|
90
91
|
|
|
92
|
+
function untrusted(issue_number: string, issue: IssueFields): BodyRead {
|
|
93
|
+
const association = issue.author_association ?? UNKNOWN_ASSOCIATION
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
kind: 'refused',
|
|
97
|
+
reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author (${association}) is not ${gh_author_association.TRUSTED_LIST}`,
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
91
101
|
// The body, only when its author can write to the repository. A read that fails is refused as well:
|
|
92
102
|
// an unknown author is not a trusted one.
|
|
93
103
|
async function read_trusted_body(issue_number: string): Promise<BodyRead> {
|
|
@@ -97,14 +107,9 @@ async function read_trusted_body(issue_number: string): Promise<BodyRead> {
|
|
|
97
107
|
return { kind: 'refused', reason: `could not read issue ${session_cite.issue(issue_number)}` }
|
|
98
108
|
}
|
|
99
109
|
|
|
100
|
-
const
|
|
110
|
+
const author = { login: issue.user?.login, association: issue.author_association }
|
|
101
111
|
|
|
102
|
-
if (!gh_author_association.is_trusted(
|
|
103
|
-
return {
|
|
104
|
-
kind: 'refused',
|
|
105
|
-
reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author is ${association}, not ${gh_author_association.TRUSTED_LIST}`,
|
|
106
|
-
}
|
|
107
|
-
}
|
|
112
|
+
if (!(await gh_author_association.is_trusted(author))) return untrusted(issue_number, issue)
|
|
108
113
|
|
|
109
114
|
return { kind: 'trusted', body: issue.body ?? '' }
|
|
110
115
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { plan_consumers } from '#scripts/issue/plan-consumers'
|
|
2
|
+
|
|
3
|
+
// `josh plan:consumers <identifier...>` — prints each identifier's existing references and the draft
|
|
4
|
+
// of a plan's existing-consumers section (`plan-consumers.ts`). A flag is refused rather than searched
|
|
5
|
+
// for, since an identifier never starts with `-`.
|
|
6
|
+
|
|
7
|
+
const SUCCESS_EXIT_CODE = 0
|
|
8
|
+
const FAILURE_EXIT_CODE = 1
|
|
9
|
+
const USAGE = 'Usage: josh plan:consumers <identifier...>'
|
|
10
|
+
|
|
11
|
+
function identifiers_of(argv: ReadonlyArray<string>): Array<string> | undefined {
|
|
12
|
+
const identifiers = [...new Set(argv.map((argument) => argument.trim()))]
|
|
13
|
+
|
|
14
|
+
if (identifiers.length === 0) return undefined
|
|
15
|
+
|
|
16
|
+
return identifiers.some((identifier) => identifier === '' || identifier.startsWith('-'))
|
|
17
|
+
? undefined
|
|
18
|
+
: identifiers
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
22
|
+
const identifiers = identifiers_of(argv)
|
|
23
|
+
|
|
24
|
+
if (identifiers === undefined) {
|
|
25
|
+
console.error(USAGE)
|
|
26
|
+
|
|
27
|
+
return FAILURE_EXIT_CODE
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const { text, has_failed } = await plan_consumers.report(identifiers)
|
|
31
|
+
|
|
32
|
+
console.info(text)
|
|
33
|
+
|
|
34
|
+
return has_failed ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const plan_consumers_cli = { USAGE, run }
|
|
38
|
+
|
|
39
|
+
export { plan_consumers_cli }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { plan_consumers_cli } from './plan-consumers-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh plan:consumers` entry, kept apart from `plan-consumers-cli.ts` so a bundle carrying that
|
|
6
|
+
// module never fires this guard (joshuafolkken/kit#4186).
|
|
7
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
8
|
+
const ARGV_OFFSET = 2
|
|
9
|
+
|
|
10
|
+
process.exitCode = await plan_consumers_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
11
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { markdown_section } from '#scripts/issue/markdown-section'
|
|
2
|
+
|
|
3
|
+
// A plan's existing-consumers section (`HEADING`) — the existing code, prompts and documents that
|
|
4
|
+
// read or write each state, command, label, file or process the plan adds or changes, and what this
|
|
5
|
+
// issue does with each. A concept added without it shipped while its readers still assumed the old
|
|
6
|
+
// world (joshuafolkken/kit#4270, #4265 after `lane:pause`), so `issue:plan` refuses a plan that omits
|
|
7
|
+
// it.
|
|
8
|
+
//
|
|
9
|
+
// **"None" is an answer only with its reason** (`NONE_WITH_REASON`), since a bare "none" cannot be
|
|
10
|
+
// told from a section filled in to get past the check.
|
|
11
|
+
|
|
12
|
+
const HEADING = '### 影響を受ける既存の利用者'
|
|
13
|
+
const ANY_HEADING = /^#{1,6}\s/u
|
|
14
|
+
const LIST_MARKER = /^(?:[-*+]|\d+\.)\s+/u
|
|
15
|
+
const NONE_WORD = 'なし'
|
|
16
|
+
const NONE_WITH_REASON = /^なし\s*[((]\s*\S.*[))]$/u
|
|
17
|
+
const MISSING = `The plan has no \`${HEADING}\` section: list, for each state, command, label, file or process it adds or changes, the existing places that read or write it and what this issue does with each (\`pnpm josh plan:consumers <identifier...>\` drafts it), or write \`なし(<reason>)\`.`
|
|
18
|
+
const EMPTY = `The plan's \`${HEADING}\` section is empty: list the existing consumers, or write \`なし(<reason>)\`.`
|
|
19
|
+
const BARE_NONE = `The plan's \`${HEADING}\` section says \`なし\` without a reason: write \`なし(<reason>)\`.`
|
|
20
|
+
|
|
21
|
+
// The section runs to the next heading of any level, since the plan's own sections are `###`. Fenced
|
|
22
|
+
// lines are blanked first, so a `# comment` in a code block neither ends the section nor is an entry.
|
|
23
|
+
function section_entries(plan: string): ReadonlyArray<string> | undefined {
|
|
24
|
+
if (!markdown_section.has_line(plan, HEADING)) return undefined
|
|
25
|
+
const raw = markdown_section.section_lines(plan, HEADING).join('\n')
|
|
26
|
+
const lines = markdown_section.fence_free_lines(raw)
|
|
27
|
+
const end = lines.findIndex((line) => ANY_HEADING.test(line.trim()))
|
|
28
|
+
const body = end === -1 ? lines : lines.slice(0, end)
|
|
29
|
+
|
|
30
|
+
return body.map((line) => line.trim().replace(LIST_MARKER, '')).filter((line) => line !== '')
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// "None" answers for the whole section, so only a section that opens with it is read as one — a "none"
|
|
34
|
+
// nested under a consumer entry is that entry's note. A reason wrapped onto later lines is joined back.
|
|
35
|
+
function is_bare_none(entries: ReadonlyArray<string>): boolean {
|
|
36
|
+
const [first = ''] = entries
|
|
37
|
+
|
|
38
|
+
if (!first.startsWith(NONE_WORD) || NONE_WITH_REASON.test(first)) return false
|
|
39
|
+
|
|
40
|
+
return !NONE_WITH_REASON.test(entries.join(' '))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The refusal for a plan whose section is missing, empty or a reasonless "none"; `undefined` passes.
|
|
44
|
+
function refusal_of(plan: string): string | undefined {
|
|
45
|
+
const entries = section_entries(plan)
|
|
46
|
+
|
|
47
|
+
if (entries === undefined) return MISSING
|
|
48
|
+
if (entries.length === 0) return EMPTY
|
|
49
|
+
|
|
50
|
+
return is_bare_none(entries) ? BARE_NONE : undefined
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const plan_consumers_section = { HEADING, refusal_of }
|
|
54
|
+
|
|
55
|
+
export { plan_consumers_section }
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { git_grep_hits, type Hit } from '#scripts/git/git-grep-hits'
|
|
2
|
+
import { plan_consumers_section } from '#scripts/issue/plan-consumers-section'
|
|
3
|
+
|
|
4
|
+
// `josh plan:consumers <identifier...>` — where each identifier a plan adds or changes is already
|
|
5
|
+
// read or written, so its existing-consumers section names them rather than leaving them for the
|
|
6
|
+
// next incident to find. Every reference in the tracked tree — a CI workflow or a settings file reads
|
|
7
|
+
// a name as surely as code does — grouped by kind, then a draft of the section for the plan to finish.
|
|
8
|
+
// `.josh/` is left out: its observations and metrics record past runs rather than read the name.
|
|
9
|
+
//
|
|
10
|
+
// **Unlike `run:prep`'s code locations it keeps every line and every kind** — a prompt that tells a
|
|
11
|
+
// run to count a label is as much a consumer of it as the code that does — but caps each kind, so one
|
|
12
|
+
// common name cannot bury the rest.
|
|
13
|
+
|
|
14
|
+
type Kind = 'code' | 'config' | 'doc' | 'prompt' | 'test'
|
|
15
|
+
|
|
16
|
+
interface Consumers {
|
|
17
|
+
identifier: string
|
|
18
|
+
hits: ReadonlyArray<Hit>
|
|
19
|
+
has_failed: boolean
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const PATHSPECS = [':(exclude).josh']
|
|
23
|
+
const KINDS: ReadonlyArray<readonly [Kind, string]> = [
|
|
24
|
+
['code', 'code'],
|
|
25
|
+
['config', 'config and workflows'],
|
|
26
|
+
['prompt', 'prompts and skills'],
|
|
27
|
+
['doc', 'docs'],
|
|
28
|
+
['test', 'tests'],
|
|
29
|
+
]
|
|
30
|
+
const TEST_PATH = /(?:\.test\.ts|\.e2e\.ts|\.snap)$/u
|
|
31
|
+
const CODE_PATH = /\.(?:ts|js|mjs|cjs|svelte|sh)$/u
|
|
32
|
+
const PROMPT_ROOTS = ['prompts/', '.claude/']
|
|
33
|
+
const MAX_HITS_PER_KIND = 20
|
|
34
|
+
const MAX_DRAFT_FILES = 8
|
|
35
|
+
const INDENT = ' '
|
|
36
|
+
const HIT_INDENT = `${INDENT}${INDENT}`
|
|
37
|
+
const HIT_SEPARATOR = ' '
|
|
38
|
+
const NO_REFERENCE = ' — no reference in the tracked tree'
|
|
39
|
+
const SEARCH_FAILED = ' — git grep failed; not searched'
|
|
40
|
+
const DRAFT_ACTION = '<直す | 影響なし | 別 Issue>'
|
|
41
|
+
const DRAFT_NO_REFERENCE = 'no existing reference'
|
|
42
|
+
|
|
43
|
+
// Markdown under `prompts/` or `.claude/` instructs a run and other Markdown is read by people; the
|
|
44
|
+
// rest that is neither code nor a test — workflows, settings, JSON and YAML data — is configuration.
|
|
45
|
+
function markdown_kind(path: string): Kind {
|
|
46
|
+
return PROMPT_ROOTS.some((root) => path.startsWith(root)) ? 'prompt' : 'doc'
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function kind_of(path: string): Kind {
|
|
50
|
+
if (TEST_PATH.test(path)) return 'test'
|
|
51
|
+
if (CODE_PATH.test(path)) return 'code'
|
|
52
|
+
|
|
53
|
+
return path.endsWith('.md') ? markdown_kind(path) : 'config'
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function more_line(count: number): Array<string> {
|
|
57
|
+
return count > MAX_HITS_PER_KIND
|
|
58
|
+
? [`${HIT_INDENT}… +${String(count - MAX_HITS_PER_KIND)} more`]
|
|
59
|
+
: []
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function format_kind(hits: ReadonlyArray<Hit>, kind: Kind, label: string): Array<string> {
|
|
63
|
+
const of_kind = hits.filter((hit) => kind_of(hit.path) === kind)
|
|
64
|
+
|
|
65
|
+
if (of_kind.length === 0) return []
|
|
66
|
+
const lines = of_kind
|
|
67
|
+
.slice(0, MAX_HITS_PER_KIND)
|
|
68
|
+
.map((hit) => `${HIT_INDENT}${hit.path}:${hit.line}${HIT_SEPARATOR}${hit.excerpt}`)
|
|
69
|
+
|
|
70
|
+
return [`${INDENT}${label}`, ...lines, ...more_line(of_kind.length)]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function format_consumers(consumers: Consumers): string {
|
|
74
|
+
if (consumers.has_failed) return `${consumers.identifier}${SEARCH_FAILED}`
|
|
75
|
+
if (consumers.hits.length === 0) return `${consumers.identifier}${NO_REFERENCE}`
|
|
76
|
+
const kinds = KINDS.flatMap(([kind, label]) => format_kind(consumers.hits, kind, label))
|
|
77
|
+
|
|
78
|
+
return [consumers.identifier, ...kinds].join('\n')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Tests are left out of the draft: a test follows the code it covers, so it is never the consumer a
|
|
82
|
+
// plan has to decide about.
|
|
83
|
+
function kind_rank(path: string): number {
|
|
84
|
+
return KINDS.findIndex(([kind]) => kind === kind_of(path))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Code first, in `KINDS` order, so the cap drops docs before the code a plan most has to decide on.
|
|
88
|
+
function draft_files(hits: ReadonlyArray<Hit>): Array<string> {
|
|
89
|
+
const paths = [...new Set(hits.map((hit) => hit.path))]
|
|
90
|
+
.filter((path) => kind_of(path) !== 'test')
|
|
91
|
+
.toSorted((left, right) => kind_rank(left) - kind_rank(right))
|
|
92
|
+
const shown = paths.slice(0, MAX_DRAFT_FILES).map((path) => `\`${path}\``)
|
|
93
|
+
const rest = paths.length - shown.length
|
|
94
|
+
|
|
95
|
+
return rest > 0 ? [...shown, `+${String(rest)} more`] : shown
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function draft_entry(consumers: Consumers): string {
|
|
99
|
+
const files = draft_files(consumers.hits)
|
|
100
|
+
|
|
101
|
+
if (files.length === 0) return `- \`${consumers.identifier}\`: ${DRAFT_NO_REFERENCE}`
|
|
102
|
+
|
|
103
|
+
return `- \`${consumers.identifier}\`: ${files.join(', ')} — ${DRAFT_ACTION}`
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function format_draft(all: ReadonlyArray<Consumers>): string {
|
|
107
|
+
const entries = all.map((consumers) => draft_entry(consumers))
|
|
108
|
+
|
|
109
|
+
return ['draft:', plan_consumers_section.HEADING, '', ...entries].join('\n')
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function find(identifier: string): Promise<Consumers> {
|
|
113
|
+
return { identifier, ...(await git_grep_hits.search(identifier, [], PATHSPECS)) }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function report(
|
|
117
|
+
identifiers: ReadonlyArray<string>,
|
|
118
|
+
): Promise<{ text: string; has_failed: boolean }> {
|
|
119
|
+
const all = await Promise.all(identifiers.map(async (identifier) => await find(identifier)))
|
|
120
|
+
const sections = [...all.map((consumers) => format_consumers(consumers)), format_draft(all)]
|
|
121
|
+
|
|
122
|
+
return { text: sections.join('\n\n'), has_failed: all.some((consumers) => consumers.has_failed) }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const plan_consumers = { kind_of, report }
|
|
126
|
+
|
|
127
|
+
export { plan_consumers }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// The environment variables that name the **parent** agent session, and which a child session must
|
|
2
2
|
// not inherit.
|
|
3
3
|
//
|
|
4
|
-
// `
|
|
4
|
+
// `tools/eval/eval-session.ts` and `josh run:wake` both launch a headless session. Two copies of
|
|
5
5
|
// this list is the clone `CLAUDE.md`
|
|
6
6
|
// prohibits, and this is the shape of clone that fails silently: the copy that drifts does not throw
|
|
7
7
|
// or lint — the child dials the parent's private socket, is refused, and the session dies as
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { canonical_command, COMMAND_MAP } from './josh-command-map'
|
|
2
|
+
import type { CommandUsage } from './josh-command-types'
|
|
3
|
+
|
|
4
|
+
// The single renderer of a command's usage. `josh help <command>` prints it and
|
|
5
|
+
// `tools/document/generate-command-usage.ts` writes it between a reference page's usage markers,
|
|
6
|
+
// so the terminal and the page are one text (#3932). The usage itself sits on each command's entry
|
|
7
|
+
// (#4185); which page renders it is the page's own `<!-- usage: <command> -->` span.
|
|
8
|
+
|
|
9
|
+
const USAGE_PAGES: ReadonlyArray<string> = [
|
|
10
|
+
'docs/josh-commands.md',
|
|
11
|
+
'docs/josh-commands-run.md',
|
|
12
|
+
'docs/josh-commands-backlog.md',
|
|
13
|
+
'docs/josh-commands-automation.md',
|
|
14
|
+
]
|
|
15
|
+
const NOTE_GAP = 3
|
|
16
|
+
|
|
17
|
+
interface ExampleLine {
|
|
18
|
+
command: string
|
|
19
|
+
note: string | undefined
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function usage_for(name: string): CommandUsage | undefined {
|
|
23
|
+
return Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name]?.usage : undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function example_line(name: string, example: CommandUsage['examples'][number]): ExampleLine {
|
|
27
|
+
const command = example.arguments ? `pnpm josh ${name} ${example.arguments}` : `pnpm josh ${name}`
|
|
28
|
+
|
|
29
|
+
return { command, note: example.note }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Every comment starts in one column, so a block reads as a table of what each spelling does.
|
|
33
|
+
function format_examples(name: string, usage: CommandUsage): string {
|
|
34
|
+
const lines = usage.examples.map((example) => example_line(name, example))
|
|
35
|
+
const width = Math.max(...lines.map((line) => line.command.length)) + NOTE_GAP
|
|
36
|
+
const rendered = lines.map((line) =>
|
|
37
|
+
line.note === undefined ? line.command : `${line.command.padEnd(width)}# ${line.note}`,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
return ['```bash', ...rendered, '```'].join('\n')
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function code_span(text: string): string {
|
|
44
|
+
return `\`${text}\``
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function format_flags(flags: NonNullable<CommandUsage['flags']>): string {
|
|
48
|
+
const items = flags.map(
|
|
49
|
+
(flag) =>
|
|
50
|
+
`- ${flag.names.map((spelling) => code_span(spelling)).join(' / ')} — ${flag.description}`,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return ['**Options:**', '', ...items].join('\n')
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function format_usage(name: string): string | undefined {
|
|
57
|
+
const usage = usage_for(name)
|
|
58
|
+
if (usage === undefined) return undefined
|
|
59
|
+
const flags = usage.flags === undefined ? [] : [format_flags(usage.flags)]
|
|
60
|
+
|
|
61
|
+
return [format_examples(name, usage), ...flags].join('\n\n')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// `josh help <command>`: the synopsis line, the description, then the usage block. An alias
|
|
65
|
+
// resolves to its command; a name that is neither answers `undefined`.
|
|
66
|
+
function format_command_help(input: string): string | undefined {
|
|
67
|
+
const name = canonical_command(input)
|
|
68
|
+
const entry = Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name] : undefined
|
|
69
|
+
if (entry === undefined) return undefined
|
|
70
|
+
const [synopsis] = entry.reference
|
|
71
|
+
const head = synopsis ? `josh ${name} ${synopsis}` : `josh ${name}`
|
|
72
|
+
|
|
73
|
+
return [head, '', entry.description, '', format_usage(name)].join('\n')
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const command_usage = {
|
|
77
|
+
USAGE_PAGES,
|
|
78
|
+
format_command_help,
|
|
79
|
+
format_usage,
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { command_usage }
|
|
@@ -3,7 +3,7 @@ import { stamp_file } from './stamp-file'
|
|
|
3
3
|
|
|
4
4
|
// A stamp whose payload is "when this was taken, and the digest of every file it covers".
|
|
5
5
|
//
|
|
6
|
-
// `
|
|
6
|
+
// `tools/eval/eval-stamp.ts` was the only holder of this shape. `josh review:brief` needs two more
|
|
7
7
|
// records of exactly the same kind — the gate's result, and the snapshot round 1 takes so round 2
|
|
8
8
|
// can name the fix delta — and copying the payload type, its validation, the guarded read and the
|
|
9
9
|
// comparison into a second module is the clone `CLAUDE.md` prohibits. What genuinely differs between
|
|
@@ -48,6 +48,14 @@ interface FileMapStamp {
|
|
|
48
48
|
// reads it and the two `josh review:brief` records, which assert a completed past fact by
|
|
49
49
|
// existing at all, neither write nor read it.
|
|
50
50
|
completed_at?: string
|
|
51
|
+
// The git blob of each mapped path as it was read — written only by the round-1 review snapshot
|
|
52
|
+
// (`review-round-one-blobs.ts`). When `base` moves, round 2 carries these onto the new base and
|
|
53
|
+
// measures the fix delta from there; a record without them falls back to the moved-base refusal.
|
|
54
|
+
blobs?: Record<string, string>
|
|
55
|
+
// The fingerprint of what the vouched check reads beside the files — its tools' versions and its
|
|
56
|
+
// environment (`verification-inputs.ts`, joshuafolkken/kit#4495). Written by a record created with an
|
|
57
|
+
// `inputs` source; a reader of such a record refuses one whose fingerprint is absent or differs.
|
|
58
|
+
inputs?: string
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
// Takes `unknown` rather than the declared field type, because the declared type is an assertion
|
|
@@ -64,28 +72,38 @@ function is_file_map(value: unknown): value is Record<string, string> {
|
|
|
64
72
|
// reader treats an absent field as the safe answer — "not running" for a `pid`, "cannot be reused"
|
|
65
73
|
// for a `base`. Spread rather than assigned, because `exactOptionalPropertyTypes` makes an explicit
|
|
66
74
|
// `undefined` a different thing from an absent key.
|
|
67
|
-
function
|
|
68
|
-
pid: unknown,
|
|
69
|
-
base: unknown,
|
|
70
|
-
completed_at: unknown,
|
|
71
|
-
process_start: unknown,
|
|
72
|
-
): Partial<FileMapStamp> {
|
|
75
|
+
function identity_fields({ pid, process_start }: Partial<FileMapStamp>): Partial<FileMapStamp> {
|
|
73
76
|
return {
|
|
74
77
|
...(typeof pid === 'number' && { pid }),
|
|
78
|
+
...(typeof process_start === 'string' && { process_start }),
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function tree_fields({ base, completed_at, blobs }: Partial<FileMapStamp>): Partial<FileMapStamp> {
|
|
83
|
+
return {
|
|
75
84
|
...(typeof base === 'string' && { base }),
|
|
76
85
|
...(typeof completed_at === 'string' && { completed_at }),
|
|
77
|
-
...(
|
|
86
|
+
...(is_file_map(blobs) && { blobs }),
|
|
78
87
|
}
|
|
79
88
|
}
|
|
80
89
|
|
|
90
|
+
function input_fields({ inputs }: Partial<FileMapStamp>): Partial<FileMapStamp> {
|
|
91
|
+
return typeof inputs === 'string' ? { inputs } : {}
|
|
92
|
+
}
|
|
93
|
+
|
|
81
94
|
function parse_stamp(raw: string): FileMapStamp | undefined {
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
) as Partial<FileMapStamp>
|
|
95
|
+
const parsed = JSON.parse(raw) as Partial<FileMapStamp>
|
|
96
|
+
const { taken_at, files } = parsed
|
|
85
97
|
|
|
86
98
|
if (typeof taken_at !== 'string' || !is_file_map(files)) return undefined
|
|
87
99
|
|
|
88
|
-
return {
|
|
100
|
+
return {
|
|
101
|
+
taken_at,
|
|
102
|
+
files,
|
|
103
|
+
...identity_fields(parsed),
|
|
104
|
+
...tree_fields(parsed),
|
|
105
|
+
...input_fields(parsed),
|
|
106
|
+
}
|
|
89
107
|
}
|
|
90
108
|
|
|
91
109
|
// Whether the process that wrote this record is still running. It takes the
|
|
@@ -152,14 +170,22 @@ function changed_since(stamp: FileMapStamp, tree: Record<string, string>): Reado
|
|
|
152
170
|
interface FileMapStampAccess {
|
|
153
171
|
stamp_path: () => string
|
|
154
172
|
// `base` is written by the one record that is acted on rather than merely reported — the
|
|
155
|
-
// green-gate reuse. The others omit it and are unaffected.
|
|
156
|
-
write: (
|
|
173
|
+
// green-gate reuse. The others omit it and are unaffected. `blobs` is the round-1 snapshot's alone.
|
|
174
|
+
write: (
|
|
175
|
+
files: Record<string, string>,
|
|
176
|
+
target?: string,
|
|
177
|
+
base?: string,
|
|
178
|
+
blobs?: Record<string, string>,
|
|
179
|
+
) => string
|
|
157
180
|
// Marks an existing record as belonging to a run that finished. It
|
|
158
181
|
// amends rather than rewrites, and answers `undefined` where there is no record to amend: a run
|
|
159
182
|
// whose record never got written has nothing to assert a completion about, and inventing one here
|
|
160
183
|
// would manufacture the very vouching the field exists to withhold.
|
|
161
184
|
complete: (target?: string) => string | undefined
|
|
162
185
|
read: (source?: string) => FileMapStamp | undefined
|
|
186
|
+
// Whether `stamp` was written under the inputs fingerprint read now; always `true` for a record
|
|
187
|
+
// created without an `inputs` source, which never vouches for a check.
|
|
188
|
+
describes_inputs: (stamp: FileMapStamp) => boolean
|
|
163
189
|
// For a record whose meaning is its existence rather than its contents — the in-flight gate marker.
|
|
164
190
|
// A record nobody removes would go on asserting a gate that ended.
|
|
165
191
|
remove: (target?: string) => void
|
|
@@ -219,7 +245,11 @@ function complete_at(target: string): string | undefined {
|
|
|
219
245
|
// The destination is a parameter on both sides so a test can exercise the round trip without
|
|
220
246
|
// overwriting the record a real run may be relying on — two commands share one path by design, and a
|
|
221
247
|
// suite that wrote to it would be a second writer nobody declared.
|
|
222
|
-
|
|
248
|
+
//
|
|
249
|
+
// `inputs` answers the fingerprint of what the record vouches for beside its files
|
|
250
|
+
// (`verification-inputs.ts`); it is read at each write and each comparison, so a tool reinstalled or an
|
|
251
|
+
// environment variable changed between them leaves the record standing for nobody.
|
|
252
|
+
function create(prefix: string, root?: string, inputs?: () => string): FileMapStampAccess {
|
|
223
253
|
function resolve(): string {
|
|
224
254
|
return stamp_file.stamp_path(prefix, root)
|
|
225
255
|
}
|
|
@@ -229,15 +259,18 @@ function create(prefix: string, root?: string): FileMapStampAccess {
|
|
|
229
259
|
// `base` goes into the payload undefined and all — `JSON.stringify` drops an undefined value,
|
|
230
260
|
// so a caller that has no base writes exactly the record it wrote before this field existed.
|
|
231
261
|
// `own_fields` is what writes the pid, and the writing process's start time beside it — assembled in one place so no record can carry half an identity.
|
|
232
|
-
write: (files, target = resolve(), base?: string) =>
|
|
262
|
+
write: (files, target = resolve(), base?: string, blobs?: Record<string, string>) =>
|
|
233
263
|
stamp_file.write_stamp(target, {
|
|
234
264
|
taken_at: new Date().toISOString(),
|
|
235
265
|
files,
|
|
236
266
|
...process_identity.own_fields(),
|
|
237
267
|
base,
|
|
268
|
+
blobs,
|
|
269
|
+
inputs: inputs?.(),
|
|
238
270
|
}),
|
|
239
271
|
complete: (target = resolve()) => complete_at(target),
|
|
240
272
|
read: (source = resolve()) => read_at(source),
|
|
273
|
+
describes_inputs: (stamp) => inputs === undefined || stamp.inputs === inputs(),
|
|
241
274
|
remove: (target = resolve()) => {
|
|
242
275
|
stamp_file.remove_stamp(target)
|
|
243
276
|
},
|