@joshuafolkken/kit 1.1229.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 +24 -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 +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- 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/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- 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-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.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-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- 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 +213 -197
- 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 -201
- package/dist/josh.js +540 -137
- 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 +4 -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 +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- 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 +313 -0
- 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 +60 -53
- 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 +12 -8
- 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 +35 -0
- 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 +49 -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 +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- 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 +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- 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 +32 -34
- 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 +33 -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 +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- 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 +10 -10
- 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 +20 -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 +44 -30
- 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 +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -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 +140 -0
- 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-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- 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 +68 -37
- 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 +10 -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 +172 -43
- 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 +62 -48
- 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 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- 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 +13 -21
- 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 -328
- 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 +129 -98
- 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/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- 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
|
@@ -13,11 +13,10 @@ import { run_progress_clock } from './run-progress-clock'
|
|
|
13
13
|
import { run_progress_read, type ObservationRead } from './run-progress-read'
|
|
14
14
|
|
|
15
15
|
// `josh run:progress` — the background watcher that breaks a long silence with one line of
|
|
16
|
-
// observations, and `--mark`, which tells its clock that a real report just happened
|
|
17
|
-
// (joshuafolkken/kit#1520).
|
|
16
|
+
// observations, and `--mark`, which tells its clock that a real report just happened.
|
|
18
17
|
//
|
|
19
18
|
// **This is the one josh command that is meant to be started and left running.** Every other one
|
|
20
|
-
// answers once and the parent's own loop drives it; that shape
|
|
19
|
+
// answers once and the parent's own loop drives it; that shape does not fit here, because
|
|
21
20
|
// a parent that waits and reports spends one of its own turns per heartbeat — 36 of them in a
|
|
22
21
|
// three-hour run, taken at the point its context is largest. So the loop lives here, the parent
|
|
23
22
|
// starts it in the background, and all the parent does is relay what appears.
|
|
@@ -30,7 +29,8 @@ import { run_progress_read, type ObservationRead } from './run-progress-read'
|
|
|
30
29
|
// **It cannot send a Telegram.** That is structural rather than a promise — nothing here imports
|
|
31
30
|
// `scripts/notify/telegram-notify`, which is the only egress there is. A heartbeat every twenty minutes on
|
|
32
31
|
// a phone is notification fatigue, and it would cheapen the `confirmation` and `completion` messages
|
|
33
|
-
// that do need to interrupt someone.
|
|
32
|
+
// that do need to interrupt someone. Only an explicit `run:board --every <minutes>`, started because a
|
|
33
|
+
// person asked for periodic progress off-screen, sends one.
|
|
34
34
|
|
|
35
35
|
const SUCCESS_EXIT_CODE = 0
|
|
36
36
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -52,20 +52,19 @@ const DECLINE_RETRY_SECONDS = 120
|
|
|
52
52
|
// The clock a fresh loop starts with: nothing has declined yet, so nothing is being waited out.
|
|
53
53
|
const NO_RETRY = 0
|
|
54
54
|
const { DEFAULT_WAIT_MAX_HOURS } = run_progress_args
|
|
55
|
-
const
|
|
56
|
-
const DISABLED_VALUE = '0'
|
|
55
|
+
const { DISABLED_KEY, DISABLED_VALUE, is_disabled } = run_progress
|
|
57
56
|
|
|
58
|
-
//
|
|
59
|
-
//
|
|
57
|
+
// A malformed `--wait` exits at once, and read as "started" it would leave a person without progress
|
|
58
|
+
// until someone looked at the exit — so the refusal says the relay is down.
|
|
60
59
|
const USAGE =
|
|
61
60
|
'Usage: josh run:progress [--repo <owner/repo>] [--interval <minutes>] [--output <path>] [--once | --wait] [--hours <hours>] | josh run:progress --mark | josh run:progress --path\nThe progress watcher did not start, so nothing is relaying progress to this session — fix the arguments (one flag and one value per argument) and start it again.'
|
|
62
|
-
const DISABLED_NOTICE = `\`${
|
|
61
|
+
const DISABLED_NOTICE = `\`${DISABLED_KEY}=${DISABLED_VALUE}\` is set, so no progress is reported.`
|
|
63
62
|
const MARKED_NOTICE =
|
|
64
63
|
'Recorded a report at this moment. The next progress line waits a full interval from here, so a heartbeat cannot land immediately behind a real report.'
|
|
65
64
|
// A dispatched lane child carries `JOSH_LANE_CHILD`, and only the outermost run reports progress — a
|
|
66
|
-
// child that started a watcher of its own would be the second one this command's whole design refuses
|
|
67
|
-
//
|
|
68
|
-
//
|
|
65
|
+
// child that started a watcher of its own would be the second one this command's whole design refuses.
|
|
66
|
+
// The mark makes that mechanical, so a bare `fullrun #N` handed to a lane does not read itself as
|
|
67
|
+
// outermost.
|
|
69
68
|
const LANE_CHILD_NOTICE =
|
|
70
69
|
'This session is a dispatched lane child (`JOSH_LANE_CHILD`), so no progress watcher is started — the outermost run reports for every child.'
|
|
71
70
|
const IDLE_NOTICE =
|
|
@@ -74,15 +73,14 @@ const UNREADABLE_NOTICE =
|
|
|
74
73
|
'The `in-progress` listing could not be read, so nothing is reported. That is not "nothing is running" — check `gh auth status` and ask again.'
|
|
75
74
|
const FAILED_TICK_PREFIX =
|
|
76
75
|
'A progress reading failed, so nothing is reported for it. The watcher is still running, and will read again after the cooldown:'
|
|
77
|
-
const WAIT_EXPIRED_NOTICE = `The watch bound (\`--hours\`, ${String(DEFAULT_WAIT_MAX_HOURS)} by default for \`--wait\`) ran out with no newly runnable work arriving. Every report it made is already on the run's event stream
|
|
76
|
+
const WAIT_EXPIRED_NOTICE = `The watch bound (\`--hours\`, ${String(DEFAULT_WAIT_MAX_HOURS)} by default for \`--wait\`) ran out with no newly runnable work arriving. Every report it made is already on the run's event stream, which the \`pnpm josh run:board\` pane draws, so there is nothing to relay. Starting another \`--wait\` resumes the same clock.`
|
|
78
77
|
// The repository name is only ever printed, never written against, so the bounded lookup is the right
|
|
79
78
|
// one: a `gh` call that hangs would otherwise block the synchronous read at startup and leave the
|
|
80
79
|
// watcher neither running nor saying so.
|
|
81
80
|
const REPO_LOOKUP_TIMEOUT_SECONDS = 10
|
|
82
81
|
const REPO_LOOKUP_TIMEOUT_MS = REPO_LOOKUP_TIMEOUT_SECONDS * run_progress.MS_PER_SECOND
|
|
83
82
|
// A lookup that timed out or failed is not an argument the caller got wrong, so it is told apart from
|
|
84
|
-
// the usage error — read as one, it
|
|
85
|
-
// (joshuafolkken/kit#2859).
|
|
83
|
+
// the usage error — read as one, it would send a person to fix arguments that were correct.
|
|
86
84
|
const REPO_UNRESOLVED_NOTICE = `The repository could not be resolved (\`gh\` did not answer within ${String(REPO_LOOKUP_TIMEOUT_SECONDS)}s or failed), so the progress watcher did not start. Pass \`--repo <owner/repo>\` and start it again.`
|
|
87
85
|
|
|
88
86
|
const DECLINE_NOTICES: Readonly<Record<'idle' | 'unreadable', string>> = {
|
|
@@ -105,8 +103,7 @@ interface WatchOptions {
|
|
|
105
103
|
repo: string
|
|
106
104
|
tick_ms: number
|
|
107
105
|
// `--wait` alone: the line goes to the run's event stream and the ambient log, never to standard
|
|
108
|
-
// output, because a background command's output reaches the session only as a wake
|
|
109
|
-
// (joshuafolkken/kit#3102).
|
|
106
|
+
// output, because a background command's output reaches the session only as a wake.
|
|
110
107
|
is_stream_only?: boolean
|
|
111
108
|
}
|
|
112
109
|
|
|
@@ -120,8 +117,7 @@ type DeclineKind = Exclude<ObservationRead['kind'], 'observed'>
|
|
|
120
117
|
|
|
121
118
|
// A union rather than an optional field, so a caller that wants the reason has to establish that
|
|
122
119
|
// there is one — the reason exists exactly when no line went out. `line` is the exact string printed,
|
|
123
|
-
// handed back so the caller can persist it verbatim for `josh run:wake --list` to relay
|
|
124
|
-
// (joshuafolkken/kit#1910).
|
|
120
|
+
// handed back so the caller can persist it verbatim for `josh run:wake --list` to relay.
|
|
125
121
|
type EmitResult = { kind: DeclineKind } | { kind: 'observed'; state: ProgressState; line: string }
|
|
126
122
|
|
|
127
123
|
interface WatchLoop {
|
|
@@ -141,10 +137,6 @@ const FRESH_LOOP: Omit<WatchLoop, 'last_ms'> = {
|
|
|
141
137
|
state: undefined,
|
|
142
138
|
}
|
|
143
139
|
|
|
144
|
-
function is_disabled(): boolean {
|
|
145
|
-
return process.env[ENVIRONMENT_KEY] === DISABLED_VALUE
|
|
146
|
-
}
|
|
147
|
-
|
|
148
140
|
function report_usage(): number {
|
|
149
141
|
console.error(USAGE)
|
|
150
142
|
|
|
@@ -197,7 +189,7 @@ async function emit(options: WatchOptions, context: EmitContext): Promise<EmitRe
|
|
|
197
189
|
const state = run_progress.next_state(context.state, key, context.now_ms)
|
|
198
190
|
|
|
199
191
|
// The interval reaches the line from the options rather than being resolved a second time, so the
|
|
200
|
-
// schedule printed and the clock `step` consults are one number
|
|
192
|
+
// schedule printed and the clock `step` consults are one number. Both
|
|
201
193
|
// reporting forms come through here, which is what puts the field on `--wait` and `--once` alike.
|
|
202
194
|
const line = run_progress.format_line(read.observations, {
|
|
203
195
|
interval_ms: options.interval_ms,
|
|
@@ -261,7 +253,7 @@ async function attempt(
|
|
|
261
253
|
* print one straight after the run's real report — which is the single thing this command is built
|
|
262
254
|
* not to do.
|
|
263
255
|
*
|
|
264
|
-
* **A tick that printed nothing does not move the report clock.** A decline
|
|
256
|
+
* **A tick that printed nothing does not move the report clock.** A decline means no run has
|
|
265
257
|
* started here at all, so the silence has not been broken and the first report is emitted at once
|
|
266
258
|
* instead of waiting out an interval spent idle; what a decline moves instead is the read cooldown.
|
|
267
259
|
*/
|
|
@@ -292,9 +284,9 @@ async function step(options: WatchOptions, target: string, loop: WatchLoop): Pro
|
|
|
292
284
|
* The loop both reporting forms are, with one difference between them.
|
|
293
285
|
*
|
|
294
286
|
* `watch` runs until `--hours` expires; `--wait` stops at the first arrival and keeps its lines off
|
|
295
|
-
* standard output
|
|
296
|
-
*
|
|
297
|
-
*
|
|
287
|
+
* standard output. Everything else — where the clock is seeded from, the tick, the decline cooldown
|
|
288
|
+
* `step` keeps — is one implementation on purpose: two copies would let a fix to the bound or to the
|
|
289
|
+
* initial silence reach one form and not the other, and `--wait` is the form a run starts.
|
|
298
290
|
*/
|
|
299
291
|
// The silence this loop starts from: the record where there is one, and otherwise the moment it began
|
|
300
292
|
// watching, so a first line on a tree with no record reports the wait it actually did.
|
|
@@ -304,11 +296,11 @@ function seed_loop(target: string, started_ms: number): WatchLoop {
|
|
|
304
296
|
|
|
305
297
|
// Why the loop stopped, so `drive` prints the bound-expired notice only when the bound is what
|
|
306
298
|
// expired — not when `josh followup` ended the watcher, which is a clean stop with nothing to report.
|
|
307
|
-
// `arrived` is a `--wait` ended early by newly runnable work
|
|
299
|
+
// `arrived` is a `--wait` ended early by newly runnable work.
|
|
308
300
|
type WatchExit = 'arrived' | 'ended' | 'bound'
|
|
309
301
|
|
|
310
302
|
// `wait` is present for `--wait` alone, which ends at the first arrival its probe sees. **A report is
|
|
311
|
-
// not an exit
|
|
303
|
+
// not an exit**: every exit wakes the session that started it, and a wake
|
|
312
304
|
// spent relaying a line the event stream already carries is the most expensive turn a run takes, so
|
|
313
305
|
// only what the parent has to act on ends the wait.
|
|
314
306
|
async function wait_exit(wait: ArrivalProbe | undefined): Promise<WatchExit | undefined> {
|
|
@@ -334,10 +326,9 @@ function final_exit(life: string): WatchExit {
|
|
|
334
326
|
}
|
|
335
327
|
|
|
336
328
|
// The loop both reporting forms share, reading its own liveness record at the top of each pass — the
|
|
337
|
-
// `run-wake-loop.ts` `run_loop` shape
|
|
338
|
-
//
|
|
339
|
-
//
|
|
340
|
-
// until `--hours` expires.
|
|
329
|
+
// `run-wake-loop.ts` `run_loop` shape. A record gone means `josh followup` removed it at the merge,
|
|
330
|
+
// so the watcher stops at once instead of waiting out its bound; `--wait` also stops at the first
|
|
331
|
+
// arrival, and otherwise the loop runs until `--hours` expires.
|
|
341
332
|
async function run_ticks(
|
|
342
333
|
options: WatchOptions,
|
|
343
334
|
target: string,
|
|
@@ -370,8 +361,8 @@ async function drive(options: WatchOptions, is_wait: boolean): Promise<number> {
|
|
|
370
361
|
const exit = await run_ticks(options, target, life, wait)
|
|
371
362
|
|
|
372
363
|
if (exit === 'bound' && is_wait) console.error(WAIT_EXPIRED_NOTICE)
|
|
373
|
-
// Every `--wait` exit is a wake, so it carries the pick-up reading with it
|
|
374
|
-
//
|
|
364
|
+
// Every `--wait` exit is a wake, so it carries the pick-up reading with it — the reading an
|
|
365
|
+
// `arrived` exit was woken for.
|
|
375
366
|
if (is_wait) await backlog_ready.print_ready_line()
|
|
376
367
|
|
|
377
368
|
return SUCCESS_EXIT_CODE
|
|
@@ -398,31 +389,28 @@ async function once(options: WatchOptions): Promise<number> {
|
|
|
398
389
|
}
|
|
399
390
|
|
|
400
391
|
/**
|
|
401
|
-
* The form a run starts in the background: it reports on its own and wakes the caller only for work
|
|
402
|
-
* (joshuafolkken/kit#3102).
|
|
392
|
+
* The form a run starts in the background: it reports on its own and wakes the caller only for work.
|
|
403
393
|
*
|
|
404
|
-
* **A report is not a wake.**
|
|
405
|
-
*
|
|
406
|
-
*
|
|
407
|
-
*
|
|
408
|
-
*
|
|
409
|
-
*
|
|
410
|
-
* record, or on its bound. The caller starts it once and restarts it only after one of those.
|
|
394
|
+
* **A report is not a wake.** Ending at each line would cost the orchestrating session one turn per
|
|
395
|
+
* heartbeat, re-reading its whole context to pass on a line it may not change. Every line already
|
|
396
|
+
* reaches the run's event stream as a `heartbeat` and the ambient log, which a person's `run:board`
|
|
397
|
+
* pane reads with no model in between, so this form keeps its lines off standard output and exits
|
|
398
|
+
* only on an arrival, on `josh followup` ending its life record, or on its bound. The caller starts it
|
|
399
|
+
* once and restarts it only after one of those.
|
|
411
400
|
*
|
|
412
401
|
* **The clock is still this command's, not the caller's.** It is the watch loop itself, a tick at a
|
|
413
402
|
* time, rather than a second reading of the same record — so a real report elsewhere pushes the next
|
|
414
|
-
* line out and a declined reading takes the same cooldown
|
|
415
|
-
* intact: the caller arms no timer of its own.
|
|
403
|
+
* line out and a declined reading takes the same cooldown, and the caller arms no timer of its own.
|
|
416
404
|
*
|
|
417
405
|
* **One at a time is the caller's part rather than this loop's.** The record is read before the `gh`
|
|
418
406
|
* reads and written after them, so two of these running at once could both find the same silence due
|
|
419
407
|
* and both print; `backlogrun.md` starts exactly one, which is where that is guaranteed.
|
|
420
408
|
*
|
|
421
|
-
* **A decline is not an exit.** A decline
|
|
409
|
+
* **A decline is not an exit.** A decline means no run has started here at all — no hold, no
|
|
422
410
|
* carried budget, no lane, and no `in-progress` child — so a genuinely idle repository keeps the loop
|
|
423
411
|
* waiting instead of ending it; returning there would hand the caller an instant answer to restart,
|
|
424
412
|
* and the documented restart makes that a poll rather than a heartbeat. Once a run has started the
|
|
425
|
-
* loop reports even before the first child carries `in-progress
|
|
413
|
+
* loop reports even before the first child carries `in-progress`.
|
|
426
414
|
*/
|
|
427
415
|
async function wait_once(options: WatchOptions): Promise<number> {
|
|
428
416
|
return await drive({ ...options, is_stream_only: true }, true)
|
|
@@ -436,7 +424,7 @@ async function mark_now(): Promise<number> {
|
|
|
436
424
|
}
|
|
437
425
|
|
|
438
426
|
// The ambient log's path on standard output, so a person can `tail -F` the surface the heartbeat keeps
|
|
439
|
-
// across a session cut
|
|
427
|
+
// across a session cut. It reads no run state, so it answers even before one
|
|
440
428
|
// has started and in a lane child alike — the path is a function of the checkout, not of a live run.
|
|
441
429
|
async function report_path(): Promise<number> {
|
|
442
430
|
console.info(await run_progress_read.log_target())
|
|
@@ -497,6 +485,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
497
485
|
}
|
|
498
486
|
|
|
499
487
|
const run_progress_cli = {
|
|
488
|
+
DECLINE_RETRY_SECONDS,
|
|
500
489
|
DEFAULT_WAIT_MAX_HOURS,
|
|
501
490
|
DISABLED_NOTICE,
|
|
502
491
|
FAILED_TICK_PREFIX,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
2
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
3
|
import { error_text } from '#scripts/lib/error-message'
|
|
4
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
5
|
import { z } from 'zod'
|
|
5
6
|
|
|
6
|
-
// The report clock `josh run:progress` keeps, in the one form both of its readers can use
|
|
7
|
-
// (joshuafolkken/kit#1570).
|
|
7
|
+
// The report clock `josh run:progress` keeps, in the one form both of its readers can use.
|
|
8
8
|
//
|
|
9
|
-
// **
|
|
9
|
+
// **One of its two readers cannot await.** The watcher reads the
|
|
10
10
|
// record between ticks, where an `async` call costs nothing; the trigger-delivered rule that refuses
|
|
11
11
|
// an early heartbeat (`scripts/rules/early-heartbeat.ts`) reads it inside a `PreToolUse` hook, whose
|
|
12
12
|
// decision is synchronous from payload to envelope. Copying the record's shape into the hook would be
|
|
@@ -26,17 +26,17 @@ const PROGRESS_PREFIX = 'josh-run-progress-'
|
|
|
26
26
|
// run last reported and is written on every heartbeat, so it can never double as "should this watcher
|
|
27
27
|
// still be running". This one is presence-only — the watcher writes it once when it begins, reads it
|
|
28
28
|
// every tick, and ends the moment it is gone, which is how `josh followup` stops a watcher at the
|
|
29
|
-
// merge instead of leaving it to wait out its whole bound
|
|
30
|
-
//
|
|
29
|
+
// merge instead of leaving it to wait out its whole bound. It reuses the same key as the report clock
|
|
30
|
+
// — the work tree's own git directory — so both name one file per run.
|
|
31
31
|
//
|
|
32
32
|
// **The loop that reads its own record and exits when it is gone is `run-wake-loop.ts`'s `run_loop`
|
|
33
|
-
// pattern
|
|
33
|
+
// pattern, and the read/write is `stamp_file`.** Neither is re-implemented
|
|
34
34
|
// here: this module only names the record, exactly as it names the report clock. Unlike `run-hold`'s
|
|
35
35
|
// and `run-carry`'s records it needs no expiry, because it is read only by the one watcher that wrote
|
|
36
36
|
// it — never by another run deciding whether a resource is free — so a fresh watcher always overwrites
|
|
37
37
|
// a stale one and there is no cross-run read to fall open.
|
|
38
38
|
const LIFE_PREFIX = 'josh-run-progress-life-'
|
|
39
|
-
// **The ambient surface the heartbeat keeps across a session cut
|
|
39
|
+
// **The ambient surface the heartbeat keeps across a session cut.** The report
|
|
40
40
|
// clock holds only the *last* line, which `josh run:wake --list` relays on demand — a person has to
|
|
41
41
|
// type for it, so after a cut the heartbeat sits at the *requested* tier. This log mirrors every
|
|
42
42
|
// heartbeat line into a plain-text file beside the clock, so a person who keeps `tail -F` open on it
|
|
@@ -59,7 +59,7 @@ const BLOCK_SEPARATOR = '\n\n'
|
|
|
59
59
|
|
|
60
60
|
// `line` is the last heartbeat the watcher printed, kept verbatim beside the clock so a reader that
|
|
61
61
|
// cannot see the watcher's transcript — a person checking a woken headless `backlogrun` through
|
|
62
|
-
// `josh run:wake --list` — still reads the exact line it emitted
|
|
62
|
+
// `josh run:wake --list` — still reads the exact line it emitted. It is
|
|
63
63
|
// optional because a bare `--mark` moves the clock without producing one, and because a record written
|
|
64
64
|
// before this field existed carries only `reported_at`.
|
|
65
65
|
const report_stamp_schema = z.object({ reported_at: z.string(), line: z.string().optional() })
|
|
@@ -78,18 +78,14 @@ function parse_stamp(raw: string): number | undefined {
|
|
|
78
78
|
* The last heartbeat line the watcher persisted, or `undefined` for an absent, unparsable, or
|
|
79
79
|
* pre-`line` record. This is what `josh run:wake --list` relays to a person who is no longer the parent
|
|
80
80
|
* session — the headless parent woken after a cut prints its progress only to its own transcript, and
|
|
81
|
-
* this record is the one place that line survives
|
|
81
|
+
* this record is the one place that line survives.
|
|
82
82
|
*/
|
|
83
83
|
function read_last_line(target: string): string | undefined {
|
|
84
84
|
const raw = stamp_file.read_stamp_text(target)
|
|
85
85
|
|
|
86
86
|
if (raw === undefined) return undefined
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
return report_stamp_schema.safeParse(JSON.parse(raw)).data?.line
|
|
90
|
-
} catch {
|
|
91
|
-
return undefined
|
|
92
|
-
}
|
|
88
|
+
return json_value.parse_with(raw, report_stamp_schema)?.line
|
|
93
89
|
}
|
|
94
90
|
|
|
95
91
|
/**
|
|
@@ -112,13 +108,13 @@ function read_last_report(target: string): number | undefined {
|
|
|
112
108
|
}
|
|
113
109
|
|
|
114
110
|
// The ambient log's path, a sibling of the report clock so one directory names both and the CLI can
|
|
115
|
-
// derive it from the clock target alone
|
|
111
|
+
// derive it from the clock target alone.
|
|
116
112
|
function log_path_of(target: string): string {
|
|
117
113
|
return `${target}${LOG_SUFFIX}`
|
|
118
114
|
}
|
|
119
115
|
|
|
120
|
-
// **Staleness is read from the report clock's own last timestamp, not the log file's mtime
|
|
121
|
-
//
|
|
116
|
+
// **Staleness is read from the report clock's own last timestamp, not the log file's mtime.** The
|
|
117
|
+
// clock's `reported_at` is the run's own clock — a copy or a backup can
|
|
122
118
|
// move a file's mtime, and a fresh run whose first heartbeat found a previous run's log would then
|
|
123
119
|
// append to it. It is read before `mark` overwrites the clock, so it sees the *previous* report.
|
|
124
120
|
function is_log_stale(target: string, now_ms: number): boolean {
|
|
@@ -162,10 +158,9 @@ function append_line(
|
|
|
162
158
|
|
|
163
159
|
// A heartbeat carries its line; a bare `--mark` (a real report resetting the clock) carries none and
|
|
164
160
|
// **preserves the line already there** rather than blanking it — so `josh run:wake --list` keeps
|
|
165
|
-
// showing the most recent heartbeat between a run's real reports rather than going empty on every one
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
// (joshuafolkken/kit#2156).
|
|
161
|
+
// showing the most recent heartbeat between a run's real reports rather than going empty on every one.
|
|
162
|
+
// A carried line is also mirrored into the ambient log — the surface a person keeps open across a cut
|
|
163
|
+
// — before the clock is overwritten, so staleness sees the previous report.
|
|
169
164
|
function mark(target: string, now_ms: number, line?: string): void {
|
|
170
165
|
const reported_at = new Date(now_ms).toISOString()
|
|
171
166
|
const kept = line ?? read_last_line(target)
|
|
@@ -177,9 +172,8 @@ function mark(target: string, now_ms: number, line?: string): void {
|
|
|
177
172
|
stamp_file.write_stamp(target, kept === undefined ? { reported_at } : { reported_at, line: kept })
|
|
178
173
|
}
|
|
179
174
|
|
|
180
|
-
// `undefined` is passed straight through so `stamp_file`'s own default root stands
|
|
181
|
-
//
|
|
182
|
-
// path no other code path produces.
|
|
175
|
+
// `undefined` is passed straight through so `stamp_file`'s own default root stands. Hashing an empty
|
|
176
|
+
// string instead would key the record on a path no other code path produces.
|
|
183
177
|
function stamp_target_of(git_directory: string | undefined): string {
|
|
184
178
|
return stamp_file.stamp_path(PROGRESS_PREFIX, git_directory)
|
|
185
179
|
}
|
|
@@ -193,10 +187,9 @@ function life_target_of(git_directory: string | undefined): string {
|
|
|
193
187
|
|
|
194
188
|
// **`pinged_at` is written by every tick and checked by `is_life_fresh`.** Without it the life record
|
|
195
189
|
// is presence-only — existence is the only signal, and a record from a watcher that stopped an hour
|
|
196
|
-
// ago is indistinguishable from one whose watcher is live.
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
// which is what makes this backward-compatible.
|
|
190
|
+
// ago is indistinguishable from one whose watcher is live. `pinged_at` in the payload lets a guard
|
|
191
|
+
// detect "children in-flight but watcher stale" without a second file. It is optional on read, so a
|
|
192
|
+
// record carrying only `{ alive: true }` still parses.
|
|
200
193
|
const life_schema = z.object({ alive: z.literal(true), pinged_at: z.string().optional() })
|
|
201
194
|
|
|
202
195
|
// The watcher declares itself alive. `write_stamp` unlinks first, so a fresh `--wait` cleanly replaces
|
|
@@ -221,9 +214,9 @@ function parse_pinged_at(raw: string): number | undefined {
|
|
|
221
214
|
return Number.isNaN(pinged_ms) ? undefined : pinged_ms
|
|
222
215
|
}
|
|
223
216
|
|
|
224
|
-
// Returns `false` for any absent, unreadable or un-timestamped record — both "no watcher" and
|
|
225
|
-
//
|
|
226
|
-
//
|
|
217
|
+
// Returns `false` for any absent, unreadable or un-timestamped record — both "no watcher" and a record
|
|
218
|
+
// without `pinged_at` produce `false`, which is the safe direction for a guard: it speaks up rather
|
|
219
|
+
// than staying silent.
|
|
227
220
|
function is_life_fresh(target: string, threshold_ms: number): boolean {
|
|
228
221
|
const raw = stamp_file.read_stamp_text(target)
|
|
229
222
|
|
|
@@ -243,7 +236,7 @@ function is_life_fresh(target: string, threshold_ms: number): boolean {
|
|
|
243
236
|
// **Gone means ended.** `read_stamp_text` answers `undefined` for an absent or unowned record, and the
|
|
244
237
|
// only writer is the watcher itself, so absence means `josh followup` removed it — or nobody began
|
|
245
238
|
// one. Either way the watcher stops, which is the fail-quiet direction: a watcher that kept running on
|
|
246
|
-
// a missing record would be the lingering process
|
|
239
|
+
// a missing record would be the lingering process the liveness record exists to end.
|
|
247
240
|
function is_life_ended(target: string): boolean {
|
|
248
241
|
return stamp_file.read_stamp_text(target) === undefined
|
|
249
242
|
}
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { ancestor_directories } from '#scripts/lib/ancestor-directories'
|
|
4
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
5
|
import { z } from 'zod'
|
|
5
6
|
import { run_progress } from './run-progress'
|
|
6
7
|
|
|
7
|
-
// Where the silence interval comes from, and in what order
|
|
8
|
+
// Where the silence interval comes from, and in what order.
|
|
8
9
|
//
|
|
9
|
-
// **The
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// twenty with them. Reporting still happened there, at a cadence nobody asked for.
|
|
13
|
-
//
|
|
14
|
-
// **So the repository carries one of its own.** `josh.progress_interval_minutes` in `package.json` is
|
|
10
|
+
// **The repository carries a setting of its own.** `JOSH_PROGRESS_INTERVAL_MINUTES` is read from
|
|
11
|
+
// `.env`, which is never committed, so it cannot reach other machines or cloud sessions.
|
|
12
|
+
// `josh.progress_interval_minutes` in `package.json` is
|
|
15
13
|
// committed, is per repository rather than per toolkit, and is read through the same reader both
|
|
16
14
|
// halves of the mechanism already share — the watcher before it prints, and the `early-heartbeat` row
|
|
17
15
|
// before it allows an arm. A guard that could disagree with the watcher it guards is worse than no
|
|
@@ -39,9 +37,8 @@ const package_schema = z.object({
|
|
|
39
37
|
function read_declared_minutes(directory: string): number | undefined {
|
|
40
38
|
try {
|
|
41
39
|
const raw = readFileSync(path.join(directory, PACKAGE_FILE), 'utf8')
|
|
42
|
-
const parsed = package_schema.safeParse(JSON.parse(raw))
|
|
43
40
|
|
|
44
|
-
return
|
|
41
|
+
return json_value.parse_with(raw, package_schema)?.josh?.progress_interval_minutes
|
|
45
42
|
} catch {
|
|
46
43
|
return undefined
|
|
47
44
|
}
|
|
@@ -12,22 +12,22 @@ import type { ChildObservation, LaneObservation, Observations } from './run-prog
|
|
|
12
12
|
import { run_progress_clock } from './run-progress-clock'
|
|
13
13
|
|
|
14
14
|
// Everything `josh run:progress` reads: the last-report record that makes the clock a silence clock,
|
|
15
|
-
// and the observations one tick puts on the line
|
|
15
|
+
// and the observations one tick puts on the line.
|
|
16
16
|
//
|
|
17
17
|
// **Every reader here is one that already exists.** The children in flight come from
|
|
18
18
|
// `epic_busy.read_repository`, which is the same `in-progress` listing `epicrun` sizes its lanes
|
|
19
19
|
// from — a second definition of "running" would let the progress line disagree with the loop that
|
|
20
20
|
// printed the child. The pull request comes from `run_preflight`, the lanes from `lane_registry`, and
|
|
21
|
-
// the transcript sample from `run_liveness.sample_output`, whose symlink-following `statSync` is
|
|
22
|
-
//
|
|
21
|
+
// the transcript sample from `run_liveness.sample_output`, whose symlink-following `statSync` is
|
|
22
|
+
// load-bearing; re-`stat`ing the path here would risk losing it.
|
|
23
23
|
//
|
|
24
24
|
// **The record is kept per work tree**, keyed the way `run_hold` keys its own: two lanes of one
|
|
25
25
|
// repository are two runs, and one lane's report must not silence the other's clock.
|
|
26
26
|
|
|
27
27
|
// The record itself — its name, its shape, and how it is read and written — lives in
|
|
28
28
|
// `run-progress-clock.ts`, because the trigger-delivered rule that refuses an early heartbeat reads
|
|
29
|
-
// the same record from inside a `PreToolUse` hook and cannot await the git call this file makes
|
|
30
|
-
//
|
|
29
|
+
// the same record from inside a `PreToolUse` hook and cannot await the git call this file makes.
|
|
30
|
+
// What stays here is the asynchronous way of naming the work tree.
|
|
31
31
|
const { mark, parse_stamp, read_last_report } = run_progress_clock
|
|
32
32
|
|
|
33
33
|
const FIRST_LOAD_AVERAGE = 0
|
|
@@ -37,7 +37,7 @@ const FIRST_LOAD_AVERAGE = 0
|
|
|
37
37
|
// can mean "there is nothing to report", and saying so for the third would be a confident absence
|
|
38
38
|
// built on a read nobody completed. **The middle one is `idle` only when no run has started** — a run
|
|
39
39
|
// underway with no `in-progress` child yet is `observed` with an empty `children`, which is the
|
|
40
|
-
// heartbeat this file emits before the first label appears
|
|
40
|
+
// heartbeat this file emits before the first label appears.
|
|
41
41
|
type ObservationRead =
|
|
42
42
|
{ kind: 'idle' } | { kind: 'observed'; observations: Observations } | { kind: 'unreadable' }
|
|
43
43
|
|
|
@@ -59,13 +59,13 @@ async function stamp_target(): Promise<string> {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// The ambient log's path, a sibling of the report clock — the surface `josh run:progress --path` names
|
|
62
|
-
// so a person can keep it open across a session cut
|
|
62
|
+
// so a person can keep it open across a session cut.
|
|
63
63
|
async function log_target(): Promise<string> {
|
|
64
64
|
return run_progress_clock.log_path_of(await stamp_target())
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
// The watcher's liveness record, resolved through the same resolver as `stamp_target`, so the file the
|
|
68
|
-
// watcher begins is the file `josh followup` removes at the merge
|
|
68
|
+
// watcher begins is the file `josh followup` removes at the merge.
|
|
69
69
|
async function live_target(): Promise<string> {
|
|
70
70
|
return run_progress_clock.life_target_of(await worktree_git_directory())
|
|
71
71
|
}
|
|
@@ -146,8 +146,7 @@ async function has_run_record(): Promise<boolean> {
|
|
|
146
146
|
|
|
147
147
|
/**
|
|
148
148
|
* Whether a run has started in this checkout, read from a mechanical record rather than from the
|
|
149
|
-
* `in-progress` label — the label is exactly what is missing in the window this bridges
|
|
150
|
-
* (joshuafolkken/kit#1900).
|
|
149
|
+
* `in-progress` label — the label is exactly what is missing in the window this bridges.
|
|
151
150
|
*
|
|
152
151
|
* A registered lane covers an `epicrun` / `backlogrun` parent whose child has not labelled yet — and
|
|
153
152
|
* it is the one signal already read for the line, so it is asked first and short-circuits the git
|