@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
import { cpus, totalmem } from 'node:os'
|
|
2
|
-
import path from 'node:path'
|
|
3
2
|
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
3
|
+
import type { TableRead } from '#scripts/lane/lane-process-table'
|
|
4
4
|
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
5
|
+
import { process_directories } from '#scripts/lane/process-directories'
|
|
5
6
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
6
7
|
import { execa } from 'execa'
|
|
7
8
|
import type { ProcessReading, UsageMark } from './run-board-usage'
|
|
8
|
-
import {
|
|
9
|
+
import { run_board_usage_lanes, type DirectoryRead, type LaneLookup } from './run-board-usage-lanes'
|
|
10
|
+
import { run_board_usage_listing, type ProcessListing } from './run-board-usage-listing'
|
|
11
|
+
import {
|
|
12
|
+
run_board_usage_rusage,
|
|
13
|
+
type RusageReader,
|
|
14
|
+
type RusageReading,
|
|
15
|
+
} from './run-board-usage-rusage'
|
|
16
|
+
import { run_board_usage_top, type TopReading, type TopReadings } from './run-board-usage-top'
|
|
9
17
|
|
|
10
18
|
// How `run:board` reads which lane each process belongs to and what it uses.
|
|
11
|
-
// **One `ps` a second, and `lsof` only for a process not seen before.** `ps`
|
|
19
|
+
// **One `ps` a second, and `lsof` only for a process not seen before.** `ps` — the snapshot the lane
|
|
20
|
+
// count reads in the same refresh (`lane-process-table.ts`), never one of its own — lists every process's
|
|
12
21
|
// cumulative CPU time and resident memory in about 15 ms; a process is put in the lane its working
|
|
13
|
-
// directory sits under (`.kit-lanes/<N>`),
|
|
14
|
-
//
|
|
15
|
-
//
|
|
22
|
+
// directory sits under (`.kit-lanes/<N>`), else its nearest ancestor's. A directory is looked up once
|
|
23
|
+
// and remembered — asked again only when an `lsof` cut short left it out — so a full `lsof` (about
|
|
24
|
+
// 220 ms) is paid on the first sample alone (`run-board-usage-lanes.ts`).
|
|
16
25
|
// **Only this repository's lanes root counts** — another repository's lane of the same number is a
|
|
17
26
|
// different lane. **macOS alone:** Linux's `ps` prints `time` in whole seconds, too coarse for a
|
|
18
27
|
// one-second difference, so there the board draws no column rather than a figure flickering to 0.
|
|
@@ -21,194 +30,148 @@ import { run_board_usage_rusage, type RusageReader } from './run-board-usage-rus
|
|
|
21
30
|
// Where `node:ffi` reaches the kernel's reaped-children times (`run-board-usage-rusage.ts`), each
|
|
22
31
|
// process's CPU time is read with them folded in and its parent is kept, so such a child lands in its
|
|
23
32
|
// parent's lane; elsewhere the figure stays `ps`'s own time, a lower bound.
|
|
33
|
+
// **Memory is `top`'s MEM, compressed memory its CMPRS** — the footprint `node:ffi` reads each second
|
|
34
|
+
// where it can, else `top`'s last reading (`run-board-usage-top.ts`, at most once every 30 s), else
|
|
35
|
+
// `ps`'s resident set; compressed memory only `top` has, so it is 0 until `top` has answered.
|
|
24
36
|
|
|
25
|
-
const
|
|
26
|
-
const LSOF_ARGUMENTS = ['-a', '-d', 'cwd', '-Fn', '-p']
|
|
37
|
+
const LSOF_ARGUMENTS = [...process_directories.CWD_ARGUMENTS, '-p']
|
|
27
38
|
const PID_SEPARATOR = ','
|
|
28
|
-
const PS_FIELDS = 4
|
|
29
|
-
const DAY_SEPARATOR = '-'
|
|
30
|
-
const CLOCK_SEPARATOR = ':'
|
|
31
|
-
const SECONDS_PER_DAY = 86_400
|
|
32
|
-
const SECONDS_PER_CLOCK_PART = 60
|
|
33
|
-
const MS_PER_SECOND = 1000
|
|
34
|
-
const BYTES_PER_KB = 1024
|
|
35
|
-
// `lsof -F`'s field lines: `p<pid>` opens a process, `n<path>` names its directory.
|
|
36
|
-
const LSOF_PROCESS = /^(?=p)/mu
|
|
37
|
-
const LSOF_NAME = 'n'
|
|
38
39
|
const { load_builtin, rusage_reader } = run_board_usage_rusage
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
list: () => Promise<string>
|
|
49
|
-
// Each process's CPU time with its reaped children's, where `node:ffi` reaches it.
|
|
40
|
+
const { list_top, top_reader } = run_board_usage_top
|
|
41
|
+
const { listings_of } = run_board_usage_listing
|
|
42
|
+
const { lanes_for } = run_board_usage_lanes
|
|
43
|
+
|
|
44
|
+
// The working directories and the lanes root come with `LaneLookup`.
|
|
45
|
+
interface UsagePorts extends LaneLookup {
|
|
46
|
+
// The process snapshot the lane count reads too (`lane-process-table.ts`).
|
|
47
|
+
list: TableRead
|
|
48
|
+
// Each process's CPU time with its reaped children's and its footprint, where `node:ffi` reaches it.
|
|
50
49
|
rusage: RusageReader | undefined
|
|
51
|
-
//
|
|
52
|
-
|
|
50
|
+
// `top`'s last memory and compressed-memory reading.
|
|
51
|
+
top: () => Promise<TopReadings>
|
|
53
52
|
now: () => number
|
|
54
|
-
// The board's own lanes root.
|
|
55
|
-
root: string
|
|
56
53
|
}
|
|
57
54
|
|
|
58
|
-
// `ps`'s
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return (Number(days) * SECONDS_PER_DAY + seconds) * MS_PER_SECOND
|
|
55
|
+
// What one reading is made from: `ps`'s line, `node:ffi`'s reading and `top`'s — `ps`'s resident set
|
|
56
|
+
// and no compressed memory standing in for a process `top` has not listed.
|
|
57
|
+
interface ReadingSources {
|
|
58
|
+
listing: ProcessListing
|
|
59
|
+
rusage: RusageReading | undefined
|
|
60
|
+
top: TopReading
|
|
61
|
+
earlier: ProcessReading | undefined
|
|
66
62
|
}
|
|
67
63
|
|
|
68
|
-
function
|
|
69
|
-
|
|
70
|
-
const [pid, parent, time = '', rss] = fields
|
|
71
|
-
const reading = { cpu_ms: cpu_ms_of(time), rss_bytes: Number(rss) * BYTES_PER_KB }
|
|
72
|
-
const is_number = !Number.isNaN(reading.cpu_ms + reading.rss_bytes + Number(parent))
|
|
73
|
-
|
|
74
|
-
if (!is_number || fields.length !== PS_FIELDS) return undefined
|
|
75
|
-
|
|
76
|
-
return [Number(pid), { parent: Number(parent), reading }]
|
|
64
|
+
function top_of(top: TopReadings, pid: number, listing: ProcessListing): TopReading {
|
|
65
|
+
return top.get(pid) ?? { memory_bytes: listing.rss_bytes, compressed_bytes: 0 }
|
|
77
66
|
}
|
|
78
67
|
|
|
79
|
-
|
|
80
|
-
|
|
68
|
+
// A process whose `node:ffi` read failed keeps the larger of `ps`'s own time and its last reading: once
|
|
69
|
+
// reaped, its whole folded count lands in its parent's, so what comes off there has to be that count —
|
|
70
|
+
// its own time alone would count its reaped children a second time.
|
|
71
|
+
function cpu_ms_from({ listing, rusage, earlier }: ReadingSources): number {
|
|
72
|
+
if (rusage !== undefined) return rusage.cpu_ms
|
|
81
73
|
|
|
82
|
-
return
|
|
74
|
+
return Math.max(listing.cpu_ms, earlier?.cpu_ms ?? 0)
|
|
83
75
|
}
|
|
84
76
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
function folded_reading(
|
|
89
|
-
reading: ProcessReading,
|
|
90
|
-
cpu_ms: number | undefined,
|
|
91
|
-
earlier: ProcessReading | undefined,
|
|
92
|
-
): ProcessReading {
|
|
93
|
-
if (cpu_ms !== undefined) return { ...reading, cpu_ms }
|
|
94
|
-
|
|
95
|
-
return { ...reading, cpu_ms: Math.max(reading.cpu_ms, earlier?.cpu_ms ?? 0) }
|
|
96
|
-
}
|
|
77
|
+
function reading_of(sources: ReadingSources): ProcessReading {
|
|
78
|
+
const { rusage, top } = sources
|
|
79
|
+
const memory_bytes = rusage?.footprint_bytes ?? top.memory_bytes
|
|
97
80
|
|
|
98
|
-
|
|
81
|
+
return { cpu_ms: cpu_ms_from(sources), memory_bytes, compressed_bytes: top.compressed_bytes }
|
|
82
|
+
}
|
|
99
83
|
|
|
100
|
-
|
|
101
|
-
const processes = new Map([...listings].map(([pid, { reading }]) => [pid, reading] as const))
|
|
84
|
+
type Readings = Pick<UsageMark, 'folded' | 'names' | 'parents' | 'processes'>
|
|
102
85
|
|
|
103
|
-
|
|
86
|
+
// What the readings are made from besides `ps`'s listing.
|
|
87
|
+
interface ReadingInputs {
|
|
88
|
+
rusage: RusageReader | undefined
|
|
89
|
+
top: TopReadings
|
|
90
|
+
earlier: ReadonlyMap<number, ProcessReading>
|
|
104
91
|
}
|
|
105
92
|
|
|
106
|
-
// `ps`'s own-time readings, each replaced by its reaped-children-folded time where `rusage` reads one
|
|
107
|
-
//
|
|
108
|
-
// another user's — still lands in its parent's count when
|
|
93
|
+
// `ps`'s own-time readings, each replaced by its reaped-children-folded time where `rusage` reads one;
|
|
94
|
+
// `ps` alone counts no reaped child, so nothing is folded there. Every process keeps its parent: one
|
|
95
|
+
// whose own read failed — gone by then, or another user's — still lands in its parent's count when
|
|
96
|
+
// reaped, so what was counted for it comes off.
|
|
109
97
|
function readings_of(
|
|
110
98
|
listings: ReadonlyMap<number, ProcessListing>,
|
|
111
|
-
|
|
112
|
-
earlier: ReadonlyMap<number, ProcessReading> = new Map(),
|
|
99
|
+
inputs: ReadingInputs,
|
|
113
100
|
): Readings {
|
|
114
|
-
if (rusage === undefined) return own_readings(listings)
|
|
115
|
-
|
|
116
101
|
const processes = new Map<number, ProcessReading>()
|
|
117
102
|
const folded = new Set<number>()
|
|
118
|
-
const parents = new Map([...listings].map(([pid, { parent }]) => [pid, parent] as const))
|
|
119
103
|
|
|
120
|
-
for (const [pid,
|
|
121
|
-
const
|
|
104
|
+
for (const [pid, listing] of listings) {
|
|
105
|
+
const rusage = inputs.rusage?.(pid)
|
|
106
|
+
const top = top_of(inputs.top, pid, listing)
|
|
122
107
|
|
|
123
|
-
processes.set(pid,
|
|
124
|
-
if (
|
|
108
|
+
processes.set(pid, reading_of({ listing, rusage, top, earlier: inputs.earlier.get(pid) }))
|
|
109
|
+
if (rusage !== undefined) folded.add(pid)
|
|
125
110
|
}
|
|
126
111
|
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function lsof_block(block: string): [number, string] | undefined {
|
|
131
|
-
const [process_line = '', ...rest] = block.trim().split('\n')
|
|
132
|
-
const name = rest.find((line) => line.startsWith(LSOF_NAME))
|
|
133
|
-
|
|
134
|
-
return name === undefined ? undefined : [Number(process_line.slice(1)), name.slice(1)]
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function parse_lsof(output: string): Map<number, string> {
|
|
138
|
-
const blocks = output.split(LSOF_PROCESS).map((block) => lsof_block(block))
|
|
139
|
-
|
|
140
|
-
return new Map(blocks.filter((block) => block !== undefined))
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// The lane of `root` a directory sits under — itself or a directory above it, the outermost first.
|
|
144
|
-
function lane_of(directory: string, root: string): string | undefined {
|
|
145
|
-
const parts = directory.split(path.sep)
|
|
146
|
-
const ancestors = parts.map((_, index) => parts.slice(0, index + 1).join(path.sep)).slice(1)
|
|
147
|
-
const environment = { [lane_paths.LANE_ROOT_KEY]: root }
|
|
148
|
-
|
|
149
|
-
return ancestors.map((ancestor) => lane_paths.lane_issue_of(ancestor, environment)).find(Boolean)
|
|
150
|
-
}
|
|
112
|
+
const parents = new Map([...listings].map(([pid, { parent }]) => [pid, parent] as const))
|
|
113
|
+
const names = new Map([...listings].map(([pid, { command }]) => [pid, command] as const))
|
|
151
114
|
|
|
152
|
-
|
|
153
|
-
return directory === undefined ? undefined : lane_of(directory, root)
|
|
115
|
+
return { processes, parents, names, folded }
|
|
154
116
|
}
|
|
155
117
|
|
|
156
|
-
// The
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
processes: ReadonlyMap<number, ProcessReading>,
|
|
118
|
+
// The snapshot's listings and `top`'s reading, read together; a snapshot `ps` did not answer fails the
|
|
119
|
+
// sample.
|
|
120
|
+
async function listed_of(
|
|
160
121
|
ports: UsagePorts,
|
|
161
|
-
): Promise<Map<number,
|
|
162
|
-
const
|
|
163
|
-
const fresh = [...processes.keys()].filter((pid) => !kept.has(pid))
|
|
164
|
-
|
|
165
|
-
if (fresh.length === 0) return kept
|
|
122
|
+
): Promise<{ listed: Map<number, ProcessListing>; top: TopReadings }> {
|
|
123
|
+
const [table, top] = await Promise.all([ports.list(), ports.top()])
|
|
166
124
|
|
|
167
|
-
|
|
168
|
-
const found = fresh.map((pid) => [pid, directory_lane(directories.get(pid), ports.root)] as const)
|
|
125
|
+
if (table === undefined) throw new Error('ps did not answer')
|
|
169
126
|
|
|
170
|
-
return
|
|
127
|
+
return { listed: listings_of(table), top }
|
|
171
128
|
}
|
|
172
129
|
|
|
173
130
|
async function sample(before: UsageMark | undefined, ports: UsagePorts): Promise<UsageMark> {
|
|
174
131
|
const at_ms = ports.now()
|
|
175
|
-
const
|
|
176
|
-
const
|
|
132
|
+
const { listed, top } = await listed_of(ports)
|
|
133
|
+
const earlier = before?.processes ?? new Map()
|
|
134
|
+
const readings = readings_of(listed, { rusage: ports.rusage, top, earlier })
|
|
135
|
+
const lanes = await lanes_for(before, readings.parents, ports)
|
|
177
136
|
|
|
178
|
-
return { at_ms, ...readings, lanes, cores: cpus().length, total_bytes: totalmem() }
|
|
137
|
+
return { at_ms, ...readings, ...lanes, cores: cpus().length, total_bytes: totalmem() }
|
|
179
138
|
}
|
|
180
139
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
):
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
140
|
+
// The answers of an `lsof` cut short, its last dropped: that one may end on a directory missing its
|
|
141
|
+
// tail, `.kit-lanes/43` for `.kit-lanes/4346`.
|
|
142
|
+
function whole_answers(directories: Map<number, string>): Map<number, string> {
|
|
143
|
+
return new Map([...directories].slice(0, -1))
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function darwin_directories(pids: ReadonlyArray<number>): Promise<DirectoryRead> {
|
|
147
|
+
// `lsof` exits non-zero when any one process is gone, and still lists the rest. One killed on its
|
|
148
|
+
// budget or by a signal, or one that never started — a spawn failing under load has no exit code —
|
|
149
|
+
// did not run to its end, and every process it did not answer for is asked again on the next sample
|
|
150
|
+
// (`run-board-usage-lanes.ts`).
|
|
187
151
|
const lsof_arguments = [...LSOF_ARGUMENTS, pids.join(PID_SEPARATOR)]
|
|
188
152
|
const result = await execa('lsof', lsof_arguments, { reject: false, timeout: PROBE_TIMEOUT_MS })
|
|
153
|
+
const is_cut_short = result.isTerminated || (result.failed && result.exitCode === undefined)
|
|
154
|
+
const directories = process_directories.parse(result.stdout)
|
|
189
155
|
|
|
190
|
-
if (
|
|
156
|
+
if (is_cut_short) return { directories: whole_answers(directories), is_complete: false }
|
|
191
157
|
|
|
192
|
-
return
|
|
158
|
+
return { directories, is_complete: true }
|
|
193
159
|
}
|
|
194
160
|
|
|
195
|
-
const PLATFORM_DIRECTORIES: Readonly<Partial<Record<NodeJS.Platform,
|
|
161
|
+
const PLATFORM_DIRECTORIES: Readonly<Partial<Record<NodeJS.Platform, LaneLookup['directories']>>> =
|
|
196
162
|
{ darwin: darwin_directories }
|
|
197
163
|
|
|
198
|
-
async function list_live(): Promise<string> {
|
|
199
|
-
const { stdout } = await execa('ps', PS_ARGUMENTS, { timeout: PROBE_TIMEOUT_MS })
|
|
200
|
-
|
|
201
|
-
return stdout
|
|
202
|
-
}
|
|
203
|
-
|
|
204
164
|
async function board_lane_root(): Promise<string> {
|
|
205
165
|
return lane_paths.lane_root(await lane_registry.main_repository_root())
|
|
206
166
|
}
|
|
207
167
|
|
|
208
|
-
// What one board's reader resolves once and keeps,
|
|
168
|
+
// What one reading is taken through: the board's snapshot, and what its reader resolves once and keeps,
|
|
169
|
+
// since none of those moves while the board is open.
|
|
209
170
|
interface ReaderSetup {
|
|
171
|
+
list: TableRead
|
|
210
172
|
root: Promise<string>
|
|
211
173
|
rusage: RusageReader | undefined
|
|
174
|
+
top: UsagePorts['top']
|
|
212
175
|
}
|
|
213
176
|
|
|
214
177
|
// `undefined` where the processes cannot be read — no `ps`, no way to a working directory, no
|
|
@@ -223,33 +186,40 @@ async function read_usage(
|
|
|
223
186
|
if (directories === undefined) return undefined
|
|
224
187
|
|
|
225
188
|
try {
|
|
226
|
-
const { rusage } = setup
|
|
227
|
-
const
|
|
189
|
+
const { list, rusage, top } = setup
|
|
190
|
+
const root = await setup.root
|
|
228
191
|
|
|
229
|
-
return await sample(before,
|
|
192
|
+
return await sample(before, { list, rusage, top, directories, now: Date.now, root })
|
|
230
193
|
} catch {
|
|
231
194
|
return undefined
|
|
232
195
|
}
|
|
233
196
|
}
|
|
234
197
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
198
|
+
type UsageReader = (
|
|
199
|
+
before: UsageMark | undefined,
|
|
200
|
+
table: TableRead,
|
|
201
|
+
) => Promise<UsageMark | undefined>
|
|
202
|
+
|
|
203
|
+
// One board's reader: the `node:ffi` and `top` readers are opened with it, and the lanes root resolved
|
|
204
|
+
// on the first sample. Each reading takes the refresh's snapshot rather than a `ps` of its own.
|
|
205
|
+
function usage_reader(platform: NodeJS.Platform = process.platform): UsageReader {
|
|
240
206
|
const rusage = rusage_reader(platform, load_builtin)
|
|
207
|
+
const top = top_reader({ list: list_top, now: Date.now })
|
|
241
208
|
const resolved: { root?: Promise<string> } = {}
|
|
242
209
|
|
|
243
|
-
async function read(
|
|
210
|
+
async function read(
|
|
211
|
+
before: UsageMark | undefined,
|
|
212
|
+
table: TableRead,
|
|
213
|
+
): Promise<UsageMark | undefined> {
|
|
244
214
|
resolved.root ??= board_lane_root()
|
|
245
215
|
|
|
246
|
-
return await read_usage(before, { root: resolved.root, rusage }, platform)
|
|
216
|
+
return await read_usage(before, { list: table, root: resolved.root, rusage, top }, platform)
|
|
247
217
|
}
|
|
248
218
|
|
|
249
219
|
return read
|
|
250
220
|
}
|
|
251
221
|
|
|
252
|
-
const run_board_usage_read = {
|
|
222
|
+
const run_board_usage_read = { sample, usage_reader }
|
|
253
223
|
|
|
254
224
|
export { run_board_usage_read }
|
|
255
|
-
export type { UsagePorts }
|
|
225
|
+
export type { UsagePorts, UsageReader }
|
|
@@ -3,7 +3,9 @@ import type { dlopen } from 'node:ffi'
|
|
|
3
3
|
// A process's CPU time with the children it has reaped folded in, so a vitest worker or a gate's
|
|
4
4
|
// eslint born and gone between two `run:board` samples still reaches its lane through its parent.
|
|
5
5
|
// macOS's `ps -S` does not fold them; the kernel keeps them in `proc_pid_rusage`'s
|
|
6
|
-
// `ri_child_user_time` / `ri_child_system_time`, reached here through `node:ffi`.
|
|
6
|
+
// `ri_child_user_time` / `ri_child_system_time`, reached here through `node:ffi`. The same call's
|
|
7
|
+
// `ri_phys_footprint` is the process's memory as `top`'s MEM and Activity Monitor's "Memory" count it —
|
|
8
|
+
// compressed pages included, which a resident set leaves out (joshuafolkken/kit#4171).
|
|
7
9
|
//
|
|
8
10
|
// **`node:ffi` is experimental** — added in Node 26 (kit's `engines` is `^22.19.0 || ^24.0.0 ||
|
|
9
11
|
// >=26.0.0`) and liable to change. Where it is missing, or the platform is not macOS, or a call
|
|
@@ -23,8 +25,14 @@ interface Timebase {
|
|
|
23
25
|
denom: number
|
|
24
26
|
}
|
|
25
27
|
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
+
// One process's CPU milliseconds and its physical footprint in bytes.
|
|
29
|
+
interface RusageReading {
|
|
30
|
+
cpu_ms: number
|
|
31
|
+
footprint_bytes: number
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// One process's reading, `undefined` where it cannot be read (gone, or another user's).
|
|
35
|
+
type RusageReader = (pid: number) => RusageReading | undefined
|
|
28
36
|
|
|
29
37
|
const PROC_LIBRARY = '/usr/lib/libproc.dylib'
|
|
30
38
|
const SYSTEM_LIBRARY = '/usr/lib/libSystem.B.dylib'
|
|
@@ -35,6 +43,8 @@ const USER_TIME_OFFSET = 16
|
|
|
35
43
|
const SYSTEM_TIME_OFFSET = 24
|
|
36
44
|
const CHILD_USER_TIME_OFFSET = 96
|
|
37
45
|
const CHILD_SYSTEM_TIME_OFFSET = 104
|
|
46
|
+
// `rusage_info_v2`'s `ri_phys_footprint`.
|
|
47
|
+
const PHYS_FOOTPRINT_OFFSET = 72
|
|
38
48
|
const TIME_OFFSETS = [
|
|
39
49
|
USER_TIME_OFFSET,
|
|
40
50
|
SYSTEM_TIME_OFFSET,
|
|
@@ -93,10 +103,12 @@ function reader_of(ffi: Ffi): RusageReader {
|
|
|
93
103
|
const { proc_pid_rusage } = ffi.dlopen(PROC_LIBRARY, PROC_PID_RUSAGE).functions
|
|
94
104
|
const buffer = Buffer.alloc(RUSAGE_INFO_V2_BYTES)
|
|
95
105
|
|
|
96
|
-
return function read(pid: number):
|
|
97
|
-
|
|
106
|
+
return function read(pid: number): RusageReading | undefined {
|
|
107
|
+
if (proc_pid_rusage(pid, RUSAGE_INFO_V2, buffer) !== 0) return undefined
|
|
108
|
+
|
|
109
|
+
const footprint_bytes = Number(buffer.readBigUInt64LE(PHYS_FOOTPRINT_OFFSET))
|
|
98
110
|
|
|
99
|
-
return
|
|
111
|
+
return { cpu_ms: cpu_ms_of(buffer, timebase), footprint_bytes }
|
|
100
112
|
}
|
|
101
113
|
}
|
|
102
114
|
|
|
@@ -121,4 +133,4 @@ function rusage_reader(platform: NodeJS.Platform, load: ModuleLoad): RusageReade
|
|
|
121
133
|
const run_board_usage_rusage = { cpu_ms_of, load_builtin, quiet_ffi, rusage_reader }
|
|
122
134
|
|
|
123
135
|
export { run_board_usage_rusage }
|
|
124
|
-
export type { RusageReader, Timebase }
|
|
136
|
+
export type { RusageReader, RusageReading, Timebase }
|