@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
1
2
|
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
2
3
|
import { z } from 'zod'
|
|
3
4
|
|
|
4
|
-
// What a person changed on an issue since a run last read it, as the one
|
|
5
|
-
//
|
|
6
|
-
//
|
|
5
|
+
// What a person changed on an issue since a run last read it, as the one answer the hook, the review
|
|
6
|
+
// attestation, `josh issue:ack` and `josh followup` all print. Kept in one place so the four callers
|
|
7
|
+
// cannot each draw the line between "a person's update" and "noise" differently; its only I/O is the
|
|
8
|
+
// write-access lookup `gh_author_association` makes for a `MEMBER` / `COLLABORATOR`.
|
|
7
9
|
//
|
|
8
10
|
// **A person's update is a body edit or a comment nobody automated.** A bot's comment (`type: Bot`,
|
|
9
11
|
// or a `[bot]` login) is not one. A run's own comment is posted under the person's own `gh` login,
|
|
@@ -12,6 +14,13 @@ import { z } from 'zod'
|
|
|
12
14
|
// through a raw `gh api` counts as a person's — the direction that costs one `josh issue:ack`, never a
|
|
13
15
|
// missed correction.
|
|
14
16
|
//
|
|
17
|
+
// **Only an author with write access is a person here** (`gh_author_association`). On a public
|
|
18
|
+
// repository anyone can comment, so a comment from anyone else is never handed to a run as an update,
|
|
19
|
+
// and its `RUN_MARKER` is not taken as josh's own. A `MEMBER` / `COLLABORATOR` whose lookup failed
|
|
20
|
+
// (`is_trusted: undefined` — the hook's timeout fired) is neither: their comment is announced with its
|
|
21
|
+
// body withheld, costing one `josh issue:ack` rather than a missed correction, and its marker is not
|
|
22
|
+
// trusted.
|
|
23
|
+
//
|
|
15
24
|
// **Comment edits are out of scope.** A new comment carries an id above the baseline's; an edited
|
|
16
25
|
// one keeps its id and is not seen. The body is compared whole, so its edits are.
|
|
17
26
|
|
|
@@ -21,6 +30,8 @@ const BOT_SUFFIX = '[bot]'
|
|
|
21
30
|
const NO_COMMENT_ID = 0
|
|
22
31
|
const UNKNOWN_AUTHOR = '(unknown)'
|
|
23
32
|
const UNKNOWN_TIME = '(undated)'
|
|
33
|
+
const UNVERIFIED_BODY =
|
|
34
|
+
"(body withheld — the author's write access could not be checked; read it with `josh issue:read`)"
|
|
24
35
|
|
|
25
36
|
const BODY_HEADING = 'Body edited:'
|
|
26
37
|
const REMOVED_PREFIX = '- '
|
|
@@ -36,11 +47,14 @@ const comment_schema = z.looseObject({
|
|
|
36
47
|
user: z.looseObject({ login: z.string(), type: z.string().optional() }).nullish(),
|
|
37
48
|
created_at: z.string().optional(),
|
|
38
49
|
body: z.string().nullish(),
|
|
50
|
+
author_association: z.string().nullish(),
|
|
39
51
|
})
|
|
40
52
|
|
|
41
53
|
interface WatchComment {
|
|
42
54
|
id: number
|
|
43
55
|
author: string
|
|
56
|
+
// `undefined` when the write-access lookup failed.
|
|
57
|
+
is_trusted: boolean | undefined
|
|
44
58
|
is_automated: boolean
|
|
45
59
|
created_at: string
|
|
46
60
|
body: string
|
|
@@ -60,26 +74,48 @@ function is_bot(user: z.infer<typeof comment_schema>['user']): boolean {
|
|
|
60
74
|
return user?.type === BOT_TYPE || (user?.login.endsWith(BOT_SUFFIX) ?? false)
|
|
61
75
|
}
|
|
62
76
|
|
|
63
|
-
function is_automated(
|
|
64
|
-
|
|
77
|
+
function is_automated(
|
|
78
|
+
raw: z.infer<typeof comment_schema>,
|
|
79
|
+
is_trusted: boolean | undefined,
|
|
80
|
+
): boolean {
|
|
81
|
+
return is_bot(raw.user) || (is_trusted === true && (raw.body?.includes(RUN_MARKER) ?? false))
|
|
65
82
|
}
|
|
66
83
|
|
|
67
|
-
function to_comment(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
84
|
+
async function to_comment(
|
|
85
|
+
raw: z.infer<typeof comment_schema>,
|
|
86
|
+
timeout_ms?: number,
|
|
87
|
+
): Promise<WatchComment> {
|
|
88
|
+
const login = raw.user?.login
|
|
89
|
+
const is_trusted = await gh_author_association.trust_of({
|
|
90
|
+
login,
|
|
91
|
+
association: raw.author_association,
|
|
92
|
+
timeout_ms,
|
|
93
|
+
})
|
|
71
94
|
|
|
72
|
-
return {
|
|
95
|
+
return {
|
|
96
|
+
id: raw.id,
|
|
97
|
+
author: login ?? UNKNOWN_AUTHOR,
|
|
98
|
+
is_trusted,
|
|
99
|
+
is_automated: is_automated(raw, is_trusted),
|
|
100
|
+
created_at: raw.created_at ?? UNKNOWN_TIME,
|
|
101
|
+
body: raw.body ?? '',
|
|
102
|
+
}
|
|
73
103
|
}
|
|
74
104
|
|
|
75
105
|
// `undefined` — never `[]` — for a listing that could not be read, so a failed read is never taken
|
|
76
|
-
// for "nobody commented".
|
|
77
|
-
|
|
106
|
+
// for "nobody commented". `timeout_ms` bounds each write-access lookup, which run concurrently, so a
|
|
107
|
+
// hook's read stays inside its own timeout.
|
|
108
|
+
async function parse_comments(
|
|
109
|
+
json: string | undefined,
|
|
110
|
+
timeout_ms?: number,
|
|
111
|
+
): Promise<ReadonlyArray<WatchComment> | undefined> {
|
|
78
112
|
if (json === undefined) return undefined
|
|
79
113
|
|
|
80
114
|
const listing = read_json_listing(json, comment_schema)
|
|
81
115
|
|
|
82
|
-
|
|
116
|
+
if (listing.kind !== 'read') return undefined
|
|
117
|
+
|
|
118
|
+
return await Promise.all(listing.rows.map(async (row) => await to_comment(row, timeout_ms)))
|
|
83
119
|
}
|
|
84
120
|
|
|
85
121
|
function last_comment_id(comments: ReadonlyArray<WatchComment>): number {
|
|
@@ -118,7 +154,9 @@ function body_section(previous_raw: string, current_raw: string): string | undef
|
|
|
118
154
|
}
|
|
119
155
|
|
|
120
156
|
function comment_section(comment: WatchComment): string {
|
|
121
|
-
|
|
157
|
+
const body = comment.is_trusted === true ? comment.body : UNVERIFIED_BODY
|
|
158
|
+
|
|
159
|
+
return `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}${LINE_SEPARATOR}${body}`
|
|
122
160
|
}
|
|
123
161
|
|
|
124
162
|
function new_person_comments(
|
|
@@ -126,7 +164,10 @@ function new_person_comments(
|
|
|
126
164
|
snapshot: WatchSnapshot,
|
|
127
165
|
): ReadonlyArray<WatchComment> {
|
|
128
166
|
return snapshot.comments.filter(
|
|
129
|
-
(comment) =>
|
|
167
|
+
(comment) =>
|
|
168
|
+
comment.id > baseline.last_comment_id &&
|
|
169
|
+
comment.is_trusted !== false &&
|
|
170
|
+
!comment.is_automated,
|
|
130
171
|
)
|
|
131
172
|
}
|
|
132
173
|
|
|
@@ -76,8 +76,9 @@ async function read_snapshot(
|
|
|
76
76
|
body: string,
|
|
77
77
|
etag: string | undefined,
|
|
78
78
|
): Promise<Fetched> {
|
|
79
|
-
const comments = issue_watch_diff.parse_comments(
|
|
79
|
+
const comments = await issue_watch_diff.parse_comments(
|
|
80
80
|
await git_gh_issue_read.issue_list_comments(request.issue, request.timeout_ms),
|
|
81
|
+
request.timeout_ms,
|
|
81
82
|
)
|
|
82
83
|
|
|
83
84
|
return comments === undefined ? UNREADABLE : { kind: 'read', snapshot: { body, comments }, etag }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
1
2
|
import { INTERRUPT_ROUTE_LABEL, SPLIT_ROUTE_LABEL, TIER_A_ROUTE_LABEL } from './issue-labels'
|
|
2
3
|
|
|
3
4
|
// The WIP cap at the call that files. `josh issue:file` reads the count and asks the exemption
|
|
@@ -55,13 +56,7 @@ function count_line(count: number, repo: string, verdict: WipVerdict): string {
|
|
|
55
56
|
// The listing's JSON is an array of rows; anything else is unreadable rather than zero, because zero
|
|
56
57
|
// would pass every filing as within the cap.
|
|
57
58
|
function count_of(json: string): number | undefined {
|
|
58
|
-
|
|
59
|
-
const parsed: unknown = JSON.parse(json)
|
|
60
|
-
|
|
61
|
-
return Array.isArray(parsed) ? parsed.length : undefined
|
|
62
|
-
} catch {
|
|
63
|
-
return undefined
|
|
64
|
-
}
|
|
59
|
+
return json_value.parse_array(json)?.length
|
|
65
60
|
}
|
|
66
61
|
|
|
67
62
|
const issue_wip = { WIP_CAP, HELD, HELD_MESSAGE, UNREAD_MESSAGE, verdict_of, count_line, count_of }
|
|
@@ -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
|
|
@@ -1,36 +1,17 @@
|
|
|
1
1
|
import { canonical_command, COMMAND_MAP } from './josh-command-map'
|
|
2
2
|
import type { CommandUsage } from './josh-command-types'
|
|
3
|
-
import { AUTOMATION_USAGE } from './josh-usage-automation'
|
|
4
|
-
import { BACKLOG_USAGE } from './josh-usage-backlog'
|
|
5
|
-
import { DEVELOPER_USAGE } from './josh-usage-developer'
|
|
6
|
-
import { HOOK_USAGE } from './josh-usage-hooks'
|
|
7
|
-
import { ISSUE_USAGE } from './josh-usage-issue'
|
|
8
|
-
import { REVIEW_USAGE } from './josh-usage-review'
|
|
9
|
-
import { RUN_USAGE } from './josh-usage-run'
|
|
10
|
-
import { SESSION_USAGE } from './josh-usage-session'
|
|
11
|
-
import { WORKFLOW_USAGE } from './josh-usage-workflow'
|
|
12
3
|
|
|
13
4
|
// The single renderer of a command's usage. `josh help <command>` prints it and
|
|
14
|
-
// `
|
|
15
|
-
// so the terminal and the page are one text (#3932).
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
'docs/josh-commands-run.md': [RUN_USAGE, SESSION_USAGE],
|
|
25
|
-
'docs/josh-commands-backlog.md': [ISSUE_USAGE, BACKLOG_USAGE, REVIEW_USAGE],
|
|
26
|
-
'docs/josh-commands-automation.md': [AUTOMATION_USAGE, WORKFLOW_USAGE, HOOK_USAGE],
|
|
27
|
-
}
|
|
28
|
-
/* eslint-enable @typescript-eslint/naming-convention */
|
|
29
|
-
const COMMAND_USAGE: UsageTable = Object.fromEntries(
|
|
30
|
-
Object.values(USAGE_PAGE_TABLES)
|
|
31
|
-
.flat()
|
|
32
|
-
.flatMap((table) => Object.entries(table)),
|
|
33
|
-
)
|
|
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
|
+
]
|
|
34
15
|
const NOTE_GAP = 3
|
|
35
16
|
|
|
36
17
|
interface ExampleLine {
|
|
@@ -39,7 +20,7 @@ interface ExampleLine {
|
|
|
39
20
|
}
|
|
40
21
|
|
|
41
22
|
function usage_for(name: string): CommandUsage | undefined {
|
|
42
|
-
return Object.hasOwn(
|
|
23
|
+
return Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name]?.usage : undefined
|
|
43
24
|
}
|
|
44
25
|
|
|
45
26
|
function example_line(name: string, example: CommandUsage['examples'][number]): ExampleLine {
|
|
@@ -80,31 +61,22 @@ function format_usage(name: string): string | undefined {
|
|
|
80
61
|
return [format_examples(name, usage), ...flags].join('\n\n')
|
|
81
62
|
}
|
|
82
63
|
|
|
83
|
-
// `josh help <command>`: the synopsis line, the description, then the usage block
|
|
84
|
-
//
|
|
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`.
|
|
85
66
|
function format_command_help(input: string): string | undefined {
|
|
86
67
|
const name = canonical_command(input)
|
|
87
68
|
const entry = Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name] : undefined
|
|
88
69
|
if (entry === undefined) return undefined
|
|
89
70
|
const [synopsis] = entry.reference
|
|
90
71
|
const head = synopsis ? `josh ${name} ${synopsis}` : `josh ${name}`
|
|
91
|
-
const usage = format_usage(name)
|
|
92
|
-
|
|
93
|
-
return [head, '', entry.description, ...(usage === undefined ? [] : ['', usage])].join('\n')
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// The commands whose usage blocks a reference page renders — the keys of the tables tied to it.
|
|
97
|
-
function page_commands(page: string): Array<string> {
|
|
98
|
-
const tables = Object.hasOwn(USAGE_PAGE_TABLES, page) ? USAGE_PAGE_TABLES[page] : undefined
|
|
99
72
|
|
|
100
|
-
return
|
|
73
|
+
return [head, '', entry.description, '', format_usage(name)].join('\n')
|
|
101
74
|
}
|
|
102
75
|
|
|
103
76
|
const command_usage = {
|
|
104
|
-
USAGE_PAGES
|
|
77
|
+
USAGE_PAGES,
|
|
105
78
|
format_command_help,
|
|
106
79
|
format_usage,
|
|
107
|
-
page_commands,
|
|
108
80
|
}
|
|
109
81
|
|
|
110
82
|
export { command_usage }
|