@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,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 },
|
|
@@ -74,17 +74,20 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
|
|
|
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
76
|
{ path: 'docs/josh-commands-automation.md', bytes: 45_056 },
|
|
77
|
-
{ path: 'docs/josh-commands-run.md', bytes:
|
|
78
|
-
{ path: 'docs/josh-commands-backlog.md', bytes:
|
|
79
|
-
{ path: 'docs/josh-commands.md', bytes:
|
|
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 },
|
|
83
|
-
{ path: 'prompts/collaboration-workflow/file-edits.md', bytes:
|
|
83
|
+
{ path: 'prompts/collaboration-workflow/file-edits.md', bytes: 4096 },
|
|
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 },
|
|
89
|
+
{ path: 'prompts/collaboration-workflow/lane-instructions.md', bytes: 4096 },
|
|
90
|
+
{ path: 'prompts/collaboration-workflow/measurement.md', bytes: 4096 },
|
|
88
91
|
{ path: 'prompts/collaboration-workflow/operating-rules.md', bytes: 8192 },
|
|
89
92
|
{ path: 'prompts/collaboration-workflow/output-bounds.md', bytes: 4096 },
|
|
90
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,7 +1,7 @@
|
|
|
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'
|
|
4
|
+
import { find_package_directory } from '#scripts/josh/package-directory'
|
|
5
5
|
import { capped_output } from './capped-print'
|
|
6
6
|
import { document_section } from './document-section'
|
|
7
7
|
import { entry_read_set } from './entry-read-set'
|
|
@@ -21,7 +21,6 @@ import { entry_read_set } from './entry-read-set'
|
|
|
21
21
|
// renamed would otherwise print nothing and read as a section with nothing in it — the one outcome
|
|
22
22
|
// that is worse than reading the whole file.
|
|
23
23
|
|
|
24
|
-
const ARGV_OFFSET = 2
|
|
25
24
|
const FAILURE_EXIT_CODE = 1
|
|
26
25
|
const FILE_ARGUMENT = 0
|
|
27
26
|
const HEADING_ARGUMENT = 1
|
|
@@ -35,14 +34,25 @@ const USAGE = 'Usage: josh doc:section <file.md> "<heading>"'
|
|
|
35
34
|
// directory, a bare name that happened to exist beside the caller would beat the document under
|
|
36
35
|
// `root` and print a section of the wrong file — silently, which is the failure this command exists
|
|
37
36
|
// to refuse.
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
//
|
|
38
|
+
// **The kit package is the fallback.** A consumer keeps no `prompts/` of its own — the package ships
|
|
39
|
+
// it under `node_modules/@joshuafolkken/kit/` — so `prompts/review.md` resolves there when `root` has
|
|
40
|
+
// no copy, exactly as `review:brief` resolves the rubric.
|
|
41
|
+
const PACKAGE_DIRECTORY = find_package_directory(path.dirname(fileURLToPath(import.meta.url)))
|
|
40
42
|
|
|
41
|
-
|
|
43
|
+
function candidates_under(directory: string, name: string): Array<string> {
|
|
44
|
+
return [path.resolve(directory, name), entry_read_set.document_path(directory, name)]
|
|
45
|
+
}
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
function resolve_document(
|
|
48
|
+
name: string,
|
|
49
|
+
root: string = process.cwd(),
|
|
50
|
+
package_directory: string = PACKAGE_DIRECTORY,
|
|
51
|
+
): string {
|
|
52
|
+
const named = path.resolve(root, name)
|
|
53
|
+
const candidates = [...candidates_under(root, name), ...candidates_under(package_directory, name)]
|
|
44
54
|
|
|
45
|
-
return
|
|
55
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? named
|
|
46
56
|
}
|
|
47
57
|
|
|
48
58
|
function report_missing(markdown: string, heading: string): number {
|
|
@@ -89,12 +99,6 @@ function run(argv: ReadonlyArray<string>, root: string = process.cwd()): number
|
|
|
89
99
|
return markdown === undefined ? FAILURE_EXIT_CODE : print_section(markdown, heading, root)
|
|
90
100
|
}
|
|
91
101
|
|
|
92
|
-
function main(argv: ReadonlyArray<string>): void {
|
|
93
|
-
process.exitCode = run(argv)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
102
|
const document_section_cli = { FAILURE_EXIT_CODE, USAGE, resolve_document, run }
|
|
97
103
|
|
|
98
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
99
|
-
|
|
100
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
|
+
}
|
|
@@ -47,8 +47,8 @@ const ENTRY_READ_BUDGET: ReadonlyArray<EntryBudget> = [
|
|
|
47
47
|
{ entry: 'kickoff', bytes: 36_864 },
|
|
48
48
|
{ entry: 'fullrun', bytes: 53_248 },
|
|
49
49
|
{ entry: 'halfrun', bytes: 49_152 },
|
|
50
|
-
{ entry: 'prrun', bytes:
|
|
51
|
-
{ entry: 'backlogrun', bytes:
|
|
50
|
+
{ entry: 'prrun', bytes: 53_248 },
|
|
51
|
+
{ entry: 'backlogrun', bytes: 81_920 },
|
|
52
52
|
{ entry: LANE_CHILD, bytes: 45_056 },
|
|
53
53
|
]
|
|
54
54
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { lane_instructions } from '#scripts/agent/lane-instructions'
|
|
3
4
|
import { backlogrun_parent_read_set } from './backlogrun-parent-read-set'
|
|
4
5
|
import { entry_read_set, type ReadSetCost, type SectionCost } from './entry-read-set'
|
|
5
6
|
import { lane_child_read_set } from './lane-child-read-set'
|
|
@@ -192,7 +193,9 @@ function total_lines(report: ReadSetCost, width: number): Array<string> {
|
|
|
192
193
|
}
|
|
193
194
|
|
|
194
195
|
function note_lines(report: ReadSetCost): Array<string> {
|
|
195
|
-
if (report.entry === lane_child_read_set.LANE_CHILD)
|
|
196
|
+
if (report.entry === lane_child_read_set.LANE_CHILD) {
|
|
197
|
+
return [...LANE_CHILD_NOTE, lane_instructions.resident_line(), '']
|
|
198
|
+
}
|
|
196
199
|
|
|
197
200
|
if (report.entry === BACKLOGRUN) return [...BACKLOGRUN_PARENT_NOTE, '']
|
|
198
201
|
|
|
@@ -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
|
}
|
|
@@ -14,7 +14,6 @@ import { epic_parse } from './epic-parse'
|
|
|
14
14
|
// the children the epic already names, while this one searches for issues the epic does *not* name.
|
|
15
15
|
|
|
16
16
|
const SEARCH_LIMIT = 50
|
|
17
|
-
const PARENT_MARKERS: ReadonlyArray<string> = ['親:', 'Parent:', '親:']
|
|
18
17
|
// Named apart from `epic_audit_checks.ORPHAN_CHILD`: that check reports an orphan it found, this one
|
|
19
18
|
// reports that the search for orphans was incomplete, and a reader has to be able to tell them apart.
|
|
20
19
|
const ORPHAN_SEARCH = 'orphan search'
|
|
@@ -25,18 +24,15 @@ const CAPPED_BY_MATCHES = `The open-issue scan filled its ${String(SEARCH_LIMIT)
|
|
|
25
24
|
|
|
26
25
|
const searched_issue_schema = z.object({ number: z.number(), body: z.string().nullable() })
|
|
27
26
|
|
|
28
|
-
function has_parent_marker(line: string): boolean {
|
|
29
|
-
return PARENT_MARKERS.some((marker) => line.includes(marker))
|
|
30
|
-
}
|
|
31
|
-
|
|
32
27
|
// Whether an issue's body names this epic as its parent, in the shape the issue template uses.
|
|
33
28
|
//
|
|
34
29
|
// Both halves must be on the *same line*. An issue parented to a different epic routinely backlinks
|
|
35
30
|
// this one elsewhere in its body, and matching the marker and the number independently reported
|
|
36
31
|
// every such issue as an orphan.
|
|
37
32
|
//
|
|
38
|
-
// The number is read through the same reference parse the checks use, so a parent line (
|
|
39
|
-
//
|
|
33
|
+
// The number is read through the same reference parse the checks use, so a parent line (one
|
|
34
|
+
// `epic_audit_logic.has_parent_marker` accepts) such as `owner/other#858` names that repository's
|
|
35
|
+
// epic and not this one's.
|
|
40
36
|
// The known set is this repository alone — a parent line names this epic or it names nothing here —
|
|
41
37
|
// and it is passed rather than omitted so a repository whose own name contains a dot still recognizes
|
|
42
38
|
// `joshuafolkken/site.com#858`.
|
|
@@ -49,7 +45,8 @@ function names_this_epic(line: string, epic_number: number, repo: string): boole
|
|
|
49
45
|
function claims_parent(body: string | null, epic_number: number, repo: string): boolean {
|
|
50
46
|
return (body ?? '')
|
|
51
47
|
.split('\n')
|
|
52
|
-
.
|
|
48
|
+
.filter((line) => epic_audit_logic.has_parent_marker(line))
|
|
49
|
+
.some((line) => names_this_epic(line, epic_number, repo))
|
|
53
50
|
}
|
|
54
51
|
|
|
55
52
|
// Why the scan stopped before the end of the open backlog, or that it did not. Both cutoffs hide the
|
|
@@ -180,6 +180,55 @@ function acceptance_section(body: string | undefined): string {
|
|
|
180
180
|
return markdown_section.section_lines_matching(body, is_acceptance_heading).join('\n')
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
// Where a body reference that counts as a relation was written. Only these two places state what the
|
|
184
|
+
// issue delivers or where it belongs; a number in the background, symptom or origin section is the
|
|
185
|
+
// example that prompted the filing, and reading it as a relation bundled issues whose work never
|
|
186
|
+
// overlaps.
|
|
187
|
+
type SignalSection = 'acceptance criteria' | 'parent line'
|
|
188
|
+
|
|
189
|
+
interface SignalReference {
|
|
190
|
+
number: number
|
|
191
|
+
section: SignalSection
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// What marks a line as naming the issue's parent, in both spellings for the same reason as
|
|
195
|
+
// `ACCEPTANCE_HEADINGS`. `epic:audit`'s orphan search matches it anywhere in the line, then asks
|
|
196
|
+
// whether the same line names the epic.
|
|
197
|
+
const PARENT_MARKERS: ReadonlyArray<string> = ['親:', '親:', 'Parent:', 'parent:']
|
|
198
|
+
|
|
199
|
+
function has_parent_marker(line: string): boolean {
|
|
200
|
+
return PARENT_MARKERS.some((marker) => line.includes(marker))
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// The reference written directly after a parent marker, bold markup allowed (`- **Parent:** #N`).
|
|
204
|
+
// Only that reference is the parent: a background sentence that mentions `parent:` and names an
|
|
205
|
+
// issue elsewhere on the line is not a parent line.
|
|
206
|
+
const PARENT_REFERENCE = /(?:親|Parent|parent)\**[::]\**\s*(?:[\w.-]+\/[\w.-]+)?#\d+/gu
|
|
207
|
+
|
|
208
|
+
function parent_references(body: string): string {
|
|
209
|
+
return markdown_section
|
|
210
|
+
.unfenced_lines(body)
|
|
211
|
+
.flatMap((line) => [...line.matchAll(PARENT_REFERENCE)].map((match) => match[0]))
|
|
212
|
+
.join('\n')
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function references_in(text: string, repo: string, section: SignalSection): Array<SignalReference> {
|
|
216
|
+
return parse_references(text, repo).map((number) => ({ number, section }))
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// The same-repository references a body makes in the places that count as a relation, each with the
|
|
220
|
+
// section it was read from. A number both places name is reported once, at the first.
|
|
221
|
+
function signal_references(body: string, repo = ''): Array<SignalReference> {
|
|
222
|
+
const read = [
|
|
223
|
+
...references_in(acceptance_section(body), repo, 'acceptance criteria'),
|
|
224
|
+
...references_in(parent_references(body), repo, 'parent line'),
|
|
225
|
+
]
|
|
226
|
+
|
|
227
|
+
return read.filter((reference, index) => {
|
|
228
|
+
return read.findIndex((other) => other.number === reference.number) === index
|
|
229
|
+
})
|
|
230
|
+
}
|
|
231
|
+
|
|
183
232
|
// Everything `node` depends on, directly or through a chain. Walked iteratively so a graph that
|
|
184
233
|
// still contains a cycle terminates — `epic:next` rejects one first, but an auditor must not hang on
|
|
185
234
|
// the input it exists to examine.
|
|
@@ -223,8 +272,10 @@ const epic_audit_logic = {
|
|
|
223
272
|
parse_issue_references,
|
|
224
273
|
parse_references,
|
|
225
274
|
acceptance_section,
|
|
275
|
+
signal_references,
|
|
276
|
+
has_parent_marker,
|
|
226
277
|
depends_on,
|
|
227
278
|
}
|
|
228
279
|
|
|
229
|
-
export type { AuditFinding, FindingLevel, ReferenceState }
|
|
280
|
+
export type { AuditFinding, FindingLevel, ReferenceState, SignalReference, SignalSection }
|
|
230
281
|
export { epic_audit_logic }
|
|
@@ -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 }
|