@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,7 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { statSync } from 'node:fs'
|
|
3
|
-
import { text } from 'node:stream/consumers'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
2
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
6
3
|
import { lane_guard_policy, type LaneGuardMode } from '#scripts/lane/lane-guard-policy'
|
|
7
4
|
import { json_value } from '#scripts/lib/json-value'
|
|
@@ -217,11 +214,6 @@ const duplicate_reads = {
|
|
|
217
214
|
NOTICE,
|
|
218
215
|
}
|
|
219
216
|
|
|
220
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
221
|
-
if (process.stdin.isTTY) hook_decision.report_no_payload('duplicate-read:guard')
|
|
222
|
-
else hook_decision.write_outcome(await text(process.stdin), duplicate_read_outcome)
|
|
223
|
-
}
|
|
224
|
-
|
|
225
217
|
export {
|
|
226
218
|
deny_envelope,
|
|
227
219
|
DISABLED_VALUES,
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { text } from 'node:stream/consumers'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
4
1
|
import { agent_session_role } from '#scripts/agent/agent-session-role'
|
|
5
2
|
import { hook_decision, type GuardRun } from '#scripts/josh/hook-decision'
|
|
6
3
|
import { lane_guard_policy } from '#scripts/lane/lane-guard-policy'
|
|
@@ -60,11 +57,6 @@ const investigation_outcome = GUARD.outcome
|
|
|
60
57
|
const { is_enabled, refusal_path } = GUARD
|
|
61
58
|
const { deny_envelope, load_environment_file, DISABLED_VALUES } = hook_decision
|
|
62
59
|
|
|
63
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
64
|
-
if (process.stdin.isTTY) hook_decision.report_no_payload('investigation:guard')
|
|
65
|
-
else hook_decision.write_outcome(await text(process.stdin), investigation_outcome)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
60
|
export {
|
|
69
61
|
deny_envelope,
|
|
70
62
|
investigation_outcome,
|
|
@@ -38,11 +38,10 @@ const SEARCH_LABELS: ReadonlySet<string> = new Set(
|
|
|
38
38
|
SEARCH_COMMANDS.map((command) => time_shell.bash_label(command)),
|
|
39
39
|
)
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
const INVESTIGATOR_AGENT = 'investigator'
|
|
41
|
+
const { INVESTIGATOR_AGENT } = delegation_policy
|
|
43
42
|
|
|
44
43
|
// The deny reason is the only text that reaches the model, so it names the count, command and return shape.
|
|
45
|
-
const REASON = `⛔ investigation: ${
|
|
44
|
+
const REASON = `⛔ investigation: ${delegation_policy.INVESTIGATION_LIMIT}. ${delegation_policy.INVESTIGATION_STEP} Keep main-line reads to files you will edit; every read-only search turn counts. \`.claude/skills/workflow-commands/delegation.md\``
|
|
46
45
|
|
|
47
46
|
interface ReadTally {
|
|
48
47
|
// The files read and not since edited, resolved.
|
|
@@ -61,7 +60,7 @@ interface ReadTally {
|
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
// The run's own instructions are not the Issue's subject and cannot be delegated, so they never count.
|
|
64
|
-
// Matched relative to the repository root, so `
|
|
63
|
+
// Matched relative to the repository root, so `tools/eval/prompts/x.ts` stays subject code.
|
|
65
64
|
const INSTRUCTION_PATHS: ReadonlyArray<string> = ['prompts', '.claude/skills']
|
|
66
65
|
const INSTRUCTION_FILES: ReadonlySet<string> = new Set(['CLAUDE.md', 'AGENTS.md', 'GEMINI.md'])
|
|
67
66
|
const REPOSITORY_ROOT = process.cwd()
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_RELEASE_AGE_MINUTES,
|
|
5
|
+
release_window,
|
|
6
|
+
type ReleaseWindow,
|
|
7
|
+
} from '#scripts/version/release-window'
|
|
8
|
+
|
|
9
|
+
// Dependabot's `cooldown` is the workspace's `minimumReleaseAge` restated in days, so a freshly
|
|
10
|
+
// published action or package waits out the same window pnpm and Safe Chain enforce (kit #4023).
|
|
11
|
+
// The edit is line-based and touches only each entry's `cooldown` block: a consumer's own keys and
|
|
12
|
+
// the file's comments survive, which a YAML round trip would discard.
|
|
13
|
+
const DEPENDABOT_FILE = path.join('.github', 'dependabot.yml')
|
|
14
|
+
const MINUTES_PER_DAY = 1440
|
|
15
|
+
// Dependabot accepts `default-days` from 1 to 90.
|
|
16
|
+
const MIN_DAYS = 1
|
|
17
|
+
const MAX_DAYS = 90
|
|
18
|
+
// pnpm's exclusions name npm packages, so only the npm entry receives them.
|
|
19
|
+
const NPM_ECOSYSTEM = 'npm'
|
|
20
|
+
const UPDATES_PATTERN = /^updates:\s*(?:#.*)?$/u
|
|
21
|
+
const ECOSYSTEM_PATTERN = /^\s*(?:-\s+)?package-ecosystem:\s*['"]?([\w-]+)/u
|
|
22
|
+
const TOP_LEVEL_KEY_PATTERN = /^[^\s#-]/u
|
|
23
|
+
const COOLDOWN_KEY = 'cooldown:'
|
|
24
|
+
|
|
25
|
+
interface UpdateEntry {
|
|
26
|
+
start: number
|
|
27
|
+
end: number
|
|
28
|
+
key_indent: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function cooldown_days(minutes: number | undefined): number {
|
|
32
|
+
const days = Math.ceil((minutes ?? DEFAULT_RELEASE_AGE_MINUTES) / MINUTES_PER_DAY)
|
|
33
|
+
|
|
34
|
+
return Math.min(MAX_DAYS, Math.max(MIN_DAYS, days))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function quote(value: string): string {
|
|
38
|
+
return `'${value.replaceAll("'", "''")}'`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function cooldown_lines(ecosystem: string, window: ReleaseWindow, indent: string): Array<string> {
|
|
42
|
+
const lines = ['cooldown:', ` default-days: ${String(cooldown_days(window.minutes))}`]
|
|
43
|
+
|
|
44
|
+
if (ecosystem === NPM_ECOSYSTEM && window.exclusions.length > 0) {
|
|
45
|
+
lines.push(' exclude:', ...window.exclusions.map((name) => ` - ${quote(name)}`))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return lines.map((line) => `${indent}${line}`)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function indent_width(line: string): number {
|
|
52
|
+
return line.length - line.trimStart().length
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function is_blank(line: string | undefined): boolean {
|
|
56
|
+
return line?.trim() === ''
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function trim_trailing_blanks(lines: ReadonlyArray<string>): Array<string> {
|
|
60
|
+
const trimmed = [...lines]
|
|
61
|
+
while (trimmed.length > 1 && is_blank(trimmed.at(-1))) trimmed.pop()
|
|
62
|
+
|
|
63
|
+
return trimmed
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function is_comment(line: string | undefined): boolean {
|
|
67
|
+
return line?.trimStart().startsWith('#') === true
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// A blank line, or a comment left of `width`: it may sit inside a block or head the next one.
|
|
71
|
+
function is_detached(line: string | undefined, width: number): boolean {
|
|
72
|
+
return is_blank(line) || (is_comment(line) && indent_width(line ?? '') < width)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The first key line at or after `from` that sits left of `width`, or `limit`.
|
|
76
|
+
function block_stop(
|
|
77
|
+
lines: ReadonlyArray<string>,
|
|
78
|
+
from: number,
|
|
79
|
+
width: number,
|
|
80
|
+
limit: number,
|
|
81
|
+
): number {
|
|
82
|
+
const relative = lines
|
|
83
|
+
.slice(from, limit)
|
|
84
|
+
.findIndex((line) => !is_blank(line) && !is_comment(line) && indent_width(line) < width)
|
|
85
|
+
|
|
86
|
+
return relative === -1 ? limit : from + relative
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The block runs to the next key line left of `width`. A comment left of `width` in the middle stays
|
|
90
|
+
// inside, while the run of such comments right before that key belongs to what follows.
|
|
91
|
+
function block_end(
|
|
92
|
+
lines: ReadonlyArray<string>,
|
|
93
|
+
from: number,
|
|
94
|
+
width: number,
|
|
95
|
+
limit: number,
|
|
96
|
+
): number {
|
|
97
|
+
const stop = block_stop(lines, from, width, limit)
|
|
98
|
+
let end = stop
|
|
99
|
+
|
|
100
|
+
for (let index = stop - 1; index >= from && is_detached(lines[index], width); index -= 1) {
|
|
101
|
+
if (!is_blank(lines[index])) end = index
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return end
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// The next top-level key. A list written flush with `updates:` and a comment at column 0 both still
|
|
108
|
+
// belong to it, so neither ends the list.
|
|
109
|
+
function updates_end(lines: ReadonlyArray<string>, updates: number): number {
|
|
110
|
+
const relative = lines.slice(updates + 1).findIndex((line) => TOP_LEVEL_KEY_PATTERN.test(line))
|
|
111
|
+
|
|
112
|
+
return relative === -1 ? lines.length : updates + 1 + relative
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function find_entries(lines: ReadonlyArray<string>, updates: number): Array<UpdateEntry> {
|
|
116
|
+
const limit = updates_end(lines, updates)
|
|
117
|
+
const starts = lines
|
|
118
|
+
.map((line, index) => ({ index, item: /^(\s*-\s+)\S/u.exec(line)?.[1] }))
|
|
119
|
+
.filter(({ index, item }) => index > updates && index < limit && item !== undefined)
|
|
120
|
+
const item_width = Math.min(...starts.map(({ item }) => item?.indexOf('-') ?? 0))
|
|
121
|
+
|
|
122
|
+
return starts
|
|
123
|
+
.filter(({ item }) => item?.indexOf('-') === item_width)
|
|
124
|
+
.map(({ index, item = '' }) => ({
|
|
125
|
+
start: index,
|
|
126
|
+
end: block_end(lines, index + 1, item.length, limit),
|
|
127
|
+
key_indent: ' '.repeat(item.length),
|
|
128
|
+
}))
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// The entry's own `cooldown:` key, either on a key line or on the item line itself (`- cooldown:`).
|
|
132
|
+
function is_cooldown_key(line: string, index: number, key_indent: string): boolean {
|
|
133
|
+
const is_key_line = index === 0 || line.startsWith(key_indent)
|
|
134
|
+
|
|
135
|
+
return is_key_line && line.slice(key_indent.length).startsWith(COOLDOWN_KEY)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// An entry that opened with `- cooldown:` hands its item marker to the next key once the block goes.
|
|
139
|
+
function promote_first_key(rest: ReadonlyArray<string>, marker: string): Array<string> {
|
|
140
|
+
const first = rest.findIndex((line) => !is_blank(line) && !line.trimStart().startsWith('#'))
|
|
141
|
+
|
|
142
|
+
return rest.map((line, index) =>
|
|
143
|
+
index === first ? `${marker}${line.slice(marker.length)}` : line,
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function without_cooldown(entry: ReadonlyArray<string>, key_indent: string): Array<string> {
|
|
148
|
+
const start = entry.findIndex((line, index) => is_cooldown_key(line, index, key_indent))
|
|
149
|
+
if (start === -1) return [...entry]
|
|
150
|
+
const rest = entry.slice(block_end(entry, start + 1, key_indent.length + 1, entry.length))
|
|
151
|
+
if (start > 0) return [...entry.slice(0, start), ...rest]
|
|
152
|
+
|
|
153
|
+
return promote_first_key(rest, (entry.at(0) ?? '').slice(0, key_indent.length))
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function rewrite_entry(
|
|
157
|
+
entry: ReadonlyArray<string>,
|
|
158
|
+
key_indent: string,
|
|
159
|
+
window: ReleaseWindow,
|
|
160
|
+
): Array<string> {
|
|
161
|
+
const ecosystem = entry.map((line) => ECOSYSTEM_PATTERN.exec(line)?.[1]).find(Boolean)
|
|
162
|
+
if (ecosystem === undefined) return [...entry]
|
|
163
|
+
const body = trim_trailing_blanks(without_cooldown(entry, key_indent))
|
|
164
|
+
const trailing = entry.slice(trim_trailing_blanks(entry).length)
|
|
165
|
+
|
|
166
|
+
return [...body, ...cooldown_lines(ecosystem, window, key_indent), ...trailing]
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function merge_cooldown(existing: string, window: ReleaseWindow): string {
|
|
170
|
+
const lines = existing.split('\n')
|
|
171
|
+
const updates = lines.findIndex((line) => UPDATES_PATTERN.test(line))
|
|
172
|
+
if (updates === -1) return existing
|
|
173
|
+
|
|
174
|
+
for (const { start, end, key_indent } of find_entries(lines, updates).toReversed()) {
|
|
175
|
+
lines.splice(start, end - start, ...rewrite_entry(lines.slice(start, end), key_indent, window))
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return lines.join('\n')
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function sync_dependabot_cooldown(root: string): boolean {
|
|
182
|
+
const config_path = path.join(root, DEPENDABOT_FILE)
|
|
183
|
+
if (!existsSync(config_path)) return false
|
|
184
|
+
const existing = readFileSync(config_path, 'utf8')
|
|
185
|
+
const merged = merge_cooldown(existing, release_window.read_release_window(root))
|
|
186
|
+
if (merged === existing) return false
|
|
187
|
+
writeFileSync(config_path, merged)
|
|
188
|
+
|
|
189
|
+
return true
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const dependabot_cooldown = { cooldown_days, merge_cooldown, sync_dependabot_cooldown }
|
|
193
|
+
|
|
194
|
+
export { dependabot_cooldown }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { stamped_memo } from '#scripts/lib/stamped-memo'
|
|
3
4
|
import { repo_map_logic, type DiscoveredRepo, type RepoMap } from './repo-map-logic'
|
|
4
5
|
import { repo_origin } from './repo-origin'
|
|
5
6
|
|
|
@@ -59,18 +60,35 @@ function resolve_git_directory(repository_path: string): string | undefined {
|
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
function read_config(repository_path: string): string | undefined {
|
|
64
|
-
const git_directory = resolve_git_directory(repository_path)
|
|
65
|
-
if (git_directory === undefined) return undefined
|
|
66
|
-
|
|
63
|
+
function read_text(file: string): string | undefined {
|
|
67
64
|
try {
|
|
68
|
-
return readFileSync(
|
|
65
|
+
return readFileSync(file, 'utf8')
|
|
69
66
|
} catch {
|
|
70
67
|
return undefined
|
|
71
68
|
}
|
|
72
69
|
}
|
|
73
70
|
|
|
71
|
+
// Each work tree's git directory and each config's text, read again only once the `.git` entry or the
|
|
72
|
+
// config itself has changed: `run:board` cites issues through the origin on every redraw
|
|
73
|
+
// (joshuafolkken/kit#4263).
|
|
74
|
+
const git_directories = stamped_memo.create<string | undefined>()
|
|
75
|
+
const configs = stamped_memo.create<string | undefined>()
|
|
76
|
+
|
|
77
|
+
// The work tree's git config text, or nothing when it is unreadable or not a work tree.
|
|
78
|
+
function read_config(repository_path: string): string | undefined {
|
|
79
|
+
const git_entry = path.join(repository_path, GIT_DIRECTORY)
|
|
80
|
+
const git_directory = git_directories.of(
|
|
81
|
+
repository_path,
|
|
82
|
+
stamped_memo.file_stamp(git_entry),
|
|
83
|
+
() => resolve_git_directory(repository_path),
|
|
84
|
+
)
|
|
85
|
+
if (git_directory === undefined) return undefined
|
|
86
|
+
|
|
87
|
+
const config = path.join(git_directory, GIT_CONFIG)
|
|
88
|
+
|
|
89
|
+
return configs.of(config, stamped_memo.file_stamp(config), () => read_text(config))
|
|
90
|
+
}
|
|
91
|
+
|
|
74
92
|
// The `origin` URL a work tree declares, or nothing when it has no `origin`, no readable config, or
|
|
75
93
|
// is not a work tree at all. Every failure reads as "no remote" so one unreadable sibling cannot
|
|
76
94
|
// fail a command whose contract is to report what it could find.
|
|
@@ -2,6 +2,7 @@ import { existsSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
4
4
|
import { json_value } from '#scripts/lib/json-value'
|
|
5
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
5
6
|
import { file_reader } from '#scripts/lib/read-file'
|
|
6
7
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
7
8
|
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
@@ -37,11 +38,7 @@ const STATE_MISSING = 'missing'
|
|
|
37
38
|
type ClaudeMdState = typeof STATE_OK | typeof STATE_TARGET_MISSING | typeof STATE_MISSING
|
|
38
39
|
|
|
39
40
|
function parse_manifest(root: string): ManifestShape | undefined {
|
|
40
|
-
|
|
41
|
-
if (content === undefined) return undefined
|
|
42
|
-
const parsed = manifest_schema.safeParse(json_value.parse_or_undefined(content))
|
|
43
|
-
|
|
44
|
-
return parsed.success ? parsed.data : undefined
|
|
41
|
+
return package_manifest.read_manifest_if_valid(root, manifest_schema)
|
|
45
42
|
}
|
|
46
43
|
|
|
47
44
|
function lists_kit_dependency(manifest: ManifestShape | undefined): boolean {
|
|
@@ -58,7 +58,7 @@ function block_ceiling(size: number): number {
|
|
|
58
58
|
// unreached file, so the definition cannot rot as documents move on or off the execution path.
|
|
59
59
|
const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
|
|
60
60
|
{ path: '.claude/skills/dependency-update/SKILL.md', bytes: 4096 },
|
|
61
|
-
{ path: '.claude/skills/epic-commands/SKILL.md', bytes:
|
|
61
|
+
{ path: '.claude/skills/epic-commands/SKILL.md', bytes: 8192 },
|
|
62
62
|
{ path: '.claude/skills/epic-commands/epic-bundle.md', bytes: 4096 },
|
|
63
63
|
{ path: '.claude/skills/epic-commands/execution-waves.md', bytes: 4096 },
|
|
64
64
|
{ path: '.claude/skills/verify-ui/SKILL.md', bytes: 4096 },
|
|
@@ -73,10 +73,10 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
|
|
|
73
73
|
{ path: '.claude/skills/workflow-commands/prerequisite.md', bytes: 8192 },
|
|
74
74
|
{ path: '.claude/skills/workflow-commands/target-repository.md', bytes: 4096 },
|
|
75
75
|
{ path: '.claude/skills/workflow-commands/working-tree-hold.md', bytes: 8192 },
|
|
76
|
-
{ path: 'docs/josh-commands-automation.md', bytes:
|
|
77
|
-
{ path: 'docs/josh-commands-run.md', bytes:
|
|
78
|
-
{ path: 'docs/josh-commands-backlog.md', bytes:
|
|
79
|
-
{ path: 'docs/josh-commands.md', bytes:
|
|
76
|
+
{ path: 'docs/josh-commands-automation.md', bytes: 45_056 },
|
|
77
|
+
{ path: 'docs/josh-commands-run.md', bytes: 69_632 },
|
|
78
|
+
{ path: 'docs/josh-commands-backlog.md', bytes: 57_344 },
|
|
79
|
+
{ path: 'docs/josh-commands.md', bytes: 53_248 },
|
|
80
80
|
{ path: 'docs/labels-and-run-states.md', bytes: 8192 },
|
|
81
81
|
{ path: 'prompts/coding-standards.md', bytes: 4096 },
|
|
82
82
|
{ path: 'prompts/collaboration-workflow.md', bytes: 4096 },
|
|
@@ -84,8 +84,10 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
|
|
|
84
84
|
{ path: 'prompts/collaboration-workflow/gh-rest.md', bytes: 4096 },
|
|
85
85
|
{ path: 'prompts/collaboration-workflow/glossary.md', bytes: 4096 },
|
|
86
86
|
{ path: 'prompts/collaboration-workflow/issue-citation.md', bytes: 4096 },
|
|
87
|
-
|
|
87
|
+
// The priority declaration and its criteria (joshuafolkken/kit#4383) crossed the 8192 block.
|
|
88
|
+
{ path: 'prompts/collaboration-workflow/issue-template.md', bytes: 12_288 },
|
|
88
89
|
{ path: 'prompts/collaboration-workflow/lane-instructions.md', bytes: 4096 },
|
|
90
|
+
{ path: 'prompts/collaboration-workflow/measurement.md', bytes: 4096 },
|
|
89
91
|
{ path: 'prompts/collaboration-workflow/operating-rules.md', bytes: 8192 },
|
|
90
92
|
{ path: 'prompts/collaboration-workflow/output-bounds.md', bytes: 4096 },
|
|
91
93
|
{ path: 'prompts/collaboration-workflow/overview.md', bytes: 4096 },
|
|
@@ -57,7 +57,7 @@ function command_references(text: string): Array<string> {
|
|
|
57
57
|
.filter((name) => !name.endsWith(':'))
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
// A `<placeholder>` inside a command, and `
|
|
60
|
+
// A `<placeholder>` inside a command, and `label:<n>` after the char class stops at `<`, both leave a
|
|
61
61
|
// token that is not a real label. Real labels never end in a colon and never carry angle brackets.
|
|
62
62
|
function is_real_label(token: string): boolean {
|
|
63
63
|
return token.length > 0 && !token.endsWith(':') && !token.includes('<')
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { existsSync } from 'node:fs'
|
|
3
2
|
import path from 'node:path'
|
|
4
3
|
import { fileURLToPath } from 'node:url'
|
|
@@ -22,7 +21,6 @@ import { entry_read_set } from './entry-read-set'
|
|
|
22
21
|
// renamed would otherwise print nothing and read as a section with nothing in it — the one outcome
|
|
23
22
|
// that is worse than reading the whole file.
|
|
24
23
|
|
|
25
|
-
const ARGV_OFFSET = 2
|
|
26
24
|
const FAILURE_EXIT_CODE = 1
|
|
27
25
|
const FILE_ARGUMENT = 0
|
|
28
26
|
const HEADING_ARGUMENT = 1
|
|
@@ -101,12 +99,6 @@ function run(argv: ReadonlyArray<string>, root: string = process.cwd()): number
|
|
|
101
99
|
return markdown === undefined ? FAILURE_EXIT_CODE : print_section(markdown, heading, root)
|
|
102
100
|
}
|
|
103
101
|
|
|
104
|
-
function main(argv: ReadonlyArray<string>): void {
|
|
105
|
-
process.exitCode = run(argv)
|
|
106
|
-
}
|
|
107
|
-
|
|
108
102
|
const document_section_cli = { FAILURE_EXIT_CODE, USAGE, resolve_document, run }
|
|
109
103
|
|
|
110
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
111
|
-
|
|
112
104
|
export { document_section_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { document_section_cli } from './document-section-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh doc:section` entry, kept apart from `document-section-cli.ts` because other modules import
|
|
6
|
+
// that one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = document_section_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -222,22 +222,27 @@ function fetch_anomalies(
|
|
|
222
222
|
//
|
|
223
223
|
// A listing that could not be read is left out of the map rather than entered as `[]`, so a
|
|
224
224
|
// transport failure reads as "not asked" instead of "nobody recorded anything" — the finding it
|
|
225
|
-
// would otherwise manufacture is an `error`, which stops the epic.
|
|
225
|
+
// would otherwise manufacture is an `error`, which stops the epic. Only a comment from an author with
|
|
226
|
+
// write access records a rationale.
|
|
226
227
|
async function read_order_comments(
|
|
227
228
|
pairs: ReadonlyArray<OrderPair>,
|
|
228
229
|
): Promise<Map<string, ReadonlyArray<string>>> {
|
|
229
230
|
const ends = epic_audit_rationale.pair_ends(pairs)
|
|
230
|
-
const
|
|
231
|
-
ends.map(async (child) =>
|
|
231
|
+
const parsed = await Promise.all(
|
|
232
|
+
ends.map(async (child) => {
|
|
233
|
+
const listing = await git_gh_command.issue_list_comments(String(child.number))
|
|
234
|
+
|
|
235
|
+
return await issue_read.parse_comments(listing)
|
|
236
|
+
}),
|
|
232
237
|
)
|
|
233
238
|
|
|
234
239
|
return new Map(
|
|
235
240
|
ends.flatMap((child, index) => {
|
|
236
|
-
const comments =
|
|
241
|
+
const comments = parsed[index]
|
|
237
242
|
|
|
238
243
|
return comments === undefined
|
|
239
244
|
? []
|
|
240
|
-
: [[epic_graph.key_of(child),
|
|
245
|
+
: [[epic_graph.key_of(child), issue_read.trusted_bodies(comments)] as const]
|
|
241
246
|
}),
|
|
242
247
|
)
|
|
243
248
|
}
|
|
@@ -349,7 +354,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
349
354
|
// `process.exitCode` rather than `process.exit()`: the answer goes to standard output and a write to
|
|
350
355
|
// a pipe is asynchronous on macOS, so exiting can tear the process down before it drains. This
|
|
351
356
|
// command's answer is what a workflow reads and acts on, which is exactly that pipe. The same shape
|
|
352
|
-
// is in `scripts/cost-runtime/cost-
|
|
357
|
+
// is in `scripts/cost-runtime/cost-main.ts`, which met the truncation first.
|
|
353
358
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
354
359
|
process.exitCode = await run(argv)
|
|
355
360
|
}
|
|
@@ -360,6 +365,7 @@ const epic_audit_cli = {
|
|
|
360
365
|
attach_bodies,
|
|
361
366
|
resolve_reference_states,
|
|
362
367
|
outside_references,
|
|
368
|
+
read_order_comments,
|
|
363
369
|
audit,
|
|
364
370
|
run,
|
|
365
371
|
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
import { epic_add } from './epic-add'
|
|
3
|
+
import {
|
|
4
|
+
epic_bundle,
|
|
5
|
+
type BacklogIssue,
|
|
6
|
+
type BundleAction,
|
|
7
|
+
type BundleDecision,
|
|
8
|
+
} from './epic-bundle'
|
|
9
|
+
import { epic_reconcile } from './epic-reconcile'
|
|
10
|
+
import { epic_run } from './epic-run'
|
|
11
|
+
|
|
12
|
+
// `josh epic:bundle <N> --apply` — write the answer whose placement is settled: `add_to_epic` through
|
|
13
|
+
// `epic --add`'s writer, `create_epic` through `epic`'s. Nothing here edits an epic itself, so the
|
|
14
|
+
// task list and the `blocked-by` relations stay as those writers keep them.
|
|
15
|
+
//
|
|
16
|
+
// **An order the candidates already record is carried into the epic body** by `epic --reconcile`,
|
|
17
|
+
// which declares exactly the recorded relations — an order nobody recorded is never invented.
|
|
18
|
+
//
|
|
19
|
+
// `ask` stays the caller's: which epic to choose is a judgement, recorded with its reasoning.
|
|
20
|
+
|
|
21
|
+
const SUCCESS_EXIT_CODE = 0
|
|
22
|
+
const FAILURE_EXIT_CODE = 1
|
|
23
|
+
|
|
24
|
+
interface ApplyInput {
|
|
25
|
+
decision: BundleDecision
|
|
26
|
+
subject: BacklogIssue
|
|
27
|
+
// The backlog rows of `decision.candidates`, as `format_order` reads them.
|
|
28
|
+
members: ReadonlyArray<BacklogIssue>
|
|
29
|
+
is_membership_established: boolean
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const UNAPPLIED_LINES: Readonly<Partial<Record<BundleAction, string>>> = {
|
|
33
|
+
ask: '↷ `--apply` wrote nothing: the related issues sit in more than one epic. Choose one and place it with `pnpm josh epic --add <E> <N> --decision-file <path>`.',
|
|
34
|
+
none: '↷ `--apply` wrote nothing: there is nothing to place.',
|
|
35
|
+
}
|
|
36
|
+
const WITHHELD_LINE =
|
|
37
|
+
'↷ `--apply` wrote nothing: the epic listing was cut short, so no placement was confirmed.'
|
|
38
|
+
const UNREAD_EPIC_LINE =
|
|
39
|
+
"✖ The new epic's number could not be read, so the recorded order was not written; run `pnpm josh epic --reconcile <E>` on it."
|
|
40
|
+
|
|
41
|
+
function has_order(input: ApplyInput): boolean {
|
|
42
|
+
return epic_bundle.bundle_dependency_links(input.subject, input.members).length > 0
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function children_of(input: ApplyInput): Array<number> {
|
|
46
|
+
return epic_bundle.bundle_children(input.subject, input.members)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// An epic whose number could not be read cannot be given the order, so that is a failure rather than
|
|
50
|
+
// an order silently left out.
|
|
51
|
+
async function reconcile_order(
|
|
52
|
+
epic_number: number | undefined,
|
|
53
|
+
input: ApplyInput,
|
|
54
|
+
): Promise<number> {
|
|
55
|
+
if (!has_order(input)) return SUCCESS_EXIT_CODE
|
|
56
|
+
|
|
57
|
+
if (epic_number === undefined) {
|
|
58
|
+
console.error(UNREAD_EPIC_LINE)
|
|
59
|
+
|
|
60
|
+
return FAILURE_EXIT_CODE
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return await epic_reconcile.reconcile_epic(epic_number)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// A member another epic tracks stays there: `add_to_epic` can name an inner epic while a candidate sits
|
|
67
|
+
// in its parent, and adding that candidate here would put one issue in two task lists.
|
|
68
|
+
function placeable(epic_number: number, input: ApplyInput): ApplyInput {
|
|
69
|
+
const members = input.members.filter(
|
|
70
|
+
(member) => member.epic === undefined || member.epic === epic_number,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return { ...input, members }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function add_to_epic(epic_number: number, input: ApplyInput): Promise<number> {
|
|
77
|
+
const placed = placeable(epic_number, input)
|
|
78
|
+
const added = await epic_add.add_children({ epic_number, children: children_of(placed) })
|
|
79
|
+
if (added !== SUCCESS_EXIT_CODE) return added
|
|
80
|
+
|
|
81
|
+
return await reconcile_order(epic_number, placed)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The title is the subject's, since the subject is what the bundle was asked about; the rationale is
|
|
85
|
+
// the verdict's own reason, which already names the signal that grouped them.
|
|
86
|
+
function title_of(subject: BacklogIssue): string {
|
|
87
|
+
const title = subject.title ?? `bundle with ${issue_cite.plain(subject.number)}`
|
|
88
|
+
|
|
89
|
+
return `Epic: ${title}`
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function create_epic(input: ApplyInput): Promise<number> {
|
|
93
|
+
const epic_number = await epic_run.create_epic_number({
|
|
94
|
+
title: title_of(input.subject),
|
|
95
|
+
children: children_of(input),
|
|
96
|
+
rationale: input.decision.reason,
|
|
97
|
+
is_ordered: false,
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
return await reconcile_order(epic_number, input)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function report_unapplied(action: BundleAction): number {
|
|
104
|
+
const line = UNAPPLIED_LINES[action]
|
|
105
|
+
if (line !== undefined) console.info(line)
|
|
106
|
+
|
|
107
|
+
return SUCCESS_EXIT_CODE
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function apply_decision(input: ApplyInput): Promise<number> {
|
|
111
|
+
const { decision } = input
|
|
112
|
+
|
|
113
|
+
if (!input.is_membership_established) {
|
|
114
|
+
console.info(WITHHELD_LINE)
|
|
115
|
+
|
|
116
|
+
return SUCCESS_EXIT_CODE
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (decision.action === 'add_to_epic' && decision.epic !== undefined) {
|
|
120
|
+
return await add_to_epic(decision.epic, input)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (decision.action === 'create_epic') return await create_epic(input)
|
|
124
|
+
|
|
125
|
+
return report_unapplied(decision.action)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const epic_bundle_apply = {
|
|
129
|
+
UNAPPLIED_LINES,
|
|
130
|
+
WITHHELD_LINE,
|
|
131
|
+
UNREAD_EPIC_LINE,
|
|
132
|
+
title_of,
|
|
133
|
+
apply_decision,
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export { epic_bundle_apply }
|
|
137
|
+
export type { ApplyInput }
|