@joshuafolkken/kit 1.1240.0 → 1.1370.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 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +216 -202
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,26 +1,45 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto'
|
|
2
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import { existsSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { json_value } from '#scripts/lib/json-value'
|
|
5
5
|
|
|
6
6
|
// What a hook build was made from, so a later launch can tell whether `dist/hooks/` still matches the
|
|
7
|
-
// source it runs beside
|
|
7
|
+
// source it runs beside. `dist/` is git-ignored and rebuilt only by
|
|
8
8
|
// `pnpm build`, so without this record an edited guard keeps running its old bundle with nothing to
|
|
9
9
|
// say so — and a lane's bundles are copied from the main checkout, whose source can differ.
|
|
10
10
|
//
|
|
11
11
|
// **The record is a content digest, not a timestamp.** A copy (`lane-cache.ts`) or a fresh checkout
|
|
12
12
|
// rewrites every mtime while leaving the content alone, and a digest is the only comparison that
|
|
13
|
-
// neither rebuilds on that nor misses an edit that kept the old mtime.
|
|
13
|
+
// neither rebuilds on that nor misses an edit that kept the old mtime. The mtime memory below only
|
|
14
|
+
// decides when the digest is recomputed, never what it is compared against.
|
|
14
15
|
//
|
|
15
16
|
// **The digest is taken from the bytes the build read, never re-read from disk afterwards.** A source
|
|
16
17
|
// edited while the build runs would otherwise be recorded as built, and its stale bundle read as fresh.
|
|
17
18
|
//
|
|
19
|
+
// **A verified digest is remembered by each input's mtime and size**. Hashing
|
|
20
|
+
// every input on every hook launch is the gate's whole cost, so once the digest has matched, the
|
|
21
|
+
// inputs' signatures are written beside the stamp and a later launch whose signatures all match skips
|
|
22
|
+
// the hash. The digest stays the record: a copied or checked-out tree matches no remembered signature
|
|
23
|
+
// and is hashed once, then remembered. Each signature is taken before its input is read, so an edit
|
|
24
|
+
// landing during the hash leaves a signature that no longer matches. The memory is a separate file
|
|
25
|
+
// rather than a rewrite of the stamp, so a launch never races the build that owns the stamp, and the
|
|
26
|
+
// build's prune drops it with the outputs it vouched for.
|
|
27
|
+
//
|
|
28
|
+
// **Nothing is remembered while an input's mtime is still within the timestamp granularity of now.**
|
|
29
|
+
// On a coarse-mtime volume (HFS+ 1 s, FAT/exFAT 2 s) a same-size edit landing in the tick the
|
|
30
|
+
// signature was taken in keeps that signature, so it would be remembered as verified and never hashed
|
|
31
|
+
// again. Once an mtime is older than the window any later write moves it, so only settled inputs are
|
|
32
|
+
// remembered; a launch inside the window simply hashes.
|
|
33
|
+
//
|
|
18
34
|
// This module is loaded by plain `node` on every hook launch (`scripts/hooks/hook-bundle-ready.ts`),
|
|
19
35
|
// so it imports `node:` built-ins and `#scripts/*` subpaths alone — nothing slow to load.
|
|
20
36
|
|
|
21
37
|
const STAMP_NAME = 'inputs.json'
|
|
38
|
+
const VERIFIED_NAME = '.inputs-verified.json'
|
|
22
39
|
const DIGEST_ALGORITHM = 'sha256'
|
|
23
40
|
const JSON_INDENT = '\t'
|
|
41
|
+
// The coarsest mtime resolution a remembered signature has to outlast (FAT/exFAT).
|
|
42
|
+
const MTIME_GRANULARITY_MS = 2000
|
|
24
43
|
|
|
25
44
|
interface HookBundleStamp {
|
|
26
45
|
digest: string
|
|
@@ -31,6 +50,20 @@ interface HookBundleStamp {
|
|
|
31
50
|
// Package-relative input path → the bytes the build read for it.
|
|
32
51
|
type HookSources = ReadonlyMap<string, Uint8Array>
|
|
33
52
|
|
|
53
|
+
// Package-relative input path → `<mtimeMs>:<size>`, as it stood when its bytes were hashed.
|
|
54
|
+
type InputSignatures = Record<string, string>
|
|
55
|
+
|
|
56
|
+
interface InputSnapshot {
|
|
57
|
+
signatures: InputSignatures
|
|
58
|
+
// False while any input's mtime is too recent to tell a later edit in the same tick apart.
|
|
59
|
+
is_settled: boolean
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface VerifiedDigest {
|
|
63
|
+
digest: string
|
|
64
|
+
signatures: InputSignatures
|
|
65
|
+
}
|
|
66
|
+
|
|
34
67
|
// Code-unit order, so the digest does not depend on the locale of the machine that computes it.
|
|
35
68
|
function by_code_unit(left: string, right: string): number {
|
|
36
69
|
if (left === right) return 0
|
|
@@ -95,17 +128,86 @@ function read_stamp(out_directory: string): HookBundleStamp | undefined {
|
|
|
95
128
|
return is_stamp(stamp) ? stamp : undefined
|
|
96
129
|
}
|
|
97
130
|
|
|
131
|
+
// Undefined when an input is gone, like `read_sources`.
|
|
132
|
+
function read_snapshot(
|
|
133
|
+
package_directory: string,
|
|
134
|
+
inputs: ReadonlyArray<string>,
|
|
135
|
+
): InputSnapshot | undefined {
|
|
136
|
+
const signatures: InputSignatures = {}
|
|
137
|
+
const settled_before = Date.now() - MTIME_GRANULARITY_MS
|
|
138
|
+
let is_settled = true
|
|
139
|
+
|
|
140
|
+
for (const input of inputs) {
|
|
141
|
+
const stats = statSync(path.join(package_directory, input), { throwIfNoEntry: false })
|
|
142
|
+
if (stats === undefined) return undefined
|
|
143
|
+
signatures[input] = `${String(stats.mtimeMs)}:${String(stats.size)}`
|
|
144
|
+
is_settled &&= stats.mtimeMs < settled_before
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return { signatures, is_settled }
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function read_verified(out_directory: string): Record<string, unknown> | undefined {
|
|
151
|
+
const verified_path = path.join(out_directory, VERIFIED_NAME)
|
|
152
|
+
if (!existsSync(verified_path)) return undefined
|
|
153
|
+
const verified = json_value.parse_or_undefined(readFileSync(verified_path, 'utf8'))
|
|
154
|
+
|
|
155
|
+
return json_value.is_record(verified) ? verified : undefined
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// True when `digest` was verified against inputs whose signatures are all still `signatures`.
|
|
159
|
+
function is_remembered(
|
|
160
|
+
out_directory: string,
|
|
161
|
+
digest: string,
|
|
162
|
+
signatures: InputSignatures,
|
|
163
|
+
): boolean {
|
|
164
|
+
const verified = read_verified(out_directory)
|
|
165
|
+
const remembered = verified?.['signatures']
|
|
166
|
+
if (verified?.['digest'] !== digest || !json_value.is_record(remembered)) return false
|
|
167
|
+
|
|
168
|
+
return Object.keys(signatures).every((input) => remembered[input] === signatures[input])
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Written through a rename so a concurrent launch never reads half a record. Best-effort: a tree that
|
|
172
|
+
// cannot be written is simply hashed again next time.
|
|
173
|
+
function remember(out_directory: string, verified: VerifiedDigest): void {
|
|
174
|
+
const temporary_path = path.join(out_directory, `${VERIFIED_NAME}.${String(process.pid)}`)
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
writeFileSync(temporary_path, JSON.stringify(verified))
|
|
178
|
+
renameSync(temporary_path, path.join(out_directory, VERIFIED_NAME))
|
|
179
|
+
} catch {
|
|
180
|
+
rmSync(temporary_path, { force: true })
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function is_digest_current(
|
|
185
|
+
out_directory: string,
|
|
186
|
+
package_directory: string,
|
|
187
|
+
stamp: HookBundleStamp,
|
|
188
|
+
{ signatures, is_settled }: InputSnapshot,
|
|
189
|
+
): boolean {
|
|
190
|
+
const sources = read_sources(package_directory, stamp.inputs)
|
|
191
|
+
if (sources === undefined || digest_of(sources) !== stamp.digest) return false
|
|
192
|
+
if (is_settled) remember(out_directory, { digest: stamp.digest, signatures })
|
|
193
|
+
|
|
194
|
+
return true
|
|
195
|
+
}
|
|
196
|
+
|
|
98
197
|
// Fresh only when the record exists, every output it lists is still there, and the listed inputs hash
|
|
99
|
-
// to the recorded digest — a missing or deleted input counts as stale.
|
|
198
|
+
// to the recorded digest — a missing or deleted input counts as stale. The hash is skipped when the
|
|
199
|
+
// inputs still carry the signatures of an earlier launch that verified this digest.
|
|
100
200
|
function is_fresh(out_directory: string, package_directory: string): boolean {
|
|
101
201
|
const stamp = read_stamp(out_directory)
|
|
102
202
|
if (!stamp?.outputs.every((output) => existsSync(path.join(out_directory, output)))) return false
|
|
103
|
-
const
|
|
203
|
+
const snapshot = read_snapshot(package_directory, stamp.inputs)
|
|
204
|
+
if (snapshot === undefined) return false
|
|
205
|
+
if (is_remembered(out_directory, stamp.digest, snapshot.signatures)) return true
|
|
104
206
|
|
|
105
|
-
return
|
|
207
|
+
return is_digest_current(out_directory, package_directory, stamp, snapshot)
|
|
106
208
|
}
|
|
107
209
|
|
|
108
|
-
const hook_bundle_stamp = { is_fresh, STAMP_NAME, stamp_text }
|
|
210
|
+
const hook_bundle_stamp = { is_fresh, STAMP_NAME, stamp_text, VERIFIED_NAME }
|
|
109
211
|
|
|
110
212
|
export type { HookSources }
|
|
111
213
|
export { hook_bundle_stamp }
|
|
@@ -25,7 +25,7 @@ function resolve_local_bin(project_root: string, bin_name: string): string {
|
|
|
25
25
|
|
|
26
26
|
// pnpm finds a shim by walking up from the working directory, so a caller that resolved only the
|
|
27
27
|
// directory it was invoked in would disagree with the very commands it spawns — `josh gate` typed
|
|
28
|
-
// in `src/lib` would miss the toolkit its sibling checks resolve fine
|
|
28
|
+
// in `src/lib` would miss the toolkit its sibling checks resolve fine.
|
|
29
29
|
// Ascending for the shim itself, rather than for a `package.json` first, is what keeps the two in
|
|
30
30
|
// step: a nested manifest that owns no `node_modules` is not where pnpm would stop either.
|
|
31
31
|
function find_local_bin_upwards(start_directory: string, bin_name: string): string | undefined {
|
|
@@ -58,7 +58,7 @@ function read_bin_entry(
|
|
|
58
58
|
// none in a consumer's tree — resolving it from this package's own directory finds it anyway. And
|
|
59
59
|
// pnpm's shim hardcodes the store path of the version present when it was written: after a bump the
|
|
60
60
|
// old store entry is pruned but the shim is not regenerated, so spawning it dies with
|
|
61
|
-
// MODULE_NOT_FOUND
|
|
61
|
+
// MODULE_NOT_FOUND. Returns the CLI entry to hand `process.execPath`, or
|
|
62
62
|
// nothing when the package, its `bin` field or the entry on disk is missing — every caller has a
|
|
63
63
|
// slower route to fall back to, so a failure here is never thrown.
|
|
64
64
|
// One constraint worth knowing before adding a caller: this reads the target's manifest through
|
|
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { cases, type Boundary } from './cases-logic'
|
|
4
4
|
|
|
5
5
|
// `josh cases <path...>` — print the I/O boundaries the changed paths cross and the abnormal cases
|
|
6
|
-
// each owes
|
|
6
|
+
// each owes. The boundary tokens go on stdout so `$(pnpm josh cases …)` reads
|
|
7
7
|
// them; the required cases go on stderr so a person sees them without a shell parsing around them.
|
|
8
8
|
// The logic and the vocabulary live in `cases-logic.ts`; everything here is the invocation.
|
|
9
9
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { file_reader } from '#scripts/lib/read-file'
|
|
2
2
|
|
|
3
|
-
// `josh cases <path
|
|
3
|
+
// `josh cases <path...>`: read the changed paths and answer which I/O
|
|
4
4
|
// boundaries the code crosses — network, process start, filesystem — then name the abnormal cases
|
|
5
5
|
// that boundary always owes. The unit suite blocks network by construction
|
|
6
6
|
// (`scripts/test/test-network-guard.ts`), so a boundary's abnormal cases never run there; this makes
|
|
@@ -50,7 +50,7 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
|
|
|
50
50
|
boundary: 'time',
|
|
51
51
|
// The absence boundary: a change that coordinates over time — timers, schedules, retries,
|
|
52
52
|
// heartbeats — owes the cases where the awaited thing never happens, which no diff of an I/O
|
|
53
|
-
// call can surface
|
|
53
|
+
// call can surface. Same over-firing discipline as process and fs: the
|
|
54
54
|
// verbs (`setInterval`, `schedule`, `retry`) require a call paren so prose like "schedule the
|
|
55
55
|
// release" no longer fires, while the domain nouns (`cron`, `heartbeat`, `watchdog`, `liveness`)
|
|
56
56
|
// are unambiguous enough in source to match bare.
|
|
@@ -3,8 +3,7 @@ import { existsSync, readdirSync } from 'node:fs'
|
|
|
3
3
|
// A local composite action is one directory under `.github/actions`, and GitHub resolves
|
|
4
4
|
// `uses: ./.github/actions/<name>` to that directory's `action.yml` (or `action.yaml`). Workflow
|
|
5
5
|
// scanners that read `.github/workflows` read these files too: `.github/actions/setup-pnpm` holds
|
|
6
|
-
// the pnpm/setup pin and the safe-chain installer pin kit's workflows used to carry inline
|
|
7
|
-
// (joshuafolkken/kit#2982).
|
|
6
|
+
// the pnpm/setup pin and the safe-chain installer pin kit's workflows used to carry inline.
|
|
8
7
|
const ACTIONS_DIRECTORY = '.github/actions'
|
|
9
8
|
const ACTION_FILE_NAMES = ['action.yml', 'action.yaml']
|
|
10
9
|
|
|
@@ -15,7 +15,7 @@ const CLASSIFICATION_SET: ReadonlySet<string> = new Set(CLASSIFICATION_LABELS)
|
|
|
15
15
|
const ISSUE_BUG_LABEL = 'bug'
|
|
16
16
|
// The line an Issue body declares its release classification with. A body written by a script
|
|
17
17
|
// (`josh propagate`'s upgrade issue) builds it with `declaration`, so the writer and this parser share
|
|
18
|
-
// one format
|
|
18
|
+
// one format.
|
|
19
19
|
const DECLARATION_PREFIX = '- リリース分類: '
|
|
20
20
|
const DECLARATION = new RegExp(`^${DECLARATION_PREFIX}(.+)$`, 'gmu')
|
|
21
21
|
const LEGACY_LABELS: ReadonlySet<string> = new Set(['semver-major', 'semver-minor'])
|
|
@@ -94,7 +94,7 @@ function select_issue_classification(issue_json: string): ReleaseClassification
|
|
|
94
94
|
// The labels as they stand when the check runs, not as the event carried them. `josh pr` opens the
|
|
95
95
|
// pull request and labels it in a second call, so the `opened` event carries none; judged from the
|
|
96
96
|
// payload, that run fails, and when it lands in the newer check suite GitHub keeps its red result —
|
|
97
|
-
// a rerun replays the same payload and fails again
|
|
97
|
+
// a rerun replays the same payload and fails again.
|
|
98
98
|
function fetch_current_labels(repository: string, pull_number: number): ReadonlyArray<string> {
|
|
99
99
|
const path = `repos/${repository}/issues/${String(pull_number)}/labels`
|
|
100
100
|
|
|
@@ -8,7 +8,7 @@ const WORKFLOW_DESTINATION_PATTERN = /(?:^|[/\\])\.github[/\\]workflows[/\\][^/\
|
|
|
8
8
|
|
|
9
9
|
// A local composite action is a workflow file too: it pins actions of its own, the distributed
|
|
10
10
|
// `dependabot.yml` bumps it (`/.github/actions/*`), and the next sync writes it back — so it needs
|
|
11
|
-
// the same pins and the same managed stamp as the workflow that calls it
|
|
11
|
+
// the same pins and the same managed stamp as the workflow that calls it.
|
|
12
12
|
const COMPOSITE_ACTION_DESTINATION_PATTERN =
|
|
13
13
|
/(?:^|[/\\])\.github[/\\]actions[/\\][^/\\]+[/\\]action\.ya?ml$/u
|
|
14
14
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Grouping fingerprints into clones, and classifying how far each clone spans
|
|
1
|
+
// Grouping fingerprints into clones, and classifying how far each clone spans.
|
|
2
2
|
//
|
|
3
3
|
// This is the pure core the `no-clones` rule was missing a measurement for: `sonarjs/no-identical-
|
|
4
4
|
// functions` sees only inside one file, and the rule's real target is duplication that crosses file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Fingerprint } from './clone-aggregate'
|
|
2
2
|
|
|
3
|
-
// Turning source text into fingerprints
|
|
3
|
+
// Turning source text into fingerprints.
|
|
4
4
|
//
|
|
5
5
|
// A fingerprint is a block of consecutive significant lines, each normalized so that reindentation
|
|
6
6
|
// and reflowed whitespace do not hide a copy. Blank lines and comment-only lines are dropped before
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { clone_scan } from './clone-scan'
|
|
4
4
|
|
|
5
|
-
// `josh clone:scan` — count duplication across files and repositories
|
|
5
|
+
// `josh clone:scan` — count duplication across files and repositories.
|
|
6
6
|
//
|
|
7
7
|
// A command rather than a paragraph, for the reason `josh repo:party` is one: the `no-clones` rule
|
|
8
8
|
// fires on the agent's own recognition that it is about to copy something, which is exactly the moment
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from './clone-aggregate'
|
|
10
10
|
import { clone_fingerprint } from './clone-fingerprint'
|
|
11
11
|
|
|
12
|
-
// Walking the source trees and reporting the clones
|
|
12
|
+
// Walking the source trees and reporting the clones.
|
|
13
13
|
//
|
|
14
14
|
// The current repository is always scanned; every first-party sibling `repo_discovery` finds —
|
|
15
15
|
// including the ones `JOSH_REPO_PATHS` adds — is scanned too, so a copy that crossed a package
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// `import` and tsconfig `extends` patches through `config_merge`, which exposes ensure + remove
|
|
4
4
|
// semantics for one YAML or JSON list field while preserving every other key, value, and ordering.
|
|
5
5
|
// JSON patches rewrite only the targeted field's own value, so comments, trailing commas and the
|
|
6
|
-
// consumer's hand-formatting elsewhere in the document survive
|
|
6
|
+
// consumer's hand-formatting elsewhere in the document survive.
|
|
7
7
|
import { json_list } from './patch-json-list'
|
|
8
8
|
import { yaml_list } from './patch-yaml-list'
|
|
9
9
|
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
// EXCEPT one case: prettier keeps a short array of primitives on a single line when it fits within
|
|
4
4
|
// printWidth, whereas JSON.stringify always expands every non-empty array. We post-process the
|
|
5
5
|
// stringify output, collapsing exactly those arrays back inline — reusing JSON.stringify for all
|
|
6
|
-
// string escaping, number formatting, and key ordering so we never diverge on those.
|
|
7
|
-
// joshuafolkken/kit#660 (a synced tsconfig `exclude` was emitted multi-line and failed prettier).
|
|
6
|
+
// string escaping, number formatting, and key ordering so we never diverge on those.
|
|
8
7
|
//
|
|
9
8
|
// Scope note: an OVER-width array is left one-element-per-line, which matches prettier for string
|
|
10
9
|
// arrays (the only kind these config files hold). prettier uses a packed "fill" layout only for
|
|
@@ -114,7 +113,6 @@ function format_json(value: unknown): string {
|
|
|
114
113
|
// own line regardless of printWidth — so the inlining above, correct everywhere else, produces a
|
|
115
114
|
// file the consumer's own `prettier --check` rejects. Plain `JSON.stringify` with tab indent is
|
|
116
115
|
// byte-for-byte what that printer emits, so the fix is to skip the inlining rather than model it.
|
|
117
|
-
// See joshuafolkken/kit#797.
|
|
118
116
|
function format_package_json(value: unknown): string {
|
|
119
117
|
return `${JSON.stringify(value, undefined, '\t')}\n`
|
|
120
118
|
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { findNodeAtLocation, getNodeValue, parseTree, type Node } from 'jsonc-parser'
|
|
2
|
+
import { json_format } from './json-format'
|
|
3
|
+
import { patch_json_key } from './patch-json-key'
|
|
4
|
+
|
|
5
|
+
type ElementMatcher = (element: unknown) => boolean
|
|
6
|
+
|
|
7
|
+
interface ElementUpsert {
|
|
8
|
+
key: string
|
|
9
|
+
value: unknown
|
|
10
|
+
is_target: ElementMatcher
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface ArraySite {
|
|
14
|
+
property: Node
|
|
15
|
+
elements: ReadonlyArray<Node>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// `format_json({ [key]: [value] })` opens with `{` and `\t"key": [`, and closes with `\t]`, `}` and
|
|
19
|
+
// the empty string after the final newline; every line between them is the element.
|
|
20
|
+
const PROBE_HEAD_LINES = 2
|
|
21
|
+
const PROBE_TAIL_LINES = 3
|
|
22
|
+
|
|
23
|
+
function element_nodes(array: Node | undefined): ReadonlyArray<Node> {
|
|
24
|
+
if (array?.type !== 'array') return []
|
|
25
|
+
|
|
26
|
+
return array.children ?? []
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// The top-level array `key` holds, when it has at least one element to anchor an edit to.
|
|
30
|
+
function find_array(content: string, key: string): ArraySite | undefined {
|
|
31
|
+
const root = parseTree(content)
|
|
32
|
+
const array = root === undefined ? undefined : findNodeAtLocation(root, [key])
|
|
33
|
+
const elements = element_nodes(array)
|
|
34
|
+
if (array?.parent === undefined || elements.length === 0) return undefined
|
|
35
|
+
|
|
36
|
+
return { property: array.parent, elements }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The element's text at the depth it occupies in the document — rendered inside a probe of the same
|
|
40
|
+
// shape, so prettier's printWidth decisions for its nested arrays are measured at that depth. The
|
|
41
|
+
// first line carries no indent: it is spliced in where the element's line already starts.
|
|
42
|
+
function render_element(content: string, site: ArraySite, upsert: ElementUpsert): string {
|
|
43
|
+
const lines = json_format.format_json({ [upsert.key]: [upsert.value] }).split('\n')
|
|
44
|
+
const text = lines.slice(PROBE_HEAD_LINES, -PROBE_TAIL_LINES).join('\n')
|
|
45
|
+
const unit = patch_json_key.line_indent(content, site.property.offset)
|
|
46
|
+
|
|
47
|
+
return patch_json_key.fit_value(content, text, unit).trimStart()
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function splice(content: string, node: Node, length: number, text: string): string {
|
|
51
|
+
return content.slice(0, node.offset) + text + content.slice(node.offset + length)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function append_element(content: string, last: Node, element_text: string): string {
|
|
55
|
+
const indent = patch_json_key.line_indent(content, last.offset)
|
|
56
|
+
const text = `,${patch_json_key.eol_of(content)}${indent}${element_text}`
|
|
57
|
+
const end = { ...last, offset: last.offset + last.length }
|
|
58
|
+
|
|
59
|
+
return splice(content, end, 0, text)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function is_equal(node: Node, value: unknown): boolean {
|
|
63
|
+
return JSON.stringify(getNodeValue(node)) === JSON.stringify(value)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function upsert_in(content: string, site: ArraySite, upsert: ElementUpsert): string {
|
|
67
|
+
const target = site.elements.find((element) => upsert.is_target(getNodeValue(element)))
|
|
68
|
+
if (target !== undefined && is_equal(target, upsert.value)) return content
|
|
69
|
+
const element_text = render_element(content, site, upsert)
|
|
70
|
+
if (target !== undefined) return splice(content, target, target.length, element_text)
|
|
71
|
+
const last = site.elements.at(-1)
|
|
72
|
+
|
|
73
|
+
return last === undefined ? content : append_element(content, last, element_text)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Replace the element `is_target` picks with `value`, or append `value` when none matches — touching
|
|
77
|
+
// only that one element's text. Rewriting the whole array, as `set_json_key` does, would drop every
|
|
78
|
+
// comment and hand-layout inside the elements the consumer owns. An element
|
|
79
|
+
// already equal to `value` is left byte-for-byte as authored; an absent or empty array is created.
|
|
80
|
+
function upsert_element(content: string, upsert: ElementUpsert): string {
|
|
81
|
+
const site = find_array(content, upsert.key)
|
|
82
|
+
if (site === undefined) return patch_json_key.set_json_key(content, upsert.key, [upsert.value])
|
|
83
|
+
|
|
84
|
+
return upsert_in(content, site, upsert)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const patch_json_array = { upsert_element }
|
|
88
|
+
|
|
89
|
+
export type { ElementMatcher, ElementUpsert }
|
|
90
|
+
export { patch_json_array }
|
|
@@ -14,14 +14,14 @@ import { json_format } from './json-format'
|
|
|
14
14
|
// tolerant JSONC parse and write the whole file back from the parsed object, which silently deleted
|
|
15
15
|
// the consumer's comments — including the `// Path aliases are handled by ...` block `sv create`
|
|
16
16
|
// ships. Editing text in place instead keeps comments, trailing commas, key order and any
|
|
17
|
-
// hand-formatting outside the one value being changed.
|
|
17
|
+
// hand-formatting outside the one value being changed.
|
|
18
18
|
//
|
|
19
19
|
// jsonc-parser is used ONLY to locate text, never to produce it. Two independent reasons:
|
|
20
20
|
//
|
|
21
21
|
// 1. Its formatter breaks every array one element per line regardless of width — the layout
|
|
22
22
|
// prettier wants for `package.json`, and the opposite of what it wants for the files edited
|
|
23
|
-
// here, where the `json` printer keeps a short array inline. Letting it render would
|
|
24
|
-
//
|
|
23
|
+
// here, where the `json` printer keeps a short array inline. Letting it render would fail
|
|
24
|
+
// `prettier --check` on the rewritten file.
|
|
25
25
|
// 2. `modify` with `formattingOptions` reformats a region around its edit, not just the edit —
|
|
26
26
|
// removing `compilerOptions` from a document also expanded the untouched `extends` array above
|
|
27
27
|
// it. Dropping `formattingOptions` avoids that but then places inserted keys with no newline or
|
|
@@ -441,6 +441,9 @@ const patch_json_key = {
|
|
|
441
441
|
set_json_key,
|
|
442
442
|
remove_json_key,
|
|
443
443
|
remove_json_path,
|
|
444
|
+
eol_of,
|
|
445
|
+
fit_value,
|
|
446
|
+
line_indent,
|
|
444
447
|
}
|
|
445
448
|
|
|
446
449
|
export { patch_json_key }
|
|
@@ -20,7 +20,7 @@ function normalize_list(value: unknown): ReadonlyArray<string> {
|
|
|
20
20
|
// Ensure/remove the entries of one JSON list field, preserving every other key. A present field
|
|
21
21
|
// keeps its position; a new field is appended last. Returns the input unchanged when nothing is
|
|
22
22
|
// added or removed, so re-runs are idempotent. Only the field's own value is rewritten, so comments
|
|
23
|
-
// and formatting elsewhere in the document survive
|
|
23
|
+
// and formatting elsewhere in the document survive.
|
|
24
24
|
function patch_json_list_field(content: string, options: PatchJsonListOptions): string {
|
|
25
25
|
const parsed = parse_jsonc(content)
|
|
26
26
|
const existing = normalize_list(parsed[options.field])
|
|
@@ -28,7 +28,7 @@ function same_project(cwd: string, target: string): boolean {
|
|
|
28
28
|
return cost_transcript.session_cwd(cwd) === cost_transcript.session_cwd(target)
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
// The billed input each request paid, oldest first
|
|
31
|
+
// The billed input each request paid, oldest first. Each `token_count`
|
|
32
32
|
// event carries `last_token_usage` — that request's own input — so the per-request sequence the
|
|
33
33
|
// hand-off's recent window reads is those deltas, not a cumulative-total difference. A session
|
|
34
34
|
// resumed with inherited context is excluded for free: the inherited tokens are in the cumulative
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cost_pricing } from './cost-pricing'
|
|
2
2
|
|
|
3
|
-
// **When a context cut pays back, priced from the cost model rather than fixed at a ceiling
|
|
4
|
-
//
|
|
3
|
+
// **When a context cut pays back, priced from the cost model rather than fixed at a ceiling**.
|
|
4
|
+
// A cut ends the oversized session and relaunches a fresh one that rebuilds
|
|
5
5
|
// only its preamble, so what it saves is not decided by a ceiling on the accumulated context but by a
|
|
6
6
|
// *rate*: a cache read bills the whole context on every request, so whether to cut turns on how many
|
|
7
7
|
// requests are still to come and what each would pay, not on how much has piled up.
|
|
@@ -21,9 +21,8 @@ const POST_CUT_CONTEXT = 60_000
|
|
|
21
21
|
// The requests a resumed session is expected to still run — the horizon the break-even is measured
|
|
22
22
|
// against. A cut only pays if enough requests remain to recoup the preamble rewrite; even the shortest
|
|
23
23
|
// resume (into the gate, commit, PR and merge) runs on the order of ten. Ten is the conservative
|
|
24
|
-
// horizon: it keeps the shared threshold near
|
|
25
|
-
//
|
|
26
|
-
// the cost model. It is the knob a before/after lane measurement tunes.
|
|
24
|
+
// horizon: it keeps the shared threshold near the empirically validated 150_000 (this lands at
|
|
25
|
+
// 135_000, inside the simulated 100k–200k band) while pricing the decision from the cost model. It is the knob a before/after lane measurement tunes.
|
|
27
26
|
const EXPECTED_REMAINING_REQUESTS = 10
|
|
28
27
|
|
|
29
28
|
// The price of a dropped token relative to a rewritten one, from `cost-pricing.ts`. A cache read bills
|
|
@@ -2,12 +2,10 @@ import { context_cut_payback } from './context-cut-payback'
|
|
|
2
2
|
|
|
3
3
|
// The scheduler entry/hand-off and lane worker implementation cut use one threshold. Keeping the
|
|
4
4
|
// value here prevents either side from drifting when the context budget changes.
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// 10% under #2374's empirical 150_000 and inside the 100k–200k band that PR simulated — now derived
|
|
10
|
-
// from the cache-price multipliers and the horizon rather than restated, so it moves with the model.
|
|
5
|
+
// The threshold is a break-even, not a chosen number: the current per-request context at which a
|
|
6
|
+
// cut pays back over the expected remaining requests (`context-cut-payback.ts`). At
|
|
7
|
+
// `POST_CUT_CONTEXT` 60_000 and a 10-request horizon that is 135_000, derived from the cache-price
|
|
8
|
+
// multipliers and the horizon rather than restated, so it moves with the model.
|
|
11
9
|
const CONTEXT_CUT_THRESHOLD = context_cut_payback.break_even_context()
|
|
12
10
|
|
|
13
11
|
export { CONTEXT_CUT_THRESHOLD }
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { UsageRecord } from './cost-usage'
|
|
2
2
|
|
|
3
|
-
// Which Issue a request belongs to
|
|
3
|
+
// Which Issue a request belongs to.
|
|
4
4
|
//
|
|
5
5
|
// **The walk is keyed on the branch and nothing else**, which is why its input is `BranchBearing`
|
|
6
|
-
// rather than `UsageRecord
|
|
6
|
+
// rather than `UsageRecord`. `josh time` attributes *spans* to an issue by
|
|
7
7
|
// exactly this rule, and the alternative to widening the parameter was a second copy of the
|
|
8
8
|
// fill-forward walk over a different element type — the clone `CLAUDE.md` prohibits, in the one
|
|
9
9
|
// place where a drift between the two would make `josh cost --issue` and `josh time --issue`
|
|
@@ -28,7 +28,7 @@ const UNATTRIBUTED_KEY = -1
|
|
|
28
28
|
|
|
29
29
|
// Everything the attribution reads. `UsageRecord` satisfies it, and so does a timed span.
|
|
30
30
|
//
|
|
31
|
-
// **`issue` is the branch's answer where the branch cannot give one
|
|
31
|
+
// **`issue` is the branch's answer where the branch cannot give one**. The
|
|
32
32
|
// paragraph above assumes the session and the work share a checkout, and under lanes they do not: a
|
|
33
33
|
// child's commands run in a linked work tree on `<N>-lane` while the session writing the transcript
|
|
34
34
|
// sits on the default branch, so every line of a lane run reads `gitBranch: "main"` and no fill
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { json_value } from '#scripts/lib/json-value'
|
|
2
2
|
import { z } from 'zod'
|
|
3
3
|
|
|
4
|
-
// Reading the content blocks out of a session transcript
|
|
4
|
+
// Reading the content blocks out of a session transcript.
|
|
5
5
|
//
|
|
6
6
|
// `cost-usage.ts` reads the same file for what each request was billed and skips everything else.
|
|
7
7
|
// This module reads the other half: what the conversation is actually made of. They stay apart
|
|
@@ -43,9 +43,8 @@ const BASH_TOOL = 'Bash'
|
|
|
43
43
|
const COMMAND_KEY = 'command'
|
|
44
44
|
|
|
45
45
|
// One block, reduced to what a token estimate needs. `command` is split out from the rest of a Bash
|
|
46
|
-
// tool_use's input because the command body is
|
|
47
|
-
//
|
|
48
|
-
// input it would not be readable at all.
|
|
46
|
+
// tool_use's input because the command body is a large, separately measured share of a run's
|
|
47
|
+
// context — folded into the rest of the input it would not be readable at all.
|
|
49
48
|
interface ContentBlock {
|
|
50
49
|
type: string
|
|
51
50
|
tool_name: string
|
|
@@ -12,7 +12,7 @@ import { own_session } from './own-session'
|
|
|
12
12
|
import { transcript_cwd } from './transcript-cwd'
|
|
13
13
|
|
|
14
14
|
// `josh cost` — what the next turn of a run will cost, read from the active provider's own session
|
|
15
|
-
// usage
|
|
15
|
+
// usage.
|
|
16
16
|
//
|
|
17
17
|
// Since #2016 this is the `--over` hand-off verdict alone. The readerless report scopes
|
|
18
18
|
// (`--session` / `--issue` / `--all` / `--run` / `--json`) and the `--cap` counterfactual were
|
|
@@ -32,7 +32,7 @@ type CostVerdict = ReturnType<typeof cost_verdict.classify> | typeof UNMEASURABL
|
|
|
32
32
|
interface Options {
|
|
33
33
|
over?: number
|
|
34
34
|
// The target project whose transcripts to read, or absent for this process's own working
|
|
35
|
-
// directory
|
|
35
|
+
// directory. From the kit checkout, `--path <dir>` reads another
|
|
36
36
|
// project's cost.
|
|
37
37
|
path?: string
|
|
38
38
|
}
|
|
@@ -110,7 +110,7 @@ function parse_options(argv: ReadonlyArray<string>): Options | undefined {
|
|
|
110
110
|
|
|
111
111
|
// An empty corpus is reported, never priced at zero. "No transcript was found" and "this run was
|
|
112
112
|
// free" are different answers, and only one of them is ever true. `session_id` names the session the
|
|
113
|
-
// environment pointed at when its transcript is the one absent
|
|
113
|
+
// environment pointed at when its transcript is the one absent, so the
|
|
114
114
|
// message says "No transcript named <id>" rather than the whole-corpus "No transcripts found". The
|
|
115
115
|
// wording is `cost_transcript`'s, so `josh time` says the same thing about the same directory.
|
|
116
116
|
function report_empty(cwd: string, session_id: string | undefined): number {
|
|
@@ -121,14 +121,17 @@ function report_empty(cwd: string, session_id: string | undefined): number {
|
|
|
121
121
|
return FAILURE_EXIT_CODE
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
// The provider of this process's own session. A defaulted provider is no session at all: a launch may
|
|
125
|
+
// default to Claude Code, but pricing here would measure the newest transcript of some other session.
|
|
124
126
|
function provider_of(environment: Environment): AgentProvider | undefined {
|
|
125
127
|
const resolved = agent_role_profile.resolve_provider(environment)
|
|
128
|
+
if (resolved.kind !== 'provider' || resolved.is_default === true) return undefined
|
|
126
129
|
|
|
127
|
-
return resolved.
|
|
130
|
+
return resolved.provider
|
|
128
131
|
}
|
|
129
132
|
|
|
130
133
|
// The own-session measurement, and — when there is none — which of the two "nothing to measure"
|
|
131
|
-
// answers it is
|
|
134
|
+
// answers it is. `absent`: the environment named a session whose transcript
|
|
132
135
|
// is not in this corpus, reported by that name and never measured as another session's newest file.
|
|
133
136
|
// `empty`: no transcript at all. `measured` still carries a session that exists but billed nothing,
|
|
134
137
|
// which `report_over` reports as "no requests" — a third, distinct answer.
|
|
@@ -200,7 +203,7 @@ function measure(
|
|
|
200
203
|
// `--over` for the anthropic provider: measured → the verdict; `absent` → the named session's
|
|
201
204
|
// missing message; `empty` → the whole-corpus missing message. A measured session that billed
|
|
202
205
|
// nothing falls to `report_over`'s "no requests", which keeps a 0-request transcript distinct from a
|
|
203
|
-
// transcript that is not there at all
|
|
206
|
+
// transcript that is not there at all.
|
|
204
207
|
function run_over_anthropic(own: OwnMeasurement, target: string, limit: number): number {
|
|
205
208
|
if (own.kind === 'measured') return cost_verdict.report_over(own.measurement, limit)
|
|
206
209
|
|
|
@@ -217,7 +220,7 @@ function run_over_codex(target: string, limit: number, environment: Environment)
|
|
|
217
220
|
}
|
|
218
221
|
|
|
219
222
|
// `--over`: what the next turn of this session will cost, read from the session's own transcript
|
|
220
|
-
// alone — identified by id, not by mtime
|
|
223
|
+
// alone — identified by id, not by mtime.
|
|
221
224
|
function run_over(
|
|
222
225
|
target: string,
|
|
223
226
|
limit: number,
|
|
@@ -241,7 +244,7 @@ function verdict_of(measurement: OverMeasurement | undefined): CostVerdict {
|
|
|
241
244
|
return cost_verdict.classify(measurement, CONTEXT_CUT_THRESHOLD)
|
|
242
245
|
}
|
|
243
246
|
|
|
244
|
-
// The `--cut` verdict as a value, printing nothing
|
|
247
|
+
// The `--cut` verdict as a value, printing nothing. `run:status` bundles
|
|
245
248
|
// this beside the issue state and the carry record, so it needs the token rather than the exit code
|
|
246
249
|
// `run` returns. `unmeasurable` is the read-only counterpart of `report_empty` / the empty-session
|
|
247
250
|
// error: a session with no provider, no transcript of its own, or no request cannot be priced, and
|
|
@@ -269,8 +272,8 @@ function run_context(
|
|
|
269
272
|
}
|
|
270
273
|
|
|
271
274
|
// This process's own working directory, kept as-is: from a lane the transcript search covers the
|
|
272
|
-
// lane's own slug alone
|
|
273
|
-
// would drop the lane's own slug and hide a dispatched child's transcript
|
|
275
|
+
// lane's own slug alone, so pre-rewriting the cwd to the main checkout here
|
|
276
|
+
// would drop the lane's own slug and hide a dispatched child's transcript.
|
|
274
277
|
// `time-cli.ts` gives the same reason.
|
|
275
278
|
function run(
|
|
276
279
|
argv: ReadonlyArray<string>,
|
|
@@ -285,7 +288,7 @@ function run(
|
|
|
285
288
|
return FAILURE_EXIT_CODE
|
|
286
289
|
}
|
|
287
290
|
|
|
288
|
-
// `--path <dir>` reads the target project instead of the process cwd
|
|
291
|
+
// `--path <dir>` reads the target project instead of the process cwd.
|
|
289
292
|
const target = transcript_cwd.resolve(context.path, cwd)
|
|
290
293
|
if (reject_openai_cross_project(context, target, cwd)) return FAILURE_EXIT_CODE
|
|
291
294
|
|