@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { markdown_section } from '#scripts/issue/markdown-section'
|
|
2
|
+
import { report_format_reference } from '#scripts/report/report-format-reference'
|
|
3
|
+
import { test_titles } from './test-titles'
|
|
4
|
+
|
|
5
|
+
// A test is the record of a behavior, and a change that deletes one with no word of what replaced it
|
|
6
|
+
// loses that behavior silently: the gate stays green and the review reads only what is there
|
|
7
|
+
// (joshuafolkken/kit#4287, after #4171 dropped `lane_thresholds()` with the tests that guarded it).
|
|
8
|
+
// **This is the seam where a deleted test has to be accounted for**: every test the base had and the
|
|
9
|
+
// change no longer has is listed in the review brief, and the merge is refused until the pull request
|
|
10
|
+
// body names, for each, the test that replaced it or the Issue that retired its behavior.
|
|
11
|
+
//
|
|
12
|
+
// **A test that moved is not deleted.** Tests are compared by full name across every changed test
|
|
13
|
+
// file, so one moved to another file keeps its name. One moved under another `describe` keeps its own
|
|
14
|
+
// title, so a gone name is matched against an arrived name with the same title, one for one — a common
|
|
15
|
+
// title such as "returns undefined" deleted under one block is still listed when another block keeps
|
|
16
|
+
// its own copy.
|
|
17
|
+
|
|
18
|
+
const DISPOSITION_HEADING = '## 消えたテストの処置'
|
|
19
|
+
// The heading as a line of its own, never the mention of it inside a format hint.
|
|
20
|
+
const HEADING_LINE = new RegExp(String.raw`^${DISPOSITION_HEADING}[ \t]*$`, 'mu')
|
|
21
|
+
const REPLACED = '置き換え'
|
|
22
|
+
const RETIRED = '廃止'
|
|
23
|
+
const PENDING_SUFFIX = '— 未記入'
|
|
24
|
+
const BRIEF_HEADING = 'Removed tests'
|
|
25
|
+
// The title runs to the first backtick that a disposition follows, so a title holding backticks of its
|
|
26
|
+
// own — `it('reads the \`.each\` table')` — can still be disposed.
|
|
27
|
+
const ROW_PATTERN = new RegExp(
|
|
28
|
+
String.raw`^[-*]\s+\x60(?<title>.+?)\x60\s+—\s+(?<kind>${REPLACED}|${RETIRED}):\s*(?<rest>\S.*)$`,
|
|
29
|
+
'u',
|
|
30
|
+
)
|
|
31
|
+
// A retirement names the Issue that decided it first — an Issue or a plan comment on one — then why.
|
|
32
|
+
const RETIREMENT_PATTERN = /^(?:[\w.-]+\/[\w.-]+)?#\d+\s+\S/u
|
|
33
|
+
const ROW_FORMAT = `under ${DISPOSITION_HEADING}, one line per removed test: \`- \`<test>\` — ${REPLACED}: <the test that guards the behavior now>\` or \`- \`<test>\` — ${RETIRED}: #<Issue that retired the behavior> <reason>\``
|
|
34
|
+
|
|
35
|
+
function unique(titles: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
36
|
+
return [...new Set(titles)]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function leaf_counts(titles: ReadonlyArray<string>): Map<string, number> {
|
|
40
|
+
const counts = new Map<string, number>()
|
|
41
|
+
|
|
42
|
+
for (const title of titles) {
|
|
43
|
+
const leaf = test_titles.leaf_of(title)
|
|
44
|
+
|
|
45
|
+
counts.set(leaf, (counts.get(leaf) ?? 0) + 1)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return counts
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Spends one arrived name with the same title, so each arrival accounts for one departure only.
|
|
52
|
+
function is_moved(arrived: Map<string, number>, title: string): boolean {
|
|
53
|
+
const leaf = test_titles.leaf_of(title)
|
|
54
|
+
const left = arrived.get(leaf) ?? 0
|
|
55
|
+
|
|
56
|
+
if (left === 0) return false
|
|
57
|
+
arrived.set(leaf, left - 1)
|
|
58
|
+
|
|
59
|
+
return true
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function removed(base: ReadonlyArray<string>, head: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
63
|
+
const base_names = new Set(base)
|
|
64
|
+
const head_names = new Set(head)
|
|
65
|
+
const arrived = leaf_counts(unique(head).filter((title) => !base_names.has(title)))
|
|
66
|
+
|
|
67
|
+
return unique(base)
|
|
68
|
+
.filter((title) => !head_names.has(title))
|
|
69
|
+
.filter((title) => !is_moved(arrived, title))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// A retirement with no Issue is no row at all, so its test reads as undisposed.
|
|
73
|
+
function is_cited(groups: Readonly<Record<string, string>>): boolean {
|
|
74
|
+
return groups['kind'] === REPLACED || RETIREMENT_PATTERN.test(groups['rest'] ?? '')
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function disposed_title(line: string): string | undefined {
|
|
78
|
+
const groups = ROW_PATTERN.exec(line.trim())?.groups
|
|
79
|
+
|
|
80
|
+
if (groups === undefined || !is_cited(groups)) return undefined
|
|
81
|
+
|
|
82
|
+
return groups['title']
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function undisposed(removed_titles: ReadonlyArray<string>, pr_body = ''): ReadonlyArray<string> {
|
|
86
|
+
const disposed = new Set(
|
|
87
|
+
markdown_section
|
|
88
|
+
.section_lines(pr_body, DISPOSITION_HEADING)
|
|
89
|
+
.map((line) => disposed_title(line)),
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
return removed_titles.filter((title) => !disposed.has(title))
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function pending_rows(titles: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
96
|
+
return titles.map((title) => `- \`${title}\` ${PENDING_SUFFIX}`)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function has_row(lines: ReadonlyArray<string>, title: string): boolean {
|
|
100
|
+
return lines.some((line) => line.trim().startsWith(`- \`${title}\` `))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The pending rows a body still lacks, put under its disposition heading — added at the end when the
|
|
104
|
+
// body has none — so a run fills them in before `josh ship` rather than meeting them at its preflight
|
|
105
|
+
// (joshuafolkken/kit#4563). A title with any row already, pending or filled, is left as it is.
|
|
106
|
+
function with_pending_rows(body: string, titles: ReadonlyArray<string>): string {
|
|
107
|
+
const lines = markdown_section.section_lines(body, DISPOSITION_HEADING)
|
|
108
|
+
const rows = pending_rows(titles.filter((title) => !has_row(lines, title))).join('\n')
|
|
109
|
+
|
|
110
|
+
if (rows === '') return body
|
|
111
|
+
if (!HEADING_LINE.test(body)) return `${body.trimEnd()}\n\n${DISPOSITION_HEADING}\n\n${rows}\n`
|
|
112
|
+
|
|
113
|
+
return body.replace(HEADING_LINE, () => `${DISPOSITION_HEADING}\n\n${rows}`)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Nothing when the change removed no test, so an ordinary brief is not one line longer.
|
|
117
|
+
function brief_block(removed_titles: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
118
|
+
if (removed_titles.length === 0) return []
|
|
119
|
+
|
|
120
|
+
return [
|
|
121
|
+
'',
|
|
122
|
+
`${BRIEF_HEADING} — these tests existed at the base and are gone from the change. For each, find the test that guards its behavior now, or the Issue that retired the behavior; a removed test with neither is a finding (missing test). The pull request body must dispose of each ${ROW_FORMAT}, or \`josh followup\` refuses the merge:`,
|
|
123
|
+
...pending_rows(removed_titles),
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function refusal_message(titles: ReadonlyArray<string>): string {
|
|
128
|
+
return [
|
|
129
|
+
`Merge refused: this change removes ${String(titles.length)} test(s) the pull request body does not account for.`,
|
|
130
|
+
`Put these rows into the body's ${DISPOSITION_HEADING} section, replacing each ending with the test that replaced it or the Issue that retired its behavior:`,
|
|
131
|
+
DISPOSITION_HEADING,
|
|
132
|
+
'',
|
|
133
|
+
...pending_rows(titles),
|
|
134
|
+
`Write ${ROW_FORMAT} — format: ${report_format_reference.pointer(report_format_reference.REMOVED_TESTS_HEADING)}`,
|
|
135
|
+
'Write it into the `--body-file` before `josh ship`, or update an open PR with `gh api -X PATCH repos/{owner}/{repo}/pulls/<N> -F body=@<path>`, then re-run.',
|
|
136
|
+
].join('\n')
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const removed_tests = {
|
|
140
|
+
brief_block,
|
|
141
|
+
DISPOSITION_HEADING,
|
|
142
|
+
refusal_message,
|
|
143
|
+
removed,
|
|
144
|
+
ROW_FORMAT,
|
|
145
|
+
undisposed,
|
|
146
|
+
with_pending_rows,
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export { removed_tests }
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import path from 'node:path'
|
|
3
2
|
import { fileURLToPath } from 'node:url'
|
|
4
3
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
@@ -8,21 +7,26 @@ import { change_base } from '#scripts/git/change-base'
|
|
|
8
7
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
9
8
|
import { git_command } from '#scripts/git/git-command'
|
|
10
9
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
10
|
+
import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
|
|
11
11
|
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
12
12
|
import { find_package_directory } from '#scripts/josh/josh-logic'
|
|
13
13
|
import { path_decision } from '#scripts/josh/path-decision'
|
|
14
14
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
15
15
|
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
16
16
|
import { run_ship_review } from '#scripts/run/ship/run-ship-review'
|
|
17
|
+
import { removed_tests_check } from './removed-tests-check'
|
|
17
18
|
import { review_attest } from './review-attest'
|
|
18
19
|
import { review_brief } from './review-brief'
|
|
19
20
|
import { review_checkout, type ReviewCheckout } from './review-checkout'
|
|
20
21
|
import { review_code_tree } from './review-code-tree'
|
|
21
22
|
import type { DiffParts } from './review-diff-parts'
|
|
22
23
|
import { review_diff_write } from './review-diff-write'
|
|
24
|
+
import { review_interaction } from './review-interaction'
|
|
23
25
|
import { review_level, type ReviewLevel } from './review-level'
|
|
26
|
+
import { review_round_one_blobs } from './review-round-one-blobs'
|
|
24
27
|
import { review_stamps } from './review-stamps'
|
|
25
28
|
import { review_tree } from './review-tree'
|
|
29
|
+
import { review_untouched_readers, type ReadersRead } from './review-untouched-readers'
|
|
26
30
|
|
|
27
31
|
// `josh review:brief` — print the whole `/code-review` invocation, not just the level.
|
|
28
32
|
//
|
|
@@ -33,8 +37,8 @@ import { review_tree } from './review-tree'
|
|
|
33
37
|
// so "still running" is the usual answer at this point), how this project runs its unit tests, and —
|
|
34
38
|
// on round 2 — which files the first round's fixes touched.
|
|
35
39
|
|
|
36
|
-
const
|
|
37
|
-
|
|
40
|
+
const USAGE =
|
|
41
|
+
'Usage: josh review:brief [--round <1|2>] | --interaction | --level-only [--staged] [--json]'
|
|
38
42
|
|
|
39
43
|
// The rubric's absolute path, resolved against the kit package rather than the review checkout root.
|
|
40
44
|
// The rubric ships inside the package, so a consumer that keeps no
|
|
@@ -54,6 +58,7 @@ const ROUND_FLAG = '--round'
|
|
|
54
58
|
// paths and nothing else. `--staged` and `--json` are passed straight through, exactly as the old
|
|
55
59
|
// command took them.
|
|
56
60
|
const LEVEL_ONLY_FLAG = '--level-only'
|
|
61
|
+
const INTERACTION_FLAG = '--interaction'
|
|
57
62
|
const LEVEL_KEY = 'level'
|
|
58
63
|
const FIRST_ROUND = 1
|
|
59
64
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -132,7 +137,12 @@ function record_round_one(
|
|
|
132
137
|
return false
|
|
133
138
|
}
|
|
134
139
|
|
|
135
|
-
review_stamps.round_one_stamp.write(
|
|
140
|
+
review_stamps.round_one_stamp.write(
|
|
141
|
+
tree,
|
|
142
|
+
target,
|
|
143
|
+
base,
|
|
144
|
+
review_round_one_blobs.capture(Object.keys(tree)),
|
|
145
|
+
)
|
|
136
146
|
|
|
137
147
|
return true
|
|
138
148
|
} catch {
|
|
@@ -202,6 +212,7 @@ interface ComposeRequest {
|
|
|
202
212
|
tree: Record<string, string>
|
|
203
213
|
base: string
|
|
204
214
|
profile: AgentProfile
|
|
215
|
+
interaction?: ReadonlyArray<string> | undefined
|
|
205
216
|
}
|
|
206
217
|
|
|
207
218
|
// **Swallowed, and the brief keeps its target line**: parts that could not be
|
|
@@ -221,9 +232,35 @@ async function read_diff(
|
|
|
221
232
|
}
|
|
222
233
|
}
|
|
223
234
|
|
|
235
|
+
// **Swallowed, and the brief omits the list**: `josh ship` and `followup` read the same list again
|
|
236
|
+
// and refuse on a failure, so the merge never rests on this reading.
|
|
237
|
+
async function read_removed_tests(): Promise<ReadonlyArray<string>> {
|
|
238
|
+
try {
|
|
239
|
+
return (await removed_tests_check.read()) ?? []
|
|
240
|
+
} catch {
|
|
241
|
+
return []
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// **A failure is marked, and the brief says the list could not be read** — never an empty list,
|
|
246
|
+
// which would read as a change with no reader outside it.
|
|
247
|
+
async function read_readers(
|
|
248
|
+
root: string,
|
|
249
|
+
base: string,
|
|
250
|
+
paths: ReadonlyArray<string>,
|
|
251
|
+
): Promise<ReadersRead> {
|
|
252
|
+
try {
|
|
253
|
+
return await review_untouched_readers.read({ root, base, paths })
|
|
254
|
+
} catch {
|
|
255
|
+
return review_untouched_readers.FAILED_READ
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
224
259
|
async function compose_brief(request: ComposeRequest): Promise<string> {
|
|
225
|
-
const { round, paths, tree, base, profile } = request
|
|
226
|
-
const
|
|
260
|
+
const { round, paths, tree, base, profile, interaction } = request
|
|
261
|
+
const opened = await open_contract()
|
|
262
|
+
// The interaction review reads the whole change, never a resume's narrowing (joshuafolkken/kit#4276).
|
|
263
|
+
const contract = interaction === undefined ? opened : { ...opened, resumed_from: undefined }
|
|
227
264
|
const stamps = {
|
|
228
265
|
gate: review_stamps.gate_stamp.read(),
|
|
229
266
|
in_flight: review_stamps.in_flight_stamp.read(),
|
|
@@ -245,6 +282,9 @@ async function compose_brief(request: ComposeRequest): Promise<string> {
|
|
|
245
282
|
rubric_path: RUBRIC_PATH,
|
|
246
283
|
...contract,
|
|
247
284
|
diff: await read_diff(contract.checkout.root, base, paths),
|
|
285
|
+
readers: await read_readers(contract.checkout.root, base, paths),
|
|
286
|
+
removed_tests: await read_removed_tests(),
|
|
287
|
+
interaction,
|
|
248
288
|
})
|
|
249
289
|
}
|
|
250
290
|
|
|
@@ -325,7 +365,13 @@ async function record_review(
|
|
|
325
365
|
record_briefed(round, tree, commit)
|
|
326
366
|
}
|
|
327
367
|
|
|
328
|
-
|
|
368
|
+
// An interaction brief records nothing: the round-one and briefed stamps describe `/code-review`'s
|
|
369
|
+
// round, which already ran, and retaking them would move the delta round 2 is measured from.
|
|
370
|
+
async function run_review(
|
|
371
|
+
round: number,
|
|
372
|
+
reading: ChangeReading,
|
|
373
|
+
interaction?: ReadonlyArray<string>,
|
|
374
|
+
): Promise<number> {
|
|
329
375
|
const { base, commit, paths, tree } = reading
|
|
330
376
|
const refusal = scoped_green.refusal_for(tree, commit)
|
|
331
377
|
|
|
@@ -334,14 +380,40 @@ async function run_review(round: number, reading: ChangeReading): Promise<number
|
|
|
334
380
|
|
|
335
381
|
if (resolved.kind === 'rejected') return report_error(resolved.note)
|
|
336
382
|
agent_role_profile.warn_of_default()
|
|
337
|
-
|
|
338
|
-
|
|
383
|
+
const { profile } = resolved
|
|
384
|
+
|
|
385
|
+
console.info(await compose_brief({ round, paths, tree, base, profile, interaction }))
|
|
386
|
+
if (interaction === undefined) await record_review(round, tree, commit)
|
|
339
387
|
|
|
340
388
|
return 0
|
|
341
389
|
}
|
|
342
390
|
|
|
391
|
+
// The interaction review's brief (joshuafolkken/kit#4276): `/code-review`'s round-1 brief over the
|
|
392
|
+
// whole change, with the role and the run-tooling paths appended. Not due, it says so and exits 0.
|
|
393
|
+
//
|
|
394
|
+
// **An issue update taken in after round 1's brief refuses it**: minting this brief moves the pointer
|
|
395
|
+
// `josh followup` measures that update against (`issue-watch-gate.ts`), so a round 1 that read the
|
|
396
|
+
// earlier specification would merge without that refusal.
|
|
397
|
+
async function run_interaction(): Promise<number> {
|
|
398
|
+
const reading = await read_change()
|
|
399
|
+
const targets = review_interaction.due_paths(reading.paths)
|
|
400
|
+
|
|
401
|
+
if (targets.length === 0) {
|
|
402
|
+
console.info(review_interaction.NOT_DUE_LINE)
|
|
403
|
+
|
|
404
|
+
return 0
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const stale = await issue_watch_gate.review_refusal_here()
|
|
408
|
+
|
|
409
|
+
if (stale !== undefined) return report_error(stale)
|
|
410
|
+
|
|
411
|
+
return await run_review(FIRST_ROUND, reading, targets)
|
|
412
|
+
}
|
|
413
|
+
|
|
343
414
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
344
415
|
if (argv[0] === LEVEL_ONLY_FLAG) return await run_level(argv.slice(1))
|
|
416
|
+
if (argv.length === 1 && argv[0] === INTERACTION_FLAG) return await run_interaction()
|
|
345
417
|
|
|
346
418
|
const round = parse_round(argv)
|
|
347
419
|
|
|
@@ -350,10 +422,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
350
422
|
return await run_review(round, await read_change())
|
|
351
423
|
}
|
|
352
424
|
|
|
353
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
354
|
-
process.exitCode = await run(argv)
|
|
355
|
-
}
|
|
356
|
-
|
|
357
425
|
const review_brief_cli = {
|
|
358
426
|
FIRST_ROUND,
|
|
359
427
|
format_reason,
|
|
@@ -365,6 +433,4 @@ const review_brief_cli = {
|
|
|
365
433
|
run,
|
|
366
434
|
}
|
|
367
435
|
|
|
368
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
369
|
-
|
|
370
436
|
export { review_brief_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { review_brief_cli } from './review-brief-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh review:brief` entry, kept apart from `review-brief-cli.ts` because `run-review-cli.ts`
|
|
6
|
+
// imports that one: a bundle is one file, so a main guard there would fire for every command that
|
|
7
|
+
// carries it (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await review_brief_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -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 }
|