@joshuafolkken/kit 1.1240.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +216 -202
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -4,27 +4,23 @@ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
|
4
4
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
5
5
|
import { shell_segments } from './shell-segments'
|
|
6
6
|
|
|
7
|
-
// The trigger and the decision behind the `run-tail` row of `delivered-rules.ts
|
|
8
|
-
// (joshuafolkken/kit#1510).
|
|
7
|
+
// The trigger and the decision behind the `run-tail` row of `delivered-rules.ts`.
|
|
9
8
|
//
|
|
10
|
-
// **Two stops, one cause.**
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// merge started only when the person asked whether it was merging. Both halves handed the deciding
|
|
15
|
-
// of when to look back to something that was never going to decide it.
|
|
9
|
+
// **Two stops, one cause.** A `pnpm josh git -y` issued in the **foreground** with a tool timeout
|
|
10
|
+
// above the harness's 600-second cap is detached at the cap with nothing reading the output file
|
|
11
|
+
// afterwards; and a push that ends the turn leaves the merge waiting until a person asks. Both hand
|
|
12
|
+
// the deciding of when to look back to something that is never going to decide it.
|
|
16
13
|
//
|
|
17
14
|
// **So the refusal is put in front of the foreground call, which is the last call before the seam.**
|
|
18
15
|
// A turn ending between the push and `pnpm josh followup` is an *absence* of a call, and no
|
|
19
16
|
// `PreToolUse` hook can see one; the foreground push is a call, and refusing it delivers both halves
|
|
20
|
-
// at the one moment they still bind. That is the same reading
|
|
21
|
-
// timer and
|
|
17
|
+
// at the one moment they still bind. That is the same reading `early-heartbeat.ts` takes for a wait
|
|
18
|
+
// timer and `piped-verification.ts` for a verification behind a pipe.
|
|
22
19
|
//
|
|
23
20
|
// **Backgrounding is what closes the seam, rather than a second rule about turns.** A command issued
|
|
24
21
|
// with `run_in_background` re-invokes the run when it exits, so the completion notification is what
|
|
25
|
-
// resumes the tail — not a person noticing the silence.
|
|
26
|
-
//
|
|
27
|
-
// be remembered was what regressed, so this time the moment is named as a call.
|
|
22
|
+
// resumes the tail — not a person noticing the silence. Prose that has to be remembered is what
|
|
23
|
+
// regresses, so the moment is named as a call.
|
|
28
24
|
//
|
|
29
25
|
// **A call already made properly is not a trigger.** Reissued with `run_in_background`, the same
|
|
30
26
|
// command falls through and the run pays nothing — the shape `is_body_only_issue_read` takes for a
|
|
@@ -90,7 +86,7 @@ function is_backgrounded(input: unknown): boolean {
|
|
|
90
86
|
}
|
|
91
87
|
|
|
92
88
|
/**
|
|
93
|
-
* The occasion this rule governs: the push step, in either spelling
|
|
89
|
+
* The occasion this rule governs: the push step, in either spelling.
|
|
94
90
|
*
|
|
95
91
|
* It is the denominator `scripts/rules/rule-value.ts` reads for this row, because the trigger below
|
|
96
92
|
* fires only on the foreground spelling — a run that detached every push never trips it, so the rate
|
|
@@ -129,7 +125,7 @@ function is_foreground_push_step(call: GuardedCall): boolean {
|
|
|
129
125
|
* changes what the run *knows*. A push does not work that way: a `queue` or an `epicrun` issues one
|
|
130
126
|
* per child, and a round-2 fix commit issues a second inside a single `fullrun`. Refused once and
|
|
131
127
|
* free afterwards, every push but the first is back to the run's own self-restraint, which is the
|
|
132
|
-
* thing
|
|
128
|
+
* thing that fails.
|
|
133
129
|
*
|
|
134
130
|
* **It also removes the stand-aside this row has no use for.** `is_first_delivery` stays silent for
|
|
135
131
|
* ten seconds after the batching guard stamps any refusal; the push step is never a candidate of that
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// The `shell-body` row's trigger, in a module of its own rather than inside the enumeration
|
|
2
|
-
//
|
|
1
|
+
// The `shell-body` row's trigger, in a module of its own rather than inside the enumeration.
|
|
2
|
+
// Every other row's trigger is already shaped that way — `time_batch_guard`
|
|
3
3
|
// and `cost_blocks` each hold their own reading of a call — and this one needs a small model of what
|
|
4
4
|
// zsh does inside double quotes, which is more than an enumeration row should carry. The split also
|
|
5
5
|
// gives that model a suite of its own, so a regex change is read beside the cases it has to keep.
|
|
@@ -53,8 +53,8 @@ const INLINE_BODY_VALUE = new RegExp(
|
|
|
53
53
|
'gu',
|
|
54
54
|
)
|
|
55
55
|
|
|
56
|
-
// **What zsh evaluates inside double quotes, measured in this harness rather than assumed
|
|
57
|
-
//
|
|
56
|
+
// **What zsh evaluates inside double quotes, measured in this harness rather than assumed**:
|
|
57
|
+
// a backtick runs as command substitution and a `$` expands. `!` does
|
|
58
58
|
// **not** — history expansion is off in a non-interactive zsh, and `"hello!world"` survives intact —
|
|
59
59
|
// so it is deliberately absent: a rule that fired on every exclamation mark would be firing on turns
|
|
60
60
|
// where nothing is wrong, which `prompts/collaboration-workflow/rule-delivery.md` names as worse than
|
|
@@ -73,8 +73,8 @@ const WHOLE_VALUE_SUBSTITUTION = new RegExp(`^${SUBSTITUTION}$`, 'u')
|
|
|
73
73
|
|
|
74
74
|
// **A backtick inside the substitution voids the exemption.** The exemption's reason is that the
|
|
75
75
|
// *output* is not re-scanned — but the substitution's own command is shell text, and a backtick in it
|
|
76
|
-
// runs exactly as an inline one does. `body="$(echo \`date\`)"` executes `date`, which is the
|
|
77
|
-
//
|
|
76
|
+
// runs exactly as an inline one does. `body="$(echo \`date\`)"` executes `date`, which is the inline
|
|
77
|
+
// damage merely written one level in. A nested `$( … )` is the safe
|
|
78
78
|
// spelling of the same composition and stays exempt.
|
|
79
79
|
const BACKTICK = '`'
|
|
80
80
|
|
|
@@ -118,7 +118,7 @@ function is_shell_evaluated_body(command: string): boolean {
|
|
|
118
118
|
return false
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
// **The safe spellings, which is what keeping this rule looks like
|
|
121
|
+
// **The safe spellings, which is what keeping this rule looks like**. They
|
|
122
122
|
// are the ones the refusal hands back: the `*-file` flags, a field whose value is a file reference,
|
|
123
123
|
// and `$'…'` quoting. The `*-file` flags cannot reach `INLINE_BODY_VALUE` at all — the note at the top
|
|
124
124
|
// of this file records why — so they are read straight off the command rather than out of a value.
|
|
@@ -20,10 +20,8 @@ function segments_of(command: string): Array<string> {
|
|
|
20
20
|
return command.split(SEGMENT_SEPARATOR).map((segment) => segment.trim())
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
// **Both spellings
|
|
24
|
-
//
|
|
25
|
-
// each caller's set with every alias standing for one of its names; `josh_command_of` expands the
|
|
26
|
-
// alias in the command it reads, so `pnpm josh ga` arrives as `josh gate` and a caller's canonical set
|
|
23
|
+
// **Both spellings match, and the expansion is not this file's.** `josh_command_of` expands the alias
|
|
24
|
+
// in the command it reads, so `pnpm josh ga` arrives as `josh gate` and a caller's canonical set
|
|
27
25
|
// matches it as it is. Widening as well would be a second copy of one rule, and the caller that
|
|
28
26
|
// forgot it would be the one that stops seeing `pnpm josh ga` at all — which is why each caller's own
|
|
29
27
|
// suite names a call in its alias spelling.
|
|
@@ -5,8 +5,7 @@ import { issue_citation } from './issue-citation'
|
|
|
5
5
|
import { lane_background } from './lane-background'
|
|
6
6
|
import { reply_language } from './reply-language'
|
|
7
7
|
|
|
8
|
-
// The stop-time rules, delivered on the `Stop` hook
|
|
9
|
-
// joshuafolkken/kit#2445).
|
|
8
|
+
// The stop-time rules, delivered on the `Stop` hook.
|
|
10
9
|
//
|
|
11
10
|
// **It exists because `.claude/settings.json` wired no `Stop` event.** The four events it did wire
|
|
12
11
|
// (`SessionStart` / `UserPromptSubmit` / `PreToolUse` / `PostToolUse`) can catch the moment a call is
|
|
@@ -20,7 +19,7 @@ import { reply_language } from './reply-language'
|
|
|
20
19
|
// permission envelope. The stop guard is a second *entry* on the one foundation, exactly as
|
|
21
20
|
// `pretool-guard` is one — not a second copy of the plumbing.
|
|
22
21
|
//
|
|
23
|
-
// **Every rule refuses
|
|
22
|
+
// **Every rule refuses**. Missing the stop notification or leaving a hold
|
|
24
23
|
// on a clean tree costs a person a silent wait or a trampled tree; a bare `#N` in the reply reaches
|
|
25
24
|
// the person watching but not the model that could fix it, so it too blocks — `{"decision":"block"}`
|
|
26
25
|
// is the one channel a `Stop` hook has to the model, and `stop_hook_active` caps a false positive at a
|
|
@@ -45,14 +44,14 @@ interface StopContext {
|
|
|
45
44
|
hold_present: boolean
|
|
46
45
|
// `git status --porcelain` came back empty.
|
|
47
46
|
tree_clean: boolean
|
|
48
|
-
// That record carries a `prrun` stop mark
|
|
47
|
+
// That record carries a `prrun` stop mark: the run stopped at a green pull
|
|
49
48
|
// request and keeps the hold over a clean tree on purpose, so a person can look before it merges.
|
|
50
49
|
prrun_stopped: boolean
|
|
51
50
|
// A `confirmation` notify is on this run's transcript tail.
|
|
52
51
|
notified: boolean
|
|
53
52
|
// The turn's session-facing reply text.
|
|
54
53
|
message: string
|
|
55
|
-
// The person's last prompt — a `#N` it already carried is quoted, not cited
|
|
54
|
+
// The person's last prompt — a `#N` it already carried is quoted, not cited.
|
|
56
55
|
prompt: string
|
|
57
56
|
// This stop already forced a continuation earlier in the prompt — the loop-breaker Claude Code
|
|
58
57
|
// documents, so a run that will not comply is not blocked forever.
|
|
@@ -66,26 +65,29 @@ interface StopContext {
|
|
|
66
65
|
// The owner of the repository the session runs in, or `undefined` when it cannot be read.
|
|
67
66
|
session_owner: string | undefined
|
|
68
67
|
// This session is a headless `backlogrun` parent with lanes still in flight and no cut handed its
|
|
69
|
-
// record off — `run-headless.ts` → `must_keep_waiting
|
|
68
|
+
// record off — `run-headless.ts` → `must_keep_waiting`.
|
|
70
69
|
headless_waiting: boolean
|
|
71
70
|
// How many headless-wait refusals sit on this run's transcript tail — the spin bound below.
|
|
72
71
|
headless_refusals: number
|
|
73
72
|
// This session is a dispatched lane child for this checkout — `lane_child_marker.is_child_of`.
|
|
74
73
|
lane_child: boolean
|
|
75
74
|
// A background task this run launched — a command or a subagent — has not finished —
|
|
76
|
-
// `lane_background.pending_background_ids` over the transcript tail
|
|
75
|
+
// `lane_background.pending_background_ids` over the transcript tail.
|
|
77
76
|
background_pending: boolean
|
|
78
|
-
// A backgrounded subagent this run launched has not finished — `lane_background.pending_agent_ids
|
|
79
|
-
//
|
|
77
|
+
// A backgrounded subagent this run launched has not finished — `lane_background.pending_agent_ids`.
|
|
78
|
+
// Apart from `background_pending`, since only a subagent is sure to end.
|
|
80
79
|
agent_pending: boolean
|
|
81
|
-
// This lane child handed its region to a running detached ship — `lane_handoff.is_handed_off
|
|
82
|
-
//
|
|
80
|
+
// This lane child handed its region to a running detached ship — `lane_handoff.is_handed_off`.
|
|
81
|
+
// The supervisor notifies on its own outcome, so nobody waits on this stop.
|
|
83
82
|
handed_off: boolean
|
|
84
|
-
// The resolved `JOSH_SESSION_LANG` — `session_language.resolve_session_lang
|
|
83
|
+
// The resolved `JOSH_SESSION_LANG` — `session_language.resolve_session_lang`.
|
|
85
84
|
session_lang: string
|
|
86
|
-
// This session is an agent kit launched under `claude -p` — `agent_headless.is_headless
|
|
87
|
-
//
|
|
85
|
+
// This session is an agent kit launched under `claude -p` — `agent_headless.is_headless`.
|
|
86
|
+
// No person reads its reply, so the rules on how a reply is written stand down.
|
|
88
87
|
headless_agent: boolean
|
|
88
|
+
// This session drives a live `backlogrun` carry record — `run_headless.is_backlog_parent`.
|
|
89
|
+
// With `headless_agent` and `lane_child`, what makes a run unattended.
|
|
90
|
+
backlog_parent: boolean
|
|
89
91
|
}
|
|
90
92
|
|
|
91
93
|
interface StopOutcome {
|
|
@@ -111,18 +113,18 @@ const STOP_NOTIFY_REASON =
|
|
|
111
113
|
// keep it because their tree is dirty, which is why this row is silent whenever the tree is not clean.
|
|
112
114
|
const HOLD_RELEASE_REASON =
|
|
113
115
|
'⛔ working-tree hold not released: this working tree is clean but its `run:hold` record is still in ' +
|
|
114
|
-
'place, so the next run here runs `
|
|
116
|
+
'place, so the next run here runs `pnpm josh ms` believing the tree is free while ' +
|
|
115
117
|
'you hold it. The workflow-commands skill → `working-tree-hold.md`: a stop that leaves the tree clean ' +
|
|
116
118
|
'releases the hold with `pnpm josh run:release <N>` (bare for a `new` entry). A `halfrun` ' +
|
|
117
119
|
'pre-commit stop and a `needs-human-review` stop keep the hold because their tree is dirty, and a ' +
|
|
118
120
|
'`prrun` stop keeps it by its stop mark — this row is silent there. Release it, then end with a one-line confirmation that it was released — do ' +
|
|
119
121
|
'not repeat your previous reply.'
|
|
120
122
|
|
|
121
|
-
// **A refusal that corrects rather than advises
|
|
123
|
+
// **A refusal that corrects rather than advises**. The bare `#N` is already
|
|
122
124
|
// on screen and the hook cannot unsay it, so the reason does the one thing that helps the *next* reply:
|
|
123
125
|
// it names the numbers it detected and hands over the exact `issue:cite` call that prints the
|
|
124
|
-
// paste-ready lines, then asks for the corrected citation lines alone — not the whole reply reissued
|
|
125
|
-
//
|
|
126
|
+
// paste-ready lines, then asks for the corrected citation lines alone — not the whole reply reissued.
|
|
127
|
+
// Reprinting the whole reply is what made the correction read as a duplicate;
|
|
126
128
|
// the bare copy already scrolled past stays, and the fix follows it as a short correction. The rule
|
|
127
129
|
// itself is not restated — it is resident in `CLAUDE.md` — only pointed at.
|
|
128
130
|
const ISSUE_CITATION_REASON =
|
|
@@ -140,19 +142,21 @@ function build_citation_reason(references: ReadonlyArray<string>): string {
|
|
|
140
142
|
)
|
|
141
143
|
}
|
|
142
144
|
|
|
143
|
-
// **An offer to file is a Tier A filing deferred to
|
|
144
|
-
// is already made, so the reason hands over the filing chain rather than a question; the
|
|
145
|
-
// is resident in `observation-filing.md` and only pointed at.
|
|
145
|
+
// **An offer to file in an unattended run is a Tier A filing deferred to nobody**.
|
|
146
|
+
// The judgement is already made, so the reason hands over the filing chain rather than a question; the
|
|
147
|
+
// rule itself is resident in `observation-filing.md` and only pointed at. **An interactive session asks
|
|
148
|
+
// first**: there the offer is the correct reply, so `needs_filing` is silent.
|
|
146
149
|
const FILING_OFFER_REASON =
|
|
147
|
-
'⛔ filing offer: your reply offers to file an Issue instead of filing it
|
|
148
|
-
'
|
|
149
|
-
"
|
|
150
|
+
'⛔ filing offer: your reply offers to file an Issue instead of filing it, and this run is ' +
|
|
151
|
+
'unattended — nobody is there to answer. Filing into a first-party repository there is Tier A — ' +
|
|
152
|
+
"the trigger is the judgement that it is worth filing, not the run's progress (the " +
|
|
153
|
+
'workflow-commands skill → `observation-filing.md`). Run ' +
|
|
150
154
|
'`pnpm josh issue:file "<title>" --body-file <path> --depth <0|1|2>` — it scouts, lints, labels and ' +
|
|
151
155
|
'runs `epic:bundle` itself — then end with the one-line citation of what was filed; do not repeat ' +
|
|
152
156
|
'your previous reply. If it is not worth filing ' +
|
|
153
157
|
'after all, say so in one line instead.'
|
|
154
158
|
|
|
155
|
-
// **A headless parent's turn-end is its process's end
|
|
159
|
+
// **A headless parent's turn-end is its process's end**. Under `claude -p` the
|
|
156
160
|
// background waits die with the turn, so the lanes lose their parent and nothing re-invokes it. The
|
|
157
161
|
// reason hands over the foreground wait rather than a question, because there is nobody to answer one.
|
|
158
162
|
// The refusal's opening, which the transcript tail is counted by.
|
|
@@ -166,7 +170,7 @@ const HEADLESS_REFUSAL_CAP = 3
|
|
|
166
170
|
|
|
167
171
|
// The foreground waits as they appear in a transcript's tool-call input — the JSON `command` field, so
|
|
168
172
|
// the refusal's own prose, which names the same commands, never matches. `run:progress --wait` is not
|
|
169
|
-
// one
|
|
173
|
+
// one: it streams its reports and runs until work arrives, so it is started in
|
|
170
174
|
// the background, where it lives as long as the turn the foreground wait keeps open.
|
|
171
175
|
const HEADLESS_WAIT_CALLS = ['"command":"pnpm josh lane:await']
|
|
172
176
|
|
|
@@ -180,7 +184,7 @@ const HEADLESS_WAIT_BODY =
|
|
|
180
184
|
|
|
181
185
|
const HEADLESS_WAIT_REASON = `${HEADLESS_WAIT_MARKER}${HEADLESS_WAIT_BODY}`
|
|
182
186
|
|
|
183
|
-
// **A lane child never asks a person for the index
|
|
187
|
+
// **A lane child never asks a person for the index**. The index rule protects
|
|
184
188
|
// a person's own staging, and a lane is a per-run work tree with none to protect; the sanctioned commit
|
|
185
189
|
// flow is already authorized, so the reason hands it over instead of letting the run wait on a person.
|
|
186
190
|
// Both halves must appear — an index command and a request for permission — so a report that merely
|
|
@@ -204,8 +208,8 @@ function needs_index_route(context: StopContext): boolean {
|
|
|
204
208
|
return context.lane_child && asks_index_permission(context.message)
|
|
205
209
|
}
|
|
206
210
|
|
|
207
|
-
// **A refusal is the turn's only input, so it names the language the answer is written in
|
|
208
|
-
//
|
|
211
|
+
// **A refusal is the turn's only input, so it names the language the answer is written in**.
|
|
212
|
+
// The session-language line reaches a turn only through `UserPromptSubmit`;
|
|
209
213
|
// a turn this hook continues has no prompt, and an English refusal read alone was answered in English.
|
|
210
214
|
function language_note(lang: string): string {
|
|
211
215
|
return (
|
|
@@ -214,8 +218,8 @@ function language_note(lang: string): string {
|
|
|
214
218
|
)
|
|
215
219
|
}
|
|
216
220
|
|
|
217
|
-
// **A reply that drifted out of the session language is sent back once to be rewritten
|
|
218
|
-
//
|
|
221
|
+
// **A reply that drifted out of the session language is sent back once to be rewritten**.
|
|
222
|
+
// The drift persists — each turn matches the language of the one before — so
|
|
219
223
|
// the rewrite has to happen on the turn it starts; `stop_hook_active` bounds it to one.
|
|
220
224
|
function build_language_reason(lang: string): string {
|
|
221
225
|
return (
|
|
@@ -231,19 +235,28 @@ function language_reason(context: StopContext): string | undefined {
|
|
|
231
235
|
return build_language_reason(context.session_lang)
|
|
232
236
|
}
|
|
233
237
|
|
|
238
|
+
// The sessions no person answers: one kit launched under `claude -p` (a lane child, a woken session), a
|
|
239
|
+
// dispatched lane child, or the `backlogrun` parent the user handed the backlog to.
|
|
240
|
+
function is_unattended(context: StopContext): boolean {
|
|
241
|
+
return context.headless_agent || context.lane_child || context.backlog_parent
|
|
242
|
+
}
|
|
243
|
+
|
|
234
244
|
function needs_filing(context: StopContext): boolean {
|
|
235
|
-
if (context
|
|
245
|
+
if (!is_unattended(context) || context.filed) return false
|
|
236
246
|
|
|
237
|
-
return
|
|
247
|
+
return (
|
|
248
|
+
filing_offer.offers_filing(context.message) &&
|
|
249
|
+
filing_offer.is_first_party_target(context.message, context.session_owner)
|
|
250
|
+
)
|
|
238
251
|
}
|
|
239
252
|
|
|
240
|
-
// **A running background subagent stands both hold rules down
|
|
253
|
+
// **A running background subagent stands both hold rules down**. Its completion
|
|
241
254
|
// notice re-invokes the session, so the turn-end is a wait on the run's own work, not on a person — a
|
|
242
255
|
// notify there says "nothing needed" and dilutes the ones that do. A backgrounded command does not
|
|
243
256
|
// count: a dev server never ends, and a stop behind it would leave a person silently waiting. A lane
|
|
244
257
|
// child never reaches this with a task running: `needs_background_wait` answers it first.
|
|
245
258
|
//
|
|
246
|
-
// **A lane handed to the detached ship stands them down too
|
|
259
|
+
// **A lane handed to the detached ship stands them down too**: the hold now
|
|
247
260
|
// belongs to the supervisor driving the merge, and the person hears from that supervisor's own notify.
|
|
248
261
|
function is_held_idle(context: StopContext): boolean {
|
|
249
262
|
return context.hold_present && !context.agent_pending && !context.handed_off
|
|
@@ -264,8 +277,8 @@ function citation_reason(context: StopContext): string | undefined {
|
|
|
264
277
|
return build_citation_reason(references)
|
|
265
278
|
}
|
|
266
279
|
|
|
267
|
-
// The two rules on how a reply is written. **A headless agent's reply has no reader
|
|
268
|
-
//
|
|
280
|
+
// The two rules on how a reply is written. **A headless agent's reply has no reader**:
|
|
281
|
+
// its text lands in a stream-json log, so correcting its citations or its
|
|
269
282
|
// language costs a turn and reaches nobody. The artifacts a person does read — a Telegram, an Issue, a
|
|
270
283
|
// pull request — are held to the same rules by their own guards, not here.
|
|
271
284
|
function wording_reason(context: StopContext): string | undefined {
|
|
@@ -298,15 +311,15 @@ function count_headless_refusals(tail: string): number {
|
|
|
298
311
|
return tail.slice(Math.max(last_wait, 0)).split(HEADLESS_WAIT_MARKER).length - 1
|
|
299
312
|
}
|
|
300
313
|
|
|
301
|
-
// **A lane child with a task still running is sent back to wait, not to notify
|
|
314
|
+
// **A lane child with a task still running is sent back to wait, not to notify**.
|
|
302
315
|
// Its turn-end kills the task, so the notify the hold rules would ask for announces a stop that loses
|
|
303
316
|
// the work; the #2606 child obeyed exactly that and its gate died at `exit code 143`.
|
|
304
317
|
function needs_background_wait(context: StopContext): boolean {
|
|
305
318
|
return context.lane_child && context.background_pending
|
|
306
319
|
}
|
|
307
320
|
|
|
308
|
-
// The two hold rules, notify ahead of release — behind the lane index route
|
|
309
|
-
// and the lane background wait
|
|
321
|
+
// The two hold rules, notify ahead of release — behind the lane index route
|
|
322
|
+
// and the lane background wait, since the notify they would ask for announces
|
|
310
323
|
// a pause the run has no reason to take.
|
|
311
324
|
function hold_reason(context: StopContext): string | undefined {
|
|
312
325
|
if (needs_index_route(context)) return LANE_INDEX_REASON
|
|
@@ -324,7 +337,7 @@ function hold_reason(context: StopContext): string | undefined {
|
|
|
324
337
|
// reports the notify first; the filing offer goes ahead of the citation, since the filing it forces
|
|
325
338
|
// produces the citation the reply then needs.
|
|
326
339
|
//
|
|
327
|
-
// **The headless wait comes first and outlasts `stop_hook_active` up to its spin bound
|
|
340
|
+
// **The headless wait comes first and outlasts `stop_hook_active` up to its spin bound**.
|
|
328
341
|
// The loop-breaker exists so a person is not wedged behind a rule the run will not satisfy; a headless
|
|
329
342
|
// parent has no person, and letting its second stop through is exactly the silent end the rule is for.
|
|
330
343
|
// Each continuation it forces is a foreground wait of minutes, and the rule falls silent by itself once
|
|
@@ -3,7 +3,7 @@ import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
|
3
3
|
import { time_transcript_line, type Block } from '#scripts/time-runtime/time-transcript-line'
|
|
4
4
|
|
|
5
5
|
// The `Bash` commands a run's transcript tail already issued, parsed once here rather than in each
|
|
6
|
-
// rule that needs them
|
|
6
|
+
// rule that needs them. `prior-comment-read.ts` had this reading first; the
|
|
7
7
|
// scout gate needs the same "what did the run already run" question, so a second copy would be the
|
|
8
8
|
// clone `CLAUDE.md` prohibits. The delivery path sees only the raw tail — `delivered-rules.ts` names
|
|
9
9
|
// the reason a run's own calls are not handed to it — so the earlier calls are recovered by parsing
|
|
@@ -2,8 +2,8 @@ import { test_declared_changed } from '#scripts/test/test-declared-changed'
|
|
|
2
2
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
3
3
|
import { run_tail_rule } from './run-tail-rule'
|
|
4
4
|
|
|
5
|
-
// The trigger and the delivered text behind the `test-declared` row of `delivered-rules.ts
|
|
6
|
-
//
|
|
5
|
+
// The trigger and the delivered text behind the `test-declared` row of `delivered-rules.ts`.
|
|
6
|
+
// It lives beside `run-tail-rule.ts` and the other per-rule modules rather than
|
|
7
7
|
// inline in the enumeration, so the enumeration stays a list of rows.
|
|
8
8
|
//
|
|
9
9
|
// **A commit whose code change carries no test, refused at the commit stage `run-tail` already
|
|
@@ -3,8 +3,8 @@ import { bash_triggers } from './bash-triggers'
|
|
|
3
3
|
import { gh_api } from './gh-api'
|
|
4
4
|
import { shell_segments } from './shell-segments'
|
|
5
5
|
|
|
6
|
-
// The trigger and the delivered text behind the `third-party-write` row of `delivered-rules.ts
|
|
7
|
-
//
|
|
6
|
+
// The trigger and the delivered text behind the `third-party-write` row of `delivered-rules.ts`.
|
|
7
|
+
// A `gh api` write to a repository whose owner is not this session's — a
|
|
8
8
|
// tracker we do not own — is Tier C: `CLAUDE.md` → "Third-party repositories are Tier C" and
|
|
9
9
|
// `upstream-interrupt.md` forbid it without explicit current-turn user instruction, and a correct
|
|
10
10
|
// diagnosis is not that instruction.
|
|
@@ -25,7 +25,7 @@ import { shell_segments } from './shell-segments'
|
|
|
25
25
|
// A third-party write means all three: a `gh api` call, a write, and a repository target whose owner
|
|
26
26
|
// the classification calls third-party. `unknown` (an unreadable session remote, an unparseable path)
|
|
27
27
|
// is not third-party — the rule stays silent rather than refusing a write it cannot prove is external.
|
|
28
|
-
// The `{owner}` placeholder
|
|
28
|
+
// The `{owner}` placeholder is judged by every owner `gh` could expand it to:
|
|
29
29
|
// first-party only when all of them are, so a fork checkout whose `upstream` is another owner's still
|
|
30
30
|
// refuses the write `gh` may send there. A candidate whose owner could not be read counts as
|
|
31
31
|
// third-party here — unlike an unreadable session owner, it is a remote `gh` may really write to.
|
|
@@ -2,8 +2,8 @@ import { bash_triggers } from './bash-triggers'
|
|
|
2
2
|
import { git_argv } from './git-argv'
|
|
3
3
|
import { shell_segments } from './shell-segments'
|
|
4
4
|
|
|
5
|
-
// The trigger and the delivered text behind the `worktree-mutation` row of `delivered-rules.ts
|
|
6
|
-
//
|
|
5
|
+
// The trigger and the delivered text behind the `worktree-mutation` row of `delivered-rules.ts`.
|
|
6
|
+
// Group 2 of the three Bash-string gaps: a working-tree change made outside
|
|
7
7
|
// the authorized routes.
|
|
8
8
|
//
|
|
9
9
|
// **The deny list does not cover these at all.** `git checkout -- <path>` and `git restore <path>`
|
|
@@ -19,6 +19,10 @@ import { shell_segments } from './shell-segments'
|
|
|
19
19
|
// (with or without `-u`) and the read-only `git stash list` / `show` pass, and everything else — bare
|
|
20
20
|
// `git stash`, a message-less push, `pop` / `apply` / `drop` / `save` / `clear` — is refused.
|
|
21
21
|
//
|
|
22
|
+
// **The refusal names the way on for a handed-over stash.** joshuafolkken/kit#3630's plan restored a
|
|
23
|
+
// stash with `git stash apply`, and the lane parked on how to apply it instead of popping by message;
|
|
24
|
+
// the reason now says the substitution is the run's own to make (joshuafolkken/kit#3648).
|
|
25
|
+
//
|
|
22
26
|
// **It fires on every occurrence**, for the reason `git-force.ts` does: discarding the working tree is
|
|
23
27
|
// destructive each time it is issued.
|
|
24
28
|
|
|
@@ -83,7 +87,7 @@ function is_unauthorized_stash(args: ReadonlyArray<string>): boolean {
|
|
|
83
87
|
return true
|
|
84
88
|
}
|
|
85
89
|
|
|
86
|
-
// `git clean` deletes untracked files, which no commit can bring back
|
|
90
|
+
// `git clean` deletes untracked files, which no commit can bring back. It
|
|
87
91
|
// refuses to act without a force (`clean.requireForce`), so a force — `--force`, or a cluster carrying
|
|
88
92
|
// `f` — is what marks the destructive call; `git clean -n` is a dry run and passes.
|
|
89
93
|
const CLEAN_SUBCOMMAND = 'clean'
|
|
@@ -127,8 +131,11 @@ const WORKTREE_MUTATION_REASON =
|
|
|
127
131
|
'josh stash:pop "<message>"`, never a positional `git stash pop` a shared stack lets another lane ' +
|
|
128
132
|
'divert. A stash push is authorized only inside a documented flow and only with a findable message ' +
|
|
129
133
|
'— `git stash push -u -m "<message>"` — which this row allows; a bare `git stash`, a message-less ' +
|
|
130
|
-
'push, or `pop` / `apply` / `drop` is refused.
|
|
131
|
-
'
|
|
134
|
+
'push, or `pop` / `apply` / `drop` is refused. A plan that restores a handed-over stash with `git ' +
|
|
135
|
+
'stash apply` / `git stash pop` is read as `pnpm josh stash:pop "<message>"`: apply it that way, ' +
|
|
136
|
+
'continue, and record the substitution on the Issue — Tier A, never a `needs-decision` park ' +
|
|
137
|
+
'unless the plan says why the owner keeps the stash: then stop and confirm (`operating-rules.md` ' +
|
|
138
|
+
'→ "no-self-staging"). **This rule fires on every occurrence, not once per run.**'
|
|
132
139
|
|
|
133
140
|
const ROW = {
|
|
134
141
|
id: 'worktree-mutation',
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { epic_issue } from '#scripts/epic/epic-issue'
|
|
4
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
6
|
+
import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
7
|
+
import { run_carry_added, type CarryAddition } from '#scripts/run/carry/run-carry-added'
|
|
8
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
9
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
10
|
+
import { run_invocation } from '#scripts/run/run-invocation'
|
|
11
|
+
import { run_add, type AddOutcome, type AddPorts, type IssueView } from './run-add'
|
|
12
|
+
|
|
13
|
+
// `josh run:add <issue...> [--no-priority]` — the wiring around `run-add.ts`.
|
|
14
|
+
// It refuses unless a `backlogrun` holds the carry record here: an issue labelled with no run to take
|
|
15
|
+
// it would be picked up by whichever run starts next, which is not what was asked. A run that named
|
|
16
|
+
// issues reads its list off the record — with `--only` or without, since a named run drains the pool
|
|
17
|
+
// only after that list — so the queued issues are written there too; a pool run reads the labels alone. Each queued issue is announced as an `add` event, which wakes a `run:progress --wait` parked
|
|
18
|
+
// on a full house so the parent offers it the next freed lane.
|
|
19
|
+
|
|
20
|
+
const SUCCESS_EXIT_CODE = 0
|
|
21
|
+
const FAILURE_EXIT_CODE = 1
|
|
22
|
+
const USAGE_EXIT_CODE = 2
|
|
23
|
+
const ARGV_OFFSET = 2
|
|
24
|
+
const ISSUE_PREFIX = '#'
|
|
25
|
+
const NO_PRIORITY_FLAG = '--no-priority'
|
|
26
|
+
const USAGE = `Usage: josh run:add <issue...> [${NO_PRIORITY_FLAG}]`
|
|
27
|
+
const NO_RUN_MESSAGE =
|
|
28
|
+
'No backlogrun is running here, so nothing was added. Start one with `backlogrun #N`.'
|
|
29
|
+
|
|
30
|
+
interface AddRequest {
|
|
31
|
+
issues: ReadonlyArray<number>
|
|
32
|
+
is_priority: boolean
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface LiveRun {
|
|
36
|
+
target: string
|
|
37
|
+
carry: RunCarry
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function parse_issue(token: string): number | undefined {
|
|
41
|
+
const digits = token.startsWith(ISSUE_PREFIX) ? token.slice(ISSUE_PREFIX.length) : token
|
|
42
|
+
|
|
43
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(digits) ? Number(digits) : undefined
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Every token but the flag must be an issue number: a typo is refused whole rather than adding the
|
|
47
|
+
// rest, so the queue never holds half of what was typed.
|
|
48
|
+
function parse_request(argv: ReadonlyArray<string>): AddRequest | undefined {
|
|
49
|
+
const tokens = argv.filter((token) => token !== NO_PRIORITY_FLAG)
|
|
50
|
+
const issues = tokens.map((token) => parse_issue(token)).filter((issue) => issue !== undefined)
|
|
51
|
+
|
|
52
|
+
if (issues.length === 0 || issues.length !== tokens.length) return undefined
|
|
53
|
+
|
|
54
|
+
return { issues, is_priority: !argv.includes(NO_PRIORITY_FLAG) }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function live_run(): Promise<LiveRun | undefined> {
|
|
58
|
+
const directory = await run_carry.repository_directory()
|
|
59
|
+
|
|
60
|
+
if (directory === undefined) return undefined
|
|
61
|
+
|
|
62
|
+
const target = run_carry.carry_path(directory)
|
|
63
|
+
const read = run_carry.read_carry(target)
|
|
64
|
+
|
|
65
|
+
return read.kind === 'carried' ? { target, carry: read.carry } : undefined
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Re-read rather than reusing the record found before the labels were written: the parent may have
|
|
69
|
+
// marked an issue done in between, and writing the stale copy back would undo that.
|
|
70
|
+
function record(target: string, additions: ReadonlyArray<CarryAddition>): void {
|
|
71
|
+
const read = run_carry.read_carry(target)
|
|
72
|
+
|
|
73
|
+
if (
|
|
74
|
+
read.kind !== 'carried' ||
|
|
75
|
+
run_invocation.issue_numbers(read.carry.invocation) === undefined
|
|
76
|
+
) {
|
|
77
|
+
return
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (additions.length > 0) run_carry_added.add_issues(target, read.carry, additions)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function announce(issues: ReadonlyArray<number>): Promise<void> {
|
|
84
|
+
const [issue, ...rest] = issues
|
|
85
|
+
|
|
86
|
+
if (issue === undefined) return
|
|
87
|
+
|
|
88
|
+
await run_event_stream_emit.emit(
|
|
89
|
+
run_event_stream.EVENT_KIND.ADD,
|
|
90
|
+
`added ${ISSUE_PREFIX}${String(issue)}`,
|
|
91
|
+
)
|
|
92
|
+
await announce(rest)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// The blockers still open. A blocker whose state did not come back counts as open, so an issue is
|
|
96
|
+
// never reported free to run on a read that did not say so.
|
|
97
|
+
function view_of(json: string): IssueView | undefined {
|
|
98
|
+
const issue = epic_issue.parse_epic_issue(json)
|
|
99
|
+
|
|
100
|
+
if (issue === undefined) return undefined
|
|
101
|
+
|
|
102
|
+
const blockers = (issue.blockedBy?.nodes ?? [])
|
|
103
|
+
.filter((blocker) => epic_issue.normalize_state(blocker.state ?? '') !== epic_issue.CLOSED)
|
|
104
|
+
.map((blocker) => blocker.number)
|
|
105
|
+
|
|
106
|
+
return { is_open: epic_issue.is_open(issue.state), blockers }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function read_issue(issue: number): Promise<IssueView | undefined> {
|
|
110
|
+
const read = await git_gh_command.issue_get_state_and_relations_classified(String(issue))
|
|
111
|
+
|
|
112
|
+
return read.kind === 'read' ? view_of(read.json) : undefined
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function apply_label(issue: number, label: string): Promise<boolean> {
|
|
116
|
+
return await git_gh_command.issue_add_label(String(issue), label)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const GH_PORTS: AddPorts = { read_issue, apply_label }
|
|
120
|
+
|
|
121
|
+
async function add(request: AddRequest, target: string, ports: AddPorts): Promise<number> {
|
|
122
|
+
const outcomes: ReadonlyArray<AddOutcome> = await run_add.add_all(
|
|
123
|
+
request.issues,
|
|
124
|
+
request.is_priority,
|
|
125
|
+
ports,
|
|
126
|
+
)
|
|
127
|
+
const additions = run_add.additions_of(outcomes, request.is_priority)
|
|
128
|
+
|
|
129
|
+
record(target, additions)
|
|
130
|
+
await announce(additions.map((addition) => addition.issue))
|
|
131
|
+
|
|
132
|
+
for (const outcome of outcomes) console.info(run_add.describe(outcome, request.is_priority))
|
|
133
|
+
|
|
134
|
+
return run_add.is_all_queued(outcomes) ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async function run(argv: ReadonlyArray<string>, ports: AddPorts = GH_PORTS): Promise<number> {
|
|
138
|
+
const request = parse_request(argv)
|
|
139
|
+
|
|
140
|
+
if (request === undefined) {
|
|
141
|
+
console.error(USAGE)
|
|
142
|
+
|
|
143
|
+
return USAGE_EXIT_CODE
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const live = await live_run()
|
|
147
|
+
|
|
148
|
+
if (live === undefined) {
|
|
149
|
+
console.error(NO_RUN_MESSAGE)
|
|
150
|
+
|
|
151
|
+
return FAILURE_EXIT_CODE
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return await add(request, live.target, ports)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
158
|
+
process.exitCode = await run(argv)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const run_add_cli = { NO_RUN_MESSAGE, USAGE, parse_request, run }
|
|
162
|
+
|
|
163
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
164
|
+
|
|
165
|
+
export { run_add_cli }
|