@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_release_cli } from './issue-release-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:release` entry, kept apart from `issue-release-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). `process.exitCode` rather than `process.exit()`, so the report on standard
|
|
8
|
+
// output drains first.
|
|
9
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
10
|
+
const ARGV_OFFSET = 2
|
|
11
|
+
|
|
12
|
+
process.exitCode = await issue_release_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
13
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { RELEASE_LABEL } from './issue-labels'
|
|
2
3
|
|
|
3
4
|
// The decisions behind `josh issue:release`, kept apart from the command
|
|
4
5
|
// that reads the network so each is a pure answer a test can pin. An Issue whose change reaches a
|
|
@@ -20,14 +21,9 @@ function is_listing_row(value: unknown): value is ListingRow {
|
|
|
20
21
|
// release Issue at a time; were a person to open a second, the oldest is the one the next release
|
|
21
22
|
// closes, so it is the one every new blocker joins.
|
|
22
23
|
function open_release_of(json: string): number | undefined {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return rows.length === 0 ? undefined : Math.min(...rows.map((row) => row.number))
|
|
28
|
-
} catch {
|
|
29
|
-
return undefined
|
|
30
|
-
}
|
|
24
|
+
const rows = (json_value.parse_array(json) ?? []).filter((row) => is_listing_row(row))
|
|
25
|
+
|
|
26
|
+
return rows.length === 0 ? undefined : Math.min(...rows.map((row) => row.number))
|
|
31
27
|
}
|
|
32
28
|
|
|
33
29
|
function title_of(repo: string): string {
|
|
@@ -51,9 +47,8 @@ function body_of(repo: string): string {
|
|
|
51
47
|
].join('\n')
|
|
52
48
|
}
|
|
53
49
|
|
|
54
|
-
// The release label
|
|
55
|
-
|
|
56
|
-
const RELEASE_LABELS: ReadonlyArray<string> = [RELEASE_LABEL, DEPTH_0_LABEL]
|
|
50
|
+
// The release label alone — never `auto-ok`.
|
|
51
|
+
const RELEASE_LABELS: ReadonlyArray<string> = [RELEASE_LABEL]
|
|
57
52
|
|
|
58
53
|
const issue_release = { RELEASE_LABELS, open_release_of, title_of, body_of }
|
|
59
54
|
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { read_pull } from '#scripts/gh/git-gh-pr-read'
|
|
2
|
+
import { git_closes_keyword } from '#scripts/git/git-closes-keyword'
|
|
3
|
+
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
4
|
+
import { issue_cite } from './issue-cite'
|
|
5
|
+
import { markdown_section } from './markdown-section'
|
|
6
|
+
|
|
7
|
+
// joshuafolkken/kit#4414: a follow-up measurement waits on samples, not on the calendar — a busy day
|
|
8
|
+
// collects enough merges before a dated start time, a quiet one not even after it. The body names the
|
|
9
|
+
// pull request whose effect it measures and how many merges the lane ledger must record after that
|
|
10
|
+
// pull request merged; the pickup holds the issue until then. The pull request's own merge is not a
|
|
11
|
+
// sample: `run:merge` records it, keyed by the issue it closes, after GitHub stamps `merged_at`.
|
|
12
|
+
//
|
|
13
|
+
// The readers that hold an issue back are synchronous and see only the body, so the one network fact
|
|
14
|
+
// the wait needs — when the pull request merged — is read ahead by `prime`, once per pull request per
|
|
15
|
+
// process, wherever bodies first arrive. A body nobody primed reads as waiting: offering it early is
|
|
16
|
+
// the defect this guards, and the next primed read releases it.
|
|
17
|
+
|
|
18
|
+
const BACKGROUND_HEADING = '## 背景'
|
|
19
|
+
const PREFIX = '- 実施可能条件:'
|
|
20
|
+
const CONDITION_PATTERN = /^#(?<pr>[1-9]\d*) のマージ後 (?<count>[1-9]\d*) マージ$/u
|
|
21
|
+
const VALUE_FORMAT = '#<PR> のマージ後 <K> マージ'
|
|
22
|
+
const DECLARATION = `${PREFIX} ${VALUE_FORMAT}`
|
|
23
|
+
const MALFORMED = `\`${PREFIX}\` must read \`${VALUE_FORMAT}\` with K at least 1`
|
|
24
|
+
|
|
25
|
+
interface Condition {
|
|
26
|
+
pr: number
|
|
27
|
+
count: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type SampleWait =
|
|
31
|
+
| { kind: 'unread'; pr: number }
|
|
32
|
+
| { kind: 'unmerged'; pr: number }
|
|
33
|
+
| { kind: 'short'; pr: number; counted: number; needed: number }
|
|
34
|
+
|
|
35
|
+
// One pull request as read: `merged_at` absent is one found unmerged, read again as it may merge since.
|
|
36
|
+
// `closes` is the issue its body closes, whose ledger merge is the pull request's own.
|
|
37
|
+
interface PullRead {
|
|
38
|
+
merged_at: string | undefined
|
|
39
|
+
closes: number | undefined
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface PrimePorts {
|
|
43
|
+
pull: (pr: number) => Promise<PullRead>
|
|
44
|
+
ledger_path: () => Promise<string | undefined>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface LedgerState {
|
|
48
|
+
path: string | undefined
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// A pull request with no entry was never read.
|
|
52
|
+
|
|
53
|
+
const pull_by_number = new Map<number, PullRead>()
|
|
54
|
+
const ledger: LedgerState = { path: undefined }
|
|
55
|
+
|
|
56
|
+
function declared_value(body: string): string | undefined {
|
|
57
|
+
const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
|
|
58
|
+
const line = markdown_section
|
|
59
|
+
.unfenced_lines(background)
|
|
60
|
+
.map((text) => text.trim())
|
|
61
|
+
.find((text) => text.startsWith(PREFIX))
|
|
62
|
+
|
|
63
|
+
return line?.slice(PREFIX.length).trim()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The declared condition, or `undefined` when there is none or it does not parse — a malformed one is
|
|
67
|
+
// refused by `issue:lint`, and holding a hand-edited one forever would lose the issue silently.
|
|
68
|
+
function condition_of(body = ''): Condition | undefined {
|
|
69
|
+
const groups = CONDITION_PATTERN.exec(declared_value(body) ?? '')?.groups
|
|
70
|
+
|
|
71
|
+
if (groups === undefined) return undefined
|
|
72
|
+
|
|
73
|
+
return { pr: Number(groups['pr']), count: Number(groups['count']) }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The number the declared condition cites, or `undefined` when there is none or it does not parse.
|
|
77
|
+
function cited_number(body: string): number | undefined {
|
|
78
|
+
return condition_of(body)?.pr
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
82
|
+
const value = declared_value(body)
|
|
83
|
+
|
|
84
|
+
return value === undefined || CONDITION_PATTERN.test(value) ? [] : [MALFORMED]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function read_source(pr: number): Promise<PullRead> {
|
|
88
|
+
const pull = await read_pull(pr)
|
|
89
|
+
const closes = git_closes_keyword.parse_closes_issue_number(pull.body ?? undefined)
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
merged_at: pull.merged_at ?? undefined,
|
|
93
|
+
closes: closes === undefined ? undefined : Number(closes),
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const DEFAULT_PORTS: PrimePorts = { pull: read_source, ledger_path: lane_ledger.target }
|
|
98
|
+
|
|
99
|
+
// A failed read stays unread, so the next prime asks again.
|
|
100
|
+
async function remember(pr: number, ports: PrimePorts): Promise<void> {
|
|
101
|
+
try {
|
|
102
|
+
pull_by_number.set(pr, await ports.pull(pr))
|
|
103
|
+
} catch {
|
|
104
|
+
pull_by_number.delete(pr)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function is_merge_known(pr: number): boolean {
|
|
109
|
+
return pull_by_number.get(pr)?.merged_at !== undefined
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Reads ahead what the bodies' conditions need. Nothing is read for bodies that declare none.
|
|
113
|
+
async function prime(
|
|
114
|
+
bodies: ReadonlyArray<string | undefined>,
|
|
115
|
+
ports: PrimePorts = DEFAULT_PORTS,
|
|
116
|
+
): Promise<void> {
|
|
117
|
+
const unread = bodies
|
|
118
|
+
.map((body) => condition_of(body)?.pr)
|
|
119
|
+
.filter((pr): pr is number => pr !== undefined && !is_merge_known(pr))
|
|
120
|
+
|
|
121
|
+
if (unread.length === 0) return
|
|
122
|
+
|
|
123
|
+
ledger.path = await ports.ledger_path()
|
|
124
|
+
await Promise.all(
|
|
125
|
+
[...new Set(unread)].map(async (pr) => {
|
|
126
|
+
await remember(pr, ports)
|
|
127
|
+
}),
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function merges_after({ merged_at, closes }: PullRead & { merged_at: string }): number {
|
|
132
|
+
if (ledger.path === undefined) return 0
|
|
133
|
+
|
|
134
|
+
const since = Date.parse(merged_at)
|
|
135
|
+
|
|
136
|
+
return lane_ledger
|
|
137
|
+
.read_entries(ledger.path)
|
|
138
|
+
.filter(
|
|
139
|
+
(entry) =>
|
|
140
|
+
entry.kind === lane_ledger.KIND.MERGE &&
|
|
141
|
+
entry.issue !== closes &&
|
|
142
|
+
Date.parse(entry.at) > since,
|
|
143
|
+
).length
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// What the body still waits on, or `undefined` when it declares nothing or has its samples.
|
|
147
|
+
function wait_of(body?: string): SampleWait | undefined {
|
|
148
|
+
const condition = condition_of(body)
|
|
149
|
+
|
|
150
|
+
if (condition === undefined) return undefined
|
|
151
|
+
|
|
152
|
+
const { pr, count } = condition
|
|
153
|
+
const pull = pull_by_number.get(pr)
|
|
154
|
+
|
|
155
|
+
if (pull === undefined) return { kind: 'unread', pr }
|
|
156
|
+
|
|
157
|
+
const { merged_at, closes } = pull
|
|
158
|
+
|
|
159
|
+
if (merged_at === undefined) return { kind: 'unmerged', pr }
|
|
160
|
+
|
|
161
|
+
const counted = merges_after({ merged_at, closes })
|
|
162
|
+
|
|
163
|
+
return counted >= count ? undefined : { kind: 'short', pr, counted, needed: count }
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Why the body waits, for a reader that cites the issue itself.
|
|
167
|
+
function reason_of(wait: SampleWait): string {
|
|
168
|
+
const pr = issue_cite.plain(wait.pr)
|
|
169
|
+
|
|
170
|
+
if (wait.kind === 'unread') return `until the merge of ${pr} is read`
|
|
171
|
+
if (wait.kind === 'unmerged') return `until ${pr} merges`
|
|
172
|
+
|
|
173
|
+
return `${String(wait.counted)}/${String(wait.needed)} merges after ${pr}`
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function reset(): void {
|
|
177
|
+
pull_by_number.clear()
|
|
178
|
+
ledger.path = undefined
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const issue_sample_gate = {
|
|
182
|
+
DECLARATION,
|
|
183
|
+
cited_number,
|
|
184
|
+
prime,
|
|
185
|
+
problems,
|
|
186
|
+
reason_of,
|
|
187
|
+
reset,
|
|
188
|
+
wait_of,
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export type { PrimePorts, SampleWait }
|
|
192
|
+
export { issue_sample_gate }
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
|
+
import { git_gh_issue_rest } from '#scripts/gh/git-gh-issue-rest'
|
|
4
|
+
import { issue_closing_pr } from './issue-closing-pr'
|
|
5
|
+
import { issue_sample_gate } from './issue-sample-gate'
|
|
6
|
+
import { session_cite } from './session-cite'
|
|
7
|
+
|
|
8
|
+
// joshuafolkken/kit#4460: the start condition cites the pull request whose merge it waits on. An issue
|
|
9
|
+
// number passes the format check, then reads as a pull request that is never found, so the issue waits
|
|
10
|
+
// forever. The filing reads what the number names and refuses an issue, citing the merged pull request
|
|
11
|
+
// that closed it when there is one. An unreadable number passes — an outage is no reason to stop.
|
|
12
|
+
//
|
|
13
|
+
// `repo` is the filing's target, `undefined` for this checkout. The closing pull request is looked up
|
|
14
|
+
// only here: `issue_closing_pr` reads this checkout's timeline, so a foreign target gets the plain hint.
|
|
15
|
+
|
|
16
|
+
interface SourcePorts {
|
|
17
|
+
is_pull: (number: number, repo: string | undefined) => Promise<boolean | undefined>
|
|
18
|
+
closing_pr: (issue: number) => Promise<string | undefined>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function read_is_pull(
|
|
22
|
+
number: number,
|
|
23
|
+
repo: string | undefined,
|
|
24
|
+
): Promise<boolean | undefined> {
|
|
25
|
+
try {
|
|
26
|
+
const json = await git_gh_exec.exec_gh_api({
|
|
27
|
+
path: git_gh_api_path.issue_api_path(String(number), repo),
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
return git_gh_issue_rest.is_pull_request(git_gh_issue_rest.parse_rest_issue(json))
|
|
31
|
+
} catch {
|
|
32
|
+
return undefined
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The closing pull request's number, read off the URL `read_closing_pr` answers.
|
|
37
|
+
async function read_closing_pr(issue: number): Promise<string | undefined> {
|
|
38
|
+
const url = await issue_closing_pr.read_closing_pr(String(issue))
|
|
39
|
+
|
|
40
|
+
return url?.slice(url.lastIndexOf('/') + 1)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const DEFAULT_PORTS: SourcePorts = { is_pull: read_is_pull, closing_pr: read_closing_pr }
|
|
44
|
+
|
|
45
|
+
async function hint_of(
|
|
46
|
+
issue: number,
|
|
47
|
+
repo: string | undefined,
|
|
48
|
+
ports: SourcePorts,
|
|
49
|
+
): Promise<string> {
|
|
50
|
+
const closing = repo === undefined ? await ports.closing_pr(issue) : undefined
|
|
51
|
+
|
|
52
|
+
if (closing === undefined) return 'cite the pull request whose merge it waits on'
|
|
53
|
+
|
|
54
|
+
return `cite the pull request that closed it: ${session_cite.issue(closing)}`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// The refusal for a condition citing an issue, or `undefined` when it cites a pull request, cites
|
|
58
|
+
// nothing, or cannot be read.
|
|
59
|
+
async function problem(
|
|
60
|
+
body: string,
|
|
61
|
+
repo?: string,
|
|
62
|
+
ports: SourcePorts = DEFAULT_PORTS,
|
|
63
|
+
): Promise<string | undefined> {
|
|
64
|
+
const number = issue_sample_gate.cited_number(body)
|
|
65
|
+
|
|
66
|
+
if (number === undefined || (await ports.is_pull(number, repo)) !== false) return undefined
|
|
67
|
+
const cited = session_cite.issue(number, undefined, repo)
|
|
68
|
+
const hint = await hint_of(number, repo, ports)
|
|
69
|
+
|
|
70
|
+
return `\`- 実施可能条件:\` cites ${cited}, an issue, not a pull request — ${hint}`
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const issue_sample_source = { problem }
|
|
74
|
+
|
|
75
|
+
export type { SourcePorts }
|
|
76
|
+
export { issue_sample_source }
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { readFile } from 'node:fs/promises'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
4
2
|
import { epic_audit_logic } from '#scripts/epic/epic-audit'
|
|
5
3
|
import { epic_bundle, type BacklogIssue, type BundleDecision } from '#scripts/epic/epic-bundle'
|
|
6
4
|
import { epic_bundle_cli } from '#scripts/epic/epic-bundle-cli'
|
|
@@ -34,7 +32,6 @@ const { CLOSED_CEILING_LINE, CLOSED_UNREADABLE_LINE, read_recently_closed, warn_
|
|
|
34
32
|
|
|
35
33
|
const SUCCESS_EXIT_CODE = 0
|
|
36
34
|
const FAILURE_EXIT_CODE = 1
|
|
37
|
-
const ARGV_OFFSET = 2
|
|
38
35
|
const SCORE_DIGITS = 2
|
|
39
36
|
const USAGE = 'Usage: josh issue:scout "<title>" [--body "<draft>" | --body-file <path>]'
|
|
40
37
|
const UNKNOWN_REPO_MESSAGE =
|
|
@@ -103,7 +100,7 @@ function draft_of(args: ScoutArguments, repo: string): BacklogIssue {
|
|
|
103
100
|
}
|
|
104
101
|
|
|
105
102
|
// The epic beside a candidate is the placement answer for a draft that cites nothing: the epic half
|
|
106
|
-
// below decides from
|
|
103
|
+
// below decides from signal references, and a title-only draft has none to give it.
|
|
107
104
|
function format_duplicate(candidate: DuplicateCandidate): string {
|
|
108
105
|
const score = candidate.is_referenced === true ? 'ref' : candidate.score.toFixed(SCORE_DIGITS)
|
|
109
106
|
const epic = candidate.epic === undefined ? '' : ` (epic ${session_cite.issue(candidate.epic)})`
|
|
@@ -162,12 +159,13 @@ function format_epic(decision: BundleDecision): Array<string> {
|
|
|
162
159
|
return lines
|
|
163
160
|
}
|
|
164
161
|
|
|
165
|
-
// A draft cites nothing, so the epic half has nothing to decide from: its two
|
|
166
|
-
//
|
|
167
|
-
//
|
|
162
|
+
// A draft cites nothing where a citation counts, so the epic half has nothing to decide from: its two
|
|
163
|
+
// signals are references in the acceptance criteria or the `parent: #N` line and recorded
|
|
164
|
+
// dependencies, and a title or a background mention carries neither. Saying "file it standalone"
|
|
165
|
+
// there reports a scan that found nothing when none was possible — the confident wrong answer the gap
|
|
168
166
|
// warnings exist to prevent everywhere else in this command.
|
|
169
167
|
const NO_REFERENCE_LINE =
|
|
170
|
-
'Epic: not asked — no issue number in the summary. Pass --body "
|
|
168
|
+
'Epic: not asked — no issue number in the summary\'s acceptance criteria or parent line. Pass --body "parent: #<N>", or take the epic printed beside a duplicate above.'
|
|
171
169
|
|
|
172
170
|
// Every placing verdict above asserts that no epic already tracks the draft's relatives, and a cut
|
|
173
171
|
// epic listing cannot support that: `epic:bundle` withholds them for it,
|
|
@@ -195,18 +193,22 @@ function format_epic_decision(
|
|
|
195
193
|
return format_epic(decision).join('\n')
|
|
196
194
|
}
|
|
197
195
|
|
|
198
|
-
//
|
|
199
|
-
//
|
|
200
|
-
|
|
201
|
-
|
|
196
|
+
// The issue numbers the summary names where `decide_bundle` counts a reference — its acceptance
|
|
197
|
+
// criteria and its `parent: #N` line — read through the same parser the decision itself uses: a
|
|
198
|
+
// second reading of "does this body cite anything" could disagree with the one that matters, and an
|
|
199
|
+
// issue cited only as the background of the filing is not one the draft belongs with.
|
|
200
|
+
function signal_numbers(draft: BacklogIssue): Array<number> {
|
|
201
|
+
return epic_audit_logic
|
|
202
|
+
.signal_references(draft.body, draft.repo)
|
|
203
|
+
.map((reference) => reference.number)
|
|
202
204
|
}
|
|
203
205
|
|
|
204
206
|
// The open epics the summary names outright. `decide_bundle` excludes an epic from the candidate pool
|
|
205
|
-
// — a container is not a sibling — so a draft
|
|
206
|
-
// workflow documents themselves suggest, otherwise reaches `none` and is told to file
|
|
207
|
-
// the epic it named never mentioned.
|
|
207
|
+
// — a container is not a sibling — so a draft whose `parent: #1153` line names the epic, which is the
|
|
208
|
+
// phrasing the workflow documents themselves suggest, otherwise reaches `none` and is told to file
|
|
209
|
+
// standalone with the epic it named never mentioned.
|
|
208
210
|
function named_epics(draft: BacklogIssue, issues: ReadonlyArray<BacklogIssue>): Array<number> {
|
|
209
|
-
const named = new Set(
|
|
211
|
+
const named = new Set(signal_numbers(draft))
|
|
210
212
|
|
|
211
213
|
return issues
|
|
212
214
|
.filter((issue) => issue.is_epic === true && named.has(issue.number))
|
|
@@ -241,7 +243,7 @@ function format_epic_answer(
|
|
|
241
243
|
|
|
242
244
|
if (named.length > 0) return format_named_epics(named, decision).join('\n')
|
|
243
245
|
|
|
244
|
-
return format_epic_decision(decision,
|
|
246
|
+
return format_epic_decision(decision, signal_numbers(draft).length > 0, is_membership_established)
|
|
245
247
|
}
|
|
246
248
|
|
|
247
249
|
// The closed rows reach the duplicate half only. `decide_bundle` places a draft among issues that
|
|
@@ -389,12 +391,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
389
391
|
return await report(args, repo)
|
|
390
392
|
}
|
|
391
393
|
|
|
392
|
-
// `process.exitCode` rather than `process.exit()`: the answer goes to standard output and a write to
|
|
393
|
-
// a pipe is asynchronous on macOS, so exiting can tear the process down before it drains.
|
|
394
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
395
|
-
process.exitCode = await run(argv)
|
|
396
|
-
}
|
|
397
|
-
|
|
398
394
|
const issue_scout_cli = {
|
|
399
395
|
USAGE,
|
|
400
396
|
UNKNOWN_REPO_MESSAGE,
|
|
@@ -410,7 +406,5 @@ const issue_scout_cli = {
|
|
|
410
406
|
run,
|
|
411
407
|
}
|
|
412
408
|
|
|
413
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
414
|
-
|
|
415
409
|
export type { ScoutArguments, ScoutOutcome }
|
|
416
410
|
export { issue_scout_cli }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_scout_cli } from './issue-scout-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:scout` entry, kept apart from `issue-scout-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). `process.exitCode` rather than `process.exit()`: the answer goes to
|
|
8
|
+
// standard output and a write to a pipe is asynchronous on macOS, so exiting can tear the process
|
|
9
|
+
// down before it drains.
|
|
10
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
11
|
+
const ARGV_OFFSET = 2
|
|
12
|
+
|
|
13
|
+
process.exitCode = await issue_scout_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
14
|
+
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
2
|
import type { IssueReadReason } from '#scripts/gh/git-gh-issue-read'
|
|
5
3
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
@@ -29,7 +27,6 @@ import { issue_state, type IssueState } from './issue-state'
|
|
|
29
27
|
// are told apart here and neither is a state.
|
|
30
28
|
|
|
31
29
|
const FAILURE_EXIT_CODE = 1
|
|
32
|
-
const ARGV_OFFSET = 2
|
|
33
30
|
const USAGE = 'Usage: josh issue:state <issue-number> [<issue-number> ...] [--repo <owner/repo>]'
|
|
34
31
|
// A blank line between the blocks of a multi-number report, so a person sees where one issue ends
|
|
35
32
|
// while a reader matching `issue: ` still finds each block by its first line.
|
|
@@ -172,21 +169,14 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
172
169
|
return issue_report_failures.report_failures(reports, FAILURE_TERMS)
|
|
173
170
|
}
|
|
174
171
|
|
|
175
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
176
|
-
process.exitCode = await run(argv)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
172
|
const issue_state_cli = {
|
|
180
173
|
READ_CONCURRENCY,
|
|
181
174
|
STATE_FIELDS,
|
|
182
175
|
USAGE,
|
|
183
|
-
main,
|
|
184
176
|
parse_request,
|
|
185
177
|
read_issue,
|
|
186
178
|
run,
|
|
187
179
|
}
|
|
188
180
|
|
|
189
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
190
|
-
|
|
191
181
|
export type { StateRead }
|
|
192
182
|
export { issue_state_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_state_cli } from './issue-state-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:state` entry, kept apart from `issue-state-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 = await issue_state_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
1
2
|
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
2
3
|
import { z } from 'zod'
|
|
3
4
|
|
|
4
|
-
// What a person changed on an issue since a run last read it, as the one
|
|
5
|
-
//
|
|
6
|
-
//
|
|
5
|
+
// What a person changed on an issue since a run last read it, as the one answer the hook, the review
|
|
6
|
+
// attestation, `josh issue:ack` and `josh followup` all print. Kept in one place so the four callers
|
|
7
|
+
// cannot each draw the line between "a person's update" and "noise" differently; its only I/O is the
|
|
8
|
+
// write-access lookup `gh_author_association` makes for a `MEMBER` / `COLLABORATOR`.
|
|
7
9
|
//
|
|
8
10
|
// **A person's update is a body edit or a comment nobody automated.** A bot's comment (`type: Bot`,
|
|
9
11
|
// or a `[bot]` login) is not one. A run's own comment is posted under the person's own `gh` login,
|
|
@@ -12,6 +14,13 @@ import { z } from 'zod'
|
|
|
12
14
|
// through a raw `gh api` counts as a person's — the direction that costs one `josh issue:ack`, never a
|
|
13
15
|
// missed correction.
|
|
14
16
|
//
|
|
17
|
+
// **Only an author with write access is a person here** (`gh_author_association`). On a public
|
|
18
|
+
// repository anyone can comment, so a comment from anyone else is never handed to a run as an update,
|
|
19
|
+
// and its `RUN_MARKER` is not taken as josh's own. A `MEMBER` / `COLLABORATOR` whose lookup failed
|
|
20
|
+
// (`is_trusted: undefined` — the hook's timeout fired) is neither: their comment is announced with its
|
|
21
|
+
// body withheld, costing one `josh issue:ack` rather than a missed correction, and its marker is not
|
|
22
|
+
// trusted.
|
|
23
|
+
//
|
|
15
24
|
// **Comment edits are out of scope.** A new comment carries an id above the baseline's; an edited
|
|
16
25
|
// one keeps its id and is not seen. The body is compared whole, so its edits are.
|
|
17
26
|
|
|
@@ -21,6 +30,8 @@ const BOT_SUFFIX = '[bot]'
|
|
|
21
30
|
const NO_COMMENT_ID = 0
|
|
22
31
|
const UNKNOWN_AUTHOR = '(unknown)'
|
|
23
32
|
const UNKNOWN_TIME = '(undated)'
|
|
33
|
+
const UNVERIFIED_BODY =
|
|
34
|
+
"(body withheld — the author's write access could not be checked; read it with `josh issue:read`)"
|
|
24
35
|
|
|
25
36
|
const BODY_HEADING = 'Body edited:'
|
|
26
37
|
const REMOVED_PREFIX = '- '
|
|
@@ -36,11 +47,14 @@ const comment_schema = z.looseObject({
|
|
|
36
47
|
user: z.looseObject({ login: z.string(), type: z.string().optional() }).nullish(),
|
|
37
48
|
created_at: z.string().optional(),
|
|
38
49
|
body: z.string().nullish(),
|
|
50
|
+
author_association: z.string().nullish(),
|
|
39
51
|
})
|
|
40
52
|
|
|
41
53
|
interface WatchComment {
|
|
42
54
|
id: number
|
|
43
55
|
author: string
|
|
56
|
+
// `undefined` when the write-access lookup failed.
|
|
57
|
+
is_trusted: boolean | undefined
|
|
44
58
|
is_automated: boolean
|
|
45
59
|
created_at: string
|
|
46
60
|
body: string
|
|
@@ -60,26 +74,48 @@ function is_bot(user: z.infer<typeof comment_schema>['user']): boolean {
|
|
|
60
74
|
return user?.type === BOT_TYPE || (user?.login.endsWith(BOT_SUFFIX) ?? false)
|
|
61
75
|
}
|
|
62
76
|
|
|
63
|
-
function is_automated(
|
|
64
|
-
|
|
77
|
+
function is_automated(
|
|
78
|
+
raw: z.infer<typeof comment_schema>,
|
|
79
|
+
is_trusted: boolean | undefined,
|
|
80
|
+
): boolean {
|
|
81
|
+
return is_bot(raw.user) || (is_trusted === true && (raw.body?.includes(RUN_MARKER) ?? false))
|
|
65
82
|
}
|
|
66
83
|
|
|
67
|
-
function to_comment(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
84
|
+
async function to_comment(
|
|
85
|
+
raw: z.infer<typeof comment_schema>,
|
|
86
|
+
timeout_ms?: number,
|
|
87
|
+
): Promise<WatchComment> {
|
|
88
|
+
const login = raw.user?.login
|
|
89
|
+
const is_trusted = await gh_author_association.trust_of({
|
|
90
|
+
login,
|
|
91
|
+
association: raw.author_association,
|
|
92
|
+
timeout_ms,
|
|
93
|
+
})
|
|
71
94
|
|
|
72
|
-
return {
|
|
95
|
+
return {
|
|
96
|
+
id: raw.id,
|
|
97
|
+
author: login ?? UNKNOWN_AUTHOR,
|
|
98
|
+
is_trusted,
|
|
99
|
+
is_automated: is_automated(raw, is_trusted),
|
|
100
|
+
created_at: raw.created_at ?? UNKNOWN_TIME,
|
|
101
|
+
body: raw.body ?? '',
|
|
102
|
+
}
|
|
73
103
|
}
|
|
74
104
|
|
|
75
105
|
// `undefined` — never `[]` — for a listing that could not be read, so a failed read is never taken
|
|
76
|
-
// for "nobody commented".
|
|
77
|
-
|
|
106
|
+
// for "nobody commented". `timeout_ms` bounds each write-access lookup, which run concurrently, so a
|
|
107
|
+
// hook's read stays inside its own timeout.
|
|
108
|
+
async function parse_comments(
|
|
109
|
+
json: string | undefined,
|
|
110
|
+
timeout_ms?: number,
|
|
111
|
+
): Promise<ReadonlyArray<WatchComment> | undefined> {
|
|
78
112
|
if (json === undefined) return undefined
|
|
79
113
|
|
|
80
114
|
const listing = read_json_listing(json, comment_schema)
|
|
81
115
|
|
|
82
|
-
|
|
116
|
+
if (listing.kind !== 'read') return undefined
|
|
117
|
+
|
|
118
|
+
return await Promise.all(listing.rows.map(async (row) => await to_comment(row, timeout_ms)))
|
|
83
119
|
}
|
|
84
120
|
|
|
85
121
|
function last_comment_id(comments: ReadonlyArray<WatchComment>): number {
|
|
@@ -118,7 +154,9 @@ function body_section(previous_raw: string, current_raw: string): string | undef
|
|
|
118
154
|
}
|
|
119
155
|
|
|
120
156
|
function comment_section(comment: WatchComment): string {
|
|
121
|
-
|
|
157
|
+
const body = comment.is_trusted === true ? comment.body : UNVERIFIED_BODY
|
|
158
|
+
|
|
159
|
+
return `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}${LINE_SEPARATOR}${body}`
|
|
122
160
|
}
|
|
123
161
|
|
|
124
162
|
function new_person_comments(
|
|
@@ -126,7 +164,10 @@ function new_person_comments(
|
|
|
126
164
|
snapshot: WatchSnapshot,
|
|
127
165
|
): ReadonlyArray<WatchComment> {
|
|
128
166
|
return snapshot.comments.filter(
|
|
129
|
-
(comment) =>
|
|
167
|
+
(comment) =>
|
|
168
|
+
comment.id > baseline.last_comment_id &&
|
|
169
|
+
comment.is_trusted !== false &&
|
|
170
|
+
!comment.is_automated,
|
|
130
171
|
)
|
|
131
172
|
}
|
|
132
173
|
|
|
@@ -76,8 +76,9 @@ async function read_snapshot(
|
|
|
76
76
|
body: string,
|
|
77
77
|
etag: string | undefined,
|
|
78
78
|
): Promise<Fetched> {
|
|
79
|
-
const comments = issue_watch_diff.parse_comments(
|
|
79
|
+
const comments = await issue_watch_diff.parse_comments(
|
|
80
80
|
await git_gh_issue_read.issue_list_comments(request.issue, request.timeout_ms),
|
|
81
|
+
request.timeout_ms,
|
|
81
82
|
)
|
|
82
83
|
|
|
83
84
|
return comments === undefined ? UNREADABLE : { kind: 'read', snapshot: { body, comments }, etag }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
1
2
|
import { INTERRUPT_ROUTE_LABEL, SPLIT_ROUTE_LABEL, TIER_A_ROUTE_LABEL } from './issue-labels'
|
|
2
3
|
|
|
3
4
|
// The WIP cap at the call that files. `josh issue:file` reads the count and asks the exemption
|
|
@@ -55,13 +56,7 @@ function count_line(count: number, repo: string, verdict: WipVerdict): string {
|
|
|
55
56
|
// The listing's JSON is an array of rows; anything else is unreadable rather than zero, because zero
|
|
56
57
|
// would pass every filing as within the cap.
|
|
57
58
|
function count_of(json: string): number | undefined {
|
|
58
|
-
|
|
59
|
-
const parsed: unknown = JSON.parse(json)
|
|
60
|
-
|
|
61
|
-
return Array.isArray(parsed) ? parsed.length : undefined
|
|
62
|
-
} catch {
|
|
63
|
-
return undefined
|
|
64
|
-
}
|
|
59
|
+
return json_value.parse_array(json)?.length
|
|
65
60
|
}
|
|
66
61
|
|
|
67
62
|
const issue_wip = { WIP_CAP, HELD, HELD_MESSAGE, UNREAD_MESSAGE, verdict_of, count_line, count_of }
|