@joshuafolkken/kit 1.1229.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +24 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +213 -197
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -201
- package/dist/josh.js +540 -137
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +4 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +313 -0
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +60 -53
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +12 -8
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +35 -0
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +49 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +32 -34
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +33 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +10 -10
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +20 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +44 -30
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +140 -0
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +68 -37
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +10 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +172 -43
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +62 -48
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +13 -21
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -328
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +129 -98
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,20 +1,19 @@
|
|
|
1
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
1
2
|
import { error_text } from '#scripts/lib/error-message'
|
|
2
3
|
import { epic_classify, type ResolveDependency } from './epic-classify'
|
|
3
4
|
import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
|
|
4
5
|
import type { BlockersReader } from './epic-relation-recheck'
|
|
5
6
|
import { epic_report, type EpicVerdict } from './epic-report'
|
|
6
7
|
|
|
7
|
-
//
|
|
8
|
-
// would otherwise start work.
|
|
8
|
+
// A stale dependency counter, checked where it would otherwise start work.
|
|
9
9
|
//
|
|
10
10
|
// `read_blocked_by` answers from the issue's own `issue_dependencies_summary` when that summary says
|
|
11
|
-
// zero, so a child whose counter is stale is read as `blocked_by: []`.
|
|
11
|
+
// zero, so a child whose counter is stale is read as `blocked_by: []`. `epic-relation-recheck.ts`
|
|
12
12
|
// re-reads such a child only when the epic body *declared* the missing link, which is the direction
|
|
13
13
|
// that makes `epic:next` exit 1 on a graph with nothing to fix. A relation recorded but never
|
|
14
14
|
// declared leaves no trace in the body, so nothing marks the child as a suspect — and there the
|
|
15
15
|
// mistake runs the other way: the child is classified runnable and handed to an unattended run,
|
|
16
|
-
// which then implements a deliverable before the thing it needs.
|
|
17
|
-
// joshuafolkken/kit#1005 exists to preserve.
|
|
16
|
+
// which then implements a deliverable before the thing it needs.
|
|
18
17
|
//
|
|
19
18
|
// So the summary is not trusted for the one child that is about to be offered. The candidate's
|
|
20
19
|
// relations are read from the listing, and a listing that disagrees replaces that child's
|
|
@@ -29,14 +28,14 @@ interface ConfirmContext {
|
|
|
29
28
|
resolve: ResolveDependency
|
|
30
29
|
read_blockers: BlockersReader
|
|
31
30
|
// The issues this invocation may run, so a re-classified candidate weighs an outside blocker exactly
|
|
32
|
-
// as `decide` did
|
|
31
|
+
// as `decide` did. Absent, the classifier's own default applies.
|
|
33
32
|
running?: ReadonlySet<string> | undefined
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
// The answer for one repository: the children to offer, or the verdict that stands in its place when
|
|
37
36
|
// every candidate was withheld.
|
|
38
37
|
//
|
|
39
|
-
// A list rather than one child
|
|
38
|
+
// A list rather than one child: a repository runs as many children at
|
|
40
39
|
// once as it has free lanes, and how many that is comes from the caller as `wanted`. The type says
|
|
41
40
|
// nothing about lanes or epics — it is a list and a verdict, so the same walk serves one lane, six,
|
|
42
41
|
// or a caller that has not been written yet.
|
|
@@ -123,7 +122,7 @@ async function read_or_withhold(
|
|
|
123
122
|
const reason = error_text.message_of(error)
|
|
124
123
|
|
|
125
124
|
console.warn(
|
|
126
|
-
`⚠ could not confirm the blockers of
|
|
125
|
+
`⚠ could not confirm the blockers of ${session_cite.issue(candidate.number, undefined, candidate.repo)}: ${reason}\n` +
|
|
127
126
|
' it is withheld rather than offered; asking again is what resolves this',
|
|
128
127
|
)
|
|
129
128
|
|
|
@@ -137,17 +136,17 @@ function warn_withheld(candidate: EpicChild, listed: ReadonlyArray<IssueReferenc
|
|
|
137
136
|
const named = listed.map((blocker) => epic_graph.key_of(blocker)).join(', ')
|
|
138
137
|
|
|
139
138
|
console.warn(
|
|
140
|
-
`⚠
|
|
139
|
+
`⚠ ${session_cite.issue(candidate.number, undefined, candidate.repo)} is withheld: its relations listing names ${named}, ` +
|
|
141
140
|
'which the dependency summary it was classified from did not count',
|
|
142
141
|
)
|
|
143
142
|
}
|
|
144
143
|
|
|
145
144
|
// Relations the listing recovered that this epic does not track as a child.
|
|
146
145
|
//
|
|
147
|
-
// `classify_children` weighs such a blocker
|
|
146
|
+
// `classify_children` weighs such a blocker, so a candidate that is still
|
|
148
147
|
// offered here has only outside blockers the classifier found finished. The relation is still named,
|
|
149
148
|
// because the run has just paid a request to learn it exists and the graph holds nothing to order it
|
|
150
|
-
// against
|
|
149
|
+
// against.
|
|
151
150
|
function untracked_blockers(
|
|
152
151
|
listed: ReadonlyArray<IssueReference>,
|
|
153
152
|
children: ReadonlyArray<EpicChild>,
|
|
@@ -161,7 +160,7 @@ function warn_untracked(candidate: EpicChild, untracked: ReadonlyArray<IssueRefe
|
|
|
161
160
|
const named = untracked.map((blocker) => epic_graph.key_of(blocker)).join(', ')
|
|
162
161
|
|
|
163
162
|
console.warn(
|
|
164
|
-
`⚠
|
|
163
|
+
`⚠ ${session_cite.issue(candidate.number, undefined, candidate.repo)} is offered although its relations listing names ${named}: ` +
|
|
165
164
|
'this epic does not track those, and every one of them is already finished',
|
|
166
165
|
)
|
|
167
166
|
}
|
|
@@ -207,14 +206,13 @@ async function confirm_one(
|
|
|
207
206
|
|
|
208
207
|
// The bundle walked from its head until `wanted` candidates have confirmed, or the bundle runs out.
|
|
209
208
|
//
|
|
210
|
-
// Walking on rather than making the whole repository wait is
|
|
211
|
-
// joshuafolkken/kit#1108: a healthy sibling should not be held for one child whose counter is stale,
|
|
209
|
+
// Walking on rather than making the whole repository wait is deliberate: a healthy sibling should not be held for one child whose counter is stale,
|
|
212
210
|
// and nobody repairs that counter — so the next poll would put the same child at the head and answer
|
|
213
211
|
// the same way, and the wait would never clear. The worst case is one request per candidate, and it
|
|
214
212
|
// happens only when every candidate is withheld, where the epic is broken and stopping is right.
|
|
215
213
|
//
|
|
216
|
-
// **It stops the moment the caller's appetite is met**, so asking for one child costs
|
|
217
|
-
//
|
|
214
|
+
// **It stops the moment the caller's appetite is met**, so asking for one child costs one walk to
|
|
215
|
+
// the first confirmation.
|
|
218
216
|
//
|
|
219
217
|
// Recursive rather than a loop with two exits, because the corrected graph has to be threaded from
|
|
220
218
|
// one candidate to the next: a second candidate is classified against what the first read
|
|
@@ -254,8 +252,7 @@ function withheld_verdict(
|
|
|
254
252
|
// The answer for one repository. An empty bundle costs no request and re-derives the verdict the
|
|
255
253
|
// caller already had, so the path a repository with nothing to offer takes is unchanged.
|
|
256
254
|
//
|
|
257
|
-
// `wanted` defaults to one lane
|
|
258
|
-
// what it used to get.
|
|
255
|
+
// `wanted` defaults to one lane.
|
|
259
256
|
async function answer_for_repo(
|
|
260
257
|
candidates: ReadonlyArray<EpicChild>,
|
|
261
258
|
context: ConfirmContext,
|
|
@@ -6,8 +6,7 @@ import { DEPENDENCY_ARROW, format_dependency_link, to_issue_reference } from './
|
|
|
6
6
|
// `epic:next` reads the declaration as a flat list of links, which is all a comparison against the
|
|
7
7
|
// native relations requires. An insertion cannot work from that: two disjoint chains and one
|
|
8
8
|
// branching chain produce the same links, and only the line structure says which chain a target sits
|
|
9
|
-
// in. So this module works in chains — one per declared line — and derives the links from them
|
|
10
|
-
// (joshuafolkken/kit#890).
|
|
9
|
+
// in. So this module works in chains — one per declared line — and derives the links from them.
|
|
11
10
|
//
|
|
12
11
|
// Every relation the caller applies comes from diffing the links before against the links after.
|
|
13
12
|
// That is what makes `--before` need no special case: inserting `#N` between `#B` and `#M` drops
|
|
@@ -104,7 +103,7 @@ function start_chain(additions: ReadonlyArray<number>, position: InsertPosition)
|
|
|
104
103
|
// A second declaration alongside the existing ones. Every other chain is copied through untouched,
|
|
105
104
|
// so nothing that was declared about anything else changes. Two callers reach it: a target that no
|
|
106
105
|
// chain names yet, and a `--after` whose target already has a successor — a branch rather than a
|
|
107
|
-
// splice
|
|
106
|
+
// splice.
|
|
108
107
|
function add_chain(
|
|
109
108
|
chains: Chains,
|
|
110
109
|
additions: ReadonlyArray<number>,
|
|
@@ -116,9 +115,9 @@ function add_chain(
|
|
|
116
115
|
// No declared chain names the target. Two states look identical from the chains alone, and they are
|
|
117
116
|
// not the same thing: a child the epic tracks simply has no order yet — legitimate in an epic mixing
|
|
118
117
|
// ordered and unordered children — and gets the first order anyone declared for it, as a new line.
|
|
119
|
-
// A number that is not a child at all is still refused
|
|
120
|
-
// The only reason left to refuse a position. "Not named in the declared order"
|
|
121
|
-
//
|
|
118
|
+
// A number that is not a child at all is still refused.
|
|
119
|
+
// The only reason left to refuse a position. "Not named in the declared order" is not one — it is a
|
|
120
|
+
// legitimate state, a child with no order constraint. The wording
|
|
122
121
|
// matches `find_addition_error`'s, which is what the workflow docs tell the operator to expect.
|
|
123
122
|
function not_a_child_error(target: number): InsertOutcome {
|
|
124
123
|
return {
|
|
@@ -145,7 +144,7 @@ function has_successor(chain: Chain, target: number): boolean {
|
|
|
145
144
|
|
|
146
145
|
// `--after <M>` where the declaration already names something after `#M`. Splicing there puts the
|
|
147
146
|
// additions between `#M` and that successor, which records `#N -> #<successor>` — an order nobody
|
|
148
|
-
// declared
|
|
147
|
+
// declared. What `--after <M>` states is that
|
|
149
148
|
// `#M` must finish first, and a fan-out (`#A -> #B` beside `#A -> #C`) already expresses exactly
|
|
150
149
|
// that, so the addition becomes a chain line of its own and the existing one is left as it stood.
|
|
151
150
|
// Appending after the tail is not a branch: with no successor to displace it keeps extending the
|
|
@@ -178,8 +177,7 @@ function to_ambiguous_position_error(position: InsertPosition): string {
|
|
|
178
177
|
// an ambiguity rather than resolve it: with `#890 -> #891` beside `#892 -> #891`, moving `#892` before
|
|
179
178
|
// `#891` leaves one chain naming `#891`, and the insertion then splices into a place nobody
|
|
180
179
|
// identified — recording `#890 -> #892`, an order the caller never asked for, and dropping
|
|
181
|
-
// `#890 -> #891`, one they never asked to lose. So the plan asks this of the declaration as it stands
|
|
182
|
-
// (joshuafolkken/kit#1701).
|
|
180
|
+
// `#890 -> #891`, one they never asked to lose. So the plan asks this of the declaration as it stands.
|
|
183
181
|
//
|
|
184
182
|
// **`before` is the only kind that can do it, and asking it of `after` too refuses the very case this
|
|
185
183
|
// Issue is about.** A `before` splices its child in *front* of the target, so the child inherits
|
|
@@ -237,12 +235,10 @@ function insert_at_position(
|
|
|
237
235
|
// No position given: nothing was declared about the additions, so the declaration is copied through
|
|
238
236
|
// exactly as it stood. An order is recorded only where `--before` / `--after` names one.
|
|
239
237
|
//
|
|
240
|
-
//
|
|
241
|
-
//
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
// park nor a `needs-decision` label to show that it was stuck. An epic with no chain at all was
|
|
245
|
-
// already left alone, which is the same answer this gives for every epic.
|
|
238
|
+
// Extending the **last declared chain** instead would invent a dependency. An epic mixing ordered
|
|
239
|
+
// and unordered children is the normal state, so an unrelated child added to one would come out
|
|
240
|
+
// blocked by whatever issue happened to sit at that chain's tail — and `epic:next` would withhold it
|
|
241
|
+
// as blocked, with neither a park nor a `needs-decision` label to show that it was stuck.
|
|
246
242
|
function keep_declaration(chains: Chains): InsertOutcome {
|
|
247
243
|
return { chains: chains.map((chain) => [...chain]) }
|
|
248
244
|
}
|
|
@@ -292,20 +288,19 @@ function already_declared_error(issue_number: number): string {
|
|
|
292
288
|
// Checked on the way in *and* on the way out. The result matters more than the input: a child the
|
|
293
289
|
// task list has lost but the declaration still names would otherwise be written into a chain a second
|
|
294
290
|
// time — `--after #892` on `#890 -> #891 -> #892 -> #891` produces a cycle, whose verdict is `error`,
|
|
295
|
-
// which halts the very run this command exists to keep going
|
|
296
|
-
//
|
|
297
|
-
// the guard still matters, because a positioned insert writes into a chain.
|
|
291
|
+
// which halts the very run this command exists to keep going. A no-position add never touches the
|
|
292
|
+
// declaration; the guard matters because a positioned insert writes into a chain.
|
|
298
293
|
//
|
|
299
294
|
// The two guards cover different things, and both are needed since `add_chain` can write into a
|
|
300
295
|
// chain the addition is not in. The in-guard refuses an addition the declaration already names
|
|
301
296
|
// **anywhere**; the out-guard catches a repeat **within one chain**. The out-guard deliberately does
|
|
302
297
|
// not scan across chains: one issue named by two of them is a fan-out — `#A -> #B` and `#A -> #C` —
|
|
303
|
-
// which is a legitimate declaration, not a duplicate
|
|
298
|
+
// which is a legitimate declaration, not a duplicate.
|
|
304
299
|
// `tracked` is the epic's task list, and it is required rather than defaulted. It separates "this
|
|
305
300
|
// child has no order yet" from "this number is not a child at all": the first gets a new chain, the
|
|
306
301
|
// second is refused. A default would make one path refuse everything and the other check nothing, so
|
|
307
302
|
// the same input would be accepted or refused depending only on whether anything happened to be
|
|
308
|
-
// declared yet
|
|
303
|
+
// declared yet.
|
|
309
304
|
// Everything that can refuse the input, before anything is built from it.
|
|
310
305
|
function find_insertion_error(
|
|
311
306
|
chains: Chains,
|
|
@@ -325,7 +320,7 @@ function find_insertion_error(
|
|
|
325
320
|
// A reorder expressed as a removal followed by the ordinary insertion. Splicing the child out of
|
|
326
321
|
// every chain that names it closes the chain around it — `#A -> #N -> #B` becomes `#A -> #B` — so the
|
|
327
322
|
// re-insertion goes through `insert_children` unchanged, and the relations to drop still fall out of
|
|
328
|
-
// diffing the declaration before against the declaration after
|
|
323
|
+
// diffing the declaration before against the declaration after.
|
|
329
324
|
//
|
|
330
325
|
// A chain left with one reference declares nothing and is dropped rather than rendered as a bare
|
|
331
326
|
// `#N`, which the parser would read as prose. Its remaining child simply has no order any more,
|
|
@@ -358,7 +353,7 @@ function split_chain(chain: Chain, dropped: ReadonlySet<string>): Array<Array<nu
|
|
|
358
353
|
}
|
|
359
354
|
|
|
360
355
|
// A declared order removed: every chain is cut at each named link, and **the ends are never
|
|
361
|
-
// reconnected
|
|
356
|
+
// reconnected**. `#A -> #B -> #C` minus `#B -> #C` leaves `#A -> #B`, and
|
|
362
357
|
// removing a middle child's two links leaves `#A` and `#C` with no order rather than `#A -> #C`.
|
|
363
358
|
//
|
|
364
359
|
// Reconnecting would declare an order nobody stated, which is exactly what the audit shipped beside
|
|
@@ -397,7 +392,7 @@ const epic_chains = {
|
|
|
397
392
|
links_of,
|
|
398
393
|
diff_links,
|
|
399
394
|
find_position_ambiguity,
|
|
400
|
-
// Exported
|
|
395
|
+
// Exported so `--order-before` / `--order-after` can pass the
|
|
401
396
|
// declaration through by the same function `--add` without a position uses. An order-only move is
|
|
402
397
|
// "leave the declaration exactly as it stood" applied to a call that *does* name a position, so a
|
|
403
398
|
// second copy of the passthrough would be the clone `CLAUDE.md` prohibits.
|
|
@@ -19,14 +19,13 @@ import {
|
|
|
19
19
|
// difference is not academic: the moment kit's child closes and app-kit's child is waiting for the
|
|
20
20
|
// release to publish, there is no runnable child, nothing carries `in-progress` (kit's child is
|
|
21
21
|
// closed) and nothing carries `needs-decision` (nothing was parked). A label-based reading sees
|
|
22
|
-
// "nothing running, nothing parked" and stops — in the one situation where it should wait
|
|
23
|
-
// (joshuafolkken/kit#860).
|
|
22
|
+
// "nothing running, nothing parked" and stops — in the one situation where it should wait.
|
|
24
23
|
|
|
25
24
|
// What a caller does with a child: run it, wait for it, or stop and report it.
|
|
26
25
|
type ChildCategory = 'runnable' | 'time' | 'human' | 'done'
|
|
27
26
|
|
|
28
27
|
// `DependencyVerdict` and `ResolveDependency` live in `epic-outside-blocker.ts`, which weighs a
|
|
29
|
-
// blocker no graph tracks with the same resolver
|
|
28
|
+
// blocker no graph tracks with the same resolver, and are re-exported below.
|
|
30
29
|
|
|
31
30
|
interface Classification {
|
|
32
31
|
runnable: ReadonlyArray<EpicChild>
|
|
@@ -51,7 +50,7 @@ function has_label(child: EpicChild, label: string): boolean {
|
|
|
51
50
|
|
|
52
51
|
// The labels that put a child in `human` on their own. `needs-decision` waits for an answer nobody
|
|
53
52
|
// has given; `already-done` has its answer — the work is merged, and the close that is left is Tier C
|
|
54
|
-
// and so a person's
|
|
53
|
+
// and so a person's. Neither is resolved by waiting, which is what separates
|
|
55
54
|
// them from `in-progress` below.
|
|
56
55
|
const HUMAN_LABELS: ReadonlyArray<string> = [NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL]
|
|
57
56
|
|
|
@@ -62,12 +61,12 @@ function has_human_label(child: EpicChild): boolean {
|
|
|
62
61
|
// What a child is before its dependencies are considered. A parked child is `human` whatever blocks
|
|
63
62
|
// it, and a child already being worked on is `time` — someone else's session will finish it.
|
|
64
63
|
//
|
|
65
|
-
// **A child that is itself an epic is `human
|
|
64
|
+
// **A child that is itself an epic is `human`**. An epic is not a unit of
|
|
66
65
|
// work, so a run handed one has nothing to implement; before this the row fell straight through to
|
|
67
66
|
// `from_blockers`, which mints `runnable` for anything unblocked, and `epicrun` passed the epic to
|
|
68
67
|
// `fullrun` as an ordinary issue. `human` rather than `time` because no amount of waiting turns an
|
|
69
68
|
// epic into work: a person has to flatten the row or restructure the epics, and meta-epic support is
|
|
70
|
-
// frozen
|
|
69
|
+
// frozen. What the question is — and, just as importantly, what it is not —
|
|
71
70
|
// is `epic-nested.ts`, which the audit asks the same way.
|
|
72
71
|
function local_category(child: EpicChild): ChildCategory | undefined {
|
|
73
72
|
if (child.state === CLOSED) return 'done'
|
|
@@ -99,9 +98,9 @@ interface ClassifyContext {
|
|
|
99
98
|
index: ReadonlyMap<string, EpicChild>
|
|
100
99
|
resolve: ResolveDependency
|
|
101
100
|
// Keyed by identity — repository plus number — because two children of one epic can share a
|
|
102
|
-
// number across repositories
|
|
101
|
+
// number across repositories.
|
|
103
102
|
memo: Map<string, ChildCategory>
|
|
104
|
-
// Every issue this invocation may run, keyed like `index
|
|
103
|
+
// Every issue this invocation may run, keyed like `index`. A blocker
|
|
105
104
|
// outside `index` waits when it is in here and goes to a person when it is not.
|
|
106
105
|
running: ReadonlySet<string>
|
|
107
106
|
}
|
|
@@ -125,9 +124,9 @@ function report_notice(notice: OutsideNotice): void {
|
|
|
125
124
|
console.warn(notice.message)
|
|
126
125
|
}
|
|
127
126
|
|
|
128
|
-
// A blocker no graph in this invocation tracks. It
|
|
129
|
-
// child waiting on another epic's open issue as runnable;
|
|
130
|
-
//
|
|
127
|
+
// A blocker no graph in this invocation tracks. It is weighed rather than announced and dropped, which
|
|
128
|
+
// would offer a child waiting on another epic's open issue as runnable; what could not be decided is
|
|
129
|
+
// still said out loud.
|
|
131
130
|
function outside_category(
|
|
132
131
|
child: EpicChild,
|
|
133
132
|
reference: IssueReference,
|
|
@@ -147,7 +146,7 @@ function outside_category(
|
|
|
147
146
|
|
|
148
147
|
// Said out loud because the report cannot say it: a withheld epic prints as a bare `#N` under
|
|
149
148
|
// "Waiting on a person", which is true of a parked issue and of an epic alike, and the two need
|
|
150
|
-
// entirely different things done to them
|
|
149
|
+
// entirely different things done to them.
|
|
151
150
|
function report_nested_epic(child: EpicChild): void {
|
|
152
151
|
const line = `epic:${epic_graph.key_of(child)}`
|
|
153
152
|
if (reported.has(line)) return
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import type { ParseArgsOptionsConfig } from 'node:util'
|
|
2
2
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
3
3
|
|
|
4
|
-
// The argument reading every `josh epic` form shares, on top of `cli_flags
|
|
4
|
+
// The argument reading every `josh epic` form shares, on top of `cli_flags`.
|
|
5
5
|
//
|
|
6
|
-
// They were private to `epic-cli.ts` until `--remove` needed the same readers
|
|
6
|
+
// They were private to `epic-cli.ts` until `--remove` needed the same readers,
|
|
7
7
|
// at which point the choice was to copy them or to name them. Copying is what `CLAUDE.md` prohibits,
|
|
8
8
|
// and the failure it would produce is specific: two readers disagreeing about what counts as a flag
|
|
9
9
|
// value would have one form silently take a `--decision-file` path for an issue number.
|
|
10
10
|
//
|
|
11
11
|
// **Each form names its own flags, and the read is strict.** Which flags consume the argument after
|
|
12
12
|
// them is per form: `--before` takes a value only under `--add`, and treating it as one everywhere had
|
|
13
|
-
// `josh epic "T" 101 102 --after 103` silently drop #103
|
|
13
|
+
// `josh epic "T" 101 102 --after 103` silently drop #103. A flag the form does
|
|
14
14
|
// not know refuses the invocation — a mistyped flag would otherwise leave its value positional, so it
|
|
15
15
|
// becomes an issue number and the edit silently lands somewhere else.
|
|
16
16
|
|
|
17
|
-
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
18
17
|
// Every value flag is read as a list so a repeat is visible rather than resolved to one of the two:
|
|
19
18
|
// two `--decision-file` paths name two records, and two `--before` targets name two places.
|
|
20
19
|
const VALUE_OPTION = { type: 'string', multiple: true } as const
|
|
@@ -88,7 +87,7 @@ function is_switch_set(parsed: EpicArgv, flag: string): boolean {
|
|
|
88
87
|
// A value-taking flag given without a usable value, or given twice. **Refused rather than read as "none
|
|
89
88
|
// was asked for"** — `--decision-file` is passed precisely because the record has to exist, so a shell
|
|
90
89
|
// that ate the path would otherwise land the edit, write no record, post no comment and exit 0: success
|
|
91
|
-
// reported for half the job. Repeated, it names two records
|
|
90
|
+
// reported for half the job. Repeated, it names two records.
|
|
92
91
|
function is_value_unusable(argv: ReadonlyArray<string>, flag: string): boolean {
|
|
93
92
|
return (
|
|
94
93
|
cli_flags.given_values(argv, flag).length > SINGLE || cli_flags.is_value_unusable(argv, flag)
|
|
@@ -104,5 +103,5 @@ const epic_cli_argv = {
|
|
|
104
103
|
is_value_unusable,
|
|
105
104
|
}
|
|
106
105
|
|
|
107
|
-
export { epic_cli_argv
|
|
106
|
+
export { epic_cli_argv }
|
|
108
107
|
export type { EpicArgv, FormFlags }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
|
+
import { epic_cli_argv, type EpicArgv, type FormFlags } from './epic-cli-argv'
|
|
2
3
|
|
|
3
|
-
// `josh epic --remove <E> <M> <N> …`'s argument rules
|
|
4
|
+
// `josh epic --remove <E> <M> <N> …`'s argument rules.
|
|
4
5
|
//
|
|
5
6
|
// Its own module rather than a fourth parser inside `epic-cli.ts`, which sits at its line ceiling —
|
|
6
7
|
// and because the rules read as one thing: the arguments after the epic are a **path**, which is the
|
|
@@ -30,14 +31,18 @@ function is_removal(argv: ReadonlyArray<string>): boolean {
|
|
|
30
31
|
// repeat would silently delete a different set of orders than the one typed, and skipping an
|
|
31
32
|
// unparsable argument would shift every pair after it.
|
|
32
33
|
function to_path_numbers(raw_path: ReadonlyArray<string>): Array<number> | undefined {
|
|
33
|
-
if (raw_path.some((raw) => !
|
|
34
|
+
if (raw_path.some((raw) => !issue_number_shape.is_issue_number(raw))) return undefined
|
|
34
35
|
|
|
35
36
|
return raw_path.length < MINIMUM_PATH_LENGTH ? undefined : raw_path.map(Number)
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
function read_subject(parsed: EpicArgv): { epic_number: number; path: Array<number> } | undefined {
|
|
39
40
|
const [raw_epic, ...raw_path] = parsed.positionals
|
|
40
|
-
|
|
41
|
+
|
|
42
|
+
if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
|
|
43
|
+
return undefined
|
|
44
|
+
}
|
|
45
|
+
|
|
41
46
|
const path = to_path_numbers(raw_path)
|
|
42
47
|
|
|
43
48
|
return path === undefined ? undefined : { epic_number: Number(raw_epic), path }
|
package/scripts/epic/epic-cli.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
1
3
|
import { cli_body } from '#scripts/josh/cli-body'
|
|
2
4
|
import type { InsertKind, InsertPosition } from './epic-chains'
|
|
3
|
-
import { epic_cli_argv,
|
|
5
|
+
import { epic_cli_argv, type EpicArgv, type FormFlags } from './epic-cli-argv'
|
|
4
6
|
import { epic_cli_remove } from './epic-cli-remove'
|
|
5
7
|
import { epic_parse, type ExternalChild } from './epic-parse'
|
|
6
8
|
|
|
@@ -12,20 +14,20 @@ const RATIONALE_FLAG = '--rationale-file'
|
|
|
12
14
|
const ORIGIN_FLAG = '--origin'
|
|
13
15
|
const PROMOTE_FLAG = '--promote'
|
|
14
16
|
const ADD_FLAG = '--add'
|
|
15
|
-
// `--reconcile <E>`: bring the epic's declaration and its recorded relations back into agreement
|
|
16
|
-
//
|
|
17
|
+
// `--reconcile <E>`: bring the epic's declaration and its recorded relations back into agreement.
|
|
18
|
+
// It takes no value flags — the epic number is the whole subject.
|
|
17
19
|
const RECONCILE_FLAG = '--reconcile'
|
|
18
20
|
const BEFORE_FLAG = '--before'
|
|
19
21
|
const AFTER_FLAG = '--after'
|
|
20
22
|
// The same two places with the declaration withheld: move the task-list row and write neither the
|
|
21
|
-
// dependency declaration nor the `blocked-by` relation
|
|
23
|
+
// dependency declaration nor the `blocked-by` relation. They exist because
|
|
22
24
|
// `epic:next` offers children in task-list order, so "no dependency, but run this one first" had no
|
|
23
25
|
// spelling at all — only a false dependency, or a row nobody would reach.
|
|
24
26
|
const ORDER_BEFORE_FLAG = '--order-before'
|
|
25
27
|
const ORDER_AFTER_FLAG = '--order-after'
|
|
26
28
|
// The decision record for an insertion, read the same way `--rationale-file` is read for a creation:
|
|
27
29
|
// from a file, or from stdin as `-`. The text is a judgement, so the caller writes it; what the command
|
|
28
|
-
// contributes is placing it in the epic's `## Decisions` and on each child
|
|
30
|
+
// contributes is placing it in the epic's `## Decisions` and on each child.
|
|
29
31
|
const DECISION_FLAG = '--decision-file'
|
|
30
32
|
// Which flags each form knows, and which of them consume the argument after them — per form, for the
|
|
31
33
|
// reason `epic-cli-argv.ts` gives.
|
|
@@ -53,7 +55,7 @@ interface CreateArguments {
|
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
// `--promote <N> <N1> <N2> …`: the issue to promote, then its children. No title — the issue already
|
|
56
|
-
// has one, and the discussion in it is usually the split rationale
|
|
58
|
+
// has one, and the discussion in it is usually the split rationale.
|
|
57
59
|
interface PromoteArguments {
|
|
58
60
|
epic_number: number
|
|
59
61
|
children: Array<number>
|
|
@@ -66,7 +68,7 @@ interface PromoteArguments {
|
|
|
66
68
|
// `--ordered` would ask GitHub to make an issue block itself.
|
|
67
69
|
function to_child_numbers(raw_children: ReadonlyArray<string>): Array<number> {
|
|
68
70
|
const numbers = raw_children
|
|
69
|
-
.filter((raw) =>
|
|
71
|
+
.filter((raw) => issue_number_shape.is_issue_number(raw))
|
|
70
72
|
.map(Number)
|
|
71
73
|
.filter((value) => Number.isSafeInteger(value))
|
|
72
74
|
|
|
@@ -120,7 +122,10 @@ interface ReconcileArguments {
|
|
|
120
122
|
// and no position — the repair reads what the epic already records rather than being told an order.
|
|
121
123
|
function parse_reconcile_arguments(argv: ReadonlyArray<string>): ReconcileArguments | undefined {
|
|
122
124
|
const [raw_epic] = positionals_of(argv, RECONCILE_FORM)
|
|
123
|
-
|
|
125
|
+
|
|
126
|
+
if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
|
|
127
|
+
return undefined
|
|
128
|
+
}
|
|
124
129
|
|
|
125
130
|
return { epic_number: Number(raw_epic) }
|
|
126
131
|
}
|
|
@@ -130,7 +135,11 @@ function parse_reconcile_arguments(argv: ReadonlyArray<string>): ReconcileArgume
|
|
|
130
135
|
// have it block itself under `--ordered`.
|
|
131
136
|
function to_promote_arguments(parsed: EpicArgv): PromoteArguments | undefined {
|
|
132
137
|
const [raw_epic, ...raw_children] = parsed.positionals
|
|
133
|
-
|
|
138
|
+
|
|
139
|
+
if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
|
|
140
|
+
return undefined
|
|
141
|
+
}
|
|
142
|
+
|
|
134
143
|
const epic_number = Number(raw_epic)
|
|
135
144
|
const children = to_child_numbers(raw_children).filter((child) => child !== epic_number)
|
|
136
145
|
if (children.length === 0) return undefined
|
|
@@ -146,13 +155,13 @@ function parse_promote_arguments(argv: ReadonlyArray<string>): PromoteArguments
|
|
|
146
155
|
|
|
147
156
|
// `--add <E> <N...> [--before <M> | --after <M> | --order-before <M> | --order-after <M>]`: the epic
|
|
148
157
|
// to insert into, then the children. The epic comes first for the same reason it does under
|
|
149
|
-
// `--promote`, so the children stay a bare list of numbers
|
|
158
|
+
// `--promote`, so the children stay a bare list of numbers.
|
|
150
159
|
interface AddArguments {
|
|
151
160
|
epic_number: number
|
|
152
161
|
children: Array<number>
|
|
153
162
|
position?: InsertPosition | undefined
|
|
154
163
|
// `--order-before` / `--order-after` rather than `--before` / `--after`: the row moves and nothing
|
|
155
|
-
// else is written
|
|
164
|
+
// else is written.
|
|
156
165
|
is_order_only?: boolean | undefined
|
|
157
166
|
decision_path?: string | undefined
|
|
158
167
|
}
|
|
@@ -165,7 +174,7 @@ function is_addition(argv: ReadonlyArray<string>): boolean {
|
|
|
165
174
|
// The outcome of reading a positioning flag: the position, nothing, or a refusal. One shape for all
|
|
166
175
|
// three so the caller branches on a field rather than on a value's type. `is_order_only` rides on the
|
|
167
176
|
// same value because one flag decides both halves — where the row goes, and whether a dependency is
|
|
168
|
-
// written behind it
|
|
177
|
+
// written behind it.
|
|
169
178
|
interface PositionOutcome {
|
|
170
179
|
position?: InsertPosition
|
|
171
180
|
is_order_only?: boolean
|
|
@@ -176,7 +185,7 @@ const NO_POSITION: PositionOutcome = { is_refused: false }
|
|
|
176
185
|
const REFUSED_POSITION: PositionOutcome = { is_refused: true }
|
|
177
186
|
|
|
178
187
|
// The four positioning flags as one table: the place each one names, and whether a dependency is
|
|
179
|
-
// written behind the row it moves. **One table rather than two branches**
|
|
188
|
+
// written behind the row it moves. **One table rather than two branches** —
|
|
180
189
|
// `--order-before` asks the same placement question `--before` does, so a second parsing path could
|
|
181
190
|
// come to disagree with this one about what a repeated flag or a non-numeric target means.
|
|
182
191
|
interface PositionFlag {
|
|
@@ -224,7 +233,7 @@ function parse_position(parsed: EpicArgv): PositionOutcome {
|
|
|
224
233
|
const has_flag = count_position_flags(parsed) > 0
|
|
225
234
|
const target = read_position_target(parsed)
|
|
226
235
|
if (target === undefined) return has_flag ? REFUSED_POSITION : NO_POSITION
|
|
227
|
-
if (!ISSUE_NUMBER_PATTERN.test(target.raw)) return REFUSED_POSITION
|
|
236
|
+
if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(target.raw)) return REFUSED_POSITION
|
|
228
237
|
|
|
229
238
|
return {
|
|
230
239
|
position: { kind: target.kind, target: Number(target.raw) },
|
|
@@ -245,7 +254,11 @@ function read_add_subject(
|
|
|
245
254
|
parsed: EpicArgv,
|
|
246
255
|
): { epic_number: number; children: Array<number> } | undefined {
|
|
247
256
|
const [raw_epic, ...raw_children] = parsed.positionals
|
|
248
|
-
|
|
257
|
+
|
|
258
|
+
if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
|
|
259
|
+
return undefined
|
|
260
|
+
}
|
|
261
|
+
|
|
249
262
|
const epic_number = Number(raw_epic)
|
|
250
263
|
const children = to_child_numbers(raw_children).filter((child) => child !== epic_number)
|
|
251
264
|
|
|
@@ -267,7 +280,7 @@ function to_add_arguments(parsed: EpicArgv): AddArguments | undefined {
|
|
|
267
280
|
}
|
|
268
281
|
|
|
269
282
|
// An unknown flag is refused by the strict read: a mistyped positioning flag would otherwise leave its
|
|
270
|
-
// value positional, so it becomes a child and the edit lands somewhere else
|
|
283
|
+
// value positional, so it becomes a child and the edit lands somewhere else.
|
|
271
284
|
function parse_add_arguments(argv: ReadonlyArray<string>): AddArguments | undefined {
|
|
272
285
|
const parsed = is_decision_path_unusable(argv) ? undefined : read_form(argv, ADD_FORM)
|
|
273
286
|
|
|
@@ -277,7 +290,7 @@ function parse_add_arguments(argv: ReadonlyArray<string>): AddArguments | undefi
|
|
|
277
290
|
// The one refusal `--add` has to explain rather than merely report. `into owner/repo#N` is a legal
|
|
278
291
|
// thing for a person to type, and this command cannot serve it: it reads and edits issues in the
|
|
279
292
|
// repository it is run from. Falling through to the usage line would read as "that form does not
|
|
280
|
-
// exist" when what it means is "run it in the other checkout"
|
|
293
|
+
// exist" when what it means is "run it in the other checkout".
|
|
281
294
|
interface CrossRepoAddTarget {
|
|
282
295
|
epic: ExternalChild
|
|
283
296
|
local: AddArguments
|
|
@@ -307,7 +320,7 @@ function find_cross_repo_add_target(argv: ReadonlyArray<string>): CrossRepoAddTa
|
|
|
307
320
|
function format_add_arguments(local: AddArguments): string {
|
|
308
321
|
const { position } = local
|
|
309
322
|
// The order-only prefix rides along, since it is what decides whether the other checkout writes a
|
|
310
|
-
// dependency — a suggestion that dropped it would be a different instruction
|
|
323
|
+
// dependency — a suggestion that dropped it would be a different instruction.
|
|
311
324
|
const prefix = local.is_order_only === true ? '--order-' : '--'
|
|
312
325
|
const suffix =
|
|
313
326
|
position === undefined ? '' : ` ${prefix}${position.kind} ${String(position.target)}`
|
|
@@ -315,7 +328,7 @@ function format_add_arguments(local: AddArguments): string {
|
|
|
315
328
|
return `${[local.epic_number, ...local.children].map(String).join(' ')}${suffix}`
|
|
316
329
|
}
|
|
317
330
|
|
|
318
|
-
// **`--decision-file` is named rather than relayed
|
|
331
|
+
// **`--decision-file` is named rather than relayed**. The suggestion is a
|
|
319
332
|
// command to run in a *different* checkout, and the path was resolved against this one: a relative path
|
|
320
333
|
// does not exist there, `-` cannot be re-read from a consumed stdin, and an unquoted path with a space
|
|
321
334
|
// would break the line the person copies. So the flag is asked for again instead of pasted in wrong.
|
|
@@ -329,8 +342,8 @@ function format_decision_note(local: AddArguments): Array<string> {
|
|
|
329
342
|
|
|
330
343
|
// A fully-qualified reference to *this* repository is the same instruction spelled longer, not a
|
|
331
344
|
// cross-repository one — and `into owner/repo#N` is exactly how the suffix is documented, so a run
|
|
332
|
-
// inside that repository would otherwise be refused and told to go to the checkout it is already in
|
|
333
|
-
//
|
|
345
|
+
// inside that repository would otherwise be refused and told to go to the checkout it is already in.
|
|
346
|
+
// An unreadable current repository resolves to a refusal rather than to a
|
|
334
347
|
// write: refusing costs one command, and guessing wrong writes into the wrong epic.
|
|
335
348
|
function resolve_local_add(
|
|
336
349
|
found: CrossRepoAddTarget,
|
|
@@ -342,7 +355,7 @@ function resolve_local_add(
|
|
|
342
355
|
// What to type instead. `josh doctor` prints the checkout for each repository, which is the part a
|
|
343
356
|
// run cannot guess.
|
|
344
357
|
function format_cross_repo_refusal(found: CrossRepoAddTarget): string {
|
|
345
|
-
const reference =
|
|
358
|
+
const reference = session_cite.issue(found.epic.number, undefined, found.epic.repo)
|
|
346
359
|
|
|
347
360
|
return [
|
|
348
361
|
`✖ ${reference} is an epic in another repository; this command reads and writes issues in the repository it runs from.`,
|
|
@@ -353,14 +366,14 @@ function format_cross_repo_refusal(found: CrossRepoAddTarget): string {
|
|
|
353
366
|
|
|
354
367
|
function parse_check_argument(argv: ReadonlyArray<string>): number | undefined {
|
|
355
368
|
const [raw] = positionals_of(argv, CHECK_FORM)
|
|
356
|
-
if (raw === undefined || !ISSUE_NUMBER_PATTERN.test(raw)) return undefined
|
|
369
|
+
if (raw === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw)) return undefined
|
|
357
370
|
|
|
358
371
|
return Number(raw)
|
|
359
372
|
}
|
|
360
373
|
|
|
361
374
|
// `-` reads stdin, matching `gh issue create --body-file -`. The reader is `cli_body`'s, shared with
|
|
362
375
|
// `josh notify --body-file` and `josh followup --notify-message-file` rather than copied per entry
|
|
363
|
-
// point
|
|
376
|
+
// point, so the stdin form cannot come to mean one thing here and something
|
|
364
377
|
// else there.
|
|
365
378
|
const { read_file_or_stdin } = cli_body
|
|
366
379
|
|
|
@@ -371,8 +384,7 @@ function read_rationale(rationale_path: string | undefined): string {
|
|
|
371
384
|
}
|
|
372
385
|
|
|
373
386
|
// `undefined` rather than `''` for an omitted path: an insertion that records no decision is the
|
|
374
|
-
// ordinary case, and an empty string is a record that says nothing — which `epic --add` refuses
|
|
375
|
-
// (joshuafolkken/kit#1350).
|
|
387
|
+
// ordinary case, and an empty string is a record that says nothing — which `epic --add` refuses.
|
|
376
388
|
function read_decision(decision_path: string | undefined): string | undefined {
|
|
377
389
|
return decision_path === undefined ? undefined : read_file_or_stdin(decision_path)
|
|
378
390
|
}
|