@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,6 +1,7 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { rest_comment_schema, type RestCommentData } from '#scripts/git/git-schemas'
|
|
3
3
|
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
5
|
import { epic_parse, type ExternalChild } from './epic-parse'
|
|
5
6
|
|
|
6
7
|
// The comment the epic auto-close announces itself with, and how a run recognizes the one a previous
|
|
@@ -9,7 +10,7 @@ import { epic_parse, type ExternalChild } from './epic-parse'
|
|
|
9
10
|
// Kept apart from `epic-close.ts` because the two answer different questions — that file decides
|
|
10
11
|
// *whether* an epic may close, this one decides what the announcement says and whether it is already
|
|
11
12
|
// there — and because the file it was split from is within twenty lines of the three hundred a file
|
|
12
|
-
// may hold
|
|
13
|
+
// may hold.
|
|
13
14
|
|
|
14
15
|
// The epic's children, near and far. Named structurally rather than by importing `EpicIssue`: the
|
|
15
16
|
// dependency runs one way, from the auto-close to here, and a type import back would put a cycle
|
|
@@ -20,31 +21,30 @@ interface EpicChildren {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
// The fixed sentence the announcement's prose ends with. It is what a person reads, and it is no
|
|
23
|
-
// longer what the retry check matches on
|
|
24
|
+
// longer what the retry check matches on: people and agents quote the
|
|
24
25
|
// auto-close output in ordinary issue comments, and matching prose made any such quote answer
|
|
25
26
|
// "already announced" — the epic then closed with no comment, losing the record of which children it
|
|
26
27
|
// closed against.
|
|
27
28
|
const CLOSE_ANNOUNCEMENT = 'Closing this epic automatically.'
|
|
28
29
|
|
|
29
|
-
// The marker, which GitHub renders as nothing at all. Quoting the sentence above therefore
|
|
30
|
-
//
|
|
30
|
+
// The marker, which GitHub renders as nothing at all. Quoting the sentence above therefore does not
|
|
31
|
+
// suppress anything: what is quoted is the rendered text, and the marker is not in it.
|
|
31
32
|
//
|
|
32
33
|
// **It carries the child set the announcement named.** That is what makes an epic which was
|
|
33
34
|
// reopened, gained a child and completed again announce a *second* time instead of closing silently
|
|
34
|
-
// against a stale list.
|
|
35
|
-
//
|
|
36
|
-
// "not posted yet" whenever the wording drifted — and the marker keeps that failure out by being
|
|
35
|
+
// against a stale list. Matching the whole composed body instead would read an unchanged epic as
|
|
36
|
+
// "not posted yet" whenever the wording drifted, and the marker keeps that failure out by being
|
|
37
37
|
// built from the child set alone: the prose can be rephrased without moving it, and the set is
|
|
38
38
|
// compared as a set, so reordering the epic's task list does not move it either.
|
|
39
39
|
const MARKER_OPEN = '<!-- josh:epic-auto-close children='
|
|
40
40
|
const MARKER_CLOSE = ' -->'
|
|
41
41
|
|
|
42
42
|
// Every child, near and far. Listing only the local ones left an all-external epic announcing "All
|
|
43
|
-
// child issues are closed ()"
|
|
43
|
+
// child issues are closed ()".
|
|
44
44
|
function child_references(epic: EpicChildren): Array<string> {
|
|
45
45
|
return [
|
|
46
|
-
...epic.children.map((child) =>
|
|
47
|
-
...epic.external_children.map((child) =>
|
|
46
|
+
...epic.children.map((child) => issue_cite.plain(child)),
|
|
47
|
+
...epic.external_children.map((child) => issue_cite.plain(child.number, child.repo)),
|
|
48
48
|
]
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -91,11 +91,11 @@ function build_close_comment(epic: EpicChildren): string {
|
|
|
91
91
|
return `All child issues are closed (${child_references(epic).join(', ')}). ${CLOSE_ANNOUNCEMENT}\n\n${build_marker(epic)}`
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
// MIGRATION ONLY
|
|
94
|
+
// MIGRATION ONLY — remove together with `is_legacy_announcement`.
|
|
95
95
|
//
|
|
96
96
|
// Announcements posted by v1.179.0 through the release before this one carry no marker, so an epic
|
|
97
97
|
// sitting in the half-succeeded state right now would be read as "not announced" and receive the
|
|
98
|
-
// second comment
|
|
98
|
+
// second comment. This matches those.
|
|
99
99
|
//
|
|
100
100
|
// **The wording here is a frozen copy of what was released, not a second spelling of the constants
|
|
101
101
|
// above.** Deriving it from them would make a future rephrasing of the announcement silently stop
|
|
@@ -129,8 +129,7 @@ function is_legacy_announcement(body: string): boolean {
|
|
|
129
129
|
//
|
|
130
130
|
// `unreadable` is deliberately not folded into `absent`, though the caller acts the same way on
|
|
131
131
|
// both: a listing that could not be read says nothing about what is on the issue, and reporting it
|
|
132
|
-
// as "nothing is there" would have the run state a fact it never established
|
|
133
|
-
// joshuafolkken/kit#973 and joshuafolkken/kit#959 were each about. Keeping it apart is what lets
|
|
132
|
+
// as "nothing is there" would have the run state a fact it never established. Keeping it apart is what lets
|
|
134
133
|
// `epic-close.ts` say out loud that the duplicate check did not run, which is the whole
|
|
135
134
|
// difference between the two answers there.
|
|
136
135
|
//
|
|
@@ -145,7 +144,7 @@ type CloseCommentState = 'present' | 'absent' | 'unreadable'
|
|
|
145
144
|
// announcement carry the raw marker along with everything else: GitHub's "Quote reply" puts every
|
|
146
145
|
// line behind `> `, which the line comparison rejects, and a code block reproduces the marker line
|
|
147
146
|
// verbatim — a fenced one caught by the mask, an indented one by the indent check. `fence_mask` is the same walk every other body predicate
|
|
148
|
-
// in this codebase reads through, rather than a second one written here
|
|
147
|
+
// in this codebase reads through, rather than a second one written here.
|
|
149
148
|
function has_marker(body: string, children: ReadonlyArray<string>): boolean {
|
|
150
149
|
const mask = epic_parse.fence_mask(body)
|
|
151
150
|
|
|
@@ -3,22 +3,21 @@ import { epic_child_schema, epic_issue_schema, type EpicChildData } from '#scrip
|
|
|
3
3
|
import { cutoff_cause, cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
|
|
4
4
|
import {
|
|
5
5
|
parse_json_array_or_undefined,
|
|
6
|
-
|
|
6
|
+
parse_json_object_or_undefined,
|
|
7
7
|
} from '#scripts/git/parse-json-array'
|
|
8
8
|
import { EPIC_LABEL } from '#scripts/issue/issue-labels'
|
|
9
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
9
10
|
import { error_text } from '#scripts/lib/error-message'
|
|
10
11
|
import { epic_close_comment } from './epic-close-comment'
|
|
11
12
|
import { epic_parse, type ExternalChild } from './epic-parse'
|
|
12
13
|
|
|
13
14
|
// How many open epics the auto-close will look at. `git-gh-issue-list.ts` pages until `limit` rows
|
|
14
15
|
// have been selected or the backlog runs out, so this is what keeps the ordinary case at exactly one
|
|
15
|
-
// request — 100 is `PER_PAGE`.
|
|
16
|
-
//
|
|
17
|
-
// count, not the row count.
|
|
16
|
+
// request — 100 is `PER_PAGE`. The paging's own page ceiling bounds this listing too, but as a
|
|
17
|
+
// backstop rather than as this number's replacement: it stops the request count, not the row count.
|
|
18
18
|
//
|
|
19
19
|
// The listing is newest-first and the surplus is cut off the tail, so a repository holding more open
|
|
20
|
-
// epics than this loses the oldest. It
|
|
21
|
-
// both cutoffs are reported, because an epic past the cut is never checked for completion and stays
|
|
20
|
+
// epics than this loses the oldest. It does not lose them silently: both cutoffs are reported, because an epic past the cut is never checked for completion and stays
|
|
22
21
|
// open with nothing saying why — the same silence this file's `undefined`-not-`[]` handling exists
|
|
23
22
|
// to remove. The value still sits well above the number of epics ever open at once, so the report is
|
|
24
23
|
// the exception rather than a line on every merge.
|
|
@@ -60,8 +59,7 @@ function to_epic_issue(raw: { number: number; body?: string | undefined }): Epic
|
|
|
60
59
|
// `parse_json_array_safe` returns `[]` for both, and the auto-close then decides there is no epic to
|
|
61
60
|
// close: it stops for a reason that never reaches a log, and the epic stays open with nothing saying
|
|
62
61
|
// why. The failure leans safe — the other direction, taken by `epic:bundle`, invented a second epic
|
|
63
|
-
//
|
|
64
|
-
// (joshuafolkken/kit#959).
|
|
62
|
+
// — but silence is the same defect, so the two are told apart here as well.
|
|
65
63
|
//
|
|
66
64
|
// The two ways of failing are folded into one answer deliberately. Which one occurred does not
|
|
67
65
|
// change what the auto-close may do — in neither case does it know what the open epics are — and
|
|
@@ -82,7 +80,7 @@ async function fetch_open_epics(): Promise<Array<EpicIssue> | undefined> {
|
|
|
82
80
|
function parse_child(raw_json: string | undefined): EpicChildData | undefined {
|
|
83
81
|
if (raw_json === undefined) return undefined
|
|
84
82
|
|
|
85
|
-
return
|
|
83
|
+
return parse_json_object_or_undefined(raw_json, epic_child_schema)
|
|
86
84
|
}
|
|
87
85
|
|
|
88
86
|
function has_blocked_by(child: EpicChildData | undefined): boolean {
|
|
@@ -106,8 +104,7 @@ async function inspect_sibling(sibling: number, repo?: string): Promise<SiblingS
|
|
|
106
104
|
|
|
107
105
|
// A cross-repository child, read by naming its repository in the read's REST path. `is_readable`
|
|
108
106
|
// is what decides whether the epic may close at all: closing while a child's state is unknown is
|
|
109
|
-
// exactly what the old refusal prevented, and reading them is the only thing that changed
|
|
110
|
-
// (joshuafolkken/kit#864).
|
|
107
|
+
// exactly what the old refusal prevented, and reading them is the only thing that changed.
|
|
111
108
|
async function inspect_external(
|
|
112
109
|
child: ExternalChild,
|
|
113
110
|
): Promise<SiblingState & { is_readable: boolean }> {
|
|
@@ -128,13 +125,12 @@ async function inspect_siblings(
|
|
|
128
125
|
}
|
|
129
126
|
|
|
130
127
|
// `pnpm josh epic --ordered` and `--add` record the declared chain themselves, through the REST
|
|
131
|
-
// dependencies endpoint (`epic-relations.ts
|
|
128
|
+
// dependencies endpoint (`epic-relations.ts`), so the default route
|
|
132
129
|
// arrives here with the relations already in place. Three routes still reach a declared order with
|
|
133
130
|
// none recorded: an epic body written by hand, the manual fallback in `issue-template.md`, and
|
|
134
131
|
// `apply_relations` failing — it counts the refusals, reports that the body is intact and lets the
|
|
135
132
|
// batch finish. Each is otherwise symptomless, which is what this warning is for. The epic body's
|
|
136
|
-
// declared chain is the trigger:
|
|
137
|
-
// implies an order, and warning on that alone would fire on every unordered batch. Only a total
|
|
133
|
+
// declared chain is the trigger: every split gets an epic, so its existence does not imply an order, and warning on that alone would fire on every unordered batch. Only a total
|
|
138
134
|
// absence of relations is reported — checking each dependent pair would mean inferring the chain
|
|
139
135
|
// from task-list order, which need not match.
|
|
140
136
|
function warn_when_order_unrecorded(epic: EpicIssue, states: ReadonlyArray<SiblingState>): void {
|
|
@@ -147,18 +143,18 @@ function warn_when_order_unrecorded(epic: EpicIssue, states: ReadonlyArray<Sibli
|
|
|
147
143
|
}
|
|
148
144
|
|
|
149
145
|
console.info(
|
|
150
|
-
`ℹ️ Epic
|
|
146
|
+
`ℹ️ Epic ${session_cite.issue(epic.number)} has no blocked-by relation on any child; ` +
|
|
151
147
|
'the batch order was never recorded natively (see the epic creation procedure).',
|
|
152
148
|
)
|
|
153
149
|
}
|
|
154
150
|
|
|
155
151
|
// The one thing the two refusals below ask for, written once — a child state that could not be read,
|
|
156
|
-
// and a close the API refused
|
|
152
|
+
// and a close the API refused.
|
|
157
153
|
const CLOSE_MANUALLY = 'close it manually.'
|
|
158
154
|
|
|
159
155
|
// The nesting cascade's safety valve. A closed child epic is itself a completed child, so the same
|
|
160
|
-
// completion check is re-run for the epics that list *it*, closing a nested parent in the same pass
|
|
161
|
-
//
|
|
156
|
+
// completion check is re-run for the epics that list *it*, closing a nested parent in the same pass.
|
|
157
|
+
// `evaluated` already terminates a cycle or a shared child; this is the
|
|
162
158
|
// backstop for a nesting so deep it is likelier a mistake than a plan. On reaching it the cascade
|
|
163
159
|
// stops and asks for a manual close, exactly as an unreadable or refused child close does.
|
|
164
160
|
const MAX_CASCADE_DEPTH = 10
|
|
@@ -174,27 +170,26 @@ const CASCADE_DEPTH_NOTE = `⚠️ Epic auto-close cascade reached its ${String
|
|
|
174
170
|
// would leave a finished epic open until somebody noticed.
|
|
175
171
|
//
|
|
176
172
|
// The direction is chosen on what each mistake costs, and they are not symmetric. Announcing twice
|
|
177
|
-
// costs one redundant comment and nothing else, because the epic *closes* — which is what ends
|
|
178
|
-
//
|
|
179
|
-
// the close kept failing. Refusing costs a manual close on every transient failure.
|
|
173
|
+
// costs one redundant comment and nothing else, because the epic *closes* — which is what ends a loop
|
|
174
|
+
// where the comment would repeat once per attempt for as long as the close kept failing. Refusing costs a manual close on every transient failure.
|
|
180
175
|
const UNREADABLE_COMMENTS_NOTE =
|
|
181
176
|
"'s comments could not be read; announcing again rather than leaving it open."
|
|
182
177
|
|
|
183
178
|
// The write, once the announcement has been decided. `comment` is `undefined` when the epic already
|
|
184
179
|
// carries one — which is what stops a run whose comment landed and whose close was refused from
|
|
185
180
|
// posting the same comment again on the next attempt, and again for as long as the close keeps
|
|
186
|
-
// failing
|
|
181
|
+
// failing.
|
|
187
182
|
//
|
|
188
183
|
// The comment-first ordering inside `issue_close` is what produces that half-succeeded state, and it
|
|
189
184
|
// is left exactly as it is: it is what keeps a `false` meaning "the epic is still open" in every
|
|
190
|
-
// branch, which is the answer the second message here is written against
|
|
185
|
+
// branch, which is the answer the second message here is written against.
|
|
191
186
|
async function close_epic_with(epic_number: string, comment: string | undefined): Promise<boolean> {
|
|
192
187
|
const is_closed = await git_gh_command.issue_close(epic_number, comment)
|
|
193
188
|
|
|
194
189
|
console.info(
|
|
195
190
|
is_closed
|
|
196
|
-
? `🏁 Closed epic
|
|
197
|
-
: `⚠️ Could not close epic
|
|
191
|
+
? `🏁 Closed epic ${session_cite.issue(epic_number)} — every child issue is complete.`
|
|
192
|
+
: `⚠️ Could not close epic ${session_cite.issue(epic_number)}; ${CLOSE_MANUALLY}`,
|
|
198
193
|
)
|
|
199
194
|
|
|
200
195
|
return is_closed
|
|
@@ -205,8 +200,9 @@ async function close_epic_with(epic_number: string, comment: string | undefined)
|
|
|
205
200
|
async function close_epic(epic: EpicIssue): Promise<boolean> {
|
|
206
201
|
const epic_number = String(epic.number)
|
|
207
202
|
const state = await epic_close_comment.read_close_comment_state(epic_number, epic)
|
|
203
|
+
const note = `ℹ️ Epic ${session_cite.issue(epic_number)}${UNREADABLE_COMMENTS_NOTE}`
|
|
208
204
|
|
|
209
|
-
if (state === 'unreadable') console.info(
|
|
205
|
+
if (state === 'unreadable') console.info(note)
|
|
210
206
|
|
|
211
207
|
const comment = state === 'present' ? undefined : epic_close_comment.build_close_comment(epic)
|
|
212
208
|
|
|
@@ -237,7 +233,7 @@ async function close_epic_when_complete(epic: EpicIssue, merged_number: number):
|
|
|
237
233
|
|
|
238
234
|
if (!external.is_complete) {
|
|
239
235
|
console.info(
|
|
240
|
-
`ℹ️ Epic
|
|
236
|
+
`ℹ️ Epic ${session_cite.issue(epic.number)} has a child in another repository whose state could not be read; ${CLOSE_MANUALLY}`,
|
|
241
237
|
)
|
|
242
238
|
|
|
243
239
|
return false
|
|
@@ -255,14 +251,14 @@ async function close_epic_when_complete(epic: EpicIssue, merged_number: number):
|
|
|
255
251
|
// Each epic is isolated: one that cannot be read or closed must not stop the others from being
|
|
256
252
|
// evaluated, since they are independent batches that merely share this child. `false` — the epic did
|
|
257
253
|
// not close, whether because a sibling is still open, a read failed or the close was refused — is
|
|
258
|
-
// what stops the cascade from walking past it to a parent
|
|
254
|
+
// what stops the cascade from walking past it to a parent.
|
|
259
255
|
async function close_epic_isolated(epic: EpicIssue, merged_number: number): Promise<boolean> {
|
|
260
256
|
try {
|
|
261
257
|
return await close_epic_when_complete(epic, merged_number)
|
|
262
258
|
} catch (error) {
|
|
263
259
|
const message = error_text.message_of(error)
|
|
264
260
|
|
|
265
|
-
console.info(`⚠️ Skipped epic
|
|
261
|
+
console.info(`⚠️ Skipped epic ${session_cite.issue(epic.number)}: ${message}`)
|
|
266
262
|
|
|
267
263
|
return false
|
|
268
264
|
}
|
|
@@ -15,9 +15,9 @@ import type { EpicChild } from './epic-graph'
|
|
|
15
15
|
// too early. Merging kit's issue does not publish kit — the merge, the auto-tag and the publish run
|
|
16
16
|
// one after another — so a consumer child told it may start at that moment either fails to install
|
|
17
17
|
// the version it needs or, worse, installs the previous one and implements against it. That failure
|
|
18
|
-
// shows up as "it breaks sometimes", which is the hardest kind to diagnose
|
|
18
|
+
// shows up as "it breaks sometimes", which is the hardest kind to diagnose.
|
|
19
19
|
//
|
|
20
|
-
// The publish check itself is
|
|
20
|
+
// The publish check itself is imported rather than restated: two
|
|
21
21
|
// implementations of "has this version appeared" would drift, and the looser one would decide.
|
|
22
22
|
|
|
23
23
|
// The package a repository distributes, by convention: the npm scope is the GitHub owner and the
|
|
@@ -78,7 +78,7 @@ const NOT_FOUND_STATUS = 404
|
|
|
78
78
|
|
|
79
79
|
// What the blocker repository's default branch says about what it ships.
|
|
80
80
|
//
|
|
81
|
-
// **`absent` is not `unreadable
|
|
81
|
+
// **`absent` is not `unreadable`.** A repository with no
|
|
82
82
|
// manifest, or one whose manifest says `private`, publishes nothing — so a closed blocker there has
|
|
83
83
|
// no release anyone could wait for, and waiting means waiting until the run's own eight-hour timeout
|
|
84
84
|
// with nothing an operator can edit to clear it. A read that merely failed says none of that.
|
|
@@ -89,7 +89,7 @@ const NOT_FOUND_STATUS = 404
|
|
|
89
89
|
// registry 404 would start a consumer child before its blocker's release existed. The manifest is a
|
|
90
90
|
// fact about the repository we already have access to, and `private: true` is a positive statement
|
|
91
91
|
// rather than an inference from an absence.
|
|
92
|
-
// **`private` alone does not settle it
|
|
92
|
+
// **`private` alone does not settle it**. A workspace root is private by
|
|
93
93
|
// convention while the packages under it publish, so reading one as "ships nothing" would resolve a
|
|
94
94
|
// dependency before its blocker's release existed — the direction this module may not fail in.
|
|
95
95
|
// `is_workspace` is what keeps that case waiting.
|
|
@@ -103,7 +103,7 @@ type ManifestAnswer =
|
|
|
103
103
|
// Read from GitHub rather than from a local checkout: a consumer's state is a GitHub fact, and the
|
|
104
104
|
// wait must work before anyone has cloned the repository.
|
|
105
105
|
//
|
|
106
|
-
// **It moves when `josh release` runs, not when a child merges
|
|
106
|
+
// **It moves when `josh release` runs, not when a child merges**. A child's
|
|
107
107
|
// pull request carries no version change at all, so the number here right after one merges is still
|
|
108
108
|
// the previous release. The target of a wait is therefore the version that follows the release the
|
|
109
109
|
// change lands in, never the one the merge itself leaves behind.
|
|
@@ -122,10 +122,9 @@ type WorkspaceCheck = 'workspace' | 'single' | 'unreadable'
|
|
|
122
122
|
// Whether `pnpm-workspace.yaml` actually declares members.
|
|
123
123
|
//
|
|
124
124
|
// **The file's existence proves nothing.** `josh sync` distributes it to every consumer regardless of
|
|
125
|
-
// layout — it carries `allowBuilds`, `overrides` and the like — so probing for its presence read
|
|
126
|
-
// private first-party repository as a workspace and
|
|
127
|
-
//
|
|
128
|
-
// `packages:` (joshuafolkken/kit#1134). What makes a repository a workspace is a non-empty `packages`
|
|
125
|
+
// layout — it carries `allowBuilds`, `overrides` and the like — so probing for its presence would read
|
|
126
|
+
// every private first-party repository as a workspace and wait the eight-hour timeout on each. What
|
|
127
|
+
// makes a repository a workspace is a non-empty `packages`
|
|
129
128
|
// key, so that is what is read.
|
|
130
129
|
function declares_packages(yaml: string): boolean {
|
|
131
130
|
try {
|
|
@@ -225,7 +224,7 @@ function to_manifest(repo: string, stdout: string): ManifestAnswer {
|
|
|
225
224
|
//
|
|
226
225
|
// The probe is `exec_gh_api_status_sync`, the synchronous twin of `exec_gh_api_status`: every caller
|
|
227
226
|
// down to `resolve_cross_repo` is synchronous, and turning the classifier, the resolver and
|
|
228
|
-
// `epic_classify` async for one probe would cost more than the twin
|
|
227
|
+
// `epic_classify` async for one probe would cost more than the twin. A 404
|
|
229
228
|
// here is trustworthy in a way a registry 404 is not: the repository's issues are already being read,
|
|
230
229
|
// so access is established and what is missing is the file.
|
|
231
230
|
function classify_manifest_failure(repo: string): ManifestAnswer {
|
|
@@ -245,8 +244,8 @@ function fetch_manifest(repo: string): ManifestAnswer {
|
|
|
245
244
|
}
|
|
246
245
|
|
|
247
246
|
// Read once per pass, for the reason `published_cache` holds the other half: every edge to one
|
|
248
|
-
// repository asks the same question, and
|
|
249
|
-
//
|
|
247
|
+
// repository asks the same question, and a pass runs once per withheld candidate rather than
|
|
248
|
+
// once — so an uncached read is a blocking `gh` call multiplied by both.
|
|
250
249
|
function read_manifest(repo: string): ManifestAnswer {
|
|
251
250
|
const cached = version_cache.get(repo)
|
|
252
251
|
if (cached !== undefined) return cached
|
|
@@ -267,7 +266,7 @@ function read_default_branch_version(repo: string): string | undefined {
|
|
|
267
266
|
// Whether the repository ships no package at all: no manifest on its default branch, or one that
|
|
268
267
|
// declares itself private. Either way there is no release for a dependency to wait on.
|
|
269
268
|
//
|
|
270
|
-
// **A workspace root is excluded, and the exclusion is deliberately coarse
|
|
269
|
+
// **A workspace root is excluded, and the exclusion is deliberately coarse**.
|
|
271
270
|
// Such a root is private by convention while its packages publish, so reading one as shipping nothing
|
|
272
271
|
// would start a dependent before its blocker's release existed. What is asked is only whether the
|
|
273
272
|
// repository *is* a workspace — the members are not enumerated and nothing looks for which of them
|
|
@@ -284,11 +283,10 @@ function publishes_nothing(repo: string): boolean {
|
|
|
284
283
|
// A version that could not be read leaves the dependency waiting rather than resolved: not knowing
|
|
285
284
|
// what to wait for is not the same as having nothing to wait for.
|
|
286
285
|
//
|
|
287
|
-
// **"Ships nothing" is asked first, and it is a different question
|
|
288
|
-
//
|
|
289
|
-
//
|
|
290
|
-
//
|
|
291
|
-
// operator could edit to clear it. It is answered from that repository's own manifest and never from
|
|
286
|
+
// **"Ships nothing" is asked first, and it is a different question.** Waiting is right only where
|
|
287
|
+
// something could still arrive; a closed blocker in a repository that publishes no package has no
|
|
288
|
+
// release for `is_published` to ever find, so it would wait until the run's own eight-hour timeout
|
|
289
|
+
// with nothing an operator could edit to clear it. It is answered from that repository's own manifest and never from
|
|
292
290
|
// the registry, for the reason `ManifestAnswer` records: a registry 404 also means "this token may
|
|
293
291
|
// not see it", and resolving on one would start a consumer child before its blocker's release
|
|
294
292
|
// existed.
|
|
@@ -323,9 +321,8 @@ function owner_of(repo: string): string {
|
|
|
323
321
|
return repo.split('/', 1)[0] ?? ''
|
|
324
322
|
}
|
|
325
323
|
|
|
326
|
-
// Whether a repository may be depended on at all
|
|
327
|
-
//
|
|
328
|
-
// to wait for, dispatch to, or write into — nor, since joshuafolkken/kit#1014, an issue reference to
|
|
324
|
+
// Whether a repository may be depended on at all: a child in a repository this owner does not own is
|
|
325
|
+
// not something to wait for, dispatch to, or write into — nor an issue reference to
|
|
329
326
|
// resolve: a body that mentions a third party's issue must not send this command to their tracker.
|
|
330
327
|
function is_same_owner_repo(repo: string, current_owner: string): boolean {
|
|
331
328
|
const identity = repo_origin.parse_origin_url(`https://${repo_origin.GITHUB_HOST}/${repo}`)
|
|
@@ -5,11 +5,9 @@ import { epic_sections, type BodyLines, type SectionRange } from './epic-section
|
|
|
5
5
|
// Placing a decision record inside an epic body's `## Decisions` section.
|
|
6
6
|
//
|
|
7
7
|
// `epic-commands` requires an auto-decision to be written in **both** the epic's `## Decisions` and a
|
|
8
|
-
// comment on each child it applies to
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// spends its round trips, and the two most recent filings skipped the epic half entirely rather than
|
|
12
|
-
// pay for it (joshuafolkken/kit#1350).
|
|
8
|
+
// comment on each child it applies to. Without a command for the epic half, a run would have to read
|
|
9
|
+
// the body, edit it and `PATCH` it back by hand, which is the one operation `CLAUDE.md` forbids — or
|
|
10
|
+
// skip the epic half entirely.
|
|
13
11
|
//
|
|
14
12
|
// So the record rides on the body edit `--add` already makes: no extra round trip, and the half that
|
|
15
13
|
// was being dropped is written by the command instead of by hand.
|
|
@@ -27,7 +25,7 @@ const EMPTY_RECORD =
|
|
|
27
25
|
|
|
28
26
|
// **The offending line is named, never quoted.** The record is a file the caller handed over, and
|
|
29
27
|
// echoing a line of it into stderr puts arbitrary file content in the console — the leak SonarCloud's
|
|
30
|
-
// `tssecurity:S8689` reports for exactly this path
|
|
28
|
+
// `tssecurity:S8689` reports for exactly this path. A line number is as
|
|
31
29
|
// actionable, since the author has the file open, and it carries nothing out of it.
|
|
32
30
|
function to_declaration_error(line_number: number): string {
|
|
33
31
|
return `Line ${String(line_number)} of the decision record is nothing but a dependency chain, which \`epic:next\` would read as part of the epic's dependency order; wrap it in backticks, fence it, or reword it.`
|
|
@@ -35,8 +33,7 @@ function to_declaration_error(line_number: number): string {
|
|
|
35
33
|
|
|
36
34
|
// Whether the record can be written at all. The declaration check is the load-bearing one: a bare
|
|
37
35
|
// `#A -> #B` line anywhere in the body is parsed as a declaration, so a record quoting an order as a
|
|
38
|
-
// standalone line would silently add a dependency nobody declared
|
|
39
|
-
// joshuafolkken/kit#1253 documents, arriving by a second route.
|
|
36
|
+
// standalone line would silently add a dependency nobody declared.
|
|
40
37
|
//
|
|
41
38
|
// **It is judged exactly the way the merged body will be judged**: the predicate is the parser's own,
|
|
42
39
|
// and the lines are read through the same fence mask, so a record whose chain sits inside a fenced
|
|
@@ -91,16 +88,15 @@ function append_decision(body: string, record: string): string {
|
|
|
91
88
|
}
|
|
92
89
|
|
|
93
90
|
// The record as it will actually be written, with the relations this insertion replaced appended to
|
|
94
|
-
// it
|
|
91
|
+
// it.
|
|
95
92
|
//
|
|
96
|
-
// **A positioned `--add` discards the `blocked-by` relation the child already had,
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
//
|
|
93
|
+
// **A positioned `--add` discards the `blocked-by` relation the child already had, so the record says
|
|
94
|
+
// so.** Unsaid, it can overwrite a decision whose reasoning was written down, leaving the body's
|
|
95
|
+
// declaration, the native relations and the recorded decision disagreeing with one another. The
|
|
96
|
+
// record is the artifact read months later, so it is where what was replaced has to survive — the
|
|
97
|
+
// console line scrolls away.
|
|
101
98
|
//
|
|
102
|
-
// **The policy is to report, not to refuse.** Re-pointing a position is
|
|
103
|
-
// deliberately added, so refusing an invocation that carries no `--decision-file` would close a
|
|
99
|
+
// **The policy is to report, not to refuse.** Re-pointing a position is deliberate, so refusing an invocation that carries no `--decision-file` would close a
|
|
104
100
|
// working route to force a record; naming what was dropped costs the caller nothing and loses nothing.
|
|
105
101
|
//
|
|
106
102
|
// `undefined` stays `undefined`: an insertion that records no decision gains none here, and an
|
|
@@ -128,7 +124,7 @@ function format_decision_report(input: { total: number; failures: number }): str
|
|
|
128
124
|
|
|
129
125
|
// The heading a creation writes its reasoning under. Beside a pattern exactly as `DECISIONS_HEADING`
|
|
130
126
|
// is, and tied to `epic_body`'s own literal by a test that reads a body the builder produced
|
|
131
|
-
// rather than by a string comparison
|
|
127
|
+
// rather than by a string comparison.
|
|
132
128
|
const RATIONALE_HEADING_PATTERN = /^#{1,6}[ \t]+Split rationale\b/u
|
|
133
129
|
|
|
134
130
|
function read_section(body: string, heading: RegExp): string {
|
|
@@ -145,7 +141,7 @@ function read_section(body: string, heading: RegExp): string {
|
|
|
145
141
|
// Both, not just the first. `josh epic … --ordered` declares a whole chain and records its reasoning
|
|
146
142
|
// under `## Split rationale`, writing no `## Decisions` at all — so a reader that looked only at
|
|
147
143
|
// `## Decisions` would report every correctly-documented ordered epic as unjustified the moment it
|
|
148
|
-
// was created
|
|
144
|
+
// was created. It is this module's because the heading patterns are: a
|
|
149
145
|
// second reader with its own copies is one that comes to disagree with the writers about where a
|
|
150
146
|
// record goes.
|
|
151
147
|
function read_recorded_reasons(body: string | undefined): string {
|
|
@@ -10,7 +10,7 @@ import { epic_relation_recheck } from './epic-relation-recheck'
|
|
|
10
10
|
//
|
|
11
11
|
// All execution state lives on GitHub and nowhere else — no local state file. A run interrupted
|
|
12
12
|
// halfway is resumed by asking again, which is the whole reason `epic:next` can be the base of an
|
|
13
|
-
// unattended run
|
|
13
|
+
// unattended run.
|
|
14
14
|
|
|
15
15
|
const CHILD_LIMIT = 200
|
|
16
16
|
|
|
@@ -30,17 +30,17 @@ function to_child(parsed: EpicIssue, repo: string): EpicChild {
|
|
|
30
30
|
// reads it — and a child elsewhere is read through its own repository, exactly as
|
|
31
31
|
// `fetch_external_children` does. Every read of a child's fields goes through this, bodies included:
|
|
32
32
|
// an unqualified read of a cross-repository child returns *this* repository's issue of that number,
|
|
33
|
-
// a different issue entirely
|
|
33
|
+
// a different issue entirely.
|
|
34
34
|
function scope_for(child_repo: string, current_repo: string): string | undefined {
|
|
35
35
|
return child_repo === current_repo ? undefined : child_repo
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
// One child's blockers, read from the relations listing rather than from the issue's own summary
|
|
39
|
-
// count
|
|
39
|
+
// count. Addressed through the same `scope_for` every other read of a child
|
|
40
40
|
// goes through. The recheck only ever reaches children of the epic's own repository, so what the
|
|
41
41
|
// scope varies with is where the *epic* is: `epic:next owner/other#858` run from here reads them
|
|
42
42
|
// through `owner/other`, and reading them unqualified would answer from this repository's issues of
|
|
43
|
-
// those numbers instead
|
|
43
|
+
// those numbers instead.
|
|
44
44
|
async function read_child_blockers(
|
|
45
45
|
child: EpicChild,
|
|
46
46
|
current_repo: string,
|
|
@@ -60,7 +60,7 @@ interface EpicBody {
|
|
|
60
60
|
// failure is invisible downstream**: `parse_task_list_issue_numbers(undefined)` answers `[]`, so a
|
|
61
61
|
// body nobody could read is indistinguishable from an epic that tracks no children — and that one
|
|
62
62
|
// is dropped from the views as an ordinary, unpopulated epic. A run whose DNS hiccuped on this one
|
|
63
|
-
// request therefore reported the backlog empty and ended
|
|
63
|
+
// request therefore reported the backlog empty and ended.
|
|
64
64
|
body_failure: IssueReadFailure | undefined
|
|
65
65
|
child_numbers: ReadonlyArray<number>
|
|
66
66
|
external: ReadonlyArray<ExternalChild>
|
|
@@ -86,7 +86,7 @@ interface RecheckScope {
|
|
|
86
86
|
current_repo: string
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
//
|
|
89
|
+
// The second look at the relations, taken here rather than in `epic:next`
|
|
90
90
|
// and `epic:audit` separately — both read their children through this one snapshot, so correcting it
|
|
91
91
|
// once corrects both, and neither command needs to know the check exists.
|
|
92
92
|
// `repo` is the epic's own repository, which is what a bare declared number names — not
|
|
@@ -109,7 +109,7 @@ function to_references(issue_numbers: ReadonlyArray<number>, repo: string): Arra
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
// One child's read: the child when it came back, and whether the failure was one the same request
|
|
112
|
-
// could succeed at a moment later
|
|
112
|
+
// could succeed at a moment later. A response that arrived and would not
|
|
113
113
|
// parse is **not** unreachable — asking again answers the same thing.
|
|
114
114
|
interface ChildRead {
|
|
115
115
|
child: EpicChild | undefined
|
|
@@ -152,20 +152,18 @@ async function fetch_child(
|
|
|
152
152
|
//
|
|
153
153
|
// Dropping them is not an option in either direction. An epic whose children all failed to read
|
|
154
154
|
// would otherwise look like an epic with no open children — "complete" — and a single unreadable
|
|
155
|
-
// child would vanish from the graph, so whatever it blocks would look unblocked and be run
|
|
156
|
-
// (joshuafolkken/kit#860).
|
|
155
|
+
// child would vanish from the graph, so whatever it blocks would look unblocked and be run.
|
|
157
156
|
//
|
|
158
157
|
// The unread ones carry their repository, not just their number. An epic tracking
|
|
159
|
-
// `- [ ] sveltejs/kit#7`
|
|
160
|
-
//
|
|
161
|
-
// (joshuafolkken/kit#1016).
|
|
158
|
+
// `- [ ] sveltejs/kit#7` refused by the owner restriction and reported as `Could not read #7` would be
|
|
159
|
+
// resolved by a reader against the repository they are standing in — a different issue.
|
|
162
160
|
interface FetchedChildren {
|
|
163
161
|
children: ReadonlyArray<EpicChild>
|
|
164
162
|
unreadable: ReadonlyArray<IssueReference>
|
|
165
163
|
skipped: ReadonlyArray<IssueReference>
|
|
166
164
|
// How many of the unreadable ones failed on the transport. Carried from the reads themselves
|
|
167
165
|
// rather than probed afterwards: a connection that dropped for a moment fails a read at t=0 and
|
|
168
|
-
// answers a probe fired at t=1 that everything is fine
|
|
166
|
+
// answers a probe fired at t=1 that everything is fine.
|
|
169
167
|
//
|
|
170
168
|
// **A count rather than a flag, because the question the caller asks is about _every_ failure.**
|
|
171
169
|
// One child unreachable beside another permanently refused is not a run worth repeating — the
|
|
@@ -211,10 +209,9 @@ async function fetch_children(
|
|
|
211
209
|
// The children that live in other repositories, read by naming that repository in the read's REST
|
|
212
210
|
// path (`repos/<owner>/<repo>/issues/<n>`). No local checkout is needed: their state is a GitHub
|
|
213
211
|
// fact, and requiring a clone to learn it is what kept the auto-close from ever running on such an
|
|
214
|
-
// epic
|
|
212
|
+
// epic.
|
|
215
213
|
//
|
|
216
|
-
// A repository with a different owner is dropped before it is read
|
|
217
|
-
// joshuafolkken/kit#869's restriction rather than restating it.
|
|
214
|
+
// A repository with a different owner is dropped before it is read.
|
|
218
215
|
async function fetch_external_children(
|
|
219
216
|
external: ReadonlyArray<ExternalChild>,
|
|
220
217
|
current_owner: string,
|
|
@@ -244,21 +241,19 @@ async function fetch_external_children(
|
|
|
244
241
|
interface EpicSnapshot {
|
|
245
242
|
body: string | undefined
|
|
246
243
|
// The repository the *epic* lives in — what a bare number in its body and in a declared dependency
|
|
247
|
-
// names. Distinct from `current_repo` below, which is where the command is running
|
|
248
|
-
// (joshuafolkken/kit#1126).
|
|
244
|
+
// names. Distinct from `current_repo` below, which is where the command is running.
|
|
249
245
|
repo: string
|
|
250
246
|
// The `owner/repo` the command is running in — the repository against which a reference is written
|
|
251
247
|
// bare, and every other one written `owner/repo#N`. Deliberately *not* where the epic lives:
|
|
252
248
|
// `epic:next owner/other#858` reads an epic elsewhere while the person reading the answer is
|
|
253
|
-
// standing here, so writing an unread child bare would send them to their own issue of that number
|
|
254
|
-
// (joshuafolkken/kit#1016).
|
|
249
|
+
// standing here, so writing an unread child bare would send them to their own issue of that number.
|
|
255
250
|
current_repo: string
|
|
256
251
|
children: ReadonlyArray<EpicChild>
|
|
257
252
|
child_numbers: ReadonlyArray<number>
|
|
258
253
|
unreadable: ReadonlyArray<IssueReference>
|
|
259
254
|
skipped: ReadonlyArray<IssueReference>
|
|
260
255
|
has_external_children: boolean
|
|
261
|
-
// Why the epic's own body produced nothing, when it produced nothing
|
|
256
|
+
// Why the epic's own body produced nothing, when it produced nothing.
|
|
262
257
|
body_failure: IssueReadFailure | undefined
|
|
263
258
|
// Whether **every** read behind this snapshot that failed — the body and each child — failed on
|
|
264
259
|
// the transport, and at least one did. What a caller does with it is its own: `epic:next` marks
|
|
@@ -266,7 +261,7 @@ interface EpicSnapshot {
|
|
|
266
261
|
//
|
|
267
262
|
// It is `every` rather than `any` so the answer terminates: one child refused for good beside one
|
|
268
263
|
// unreachable would otherwise be retried for ever, and the run would never reach the verdict that
|
|
269
|
-
// says a person is needed
|
|
264
|
+
// says a person is needed.
|
|
270
265
|
is_unreachable: boolean
|
|
271
266
|
}
|
|
272
267
|
|
|
@@ -323,15 +318,14 @@ async function to_snapshot(
|
|
|
323
318
|
}
|
|
324
319
|
|
|
325
320
|
// The epic and its children, as one read. `has_external_children` is surfaced rather than silently
|
|
326
|
-
// ignored: a cross-repository child
|
|
327
|
-
// fully answered by this command yet.
|
|
321
|
+
// ignored: an epic that holds a cross-repository child is not fully answered by this command alone.
|
|
328
322
|
//
|
|
329
323
|
// `repo` is where the *epic* lives and `current_repo` is where the command is running, so the body
|
|
330
324
|
// and its local rows are read through the same `scope_for` every other read goes through. Read
|
|
331
|
-
// unqualified, `epic:next joshuafolkken/app-kit#858`
|
|
332
|
-
//
|
|
333
|
-
//
|
|
334
|
-
//
|
|
325
|
+
// unqualified, `epic:next joshuafolkken/app-kit#858` would answer from *this* repository's issue 858
|
|
326
|
+
// and stamp the children it found there as app-kit's — and since `repo` decides how an unread child
|
|
327
|
+
// is written, that mislabelling would reach the message too. The default keeps a command whose epic
|
|
328
|
+
// is always local reading its own repository.
|
|
335
329
|
async function fetch_epic(
|
|
336
330
|
epic_number: number,
|
|
337
331
|
repo: string,
|
|
@@ -339,9 +333,9 @@ async function fetch_epic(
|
|
|
339
333
|
): Promise<EpicSnapshot> {
|
|
340
334
|
const scope = scope_for(repo, current_repo)
|
|
341
335
|
const epic_body = await fetch_epic_body(epic_number, scope)
|
|
342
|
-
//
|
|
343
|
-
//
|
|
344
|
-
//
|
|
336
|
+
// The owner restriction is about who *we* are, so the owner comes from the repository the command
|
|
337
|
+
// runs in. Derived from the epic's own repository instead, a qualified reference to somebody else's
|
|
338
|
+
// epic would make their whole organization readable.
|
|
345
339
|
const owner = epic_cross_repo.owner_of(current_repo)
|
|
346
340
|
const local = await fetch_children(epic_body.child_numbers, repo, scope)
|
|
347
341
|
const remote = await fetch_external_children(epic_body.external, owner)
|