@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
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { change_base } from '#scripts/git/change-base'
|
|
4
|
+
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
4
5
|
import { path_decision } from '#scripts/josh/path-decision'
|
|
5
6
|
import { review_code_tree } from './review-code-tree'
|
|
6
|
-
import {
|
|
7
|
+
import { review_round_one_blobs } from './review-round-one-blobs'
|
|
8
|
+
import { review_round2, type RoundTwoAnswer } from './review-round2'
|
|
7
9
|
import { review_stamps } from './review-stamps'
|
|
8
10
|
import { review_tree } from './review-tree'
|
|
9
11
|
|
|
@@ -17,7 +19,6 @@ import { review_tree } from './review-tree'
|
|
|
17
19
|
|
|
18
20
|
const ARGV_OFFSET = 2
|
|
19
21
|
const USAGE = 'Usage: josh review:round2 [--round-1-closed] [--json]'
|
|
20
|
-
const JSON_KEY = 'round2'
|
|
21
22
|
const FAILURE_EXIT_CODE = 1
|
|
22
23
|
|
|
23
24
|
// The one input no command can read for itself, so the caller states it: every round-1 High/Medium
|
|
@@ -48,9 +49,37 @@ function parse_options(argv: ReadonlyArray<string>): Options | undefined {
|
|
|
48
49
|
// Only the paths the code record covers are re-read, so a run without one parses nothing.
|
|
49
50
|
async function read_comment_only(base: string | undefined): Promise<ReadonlyArray<string>> {
|
|
50
51
|
const snapshot = review_stamps.round_one_code_stamp.read()
|
|
51
|
-
const
|
|
52
|
+
const paths = Object.keys(snapshot?.files ?? {})
|
|
53
|
+
const tree = await review_code_tree.read(paths)
|
|
54
|
+
const unmoved = review_round_one_blobs.unmoved({ from: snapshot?.base, to: base, paths })
|
|
52
55
|
|
|
53
|
-
return review_code_tree.comment_only(snapshot, tree, base)
|
|
56
|
+
return review_code_tree.comment_only(snapshot, tree, base, unmoved)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The carry over every path changed now, not only round 1's: a file the fix added after the merge is
|
|
60
|
+
// in no round-1 record and has to be named all the same.
|
|
61
|
+
function carried_reader(
|
|
62
|
+
base: string | undefined,
|
|
63
|
+
tree: Record<string, string>,
|
|
64
|
+
): (snapshot: FileMapStamp) => ReadonlyArray<string> | undefined {
|
|
65
|
+
return (snapshot) =>
|
|
66
|
+
review_round_one_blobs.carried_delta({
|
|
67
|
+
blobs: snapshot.blobs,
|
|
68
|
+
from: snapshot.base,
|
|
69
|
+
to: base,
|
|
70
|
+
paths: Object.keys(tree),
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// `--json` carries the reason code as well, the field `josh ship` records in the lane ledger.
|
|
75
|
+
function print(answer: RoundTwoAnswer, is_json: boolean): void {
|
|
76
|
+
if (is_json) {
|
|
77
|
+
console.info(review_round2.to_json(answer))
|
|
78
|
+
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
path_decision.print_decision(review_round2.JSON_KEY, answer.verdict, answer.reason, is_json)
|
|
54
83
|
}
|
|
55
84
|
|
|
56
85
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
@@ -66,19 +95,20 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
66
95
|
// against a different one — and the resolved commit rather than `git_command.change_base`, whose
|
|
67
96
|
// fallback is a ref name that moves and would compare equal to itself.
|
|
68
97
|
const base = await change_base.resolved()
|
|
69
|
-
|
|
98
|
+
// No paths argument: `read_changed_tree` reads them itself, from the one definition of "changed"
|
|
99
|
+
// `josh review:level` and `josh review:brief` all decide from. Passing our own reading would be a
|
|
100
|
+
// second definition, which is the drift that module exists to prevent.
|
|
101
|
+
const tree = await review_tree.read_changed_tree()
|
|
102
|
+
const decision = review_round2.decide({
|
|
70
103
|
base,
|
|
104
|
+
carried_delta: carried_reader(base, tree),
|
|
71
105
|
comment_only: await read_comment_only(base),
|
|
72
106
|
is_round_one_closed: options.is_round_one_closed,
|
|
73
107
|
snapshot: review_stamps.round_one_stamp.read(),
|
|
74
|
-
|
|
75
|
-
// "changed" `josh review:level` and `josh review:brief` all decide from.
|
|
76
|
-
// Passing our own reading would be a second definition, which is the drift that module exists
|
|
77
|
-
// to prevent.
|
|
78
|
-
tree: await review_tree.read_changed_tree(),
|
|
108
|
+
tree,
|
|
79
109
|
})
|
|
80
110
|
|
|
81
|
-
|
|
111
|
+
print(decision, options.is_json)
|
|
82
112
|
|
|
83
113
|
return 0
|
|
84
114
|
}
|
|
@@ -87,7 +117,14 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
87
117
|
process.exitCode = await run(argv)
|
|
88
118
|
}
|
|
89
119
|
|
|
90
|
-
const review_round2_cli = {
|
|
120
|
+
const review_round2_cli = {
|
|
121
|
+
CLOSED_FLAG,
|
|
122
|
+
carried_reader,
|
|
123
|
+
parse_options,
|
|
124
|
+
print,
|
|
125
|
+
read_comment_only,
|
|
126
|
+
run,
|
|
127
|
+
}
|
|
91
128
|
|
|
92
129
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
93
130
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { file_map_stamp, type FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
2
2
|
import { path_decision } from '#scripts/josh/path-decision'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { z } from 'zod'
|
|
3
5
|
import { review_level } from './review-level'
|
|
4
6
|
|
|
5
7
|
// Whether the second review round runs at all.
|
|
@@ -22,6 +24,28 @@ type RoundTwoVerdict = 'required' | 'skip'
|
|
|
22
24
|
|
|
23
25
|
const REQUIRED_VERDICT: RoundTwoVerdict = 'required'
|
|
24
26
|
const SKIPPED_VERDICT: RoundTwoVerdict = 'skip'
|
|
27
|
+
const VERDICTS = [REQUIRED_VERDICT, SKIPPED_VERDICT] as const
|
|
28
|
+
|
|
29
|
+
// One stable code per branch of `decide`, so a decision can be counted by why it fell where it did —
|
|
30
|
+
// the reason sentences carry paths and timestamps and cannot be (joshuafolkken/kit#4064).
|
|
31
|
+
const CODE = {
|
|
32
|
+
EMPTY: 'empty',
|
|
33
|
+
INERT: 'inert',
|
|
34
|
+
OPEN_FINDING: 'open-finding',
|
|
35
|
+
NO_SNAPSHOT: 'no-snapshot',
|
|
36
|
+
BASE_MOVED: 'base-moved',
|
|
37
|
+
LIVE: 'live',
|
|
38
|
+
} as const
|
|
39
|
+
|
|
40
|
+
type RoundTwoCode = (typeof CODE)[keyof typeof CODE]
|
|
41
|
+
|
|
42
|
+
// The key `josh review:round2 --json` prints its verdict under, read back by `josh ship`.
|
|
43
|
+
const JSON_KEY = 'round2'
|
|
44
|
+
const json_schema = z.object({
|
|
45
|
+
[JSON_KEY]: z.enum(VERDICTS),
|
|
46
|
+
code: z.enum(Object.values(CODE)),
|
|
47
|
+
reason: z.string(),
|
|
48
|
+
})
|
|
25
49
|
|
|
26
50
|
// **The default is `required`, and every uncertainty resolves to it.** A command that answered `skip`
|
|
27
51
|
// on a missing record would be the cheapest possible run and the most dangerous — the direction
|
|
@@ -39,7 +63,7 @@ const DOCUMENTATION_PREFIX = 'docs/'
|
|
|
39
63
|
const MARKDOWN_EXTENSION = '.md'
|
|
40
64
|
const PROMPTS_PREFIX = 'prompts/'
|
|
41
65
|
const BASE_MOVED_REASON =
|
|
42
|
-
|
|
66
|
+
"the change base moved since round 1 was recorded and round 1's tree could not be carried onto the new one — no recorded round-1 blobs, or the carry conflicts — so the fix delta cannot be named and the round runs"
|
|
43
67
|
|
|
44
68
|
interface RoundTwoInput {
|
|
45
69
|
// **The commit the tree above is a diff against**. This decision reads the
|
|
@@ -58,11 +82,18 @@ interface RoundTwoInput {
|
|
|
58
82
|
// The paths whose code round 1's fixes left as it was (`review_code_tree.comment_only`). Absent is
|
|
59
83
|
// none, which is what a run without a code record pays.
|
|
60
84
|
comment_only?: ReadonlyArray<string>
|
|
85
|
+
// Asked only when the base moved: round 1's tree carried onto the current base, diffed against the
|
|
86
|
+
// tree now (`review-round-one-blobs.ts`). `undefined`, or no reader at all, is the moved-base refusal.
|
|
87
|
+
carried_delta?: (snapshot: FileMapStamp) => ReadonlyArray<string> | undefined
|
|
61
88
|
}
|
|
62
89
|
|
|
63
|
-
interface
|
|
90
|
+
interface RoundTwoAnswer {
|
|
64
91
|
verdict: RoundTwoVerdict
|
|
92
|
+
code: RoundTwoCode
|
|
65
93
|
reason: string
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
interface RoundTwoDecision extends RoundTwoAnswer {
|
|
66
97
|
// The paths round 1's fixes changed. Returned even on `required` so the caller can name them, and
|
|
67
98
|
// on a `skip` so the record the run leaves behind says what went unreviewed.
|
|
68
99
|
delta: ReadonlyArray<string>
|
|
@@ -109,43 +140,80 @@ function verdict_for_delta(
|
|
|
109
140
|
delta: ReadonlyArray<string>,
|
|
110
141
|
taken_at: string,
|
|
111
142
|
comment_only: ReadonlyArray<string> = [],
|
|
112
|
-
):
|
|
113
|
-
if (delta.length === 0)
|
|
143
|
+
): RoundTwoAnswer {
|
|
144
|
+
if (delta.length === 0) {
|
|
145
|
+
return { verdict: SKIPPED_VERDICT, code: CODE.EMPTY, reason: empty_reason(taken_at) }
|
|
146
|
+
}
|
|
114
147
|
|
|
115
148
|
const deciding = delta.filter((relative) => !is_unexecuted(relative, comment_only))
|
|
116
149
|
|
|
117
|
-
if (deciding.length === 0)
|
|
150
|
+
if (deciding.length === 0) {
|
|
151
|
+
return { verdict: SKIPPED_VERDICT, code: CODE.INERT, reason: inert_reason(delta) }
|
|
152
|
+
}
|
|
118
153
|
|
|
119
|
-
return { verdict: REQUIRED_VERDICT, reason: live_reason(deciding) }
|
|
154
|
+
return { verdict: REQUIRED_VERDICT, code: CODE.LIVE, reason: live_reason(deciding) }
|
|
120
155
|
}
|
|
121
156
|
|
|
122
|
-
function required(reason: string): RoundTwoDecision {
|
|
123
|
-
return { verdict: REQUIRED_VERDICT, reason, delta: [] }
|
|
157
|
+
function required(code: RoundTwoCode, reason: string): RoundTwoDecision {
|
|
158
|
+
return { verdict: REQUIRED_VERDICT, code, reason, delta: [] }
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// On a moved base the digest comparison is a set difference, not the fix delta, so the carried
|
|
162
|
+
// reading replaces it and every later rule is the same one an unmoved base gets.
|
|
163
|
+
function fix_delta(
|
|
164
|
+
input: RoundTwoInput,
|
|
165
|
+
snapshot: FileMapStamp,
|
|
166
|
+
): ReadonlyArray<string> | undefined {
|
|
167
|
+
if (file_map_stamp.describes_base(snapshot, input.base)) {
|
|
168
|
+
return file_map_stamp.changed_since(snapshot, input.tree)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return input.carried_delta?.(snapshot)
|
|
124
172
|
}
|
|
125
173
|
|
|
126
174
|
function decide(input: RoundTwoInput): RoundTwoDecision {
|
|
127
|
-
if (!input.is_round_one_closed) return required(OPEN_FINDING_REASON)
|
|
128
|
-
if (input.snapshot === undefined) return required(NO_SNAPSHOT_REASON)
|
|
129
|
-
|
|
175
|
+
if (!input.is_round_one_closed) return required(CODE.OPEN_FINDING, OPEN_FINDING_REASON)
|
|
176
|
+
if (input.snapshot === undefined) return required(CODE.NO_SNAPSHOT, NO_SNAPSHOT_REASON)
|
|
177
|
+
|
|
178
|
+
const delta = fix_delta(input, input.snapshot)
|
|
130
179
|
|
|
131
|
-
|
|
180
|
+
if (delta === undefined) return required(CODE.BASE_MOVED, BASE_MOVED_REASON)
|
|
132
181
|
|
|
133
182
|
return { ...verdict_for_delta(delta, input.snapshot.taken_at, input.comment_only), delta }
|
|
134
183
|
}
|
|
135
184
|
|
|
185
|
+
function to_json(answer: RoundTwoAnswer): string {
|
|
186
|
+
return JSON.stringify({ [JSON_KEY]: answer.verdict, code: answer.code, reason: answer.reason })
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// The answer `to_json` printed, or `undefined` for any other output — read by the one caller that
|
|
190
|
+
// records it, which must not guess a verdict from text it cannot parse.
|
|
191
|
+
function parse_json(text: string): RoundTwoAnswer | undefined {
|
|
192
|
+
const parsed = json_schema.safeParse(json_value.parse_or_undefined(text.trim())).data
|
|
193
|
+
|
|
194
|
+
return parsed === undefined
|
|
195
|
+
? undefined
|
|
196
|
+
: { verdict: parsed[JSON_KEY], code: parsed.code, reason: parsed.reason }
|
|
197
|
+
}
|
|
198
|
+
|
|
136
199
|
const review_round2 = {
|
|
137
200
|
BASE_MOVED_REASON,
|
|
201
|
+
CODE,
|
|
138
202
|
decide,
|
|
139
203
|
EMPTY_DELTA_REASON_PREFIX,
|
|
140
204
|
empty_reason,
|
|
141
205
|
INERT_DELTA_REASON_PREFIX,
|
|
142
206
|
inert_reason,
|
|
207
|
+
JSON_KEY,
|
|
143
208
|
live_reason,
|
|
144
209
|
NO_SNAPSHOT_REASON,
|
|
145
210
|
OPEN_FINDING_REASON,
|
|
211
|
+
parse_json,
|
|
146
212
|
REQUIRED_VERDICT,
|
|
147
213
|
SKIPPED_VERDICT,
|
|
214
|
+
to_json,
|
|
148
215
|
verdict_for_delta,
|
|
149
216
|
}
|
|
150
217
|
|
|
218
|
+
export type { RoundTwoAnswer, RoundTwoCode, RoundTwoVerdict }
|
|
151
219
|
export { review_round2 }
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { gate_plan } from '#scripts/gate/gate-plan'
|
|
2
|
+
import { verification_inputs } from '#scripts/gate/verification-inputs'
|
|
1
3
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
4
|
import { file_map_stamp, type FileMapStampAccess } from '#scripts/josh/file-map-stamp'
|
|
3
5
|
|
|
@@ -9,6 +11,8 @@ import { file_map_stamp, type FileMapStampAccess } from '#scripts/josh/file-map-
|
|
|
9
11
|
// The scoped stamps claim less than the gate stamp (changed files, two checks), so they stay separate.
|
|
10
12
|
const LINT_RELATED_PREFIX = 'josh-lint-related-stamp-'
|
|
11
13
|
const TEST_RELATED_PREFIX = 'josh-test-related-stamp-'
|
|
14
|
+
// `josh test:e2e` answered green — a run or a printed skip — on this tree (`test-e2e-stamp.ts`).
|
|
15
|
+
const E2E_PREFIX = 'josh-e2e-stamp-'
|
|
12
16
|
|
|
13
17
|
const GATE_PREFIX = 'josh-gate-stamp-'
|
|
14
18
|
const IN_FLIGHT_PREFIX = 'josh-gate-running-'
|
|
@@ -16,7 +20,17 @@ const ROUND_ONE_PREFIX = 'josh-review-round1-'
|
|
|
16
20
|
const ROUND_ONE_CODE_PREFIX = 'josh-review-round1-code-'
|
|
17
21
|
const BRIEFED_PREFIX = 'josh-review-briefed-'
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
// The records that vouch for a check carry the fingerprint of its declared inputs
|
|
24
|
+
// (`verification-inputs.ts`): the gate's every declared check, a scoped record its own.
|
|
25
|
+
function inputs_of(labels: ReadonlyArray<string>): () => string {
|
|
26
|
+
return () => verification_inputs.fingerprint(labels)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const gate_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
30
|
+
GATE_PREFIX,
|
|
31
|
+
PROJECT_ROOT,
|
|
32
|
+
inputs_of(verification_inputs.DECLARED_LABELS),
|
|
33
|
+
)
|
|
20
34
|
const in_flight_stamp: FileMapStampAccess = file_map_stamp.create(IN_FLIGHT_PREFIX, PROJECT_ROOT)
|
|
21
35
|
const round_one_stamp: FileMapStampAccess = file_map_stamp.create(ROUND_ONE_PREFIX, PROJECT_ROOT)
|
|
22
36
|
// Written beside the round-1 snapshot: the comment-free digest of each source file (`review-code-tree.ts`).
|
|
@@ -29,11 +43,14 @@ const briefed_stamp: FileMapStampAccess = file_map_stamp.create(BRIEFED_PREFIX,
|
|
|
29
43
|
const lint_related_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
30
44
|
LINT_RELATED_PREFIX,
|
|
31
45
|
PROJECT_ROOT,
|
|
46
|
+
inputs_of([gate_plan.LINT_LABEL]),
|
|
32
47
|
)
|
|
33
48
|
const test_related_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
34
49
|
TEST_RELATED_PREFIX,
|
|
35
50
|
PROJECT_ROOT,
|
|
51
|
+
inputs_of([gate_plan.UNIT_LABEL]),
|
|
36
52
|
)
|
|
53
|
+
const e2e_stamp: FileMapStampAccess = file_map_stamp.create(E2E_PREFIX, PROJECT_ROOT)
|
|
37
54
|
|
|
38
55
|
// Swallowed: a code record left behind only ever sits beside an older snapshot, which the next
|
|
39
56
|
// round-1 brief replaces together with it.
|
|
@@ -61,6 +78,7 @@ const review_stamps = {
|
|
|
61
78
|
briefed_stamp,
|
|
62
79
|
clear_round_one,
|
|
63
80
|
clear_round_one_code,
|
|
81
|
+
e2e_stamp,
|
|
64
82
|
GATE_PREFIX,
|
|
65
83
|
gate_stamp,
|
|
66
84
|
IN_FLIGHT_PREFIX,
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
4
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
5
|
+
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
6
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
7
|
+
import type { StopFinding } from '#scripts/run/ship/run-ship-review'
|
|
8
|
+
import { z } from 'zod'
|
|
9
|
+
|
|
10
|
+
// The durable record of every review finding that stopped a `josh ship` — one JSON line per finding,
|
|
11
|
+
// with its kind, the `<file>[:<line>]` it cites and its first sentence, read back by
|
|
12
|
+
// `josh review:stops` (joshuafolkken/kit#4519). The lane ledger's stop line keeps only the kinds, and
|
|
13
|
+
// the finding's text was only in the ship log in the temp root, which a reboot clears.
|
|
14
|
+
//
|
|
15
|
+
// **It lives in the git common directory**, beside the test-read map: every lane worktree of one clone
|
|
16
|
+
// appends to the same file, and a reboot keeps it. Appended with the lane ledger's `append`, so
|
|
17
|
+
// concurrent lanes never lose each other's lines.
|
|
18
|
+
//
|
|
19
|
+
// **A test run writes nothing** unless it passes its own path, the lane ledger's rule: the writer sits on
|
|
20
|
+
// the ship's stop path, which many suites exercise.
|
|
21
|
+
|
|
22
|
+
const LOG_DIRECTORY = 'josh'
|
|
23
|
+
const LOG_FILE = 'review-stops.jsonl'
|
|
24
|
+
const LINE_SEPARATOR = '\n'
|
|
25
|
+
|
|
26
|
+
const stop_line_schema = z.object({
|
|
27
|
+
at: z.string(),
|
|
28
|
+
issue: z.number(),
|
|
29
|
+
stage: z.string(),
|
|
30
|
+
kind: z.string(),
|
|
31
|
+
location: z.string(),
|
|
32
|
+
sentence: z.string(),
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
type StopLine = z.infer<typeof stop_line_schema>
|
|
36
|
+
|
|
37
|
+
// One stopped review: the issue, the stage that stopped and the findings that decided it.
|
|
38
|
+
interface ReviewStop {
|
|
39
|
+
issue: number
|
|
40
|
+
stage: string
|
|
41
|
+
findings: ReadonlyArray<StopFinding>
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function target(): string | undefined {
|
|
45
|
+
if (process.env['VITEST'] !== undefined) return undefined
|
|
46
|
+
|
|
47
|
+
const common = git_common_directory.repository()
|
|
48
|
+
|
|
49
|
+
return common === undefined ? undefined : path.join(common, LOG_DIRECTORY, LOG_FILE)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function write(destination: string, stop: ReviewStop): void {
|
|
53
|
+
const at = new Date().toISOString()
|
|
54
|
+
|
|
55
|
+
mkdirSync(path.dirname(destination), { recursive: true })
|
|
56
|
+
|
|
57
|
+
for (const finding of stop.findings) {
|
|
58
|
+
lane_ledger.append(destination, { at, issue: stop.issue, stage: stop.stage, ...finding })
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Best-effort, as the lane ledger is: a record must never fail the stop it records.
|
|
63
|
+
function record(stop: ReviewStop, log_path: string | undefined = target()): void {
|
|
64
|
+
if (log_path === undefined || stop.findings.length === 0) return
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
write(log_path, stop)
|
|
68
|
+
} catch {
|
|
69
|
+
// Recording is best-effort: a failed append is dropped rather than raised into the ship's stop.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function parse_line(line: string): StopLine | undefined {
|
|
74
|
+
return stop_line_schema.safeParse(json_value.parse_or_undefined(line)).data
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function is_present(line: StopLine | undefined): line is StopLine {
|
|
78
|
+
return line !== undefined
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Every recorded finding, oldest first; a malformed line — a write cut short — is skipped.
|
|
82
|
+
function read(log_path: string | undefined = target()): ReadonlyArray<StopLine> {
|
|
83
|
+
const raw = log_path === undefined ? undefined : stamp_file.read_stamp_text(log_path)
|
|
84
|
+
|
|
85
|
+
if (raw === undefined) return []
|
|
86
|
+
|
|
87
|
+
return raw
|
|
88
|
+
.split(LINE_SEPARATOR)
|
|
89
|
+
.map((line) => parse_line(line.trim()))
|
|
90
|
+
.filter(is_present)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const review_stop_log = { read, record, target }
|
|
94
|
+
|
|
95
|
+
export type { ReviewStop, StopLine }
|
|
96
|
+
export { review_stop_log }
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
|
+
import { lane_stats } from '#scripts/lane/lane-stats'
|
|
5
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
6
|
+
import { review_stop_log, type StopLine } from './review-stop-log'
|
|
7
|
+
|
|
8
|
+
// `josh review:stops [--period <days>]` — every review finding that stopped a `josh ship` in the last
|
|
9
|
+
// `<days>` (7 by default), one line each, ordered by kind and then file so the findings of one kind and
|
|
10
|
+
// one place sit together for classification (joshuafolkken/kit#4519). The write half is
|
|
11
|
+
// `review-stop-log.ts`, called on every ship stop.
|
|
12
|
+
|
|
13
|
+
const OPTIONS = { period: { type: 'string' } } as const
|
|
14
|
+
const DEFAULT_PERIOD_DAYS = 7
|
|
15
|
+
const USAGE = 'usage: josh review:stops [--period <days>]'
|
|
16
|
+
const NO_SENTENCE = '(no sentence)'
|
|
17
|
+
const DATE_LENGTH = 10
|
|
18
|
+
// `process.argv` holds the runtime and the script before the command's own arguments.
|
|
19
|
+
const FIRST_ARGUMENT = 2
|
|
20
|
+
|
|
21
|
+
interface StopsContext {
|
|
22
|
+
log_path?: string | undefined
|
|
23
|
+
now_ms?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// An unknown flag or a period that is not a positive whole number of days is refused, never defaulted.
|
|
27
|
+
function period_of(argv: ReadonlyArray<string>): number | undefined {
|
|
28
|
+
const values = cli_flags.values_of(argv, OPTIONS)
|
|
29
|
+
|
|
30
|
+
if (values === undefined) return undefined
|
|
31
|
+
|
|
32
|
+
return cli_flags.to_positive(values.period ?? String(DEFAULT_PERIOD_DAYS))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function compare(left: StopLine, right: StopLine): number {
|
|
36
|
+
const by_kind = left.kind.localeCompare(right.kind)
|
|
37
|
+
|
|
38
|
+
if (by_kind !== 0) return by_kind
|
|
39
|
+
|
|
40
|
+
return left.location.localeCompare(right.location) || left.at.localeCompare(right.at)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function line_of(stop: StopLine): string {
|
|
44
|
+
const sentence = stop.sentence === '' ? NO_SENTENCE : stop.sentence
|
|
45
|
+
const where = `${session_cite.issue(stop.issue)} ${stop.stage} ${stop.at.slice(0, DATE_LENGTH)}`
|
|
46
|
+
|
|
47
|
+
return `${stop.kind} ${stop.location} ${where} — ${sentence}`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function format_report(stops: ReadonlyArray<StopLine>, period_days: number): string {
|
|
51
|
+
const period = `the last ${String(period_days)} day(s)`
|
|
52
|
+
|
|
53
|
+
if (stops.length === 0) return `no review stop findings recorded in ${period}`
|
|
54
|
+
|
|
55
|
+
const body = stops.toSorted(compare).map((stop) => line_of(stop))
|
|
56
|
+
|
|
57
|
+
return [`review stop findings in ${period} (${String(stops.length)}):`, ...body].join('\n')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function run(argv: ReadonlyArray<string>, context: StopsContext = {}): number {
|
|
61
|
+
const period_days = period_of(argv)
|
|
62
|
+
|
|
63
|
+
if (period_days === undefined) {
|
|
64
|
+
console.error(USAGE)
|
|
65
|
+
|
|
66
|
+
return 1
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const window = lane_stats.window_of(period_days, context.now_ms ?? Date.now())
|
|
70
|
+
const stops = lane_stats.in_window(review_stop_log.read(context.log_path), window)
|
|
71
|
+
|
|
72
|
+
console.info(format_report(stops, period_days))
|
|
73
|
+
|
|
74
|
+
return 0
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function main(): void {
|
|
78
|
+
process.exitCode = run(process.argv.slice(FIRST_ARGUMENT))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const review_stops_cli = { format_report, run }
|
|
82
|
+
|
|
83
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
84
|
+
|
|
85
|
+
export { review_stops_cli }
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import path from 'node:path'
|
|
1
|
+
import { input_fingerprint } from '#scripts/gate/input-fingerprint'
|
|
3
2
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
4
3
|
import { git_command } from '#scripts/git/git-command'
|
|
5
|
-
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
4
|
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
7
5
|
|
|
8
6
|
// The tree `josh review:brief` records: every path the change touches, and the digest of its content.
|
|
@@ -18,15 +16,7 @@ import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
|
18
16
|
// A path the change lists but the working tree does not hold — deleted, or renamed away. Recorded
|
|
19
17
|
// rather than dropped: a delete applied by a fix is part of the fix delta, and a dropped entry would
|
|
20
18
|
// read as "unchanged" on the comparison.
|
|
21
|
-
const ABSENT_DIGEST =
|
|
22
|
-
|
|
23
|
-
function digest_of(root: string, relative: string): string {
|
|
24
|
-
try {
|
|
25
|
-
return stamp_file.digest(readFileSync(path.join(root, relative)))
|
|
26
|
-
} catch {
|
|
27
|
-
return ABSENT_DIGEST
|
|
28
|
-
}
|
|
29
|
-
}
|
|
19
|
+
const ABSENT_DIGEST = input_fingerprint.ABSENT
|
|
30
20
|
|
|
31
21
|
// Sorted so two readings of one tree produce the same record byte for byte, which is what lets a
|
|
32
22
|
// stored stamp be compared against a fresh reading without a normalization step in between.
|
|
@@ -39,11 +29,10 @@ function digest_of(root: string, relative: string): string {
|
|
|
39
29
|
// undo then moved the tree under both. Filtered here, every reader of the map
|
|
40
30
|
// — the gate's record, both hooks, the brief and the round-2 fix delta — agrees on it.
|
|
41
31
|
function tree_of(root: string, paths: ReadonlyArray<string>): Record<string, string> {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
.
|
|
45
|
-
|
|
46
|
-
return Object.fromEntries(sorted.map((relative) => [relative, digest_of(root, relative)]))
|
|
32
|
+
return input_fingerprint.of_files(
|
|
33
|
+
root,
|
|
34
|
+
paths.filter((relative) => !observation_ledger.is_ledger_path(relative)),
|
|
35
|
+
)
|
|
47
36
|
}
|
|
48
37
|
|
|
49
38
|
// **The root is asked of git, never taken from `process.cwd()` — nor from `PROJECT_ROOT`, which is
|