@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,42 +1,32 @@
|
|
|
1
|
-
// Which documents a workflow entry point names but reads only later — point-of-use, not entry read
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// costing that reads it).
|
|
1
|
+
// Which documents a workflow entry point names but reads only later — point-of-use, not entry read.
|
|
2
|
+
// Kept apart from `entry-read-set.ts` so the point-of-use classification is its own concern from the
|
|
3
|
+
// costing that reads it.
|
|
5
4
|
//
|
|
6
|
-
// **Four documents leave the entry read because their first use is a named command, not the entry
|
|
7
|
-
//
|
|
5
|
+
// **Four documents leave the entry read because their first use is a named command, not the entry**.
|
|
6
|
+
// `latest-gate.md` is read
|
|
8
7
|
// when `pnpm josh latest:scope` answers `required`, `followup.md` in the turn that issues
|
|
9
|
-
// `pnpm josh followup`, `chain-rule.md` before the first `pnpm josh gate` launch it governs
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
// **`background-commands.md` is joshuafolkken/kit#1873's**: it was `background-commands.md`'s resident body, governing the
|
|
19
|
-
// background execution of the gate, the push and the merge tail — all after the first edit — so it
|
|
20
|
-
// left `SKILL.md` for the point-of-use list. `SKILL.md` → §1, "Four documents are read at the point
|
|
21
|
-
// of use", is the single source.
|
|
22
|
-
// **`backlogrun`'s own per-child phase documents are point-of-use too** (joshuafolkken/kit#2010):
|
|
8
|
+
// `pnpm josh followup`, `chain-rule.md` before the first `pnpm josh gate` launch it governs (the
|
|
9
|
+
// section is how that gate starts, overlapped with the review), and `background-commands.md` before
|
|
10
|
+
// the first backgroundable command (`pnpm josh gate`). **They are not deferred or summarized** — the
|
|
11
|
+
// named operational section is fetched in the same turn; only `latest-gate.md` remains whole because
|
|
12
|
+
// its result branches across that document. `chain-rule.md` governs the `/code-review` → `followup`
|
|
13
|
+
// chain and `background-commands.md` the background execution of the gate, the push and the merge
|
|
14
|
+
// tail — all *after* the first edit, so neither is resident from the entry. `SKILL.md` → §1, "Four
|
|
15
|
+
// documents are read at the point of use", is the single source.
|
|
16
|
+
// **`backlogrun`'s own per-child phase documents are point-of-use too**:
|
|
23
17
|
// `backlogrun.md` was split so the entry read carries only what binds before the first child, and the
|
|
24
18
|
// four phase documents below are read from it at the step each names — dispatching a child, opening a
|
|
25
19
|
// lane, the progress watcher and the hand-off, a child that cannot finish — never at the entry. Kept
|
|
26
20
|
// out of the count here, exactly as the four above are. `SKILL.md` → §1 is the human source.
|
|
27
|
-
// **`backlogrun-steps.md` joins them
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
// `fullrun.md` no longer names it, so it is charged to the lane child's role alone.
|
|
37
|
-
// **`progress-watcher.md` joins them** (joshuafolkken/kit#3172): the heartbeat every implementing run
|
|
38
|
-
// starts once its hold is claimed, split out of `backlogrun-progress.md` so a single-issue run stops
|
|
39
|
-
// paying for the batch's hand-off and waiting procedure to read it.
|
|
21
|
+
// **`backlogrun-steps.md` joins them**: `backlogrun.md` is a manifest and its detailed procedure
|
|
22
|
+
// lives in `backlogrun-steps.md`, read on demand rather than at the entry. Counting the manifest's
|
|
23
|
+
// pointers into it would put that prose straight back into the entry figure under another name.
|
|
24
|
+
// **`pre-gate-cut.md` joins them**: it is the single source of the pre-gate cut, a step a dispatched
|
|
25
|
+
// lane child reaches after the entry, so its read is a point-of-use read. Only a lane child reaches
|
|
26
|
+
// it: `fullrun.md` does not name it, so it is charged to the lane child's role alone.
|
|
27
|
+
// **`progress-watcher.md` joins them**: the heartbeat every implementing run starts once its hold is
|
|
28
|
+
// claimed, kept apart from `backlogrun-progress.md` so a single-issue run does not pay for the
|
|
29
|
+
// batch's hand-off and waiting procedure to read it.
|
|
40
30
|
const POINT_OF_USE_FILES: ReadonlySet<string> = new Set([
|
|
41
31
|
'latest-gate.md',
|
|
42
32
|
'followup.md',
|
|
@@ -50,16 +40,16 @@ const POINT_OF_USE_FILES: ReadonlySet<string> = new Set([
|
|
|
50
40
|
'backlogrun-park.md',
|
|
51
41
|
'backlogrun-steps.md',
|
|
52
42
|
// Read only when a delegated unit goes silent or a lane's pull request conflicts with `main` — a
|
|
53
|
-
// failure path, so a run in which nothing fails never reads it
|
|
43
|
+
// failure path, so a run in which nothing fails never reads it.
|
|
54
44
|
'backlogrun-recovery.md',
|
|
55
45
|
// Read only when `run:step` prints `pnpm josh retrospective` at a run's stop position — the very
|
|
56
|
-
// end of a run, never the entry
|
|
46
|
+
// end of a run, never the entry. Kept out of every entry's read for the
|
|
57
47
|
// same reason the phase documents above are: no run that never drains its backlog reaches it.
|
|
58
48
|
'retrospective.md',
|
|
59
49
|
])
|
|
60
50
|
|
|
61
51
|
// **A file an entry names but reads only later — point-of-use for that entry, an entry read for
|
|
62
|
-
// another
|
|
52
|
+
// another**. The global set above cannot express this, because a file
|
|
63
53
|
// dropped there leaves *every* entry's read. The four ordinary entries read the decision documents
|
|
64
54
|
// only when delegation or filing arises; the lane child omits their SKILL.md sections. `backlogrun`'s
|
|
65
55
|
// parent additionally reads `fullrun.md` and `split-assessment.md` inside a dispatched child, while
|
|
@@ -83,8 +73,8 @@ function is_point_of_use(entry: string, file: string): boolean {
|
|
|
83
73
|
return (POINT_OF_USE_BY_ENTRY.get(entry) ?? NO_PER_ENTRY_FILES).has(file)
|
|
84
74
|
}
|
|
85
75
|
|
|
86
|
-
// **Only the global files the entry reaches, plus the ones this entry names in its own row
|
|
87
|
-
//
|
|
76
|
+
// **Only the global files the entry reaches, plus the ones this entry names in its own row**.
|
|
77
|
+
// `cited` is every document the entry's path names; a global file outside it
|
|
88
78
|
// is one this entry never opens — a `kickoff` never issues `followup` — so charging it made every
|
|
89
79
|
// entry's total the same figure and the per-entry ratchet measured nothing.
|
|
90
80
|
function point_of_use_files(entry: string, cited: ReadonlySet<string>): Array<string> {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// What a document read at a workflow entry costs, in dollars, for one run
|
|
1
|
+
// What a document read at a workflow entry costs, in dollars, for one run.
|
|
2
2
|
//
|
|
3
3
|
// **The dollars are not "tokens x one rate".** A token read at the entry is not paid once — it rides
|
|
4
4
|
// every later request of the run as cached context, so its cost is the per-token cache-read rate
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Trimming a base entry's read set by role
|
|
1
|
+
// Trimming a base entry's read set by role.
|
|
2
2
|
//
|
|
3
3
|
// **A dispatched lane child (the worker) and a `backlogrun` parent (the scheduler) both read a trimmed
|
|
4
4
|
// version of a base entry.** The worker trims `fullrun` (`lane-child-read-set.ts`); the parent trims
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
// skipped point-of-use set.
|
|
10
10
|
//
|
|
11
11
|
// **Deriving off the base entry's own figures keeps each honest** — a row that moves in the base set
|
|
12
|
-
// moves here with it — and leaves the whole of `entry-read-set.ts` untouched
|
|
13
|
-
//
|
|
12
|
+
// moves here with it — and leaves the whole of `entry-read-set.ts` and `SKILL.md` untouched, which
|
|
13
|
+
// every entry point would otherwise pay for.
|
|
14
14
|
|
|
15
15
|
import { document_section } from './document-section'
|
|
16
16
|
import { entry_read_set, type Cost, type FileCost, type ReadSetCost } from './entry-read-set'
|
|
@@ -2,25 +2,23 @@ import { document_reachability } from './document-reachability'
|
|
|
2
2
|
|
|
3
3
|
// The byte budget of the always-resident document — `CLAUDE.md`, loaded on every request. It is held
|
|
4
4
|
// here rather than in `document-byte-budget.ts` because a resident document is covered by every entry
|
|
5
|
-
// total and must not carry a per-document block entry as well
|
|
6
|
-
//
|
|
7
|
-
//
|
|
5
|
+
// total and must not carry a per-document block entry as well; it is held here rather than inside
|
|
6
|
+
// `workflow-skills.test.ts` so `josh bytes CLAUDE.md` counts against the same number the suite
|
|
7
|
+
// enforces. Loosening any of the three constants is Tier C —
|
|
8
8
|
// `prompts/collaboration-workflow/residency.md`.
|
|
9
9
|
|
|
10
|
-
// The
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
// is a guard against re-inlining, not a budget to tune prose against.
|
|
14
|
-
const RESIDENT_CEILING_BYTES = 18_000
|
|
10
|
+
// The ceiling keeps `CLAUDE.md` to triggers and pointers, so the document cannot creep back. It is a
|
|
11
|
+
// guard against re-inlining, not a budget to tune prose against.
|
|
12
|
+
const RESIDENT_CEILING_BYTES = 12_216
|
|
15
13
|
|
|
16
|
-
//
|
|
14
|
+
// The ceiling alone stops the wrong thing. Reached, it does not block the
|
|
17
15
|
// next rule — it makes that rule pay for itself by deleting a neighboring sentence, and the
|
|
18
16
|
// sentence chosen is whichever one no marker pinned rather than whichever one matters least. A
|
|
19
17
|
// required margin turns "at the limit" into a failure while there is still room to write the fix,
|
|
20
18
|
// which is the only point at which moving a procedure into a skill is still a choice.
|
|
21
19
|
const RESIDENT_HEADROOM_BYTES = 2000
|
|
22
20
|
|
|
23
|
-
//
|
|
21
|
+
// A floor under the room left once the procedures are out, so a wholesale
|
|
24
22
|
// re-inlining fails by name instead of silently returning the document to a few bytes of headroom.
|
|
25
23
|
const RE_INLINE_GUARD_HEADROOM_BYTES = 1000
|
|
26
24
|
|
|
@@ -15,14 +15,14 @@ import { epic_sections, type BodyLines, type SectionRange } from './epic-section
|
|
|
15
15
|
// declaration `epic:next` parses, and the native `blocked-by` relations — and editing the body by
|
|
16
16
|
// hand is what leaves them disagreeing, which stops an unattended run outright. So the rewritten
|
|
17
17
|
// body is parsed back before it is returned, and a round trip that does not reproduce the intended
|
|
18
|
-
// links is reported instead of written
|
|
18
|
+
// links is reported instead of written.
|
|
19
19
|
|
|
20
20
|
interface RewriteInput {
|
|
21
21
|
body: string
|
|
22
22
|
// The children being placed, in the order the caller named them: the additions and the children
|
|
23
23
|
// the epic already tracks, together in one list. **A position places both kinds the same way** —
|
|
24
24
|
// the task-list row and the declaration are one statement, so an addition whose row was appended
|
|
25
|
-
// while the chain named a position left the two disagreeing
|
|
25
|
+
// while the chain named a position left the two disagreeing. Which of
|
|
26
26
|
// them already has a row is read off the body rather than passed in, since the two are placed
|
|
27
27
|
// identically and only the removal of an existing row differs.
|
|
28
28
|
placed: ReadonlyArray<number>
|
|
@@ -33,11 +33,10 @@ interface RewriteInput {
|
|
|
33
33
|
// The decision record to append to the epic's `## Decisions` section, or `undefined` for an
|
|
34
34
|
// insertion that records none. It is folded in **before** the declaration work below, so the stray
|
|
35
35
|
// declaration and round-trip guards see the record too: a record carrying a bare `#A -> #B` line
|
|
36
|
-
// would otherwise be written and then read back by `epic:next` as part of the order
|
|
37
|
-
// (joshuafolkken/kit#1350).
|
|
36
|
+
// would otherwise be written and then read back by `epic:next` as part of the order.
|
|
38
37
|
decision?: string | undefined
|
|
39
38
|
// Whether an empty `chains_after` means "write that there is no order" rather than "leave the
|
|
40
|
-
// declaration alone"
|
|
39
|
+
// declaration alone".
|
|
41
40
|
//
|
|
42
41
|
// The two callers mean opposite things by it. An insertion given no position computes no chains
|
|
43
42
|
// because none were ever declared, so the body is left exactly as it stood. A removal that took out
|
|
@@ -92,13 +91,12 @@ function is_placed_row(line: string, placed: ReadonlySet<number>): boolean {
|
|
|
92
91
|
}
|
|
93
92
|
|
|
94
93
|
// The rows of the placed children, put beside the row the position names. **The list order is part
|
|
95
|
-
// of what a position declares**: `epic:next` presents an epic's children in task-list order
|
|
96
|
-
//
|
|
97
|
-
// (joshuafolkken/kit#1701).
|
|
94
|
+
// of what a position declares**: `epic:next` presents an epic's children in task-list order,
|
|
95
|
+
// so rewriting only the declaration would leave the two disagreeing.
|
|
98
96
|
//
|
|
99
97
|
// **Both kinds of placement go through here.** A child the epic already tracks has its row lifted
|
|
100
98
|
// out first; an addition has none to lift, so the same insertion serves both and they land in the
|
|
101
|
-
// order the caller named rather than in the order they were classified
|
|
99
|
+
// order the caller named rather than in the order they were classified.
|
|
102
100
|
//
|
|
103
101
|
// The target's row is located after the removal rather than before it, so the index needs no
|
|
104
102
|
// adjusting for the rows that came out above it. Both lookups go through `find_indices`, which skips
|
|
@@ -119,8 +117,7 @@ function insert_task_rows(
|
|
|
119
117
|
}
|
|
120
118
|
|
|
121
119
|
// The task list with the placed children in it: at the position where one was named, appended where
|
|
122
|
-
// none was. An insertion that named no position appends
|
|
123
|
-
// joshuafolkken/kit#1701 and every unordered one since.
|
|
120
|
+
// none was. An insertion that named no position appends.
|
|
124
121
|
function to_placed_lines(input: RewriteInput): Array<string> {
|
|
125
122
|
const lines = to_body_lines(input.body)
|
|
126
123
|
const { position } = input
|
|
@@ -174,8 +171,8 @@ function replace_declaration(
|
|
|
174
171
|
|
|
175
172
|
// The declaration a line names, **re-rendered from the issue numbers it parsed to rather than echoed
|
|
176
173
|
// back**. The message has to name what it found, or the answer "move this line" is unactionable — and
|
|
177
|
-
// the body it comes from is not this process's: it is fetched from GitHub, and
|
|
178
|
-
//
|
|
174
|
+
// the body it comes from is not this process's: it is fetched from GitHub, and it also carries a
|
|
175
|
+
// record file the caller supplied. Echoing a line of either
|
|
179
176
|
// into stderr puts content this code never read in the console, which is what SonarCloud's
|
|
180
177
|
// `tssecurity:S8689` reports for this path. Rendering from the parsed numbers keeps the useful half —
|
|
181
178
|
// the chain, exactly as the parser read it — while what reaches the console is built from integers.
|
|
@@ -207,7 +204,7 @@ type BodyOutcome = { body: string } | { error: string }
|
|
|
207
204
|
// The task rows and the decision record, in that order. **The record goes in before the declaration
|
|
208
205
|
// work**: it is the one part of the new body that a caller wrote by hand, so the stray-declaration and
|
|
209
206
|
// round-trip guards below have to see it — a record appended afterwards would be written unchecked and
|
|
210
|
-
// read back by `epic:next` as part of the order
|
|
207
|
+
// read back by `epic:next` as part of the order.
|
|
211
208
|
function to_written_lines(input: RewriteInput): Array<string> {
|
|
212
209
|
const with_rows = to_placed_lines(input)
|
|
213
210
|
const { decision } = input
|
|
@@ -230,7 +227,7 @@ function is_declaration_unchanged(
|
|
|
230
227
|
|
|
231
228
|
// The declaration work, once the task rows and any record are in.
|
|
232
229
|
//
|
|
233
|
-
// **An unchanged declaration is left as text rather than re-rendered
|
|
230
|
+
// **An unchanged declaration is left as text rather than re-rendered**. The
|
|
234
231
|
// rewrite moves every chain line to the first one's index, so re-rendering a declaration nothing
|
|
235
232
|
// changed detaches the rationale lines a chain is documented by and files them under whichever chain
|
|
236
233
|
// ends up above them — a rewrite of somebody else's prose in exchange for a body that would have been
|
|
@@ -260,7 +257,7 @@ function to_declared_body(
|
|
|
260
257
|
// The declaration to write. An empty computed order means "nothing was ever declared" to an
|
|
261
258
|
// insertion and "the last link was just deleted" to a removal, and only the second has anything to
|
|
262
259
|
// say — the unordered sentence, since an emptied section carries no machine-readable declaration at
|
|
263
|
-
// all
|
|
260
|
+
// all.
|
|
264
261
|
function to_rendered_declaration(input: RewriteInput): Array<string> {
|
|
265
262
|
const rendered = epic_chains.render_chains(input.chains_after)
|
|
266
263
|
if (rendered.length > 0) return rendered
|
|
@@ -312,11 +309,11 @@ function to_placement_start(position: InsertPosition, target: number, count: num
|
|
|
312
309
|
// Whether the rewritten task list puts the placed rows where the position asked. The link round trip
|
|
313
310
|
// above says nothing about it — a body whose rows never moved declares exactly the same order and
|
|
314
311
|
// passes every other check here, while `epic:next` goes on presenting the order it was told to
|
|
315
|
-
// replace
|
|
312
|
+
// replace.
|
|
316
313
|
//
|
|
317
314
|
// **It covers an addition's row as well as a moved one**, since a position now places both: the row
|
|
318
315
|
// an addition gains is the half of the statement the declaration cannot verify for itself, and it
|
|
319
|
-
// was the half left unchecked
|
|
316
|
+
// was the half left unchecked.
|
|
320
317
|
function has_intended_rows(body: string, input: RewriteInput): boolean {
|
|
321
318
|
const { position, placed } = input
|
|
322
319
|
if (position === undefined || placed.length === 0) return true
|
|
@@ -11,7 +11,7 @@ import { epic_shape } from './epic-shape'
|
|
|
11
11
|
// Kept apart from the GitHub calls so the whole decision — which rows to add, which declaration to
|
|
12
12
|
// write, which relations to record and which to drop — is asserted without a network. That
|
|
13
13
|
// separation is the point: the command's value is that it refuses rather than half-applies, and a
|
|
14
|
-
// refusal path only reachable through `gh` is a refusal path nobody tests
|
|
14
|
+
// refusal path only reachable through `gh` is a refusal path nobody tests.
|
|
15
15
|
|
|
16
16
|
interface PlanInput {
|
|
17
17
|
epic_number: number
|
|
@@ -20,18 +20,18 @@ interface PlanInput {
|
|
|
20
20
|
children: ReadonlyArray<number>
|
|
21
21
|
position?: InsertPosition | undefined
|
|
22
22
|
// `--order-before` / `--order-after`: move the task-list row to `position` and write nothing else —
|
|
23
|
-
// no declaration, no `blocked-by
|
|
23
|
+
// no declaration, no `blocked-by`. The position is carried in the field
|
|
24
24
|
// above rather than in one of its own, because where the row goes is the same question either way;
|
|
25
25
|
// what this flag decides is whether a dependency is recorded behind it.
|
|
26
26
|
is_order_only?: boolean | undefined
|
|
27
27
|
// The epic's current children with their native relations, as `epic:next` reads them.
|
|
28
28
|
recorded: ReadonlyArray<EpicChild>
|
|
29
|
-
// The epic's own repository — what a declared bare number names. Needed
|
|
30
|
-
//
|
|
29
|
+
// The epic's own repository — what a declared bare number names. Needed because a recorded
|
|
30
|
+
// relation carries the repository it lives in.
|
|
31
31
|
repo: string
|
|
32
32
|
// The decision record `--decision-file` supplied, or `undefined` for an insertion that records
|
|
33
33
|
// none. It reaches the body rewrite rather than being posted separately, so the epic half of the
|
|
34
|
-
// record rides on the body edit the insertion already makes
|
|
34
|
+
// record rides on the body edit the insertion already makes.
|
|
35
35
|
decision?: string | undefined
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -40,20 +40,20 @@ interface AddPlan {
|
|
|
40
40
|
additions: ReadonlyArray<number>
|
|
41
41
|
// The children the epic already tracked, moved to the position the caller named. Kept apart from
|
|
42
42
|
// `additions` because the two write different things: an addition gains a task-list row, while a
|
|
43
|
-
// relocation only moves the row it already had
|
|
43
|
+
// relocation only moves the row it already had.
|
|
44
44
|
relocations: ReadonlyArray<number>
|
|
45
45
|
added: ReadonlyArray<DependencyLink>
|
|
46
46
|
removed: ReadonlyArray<DependencyLink>
|
|
47
47
|
// Every link the declaration dropped, whether or not GitHub had recorded it natively — which is what
|
|
48
|
-
// separates it from `removed` above
|
|
48
|
+
// separates it from `removed` above. `removed` is a work list for `gh` and
|
|
49
49
|
// is therefore filtered down to relations that exist to be removed; this is the *report*, and a
|
|
50
50
|
// declared-but-unrecorded order the caller re-pointed is exactly as much a replacement as a recorded
|
|
51
51
|
// one. Reporting from `removed` let those vanish without a word.
|
|
52
52
|
replaced: ReadonlyArray<DependencyLink>
|
|
53
53
|
// The placed children an order-only move puts on the wrong side of an order the declaration already
|
|
54
|
-
// states — ahead of an issue declared to block them, or behind one they are declared to block
|
|
55
|
-
//
|
|
56
|
-
// against the move target alone
|
|
54
|
+
// states — ahead of an issue declared to block them, or behind one they are declared to block.
|
|
55
|
+
// **The wrong side is judged against the whole resulting row order, not
|
|
56
|
+
// against the move target alone**: a relocation can seat a row on the wrong
|
|
57
57
|
// side of a *third* child the target never named, and a check that only compared the target missed
|
|
58
58
|
// it. `epic:next` filters by `blocked_by` **before** it applies task-list
|
|
59
59
|
// order, so such a row cannot take effect until the declaration itself changes, and a run that only
|
|
@@ -92,12 +92,12 @@ function declared_numbers(chains: ReadonlyArray<ReadonlyArray<number>>): Array<n
|
|
|
92
92
|
return [...new Set(chains.flat())]
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
// The children the epic already tracks, given a position: what
|
|
96
|
-
//
|
|
97
|
-
// still nothing to do, so the refusal below stands for that case
|
|
95
|
+
// The children the epic already tracks, given a position: what would be "nothing to do" without one
|
|
96
|
+
// is a reorder the moment `--before` / `--after` says where they go. Without a position there is
|
|
97
|
+
// still nothing to do, so the refusal below stands for that case.
|
|
98
98
|
//
|
|
99
99
|
// **The task list decides, not the declaration.** An issue a chain names while no row tracks it is
|
|
100
|
-
// what
|
|
100
|
+
// what a declaration cycle comes out of, and a move that re-rendered its missing row would
|
|
101
101
|
// repair a body somebody has to reconcile by hand — so it stays outside a move and keeps the refusal
|
|
102
102
|
// it already had.
|
|
103
103
|
function to_relocations(input: PlanInput, tracked: ReadonlyArray<number>): Array<number> {
|
|
@@ -108,8 +108,7 @@ function to_relocations(input: PlanInput, tracked: ReadonlyArray<number>): Array
|
|
|
108
108
|
|
|
109
109
|
// The issues to place, in the order the caller gave them. Additions and relocations enter one chain
|
|
110
110
|
// segment together, so which comes first is the caller's word rather than which bucket it fell into
|
|
111
|
-
// — and the task list is written from this same list, which is what keeps the two agreeing
|
|
112
|
-
// (joshuafolkken/kit#1704).
|
|
111
|
+
// — and the task list is written from this same list, which is what keeps the two agreeing.
|
|
113
112
|
function to_placed(
|
|
114
113
|
children: ReadonlyArray<number>,
|
|
115
114
|
additions: ReadonlyArray<number>,
|
|
@@ -183,7 +182,7 @@ interface PlanContext {
|
|
|
183
182
|
additions: ReadonlyArray<number>
|
|
184
183
|
relocations: ReadonlyArray<number>
|
|
185
184
|
// The two above as one list, in the order the caller named them — what both the chain segment and
|
|
186
|
-
// the task list are written from
|
|
185
|
+
// the task list are written from.
|
|
187
186
|
placed: ReadonlyArray<number>
|
|
188
187
|
chains_before: ReadonlyArray<ReadonlyArray<number>>
|
|
189
188
|
chains_after: ReadonlyArray<ReadonlyArray<number>>
|
|
@@ -203,13 +202,13 @@ function to_rewrite_input(context: PlanContext, decision: string | undefined): R
|
|
|
203
202
|
// checks rather than a function that both checks and composes.
|
|
204
203
|
//
|
|
205
204
|
// **The replacements are folded into the decision record before the body is rewritten**, because the
|
|
206
|
-
// epic's `## Decisions` half rides on that same edit
|
|
205
|
+
// epic's `## Decisions` half rides on that same edit — composing it afterwards
|
|
207
206
|
// would put the line on the child comments and leave the epic without it. The caller-supplied record
|
|
208
207
|
// has already been validated by `find_decision_error`; what is appended here is generated, not read
|
|
209
208
|
// from a file.
|
|
210
209
|
// An ordinary insertion records every link the declaration names that GitHub does not, which repairs a
|
|
211
|
-
// declared-but-unrecorded order in passing. **An order-only move records nothing at all
|
|
212
|
-
//
|
|
210
|
+
// declared-but-unrecorded order in passing. **An order-only move records nothing at all**:
|
|
211
|
+
// `--order-*` exists so a row can move with no dependency appearing behind
|
|
213
212
|
// it, and a repair made under it would put back exactly the `blocked-by` the caller asked not to have.
|
|
214
213
|
// The declaration is unchanged either way, so the repair is still there for the next insertion to make.
|
|
215
214
|
function to_added_links(
|
|
@@ -239,8 +238,7 @@ function does_declare_order(
|
|
|
239
238
|
// Whether the resulting row order puts `child` on the wrong side of any issue the declaration orders
|
|
240
239
|
// it against — ahead of one declared to block it, or behind one it is declared to block. The move
|
|
241
240
|
// target is not privileged: a relocation can seat a row on the wrong side of a *third* child the
|
|
242
|
-
// target never named, so the whole resulting order is cross-checked rather than the target alone
|
|
243
|
-
// (joshuafolkken/kit#1753).
|
|
241
|
+
// target never named, so the whole resulting order is cross-checked rather than the target alone.
|
|
244
242
|
function does_row_contradict_order(
|
|
245
243
|
chains: ReadonlyArray<ReadonlyArray<number>>,
|
|
246
244
|
rows: ReadonlyArray<number>,
|
|
@@ -299,15 +297,15 @@ function to_plan(context: PlanContext): PlanOutcome {
|
|
|
299
297
|
|
|
300
298
|
// A decision record that cannot be written is refused here rather than dropped: `--decision-file` was
|
|
301
299
|
// given because the record has to exist, so writing the insertion without it would report success for
|
|
302
|
-
// half the job
|
|
300
|
+
// half the job. `undefined` is "none was asked for", which is not a refusal.
|
|
303
301
|
function find_decision_error(decision: string | undefined): string | undefined {
|
|
304
302
|
return decision === undefined ? undefined : epic_decision.find_decision_error(decision)
|
|
305
303
|
}
|
|
306
304
|
|
|
307
305
|
// Asked of the declaration as it stands, because a relocation's removal can collapse the very
|
|
308
|
-
// ambiguity this refuses
|
|
306
|
+
// ambiguity this refuses.
|
|
309
307
|
//
|
|
310
|
-
// **An order-only move is not asked at all
|
|
308
|
+
// **An order-only move is not asked at all**. The ambiguity is about where a
|
|
311
309
|
// *dependency* would attach — `--before <hub>` cannot say which of the chains running through the hub
|
|
312
310
|
// the new link joins — and `--order-*` attaches no link, so the question has no subject. Asking it
|
|
313
311
|
// anyway would refuse a row move on the strength of a declaration the move never touches.
|
|
@@ -361,9 +359,9 @@ function find_input_error(
|
|
|
361
359
|
|
|
362
360
|
// The declaration the body will carry. A relocation is a removal followed by the ordinary insertion,
|
|
363
361
|
// so `--before` re-points the chain it lands in and the vacated chain closes around it — both by
|
|
364
|
-
// construction rather than by a second code path
|
|
362
|
+
// construction rather than by a second code path.
|
|
365
363
|
//
|
|
366
|
-
// **An order-only move takes neither step
|
|
364
|
+
// **An order-only move takes neither step**: the declaration it started with
|
|
367
365
|
// is the declaration it ends with, which is `keep_declaration` — the same passthrough `--add` with no
|
|
368
366
|
// position already uses. Because the chains come back identical, `diff_links` finds nothing replaced
|
|
369
367
|
// and the body rewrite leaves the `## Dependencies` section byte-identical, so "writes no dependency"
|
|
@@ -393,7 +391,7 @@ function build_plan(input: PlanInput): PlanOutcome {
|
|
|
393
391
|
const additions = to_additions(input, tracked, declared_numbers(chains_before))
|
|
394
392
|
const relocations = to_relocations(input, tracked)
|
|
395
393
|
// `tracked` reaches the chain builder so it can tell a child with no order yet from a number that is
|
|
396
|
-
// not a child at all; `find_movement_error` has already refused the second
|
|
394
|
+
// not a child at all; `find_movement_error` has already refused the second.
|
|
397
395
|
// What the builder does with a relocation, and what an order-only move does instead, is on
|
|
398
396
|
// `to_chains_after` above.
|
|
399
397
|
const placed = to_placed(input.children, additions, relocations)
|
package/scripts/epic/epic-add.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { backlog_ready } from '#scripts/backlog/backlog-ready'
|
|
2
2
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
3
4
|
import { epic_add_plan, type AddPlan } from './epic-add-plan'
|
|
4
5
|
import type { InsertPosition } from './epic-chains'
|
|
5
6
|
import { epic_decision } from './epic-decision'
|
|
@@ -15,7 +16,7 @@ import { epic_relations } from './epic-relations'
|
|
|
15
16
|
// `josh epic --add <E> <N...> [--before <M> | --after <M> | --order-before <M> | --order-after <M>]
|
|
16
17
|
// [--decision-file <path|->]` — insert children into an existing epic.
|
|
17
18
|
//
|
|
18
|
-
// **`--order-*` moves the row and writes nothing else
|
|
19
|
+
// **`--order-*` moves the row and writes nothing else**. `epic:next` offers
|
|
19
20
|
// children in task-list order, so putting one first meant `--before`, which records a `blocked-by`:
|
|
20
21
|
// "no dependency, but run this one first" had no spelling, and an order written that way stops every
|
|
21
22
|
// child behind the one that stalls.
|
|
@@ -23,10 +24,9 @@ import { epic_relations } from './epic-relations'
|
|
|
23
24
|
// Adding a child by editing the body is what the procedure told an agent to do, and it is what stops
|
|
24
25
|
// an unattended run: the body then declares an order the native `blocked-by` relations do not record,
|
|
25
26
|
// `epic:next` reports `declaration_mismatch`, and the verdict is `error`. This command writes the
|
|
26
|
-
// task-list row, the declaration and the relations from one input, so the three cannot disagree
|
|
27
|
-
// (joshuafolkken/kit#890).
|
|
27
|
+
// task-list row, the declaration and the relations from one input, so the three cannot disagree.
|
|
28
28
|
//
|
|
29
|
-
// **`--decision-file` folds the fourth and fifth writes in
|
|
29
|
+
// **`--decision-file` folds the fourth and fifth writes in**. An auto-decided
|
|
30
30
|
// placement has to be recorded in the epic's `## Decisions` and on each child, and no command wrote the
|
|
31
31
|
// epic half — so a run read the body, edited it and `PATCH`ed it back, which is the hand edit
|
|
32
32
|
// `CLAUDE.md` forbids. The epic half now rides on the body edit this command already makes, so it costs
|
|
@@ -37,7 +37,7 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
37
37
|
|
|
38
38
|
// A completed epic takes no new children: adding one silently produces a closed epic with unfinished
|
|
39
39
|
// children, whose backlog opt-in no longer fires, so the child never surfaces and the addition is
|
|
40
|
-
// lost
|
|
40
|
+
// lost. The refusal is only fired on a *confirmed* closed state — an
|
|
41
41
|
// unreadable state field leaves the addition to proceed, since blocking on a lookup that never
|
|
42
42
|
// answered would be the worse failure.
|
|
43
43
|
function is_closed_epic(state: string | undefined): boolean {
|
|
@@ -45,7 +45,7 @@ function is_closed_epic(state: string | undefined): boolean {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
function closed_epic_error(epic_number: number): string {
|
|
48
|
-
return `Epic
|
|
48
|
+
return `Epic ${session_cite.issue(epic_number)} is closed — a completed epic takes no new children. Reopen it if it is not actually done, or run \`pnpm josh epic:bundle <child>\` to place the child in an open epic instead.`
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
interface AddChildrenInput {
|
|
@@ -53,12 +53,11 @@ interface AddChildrenInput {
|
|
|
53
53
|
children: ReadonlyArray<number>
|
|
54
54
|
position?: InsertPosition | undefined
|
|
55
55
|
// `--order-before` / `--order-after`: place the row at `position` and write nothing else — no
|
|
56
|
-
// declaration, no `blocked-by
|
|
56
|
+
// declaration, no `blocked-by`.
|
|
57
57
|
is_order_only?: boolean | undefined
|
|
58
|
-
// The decision record to write, from `--decision-file`. It goes to two places,
|
|
59
|
-
// separate
|
|
60
|
-
// edit below, so it costs no round trip — and a comment on each child added
|
|
61
|
-
// (joshuafolkken/kit#1350).
|
|
58
|
+
// The decision record to write, from `--decision-file`. It goes to two places, neither of them a
|
|
59
|
+
// separate call a run makes afterwards: the epic's `## Decisions` section — folded into the body
|
|
60
|
+
// edit below, so it costs no round trip — and a comment on each child added.
|
|
62
61
|
decision?: string | undefined
|
|
63
62
|
}
|
|
64
63
|
|
|
@@ -96,20 +95,22 @@ async function apply_plan(plan: AddPlan): Promise<void> {
|
|
|
96
95
|
// The two things one insertion can do, reported separately because they are different edits: an
|
|
97
96
|
// addition gains a task-list row, a relocation moves the row it already had. Either list can be empty
|
|
98
97
|
// — `--before` / `--after` on children the epic already tracks adds nothing at all
|
|
99
|
-
//
|
|
98
|
+
// — so neither line is printed unconditionally.
|
|
100
99
|
// A row moved onto the wrong side of an order the declaration already states. `epic:next` filters by
|
|
101
100
|
// `blocked_by` before it applies task-list order, so the move cannot change when that child is offered
|
|
102
101
|
// until the declaration itself changes — and the placement line above, read alone, says the opposite.
|
|
103
|
-
// It is a warning rather than a refusal for the reason `contradicted` gives
|
|
102
|
+
// It is a warning rather than a refusal for the reason `contradicted` gives.
|
|
104
103
|
function report_contradiction(plan: AddPlan): void {
|
|
105
104
|
if (plan.contradicted.length === 0) return
|
|
106
105
|
|
|
107
106
|
console.info(
|
|
108
|
-
|
|
107
|
+
session_cite.text(
|
|
108
|
+
`⚠️ ${format_issue_references(plan.contradicted)} is still held by a declared order, so \`epic:next\` will not offer it any earlier until that order is changed — \`--remove\` deletes one.`,
|
|
109
|
+
),
|
|
109
110
|
)
|
|
110
111
|
}
|
|
111
112
|
|
|
112
|
-
// **An order-only move reports the place, because nothing else will
|
|
113
|
+
// **An order-only move reports the place, because nothing else will**. An
|
|
113
114
|
// ordinary insertion is followed by the replaced-relation line and the relation report, which between
|
|
114
115
|
// them say where the child landed; `--order-*` writes neither, so without this line the console says a
|
|
115
116
|
// row moved and never says where to. The position is read from the input rather than the plan: the
|
|
@@ -122,7 +123,9 @@ function report_order(input: AddChildrenInput, plan: AddPlan): void {
|
|
|
122
123
|
const target = to_issue_reference(position.target)
|
|
123
124
|
|
|
124
125
|
console.info(
|
|
125
|
-
|
|
126
|
+
session_cite.text(
|
|
127
|
+
`📋 Placed ${placed} ${position.kind} ${target} in epic ${session_cite.issue(input.epic_number)} — order only, no dependency written.`,
|
|
128
|
+
),
|
|
126
129
|
)
|
|
127
130
|
report_contradiction(plan)
|
|
128
131
|
}
|
|
@@ -134,19 +137,23 @@ function report_placements(input: AddChildrenInput, plan: AddPlan): void {
|
|
|
134
137
|
return
|
|
135
138
|
}
|
|
136
139
|
|
|
137
|
-
const epic = `epic
|
|
140
|
+
const epic = `epic ${session_cite.issue(input.epic_number)}`
|
|
138
141
|
|
|
139
142
|
if (plan.additions.length > 0) {
|
|
140
|
-
console.info(
|
|
143
|
+
console.info(
|
|
144
|
+
session_cite.text(`📋 Added ${format_issue_references(plan.additions)} to ${epic}.`),
|
|
145
|
+
)
|
|
141
146
|
}
|
|
142
147
|
|
|
143
148
|
if (plan.relocations.length > 0) {
|
|
144
|
-
console.info(
|
|
149
|
+
console.info(
|
|
150
|
+
session_cite.text(`📋 Moved ${format_issue_references(plan.relocations)} within ${epic}.`),
|
|
151
|
+
)
|
|
145
152
|
}
|
|
146
153
|
}
|
|
147
154
|
|
|
148
|
-
// **What the insertion discarded, printed from `plan.replaced` rather than `plan.removed
|
|
149
|
-
//
|
|
155
|
+
// **What the insertion discarded, printed from `plan.replaced` rather than `plan.removed`**.
|
|
156
|
+
// The two differ by the filter `removed` carries for `gh`'s sake: a link the
|
|
150
157
|
// body declared but nobody ever recorded natively is dropped from the declaration all the same, and
|
|
151
158
|
// reporting from the work list let exactly those go by without a word. A positioned `--add` is the
|
|
152
159
|
// only invocation that can replace anything, so an addition that re-points nothing prints nothing.
|
|
@@ -176,7 +183,7 @@ async function comment_decision(children: ReadonlyArray<number>, decision: strin
|
|
|
176
183
|
|
|
177
184
|
// The record posted to the children is `plan.decision`, not the caller's file: the plan is what folded
|
|
178
185
|
// the replaced relations into it, and reading the raw input here would leave the epic's `## Decisions`
|
|
179
|
-
// carrying a line the child comments do not
|
|
186
|
+
// carrying a line the child comments do not.
|
|
180
187
|
// A child new to the epic, not a reordering — the only insertion that can put runnable work in the pool.
|
|
181
188
|
function has_new_child(input: AddChildrenInput, plan: AddPlan): boolean {
|
|
182
189
|
return input.is_order_only !== true && plan.additions.length > 0
|
|
@@ -188,7 +195,7 @@ async function write_plan(input: AddChildrenInput, plan: AddPlan): Promise<void>
|
|
|
188
195
|
await apply_plan(plan)
|
|
189
196
|
|
|
190
197
|
// A relocation is a placement decision as much as an addition is, so the record reaches the child
|
|
191
|
-
// that was moved too
|
|
198
|
+
// that was moved too.
|
|
192
199
|
if (plan.decision !== undefined) {
|
|
193
200
|
await comment_decision([...plan.additions, ...plan.relocations], plan.decision)
|
|
194
201
|
}
|
|
@@ -196,8 +203,8 @@ async function write_plan(input: AddChildrenInput, plan: AddPlan): Promise<void>
|
|
|
196
203
|
if (has_new_child(input, plan)) await backlog_ready.print_offer_hint()
|
|
197
204
|
}
|
|
198
205
|
|
|
199
|
-
// The epic ready to receive children, or the reason it cannot be added to: unreadable, or closed
|
|
200
|
-
//
|
|
206
|
+
// The epic ready to receive children, or the reason it cannot be added to: unreadable, or closed.
|
|
207
|
+
// Both reasons come back as a bare string the one caller prefixes `✖` onto,
|
|
201
208
|
// so the two refusals read identically on stderr.
|
|
202
209
|
async function read_open_epic(epic_number: number): Promise<EpicReading | { error: string }> {
|
|
203
210
|
const epic = await epic_read.read_epic(epic_number)
|