@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
2
2
|
import { file_map_stamp, type FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
3
|
+
import { removed_tests } from './removed-tests'
|
|
3
4
|
import { review_checkout, type ReviewCheckout } from './review-checkout'
|
|
4
5
|
import { review_diff_parts, type DiffParts } from './review-diff-parts'
|
|
6
|
+
import { review_interaction } from './review-interaction'
|
|
7
|
+
import { review_untouched_readers, type ReadersRead } from './review-untouched-readers'
|
|
5
8
|
|
|
6
9
|
// The text `josh review:brief` prints — the `/code-review` invocation, composed from what the run
|
|
7
10
|
// already knows.
|
|
@@ -414,6 +417,14 @@ interface BriefInput {
|
|
|
414
417
|
// The change written as parts under the Bash output cap. Absent when the
|
|
415
418
|
// write failed, and the target line alone then names the change.
|
|
416
419
|
diff?: { parts: DiffParts; cap: number } | undefined
|
|
420
|
+
// The tests the change removes, listed for the reviewer to account for. Absent or empty, no section.
|
|
421
|
+
removed_tests?: ReadonlyArray<string> | undefined
|
|
422
|
+
// The run-tooling paths an interaction review is briefed on (joshuafolkken/kit#4276). Absent, the
|
|
423
|
+
// brief is `/code-review`'s alone.
|
|
424
|
+
interaction?: ReadonlyArray<string> | undefined
|
|
425
|
+
// The readers outside the diff of each exported name it edits (joshuafolkken/kit#4515). A failed
|
|
426
|
+
// read is printed as one; absent or empty, no section.
|
|
427
|
+
readers?: ReadersRead | undefined
|
|
417
428
|
}
|
|
418
429
|
|
|
419
430
|
const SECOND_ROUND = 2
|
|
@@ -437,16 +448,30 @@ function target_block(input: BriefInput): string {
|
|
|
437
448
|
// code that narrowing exists to keep out of scope. Decided by the target actually printed, not by
|
|
438
449
|
// the round: every round that cannot narrow widens through `whole_change_target`, and that round
|
|
439
450
|
// needs the parts as much as a first one does.
|
|
440
|
-
function
|
|
441
|
-
|
|
451
|
+
function is_whole_change(input: BriefInput, target: string): boolean {
|
|
452
|
+
return target.includes(whole_change_target(input.checkout.root, input.base))
|
|
453
|
+
}
|
|
442
454
|
|
|
443
|
-
|
|
455
|
+
function diff_block(input: BriefInput, target: string): ReadonlyArray<string> {
|
|
456
|
+
if (!is_whole_change(input, target) || input.diff === undefined) return []
|
|
444
457
|
|
|
445
458
|
return ['', review_diff_parts.reading_block(input.diff.parts, input.diff.cap)]
|
|
446
459
|
}
|
|
447
460
|
|
|
461
|
+
// Beside a whole-change target only, for the reason `diff_block` gives: a narrowed round keeps the
|
|
462
|
+
// rest of the change, and so its readers, out of scope.
|
|
463
|
+
function readers_block(input: BriefInput, target: string): ReadonlyArray<string> {
|
|
464
|
+
if (!is_whole_change(input, target)) return []
|
|
465
|
+
|
|
466
|
+
return review_untouched_readers.brief_block(input.readers)
|
|
467
|
+
}
|
|
468
|
+
|
|
448
469
|
// The level alone on the first line, because the level-only mode's contract — a caller reading the
|
|
449
470
|
// answer with `$(...)` — is the one thing a brief must not break.
|
|
471
|
+
function interaction_block(targets: ReadonlyArray<string> | undefined): ReadonlyArray<string> {
|
|
472
|
+
return targets === undefined ? [] : ['', review_interaction.brief_block(targets)]
|
|
473
|
+
}
|
|
474
|
+
|
|
450
475
|
function compose(input: BriefInput): string {
|
|
451
476
|
const profile = input.profile ?? agent_role_profile.DEFAULT_PROFILES.reviewer
|
|
452
477
|
const target = target_block(input)
|
|
@@ -465,6 +490,9 @@ function compose(input: BriefInput): string {
|
|
|
465
490
|
'',
|
|
466
491
|
target,
|
|
467
492
|
...diff_block(input, target),
|
|
493
|
+
...readers_block(input, target),
|
|
494
|
+
...removed_tests.brief_block(input.removed_tests ?? []),
|
|
495
|
+
...interaction_block(input.interaction),
|
|
468
496
|
].join('\n')
|
|
469
497
|
}
|
|
470
498
|
|
|
@@ -4,6 +4,7 @@ import path from 'node:path'
|
|
|
4
4
|
import { git_command } from '#scripts/git/git-command'
|
|
5
5
|
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
6
6
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
7
8
|
import { comment_ranges, type TypeScriptApi } from './comment-ranges'
|
|
8
9
|
import { review_stamps } from './review-stamps'
|
|
9
10
|
|
|
@@ -26,7 +27,6 @@ const SCRIPT_EXTENSIONS: ReadonlyArray<string> = ['.ts', '.js']
|
|
|
26
27
|
const SVELTE_EXTENSION = '.svelte'
|
|
27
28
|
const EXCLUDED_PREFIX = '.claude/'
|
|
28
29
|
const TYPESCRIPT_MODULE = 'typescript'
|
|
29
|
-
const PACKAGE_JSON = 'package.json'
|
|
30
30
|
|
|
31
31
|
function is_svelte(relative: string): boolean {
|
|
32
32
|
return relative.endsWith(SVELTE_EXTENSION)
|
|
@@ -100,20 +100,24 @@ async function record(
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
// The paths whose code round 1's fixes left as it was — whose difference, if any, is in comments.
|
|
103
|
-
//
|
|
104
|
-
//
|
|
103
|
+
// Against a record taken on another base only `unmoved` qualifies — the paths the move left alone
|
|
104
|
+
// (`review_round_one_blobs.unmoved`), where the carried file is round 1's own and equal code digests
|
|
105
|
+
// still mean a comment-only fix (joshuafolkken/kit#4165).
|
|
105
106
|
function comment_only(
|
|
106
107
|
snapshot: FileMapStamp | undefined,
|
|
107
108
|
tree: Record<string, string>,
|
|
108
109
|
base: string | undefined,
|
|
110
|
+
unmoved: ReadonlyArray<string> = [],
|
|
109
111
|
): ReadonlyArray<string> {
|
|
110
|
-
if (snapshot === undefined || base === undefined
|
|
112
|
+
if (snapshot === undefined || base === undefined) return []
|
|
113
|
+
const is_same_base = snapshot.base === base
|
|
111
114
|
|
|
112
115
|
return Object.keys(snapshot.files).filter(
|
|
113
|
-
(relative) =>
|
|
116
|
+
(relative) =>
|
|
117
|
+
snapshot.files[relative] === tree[relative] && (is_same_base || unmoved.includes(relative)),
|
|
114
118
|
)
|
|
115
119
|
}
|
|
116
120
|
|
|
117
|
-
const review_code_tree = { comment_only, read, record, tree_of }
|
|
121
|
+
const review_code_tree = { comment_only, load_typescript, read, record, tree_of }
|
|
118
122
|
|
|
119
123
|
export { review_code_tree }
|
|
@@ -33,12 +33,14 @@ const PER_PAGE = '100'
|
|
|
33
33
|
const UNNAMED_REPOSITORY = 'Could not name this repository from `git remote`.'
|
|
34
34
|
const UNREAD_SEARCH = 'Could not read the search for closed issues with a comment round.'
|
|
35
35
|
const UNREAD_COMMENTS = 'Could not read the comments of'
|
|
36
|
+
const UNREAD_PERMISSION = 'Could not read the write permission of'
|
|
36
37
|
|
|
37
38
|
const search_item_schema = z.object({ number: z.number() })
|
|
38
39
|
const search_schema = z.object({ items: z.array(search_item_schema) })
|
|
39
40
|
const comment_schema = z.object({
|
|
40
41
|
body: z.string().nullish(),
|
|
41
42
|
author_association: z.string().nullish(),
|
|
43
|
+
user: z.looseObject({ login: z.string() }).nullish(),
|
|
42
44
|
})
|
|
43
45
|
|
|
44
46
|
type IssueComment = z.infer<typeof comment_schema>
|
|
@@ -50,13 +52,29 @@ function body_of(lines: ReadonlyArray<string>): string {
|
|
|
50
52
|
// The ledger lines of every comment round among one issue's comments, oldest first; any other
|
|
51
53
|
// comment, one that only quotes the heading among them, carries none — nor does one whose author
|
|
52
54
|
// cannot write to the repository: anyone can comment on a public issue, and the carried lines ride
|
|
53
|
-
// the run's commit unreviewed.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
// the run's commit unreviewed. A permission lookup that failed throws instead: the carried file is
|
|
56
|
+
// written once, so a round dropped on a transient failure would never be carried.
|
|
57
|
+
async function is_trusted_comment(comment: IssueComment): Promise<boolean> {
|
|
58
|
+
const login = comment.user?.login
|
|
59
|
+
const is_trusted = await gh_author_association.trust_of({
|
|
60
|
+
login,
|
|
61
|
+
association: comment.author_association,
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
if (is_trusted === undefined) throw new Error(`${UNREAD_PERMISSION} ${login ?? ''}`)
|
|
65
|
+
|
|
66
|
+
return is_trusted
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function lines_of(comments: ReadonlyArray<IssueComment>): Promise<Array<string>> {
|
|
70
|
+
const rounds = comments.filter((comment) => (comment.body ?? '').startsWith(COMMENT_HEADING))
|
|
71
|
+
const trusted = await Promise.all(
|
|
72
|
+
rounds.map(async (comment) => await is_trusted_comment(comment)),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return rounds
|
|
76
|
+
.filter((_comment, index) => trusted[index] === true)
|
|
77
|
+
.flatMap((comment) => (comment.body ?? '').split('\n'))
|
|
60
78
|
.filter((line) => review_finding_ledger.is_finding_line(line))
|
|
61
79
|
}
|
|
62
80
|
|
|
@@ -93,7 +111,7 @@ async function carry_issue(issue: number, root: string): Promise<number> {
|
|
|
93
111
|
|
|
94
112
|
if (raw === undefined) throw new Error(`${UNREAD_COMMENTS} ${session_cite.issue(issue)}`)
|
|
95
113
|
|
|
96
|
-
const lines = lines_of(parse_json_array_safe(raw, comment_schema))
|
|
114
|
+
const lines = await lines_of(parse_json_array_safe(raw, comment_schema))
|
|
97
115
|
|
|
98
116
|
await observation_ledger_home.append(carried_path(issue, root), lines)
|
|
99
117
|
|
|
@@ -7,7 +7,10 @@ import { issue_cite } from '#scripts/issue/issue-cite'
|
|
|
7
7
|
// prefix so `observation-ledger-line.ts`'s `- k:` grammar never treats them as its own — one ledger,
|
|
8
8
|
// one commit path, a second line *type* rather than a second ledger.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
// **The interaction review writes the same grammar under its own prefix** (joshuafolkken/kit#4276), so
|
|
11
|
+
// its round is told apart from `/code-review`'s by the merge gate, and its findings stay out of the
|
|
12
|
+
// `/code-review` tally a reader compares rounds by.
|
|
13
|
+
const PREFIX = { code: '- rf:', interaction: '- ri:' } as const
|
|
11
14
|
const FIELD_SEPARATOR = ' | '
|
|
12
15
|
const FIELD_COUNT = 5
|
|
13
16
|
|
|
@@ -34,6 +37,7 @@ const NO_FILE = '-'
|
|
|
34
37
|
|
|
35
38
|
type Category = (typeof CATEGORIES)[number]
|
|
36
39
|
type Severity = (typeof SEVERITIES)[number]
|
|
40
|
+
type LineKind = keyof typeof PREFIX
|
|
37
41
|
|
|
38
42
|
interface Finding {
|
|
39
43
|
category: Category
|
|
@@ -65,27 +69,36 @@ function issue_field(issue: number): string {
|
|
|
65
69
|
return issue_cite.plain(issue)
|
|
66
70
|
}
|
|
67
71
|
|
|
68
|
-
function line_of(fields: ReadonlyArray<string
|
|
69
|
-
return `${
|
|
72
|
+
function line_of(fields: ReadonlyArray<string>, kind: LineKind): string {
|
|
73
|
+
return `${PREFIX[kind]}${fields.join(FIELD_SEPARATOR)}`
|
|
70
74
|
}
|
|
71
75
|
|
|
72
|
-
function finding_line(
|
|
73
|
-
|
|
76
|
+
function finding_line(
|
|
77
|
+
finding: Finding,
|
|
78
|
+
date: string,
|
|
79
|
+
issue: number,
|
|
80
|
+
kind: LineKind = 'code',
|
|
81
|
+
): string {
|
|
82
|
+
return line_of([finding.category, finding.severity, finding.file, date, issue_field(issue)], kind)
|
|
74
83
|
}
|
|
75
84
|
|
|
76
85
|
// **A zero-finding round records `none`, not nothing.** Reading its absence as "no findings" would
|
|
77
86
|
// merge the round that found nothing with the round nobody recorded, which is the exact confusion the
|
|
78
87
|
// ledger exists to end.
|
|
79
|
-
function zero_round_line(date: string, issue: number): string {
|
|
80
|
-
return line_of([NONE, NONE, NO_FILE, date, issue_field(issue)])
|
|
88
|
+
function zero_round_line(date: string, issue: number, kind: LineKind = 'code'): string {
|
|
89
|
+
return line_of([NONE, NONE, NO_FILE, date, issue_field(issue)], kind)
|
|
81
90
|
}
|
|
82
91
|
|
|
83
|
-
function is_finding_line(line: string): boolean {
|
|
84
|
-
return line.trimStart().startsWith(
|
|
92
|
+
function is_finding_line(line: string, kind: LineKind = 'code'): boolean {
|
|
93
|
+
return line.trimStart().startsWith(PREFIX[kind])
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function fields_of(line: string, kind: LineKind = 'code'): ReadonlyArray<string> {
|
|
97
|
+
return line.trimStart().slice(PREFIX[kind].length).split(FIELD_SEPARATOR)
|
|
85
98
|
}
|
|
86
99
|
|
|
87
100
|
function category_of(line: string): string | undefined {
|
|
88
|
-
const fields = line
|
|
101
|
+
const fields = fields_of(line)
|
|
89
102
|
|
|
90
103
|
return fields.length === FIELD_COUNT ? fields[0] : undefined
|
|
91
104
|
}
|
|
@@ -135,8 +148,8 @@ function zero_round_count(content: string): number {
|
|
|
135
148
|
// The issue a finding line is keyed to — its fifth field, the `#<N>` token — or `undefined` for a
|
|
136
149
|
// non-finding or malformed line. The record check reads this to ask whether a given issue's round was
|
|
137
150
|
// recorded at all.
|
|
138
|
-
function issue_of(line: string): string | undefined {
|
|
139
|
-
const fields = line
|
|
151
|
+
function issue_of(line: string, kind: LineKind): string | undefined {
|
|
152
|
+
const fields = fields_of(line, kind)
|
|
140
153
|
|
|
141
154
|
return fields.length === FIELD_COUNT ? fields[FIELD_COUNT - 1] : undefined
|
|
142
155
|
}
|
|
@@ -145,10 +158,12 @@ function issue_of(line: string): string | undefined {
|
|
|
145
158
|
// asks whether the round was recorded, not whether it found anything — reading the issue field, which
|
|
146
159
|
// a zero-finding line carries too, is what keeps a clean round's single line from reading as "nobody
|
|
147
160
|
// recorded this".
|
|
148
|
-
function has_issue_record(content: string, issue: number): boolean {
|
|
161
|
+
function has_issue_record(content: string, issue: number, kind: LineKind = 'code'): boolean {
|
|
149
162
|
const target = issue_field(issue)
|
|
150
163
|
|
|
151
|
-
return content
|
|
164
|
+
return content
|
|
165
|
+
.split('\n')
|
|
166
|
+
.some((line) => is_finding_line(line, kind) && issue_of(line, kind) === target)
|
|
152
167
|
}
|
|
153
168
|
|
|
154
169
|
const review_finding_ledger = {
|
|
@@ -165,5 +180,5 @@ const review_finding_ledger = {
|
|
|
165
180
|
zero_round_line,
|
|
166
181
|
}
|
|
167
182
|
|
|
168
|
-
export type { CategoryCount, Finding }
|
|
183
|
+
export type { CategoryCount, Finding, LineKind }
|
|
169
184
|
export { review_finding_ledger }
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { project_checks } from '#scripts/gate/project-checks'
|
|
2
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
|
+
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
5
|
+
import { review_finding_ledger } from './review-finding-ledger'
|
|
6
|
+
|
|
7
|
+
// The interaction review — one adversarial pass after `/code-review`, over a change to the run
|
|
8
|
+
// tooling (joshuafolkken/kit#4276).
|
|
9
|
+
//
|
|
10
|
+
// **`/code-review` reads the diff for its own correctness, and the defects came from elsewhere**: most
|
|
11
|
+
// of them were a new mechanism meeting an existing one — a pause meeting the next run, a count meeting
|
|
12
|
+
// the per-second repaint. This pass is given one role, to find the existing features the change
|
|
13
|
+
// breaks, and is due only where those meetings happen: the four directories below, in the kit
|
|
14
|
+
// repository alone — a consumer's own `scripts/run/` is not kit's run tooling.
|
|
15
|
+
//
|
|
16
|
+
// **Its round is its own ledger line, `- ri:`**, so the merge gate tells it apart from `/code-review`'s
|
|
17
|
+
// and `josh followup` refuses a due change that has none. The verdicts mirror `review_record.check`'s:
|
|
18
|
+
// `not-required` covers both a change outside the directories and a checkout that keeps no ledger.
|
|
19
|
+
|
|
20
|
+
const TARGET_DIRECTORIES = ['scripts/run/', 'scripts/lane/', 'scripts/backlog/', 'scripts/hooks/']
|
|
21
|
+
|
|
22
|
+
const NOT_DUE_LINE =
|
|
23
|
+
'Interaction review not due: this is not the kit repository, or the change touches none of scripts/run/, scripts/lane/, scripts/backlog/ or scripts/hooks/.'
|
|
24
|
+
|
|
25
|
+
const ROLE_LINES = [
|
|
26
|
+
'## Interaction review',
|
|
27
|
+
'This pass is not a second `/code-review`: do not hunt for bugs inside the diff — the round before it did. Your role is to find three existing features this change breaks. Check only these three:',
|
|
28
|
+
'1. Every state, command, label, file or process this change adds or gives a new meaning to — who else reads or writes it? Search the repository outside the diff for each. Where the plan has a `### 影響を受ける既存の利用者` section, check it names them all.',
|
|
29
|
+
'2. Does each of those readers and writers still behave correctly when the new state or value reaches it (for example, a paused lane counted as running)?',
|
|
30
|
+
'3. Does the change add heavy or synchronous work to a path called repeatedly — every second, every Bash call, every edit?',
|
|
31
|
+
"Report each break with the reader's `file:line` and the change's, rated by the rubric's severities; it is disposed of by `prompts/review.md` → \"Interaction review\".",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
type InteractionStatus = 'ok' | 'missing' | 'not-required'
|
|
35
|
+
|
|
36
|
+
function due_paths(
|
|
37
|
+
paths: ReadonlyArray<string>,
|
|
38
|
+
checkout: string = process.cwd(),
|
|
39
|
+
): ReadonlyArray<string> {
|
|
40
|
+
if (!project_checks.is_kit_repository(checkout)) return []
|
|
41
|
+
|
|
42
|
+
return paths.filter((file) => TARGET_DIRECTORIES.some((directory) => file.startsWith(directory)))
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function brief_block(targets: ReadonlyArray<string>): string {
|
|
46
|
+
const listed = targets.map((file) => `- ${file}`)
|
|
47
|
+
|
|
48
|
+
return [...ROLE_LINES, 'Changed in the run tooling:', ...listed].join('\n')
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function status_of(
|
|
52
|
+
issue: number,
|
|
53
|
+
paths: ReadonlyArray<string>,
|
|
54
|
+
root: string = observation_ledger_home.ledger_root(),
|
|
55
|
+
): Promise<InteractionStatus> {
|
|
56
|
+
const content = due_paths(paths).length > 0 ? await observation_ledger_home.read(root) : undefined
|
|
57
|
+
|
|
58
|
+
if (content === undefined) return 'not-required'
|
|
59
|
+
|
|
60
|
+
return review_finding_ledger.has_issue_record(content, issue, 'interaction') ? 'ok' : 'missing'
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// The status over this checkout's change — the reading `review:brief` takes.
|
|
64
|
+
async function status(issue: number, root?: string): Promise<InteractionStatus> {
|
|
65
|
+
return await status_of(issue, await changed_paths.read_changed_paths(false), root)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const MISSING_REASON =
|
|
69
|
+
'This change touches the run tooling, and no interaction review is recorded for its issue — the pass that looks for the existing features a change breaks, which `/code-review` does not (joshuafolkken/kit#4276).'
|
|
70
|
+
|
|
71
|
+
const REMEDY =
|
|
72
|
+
'Run it from `pnpm josh review:brief --interaction`, then record it with `pnpm josh review:record --interaction --issue <N> [<category>:<severity>:<file> ...]` — a clean pass is a call with no findings — and reissue the merge.'
|
|
73
|
+
|
|
74
|
+
function refusal_message(issue: number): string {
|
|
75
|
+
return [MISSING_REASON, `Issue: ${session_cite.issue(issue)}`, REMEDY].join('\n')
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// The merge gate's half: the refusal for a due change with no recorded pass, else `undefined`.
|
|
79
|
+
async function refusal(issue: number, root?: string): Promise<string | undefined> {
|
|
80
|
+
return (await status(issue, root)) === 'missing' ? refusal_message(issue) : undefined
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const review_interaction = {
|
|
84
|
+
brief_block,
|
|
85
|
+
due_paths,
|
|
86
|
+
NOT_DUE_LINE,
|
|
87
|
+
refusal,
|
|
88
|
+
refusal_message,
|
|
89
|
+
status,
|
|
90
|
+
status_of,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export type { InteractionStatus }
|
|
94
|
+
export { review_interaction }
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// The exported names a diff edits, read from one file's `git diff -U0` and its new text
|
|
2
|
+
// (joshuafolkken/kit#4515). Pure: `review-untouched-readers.ts` reads the diff and searches each name.
|
|
3
|
+
//
|
|
4
|
+
// **A name is edited when a changed line falls inside its top-level declaration** — from the
|
|
5
|
+
// declaration's first line to the line before the next one. Only a name another module can reach is
|
|
6
|
+
// returned, spelled the way a reader writes it: a direct export as itself, a member of an exported
|
|
7
|
+
// namespace object (`export { issue_merged }`) as `issue_merged.read_merged`. The namespace object
|
|
8
|
+
// itself is skipped — a member added to it changes none of its readers.
|
|
9
|
+
|
|
10
|
+
const HUNK_HEADER = /^@@ -\d+(?:,\d+)? \+(?<start>\d+)(?:,(?<count>\d+))? @@/u
|
|
11
|
+
const DECLARATION =
|
|
12
|
+
/^(?:export\s+)?(?:async\s+)?(?:function\*?|const|let|class|type|interface|enum)\s+(?<name>\w+)/u
|
|
13
|
+
const EXPORT_LIST = /^export\s+(?:type\s+)?\{(?<names>[^}]*)\}/gmu
|
|
14
|
+
const IDENTIFIER = /^(?:type\s+)?(?<name>\w+)/u
|
|
15
|
+
const DIRECT_EXPORT = /^export\s/u
|
|
16
|
+
const LIST_SEPARATOR = ','
|
|
17
|
+
// A blank line or a comment line — `//`, `/*`, or a block comment's ` *` continuation.
|
|
18
|
+
const PREAMBLE = /^(?:\s*$|\s*\/[/*]|\s+\*)/u
|
|
19
|
+
// From a 1-based line number to the index of the line above it.
|
|
20
|
+
const TWO = 2
|
|
21
|
+
|
|
22
|
+
interface Declaration {
|
|
23
|
+
name: string
|
|
24
|
+
line: number
|
|
25
|
+
is_exported: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface Edited {
|
|
29
|
+
// The spelling a reader uses — `name` or `namespace.member`.
|
|
30
|
+
target: string
|
|
31
|
+
line: number
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function to_range(start: number, count: number): Array<number> {
|
|
35
|
+
return Array.from({ length: count }, (_unused, offset) => start + offset)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// A pure deletion (`+c,0`) is placed on the line before it, which still lies inside the declaration
|
|
39
|
+
// it was cut from.
|
|
40
|
+
function hunk_lines(header: string): Array<number> {
|
|
41
|
+
const groups = HUNK_HEADER.exec(header)?.groups
|
|
42
|
+
|
|
43
|
+
if (groups === undefined) return []
|
|
44
|
+
|
|
45
|
+
const start = Number(groups['start'])
|
|
46
|
+
const count = groups['count'] === undefined ? 1 : Number(groups['count'])
|
|
47
|
+
|
|
48
|
+
return count === 0 ? [start] : to_range(start, count)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function changed_lines(diff: string): Array<number> {
|
|
52
|
+
return diff.split('\n').flatMap((line) => hunk_lines(line))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function to_declaration(text: string, index: number): Declaration | undefined {
|
|
56
|
+
const name = DECLARATION.exec(text)?.groups?.['name']
|
|
57
|
+
|
|
58
|
+
if (name === undefined) return undefined
|
|
59
|
+
|
|
60
|
+
return { name, line: index + 1, is_exported: DIRECT_EXPORT.test(text) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function declarations(source: string): Array<Declaration> {
|
|
64
|
+
const found = source.split('\n').map((text, index) => to_declaration(text, index))
|
|
65
|
+
|
|
66
|
+
return found.filter((entry): entry is Declaration => entry !== undefined)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function first_identifier(entry: string): string | undefined {
|
|
70
|
+
return IDENTIFIER.exec(entry.trim())?.groups?.['name']
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function list_names(list: string): Array<string> {
|
|
74
|
+
const names = list.split(LIST_SEPARATOR).map((entry) => first_identifier(entry))
|
|
75
|
+
|
|
76
|
+
return names.filter((name): name is string => name !== undefined)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function exported_names(source: string): Set<string> {
|
|
80
|
+
const lists = [...source.matchAll(EXPORT_LIST)].map((match) => match.groups?.['names'] ?? '')
|
|
81
|
+
|
|
82
|
+
return new Set(lists.flatMap((list) => list_names(list)))
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The members of `const <name> = { … }`, or `undefined` where `name` is not an object literal. `name`
|
|
86
|
+
// is a `\w+` match, so it carries no pattern syntax.
|
|
87
|
+
function namespace_members(source: string, name: string): Array<string> | undefined {
|
|
88
|
+
const literal = new RegExp(String.raw`^const\s+${name}\s*=\s*\{(?<body>[^}]*)\}`, 'mu')
|
|
89
|
+
const body = literal.exec(source)?.groups?.['body']
|
|
90
|
+
|
|
91
|
+
return body === undefined ? undefined : list_names(body)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function namespaces(source: string, exported: ReadonlySet<string>): Map<string, Array<string>> {
|
|
95
|
+
const entries = [...exported].map((name) => [name, namespace_members(source, name)] as const)
|
|
96
|
+
|
|
97
|
+
return new Map(
|
|
98
|
+
entries.filter((entry): entry is [string, Array<string>] => entry[1] !== undefined),
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The line after a declaration's own text: the next declaration's line, moved back past the blank and
|
|
103
|
+
// comment lines that introduce it — a comment edited above `b` edits `b`, not the `a` before it.
|
|
104
|
+
function range_end(texts: ReadonlyArray<string>, next: number | undefined): number {
|
|
105
|
+
if (next === undefined) return Infinity
|
|
106
|
+
|
|
107
|
+
let end = next
|
|
108
|
+
|
|
109
|
+
while (end > 1 && PREAMBLE.test(texts[end - TWO] ?? '')) end -= 1
|
|
110
|
+
|
|
111
|
+
return end
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function touched(source: string, lines: ReadonlySet<number>): Array<Declaration> {
|
|
115
|
+
const found = declarations(source)
|
|
116
|
+
const texts = source.split('\n')
|
|
117
|
+
|
|
118
|
+
return found.filter((declaration, index) => {
|
|
119
|
+
const end = range_end(texts, found[index + 1]?.line)
|
|
120
|
+
|
|
121
|
+
return [...lines].some((line) => line >= declaration.line && line < end)
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function namespace_of(
|
|
126
|
+
name: string,
|
|
127
|
+
spaces: ReadonlyMap<string, ReadonlyArray<string>>,
|
|
128
|
+
): string | undefined {
|
|
129
|
+
return [...spaces].find(([, members]) => members.includes(name))?.[0]
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
interface ExportView {
|
|
133
|
+
exported: ReadonlySet<string>
|
|
134
|
+
spaces: ReadonlyMap<string, ReadonlyArray<string>>
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function target_of(declaration: Declaration, view: ExportView): string | undefined {
|
|
138
|
+
const { name } = declaration
|
|
139
|
+
|
|
140
|
+
if (view.spaces.has(name)) return undefined
|
|
141
|
+
if (declaration.is_exported || view.exported.has(name)) return name
|
|
142
|
+
|
|
143
|
+
const space = namespace_of(name, view.spaces)
|
|
144
|
+
|
|
145
|
+
return space === undefined ? undefined : `${space}.${name}`
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function edited(source: string, diff: string): Array<Edited> {
|
|
149
|
+
const exported = exported_names(source)
|
|
150
|
+
const view = { exported, spaces: namespaces(source, exported) }
|
|
151
|
+
const edited_declarations = touched(source, new Set(changed_lines(diff)))
|
|
152
|
+
const found_targets = edited_declarations.map((declaration) => ({
|
|
153
|
+
target: target_of(declaration, view),
|
|
154
|
+
line: declaration.line,
|
|
155
|
+
}))
|
|
156
|
+
|
|
157
|
+
return found_targets.filter((entry): entry is Edited => entry.target !== undefined)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const review_readers_scan = { changed_lines, edited }
|
|
161
|
+
|
|
162
|
+
export type { Edited }
|
|
163
|
+
export { review_readers_scan }
|