@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,116 +1,86 @@
|
|
|
1
|
-
import { lane_await } from '#scripts/lane/lane-await'
|
|
2
|
-
import { run_progress } from '#scripts/run/progress/run-progress'
|
|
3
1
|
import type { ClosedIssue } from './run-board-closed'
|
|
2
|
+
import type { EarlierLanes } from './run-board-earlier'
|
|
3
|
+
import type { FrameBounds } from './run-board-fold'
|
|
4
|
+
import type { GatherRead } from './run-board-gather'
|
|
4
5
|
import { run_board_github } from './run-board-github'
|
|
5
6
|
import { run_board_header, type BoardHeader } from './run-board-header'
|
|
6
|
-
import { run_board_idle } from './run-board-idle'
|
|
7
7
|
import { run_board_labels } from './run-board-labels'
|
|
8
8
|
import { run_board_layout, type BoardLayout, type BoardPlan } from './run-board-layout'
|
|
9
9
|
import { run_board_link } from './run-board-link'
|
|
10
|
-
import { run_board_machine } from './run-board-machine'
|
|
11
10
|
import { run_board_notes, type Titles } from './run-board-notes'
|
|
12
11
|
import type { LocalRead } from './run-board-read'
|
|
13
|
-
import { run_board_reason } from './run-board-reason'
|
|
14
|
-
import {
|
|
12
|
+
import { run_board_reason, type ReasonRead } from './run-board-reason'
|
|
13
|
+
import { run_board_released } from './run-board-released'
|
|
14
|
+
import { run_board_render } from './run-board-render'
|
|
15
|
+
import type { Known } from './run-board-snapshot'
|
|
15
16
|
import { run_board_spin, type Spun } from './run-board-spin'
|
|
16
17
|
import { run_board_state, type BoardPorts, type BoardState, type Pace } from './run-board-state'
|
|
17
|
-
import { run_board_status, type RunActivity } from './run-board-status'
|
|
18
|
+
import { run_board_status, type ItemStatus, type RunActivity } from './run-board-status'
|
|
18
19
|
import { run_board_thanks } from './run-board-thanks'
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
// live board never waits on. Between reads the last one is kept and drawn against the current time.
|
|
27
|
-
// A run that ended stays on screen until the next one starts. With no run in this checkout it reads
|
|
28
|
-
// nothing from GitHub. The machine is sampled once a second: one `sysctl` takes a few milliseconds,
|
|
29
|
-
// and its gauges are the differences between consecutive samples.
|
|
20
|
+
|
|
21
|
+
// One `run:board` redraw. The frame is redrawn once a second, on the second, so every elapsed time
|
|
22
|
+
// moves by one, its spinners turned between redraws by `run-board-spin.ts`. It draws the last reads
|
|
23
|
+
// off this machine (`run-board-gather.ts`) — a live board's taken on a worker thread, so the redraw
|
|
24
|
+
// itself reads nothing that could stop a spinner — laid over the GitHub reads, `run-board-github.ts`'s,
|
|
25
|
+
// which a live board never waits on. A run that ended stays on screen until the next one starts. With
|
|
26
|
+
// no run in this checkout it reads nothing from GitHub.
|
|
30
27
|
|
|
31
28
|
const { REDRAW_MS, SPOT } = run_board_spin
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const LOCAL_READ_MS = LOCAL_READ_SECONDS * run_progress.MS_PER_SECOND
|
|
35
|
-
const { FRESH_STATE, is_due } = run_board_state
|
|
36
|
-
const { PLAN_RETRY_MS, gather_github, statuses_for } = run_board_github
|
|
29
|
+
const { FRESH_STATE } = run_board_state
|
|
30
|
+
const { PLAN_RETRY_MS, gather_github, known_of, open_read_of, statuses_for } = run_board_github
|
|
37
31
|
const { gather_thanks } = run_board_thanks
|
|
38
32
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return { ...state, local, read_ms: now_ms, idle_since }
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// A single frame has no earlier read to confirm an idle lane against (`run-board-idle.ts`).
|
|
47
|
-
function is_unconfirmed(before: BoardState, read: BoardState, pace: Pace): boolean {
|
|
48
|
-
return pace === 'settled' && before.read_ms === undefined && read.idle_since.size > 0
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function reread(state: BoardState, ports: BoardPorts, pace: Pace): Promise<BoardState> {
|
|
52
|
-
const now_ms = ports.now()
|
|
53
|
-
|
|
54
|
-
if (!is_due(state.read_ms, LOCAL_READ_MS, now_ms)) return state
|
|
55
|
-
|
|
56
|
-
const read = await read_at(state, ports, now_ms)
|
|
33
|
+
// What the last board on this run kept (`run-board-snapshot.ts`); one written on another run is
|
|
34
|
+
// discarded.
|
|
35
|
+
function saved_for(ports: BoardPorts, started_ms: number): Pick<BoardState, 'known' | 'closed'> {
|
|
36
|
+
const snapshot = ports.snapshot?.load()
|
|
57
37
|
|
|
58
|
-
if (
|
|
38
|
+
if (snapshot?.run_started_ms !== started_ms) return FRESH_STATE
|
|
59
39
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return await read_at(read, ports, ports.now())
|
|
40
|
+
return { known: { titles: snapshot.titles, labels: snapshot.labels }, closed: snapshot.closed }
|
|
63
41
|
}
|
|
64
42
|
|
|
65
|
-
//
|
|
66
|
-
|
|
43
|
+
// The state of the run on screen, over the reads just taken; a different run starts its plan state
|
|
44
|
+
// from what the last board on it kept, or from nothing, so no row, count or baseline of the previous
|
|
45
|
+
// run is drawn over the new one.
|
|
46
|
+
function state_for(
|
|
67
47
|
state: BoardState,
|
|
48
|
+
read: GatherRead,
|
|
49
|
+
local: LocalRead,
|
|
68
50
|
ports: BoardPorts,
|
|
69
|
-
):
|
|
70
|
-
|
|
71
|
-
const usages = usage === undefined ? undefined : run_board_usage.usage_of(state.usage, usage)
|
|
72
|
-
|
|
73
|
-
return { usage, usages }
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// The sample is timed when it is taken, not when the tick began: a plan read between the two would put
|
|
77
|
-
// its seconds on the wrong side of the rate's interval. It is due by the tick's clock, so a sample
|
|
78
|
-
// taken a few milliseconds into its tick does not slip to the redraw after the second.
|
|
79
|
-
async function resample(state: BoardState, ports: BoardPorts, now_ms: number): Promise<BoardState> {
|
|
80
|
-
if (!is_due(state.sampled_ms, MACHINE_SAMPLE_MS, now_ms)) return state
|
|
51
|
+
): BoardState {
|
|
52
|
+
if (state.run_started_ms === local.started_ms) return { ...state, ...read }
|
|
81
53
|
|
|
82
|
-
const
|
|
83
|
-
const machine = { sample: await ports.read_machine(), at_ms }
|
|
84
|
-
const gauges = run_board_machine.gauges_of(state.machine, machine)
|
|
54
|
+
const saved = saved_for(ports, local.started_ms)
|
|
85
55
|
|
|
86
|
-
return { ...
|
|
56
|
+
return { ...FRESH_STATE, ...saved, ...read, run_started_ms: local.started_ms }
|
|
87
57
|
}
|
|
88
58
|
|
|
89
|
-
// The
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const { local: kept, read_ms, idle_since } = state
|
|
59
|
+
// The titles and labels with a closed child's under the listing's own.
|
|
60
|
+
function closed_under(known: Known, closed: ReadonlyMap<number, ClosedIssue>): Known {
|
|
61
|
+
const closed_titles = [...closed].map(([issue, { title }]) => [issue, title] as const)
|
|
62
|
+
const closed_labels = [...closed].map(([issue, { labels }]) => [issue, labels] as const)
|
|
95
63
|
|
|
96
|
-
return {
|
|
64
|
+
return {
|
|
65
|
+
titles: new Map([...closed_titles, ...known.titles]),
|
|
66
|
+
labels: new Map([...closed_labels, ...known.labels]),
|
|
67
|
+
}
|
|
97
68
|
}
|
|
98
69
|
|
|
99
70
|
// The plan with a closed child's title and labels under the listing's own.
|
|
100
71
|
function with_closed(plan: BoardPlan, closed: ReadonlyMap<number, ClosedIssue>): BoardPlan {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
72
|
+
const { titles, labels } = closed_under(
|
|
73
|
+
{ titles: plan.context.titles, labels: plan.labels },
|
|
74
|
+
closed,
|
|
75
|
+
)
|
|
105
76
|
|
|
106
77
|
return { ...plan, context: { ...plan.context, titles }, labels }
|
|
107
78
|
}
|
|
108
79
|
|
|
109
|
-
// The titles the findings name a parked issue by — the rows' own;
|
|
80
|
+
// The titles the findings name a parked issue by — the rows' own; the snapshot's before the plan is
|
|
81
|
+
// read.
|
|
110
82
|
function titles_of(state: BoardState): Titles {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return with_closed(state.plan, state.closed).context.titles
|
|
83
|
+
return closed_under(known_of(state), state.closed).titles
|
|
114
84
|
}
|
|
115
85
|
|
|
116
86
|
// A run `run:carry --end` closed and one nobody drives any more are both drawn as stopped.
|
|
@@ -121,37 +91,75 @@ function activity_here(local: LocalRead): RunActivity {
|
|
|
121
91
|
)
|
|
122
92
|
}
|
|
123
93
|
|
|
94
|
+
type RoomRead = Pick<
|
|
95
|
+
ReasonRead,
|
|
96
|
+
'free_lanes' | 'occupied_count' | 'lane_limit' | 'is_memory_held' | 'gauges'
|
|
97
|
+
>
|
|
98
|
+
|
|
99
|
+
// The room a waiting row is weighed against: the lanes under the limit, and the machine's memory.
|
|
100
|
+
function room_of(state: BoardState, local: LocalRead): RoomRead {
|
|
101
|
+
return {
|
|
102
|
+
free_lanes: local.free_lanes,
|
|
103
|
+
occupied_count: local.occupied_count,
|
|
104
|
+
lane_limit: local.lane_limit,
|
|
105
|
+
is_memory_held: local.is_memory_held,
|
|
106
|
+
gauges: state.gauges,
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// The run's statuses over the plan, a child read closed settled and one a person released left out.
|
|
111
|
+
function planned_statuses(
|
|
112
|
+
state: BoardState,
|
|
113
|
+
plan: BoardPlan,
|
|
114
|
+
local: LocalRead,
|
|
115
|
+
): ReadonlyMap<number, ItemStatus> {
|
|
116
|
+
const read = open_read_of(state, plan)
|
|
117
|
+
|
|
118
|
+
return run_board_released.without_released(
|
|
119
|
+
run_board_status.settle_closed(statuses_for(state, local), read),
|
|
120
|
+
read,
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// The earlier run's lanes still holding a place, and the open lanes with no record.
|
|
125
|
+
function earlier_here(local: LocalRead): EarlierLanes {
|
|
126
|
+
return {
|
|
127
|
+
lanes: local.earlier_occupied ?? [],
|
|
128
|
+
statuses: local.lane_states.earlier,
|
|
129
|
+
unknown: local.lane_states.unknown,
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
124
133
|
// The plan laid under its statuses, each waiting row saying why it waits.
|
|
125
134
|
function planned_layout(state: BoardState, plan: BoardPlan, local: LocalRead): BoardLayout {
|
|
126
|
-
const
|
|
127
|
-
const read = {
|
|
128
|
-
open_numbers: plan.context.open_numbers,
|
|
129
|
-
read_ms: state.fetched_ms,
|
|
130
|
-
closed,
|
|
131
|
-
labels: plan.labels,
|
|
132
|
-
}
|
|
133
|
-
const statuses = run_board_status.settle_closed(statuses_for(state, plan, local), read)
|
|
135
|
+
const statuses = planned_statuses(state, plan, local)
|
|
134
136
|
const reason_of = run_board_reason.reader({
|
|
135
137
|
plan,
|
|
136
138
|
statuses,
|
|
137
139
|
events: local.events,
|
|
138
|
-
|
|
140
|
+
...room_of(state, local),
|
|
141
|
+
carry: local.carry,
|
|
139
142
|
is_stopped: activity_here(local).is_stopped,
|
|
140
143
|
})
|
|
141
144
|
|
|
142
|
-
return run_board_layout.layout_of(
|
|
145
|
+
return run_board_layout.layout_of(
|
|
146
|
+
with_closed(plan, state.closed),
|
|
147
|
+
statuses,
|
|
148
|
+
reason_of,
|
|
149
|
+
earlier_here(local),
|
|
150
|
+
)
|
|
143
151
|
}
|
|
144
152
|
|
|
145
|
-
// The statuses scoped to the run's plan, a running child
|
|
146
|
-
// Before the plan is read, the run's own children alone.
|
|
153
|
+
// The statuses scoped to the run's plan, a running child GitHub read closed settled.
|
|
154
|
+
// Before the plan is read, the run's own children alone, named and settled as the snapshot left them.
|
|
147
155
|
function layout_for(state: BoardState, local: LocalRead): BoardLayout {
|
|
148
156
|
if (state.plan !== undefined) return planned_layout(state, state.plan, local)
|
|
149
157
|
|
|
150
|
-
const
|
|
158
|
+
const read = open_read_of(state, undefined)
|
|
159
|
+
const statuses = run_board_status.settle_closed(statuses_for(state, local), read)
|
|
160
|
+
const known = closed_under(state.known, state.closed)
|
|
151
161
|
|
|
152
|
-
return run_board_layout.local_layout_of(
|
|
153
|
-
run_board_status.statuses_of(local.events, local.lanes, new Set(), stopped),
|
|
154
|
-
)
|
|
162
|
+
return run_board_layout.local_layout_of(statuses, earlier_here(local), known)
|
|
155
163
|
}
|
|
156
164
|
|
|
157
165
|
// What one redraw draws with.
|
|
@@ -163,7 +171,7 @@ interface Redraw {
|
|
|
163
171
|
// What the header reads off the local read.
|
|
164
172
|
type LocalHeader = Pick<
|
|
165
173
|
BoardHeader,
|
|
166
|
-
'started_ms' | 'ended_ms' | 'activity' | 'operations' | 'usual'
|
|
174
|
+
'started_ms' | 'ended_ms' | 'activity' | 'operations' | 'usual' | 'lane_limit'
|
|
167
175
|
>
|
|
168
176
|
|
|
169
177
|
function local_header(local: LocalRead): LocalHeader {
|
|
@@ -173,6 +181,7 @@ function local_header(local: LocalRead): LocalHeader {
|
|
|
173
181
|
activity: activity_here(local),
|
|
174
182
|
operations: local.operations,
|
|
175
183
|
usual: local.usual,
|
|
184
|
+
lane_limit: local.lane_limit,
|
|
176
185
|
}
|
|
177
186
|
}
|
|
178
187
|
|
|
@@ -189,9 +198,12 @@ function header_of(
|
|
|
189
198
|
baseline_total: state.baseline_total,
|
|
190
199
|
plan_fetched_ms: state.fetched_ms,
|
|
191
200
|
plan_failed_ms: state.failed_ms,
|
|
201
|
+
read_failed_ms: state.read_failed_ms,
|
|
202
|
+
read_error: state.read_error,
|
|
192
203
|
is_plan_loading: state.plan_fetch !== undefined,
|
|
193
204
|
machine: state.gauges,
|
|
194
205
|
usages: state.usages,
|
|
206
|
+
budget_waits: state.budget_waits,
|
|
195
207
|
form: redraw.ports.form,
|
|
196
208
|
repo: state.plan?.context.repo,
|
|
197
209
|
spinner: redraw.ports.is_tty ? SPOT : undefined,
|
|
@@ -201,7 +213,7 @@ function header_of(
|
|
|
201
213
|
|
|
202
214
|
// The pane a live frame is kept within and the footer it ends on, read at every redraw.
|
|
203
215
|
function bounds_of(ports: BoardPorts): FrameBounds {
|
|
204
|
-
return { size: ports.size?.(), footer: ports.footer }
|
|
216
|
+
return { size: ports.size?.(), footer: ports.footer, folded: ports.folded?.() }
|
|
205
217
|
}
|
|
206
218
|
|
|
207
219
|
// The frame with its spinners drawn at this moment's frame, and where they are on screen.
|
|
@@ -209,7 +221,11 @@ function frame_of(state: BoardState, local: LocalRead, layout: BoardLayout, redr
|
|
|
209
221
|
const bounds = bounds_of(redraw.ports)
|
|
210
222
|
const lines = run_board_render.render({
|
|
211
223
|
header: header_of(state, local, layout, redraw),
|
|
212
|
-
notes: run_board_notes.notes_of(
|
|
224
|
+
notes: run_board_notes.notes_of(
|
|
225
|
+
local.events,
|
|
226
|
+
titles_of(state),
|
|
227
|
+
run_board_layout.listed_parks(layout),
|
|
228
|
+
),
|
|
213
229
|
resume: local.resume,
|
|
214
230
|
thanks: state.thanks,
|
|
215
231
|
link: redraw.ports.link,
|
|
@@ -244,27 +260,30 @@ async function tick(
|
|
|
244
260
|
ports: BoardPorts,
|
|
245
261
|
pace: Pace = 'settled',
|
|
246
262
|
): Promise<BoardState> {
|
|
247
|
-
const read = await
|
|
263
|
+
const read = await ports.gather(pace)
|
|
248
264
|
// Taken after the read, which a single frame may have waited on to confirm an idle lane.
|
|
249
265
|
const now_ms = ports.now()
|
|
250
266
|
const { local } = read
|
|
251
267
|
|
|
252
268
|
if (local === undefined) {
|
|
253
|
-
draw(ports, run_board_render.render_no_run(now_ms, bounds_of(ports)))
|
|
269
|
+
draw(ports, run_board_render.render_no_run(now_ms, bounds_of(ports), read))
|
|
254
270
|
|
|
255
|
-
return { ...read, spots: [] }
|
|
271
|
+
return { ...state, ...read, spots: [] }
|
|
256
272
|
}
|
|
257
273
|
|
|
258
|
-
const gathered = await gather_github(state_for(read, local
|
|
274
|
+
const gathered = await gather_github(state_for(state, read, local, ports), {
|
|
275
|
+
ports,
|
|
276
|
+
local,
|
|
277
|
+
now_ms,
|
|
278
|
+
pace,
|
|
279
|
+
})
|
|
259
280
|
const thanked = await gather_thanks(gathered, ports, now_ms, pace)
|
|
260
281
|
|
|
261
|
-
return draw_run(
|
|
282
|
+
return draw_run(thanked, local, { ports, now_ms })
|
|
262
283
|
}
|
|
263
284
|
|
|
264
285
|
const run_board_tick = {
|
|
265
286
|
FRESH_STATE,
|
|
266
|
-
LOCAL_READ_MS,
|
|
267
|
-
MACHINE_SAMPLE_MS,
|
|
268
287
|
PLAN_RETRY_MS,
|
|
269
288
|
REDRAW_MS,
|
|
270
289
|
tick,
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { TableRead } from '#scripts/lane/lane-process-table'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
3
|
+
import type { GatherPorts, GatherState } from './run-board-gather'
|
|
4
|
+
import type { BoardUsage } from './run-board-header'
|
|
5
|
+
import { run_board_process_groups, type GroupSources } from './run-board-process-groups'
|
|
6
|
+
import type { LocalRead } from './run-board-read'
|
|
7
|
+
import { run_board_usage, type ProcessFigures, type UsageMark } from './run-board-usage'
|
|
8
|
+
|
|
9
|
+
// What a reading draws: each lane's CPU/MEM/CMPRS and the 💻 section's groups, both from the same
|
|
10
|
+
// differences between this reading and the last. A frame drawn once has no last reading, so it reads
|
|
11
|
+
// twice a second apart; otherwise its CPU would be blank.
|
|
12
|
+
|
|
13
|
+
const PRIME_MS = MS_PER_SECOND
|
|
14
|
+
|
|
15
|
+
type UsageRead = Pick<GatherState, 'usage' | 'usages'>
|
|
16
|
+
|
|
17
|
+
// Before the first local read: no lane open, no root running, nothing stuck.
|
|
18
|
+
const NO_LOCAL: Pick<LocalRead, 'closing' | 'lanes' | 'roots' | 'stuck'> = { lanes: [] }
|
|
19
|
+
|
|
20
|
+
function sources_of(
|
|
21
|
+
mark: UsageMark,
|
|
22
|
+
figures: ProcessFigures,
|
|
23
|
+
local: LocalRead | undefined,
|
|
24
|
+
): GroupSources {
|
|
25
|
+
const { closing = new Set(), lanes, roots = {}, stuck = new Map() } = local ?? NO_LOCAL
|
|
26
|
+
|
|
27
|
+
return { mark, figures, open_lanes: new Set(lanes.map(Number)), roots, stuck, closing }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function board_usage_of(
|
|
31
|
+
before: UsageMark | undefined,
|
|
32
|
+
after: UsageMark,
|
|
33
|
+
local: LocalRead | undefined,
|
|
34
|
+
): BoardUsage {
|
|
35
|
+
const figures = run_board_usage.process_figures(before, after)
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
lanes: run_board_usage.usage_of(after, figures),
|
|
39
|
+
processes: run_board_process_groups.groups_of(sources_of(after, figures, local)),
|
|
40
|
+
scale: { cores: after.cores, total_bytes: after.total_bytes },
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// A primed frame's two readings each take a snapshot of their own: the redraw's was taken before the
|
|
45
|
+
// lane read's confirmation wait and the GitHub reads, so it would stretch the first second.
|
|
46
|
+
async function primed(
|
|
47
|
+
state: GatherState,
|
|
48
|
+
ports: GatherPorts,
|
|
49
|
+
table: TableRead,
|
|
50
|
+
): Promise<{ before: UsageMark | undefined; table: TableRead }> {
|
|
51
|
+
if (ports.is_live || state.usage !== undefined) return { before: state.usage, table }
|
|
52
|
+
|
|
53
|
+
const first = await ports.read_usage(undefined, ports.read_table)
|
|
54
|
+
|
|
55
|
+
if (first !== undefined) await ports.sleep(PRIME_MS)
|
|
56
|
+
|
|
57
|
+
return { before: first, table: ports.read_table }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Read on the machine's second; a reading that failed draws no usage but keeps the last reading, so the
|
|
61
|
+
// next reading after a `ps` timed out under load spans the gap.
|
|
62
|
+
async function read_usages(
|
|
63
|
+
state: GatherState,
|
|
64
|
+
ports: GatherPorts,
|
|
65
|
+
table: TableRead,
|
|
66
|
+
): Promise<UsageRead> {
|
|
67
|
+
const primer = await primed(state, ports, table)
|
|
68
|
+
const { before } = primer
|
|
69
|
+
const usage = await ports.read_usage(before, primer.table)
|
|
70
|
+
|
|
71
|
+
if (usage === undefined) return { usage: before, usages: undefined }
|
|
72
|
+
|
|
73
|
+
return { usage, usages: board_usage_of(before, usage, state.local) }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const run_board_usage_board = { PRIME_MS, board_usage_of, read_usages }
|
|
77
|
+
|
|
78
|
+
export { run_board_usage_board }
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { process_directories } from '#scripts/lane/process-directories'
|
|
2
|
+
|
|
3
|
+
// Which lane `run:board` counts each listed process in.
|
|
4
|
+
// **The working directory first:** a process whose directory sits under this repository's
|
|
5
|
+
// `.kit-lanes/<N>` is lane N's — looked up once and remembered, since a process detached with
|
|
6
|
+
// `josh ship --detach` is re-parented and no longer traceable to its lane by its ancestry.
|
|
7
|
+
// **Its nearest ancestor's lane next:** a process whose directory names no lane — `lsof` did not
|
|
8
|
+
// answer for it, or it works outside the lane — is counted in the lane of the nearest ancestor that
|
|
9
|
+
// has one, so a gate's eslint started inside a lane is that lane's whatever its directory read gave.
|
|
10
|
+
// **A process a lookup cut short left out is asked again on the next sample**, never remembered as
|
|
11
|
+
// being in no lane: such a miss pinned a 130%-CPU eslint to none for its whole life
|
|
12
|
+
// (joshuafolkken/kit#4359). What it did answer is kept, so under sustained load each sample asks fewer
|
|
13
|
+
// rather than every process again. A process a finished `lsof` left out — another user's, which a
|
|
14
|
+
// non-root `lsof` never reads, or one gone — is remembered, since asking again would rerun `lsof` every
|
|
15
|
+
// second.
|
|
16
|
+
|
|
17
|
+
interface DirectoryRead {
|
|
18
|
+
// The working directory of each process that answered.
|
|
19
|
+
directories: ReadonlyMap<number, string>
|
|
20
|
+
// Whether the lookup ran to its end; a process missing from one cut short is asked again.
|
|
21
|
+
is_complete: boolean
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface LaneLookup {
|
|
25
|
+
directories: (pids: ReadonlyArray<number>) => Promise<DirectoryRead>
|
|
26
|
+
// The board's own lanes root.
|
|
27
|
+
root: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface ProcessLanes {
|
|
31
|
+
// Every listed process's lane, `undefined` for one under none.
|
|
32
|
+
lanes: ReadonlyMap<number, string | undefined>
|
|
33
|
+
// The processes whose lookup was cut short — asked again next time.
|
|
34
|
+
unread: ReadonlySet<number>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function directory_lane(directory: string | undefined, root: string): string | undefined {
|
|
38
|
+
return directory === undefined ? undefined : process_directories.lane_of(directory, root)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// The lanes still worth keeping: a gone process dropped, and one left unread asked again.
|
|
42
|
+
function remembered(
|
|
43
|
+
before: ProcessLanes | undefined,
|
|
44
|
+
parents: ReadonlyMap<number, number>,
|
|
45
|
+
): Map<number, string | undefined> {
|
|
46
|
+
if (before === undefined) return new Map()
|
|
47
|
+
|
|
48
|
+
return new Map([...before.lanes].filter(([pid]) => parents.has(pid) && !before.unread.has(pid)))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// A process's ancestors, nearest first, each listed once.
|
|
52
|
+
function ancestors_of(pid: number, parents: ReadonlyMap<number, number>): Array<number> {
|
|
53
|
+
const chain: Array<number> = []
|
|
54
|
+
let ancestor = parents.get(pid)
|
|
55
|
+
|
|
56
|
+
while (ancestor !== undefined && !chain.includes(ancestor)) {
|
|
57
|
+
chain.push(ancestor)
|
|
58
|
+
ancestor = parents.get(ancestor)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return chain
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function ancestor_lane(
|
|
65
|
+
pid: number,
|
|
66
|
+
known: ReadonlyMap<number, string | undefined>,
|
|
67
|
+
parents: ReadonlyMap<number, number>,
|
|
68
|
+
): string | undefined {
|
|
69
|
+
return ancestors_of(pid, parents)
|
|
70
|
+
.map((ancestor) => known.get(ancestor))
|
|
71
|
+
.find((lane) => lane !== undefined)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// The working directories of `fresh`, with no lookup run when there is none to ask about.
|
|
75
|
+
async function directories_of(
|
|
76
|
+
fresh: ReadonlyArray<number>,
|
|
77
|
+
lookup: LaneLookup,
|
|
78
|
+
): Promise<DirectoryRead> {
|
|
79
|
+
if (fresh.length === 0) return { directories: new Map(), is_complete: true }
|
|
80
|
+
|
|
81
|
+
return await lookup.directories(fresh)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function unread_of(fresh: ReadonlyArray<number>, read: DirectoryRead): Set<number> {
|
|
85
|
+
return new Set(read.is_complete ? [] : fresh.filter((pid) => !read.directories.has(pid)))
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// The lanes of the processes `parents` lists: one not seen before, or left unread, looked up.
|
|
89
|
+
// The ancestry fallback assumes no long-lived process outside a lane's tree — a tmux server, a shell —
|
|
90
|
+
// was started inside `.kit-lanes/<N>`; one that was pulls its descendants into that lane.
|
|
91
|
+
async function lanes_for(
|
|
92
|
+
before: ProcessLanes | undefined,
|
|
93
|
+
parents: ReadonlyMap<number, number>,
|
|
94
|
+
lookup: LaneLookup,
|
|
95
|
+
): Promise<ProcessLanes> {
|
|
96
|
+
const kept = remembered(before, parents)
|
|
97
|
+
const fresh = [...parents.keys()].filter((pid) => !kept.has(pid))
|
|
98
|
+
const read = await directories_of(fresh, lookup)
|
|
99
|
+
const found = fresh.map(
|
|
100
|
+
(pid) => [pid, directory_lane(read.directories.get(pid), lookup.root)] as const,
|
|
101
|
+
)
|
|
102
|
+
const known = new Map([...kept, ...found])
|
|
103
|
+
const lanes = [...known].map(
|
|
104
|
+
([pid, lane]) => [pid, lane ?? ancestor_lane(pid, known, parents)] as const,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return { lanes: new Map(lanes), unread: unread_of(fresh, read) }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const run_board_usage_lanes = { lanes_for }
|
|
111
|
+
|
|
112
|
+
export { run_board_usage_lanes }
|
|
113
|
+
export type { DirectoryRead, LaneLookup, ProcessLanes }
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import type { ProcessRow, ProcessTable } from '#scripts/lane/lane-process-table'
|
|
4
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
5
|
+
|
|
6
|
+
// The usage columns' reading of one process snapshot (`lane-process-table.ts`), the same rows the lane
|
|
7
|
+
// count reads, so no second `ps` is spawned (joshuafolkken/kit#4246).
|
|
8
|
+
// **The executable is cut from the command line**, since the snapshot carries the full line rather than
|
|
9
|
+
// `comm`: an absolute path runs on across its spaces — `Application Support/`, `Visual Studio Code.app/`
|
|
10
|
+
// — to the shortest run of words that names an existing file, since the text alone cannot tell a spaced
|
|
11
|
+
// directory from a relative argument (`node scripts/foo.ts`). When no run exists, the path ends at the
|
|
12
|
+
// last word holding a directory before the first option or absolute path; a file name with a space of
|
|
13
|
+
// its own is then cut at it, which leaves the bundle that names an app whole.
|
|
14
|
+
|
|
15
|
+
const DAY_SEPARATOR = '-'
|
|
16
|
+
const CLOCK_SEPARATOR = ':'
|
|
17
|
+
const SECONDS_PER_DAY = 86_400
|
|
18
|
+
const SECONDS_PER_CLOCK_PART = 60
|
|
19
|
+
const BYTES_PER_KB = 1024
|
|
20
|
+
const WORD_SEPARATOR = ' '
|
|
21
|
+
const OPTION_PREFIX = '-'
|
|
22
|
+
|
|
23
|
+
// One process's line of the snapshot: its own CPU time and resident set.
|
|
24
|
+
interface ProcessListing {
|
|
25
|
+
parent: number
|
|
26
|
+
// The executable, which names the app the process belongs to.
|
|
27
|
+
command: string
|
|
28
|
+
cpu_ms: number
|
|
29
|
+
rss_bytes: number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// `ps`'s `time`, `[DD-][HH:]MM:SS[.ss]`, in milliseconds.
|
|
33
|
+
function cpu_ms_of(text: string): number {
|
|
34
|
+
const [days, clock = ''] = text.includes(DAY_SEPARATOR) ? text.split(DAY_SEPARATOR) : ['0', text]
|
|
35
|
+
const seconds = clock
|
|
36
|
+
.split(CLOCK_SEPARATOR)
|
|
37
|
+
.reduce((sum, part) => sum * SECONDS_PER_CLOCK_PART + Number(part), 0)
|
|
38
|
+
|
|
39
|
+
return (Number(days) * SECONDS_PER_DAY + seconds) * MS_PER_SECOND
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// A word that opens an argument of its own: an option or another absolute path.
|
|
43
|
+
function opens_argument(word: string): boolean {
|
|
44
|
+
return word.startsWith(path.sep) || word.startsWith(OPTION_PREFIX)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The absolute path's possible ends, shortest first: the first word, then each later word joined on.
|
|
48
|
+
function path_candidates(first: string, words: Array<string>): Array<string> {
|
|
49
|
+
return [
|
|
50
|
+
first,
|
|
51
|
+
...words.map((_, index) => [first, ...words.slice(0, index + 1)].join(WORD_SEPARATOR)),
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** The executable a command line runs: its first word, or an absolute path with its spaces kept. */
|
|
56
|
+
function executable_of(command: string): string {
|
|
57
|
+
const [first = '', ...rest] = command.split(WORD_SEPARATOR)
|
|
58
|
+
|
|
59
|
+
if (!first.startsWith(path.sep)) return first
|
|
60
|
+
|
|
61
|
+
const opened = rest.findIndex((word) => opens_argument(word))
|
|
62
|
+
const words = opened === -1 ? rest : rest.slice(0, opened)
|
|
63
|
+
const existing = path_candidates(first, words).find((candidate) => existsSync(candidate))
|
|
64
|
+
|
|
65
|
+
if (existing !== undefined) return existing
|
|
66
|
+
|
|
67
|
+
const last_directory = words.findLastIndex((word) => word.includes(path.sep))
|
|
68
|
+
|
|
69
|
+
return [first, ...words.slice(0, last_directory + 1)].join(WORD_SEPARATOR)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function listing_of(row: ProcessRow): [number, ProcessListing] | undefined {
|
|
73
|
+
const { pid, parent, time, rss_kb, command } = row
|
|
74
|
+
const cpu_ms = cpu_ms_of(time)
|
|
75
|
+
|
|
76
|
+
if (Number.isNaN(cpu_ms)) return undefined
|
|
77
|
+
|
|
78
|
+
const listing = { parent, command: executable_of(command), cpu_ms }
|
|
79
|
+
|
|
80
|
+
return [pid, { ...listing, rss_bytes: rss_kb * BYTES_PER_KB }]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Each row of the snapshot as its listing, by pid; a row whose CPU time does not read is left out. */
|
|
84
|
+
function listings_of(table: ProcessTable): Map<number, ProcessListing> {
|
|
85
|
+
const listings = table.map((row) => listing_of(row))
|
|
86
|
+
|
|
87
|
+
return new Map(listings.filter((listing) => listing !== undefined))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const run_board_usage_listing = { executable_of, listings_of }
|
|
91
|
+
|
|
92
|
+
export { run_board_usage_listing }
|
|
93
|
+
export type { ProcessListing }
|