@joshuafolkken/kit 1.1514.0 → 1.2114.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/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- 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 +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- 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 +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -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 +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -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 +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- 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 +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -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 +5 -4
- 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 +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- 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 +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- 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/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- 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/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -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 +33 -2
- 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 +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- 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-rank.ts +5 -0
- 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-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -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 +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- 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 +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -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/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -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 +38 -179
- 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/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- 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 +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -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 +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -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 +114 -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-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- 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 +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- 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 +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- 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 +160 -161
- 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 +142 -101
- 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 +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -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 +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- 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 +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -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 +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- 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/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- 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/token-shape.ts +111 -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-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -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 +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- 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/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- 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 +24 -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 +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- 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/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -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 +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- 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 +71 -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 +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -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 +90 -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 +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -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-link.ts +15 -2
- 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 +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- 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 +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -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 +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -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 +264 -258
- 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 +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- 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-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -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 +58 -10
- 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 +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- 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 +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- 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-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- 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 +3 -4
- 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 +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- 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 +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -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-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- 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 +6 -11
- package/scripts/security/secretlint-scan.ts +42 -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 +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- 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 +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -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/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- 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-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -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 +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- 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 +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- 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/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -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 +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -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-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- 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-O6GDRNJB.js +0 -343
- 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-TNUMY6NL.js +0 -4838
- 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/context-cut-threshold.ts +0 -11
- 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/filing-cap.ts +0 -132
- 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,2451 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
GIT_TIMEOUT_MS,
|
|
3
|
-
PLATFORM_TEMP_ROOT,
|
|
4
|
-
PROBE_TIMEOUT_MS,
|
|
5
|
-
SUITE_TIMEOUT_MS,
|
|
6
|
-
stamp_file
|
|
7
|
-
} from "./chunk-DGT54IH5.js";
|
|
8
|
-
|
|
9
|
-
// scripts/lib/json-value.ts
|
|
10
|
-
function parse_or_undefined(text) {
|
|
11
|
-
try {
|
|
12
|
-
return JSON.parse(text);
|
|
13
|
-
} catch {
|
|
14
|
-
return void 0;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
function parse_with(text, schema) {
|
|
18
|
-
const value = parse_or_undefined(text);
|
|
19
|
-
if (value === void 0) return void 0;
|
|
20
|
-
const parsed = schema.safeParse(value);
|
|
21
|
-
return parsed.success ? parsed.data : void 0;
|
|
22
|
-
}
|
|
23
|
-
function is_record(value) {
|
|
24
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25
|
-
}
|
|
26
|
-
var json_value = { parse_or_undefined, parse_with, is_record };
|
|
27
|
-
|
|
28
|
-
// scripts/git/constants.ts
|
|
29
|
-
import { platform } from "node:os";
|
|
30
|
-
var GIT_COMMAND_UNIX = "/usr/bin/git";
|
|
31
|
-
var PORCELAIN_FLAG = "--porcelain";
|
|
32
|
-
var UNTRACKED_FILES_FLAG = "--untracked-files=all";
|
|
33
|
-
var GIT_BINARY_KEY = "JOSH_GIT_BINARY";
|
|
34
|
-
function get_git_command() {
|
|
35
|
-
if (platform() === "win32") return String.raw`"C:\Program Files\Git\cmd\git.exe"`;
|
|
36
|
-
return GIT_COMMAND_UNIX;
|
|
37
|
-
}
|
|
38
|
-
function get_git_command_for_spawn() {
|
|
39
|
-
const binary = process.env[GIT_BINARY_KEY];
|
|
40
|
-
if (binary !== void 0 && binary !== "") return binary;
|
|
41
|
-
if (platform() === "win32") return String.raw`C:\Program Files\Git\cmd\git.exe`;
|
|
42
|
-
return GIT_COMMAND_UNIX;
|
|
43
|
-
}
|
|
44
|
-
var git_utilities = {
|
|
45
|
-
get_git_command,
|
|
46
|
-
get_git_command_for_spawn
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
// scripts/git/git-spawn.ts
|
|
50
|
-
import { execa as execa3 } from "execa";
|
|
51
|
-
|
|
52
|
-
// scripts/git/git-execa-error.ts
|
|
53
|
-
function get_exit_code(error) {
|
|
54
|
-
if (typeof error !== "object" || error === null || !("exitCode" in error)) return void 0;
|
|
55
|
-
const { exitCode: exit_code } = error;
|
|
56
|
-
return typeof exit_code === "number" ? exit_code : void 0;
|
|
57
|
-
}
|
|
58
|
-
function has_timed_out(error) {
|
|
59
|
-
if (typeof error !== "object" || error === null || !("timedOut" in error)) return false;
|
|
60
|
-
return error.timedOut === true;
|
|
61
|
-
}
|
|
62
|
-
var TIMEOUT_EXIT_CODE = "timeout";
|
|
63
|
-
function create_spawn_error(command, exit_code) {
|
|
64
|
-
const exit_code_string = exit_code === void 0 ? "unknown" : String(exit_code);
|
|
65
|
-
const error_message = `git ${command} exited with code ${exit_code_string}`;
|
|
66
|
-
return new Error(error_message, { cause: { exit_code: exit_code_string } });
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// scripts/git/git-push-transport.ts
|
|
70
|
-
import { execa as execa2 } from "execa";
|
|
71
|
-
|
|
72
|
-
// scripts/git/git-ssh-keepalive.ts
|
|
73
|
-
import { execa } from "execa";
|
|
74
|
-
var SSH_KEEPALIVE_OPTIONS = "-o ServerAliveInterval=15 -o ServerAliveCountMax=3";
|
|
75
|
-
var SSH_COMMAND_VARIABLE = "GIT_SSH_COMMAND";
|
|
76
|
-
var SSH_LEGACY_VARIABLE = "GIT_SSH";
|
|
77
|
-
var KEEPALIVE_SSH_COMMAND = `ssh ${SSH_KEEPALIVE_OPTIONS}`;
|
|
78
|
-
var SSH_COMMAND_CONFIG_KEY = "core.sshCommand";
|
|
79
|
-
var CONFIG_PROBE_ARGUMENTS = ["config", "--get", SSH_COMMAND_CONFIG_KEY];
|
|
80
|
-
var PROBE_OPTIONS = { timeout: PROBE_TIMEOUT_MS };
|
|
81
|
-
function to_environment_value(name) {
|
|
82
|
-
return process.env[name]?.trim() ?? "";
|
|
83
|
-
}
|
|
84
|
-
function to_configured_ssh_command() {
|
|
85
|
-
const from_command = to_environment_value(SSH_COMMAND_VARIABLE);
|
|
86
|
-
return from_command === "" ? to_environment_value(SSH_LEGACY_VARIABLE) : from_command;
|
|
87
|
-
}
|
|
88
|
-
async function has_configured_ssh_command() {
|
|
89
|
-
if (to_configured_ssh_command() !== "") return true;
|
|
90
|
-
try {
|
|
91
|
-
const git_command_bin = git_utilities.get_git_command_for_spawn();
|
|
92
|
-
const { stdout } = await execa(git_command_bin, CONFIG_PROBE_ARGUMENTS, PROBE_OPTIONS);
|
|
93
|
-
return stdout.trim() !== "";
|
|
94
|
-
} catch (error) {
|
|
95
|
-
return has_timed_out(error);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
async function to_environment() {
|
|
99
|
-
const should_keep_alive = !await has_configured_ssh_command();
|
|
100
|
-
return should_keep_alive ? { [SSH_COMMAND_VARIABLE]: KEEPALIVE_SSH_COMMAND } : {};
|
|
101
|
-
}
|
|
102
|
-
var git_ssh_keepalive = {
|
|
103
|
-
to_environment
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
// scripts/git/git-push-transport.ts
|
|
107
|
-
var MS_PER_SECOND = 1e3;
|
|
108
|
-
var PUSH_TIMEOUT_SECONDS = 120;
|
|
109
|
-
var PUSH_TIMEOUT_MS = PUSH_TIMEOUT_SECONDS * MS_PER_SECOND;
|
|
110
|
-
var PUSH_TIMEOUT_LABEL = `${String(PUSH_TIMEOUT_SECONDS)}s`;
|
|
111
|
-
var PUSH_TIMEOUT_MESSAGE = "git push timed out";
|
|
112
|
-
var PUSH_SUBCOMMAND = "push";
|
|
113
|
-
async function to_push_options() {
|
|
114
|
-
return {
|
|
115
|
-
stdio: "inherit",
|
|
116
|
-
timeout: PUSH_TIMEOUT_MS,
|
|
117
|
-
env: await git_ssh_keepalive.to_environment()
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
async function did_push_time_out(arguments_list) {
|
|
121
|
-
const git_command_bin = git_utilities.get_git_command_for_spawn();
|
|
122
|
-
const options = await to_push_options();
|
|
123
|
-
try {
|
|
124
|
-
await execa2(git_command_bin, [PUSH_SUBCOMMAND, ...arguments_list], options);
|
|
125
|
-
return false;
|
|
126
|
-
} catch (error) {
|
|
127
|
-
if (has_timed_out(error)) return true;
|
|
128
|
-
throw create_spawn_error(PUSH_SUBCOMMAND, get_exit_code(error));
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
function to_manual_command(arguments_list) {
|
|
132
|
-
return ["git", PUSH_SUBCOMMAND, ...arguments_list].join(" ");
|
|
133
|
-
}
|
|
134
|
-
function to_retry_notice(arguments_list) {
|
|
135
|
-
return `${PUSH_TIMEOUT_MESSAGE} after ${PUSH_TIMEOUT_LABEL} \u2014 retrying once: ${to_manual_command(arguments_list)}`;
|
|
136
|
-
}
|
|
137
|
-
function create_timeout_error(arguments_list) {
|
|
138
|
-
const message = `${PUSH_TIMEOUT_MESSAGE} twice (${PUSH_TIMEOUT_LABEL} each). Re-run it by hand: ${to_manual_command(arguments_list)}`;
|
|
139
|
-
return new Error(message, { cause: { exit_code: TIMEOUT_EXIT_CODE } });
|
|
140
|
-
}
|
|
141
|
-
async function push(arguments_list) {
|
|
142
|
-
if (!await did_push_time_out(arguments_list)) return;
|
|
143
|
-
console.warn(to_retry_notice(arguments_list));
|
|
144
|
-
if (!await did_push_time_out(arguments_list)) return;
|
|
145
|
-
throw create_timeout_error(arguments_list);
|
|
146
|
-
}
|
|
147
|
-
var git_push_transport = {
|
|
148
|
-
push
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
// scripts/git/git-spawn.ts
|
|
152
|
-
async function read(arguments_, timeout_ms = GIT_TIMEOUT_MS) {
|
|
153
|
-
const git_cmd = git_utilities.get_git_command_for_spawn();
|
|
154
|
-
const { stdout } = await execa3(git_cmd, arguments_, { timeout: timeout_ms });
|
|
155
|
-
return stdout.trimEnd();
|
|
156
|
-
}
|
|
157
|
-
var REMOTE_TIMEOUT_MS = PUSH_TIMEOUT_MS;
|
|
158
|
-
var MS_PER_SECOND2 = 1e3;
|
|
159
|
-
function to_budget_error(command, error, timeout_ms) {
|
|
160
|
-
if (!has_timed_out(error)) return create_spawn_error(command, get_exit_code(error));
|
|
161
|
-
const seconds = String(Math.round(timeout_ms / MS_PER_SECOND2));
|
|
162
|
-
return new Error(`git ${command} timed out after ${seconds}s`, {
|
|
163
|
-
cause: { exit_code: TIMEOUT_EXIT_CODE }
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
async function spawn_remote(arguments_, options) {
|
|
167
|
-
const git_cmd = git_utilities.get_git_command_for_spawn();
|
|
168
|
-
try {
|
|
169
|
-
const { stdout } = await execa3(git_cmd, arguments_, options);
|
|
170
|
-
return typeof stdout === "string" ? stdout.trimEnd() : "";
|
|
171
|
-
} catch (error) {
|
|
172
|
-
throw to_budget_error(arguments_[0] ?? "", error, options.timeout);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
async function read_remote(arguments_, timeout_ms = REMOTE_TIMEOUT_MS) {
|
|
176
|
-
return await spawn_remote(arguments_, {
|
|
177
|
-
timeout: timeout_ms,
|
|
178
|
-
env: await git_ssh_keepalive.to_environment()
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
async function with_output_remote(command, arguments_list) {
|
|
182
|
-
await spawn_remote([command, ...arguments_list], {
|
|
183
|
-
stdio: "inherit",
|
|
184
|
-
timeout: REMOTE_TIMEOUT_MS,
|
|
185
|
-
env: await git_ssh_keepalive.to_environment()
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
async function with_output(command, arguments_list, options = {}) {
|
|
189
|
-
const { config_options = [], timeout_ms = GIT_TIMEOUT_MS } = options;
|
|
190
|
-
const git_command_bin = git_utilities.get_git_command_for_spawn();
|
|
191
|
-
const spawn_arguments = [...config_options, command, ...arguments_list];
|
|
192
|
-
try {
|
|
193
|
-
await execa3(git_command_bin, spawn_arguments, { stdio: "inherit", timeout: timeout_ms });
|
|
194
|
-
} catch (error) {
|
|
195
|
-
throw to_budget_error(command, error, timeout_ms);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
var git_spawn = {
|
|
199
|
-
read,
|
|
200
|
-
read_remote,
|
|
201
|
-
with_output,
|
|
202
|
-
with_output_remote
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
// scripts/git/git-diff-reads.ts
|
|
206
|
-
var REFS_REMOTES_ORIGIN_PREFIX = "refs/remotes/origin/";
|
|
207
|
-
var NAME_ONLY_FLAG = "--name-only";
|
|
208
|
-
var DEFAULT_BRANCH_FALLBACK = "main";
|
|
209
|
-
var DEFAULT_BRANCH_ARGUMENTS = ["symbolic-ref", "refs/remotes/origin/HEAD"];
|
|
210
|
-
function default_branch_of(output) {
|
|
211
|
-
const trimmed = output?.trim() ?? "";
|
|
212
|
-
if (!trimmed.startsWith(REFS_REMOTES_ORIGIN_PREFIX)) return DEFAULT_BRANCH_FALLBACK;
|
|
213
|
-
return trimmed.slice(REFS_REMOTES_ORIGIN_PREFIX.length);
|
|
214
|
-
}
|
|
215
|
-
async function get_default_branch() {
|
|
216
|
-
try {
|
|
217
|
-
return default_branch_of(await git_spawn.read([...DEFAULT_BRANCH_ARGUMENTS]));
|
|
218
|
-
} catch {
|
|
219
|
-
return DEFAULT_BRANCH_FALLBACK;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
var MERGE_BASE_COMMAND = "merge-base";
|
|
223
|
-
async function reference_exists(reference) {
|
|
224
|
-
try {
|
|
225
|
-
await git_spawn.read(["rev-parse", "--verify", "--quiet", reference]);
|
|
226
|
-
return true;
|
|
227
|
-
} catch {
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
async function default_branch_reference() {
|
|
232
|
-
const default_branch = await get_default_branch();
|
|
233
|
-
const remote_reference = `${REFS_REMOTES_ORIGIN_PREFIX}${default_branch}`;
|
|
234
|
-
return await reference_exists(remote_reference) ? remote_reference : default_branch;
|
|
235
|
-
}
|
|
236
|
-
async function change_base() {
|
|
237
|
-
const default_branch = await default_branch_reference();
|
|
238
|
-
try {
|
|
239
|
-
return await git_spawn.read([MERGE_BASE_COMMAND, default_branch, "HEAD"]);
|
|
240
|
-
} catch {
|
|
241
|
-
return default_branch;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
async function diff_main(file_path) {
|
|
245
|
-
return await git_spawn.read(["diff", await change_base(), "--", file_path]);
|
|
246
|
-
}
|
|
247
|
-
var NO_PATH_QUOTING = ["-c", "core.quotePath=false"];
|
|
248
|
-
var NO_RELATIVE_PATHS = "--no-relative";
|
|
249
|
-
var NO_RENAME_DETECTION = "--no-renames";
|
|
250
|
-
async function change_base_commit() {
|
|
251
|
-
return await git_spawn.read(["rev-parse", await change_base()]);
|
|
252
|
-
}
|
|
253
|
-
async function diff_main_names() {
|
|
254
|
-
return await git_spawn.read([
|
|
255
|
-
...NO_PATH_QUOTING,
|
|
256
|
-
"diff",
|
|
257
|
-
NAME_ONLY_FLAG,
|
|
258
|
-
NO_RELATIVE_PATHS,
|
|
259
|
-
NO_RENAME_DETECTION,
|
|
260
|
-
await change_base(),
|
|
261
|
-
"--"
|
|
262
|
-
]);
|
|
263
|
-
}
|
|
264
|
-
async function diff_cached_names() {
|
|
265
|
-
return await git_spawn.read([
|
|
266
|
-
...NO_PATH_QUOTING,
|
|
267
|
-
"diff",
|
|
268
|
-
"--cached",
|
|
269
|
-
NAME_ONLY_FLAG,
|
|
270
|
-
NO_RELATIVE_PATHS,
|
|
271
|
-
NO_RENAME_DETECTION
|
|
272
|
-
]);
|
|
273
|
-
}
|
|
274
|
-
async function diff_main_numstat() {
|
|
275
|
-
return await git_spawn.read([
|
|
276
|
-
...NO_PATH_QUOTING,
|
|
277
|
-
"diff",
|
|
278
|
-
"--numstat",
|
|
279
|
-
NO_RELATIVE_PATHS,
|
|
280
|
-
NO_RENAME_DETECTION,
|
|
281
|
-
await change_base(),
|
|
282
|
-
"--"
|
|
283
|
-
]);
|
|
284
|
-
}
|
|
285
|
-
var WHOLE_TREE_PATHSPEC = ":/";
|
|
286
|
-
async function untracked_names() {
|
|
287
|
-
return await git_spawn.read([
|
|
288
|
-
...NO_PATH_QUOTING,
|
|
289
|
-
"ls-files",
|
|
290
|
-
"--others",
|
|
291
|
-
"--exclude-standard",
|
|
292
|
-
"--full-name",
|
|
293
|
-
WHOLE_TREE_PATHSPEC
|
|
294
|
-
]);
|
|
295
|
-
}
|
|
296
|
-
var git_diff_reads = {
|
|
297
|
-
DEFAULT_BRANCH_ARGUMENTS,
|
|
298
|
-
change_base,
|
|
299
|
-
change_base_commit,
|
|
300
|
-
default_branch_of,
|
|
301
|
-
default_branch_reference,
|
|
302
|
-
diff_cached_names,
|
|
303
|
-
diff_main,
|
|
304
|
-
diff_main_names,
|
|
305
|
-
diff_main_numstat,
|
|
306
|
-
get_default_branch,
|
|
307
|
-
untracked_names
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
// scripts/git/git-pre-push-hook.ts
|
|
311
|
-
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
312
|
-
import { tmpdir } from "node:os";
|
|
313
|
-
import path from "node:path";
|
|
314
|
-
var REMOTE = "origin";
|
|
315
|
-
var HOOK_NAME = "pre-push";
|
|
316
|
-
var PROBE_HOOK_NAME = "kit-hook-run-probe";
|
|
317
|
-
var ALLOW_UNKNOWN_HOOK_NAME_FLAG = "--allow-unknown-hook-name";
|
|
318
|
-
var HOOK_RUN = "run";
|
|
319
|
-
var STDIN_FILE = "refs";
|
|
320
|
-
var TEMPORARY_PREFIX = "kit-pre-push-";
|
|
321
|
-
var ZERO_DIGIT = "0";
|
|
322
|
-
async function read_remote_oid(branch2) {
|
|
323
|
-
try {
|
|
324
|
-
return await git_spawn.read([
|
|
325
|
-
"rev-parse",
|
|
326
|
-
"--verify",
|
|
327
|
-
"--quiet",
|
|
328
|
-
`refs/remotes/${REMOTE}/${branch2}`
|
|
329
|
-
]);
|
|
330
|
-
} catch {
|
|
331
|
-
return void 0;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
async function read_push_references() {
|
|
335
|
-
const [branch2, local_oid] = await Promise.all([
|
|
336
|
-
git_spawn.read(["rev-parse", "--abbrev-ref", "HEAD"]),
|
|
337
|
-
git_spawn.read(["rev-parse", "HEAD"])
|
|
338
|
-
]);
|
|
339
|
-
return { branch: branch2, local_oid, remote_oid: await read_remote_oid(branch2) };
|
|
340
|
-
}
|
|
341
|
-
function to_stdin_line(references) {
|
|
342
|
-
const reference = `refs/heads/${references.branch}`;
|
|
343
|
-
const remote_oid = references.remote_oid ?? ZERO_DIGIT.repeat(references.local_oid.length);
|
|
344
|
-
return `${reference} ${references.local_oid} ${reference} ${remote_oid}
|
|
345
|
-
`;
|
|
346
|
-
}
|
|
347
|
-
function to_hook_run_arguments(stdin_path, hook_name) {
|
|
348
|
-
return [HOOK_RUN, "--ignore-missing", `--to-stdin=${stdin_path}`, hook_name];
|
|
349
|
-
}
|
|
350
|
-
async function can_probe(probe_arguments) {
|
|
351
|
-
try {
|
|
352
|
-
await git_spawn.read(["hook", ...probe_arguments]);
|
|
353
|
-
return true;
|
|
354
|
-
} catch {
|
|
355
|
-
return false;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
async function can_run_hooks(stdin_path) {
|
|
359
|
-
const [, ...options] = to_hook_run_arguments(stdin_path, PROBE_HOOK_NAME);
|
|
360
|
-
if (await can_probe([HOOK_RUN, ALLOW_UNKNOWN_HOOK_NAME_FLAG, ...options])) return true;
|
|
361
|
-
return await can_probe([HOOK_RUN, ...options]);
|
|
362
|
-
}
|
|
363
|
-
async function run_with_stdin(stdin_line) {
|
|
364
|
-
const directory = await mkdtemp(path.join(tmpdir(), TEMPORARY_PREFIX));
|
|
365
|
-
const stdin_path = path.join(directory, STDIN_FILE);
|
|
366
|
-
try {
|
|
367
|
-
await writeFile(stdin_path, stdin_line);
|
|
368
|
-
if (!await can_run_hooks(stdin_path)) return false;
|
|
369
|
-
const url = await git_spawn.read(["remote", "get-url", REMOTE]);
|
|
370
|
-
await git_spawn.with_output(
|
|
371
|
-
"hook",
|
|
372
|
-
[...to_hook_run_arguments(stdin_path, HOOK_NAME), "--", REMOTE, url],
|
|
373
|
-
{ timeout_ms: SUITE_TIMEOUT_MS }
|
|
374
|
-
);
|
|
375
|
-
return true;
|
|
376
|
-
} finally {
|
|
377
|
-
await rm(directory, { force: true, recursive: true });
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
async function run() {
|
|
381
|
-
const references = await read_push_references();
|
|
382
|
-
if (references.local_oid === references.remote_oid) return true;
|
|
383
|
-
return await run_with_stdin(to_stdin_line(references));
|
|
384
|
-
}
|
|
385
|
-
var git_pre_push_hook = {
|
|
386
|
-
run
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
// scripts/lib/spawn-exit.ts
|
|
390
|
-
function read_spawn_stdout(result) {
|
|
391
|
-
return result.stdout ?? "";
|
|
392
|
-
}
|
|
393
|
-
function read_spawn_stderr(result) {
|
|
394
|
-
return result.stderr ?? "";
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
// scripts/git/git-spawn-sync.ts
|
|
398
|
-
import { execaSync } from "execa";
|
|
399
|
-
|
|
400
|
-
// scripts/git/git-location-environment.ts
|
|
401
|
-
var GIT_LOCATION_VARIABLES = [
|
|
402
|
-
"GIT_ALTERNATE_OBJECT_DIRECTORIES",
|
|
403
|
-
"GIT_COMMON_DIR",
|
|
404
|
-
"GIT_DIR",
|
|
405
|
-
"GIT_INDEX_FILE",
|
|
406
|
-
"GIT_NAMESPACE",
|
|
407
|
-
"GIT_OBJECT_DIRECTORY",
|
|
408
|
-
"GIT_WORK_TREE"
|
|
409
|
-
];
|
|
410
|
-
function location_free_environment() {
|
|
411
|
-
return Object.fromEntries(GIT_LOCATION_VARIABLES.map((name) => [name, void 0]));
|
|
412
|
-
}
|
|
413
|
-
function forget(name) {
|
|
414
|
-
Reflect.deleteProperty(process.env, name);
|
|
415
|
-
}
|
|
416
|
-
function restore_one(name, value) {
|
|
417
|
-
if (value === void 0) forget(name);
|
|
418
|
-
else process.env[name] = value;
|
|
419
|
-
}
|
|
420
|
-
function clear_git_location_variables() {
|
|
421
|
-
const previous = GIT_LOCATION_VARIABLES.map((name) => [name, process.env[name]]);
|
|
422
|
-
for (const [name] of previous) forget(name);
|
|
423
|
-
return () => {
|
|
424
|
-
for (const [name, value] of previous) restore_one(name, value);
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
var git_location_environment = { clear_git_location_variables, location_free_environment };
|
|
428
|
-
|
|
429
|
-
// scripts/git/git-spawn-sync.ts
|
|
430
|
-
var SUCCESS_EXIT_CODE = 0;
|
|
431
|
-
var C_LOCALE = { LC_ALL: "C", LANGUAGE: "C" };
|
|
432
|
-
function run2(args, options = {}) {
|
|
433
|
-
const result = execaSync(git_utilities.get_git_command_for_spawn(), args, {
|
|
434
|
-
...options,
|
|
435
|
-
extendEnv: true,
|
|
436
|
-
reject: false,
|
|
437
|
-
timeout: options.timeout ?? GIT_TIMEOUT_MS
|
|
438
|
-
});
|
|
439
|
-
return {
|
|
440
|
-
exit_code: result.exitCode,
|
|
441
|
-
stdout: read_spawn_stdout(result),
|
|
442
|
-
stderr: read_spawn_stderr(result)
|
|
443
|
-
};
|
|
444
|
-
}
|
|
445
|
-
function read2(args, options = {}) {
|
|
446
|
-
const result = run2(args, options);
|
|
447
|
-
return result.exit_code === SUCCESS_EXIT_CODE ? result.stdout.trim() : void 0;
|
|
448
|
-
}
|
|
449
|
-
function origin_url(cwd) {
|
|
450
|
-
return read2(["config", "--get", "remote.origin.url"], {
|
|
451
|
-
cwd,
|
|
452
|
-
env: git_location_environment.location_free_environment()
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
function toplevel(timeout = GIT_TIMEOUT_MS) {
|
|
456
|
-
return run2(["rev-parse", "--show-toplevel"], { env: C_LOCALE, timeout });
|
|
457
|
-
}
|
|
458
|
-
var git_spawn_sync = { GIT_TIMEOUT_MS, C_LOCALE, run: run2, read: read2, origin_url, toplevel };
|
|
459
|
-
|
|
460
|
-
// scripts/git/git-command.ts
|
|
461
|
-
async function branch() {
|
|
462
|
-
return await git_spawn.read(["rev-parse", "--abbrev-ref", "HEAD"]);
|
|
463
|
-
}
|
|
464
|
-
async function status(directory) {
|
|
465
|
-
const location = directory === void 0 ? [] : ["-C", directory];
|
|
466
|
-
return await git_spawn.read([...location, "status", PORCELAIN_FLAG, UNTRACKED_FILES_FLAG]);
|
|
467
|
-
}
|
|
468
|
-
async function repository_root() {
|
|
469
|
-
const result = git_spawn_sync.toplevel();
|
|
470
|
-
if (result.exit_code !== 0) throw create_spawn_error("rev-parse", result.exit_code);
|
|
471
|
-
return result.stdout.trim();
|
|
472
|
-
}
|
|
473
|
-
async function head_commit() {
|
|
474
|
-
return await git_spawn.read(["rev-parse", "HEAD"]);
|
|
475
|
-
}
|
|
476
|
-
var GIT_DIRECTORY_ARGUMENTS = [
|
|
477
|
-
"rev-parse",
|
|
478
|
-
"--absolute-git-dir",
|
|
479
|
-
"--path-format=absolute",
|
|
480
|
-
"--git-common-dir"
|
|
481
|
-
];
|
|
482
|
-
async function git_directories() {
|
|
483
|
-
const output = await git_spawn.read([...GIT_DIRECTORY_ARGUMENTS]);
|
|
484
|
-
return output.split("\n").filter((line) => line !== "");
|
|
485
|
-
}
|
|
486
|
-
async function diff_cached(file_path) {
|
|
487
|
-
return await git_spawn.read(["diff", "--cached", file_path]);
|
|
488
|
-
}
|
|
489
|
-
async function fetch_branch(branch_name) {
|
|
490
|
-
const refspec = `+refs/heads/${branch_name}:refs/remotes/origin/${branch_name}`;
|
|
491
|
-
return await git_spawn.read_remote(["fetch", "origin", refspec]);
|
|
492
|
-
}
|
|
493
|
-
async function merge_fast_forward(branch_name) {
|
|
494
|
-
return await git_spawn.read(["merge", "--ff-only", `origin/${branch_name}`], SUITE_TIMEOUT_MS);
|
|
495
|
-
}
|
|
496
|
-
async function fast_forward_local(branch_name) {
|
|
497
|
-
return await git_spawn.read_remote(["fetch", "origin", `${branch_name}:${branch_name}`]);
|
|
498
|
-
}
|
|
499
|
-
async function merge_branch(branch_name, message) {
|
|
500
|
-
const message_arguments = message === void 0 ? [] : ["-m", message];
|
|
501
|
-
await git_spawn.with_output("merge", [...message_arguments, `origin/${branch_name}`], {
|
|
502
|
-
timeout_ms: SUITE_TIMEOUT_MS
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
async function checkout_b(branch_name) {
|
|
506
|
-
return await git_spawn.read(["checkout", "-b", branch_name], SUITE_TIMEOUT_MS);
|
|
507
|
-
}
|
|
508
|
-
async function checkout(branch_name) {
|
|
509
|
-
return await git_spawn.read(["checkout", branch_name], SUITE_TIMEOUT_MS);
|
|
510
|
-
}
|
|
511
|
-
async function commit(message) {
|
|
512
|
-
await git_spawn.with_output("commit", ["-m", message], { timeout_ms: SUITE_TIMEOUT_MS });
|
|
513
|
-
}
|
|
514
|
-
async function delete_branch(branch_name) {
|
|
515
|
-
await git_spawn.read(["branch", "-d", branch_name]);
|
|
516
|
-
}
|
|
517
|
-
async function read_commit_count(revisions) {
|
|
518
|
-
const output = await git_spawn.read(["rev-list", "--count", ...revisions]);
|
|
519
|
-
const parsed = Number(output);
|
|
520
|
-
if (output.length > 0 && Number.isFinite(parsed)) return parsed;
|
|
521
|
-
throw new Error(
|
|
522
|
-
`\`git rev-list --count ${revisions.join(" ")}\` printed \`${output}\` rather than a count`
|
|
523
|
-
);
|
|
524
|
-
}
|
|
525
|
-
async function commit_count_beyond(base, tip) {
|
|
526
|
-
return await read_commit_count([`${base}..${tip}`]);
|
|
527
|
-
}
|
|
528
|
-
async function commit_count_unpushed(branch_name) {
|
|
529
|
-
return await read_commit_count([branch_name, "--not", "--remotes"]);
|
|
530
|
-
}
|
|
531
|
-
function is_exit_code_128(cause) {
|
|
532
|
-
return typeof cause === "object" && cause !== null && "exit_code" in cause && cause.exit_code === "128";
|
|
533
|
-
}
|
|
534
|
-
function is_upstream_not_set_error(error) {
|
|
535
|
-
if (!(error instanceof Error)) return false;
|
|
536
|
-
const { cause } = error;
|
|
537
|
-
return cause !== void 0 && is_exit_code_128(cause);
|
|
538
|
-
}
|
|
539
|
-
var NO_VERIFY_FLAG = "--no-verify";
|
|
540
|
-
async function push_with_upstream(branch_name, verify_flags) {
|
|
541
|
-
await git_push_transport.push([...verify_flags, "--set-upstream", "origin", branch_name]);
|
|
542
|
-
}
|
|
543
|
-
async function push2() {
|
|
544
|
-
const verify_flags = await git_pre_push_hook.run() ? [NO_VERIFY_FLAG] : [];
|
|
545
|
-
try {
|
|
546
|
-
await git_push_transport.push([...verify_flags]);
|
|
547
|
-
} catch (error) {
|
|
548
|
-
if (is_upstream_not_set_error(error)) {
|
|
549
|
-
const current_branch = await branch();
|
|
550
|
-
await push_with_upstream(current_branch, verify_flags);
|
|
551
|
-
return;
|
|
552
|
-
}
|
|
553
|
-
throw error;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
async function pull_fast_forward() {
|
|
557
|
-
await git_spawn.with_output_remote("pull", ["--ff-only"]);
|
|
558
|
-
}
|
|
559
|
-
var SHORT_NAME_FORMAT = "--format=%(refname:short)";
|
|
560
|
-
var REMOTES_FLAG = "--remotes";
|
|
561
|
-
async function list_branches(flags, pattern) {
|
|
562
|
-
try {
|
|
563
|
-
const output = await git_spawn.read([
|
|
564
|
-
"branch",
|
|
565
|
-
"--list",
|
|
566
|
-
SHORT_NAME_FORMAT,
|
|
567
|
-
...flags,
|
|
568
|
-
pattern
|
|
569
|
-
]);
|
|
570
|
-
return output.split("\n").filter((line) => line.trim() !== "");
|
|
571
|
-
} catch {
|
|
572
|
-
return [];
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
async function branch_names(pattern) {
|
|
576
|
-
return await list_branches([], pattern);
|
|
577
|
-
}
|
|
578
|
-
async function branch_names_remote(pattern) {
|
|
579
|
-
return await list_branches([REMOTES_FLAG], pattern);
|
|
580
|
-
}
|
|
581
|
-
async function branch_exists(branch_name) {
|
|
582
|
-
const names = await branch_names(branch_name);
|
|
583
|
-
return names.length > 0;
|
|
584
|
-
}
|
|
585
|
-
var ALL_PATHS_PATHSPEC = ":/";
|
|
586
|
-
function exclude_pathspec(file_path) {
|
|
587
|
-
return `:(exclude,top)${file_path}`;
|
|
588
|
-
}
|
|
589
|
-
async function add_tracked(excluded_paths) {
|
|
590
|
-
const exclusions = excluded_paths.map((file_path) => exclude_pathspec(file_path));
|
|
591
|
-
await git_spawn.read(["add", "-u", "--", ALL_PATHS_PATHSPEC, ...exclusions]);
|
|
592
|
-
}
|
|
593
|
-
async function add_path(file_path) {
|
|
594
|
-
await git_spawn.with_output("add", ["--", file_path]);
|
|
595
|
-
}
|
|
596
|
-
var FIRST_PARENT_FLAG = "--first-parent";
|
|
597
|
-
async function log_first_parent(limit, file_path, tip = "HEAD") {
|
|
598
|
-
const output = await git_spawn.read([
|
|
599
|
-
"log",
|
|
600
|
-
FIRST_PARENT_FLAG,
|
|
601
|
-
"--format=%H",
|
|
602
|
-
`-n`,
|
|
603
|
-
String(limit),
|
|
604
|
-
tip,
|
|
605
|
-
"--",
|
|
606
|
-
file_path
|
|
607
|
-
]);
|
|
608
|
-
return output.split("\n").filter((line) => line.length > 0);
|
|
609
|
-
}
|
|
610
|
-
async function show_file(spec) {
|
|
611
|
-
return await git_spawn.read(["show", spec]);
|
|
612
|
-
}
|
|
613
|
-
var MERGE_COUNT_ARGUMENTS = [
|
|
614
|
-
"rev-list",
|
|
615
|
-
"--count",
|
|
616
|
-
"--merges",
|
|
617
|
-
FIRST_PARENT_FLAG
|
|
618
|
-
];
|
|
619
|
-
function merge_count_arguments(range) {
|
|
620
|
-
return [...MERGE_COUNT_ARGUMENTS, range];
|
|
621
|
-
}
|
|
622
|
-
async function count_merges(range) {
|
|
623
|
-
const output = await git_spawn.read(merge_count_arguments(range));
|
|
624
|
-
const parsed = Number(output.trim());
|
|
625
|
-
return Number.isFinite(parsed) ? parsed : 0;
|
|
626
|
-
}
|
|
627
|
-
var git_command = {
|
|
628
|
-
GIT_DIRECTORY_ARGUMENTS,
|
|
629
|
-
branch,
|
|
630
|
-
status,
|
|
631
|
-
repository_root,
|
|
632
|
-
head_commit,
|
|
633
|
-
git_directories,
|
|
634
|
-
diff_cached,
|
|
635
|
-
// The default branch, the change base and every reading against it are `git-diff-reads.ts`'s,
|
|
636
|
-
// re-exported here so no call site, mock or spy moved with them.
|
|
637
|
-
...git_diff_reads,
|
|
638
|
-
fetch_branch,
|
|
639
|
-
merge_fast_forward,
|
|
640
|
-
fast_forward_local,
|
|
641
|
-
merge_branch,
|
|
642
|
-
checkout_b,
|
|
643
|
-
checkout,
|
|
644
|
-
commit,
|
|
645
|
-
commit_count_beyond,
|
|
646
|
-
commit_count_unpushed,
|
|
647
|
-
delete_branch,
|
|
648
|
-
push: push2,
|
|
649
|
-
pull_fast_forward,
|
|
650
|
-
branch_exists,
|
|
651
|
-
branch_names,
|
|
652
|
-
branch_names_remote,
|
|
653
|
-
add_tracked,
|
|
654
|
-
add_path,
|
|
655
|
-
log_first_parent,
|
|
656
|
-
show_file,
|
|
657
|
-
count_merges,
|
|
658
|
-
merge_count_arguments,
|
|
659
|
-
is_upstream_not_set_error
|
|
660
|
-
};
|
|
661
|
-
|
|
662
|
-
// scripts/josh/process-identity.ts
|
|
663
|
-
import { execFileSync, spawnSync } from "node:child_process";
|
|
664
|
-
import { randomUUID } from "node:crypto";
|
|
665
|
-
import { readFileSync, rmSync } from "node:fs";
|
|
666
|
-
import { createServer } from "node:net";
|
|
667
|
-
import path2 from "node:path";
|
|
668
|
-
var PS_COMMAND = "/bin/ps";
|
|
669
|
-
var FORMAT_FLAG = "-o";
|
|
670
|
-
var START_TIME_FORMAT = "lstart=";
|
|
671
|
-
var PID_FLAG = "-p";
|
|
672
|
-
var PROBE_ENVIRONMENT = { TZ: "UTC", LC_ALL: "C" };
|
|
673
|
-
var LIVENESS_SIGNAL = 0;
|
|
674
|
-
var NO_SUCH_PROCESS = "ESRCH";
|
|
675
|
-
var LOWEST_REAL_PID = 1;
|
|
676
|
-
var PROC_START_FIELD_INDEX = 19;
|
|
677
|
-
var BEACON_SCHEME = "socket:";
|
|
678
|
-
var BEACON_SUFFIX = ".sock";
|
|
679
|
-
var BEACON_PREFIX = `josh-process-identity-${String(process.getuid?.() ?? "")}-`;
|
|
680
|
-
var BEACON_ID_LENGTH = 36;
|
|
681
|
-
var BEACON_ID_PATTERN = /^[\da-f-]+$/u;
|
|
682
|
-
var WINDOWS_PLATFORM = "win32";
|
|
683
|
-
var BEACON_LIVE_STATUS = 0;
|
|
684
|
-
var BEACON_UNKNOWN_STATUS = 1;
|
|
685
|
-
var BEACON_GONE_STATUS = 2;
|
|
686
|
-
var SOCKET_PROBE_SOURCE = `const net=require('node:net');const socket=net.createConnection(process.argv[1]);socket.once('connect',()=>process.exit(${String(BEACON_LIVE_STATUS)}));socket.once('error',(error)=>process.exit(['ECONNREFUSED','ENOENT'].includes(error.code)?${String(BEACON_GONE_STATUS)}:${String(BEACON_UNKNOWN_STATUS)}));socket.setTimeout(1000,()=>process.exit(${String(BEACON_UNKNOWN_STATUS)}));`;
|
|
687
|
-
var beacons = /* @__PURE__ */ new Map();
|
|
688
|
-
var exit_cleanup = { is_registered: false };
|
|
689
|
-
function signal_refusal(pid) {
|
|
690
|
-
try {
|
|
691
|
-
process.kill(pid, LIVENESS_SIGNAL);
|
|
692
|
-
return void 0;
|
|
693
|
-
} catch (error) {
|
|
694
|
-
return error.code ?? NO_SUCH_PROCESS;
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
function is_live_pid(pid) {
|
|
698
|
-
return pid >= LOWEST_REAL_PID && signal_refusal(pid) === void 0;
|
|
699
|
-
}
|
|
700
|
-
function is_present_pid(pid) {
|
|
701
|
-
return pid >= LOWEST_REAL_PID && signal_refusal(pid) !== NO_SUCH_PROCESS;
|
|
702
|
-
}
|
|
703
|
-
function read_proc_start(pid) {
|
|
704
|
-
try {
|
|
705
|
-
const stat = readFileSync(`/proc/${String(pid)}/stat`, "utf8");
|
|
706
|
-
const fields = stat.slice(stat.lastIndexOf(")") + 1).trim().split(/\s+/u);
|
|
707
|
-
const start = fields[PROC_START_FIELD_INDEX];
|
|
708
|
-
return start === void 0 ? void 0 : `proc:${start}`;
|
|
709
|
-
} catch {
|
|
710
|
-
return void 0;
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
function read_ps_start(pid) {
|
|
714
|
-
try {
|
|
715
|
-
const printed = execFileSync(
|
|
716
|
-
PS_COMMAND,
|
|
717
|
-
[FORMAT_FLAG, START_TIME_FORMAT, PID_FLAG, String(pid)],
|
|
718
|
-
{
|
|
719
|
-
encoding: "utf8",
|
|
720
|
-
timeout: PROBE_TIMEOUT_MS,
|
|
721
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
722
|
-
env: PROBE_ENVIRONMENT
|
|
723
|
-
}
|
|
724
|
-
).trim();
|
|
725
|
-
return printed.length > 0 ? printed : void 0;
|
|
726
|
-
} catch {
|
|
727
|
-
return void 0;
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
var START_PROBES = { read_proc_start, read_ps_start };
|
|
731
|
-
function safe_probe(probe, pid) {
|
|
732
|
-
try {
|
|
733
|
-
return probe(pid);
|
|
734
|
-
} catch {
|
|
735
|
-
return void 0;
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
function read_start(pid, probes = START_PROBES) {
|
|
739
|
-
return safe_probe(probes.read_proc_start, pid) ?? safe_probe(probes.read_ps_start, pid);
|
|
740
|
-
}
|
|
741
|
-
function close_beacon(token) {
|
|
742
|
-
const server = beacons.get(token);
|
|
743
|
-
if (server === void 0) return;
|
|
744
|
-
beacons.delete(token);
|
|
745
|
-
server.close();
|
|
746
|
-
rmSync(token.slice(BEACON_SCHEME.length), { force: true });
|
|
747
|
-
}
|
|
748
|
-
function close_beacons() {
|
|
749
|
-
for (const token of beacons.keys()) close_beacon(token);
|
|
750
|
-
}
|
|
751
|
-
function ensure_exit_cleanup() {
|
|
752
|
-
if (exit_cleanup.is_registered) return;
|
|
753
|
-
exit_cleanup.is_registered = true;
|
|
754
|
-
process.once("exit", close_beacons);
|
|
755
|
-
}
|
|
756
|
-
function ignore_beacon_error() {
|
|
757
|
-
}
|
|
758
|
-
function bind_beacon(target) {
|
|
759
|
-
return createServer().on("error", ignore_beacon_error).listen(target);
|
|
760
|
-
}
|
|
761
|
-
function try_bind_beacon(bind, target) {
|
|
762
|
-
try {
|
|
763
|
-
const server = bind(target);
|
|
764
|
-
return server.listening ? server : void 0;
|
|
765
|
-
} catch {
|
|
766
|
-
return void 0;
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
function open_beacon(bind = bind_beacon) {
|
|
770
|
-
const target = path2.join(PLATFORM_TEMP_ROOT, `${BEACON_PREFIX}${randomUUID()}${BEACON_SUFFIX}`);
|
|
771
|
-
const token = `${BEACON_SCHEME}${target}`;
|
|
772
|
-
const server = try_bind_beacon(bind, target);
|
|
773
|
-
if (server === void 0) return void 0;
|
|
774
|
-
server.unref();
|
|
775
|
-
beacons.set(token, server);
|
|
776
|
-
ensure_exit_cleanup();
|
|
777
|
-
return token;
|
|
778
|
-
}
|
|
779
|
-
function resolve_own_start(probes = START_PROBES, platform2 = process.platform) {
|
|
780
|
-
const start = read_start(process.pid, probes);
|
|
781
|
-
if (start !== void 0 || platform2 === WINDOWS_PLATFORM) return start;
|
|
782
|
-
return open_beacon();
|
|
783
|
-
}
|
|
784
|
-
function is_valid_beacon_name(name) {
|
|
785
|
-
if (!name.startsWith(BEACON_PREFIX) || !name.endsWith(BEACON_SUFFIX)) return false;
|
|
786
|
-
const id = name.slice(BEACON_PREFIX.length, -BEACON_SUFFIX.length);
|
|
787
|
-
return id.length === BEACON_ID_LENGTH && BEACON_ID_PATTERN.test(id);
|
|
788
|
-
}
|
|
789
|
-
function beacon_target(token) {
|
|
790
|
-
if (!token.startsWith(BEACON_SCHEME)) return void 0;
|
|
791
|
-
const target = token.slice(BEACON_SCHEME.length);
|
|
792
|
-
if (path2.dirname(target) !== PLATFORM_TEMP_ROOT) return void 0;
|
|
793
|
-
return is_valid_beacon_name(path2.basename(target)) ? target : void 0;
|
|
794
|
-
}
|
|
795
|
-
function run_socket_probe(target) {
|
|
796
|
-
return spawnSync(process.execPath, ["-e", SOCKET_PROBE_SOURCE, target], {
|
|
797
|
-
stdio: "ignore",
|
|
798
|
-
timeout: PROBE_TIMEOUT_MS
|
|
799
|
-
}).status ?? void 0;
|
|
800
|
-
}
|
|
801
|
-
function is_live_beacon(target, probe = run_socket_probe) {
|
|
802
|
-
const status2 = probe(target);
|
|
803
|
-
if (status2 === BEACON_LIVE_STATUS) return true;
|
|
804
|
-
return status2 === BEACON_GONE_STATUS ? false : void 0;
|
|
805
|
-
}
|
|
806
|
-
function has_matching_start(pid, recorded_start, read3) {
|
|
807
|
-
const observed = read3(pid);
|
|
808
|
-
return observed === void 0 ? void 0 : observed === recorded_start;
|
|
809
|
-
}
|
|
810
|
-
function matches_recorded_start(pid, recorded_start, read3) {
|
|
811
|
-
const target = beacon_target(recorded_start);
|
|
812
|
-
return target === void 0 ? has_matching_start(pid, recorded_start, read3) : is_live_beacon(target);
|
|
813
|
-
}
|
|
814
|
-
var own_probe = /* @__PURE__ */ new Map();
|
|
815
|
-
function own_start() {
|
|
816
|
-
if (!own_probe.has(process.pid)) own_probe.set(process.pid, resolve_own_start());
|
|
817
|
-
return own_probe.get(process.pid);
|
|
818
|
-
}
|
|
819
|
-
function own_fields() {
|
|
820
|
-
const start = own_start();
|
|
821
|
-
return { pid: process.pid, ...start !== void 0 && { process_start: start } };
|
|
822
|
-
}
|
|
823
|
-
function is_same_process(pid, recorded_start, read3 = read_start) {
|
|
824
|
-
if (pid === void 0 || !is_live_pid(pid)) return false;
|
|
825
|
-
if (recorded_start === void 0) return void 0;
|
|
826
|
-
return matches_recorded_start(pid, recorded_start, read3);
|
|
827
|
-
}
|
|
828
|
-
function is_present_process(pid, recorded_start, read3 = read_start) {
|
|
829
|
-
if (!is_present_pid(pid)) return false;
|
|
830
|
-
if (recorded_start === void 0) return void 0;
|
|
831
|
-
return matches_recorded_start(pid, recorded_start, read3);
|
|
832
|
-
}
|
|
833
|
-
function is_own_process(pid, recorded_start) {
|
|
834
|
-
return pid === process.pid && recorded_start === own_start();
|
|
835
|
-
}
|
|
836
|
-
var process_identity = {
|
|
837
|
-
close_beacon,
|
|
838
|
-
is_live_beacon,
|
|
839
|
-
is_live_pid,
|
|
840
|
-
is_own_process,
|
|
841
|
-
is_present_pid,
|
|
842
|
-
is_present_process,
|
|
843
|
-
is_same_process,
|
|
844
|
-
open_beacon,
|
|
845
|
-
own_fields,
|
|
846
|
-
own_start,
|
|
847
|
-
read_start,
|
|
848
|
-
resolve_own_start
|
|
849
|
-
};
|
|
850
|
-
|
|
851
|
-
// scripts/backlog/backlog-budget-cli.ts
|
|
852
|
-
import { fileURLToPath } from "node:url";
|
|
853
|
-
|
|
854
|
-
// scripts/git/changed-paths.ts
|
|
855
|
-
function to_paths(raw) {
|
|
856
|
-
return raw.split("\n").map((line) => line.trim()).filter((line) => line !== "");
|
|
857
|
-
}
|
|
858
|
-
async function read_changed_paths(is_staged) {
|
|
859
|
-
if (is_staged) return to_paths(await git_command.diff_cached_names());
|
|
860
|
-
const tracked = to_paths(await git_command.diff_main_names());
|
|
861
|
-
const untracked = to_paths(await git_command.untracked_names());
|
|
862
|
-
return [...tracked, ...untracked];
|
|
863
|
-
}
|
|
864
|
-
var changed_paths = { read_changed_paths, to_paths };
|
|
865
|
-
|
|
866
|
-
// scripts/josh/path-decision.ts
|
|
867
|
-
var STAGED_FLAG = "--staged";
|
|
868
|
-
var JSON_FLAG = "--json";
|
|
869
|
-
var KNOWN_FLAGS = [STAGED_FLAG, JSON_FLAG];
|
|
870
|
-
var FAILURE_EXIT_CODE = 1;
|
|
871
|
-
var MAX_LISTED_PATHS = 5;
|
|
872
|
-
function has_unknown_flag(argv, known) {
|
|
873
|
-
return argv.some((argument) => !known.includes(argument));
|
|
874
|
-
}
|
|
875
|
-
function parse_options(argv) {
|
|
876
|
-
if (has_unknown_flag(argv, KNOWN_FLAGS)) return void 0;
|
|
877
|
-
return { is_staged: argv.includes(STAGED_FLAG), is_json: argv.includes(JSON_FLAG) };
|
|
878
|
-
}
|
|
879
|
-
function format_path_list(paths) {
|
|
880
|
-
const listed = paths.slice(0, MAX_LISTED_PATHS).join(", ");
|
|
881
|
-
if (paths.length <= MAX_LISTED_PATHS) return listed;
|
|
882
|
-
return `${listed}, +${String(paths.length - MAX_LISTED_PATHS)} more`;
|
|
883
|
-
}
|
|
884
|
-
function print_decision(key, answer, reason, is_json) {
|
|
885
|
-
if (is_json) {
|
|
886
|
-
console.info(JSON.stringify({ [key]: answer, reason }));
|
|
887
|
-
return;
|
|
888
|
-
}
|
|
889
|
-
console.info(answer);
|
|
890
|
-
console.error(reason);
|
|
891
|
-
}
|
|
892
|
-
async function run_path_decision(argv, command) {
|
|
893
|
-
const options = parse_options(argv);
|
|
894
|
-
if (options === void 0) {
|
|
895
|
-
console.error(command.usage);
|
|
896
|
-
return FAILURE_EXIT_CODE;
|
|
897
|
-
}
|
|
898
|
-
const paths = await changed_paths.read_changed_paths(options.is_staged);
|
|
899
|
-
const answer = command.decide(paths);
|
|
900
|
-
print_decision(command.key, answer, command.explain(paths, answer), options.is_json);
|
|
901
|
-
return 0;
|
|
902
|
-
}
|
|
903
|
-
var path_decision = {
|
|
904
|
-
format_path_list,
|
|
905
|
-
has_unknown_flag,
|
|
906
|
-
JSON_FLAG,
|
|
907
|
-
parse_options,
|
|
908
|
-
print_decision,
|
|
909
|
-
run_path_decision
|
|
910
|
-
};
|
|
911
|
-
|
|
912
|
-
// scripts/lib/cli-flags.ts
|
|
913
|
-
import { parseArgs } from "node:util";
|
|
914
|
-
var HELP_FLAGS = /* @__PURE__ */ new Set(["--help", "-h"]);
|
|
915
|
-
function usage_line(known_flags, command) {
|
|
916
|
-
if (known_flags.length === 0) return `Usage: josh ${command}`;
|
|
917
|
-
return `Usage: josh ${command} [${known_flags.join("] [")}]`;
|
|
918
|
-
}
|
|
919
|
-
function refuse_unknown_flags(argv, known_flags, command) {
|
|
920
|
-
const unknown = argv.filter((argument) => !known_flags.includes(argument));
|
|
921
|
-
if (unknown.length === 0) return void 0;
|
|
922
|
-
return `Unknown argument(s): ${unknown.join(" ")}
|
|
923
|
-
${usage_line(known_flags, command)}`;
|
|
924
|
-
}
|
|
925
|
-
function answer_help_or_unknown(argv, known_flags, command) {
|
|
926
|
-
if (argv.some((argument) => HELP_FLAGS.has(argument))) {
|
|
927
|
-
console.info(usage_line(known_flags, command));
|
|
928
|
-
return 0;
|
|
929
|
-
}
|
|
930
|
-
const refusal = refuse_unknown_flags(argv, known_flags, command);
|
|
931
|
-
if (refusal === void 0) return void 0;
|
|
932
|
-
console.error(refusal);
|
|
933
|
-
return 1;
|
|
934
|
-
}
|
|
935
|
-
function parse_or_undefined2(config) {
|
|
936
|
-
try {
|
|
937
|
-
return parseArgs(config);
|
|
938
|
-
} catch {
|
|
939
|
-
return void 0;
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
function values_of(argv, options) {
|
|
943
|
-
return parse_or_undefined2({ args: [...argv], options })?.values;
|
|
944
|
-
}
|
|
945
|
-
function arguments_of(argv, options) {
|
|
946
|
-
return parse_or_undefined2({ args: [...argv], options, allowPositionals: true });
|
|
947
|
-
}
|
|
948
|
-
function string_of(value) {
|
|
949
|
-
return typeof value === "string" ? value : void 0;
|
|
950
|
-
}
|
|
951
|
-
var LONG_FLAG_PREFIX = "--";
|
|
952
|
-
var SHORT_FLAG_PREFIX = "-";
|
|
953
|
-
function option_name(flag) {
|
|
954
|
-
return flag.slice(LONG_FLAG_PREFIX.length);
|
|
955
|
-
}
|
|
956
|
-
function is_unusable_value(value) {
|
|
957
|
-
if (typeof value === "boolean" || value.length === 0) return true;
|
|
958
|
-
return value !== SHORT_FLAG_PREFIX && value.startsWith(SHORT_FLAG_PREFIX);
|
|
959
|
-
}
|
|
960
|
-
function given_values(argv, flag) {
|
|
961
|
-
const name = option_name(flag);
|
|
962
|
-
const given = parse_or_undefined2({
|
|
963
|
-
args: [...argv],
|
|
964
|
-
options: { [name]: { type: "string", multiple: true } },
|
|
965
|
-
strict: false,
|
|
966
|
-
allowPositionals: true
|
|
967
|
-
})?.values[name];
|
|
968
|
-
return Array.isArray(given) ? given : [];
|
|
969
|
-
}
|
|
970
|
-
function is_value_unusable(argv, flag) {
|
|
971
|
-
return given_values(argv, flag).some((value) => is_unusable_value(value));
|
|
972
|
-
}
|
|
973
|
-
function attach_one(attached, argument, flags) {
|
|
974
|
-
const previous = attached.at(-1);
|
|
975
|
-
if (previous !== void 0 && flags.includes(previous)) {
|
|
976
|
-
attached[attached.length - 1] = `${previous}=${argument}`;
|
|
977
|
-
} else attached.push(argument);
|
|
978
|
-
}
|
|
979
|
-
function attach_values(argv, flags) {
|
|
980
|
-
const attached = [];
|
|
981
|
-
for (const argument of argv) attach_one(attached, argument, flags);
|
|
982
|
-
return attached;
|
|
983
|
-
}
|
|
984
|
-
var cli_flags = {
|
|
985
|
-
attach_values,
|
|
986
|
-
usage_line,
|
|
987
|
-
refuse_unknown_flags,
|
|
988
|
-
answer_help_or_unknown,
|
|
989
|
-
parse_or_undefined: parse_or_undefined2,
|
|
990
|
-
values_of,
|
|
991
|
-
arguments_of,
|
|
992
|
-
string_of,
|
|
993
|
-
option_name,
|
|
994
|
-
given_values,
|
|
995
|
-
is_value_unusable
|
|
996
|
-
};
|
|
997
|
-
|
|
998
|
-
// scripts/backlog/backlog-budget.ts
|
|
999
|
-
var MS_PER_MINUTE = 6e4;
|
|
1000
|
-
var MINUTES_PER_HOUR = 60;
|
|
1001
|
-
var IDLE_WAIT_HOURS = 8;
|
|
1002
|
-
var DEFAULT_IDLE_MINUTES = IDLE_WAIT_HOURS * MINUTES_PER_HOUR;
|
|
1003
|
-
var DEFAULT_IDLE_MS = DEFAULT_IDLE_MINUTES * MS_PER_MINUTE;
|
|
1004
|
-
var OFFER_INTERVAL_SECONDS = 60;
|
|
1005
|
-
var MS_PER_SECOND3 = 1e3;
|
|
1006
|
-
var OFFER_INTERVAL_MS = OFFER_INTERVAL_SECONDS * MS_PER_SECOND3;
|
|
1007
|
-
var RUN_VERDICT = "run";
|
|
1008
|
-
var WATCH_VERDICT = "watch";
|
|
1009
|
-
var STOP_VERDICT = "stop";
|
|
1010
|
-
var TRIAGE_VERDICT = "triage";
|
|
1011
|
-
var ANSWERS = ["blocked", "candidates", "exhausted", "parked", "unreadable", "untriaged"];
|
|
1012
|
-
var BLOCKED_REASON = "Everything opted in is blocked or already running, so waiting can still change the answer. Ask again at the re-ask floor (60 s).";
|
|
1013
|
-
var TRIAGE_REASON = "An opted-in candidate carries neither `run:solo` nor `run:lane`, so nothing starts until it is judged. Read each issue named above, record its order and one of the two labels with a comment, then ask again.";
|
|
1014
|
-
var EMPTY_BACKLOG = "The backlog is empty";
|
|
1015
|
-
var WAITING_ON = {
|
|
1016
|
-
exhausted: EMPTY_BACKLOG,
|
|
1017
|
-
parked: "Nothing opted in can proceed without a person",
|
|
1018
|
-
unreadable: "The backlog listing could not be read"
|
|
1019
|
-
};
|
|
1020
|
-
function waiting_on(answer) {
|
|
1021
|
-
return WAITING_ON[answer] ?? EMPTY_BACKLOG;
|
|
1022
|
-
}
|
|
1023
|
-
function no_idle_watch_reason(answer) {
|
|
1024
|
-
return `${waiting_on(answer)} and the idle watch was turned off with \`--idle 0\`, so the run finishes here.`;
|
|
1025
|
-
}
|
|
1026
|
-
function to_minutes(duration_ms) {
|
|
1027
|
-
return String(Math.ceil(duration_ms / MS_PER_MINUTE));
|
|
1028
|
-
}
|
|
1029
|
-
function max_reached_reason(merged, max_issues) {
|
|
1030
|
-
return `This run's maximum of ${String(max_issues)} is reached, with ${String(merged)} merged. Report what was done, including how many were picked up during an idle watch, and finish.`;
|
|
1031
|
-
}
|
|
1032
|
-
function draining_reason(running, reason) {
|
|
1033
|
-
return `Start nothing more and wait on \`pnpm josh lane:await\` until the running children merge (running: ${String(running)}). Then report and finish \u2014 ${reason}`;
|
|
1034
|
-
}
|
|
1035
|
-
function idle_expired_reason(answer, idle_budget_ms) {
|
|
1036
|
-
return `${waiting_on(answer)}, and stayed so for the whole ${to_minutes(idle_budget_ms)}-minute idle watch. Report what was done, including how many were picked up during the watch, and finish.`;
|
|
1037
|
-
}
|
|
1038
|
-
function idle_watch_reason(answer, left_ms) {
|
|
1039
|
-
return `${waiting_on(answer)} and the idle watch has about ${to_minutes(left_ms)} minutes left. Release the working tree, ask again in ${String(OFFER_INTERVAL_SECONDS)} seconds, and restart the watch the moment a candidate appears.`;
|
|
1040
|
-
}
|
|
1041
|
-
function running_watch_reason(answer, running, left_ms) {
|
|
1042
|
-
return `${waiting_on(answer)} and the idle watch has about ${to_minutes(left_ms)} minutes left, with ${String(running)} still running. Keep the working tree and wait on \`pnpm josh lane:await\` until they merge \u2014 the watch is running down meanwhile.`;
|
|
1043
|
-
}
|
|
1044
|
-
function watching_reason(input, left_ms) {
|
|
1045
|
-
if (input.running === 0) return idle_watch_reason(input.answer, left_ms);
|
|
1046
|
-
return running_watch_reason(input.answer, input.running, left_ms);
|
|
1047
|
-
}
|
|
1048
|
-
function taken_by(input) {
|
|
1049
|
-
return input.merged + input.running;
|
|
1050
|
-
}
|
|
1051
|
-
function run_reason(input) {
|
|
1052
|
-
const { max_issues } = input;
|
|
1053
|
-
if (max_issues === void 0) return "No maximum was given, so start every issue offered.";
|
|
1054
|
-
return `Start at most ${String(max_issues - taken_by(input))} more: this run's maximum is ${String(max_issues)}, with ${String(input.merged)} merged and ${String(input.running)} running.`;
|
|
1055
|
-
}
|
|
1056
|
-
function stopping(input, reason) {
|
|
1057
|
-
if (input.running === 0) return { verdict: STOP_VERDICT, reason };
|
|
1058
|
-
return { verdict: WATCH_VERDICT, reason: draining_reason(input.running, reason) };
|
|
1059
|
-
}
|
|
1060
|
-
function max_decision(input) {
|
|
1061
|
-
const { max_issues } = input;
|
|
1062
|
-
if (max_issues === void 0 || taken_by(input) < max_issues) return void 0;
|
|
1063
|
-
return stopping(input, max_reached_reason(input.merged, max_issues));
|
|
1064
|
-
}
|
|
1065
|
-
function idle_decision(input) {
|
|
1066
|
-
const { idle_budget_ms } = input;
|
|
1067
|
-
if (idle_budget_ms === void 0) return stopping(input, no_idle_watch_reason(input.answer));
|
|
1068
|
-
const left_ms = idle_budget_ms - (input.now_ms - input.active_at_ms);
|
|
1069
|
-
if (left_ms > 0) return { verdict: WATCH_VERDICT, reason: watching_reason(input, left_ms) };
|
|
1070
|
-
return stopping(input, idle_expired_reason(input.answer, idle_budget_ms));
|
|
1071
|
-
}
|
|
1072
|
-
function is_finish(input) {
|
|
1073
|
-
return input.answer === "exhausted" && max_decision(input) === void 0;
|
|
1074
|
-
}
|
|
1075
|
-
var FIXED_DECISIONS = {
|
|
1076
|
-
blocked: { verdict: WATCH_VERDICT, reason: BLOCKED_REASON },
|
|
1077
|
-
untriaged: { verdict: TRIAGE_VERDICT, reason: TRIAGE_REASON }
|
|
1078
|
-
};
|
|
1079
|
-
function answer_decision(input) {
|
|
1080
|
-
if (input.answer === "candidates") return { verdict: RUN_VERDICT, reason: run_reason(input) };
|
|
1081
|
-
return FIXED_DECISIONS[input.answer] ?? idle_decision(input);
|
|
1082
|
-
}
|
|
1083
|
-
function decide(input) {
|
|
1084
|
-
return max_decision(input) ?? answer_decision(input);
|
|
1085
|
-
}
|
|
1086
|
-
var backlog_budget = {
|
|
1087
|
-
ANSWERS,
|
|
1088
|
-
BLOCKED_REASON,
|
|
1089
|
-
DEFAULT_IDLE_MINUTES,
|
|
1090
|
-
DEFAULT_IDLE_MS,
|
|
1091
|
-
IDLE_WAIT_HOURS,
|
|
1092
|
-
MS_PER_MINUTE,
|
|
1093
|
-
OFFER_INTERVAL_MS,
|
|
1094
|
-
RUN_VERDICT,
|
|
1095
|
-
STOP_VERDICT,
|
|
1096
|
-
TRIAGE_REASON,
|
|
1097
|
-
TRIAGE_VERDICT,
|
|
1098
|
-
WAITING_ON,
|
|
1099
|
-
WATCH_VERDICT,
|
|
1100
|
-
decide,
|
|
1101
|
-
draining_reason,
|
|
1102
|
-
idle_expired_reason,
|
|
1103
|
-
idle_watch_reason,
|
|
1104
|
-
is_finish,
|
|
1105
|
-
max_reached_reason,
|
|
1106
|
-
no_idle_watch_reason,
|
|
1107
|
-
run_reason,
|
|
1108
|
-
running_watch_reason,
|
|
1109
|
-
taken_by
|
|
1110
|
-
};
|
|
1111
|
-
|
|
1112
|
-
// scripts/backlog/backlog-budget-cli.ts
|
|
1113
|
-
var ARGV_OFFSET = 2;
|
|
1114
|
-
var SUCCESS_EXIT_CODE2 = 0;
|
|
1115
|
-
var FAILURE_EXIT_CODE2 = 1;
|
|
1116
|
-
var JSON_KEY = "budget";
|
|
1117
|
-
var USAGE = `Usage: josh backlog:budget --answer <${backlog_budget.ANSWERS.join("|")}> --started <ISO-8601> [--active <ISO-8601>, required unless the watch is off] [--merged <count>] [--running <count>] [--max <count>] [--idle <minutes>, 0 to turn the watch off] [--json]`;
|
|
1118
|
-
var OPTIONS = {
|
|
1119
|
-
active: { type: "string" },
|
|
1120
|
-
answer: { type: "string" },
|
|
1121
|
-
idle: { type: "string" },
|
|
1122
|
-
json: { type: "boolean" },
|
|
1123
|
-
max: { type: "string" },
|
|
1124
|
-
merged: { type: "string" },
|
|
1125
|
-
running: { type: "string" },
|
|
1126
|
-
started: { type: "string" }
|
|
1127
|
-
};
|
|
1128
|
-
function read_arguments(argv) {
|
|
1129
|
-
return cli_flags.values_of(argv, OPTIONS);
|
|
1130
|
-
}
|
|
1131
|
-
function to_answer(raw) {
|
|
1132
|
-
return backlog_budget.ANSWERS.find((answer) => answer === raw);
|
|
1133
|
-
}
|
|
1134
|
-
function to_time_ms(raw) {
|
|
1135
|
-
if (raw === void 0) return void 0;
|
|
1136
|
-
const parsed = Date.parse(raw);
|
|
1137
|
-
return Number.isNaN(parsed) ? void 0 : parsed;
|
|
1138
|
-
}
|
|
1139
|
-
var COUNT_PATTERN = /^\d+$/u;
|
|
1140
|
-
function to_count(raw) {
|
|
1141
|
-
if (raw === void 0 || !COUNT_PATTERN.test(raw)) return void 0;
|
|
1142
|
-
const parsed = Number(raw);
|
|
1143
|
-
return Number.isSafeInteger(parsed) ? parsed : void 0;
|
|
1144
|
-
}
|
|
1145
|
-
function is_readable(raw, parsed) {
|
|
1146
|
-
return raw === void 0 || parsed !== void 0;
|
|
1147
|
-
}
|
|
1148
|
-
var COUNT_NAMES = ["idle", "max", "merged", "running"];
|
|
1149
|
-
function counts_of(values) {
|
|
1150
|
-
return {
|
|
1151
|
-
idle: to_count(cli_flags.string_of(values.idle)),
|
|
1152
|
-
max: to_count(cli_flags.string_of(values.max)),
|
|
1153
|
-
merged: to_count(cli_flags.string_of(values.merged)),
|
|
1154
|
-
running: to_count(cli_flags.string_of(values.running))
|
|
1155
|
-
};
|
|
1156
|
-
}
|
|
1157
|
-
function are_counts_readable(values, counts) {
|
|
1158
|
-
return COUNT_NAMES.every((name) => is_readable(cli_flags.string_of(values[name]), counts[name]));
|
|
1159
|
-
}
|
|
1160
|
-
var NO_IDLE_MINUTES = 0;
|
|
1161
|
-
function to_idle_ms(idle_minutes) {
|
|
1162
|
-
if (idle_minutes === void 0) return backlog_budget.DEFAULT_IDLE_MS;
|
|
1163
|
-
if (idle_minutes === NO_IDLE_MINUTES) return void 0;
|
|
1164
|
-
return idle_minutes * backlog_budget.MS_PER_MINUTE;
|
|
1165
|
-
}
|
|
1166
|
-
function is_watch_readable(values) {
|
|
1167
|
-
if (to_idle_ms(to_count(cli_flags.string_of(values.idle))) === void 0) return true;
|
|
1168
|
-
return cli_flags.string_of(values.active) !== void 0;
|
|
1169
|
-
}
|
|
1170
|
-
function are_values_readable(values) {
|
|
1171
|
-
return is_readable(
|
|
1172
|
-
cli_flags.string_of(values.active),
|
|
1173
|
-
to_time_ms(cli_flags.string_of(values.active))
|
|
1174
|
-
) && is_watch_readable(values) && are_counts_readable(values, counts_of(values));
|
|
1175
|
-
}
|
|
1176
|
-
function input_of(values, base) {
|
|
1177
|
-
const counts = counts_of(values);
|
|
1178
|
-
return {
|
|
1179
|
-
...base,
|
|
1180
|
-
active_at_ms: to_time_ms(cli_flags.string_of(values.active)) ?? base.started_at_ms,
|
|
1181
|
-
merged: counts.merged ?? 0,
|
|
1182
|
-
running: counts.running ?? 0,
|
|
1183
|
-
max_issues: counts.max,
|
|
1184
|
-
idle_budget_ms: to_idle_ms(counts.idle)
|
|
1185
|
-
};
|
|
1186
|
-
}
|
|
1187
|
-
function build_input(values, now_ms) {
|
|
1188
|
-
const answer = to_answer(cli_flags.string_of(values.answer));
|
|
1189
|
-
if (answer === void 0) return void 0;
|
|
1190
|
-
const started_at_ms = to_time_ms(cli_flags.string_of(values.started));
|
|
1191
|
-
if (started_at_ms === void 0 || !are_values_readable(values)) return void 0;
|
|
1192
|
-
return input_of(values, { answer, now_ms, started_at_ms });
|
|
1193
|
-
}
|
|
1194
|
-
function print_json(input, decision) {
|
|
1195
|
-
const { verdict, reason } = decision;
|
|
1196
|
-
const is_finish2 = backlog_budget.is_finish(input);
|
|
1197
|
-
console.info(JSON.stringify({ [JSON_KEY]: verdict, reason, is_finish: is_finish2 }));
|
|
1198
|
-
}
|
|
1199
|
-
function refuse() {
|
|
1200
|
-
console.error(USAGE);
|
|
1201
|
-
return FAILURE_EXIT_CODE2;
|
|
1202
|
-
}
|
|
1203
|
-
function run3(argv, now_ms = Date.now()) {
|
|
1204
|
-
const values = read_arguments(argv);
|
|
1205
|
-
if (values === void 0) return refuse();
|
|
1206
|
-
const input = build_input(values, now_ms);
|
|
1207
|
-
if (input === void 0) return refuse();
|
|
1208
|
-
const decision = backlog_budget.decide(input);
|
|
1209
|
-
if (values.json === true) {
|
|
1210
|
-
print_json(input, decision);
|
|
1211
|
-
return SUCCESS_EXIT_CODE2;
|
|
1212
|
-
}
|
|
1213
|
-
path_decision.print_decision(JSON_KEY, decision.verdict, decision.reason, false);
|
|
1214
|
-
return SUCCESS_EXIT_CODE2;
|
|
1215
|
-
}
|
|
1216
|
-
function main(argv) {
|
|
1217
|
-
process.exitCode = run3(argv);
|
|
1218
|
-
}
|
|
1219
|
-
var backlog_budget_cli = {
|
|
1220
|
-
JSON_KEY,
|
|
1221
|
-
OPTIONS,
|
|
1222
|
-
SUCCESS_EXIT_CODE: SUCCESS_EXIT_CODE2,
|
|
1223
|
-
USAGE,
|
|
1224
|
-
build_input,
|
|
1225
|
-
main,
|
|
1226
|
-
read_arguments,
|
|
1227
|
-
run: run3,
|
|
1228
|
-
to_answer,
|
|
1229
|
-
to_count,
|
|
1230
|
-
to_time_ms
|
|
1231
|
-
};
|
|
1232
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET));
|
|
1233
|
-
|
|
1234
|
-
// scripts/issue/issue-number-shape.ts
|
|
1235
|
-
var ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u;
|
|
1236
|
-
var BAD_ISSUE_MESSAGE = "Not an issue number: ";
|
|
1237
|
-
function is_issue_number(value) {
|
|
1238
|
-
return ISSUE_NUMBER_PATTERN.test(value);
|
|
1239
|
-
}
|
|
1240
|
-
function require_issue_number(issue) {
|
|
1241
|
-
if (!is_issue_number(issue)) throw new Error(`${BAD_ISSUE_MESSAGE}${issue}`);
|
|
1242
|
-
}
|
|
1243
|
-
var issue_number_shape = { ISSUE_NUMBER_PATTERN, is_issue_number, require_issue_number };
|
|
1244
|
-
|
|
1245
|
-
// scripts/run/run-invocation.ts
|
|
1246
|
-
var BACKLOG_COMMAND = "backlogrun";
|
|
1247
|
-
var KNOWN_FLAGS2 = ["--max", "--idle"];
|
|
1248
|
-
var ONLY_FLAG = "--only";
|
|
1249
|
-
var OPTIONS2 = {
|
|
1250
|
-
max: { type: "string" },
|
|
1251
|
-
idle: { type: "string" },
|
|
1252
|
-
only: { type: "boolean" }
|
|
1253
|
-
};
|
|
1254
|
-
var ISSUE_PREFIX = "#";
|
|
1255
|
-
var FLAG_PREFIX = "-";
|
|
1256
|
-
var TOKEN_SEPARATOR = " ";
|
|
1257
|
-
var FIRST_TOKEN = 0;
|
|
1258
|
-
var FIRST_ARGUMENT_INDEX = 1;
|
|
1259
|
-
var EMPTY_LENGTH = 0;
|
|
1260
|
-
var NOT_FOUND = -1;
|
|
1261
|
-
function tokens_of(invocation) {
|
|
1262
|
-
return invocation.split(TOKEN_SEPARATOR).filter((token) => token.length > EMPTY_LENGTH);
|
|
1263
|
-
}
|
|
1264
|
-
function render_option(token) {
|
|
1265
|
-
if (token.name === cli_flags.option_name(ONLY_FLAG)) return ONLY_FLAG;
|
|
1266
|
-
const flag = KNOWN_FLAGS2.find((known) => cli_flags.option_name(known) === token.name);
|
|
1267
|
-
const value = backlog_budget_cli.to_count(token.value);
|
|
1268
|
-
if (flag === void 0 || value === void 0) return void 0;
|
|
1269
|
-
return `${flag} ${String(value)}`;
|
|
1270
|
-
}
|
|
1271
|
-
function rendered_options(tokens) {
|
|
1272
|
-
const rendered = [];
|
|
1273
|
-
for (const token of tokens) {
|
|
1274
|
-
const part = render_option(token);
|
|
1275
|
-
if (part === void 0) return void 0;
|
|
1276
|
-
rendered.push(part);
|
|
1277
|
-
}
|
|
1278
|
-
return rendered;
|
|
1279
|
-
}
|
|
1280
|
-
function issue_of(token) {
|
|
1281
|
-
if (!token.startsWith(ISSUE_PREFIX)) return void 0;
|
|
1282
|
-
const digits = token.slice(ISSUE_PREFIX.length);
|
|
1283
|
-
if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(digits)) return void 0;
|
|
1284
|
-
const issue = Number(digits);
|
|
1285
|
-
return Number.isSafeInteger(issue) ? issue : void 0;
|
|
1286
|
-
}
|
|
1287
|
-
function issues_of(tokens) {
|
|
1288
|
-
const issues = [];
|
|
1289
|
-
for (const token of tokens) {
|
|
1290
|
-
const issue = issue_of(token.value ?? "");
|
|
1291
|
-
if (issue === void 0) return void 0;
|
|
1292
|
-
issues.push(issue);
|
|
1293
|
-
}
|
|
1294
|
-
return issues;
|
|
1295
|
-
}
|
|
1296
|
-
function argument_tokens(invocation) {
|
|
1297
|
-
const tokens = tokens_of(invocation);
|
|
1298
|
-
if (tokens[FIRST_TOKEN] !== BACKLOG_COMMAND) return void 0;
|
|
1299
|
-
return cli_flags.parse_or_undefined({
|
|
1300
|
-
args: tokens.slice(FIRST_ARGUMENT_INDEX),
|
|
1301
|
-
options: OPTIONS2,
|
|
1302
|
-
allowPositionals: true,
|
|
1303
|
-
tokens: true
|
|
1304
|
-
})?.tokens;
|
|
1305
|
-
}
|
|
1306
|
-
function parse(invocation) {
|
|
1307
|
-
const tokens = argument_tokens(invocation);
|
|
1308
|
-
if (tokens === void 0) return void 0;
|
|
1309
|
-
const stop = tokens.findIndex((token) => token.kind !== "positional");
|
|
1310
|
-
const split_at = stop === NOT_FOUND ? tokens.length : stop;
|
|
1311
|
-
const issues = issues_of(tokens.slice(FIRST_TOKEN, split_at));
|
|
1312
|
-
const flags = rendered_options(tokens.slice(split_at));
|
|
1313
|
-
if (issues === void 0 || flags === void 0) return void 0;
|
|
1314
|
-
return { issues, flags };
|
|
1315
|
-
}
|
|
1316
|
-
function issue_token(issue) {
|
|
1317
|
-
return `${ISSUE_PREFIX}${String(issue)}`;
|
|
1318
|
-
}
|
|
1319
|
-
function joined(command, rendered) {
|
|
1320
|
-
return [command, ...rendered].join(TOKEN_SEPARATOR);
|
|
1321
|
-
}
|
|
1322
|
-
function rebuild(invocation) {
|
|
1323
|
-
const parsed = parse(invocation);
|
|
1324
|
-
if (parsed === void 0) return void 0;
|
|
1325
|
-
return joined(BACKLOG_COMMAND, [
|
|
1326
|
-
...parsed.issues.map((issue) => issue_token(issue)),
|
|
1327
|
-
...parsed.flags
|
|
1328
|
-
]);
|
|
1329
|
-
}
|
|
1330
|
-
function issue_numbers(invocation) {
|
|
1331
|
-
const tokens = tokens_of(invocation);
|
|
1332
|
-
const stop = tokens.findIndex((token) => token.startsWith(FLAG_PREFIX));
|
|
1333
|
-
const leading = stop === NOT_FOUND ? tokens : tokens.slice(FIRST_TOKEN, stop);
|
|
1334
|
-
const issues = parse(leading.join(TOKEN_SEPARATOR))?.issues;
|
|
1335
|
-
if (issues === void 0 || issues.length === EMPTY_LENGTH) return void 0;
|
|
1336
|
-
return issues;
|
|
1337
|
-
}
|
|
1338
|
-
function has_only(invocation) {
|
|
1339
|
-
return parse(invocation)?.flags.includes(ONLY_FLAG) === true;
|
|
1340
|
-
}
|
|
1341
|
-
var run_invocation = {
|
|
1342
|
-
has_only,
|
|
1343
|
-
issue_numbers,
|
|
1344
|
-
rebuild
|
|
1345
|
-
};
|
|
1346
|
-
|
|
1347
|
-
// scripts/run/carry/run-carry.ts
|
|
1348
|
-
import { z as z2 } from "zod";
|
|
1349
|
-
|
|
1350
|
-
// scripts/run/carry/run-carry-added.ts
|
|
1351
|
-
function issues_of2(added, is_priority) {
|
|
1352
|
-
return added.filter((entry) => entry.is_priority === is_priority).map((entry) => entry.issue);
|
|
1353
|
-
}
|
|
1354
|
-
function ordered(declared, added = []) {
|
|
1355
|
-
const sequence = [...issues_of2(added, true), ...declared, ...issues_of2(added, false)];
|
|
1356
|
-
return sequence.filter((issue, index) => sequence.indexOf(issue) === index);
|
|
1357
|
-
}
|
|
1358
|
-
function next_added(carry, additions) {
|
|
1359
|
-
const next = [...carry.added ?? []];
|
|
1360
|
-
for (const addition of additions) {
|
|
1361
|
-
if (next.every((entry) => entry.issue !== addition.issue)) next.push(addition);
|
|
1362
|
-
}
|
|
1363
|
-
return next;
|
|
1364
|
-
}
|
|
1365
|
-
function add_issues(target, carry, additions) {
|
|
1366
|
-
const next = { ...carry, added: next_added(carry, additions) };
|
|
1367
|
-
stamp_file.replace_stamp(target, next);
|
|
1368
|
-
return next;
|
|
1369
|
-
}
|
|
1370
|
-
var run_carry_added = { add_issues, ordered };
|
|
1371
|
-
|
|
1372
|
-
// scripts/run/carry/run-carry-streak.ts
|
|
1373
|
-
var NO_INCREMENT = 0;
|
|
1374
|
-
var OUTAGE_FOLD_WINDOW_MS = 12e4;
|
|
1375
|
-
function has_increment(value) {
|
|
1376
|
-
return (value ?? NO_INCREMENT) > NO_INCREMENT;
|
|
1377
|
-
}
|
|
1378
|
-
function next_failures(carry, change) {
|
|
1379
|
-
if (has_increment(change.merged)) return NO_INCREMENT;
|
|
1380
|
-
return carry.failures + (change.failures ?? NO_INCREMENT);
|
|
1381
|
-
}
|
|
1382
|
-
function is_within_fold_window(last_outage_at, now) {
|
|
1383
|
-
if (last_outage_at === void 0) return false;
|
|
1384
|
-
const last = Date.parse(last_outage_at);
|
|
1385
|
-
if (Number.isNaN(last)) return false;
|
|
1386
|
-
return now.getTime() - last <= OUTAGE_FOLD_WINDOW_MS;
|
|
1387
|
-
}
|
|
1388
|
-
function folded_outage(carry) {
|
|
1389
|
-
return { outages: carry.outages, last_outage_at: carry.last_outage_at };
|
|
1390
|
-
}
|
|
1391
|
-
function counted_outage(carry, change, now) {
|
|
1392
|
-
const outages = carry.outages + (change.outages ?? NO_INCREMENT);
|
|
1393
|
-
return { outages, last_outage_at: now.toISOString() };
|
|
1394
|
-
}
|
|
1395
|
-
function next_outage(carry, change, now) {
|
|
1396
|
-
if (has_increment(change.outages)) {
|
|
1397
|
-
return is_within_fold_window(carry.last_outage_at, now) ? folded_outage(carry) : counted_outage(carry, change, now);
|
|
1398
|
-
}
|
|
1399
|
-
const is_reachable = has_increment(change.merged) || has_increment(change.failures);
|
|
1400
|
-
return is_reachable ? { outages: NO_INCREMENT, last_outage_at: void 0 } : folded_outage(carry);
|
|
1401
|
-
}
|
|
1402
|
-
function next_state(carry, change, now) {
|
|
1403
|
-
const outage = next_outage(carry, change, now);
|
|
1404
|
-
return {
|
|
1405
|
-
failures: next_failures(carry, change),
|
|
1406
|
-
outages: outage.outages,
|
|
1407
|
-
last_outage_at: outage.last_outage_at
|
|
1408
|
-
};
|
|
1409
|
-
}
|
|
1410
|
-
var run_carry_streak = { next_state };
|
|
1411
|
-
|
|
1412
|
-
// scripts/run/carry/run-carry-change.ts
|
|
1413
|
-
var NO_INCREMENT2 = 0;
|
|
1414
|
-
function next_done(carry, done) {
|
|
1415
|
-
if (done === void 0) return carry.done;
|
|
1416
|
-
const current = carry.done ?? [];
|
|
1417
|
-
return current.includes(done) ? current : [...current, done];
|
|
1418
|
-
}
|
|
1419
|
-
function next_merged_issues(carry, issue) {
|
|
1420
|
-
if (issue === void 0) return carry.merged_issues;
|
|
1421
|
-
const current = carry.merged_issues ?? [];
|
|
1422
|
-
return current.includes(issue) ? current : [...current, issue];
|
|
1423
|
-
}
|
|
1424
|
-
function is_duplicate_merge(carry, change) {
|
|
1425
|
-
const issue = change.merged_issue;
|
|
1426
|
-
return issue !== void 0 && carry.merged_issues?.includes(issue) === true;
|
|
1427
|
-
}
|
|
1428
|
-
function has_other_change(change) {
|
|
1429
|
-
const amounts = [change.filed, change.cuts, change.failures, change.outages];
|
|
1430
|
-
const has_amount = amounts.some((amount) => (amount ?? NO_INCREMENT2) > NO_INCREMENT2);
|
|
1431
|
-
return has_amount || change.done !== void 0 || change.retrospective === true;
|
|
1432
|
-
}
|
|
1433
|
-
function effective_change(carry, change) {
|
|
1434
|
-
if (!is_duplicate_merge(carry, change)) return change;
|
|
1435
|
-
return has_other_change(change) ? { ...change, merged: NO_INCREMENT2 } : void 0;
|
|
1436
|
-
}
|
|
1437
|
-
function next_counts(carry, change) {
|
|
1438
|
-
const cuts = change.cuts ?? NO_INCREMENT2;
|
|
1439
|
-
return {
|
|
1440
|
-
merged: carry.merged + (change.merged ?? NO_INCREMENT2),
|
|
1441
|
-
filed: carry.filed + (change.filed ?? NO_INCREMENT2),
|
|
1442
|
-
cuts: carry.cuts + cuts,
|
|
1443
|
-
is_handed_off: cuts > NO_INCREMENT2
|
|
1444
|
-
};
|
|
1445
|
-
}
|
|
1446
|
-
function apply_change(target, carry, change, now = /* @__PURE__ */ new Date()) {
|
|
1447
|
-
const effective = effective_change(carry, change);
|
|
1448
|
-
if (effective === void 0) return carry;
|
|
1449
|
-
const streak = run_carry_streak.next_state(carry, effective, now);
|
|
1450
|
-
const next = {
|
|
1451
|
-
...carry,
|
|
1452
|
-
...next_counts(carry, effective),
|
|
1453
|
-
merged_issues: next_merged_issues(carry, effective.merged_issue),
|
|
1454
|
-
failures: streak.failures,
|
|
1455
|
-
outages: streak.outages,
|
|
1456
|
-
last_outage_at: streak.last_outage_at,
|
|
1457
|
-
done: next_done(carry, effective.done),
|
|
1458
|
-
retrospective: effective.retrospective === true || carry.retrospective
|
|
1459
|
-
};
|
|
1460
|
-
stamp_file.replace_stamp(target, next);
|
|
1461
|
-
return next;
|
|
1462
|
-
}
|
|
1463
|
-
var run_carry_change = { apply_change };
|
|
1464
|
-
|
|
1465
|
-
// scripts/run/carry/run-carry-conversation.ts
|
|
1466
|
-
import { existsSync, statSync as statSync2 } from "node:fs";
|
|
1467
|
-
import path5 from "node:path";
|
|
1468
|
-
|
|
1469
|
-
// scripts/cost-runtime/cost-transcript.ts
|
|
1470
|
-
import { readdirSync, readFileSync as readFileSync3, statSync } from "node:fs";
|
|
1471
|
-
import { homedir } from "node:os";
|
|
1472
|
-
import path4 from "node:path";
|
|
1473
|
-
|
|
1474
|
-
// scripts/lane/lane-paths.ts
|
|
1475
|
-
import path3 from "node:path";
|
|
1476
|
-
var LANE_ROOT_KEY = "JOSH_LANE_ROOT";
|
|
1477
|
-
var LANE_DIRECTORY_SUFFIX = "-lanes";
|
|
1478
|
-
var LANE_BRANCH_SUFFIX = "-lane";
|
|
1479
|
-
function default_lane_root(repository_root2) {
|
|
1480
|
-
const name = path3.basename(repository_root2);
|
|
1481
|
-
return path3.join(path3.dirname(repository_root2), `.${name}${LANE_DIRECTORY_SUFFIX}`);
|
|
1482
|
-
}
|
|
1483
|
-
function lane_root(repository_root2, environment = process.env) {
|
|
1484
|
-
const configured = environment[LANE_ROOT_KEY]?.trim() ?? "";
|
|
1485
|
-
return configured.length === 0 ? default_lane_root(repository_root2) : path3.resolve(configured);
|
|
1486
|
-
}
|
|
1487
|
-
function lane_directory(root, issue) {
|
|
1488
|
-
return path3.join(root, issue);
|
|
1489
|
-
}
|
|
1490
|
-
var DEFAULT_LANE_ROOT_PATTERN = new RegExp(String.raw`^\..+${LANE_DIRECTORY_SUFFIX}$`, "u");
|
|
1491
|
-
function is_lane_root(directory, environment) {
|
|
1492
|
-
const configured = environment[LANE_ROOT_KEY]?.trim() ?? "";
|
|
1493
|
-
if (configured.length > 0) return path3.resolve(configured) === directory;
|
|
1494
|
-
return DEFAULT_LANE_ROOT_PATTERN.test(path3.basename(directory));
|
|
1495
|
-
}
|
|
1496
|
-
function lane_issue_of(directory, environment = process.env) {
|
|
1497
|
-
const resolved = path3.resolve(directory);
|
|
1498
|
-
const issue = path3.basename(resolved);
|
|
1499
|
-
if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)) return void 0;
|
|
1500
|
-
return is_lane_root(path3.dirname(resolved), environment) ? issue : void 0;
|
|
1501
|
-
}
|
|
1502
|
-
function lane_branch(issue) {
|
|
1503
|
-
return `${issue}${LANE_BRANCH_SUFFIX}`;
|
|
1504
|
-
}
|
|
1505
|
-
var SEAT_LOCK_DIR = ".seat-locks";
|
|
1506
|
-
function is_lane_entry(name) {
|
|
1507
|
-
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(name) || DEFAULT_LANE_ROOT_PATTERN.test(name);
|
|
1508
|
-
}
|
|
1509
|
-
var lane_paths = {
|
|
1510
|
-
LANE_BRANCH_SUFFIX,
|
|
1511
|
-
LANE_ROOT_KEY,
|
|
1512
|
-
SEAT_LOCK_DIR,
|
|
1513
|
-
default_lane_root,
|
|
1514
|
-
is_lane_entry,
|
|
1515
|
-
lane_branch,
|
|
1516
|
-
lane_directory,
|
|
1517
|
-
lane_issue_of,
|
|
1518
|
-
lane_root
|
|
1519
|
-
};
|
|
1520
|
-
|
|
1521
|
-
// scripts/lib/read-file.ts
|
|
1522
|
-
import { readFileSync as readFileSync2 } from "node:fs";
|
|
1523
|
-
var ABSENT_CODE = "ENOENT";
|
|
1524
|
-
function is_absent(error) {
|
|
1525
|
-
return error instanceof Error && "code" in error && error.code === ABSENT_CODE;
|
|
1526
|
-
}
|
|
1527
|
-
function read_optional(path7) {
|
|
1528
|
-
try {
|
|
1529
|
-
return readFileSync2(path7, "utf8");
|
|
1530
|
-
} catch (error) {
|
|
1531
|
-
if (is_absent(error)) return void 0;
|
|
1532
|
-
throw error;
|
|
1533
|
-
}
|
|
1534
|
-
}
|
|
1535
|
-
function read_file_or_empty(path7) {
|
|
1536
|
-
return read_optional(path7) ?? "";
|
|
1537
|
-
}
|
|
1538
|
-
function read_if_readable(path7) {
|
|
1539
|
-
try {
|
|
1540
|
-
return readFileSync2(path7, "utf8");
|
|
1541
|
-
} catch {
|
|
1542
|
-
return void 0;
|
|
1543
|
-
}
|
|
1544
|
-
}
|
|
1545
|
-
var file_reader = { read_optional, read_file_or_empty, read_if_readable };
|
|
1546
|
-
|
|
1547
|
-
// scripts/time-runtime/time-instant.ts
|
|
1548
|
-
function parse_instant(raw) {
|
|
1549
|
-
if (raw === null || raw === void 0) return void 0;
|
|
1550
|
-
const parsed = Date.parse(raw);
|
|
1551
|
-
return Number.isNaN(parsed) ? void 0 : parsed;
|
|
1552
|
-
}
|
|
1553
|
-
var time_instant = { parse_instant };
|
|
1554
|
-
|
|
1555
|
-
// scripts/cost-runtime/cost-usage.ts
|
|
1556
|
-
import { z } from "zod";
|
|
1557
|
-
var CACHE_CREATION_SCHEMA = z.object({
|
|
1558
|
-
ephemeral_1h_input_tokens: z.number().nullish(),
|
|
1559
|
-
ephemeral_5m_input_tokens: z.number().nullish()
|
|
1560
|
-
});
|
|
1561
|
-
var USAGE_SCHEMA = z.object({
|
|
1562
|
-
input_tokens: z.number(),
|
|
1563
|
-
cache_creation_input_tokens: z.number().nullish(),
|
|
1564
|
-
cache_read_input_tokens: z.number().nullish(),
|
|
1565
|
-
output_tokens: z.number(),
|
|
1566
|
-
output_tokens_details: z.object({ thinking_tokens: z.number().nullish() }).nullish(),
|
|
1567
|
-
cache_creation: CACHE_CREATION_SCHEMA.nullish()
|
|
1568
|
-
});
|
|
1569
|
-
var MESSAGE_SCHEMA = z.object({
|
|
1570
|
-
id: z.string().nullish(),
|
|
1571
|
-
model: z.string().nullish(),
|
|
1572
|
-
usage: USAGE_SCHEMA.nullish()
|
|
1573
|
-
});
|
|
1574
|
-
var LINE_SCHEMA = z.object({
|
|
1575
|
-
type: z.string(),
|
|
1576
|
-
requestId: z.string().nullish(),
|
|
1577
|
-
uuid: z.string().nullish(),
|
|
1578
|
-
gitBranch: z.string().nullish(),
|
|
1579
|
-
timestamp: z.string().nullish(),
|
|
1580
|
-
message: MESSAGE_SCHEMA.nullish()
|
|
1581
|
-
});
|
|
1582
|
-
var SYNTHETIC_MODEL = "<synthetic>";
|
|
1583
|
-
var EMPTY_TOTALS = {
|
|
1584
|
-
input_tokens: 0,
|
|
1585
|
-
cache_write_5m_tokens: 0,
|
|
1586
|
-
cache_write_1h_tokens: 0,
|
|
1587
|
-
cache_read_tokens: 0,
|
|
1588
|
-
output_tokens: 0,
|
|
1589
|
-
thinking_tokens: 0,
|
|
1590
|
-
thinking_measured: false
|
|
1591
|
-
};
|
|
1592
|
-
var UNKNOWN_MODEL = "unknown";
|
|
1593
|
-
var UNKNOWN_BRANCH = "";
|
|
1594
|
-
function split_cache_write(usage) {
|
|
1595
|
-
const total = usage.cache_creation_input_tokens ?? 0;
|
|
1596
|
-
const detail = usage.cache_creation;
|
|
1597
|
-
if (!detail) return { write_5m: total, write_1h: 0 };
|
|
1598
|
-
const write_1h = detail.ephemeral_1h_input_tokens ?? 0;
|
|
1599
|
-
return { write_5m: detail.ephemeral_5m_input_tokens ?? total - write_1h, write_1h };
|
|
1600
|
-
}
|
|
1601
|
-
function thinking_usage(usage) {
|
|
1602
|
-
const raw = usage.output_tokens_details?.thinking_tokens;
|
|
1603
|
-
return { tokens: raw ?? 0, measured: raw !== null && raw !== void 0 };
|
|
1604
|
-
}
|
|
1605
|
-
function to_totals(usage) {
|
|
1606
|
-
const { write_5m, write_1h } = split_cache_write(usage);
|
|
1607
|
-
const thinking = thinking_usage(usage);
|
|
1608
|
-
return {
|
|
1609
|
-
input_tokens: usage.input_tokens,
|
|
1610
|
-
cache_write_5m_tokens: write_5m,
|
|
1611
|
-
cache_write_1h_tokens: write_1h,
|
|
1612
|
-
cache_read_tokens: usage.cache_read_input_tokens ?? 0,
|
|
1613
|
-
output_tokens: usage.output_tokens,
|
|
1614
|
-
thinking_tokens: thinking.tokens,
|
|
1615
|
-
thinking_measured: thinking.measured
|
|
1616
|
-
};
|
|
1617
|
-
}
|
|
1618
|
-
function declared_id(data) {
|
|
1619
|
-
return data.requestId ?? data.message?.id ?? data.uuid ?? void 0;
|
|
1620
|
-
}
|
|
1621
|
-
function request_id_of(data, usage) {
|
|
1622
|
-
const fallback = `${data.timestamp ?? ""}-${String(usage.output_tokens)}`;
|
|
1623
|
-
return declared_id(data) ?? fallback;
|
|
1624
|
-
}
|
|
1625
|
-
function to_record(data, usage) {
|
|
1626
|
-
return {
|
|
1627
|
-
request_id: request_id_of(data, usage),
|
|
1628
|
-
model: data.message?.model ?? UNKNOWN_MODEL,
|
|
1629
|
-
branch: data.gitBranch ?? UNKNOWN_BRANCH,
|
|
1630
|
-
at_ms: time_instant.parse_instant(data.timestamp),
|
|
1631
|
-
totals: to_totals(usage)
|
|
1632
|
-
};
|
|
1633
|
-
}
|
|
1634
|
-
var ASSISTANT_TYPE = "assistant";
|
|
1635
|
-
function is_priced_line(data) {
|
|
1636
|
-
return data.type === ASSISTANT_TYPE && data.message?.model !== SYNTHETIC_MODEL;
|
|
1637
|
-
}
|
|
1638
|
-
function classify(data) {
|
|
1639
|
-
if (!is_priced_line(data)) return { kind: "skipped" };
|
|
1640
|
-
const usage = data.message?.usage;
|
|
1641
|
-
return usage ? { kind: "record", record: to_record(data, usage) } : { kind: "no_usage" };
|
|
1642
|
-
}
|
|
1643
|
-
function parse_line(line) {
|
|
1644
|
-
if (line.trim() === "") return { kind: "skipped" };
|
|
1645
|
-
const parsed = LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line));
|
|
1646
|
-
return parsed.success ? classify(parsed.data) : { kind: "malformed" };
|
|
1647
|
-
}
|
|
1648
|
-
function later_instant(left, right) {
|
|
1649
|
-
if (left === void 0) return right;
|
|
1650
|
-
if (right === void 0) return left;
|
|
1651
|
-
return Math.max(left, right);
|
|
1652
|
-
}
|
|
1653
|
-
function dedupe(records) {
|
|
1654
|
-
const by_id = /* @__PURE__ */ new Map();
|
|
1655
|
-
for (const record of records) {
|
|
1656
|
-
const seen = by_id.get(record.request_id);
|
|
1657
|
-
const at_ms = later_instant(seen?.at_ms, record.at_ms);
|
|
1658
|
-
by_id.set(record.request_id, { ...seen ?? record, at_ms });
|
|
1659
|
-
}
|
|
1660
|
-
return [...by_id.values()];
|
|
1661
|
-
}
|
|
1662
|
-
function add_totals(left, right) {
|
|
1663
|
-
return {
|
|
1664
|
-
input_tokens: left.input_tokens + right.input_tokens,
|
|
1665
|
-
cache_write_5m_tokens: left.cache_write_5m_tokens + right.cache_write_5m_tokens,
|
|
1666
|
-
cache_write_1h_tokens: left.cache_write_1h_tokens + right.cache_write_1h_tokens,
|
|
1667
|
-
cache_read_tokens: left.cache_read_tokens + right.cache_read_tokens,
|
|
1668
|
-
output_tokens: left.output_tokens + right.output_tokens,
|
|
1669
|
-
thinking_tokens: left.thinking_tokens + right.thinking_tokens,
|
|
1670
|
-
thinking_measured: left.thinking_measured || right.thinking_measured
|
|
1671
|
-
};
|
|
1672
|
-
}
|
|
1673
|
-
function sum_totals(records) {
|
|
1674
|
-
let total = EMPTY_TOTALS;
|
|
1675
|
-
for (const record of records) total = add_totals(total, record.totals);
|
|
1676
|
-
return total;
|
|
1677
|
-
}
|
|
1678
|
-
function billed_input(totals) {
|
|
1679
|
-
return totals.input_tokens + totals.cache_write_5m_tokens + totals.cache_write_1h_tokens + totals.cache_read_tokens;
|
|
1680
|
-
}
|
|
1681
|
-
var cost_usage = {
|
|
1682
|
-
EMPTY_TOTALS,
|
|
1683
|
-
UNKNOWN_MODEL,
|
|
1684
|
-
SYNTHETIC_MODEL,
|
|
1685
|
-
parse_line,
|
|
1686
|
-
dedupe,
|
|
1687
|
-
add_totals,
|
|
1688
|
-
sum_totals,
|
|
1689
|
-
billed_input
|
|
1690
|
-
};
|
|
1691
|
-
|
|
1692
|
-
// scripts/cost-runtime/cost-transcript.ts
|
|
1693
|
-
var TRANSCRIPT_ROOT = path4.join(".claude", "projects");
|
|
1694
|
-
var TRANSCRIPT_EXTENSION = ".jsonl";
|
|
1695
|
-
var SLUG_PATTERN = /[^a-zA-Z0-9-]/gu;
|
|
1696
|
-
var UNIT_DIRECTORY = "subagents";
|
|
1697
|
-
var UNIT_ID_SEPARATOR = "/";
|
|
1698
|
-
function project_slug(cwd) {
|
|
1699
|
-
return cwd.replaceAll(SLUG_PATTERN, "-");
|
|
1700
|
-
}
|
|
1701
|
-
function transcript_directory(cwd, home = homedir()) {
|
|
1702
|
-
return path4.join(home, TRANSCRIPT_ROOT, project_slug(cwd));
|
|
1703
|
-
}
|
|
1704
|
-
var GIT_ENTRY = ".git";
|
|
1705
|
-
var GITDIR_PREFIX = "gitdir:";
|
|
1706
|
-
var WORKTREE_SEGMENT = `/${GIT_ENTRY}/worktrees/`;
|
|
1707
|
-
var NOT_FOUND2 = -1;
|
|
1708
|
-
function linked_worktree_gitdir(cwd) {
|
|
1709
|
-
try {
|
|
1710
|
-
const contents = readFileSync3(path4.join(cwd, GIT_ENTRY), "utf8").trim();
|
|
1711
|
-
return contents.startsWith(GITDIR_PREFIX) ? contents.slice(GITDIR_PREFIX.length).trim() : "";
|
|
1712
|
-
} catch {
|
|
1713
|
-
return "";
|
|
1714
|
-
}
|
|
1715
|
-
}
|
|
1716
|
-
function session_cwd(cwd) {
|
|
1717
|
-
const gitdir = linked_worktree_gitdir(cwd);
|
|
1718
|
-
const absolute = gitdir === "" ? "" : path4.resolve(cwd, gitdir);
|
|
1719
|
-
const segment = absolute.indexOf(WORKTREE_SEGMENT);
|
|
1720
|
-
return segment === NOT_FOUND2 ? cwd : absolute.slice(0, segment);
|
|
1721
|
-
}
|
|
1722
|
-
function read_directory(directory) {
|
|
1723
|
-
try {
|
|
1724
|
-
return readdirSync(directory);
|
|
1725
|
-
} catch {
|
|
1726
|
-
return [];
|
|
1727
|
-
}
|
|
1728
|
-
}
|
|
1729
|
-
function lane_transcript_directories(main_cwd, home) {
|
|
1730
|
-
const projects = path4.join(home, TRANSCRIPT_ROOT);
|
|
1731
|
-
const prefix = `${project_slug(lane_paths.lane_root(main_cwd))}-`;
|
|
1732
|
-
return read_directory(projects).filter(
|
|
1733
|
-
(name) => name.startsWith(prefix) && issue_number_shape.ISSUE_NUMBER_PATTERN.test(name.slice(prefix.length))
|
|
1734
|
-
).map((name) => path4.join(projects, name));
|
|
1735
|
-
}
|
|
1736
|
-
function transcript_directories(cwd, home = homedir()) {
|
|
1737
|
-
const own = transcript_directory(cwd, home);
|
|
1738
|
-
const lanes = session_cwd(cwd) === cwd ? lane_transcript_directories(cwd, home) : [];
|
|
1739
|
-
return [.../* @__PURE__ */ new Set([own, ...lanes])];
|
|
1740
|
-
}
|
|
1741
|
-
var OWN_DEPTH = 0;
|
|
1742
|
-
function home_directory() {
|
|
1743
|
-
return homedir();
|
|
1744
|
-
}
|
|
1745
|
-
function to_session_file(full_path, session_id, depth) {
|
|
1746
|
-
try {
|
|
1747
|
-
return {
|
|
1748
|
-
session_id,
|
|
1749
|
-
path: full_path,
|
|
1750
|
-
modified_ms: statSync(full_path).mtimeMs,
|
|
1751
|
-
is_delegated: depth > OWN_DEPTH,
|
|
1752
|
-
depth
|
|
1753
|
-
};
|
|
1754
|
-
} catch {
|
|
1755
|
-
return void 0;
|
|
1756
|
-
}
|
|
1757
|
-
}
|
|
1758
|
-
function is_transcript(name) {
|
|
1759
|
-
return name.endsWith(TRANSCRIPT_EXTENSION);
|
|
1760
|
-
}
|
|
1761
|
-
function without_extension(name) {
|
|
1762
|
-
return name.slice(0, -TRANSCRIPT_EXTENSION.length);
|
|
1763
|
-
}
|
|
1764
|
-
function own_files(directory, names) {
|
|
1765
|
-
return names.filter((name) => is_transcript(name)).map((name) => to_session_file(path4.join(directory, name), without_extension(name), OWN_DEPTH)).filter((file) => file !== void 0);
|
|
1766
|
-
}
|
|
1767
|
-
function unit_directory(directory, session_id) {
|
|
1768
|
-
return path4.join(directory, session_id, UNIT_DIRECTORY);
|
|
1769
|
-
}
|
|
1770
|
-
var UNIT_DEPTH = 1;
|
|
1771
|
-
function level_units(subagents_directory, prefix, depth) {
|
|
1772
|
-
return read_directory(subagents_directory).filter((name) => is_transcript(name)).map(
|
|
1773
|
-
(name) => to_session_file(
|
|
1774
|
-
path4.join(subagents_directory, name),
|
|
1775
|
-
`${prefix}${UNIT_ID_SEPARATOR}${without_extension(name)}`,
|
|
1776
|
-
depth
|
|
1777
|
-
)
|
|
1778
|
-
).filter((file) => file !== void 0);
|
|
1779
|
-
}
|
|
1780
|
-
function collect_units(subagents_directory, prefix, depth) {
|
|
1781
|
-
const nested = read_directory(subagents_directory).filter((name) => !is_transcript(name)).flatMap(
|
|
1782
|
-
(name) => collect_units(
|
|
1783
|
-
unit_directory(subagents_directory, name),
|
|
1784
|
-
`${prefix}${UNIT_ID_SEPARATOR}${name}`,
|
|
1785
|
-
depth + 1
|
|
1786
|
-
)
|
|
1787
|
-
);
|
|
1788
|
-
return [...level_units(subagents_directory, prefix, depth), ...nested];
|
|
1789
|
-
}
|
|
1790
|
-
function unit_files(directory, session_name) {
|
|
1791
|
-
return collect_units(unit_directory(directory, session_name), session_name, UNIT_DEPTH);
|
|
1792
|
-
}
|
|
1793
|
-
function list_sessions(directory) {
|
|
1794
|
-
const names = read_directory(directory);
|
|
1795
|
-
const units = names.filter((name) => !is_transcript(name)).flatMap((name) => unit_files(directory, name));
|
|
1796
|
-
return [...own_files(directory, names), ...units].toSorted(
|
|
1797
|
-
(left, right) => right.modified_ms - left.modified_ms
|
|
1798
|
-
);
|
|
1799
|
-
}
|
|
1800
|
-
function list_sessions_across(directories) {
|
|
1801
|
-
const seen = /* @__PURE__ */ new Set();
|
|
1802
|
-
const merged = directories.flatMap((directory) => list_sessions(directory));
|
|
1803
|
-
const newest_first = merged.toSorted((left, right) => right.modified_ms - left.modified_ms);
|
|
1804
|
-
const kept = [];
|
|
1805
|
-
for (const file of newest_first) {
|
|
1806
|
-
if (seen.has(file.session_id)) continue;
|
|
1807
|
-
seen.add(file.session_id);
|
|
1808
|
-
kept.push(file);
|
|
1809
|
-
}
|
|
1810
|
-
return kept;
|
|
1811
|
-
}
|
|
1812
|
-
function owning_session_id(file) {
|
|
1813
|
-
const [owner] = file.session_id.split(UNIT_ID_SEPARATOR);
|
|
1814
|
-
return owner ?? file.session_id;
|
|
1815
|
-
}
|
|
1816
|
-
function parent_session_id(file) {
|
|
1817
|
-
const separator = file.session_id.lastIndexOf(UNIT_ID_SEPARATOR);
|
|
1818
|
-
return separator === NOT_FOUND2 ? file.session_id : file.session_id.slice(0, separator);
|
|
1819
|
-
}
|
|
1820
|
-
function latest_own_index(files) {
|
|
1821
|
-
const index = files.findIndex((file) => !file.is_delegated);
|
|
1822
|
-
return index === -1 ? 0 : index;
|
|
1823
|
-
}
|
|
1824
|
-
function empty_session() {
|
|
1825
|
-
return {
|
|
1826
|
-
records: [],
|
|
1827
|
-
no_usage_lines: 0,
|
|
1828
|
-
malformed_lines: 0,
|
|
1829
|
-
is_readable: false,
|
|
1830
|
-
baseline_tokens: 0
|
|
1831
|
-
};
|
|
1832
|
-
}
|
|
1833
|
-
function tally(content) {
|
|
1834
|
-
const outcomes = content.split("\n").map((line) => cost_usage.parse_line(line));
|
|
1835
|
-
const records = outcomes.flatMap(
|
|
1836
|
-
(outcome) => outcome.kind === "record" ? [outcome.record] : []
|
|
1837
|
-
);
|
|
1838
|
-
const unique = cost_usage.dedupe(records);
|
|
1839
|
-
const [first] = unique;
|
|
1840
|
-
return {
|
|
1841
|
-
records: unique,
|
|
1842
|
-
no_usage_lines: outcomes.filter((outcome) => outcome.kind === "no_usage").length,
|
|
1843
|
-
malformed_lines: outcomes.filter((outcome) => outcome.kind === "malformed").length,
|
|
1844
|
-
is_readable: true,
|
|
1845
|
-
baseline_tokens: first === void 0 ? 0 : cost_usage.billed_input(first.totals)
|
|
1846
|
-
};
|
|
1847
|
-
}
|
|
1848
|
-
function read_session(file) {
|
|
1849
|
-
const content = file_reader.read_if_readable(file.path);
|
|
1850
|
-
if (content === void 0) return { session_id: file.session_id, ...empty_session() };
|
|
1851
|
-
return { session_id: file.session_id, ...tally(content) };
|
|
1852
|
-
}
|
|
1853
|
-
function read_raw(file) {
|
|
1854
|
-
return file_reader.read_if_readable(file.path) ?? "";
|
|
1855
|
-
}
|
|
1856
|
-
function read_optional2(file) {
|
|
1857
|
-
return file_reader.read_if_readable(file.path);
|
|
1858
|
-
}
|
|
1859
|
-
function directory_exists(directory) {
|
|
1860
|
-
try {
|
|
1861
|
-
return statSync(directory).isDirectory();
|
|
1862
|
-
} catch {
|
|
1863
|
-
return false;
|
|
1864
|
-
}
|
|
1865
|
-
}
|
|
1866
|
-
function searched_directories(directories) {
|
|
1867
|
-
return directories.map((directory) => ({
|
|
1868
|
-
path: directory,
|
|
1869
|
-
exists: directory_exists(directory)
|
|
1870
|
-
}));
|
|
1871
|
-
}
|
|
1872
|
-
function describe_searched(directory) {
|
|
1873
|
-
return ` ${directory.path} \u2014 ${directory.exists ? "no transcripts here" : "no such directory"}`;
|
|
1874
|
-
}
|
|
1875
|
-
function missing_message(searched, session_id) {
|
|
1876
|
-
const lead = session_id === void 0 ? "No transcripts found. Searched:" : `No transcript named ${session_id}. Searched:`;
|
|
1877
|
-
const listed = searched.map((directory) => describe_searched(directory));
|
|
1878
|
-
if (session_id !== void 0) return [lead, ...listed];
|
|
1879
|
-
return [
|
|
1880
|
-
lead,
|
|
1881
|
-
...listed,
|
|
1882
|
-
"Claude Code writes them per project; run this from the project it ran in."
|
|
1883
|
-
];
|
|
1884
|
-
}
|
|
1885
|
-
var cost_transcript = {
|
|
1886
|
-
TRANSCRIPT_EXTENSION,
|
|
1887
|
-
TRANSCRIPT_ROOT,
|
|
1888
|
-
UNIT_DIRECTORY,
|
|
1889
|
-
project_slug,
|
|
1890
|
-
transcript_directory,
|
|
1891
|
-
transcript_directories,
|
|
1892
|
-
session_cwd,
|
|
1893
|
-
unit_directory,
|
|
1894
|
-
list_sessions,
|
|
1895
|
-
list_sessions_across,
|
|
1896
|
-
searched_directories,
|
|
1897
|
-
owning_session_id,
|
|
1898
|
-
parent_session_id,
|
|
1899
|
-
latest_own_index,
|
|
1900
|
-
tally,
|
|
1901
|
-
read_session,
|
|
1902
|
-
read_raw,
|
|
1903
|
-
read_optional: read_optional2,
|
|
1904
|
-
missing_message,
|
|
1905
|
-
home_directory
|
|
1906
|
-
};
|
|
1907
|
-
|
|
1908
|
-
// scripts/josh/agent-session-environment.ts
|
|
1909
|
-
var SESSION_ID_KEY = "CLAUDE_CODE_SESSION_ID";
|
|
1910
|
-
var AGENT_PID_KEY = "CLAUDE_PID";
|
|
1911
|
-
var PARENT_SESSION_KEYS = [
|
|
1912
|
-
"CLAUDE_CODE_MESSAGING_SOCKET",
|
|
1913
|
-
"CLAUDE_CODE_MESSAGING_TOKEN",
|
|
1914
|
-
SESSION_ID_KEY,
|
|
1915
|
-
"CLAUDE_CODE_CHILD_SESSION"
|
|
1916
|
-
];
|
|
1917
|
-
var PROXY_KEYS = [
|
|
1918
|
-
"ALL_PROXY",
|
|
1919
|
-
"HTTP_PROXY",
|
|
1920
|
-
"HTTPS_PROXY",
|
|
1921
|
-
"all_proxy",
|
|
1922
|
-
"http_proxy",
|
|
1923
|
-
"https_proxy",
|
|
1924
|
-
"GLOBAL_AGENT_HTTP_PROXY",
|
|
1925
|
-
"GLOBAL_AGENT_HTTPS_PROXY"
|
|
1926
|
-
];
|
|
1927
|
-
var PROXY_CERTIFICATE_KEY = "NODE_EXTRA_CA_CERTS";
|
|
1928
|
-
var LOOPBACK_HOSTS = ["localhost", "ip6-localhost", "[::1]"];
|
|
1929
|
-
var LOOPBACK_PREFIX = "127.";
|
|
1930
|
-
var NO_HOST = "";
|
|
1931
|
-
function parsed_host(value) {
|
|
1932
|
-
try {
|
|
1933
|
-
return new URL(value).hostname;
|
|
1934
|
-
} catch {
|
|
1935
|
-
return NO_HOST;
|
|
1936
|
-
}
|
|
1937
|
-
}
|
|
1938
|
-
function proxy_host(value) {
|
|
1939
|
-
const direct = parsed_host(value);
|
|
1940
|
-
return direct === NO_HOST ? parsed_host(`http://${value}`) : direct;
|
|
1941
|
-
}
|
|
1942
|
-
function is_loopback_host(host) {
|
|
1943
|
-
return host.startsWith(LOOPBACK_PREFIX) || LOOPBACK_HOSTS.includes(host);
|
|
1944
|
-
}
|
|
1945
|
-
function is_loopback_proxy(value) {
|
|
1946
|
-
if (value === void 0 || value === NO_HOST) return false;
|
|
1947
|
-
return is_loopback_host(proxy_host(value));
|
|
1948
|
-
}
|
|
1949
|
-
function is_declared(value) {
|
|
1950
|
-
return value !== void 0 && value !== NO_HOST;
|
|
1951
|
-
}
|
|
1952
|
-
function loopback_proxy_keys(source, is_removed = is_loopback_proxy) {
|
|
1953
|
-
const declared = PROXY_KEYS.filter((key) => is_declared(source[key]));
|
|
1954
|
-
const matched = declared.filter((key) => is_removed(source[key]));
|
|
1955
|
-
const is_certificate_included = matched.length > 0 && matched.length === declared.length;
|
|
1956
|
-
return is_certificate_included ? [...matched, PROXY_CERTIFICATE_KEY] : matched;
|
|
1957
|
-
}
|
|
1958
|
-
function to_removed(keys) {
|
|
1959
|
-
return Object.fromEntries(keys.map((key) => [key, void 0]));
|
|
1960
|
-
}
|
|
1961
|
-
function removed_environment(source = process.env) {
|
|
1962
|
-
return to_removed([...PARENT_SESSION_KEYS, ...loopback_proxy_keys(source)]);
|
|
1963
|
-
}
|
|
1964
|
-
var SCANNER_DIRECTORY = ".safe-chain";
|
|
1965
|
-
var PATH_SEPARATOR = /[/\\]/u;
|
|
1966
|
-
function is_scanner_certificate(value) {
|
|
1967
|
-
return value?.split(PATH_SEPARATOR).includes(SCANNER_DIRECTORY) ?? false;
|
|
1968
|
-
}
|
|
1969
|
-
var SCANNER_PROXY_KEY = "HTTPS_PROXY";
|
|
1970
|
-
function is_scanner_proxy(source) {
|
|
1971
|
-
const scanner_proxy = source[SCANNER_PROXY_KEY];
|
|
1972
|
-
return function is_match(value) {
|
|
1973
|
-
return value === scanner_proxy && is_loopback_proxy(value);
|
|
1974
|
-
};
|
|
1975
|
-
}
|
|
1976
|
-
function removed_proxy_environment(source = process.env) {
|
|
1977
|
-
if (!is_scanner_certificate(source[PROXY_CERTIFICATE_KEY])) return {};
|
|
1978
|
-
return to_removed(loopback_proxy_keys(source, is_scanner_proxy(source)));
|
|
1979
|
-
}
|
|
1980
|
-
var agent_session_environment = {
|
|
1981
|
-
AGENT_PID_KEY,
|
|
1982
|
-
LOOPBACK_HOSTS,
|
|
1983
|
-
PARENT_SESSION_KEYS,
|
|
1984
|
-
PROXY_CERTIFICATE_KEY,
|
|
1985
|
-
PROXY_KEYS,
|
|
1986
|
-
SESSION_ID_KEY,
|
|
1987
|
-
removed_environment,
|
|
1988
|
-
removed_proxy_environment
|
|
1989
|
-
};
|
|
1990
|
-
|
|
1991
|
-
// scripts/cost-runtime/own-session.ts
|
|
1992
|
-
var NOT_FOUND3 = -1;
|
|
1993
|
-
function session_id_of(environment) {
|
|
1994
|
-
const value = environment[agent_session_environment.SESSION_ID_KEY];
|
|
1995
|
-
return value === void 0 || value === "" ? void 0 : value;
|
|
1996
|
-
}
|
|
1997
|
-
function select_own_session(files, environment) {
|
|
1998
|
-
const session_id = session_id_of(environment);
|
|
1999
|
-
if (session_id === void 0) {
|
|
2000
|
-
return { kind: "own", index: cost_transcript.latest_own_index(files) };
|
|
2001
|
-
}
|
|
2002
|
-
const index = files.findIndex((file) => file.session_id === session_id);
|
|
2003
|
-
return index === NOT_FOUND3 ? { kind: "absent", session_id } : { kind: "own", index };
|
|
2004
|
-
}
|
|
2005
|
-
var own_session = {
|
|
2006
|
-
session_id_of,
|
|
2007
|
-
select_own_session
|
|
2008
|
-
};
|
|
2009
|
-
|
|
2010
|
-
// scripts/run/carry/run-carry-conversation.ts
|
|
2011
|
-
var CONVERSATION_QUIET_MS = 6e5;
|
|
2012
|
-
function own_transcript(environment = process.env, directories = cost_transcript.transcript_directories(process.cwd())) {
|
|
2013
|
-
const session_id = own_session.session_id_of(environment);
|
|
2014
|
-
if (session_id === void 0) return void 0;
|
|
2015
|
-
const name = `${session_id}${cost_transcript.TRANSCRIPT_EXTENSION}`;
|
|
2016
|
-
return directories.map((directory) => path5.join(directory, name)).find((file) => existsSync(file));
|
|
2017
|
-
}
|
|
2018
|
-
function modified_ms(transcript) {
|
|
2019
|
-
try {
|
|
2020
|
-
return statSync2(transcript).mtimeMs;
|
|
2021
|
-
} catch {
|
|
2022
|
-
return void 0;
|
|
2023
|
-
}
|
|
2024
|
-
}
|
|
2025
|
-
function is_recent(modified, now) {
|
|
2026
|
-
return modified !== void 0 && now.getTime() - modified <= CONVERSATION_QUIET_MS;
|
|
2027
|
-
}
|
|
2028
|
-
function is_conversation_live(carry, now = /* @__PURE__ */ new Date(), read_modified = modified_ms) {
|
|
2029
|
-
if (carry.is_handed_off === true || carry.owner_transcript === void 0) return false;
|
|
2030
|
-
return is_recent(read_modified(carry.owner_transcript), now);
|
|
2031
|
-
}
|
|
2032
|
-
function is_same_conversation(carry, owner) {
|
|
2033
|
-
return owner.transcript !== void 0 && owner.transcript === carry.owner_transcript;
|
|
2034
|
-
}
|
|
2035
|
-
function reclaim_owner(carry, owner) {
|
|
2036
|
-
if (carry.is_handed_off === true || !is_same_conversation(carry, owner) || owner.pid === carry.owner_pid) {
|
|
2037
|
-
return carry;
|
|
2038
|
-
}
|
|
2039
|
-
return { ...carry, owner_pid: owner.pid, owner_start: owner.start };
|
|
2040
|
-
}
|
|
2041
|
-
var run_carry_conversation = {
|
|
2042
|
-
CONVERSATION_QUIET_MS,
|
|
2043
|
-
own_transcript,
|
|
2044
|
-
is_conversation_live,
|
|
2045
|
-
is_same_conversation,
|
|
2046
|
-
reclaim_owner
|
|
2047
|
-
};
|
|
2048
|
-
|
|
2049
|
-
// scripts/run/carry/run-carry.ts
|
|
2050
|
-
var CARRY_PREFIX = "josh-run-carry-";
|
|
2051
|
-
var REPOSITORY_DIRECTORY_INDEX = 1;
|
|
2052
|
-
var NO_INCREMENT3 = 0;
|
|
2053
|
-
var MAX_CUTS = 6;
|
|
2054
|
-
var END_COMMAND = "pnpm josh run:carry --end";
|
|
2055
|
-
var RESUME_COMMAND = "pnpm josh run:carry --resume";
|
|
2056
|
-
var READ_COMMAND = "pnpm josh run:carry --json";
|
|
2057
|
-
var OWNER_ARGUMENT = '--owner "$PPID"';
|
|
2058
|
-
var NO_OWNER = {};
|
|
2059
|
-
var carry_addition_schema = z2.object({ issue: z2.number(), is_priority: z2.boolean() });
|
|
2060
|
-
var run_carry_schema = z2.object({
|
|
2061
|
-
invocation: z2.string(),
|
|
2062
|
-
started_at: z2.string(),
|
|
2063
|
-
merged: z2.number(),
|
|
2064
|
-
merged_issues: z2.array(z2.number()).optional(),
|
|
2065
|
-
filed: z2.number(),
|
|
2066
|
-
cuts: z2.number(),
|
|
2067
|
-
// Defaulted, so a record that lacks the streak parses with a zero streak rather than failing to read.
|
|
2068
|
-
failures: z2.number().default(0),
|
|
2069
|
-
outages: z2.number().default(0),
|
|
2070
|
-
last_outage_at: z2.string().optional(),
|
|
2071
|
-
// An absent owner reads as "no owner declared", which is the not-provably-live answer rather than a
|
|
2072
|
-
// live one.
|
|
2073
|
-
owner_pid: z2.number().optional(),
|
|
2074
|
-
owner_start: z2.string().optional(),
|
|
2075
|
-
owner_transcript: z2.string().optional(),
|
|
2076
|
-
is_owner_headless: z2.boolean().optional(),
|
|
2077
|
-
is_handed_off: z2.boolean().optional(),
|
|
2078
|
-
done: z2.array(z2.number()).optional(),
|
|
2079
|
-
retrospective: z2.boolean().optional(),
|
|
2080
|
-
added: z2.array(carry_addition_schema).optional(),
|
|
2081
|
-
lane_limit: z2.number().int().positive().optional()
|
|
2082
|
-
});
|
|
2083
|
-
function carry_path(git_directory) {
|
|
2084
|
-
return stamp_file.stamp_path(CARRY_PREFIX, git_directory);
|
|
2085
|
-
}
|
|
2086
|
-
async function repository_directory() {
|
|
2087
|
-
const directories = await git_command.git_directories();
|
|
2088
|
-
return directories[REPOSITORY_DIRECTORY_INDEX];
|
|
2089
|
-
}
|
|
2090
|
-
function parse_carry(raw) {
|
|
2091
|
-
return json_value.parse_with(raw, run_carry_schema);
|
|
2092
|
-
}
|
|
2093
|
-
function classify2(raw) {
|
|
2094
|
-
if (raw === void 0) return { kind: "none" };
|
|
2095
|
-
const carry = parse_carry(raw);
|
|
2096
|
-
if (carry === void 0 || Number.isNaN(Date.parse(carry.started_at))) {
|
|
2097
|
-
return { kind: "unreadable" };
|
|
2098
|
-
}
|
|
2099
|
-
return { kind: "carried", carry };
|
|
2100
|
-
}
|
|
2101
|
-
function read_carry(target) {
|
|
2102
|
-
return classify2(stamp_file.read_stamp_text(target));
|
|
2103
|
-
}
|
|
2104
|
-
function owner_of(pid, read3 = process_identity.read_start, transcript = run_carry_conversation.own_transcript()) {
|
|
2105
|
-
return { pid, start: read3(pid), transcript };
|
|
2106
|
-
}
|
|
2107
|
-
function fresh_carry(invocation, owner, now) {
|
|
2108
|
-
return {
|
|
2109
|
-
invocation,
|
|
2110
|
-
started_at: now.toISOString(),
|
|
2111
|
-
merged: NO_INCREMENT3,
|
|
2112
|
-
filed: NO_INCREMENT3,
|
|
2113
|
-
cuts: NO_INCREMENT3,
|
|
2114
|
-
failures: NO_INCREMENT3,
|
|
2115
|
-
outages: NO_INCREMENT3,
|
|
2116
|
-
owner_pid: owner.pid,
|
|
2117
|
-
owner_start: owner.start,
|
|
2118
|
-
owner_transcript: owner.transcript,
|
|
2119
|
-
is_owner_headless: owner.is_headless
|
|
2120
|
-
};
|
|
2121
|
-
}
|
|
2122
|
-
function begin_carry(target, invocation, owner = NO_OWNER, now = /* @__PURE__ */ new Date()) {
|
|
2123
|
-
const carry = fresh_carry(invocation, owner, now);
|
|
2124
|
-
return stamp_file.create_stamp(target, carry) ? carry : void 0;
|
|
2125
|
-
}
|
|
2126
|
-
function adopt_carry(target, carry, owner = NO_OWNER) {
|
|
2127
|
-
const next = {
|
|
2128
|
-
...carry,
|
|
2129
|
-
owner_pid: owner.pid,
|
|
2130
|
-
owner_start: owner.start,
|
|
2131
|
-
owner_transcript: owner.transcript,
|
|
2132
|
-
is_owner_headless: owner.is_headless,
|
|
2133
|
-
is_handed_off: false
|
|
2134
|
-
};
|
|
2135
|
-
stamp_file.remove_stamp(target);
|
|
2136
|
-
return stamp_file.create_stamp(target, next) ? next : void 0;
|
|
2137
|
-
}
|
|
2138
|
-
function is_owner_live(carry, now = /* @__PURE__ */ new Date()) {
|
|
2139
|
-
if (process_identity.is_same_process(carry.owner_pid, carry.owner_start) !== false) return true;
|
|
2140
|
-
return run_carry_conversation.is_conversation_live(carry, now);
|
|
2141
|
-
}
|
|
2142
|
-
function is_owned_by(carry, owner) {
|
|
2143
|
-
if (run_carry_conversation.is_same_conversation(carry, owner)) return true;
|
|
2144
|
-
return carry.owner_pid === owner.pid && carry.owner_start === owner.start;
|
|
2145
|
-
}
|
|
2146
|
-
function is_foreign_live_owner(carry, owner) {
|
|
2147
|
-
return is_owner_live(carry) && !is_owned_by(carry, owner);
|
|
2148
|
-
}
|
|
2149
|
-
function is_held_by_another(carry, is_live = is_owner_live) {
|
|
2150
|
-
const caller = owner_of(process.pid);
|
|
2151
|
-
const is_own = carry.owner_pid === caller.pid && carry.owner_start === caller.start;
|
|
2152
|
-
return !is_own && is_live(carry);
|
|
2153
|
-
}
|
|
2154
|
-
function is_handed_off_to(carry, invocation) {
|
|
2155
|
-
return carry.is_handed_off === true && carry.invocation === invocation;
|
|
2156
|
-
}
|
|
2157
|
-
function classify_claim(carry, request) {
|
|
2158
|
-
if (is_handed_off_to(carry, request.invocation)) return "resume";
|
|
2159
|
-
if (is_foreign_live_owner(carry, request.owner)) return "busy";
|
|
2160
|
-
if (carry.invocation !== request.invocation) return "mismatch";
|
|
2161
|
-
return request.is_adoption ? "resume" : "standing";
|
|
2162
|
-
}
|
|
2163
|
-
function is_count_refused(carry, owner) {
|
|
2164
|
-
return carry.is_handed_off === true || is_foreign_live_owner(carry, owner);
|
|
2165
|
-
}
|
|
2166
|
-
function is_at_cut_cap(carry) {
|
|
2167
|
-
return carry.cuts >= MAX_CUTS;
|
|
2168
|
-
}
|
|
2169
|
-
function end_carry(target) {
|
|
2170
|
-
stamp_file.remove_stamp(target);
|
|
2171
|
-
}
|
|
2172
|
-
function retrospective_done_of(read3) {
|
|
2173
|
-
return read3.kind === "carried" && read3.carry.retrospective === true;
|
|
2174
|
-
}
|
|
2175
|
-
function remaining_of(carry) {
|
|
2176
|
-
if (carry === void 0) return void 0;
|
|
2177
|
-
const declared = run_invocation.issue_numbers(carry.invocation);
|
|
2178
|
-
if (declared === void 0) return void 0;
|
|
2179
|
-
const done = carry.done ?? [];
|
|
2180
|
-
return run_carry_added.ordered(declared, carry.added).filter((issue) => !done.includes(issue));
|
|
2181
|
-
}
|
|
2182
|
-
function done_note(carry) {
|
|
2183
|
-
const done = carry.done ?? [];
|
|
2184
|
-
return done.length === 0 ? "" : `, issues ${done.join(", ")} done`;
|
|
2185
|
-
}
|
|
2186
|
-
function describe_carry(carry) {
|
|
2187
|
-
return `${carry.invocation} started ${carry.started_at}; ${String(carry.merged)} merged, ${String(carry.filed)} filed, ${String(carry.failures)} failed in a row, ${String(carry.outages)} outage(s) in a row, ${String(carry.cuts)} cut(s) crossed${done_note(carry)}`;
|
|
2188
|
-
}
|
|
2189
|
-
function mismatch_message(carry, invocation) {
|
|
2190
|
-
return `A different invocation is carried here \u2014 ${describe_carry(carry)}. This one is \`${invocation}\`. End the standing record with \`${END_COMMAND}\` once you know its run is over, then begin again.`;
|
|
2191
|
-
}
|
|
2192
|
-
function busy_message(carry) {
|
|
2193
|
-
return `A live run holds this budget \u2014 ${describe_carry(carry)}, owner pid ${String(carry.owner_pid)} still running. Nothing was established. Wait for that run, or end its record with \`${END_COMMAND}\` once you know it is over.`;
|
|
2194
|
-
}
|
|
2195
|
-
function claim_command(invocation) {
|
|
2196
|
-
return `${RESUME_COMMAND} "${invocation}" ${OWNER_ARGUMENT}`;
|
|
2197
|
-
}
|
|
2198
|
-
function standing_message(carry) {
|
|
2199
|
-
return `A run record is standing here that no cut handed off \u2014 ${describe_carry(carry)}. Nothing was established. Carry that budget with \`${claim_command(carry.invocation)}\`, or discard it with \`${END_COMMAND}\` and begin again.`;
|
|
2200
|
-
}
|
|
2201
|
-
function count_refused_message(carry) {
|
|
2202
|
-
if (carry.is_handed_off === true) {
|
|
2203
|
-
return `This budget was handed off at a cut and is waiting for its successor \u2014 ${describe_carry(carry)}. Nothing was counted; the cutting session must not advance a handed-off budget.`;
|
|
2204
|
-
}
|
|
2205
|
-
return `A live run owns this budget \u2014 ${describe_carry(carry)}, owner pid ${String(carry.owner_pid)} still running. Nothing was counted; only its owner advances the budget.`;
|
|
2206
|
-
}
|
|
2207
|
-
function lost_message() {
|
|
2208
|
-
return `Another process established a run record here first, so nothing was established. Read it with \`${READ_COMMAND}\`.`;
|
|
2209
|
-
}
|
|
2210
|
-
function nothing_to_resume_message() {
|
|
2211
|
-
return `Nothing is carried here, so there is no budget to resume. Begin one with \`pnpm josh run:carry --begin "<invocation>"\`.`;
|
|
2212
|
-
}
|
|
2213
|
-
function unreadable_message() {
|
|
2214
|
-
return `A run record is here but could not be read; clear it with \`${END_COMMAND}\` once you know no run is using it.`;
|
|
2215
|
-
}
|
|
2216
|
-
function unknown_message() {
|
|
2217
|
-
return "This repository\u2019s git directory could not be read, so no run record was established.";
|
|
2218
|
-
}
|
|
2219
|
-
var run_carry = {
|
|
2220
|
-
END_COMMAND,
|
|
2221
|
-
MAX_CUTS,
|
|
2222
|
-
NO_OWNER,
|
|
2223
|
-
RESUME_COMMAND,
|
|
2224
|
-
adopt_carry,
|
|
2225
|
-
apply_change: run_carry_change.apply_change,
|
|
2226
|
-
begin_carry,
|
|
2227
|
-
busy_message,
|
|
2228
|
-
carry_path,
|
|
2229
|
-
claim_command,
|
|
2230
|
-
classify: classify2,
|
|
2231
|
-
classify_claim,
|
|
2232
|
-
count_refused_message,
|
|
2233
|
-
is_at_cut_cap,
|
|
2234
|
-
describe_carry,
|
|
2235
|
-
end_carry,
|
|
2236
|
-
mismatch_message,
|
|
2237
|
-
fresh_carry,
|
|
2238
|
-
is_count_refused,
|
|
2239
|
-
is_foreign_live_owner,
|
|
2240
|
-
is_held_by_another,
|
|
2241
|
-
is_owner_live,
|
|
2242
|
-
lost_message,
|
|
2243
|
-
nothing_to_resume_message,
|
|
2244
|
-
owner_of,
|
|
2245
|
-
parse_carry,
|
|
2246
|
-
read_carry,
|
|
2247
|
-
remaining_of,
|
|
2248
|
-
repository_directory,
|
|
2249
|
-
retrospective_done_of,
|
|
2250
|
-
standing_message,
|
|
2251
|
-
unknown_message,
|
|
2252
|
-
unreadable_message
|
|
2253
|
-
};
|
|
2254
|
-
|
|
2255
|
-
// ports/index.js
|
|
2256
|
-
import { existsSync as existsSync2 } from "node:fs";
|
|
2257
|
-
import path6 from "node:path";
|
|
2258
|
-
var PORT_SEED_KEY = "PORT_SEED";
|
|
2259
|
-
var LANE_SEAT_KEY = "JOSH_LANE_SEAT";
|
|
2260
|
-
var ENV_FILE_NAME = ".env";
|
|
2261
|
-
var PACKAGE_FILE_NAME = "package.json";
|
|
2262
|
-
var PROJECT_ENVIRONMENT_KEYS = /* @__PURE__ */ new Set([PORT_SEED_KEY, LANE_SEAT_KEY, "PLAYWRIGHT_REUSE_SERVER"]);
|
|
2263
|
-
var DEV_PORT_BASE = 5173;
|
|
2264
|
-
var PREVIEW_PORT_BASE = 4173;
|
|
2265
|
-
var MIN_SEED = 0;
|
|
2266
|
-
var SEED_LANE_MULTIPLIER = 10;
|
|
2267
|
-
var MAX_LANE = 9;
|
|
2268
|
-
var MAX_SEED = 99;
|
|
2269
|
-
var INTEGER_PATTERN = /^\d+$/u;
|
|
2270
|
-
function fail_invalid(key, raw, max) {
|
|
2271
|
-
throw new Error(
|
|
2272
|
-
`${key} must be an integer between ${MIN_SEED} and ${max}, got ${JSON.stringify(raw)}. Unset it to use the default ports (dev ${DEV_PORT_BASE}, preview ${PREVIEW_PORT_BASE}).`
|
|
2273
|
-
);
|
|
2274
|
-
}
|
|
2275
|
-
function read_trimmed(environment, key) {
|
|
2276
|
-
const raw = environment[key];
|
|
2277
|
-
return raw === void 0 ? "" : raw.trim();
|
|
2278
|
-
}
|
|
2279
|
-
function resolve_bounded(environment, key, max) {
|
|
2280
|
-
const trimmed = read_trimmed(environment, key);
|
|
2281
|
-
if (trimmed.length === 0) return MIN_SEED;
|
|
2282
|
-
if (!INTEGER_PATTERN.test(trimmed)) fail_invalid(key, trimmed, max);
|
|
2283
|
-
const value = Number(trimmed);
|
|
2284
|
-
if (value > max) fail_invalid(key, trimmed, max);
|
|
2285
|
-
return value;
|
|
2286
|
-
}
|
|
2287
|
-
function resolve_seed(environment = process.env) {
|
|
2288
|
-
return resolve_bounded(environment, PORT_SEED_KEY, MAX_SEED);
|
|
2289
|
-
}
|
|
2290
|
-
function resolve_lane(environment = process.env) {
|
|
2291
|
-
return resolve_bounded(environment, LANE_SEAT_KEY, MAX_LANE);
|
|
2292
|
-
}
|
|
2293
|
-
function resolve_offset(environment = process.env) {
|
|
2294
|
-
return resolve_seed(environment) * SEED_LANE_MULTIPLIER + resolve_lane(environment);
|
|
2295
|
-
}
|
|
2296
|
-
function offset_from(base, environment) {
|
|
2297
|
-
return base + resolve_offset(environment);
|
|
2298
|
-
}
|
|
2299
|
-
function resolve_development_port(environment = process.env) {
|
|
2300
|
-
return offset_from(DEV_PORT_BASE, environment);
|
|
2301
|
-
}
|
|
2302
|
-
function resolve_preview_port(environment = process.env) {
|
|
2303
|
-
return offset_from(PREVIEW_PORT_BASE, environment);
|
|
2304
|
-
}
|
|
2305
|
-
function resolve_project_directory(directory) {
|
|
2306
|
-
const start = path6.resolve(directory);
|
|
2307
|
-
let current = start;
|
|
2308
|
-
while (!existsSync2(path6.join(current, PACKAGE_FILE_NAME))) {
|
|
2309
|
-
const parent = path6.dirname(current);
|
|
2310
|
-
if (parent === current) return start;
|
|
2311
|
-
current = parent;
|
|
2312
|
-
}
|
|
2313
|
-
return current;
|
|
2314
|
-
}
|
|
2315
|
-
function discard_loaded_keys(snapshot) {
|
|
2316
|
-
for (const key of Object.keys(process.env)) {
|
|
2317
|
-
if (!PROJECT_ENVIRONMENT_KEYS.has(key) && !Object.hasOwn(snapshot, key)) {
|
|
2318
|
-
Reflect.deleteProperty(process.env, key);
|
|
2319
|
-
}
|
|
2320
|
-
}
|
|
2321
|
-
}
|
|
2322
|
-
function load_environment_file(directory = process.cwd()) {
|
|
2323
|
-
const file = path6.join(resolve_project_directory(directory), ENV_FILE_NAME);
|
|
2324
|
-
if (!existsSync2(file)) return false;
|
|
2325
|
-
const snapshot = { ...process.env };
|
|
2326
|
-
process.loadEnvFile(file);
|
|
2327
|
-
discard_loaded_keys(snapshot);
|
|
2328
|
-
return true;
|
|
2329
|
-
}
|
|
2330
|
-
var ports = {
|
|
2331
|
-
load_environment_file,
|
|
2332
|
-
resolve_project_directory,
|
|
2333
|
-
resolve_seed,
|
|
2334
|
-
resolve_lane,
|
|
2335
|
-
resolve_development_port,
|
|
2336
|
-
resolve_preview_port
|
|
2337
|
-
};
|
|
2338
|
-
|
|
2339
|
-
// scripts/josh/process-owner.ts
|
|
2340
|
-
import { z as z3 } from "zod";
|
|
2341
|
-
var process_owner_schema = z3.object({ pid: z3.number(), process_start: z3.string().optional() });
|
|
2342
|
-
|
|
2343
|
-
// scripts/git/git-schemas.ts
|
|
2344
|
-
import { z as z4 } from "zod";
|
|
2345
|
-
var package_name_schema = z4.object({ name: z4.string().min(1) });
|
|
2346
|
-
var rollup_item_schema = z4.looseObject({
|
|
2347
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention -- GraphQL field name from GitHub API
|
|
2348
|
-
__typename: z4.string().optional(),
|
|
2349
|
-
state: z4.string().optional(),
|
|
2350
|
-
status: z4.string().optional(),
|
|
2351
|
-
conclusion: z4.string().optional(),
|
|
2352
|
-
name: z4.string().optional(),
|
|
2353
|
-
context: z4.string().optional(),
|
|
2354
|
-
description: z4.string().nullish()
|
|
2355
|
-
});
|
|
2356
|
-
var pr_raw_schema = z4.object({
|
|
2357
|
-
statusCheckRollup: z4.array(rollup_item_schema).optional(),
|
|
2358
|
-
mergeStateStatus: z4.string().optional(),
|
|
2359
|
-
reviewDecision: z4.string().optional()
|
|
2360
|
-
});
|
|
2361
|
-
var pull_comment_schema = z4.object({
|
|
2362
|
-
body: z4.string().optional(),
|
|
2363
|
-
html_url: z4.string().optional(),
|
|
2364
|
-
user: z4.object({ login: z4.string().optional() }).optional()
|
|
2365
|
-
});
|
|
2366
|
-
var ai_review_pull_comment_schema = z4.object({
|
|
2367
|
-
body: z4.string().optional(),
|
|
2368
|
-
url: z4.string().optional(),
|
|
2369
|
-
author: z4.object({ login: z4.string().optional() }).optional()
|
|
2370
|
-
});
|
|
2371
|
-
var pr_info_schema = z4.object({
|
|
2372
|
-
mergeable: z4.union([z4.boolean(), z4.string()]).nullable().optional(),
|
|
2373
|
-
mergeStateStatus: z4.string().nullable().optional(),
|
|
2374
|
-
state: z4.string().optional()
|
|
2375
|
-
});
|
|
2376
|
-
var epic_issue_schema = z4.object({
|
|
2377
|
-
number: z4.number(),
|
|
2378
|
-
body: z4.string().optional()
|
|
2379
|
-
});
|
|
2380
|
-
var blocking_issue_schema = z4.object({
|
|
2381
|
-
number: z4.number(),
|
|
2382
|
-
state: z4.string().optional(),
|
|
2383
|
-
repository_url: z4.string().optional()
|
|
2384
|
-
});
|
|
2385
|
-
var blocked_by_schema = z4.object({
|
|
2386
|
-
nodes: z4.array(blocking_issue_schema).default([]),
|
|
2387
|
-
totalCount: z4.number().optional()
|
|
2388
|
-
}).optional();
|
|
2389
|
-
var epic_child_schema = z4.object({
|
|
2390
|
-
state: z4.string().optional(),
|
|
2391
|
-
blockedBy: blocked_by_schema
|
|
2392
|
-
});
|
|
2393
|
-
var rest_comment_schema = z4.looseObject({
|
|
2394
|
-
body: z4.string().nullish(),
|
|
2395
|
-
html_url: z4.string().optional(),
|
|
2396
|
-
user: z4.looseObject({ login: z4.string().optional() }).nullish()
|
|
2397
|
-
});
|
|
2398
|
-
var issue_label_schema = z4.object({ name: z4.string() });
|
|
2399
|
-
var epic_subject_schema = z4.object({
|
|
2400
|
-
number: z4.number(),
|
|
2401
|
-
state: z4.string().optional(),
|
|
2402
|
-
labels: z4.array(issue_label_schema).optional(),
|
|
2403
|
-
body: z4.string().optional()
|
|
2404
|
-
});
|
|
2405
|
-
var open_issue_schema = z4.object({
|
|
2406
|
-
number: z4.number(),
|
|
2407
|
-
title: z4.string(),
|
|
2408
|
-
labels: z4.array(issue_label_schema).optional(),
|
|
2409
|
-
createdAt: z4.string(),
|
|
2410
|
-
blockedBy: blocked_by_schema,
|
|
2411
|
-
// Present only on the pickup listing, which reads it for the paths each issue declares.
|
|
2412
|
-
body: z4.string().optional()
|
|
2413
|
-
});
|
|
2414
|
-
|
|
2415
|
-
export {
|
|
2416
|
-
json_value,
|
|
2417
|
-
process_identity,
|
|
2418
|
-
process_owner_schema,
|
|
2419
|
-
issue_number_shape,
|
|
2420
|
-
lane_paths,
|
|
2421
|
-
PORT_SEED_KEY,
|
|
2422
|
-
LANE_SEAT_KEY,
|
|
2423
|
-
ENV_FILE_NAME,
|
|
2424
|
-
ports,
|
|
2425
|
-
pr_raw_schema,
|
|
2426
|
-
blocking_issue_schema,
|
|
2427
|
-
rest_comment_schema,
|
|
2428
|
-
issue_label_schema,
|
|
2429
|
-
open_issue_schema,
|
|
2430
|
-
PORCELAIN_FLAG,
|
|
2431
|
-
UNTRACKED_FILES_FLAG,
|
|
2432
|
-
git_utilities,
|
|
2433
|
-
has_timed_out,
|
|
2434
|
-
git_spawn,
|
|
2435
|
-
git_diff_reads,
|
|
2436
|
-
GIT_LOCATION_VARIABLES,
|
|
2437
|
-
git_location_environment,
|
|
2438
|
-
git_spawn_sync,
|
|
2439
|
-
git_command,
|
|
2440
|
-
changed_paths,
|
|
2441
|
-
cli_flags,
|
|
2442
|
-
backlog_budget,
|
|
2443
|
-
run_invocation,
|
|
2444
|
-
file_reader,
|
|
2445
|
-
time_instant,
|
|
2446
|
-
cost_usage,
|
|
2447
|
-
cost_transcript,
|
|
2448
|
-
agent_session_environment,
|
|
2449
|
-
own_session,
|
|
2450
|
-
run_carry
|
|
2451
|
-
};
|