@joshuafolkken/kit 1.1240.0 → 1.1373.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 +52 -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 +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- 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-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- 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-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- 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 +195 -181
- 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 +282 -95
- 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 +17 -11
- 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 +30 -5
- 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 +21 -7
- 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/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -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 +6 -7
- 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 +26 -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 +64 -18
- package/scripts/run/run-step.ts +107 -51
- 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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// strong signals: the two issues citing each other in prose, or a `blocked-by` recorded between them.
|
|
5
5
|
// Neither reaches a draft — it has no number, so nothing can cite it and nothing can be recorded
|
|
6
6
|
// against it — and the question a filing entry actually asks first is a different one: has somebody
|
|
7
|
-
// already filed this?
|
|
7
|
+
// already filed this?
|
|
8
8
|
//
|
|
9
9
|
// So this is a second signal rather than a change to that threshold. `epic:bundle` deliberately
|
|
10
10
|
// refuses title resemblance as grounds for *bundling*, because "related" expands without limit; the
|
|
@@ -95,8 +95,8 @@ interface ScoutIssue {
|
|
|
95
95
|
// already filed as #<E>", and the caller is sent to run an epic that has no implementation of its
|
|
96
96
|
// own. `epic_bundle.is_strong_signal` excludes them from the other half for the same reason.
|
|
97
97
|
is_epic?: boolean
|
|
98
|
-
// A closed issue is a candidate, and the two are not interchangeable to whoever reads the list
|
|
99
|
-
//
|
|
98
|
+
// A closed issue is a candidate, and the two are not interchangeable to whoever reads the list:
|
|
99
|
+
// an open one says "somebody is already tracking this", a closed one
|
|
100
100
|
// says "this may already be done". So the state travels with the row rather than being inferred
|
|
101
101
|
// from which listing it came out of, which the ranking mixes together.
|
|
102
102
|
is_closed?: boolean
|
|
@@ -210,8 +210,7 @@ function compare_candidates(left: DuplicateCandidate, right: DuplicateCandidate)
|
|
|
210
210
|
//
|
|
211
211
|
// Every row is scored — no prefix, no early exit. The issue this search exists to catch is the one
|
|
212
212
|
// another session filed minutes ago, and where that one sits in the listing is the single thing
|
|
213
|
-
// nobody controls
|
|
214
|
-
// well as open, and the two rank together: a run about to file has to be shown the strongest match
|
|
213
|
+
// nobody controls. The rows may be closed as well as open, and the two rank together: a run about to file has to be shown the strongest match
|
|
215
214
|
// there is, and which listing it came out of says nothing about how well it matches.
|
|
216
215
|
function find_duplicates(
|
|
217
216
|
title: string,
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
5
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
5
6
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
6
7
|
import { issue_report_failures, type ReadFailureKind } from './issue-report-failures'
|
|
7
8
|
import { issue_state, type IssueState } from './issue-state'
|
|
8
9
|
|
|
9
10
|
// `josh issue:state <N> [<N> ...]` — print each issue's state and labels, in the spelling the
|
|
10
|
-
// documents compare against
|
|
11
|
-
// joshuafolkken/kit#1302).
|
|
11
|
+
// documents compare against, several numbers in one call.
|
|
12
12
|
//
|
|
13
13
|
// The numbers are read concurrently and reported together because the callers that need more than
|
|
14
14
|
// one need them all: `diag`'s ranking table reads a state per row, and one process start plus one
|
|
@@ -29,7 +29,6 @@ import { issue_state, type IssueState } from './issue-state'
|
|
|
29
29
|
|
|
30
30
|
const FAILURE_EXIT_CODE = 1
|
|
31
31
|
const ARGV_OFFSET = 2
|
|
32
|
-
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
33
32
|
const USAGE = 'Usage: josh issue:state <issue-number> [<issue-number> ...] [--repo <owner/repo>]'
|
|
34
33
|
// A blank line between the blocks of a multi-number report, so a person sees where one issue ends
|
|
35
34
|
// while a reader matching `issue: ` still finds each block by its first line.
|
|
@@ -49,7 +48,7 @@ interface StateRequest {
|
|
|
49
48
|
}
|
|
50
49
|
|
|
51
50
|
// One issue's state, or the failure kind. Named for export because `run:prep` reads the state beside
|
|
52
|
-
// the body and the dependency-update scope
|
|
51
|
+
// the body and the dependency-update scope, reusing this read rather than a
|
|
53
52
|
// second one that would drift from the `human_review` decision `parse_issue_state` owns.
|
|
54
53
|
type StateRead = { kind: 'state'; state: IssueState } | { kind: ReadFailureKind }
|
|
55
54
|
|
|
@@ -59,10 +58,9 @@ interface IssueReport {
|
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
// The read goes through `cli_flags`, both spellings gh itself accepts included (`--repo owner/repo`,
|
|
62
|
-
// `--repo=owner/repo`), and is strict
|
|
63
|
-
// call: `--rep=owner/repo`
|
|
64
|
-
//
|
|
65
|
-
// that number (joshuafolkken/kit#1355).
|
|
61
|
+
// `--repo=owner/repo`), and is strict. An unrecognized flag refuses the
|
|
62
|
+
// call: discarding `--rep=owner/repo` for starting with a dash would fall back to the session's
|
|
63
|
+
// repository and print a confident state for a *different* repository's issue of that number.
|
|
66
64
|
const OPTIONS = { repo: { type: 'string', multiple: true } } as const
|
|
67
65
|
|
|
68
66
|
// `absent` and "given but with nothing usable" are different answers. Falling back to the session's
|
|
@@ -81,7 +79,8 @@ function read_repo(given: ReadonlyArray<string> | undefined): { repo?: string }
|
|
|
81
79
|
// unanswered. `#1262` copied out of a `diag` table is exactly that token.
|
|
82
80
|
function is_issue_numbers(positionals: ReadonlyArray<string>): boolean {
|
|
83
81
|
return (
|
|
84
|
-
positionals.length > 0 &&
|
|
82
|
+
positionals.length > 0 &&
|
|
83
|
+
positionals.every((argument) => issue_number_shape.is_issue_number(argument))
|
|
85
84
|
)
|
|
86
85
|
}
|
|
87
86
|
|
|
@@ -167,7 +166,15 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
167
166
|
process.exitCode = await run(argv)
|
|
168
167
|
}
|
|
169
168
|
|
|
170
|
-
const issue_state_cli = {
|
|
169
|
+
const issue_state_cli = {
|
|
170
|
+
READ_CONCURRENCY,
|
|
171
|
+
STATE_FIELDS,
|
|
172
|
+
USAGE,
|
|
173
|
+
main,
|
|
174
|
+
parse_request,
|
|
175
|
+
read_issue,
|
|
176
|
+
run,
|
|
177
|
+
}
|
|
171
178
|
|
|
172
179
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
173
180
|
|
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
2
2
|
import { z } from 'zod'
|
|
3
3
|
import { has_any_label, NEEDS_HUMAN_REVIEW_LABEL } from './issue-labels'
|
|
4
4
|
|
|
5
5
|
// The answer `josh issue:state` prints, kept apart from the reading and the printing so the shape of
|
|
6
|
-
// the report is decided by one pure function
|
|
6
|
+
// the report is decided by one pure function.
|
|
7
7
|
//
|
|
8
|
-
// The command exists because the *instructions*
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// through a command keeps that rule in the one place joshuafolkken/kit#1024 put it.
|
|
8
|
+
// The command exists because the *instructions* need one. `gh issue view <N> --json state` goes over
|
|
9
|
+
// GraphQL — which a cloud session is refused (403). The REST endpoint is served normally, but it
|
|
10
|
+
// reports `open` / `closed` in lower case, so writing the REST call into the documents would copy the
|
|
11
|
+
// casing rule out of `git-gh-rest-state.ts` and into prose. Routing the instruction through a command
|
|
12
|
+
// keeps that rule in one place.
|
|
14
13
|
|
|
15
14
|
const NO_LABELS = '(none)'
|
|
16
15
|
const LABEL_SEPARATOR = ', '
|
|
17
16
|
const STATE_LABEL = 'state: '
|
|
18
17
|
const LABELS_LABEL = 'labels: '
|
|
19
18
|
// Whether this issue is one a run must stop on before committing. Printed as its own line rather than
|
|
20
|
-
// left to a reader matching `needs-human-review` against the `labels:` line above
|
|
21
|
-
//
|
|
19
|
+
// left to a reader matching `needs-human-review` against the `labels:` line above:
|
|
20
|
+
// GitHub keeps the spelling a label was created with and treats
|
|
22
21
|
// `Needs-Human-Review` as the same label, so an eye comparing against the lowercase string misses it —
|
|
23
22
|
// and a missed one is a run that does not stop and an artifact that ships, which is the whole thing
|
|
24
23
|
// the label exists to prevent. Every other workflow label already reaches its decision through
|
|
@@ -26,8 +25,8 @@ const LABELS_LABEL = 'labels: '
|
|
|
26
25
|
const HUMAN_REVIEW_LABEL_LINE = 'human_review: '
|
|
27
26
|
const YES = 'yes'
|
|
28
27
|
const NO = 'no'
|
|
29
|
-
// The number a block belongs to, printed above it when several were asked for
|
|
30
|
-
//
|
|
28
|
+
// The number a block belongs to, printed above it when several were asked for.
|
|
29
|
+
// A block carries its own number rather than being matched by position,
|
|
31
30
|
// because a batch read drops the numbers that resolve to nothing — a `diag` table mixes closed
|
|
32
31
|
// issues and numbers that never existed — and a positional reading then attributes every block
|
|
33
32
|
// after the gap to the wrong issue.
|
|
@@ -58,7 +57,7 @@ interface IssueState {
|
|
|
58
57
|
// the same answer, because printing either as a state is what this command exists to prevent.
|
|
59
58
|
function parse_issue_state(json: string): IssueState | undefined {
|
|
60
59
|
try {
|
|
61
|
-
const parsed =
|
|
60
|
+
const parsed = parse_json_object_or_undefined(json, issue_state_schema)
|
|
62
61
|
|
|
63
62
|
if (parsed === undefined) return undefined
|
|
64
63
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { delivered_rules } from '#scripts/rules/delivered-rules'
|
|
2
1
|
import { INTERRUPT_ROUTE_LABEL, SPLIT_ROUTE_LABEL, TIER_A_ROUTE_LABEL } from './issue-labels'
|
|
3
2
|
|
|
4
|
-
// The WIP cap at the call that files
|
|
5
|
-
//
|
|
6
|
-
// the exemption question before anything is sent, the same hold `--distinct` places on a duplicate.
|
|
3
|
+
// The WIP cap at the call that files. `josh issue:file` reads the count and asks the exemption
|
|
4
|
+
// question before anything is sent, the same hold `--distinct` places on a duplicate.
|
|
7
5
|
// What stays judgement — whether a filing is exempt — is declared by the route or by `--over-cap`.
|
|
8
6
|
|
|
7
|
+
// `WIP_CAP` is the number's single source; `wip-cap.md` states it once and a test pins the two equal.
|
|
8
|
+
const WIP_CAP = 30
|
|
9
9
|
const WITHIN = 'within'
|
|
10
10
|
const EXEMPT = 'exempt'
|
|
11
11
|
const HELD = 'held' as const
|
|
@@ -43,13 +43,13 @@ function is_exempt(filing: WipFiling): boolean {
|
|
|
43
43
|
|
|
44
44
|
// The cap is "more than `WIP_CAP` open", so exactly the cap is still within it.
|
|
45
45
|
function verdict_of(count: number, filing: WipFiling): WipVerdict {
|
|
46
|
-
if (count <=
|
|
46
|
+
if (count <= WIP_CAP) return WITHIN
|
|
47
47
|
|
|
48
48
|
return is_exempt(filing) ? EXEMPT : HELD
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
function count_line(count: number, repo: string, verdict: WipVerdict): string {
|
|
52
|
-
return `wip: ${String(count)} open in ${repo} · cap ${String(
|
|
52
|
+
return `wip: ${String(count)} open in ${repo} · cap ${String(WIP_CAP)} · ${verdict}`
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
// The listing's JSON is an array of rows; anything else is unreadable rather than zero, because zero
|
|
@@ -64,7 +64,7 @@ function count_of(json: string): number | undefined {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
const issue_wip = { HELD, HELD_MESSAGE, UNREAD_MESSAGE, verdict_of, count_line, count_of }
|
|
67
|
+
const issue_wip = { WIP_CAP, HELD, HELD_MESSAGE, UNREAD_MESSAGE, verdict_of, count_line, count_of }
|
|
68
68
|
|
|
69
69
|
export type { WipVerdict }
|
|
70
70
|
export { issue_wip }
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// The body lines that sit under one `## heading`, up to the next `## heading` or the end
|
|
2
|
-
//
|
|
1
|
+
// The body lines that sit under one `## heading`, up to the next `## heading` or the end.
|
|
2
|
+
// Both the firing-point check and the baseline parser read a section this
|
|
3
3
|
// way, so the slicing lives in one place rather than being written twice.
|
|
4
4
|
|
|
5
5
|
const HEADING_PREFIX = '## '
|
|
@@ -54,7 +54,7 @@ function has_line(body: string, text: string): boolean {
|
|
|
54
54
|
|
|
55
55
|
// The lines between the first unfenced line `is_target` accepts and the next unfenced `## ` heading,
|
|
56
56
|
// trimmed of the heading line itself; an empty array when no line is accepted. A `## ` line inside a
|
|
57
|
-
// code fence is example text, so it neither opens nor closes a section
|
|
57
|
+
// code fence is example text, so it neither opens nor closes a section.
|
|
58
58
|
function section_lines_matching(
|
|
59
59
|
body: string,
|
|
60
60
|
is_target: (line: string) => boolean,
|
|
@@ -2,18 +2,20 @@
|
|
|
2
2
|
import { execSync } from 'node:child_process'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
4
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
5
|
-
import {
|
|
5
|
+
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
6
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
6
7
|
import { error_text } from '#scripts/lib/error-message'
|
|
7
8
|
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
8
9
|
import { z } from 'zod'
|
|
9
10
|
import { baseline_measure, type Baseline } from './baseline-measure'
|
|
11
|
+
import { session_cite } from './session-cite'
|
|
10
12
|
|
|
11
13
|
// `josh measure:rerun <N>` — read a behavior-change Issue body after merge, re-run each baseline
|
|
12
|
-
// command, and print the before/after pair
|
|
14
|
+
// command, and print the before/after pair. A value that did not move means
|
|
13
15
|
// the premise the rule rested on is refuted, so a line is appended to the observation ledger — reusing
|
|
14
16
|
// that append-only, same-key mechanism rather than a second one.
|
|
15
17
|
//
|
|
16
|
-
// **The baseline is shell, and the body is written by whoever filed the Issue
|
|
18
|
+
// **The baseline is shell, and the body is written by whoever filed the Issue**.
|
|
17
19
|
// A baseline needs pipes and loops (`git log … | wc -l`, `for d in $(ls …)`), so an allow-list of
|
|
18
20
|
// commands cannot make it safe; what can is who wrote it. The input is therefore the Issue number, not
|
|
19
21
|
// a file, so the author's `author_association` arrives with the body from the same REST read, and only
|
|
@@ -21,7 +23,6 @@ import { baseline_measure, type Baseline } from './baseline-measure'
|
|
|
21
23
|
|
|
22
24
|
const FAILURE_EXIT_CODE = 1
|
|
23
25
|
const ARGV_OFFSET = 2
|
|
24
|
-
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
25
26
|
const ISSUE_FIELDS = 'body,author_association'
|
|
26
27
|
const TRUSTED_ASSOCIATIONS: ReadonlySet<string> = new Set(['OWNER', 'MEMBER', 'COLLABORATOR'])
|
|
27
28
|
const TRUSTED_LIST = [...TRUSTED_ASSOCIATIONS].join(' / ')
|
|
@@ -71,7 +72,7 @@ async function append_ledger(lines: ReadonlyArray<string>, now: Date): Promise<v
|
|
|
71
72
|
if (lines.length === 0) return
|
|
72
73
|
|
|
73
74
|
// The running work tree's file for the checked-out issue, a lane's inside a lane — the run's own
|
|
74
|
-
// commit carries it
|
|
75
|
+
// commit carries it.
|
|
75
76
|
const ledger_path = await observation_ledger_home.writer_path(now)
|
|
76
77
|
|
|
77
78
|
await observation_ledger_home.append(ledger_path, lines)
|
|
@@ -85,7 +86,7 @@ function today(now: Date): string {
|
|
|
85
86
|
async function read_issue(issue_number: string): Promise<IssueFields | undefined> {
|
|
86
87
|
const json = await git_gh_issue_read.issue_view_json(issue_number, ISSUE_FIELDS)
|
|
87
88
|
|
|
88
|
-
return json === undefined ? undefined :
|
|
89
|
+
return json === undefined ? undefined : parse_json_object_or_undefined(json, issue_schema)
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
// The body, only when its author can write to the repository. A read that fails is refused as well:
|
|
@@ -94,7 +95,7 @@ async function read_trusted_body(issue_number: string): Promise<BodyRead> {
|
|
|
94
95
|
const issue = await read_issue(issue_number)
|
|
95
96
|
|
|
96
97
|
if (issue === undefined) {
|
|
97
|
-
return { kind: 'refused', reason: `could not read issue
|
|
98
|
+
return { kind: 'refused', reason: `could not read issue ${session_cite.issue(issue_number)}` }
|
|
98
99
|
}
|
|
99
100
|
|
|
100
101
|
const association = issue.author_association ?? UNKNOWN_ASSOCIATION
|
|
@@ -102,7 +103,7 @@ async function read_trusted_body(issue_number: string): Promise<BodyRead> {
|
|
|
102
103
|
if (!TRUSTED_ASSOCIATIONS.has(association)) {
|
|
103
104
|
return {
|
|
104
105
|
kind: 'refused',
|
|
105
|
-
reason: `refusing to run the baseline of
|
|
106
|
+
reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author is ${association}, not ${TRUSTED_LIST}`,
|
|
106
107
|
}
|
|
107
108
|
}
|
|
108
109
|
|
|
@@ -130,7 +131,7 @@ async function rerun(body: string, now: Date): Promise<number> {
|
|
|
130
131
|
}
|
|
131
132
|
|
|
132
133
|
async function run(issue_number: string | undefined, now: Date): Promise<number> {
|
|
133
|
-
if (issue_number === undefined || !ISSUE_NUMBER_PATTERN.test(issue_number)) {
|
|
134
|
+
if (issue_number === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)) {
|
|
134
135
|
console.error(USAGE)
|
|
135
136
|
|
|
136
137
|
return FAILURE_EXIT_CODE
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { markdown_section } from './markdown-section'
|
|
2
2
|
|
|
3
3
|
// A defect-claiming (behavior-change) Issue's reproduction section is written as `command + actual
|
|
4
|
-
// output`, never prose, so the claim rests on a run that can be repeated rather than on a reading
|
|
5
|
-
//
|
|
4
|
+
// output`, never prose, so the claim rests on a run that can be repeated rather than on a reading.
|
|
5
|
+
// This is the counterpart of `baseline-measure.ts`: the baseline is a
|
|
6
6
|
// distilled `command -> value`, the reproduction is the raw command *and* the output block it printed
|
|
7
7
|
// — a prose "I checked it" is refused for the same reason a prose baseline is, it cannot be re-run.
|
|
8
8
|
|
|
@@ -38,7 +38,7 @@ function has_output_block(lines: ReadonlyArray<string>): boolean {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// The heading is a parameter so every `command + actual output` section is read by this one parser —
|
|
41
|
-
// a pull request's live-execution evidence section is the same shape
|
|
41
|
+
// a pull request's live-execution evidence section is the same shape.
|
|
42
42
|
function parse_reproduction(body: string, heading: string = REPRODUCTION_HEADING): Reproduction {
|
|
43
43
|
const lines = markdown_section.section_lines(body, heading)
|
|
44
44
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
2
|
+
import { repo_origin } from '#scripts/discovery/repo-origin'
|
|
3
|
+
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
4
|
+
import { issue_cite } from './issue-cite'
|
|
5
|
+
|
|
6
|
+
// How a josh command names an Issue in what it prints to the session.
|
|
7
|
+
//
|
|
8
|
+
// **A line a command prints is a line a session copies.** A run quotes a progress line, a warning or a
|
|
9
|
+
// refusal into its reply verbatim, and a bare `#N` in that line reaches the reply as a bare `#N` — which
|
|
10
|
+
// the Stop guard then sends back for a second turn spent re-citing it. Printing the citation form at the
|
|
11
|
+
// source makes the cheap path and the correct path the same one, the reasoning `issue:cite` itself was
|
|
12
|
+
// built on.
|
|
13
|
+
//
|
|
14
|
+
// **The repository is read from the work tree's own `origin`, not asked of `gh`.** Most printing sites
|
|
15
|
+
// hold no `owner/repo`, and a network read per printed line would put a round trip — and a way to fail
|
|
16
|
+
// — into every warning. The config is a local file (`repo_discovery.read_origin_url`), and it is the
|
|
17
|
+
// same remote `gh` expands `{owner}/{repo}` from, so the link points at the repository the command acts
|
|
18
|
+
// on. A work tree with no GitHub origin falls back to the plain `#N`, the same fallback `reference` has.
|
|
19
|
+
//
|
|
20
|
+
// **The title is used when the caller already holds it, and never fetched.** A link without a title
|
|
21
|
+
// still resolves to the Issue in one click and passes the Stop guard as cited; fetching a title per line
|
|
22
|
+
// would cost the `gh` call this module exists to avoid.
|
|
23
|
+
//
|
|
24
|
+
// **A line assembled elsewhere is linked where it is printed.** A summary, a report or a list built by
|
|
25
|
+
// a helper that also feeds GitHub or a parser holds `issue_cite.plain`; `text` links every bare `#N` in
|
|
26
|
+
// it at the print boundary, the same `issue_citation.linkify` pass the listings already print through.
|
|
27
|
+
|
|
28
|
+
// `owner/repo` of the repository the command runs in, or `undefined` without a GitHub `origin`.
|
|
29
|
+
function session_repo(): string | undefined {
|
|
30
|
+
const url = repo_discovery.read_origin_url(process.cwd())
|
|
31
|
+
const identity = url === undefined ? undefined : repo_origin.parse_origin_url(url)
|
|
32
|
+
|
|
33
|
+
return identity === undefined ? undefined : `${identity.owner}/${identity.repo}`
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// One Issue as a session reads it: `[#N](url) — title` with a title, `[#N](url)` without one. `repo`
|
|
37
|
+
// names another repository's Issue; it defaults to the one the command runs in.
|
|
38
|
+
function issue(number: number | string, title?: string, repo = session_repo()): string {
|
|
39
|
+
return issue_cite.reference(repo, String(number), title)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// `message` as a session reads it: every bare `#N` linked to the repository the command runs in, left
|
|
43
|
+
// as it is without a GitHub `origin`.
|
|
44
|
+
function text(message: string): string {
|
|
45
|
+
const repo = session_repo()
|
|
46
|
+
|
|
47
|
+
return repo === undefined ? message : issue_citation.linkify(message, repo)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const session_cite = {
|
|
51
|
+
issue,
|
|
52
|
+
session_repo,
|
|
53
|
+
text,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { session_cite }
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
// The environment variables that name the **parent** agent session, and which a child session must
|
|
2
2
|
// not inherit.
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
4
|
+
// `scripts/eval/eval-session.ts` and `josh run:wake` both launch a headless session. Two copies of
|
|
5
|
+
// this list is the clone `CLAUDE.md`
|
|
6
6
|
// prohibits, and this is the shape of clone that fails silently: the copy that drifts does not throw
|
|
7
7
|
// or lint — the child dials the parent's private socket, is refused, and the session dies as
|
|
8
8
|
// `API Error: Unable to connect to API (ConnectionRefused)` with nothing anywhere naming the cause.
|
|
9
9
|
//
|
|
10
10
|
// `CLAUDE_CODE_MESSAGING_SOCKET` is a UNIX socket only the parent listens on,
|
|
11
11
|
// `CLAUDE_CODE_MESSAGING_TOKEN` is that socket's credential, and the two session identifiers claim
|
|
12
|
-
// the parent's session as the child's own.
|
|
13
|
-
// restored 5/5 held in 54 seconds, and lowering the concurrency — the suspected cause before this one
|
|
14
|
-
// was found — made it worse.
|
|
12
|
+
// the parent's session as the child's own.
|
|
15
13
|
//
|
|
16
14
|
// **`SESSION_ID_KEY` is the name Claude Code exports for the running session's own id** — the base
|
|
17
15
|
// name of that session's transcript file. It is single-sourced here rather than spelled a second time
|
|
18
|
-
// where the cost reader identifies its own transcript by it
|
|
16
|
+
// where the cost reader identifies its own transcript by it: one env var,
|
|
19
17
|
// one literal, so the list a child must not inherit and the selection that reads it cannot drift.
|
|
20
18
|
const SESSION_ID_KEY = 'CLAUDE_CODE_SESSION_ID'
|
|
21
19
|
|
|
20
|
+
// The pid of the agent session's own process, which a run hold records as its owner.
|
|
21
|
+
const AGENT_PID_KEY = 'CLAUDE_PID'
|
|
22
|
+
|
|
22
23
|
const PARENT_SESSION_KEYS: ReadonlyArray<string> = [
|
|
23
24
|
'CLAUDE_CODE_MESSAGING_SOCKET',
|
|
24
25
|
'CLAUDE_CODE_MESSAGING_TOKEN',
|
|
@@ -27,7 +28,7 @@ const PARENT_SESSION_KEYS: ReadonlyArray<string> = [
|
|
|
27
28
|
]
|
|
28
29
|
|
|
29
30
|
// **The second thing a child must not inherit is a proxy that belongs to the invocation which
|
|
30
|
-
// launched it
|
|
31
|
+
// launched it**. `pnpm josh run:wake --start` runs under whatever wraps this
|
|
31
32
|
// machine's package manager — here a supply-chain scanner, which stands a proxy up on a loopback port
|
|
32
33
|
// and writes `HTTPS_PROXY=http://localhost:<ephemeral>` plus its own CA into the environment of
|
|
33
34
|
// everything that invocation spawns. The supervisor is **detached**, so it outlives that proxy and
|
|
@@ -158,7 +159,7 @@ function is_scanner_proxy(source: EnvironmentSource): (value: string | undefined
|
|
|
158
159
|
}
|
|
159
160
|
}
|
|
160
161
|
|
|
161
|
-
// **The proxy half alone, for a spawn that is not a session
|
|
162
|
+
// **The proxy half alone, for a spawn that is not a session**. kit's `gh`
|
|
162
163
|
// requests inherited the same loopback proxy, and the scanner behind it tunnels api.github.com
|
|
163
164
|
// without inspecting it — so routing GitHub through it protected nothing and added a failure point:
|
|
164
165
|
// the scanner release installed here marked a host it had once timed out on as dead for the rest of
|
|
@@ -176,6 +177,7 @@ function removed_proxy_environment(source: EnvironmentSource = process.env): Rem
|
|
|
176
177
|
}
|
|
177
178
|
|
|
178
179
|
const agent_session_environment = {
|
|
180
|
+
AGENT_PID_KEY,
|
|
179
181
|
LOOPBACK_HOSTS,
|
|
180
182
|
PARENT_SESSION_KEYS,
|
|
181
183
|
PROXY_CERTIFICATE_KEY,
|
package/scripts/josh/cli-body.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { readFileSync, statSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
|
|
4
4
|
// A body — an Issue comment, a PR comment, a notification message — handed to a command as an inline
|
|
5
|
-
// double-quoted shell argument is **evaluated by the shell before the command ever sees it
|
|
6
|
-
//
|
|
5
|
+
// double-quoted shell argument is **evaluated by the shell before the command ever sees it**.
|
|
6
|
+
// The observed damage is not a mangled string: a PR comment posted with
|
|
7
7
|
// `gh api … -f body="… \`pnpm josh ms\` …"` had part of its own text run as git commands, which
|
|
8
8
|
// switched a lane's work tree onto `main` and stopped the run.
|
|
9
9
|
//
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// A single-token "did you mean" for `josh <typo>`. The command set is small and the input is one
|
|
2
2
|
// word, so a character edit distance is the right measure here — unlike `issue-scout`'s token-set
|
|
3
|
-
// Dice similarity, which compares multi-word issue titles
|
|
3
|
+
// Dice similarity, which compares multi-word issue titles.
|
|
4
4
|
const MAX_SUGGESTION_DISTANCE = 3
|
|
5
5
|
|
|
6
6
|
// A cell of the matrix, defaulting the out-of-range read to 0. Reading through it keeps the nullish
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { process_identity } from './process-identity'
|
|
2
2
|
import { stamp_file } from './stamp-file'
|
|
3
3
|
|
|
4
|
-
// A stamp whose payload is "when this was taken, and the digest of every file it covers"
|
|
5
|
-
// (joshuafolkken/kit#1241).
|
|
4
|
+
// A stamp whose payload is "when this was taken, and the digest of every file it covers".
|
|
6
5
|
//
|
|
7
6
|
// `scripts/eval/eval-stamp.ts` was the only holder of this shape. `josh review:brief` needs two more
|
|
8
7
|
// records of exactly the same kind — the gate's result, and the snapshot round 1 takes so round 2
|
|
@@ -18,10 +17,10 @@ interface FileMapStamp {
|
|
|
18
17
|
taken_at: string
|
|
19
18
|
files: Record<string, string>
|
|
20
19
|
// The process that wrote it. Only a record whose meaning is "this is happening **now**" needs it —
|
|
21
|
-
// the in-flight gate marker
|
|
20
|
+
// the in-flight gate marker. The other two assert a completed past fact,
|
|
22
21
|
// which stays true however long the file sits there, so they carry it and never read it.
|
|
23
22
|
pid?: number
|
|
24
|
-
// The other half of that process's identity: when it started
|
|
23
|
+
// The other half of that process's identity: when it started. **A pid
|
|
25
24
|
// alone names whatever holds that number now**, so a marker left behind by a killed gate began
|
|
26
25
|
// reading as live again the moment the operating system reissued its pid — the brief then reporting
|
|
27
26
|
// a gate running on this tree about a gate that no longer exists. The pair separates them, because
|
|
@@ -30,19 +29,19 @@ interface FileMapStamp {
|
|
|
30
29
|
// the field existed carries none, which `process_identity.is_same_process` answers as "cannot tell"
|
|
31
30
|
// rather than as a match.
|
|
32
31
|
process_start?: string
|
|
33
|
-
// The commit the file map is defined against
|
|
32
|
+
// The commit the file map is defined against. Every reader of these
|
|
34
33
|
// records computes its map as a diff against that commit — the branch's merge base with the
|
|
35
|
-
// default branch
|
|
34
|
+
// default branch — so **the map alone does not describe a tree**:
|
|
36
35
|
// fetch an advanced default branch and rebase onto it, and every digest can stay identical while
|
|
37
36
|
// the rest of the working tree is replaced by code no check has read. The rebase moves `HEAD` and
|
|
38
37
|
// so moves the merge base, which is what this field catches; another lane merging into the shared
|
|
39
38
|
// default branch moves neither, and correctly leaves the record standing. Every reader that acts on
|
|
40
39
|
// a record rather than merely reporting it needs the guarantee: `josh gate`, which reuses a green
|
|
41
|
-
// result instead of re-running it, and
|
|
40
|
+
// result instead of re-running it, and the round-1 review snapshot,
|
|
42
41
|
// whose whole use is to name what round 1's fixes changed. A record written without it is refused
|
|
43
42
|
// rather than trusted.
|
|
44
43
|
base?: string
|
|
45
|
-
// When the run that wrote this record reached its verdict
|
|
44
|
+
// When the run that wrote this record reached its verdict. Written only
|
|
46
45
|
// by `complete`, so it is absent on a record whose run was interrupted or threw — which is the
|
|
47
46
|
// whole difference between "a run measured this tree" and "a run measured this tree and
|
|
48
47
|
// finished". Only a reader that acts on the *verdict* needs the second, so `josh eval` writes and
|
|
@@ -61,7 +60,7 @@ function is_file_map(value: unknown): value is Record<string, string> {
|
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
// An optional field of the wrong type is dropped rather than rejected: the records that never read
|
|
64
|
-
// one were written without it
|
|
63
|
+
// one were written without it, and every
|
|
65
64
|
// reader treats an absent field as the safe answer — "not running" for a `pid`, "cannot be reused"
|
|
66
65
|
// for a `base`. Spread rather than assigned, because `exactOptionalPropertyTypes` makes an explicit
|
|
67
66
|
// `undefined` a different thing from an absent key.
|
|
@@ -89,7 +88,7 @@ function parse_stamp(raw: string): FileMapStamp | undefined {
|
|
|
89
88
|
return { taken_at, files, ...optional_fields(pid, base, completed_at, process_start) }
|
|
90
89
|
}
|
|
91
90
|
|
|
92
|
-
// Whether the process that wrote this record is still running
|
|
91
|
+
// Whether the process that wrote this record is still running. It takes the
|
|
93
92
|
// whole record rather than a pid, because a pid on its own is not a process: asked that way a caller
|
|
94
93
|
// could not tell the writing process from whatever the operating system later reissued its number to,
|
|
95
94
|
// which is exactly the state the in-flight marker must never describe.
|
|
@@ -112,14 +111,13 @@ function is_writer_running(stamp: FileMapStamp | undefined): boolean {
|
|
|
112
111
|
|
|
113
112
|
// **For a guard: only when certain of the opposite.** `josh bench` deletes caches a running gate is
|
|
114
113
|
// reading, so the question it must ask is not "is the writer running" but "am I sure it is gone" — an
|
|
115
|
-
// uncertain answer there would clear the caches out from under a live gate
|
|
116
|
-
// joshuafolkken/kit#1332 was filed for. The probe is a subprocess and can fail on a loaded machine,
|
|
114
|
+
// uncertain answer there would clear the caches out from under a live gate. The probe is a subprocess and can fail on a loaded machine,
|
|
117
115
|
// which is exactly the machine a gate makes, so this is not a theoretical branch.
|
|
118
116
|
function is_writer_gone(stamp: FileMapStamp | undefined): boolean {
|
|
119
117
|
return writer_state(stamp) === false
|
|
120
118
|
}
|
|
121
119
|
|
|
122
|
-
// Whether a record may be compared against a map read now
|
|
120
|
+
// Whether a record may be compared against a map read now. Every map here is
|
|
123
121
|
// a diff against `change_base`, so two of them taken against **different** bases do not cover the same
|
|
124
122
|
// set of paths — and `changed_since` below reports that set difference as though the files had been
|
|
125
123
|
// edited. Measured on the resumed runs of #1080 / #1085 / #1147 / #1197: a merge of the default branch
|
|
@@ -142,7 +140,7 @@ function describes_base(stamp: FileMapStamp, base: string | undefined): boolean
|
|
|
142
140
|
//
|
|
143
141
|
// **It says nothing about two maps read against different bases.** It takes the union of the key
|
|
144
142
|
// sets, so a path only one of them covers is reported as changed — a set difference, not an edit.
|
|
145
|
-
// Callers guard that with `describes_base` above
|
|
143
|
+
// Callers guard that with `describes_base` above.
|
|
146
144
|
function changed_since(stamp: FileMapStamp, tree: Record<string, string>): ReadonlyArray<string> {
|
|
147
145
|
const names = new Set([...Object.keys(stamp.files), ...Object.keys(tree)])
|
|
148
146
|
|
|
@@ -153,17 +151,17 @@ function changed_since(stamp: FileMapStamp, tree: Record<string, string>): Reado
|
|
|
153
151
|
|
|
154
152
|
interface FileMapStampAccess {
|
|
155
153
|
stamp_path: () => string
|
|
156
|
-
// `base` is written by the one record that is acted on rather than merely reported —
|
|
157
|
-
//
|
|
154
|
+
// `base` is written by the one record that is acted on rather than merely reported — the
|
|
155
|
+
// green-gate reuse. The others omit it and are unaffected.
|
|
158
156
|
write: (files: Record<string, string>, target?: string, base?: string) => string
|
|
159
|
-
// Marks an existing record as belonging to a run that finished
|
|
157
|
+
// Marks an existing record as belonging to a run that finished. It
|
|
160
158
|
// amends rather than rewrites, and answers `undefined` where there is no record to amend: a run
|
|
161
159
|
// whose record never got written has nothing to assert a completion about, and inventing one here
|
|
162
160
|
// would manufacture the very vouching the field exists to withhold.
|
|
163
161
|
complete: (target?: string) => string | undefined
|
|
164
162
|
read: (source?: string) => FileMapStamp | undefined
|
|
165
|
-
// For a record whose meaning is its existence rather than its contents — the in-flight gate marker
|
|
166
|
-
//
|
|
163
|
+
// For a record whose meaning is its existence rather than its contents — the in-flight gate marker.
|
|
164
|
+
// A record nobody removes would go on asserting a gate that ended.
|
|
167
165
|
remove: (target?: string) => void
|
|
168
166
|
}
|
|
169
167
|
|
|
@@ -186,7 +184,7 @@ function read_at(source: string): FileMapStamp | undefined {
|
|
|
186
184
|
// Amending is the whole point, and re-writing would defeat it: `write` stamps a fresh `taken_at` and
|
|
187
185
|
// takes a fresh file map, so calling it again at the end of a run would claim the tree as the run
|
|
188
186
|
// *left* it was the tree the run measured — the record would then vouch for a comparison of that
|
|
189
|
-
// tree against itself, which is the one answer it exists to withhold
|
|
187
|
+
// tree against itself, which is the one answer it exists to withhold.
|
|
190
188
|
//
|
|
191
189
|
// **It completes only a record this process wrote**, which the `pid` already in the payload is what
|
|
192
190
|
// says. The path is deterministic per checkout, so a second whole-suite run started beside the first
|
|
@@ -199,7 +197,7 @@ function read_at(source: string): FileMapStamp | undefined {
|
|
|
199
197
|
// deliberate but total-by-assumption: a field added to `write` without a matching entry in
|
|
200
198
|
// `parse_stamp` and `optional_fields` would be dropped by any `complete`, so the two are extended
|
|
201
199
|
// together.
|
|
202
|
-
// **The pid is not the whole of that check either
|
|
200
|
+
// **The pid is not the whole of that check either**. A record left behind by
|
|
203
201
|
// a run that was killed, whose pid this process was later handed, passes `pid === process.pid` — and
|
|
204
202
|
// stamping it would describe that dead run as finished, which is the false `skip` the field exists to
|
|
205
203
|
// prevent, reached from a third direction. `is_writer_gone` is the added half rather than
|
|
@@ -232,8 +230,7 @@ function create(prefix: string, root?: string): FileMapStampAccess {
|
|
|
232
230
|
stamp_path: resolve,
|
|
233
231
|
// `base` goes into the payload undefined and all — `JSON.stringify` drops an undefined value,
|
|
234
232
|
// so a caller that has no base writes exactly the record it wrote before this field existed.
|
|
235
|
-
// `own_fields` is what writes the pid, and
|
|
236
|
-
// start time beside it — assembled in one place so no record can carry half an identity.
|
|
233
|
+
// `own_fields` is what writes the pid, and the writing process's start time beside it — assembled in one place so no record can carry half an identity.
|
|
237
234
|
write: (files, target = resolve(), base?: string) =>
|
|
238
235
|
stamp_file.write_stamp(target, {
|
|
239
236
|
taken_at: new Date().toISOString(),
|