@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
|
@@ -3,7 +3,7 @@ import { run_carry } from '#scripts/run/carry/run-carry'
|
|
|
3
3
|
import { run_event_scope } from './run-event-scope'
|
|
4
4
|
import { run_event_stream, type RunEvent } from './run-event-stream'
|
|
5
5
|
|
|
6
|
-
// The write side of the run's event stream
|
|
6
|
+
// The write side of the run's event stream. It resolves the run's identity and
|
|
7
7
|
// appends, and it is where the "reporting must not break the work it reports on" contract is kept: every
|
|
8
8
|
// failure — a git call that hangs, a temp directory that cannot be written — is swallowed, so a lane
|
|
9
9
|
// child's own work never fails because an append did.
|
|
@@ -29,8 +29,7 @@ async function stream_target(): Promise<string | undefined> {
|
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Append one session-facing event, best-effort. A kind outside the enumeration is refused by `append`;
|
|
32
|
-
* every error is swallowed, because the reporting path must never fail the work it reports on
|
|
33
|
-
* (joshuafolkken/kit#2205).
|
|
32
|
+
* every error is swallowed, because the reporting path must never fail the work it reports on.
|
|
34
33
|
*/
|
|
35
34
|
async function emit(kind: string, text: string): Promise<void> {
|
|
36
35
|
try {
|
|
@@ -46,13 +45,13 @@ async function emit(kind: string, text: string): Promise<void> {
|
|
|
46
45
|
|
|
47
46
|
/**
|
|
48
47
|
* Append one event unless the newest event on the stream already carries this kind — so a marker a loop
|
|
49
|
-
* re-checks every poll is written once per episode rather than once per poll
|
|
48
|
+
* re-checks every poll is written once per episode rather than once per poll.
|
|
50
49
|
* The drain marker is the caller: `backlog:offer` runs every iteration of a watching loop, and one drain
|
|
51
50
|
* event per drain is what `run:step` reads to fire the retrospective a single time. Best-effort like
|
|
52
51
|
* `emit`: a failed resolve or read is swallowed rather than raised into the loop's work.
|
|
53
52
|
*
|
|
54
53
|
* **Returns whether it appended**, so a caller that pairs the marker with its own once-per-episode side
|
|
55
|
-
* effect — the stall detector sends one notification per stall
|
|
54
|
+
* effect — the stall detector sends one notification per stall — fires that
|
|
56
55
|
* effect exactly when the marker was fresh. A skipped duplicate and a swallowed failure both read
|
|
57
56
|
* `false`: neither is a fresh episode.
|
|
58
57
|
*/
|
|
@@ -71,6 +70,30 @@ async function emit_once(kind: string, text: string): Promise<boolean> {
|
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
72
|
|
|
73
|
+
/**
|
|
74
|
+
* Append one event unless the newest event of this kind already carries this text — for a marker whose
|
|
75
|
+
* value, not its presence, is the news. The idle window is re-derived on every
|
|
76
|
+
* offer of a watching loop; only a window that moved is worth a line. Returns whether it appended.
|
|
77
|
+
*/
|
|
78
|
+
async function emit_changed(kind: string, text: string): Promise<boolean> {
|
|
79
|
+
try {
|
|
80
|
+
const target = await stream_target()
|
|
81
|
+
|
|
82
|
+
if (target === undefined) return false
|
|
83
|
+
|
|
84
|
+
const newest = run_event_stream.read_events(target).findLast((event) => event.kind === kind)
|
|
85
|
+
|
|
86
|
+
if (newest?.text === text) return false
|
|
87
|
+
|
|
88
|
+
return run_event_stream.append(target, kind, text, now_iso()).appended
|
|
89
|
+
} catch (error) {
|
|
90
|
+
// Best-effort: a failed append is dropped rather than raised into the loop's work.
|
|
91
|
+
error_text.trace_swallowed('run_event_stream_emit.emit_changed', error)
|
|
92
|
+
|
|
93
|
+
return false
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
74
97
|
// The events of the invocation now running: the stream outlives every invocation, so a marker a previous
|
|
75
98
|
// run left — a stall that ended with no dispatch after it — must not hold back this run's first one. An
|
|
76
99
|
// undetermined scope (no carry record) keeps the whole stream, the side that under-notifies rather than
|
|
@@ -84,9 +107,9 @@ function invocation_events(repository: string, target: string): ReadonlyArray<Ru
|
|
|
84
107
|
|
|
85
108
|
/**
|
|
86
109
|
* Append one event unless this kind is already on the stream since the newest `reset_kind` — the
|
|
87
|
-
* episode marker for a condition that holds across other events
|
|
88
|
-
*
|
|
89
|
-
*
|
|
110
|
+
* episode marker for a condition that holds across other events. `emit_once`'s newest-event test would
|
|
111
|
+
* re-fire each time a parallel lane appended a merge or a park; this ends the episode only at
|
|
112
|
+
* `reset_kind`. Returns whether it appended, as `emit_once` does.
|
|
90
113
|
*/
|
|
91
114
|
async function emit_once_since(kind: string, text: string, reset_kind: string): Promise<boolean> {
|
|
92
115
|
try {
|
|
@@ -109,14 +132,14 @@ async function emit_once_since(kind: string, text: string, reset_kind: string):
|
|
|
109
132
|
}
|
|
110
133
|
}
|
|
111
134
|
|
|
112
|
-
// One progress heartbeat line onto the stream, so a relay reaches it across a cut
|
|
135
|
+
// One progress heartbeat line onto the stream, so a relay reaches it across a cut.
|
|
113
136
|
async function emit_heartbeat(line: string): Promise<void> {
|
|
114
137
|
await emit(run_event_stream.EVENT_KIND.HEARTBEAT, line)
|
|
115
138
|
}
|
|
116
139
|
|
|
117
140
|
// The events of the invocation now running, for a reader restoring the run from its stream
|
|
118
|
-
// (`backlog:drive
|
|
119
|
-
//
|
|
141
|
+
// (`backlog:drive`). Fail-quiet like the writers: no repository or an unreadable stream is an empty
|
|
142
|
+
// invocation.
|
|
120
143
|
async function current_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
121
144
|
try {
|
|
122
145
|
const repository = await run_carry.repository_directory()
|
|
@@ -133,12 +156,42 @@ async function current_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
|
133
156
|
}
|
|
134
157
|
}
|
|
135
158
|
|
|
159
|
+
// The invocation's events for a writer deciding whether a marker is already there: unlike
|
|
160
|
+
// `current_events`, an undetermined scope keeps the whole stream, so a run with no carry record skips a
|
|
161
|
+
// marker it already wrote rather than writing it twice.
|
|
162
|
+
async function invocation_or_all_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
163
|
+
try {
|
|
164
|
+
const repository = await run_carry.repository_directory()
|
|
165
|
+
|
|
166
|
+
return repository === undefined
|
|
167
|
+
? []
|
|
168
|
+
: invocation_events(repository, run_event_stream.target_of(repository))
|
|
169
|
+
} catch {
|
|
170
|
+
return []
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Every event on the stream, across invocations, for a reader that scopes by the event's own text
|
|
175
|
+
// rather than by the carry record (`issue:file`'s fold). Fail-quiet like `current_events`.
|
|
176
|
+
async function all_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
177
|
+
try {
|
|
178
|
+
const target = await stream_target()
|
|
179
|
+
|
|
180
|
+
return target === undefined ? [] : run_event_stream.read_events(target)
|
|
181
|
+
} catch {
|
|
182
|
+
return []
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
136
186
|
const run_event_stream_emit = {
|
|
187
|
+
all_events,
|
|
137
188
|
current_events,
|
|
138
189
|
emit,
|
|
190
|
+
emit_changed,
|
|
139
191
|
emit_heartbeat,
|
|
140
192
|
emit_once,
|
|
141
193
|
emit_once_since,
|
|
194
|
+
invocation_or_all_events,
|
|
142
195
|
stream_target,
|
|
143
196
|
}
|
|
144
197
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { repository_lock } from '#scripts/git/repository-lock'
|
|
1
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
3
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
3
5
|
import { z } from 'zod'
|
|
4
6
|
|
|
5
7
|
// The run's append-only, ordered event stream — the surface a reader who was away rebuilds the run's
|
|
6
|
-
// recent shape from
|
|
8
|
+
// recent shape from. The report clock (`run-progress-clock.ts`) keeps only the
|
|
7
9
|
// *last* heartbeat, and its `.log` sibling keeps only heartbeat *lines* with no position; neither lets
|
|
8
10
|
// a woken reader ask "everything since the position I last read". This does.
|
|
9
11
|
//
|
|
@@ -19,7 +21,7 @@ import { z } from 'zod'
|
|
|
19
21
|
// dropped older events. Renumbering on compaction would silently shift a reader past unseen events.
|
|
20
22
|
//
|
|
21
23
|
// **The write is best-effort by contract, and the safety lives on the emit side.** The reporting path
|
|
22
|
-
// must never fail the work it reports on
|
|
24
|
+
// must never fail the work it reports on, so `run-event-stream-emit.ts` wraps
|
|
23
25
|
// every append in a swallow; this module is free to throw on a genuinely broken write.
|
|
24
26
|
|
|
25
27
|
const EVENT_PREFIX = 'josh-run-events-'
|
|
@@ -29,14 +31,20 @@ const EVENT_PREFIX = 'josh-run-events-'
|
|
|
29
31
|
const EVENT_SUFFIX = '.jsonl'
|
|
30
32
|
// A run's session-facing events over the 8-hour whole-run bound: a plan, a launch/PR/review-round/merge
|
|
31
33
|
// per child across a few dozen children, plus parks, cuts and stops. Five hundred keeps the whole of a
|
|
32
|
-
// large `backlogrun` and still bounds an unattended run — past it the oldest events roll off
|
|
33
|
-
// what the acceptance criteria pin.
|
|
34
|
+
// large `backlogrun` and still bounds an unattended run — past it the oldest events roll off.
|
|
34
35
|
const EVENT_CAP = 500
|
|
35
36
|
const FIRST_POSITION = 0
|
|
36
37
|
const POSITION_INCREMENT = 1
|
|
37
38
|
const LINE_SEPARATOR = '\n'
|
|
38
|
-
|
|
39
|
-
//
|
|
39
|
+
const WORD_SEPARATOR = ' '
|
|
40
|
+
// `#<N> <stage> <phase>` carries the phase third.
|
|
41
|
+
const STAGE_PHASE_INDEX = 2
|
|
42
|
+
// The lock sits beside the stream it guards, so every writer of one stream contends for one record.
|
|
43
|
+
const LOCK_SUFFIX = '.lock'
|
|
44
|
+
// An append holds the lock for one read and one rename; a wait this long means a holder is stuck.
|
|
45
|
+
const LOCK_WAIT_MS = 5000
|
|
46
|
+
|
|
47
|
+
// **The one enumeration of what a session-facing event is.** Every writer names
|
|
40
48
|
// its event by one of these members rather than passing a free string, so the set of things the stream
|
|
41
49
|
// carries is defined here and nowhere else; `append` refuses a kind outside it, which is what keeps a
|
|
42
50
|
// caller from quietly widening the stream.
|
|
@@ -48,57 +56,79 @@ const EVENT_KIND = {
|
|
|
48
56
|
SPLIT: 'split',
|
|
49
57
|
OUTAGE: 'outage',
|
|
50
58
|
CUT: 'cut',
|
|
51
|
-
// A fresh session adopted an implementation cut — `run:cut --resume` answered `resume-impl
|
|
52
|
-
//
|
|
53
|
-
//
|
|
59
|
+
// A fresh session adopted an implementation cut — `run:cut --resume` answered `resume-impl`. The
|
|
60
|
+
// resume clears the cut record, so without this the `cut` would stay the newest position and
|
|
61
|
+
// `run:step` would keep answering the resume command it had just run.
|
|
54
62
|
RESUME: 'resume',
|
|
55
|
-
// The backlog emptied while nothing of the run's own was in flight — the drain
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
// the
|
|
59
|
-
//
|
|
63
|
+
// The backlog emptied while nothing of the run's own was in flight — the drain. It marks the position
|
|
64
|
+
// at which the end-of-run retrospective is owed, *before* the idle watch opens, so `run:step` fires
|
|
65
|
+
// the retrospective at the drain rather than after the watch runs its course. It is not itself a
|
|
66
|
+
// stop: the run watches on once the retrospective has run, and the real `STOP` follows when the watch
|
|
67
|
+
// expires.
|
|
60
68
|
DRAIN: 'drain',
|
|
61
69
|
STOP: 'stop',
|
|
62
70
|
PR_OPENED: 'pr-opened',
|
|
63
71
|
REVIEW_ROUND: 'review-round',
|
|
64
|
-
// The end-of-run retrospective's result, recorded when the run marks the retrospective done
|
|
65
|
-
//
|
|
72
|
+
// The end-of-run retrospective's result, recorded when the run marks the retrospective done. A
|
|
73
|
+
// retrospective that files zero improvements and one that never ran look
|
|
66
74
|
// the same from outside — no new Issue either way — so the result is put on the stream the report is
|
|
67
75
|
// generated from: the issues filed (or that none were), and the candidates dropped with why. It is
|
|
68
76
|
// emitted from the `run:carry --retrospective` close, so marking the retrospective done and recording
|
|
69
77
|
// what it found are one action rather than two the run could do only one of.
|
|
70
78
|
RETROSPECTIVE: 'retrospective',
|
|
71
79
|
// Ready backlog work is sitting undispatched while a lane is free and nothing has dispatched for a
|
|
72
|
-
// while
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
// terminal reader following the stream sees. `run:step` reads it as `backlog:next`, so a run that
|
|
80
|
+
// while. Emitted once per stall episode by the stop-time detector, it is both the dedup marker —
|
|
81
|
+
// `emit_once_since` refuses a second until a `CHILD_LAUNCH` intervenes — and the line a terminal
|
|
82
|
+
// reader following the stream sees. `run:step` reads it as `backlog:next`, so a run that
|
|
76
83
|
// stalled is pointed straight at dispatching the work rather than left waiting.
|
|
77
84
|
STALL: 'stall',
|
|
78
85
|
// The run's own driver is gone: the cut handed the budget off, the owner has died, and no supervisor
|
|
79
|
-
// is watching
|
|
86
|
+
// is watching. Emitted once per strand episode by the stop-time detector,
|
|
80
87
|
// exactly as `STALL` is — the newest-event dedup keeps a run polled every stop from notifying more
|
|
81
88
|
// than once, and a terminal reader following the stream sees the line. The strand is the step before
|
|
82
89
|
// the stall: a stalled run still has a driver that could dispatch, a stranded one has none.
|
|
83
90
|
STRANDED: 'stranded',
|
|
84
|
-
// One `josh ship` stage starting, succeeding or failing
|
|
91
|
+
// One `josh ship` stage starting, succeeding or failing. It is a trace of the
|
|
85
92
|
// composite's progress rather than a position the run is at — the positions a ship leaves behind are
|
|
86
93
|
// the closed issue its `followup` merges, or a detached supervisor's `SHIP_LAUNCH` / `SHIP_STOP` below
|
|
87
94
|
// — so it is one of the `TRACE_KINDS` the last-event read skips.
|
|
88
95
|
SHIP_STAGE: 'ship-stage',
|
|
89
|
-
// One progress watcher line — the `at … / next …` heartbeat `run:progress` prints
|
|
90
|
-
//
|
|
91
|
-
//
|
|
96
|
+
// One progress watcher line — the `at … / next …` heartbeat `run:progress` prints. Printed only to
|
|
97
|
+
// the watcher's own output, a headless successor's heartbeat would be buried in its log after a cut;
|
|
98
|
+
// on the stream it reaches the attached session's relay. It says
|
|
92
99
|
// the run is alive rather than where it is, so it is a trace kind like `SHIP_STAGE`.
|
|
93
100
|
HEARTBEAT: 'heartbeat',
|
|
94
|
-
// The post-implementation region handed to a detached `josh ship --detach` supervisor
|
|
95
|
-
//
|
|
101
|
+
// The post-implementation region handed to a detached `josh ship --detach` supervisor. Unlike a stage
|
|
102
|
+
// trace it is a position: the agent has ended and the
|
|
96
103
|
// supervisor carries the run, so `run:step` answers `wait` until it stops or the issue closes.
|
|
97
104
|
SHIP_LAUNCH: 'ship-launch',
|
|
98
105
|
// The supervisor stopped at a failed stage — a red gate, a High/Medium review, a failed push, red CI
|
|
99
|
-
//
|
|
106
|
+
// The position that hands control back: `run:step` prints the command that
|
|
100
107
|
// shows the stopped report, so the agent fixes it and relaunches rather than rebuilding the context.
|
|
101
108
|
SHIP_STOP: 'ship-stop',
|
|
109
|
+
// The idle watch's window — when the run began waiting on an empty backlog and when that wait ends
|
|
110
|
+
// `backlog:offer` writes it whenever the window changes, so `run:board` reads
|
|
111
|
+
// the deadline rather than guessing it. It is a trace: `emit_once`'s drain dedup and `run:step`'s
|
|
112
|
+
// position both read past it, so a watching loop never re-marks the drain it is waiting after.
|
|
113
|
+
IDLE: 'idle',
|
|
114
|
+
// An Issue the run filed on its way, written by `issue:file`, so a run started from the command line
|
|
115
|
+
// still surfaces what it found — `run:board`'s findings section reads it.
|
|
116
|
+
FILED: 'filed',
|
|
117
|
+
// A one-line observation short of an Issue, written with `run:event --append note` and shown in the
|
|
118
|
+
// same section.
|
|
119
|
+
NOTE: 'note',
|
|
120
|
+
// A lane child reached a phase no other event marks — its first implementation edit, written by the
|
|
121
|
+
// PreToolUse hook — so `run:board` draws how far the child has got. A trace,
|
|
122
|
+
// like `SHIP_STAGE`: it says where the child's work is, not where the run is.
|
|
123
|
+
LANE_PHASE: 'lane-phase',
|
|
124
|
+
// An issue `run:add` put into the live run. The parent's `--wait` watcher
|
|
125
|
+
// ends on it, so the issue takes the next free lane without waiting out the arrival probe's minute. A
|
|
126
|
+
// trace: it says what the run was handed, not where the run is.
|
|
127
|
+
ADD: 'add',
|
|
128
|
+
// `josh lane:limit` raised a live run's lane limit. The `--wait` watcher's
|
|
129
|
+
// arrival probe reads it as a wake: the lanes a raise frees are new room for a pool its baseline
|
|
130
|
+
// already holds. A trace: it says the run gained room, not where the run is.
|
|
131
|
+
LANE_LIMIT: 'lane-limit',
|
|
102
132
|
} as const
|
|
103
133
|
|
|
104
134
|
type EventKind = (typeof EVENT_KIND)[keyof typeof EVENT_KIND]
|
|
@@ -108,7 +138,26 @@ const EVENT_KINDS: ReadonlyArray<string> = Object.values(EVENT_KIND)
|
|
|
108
138
|
// The kinds that trace progress inside a step rather than mark where the run is. Every last-event reader
|
|
109
139
|
// — `run:step`'s position, `emit_once`'s dedup — asks "where is the run", and a
|
|
110
140
|
// ship's four stage lines after its `merge` would otherwise read as an unknown position.
|
|
111
|
-
const TRACE_KINDS: ReadonlySet<string> = new Set([
|
|
141
|
+
const TRACE_KINDS: ReadonlySet<string> = new Set([
|
|
142
|
+
EVENT_KIND.SHIP_STAGE,
|
|
143
|
+
EVENT_KIND.HEARTBEAT,
|
|
144
|
+
EVENT_KIND.IDLE,
|
|
145
|
+
EVENT_KIND.FILED,
|
|
146
|
+
EVENT_KIND.NOTE,
|
|
147
|
+
EVENT_KIND.LANE_PHASE,
|
|
148
|
+
EVENT_KIND.ADD,
|
|
149
|
+
EVENT_KIND.LANE_LIMIT,
|
|
150
|
+
])
|
|
151
|
+
|
|
152
|
+
// The trace kinds that say only that the run was alive, so the bound rolls them off first. A `filed` or
|
|
153
|
+
// `note` line is a trace to the position readers but is the board's record of what the run found, so
|
|
154
|
+
// it rolls off only with the positions. A ship-stage `start` and an `idle` line are disposable but go
|
|
155
|
+
// last of them: `run:board` draws from those lines.
|
|
156
|
+
const DISPOSABLE_KINDS: ReadonlySet<string> = new Set([
|
|
157
|
+
EVENT_KIND.SHIP_STAGE,
|
|
158
|
+
EVENT_KIND.HEARTBEAT,
|
|
159
|
+
EVENT_KIND.IDLE,
|
|
160
|
+
])
|
|
112
161
|
|
|
113
162
|
const event_schema = z.object({
|
|
114
163
|
pos: z.number(),
|
|
@@ -130,7 +179,7 @@ interface StreamRead {
|
|
|
130
179
|
}
|
|
131
180
|
|
|
132
181
|
// A kind the enumeration names, and nothing else. The predicate is what `append` asks before it writes,
|
|
133
|
-
// so an event outside the enumeration is never appended
|
|
182
|
+
// so an event outside the enumeration is never appended.
|
|
134
183
|
function is_event_kind(value: string): value is EventKind {
|
|
135
184
|
return EVENT_KINDS.includes(value)
|
|
136
185
|
}
|
|
@@ -170,18 +219,71 @@ function last_position(events: ReadonlyArray<RunEvent>): number {
|
|
|
170
219
|
return events[events.length - POSITION_INCREMENT]?.pos ?? FIRST_POSITION
|
|
171
220
|
}
|
|
172
221
|
|
|
222
|
+
// The issue a ship-stage names — `#<N> <stage> <phase>` carries it first.
|
|
223
|
+
function issue_of(event: RunEvent): string {
|
|
224
|
+
return event.text.split(WORD_SEPARATOR)[FIRST_POSITION] ?? ''
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Each issue's newest ship-stage, the one the board reads its furthest phase from.
|
|
228
|
+
function newest_stages(events: ReadonlyArray<RunEvent>): ReadonlySet<RunEvent> {
|
|
229
|
+
const newest = new Map<string, RunEvent>()
|
|
230
|
+
|
|
231
|
+
for (const event of events) {
|
|
232
|
+
if (event.kind === EVENT_KIND.SHIP_STAGE) newest.set(issue_of(event), event)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return new Set(newest.values())
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// A ship-stage that starts its stage — the line `run:board` draws a phase from. A `done`, a `failed` and
|
|
239
|
+
// a passed-over stage draw none.
|
|
240
|
+
function is_stage_start(event: RunEvent): boolean {
|
|
241
|
+
if (event.kind !== EVENT_KIND.SHIP_STAGE) return false
|
|
242
|
+
|
|
243
|
+
return event.text.split(WORD_SEPARATOR)[STAGE_PHASE_INDEX] === run_ship_stage.PHASE.START
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// A disposable line `run:board` draws from: a ship-stage `start` is a phase on a lane's track, and an
|
|
247
|
+
// `idle` line is the deadline of the run's wait.
|
|
248
|
+
function is_drawn(event: RunEvent): boolean {
|
|
249
|
+
return event.kind === EVENT_KIND.IDLE || is_stage_start(event)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// The lines the bound may drop, in the order it drops them: the ones that draw nothing first, then the
|
|
253
|
+
// ones `run:board` draws from, each group oldest first.
|
|
254
|
+
function droppable(events: ReadonlyArray<RunEvent>): ReadonlyArray<RunEvent> {
|
|
255
|
+
const kept = newest_stages(events)
|
|
256
|
+
const disposable = events.filter((event) => DISPOSABLE_KINDS.has(event.kind) && !kept.has(event))
|
|
257
|
+
|
|
258
|
+
return [
|
|
259
|
+
...disposable.filter((event) => !is_drawn(event)),
|
|
260
|
+
...disposable.filter((event) => is_drawn(event)),
|
|
261
|
+
]
|
|
262
|
+
}
|
|
263
|
+
|
|
173
264
|
// The bounded stream serialized back to JSONL. The newest `EVENT_CAP` are kept and the oldest roll off;
|
|
174
265
|
// each survivor keeps its original `pos`, so the bound never renumbers a position a reader is holding.
|
|
175
|
-
// The stream held to `EVENT_CAP`, dropping the oldest trace events before any position
|
|
176
|
-
//
|
|
177
|
-
//
|
|
178
|
-
//
|
|
266
|
+
// The stream held to `EVENT_CAP`, dropping the oldest trace events before any position: a trace says
|
|
267
|
+
// only that the run was alive, so it is the first to go, and a long run's trace lines never push its
|
|
268
|
+
// cuts off. Only a stream of positions alone rolls them off.
|
|
269
|
+
//
|
|
270
|
+
// **Each issue's newest ship-stage is not disposable**: it is the only record `run:board` draws a lane's
|
|
271
|
+
// review-and-later phase from, and on a stream full of positions it would otherwise roll off in its own
|
|
272
|
+
// append.
|
|
273
|
+
//
|
|
274
|
+
// **A ship-stage `start` outlasts the other disposable lines**: each one is a phase on the lane's track,
|
|
275
|
+
// so it is kept past the `done` lines and the heartbeats. An `idle` line goes with them, oldest first,
|
|
276
|
+
// so a run's newest wait is not the first line a stream of starts and positions gives up.
|
|
277
|
+
//
|
|
278
|
+
// **The kept line carries the history**: on a stream the positions fill, every append still rolls off
|
|
279
|
+
// the issue's previous stage line, so the newest one lists every stage its
|
|
280
|
+
// attempt has started (`run-ship-stage.ts` → `event_text`) and the track is redrawn from it alone.
|
|
179
281
|
function bounded(events: ReadonlyArray<RunEvent>): ReadonlyArray<RunEvent> {
|
|
180
282
|
const excess = events.length - EVENT_CAP
|
|
181
283
|
|
|
182
284
|
if (excess <= 0) return events
|
|
183
285
|
|
|
184
|
-
const dropped = new Set(events
|
|
286
|
+
const dropped = new Set(droppable(events).slice(0, excess))
|
|
185
287
|
|
|
186
288
|
return events.filter((event) => !dropped.has(event)).slice(-EVENT_CAP)
|
|
187
289
|
}
|
|
@@ -190,21 +292,43 @@ function serialize(events: ReadonlyArray<RunEvent>): string {
|
|
|
190
292
|
return `${events.map((event) => JSON.stringify(event)).join(LINE_SEPARATOR)}${LINE_SEPARATOR}`
|
|
191
293
|
}
|
|
192
294
|
|
|
295
|
+
// The read-modify-write, run only while the stream's lock is held. `replace_text_stamp` publishes the
|
|
296
|
+
// rewrite with a rename, so a reader never sees the stream absent or half-written.
|
|
297
|
+
function append_held(target: string, event: Omit<RunEvent, 'pos'>): number {
|
|
298
|
+
const existing = read_events(target)
|
|
299
|
+
const position = last_position(existing) + POSITION_INCREMENT
|
|
300
|
+
const events = bounded([...existing, { pos: position, ...event }])
|
|
301
|
+
|
|
302
|
+
stamp_file.replace_text_stamp(target, serialize(events))
|
|
303
|
+
|
|
304
|
+
return position
|
|
305
|
+
}
|
|
306
|
+
|
|
193
307
|
/**
|
|
194
308
|
* Append one event, or refuse a kind the enumeration does not name.
|
|
195
309
|
*
|
|
196
310
|
* The position is the previous maximum plus one — monotonic across session cuts because the stream is
|
|
197
|
-
* keyed to the run's identity rather than a session.
|
|
198
|
-
*
|
|
311
|
+
* keyed to the run's identity rather than a session. **The read and the rewrite are one step under a
|
|
312
|
+
* per-stream lock**: the parent, a cut successor and every lane child append to one stream, and an
|
|
313
|
+
* unlocked read-then-rewrite would lose one writer's event to another's. A lock still
|
|
314
|
+
* held after the wait is reported on stderr and thrown, which the best-effort emit side swallows.
|
|
199
315
|
*/
|
|
200
316
|
function append(target: string, kind: string, text: string, at: string): AppendResult {
|
|
201
317
|
if (!is_event_kind(kind)) return { appended: false, position: FIRST_POSITION }
|
|
202
318
|
|
|
203
|
-
const
|
|
204
|
-
const position =
|
|
205
|
-
|
|
319
|
+
const lock = `${target}${LOCK_SUFFIX}`
|
|
320
|
+
const position = repository_lock.with_lock_sync(
|
|
321
|
+
() => append_held(target, { at, kind, text }),
|
|
322
|
+
lock,
|
|
323
|
+
LOCK_WAIT_MS,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
if (position === undefined) {
|
|
327
|
+
const message = `run event stream: gave up waiting for the lock at ${lock}`
|
|
206
328
|
|
|
207
|
-
|
|
329
|
+
process.stderr.write(`${message}\n`)
|
|
330
|
+
throw new Error(message)
|
|
331
|
+
}
|
|
208
332
|
|
|
209
333
|
return { appended: true, position }
|
|
210
334
|
}
|
|
@@ -225,16 +349,16 @@ function read_from(target: string, position: number): StreamRead {
|
|
|
225
349
|
}
|
|
226
350
|
}
|
|
227
351
|
|
|
228
|
-
// The degenerate single-event read the "last line" consumers
|
|
229
|
-
//
|
|
230
|
-
//
|
|
352
|
+
// The degenerate single-event read the "last line" consumers use: the newest positional event, or
|
|
353
|
+
// `undefined` for a stream with none. Trace events are skipped, so the answer stays the run's position
|
|
354
|
+
// however many stage lines follow it.
|
|
231
355
|
function read_last(target: string): RunEvent | undefined {
|
|
232
356
|
return read_events(target).findLast((event) => !TRACE_KINDS.has(event.kind))
|
|
233
357
|
}
|
|
234
358
|
|
|
235
359
|
// Whether `kind` is already on the stream after the newest `reset_kind` — or anywhere, before the first
|
|
236
360
|
// one. The episode test for a marker whose episode ends only when something specific happens rather than
|
|
237
|
-
// when any other event lands
|
|
361
|
+
// when any other event lands: a stall ends at a dispatch, and the merges, parks
|
|
238
362
|
// and heartbeats every parallel lane appends in between must not read as a fresh stall.
|
|
239
363
|
function has_since(events: ReadonlyArray<RunEvent>, kind: string, reset_kind: string): boolean {
|
|
240
364
|
const reset_at = events.findLastIndex((event) => event.kind === reset_kind)
|
|
@@ -242,7 +366,7 @@ function has_since(events: ReadonlyArray<RunEvent>, kind: string, reset_kind: st
|
|
|
242
366
|
return events.slice(reset_at + POSITION_INCREMENT).some((event) => event.kind === kind)
|
|
243
367
|
}
|
|
244
368
|
|
|
245
|
-
// One event as the line a reader relays
|
|
369
|
+
// One event as the line a reader relays. The follow reader and the degenerate
|
|
246
370
|
// `run:wake --list` both present events to a person, so the "what an event reads as" lives here, beside
|
|
247
371
|
// the enumeration it names, rather than being spelled twice at the two call sites. `at`, `kind` and
|
|
248
372
|
// `text` are joined with a separator no field carries, so the three stay legible in one line.
|
|
@@ -260,6 +384,7 @@ const run_event_stream = {
|
|
|
260
384
|
append,
|
|
261
385
|
format_event,
|
|
262
386
|
has_since,
|
|
387
|
+
is_stage_start,
|
|
263
388
|
read_events,
|
|
264
389
|
read_from,
|
|
265
390
|
read_last,
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import type { StreamRead } from './run-event-stream'
|
|
2
2
|
|
|
3
|
-
// The loop behind `josh run:event --watch`
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// loop inside one process and writes each event as the rendered line, so a person sees an event land at
|
|
8
|
-
// once and the conversation is never woken for it.
|
|
3
|
+
// The loop behind `josh run:event --watch` — the ambient surface a person keeps open in a pane of their
|
|
4
|
+
// own. A session relaying `--follow` would re-read its whole history on every line, so the watch runs
|
|
5
|
+
// the same pass in a loop inside one process and writes each event as the rendered line, so a person
|
|
6
|
+
// sees an event land at once and the conversation is never woken for it.
|
|
9
7
|
//
|
|
10
8
|
// **The pass is `run_event_follow.follow`, reused through a port rather than re-spelled**, and the loop
|
|
11
9
|
// carries the position the pass hands back. `should_continue` is the one stop condition: the CLI's is
|