@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
|
@@ -25,7 +25,7 @@ import type { CarryOwner, RunCarry } from './run-carry'
|
|
|
25
25
|
// How long after its last write a conversation whose process has gone still counts as continuing. It
|
|
26
26
|
// bridges a restart and a resume — measured at eighteen seconds — with room for a person reopening a
|
|
27
27
|
// window, and it is the order of the wake grace window, so a genuine crash is recovered no later than
|
|
28
|
-
// a lost wake would be retried.
|
|
28
|
+
// a lost wake would be retried. A headless owner is not given it (`run-carry.ts` → `is_owner_live`).
|
|
29
29
|
const CONVERSATION_QUIET_MS = 600_000
|
|
30
30
|
|
|
31
31
|
type Environment = Readonly<Record<string, string | undefined>>
|
|
@@ -323,11 +323,16 @@ function adopt_carry(
|
|
|
323
323
|
// A live pid with no readable start token is conservatively held rather than replaced. The command
|
|
324
324
|
// cannot prove its generation inside that sandbox, but a false `busy` stops for a person while a
|
|
325
325
|
// false `standing` can put two parents on one budget. A record with no pid still resolves false.
|
|
326
|
-
// A gone process whose conversation is still being continued is live (`run-carry-conversation.ts`)
|
|
327
|
-
|
|
328
|
-
|
|
326
|
+
// A gone process whose conversation is still being continued is live (`run-carry-conversation.ts`);
|
|
327
|
+
// a headless owner is never resumed into a new process, so its gone process is a gone owner.
|
|
328
|
+
function is_owner_live(
|
|
329
|
+
carry: RunCarry,
|
|
330
|
+
now: Date = new Date(),
|
|
331
|
+
same_process: typeof process_identity.is_same_process = process_identity.is_same_process,
|
|
332
|
+
): boolean {
|
|
333
|
+
if (same_process(carry.owner_pid, carry.owner_start) !== false) return true
|
|
329
334
|
|
|
330
|
-
return run_carry_conversation.is_conversation_live(carry, now)
|
|
335
|
+
return carry.is_owner_headless !== true && run_carry_conversation.is_conversation_live(carry, now)
|
|
331
336
|
}
|
|
332
337
|
|
|
333
338
|
function is_owned_by(carry: RunCarry, owner: CarryOwner): boolean {
|
|
@@ -126,10 +126,10 @@ function describe_handoff(handoff: Handoff): string {
|
|
|
126
126
|
].join('\n\n')
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
// Where a handoff file is written: `.
|
|
129
|
+
// Where a handoff file is written: `.josh/tmp/` is ignored, so `josh git`, which stages every
|
|
130
130
|
// untracked non-ignored file, cannot commit the note with the code. A refusal that asked for "a file"
|
|
131
131
|
// and named no place got one written beside the code and committed (joshuafolkken/kit#3603).
|
|
132
|
-
const HANDOFF_PATH = '.
|
|
132
|
+
const HANDOFF_PATH = '.josh/tmp/handoff-<N>.json'
|
|
133
133
|
|
|
134
134
|
const run_cut_handoff = {
|
|
135
135
|
HANDOFF_FORMAT,
|
|
@@ -39,10 +39,6 @@ const TEXT_INDEX = 2
|
|
|
39
39
|
const USAGE =
|
|
40
40
|
'Usage: josh run:event --append <kind> <text> | --from <position> | --follow <position> | --watch [<position>] | --last'
|
|
41
41
|
|
|
42
|
-
function now_iso(): string {
|
|
43
|
-
return new Date().toISOString()
|
|
44
|
-
}
|
|
45
|
-
|
|
46
42
|
function report_usage(): number {
|
|
47
43
|
process.stderr.write(`${USAGE}\n`)
|
|
48
44
|
|
|
@@ -54,7 +50,7 @@ async function run_append(kind: string, text: string): Promise<number> {
|
|
|
54
50
|
|
|
55
51
|
if (target === undefined) return report_usage()
|
|
56
52
|
|
|
57
|
-
const result =
|
|
53
|
+
const result = await run_event_stream_emit.append_at(target, kind, text, new Date())
|
|
58
54
|
|
|
59
55
|
if (!result.appended) {
|
|
60
56
|
process.stderr.write(`not a session-facing event kind: ${kind}\n`)
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
has_label_name,
|
|
7
7
|
} from '#scripts/issue/issue-labels'
|
|
8
8
|
|
|
9
|
-
// The text of a `filed` event: the Issue a run filed, its kind, its title,
|
|
10
|
-
// turned it up. `issue:file` writes it and `run:board` reads it
|
|
11
|
-
// two never spell it differently.
|
|
9
|
+
// The text of a `filed` event: the Issue a run filed, its kind, its title, whether a run's own session
|
|
10
|
+
// filed it, and the child whose work turned it up. `issue:file` writes it and `run:board` reads it
|
|
11
|
+
// back, both through this module, so the two never spell it differently.
|
|
12
12
|
|
|
13
13
|
// The classification labels a filing's kind is read from, in precedence order: a breaking change is
|
|
14
14
|
// named as one whatever else it is.
|
|
@@ -25,13 +25,18 @@ interface Filed {
|
|
|
25
25
|
title: string
|
|
26
26
|
// The lane child that was working when the Issue was filed, when the filing came from one.
|
|
27
27
|
found_during: string | undefined
|
|
28
|
+
// A run's own session filed it — the parent holding the run's hold or a lane child — rather than one
|
|
29
|
+
// outside the run sharing the repository's stream (joshuafolkken/kit#4099). An event written before
|
|
30
|
+
// the mark was recorded reads as filed outside.
|
|
31
|
+
is_run?: boolean | undefined
|
|
28
32
|
}
|
|
29
33
|
|
|
30
34
|
// The kind slot is always written, `[<label>]` or `[]`, against the reference with no space: an event
|
|
31
35
|
// written before the kind always has the space there, so no title, whatever it opens with, reads as a
|
|
32
|
-
// kind.
|
|
36
|
+
// kind. The run's mark follows the kind slot, again with no space.
|
|
37
|
+
const RUN_MARK = '[run]'
|
|
33
38
|
const TEXT_PATTERN = new RegExp(
|
|
34
|
-
String.raw`^(?<reference>\S*#\d+)(?:\[(?<kind>${KINDS.join('|')}|)\])? (?<title>.*?)(?: \(found during #(?<during>\d+)\))?$`,
|
|
39
|
+
String.raw`^(?<reference>\S*#\d+)(?:\[(?<kind>${KINDS.join('|')}|)\](?<run>\[run\])?)? (?<title>.*?)(?: \(found during #(?<during>\d+)\))?$`,
|
|
35
40
|
'u',
|
|
36
41
|
)
|
|
37
42
|
|
|
@@ -41,7 +46,7 @@ function kind_of(labels: ReadonlyArray<string>): FiledKind | undefined {
|
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
function text_of(filed: Filed): string {
|
|
44
|
-
const kind = `[${filed.kind ?? ''}]`
|
|
49
|
+
const kind = `[${filed.kind ?? ''}]${filed.is_run === true ? RUN_MARK : ''}`
|
|
45
50
|
const suffix =
|
|
46
51
|
filed.found_during === undefined
|
|
47
52
|
? ''
|
|
@@ -60,6 +65,7 @@ function parse(text: string): Filed | undefined {
|
|
|
60
65
|
kind: KINDS.find((kind) => kind === groups['kind']),
|
|
61
66
|
title: String(groups['title']),
|
|
62
67
|
found_during: groups['during'],
|
|
68
|
+
is_run: groups['run'] !== undefined,
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MS_PER_MINUTE, MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
1
2
|
import type { StreamRead } from './run-event-stream'
|
|
2
3
|
|
|
3
4
|
// The follow read behind `josh run:event --follow` and `--watch`. A reader
|
|
@@ -24,10 +25,8 @@ import type { StreamRead } from './run-event-stream'
|
|
|
24
25
|
// The follow's quiet-tick cadence and how promptly it notices an arrival. The interval only bounds a
|
|
25
26
|
// wait that found nothing — an arrival returns within a tick of landing — so it can be as long as the
|
|
26
27
|
// heartbeat without making an arrival late, and the tick is a cheap `stat` of one file.
|
|
27
|
-
const MS_PER_SECOND = 1000
|
|
28
|
-
const SECONDS_PER_MINUTE = 60
|
|
29
28
|
const FOLLOW_INTERVAL_MINUTES = 20
|
|
30
|
-
const FOLLOW_INTERVAL_MS = FOLLOW_INTERVAL_MINUTES *
|
|
29
|
+
const FOLLOW_INTERVAL_MS = FOLLOW_INTERVAL_MINUTES * MS_PER_MINUTE
|
|
31
30
|
const FOLLOW_TICK_MS = MS_PER_SECOND
|
|
32
31
|
|
|
33
32
|
interface FollowPorts {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { figure_format } from '#scripts/lib/figure-format'
|
|
1
2
|
import type { EventKind, RunEvent } from './run-event-stream'
|
|
2
3
|
|
|
3
4
|
// One run event as the line a person reads in the watch pane. The pane is a script, not a session, so
|
|
@@ -10,8 +11,6 @@ import type { EventKind, RunEvent } from './run-event-stream'
|
|
|
10
11
|
|
|
11
12
|
const JA = 'ja'
|
|
12
13
|
const FIELD_SEPARATOR = ' · '
|
|
13
|
-
const CLOCK_WIDTH = 2
|
|
14
|
-
const CLOCK_PAD = '0'
|
|
15
14
|
|
|
16
15
|
interface KindLabel {
|
|
17
16
|
ja: string
|
|
@@ -48,6 +47,9 @@ const KIND_LABELS: Readonly<Record<EventKind, KindLabel>> = {
|
|
|
48
47
|
'lane-limit': { ja: 'レーン上限', en: 'lane limit' },
|
|
49
48
|
setup: { ja: '準備', en: 'setup' },
|
|
50
49
|
'pr-checks': { ja: 'PR のチェック', en: 'PR checks' },
|
|
50
|
+
'idle-notice': { ja: '待機の通知', en: 'idle notice' },
|
|
51
|
+
'lane-state': { ja: 'レーンの状態', en: 'lane state' },
|
|
52
|
+
'paused-notice': { ja: '一時停止の通知', en: 'paused notice' },
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
const LABELS_BY_KIND: ReadonlyMap<string, KindLabel> = new Map(Object.entries(KIND_LABELS))
|
|
@@ -60,18 +62,12 @@ function label_of(kind: string, lang: string): string {
|
|
|
60
62
|
return lang === JA ? label.ja : label.en
|
|
61
63
|
}
|
|
62
64
|
|
|
63
|
-
function two_digits(value: number): string {
|
|
64
|
-
return String(value).padStart(CLOCK_WIDTH, CLOCK_PAD)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
65
|
// The local wall-clock `HH:MM` of the event, the reading a person watching a pane compares with the clock
|
|
68
66
|
// on their screen; an unparseable stamp is shown as written rather than as `NaN:NaN`.
|
|
69
67
|
function clock_of(at: string): string {
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
if (Number.isNaN(date.getTime())) return at
|
|
68
|
+
const ms = new Date(at).getTime()
|
|
73
69
|
|
|
74
|
-
return
|
|
70
|
+
return Number.isNaN(ms) ? at : figure_format.minute_of(ms)
|
|
75
71
|
}
|
|
76
72
|
|
|
77
73
|
function render(event: RunEvent, lang: string): string {
|
|
@@ -114,7 +114,7 @@ function is_own_ship_event(event: RunEvent, issue: string): boolean {
|
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
// The issue an event's text names, the way every reader here — and `run:board` — keys an event to a child.
|
|
117
|
-
function issue_named(event: RunEvent): string | undefined {
|
|
117
|
+
function issue_named(event: Pick<RunEvent, 'text'>): string | undefined {
|
|
118
118
|
return ISSUE_REFERENCE.exec(event.text)?.[1]
|
|
119
119
|
}
|
|
120
120
|
|
|
@@ -169,7 +169,7 @@ function last_issue_event(
|
|
|
169
169
|
|
|
170
170
|
// A child's launch and the endings `run:merge` settles it with — the ones `run:board` stops drawing it
|
|
171
171
|
// running on. A park or a split already ran `run:merge`, so a child closed after one owes nothing; a
|
|
172
|
-
// withdrawal settles the child itself, its issue
|
|
172
|
+
// withdrawal settles the child itself, its issue left open for the next run.
|
|
173
173
|
const LAUNCH_OR_SETTLE_KINDS: ReadonlySet<string> = new Set([
|
|
174
174
|
KIND.CHILD_LAUNCH,
|
|
175
175
|
KIND.MERGE,
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { lane_state, type LaneStateRecord } from '#scripts/lane/lane-state'
|
|
1
2
|
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { run_board_lane_time } from '#scripts/run/board/run-board-lane-time'
|
|
2
4
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
3
5
|
import { run_event_scope } from './run-event-scope'
|
|
4
|
-
import { run_event_stream, type RunEvent } from './run-event-stream'
|
|
6
|
+
import { run_event_stream, type AppendResult, type RunEvent } from './run-event-stream'
|
|
5
7
|
|
|
6
8
|
// The write side of the run's event stream. It resolves the run's identity and
|
|
7
9
|
// appends, and it is where the "reporting must not break the work it reports on" contract is kept: every
|
|
@@ -27,17 +29,66 @@ async function stream_target(): Promise<string | undefined> {
|
|
|
27
29
|
return repository === undefined ? undefined : run_event_stream.target_of(repository)
|
|
28
30
|
}
|
|
29
31
|
|
|
32
|
+
// The child's lane record; an unreadable one reads as none, so the ending is still written.
|
|
33
|
+
async function lane_record(issue: string): Promise<LaneStateRecord | undefined> {
|
|
34
|
+
try {
|
|
35
|
+
return await lane_state.read_state(issue)
|
|
36
|
+
} catch (error) {
|
|
37
|
+
error_text.trace_swallowed('run_event_stream_emit.lane_record', error)
|
|
38
|
+
|
|
39
|
+
return undefined
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function ending_fields(
|
|
44
|
+
target: string,
|
|
45
|
+
event: Omit<RunEvent, 'pos'>,
|
|
46
|
+
): Promise<Pick<RunEvent, 'elapsed_ms'>> {
|
|
47
|
+
const issue = run_event_scope.issue_named(event)
|
|
48
|
+
|
|
49
|
+
if (issue === undefined || !run_board_lane_time.OFF_LANE_KINDS.has(event.kind)) return {}
|
|
50
|
+
|
|
51
|
+
const elapsed_ms = run_board_lane_time.ending_elapsed({
|
|
52
|
+
events: run_event_stream.read_events(target),
|
|
53
|
+
issue: Number(issue),
|
|
54
|
+
record: await lane_record(issue),
|
|
55
|
+
ended_ms: Date.parse(event.at),
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
return elapsed_ms === undefined ? {} : { elapsed_ms }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Append one event at `at`, an ending with its child's lane time (joshuafolkken/kit#4481). Every writer
|
|
63
|
+
* of an ending — `emit` and `run:event --append` — appends through here, so the time is computed once,
|
|
64
|
+
* as the ending is written, with the board's own count.
|
|
65
|
+
*/
|
|
66
|
+
async function append_at(
|
|
67
|
+
target: string,
|
|
68
|
+
kind: string,
|
|
69
|
+
text: string,
|
|
70
|
+
at: Date,
|
|
71
|
+
): Promise<AppendResult> {
|
|
72
|
+
const event = { kind, text, at: at.toISOString() }
|
|
73
|
+
|
|
74
|
+
return run_event_stream.append_event(target, {
|
|
75
|
+
...event,
|
|
76
|
+
...(await ending_fields(target, event)),
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
30
80
|
/**
|
|
31
81
|
* Append one session-facing event, best-effort. A kind outside the enumeration is refused by `append`;
|
|
32
82
|
* every error is swallowed, because the reporting path must never fail the work it reports on.
|
|
83
|
+
* `at` is the caller's instant where another record must carry the same one.
|
|
33
84
|
*/
|
|
34
|
-
async function emit(kind: string, text: string): Promise<void> {
|
|
85
|
+
async function emit(kind: string, text: string, at: Date = new Date()): Promise<void> {
|
|
35
86
|
try {
|
|
36
87
|
const target = await stream_target()
|
|
37
88
|
|
|
38
89
|
if (target === undefined) return
|
|
39
90
|
|
|
40
|
-
|
|
91
|
+
await append_at(target, kind, text, at)
|
|
41
92
|
} catch {
|
|
42
93
|
// Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
43
94
|
}
|
|
@@ -85,37 +136,52 @@ function invocation_events(repository: string, target: string): ReadonlyArray<Ru
|
|
|
85
136
|
* Append one event unless this kind is already on the stream since the newest `reset_kind` — the
|
|
86
137
|
* episode marker for a condition that holds across other events. `emit_once`'s newest-event test would
|
|
87
138
|
* re-fire each time a parallel lane appended a merge or a park; this ends the episode only at
|
|
88
|
-
* `reset_kind`.
|
|
139
|
+
* `reset_kind`. The text is composed only once the episode is new, so a caller polled every pass whose
|
|
140
|
+
* text costs a network read pays it once. Returns the appended text, or `undefined` when nothing was.
|
|
89
141
|
*/
|
|
90
|
-
async function
|
|
142
|
+
async function emit_once_since_with(
|
|
143
|
+
kind: string,
|
|
144
|
+
reset_kind: string,
|
|
145
|
+
compose: () => Promise<string>,
|
|
146
|
+
): Promise<string | undefined> {
|
|
91
147
|
try {
|
|
92
148
|
const repository = await run_carry.repository_directory()
|
|
93
149
|
|
|
94
|
-
if (repository === undefined) return
|
|
150
|
+
if (repository === undefined) return undefined
|
|
95
151
|
|
|
96
152
|
const target = run_event_stream.target_of(repository)
|
|
97
153
|
|
|
98
154
|
if (run_event_stream.has_since(invocation_events(repository, target), kind, reset_kind)) {
|
|
99
|
-
return
|
|
155
|
+
return undefined
|
|
100
156
|
}
|
|
101
157
|
|
|
102
|
-
|
|
158
|
+
const text = await compose()
|
|
159
|
+
|
|
160
|
+
return run_event_stream.append(target, kind, text, now_iso()).appended ? text : undefined
|
|
103
161
|
} catch (error) {
|
|
104
162
|
// Best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
105
163
|
error_text.trace_swallowed('run_event_stream_emit.emit_once_since', error)
|
|
106
164
|
|
|
107
|
-
return
|
|
165
|
+
return undefined
|
|
108
166
|
}
|
|
109
167
|
}
|
|
110
168
|
|
|
169
|
+
// `emit_once_since_with` for a text already in hand. Returns whether it appended, as `emit_once` does.
|
|
170
|
+
async function emit_once_since(kind: string, text: string, reset_kind: string): Promise<boolean> {
|
|
171
|
+
const appended = await emit_once_since_with(kind, reset_kind, async () => text)
|
|
172
|
+
|
|
173
|
+
return appended !== undefined
|
|
174
|
+
}
|
|
175
|
+
|
|
111
176
|
// One progress heartbeat line onto the stream, so a relay reaches it across a cut.
|
|
112
177
|
async function emit_heartbeat(line: string): Promise<void> {
|
|
113
178
|
await emit(run_event_stream.EVENT_KIND.HEARTBEAT, line)
|
|
114
179
|
}
|
|
115
180
|
|
|
116
|
-
// The events of the invocation now running,
|
|
117
|
-
//
|
|
118
|
-
|
|
181
|
+
// The events of the invocation now running, for a reader restoring the run from its stream
|
|
182
|
+
// (`backlog:drive`). Fail-quiet like the writers: no repository, an unreadable stream or an
|
|
183
|
+
// undetermined scope is an empty invocation.
|
|
184
|
+
async function current_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
119
185
|
try {
|
|
120
186
|
const repository = await run_carry.repository_directory()
|
|
121
187
|
|
|
@@ -125,19 +191,12 @@ async function scoped_current_events(): Promise<ReadonlyArray<RunEvent> | undefi
|
|
|
125
191
|
const scope = run_event_scope.scope_of(read)
|
|
126
192
|
const events = run_event_stream.read_events(run_event_stream.target_of(repository))
|
|
127
193
|
|
|
128
|
-
return run_event_scope.scoped_events(events, scope)
|
|
194
|
+
return run_event_scope.scoped_events(events, scope) ?? []
|
|
129
195
|
} catch {
|
|
130
|
-
return
|
|
196
|
+
return []
|
|
131
197
|
}
|
|
132
198
|
}
|
|
133
199
|
|
|
134
|
-
// The events of the invocation now running, for a reader restoring the run from its stream
|
|
135
|
-
// (`backlog:drive`). Fail-quiet like the writers: no repository, an unreadable stream or an
|
|
136
|
-
// undetermined scope is an empty invocation.
|
|
137
|
-
async function current_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
138
|
-
return (await scoped_current_events()) ?? []
|
|
139
|
-
}
|
|
140
|
-
|
|
141
200
|
// The invocation's events for a writer deciding whether a marker is already there: unlike
|
|
142
201
|
// `current_events`, an undetermined scope keeps the whole stream, so a run with no carry record skips a
|
|
143
202
|
// marker it already wrote rather than writing it twice.
|
|
@@ -167,13 +226,14 @@ async function all_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
|
167
226
|
|
|
168
227
|
const run_event_stream_emit = {
|
|
169
228
|
all_events,
|
|
229
|
+
append_at,
|
|
170
230
|
current_events,
|
|
171
231
|
emit,
|
|
172
232
|
emit_heartbeat,
|
|
173
233
|
emit_once,
|
|
174
234
|
emit_once_since,
|
|
235
|
+
emit_once_since_with,
|
|
175
236
|
invocation_or_all_events,
|
|
176
|
-
scoped_current_events,
|
|
177
237
|
stream_target,
|
|
178
238
|
}
|
|
179
239
|
|
|
@@ -29,10 +29,11 @@ const EVENT_PREFIX = 'josh-run-events-'
|
|
|
29
29
|
// every reader — a person, an editor — that it is a line stream rather than a single document, the same
|
|
30
30
|
// distinction the ambient `.log` draws.
|
|
31
31
|
const EVENT_SUFFIX = '.jsonl'
|
|
32
|
-
// A run's
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
|
|
32
|
+
// A week of a busy run's events, so `josh lane:stats --period 7` reads the parks that end a stop's wait
|
|
33
|
+
// and `run:board` keeps every ship stage (joshuafolkken/kit#3997). A four-lane `backlogrun` wrote about
|
|
34
|
+
// 75 events an hour (1,877 in 25 hours), so fifteen thousand holds about eight days at that rate and
|
|
35
|
+
// still bounds the file to a few megabytes — past it the oldest events roll off.
|
|
36
|
+
const EVENT_CAP = 15_000
|
|
36
37
|
const FIRST_POSITION = 0
|
|
37
38
|
const POSITION_INCREMENT = 1
|
|
38
39
|
const LINE_SEPARATOR = '\n'
|
|
@@ -64,7 +65,7 @@ const EVENT_KIND = {
|
|
|
64
65
|
// (`lane:restart`). It follows the fresh dispatch's `CHILD_LAUNCH`, so it is a launch to the parent and
|
|
65
66
|
// the board, and — like that launch — a batch record a lane child never reads as its own position.
|
|
66
67
|
RESTART: 'restart',
|
|
67
|
-
// A person withdrew a lane child — stopped it and
|
|
68
|
+
// A person withdrew a lane child — stopped it and left its issue open for the next run (`lane:withdraw`).
|
|
68
69
|
// It is written before the stop, so `run:merge` settles the child as withdrawn whatever GitHub says
|
|
69
70
|
// by the time the parent collects it, and counts it as neither a merge, a failure nor an outage.
|
|
70
71
|
WITHDRAW: 'withdraw',
|
|
@@ -143,6 +144,19 @@ const EVENT_KIND = {
|
|
|
143
144
|
// in followup without asking GitHub (joshuafolkken/kit#3770). A trace: it says how the checks stand,
|
|
144
145
|
// not where the run is.
|
|
145
146
|
PR_CHECKS: 'pr-checks',
|
|
147
|
+
// `backlog:drive` reached a watch with no child running and nothing to dispatch — the point a person's
|
|
148
|
+
// hand is wanted. Emitted once per idle episode (`emit_once_since_with`, reset by `CHILD_LAUNCH`), it
|
|
149
|
+
// is the dedup marker for the one idle Telegram. A trace: a drain's retrospective is read off the
|
|
150
|
+
// position beneath it, so the marker must not stand over it.
|
|
151
|
+
IDLE_NOTICE: 'idle-notice',
|
|
152
|
+
// A person paused or resumed a lane child (`lane:pause` / `lane:resume`), so who halted a lane and
|
|
153
|
+
// when is on the stream rather than only in a shell history (joshuafolkken/kit#4268). A trace: it
|
|
154
|
+
// says what a lane's processes were told, not where the run is.
|
|
155
|
+
LANE_STATE: 'lane-state',
|
|
156
|
+
// `backlog:drive` found nothing of the run in flight and only paused lanes left, paused past the
|
|
157
|
+
// silent window (joshuafolkken/kit#4270). Emitted once per pause episode (`emit_once_since_with`,
|
|
158
|
+
// reset by `LANE_STATE`), it is the dedup marker for the one paused-lane Telegram. A trace.
|
|
159
|
+
PAUSED_NOTICE: 'paused-notice',
|
|
146
160
|
} as const
|
|
147
161
|
|
|
148
162
|
type EventKind = (typeof EVENT_KIND)[keyof typeof EVENT_KIND]
|
|
@@ -162,6 +176,9 @@ const TRACE_KINDS: ReadonlySet<string> = new Set([
|
|
|
162
176
|
EVENT_KIND.LANE_LIMIT,
|
|
163
177
|
EVENT_KIND.SETUP,
|
|
164
178
|
EVENT_KIND.PR_CHECKS,
|
|
179
|
+
EVENT_KIND.IDLE_NOTICE,
|
|
180
|
+
EVENT_KIND.LANE_STATE,
|
|
181
|
+
EVENT_KIND.PAUSED_NOTICE,
|
|
165
182
|
])
|
|
166
183
|
|
|
167
184
|
// The trace kinds that say only that the run was alive, so the bound rolls them off first. A `filed` or
|
|
@@ -181,6 +198,9 @@ const event_schema = z.object({
|
|
|
181
198
|
at: z.string(),
|
|
182
199
|
kind: z.string(),
|
|
183
200
|
text: z.string(),
|
|
201
|
+
// The child's time on a lane, recorded once by the writer of an ending (joshuafolkken/kit#4481), so a
|
|
202
|
+
// reader never has to find its launch again. An event written before it has none.
|
|
203
|
+
elapsed_ms: z.number().optional(),
|
|
184
204
|
})
|
|
185
205
|
|
|
186
206
|
type RunEvent = z.infer<typeof event_schema>
|
|
@@ -346,12 +366,12 @@ function append_held(target: string, event: Omit<RunEvent, 'pos'>): number {
|
|
|
346
366
|
* unlocked read-then-rewrite would lose one writer's event to another's. A lock still
|
|
347
367
|
* held after the wait is reported on stderr and thrown, which the best-effort emit side swallows.
|
|
348
368
|
*/
|
|
349
|
-
function
|
|
350
|
-
if (!is_event_kind(kind)) return { appended: false, position: FIRST_POSITION }
|
|
369
|
+
function append_event(target: string, event: Omit<RunEvent, 'pos'>): AppendResult {
|
|
370
|
+
if (!is_event_kind(event.kind)) return { appended: false, position: FIRST_POSITION }
|
|
351
371
|
|
|
352
372
|
const lock = `${target}${LOCK_SUFFIX}`
|
|
353
373
|
const position = repository_lock.with_lock_sync(
|
|
354
|
-
() => append_held(target,
|
|
374
|
+
() => append_held(target, event),
|
|
355
375
|
lock,
|
|
356
376
|
LOCK_WAIT_MS,
|
|
357
377
|
)
|
|
@@ -366,6 +386,11 @@ function append(target: string, kind: string, text: string, at: string): AppendR
|
|
|
366
386
|
return { appended: true, position }
|
|
367
387
|
}
|
|
368
388
|
|
|
389
|
+
// `append_event` for an event that records nothing beyond its kind, text and instant.
|
|
390
|
+
function append(target: string, kind: string, text: string, at: string): AppendResult {
|
|
391
|
+
return append_event(target, { at, kind, text })
|
|
392
|
+
}
|
|
393
|
+
|
|
369
394
|
/**
|
|
370
395
|
* Every event after `position`, in order, and the position a reader passes back next time.
|
|
371
396
|
*
|
|
@@ -415,6 +440,7 @@ const run_event_stream = {
|
|
|
415
440
|
EVENT_KINDS,
|
|
416
441
|
TRACE_KINDS,
|
|
417
442
|
append,
|
|
443
|
+
append_event,
|
|
418
444
|
format_event,
|
|
419
445
|
has_since,
|
|
420
446
|
is_stage_start,
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
|
|
3
|
+
import { run_label } from '#scripts/run/run-label'
|
|
4
|
+
import { run_hold } from './run-hold'
|
|
5
|
+
|
|
6
|
+
// `josh run:hold --adopt <N>` — a `new` run's hand-over once its Issue is filed (joshuafolkken/kit#4156).
|
|
7
|
+
// The unnumbered record is re-keyed in place to `<N>`, so every later stop of the run releases with
|
|
8
|
+
// `run:release <N>` and that release takes `in-progress` back off; the adopt applies the label the
|
|
9
|
+
// numbered entry would have. **In place, not released and re-claimed**: a release would free the tree
|
|
10
|
+
// for a moment another session could claim it in, and the record's owner and stop marks stay as written.
|
|
11
|
+
|
|
12
|
+
const ADOPTED = 'adopted'
|
|
13
|
+
// The tree holds no record, so there is nothing to hand over.
|
|
14
|
+
const NO_RECORD = 'none'
|
|
15
|
+
const FOREIGN = 'foreign'
|
|
16
|
+
const UNREADABLE = 'unreadable'
|
|
17
|
+
|
|
18
|
+
type AdoptResult = typeof ADOPTED | typeof FOREIGN | typeof NO_RECORD | typeof UNREADABLE
|
|
19
|
+
|
|
20
|
+
// The record re-keyed: the unnumbered run's own, or one already naming `<N>` — a repeated adopt is
|
|
21
|
+
// the same hand-over, so it answers alike. Another issue's record is never touched.
|
|
22
|
+
function rekey(target: string, issue: string): AdoptResult {
|
|
23
|
+
const read = run_hold.read_hold(target)
|
|
24
|
+
|
|
25
|
+
if (read.kind === 'unreadable') return UNREADABLE
|
|
26
|
+
|
|
27
|
+
const hold = run_halfrun_resume.hold_of(read)
|
|
28
|
+
|
|
29
|
+
if (hold === undefined) return NO_RECORD
|
|
30
|
+
|
|
31
|
+
if (hold.issue !== run_hold.UNNUMBERED_ISSUE && hold.issue !== issue) return FOREIGN
|
|
32
|
+
|
|
33
|
+
stamp_file.write_stamp(target, { ...hold, issue })
|
|
34
|
+
|
|
35
|
+
return ADOPTED
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function no_record_message(issue: string): string {
|
|
39
|
+
return `run:hold --adopt: this tree holds no record to adopt — claim it with \`pnpm josh run:hold ${issue}\`.`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Not the claim race's message: that one advises `--force`, which here would free another run's tree.
|
|
43
|
+
function foreign_message(issue: string): string {
|
|
44
|
+
return `run:hold --adopt: this tree is held for another issue, so it is not handed to issue ${issue}; \`--adopt\` only re-keys a \`new\` run's unnumbered record.`
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function adopt(target: string, issue: string): Promise<AdoptResult> {
|
|
48
|
+
const result = rekey(target, issue)
|
|
49
|
+
|
|
50
|
+
if (result === ADOPTED) await run_label.mark(issue)
|
|
51
|
+
|
|
52
|
+
return result
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const run_hold_adopt = {
|
|
56
|
+
ADOPTED,
|
|
57
|
+
NO_RECORD,
|
|
58
|
+
UNREADABLE,
|
|
59
|
+
adopt,
|
|
60
|
+
foreign_message,
|
|
61
|
+
no_record_message,
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export type { AdoptResult }
|
|
65
|
+
export { run_hold_adopt }
|