@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,128 @@
|
|
|
1
|
+
import { FULL_PAGE_QUERY, git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
4
|
+
import { parse_json } from '#scripts/git/parse-json-array'
|
|
5
|
+
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
6
|
+
import { z } from 'zod'
|
|
7
|
+
import { defect_report, type OriginPr, type ReportIssue } from './defect-report'
|
|
8
|
+
import { defect_report_format } from './defect-report-format'
|
|
9
|
+
import { session_cite } from './session-cite'
|
|
10
|
+
|
|
11
|
+
const SUCCESS_EXIT_CODE = 0
|
|
12
|
+
const FAILURE_EXIT_CODE = 1
|
|
13
|
+
const PR_CONCURRENCY = 4
|
|
14
|
+
const USAGE = 'Usage: pnpm josh defect:report'
|
|
15
|
+
const UNREADABLE_MESSAGE =
|
|
16
|
+
'Could not read the bug issues from GitHub, so no report is printed — check `gh auth status`.'
|
|
17
|
+
|
|
18
|
+
const issue_schema = z.object({
|
|
19
|
+
number: z.number(),
|
|
20
|
+
created_at: z.string(),
|
|
21
|
+
body: z.string().nullish(),
|
|
22
|
+
pull_request: z.unknown().optional(),
|
|
23
|
+
})
|
|
24
|
+
const pull_schema = z.object({ merged_at: z.string().nullish() })
|
|
25
|
+
const file_schema = z.object({
|
|
26
|
+
filename: z.string(),
|
|
27
|
+
status: z.string(),
|
|
28
|
+
additions: z.number(),
|
|
29
|
+
deletions: z.number(),
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
// Every issue labelled `bug`, open or closed — the label `issue:file` derives from the declaration.
|
|
33
|
+
// The issues listing carries pull requests too, so those are dropped.
|
|
34
|
+
async function read_issues(repo: string): Promise<ReadonlyArray<ReportIssue> | undefined> {
|
|
35
|
+
const raw = await git_gh_exec.exec_gh_api({
|
|
36
|
+
path: `repos/${repo}/issues?labels=bug&state=all&per_page=100`,
|
|
37
|
+
should_paginate: true,
|
|
38
|
+
})
|
|
39
|
+
const issues = parse_json.parse_json_object_or_undefined(raw, z.array(issue_schema))
|
|
40
|
+
|
|
41
|
+
return issues
|
|
42
|
+
?.filter((issue) => issue.pull_request === undefined)
|
|
43
|
+
.map((issue) => ({
|
|
44
|
+
number: issue.number,
|
|
45
|
+
created_at: issue.created_at,
|
|
46
|
+
body: issue.body ?? '',
|
|
47
|
+
}))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function read_pr(repo: string, pr: number): Promise<OriginPr | undefined> {
|
|
51
|
+
const path = git_gh_api_path.pull_api_path(String(pr), repo)
|
|
52
|
+
const [pull_raw, files_raw] = await Promise.all([
|
|
53
|
+
git_gh_exec.exec_gh_api({ path }),
|
|
54
|
+
git_gh_exec.exec_gh_api({ path: `${path}/files${FULL_PAGE_QUERY}`, should_paginate: true }),
|
|
55
|
+
])
|
|
56
|
+
const pull = parse_json.parse_json_object_or_undefined(pull_raw, pull_schema)
|
|
57
|
+
const files = parse_json.parse_json_object_or_undefined(files_raw, z.array(file_schema))
|
|
58
|
+
|
|
59
|
+
if (pull === undefined || files === undefined) return undefined
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
pr,
|
|
63
|
+
merged_at: pull.merged_at ?? '',
|
|
64
|
+
kind: defect_report.change_kind(files),
|
|
65
|
+
areas: defect_report.areas(files),
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// A pull request that cannot be read contributes nothing, and the report counts it as unread.
|
|
70
|
+
async function read_pr_or_none(repo: string, pr: number): Promise<ReadonlyArray<OriginPr>> {
|
|
71
|
+
try {
|
|
72
|
+
const origin = await read_pr(repo, pr)
|
|
73
|
+
|
|
74
|
+
return origin === undefined ? [] : [origin]
|
|
75
|
+
} catch {
|
|
76
|
+
return []
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function read_prs(repo: string, prs: ReadonlyArray<number>): Promise<Map<number, OriginPr>> {
|
|
81
|
+
const read = await bounded_pool.bounded_map(
|
|
82
|
+
prs,
|
|
83
|
+
PR_CONCURRENCY,
|
|
84
|
+
async (pr) => await read_pr_or_none(repo, pr),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
return new Map(read.flat().map((origin) => [origin.pr, origin]))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function unreadable(): number {
|
|
91
|
+
console.error(UNREADABLE_MESSAGE)
|
|
92
|
+
|
|
93
|
+
return FAILURE_EXIT_CODE
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function report(repo: string): Promise<number> {
|
|
97
|
+
const issues = await read_issues(repo)
|
|
98
|
+
|
|
99
|
+
if (issues === undefined) return unreadable()
|
|
100
|
+
|
|
101
|
+
const prs = await read_prs(repo, defect_report.origin_prs(issues))
|
|
102
|
+
|
|
103
|
+
const aggregated = defect_report.aggregate(issues, prs)
|
|
104
|
+
|
|
105
|
+
console.info(session_cite.text(defect_report_format.format(aggregated)))
|
|
106
|
+
|
|
107
|
+
return SUCCESS_EXIT_CODE
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
111
|
+
if (argv.length > 0) {
|
|
112
|
+
console.error(USAGE)
|
|
113
|
+
|
|
114
|
+
return FAILURE_EXIT_CODE
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
const repo = await git_gh_command.repo_get_name_with_owner()
|
|
119
|
+
|
|
120
|
+
return repo === undefined ? unreadable() : await report(repo)
|
|
121
|
+
} catch {
|
|
122
|
+
return unreadable()
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const defect_report_cli = { run }
|
|
127
|
+
|
|
128
|
+
export { defect_report_cli }
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { defect_report, type DefectReport } from './defect-report'
|
|
2
|
+
import { issue_cite } from './issue-cite'
|
|
3
|
+
|
|
4
|
+
// The printed `defect:report`: each grouping as a table of counts, largest first.
|
|
5
|
+
|
|
6
|
+
const INDENT = ' '
|
|
7
|
+
const NONE = `${INDENT}(none)`
|
|
8
|
+
|
|
9
|
+
function sorted_rows<K>(counts: ReadonlyMap<K, number>, label: (key: K) => string): Array<string> {
|
|
10
|
+
return [...counts]
|
|
11
|
+
.toSorted((left, right) => right[1] - left[1])
|
|
12
|
+
.map(([key, count]) => `${INDENT}${label(key)} ${String(count)}`)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function section<K>(
|
|
16
|
+
title: string,
|
|
17
|
+
counts: ReadonlyMap<K, number>,
|
|
18
|
+
label: (key: K) => string,
|
|
19
|
+
): Array<string> {
|
|
20
|
+
const rows = sorted_rows(counts, label)
|
|
21
|
+
|
|
22
|
+
return [title, ...(rows.length === 0 ? [NONE] : rows)]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function pr_label(pr: number): string {
|
|
26
|
+
return issue_cite.plain(pr)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function summary(report: DefectReport): string {
|
|
30
|
+
let traced = 0
|
|
31
|
+
|
|
32
|
+
for (const count of report.by_pr.values()) traced += count
|
|
33
|
+
const parts = [
|
|
34
|
+
`traced to a pull request: ${String(traced)}`,
|
|
35
|
+
`不明: ${String(report.unknown)}`,
|
|
36
|
+
`no origin line: ${String(report.undeclared)}`,
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
return `defects by origin — ${parts.join(' · ')}`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function format(report: DefectReport): string {
|
|
43
|
+
const week = `pull requests that added a mechanism — defects filed within ${String(defect_report.WEEK_DAYS)} days of the merge:`
|
|
44
|
+
|
|
45
|
+
return [
|
|
46
|
+
summary(report),
|
|
47
|
+
...section('by pull request:', report.by_pr, pr_label),
|
|
48
|
+
...section('by change kind (add / fix / remove):', report.by_kind, String),
|
|
49
|
+
...section('by area:', report.by_area, String),
|
|
50
|
+
...section(week, report.added_within_week, pr_label),
|
|
51
|
+
].join('\n')
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const defect_report_format = { format }
|
|
55
|
+
|
|
56
|
+
export { defect_report_format }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { defect_report_cli } from './defect-report-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh defect:report` entry, kept apart from `defect-report-cli.ts` so a bundle carrying that
|
|
6
|
+
// module never fires this guard (joshuafolkken/kit#4186).
|
|
7
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
8
|
+
const ARGV_OFFSET = 2
|
|
9
|
+
|
|
10
|
+
process.exitCode = await defect_report_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
11
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { defect_origin_line } from './defect-origin-line'
|
|
2
|
+
|
|
3
|
+
// Defects grouped by the pull request each one's origin line names: how many per pull request, per
|
|
4
|
+
// change kind, and per area of the tree it touched, plus how many each pull request that added a
|
|
5
|
+
// mechanism drew within a week of merging. Read from the bodies and the pull requests' files only,
|
|
6
|
+
// so nothing here asks for a judgement.
|
|
7
|
+
|
|
8
|
+
const WEEK_DAYS = 7
|
|
9
|
+
const MS_PER_DAY = 86_400_000
|
|
10
|
+
const WEEK_MS = WEEK_DAYS * MS_PER_DAY
|
|
11
|
+
const SCRIPTS_ROOT = 'scripts'
|
|
12
|
+
// `scripts/<dir>` — the two leading segments of a path under `scripts/`.
|
|
13
|
+
const SCRIPT_AREA_DEPTH = 2
|
|
14
|
+
const ROOT_AREA = '(root)'
|
|
15
|
+
const UNREAD_AREA = '(pull request not read)'
|
|
16
|
+
const TEST_FILE = /\.(?:test|e2e)\.ts$|\.snap$/u
|
|
17
|
+
// The run's own records — observations, accepted metrics — which nearly every merge adds, so they
|
|
18
|
+
// say nothing about what the pull request changed.
|
|
19
|
+
const RUN_RECORD_ROOT = '.josh/'
|
|
20
|
+
|
|
21
|
+
type ChangeKind = 'add' | 'fix' | 'remove'
|
|
22
|
+
|
|
23
|
+
interface ReportIssue {
|
|
24
|
+
number: number
|
|
25
|
+
created_at: string
|
|
26
|
+
body: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface PrFile {
|
|
30
|
+
filename: string
|
|
31
|
+
status: string
|
|
32
|
+
additions: number
|
|
33
|
+
deletions: number
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface OriginPr {
|
|
37
|
+
pr: number
|
|
38
|
+
merged_at: string
|
|
39
|
+
kind: ChangeKind
|
|
40
|
+
areas: ReadonlyArray<string>
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface Attributed {
|
|
44
|
+
issue: ReportIssue
|
|
45
|
+
pr: number
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface DefectReport {
|
|
49
|
+
by_pr: ReadonlyMap<number, number>
|
|
50
|
+
by_kind: ReadonlyMap<string, number>
|
|
51
|
+
by_area: ReadonlyMap<string, number>
|
|
52
|
+
unknown: number
|
|
53
|
+
undeclared: number
|
|
54
|
+
added_within_week: ReadonlyMap<number, number>
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function changed(files: ReadonlyArray<PrFile>): ReadonlyArray<PrFile> {
|
|
58
|
+
return files.filter((file) => !file.filename.startsWith(RUN_RECORD_ROOT))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A pull request that brought in a new non-test file added a mechanism; one that took out more than it
|
|
62
|
+
// put in removed; anything else changed what was there.
|
|
63
|
+
function change_kind(files: ReadonlyArray<PrFile>): ChangeKind {
|
|
64
|
+
const source = changed(files).filter((file) => !TEST_FILE.test(file.filename))
|
|
65
|
+
|
|
66
|
+
if (source.some((file) => file.status === 'added')) return 'add'
|
|
67
|
+
|
|
68
|
+
const added = source.reduce((sum, file) => sum + file.additions, 0)
|
|
69
|
+
const removed = source.reduce((sum, file) => sum + file.deletions, 0)
|
|
70
|
+
|
|
71
|
+
return removed > added ? 'remove' : 'fix'
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// `scripts/<dir>` for a script, the top-level directory otherwise, and one bucket for root files.
|
|
75
|
+
function area_of(filename: string): string {
|
|
76
|
+
const segments = filename.split('/')
|
|
77
|
+
|
|
78
|
+
if (segments.length === 1) return ROOT_AREA
|
|
79
|
+
|
|
80
|
+
const is_script = segments[0] === SCRIPTS_ROOT && segments.length > SCRIPT_AREA_DEPTH
|
|
81
|
+
const depth = is_script ? SCRIPT_AREA_DEPTH : 1
|
|
82
|
+
|
|
83
|
+
return segments.slice(0, depth).join('/')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function areas(files: ReadonlyArray<PrFile>): ReadonlyArray<string> {
|
|
87
|
+
return [...new Set(changed(files).map((file) => area_of(file.filename)))]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function increment<K>(counts: Map<K, number>, key: K): void {
|
|
91
|
+
counts.set(key, (counts.get(key) ?? 0) + 1)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function count_by<K>(
|
|
95
|
+
items: ReadonlyArray<Attributed>,
|
|
96
|
+
keys: (item: Attributed) => ReadonlyArray<K>,
|
|
97
|
+
): Map<K, number> {
|
|
98
|
+
const counts = new Map<K, number>()
|
|
99
|
+
|
|
100
|
+
for (const item of items) for (const key of keys(item)) increment(counts, key)
|
|
101
|
+
|
|
102
|
+
return counts
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function within_week(issue: ReportIssue, origin: OriginPr): boolean {
|
|
106
|
+
const elapsed = Date.parse(issue.created_at) - Date.parse(origin.merged_at)
|
|
107
|
+
|
|
108
|
+
return elapsed >= 0 && elapsed <= WEEK_MS
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function attribute(issue: ReportIssue): Attributed | undefined {
|
|
112
|
+
const origin = defect_origin_line.parse(issue.body)
|
|
113
|
+
|
|
114
|
+
return origin?.kind === 'pr' ? { issue, pr: origin.pr } : undefined
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function attributed(issues: ReadonlyArray<ReportIssue>): ReadonlyArray<Attributed> {
|
|
118
|
+
return issues.map((issue) => attribute(issue)).filter((item) => item !== undefined)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Every pull request an origin line names, once — what the report has to read.
|
|
122
|
+
function origin_prs(issues: ReadonlyArray<ReportIssue>): ReadonlyArray<number> {
|
|
123
|
+
return [...new Set(attributed(issues).map(({ pr }) => pr))]
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function soon_after_adding(
|
|
127
|
+
items: ReadonlyArray<Attributed>,
|
|
128
|
+
prs: ReadonlyMap<number, OriginPr>,
|
|
129
|
+
): Map<number, number> {
|
|
130
|
+
return count_by(items, ({ issue, pr }) => {
|
|
131
|
+
const origin = prs.get(pr)
|
|
132
|
+
|
|
133
|
+
return origin?.kind === 'add' && within_week(issue, origin) ? [pr] : []
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function count_origins(issues: ReadonlyArray<ReportIssue>, kind: 'unknown' | undefined): number {
|
|
138
|
+
return issues.filter((issue) => defect_origin_line.parse(issue.body)?.kind === kind).length
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function aggregate(
|
|
142
|
+
issues: ReadonlyArray<ReportIssue>,
|
|
143
|
+
prs: ReadonlyMap<number, OriginPr>,
|
|
144
|
+
): DefectReport {
|
|
145
|
+
const items = attributed(issues)
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
by_pr: count_by(items, ({ pr }) => [pr]),
|
|
149
|
+
by_kind: count_by(items, ({ pr }) => [prs.get(pr)?.kind ?? UNREAD_AREA]),
|
|
150
|
+
by_area: count_by(items, ({ pr }) => prs.get(pr)?.areas ?? [UNREAD_AREA]),
|
|
151
|
+
unknown: count_origins(issues, 'unknown'),
|
|
152
|
+
undeclared: count_origins(issues, undefined),
|
|
153
|
+
added_within_week: soon_after_adding(items, prs),
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const defect_report = { aggregate, area_of, areas, change_kind, origin_prs, WEEK_DAYS }
|
|
158
|
+
|
|
159
|
+
export type { ChangeKind, DefectReport, OriginPr, PrFile, ReportIssue }
|
|
160
|
+
export { defect_report }
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { markdown_section } from './markdown-section'
|
|
2
|
+
|
|
3
|
+
// joshuafolkken/kit#3909: a run-time-shortening proposal was filed and implemented on a criterion that
|
|
4
|
+
// never weighed how often the speed-up applies against what it costs when it does not. An Issue that
|
|
5
|
+
// declares that aim must therefore state its expected effect — the hit rate, the gain per hit, the loss
|
|
6
|
+
// per miss and where each number came from — before `issue:lint` and `issue:file` accept it. The
|
|
7
|
+
// declaration, the heading and the item labels are the template's, pinned by the document test.
|
|
8
|
+
|
|
9
|
+
const DECLARATION_LINE = '- 目的: 時間短縮'
|
|
10
|
+
const BACKGROUND_HEADING = '## 背景'
|
|
11
|
+
const HEADING = '## 期待効果'
|
|
12
|
+
const ITEM_LABELS: ReadonlyArray<string> = ['効く率', '1 回あたりの得', '外れたときの損', '出典']
|
|
13
|
+
// A template placeholder value — the `<...>` guidance a filed Issue replaces. It is not an estimate, but a
|
|
14
|
+
// value that only opens with `<` (an upper bound such as `<1 min`) is one, so the placeholder must close with `>` too.
|
|
15
|
+
const PLACEHOLDER = /^<.*>$/u
|
|
16
|
+
|
|
17
|
+
// Whether the body declares a run-time-shortening aim under its background heading.
|
|
18
|
+
function is_target(body: string): boolean {
|
|
19
|
+
const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
|
|
20
|
+
|
|
21
|
+
return markdown_section.has_unfenced_line(background, DECLARATION_LINE)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function item_value(line: string, label: string): string | undefined {
|
|
25
|
+
const prefix = `- ${label}:`
|
|
26
|
+
|
|
27
|
+
if (!line.startsWith(prefix)) return undefined
|
|
28
|
+
|
|
29
|
+
return line.slice(prefix.length).trim()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function has_item(lines: ReadonlyArray<string>, label: string): boolean {
|
|
33
|
+
return lines.some((line) => {
|
|
34
|
+
const value = item_value(line.trim(), label)
|
|
35
|
+
|
|
36
|
+
return value !== undefined && value.length > 0 && !PLACEHOLDER.test(value)
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Every expected-effect problem a body has, or an empty array. A body without the declaration has none.
|
|
41
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
42
|
+
if (!is_target(body)) return []
|
|
43
|
+
if (!markdown_section.has_line(body, HEADING)) return [`missing heading: ${HEADING}`]
|
|
44
|
+
const section = markdown_section.section_lines(body, HEADING).join('\n')
|
|
45
|
+
const lines = markdown_section.unfenced_lines(section)
|
|
46
|
+
|
|
47
|
+
return ITEM_LABELS.filter((label) => !has_item(lines, label)).map(
|
|
48
|
+
(label) => `missing expected-effect item: - ${label}: <value>`,
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const expected_effect_lint = {
|
|
53
|
+
DECLARATION_LINE,
|
|
54
|
+
HEADING,
|
|
55
|
+
ITEM_LABELS,
|
|
56
|
+
is_target,
|
|
57
|
+
problems,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export { expected_effect_lint }
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
|
+
import { issue_evidence_exit } from '#scripts/issue/issue-evidence-exit'
|
|
5
|
+
import { ALREADY_DONE_LABEL } from '#scripts/issue/issue-labels'
|
|
6
|
+
import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
|
|
7
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
|
+
|
|
9
|
+
// `josh issue:already-done <N> --evidence-file <path>` — the exit for an Issue whose work is already
|
|
10
|
+
// merged (`issue-comments.md` → "When the work turns out to be already merged"): the evidence
|
|
11
|
+
// comment, the `already-done` label and the `run:release`, in that order (`issue-evidence-exit.ts`).
|
|
12
|
+
//
|
|
13
|
+
// The label is provisioned by `josh start`, so nothing here creates it.
|
|
14
|
+
// **The Issue is never closed**: closing is a person's (Tier C), and the label is the run's exit.
|
|
15
|
+
//
|
|
16
|
+
// **A follow-up measurement is refused before anything is written** (joshuafolkken/kit#4504): its body
|
|
17
|
+
// declares the sample wait (`issue_sample_gate.DECLARATION`, read as `not-before` reads it), and its
|
|
18
|
+
// exit is `josh issue:measured`, which closes it — this one would leave it OPEN and the lane parked.
|
|
19
|
+
|
|
20
|
+
const ARGV_OFFSET = 2
|
|
21
|
+
|
|
22
|
+
function refusal_of(issue_number: string, body: string | undefined): string | undefined {
|
|
23
|
+
const cite = session_cite.issue(issue_number)
|
|
24
|
+
if (body === undefined) return `Issue ${cite} body not read; nothing written`
|
|
25
|
+
if (issue_sample_gate.cited_number(body) === undefined) return undefined
|
|
26
|
+
|
|
27
|
+
return `Issue ${cite} is a follow-up measurement (\`${issue_sample_gate.DECLARATION}\`): run \`josh issue:measured ${issue_number} --evidence-file <path>\` instead; nothing written`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function admit(issue_number: string): Promise<boolean> {
|
|
31
|
+
const refusal = refusal_of(issue_number, await git_gh_command.issue_get_body(issue_number))
|
|
32
|
+
|
|
33
|
+
if (refusal !== undefined) console.error(refusal)
|
|
34
|
+
|
|
35
|
+
return refusal === undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function apply_label(issue_number: string): Promise<boolean> {
|
|
39
|
+
const write = await git_gh_command.issue_apply_label(issue_number, ALREADY_DONE_LABEL)
|
|
40
|
+
|
|
41
|
+
if (!write.is_applied) console.error(`${ALREADY_DONE_LABEL} not applied: ${write.reason}`)
|
|
42
|
+
|
|
43
|
+
return write.is_applied
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
47
|
+
return await issue_evidence_exit.run(argv, {
|
|
48
|
+
command: 'issue:already-done',
|
|
49
|
+
finish: apply_label,
|
|
50
|
+
admit,
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
55
|
+
process.exitCode = await run(argv)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const issue_already_done_cli = { run }
|
|
59
|
+
|
|
60
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
61
|
+
|
|
62
|
+
export { issue_already_done_cli }
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
|
|
3
|
+
// One text written to an issue: **into the body when the body is blank, as a comment otherwise.**
|
|
4
|
+
// Two writers make this decision — `followup`'s completion notice and `issue:plan`'s plan — and a copy
|
|
5
|
+
// per caller is how the two would come to disagree about what "blank" means.
|
|
6
|
+
//
|
|
7
|
+
// A body that could not be read is not blank: overwriting a body nobody saw could erase a person's
|
|
8
|
+
// text, so an unreadable body falls to a comment, which loses nothing.
|
|
9
|
+
|
|
10
|
+
type Destination = 'body' | 'comment'
|
|
11
|
+
|
|
12
|
+
interface PostOutcome {
|
|
13
|
+
destination: Destination
|
|
14
|
+
url: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function is_blank_body(body: string | undefined): boolean {
|
|
18
|
+
return body?.trim().length === 0
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// `repo` (`owner/name`) addresses an issue in another repository; left out, the checkout's own.
|
|
22
|
+
async function post(issue_number: string, text: string, repo?: string): Promise<PostOutcome> {
|
|
23
|
+
const current_body = await git_gh_command.issue_get_body(issue_number, repo)
|
|
24
|
+
|
|
25
|
+
if (is_blank_body(current_body)) {
|
|
26
|
+
const url = await git_gh_command.issue_edit_body(issue_number, text, repo)
|
|
27
|
+
|
|
28
|
+
return { destination: 'body', url }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
destination: 'comment',
|
|
33
|
+
url: await git_gh_command.issue_comment(issue_number, text, repo),
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const issue_body_or_comment = { post }
|
|
38
|
+
|
|
39
|
+
export { issue_body_or_comment }
|
|
40
|
+
export type { Destination, PostOutcome }
|
|
@@ -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 { IssueRead } from '#scripts/gh/git-gh-issue-read'
|
|
5
3
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
@@ -24,7 +22,6 @@ import { issue_cite, type CiteTarget } from './issue-cite'
|
|
|
24
22
|
|
|
25
23
|
const SUCCESS_EXIT_CODE = 0
|
|
26
24
|
const FAILURE_EXIT_CODE = 1
|
|
27
|
-
const ARGV_OFFSET = 2
|
|
28
25
|
// The same bound `issue:read` puts on its batch read: every read is a `gh` process, and an unbounded
|
|
29
26
|
// fan-out is answered with secondary rate limiting rather than with titles.
|
|
30
27
|
const READ_CONCURRENCY = 8
|
|
@@ -101,16 +98,26 @@ async function local_slug_for(targets: ReadonlyArray<CiteTarget>): Promise<strin
|
|
|
101
98
|
return has_bare_target ? await git_gh_command.repo_get_name_with_owner() : undefined
|
|
102
99
|
}
|
|
103
100
|
|
|
101
|
+
// The citation lines and the failure lines of one invocation, apart.
|
|
102
|
+
interface CiteReport {
|
|
103
|
+
lines: ReadonlyArray<string>
|
|
104
|
+
failures: ReadonlyArray<string>
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function split_results(results: ReadonlyArray<LineResult>): CiteReport {
|
|
108
|
+
return {
|
|
109
|
+
lines: results.filter((result) => result.kind === 'ok').map((result) => result.line),
|
|
110
|
+
failures: results.filter((result) => result.kind === 'fail').map((result) => result.line),
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
104
114
|
// Citations to stdout so the block stays paste-ready; failures to stderr so each unanswered number is
|
|
105
115
|
// named without landing in what gets pasted. A failure sets a non-zero exit.
|
|
106
|
-
function report(
|
|
107
|
-
|
|
108
|
-
const
|
|
116
|
+
function report(cited: CiteReport): number {
|
|
117
|
+
if (cited.lines.length > 0) console.info(cited.lines.join(LINE_SEPARATOR))
|
|
118
|
+
for (const failure of cited.failures) console.error(failure)
|
|
109
119
|
|
|
110
|
-
|
|
111
|
-
for (const failure of failures) console.error(failure)
|
|
112
|
-
|
|
113
|
-
return failures.length === 0 ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
120
|
+
return cited.failures.length === 0 ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
114
121
|
}
|
|
115
122
|
|
|
116
123
|
// The targets the command line names, or `undefined` for a line nobody can read — an unknown flag and
|
|
@@ -122,14 +129,11 @@ function read_targets(args: ReadonlyArray<string>): ReadonlyArray<CiteTarget> |
|
|
|
122
129
|
return parse_targets(parsed.positionals, parsed.values.repo)
|
|
123
130
|
}
|
|
124
131
|
|
|
125
|
-
|
|
132
|
+
// The lines `issue:cite` prints for `args`, without printing them — the `Stop` hook shows them itself
|
|
133
|
+
// (`stop-actions.ts`). `undefined` for a line nobody can read.
|
|
134
|
+
async function cite(args: ReadonlyArray<string>): Promise<CiteReport | undefined> {
|
|
126
135
|
const targets = read_targets(args)
|
|
127
|
-
|
|
128
|
-
if (targets === undefined) {
|
|
129
|
-
console.error(USAGE)
|
|
130
|
-
|
|
131
|
-
return FAILURE_EXIT_CODE
|
|
132
|
-
}
|
|
136
|
+
if (targets === undefined) return undefined
|
|
133
137
|
|
|
134
138
|
const local_slug = await local_slug_for(targets)
|
|
135
139
|
const results = await bounded_pool.bounded_map(
|
|
@@ -138,19 +142,26 @@ async function run(args: ReadonlyArray<string>): Promise<number> {
|
|
|
138
142
|
async (target) => await cite_target(target, local_slug),
|
|
139
143
|
)
|
|
140
144
|
|
|
141
|
-
return
|
|
145
|
+
return split_results(results)
|
|
142
146
|
}
|
|
143
147
|
|
|
144
|
-
async function
|
|
145
|
-
|
|
148
|
+
async function run(args: ReadonlyArray<string>): Promise<number> {
|
|
149
|
+
const cited = await cite(args)
|
|
150
|
+
|
|
151
|
+
if (cited === undefined) {
|
|
152
|
+
console.error(USAGE)
|
|
153
|
+
|
|
154
|
+
return FAILURE_EXIT_CODE
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return report(cited)
|
|
146
158
|
}
|
|
147
159
|
|
|
148
160
|
const issue_cite_cli = {
|
|
149
161
|
USAGE,
|
|
162
|
+
cite,
|
|
150
163
|
parse_targets,
|
|
151
164
|
run,
|
|
152
165
|
}
|
|
153
166
|
|
|
154
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
155
|
-
|
|
156
167
|
export { issue_cite_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_cite_cli } from './issue-cite-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:cite` entry, kept apart from `issue-cite-cli.ts` because other modules import that
|
|
6
|
+
// 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_cite_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { defect_origin_line } from './defect-origin-line'
|
|
1
2
|
import { issue_bug_label } from './issue-bug-label'
|
|
2
3
|
import { BREAKING_CHANGE_LABEL, BUG_LABEL, ENHANCEMENT_LABEL, has_label_name } from './issue-labels'
|
|
3
4
|
import { markdown_section } from './markdown-section'
|
|
4
5
|
|
|
5
|
-
const FEATURE_DECLARATIONS = ['- 目的: 機能追加', '- 目的: 機能改善']
|
|
6
|
+
const FEATURE_DECLARATIONS = ['- 目的: 機能追加', '- 目的: 機能改善', '- 目的: 時間短縮']
|
|
6
7
|
const BREAKING_DECLARATION = '- 互換性: 破壊的変更'
|
|
7
8
|
const NON_BUG_DECLARATION = '- 種別: 非不具合'
|
|
8
9
|
const CLASSIFICATION_LABELS = [BUG_LABEL, ENHANCEMENT_LABEL, BREAKING_CHANGE_LABEL]
|
|
@@ -44,16 +45,20 @@ function bug_classification_problem(body: string): string | undefined {
|
|
|
44
45
|
return undefined
|
|
45
46
|
}
|
|
46
47
|
|
|
47
|
-
function
|
|
48
|
-
const classification_problem = bug_classification_problem(body)
|
|
49
|
-
const found: Array<string> = []
|
|
50
|
-
|
|
51
|
-
if (classification_problem !== undefined) found.push(classification_problem)
|
|
48
|
+
function label_conflict(body: string): string | undefined {
|
|
52
49
|
const labels = required_labels(body)
|
|
53
50
|
|
|
54
|
-
|
|
51
|
+
return labels.includes(BUG_LABEL) && labels.includes(ENHANCEMENT_LABEL) ? CONFLICT : undefined
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
55
|
+
const found = [
|
|
56
|
+
bug_classification_problem(body),
|
|
57
|
+
label_conflict(body),
|
|
58
|
+
defect_origin_line.problem(body),
|
|
59
|
+
]
|
|
55
60
|
|
|
56
|
-
return found
|
|
61
|
+
return found.filter((problem) => problem !== undefined)
|
|
57
62
|
}
|
|
58
63
|
|
|
59
64
|
const issue_classification = {
|