@joshuafolkken/kit 1.1240.0 → 1.1373.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +52 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +195 -181
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +282 -95
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +17 -11
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +30 -5
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +21 -7
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +6 -7
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +26 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +64 -18
- package/scripts/run/run-step.ts +107 -51
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { parse_json } from '#scripts/git/parse-json-array'
|
|
2
2
|
import { z } from 'zod'
|
|
3
3
|
|
|
4
|
-
// Why one `gh api` request failed, taken from **that request** rather than from a later probe
|
|
5
|
-
// (joshuafolkken/kit#1690).
|
|
4
|
+
// Why one `gh api` request failed, taken from **that request** rather than from a later probe.
|
|
6
5
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// after the answer was otherwise final. Both are inferences about a request that is already over: a
|
|
6
|
+
// A second request — `exec_gh_api_status` against the same path, or a reachability probe fired
|
|
7
|
+
// after the answer is otherwise final — is only an inference about a request that is already over: a
|
|
10
8
|
// connection that dropped for three hundred milliseconds fails the read and answers the probe
|
|
11
9
|
// `reachable`, so the failure keeps the meaning the probe gave it and not the one it had.
|
|
12
10
|
//
|
|
@@ -14,7 +12,7 @@ import { z } from 'zod'
|
|
|
14
12
|
// `gh api` writes the **response body** to stdout, and GitHub's REST error document carries its own
|
|
15
13
|
// status — `{"message":"Not Found","documentation_url":…,"status":"404"}`. A request that never
|
|
16
14
|
// reached GitHub has no response body at all, so stdout is empty. That is the whole classification,
|
|
17
|
-
// and neither half reads gh's stderr prose, which is
|
|
15
|
+
// and neither half reads gh's stderr prose, which is wording rather than protocol.
|
|
18
16
|
|
|
19
17
|
// GitHub's REST error document. Only the status is read: `message` and `documentation_url` are prose
|
|
20
18
|
// for a person, and every other field varies by endpoint.
|
|
@@ -41,8 +39,7 @@ interface GhFailure {
|
|
|
41
39
|
// for a related resource, reached only because the first answered. Such a request fails about
|
|
42
40
|
// itself, so its 404 says nothing about whether the subject exists: an issue read whose blocker
|
|
43
41
|
// relations then 404 on a host without that endpoint is a readable issue, not a missing one. Only
|
|
44
|
-
// the caller knows which of its requests was which, so it is the caller that sets this
|
|
45
|
-
// (joshuafolkken/kit#1690).
|
|
42
|
+
// the caller knows which of its requests was which, so it is the caller that sets this.
|
|
46
43
|
is_followup?: boolean
|
|
47
44
|
}
|
|
48
45
|
|
|
@@ -62,7 +59,7 @@ function has_gh_failure(error: unknown): error is Error & { gh_failure: GhFailur
|
|
|
62
59
|
// nothing in it says what the status was, and guessing one would be the inference this module
|
|
63
60
|
// exists to remove.
|
|
64
61
|
function parse_response_status(stdout: string): number | undefined {
|
|
65
|
-
const document = parse_json.
|
|
62
|
+
const document = parse_json.parse_json_object_or_undefined(stdout, error_document_schema)
|
|
66
63
|
if (document?.status === undefined) return undefined
|
|
67
64
|
const status = Number(document.status)
|
|
68
65
|
|
|
@@ -4,7 +4,7 @@ import { has_stderr_field } from './git-gh-exec'
|
|
|
4
4
|
// string itself, so the value arrives raw and there is nothing to unquote — this used to strip a
|
|
5
5
|
// leading and trailing `"` anyway, which ate real characters from any answer that legitimately
|
|
6
6
|
// carried them. A title of `"queue" should stop at the first failure` reached Telegram as
|
|
7
|
-
// `queue" should stop at the first failure
|
|
7
|
+
// `queue" should stop at the first failure`. Trimming and the empty answer
|
|
8
8
|
// are the whole contract.
|
|
9
9
|
function parse_pr_state_string(result: string): string | undefined {
|
|
10
10
|
const trimmed = result.trim()
|
|
@@ -12,13 +12,12 @@ import {
|
|
|
12
12
|
// Listing issues through REST, in the JSON shape `gh issue list --json <fields>` answered with.
|
|
13
13
|
//
|
|
14
14
|
// `gh issue list` goes through GraphQL, which a cloud session is answered 403 for; the REST listing
|
|
15
|
-
// is served normally
|
|
15
|
+
// is served normally. The callers differ only in filter and fields, so
|
|
16
16
|
// the request, the paging and the mapping are decided once here and every caller downstream keeps
|
|
17
|
-
// reading the field names it already reads
|
|
17
|
+
// reading the field names it already reads.
|
|
18
18
|
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// than being left to describe six of seven callers.
|
|
19
|
+
// `state` is a parameter because the duplicate scan needs the issue that closed an hour ago, and the
|
|
20
|
+
// name describes that behavior rather than the open-only listing most callers ask for.
|
|
22
21
|
//
|
|
23
22
|
// The field mapping itself is `git-gh-issue-rest.ts`, the same one the single-issue read goes
|
|
24
23
|
// through: a listing row and a read response are the same object, so a second copy of the state
|
|
@@ -38,7 +37,7 @@ const LISTING_DIRECTION = 'direction=desc'
|
|
|
38
37
|
|
|
39
38
|
// `state` and `sort` are parameters rather than constants because the duplicate scan has to see the
|
|
40
39
|
// issue that closed an hour ago: the work most likely to be filed twice is the work that just
|
|
41
|
-
// finished, and a listing fixed at `state=open` cannot show it
|
|
40
|
+
// finished, and a listing fixed at `state=open` cannot show it. Ordering a
|
|
42
41
|
// closed listing by `created` would rank it by when each issue was *filed*, which says nothing about
|
|
43
42
|
// when it closed — so the sort travels with the state rather than being fixed alongside it.
|
|
44
43
|
//
|
|
@@ -77,7 +76,7 @@ function listing_path(request: IssueListRequest, page: number): string {
|
|
|
77
76
|
return `${git_gh_api_path.issues_api_path(request.repo)}?${listing_query(request)}${label}${paging}`
|
|
78
77
|
}
|
|
79
78
|
|
|
80
|
-
// `--search "<term> in:body"`
|
|
79
|
+
// `--search "<term> in:body"` matches tokens, so `#858` never matches inside `#8580`. A bare
|
|
81
80
|
// substring test does, and those false positives fill the caller's `limit` newest-first — crowding
|
|
82
81
|
// out an older genuine match, which `epic:audit` would then never report. The term is always
|
|
83
82
|
// `#<number>`, whose `#` anchors the left side, so only a trailing digit has to be refused.
|
|
@@ -126,22 +125,19 @@ async function fetch_page(
|
|
|
126
125
|
|
|
127
126
|
// The ceiling on how far *any* listing pages. Without it a request pages until the backlog runs
|
|
128
127
|
// out: the body search's matches are normally zero, so "stop once `limit` rows are selected" never
|
|
129
|
-
// fires for it
|
|
128
|
+
// fires for it, and the other five reach `limit` only after the client-side
|
|
130
129
|
// pull-request exclusion has discarded whatever the endpoint served alongside the issues — which in
|
|
131
|
-
// a repository with hundreds of open pull requests is the whole backlog again
|
|
132
|
-
// (joshuafolkken/kit#1067).
|
|
130
|
+
// a repository with hundreds of open pull requests is the whole backlog again.
|
|
133
131
|
//
|
|
134
132
|
// Five pages bounds every listing at five requests, and five hundred rows is comfortably above what
|
|
135
133
|
// each caller asks for: the widest is `epic:bundle`'s two hundred, which the ceiling only cuts short
|
|
136
134
|
// once more than three in five of the newest five hundred open items are pull requests. A repository
|
|
137
135
|
// big enough to reach it is *told* rather than handed a shorter answer.
|
|
138
136
|
//
|
|
139
|
-
// **It applies to every listing only because the flag
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
// reason, and the two must never be separated again: a ceiling is only ever as safe as the caller's
|
|
144
|
-
// ability to say it was reached.
|
|
137
|
+
// **It applies to every listing only because the flag reaches every caller.** Bounding a listing
|
|
138
|
+
// whose caller cannot read `is_capped` would shorten that listing's answer in silence — the defect
|
|
139
|
+
// the bound exists to prevent. So the two must never be separated: a ceiling is only ever as safe as
|
|
140
|
+
// the caller's ability to say it was reached.
|
|
145
141
|
const MAX_PAGES = 5
|
|
146
142
|
// The ceiling in issues, which is how the callers that report the gap phrase it.
|
|
147
143
|
const MAX_SCANNED = MAX_PAGES * PER_PAGE
|
|
@@ -199,7 +195,7 @@ async function fetch_selected(request: IssueListRequest): Promise<SelectedRows>
|
|
|
199
195
|
// issue GitHub itself reports as unblocked costs no request. A backlog with no declared blockers
|
|
200
196
|
// therefore costs exactly what `gh` cost — one listing — rather than one request per row.
|
|
201
197
|
//
|
|
202
|
-
// Bounded rather than sequential
|
|
198
|
+
// Bounded rather than sequential: the pass was paced one request at a time,
|
|
203
199
|
// which made every `backlog:plan` wait about 0.7 s per opted-in issue declaring a blocker. The width
|
|
204
200
|
// is the one `epic:bundle` already reads the same endpoint at, so the burst stays bounded while a
|
|
205
201
|
// rate-limited read still fails the whole listing rather than a row (`bounded-pool.ts`).
|
|
@@ -218,7 +214,7 @@ async function read_relations(
|
|
|
218
214
|
|
|
219
215
|
// The listing, plus what it could not cover. `json` is `undefined` — never `'[]'` — when the listing
|
|
220
216
|
// could not be read: `epic:next`'s per-repository exclusion reads this answer, and "nothing is
|
|
221
|
-
// running" is what *starts* a second run in the same checkout
|
|
217
|
+
// running" is what *starts* a second run in the same checkout.
|
|
222
218
|
//
|
|
223
219
|
// `is_capped` is `false` on that failure path, and says nothing there: an unreadable listing is
|
|
224
220
|
// already fully described by `json`, and a caller reading a truncation flag off it would be reading
|
|
@@ -246,7 +242,7 @@ async function issue_list(request: IssueListRequest): Promise<IssueListOutcome>
|
|
|
246
242
|
}
|
|
247
243
|
}
|
|
248
244
|
|
|
249
|
-
// The flag-discarding second entry point is gone
|
|
245
|
+
// The flag-discarding second entry point is gone. It answered
|
|
250
246
|
// `string | undefined` for the five callers that could not reach the page ceiling, and once the
|
|
251
247
|
// ceiling applies to all six there is no such caller left: a wrapper that dropped `is_capped` would
|
|
252
248
|
// be the one way back to a silently shortened answer, so it is removed rather than left for someone
|
|
@@ -13,26 +13,22 @@ import { gh_reachability } from './git-gh-reachability'
|
|
|
13
13
|
|
|
14
14
|
// Reading one issue. Split out of `git-gh-issue.ts`, which had grown past the file-length limit
|
|
15
15
|
// while holding both the reads and the writes; the reads are what every epic command goes through,
|
|
16
|
-
// and telling a number that resolves to nothing from a read that failed belongs with them
|
|
17
|
-
// (joshuafolkken/kit#957).
|
|
16
|
+
// and telling a number that resolves to nothing from a read that failed belongs with them.
|
|
18
17
|
|
|
19
18
|
// The blocker relations, which REST serves from their own endpoint rather than inside the issue.
|
|
20
19
|
// `gh issue view --json blockedBy` answered them in the same response because GraphQL selects them
|
|
21
|
-
// as a connection; REST needs a second request
|
|
20
|
+
// as a connection; REST needs a second request.
|
|
22
21
|
//
|
|
23
22
|
// One page of a hundred — `FULL_PAGE_QUERY`, the same one every other listing here asks for — where
|
|
24
23
|
// GraphQL asked for `blockedBy(first:50)`, so `nodes` is at least as complete as it was, while
|
|
25
24
|
// `totalCount` comes from the issue's own dependency summary and stays exact whatever the page
|
|
26
|
-
// holds. The endpoint itself is named in `git-gh-api-path.ts`, which the two writes address as well
|
|
27
|
-
// (joshuafolkken/kit#1026).
|
|
25
|
+
// holds. The endpoint itself is named in `git-gh-api-path.ts`, which the two writes address as well.
|
|
28
26
|
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
// was wrong. `epic:next` then called a graph that agreed with itself contradictory and exited 1,
|
|
35
|
-
// which stops an unattended run at its first step with nothing to fix.
|
|
27
|
+
// Split out for the one caller that may not consult the summary the wrapper below trusts: the
|
|
28
|
+
// summary is GitHub's own count and it can disagree with the listing it counts — an
|
|
29
|
+
// `issue_dependencies_summary` can read `total_blocked_by: 0` while this endpoint returns a real
|
|
30
|
+
// relation. Trusting the counter there makes `epic:next` call a graph that agrees with itself
|
|
31
|
+
// contradictory and exit 1, which stops an unattended run at its first step with nothing to fix.
|
|
36
32
|
async function read_blocked_by_listing(
|
|
37
33
|
issue_number: string,
|
|
38
34
|
repo?: string,
|
|
@@ -48,22 +44,20 @@ async function read_blocked_by_listing(
|
|
|
48
44
|
// The same relations, with the request skipped when the issue's own summary says the count is zero.
|
|
49
45
|
// That skip is the common case and the one that matters for cost: `epic:bundle` reads relations for
|
|
50
46
|
// the whole open backlog, up to two hundred issues, and every one of those reads names `blockedBy`.
|
|
51
|
-
// Without it the pass would be four hundred requests
|
|
52
|
-
//
|
|
53
|
-
// than making every read pay for it.
|
|
47
|
+
// Without it the pass would be four hundred requests instead of two hundred — which is why the rare
|
|
48
|
+
// path has its own entry point above rather than making every read pay for it.
|
|
54
49
|
//
|
|
55
50
|
// A pull request is skipped ahead of that, structurally rather than on a count. It carries no
|
|
56
51
|
// `issue_dependencies_summary` at all, and an absent summary is deliberately not read as a zero — so
|
|
57
52
|
// the numeric skip cannot fire for one, and the endpoint was asked every time. GitHub answers an
|
|
58
53
|
// empty array today, but a 404 there would fail the whole read and `epic:bundle` would report the
|
|
59
|
-
// reference as `unreadable` **before** the `/pull/` check that drops it
|
|
60
|
-
// ran. The guard rested on API behavior nobody controls; this makes it a fact about pull requests
|
|
61
|
-
// (joshuafolkken/kit#1066).
|
|
54
|
+
// reference as `unreadable` **before** the `/pull/` check that drops it ever
|
|
55
|
+
// ran. The guard rested on API behavior nobody controls; this makes it a fact about pull requests.
|
|
62
56
|
//
|
|
63
57
|
// Exported because the *listings* need exactly this, and for exactly this reason: a listing response
|
|
64
58
|
// carries every row's `issue_dependencies_summary` but no `blockedBy`, so the pickup that asks for
|
|
65
59
|
// the field pays one request per row that declares a blocker and nothing for the rest. A second copy
|
|
66
|
-
// beside the listing requests is the clone `CLAUDE.md` prohibits
|
|
60
|
+
// beside the listing requests is the clone `CLAUDE.md` prohibits.
|
|
67
61
|
async function read_blocked_by(
|
|
68
62
|
issue_number: string,
|
|
69
63
|
rest: RestIssue,
|
|
@@ -88,7 +82,7 @@ function mark_followup(error: unknown): unknown {
|
|
|
88
82
|
return gh_failure.attach(error, { ...failure, is_followup: true })
|
|
89
83
|
}
|
|
90
84
|
|
|
91
|
-
// The relations, marked as the follow-up request they are
|
|
85
|
+
// The relations, marked as the follow-up request they are.
|
|
92
86
|
//
|
|
93
87
|
// **One read, two requests, one classifier.** The relations endpoint is reached only after the issue
|
|
94
88
|
// itself came back, so by then the number has resolved — and yet the caller catches a single error
|
|
@@ -109,8 +103,7 @@ async function read_relations(
|
|
|
109
103
|
}
|
|
110
104
|
|
|
111
105
|
// One issue through REST, answered in the field names `gh issue view --json` used. Every read below
|
|
112
|
-
// goes through it, so the request, the field mapping and the blocker relations are decided once
|
|
113
|
-
// (joshuafolkken/kit#1024).
|
|
106
|
+
// goes through it, so the request, the field mapping and the blocker relations are decided once.
|
|
114
107
|
//
|
|
115
108
|
// The blocker request is made **only** when `blockedBy` was asked for — the title, body and
|
|
116
109
|
// labels-and-body reads never name it — and, when it was, only when the issue itself reports a
|
|
@@ -136,10 +129,10 @@ async function read_issue_fields(
|
|
|
136
129
|
// another repository's number quoted in prose — which is an answer rather than a gap. `unreadable`
|
|
137
130
|
// is a gap: a rate limit, expired auth, a dropped connection. Folding the two together had one
|
|
138
131
|
// non-existent number reported as something the command had failed to read, which stops an
|
|
139
|
-
// unattended run for a reference that never existed
|
|
132
|
+
// unattended run for a reference that never existed.
|
|
140
133
|
//
|
|
141
|
-
// **`reason` splits the gap into the three answers a caller acts on differently
|
|
142
|
-
//
|
|
134
|
+
// **`reason` splits the gap into the three answers a caller acts on differently**.
|
|
135
|
+
// `unreachable` is retryable — nothing answered, or GitHub answered 429 or
|
|
143
136
|
// 5xx — so the same request a moment later can succeed and an unattended run should ask again rather
|
|
144
137
|
// than report the backlog empty. `rejected` is an answer that will not change on its own: expired
|
|
145
138
|
// auth, an org policy, a 403. `malformed` is a response that arrived and could not be used, which is
|
|
@@ -161,19 +154,17 @@ type FieldRead = IssueReadFailure | { kind: 'read'; text: string | undefined }
|
|
|
161
154
|
// not there.
|
|
162
155
|
const NOT_FOUND_STATUS = 404
|
|
163
156
|
|
|
164
|
-
// Why the read failed, read off **the failed request** rather than off a second one
|
|
165
|
-
// (joshuafolkken/kit#1690).
|
|
157
|
+
// Why the read failed, read off **the failed request** rather than off a second one.
|
|
166
158
|
//
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
// status was on the failed request all along, and `git-gh-failure.ts` takes it from there.
|
|
159
|
+
// Classifying by gh's stderr wording would be prose-matching, but no second request is needed:
|
|
160
|
+
// `gh api` writes the **response body** to stdout, and GitHub's own error document carries the
|
|
161
|
+
// status there — so the status is on the failed request itself, and `git-gh-failure.ts` takes it
|
|
162
|
+
// from there.
|
|
172
163
|
//
|
|
173
164
|
// **A second request cannot answer about the first.** A connection that dropped for a moment fails
|
|
174
|
-
// the read and answers
|
|
175
|
-
//
|
|
176
|
-
// free, so `epic:bundle`'s bounded lookup
|
|
165
|
+
// the read and answers a probe `reachable`, and the read would then keep the meaning the probe gave
|
|
166
|
+
// it. Reading the failed request avoids that and the extra request with it: the classification is
|
|
167
|
+
// free, so `epic:bundle`'s bounded lookup does not trade accuracy against a rate limit it would
|
|
177
168
|
// deepen.
|
|
178
169
|
//
|
|
179
170
|
// An error carrying no classification at all did not come from the request: `parse_rest_issue` and
|
|
@@ -191,7 +182,7 @@ function to_read_failure(error: unknown): IssueReadFailure {
|
|
|
191
182
|
|
|
192
183
|
if (failure === undefined) return { kind: 'unreadable', reason: 'malformed', status: undefined }
|
|
193
184
|
// Only the request that resolves the number can report it as resolving to nothing. A follow-up
|
|
194
|
-
// request's own 404 is about that endpoint
|
|
185
|
+
// request's own 404 is about that endpoint.
|
|
195
186
|
if (is_number_unresolved(failure)) return { kind: 'missing' }
|
|
196
187
|
|
|
197
188
|
return {
|
|
@@ -220,8 +211,7 @@ async function issue_view_json_classified(
|
|
|
220
211
|
//
|
|
221
212
|
// The unwrapped `string | undefined` below is this same read with the reason dropped, rather than a
|
|
222
213
|
// second read that never had one: a caller that only wants the text keeps its signature, and one
|
|
223
|
-
// that has to tell "the body is empty" from "the body could not be read" now can
|
|
224
|
-
// (joshuafolkken/kit#1690).
|
|
214
|
+
// that has to tell "the body is empty" from "the body could not be read" now can.
|
|
225
215
|
async function issue_view_field_classified(
|
|
226
216
|
issue_number: string,
|
|
227
217
|
field: string,
|
|
@@ -247,12 +237,10 @@ async function issue_view_field(
|
|
|
247
237
|
return read.kind === 'read' ? read.text : undefined
|
|
248
238
|
}
|
|
249
239
|
|
|
250
|
-
// An extracted string arrives raw — nothing quotes it — and an empty answer is not a title
|
|
251
|
-
// (joshuafolkken/kit#993).
|
|
240
|
+
// An extracted string arrives raw — nothing quotes it — and an empty answer is not a title.
|
|
252
241
|
//
|
|
253
242
|
// `repo` reads the title of an issue in another repository — what `josh notify` needs when the
|
|
254
|
-
// `--issue-url` it was given points outside the repository the session runs in
|
|
255
|
-
// (joshuafolkken/kit#903).
|
|
243
|
+
// `--issue-url` it was given points outside the repository the session runs in.
|
|
256
244
|
async function issue_get_title(issue_number: string, repo?: string): Promise<string | undefined> {
|
|
257
245
|
const result = await issue_view_field(issue_number, 'title', repo)
|
|
258
246
|
|
|
@@ -265,15 +253,14 @@ async function issue_get_body(issue_number: string, repo?: string): Promise<stri
|
|
|
265
253
|
|
|
266
254
|
// The body, plus why it produced nothing when it did. An epic's body is the one read whose absence
|
|
267
255
|
// is indistinguishable from a legitimate answer — an epic with no task list and an epic nobody could
|
|
268
|
-
// read both parse to zero children — so the caller that builds the dependency graph takes this one
|
|
269
|
-
// (joshuafolkken/kit#1690).
|
|
256
|
+
// read both parse to zero children — so the caller that builds the dependency graph takes this one.
|
|
270
257
|
async function issue_get_body_classified(issue_number: string, repo?: string): Promise<FieldRead> {
|
|
271
258
|
return await issue_view_field_classified(issue_number, 'body', repo)
|
|
272
259
|
}
|
|
273
260
|
|
|
274
261
|
// A JSON view of one issue, for every caller that wants several fields at once. Callers differ only
|
|
275
262
|
// in which fields they ask for, and a helper per field list is how four near-identical functions
|
|
276
|
-
// accumulated
|
|
263
|
+
// accumulated.
|
|
277
264
|
//
|
|
278
265
|
// The field list is still spelled the way `gh issue view --json` spelled it, and so is the answer:
|
|
279
266
|
// the translation to and from REST is `git-gh-issue-rest.ts`, so no caller downstream changed.
|
|
@@ -289,11 +276,11 @@ async function issue_view_json(
|
|
|
289
276
|
|
|
290
277
|
// State, labels and dependency relations in one read: the epic auto-close needs state and relations
|
|
291
278
|
// per child, `epic:next` needs the labels too, and splitting them would multiply the API calls for
|
|
292
|
-
// no gain
|
|
279
|
+
// no gain.
|
|
293
280
|
//
|
|
294
281
|
// `repo` reads a child in another repository. Cross-repository children are read this way rather
|
|
295
282
|
// than from a local checkout: their state is a GitHub fact, and requiring a clone to learn it is
|
|
296
|
-
// what kept the auto-close from ever running on such an epic
|
|
283
|
+
// what kept the auto-close from ever running on such an epic.
|
|
297
284
|
const STATE_AND_RELATIONS_FIELDS = 'number,state,labels,blockedBy'
|
|
298
285
|
|
|
299
286
|
async function issue_get_state_and_relations(
|
|
@@ -304,8 +291,7 @@ async function issue_get_state_and_relations(
|
|
|
304
291
|
}
|
|
305
292
|
|
|
306
293
|
// The same read, plus why it produced nothing when it did. An epic's children are read this way, and
|
|
307
|
-
// an unattended run has to tell a child it could not reach from one it may never reach
|
|
308
|
-
// (joshuafolkken/kit#1690).
|
|
294
|
+
// an unattended run has to tell a child it could not reach from one it may never reach.
|
|
309
295
|
async function issue_get_state_and_relations_classified(
|
|
310
296
|
issue_number: string,
|
|
311
297
|
repo?: string,
|
|
@@ -325,8 +311,7 @@ function is_unreachable_read(failure: IssueReadFailure): boolean {
|
|
|
325
311
|
//
|
|
326
312
|
// `epic:bundle` reads a referenced issue through the same call rather than adding a helper for its
|
|
327
313
|
// own field list — it needs the body and the state, which is a subset of this one, and a helper per
|
|
328
|
-
// field list is exactly how the four near-identical functions above accumulated
|
|
329
|
-
// (joshuafolkken/kit#947).
|
|
314
|
+
// field list is exactly how the four near-identical functions above accumulated.
|
|
330
315
|
const PLAN_FIELDS = 'number,title,body,state,url,labels,blockedBy'
|
|
331
316
|
|
|
332
317
|
async function issue_get_plan_fields(issue_number: string): Promise<string | undefined> {
|
|
@@ -336,12 +321,12 @@ async function issue_get_plan_fields(issue_number: string): Promise<string | und
|
|
|
336
321
|
// The same fields, with a failed read told apart from a number that resolves to nothing.
|
|
337
322
|
// `epic:bundle` reads a reference this way because the two answers belong in different places: a
|
|
338
323
|
// missing number is neither a candidate nor a gap, while an unreadable one is reported so a verdict
|
|
339
|
-
// is never quietly based on data that never arrived
|
|
324
|
+
// is never quietly based on data that never arrived.
|
|
340
325
|
async function issue_get_plan_fields_classified(issue_number: string): Promise<IssueRead> {
|
|
341
326
|
return await issue_view_json_classified(issue_number, PLAN_FIELDS)
|
|
342
327
|
}
|
|
343
328
|
|
|
344
|
-
// `state` rides along for `epic-add.ts`'s closed-epic refusal
|
|
329
|
+
// `state` rides along for `epic-add.ts`'s closed-epic refusal; every
|
|
345
330
|
// other caller reads only the labels and body and ignores it, so it costs no extra request.
|
|
346
331
|
async function issue_get_labels_and_body(issue_number: string): Promise<string | undefined> {
|
|
347
332
|
return await issue_view_json(issue_number, 'number,state,labels,body')
|
|
@@ -349,8 +334,7 @@ async function issue_get_labels_and_body(issue_number: string): Promise<string |
|
|
|
349
334
|
|
|
350
335
|
// The conversation comments of one issue, as REST serves them. `undefined` — never `'[]'` — when the
|
|
351
336
|
// listing could not be read: the one caller has to tell "this epic carries no closing comment" from
|
|
352
|
-
// "nobody looked", because posting on the second answer is the duplicate it exists to prevent
|
|
353
|
-
// (joshuafolkken/kit#1039).
|
|
337
|
+
// "nobody looked", because posting on the second answer is the duplicate it exists to prevent.
|
|
354
338
|
//
|
|
355
339
|
// Paged, and for the same reason `pr_get_comments` is: REST answers 30 rows and an epic's
|
|
356
340
|
// conversation outgrows that, while the comment being looked for is the **newest** one — so an
|
|
@@ -380,8 +364,7 @@ async function issue_list_comments(issue_number: string): Promise<string | undef
|
|
|
380
364
|
// than read off `gh`'s stderr wording, because classifying by the message is prose-matching.
|
|
381
365
|
//
|
|
382
366
|
// **This one could read the failed request instead, and deliberately does not** — its caller reaches
|
|
383
|
-
// it from a `catch`, where the error it holds already carries `gh_failure
|
|
384
|
-
// joshuafolkken/kit#1690. What is asked here is not "why did that request fail" but "does this
|
|
367
|
+
// it from a `catch`, where the error it holds already carries `gh_failure`. What is asked here is not "why did that request fail" but "does this
|
|
385
368
|
// endpoint exist on this host", and the answer has to hold for a `read_blocked_by_listing` that
|
|
386
369
|
// failed for some other reason entirely. Reusing the caught failure would fold the two questions
|
|
387
370
|
// into one.
|
|
@@ -394,17 +377,17 @@ async function has_no_relations_endpoint(issue_number: string, repo?: string): P
|
|
|
394
377
|
}
|
|
395
378
|
|
|
396
379
|
// The blocker numbers of one issue, read from the relations listing rather than from the issue's own
|
|
397
|
-
// summary count
|
|
380
|
+
// summary count. Exposed on the command object so the callers that need the
|
|
398
381
|
// uncounted answer reach it the way they reach every other read, and so a suite that already fakes
|
|
399
382
|
// the command layer does not fall through to a real `gh api`.
|
|
400
383
|
//
|
|
401
384
|
// A 404 is answered as no relations rather than raised. `read_blocked_by` never reaches this
|
|
402
|
-
// endpoint for a pull request —
|
|
385
|
+
// endpoint for a pull request — it skips one structurally, since a PR carries no
|
|
403
386
|
// `issue_dependencies_summary` to skip on — and this entry point has no issue payload to make that
|
|
404
387
|
// judgement from. A PR pasted into an epic's task list would otherwise turn a read of an endpoint
|
|
405
388
|
// that has nothing for it into a warning about a relation nobody lost. Every other failure still
|
|
406
389
|
// raises: a rate limit is a gap, and the caller says so.
|
|
407
|
-
// The same relations, each carrying the repository it lives in
|
|
390
|
+
// The same relations, each carrying the repository it lives in. A
|
|
408
391
|
// `blocked-by` relation may cross a repository, and a number alone cannot say which one it names —
|
|
409
392
|
// issue numbers are unique per repository — so a caller that orders work has to keep the pair.
|
|
410
393
|
//
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { blocking_issue_schema } from '#scripts/git/git-schemas'
|
|
2
2
|
import {
|
|
3
3
|
parse_json_array_or_undefined,
|
|
4
|
-
|
|
4
|
+
parse_json_object_or_undefined,
|
|
5
5
|
} from '#scripts/git/parse-json-array'
|
|
6
6
|
import type { IssueReference } from '#scripts/issue/issue-reference'
|
|
7
7
|
import { z } from 'zod'
|
|
@@ -11,11 +11,10 @@ import { MERGED_STATE, to_gh_state } from './git-gh-rest-state'
|
|
|
11
11
|
// `gh issue view --json <fields>` used to answer with.
|
|
12
12
|
//
|
|
13
13
|
// `gh issue view` goes through GraphQL, which a cloud session is answered 403 for while the REST
|
|
14
|
-
// endpoint is served normally
|
|
14
|
+
// endpoint is served normally. The reads in `git-gh-issue-read.ts` are what
|
|
15
15
|
// every epic command goes through, so they move to REST — and every caller downstream keeps reading
|
|
16
16
|
// the field names it already reads. The mapping lives here rather than beside the requests because
|
|
17
|
-
// it is pure: given the two responses, it decides the answer with nothing else to know
|
|
18
|
-
// (joshuafolkken/kit#1024).
|
|
17
|
+
// it is pure: given the two responses, it decides the answer with nothing else to know.
|
|
19
18
|
|
|
20
19
|
// Only the fields the mapping itself reads are named; every other key passes through untouched,
|
|
21
20
|
// which is what lets a caller ask for a field this file has never heard of.
|
|
@@ -52,7 +51,7 @@ const BLOCKED_BY_FIELD = 'blockedBy'
|
|
|
52
51
|
// purpose: `blockedBy` is a connection `gh` served inside the issue, while this is the exact count
|
|
53
52
|
// GitHub already puts in the listing's own `issue_dependencies_summary`. A caller that asks for it
|
|
54
53
|
// learns whether an issue has blockers **without** the per-issue request that reading `blockedBy`
|
|
55
|
-
// costs — which is what lets `epic:bundle` stop re-reading every open issue
|
|
54
|
+
// costs — which is what lets `epic:bundle` stop re-reading every open issue.
|
|
56
55
|
//
|
|
57
56
|
// It is `undefined` rather than `0` where the summary is absent — a pull request, which this
|
|
58
57
|
// endpoint serves as readily as an issue, carries none. Reading that as "no blockers" is the one
|
|
@@ -63,7 +62,7 @@ const BODY_FIELD = 'body'
|
|
|
63
62
|
const FIELD_SEPARATOR = ','
|
|
64
63
|
const EMPTY_BODY = ''
|
|
65
64
|
|
|
66
|
-
// The
|
|
65
|
+
// The field names REST and `gh --json` disagree on. `url` is the one that bites: REST's `url` is
|
|
67
66
|
// the API endpoint, while `gh` answers the browser URL — and `epic_issue.is_pull_request` decides
|
|
68
67
|
// from `/pull/` appearing in it, which the API endpoint never carries.
|
|
69
68
|
//
|
|
@@ -71,6 +70,7 @@ const EMPTY_BODY = ''
|
|
|
71
70
|
const REST_FIELD_NAMES = new Map<string, string>([
|
|
72
71
|
['url', 'html_url'],
|
|
73
72
|
['createdAt', 'created_at'],
|
|
73
|
+
['closedAt', 'closed_at'],
|
|
74
74
|
])
|
|
75
75
|
|
|
76
76
|
const NOT_AN_ISSUE_MESSAGE = 'gh api answered something other than an issue object'
|
|
@@ -123,7 +123,7 @@ function to_gh_field_value(field: string, rest: RestIssue): unknown {
|
|
|
123
123
|
// catch it into `undefined`, which is the same "the read failed" every other failure produces, while
|
|
124
124
|
// a partial object would be reported as an issue whose fields are all missing.
|
|
125
125
|
function parse_rest_issue(rest_json: string): RestIssue {
|
|
126
|
-
const parsed =
|
|
126
|
+
const parsed = parse_json_object_or_undefined(rest_json, rest_issue_schema)
|
|
127
127
|
if (parsed === undefined) throw new Error(NOT_AN_ISSUE_MESSAGE)
|
|
128
128
|
|
|
129
129
|
return parsed
|
|
@@ -131,8 +131,7 @@ function parse_rest_issue(rest_json: string): RestIssue {
|
|
|
131
131
|
|
|
132
132
|
// `repos/{owner}/{repo}/issues` serves pull requests alongside issues; `gh issue list` never did,
|
|
133
133
|
// and its six callers all read the answer as issues. The key is present on a pull request and
|
|
134
|
-
// absent on an issue, which is the same signal `to_issue_state` already reads
|
|
135
|
-
// (joshuafolkken/kit#1025).
|
|
134
|
+
// absent on an issue, which is the same signal `to_issue_state` already reads.
|
|
136
135
|
function is_pull_request(rest: RestIssue): boolean {
|
|
137
136
|
return rest.pull_request !== undefined && rest.pull_request !== null
|
|
138
137
|
}
|
|
@@ -140,7 +139,7 @@ function is_pull_request(rest: RestIssue): boolean {
|
|
|
140
139
|
// One page of the listing endpoint, whose elements are the same objects `parse_rest_issue` reads one
|
|
141
140
|
// of. It throws for the reason that one does: a response that is not a listing — `gh` answering
|
|
142
141
|
// `{"message":"API rate limit exceeded"}` — must not degrade into an empty listing, which every
|
|
143
|
-
// caller here reads as "there is nothing"
|
|
142
|
+
// caller here reads as "there is nothing".
|
|
144
143
|
function parse_rest_issues(rest_json: string): Array<RestIssue> {
|
|
145
144
|
const parsed = parse_json_array_or_undefined(rest_json, rest_issue_schema)
|
|
146
145
|
if (parsed === undefined) throw new Error(NOT_AN_ISSUE_LISTING_MESSAGE)
|
|
@@ -151,7 +150,7 @@ function parse_rest_issues(rest_json: string): Array<RestIssue> {
|
|
|
151
150
|
// The connection for an issue GitHub itself says has no blockers, answered without a request. `gh`
|
|
152
151
|
// sent `blockedBy` inside the issue response, so a second request per issue would double
|
|
153
152
|
// `epic:bundle`'s pass over the whole open backlog — and the issue's own summary settles the common
|
|
154
|
-
// case, which is an issue with no blockers at all
|
|
153
|
+
// case, which is an issue with no blockers at all.
|
|
155
154
|
function empty_blocked_by(): BlockedBy {
|
|
156
155
|
return { nodes: [], totalCount: 0 }
|
|
157
156
|
}
|
|
@@ -160,7 +159,7 @@ function empty_blocked_by(): BlockedBy {
|
|
|
160
159
|
//
|
|
161
160
|
// A blocker relation may cross a repository, and the number alone cannot say which one it is: issue
|
|
162
161
|
// numbers are unique per repository, so a blocker read bare resolves against the blocked child's own
|
|
163
|
-
// repository and names a different issue there
|
|
162
|
+
// repository and names a different issue there. Undefined when the field is
|
|
164
163
|
// absent or shaped otherwise; the caller then falls back to the repository it is reading in, which is
|
|
165
164
|
// what an unqualified relation has always meant.
|
|
166
165
|
function repo_of_url(repository_url: string | undefined = ''): string | undefined {
|
|
@@ -174,7 +173,7 @@ function repo_of_url(repository_url: string | undefined = ''): string | undefine
|
|
|
174
173
|
//
|
|
175
174
|
// A listing that will not parse throws instead of answering an empty connection. That direction is
|
|
176
175
|
// the point: an empty `nodes` reads as "this child has no blockers", and `epic:next` would then hand
|
|
177
|
-
// a dependent to an unattended run before its prerequisite
|
|
176
|
+
// a dependent to an unattended run before its prerequisite.
|
|
178
177
|
function to_blocked_by(blockers_json: string, exact_total?: number): BlockedBy {
|
|
179
178
|
const parsed = parse_json_array_or_undefined(blockers_json, blocking_issue_schema)
|
|
180
179
|
if (parsed === undefined) throw new Error(NOT_A_BLOCKER_LISTING_MESSAGE)
|
|
@@ -209,8 +208,8 @@ function to_field_text(value: unknown): string {
|
|
|
209
208
|
|
|
210
209
|
const CLOSED = 'CLOSED'
|
|
211
210
|
|
|
212
|
-
// One blocker node as a reference, keeping the state the relation response carried
|
|
213
|
-
//
|
|
211
|
+
// One blocker node as a reference, keeping the state the relation response carried.
|
|
212
|
+
// Single-sourced here because the snapshot read and the candidate re-read
|
|
214
213
|
// both unwrap the same node, and the state is omitted rather than guessed when REST did not send it.
|
|
215
214
|
function reference_of_blocker(
|
|
216
215
|
node: z.infer<typeof blocking_issue_schema>,
|