@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,80 +1,168 @@
|
|
|
1
1
|
import { run_board_labels } from './run-board-labels'
|
|
2
|
-
import { run_board_machine } from './run-board-machine'
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// machine
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
2
|
+
import { run_board_machine, type Alert } from './run-board-machine'
|
|
3
|
+
import type { UsageFigure, UsageScale } from './run-board-usage'
|
|
4
|
+
|
|
5
|
+
// The CPU, memory and compressed-memory cells a lane row and a processes row draw: each a figure and a
|
|
6
|
+
// gauge, `16.4 ■─────` / ` 0.7 ■────`, a processes row's gauge full at the whole machine — the header's
|
|
7
|
+
// 💪 and 🧠 scale — a lane row's at its share (joshuafolkken/kit#4546), and its color the header gauges' own `GAUGE_SHADES`. CPU is a percentage of the whole
|
|
8
|
+
// machine, the header's 💪 unit, and memory is in GB; the column labels name neither unit.
|
|
9
|
+
//
|
|
10
|
+
// **A lane row's gauge is full at its share of what the running lanes may use together**
|
|
11
|
+
// (joshuafolkken/kit#3612): the header's yellow threshold (`CPU_YELLOW` / `MEMORY_YELLOW`), never the
|
|
12
|
+
// whole machine — the OS, the IDE and the browser always hold some of it — divided by the running rows
|
|
13
|
+
// the frame draws. A lane that ends widens the others' shares, and their gauges may shrink.
|
|
14
|
+
//
|
|
15
|
+
// **Both rows are shaded at the same two points of their full gauge** (joshuafolkken/kit#4570): yellow
|
|
16
|
+
// past half, red past nine tenths, so the third cell reads yellow and the fifth red. The header's own
|
|
17
|
+
// thresholds shade the header alone.
|
|
18
|
+
|
|
19
|
+
const { GAUGE_SHADES, bar_of } = run_board_labels
|
|
20
|
+
const { CPU_YELLOW, MEMORY_YELLOW } = run_board_machine
|
|
21
|
+
const ROW_YELLOW_OF_FULL = 50
|
|
22
|
+
const ROW_RED_OF_FULL = 90
|
|
17
23
|
const BYTES_PER_KB = 1024
|
|
18
24
|
const BYTES_PER_GB = BYTES_PER_KB * BYTES_PER_KB * BYTES_PER_KB
|
|
19
|
-
const
|
|
20
|
-
const
|
|
25
|
+
const PERCENT = 100
|
|
26
|
+
const DECIMALS = 1
|
|
27
|
+
const FIGURE_WIDTH = '99.9'.length
|
|
28
|
+
const GB_UNIT = 'G'
|
|
29
|
+
const PERCENT_UNIT = '%'
|
|
30
|
+
const CELL_GAP = ' '
|
|
31
|
+
const PLAIN_GAP = '/'
|
|
32
|
+
const NO_CORES = '-'
|
|
33
|
+
|
|
34
|
+
// Where a row's gauges are full, in percent of the machine: the CPU's, then both memories'.
|
|
35
|
+
interface CellLimits {
|
|
36
|
+
cpu: number
|
|
37
|
+
memory: number
|
|
38
|
+
}
|
|
21
39
|
|
|
22
|
-
|
|
40
|
+
const MACHINE_LIMITS: CellLimits = { cpu: PERCENT, memory: PERCENT }
|
|
23
41
|
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
42
|
+
// The gauge is drawn full at `full`, and shaded at its fill.
|
|
43
|
+
interface Cell {
|
|
44
|
+
text: string | undefined
|
|
45
|
+
value: number
|
|
46
|
+
full: number
|
|
47
|
+
}
|
|
27
48
|
|
|
28
|
-
|
|
49
|
+
function gigabytes(bytes: number): string {
|
|
50
|
+
return (bytes / BYTES_PER_GB).toFixed(DECIMALS)
|
|
29
51
|
}
|
|
30
52
|
|
|
31
|
-
function
|
|
32
|
-
return
|
|
53
|
+
function share_of(value: number, full: number): number {
|
|
54
|
+
return full === 0 ? 0 : (value / full) * PERCENT
|
|
33
55
|
}
|
|
34
56
|
|
|
35
|
-
// The
|
|
36
|
-
|
|
37
|
-
|
|
57
|
+
// The cores as a percentage of the machine's, `56.4`; a full machine is `100`, so the figure stays as
|
|
58
|
+
// wide as `99.9`.
|
|
59
|
+
function cpu_text(cores: number | undefined, scale: UsageScale): string | undefined {
|
|
60
|
+
if (cores === undefined) return undefined
|
|
38
61
|
|
|
39
|
-
const
|
|
62
|
+
const text = share_of(cores, scale.cores).toFixed(DECIMALS)
|
|
40
63
|
|
|
41
|
-
return
|
|
64
|
+
return Number(text) >= PERCENT ? String(PERCENT) : text
|
|
42
65
|
}
|
|
43
66
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
67
|
+
// The columns a gauge takes after its figure — none where no gauge is drawn.
|
|
68
|
+
function gauge_width(gauge: number): number {
|
|
69
|
+
return gauge === 0 ? 0 : CELL_GAP.length + gauge
|
|
70
|
+
}
|
|
47
71
|
|
|
48
|
-
|
|
72
|
+
// A row gauge's color at `percent` of its full: yellow past half, red past nine tenths, each line itself
|
|
73
|
+
// still the color below it.
|
|
74
|
+
function row_alert(percent: number): Alert {
|
|
75
|
+
if (percent > ROW_RED_OF_FULL) return 'red'
|
|
76
|
+
|
|
77
|
+
return percent > ROW_YELLOW_OF_FULL ? 'yellow' : 'normal'
|
|
49
78
|
}
|
|
50
79
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
80
|
+
function cell_text(cell: Cell, width: number, gauge: number): string {
|
|
81
|
+
if (cell.text === undefined) return CELL_GAP.repeat(width + gauge_width(gauge))
|
|
82
|
+
|
|
83
|
+
const figure = cell.text.padStart(width)
|
|
54
84
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
85
|
+
if (gauge === 0) return figure
|
|
86
|
+
|
|
87
|
+
const shade = GAUGE_SHADES[row_alert(share_of(cell.value, cell.full))]
|
|
88
|
+
|
|
89
|
+
return `${figure}${CELL_GAP}${bar_of(cell.value, cell.full, gauge, shade)}`
|
|
58
90
|
}
|
|
59
91
|
|
|
60
|
-
//
|
|
61
|
-
function
|
|
62
|
-
|
|
92
|
+
// A running lane's share, in percent of the machine: `pool_percent` divided among `running`.
|
|
93
|
+
function lane_share(pool_percent: number, running: number): number {
|
|
94
|
+
return pool_percent / Math.max(1, running)
|
|
95
|
+
}
|
|
63
96
|
|
|
64
|
-
|
|
97
|
+
// A lane row's limits with `running` lanes drawn: each gauge full at its share of the header's yellow
|
|
98
|
+
// threshold (joshuafolkken/kit#4546).
|
|
99
|
+
function lane_limits(running: number): CellLimits {
|
|
100
|
+
return { cpu: lane_share(CPU_YELLOW, running), memory: lane_share(MEMORY_YELLOW, running) }
|
|
101
|
+
}
|
|
65
102
|
|
|
66
|
-
|
|
103
|
+
function cell_of(text: string | undefined, value: number, full: number): Cell {
|
|
104
|
+
return { text, value, full }
|
|
67
105
|
}
|
|
68
106
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (ended_ms === undefined) return undefined
|
|
107
|
+
function cells_from(figure: UsageFigure, scale: UsageScale, limits: CellLimits): Array<Cell> {
|
|
108
|
+
const { cpu_cores, memory_bytes, compressed_bytes } = figure
|
|
109
|
+
const cores = (scale.cores * limits.cpu) / PERCENT
|
|
110
|
+
const bytes = (scale.total_bytes * limits.memory) / PERCENT
|
|
74
111
|
|
|
75
|
-
return
|
|
112
|
+
return [
|
|
113
|
+
cell_of(cpu_text(cpu_cores, scale), cpu_cores ?? 0, cores),
|
|
114
|
+
cell_of(gigabytes(memory_bytes), memory_bytes, bytes),
|
|
115
|
+
cell_of(gigabytes(compressed_bytes), compressed_bytes, bytes),
|
|
116
|
+
]
|
|
76
117
|
}
|
|
77
118
|
|
|
78
|
-
|
|
119
|
+
// Each cell's width before its gauge: the CPU's text, then the two memories'.
|
|
120
|
+
function text_widths(): Array<number> {
|
|
121
|
+
return [FIGURE_WIDTH, FIGURE_WIDTH, FIGURE_WIDTH]
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Each cell's width in columns, so a heading can put a column's label over it.
|
|
125
|
+
function cell_widths(gauge: number): Array<number> {
|
|
126
|
+
return text_widths().map((width) => width + gauge_width(gauge))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// The CPU, MEM and CMPRS cells, each `gauge` columns of bar after its figure — the figure alone at a
|
|
130
|
+
// `gauge` of 0, where a frame is not drawn on a terminal; a row with no figure, or
|
|
131
|
+
// a figure from the first sample with no CPU yet, draws blanks of the same width in the cell it lacks.
|
|
132
|
+
// Filled and shaded at `limits`, the whole machine's unless a lane row passes its share.
|
|
133
|
+
function cells_of(
|
|
134
|
+
figure: UsageFigure | undefined,
|
|
135
|
+
scale: UsageScale,
|
|
136
|
+
gauge: number,
|
|
137
|
+
limits: CellLimits = MACHINE_LIMITS,
|
|
138
|
+
): Array<string> {
|
|
139
|
+
if (figure === undefined) return cell_widths(gauge).map((width) => CELL_GAP.repeat(width))
|
|
140
|
+
|
|
141
|
+
const widths = text_widths()
|
|
142
|
+
|
|
143
|
+
return cells_from(figure, scale, limits).map((cell, index) =>
|
|
144
|
+
cell_text(cell, widths[index] ?? 0, gauge),
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// A figure on one line where no gauge is drawn, and so no column label names the units:
|
|
149
|
+
// `56.4%/0.7G/0.6G`, `-` for cores not read yet.
|
|
150
|
+
function plain_of(figure: UsageFigure, scale: UsageScale): string {
|
|
151
|
+
const cpu = cpu_text(figure.cpu_cores, scale)
|
|
152
|
+
const memories = [figure.memory_bytes, figure.compressed_bytes].map(
|
|
153
|
+
(bytes) => `${gigabytes(bytes)}${GB_UNIT}`,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
return [cpu === undefined ? NO_CORES : `${cpu}${PERCENT_UNIT}`, ...memories].join(PLAIN_GAP)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const run_board_usage_text = {
|
|
160
|
+
cell_widths,
|
|
161
|
+
cells_of,
|
|
162
|
+
lane_limits,
|
|
163
|
+
lane_share,
|
|
164
|
+
plain_of,
|
|
165
|
+
}
|
|
79
166
|
|
|
80
167
|
export { run_board_usage_text }
|
|
168
|
+
export type { CellLimits }
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { execa } from 'execa'
|
|
2
|
+
|
|
3
|
+
// Each process's memory and compressed memory as `top`'s MEM and CMPRS count them — the columns
|
|
4
|
+
// Activity Monitor's "Memory" and "Compressed Memory" show. Compressed pages are what a resident set
|
|
5
|
+
// leaves out: `eslint_d` holds about 28 MB resident against 1 GB in `top`'s MEM (joshuafolkken/kit#4171).
|
|
6
|
+
// **CMPRS has no cheaper reader**: `proc_pid_rusage` carries the footprint (MEM) but no compressed
|
|
7
|
+
// count, and `top -l 1` costs about 1.1 s of system CPU against `ps`'s 30 ms. So `top` runs at most once
|
|
8
|
+
// every 30 s, in the background, and the board draws the last reading; only the very first read waits.
|
|
9
|
+
|
|
10
|
+
const TOP_ARGUMENTS = ['-l', '1', '-F', '-R', '-stats', 'pid,mem,cmprs']
|
|
11
|
+
const TOP_INTERVAL_MS = 30_000
|
|
12
|
+
// `top -l 1` samples for about a second and lists every process; `PROBE_TIMEOUT_MS` is sized for `ps`.
|
|
13
|
+
const TOP_TIMEOUT_MS = 10_000
|
|
14
|
+
const BYTES_PER_UNIT = 1024
|
|
15
|
+
// `top`'s size units, each 1024 times the one before.
|
|
16
|
+
const SIZE_UNITS = ['B', 'K', 'M', 'G', 'T']
|
|
17
|
+
// A size such as `3904K`, `154M+` or `1.2G-` — the sign marks a change since the last sample.
|
|
18
|
+
const SIZE_PATTERN = /^(\d+(?:\.\d+)?)([BKMGT])[+-]?$/u
|
|
19
|
+
const TOP_LINE = /^\s*(\d+)\s+(\S+)\s+(\S+)\s*$/u
|
|
20
|
+
|
|
21
|
+
interface TopReading {
|
|
22
|
+
memory_bytes: number
|
|
23
|
+
compressed_bytes: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Each process's `top` reading by its pid.
|
|
27
|
+
type TopReadings = ReadonlyMap<number, TopReading>
|
|
28
|
+
|
|
29
|
+
interface TopPorts {
|
|
30
|
+
// `top`'s one-sample listing.
|
|
31
|
+
list: () => Promise<string>
|
|
32
|
+
now: () => number
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// `NaN` for a field that is not a size, such as the `MEM` column heading.
|
|
36
|
+
function bytes_of(text = ''): number {
|
|
37
|
+
const [, amount, unit = ''] = SIZE_PATTERN.exec(text) ?? []
|
|
38
|
+
|
|
39
|
+
return Number(amount) * BYTES_PER_UNIT ** SIZE_UNITS.indexOf(unit)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function top_line(line: string): [number, TopReading] | undefined {
|
|
43
|
+
const [, pid, memory, compressed] = TOP_LINE.exec(line) ?? []
|
|
44
|
+
const reading = { memory_bytes: bytes_of(memory), compressed_bytes: bytes_of(compressed) }
|
|
45
|
+
|
|
46
|
+
if (Number.isNaN(reading.memory_bytes + reading.compressed_bytes)) return undefined
|
|
47
|
+
|
|
48
|
+
return [Number(pid), reading]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function parse_top(output: string): Map<number, TopReading> {
|
|
52
|
+
const lines = output.split('\n').map((line) => top_line(line))
|
|
53
|
+
|
|
54
|
+
return new Map(lines.filter((line) => line !== undefined))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface TopHeld {
|
|
58
|
+
readings: TopReadings | undefined
|
|
59
|
+
read_ms: number
|
|
60
|
+
pending: Promise<TopReadings> | undefined
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// A read that fails keeps the earlier readings, and an empty map where there were none.
|
|
64
|
+
async function refreshed(held: TopHeld, ports: TopPorts): Promise<TopReadings> {
|
|
65
|
+
try {
|
|
66
|
+
held.readings = parse_top(await ports.list())
|
|
67
|
+
} catch {
|
|
68
|
+
held.readings ??= new Map()
|
|
69
|
+
} finally {
|
|
70
|
+
held.pending = undefined
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return held.readings
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The last reading, with a fresh `top` started in the background once it is `TOP_INTERVAL_MS` old;
|
|
77
|
+
// only the first read, which has none to draw, waits for it.
|
|
78
|
+
function top_reader(ports: TopPorts): () => Promise<TopReadings> {
|
|
79
|
+
const held: TopHeld = { readings: undefined, read_ms: -Infinity, pending: undefined }
|
|
80
|
+
|
|
81
|
+
async function read(): Promise<TopReadings> {
|
|
82
|
+
if (held.pending === undefined && ports.now() - held.read_ms >= TOP_INTERVAL_MS) {
|
|
83
|
+
held.read_ms = ports.now()
|
|
84
|
+
held.pending = refreshed(held, ports)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return held.readings ?? (await (held.pending ?? Promise.resolve(new Map())))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return read
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function list_top(): Promise<string> {
|
|
94
|
+
const { stdout } = await execa('top', TOP_ARGUMENTS, { timeout: TOP_TIMEOUT_MS })
|
|
95
|
+
|
|
96
|
+
return stdout
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const run_board_usage_top = { TOP_INTERVAL_MS, TOP_TIMEOUT_MS, list_top, parse_top, top_reader }
|
|
100
|
+
|
|
101
|
+
export { run_board_usage_top }
|
|
102
|
+
export type { TopPorts, TopReading, TopReadings }
|
|
@@ -1,66 +1,61 @@
|
|
|
1
|
-
// Each
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// Each process's CPU, memory and compressed memory on `run:board`: which lane, which part of the
|
|
2
|
+
// backlogrun, or which app outside it is loading the machine the header's 💪 and 🧠 show. How the
|
|
3
|
+
// processes are read is `run-board-usage-read.ts`'s, how they are grouped `run-board-process-groups.ts`'s;
|
|
4
|
+
// this file turns two readings into each process's figures and each lane's sum.
|
|
4
5
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// larger than what the kernel holds; it compares lanes, which is all the column is for.
|
|
9
|
-
|
|
10
|
-
const PERCENT = 100
|
|
6
|
+
// CPU is a process's CPU time between two samples in cores, drawn as a percentage of the machine's
|
|
7
|
+
// cores — the header's 💪 unit, never Activity Monitor's one-core-is-100% — and memory what `top`'s
|
|
8
|
+
// MEM and CMPRS count, so the figures read the same in the lane rows and the processes section.
|
|
11
9
|
|
|
12
10
|
interface ProcessReading {
|
|
13
11
|
cpu_ms: number
|
|
14
|
-
|
|
12
|
+
memory_bytes: number
|
|
13
|
+
compressed_bytes: number
|
|
15
14
|
}
|
|
16
15
|
|
|
17
16
|
interface UsageMark {
|
|
18
17
|
at_ms: number
|
|
19
18
|
processes: ReadonlyMap<number, ProcessReading>
|
|
20
|
-
// Every listed process's lane
|
|
19
|
+
// Every listed process's lane — its working directory's, else its nearest ancestor's — `undefined`
|
|
20
|
+
// for one under none; kept so each directory is looked up once (`run-board-usage-lanes.ts`).
|
|
21
21
|
lanes: ReadonlyMap<number, string | undefined>
|
|
22
|
-
//
|
|
23
|
-
|
|
22
|
+
// The processes an `lsof` cut short was asked about, asked again on the next sample.
|
|
23
|
+
unread: ReadonlySet<number>
|
|
24
|
+
// Each process's command, which names the app it belongs to.
|
|
25
|
+
names: ReadonlyMap<number, string>
|
|
26
|
+
// Each process's parent: the ancestry the processes section groups by, and the way to the ancestor
|
|
27
|
+
// a gone process's reaped time landed in.
|
|
24
28
|
parents: ReadonlyMap<number, number>
|
|
25
29
|
// The processes whose count was read with its reaped children folded in — one whose own read failed
|
|
26
|
-
// keeps the larger of `ps`'s own time and its last reading, so nothing reaped is taken off it.
|
|
30
|
+
// keeps the larger of `ps`'s own time and its last reading, so nothing reaped is taken off it. Empty
|
|
31
|
+
// on the `ps` path, so nothing is deducted there.
|
|
27
32
|
folded: ReadonlySet<number>
|
|
28
33
|
cores: number
|
|
29
34
|
total_bytes: number
|
|
30
35
|
}
|
|
31
36
|
|
|
32
|
-
// The
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
// What one process or group uses. The cores are `undefined` on the first sample, which has nothing to
|
|
38
|
+
// take a difference from.
|
|
39
|
+
interface UsageFigure {
|
|
40
|
+
cpu_cores: number | undefined
|
|
35
41
|
memory_bytes: number
|
|
36
|
-
|
|
42
|
+
compressed_bytes: number
|
|
37
43
|
}
|
|
38
44
|
|
|
39
|
-
// Each
|
|
40
|
-
type
|
|
45
|
+
// Each process's figure by its pid.
|
|
46
|
+
type ProcessFigures = ReadonlyMap<number, UsageFigure>
|
|
41
47
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
pid: number
|
|
45
|
-
reading: ProcessReading
|
|
46
|
-
}
|
|
48
|
+
// Each lane's figure by its issue number.
|
|
49
|
+
type LaneUsages = ReadonlyMap<number, UsageFigure>
|
|
47
50
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
// The machine's cores and its physical memory: a processes row's gauge is full at them, a lane row's
|
|
52
|
+
// at its share of them.
|
|
53
|
+
interface UsageScale {
|
|
54
|
+
cores: number
|
|
55
|
+
total_bytes: number
|
|
51
56
|
}
|
|
52
57
|
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
function lane_processes(mark: UsageMark): Array<LaneProcess> {
|
|
56
|
-
const processes = [...mark.processes].map(([pid, reading]) => {
|
|
57
|
-
const lane = mark.lanes.get(pid)
|
|
58
|
-
|
|
59
|
-
return lane === undefined ? undefined : { lane, pid, reading }
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
return processes.filter((lane_process) => lane_process !== undefined)
|
|
63
|
-
}
|
|
58
|
+
const NO_FIGURE: UsageFigure = { cpu_cores: 0, memory_bytes: 0, compressed_bytes: 0 }
|
|
64
59
|
|
|
65
60
|
// The nearest of a gone process's ancestors still running — the one whose reaped-children time it has
|
|
66
61
|
// landed in. Walked through the last sample's parents, at most once round them. Where a parent between
|
|
@@ -101,65 +96,87 @@ function reaped_counted(before: UsageMark, after: UsageMark): Map<number, number
|
|
|
101
96
|
function cpu_spent(
|
|
102
97
|
before: UsageMark,
|
|
103
98
|
counted: ReadonlyMap<number, number>,
|
|
104
|
-
|
|
99
|
+
pid: number,
|
|
100
|
+
reading: ProcessReading,
|
|
105
101
|
): number {
|
|
106
102
|
const earlier = (before.processes.get(pid)?.cpu_ms ?? 0) + (counted.get(pid) ?? 0)
|
|
107
103
|
|
|
108
104
|
return Math.max(0, reading.cpu_ms - earlier)
|
|
109
105
|
}
|
|
110
106
|
|
|
111
|
-
|
|
107
|
+
// The cores a process used since the last sample, `undefined` with none to take a difference from.
|
|
108
|
+
function cores_of(
|
|
112
109
|
before: UsageMark | undefined,
|
|
113
110
|
after: UsageMark,
|
|
114
|
-
): (
|
|
115
|
-
|
|
111
|
+
): ((pid: number, reading: ProcessReading) => number) | undefined {
|
|
112
|
+
const elapsed = before === undefined ? 0 : after.at_ms - before.at_ms
|
|
113
|
+
|
|
114
|
+
if (before === undefined || elapsed <= 0) return undefined
|
|
116
115
|
|
|
117
116
|
const counted = reaped_counted(before, after)
|
|
118
117
|
|
|
119
|
-
return (
|
|
118
|
+
return (pid, reading) => cpu_spent(before, counted, pid, reading) / elapsed
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function process_figures(
|
|
122
|
+
before: UsageMark | undefined,
|
|
123
|
+
after: UsageMark,
|
|
124
|
+
): Map<number, UsageFigure> {
|
|
125
|
+
const cores = cores_of(before, after)
|
|
126
|
+
const figures = [...after.processes].map(([pid, reading]) => {
|
|
127
|
+
const { memory_bytes, compressed_bytes } = reading
|
|
128
|
+
|
|
129
|
+
return [pid, { cpu_cores: cores?.(pid, reading), memory_bytes, compressed_bytes }] as const
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
return new Map(figures)
|
|
120
133
|
}
|
|
121
134
|
|
|
122
|
-
function
|
|
123
|
-
|
|
124
|
-
|
|
135
|
+
function cores_sum(left: number | undefined, right: number | undefined): number | undefined {
|
|
136
|
+
return left === undefined || right === undefined ? undefined : left + right
|
|
137
|
+
}
|
|
125
138
|
|
|
126
|
-
|
|
127
|
-
|
|
139
|
+
// The figures' sum, its cores `undefined` where any one's are.
|
|
140
|
+
function sum_of(figures: Iterable<UsageFigure>): UsageFigure {
|
|
141
|
+
let sum = NO_FIGURE
|
|
128
142
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
143
|
+
for (const figure of figures) {
|
|
144
|
+
sum = {
|
|
145
|
+
cpu_cores: cores_sum(sum.cpu_cores, figure.cpu_cores),
|
|
146
|
+
memory_bytes: sum.memory_bytes + figure.memory_bytes,
|
|
147
|
+
compressed_bytes: sum.compressed_bytes + figure.compressed_bytes,
|
|
148
|
+
}
|
|
133
149
|
}
|
|
134
150
|
|
|
135
|
-
return
|
|
151
|
+
return sum
|
|
136
152
|
}
|
|
137
153
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
):
|
|
143
|
-
const
|
|
154
|
+
// Each group's sum, the group of each process given by `group_of`; one in none is left out.
|
|
155
|
+
function grouped_sums<Key>(
|
|
156
|
+
figures: ProcessFigures,
|
|
157
|
+
group_of: (pid: number) => Key | undefined,
|
|
158
|
+
): Map<Key, UsageFigure> {
|
|
159
|
+
const sums = new Map<Key, UsageFigure>()
|
|
144
160
|
|
|
145
|
-
|
|
146
|
-
|
|
161
|
+
for (const [pid, figure] of figures) {
|
|
162
|
+
const group = group_of(pid)
|
|
147
163
|
|
|
148
|
-
|
|
149
|
-
return {
|
|
150
|
-
cpu_percent: cpu_percent(before, after, total.cpu_ms),
|
|
151
|
-
memory_bytes: total.rss_bytes,
|
|
152
|
-
memory_percent: (total.rss_bytes / after.total_bytes) * PERCENT,
|
|
164
|
+
if (group !== undefined) sums.set(group, sum_of([sums.get(group) ?? NO_FIGURE, figure]))
|
|
153
165
|
}
|
|
166
|
+
|
|
167
|
+
return sums
|
|
154
168
|
}
|
|
155
169
|
|
|
156
|
-
function
|
|
157
|
-
|
|
170
|
+
function lane_number(lane: string | undefined): number | undefined {
|
|
171
|
+
return lane === undefined ? undefined : Number(lane)
|
|
172
|
+
}
|
|
158
173
|
|
|
159
|
-
|
|
174
|
+
// Each lane's processes' sum, by each process's lane in `mark.lanes`.
|
|
175
|
+
function usage_of(mark: UsageMark, figures: ProcessFigures): LaneUsages {
|
|
176
|
+
return grouped_sums(figures, (pid) => lane_number(mark.lanes.get(pid)))
|
|
160
177
|
}
|
|
161
178
|
|
|
162
|
-
const run_board_usage = { usage_of }
|
|
179
|
+
const run_board_usage = { grouped_sums, process_figures, sum_of, usage_of }
|
|
163
180
|
|
|
164
181
|
export { run_board_usage }
|
|
165
|
-
export type {
|
|
182
|
+
export type { LaneUsages, ProcessFigures, ProcessReading, UsageFigure, UsageMark, UsageScale }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { LedgerEntry } from '#scripts/lane/lane-ledger'
|
|
2
2
|
import { lane_stage_stats } from '#scripts/lane/lane-stage-stats'
|
|
3
|
+
import { lane_stats } from '#scripts/lane/lane-stats'
|
|
3
4
|
import { run_board_phase, type Phase } from './run-board-phase'
|
|
4
5
|
|
|
5
6
|
// How long each phase usually takes: the lane ledger's median of the stage the phase is
|
|
@@ -7,10 +8,15 @@ import { run_board_phase, type Phase } from './run-board-phase'
|
|
|
7
8
|
// (joshuafolkken/kit#3769). A phase is a `josh ship` stage under the names `run-board-phase.ts` gives
|
|
8
9
|
// them, and `implement` is the ledger's derived one. A phase no stage records — `investigate`, `plan`,
|
|
9
10
|
// `failed` — has no usual time, and is never drawn as long.
|
|
11
|
+
//
|
|
12
|
+
// **The median is the recent one** (joshuafolkken/kit#4319): only the last `PERIOD_DAYS` of the
|
|
13
|
+
// ledger count, so a faster season long past never pulls the estimate down; a stage with nothing that
|
|
14
|
+
// recent falls back to the whole ledger's median.
|
|
10
15
|
|
|
11
16
|
type UsualTimes = ReadonlyMap<Phase, number>
|
|
12
17
|
|
|
13
18
|
const IMPLEMENT_PHASE: Phase = 'implement'
|
|
19
|
+
const PERIOD_DAYS = 3
|
|
14
20
|
|
|
15
21
|
// Each phase's ledger stage, from the stage-to-phase names a row's phase is drawn with. The ledger's
|
|
16
22
|
// `implement` runs from the dispatch, so it also holds the investigation and the plan the row draws
|
|
@@ -21,8 +27,18 @@ const PHASE_STAGES: ReadonlyArray<readonly [string, Phase | undefined]> = [
|
|
|
21
27
|
...Object.entries(run_board_phase.SHIP_PHASES),
|
|
22
28
|
]
|
|
23
29
|
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
// Per stage, so a run's first lanes — dispatched, no stage recorded yet — still draw every phase.
|
|
31
|
+
function medians_of(
|
|
32
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
33
|
+
now_ms: number,
|
|
34
|
+
): ReadonlyMap<string, number> {
|
|
35
|
+
const recent = lane_stats.in_window(entries, lane_stats.window_of(PERIOD_DAYS, now_ms))
|
|
36
|
+
|
|
37
|
+
return new Map([...lane_stage_stats.medians(entries), ...lane_stage_stats.medians(recent)])
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function usual_of(entries: ReadonlyArray<LedgerEntry>, now_ms: number): UsualTimes {
|
|
41
|
+
const medians = medians_of(entries, now_ms)
|
|
26
42
|
|
|
27
43
|
return new Map(
|
|
28
44
|
PHASE_STAGES.flatMap(([stage, phase]) => {
|
|
@@ -33,12 +49,7 @@ function usual_of(entries: ReadonlyArray<LedgerEntry>): UsualTimes {
|
|
|
33
49
|
)
|
|
34
50
|
}
|
|
35
51
|
|
|
36
|
-
|
|
37
|
-
function read(repository: string): UsualTimes {
|
|
38
|
-
return usual_of(lane_ledger.read_entries(lane_ledger.target_of(repository)))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const run_board_usual = { read, usual_of }
|
|
52
|
+
const run_board_usual = { usual_of }
|
|
42
53
|
|
|
43
54
|
export { run_board_usual }
|
|
44
55
|
export type { UsualTimes }
|
|
@@ -13,7 +13,6 @@ const ONE_MERGE = 1
|
|
|
13
13
|
// The four request groups below are mutually exclusive, so more than one of them named in a single
|
|
14
14
|
// invocation is a usage error rather than an order to guess.
|
|
15
15
|
const ONE_GROUP = 1
|
|
16
|
-
const COUNT_PATTERN = /^\d+$/u
|
|
17
16
|
const EMPTY_INVOCATION = ''
|
|
18
17
|
// A pid below this addresses a process group rather than a process, which `process-identity.ts`
|
|
19
18
|
// rejects on the read side. Refused here too, so a record never records an owner nothing can be.
|
|
@@ -87,7 +86,7 @@ function to_count(value: OptionValue): number | undefined {
|
|
|
87
86
|
|
|
88
87
|
if (text === undefined) return NO_INCREMENT
|
|
89
88
|
|
|
90
|
-
return
|
|
89
|
+
return cli_flags.to_count(text)
|
|
91
90
|
}
|
|
92
91
|
|
|
93
92
|
// **`--done` and `--merged` name an issue, so each is checked as one and not as a count.** The shape
|
|
@@ -105,7 +104,7 @@ function to_issue(value: OptionValue): { issue?: number } | undefined {
|
|
|
105
104
|
const issue = Number(text)
|
|
106
105
|
|
|
107
106
|
// The pattern is anchored on digits and bounds nothing, so the magnitude check is separate — the
|
|
108
|
-
// same shape `
|
|
107
|
+
// same shape `cli_flags.to_count` ends with. A number past the safe range would be
|
|
109
108
|
// recorded as a different number and never match anything in `remaining`.
|
|
110
109
|
return Number.isSafeInteger(issue) ? { issue } : undefined
|
|
111
110
|
}
|
|
@@ -196,11 +195,9 @@ function to_owner(value: OptionValue): CarryOwner | undefined {
|
|
|
196
195
|
|
|
197
196
|
if (text === undefined) return run_carry.NO_OWNER
|
|
198
197
|
|
|
199
|
-
|
|
198
|
+
const pid = cli_flags.to_count(text)
|
|
200
199
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
return pid < MIN_PID ? undefined : marked(run_carry.owner_of(pid))
|
|
200
|
+
return pid === undefined || pid < MIN_PID ? undefined : marked(run_carry.owner_of(pid))
|
|
204
201
|
}
|
|
205
202
|
|
|
206
203
|
// A non-empty `--summary`, or nothing. An empty string is nothing here, so it reads as absent and the
|