@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
package/scripts/git/main-sync.ts
CHANGED
|
@@ -4,10 +4,11 @@ import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-c
|
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
5
|
import { git_command } from './git-command'
|
|
6
6
|
import { gone_branch, type PruneResult } from './gone-branch'
|
|
7
|
+
import { lockfile_sync } from './lockfile-sync'
|
|
7
8
|
|
|
8
|
-
// `josh main:sync` (`josh ms`) — return this checkout to the default branch and pull
|
|
9
|
-
//
|
|
10
|
-
// (
|
|
9
|
+
// `josh main:sync` (`josh ms`) — return this checkout to the default branch and pull,
|
|
10
|
+
// then prune the local branches whose merged remote branch is gone
|
|
11
|
+
// (the rule for which ones is `gone-branch.ts`).
|
|
11
12
|
//
|
|
12
13
|
// **It refuses inside a linked work tree, and that refusal is the reason this stopped being a
|
|
13
14
|
// one-line `sh -c` entry.** The default branch is a *branch*: advancing it means checking it out
|
|
@@ -28,6 +29,8 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
28
29
|
const FAILURE_EXIT_CODE = 1
|
|
29
30
|
const ARGV_OFFSET = 2
|
|
30
31
|
const COMMAND_NAME = 'main:sync'
|
|
32
|
+
const INSTALL_FAILURE =
|
|
33
|
+
'node_modules is behind pnpm-lock.yaml and `pnpm install --frozen-lockfile` failed; run `pnpm josh ms` again, or the install here by hand.'
|
|
31
34
|
|
|
32
35
|
// `git_directories()` returns `[--absolute-git-dir, --git-common-dir]`. They are the same path in the
|
|
33
36
|
// main work tree and differ in a linked one, which is git's own definition of the distinction rather
|
|
@@ -70,12 +73,12 @@ async function prune_quietly(default_branch: string): Promise<void> {
|
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
75
|
|
|
73
|
-
// **The local default branch is fast-forwarded before it is checked out
|
|
76
|
+
// **The local default branch is fast-forwarded before it is checked out**.
|
|
74
77
|
// A run's ledger file is committed on its feature branch and merged; a line appended afterwards leaves
|
|
75
78
|
// it dirty, and git refuses to check out a stale default branch that lacks the file — so `run:tail`'s
|
|
76
|
-
// sync
|
|
77
|
-
// the committed file and the checkout carries the dirty lines over (the same step the flush
|
|
78
|
-
//
|
|
79
|
+
// sync would fail exactly when the flush after it had work. Once fast-forwarded, the default branch
|
|
80
|
+
// holds the committed file and the checkout carries the dirty lines over (the same step the flush
|
|
81
|
+
// takes). Skipped on the default branch, where `fetch` refuses to update the checked-out
|
|
79
82
|
// ref; a refusal elsewhere — a local default ahead of origin — is left to the checkout and pull to judge.
|
|
80
83
|
async function fast_forward_quietly(default_branch: string): Promise<void> {
|
|
81
84
|
if ((await git_command.branch()) === default_branch) return
|
|
@@ -87,6 +90,18 @@ async function fast_forward_quietly(default_branch: string): Promise<void> {
|
|
|
87
90
|
}
|
|
88
91
|
}
|
|
89
92
|
|
|
93
|
+
// A pull that changed the lock leaves `node_modules` behind it, and every `josh` typed in this checkout
|
|
94
|
+
// then fails to load the new dependency — so the install the lock now asks for
|
|
95
|
+
// is part of the sync, and its failure is the sync's. A failed one is retried by the next `ms`.
|
|
96
|
+
async function reinstall(root: string): Promise<number> {
|
|
97
|
+
const result = await lockfile_sync.reinstall_if_stale(root)
|
|
98
|
+
|
|
99
|
+
if (result.is_installed) return SUCCESS_EXIT_CODE
|
|
100
|
+
console.error(`${INSTALL_FAILURE}\n${result.output}`)
|
|
101
|
+
|
|
102
|
+
return FAILURE_EXIT_CODE
|
|
103
|
+
}
|
|
104
|
+
|
|
90
105
|
async function synchronize(): Promise<number> {
|
|
91
106
|
const default_branch = await git_command.get_default_branch()
|
|
92
107
|
|
|
@@ -96,7 +111,7 @@ async function synchronize(): Promise<number> {
|
|
|
96
111
|
await prune_quietly(default_branch)
|
|
97
112
|
console.info(default_branch)
|
|
98
113
|
|
|
99
|
-
return
|
|
114
|
+
return await reinstall(await git_command.repository_root())
|
|
100
115
|
}
|
|
101
116
|
|
|
102
117
|
// The argument refusal is kept even though this is no longer an `sh -c` entry: the message is the
|
|
@@ -1,17 +1,12 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
1
2
|
import type { z } from 'zod'
|
|
2
3
|
|
|
3
|
-
//
|
|
4
|
-
// mismatches are deliberately not folded in here: those rethrow, so a shape change stays
|
|
5
|
-
// instead of silently degrading to a fallback.
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
// Input that is not JSON at all reads as `undefined`, letting each caller pick its own empty value.
|
|
5
|
+
// Schema mismatches are deliberately not folded in here: those rethrow, so a shape change stays
|
|
6
|
+
// visible instead of silently degrading to a fallback. A reader that wants both gaps as `undefined`
|
|
7
|
+
// is `json_value.parse_with`.
|
|
8
8
|
function parse_json_loose(raw_json: string): unknown {
|
|
9
|
-
|
|
10
|
-
return JSON.parse(raw_json)
|
|
11
|
-
} catch (error) {
|
|
12
|
-
if (error instanceof SyntaxError) return MALFORMED_JSON
|
|
13
|
-
throw error
|
|
14
|
-
}
|
|
9
|
+
return json_value.parse_or_undefined(raw_json)
|
|
15
10
|
}
|
|
16
11
|
|
|
17
12
|
/**
|
|
@@ -19,8 +14,7 @@ function parse_json_loose(raw_json: string): unknown {
|
|
|
19
14
|
* Malformed JSON yields undefined, so a caller can tell it apart from an empty listing.
|
|
20
15
|
*
|
|
21
16
|
* `parse_json_array_safe` answers `[]` for both, which reads as "there is nothing" — and a command
|
|
22
|
-
* that acts on that reports a confident absence built on a response it could not parse
|
|
23
|
-
* (joshuafolkken/kit#950).
|
|
17
|
+
* that acts on that reports a confident absence built on a response it could not parse.
|
|
24
18
|
*/
|
|
25
19
|
function parse_json_array_or_undefined<T>(
|
|
26
20
|
raw_json: string,
|
|
@@ -30,14 +24,14 @@ function parse_json_array_or_undefined<T>(
|
|
|
30
24
|
// Not an array at all — `gh` answering `{"message":"API rate limit exceeded"}` rather than a
|
|
31
25
|
// listing. That is the same kind of gap as unparseable output, not a change in the shape of the
|
|
32
26
|
// elements, so it reads as unreadable instead of throwing out of the command.
|
|
33
|
-
if (
|
|
27
|
+
if (!Array.isArray(value)) return undefined
|
|
34
28
|
|
|
35
29
|
return element_schema.array().parse(value)
|
|
36
30
|
}
|
|
37
31
|
|
|
38
32
|
// What one listing read produced. The two gaps are deliberately apart: JSON that is not a listing at
|
|
39
33
|
// all is an access or connectivity problem, while elements the schema rejects mean the tool's fields
|
|
40
|
-
// changed — and those send a reader to two different places
|
|
34
|
+
// changed — and those send a reader to two different places. A caller that
|
|
41
35
|
// treats them the same still reads them from here rather than writing the try/catch again.
|
|
42
36
|
type ListingRead<T> =
|
|
43
37
|
{ kind: 'read'; rows: Array<T> } | { kind: 'unreadable' } | { kind: 'unexpected_shape' }
|
|
@@ -47,7 +41,7 @@ type ListingRead<T> =
|
|
|
47
41
|
*
|
|
48
42
|
* The rethrow `parse_json_array_or_undefined` performs is the whole point, and every caller that
|
|
49
43
|
* wants both gaps named was catching it itself — the `auto-ok` pickup and `epic:next`'s
|
|
50
|
-
* repository-level busy check wrote the same six lines
|
|
44
|
+
* repository-level busy check wrote the same six lines.
|
|
51
45
|
*/
|
|
52
46
|
function read_json_listing<T>(raw_json: string, element_schema: z.ZodType<T>): ListingRead<T> {
|
|
53
47
|
try {
|
|
@@ -66,34 +60,35 @@ function read_json_listing<T>(raw_json: string, element_schema: z.ZodType<T>): L
|
|
|
66
60
|
* Deliberately **not** `parse_json_array_or_undefined(...) ?? []`, near-identical though the bodies
|
|
67
61
|
* are. The two differ on the branch that matters: valid JSON that is not an array throws here, so a
|
|
68
62
|
* `gh` field that changed shape stays visible, while the variant above reads it as a gap. Folding
|
|
69
|
-
* them together silences that throw for every existing caller
|
|
63
|
+
* them together silences that throw for every existing caller.
|
|
70
64
|
*/
|
|
71
65
|
function parse_json_array_safe<T>(raw_json: string, element_schema: z.ZodType<T>): Array<T> {
|
|
72
66
|
const value = parse_json_loose(raw_json)
|
|
73
|
-
if (value ===
|
|
67
|
+
if (value === undefined) return []
|
|
74
68
|
|
|
75
69
|
return element_schema.array().parse(value)
|
|
76
70
|
}
|
|
77
71
|
|
|
78
72
|
/**
|
|
79
73
|
* Parse a JSON string into a single object validated by the given schema.
|
|
80
|
-
* Malformed JSON yields undefined
|
|
74
|
+
* Malformed JSON yields undefined; JSON the schema rejects throws, as the array readers above do —
|
|
75
|
+
* the name says only what it answers for text that is not JSON.
|
|
81
76
|
*/
|
|
82
|
-
function
|
|
77
|
+
function parse_json_object_or_undefined<T>(raw_json: string, schema: z.ZodType<T>): T | undefined {
|
|
83
78
|
const value = parse_json_loose(raw_json)
|
|
84
|
-
if (value ===
|
|
79
|
+
if (value === undefined) return undefined
|
|
85
80
|
|
|
86
81
|
return schema.parse(value)
|
|
87
82
|
}
|
|
88
83
|
|
|
89
84
|
const parse_json = {
|
|
90
|
-
|
|
85
|
+
parse_json_object_or_undefined,
|
|
91
86
|
}
|
|
92
87
|
|
|
93
88
|
export {
|
|
94
89
|
parse_json,
|
|
95
90
|
parse_json_array_or_undefined,
|
|
96
91
|
parse_json_array_safe,
|
|
97
|
-
|
|
92
|
+
parse_json_object_or_undefined,
|
|
98
93
|
read_json_listing,
|
|
99
94
|
}
|
|
@@ -8,13 +8,16 @@ import { json_value } from '#scripts/lib/json-value'
|
|
|
8
8
|
import { git_common_directory } from './git-common-directory'
|
|
9
9
|
|
|
10
10
|
// One holder at a time per repository, for work that every work tree of that repository shares
|
|
11
|
-
// (
|
|
11
|
+
// (the stash sweep, `git worktree add`). The
|
|
12
12
|
// record is keyed on the git common directory, so every work tree of one repository contends for one
|
|
13
13
|
// record per lock name, and it lives in the platform temp root beside the other stamps rather than
|
|
14
14
|
// inside `.git`. Each caller names its own lock with a prefix, so two unrelated kinds of work never
|
|
15
15
|
// wait on each other.
|
|
16
16
|
|
|
17
17
|
const POLL_INTERVAL_MS = 200
|
|
18
|
+
// The synchronous wait is for locks held for milliseconds, so it polls far more often.
|
|
19
|
+
const SYNC_POLL_INTERVAL_MS = 10
|
|
20
|
+
const SLEEP_CELL = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))
|
|
18
21
|
|
|
19
22
|
type IsGone = (owner: ProcessOwner) => boolean
|
|
20
23
|
|
|
@@ -117,6 +120,23 @@ async function acquire(target: string, max_wait_ms: number): Promise<boolean> {
|
|
|
117
120
|
return true
|
|
118
121
|
}
|
|
119
122
|
|
|
123
|
+
// A blocking wait for a caller that cannot await. `Atomics.wait` parks the thread without spinning, so
|
|
124
|
+
// a writer queued behind another costs no CPU while it waits.
|
|
125
|
+
function sleep_sync(ms: number): void {
|
|
126
|
+
Atomics.wait(SLEEP_CELL, 0, 0, ms)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function acquire_sync(target: string, max_wait_ms: number): boolean {
|
|
130
|
+
const deadline = Date.now() + max_wait_ms
|
|
131
|
+
|
|
132
|
+
while (!claim(target)) {
|
|
133
|
+
if (Date.now() >= deadline) return false
|
|
134
|
+
sleep_sync(SYNC_POLL_INTERVAL_MS)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return true
|
|
138
|
+
}
|
|
139
|
+
|
|
120
140
|
// Runs `work` holding the lock at `target` and answers its result, or `undefined` without running it
|
|
121
141
|
// when another holder kept the lock for the whole wait.
|
|
122
142
|
async function with_lock<T>(
|
|
@@ -133,6 +153,18 @@ async function with_lock<T>(
|
|
|
133
153
|
}
|
|
134
154
|
}
|
|
135
155
|
|
|
136
|
-
|
|
156
|
+
// `with_lock` for synchronous work — a read-modify-write that holds the lock for milliseconds, whose
|
|
157
|
+
// callers are synchronous all the way up.
|
|
158
|
+
function with_lock_sync<T>(work: () => T, target: string, max_wait_ms: number): T | undefined {
|
|
159
|
+
if (!acquire_sync(target, max_wait_ms)) return undefined
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
return work()
|
|
163
|
+
} finally {
|
|
164
|
+
release(target)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const repository_lock = { clear_stale, lock_path, with_lock, with_lock_sync }
|
|
137
169
|
|
|
138
170
|
export { repository_lock }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { git_spawn } from '#scripts/git/git-spawn'
|
|
2
2
|
|
|
3
3
|
// The one place a sanctioned `git stash pop` is targeted by its message rather than its stack
|
|
4
|
-
// position
|
|
4
|
+
// position. The stash is a single repository-wide stack shared by every
|
|
5
5
|
// working tree of the repository, so a bare `git stash pop` — or a positional `stash@{n}` read
|
|
6
6
|
// before another lane pushed — pops whatever now sits on top, which is how one lane's parked work
|
|
7
7
|
// ended up in another lane's tree. Resolving the selector from the message the stash was pushed
|
|
@@ -70,8 +70,7 @@ function select(entries: ReadonlyArray<StashEntry>, message: string): Selection
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
// The stash is a repository-level stack every work tree shares, so the list reads the same wherever
|
|
73
|
-
// it runs; `dir` is what makes the pop land in the lane's tree rather than the primary checkout
|
|
74
|
-
// the `git -C <dir>` a lane child used to write by hand.
|
|
73
|
+
// it runs; `dir` is what makes the pop land in the lane's tree rather than the primary checkout.
|
|
75
74
|
function git_args(directory: string | undefined, args: Array<string>): Array<string> {
|
|
76
75
|
return directory === undefined ? args : ['-C', directory, ...args]
|
|
77
76
|
}
|
|
@@ -97,7 +96,7 @@ async function has_conflict(directory?: string): Promise<boolean> {
|
|
|
97
96
|
}
|
|
98
97
|
|
|
99
98
|
// Uncommitted work is anything `git status --porcelain` lists — untracked files included, which is what
|
|
100
|
-
// `push` below carries with `-u`, so the two agree on what "work" means
|
|
99
|
+
// `push` below carries with `-u`, so the two agree on what "work" means.
|
|
101
100
|
async function has_changes(directory?: string): Promise<boolean> {
|
|
102
101
|
return (await git_spawn.read(git_args(directory, ['status', '--porcelain']))) !== ''
|
|
103
102
|
}
|
|
@@ -108,7 +107,7 @@ async function push(message: string, directory?: string): Promise<void> {
|
|
|
108
107
|
await git_spawn.read(git_args(directory, ['stash', 'push', '-u', '-m', message]))
|
|
109
108
|
}
|
|
110
109
|
|
|
111
|
-
// The stack keyed by commit rather than position
|
|
110
|
+
// The stack keyed by commit rather than position: a sweep that reads the
|
|
112
111
|
// stack, asks GitHub about each entry and only then drops one would drop whatever another lane pushed
|
|
113
112
|
// on top in the meantime if it kept the `stash@{n}` it read first. The `selector` of each entry here is
|
|
114
113
|
// its commit hash, which never moves.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
1
2
|
import { run_preflight } from '#scripts/run/run-preflight'
|
|
2
3
|
import type { StashEntry } from './git-stash'
|
|
3
4
|
|
|
4
|
-
// Which stashes nobody is coming back for
|
|
5
|
+
// Which stashes nobody is coming back for. A parked or paused run pushes its
|
|
5
6
|
// work with a message `josh stash:pop` later targets, but an issue closed by another route leaves that
|
|
6
7
|
// entry with no run to pop it — the pile #2168 sorted by hand. This reads the owning issue out of each
|
|
7
8
|
// entry's subject so the closed ones, and the ones with no readable owner, can be put in front of a
|
|
@@ -71,7 +72,7 @@ function message_issues(subject: string): Array<string | undefined> {
|
|
|
71
72
|
return [...hashed, LEADING_PATTERN.exec(subject)?.groups?.['issue']]
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
// Every issue a subject names, not just its owner
|
|
75
|
+
// Every issue a subject names, not just its owner: `backlogrun: paused #M for
|
|
75
76
|
// prerequisite #N` is tied to both, and the `#N` of a `run:hold reclaimed before #N` entry — which
|
|
76
77
|
// `issue_of` reads as no owner — still names the run the work was found by. A `WIP on` subject is
|
|
77
78
|
// read by its branch alone, for the reason `WIP_PREFIX` records.
|
|
@@ -95,7 +96,8 @@ function orphans(
|
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
function format_line(orphan: OrphanStash): string {
|
|
98
|
-
const owner =
|
|
99
|
+
const owner =
|
|
100
|
+
orphan.issue === undefined ? UNKNOWN_OWNER : `${session_cite.issue(orphan.issue)} closed`
|
|
99
101
|
|
|
100
102
|
return ` ${[orphan.selector, owner, orphan.subject].join(COLUMN_SEPARATOR)}`
|
|
101
103
|
}
|
|
@@ -3,7 +3,7 @@ import { cli_flags } from '#scripts/lib/cli-flags'
|
|
|
3
3
|
// `josh stash:pop` turns its `argv` into a single request: the message of the stash to pop. Parsing
|
|
4
4
|
// lives here, acting on the stack lives in `stash-pop-cli.ts`, and a malformed command line is
|
|
5
5
|
// `undefined` rather than a guessed intent — a pop run on a misread argument would take the wrong
|
|
6
|
-
// entry off a stack shared by every lane
|
|
6
|
+
// entry off a stack shared by every lane.
|
|
7
7
|
|
|
8
8
|
const USAGE = 'Usage: josh stash:pop "<message>" [--dir <path>]'
|
|
9
9
|
|
|
@@ -3,8 +3,8 @@ import { error_text } from '#scripts/lib/error-message'
|
|
|
3
3
|
import { git_stash } from './git-stash'
|
|
4
4
|
import { stash_pop_args, type Request } from './stash-pop-args'
|
|
5
5
|
|
|
6
|
-
// `josh stash:pop "<message>"` — pop the stash whose message matches, and no other
|
|
7
|
-
//
|
|
6
|
+
// `josh stash:pop "<message>"` — pop the stash whose message matches, and no other.
|
|
7
|
+
// The stash stack is shared by every working tree of the repository, so a
|
|
8
8
|
// procedure that pops by position takes whatever another lane last pushed. This resolves the
|
|
9
9
|
// selector from the message and pops that entry alone; no match and more than one match are both
|
|
10
10
|
// refusals rather than a guess at which was meant.
|
|
@@ -32,7 +32,7 @@ function refuse(): number {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// A pop that leaves unmerged paths applied the stash and only needs the conflicts resolved, so it is
|
|
35
|
-
// reported `conflicted` at exit 0 rather than raised as an unknown failure
|
|
35
|
+
// reported `conflicted` at exit 0 rather than raised as an unknown failure;
|
|
36
36
|
// any other pop error is re-thrown for `run` to report. `has_conflict` reads the tree the pop wrote.
|
|
37
37
|
async function pop_selected(selector: string, directory: string | undefined): Promise<number> {
|
|
38
38
|
try {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { repository_lock } from '#scripts/git/repository-lock'
|
|
2
2
|
|
|
3
|
-
// One stash sweep at a time per repository
|
|
3
|
+
// One stash sweep at a time per repository. The stash is a single stack every
|
|
4
4
|
// work tree shares, and a `backlogrun` runs one sweep per lane seat at once: two sweeps that each
|
|
5
5
|
// resolve the same entry to `stash@{n}` and drop it would have the second drop land on whichever entry
|
|
6
6
|
// moved into that position, and two that carry the same ledger lines would both append them. The
|
|
7
|
-
// locking itself is `repository-lock.ts`, shared with the work-tree writes
|
|
7
|
+
// locking itself is `repository-lock.ts`, shared with the work-tree writes.
|
|
8
8
|
|
|
9
9
|
const LOCK_PREFIX = 'josh-stash-sweep-lock-'
|
|
10
10
|
// The locked phase is local git and one file append per entry, so a holder finishes in well under the
|
|
@@ -5,7 +5,7 @@ import { hook_decision } from '#scripts/josh/hook-decision'
|
|
|
5
5
|
import { lane_guard_policy, type LaneGuardMode } from '#scripts/lane/lane-guard-policy'
|
|
6
6
|
import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
7
7
|
|
|
8
|
-
// The disk half of the batching guard
|
|
8
|
+
// The disk half of the batching guard: find the transcript, read enough of
|
|
9
9
|
// its end, remember when a call was last refused, and write the refusal Claude Code understands.
|
|
10
10
|
//
|
|
11
11
|
// **It is a `PreToolUse` hook, and that is the point of the Issue.** The live density line rides
|
|
@@ -16,10 +16,9 @@ import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-b
|
|
|
16
16
|
// **What the transcript holds is the turns already closed, and nothing usable about the one in hand.**
|
|
17
17
|
// Claude Code writes one line per content block and starts the first tool as soon as that block parses,
|
|
18
18
|
// so a turn's later `tool_use` lines do not exist yet — measured on a live session, they arrive 1.4 to
|
|
19
|
-
// 15 seconds afterwards. The decision is therefore made from closed history alone
|
|
20
|
-
// `time-batch-guard.ts` → "What it cannot know" carries the measurement and what it costs.
|
|
19
|
+
// 15 seconds afterwards. The decision is therefore made from closed history alone.
|
|
21
20
|
//
|
|
22
|
-
// **The shell is `hook-decision.ts`, shared with the investigation guard
|
|
21
|
+
// **The shell is `hook-decision.ts`, shared with the investigation guard**:
|
|
23
22
|
// the payload schema, the deny envelope, the switch, the `.env` load, the stamp that makes a refusal
|
|
24
23
|
// unrepeatable, and the six steps every refusing hook takes in the same order. What stays here is this
|
|
25
24
|
// guard's own rule and its own two names, and the seven exports below are unchanged so nothing that
|
|
@@ -36,14 +35,13 @@ const SWITCH_ENV_KEY = 'JOSH_BATCH_GUARD'
|
|
|
36
35
|
// refuse and whether the run has stopped batching are both its, so a refusal here can never disagree
|
|
37
36
|
// with the report the Issue's own verification step reads.
|
|
38
37
|
// The transcript is read for a call the guard could act on either way: one it may refuse, or the one
|
|
39
|
-
// whole-file write it may only notify about
|
|
40
|
-
//
|
|
38
|
+
// whole-file write it may only notify about. The read is skipped for the rest
|
|
39
|
+
// — most of a run's calls are neither.
|
|
41
40
|
function is_batch_candidate(call: GuardedCall): boolean {
|
|
42
41
|
return time_batch_guard.is_guarded_call(call) || time_batch_guard.is_notice_call(call)
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
// **How the batching guard behaves for the session in hand, decided from the one-place enumeration
|
|
46
|
-
// (joshuafolkken/kit#2138, joshuafolkken/kit#2164, joshuafolkken/kit#2178, joshuafolkken/kit#2276).
|
|
44
|
+
// **How the batching guard behaves for the session in hand, decided from the one-place enumeration**.
|
|
47
45
|
// Outside a lane child the mode is `refuse` and the guard is exactly what it always was; in a dispatched
|
|
48
46
|
// lane child it is `notice` — kit#2178 took it to `off` after kit#2164's generic notice did not move the
|
|
49
47
|
// density, and kit#2276 restores it as a notice that names the concrete recent calls and recurs every
|
|
@@ -72,7 +70,7 @@ function should_block_here(tail: string, call: GuardedCall, refused_at_ms: numbe
|
|
|
72
70
|
return time_batch_guard.should_block(tail, call, refused_at_ms)
|
|
73
71
|
}
|
|
74
72
|
|
|
75
|
-
// The whole-file write earns a notice on every run
|
|
73
|
+
// The whole-file write earns a notice on every run. The second branch turns a
|
|
76
74
|
// refusable call into a notice under a `notice`-mode guard, which is the mode batching takes in a lane
|
|
77
75
|
// child again since kit#2276. Both read the notice's own record, so a notice never spends the refusal's
|
|
78
76
|
// stamp and re-fires on the notice's own `NOTICE_REFIRE_EVERY` cadence.
|
|
@@ -88,8 +86,8 @@ function should_notify_here(tail: string, call: GuardedCall, notified_at_ms: num
|
|
|
88
86
|
)
|
|
89
87
|
}
|
|
90
88
|
|
|
91
|
-
// The wording each notice carries, with the concrete calls the run just issued one-per-turn appended
|
|
92
|
-
//
|
|
89
|
+
// The wording each notice carries, with the concrete calls the run just issued one-per-turn appended.
|
|
90
|
+
// The whole-file write keeps its own base text; the lane notice is reached
|
|
93
91
|
// under the `notice`-mode guard batching takes in a lane child again since kit#2276, so a headless
|
|
94
92
|
// child is shown *which* recent calls it could have batched rather than only told to batch.
|
|
95
93
|
function notice_text(call: GuardedCall, tail: string): string {
|
|
@@ -107,7 +105,7 @@ const GUARD = hook_decision.create_transcript_guard({
|
|
|
107
105
|
should_block: should_block_here,
|
|
108
106
|
reason: time_batch_guard.REASON,
|
|
109
107
|
// The whole-file write is notified rather than refused, on a record of its own so it never spends
|
|
110
|
-
// the refusal's stamp
|
|
108
|
+
// the refusal's stamp; the lane-child refusable-call notice kit#2164 added
|
|
111
109
|
// here fires again since kit#2276 restored batching to `notice` in a lane child.
|
|
112
110
|
notify: {
|
|
113
111
|
prefix: time_batch_guard.NOTICE_STAMP_PREFIX,
|
|
@@ -120,7 +118,7 @@ const batch_refusal = GUARD.refusal
|
|
|
120
118
|
const batch_outcome = GUARD.outcome
|
|
121
119
|
const { is_enabled, refusal_path } = GUARD
|
|
122
120
|
// The notice's stamp path, exposed the way `refusal_path` is so a test can clean it apart from the
|
|
123
|
-
// refusal's record
|
|
121
|
+
// refusal's record.
|
|
124
122
|
const notice_refusal_path = hook_decision.create_refusal_stamp(
|
|
125
123
|
time_batch_guard.NOTICE_STAMP_PREFIX,
|
|
126
124
|
).path
|
|
@@ -4,6 +4,7 @@ import os from 'node:os'
|
|
|
4
4
|
import path from 'node:path'
|
|
5
5
|
import { fileURLToPath } from 'node:url'
|
|
6
6
|
import { git_command } from '#scripts/git/git-command'
|
|
7
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
7
8
|
|
|
8
9
|
interface CheckResult {
|
|
9
10
|
success: boolean
|
|
@@ -25,10 +26,10 @@ function is_inside(directory: string, resolved_path: string): boolean {
|
|
|
25
26
|
return relative !== '' && !relative.startsWith(PARENT_SEGMENT) && !path.isAbsolute(relative)
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
29
|
+
// A prefix test — the path has to *start* with `.git/` — fits only the shape the main work tree
|
|
30
|
+
// produces. A linked work tree gets an absolute `<repo>/.git/worktrees/<name>/COMMIT_EDITMSG`, which
|
|
31
|
+
// shares no prefix with it, so such a guard would throw before the real check ran and no commit inside
|
|
32
|
+
// a work tree could succeed.
|
|
32
33
|
//
|
|
33
34
|
// The directories are asked of git rather than assumed to be named `.git`, because the name is not a
|
|
34
35
|
// property of a repository: a bare repository's git directory is the repository, and
|
|
@@ -50,7 +51,7 @@ function is_safe_commit_message_path(
|
|
|
50
51
|
// Where git would have written the message, for a run that was passed no path. The work tree's own
|
|
51
52
|
// git directory rather than a literal `.git/`: in a linked work tree that name is a *file*, so the
|
|
52
53
|
// relative spelling this used to hardcode ends the run at ENOTDIR — the same defect as the guard's,
|
|
53
|
-
// on the branch the guard does not reach
|
|
54
|
+
// on the branch the guard does not reach.
|
|
54
55
|
function default_commit_message_path(git_directories: ReadonlyArray<string>): string {
|
|
55
56
|
return path.join(git_directories[0] ?? FALLBACK_GIT_DIRECTORY, COMMIT_MESSAGE_FILE_NAME)
|
|
56
57
|
}
|
|
@@ -85,11 +86,13 @@ function extract_issue_number(branch_name: string): string | undefined {
|
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
function create_error_message(issue_number: string, branch: string, message: string): string {
|
|
89
|
+
const reference = issue_cite.plain(issue_number)
|
|
90
|
+
|
|
88
91
|
return (
|
|
89
|
-
`🚫 Error: Commit message must include
|
|
92
|
+
`🚫 Error: Commit message must include ${reference}\n` +
|
|
90
93
|
` Current branch: ${branch}\n` +
|
|
91
94
|
` Commit message: ${message}\n` +
|
|
92
|
-
` Please include
|
|
95
|
+
` Please include ${reference} in your commit message\n`
|
|
93
96
|
)
|
|
94
97
|
}
|
|
95
98
|
|
|
@@ -106,7 +109,7 @@ async function check_commit_message(): Promise<CheckResult> {
|
|
|
106
109
|
|
|
107
110
|
const commit_message = await get_commit_message()
|
|
108
111
|
|
|
109
|
-
if (!commit_message.includes(
|
|
112
|
+
if (!commit_message.includes(issue_cite.plain(issue_number))) {
|
|
110
113
|
return {
|
|
111
114
|
success: false,
|
|
112
115
|
message: create_error_message(issue_number, current_branch, commit_message),
|
|
@@ -115,7 +118,7 @@ async function check_commit_message(): Promise<CheckResult> {
|
|
|
115
118
|
|
|
116
119
|
return {
|
|
117
120
|
success: true,
|
|
118
|
-
message: `✅ Commit message check passed: Found
|
|
121
|
+
message: `✅ Commit message check passed: Found ${issue_cite.plain(issue_number)}`,
|
|
119
122
|
}
|
|
120
123
|
}
|
|
121
124
|
|
|
@@ -3,6 +3,7 @@ import { text } from 'node:stream/consumers'
|
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
4
|
import { hook_decision, type GuardOutcome } from '#scripts/josh/hook-decision'
|
|
5
5
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
6
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
6
7
|
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
7
8
|
import { z } from 'zod'
|
|
8
9
|
import { build_envelope, compose_context, format_edited_payload } from './format-edited-file'
|
|
@@ -36,13 +37,7 @@ const patch_input_schema = z.object({ command: z.string().min(1) })
|
|
|
36
37
|
type PayloadFormatter = (raw_payload: string, project_root: string) => Promise<string | undefined>
|
|
37
38
|
|
|
38
39
|
function parse_payload(raw_payload: string): z.infer<typeof codex_payload_schema> | undefined {
|
|
39
|
-
|
|
40
|
-
const parsed = codex_payload_schema.safeParse(JSON.parse(raw_payload))
|
|
41
|
-
|
|
42
|
-
return parsed.success ? parsed.data : undefined
|
|
43
|
-
} catch {
|
|
44
|
-
return undefined
|
|
45
|
-
}
|
|
40
|
+
return json_value.parse_with(raw_payload, codex_payload_schema)
|
|
46
41
|
}
|
|
47
42
|
|
|
48
43
|
function paths_matching(command: string, pattern: RegExp): Array<string> {
|
|
@@ -96,8 +91,8 @@ function pretool_outcome(raw_payload: string): GuardOutcome {
|
|
|
96
91
|
}
|
|
97
92
|
|
|
98
93
|
// The formatters apply what eslint could fix silently and return what it could not; each patched
|
|
99
|
-
// file's unfixed block is joined so the whole patch's lint problems reach the model on one edit
|
|
100
|
-
//
|
|
94
|
+
// file's unfixed block is joined so the whole patch's lint problems reach the model on one edit.
|
|
95
|
+
// `undefined` when every file was clean, so the ordinary patch adds nothing.
|
|
101
96
|
async function format_posttool_payloads(
|
|
102
97
|
raw_payload: string,
|
|
103
98
|
project_root: string,
|
|
@@ -123,9 +118,19 @@ async function write_posttool_context(raw_payload: string): Promise<void> {
|
|
|
123
118
|
if (context !== undefined) process.stdout.write(`${build_envelope(context)}\n`)
|
|
124
119
|
}
|
|
125
120
|
|
|
121
|
+
// The environment file is loaded before the verdict, as `write_outcome` does, so the lane-child marker
|
|
122
|
+
// the phase mark reads is in place; the mark follows the written envelope.
|
|
123
|
+
async function write_pretool_outcome(raw_payload: string): Promise<void> {
|
|
124
|
+
hook_decision.load_environment_file()
|
|
125
|
+
const outcome = pretool_outcome(raw_payload)
|
|
126
|
+
|
|
127
|
+
hook_decision.emit_outcome(outcome)
|
|
128
|
+
await pretool_guard.mark_phase(outcome)
|
|
129
|
+
}
|
|
130
|
+
|
|
126
131
|
async function run(raw_payload: string, mode: string): Promise<void> {
|
|
127
132
|
if (mode === PRETOOL_MODE) {
|
|
128
|
-
|
|
133
|
+
await write_pretool_outcome(raw_payload)
|
|
129
134
|
|
|
130
135
|
return
|
|
131
136
|
}
|
|
@@ -149,6 +154,7 @@ const codex_hook_adapter = {
|
|
|
149
154
|
posttool_payloads,
|
|
150
155
|
pretool_outcome,
|
|
151
156
|
pretool_payload,
|
|
157
|
+
write_pretool_outcome,
|
|
152
158
|
}
|
|
153
159
|
|
|
154
160
|
export { codex_hook_adapter }
|
|
@@ -3,10 +3,9 @@ import path from 'node:path'
|
|
|
3
3
|
import { HOOK_PROCESS_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
4
4
|
import { execa } from 'execa'
|
|
5
5
|
|
|
6
|
-
// The spell half of the edit hook
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// — a `cspell:dot` failure a run could only read one word at a time under the output cap. Checking the
|
|
6
|
+
// The spell half of the edit hook. The lint half hands the model an edit's lint problems on the spot
|
|
7
|
+
// rather than at the gate; an unregistered word is the other thing that sends a run back to the gate
|
|
8
|
+
// — a `cspell:dot` failure a run can only read one word at a time under the output cap. Checking the
|
|
10
9
|
// one edited file for unknown words the moment it changes closes that the same way the lint half does:
|
|
11
10
|
// a short `additionalContext` block, riding the same `PostToolUse` envelope, and no output at all when
|
|
12
11
|
// there is nothing to say.
|
|
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
4
4
|
import { report_no_payload, run_hook } from './format-edited-file'
|
|
5
5
|
|
|
6
6
|
// The `PostToolUse` hook's entry, kept apart from `format-edited-file.ts` for the reason
|
|
7
|
-
// `pretool-guard-cli.ts` gives
|
|
7
|
+
// `pretool-guard-cli.ts` gives: `codex-hook-adapter.ts` imports that module,
|
|
8
8
|
// so a self-invoke left in it lands in a shared chunk and the bundled hook never runs.
|
|
9
9
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
10
10
|
if (process.stdin.isTTY) {
|