@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
|
@@ -0,0 +1,882 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
|
|
3
|
+
// scripts/document/document-read-cli.ts
|
|
4
|
+
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
5
|
+
|
|
6
|
+
// scripts/document/bash-output-cap.ts
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
|
|
9
|
+
// scripts/lib/read-file.ts
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
var ABSENT_CODE = "ENOENT";
|
|
12
|
+
function is_absent(error) {
|
|
13
|
+
return error instanceof Error && "code" in error && error.code === ABSENT_CODE;
|
|
14
|
+
}
|
|
15
|
+
function read_optional(path9) {
|
|
16
|
+
try {
|
|
17
|
+
return readFileSync(path9, "utf8");
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (is_absent(error)) return void 0;
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function read_file_or_empty(path9) {
|
|
24
|
+
return read_optional(path9) ?? "";
|
|
25
|
+
}
|
|
26
|
+
function read_if_readable(path9) {
|
|
27
|
+
try {
|
|
28
|
+
return readFileSync(path9, "utf8");
|
|
29
|
+
} catch {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
var file_reader = { is_absent, read_optional, read_file_or_empty, read_if_readable };
|
|
34
|
+
|
|
35
|
+
// scripts/document/document-scan.ts
|
|
36
|
+
var COMMAND_PATTERN = /`(?:pnpm )?josh ([a-z][a-z0-9:-]+)/gu;
|
|
37
|
+
var LABEL_PATTERN = /(?:labels\[\]=|\/labels\/|labels -f name=)([a-z][a-z0-9:_-]*)/gu;
|
|
38
|
+
var SECTION_PATTERN = /(?<![\w./:`-])(?<tick>`?)(?<file>[\w./-]+\.md)\k<tick>\s*→\s*(?:§\w+,\s*)?["「](?<heading>[^"」]+)["」]/gu;
|
|
39
|
+
var ADJACENT_PATTERN = /["「](?<heading>[^"「」]+)["」]\s+(?:above|below)\b/gu;
|
|
40
|
+
var BARE_ARROW_PATTERN = /→\s*(?:§\w+,\s*)?["「](?<heading>[^"「」]+)["」]/gu;
|
|
41
|
+
var LINK_TARGET_PATTERN = /\]\([^)\s]*\)/gu;
|
|
42
|
+
var LINK_PATTERN = /\]\(([\w./-]+\.(?:md|png|jpe?g|gif|svg|webp))(?:#[\w-]+)?\)/gu;
|
|
43
|
+
var PLACEHOLDER_FILES = /* @__PURE__ */ new Set(["x.md", "foo.md", "file.md", "path.md"]);
|
|
44
|
+
function matches(text, pattern) {
|
|
45
|
+
return [...text.matchAll(pattern)];
|
|
46
|
+
}
|
|
47
|
+
function command_references(text) {
|
|
48
|
+
return matches(text, COMMAND_PATTERN).map((match) => match[1] ?? "").filter((name) => !name.endsWith(":"));
|
|
49
|
+
}
|
|
50
|
+
function is_real_label(token) {
|
|
51
|
+
return token.length > 0 && !token.endsWith(":") && !token.includes("<");
|
|
52
|
+
}
|
|
53
|
+
function label_references(text) {
|
|
54
|
+
return matches(text, LABEL_PATTERN).map((match) => match[1] ?? "").filter((token) => is_real_label(token));
|
|
55
|
+
}
|
|
56
|
+
function base_name(path9) {
|
|
57
|
+
return path9.split("/").at(-1) ?? path9;
|
|
58
|
+
}
|
|
59
|
+
function is_placeholder_file(name) {
|
|
60
|
+
return name.includes("<") || PLACEHOLDER_FILES.has(base_name(name).toLowerCase());
|
|
61
|
+
}
|
|
62
|
+
function section_references(text) {
|
|
63
|
+
return matches(text.replaceAll(LINK_TARGET_PATTERN, ""), SECTION_PATTERN).map(({ groups }) => ({ file: groups?.["file"] ?? "", heading: groups?.["heading"] ?? "" })).filter((reference) => !is_placeholder_file(reference.file));
|
|
64
|
+
}
|
|
65
|
+
function headings_matching(text, pattern) {
|
|
66
|
+
return matches(text, pattern).map(({ groups }) => groups?.["heading"] ?? "");
|
|
67
|
+
}
|
|
68
|
+
function adjacent_references(text) {
|
|
69
|
+
return headings_matching(text, ADJACENT_PATTERN);
|
|
70
|
+
}
|
|
71
|
+
function bare_arrow_references(text) {
|
|
72
|
+
const unfiled = text.replaceAll(LINK_TARGET_PATTERN, "").replaceAll(SECTION_PATTERN, "");
|
|
73
|
+
return headings_matching(unfiled, BARE_ARROW_PATTERN);
|
|
74
|
+
}
|
|
75
|
+
function link_targets(text) {
|
|
76
|
+
return matches(text, LINK_PATTERN).map((match) => match[1] ?? "").filter((file) => !is_placeholder_file(file));
|
|
77
|
+
}
|
|
78
|
+
function normalize_reference(heading) {
|
|
79
|
+
return heading.replaceAll("`", "").split(/\s+/u).filter((word) => word !== ">").join(" ");
|
|
80
|
+
}
|
|
81
|
+
function reference_forms(title) {
|
|
82
|
+
const normalized = normalize_reference(title);
|
|
83
|
+
return [normalized, normalized.replace(/^\d+[a-z]?\. /u, "")];
|
|
84
|
+
}
|
|
85
|
+
var document_scan = {
|
|
86
|
+
adjacent_references,
|
|
87
|
+
bare_arrow_references,
|
|
88
|
+
command_references,
|
|
89
|
+
label_references,
|
|
90
|
+
link_targets,
|
|
91
|
+
normalize_reference,
|
|
92
|
+
reference_forms,
|
|
93
|
+
section_references
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// scripts/document/document-section.ts
|
|
97
|
+
var HEADING_PATTERN = /^(?<hashes>#{1,6}) (?<title>.*)$/u;
|
|
98
|
+
var FENCE = "```";
|
|
99
|
+
var SINGLE_MATCH = 1;
|
|
100
|
+
var BOLD_LABEL_PATTERN = /\*\*([^*]+?)\*\*/gu;
|
|
101
|
+
var BOLD_DELIMITER = "**";
|
|
102
|
+
var CODE_SPAN_PATTERN = /``[^\n]*?``|`[^`\n]*`/gu;
|
|
103
|
+
var LABEL_LEVEL = 7;
|
|
104
|
+
var LIST_ITEM_PATTERN = /^(?<indent>\s*)(?:[-*]|\d+\.) /u;
|
|
105
|
+
function to_heading(line, index) {
|
|
106
|
+
const groups = HEADING_PATTERN.exec(line)?.groups;
|
|
107
|
+
if (groups === void 0) return void 0;
|
|
108
|
+
const { hashes = "", title = "" } = groups;
|
|
109
|
+
return { level: hashes.length, title: title.trim(), line: index };
|
|
110
|
+
}
|
|
111
|
+
function push_heading(found, line, index) {
|
|
112
|
+
const heading = to_heading(line, index);
|
|
113
|
+
if (heading !== void 0) found.push(heading);
|
|
114
|
+
}
|
|
115
|
+
function fenced_flags(lines) {
|
|
116
|
+
let is_inside_fence = false;
|
|
117
|
+
return lines.map(function is_fenced(line) {
|
|
118
|
+
if (!line.startsWith(FENCE)) return is_inside_fence;
|
|
119
|
+
is_inside_fence = !is_inside_fence;
|
|
120
|
+
return true;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function headings(markdown) {
|
|
124
|
+
const lines = markdown.split("\n");
|
|
125
|
+
const fenced = fenced_flags(lines);
|
|
126
|
+
const found = [];
|
|
127
|
+
for (const [index, line] of lines.entries()) {
|
|
128
|
+
if (fenced[index] !== true) push_heading(found, line, index);
|
|
129
|
+
}
|
|
130
|
+
return found;
|
|
131
|
+
}
|
|
132
|
+
function titles(markdown) {
|
|
133
|
+
return headings(markdown).map((heading) => heading.title);
|
|
134
|
+
}
|
|
135
|
+
function line_starts(markdown) {
|
|
136
|
+
return [...markdown.matchAll(/\n/gu)].map((match) => match.index + SINGLE_MATCH);
|
|
137
|
+
}
|
|
138
|
+
function line_of(starts, offset) {
|
|
139
|
+
return starts.filter((start) => start <= offset).length;
|
|
140
|
+
}
|
|
141
|
+
function unfenced_text(markdown) {
|
|
142
|
+
const lines = markdown.split("\n");
|
|
143
|
+
const fenced = fenced_flags(lines);
|
|
144
|
+
return lines.map((line, index) => fenced[index] === true ? "" : line).join("\n");
|
|
145
|
+
}
|
|
146
|
+
function code_masked(text) {
|
|
147
|
+
return text.replaceAll(CODE_SPAN_PATTERN, (span) => span.replaceAll("*", " "));
|
|
148
|
+
}
|
|
149
|
+
function labels(markdown) {
|
|
150
|
+
const text = unfenced_text(markdown);
|
|
151
|
+
const starts = line_starts(text);
|
|
152
|
+
return [...code_masked(text).matchAll(BOLD_LABEL_PATTERN)].map((match) => ({
|
|
153
|
+
level: LABEL_LEVEL,
|
|
154
|
+
title: text.slice(
|
|
155
|
+
match.index + BOLD_DELIMITER.length,
|
|
156
|
+
match.index + match[0].length - BOLD_DELIMITER.length
|
|
157
|
+
),
|
|
158
|
+
line: line_of(starts, match.index)
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
function is_match(heading, wanted) {
|
|
162
|
+
return document_scan.reference_forms(heading.title).some((form) => form.startsWith(wanted));
|
|
163
|
+
}
|
|
164
|
+
function prefixed(found, wanted) {
|
|
165
|
+
const normalized = document_scan.normalize_reference(wanted);
|
|
166
|
+
return found.filter((heading) => is_match(heading, normalized));
|
|
167
|
+
}
|
|
168
|
+
function is_exact(heading, wanted) {
|
|
169
|
+
return document_scan.reference_forms(heading.title).includes(wanted);
|
|
170
|
+
}
|
|
171
|
+
function select(found, wanted) {
|
|
172
|
+
const normalized = document_scan.normalize_reference(wanted);
|
|
173
|
+
const exact = found.find((heading) => is_exact(heading, normalized));
|
|
174
|
+
if (exact !== void 0) return exact;
|
|
175
|
+
const near = prefixed(found, wanted);
|
|
176
|
+
return near.length === SINGLE_MATCH ? near[0] : void 0;
|
|
177
|
+
}
|
|
178
|
+
function last_line_of(found, chosen, total_lines) {
|
|
179
|
+
const next = found.find((heading) => heading.line > chosen.line && heading.level <= chosen.level);
|
|
180
|
+
return (next === void 0 ? total_lines : next.line) - SINGLE_MATCH;
|
|
181
|
+
}
|
|
182
|
+
function indent_of(line) {
|
|
183
|
+
return line.length - line.trimStart().length;
|
|
184
|
+
}
|
|
185
|
+
function is_sibling_item(line, depth) {
|
|
186
|
+
const { indent } = LIST_ITEM_PATTERN.exec(line)?.groups ?? {};
|
|
187
|
+
return indent !== void 0 && indent.length <= depth;
|
|
188
|
+
}
|
|
189
|
+
function ends_block(line, depth) {
|
|
190
|
+
if (line.trim() === "" || HEADING_PATTERN.test(line)) return true;
|
|
191
|
+
return is_sibling_item(line, depth);
|
|
192
|
+
}
|
|
193
|
+
function label_last_line(lines, label) {
|
|
194
|
+
const depth = indent_of(lines[label.line] ?? "");
|
|
195
|
+
const end = lines.findIndex((line, index) => index > label.line && ends_block(line, depth));
|
|
196
|
+
return (end === -1 ? lines.length : end) - SINGLE_MATCH;
|
|
197
|
+
}
|
|
198
|
+
function choose(markdown, wanted) {
|
|
199
|
+
const found = headings(markdown);
|
|
200
|
+
if (prefixed(found, wanted).length > 0) return select(found, wanted);
|
|
201
|
+
return select(labels(markdown), wanted);
|
|
202
|
+
}
|
|
203
|
+
function extent_of(markdown, chosen) {
|
|
204
|
+
const lines = markdown.split("\n");
|
|
205
|
+
if (chosen.level === LABEL_LEVEL) return label_last_line(lines, chosen);
|
|
206
|
+
return last_line_of(headings(markdown), chosen, lines.length);
|
|
207
|
+
}
|
|
208
|
+
function section(markdown, wanted) {
|
|
209
|
+
const chosen = choose(markdown, wanted);
|
|
210
|
+
if (chosen === void 0) return void 0;
|
|
211
|
+
const last_line = extent_of(markdown, chosen);
|
|
212
|
+
const lines = markdown.split("\n").slice(chosen.line, last_line + SINGLE_MATCH);
|
|
213
|
+
return {
|
|
214
|
+
title: chosen.title,
|
|
215
|
+
level: chosen.level,
|
|
216
|
+
first_line: chosen.line,
|
|
217
|
+
last_line,
|
|
218
|
+
text: lines.join("\n")
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
function candidates(markdown, wanted) {
|
|
222
|
+
const near = prefixed(headings(markdown), wanted);
|
|
223
|
+
const listed = near.length > 0 ? near : prefixed(labels(markdown), wanted);
|
|
224
|
+
return listed.map((heading) => heading.title);
|
|
225
|
+
}
|
|
226
|
+
function read_optional2(file_path) {
|
|
227
|
+
return file_reader.read_if_readable(file_path);
|
|
228
|
+
}
|
|
229
|
+
var document_section = {
|
|
230
|
+
candidates,
|
|
231
|
+
headings,
|
|
232
|
+
read_optional: read_optional2,
|
|
233
|
+
section,
|
|
234
|
+
titles
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// scripts/document/bash-output-cap.ts
|
|
238
|
+
var SETTINGS_FILE = path.join(".claude", "settings.json");
|
|
239
|
+
var HARNESS_DEFAULT_CAP_CHARS = 3e4;
|
|
240
|
+
var ENV_KEY = "env";
|
|
241
|
+
var CAP_KEY = "BASH_MAX_OUTPUT_LENGTH";
|
|
242
|
+
var NONE = 0;
|
|
243
|
+
function property_of(value, key) {
|
|
244
|
+
if (typeof value !== "object" || value === null) return void 0;
|
|
245
|
+
return Reflect.get(value, key);
|
|
246
|
+
}
|
|
247
|
+
function declared_cap(text) {
|
|
248
|
+
try {
|
|
249
|
+
return property_of(property_of(JSON.parse(text), ENV_KEY), CAP_KEY);
|
|
250
|
+
} catch {
|
|
251
|
+
return void 0;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function bash_output_cap(root) {
|
|
255
|
+
const text = document_section.read_optional(path.join(root, SETTINGS_FILE)) ?? "";
|
|
256
|
+
const chars = Number(declared_cap(text));
|
|
257
|
+
return Number.isSafeInteger(chars) && chars > NONE ? chars : HARNESS_DEFAULT_CAP_CHARS;
|
|
258
|
+
}
|
|
259
|
+
var bash_output_cap_reader = { HARNESS_DEFAULT_CAP_CHARS, bash_output_cap };
|
|
260
|
+
|
|
261
|
+
// scripts/document/document-section-cli.ts
|
|
262
|
+
import { existsSync as existsSync3 } from "node:fs";
|
|
263
|
+
import path8 from "node:path";
|
|
264
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
265
|
+
|
|
266
|
+
// scripts/josh/package-directory.ts
|
|
267
|
+
import { existsSync } from "node:fs";
|
|
268
|
+
|
|
269
|
+
// scripts/lib/ancestor-directories.ts
|
|
270
|
+
import path2 from "node:path";
|
|
271
|
+
var MAX_DEPTH = 64;
|
|
272
|
+
function list(start_directory) {
|
|
273
|
+
const directories = [];
|
|
274
|
+
let current = path2.resolve(start_directory);
|
|
275
|
+
while (directories.length < MAX_DEPTH && !directories.includes(current)) {
|
|
276
|
+
directories.push(current);
|
|
277
|
+
current = path2.dirname(current);
|
|
278
|
+
}
|
|
279
|
+
return directories;
|
|
280
|
+
}
|
|
281
|
+
function nearest(start_directory, is_match2) {
|
|
282
|
+
return list(start_directory).find((directory) => is_match2(directory));
|
|
283
|
+
}
|
|
284
|
+
var ancestor_directories = { list, nearest };
|
|
285
|
+
|
|
286
|
+
// scripts/lib/package-manifest.ts
|
|
287
|
+
import { readFileSync as readFileSync2 } from "node:fs";
|
|
288
|
+
import path3 from "node:path";
|
|
289
|
+
|
|
290
|
+
// scripts/lib/json-value.ts
|
|
291
|
+
function parse_or_undefined(text) {
|
|
292
|
+
try {
|
|
293
|
+
return JSON.parse(text);
|
|
294
|
+
} catch {
|
|
295
|
+
return void 0;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function parse_with(text, schema) {
|
|
299
|
+
const value = parse_or_undefined(text);
|
|
300
|
+
if (value === void 0) return void 0;
|
|
301
|
+
const parsed = schema.safeParse(value);
|
|
302
|
+
return parsed.success ? parsed.data : void 0;
|
|
303
|
+
}
|
|
304
|
+
function parse_array(text) {
|
|
305
|
+
const value = parse_or_undefined(text);
|
|
306
|
+
return Array.isArray(value) ? value : void 0;
|
|
307
|
+
}
|
|
308
|
+
function is_record(value) {
|
|
309
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
310
|
+
}
|
|
311
|
+
var json_value = { parse_or_undefined, parse_with, parse_array, is_record };
|
|
312
|
+
|
|
313
|
+
// scripts/lib/package-manifest.ts
|
|
314
|
+
var PACKAGE_JSON = "package.json";
|
|
315
|
+
function manifest_path(directory) {
|
|
316
|
+
return path3.join(directory, PACKAGE_JSON);
|
|
317
|
+
}
|
|
318
|
+
function read_manifest(directory, schema) {
|
|
319
|
+
const text = readFileSync2(manifest_path(directory), "utf8");
|
|
320
|
+
return schema.parse(JSON.parse(text));
|
|
321
|
+
}
|
|
322
|
+
function read_manifest_if_valid(directory, schema) {
|
|
323
|
+
const text = file_reader.read_if_readable(manifest_path(directory));
|
|
324
|
+
if (text === void 0) return void 0;
|
|
325
|
+
return json_value.parse_with(text, schema);
|
|
326
|
+
}
|
|
327
|
+
var package_manifest = { manifest_path, read_manifest, read_manifest_if_valid };
|
|
328
|
+
|
|
329
|
+
// scripts/josh/package-directory.ts
|
|
330
|
+
function find_package_directory(start_directory) {
|
|
331
|
+
return ancestor_directories.nearest(
|
|
332
|
+
start_directory,
|
|
333
|
+
(directory) => existsSync(package_manifest.manifest_path(directory))
|
|
334
|
+
) ?? start_directory;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// scripts/document/capped-print.ts
|
|
338
|
+
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
339
|
+
import path5 from "node:path";
|
|
340
|
+
|
|
341
|
+
// scripts/josh/platform-temporary.ts
|
|
342
|
+
import { accessSync, constants } from "node:fs";
|
|
343
|
+
import { tmpdir } from "node:os";
|
|
344
|
+
var POSIX_TEMP_ROOT = "/tmp";
|
|
345
|
+
var WINDOWS_PLATFORM = "win32";
|
|
346
|
+
function is_writable_directory(directory) {
|
|
347
|
+
try {
|
|
348
|
+
accessSync(directory, constants.W_OK);
|
|
349
|
+
return true;
|
|
350
|
+
} catch {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
function resolve_temporary_root(platform, can_write = is_writable_directory) {
|
|
355
|
+
if (platform === WINDOWS_PLATFORM) return tmpdir();
|
|
356
|
+
return can_write(POSIX_TEMP_ROOT) ? POSIX_TEMP_ROOT : tmpdir();
|
|
357
|
+
}
|
|
358
|
+
var TEMP_ROOT_KEY = "JOSH_TEMP_ROOT";
|
|
359
|
+
function temporary_root(override, platform) {
|
|
360
|
+
return override === void 0 || override === "" ? resolve_temporary_root(platform) : override;
|
|
361
|
+
}
|
|
362
|
+
var PLATFORM_TEMP_ROOT = temporary_root(process.env[TEMP_ROOT_KEY], process.platform);
|
|
363
|
+
|
|
364
|
+
// scripts/review/review-diff-parts.ts
|
|
365
|
+
var LINE_BREAK = "\n";
|
|
366
|
+
function cut_line(line, budget) {
|
|
367
|
+
const pieces = [];
|
|
368
|
+
for (let start = 0; start < line.length; start += budget) {
|
|
369
|
+
pieces.push(line.slice(start, start + budget));
|
|
370
|
+
}
|
|
371
|
+
return pieces;
|
|
372
|
+
}
|
|
373
|
+
function pieces_of(text, budget) {
|
|
374
|
+
return text.split(/(?<=\n)/u).flatMap((line) => cut_line(line, budget));
|
|
375
|
+
}
|
|
376
|
+
function is_full(current, piece, budget) {
|
|
377
|
+
return current.length > 0 && current.length + piece.length > budget;
|
|
378
|
+
}
|
|
379
|
+
function split_text(text, budget) {
|
|
380
|
+
const parts = [];
|
|
381
|
+
let current = "";
|
|
382
|
+
for (const piece of pieces_of(text, budget)) {
|
|
383
|
+
if (is_full(current, piece, budget)) {
|
|
384
|
+
parts.push(current);
|
|
385
|
+
current = "";
|
|
386
|
+
}
|
|
387
|
+
current += piece;
|
|
388
|
+
}
|
|
389
|
+
return current.length > 0 ? [...parts, current] : parts;
|
|
390
|
+
}
|
|
391
|
+
function part_header(relative, index, count) {
|
|
392
|
+
return `# ${relative} \u2014 part ${String(index + 1)} of ${String(count)}${LINE_BREAK}`;
|
|
393
|
+
}
|
|
394
|
+
function part_texts(relative, diff, cap) {
|
|
395
|
+
const budget = Math.max(1, cap - part_header(relative, diff.length, diff.length).length);
|
|
396
|
+
const bodies = split_text(diff, budget);
|
|
397
|
+
return bodies.map((body, index) => `${part_header(relative, index, bodies.length)}${body}`);
|
|
398
|
+
}
|
|
399
|
+
function body_of(part) {
|
|
400
|
+
return part.slice(part.indexOf(LINE_BREAK) + 1);
|
|
401
|
+
}
|
|
402
|
+
function part_list(parts) {
|
|
403
|
+
return Object.entries(parts).flatMap(([relative, files]) => [` ${relative}`, ...files.map((file) => ` ${file}`)]).join(LINE_BREAK);
|
|
404
|
+
}
|
|
405
|
+
function reading_block(parts, cap) {
|
|
406
|
+
return [
|
|
407
|
+
`Reading the diff: Bash output is cut at ${String(cap)} characters, so the change is written below as one or more parts per path, each under that cap, and together exactly the diff. Read the parts of every path you review with the Read tool. Do not print the diff, or any file this brief names, through Bash (\`git diff\`, \`cat\`).`,
|
|
408
|
+
part_list(parts)
|
|
409
|
+
].join(LINE_BREAK);
|
|
410
|
+
}
|
|
411
|
+
var review_diff_parts = { body_of, part_texts, reading_block, split_text };
|
|
412
|
+
|
|
413
|
+
// scripts/document/capped-print-part.ts
|
|
414
|
+
import path4 from "node:path";
|
|
415
|
+
var DIRECTORY_PREFIX = "josh-capped-print-";
|
|
416
|
+
var PART_PREFIX = "part-";
|
|
417
|
+
var PART_SUFFIX = ".md";
|
|
418
|
+
var PART_PATTERN = /^part-[1-9]\d*\.md$/u;
|
|
419
|
+
function part_name(index) {
|
|
420
|
+
return `${PART_PREFIX}${String(index + 1)}${PART_SUFFIX}`;
|
|
421
|
+
}
|
|
422
|
+
function is_part_file(absolute) {
|
|
423
|
+
const parent = path4.basename(path4.dirname(absolute));
|
|
424
|
+
return parent.startsWith(DIRECTORY_PREFIX) && PART_PATTERN.test(path4.basename(absolute));
|
|
425
|
+
}
|
|
426
|
+
var capped_print_part = { DIRECTORY_PREFIX, part_name, is_part_file };
|
|
427
|
+
|
|
428
|
+
// scripts/document/capped-print.ts
|
|
429
|
+
var FILE_MODE = 384;
|
|
430
|
+
var LINE_BREAK2 = "\n";
|
|
431
|
+
var HEADROOM_CHARS = 512;
|
|
432
|
+
function write_parts(label, text, cap) {
|
|
433
|
+
const directory = mkdtempSync(path5.join(PLATFORM_TEMP_ROOT, capped_print_part.DIRECTORY_PREFIX));
|
|
434
|
+
return review_diff_parts.part_texts(label, text, cap).map((part, index) => {
|
|
435
|
+
const file = path5.join(directory, capped_print_part.part_name(index));
|
|
436
|
+
writeFileSync(file, part, { flag: "wx", mode: FILE_MODE });
|
|
437
|
+
return file;
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
function part_count(count) {
|
|
441
|
+
return `written as ${String(count)} part file${count === 1 ? "" : "s"} under it`;
|
|
442
|
+
}
|
|
443
|
+
function listing(text, cap, files) {
|
|
444
|
+
const figures = `${text.length.toLocaleString("en-US")} > ${cap.toLocaleString("en-US")} characters`;
|
|
445
|
+
const lead = `Over the Bash cap (${figures}) \u2014 ${part_count(files.length)}, together exactly the output. Read every part with the Read tool, in one turn, not cat:`;
|
|
446
|
+
return [lead, ...files.map((file) => ` ${file}`)].join(LINE_BREAK2);
|
|
447
|
+
}
|
|
448
|
+
function output_budget(root) {
|
|
449
|
+
return Math.max(1, bash_output_cap_reader.bash_output_cap(root) - HEADROOM_CHARS);
|
|
450
|
+
}
|
|
451
|
+
function capped_print(text, label, root = process.cwd()) {
|
|
452
|
+
const budget = output_budget(root);
|
|
453
|
+
if (text.length < budget) {
|
|
454
|
+
console.info(text);
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
console.info(listing(text, budget, write_parts(label, text, budget)));
|
|
458
|
+
}
|
|
459
|
+
var capped_output = { HEADROOM_CHARS, capped_print };
|
|
460
|
+
|
|
461
|
+
// scripts/document/entry-read-set.ts
|
|
462
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
463
|
+
import path7 from "node:path";
|
|
464
|
+
|
|
465
|
+
// scripts/init/init-paths.ts
|
|
466
|
+
import path6 from "node:path";
|
|
467
|
+
import { fileURLToPath } from "node:url";
|
|
468
|
+
var PACKAGE_DIR = path6.join(path6.dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
469
|
+
var PROJECT_ROOT = process.cwd();
|
|
470
|
+
|
|
471
|
+
// scripts/cost-runtime/cost-tokens.ts
|
|
472
|
+
var ASCII_CHARS_PER_TOKEN = 3;
|
|
473
|
+
var WIDE_TOKENS_PER_CHAR = 1;
|
|
474
|
+
var ASCII_LIMIT = 128;
|
|
475
|
+
function count_chars(text) {
|
|
476
|
+
let ascii_chars = 0;
|
|
477
|
+
let wide_chars = 0;
|
|
478
|
+
for (const char of text) {
|
|
479
|
+
if ((char.codePointAt(0) ?? 0) < ASCII_LIMIT) ascii_chars += 1;
|
|
480
|
+
else wide_chars += 1;
|
|
481
|
+
}
|
|
482
|
+
return { ascii_chars, wide_chars };
|
|
483
|
+
}
|
|
484
|
+
function estimate(text) {
|
|
485
|
+
const { ascii_chars, wide_chars } = count_chars(text);
|
|
486
|
+
return Math.round(ascii_chars / ASCII_CHARS_PER_TOKEN) + wide_chars * WIDE_TOKENS_PER_CHAR;
|
|
487
|
+
}
|
|
488
|
+
function ascii_bytes_to_tokens(bytes) {
|
|
489
|
+
return Math.round(bytes / ASCII_CHARS_PER_TOKEN);
|
|
490
|
+
}
|
|
491
|
+
var cost_tokens = {
|
|
492
|
+
ASCII_CHARS_PER_TOKEN,
|
|
493
|
+
count_chars,
|
|
494
|
+
estimate,
|
|
495
|
+
ascii_bytes_to_tokens
|
|
496
|
+
};
|
|
497
|
+
|
|
498
|
+
// scripts/document/read-set-cost.ts
|
|
499
|
+
var NOTHING = 0;
|
|
500
|
+
var ONE_LINE = 1;
|
|
501
|
+
function cost_of(text) {
|
|
502
|
+
return { bytes: Buffer.byteLength(text, "utf8"), tokens: cost_tokens.estimate(text) };
|
|
503
|
+
}
|
|
504
|
+
function total(costs) {
|
|
505
|
+
const running = { bytes: NOTHING, tokens: NOTHING };
|
|
506
|
+
for (const cost of costs) {
|
|
507
|
+
running.bytes += cost.bytes;
|
|
508
|
+
running.tokens += cost.tokens;
|
|
509
|
+
}
|
|
510
|
+
return running;
|
|
511
|
+
}
|
|
512
|
+
function add_range(charged, found) {
|
|
513
|
+
for (let index = found.first_line; index <= found.last_line; index += ONE_LINE) charged.add(index);
|
|
514
|
+
}
|
|
515
|
+
function charged_lines(markdown, headings2) {
|
|
516
|
+
const charged = /* @__PURE__ */ new Set();
|
|
517
|
+
for (const heading of headings2) {
|
|
518
|
+
const found = document_section.section(markdown, heading);
|
|
519
|
+
if (found === void 0) return void 0;
|
|
520
|
+
add_range(charged, found);
|
|
521
|
+
}
|
|
522
|
+
return charged;
|
|
523
|
+
}
|
|
524
|
+
function extend_or_start(runs, index) {
|
|
525
|
+
const current = runs.at(-1);
|
|
526
|
+
if (current?.at(-1) === index - ONE_LINE) current.push(index);
|
|
527
|
+
else runs.push([index]);
|
|
528
|
+
}
|
|
529
|
+
function contiguous_runs(charged) {
|
|
530
|
+
const runs = [];
|
|
531
|
+
const ascending = [...charged].toSorted((left, right) => left - right);
|
|
532
|
+
for (const index of ascending) extend_or_start(runs, index);
|
|
533
|
+
return runs;
|
|
534
|
+
}
|
|
535
|
+
function run_text(lines, run3) {
|
|
536
|
+
return run3.map((index) => lines[index] ?? "").join("\n");
|
|
537
|
+
}
|
|
538
|
+
function scoped_file_cost(markdown, headings2) {
|
|
539
|
+
const charged = charged_lines(markdown, headings2);
|
|
540
|
+
if (charged === void 0) return cost_of(markdown);
|
|
541
|
+
const lines = markdown.split("\n");
|
|
542
|
+
return total(contiguous_runs(charged).map((run3) => cost_of(run_text(lines, run3))));
|
|
543
|
+
}
|
|
544
|
+
var read_set_cost = { cost_of, scoped_file_cost, total };
|
|
545
|
+
|
|
546
|
+
// scripts/document/read-set-point-of-use.ts
|
|
547
|
+
var POINT_OF_USE_FILES = /* @__PURE__ */ new Set([
|
|
548
|
+
"latest-gate.md",
|
|
549
|
+
"followup.md",
|
|
550
|
+
"chain-rule.md",
|
|
551
|
+
"background-commands.md",
|
|
552
|
+
"pre-gate-cut.md",
|
|
553
|
+
"progress-watcher.md",
|
|
554
|
+
"backlogrun-child.md",
|
|
555
|
+
"backlogrun-lanes.md",
|
|
556
|
+
"backlogrun-progress.md",
|
|
557
|
+
"backlogrun-park.md",
|
|
558
|
+
"backlogrun-steps.md",
|
|
559
|
+
// Read only when a delegated unit goes silent or a lane's pull request conflicts with `main` — a
|
|
560
|
+
// failure path, so a run in which nothing fails never reads it.
|
|
561
|
+
"backlogrun-recovery.md",
|
|
562
|
+
// Read only when `run:step` prints `pnpm josh retrospective` at a run's stop position — the very
|
|
563
|
+
// end of a run, never the entry. Kept out of every entry's read for the
|
|
564
|
+
// same reason the phase documents above are: no run that never drains its backlog reaches it.
|
|
565
|
+
"retrospective.md"
|
|
566
|
+
]);
|
|
567
|
+
var DEFERRED_DECISIONS = /* @__PURE__ */ new Set(["delegation.md", "issue-scout.md"]);
|
|
568
|
+
var POINT_OF_USE_BY_ENTRY = /* @__PURE__ */ new Map([
|
|
569
|
+
["kickoff", DEFERRED_DECISIONS],
|
|
570
|
+
["fullrun", DEFERRED_DECISIONS],
|
|
571
|
+
["halfrun", DEFERRED_DECISIONS],
|
|
572
|
+
["prrun", DEFERRED_DECISIONS],
|
|
573
|
+
["backlogrun", /* @__PURE__ */ new Set([...DEFERRED_DECISIONS, "fullrun.md", "split-assessment.md"])]
|
|
574
|
+
]);
|
|
575
|
+
var NO_PER_ENTRY_FILES = /* @__PURE__ */ new Set();
|
|
576
|
+
function is_point_of_use(entry, file) {
|
|
577
|
+
if (POINT_OF_USE_FILES.has(file)) return true;
|
|
578
|
+
return (POINT_OF_USE_BY_ENTRY.get(entry) ?? NO_PER_ENTRY_FILES).has(file);
|
|
579
|
+
}
|
|
580
|
+
function point_of_use_files(entry, cited) {
|
|
581
|
+
const reached = [...POINT_OF_USE_FILES].filter((file) => cited.has(file));
|
|
582
|
+
return [...reached, ...POINT_OF_USE_BY_ENTRY.get(entry) ?? NO_PER_ENTRY_FILES];
|
|
583
|
+
}
|
|
584
|
+
var read_set_point_of_use = {
|
|
585
|
+
POINT_OF_USE_FILES,
|
|
586
|
+
POINT_OF_USE_BY_ENTRY,
|
|
587
|
+
is_point_of_use,
|
|
588
|
+
point_of_use_files
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
// scripts/document/entry-read-set.ts
|
|
592
|
+
var { POINT_OF_USE_FILES: POINT_OF_USE_FILES2, POINT_OF_USE_BY_ENTRY: POINT_OF_USE_BY_ENTRY2, is_point_of_use: is_point_of_use2, point_of_use_files: point_of_use_files2 } = read_set_point_of_use;
|
|
593
|
+
var { cost_of: cost_of2, scoped_file_cost: scoped_file_cost2, total: total2 } = read_set_cost;
|
|
594
|
+
var SKILL_DIRECTORY = path7.join(".claude", "skills", "workflow-commands");
|
|
595
|
+
var SKILL_FILE = "SKILL.md";
|
|
596
|
+
var TABLE_SECTION = "1. Which file to read";
|
|
597
|
+
var NOTHING2 = 0;
|
|
598
|
+
var HEADING_JOINER = '" + "';
|
|
599
|
+
var SUBSECTION_PREFIX = "### ";
|
|
600
|
+
var TABLE_ROW = /^\|(?<entry>[^|]+)\|(?<files>[^|]+)\|\s*$/u;
|
|
601
|
+
var MARKDOWN_NAME = /`(?<name>[\w.-]+\.md)`/gu;
|
|
602
|
+
var ENTRY_KEYWORD = /`(?<keyword>[a-z]+)/u;
|
|
603
|
+
var SECTION_REFERENCE = /`(?<file>[\w.-]+\.md)` *→ *"(?<heading>[^"]+)"/gu;
|
|
604
|
+
var WHITESPACE_RUN = /\s+/gu;
|
|
605
|
+
function document_path(root, name) {
|
|
606
|
+
const in_project = path7.join(root, SKILL_DIRECTORY, name);
|
|
607
|
+
const in_package = path7.join(PACKAGE_DIR, SKILL_DIRECTORY, name);
|
|
608
|
+
const project_manifest = path7.join(root, "package.json");
|
|
609
|
+
if (root !== "" && existsSync2(project_manifest) && existsSync2(in_package)) return in_package;
|
|
610
|
+
return existsSync2(in_project) ? in_project : in_package;
|
|
611
|
+
}
|
|
612
|
+
function read_document(root, name) {
|
|
613
|
+
return document_section.read_optional(document_path(root, name)) ?? "";
|
|
614
|
+
}
|
|
615
|
+
function unique(names) {
|
|
616
|
+
return [...new Set(names)];
|
|
617
|
+
}
|
|
618
|
+
function all_matches(text, pattern) {
|
|
619
|
+
const scanner = new RegExp(pattern.source, pattern.flags);
|
|
620
|
+
const found = [];
|
|
621
|
+
let match = scanner.exec(text);
|
|
622
|
+
while (match !== null) {
|
|
623
|
+
found.push(match);
|
|
624
|
+
match = scanner.exec(text);
|
|
625
|
+
}
|
|
626
|
+
return found;
|
|
627
|
+
}
|
|
628
|
+
function group_of(match, name) {
|
|
629
|
+
return match.groups?.[name] ?? "";
|
|
630
|
+
}
|
|
631
|
+
function names_in(text) {
|
|
632
|
+
return all_matches(text, MARKDOWN_NAME).map((match) => group_of(match, "name"));
|
|
633
|
+
}
|
|
634
|
+
function columns_of(line) {
|
|
635
|
+
const groups = TABLE_ROW.exec(line)?.groups;
|
|
636
|
+
if (groups === void 0) return void 0;
|
|
637
|
+
const { entry = "", files = "" } = groups;
|
|
638
|
+
return { entry, files };
|
|
639
|
+
}
|
|
640
|
+
function to_row(line) {
|
|
641
|
+
const columns = columns_of(line);
|
|
642
|
+
if (columns === void 0) return void 0;
|
|
643
|
+
const { keyword } = ENTRY_KEYWORD.exec(columns.entry)?.groups ?? {};
|
|
644
|
+
return keyword === void 0 ? void 0 : { keyword, files: names_in(columns.files) };
|
|
645
|
+
}
|
|
646
|
+
function push_row(rows, line) {
|
|
647
|
+
const row = to_row(line);
|
|
648
|
+
if (row !== void 0 && row.files.length > NOTHING2) rows.set(row.keyword, row.files);
|
|
649
|
+
}
|
|
650
|
+
function table_rows(root) {
|
|
651
|
+
const rows = /* @__PURE__ */ new Map();
|
|
652
|
+
const found = document_section.section(read_document(root, SKILL_FILE), TABLE_SECTION);
|
|
653
|
+
const lines = (found?.text ?? "").split("\n");
|
|
654
|
+
for (const line of lines) {
|
|
655
|
+
if (line.startsWith(SUBSECTION_PREFIX)) break;
|
|
656
|
+
push_row(rows, line);
|
|
657
|
+
}
|
|
658
|
+
return rows;
|
|
659
|
+
}
|
|
660
|
+
function files_for(root, entry) {
|
|
661
|
+
const declared = table_rows(root).get(entry) ?? [];
|
|
662
|
+
return unique([SKILL_FILE, ...declared]).filter((file) => !is_point_of_use2(entry, file));
|
|
663
|
+
}
|
|
664
|
+
function fold(text) {
|
|
665
|
+
return text.replaceAll(WHITESPACE_RUN, " ").trim();
|
|
666
|
+
}
|
|
667
|
+
function is_sibling_document(root, name) {
|
|
668
|
+
return document_section.read_optional(document_path(root, name)) !== void 0;
|
|
669
|
+
}
|
|
670
|
+
function is_counted(root, entry, reference, files) {
|
|
671
|
+
if (is_point_of_use2(entry, reference.file)) return false;
|
|
672
|
+
return !files.includes(reference.file) && is_sibling_document(root, reference.file);
|
|
673
|
+
}
|
|
674
|
+
function to_reference(match) {
|
|
675
|
+
return { file: group_of(match, "file"), heading: fold(group_of(match, "heading")) };
|
|
676
|
+
}
|
|
677
|
+
function references_from(root, entry, text, files) {
|
|
678
|
+
return all_matches(text, SECTION_REFERENCE).map((match) => to_reference(match)).filter((reference) => is_counted(root, entry, reference, files));
|
|
679
|
+
}
|
|
680
|
+
function sort_key(reference) {
|
|
681
|
+
return `${reference.file} ${reference.heading}`;
|
|
682
|
+
}
|
|
683
|
+
function dedupe(references) {
|
|
684
|
+
const seen = /* @__PURE__ */ new Map();
|
|
685
|
+
for (const reference of references) seen.set(sort_key(reference), reference);
|
|
686
|
+
return [...seen].map(([, reference]) => reference);
|
|
687
|
+
}
|
|
688
|
+
function sections_for(root, entry, files) {
|
|
689
|
+
const found = files.filter((file) => file !== SKILL_FILE).flatMap((file) => references_from(root, entry, read_document(root, file), files));
|
|
690
|
+
return dedupe(found).toSorted((left, right) => sort_key(left).localeCompare(sort_key(right)));
|
|
691
|
+
}
|
|
692
|
+
function read_set(root, entry) {
|
|
693
|
+
const files = files_for(root, entry);
|
|
694
|
+
return { entry, files, sections: sections_for(root, entry, files) };
|
|
695
|
+
}
|
|
696
|
+
function section_cost(root, reference) {
|
|
697
|
+
const found = document_section.section(read_document(root, reference.file), reference.heading);
|
|
698
|
+
return {
|
|
699
|
+
...reference,
|
|
700
|
+
// **An unresolvable reference is charged at the whole file.** Reporting it at zero would let a
|
|
701
|
+
// broken pointer read as a saving, which is the one direction this measurement must not move.
|
|
702
|
+
cost: cost_of2(found?.text ?? read_document(root, reference.file)),
|
|
703
|
+
is_resolved: found !== void 0
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
function referenced_cost(root, sections) {
|
|
707
|
+
const files = unique(sections.map((reference) => reference.file));
|
|
708
|
+
return total2(files.map((file) => cost_of2(read_document(root, file))));
|
|
709
|
+
}
|
|
710
|
+
function headings_for(sections, file) {
|
|
711
|
+
return sections.filter((reference) => reference.file === file).map((one) => one.heading);
|
|
712
|
+
}
|
|
713
|
+
function scoped_cost(root, sections) {
|
|
714
|
+
const files = unique(sections.map((reference) => reference.file));
|
|
715
|
+
return total2(
|
|
716
|
+
files.map((file) => scoped_file_cost2(read_document(root, file), headings_for(sections, file)))
|
|
717
|
+
);
|
|
718
|
+
}
|
|
719
|
+
function file_costs(root, names) {
|
|
720
|
+
return names.map((file) => ({ file, cost: cost_of2(read_document(root, file)) }));
|
|
721
|
+
}
|
|
722
|
+
function point_of_use_cost(root, file, references) {
|
|
723
|
+
const markdown = read_document(root, file);
|
|
724
|
+
const headings2 = unique(references.filter((one) => one.file === file).map((one) => one.heading));
|
|
725
|
+
if (headings2.length === NOTHING2) {
|
|
726
|
+
return { file, heading: "", cost: cost_of2(markdown), is_resolved: true };
|
|
727
|
+
}
|
|
728
|
+
return {
|
|
729
|
+
file,
|
|
730
|
+
heading: headings2.join(HEADING_JOINER),
|
|
731
|
+
cost: scoped_file_cost2(markdown, headings2),
|
|
732
|
+
is_resolved: headings2.every(
|
|
733
|
+
(heading) => document_section.section(markdown, heading) !== void 0
|
|
734
|
+
)
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
function path_texts(root, entry, table_text) {
|
|
738
|
+
const manifests = files_for(root, entry).filter((file) => file !== SKILL_FILE);
|
|
739
|
+
const rows = table_text.split("\n").filter((line) => line.startsWith("|") && line.includes(`\`${entry}\``));
|
|
740
|
+
return [...manifests.map((file) => read_document(root, file)), ...rows];
|
|
741
|
+
}
|
|
742
|
+
function point_of_use_references(root, entry, table_text) {
|
|
743
|
+
const manifests = files_for(root, entry).filter((file) => file !== SKILL_FILE);
|
|
744
|
+
const texts = [table_text, ...manifests.map((file) => read_document(root, file))];
|
|
745
|
+
return texts.flatMap(
|
|
746
|
+
(text) => all_matches(text, SECTION_REFERENCE).map((match) => to_reference(match))
|
|
747
|
+
);
|
|
748
|
+
}
|
|
749
|
+
function point_of_use_costs(root, entry, also) {
|
|
750
|
+
const table_text = document_section.section(read_document(root, SKILL_FILE), TABLE_SECTION)?.text ?? "";
|
|
751
|
+
const references = point_of_use_references(root, entry, table_text);
|
|
752
|
+
const named = path_texts(root, entry, table_text).flatMap((text) => names_in(text));
|
|
753
|
+
const cited = /* @__PURE__ */ new Set([...also, ...named]);
|
|
754
|
+
return point_of_use_files2(entry, cited).map((file) => point_of_use_cost(root, file, references));
|
|
755
|
+
}
|
|
756
|
+
function costed(root, entry, also = /* @__PURE__ */ new Set()) {
|
|
757
|
+
const { files, sections } = read_set(root, entry);
|
|
758
|
+
const own_costs = file_costs(root, files);
|
|
759
|
+
const section_costs = sections.map((reference) => section_cost(root, reference));
|
|
760
|
+
const own = total2(own_costs.map((row) => row.cost));
|
|
761
|
+
return {
|
|
762
|
+
entry,
|
|
763
|
+
files: own_costs,
|
|
764
|
+
sections: section_costs,
|
|
765
|
+
point_of_use: point_of_use_costs(root, entry, also),
|
|
766
|
+
bash_output_cap: bash_output_cap_reader.bash_output_cap(root),
|
|
767
|
+
whole: total2([own, referenced_cost(root, sections)]),
|
|
768
|
+
scoped: total2([own, scoped_cost(root, sections)])
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
function entries(root) {
|
|
772
|
+
return [...table_rows(root)].map(([keyword]) => keyword);
|
|
773
|
+
}
|
|
774
|
+
var entry_read_set = {
|
|
775
|
+
HARNESS_DEFAULT_CAP_CHARS: bash_output_cap_reader.HARNESS_DEFAULT_CAP_CHARS,
|
|
776
|
+
POINT_OF_USE_BY_ENTRY: POINT_OF_USE_BY_ENTRY2,
|
|
777
|
+
POINT_OF_USE_FILES: POINT_OF_USE_FILES2,
|
|
778
|
+
SECTION_REFERENCE,
|
|
779
|
+
SKILL_DIRECTORY,
|
|
780
|
+
SKILL_FILE,
|
|
781
|
+
TABLE_SECTION,
|
|
782
|
+
bash_output_cap: bash_output_cap_reader.bash_output_cap,
|
|
783
|
+
cost_of: cost_of2,
|
|
784
|
+
costed,
|
|
785
|
+
document_path,
|
|
786
|
+
entries,
|
|
787
|
+
read_set,
|
|
788
|
+
total: total2
|
|
789
|
+
};
|
|
790
|
+
|
|
791
|
+
// scripts/document/document-section-cli.ts
|
|
792
|
+
var FAILURE_EXIT_CODE = 1;
|
|
793
|
+
var FILE_ARGUMENT = 0;
|
|
794
|
+
var HEADING_ARGUMENT = 1;
|
|
795
|
+
var NO_CANDIDATE = 0;
|
|
796
|
+
var USAGE = 'Usage: josh doc:section <file.md> "<heading>"';
|
|
797
|
+
var PACKAGE_DIRECTORY = find_package_directory(path8.dirname(fileURLToPath2(import.meta.url)));
|
|
798
|
+
function candidates_under(directory, name) {
|
|
799
|
+
return [path8.resolve(directory, name), entry_read_set.document_path(directory, name)];
|
|
800
|
+
}
|
|
801
|
+
function resolve_document(name, root = process.cwd(), package_directory = PACKAGE_DIRECTORY) {
|
|
802
|
+
const named = path8.resolve(root, name);
|
|
803
|
+
const candidates2 = [...candidates_under(root, name), ...candidates_under(package_directory, name)];
|
|
804
|
+
return candidates2.find((candidate) => existsSync3(candidate)) ?? named;
|
|
805
|
+
}
|
|
806
|
+
function report_missing(markdown, heading) {
|
|
807
|
+
const near = document_section.candidates(markdown, heading);
|
|
808
|
+
const listed = near.length > NO_CANDIDATE ? near : document_section.titles(markdown);
|
|
809
|
+
console.error(`No single section matches ${JSON.stringify(heading)}. Headings it could mean:`);
|
|
810
|
+
for (const title of listed) console.error(` ${title}`);
|
|
811
|
+
return FAILURE_EXIT_CODE;
|
|
812
|
+
}
|
|
813
|
+
function print_section(markdown, heading, root) {
|
|
814
|
+
const found = document_section.section(markdown, heading);
|
|
815
|
+
if (found === void 0) return report_missing(markdown, heading);
|
|
816
|
+
capped_output.capped_print(found.text, heading, root);
|
|
817
|
+
return 0;
|
|
818
|
+
}
|
|
819
|
+
function read_named(name, root) {
|
|
820
|
+
const file_path = resolve_document(name, root);
|
|
821
|
+
const markdown = document_section.read_optional(file_path);
|
|
822
|
+
if (markdown === void 0) console.error(`Cannot read ${file_path}`);
|
|
823
|
+
return markdown;
|
|
824
|
+
}
|
|
825
|
+
function run(argv, root = process.cwd()) {
|
|
826
|
+
const name = argv[FILE_ARGUMENT];
|
|
827
|
+
const heading = argv[HEADING_ARGUMENT];
|
|
828
|
+
if (name === void 0 || heading === void 0) {
|
|
829
|
+
console.error(USAGE);
|
|
830
|
+
return FAILURE_EXIT_CODE;
|
|
831
|
+
}
|
|
832
|
+
const markdown = read_named(name, root);
|
|
833
|
+
return markdown === void 0 ? FAILURE_EXIT_CODE : print_section(markdown, heading, root);
|
|
834
|
+
}
|
|
835
|
+
var document_section_cli = { FAILURE_EXIT_CODE, USAGE, resolve_document, run };
|
|
836
|
+
|
|
837
|
+
// scripts/document/document-read-cli.ts
|
|
838
|
+
var ARGV_OFFSET = 2;
|
|
839
|
+
var FAILURE_EXIT_CODE2 = 1;
|
|
840
|
+
var FILE_ARGUMENT2 = 0;
|
|
841
|
+
var USAGE2 = "Usage: josh doc:read <file.md>";
|
|
842
|
+
var OVER_CAP_PREFIX = "Over the Bash cap";
|
|
843
|
+
var READ_TOOL_DIRECTIVE = "read it with the Read tool, not cat:";
|
|
844
|
+
function byte_length(text) {
|
|
845
|
+
return Buffer.byteLength(text, "utf8");
|
|
846
|
+
}
|
|
847
|
+
function over_cap_directive(file_path, bytes, cap) {
|
|
848
|
+
const figures = `(${bytes.toLocaleString("en-US")} B > ${cap.toLocaleString("en-US")} B)`;
|
|
849
|
+
return `${OVER_CAP_PREFIX} ${figures} \u2014 ${READ_TOOL_DIRECTIVE} ${file_path}`;
|
|
850
|
+
}
|
|
851
|
+
function print_document(file_path, text, cap) {
|
|
852
|
+
if (byte_length(text) > cap) console.info(over_cap_directive(file_path, byte_length(text), cap));
|
|
853
|
+
else console.info(text);
|
|
854
|
+
return 0;
|
|
855
|
+
}
|
|
856
|
+
function run2(argv, root = process.cwd()) {
|
|
857
|
+
const name = argv[FILE_ARGUMENT2];
|
|
858
|
+
if (name === void 0) {
|
|
859
|
+
console.error(USAGE2);
|
|
860
|
+
return FAILURE_EXIT_CODE2;
|
|
861
|
+
}
|
|
862
|
+
const file_path = document_section_cli.resolve_document(name, root);
|
|
863
|
+
const text = document_section.read_optional(file_path);
|
|
864
|
+
if (text === void 0) {
|
|
865
|
+
console.error(`Cannot read ${file_path}`);
|
|
866
|
+
return FAILURE_EXIT_CODE2;
|
|
867
|
+
}
|
|
868
|
+
return print_document(file_path, text, bash_output_cap_reader.bash_output_cap(root));
|
|
869
|
+
}
|
|
870
|
+
function main(argv) {
|
|
871
|
+
process.exitCode = run2(argv);
|
|
872
|
+
}
|
|
873
|
+
var document_read_cli = {
|
|
874
|
+
OVER_CAP_PREFIX,
|
|
875
|
+
READ_TOOL_DIRECTIVE,
|
|
876
|
+
over_cap_directive,
|
|
877
|
+
run: run2
|
|
878
|
+
};
|
|
879
|
+
if (process.argv[1] === fileURLToPath3(import.meta.url)) main(process.argv.slice(ARGV_OFFSET));
|
|
880
|
+
export {
|
|
881
|
+
document_read_cli
|
|
882
|
+
};
|