@joshuafolkken/kit 1.1240.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +216 -202
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -9,11 +9,10 @@ import { epic_shape } from './epic-shape'
|
|
|
9
9
|
// Everything `josh epic --remove` decides before it writes anything.
|
|
10
10
|
//
|
|
11
11
|
// A declared order lives in two places at once — the epic body's `Dependencies` declaration and the
|
|
12
|
-
// native `blocked-by` relations — and
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// twenty-nine such removals before the command existed (joshuafolkken/kit#1712).
|
|
12
|
+
// native `blocked-by` relations — and this command deletes one from both at once. The alternative is
|
|
13
|
+
// the hand edit `CLAUDE.md` forbids plus a bare `DELETE` on the dependencies endpoint, and doing
|
|
14
|
+
// either half alone leaves `epic:next` answering `declaration_mismatch`, which stops an unattended
|
|
15
|
+
// run.
|
|
17
16
|
//
|
|
18
17
|
// Kept apart from the GitHub calls for the reason `epic-add-plan.ts` is: the whole decision is
|
|
19
18
|
// asserted without a network, and a refusal path only reachable through `gh` is one nobody tests.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
2
3
|
import { epic_decision } from './epic-decision'
|
|
3
4
|
import { epic_read } from './epic-read'
|
|
4
5
|
import { format_dependency_links } from './epic-reference'
|
|
@@ -6,13 +7,12 @@ import { epic_relations } from './epic-relations'
|
|
|
6
7
|
import { epic_remove_plan, type RemovePlan } from './epic-remove-plan'
|
|
7
8
|
|
|
8
9
|
// `josh epic --remove <E> <M> <N> [<N2> ...] [--decision-file <path|->]` — delete a declared order
|
|
9
|
-
// from the epic's body and from the native `blocked-by` relations in one input
|
|
10
|
-
// (joshuafolkken/kit#1712).
|
|
10
|
+
// from the epic's body and from the native `blocked-by` relations in one input.
|
|
11
11
|
//
|
|
12
12
|
// It is `--add`'s missing counterpart. `--add` exists because writing the declaration and the
|
|
13
13
|
// relations separately is what leaves them disagreeing; deleting them separately leaves them
|
|
14
|
-
// disagreeing in exactly the same way, and
|
|
15
|
-
//
|
|
14
|
+
// disagreeing in exactly the same way, and without a command for it the only route is the hand edit
|
|
15
|
+
// `CLAUDE.md` forbids.
|
|
16
16
|
|
|
17
17
|
const FAILURE_EXIT_CODE = 1
|
|
18
18
|
const SUCCESS_EXIT_CODE = 0
|
|
@@ -54,7 +54,9 @@ async function write_plan(
|
|
|
54
54
|
): Promise<void> {
|
|
55
55
|
await git_gh_command.issue_edit_body(String(epic_number), plan.body)
|
|
56
56
|
console.info(
|
|
57
|
-
|
|
57
|
+
session_cite.text(
|
|
58
|
+
`📋 Removed ${format_dependency_links(plan.links)} from epic ${session_cite.issue(epic_number)}.`,
|
|
59
|
+
),
|
|
58
60
|
)
|
|
59
61
|
report_relations(plan, await epic_relations.apply_relations(plan.removed, 'drop'))
|
|
60
62
|
|
|
@@ -3,9 +3,8 @@ import { epic_graph, type EpicChild, type GraphAnomaly } from './epic-graph'
|
|
|
3
3
|
|
|
4
4
|
// Turning a classification into the answer a caller acts on.
|
|
5
5
|
//
|
|
6
|
-
// The verdict is what `epicrun`
|
|
7
|
-
// cases are kept apart: waiting, stopping, and being finished are different instructions
|
|
8
|
-
// (joshuafolkken/kit#860).
|
|
6
|
+
// The verdict is what `epicrun` branches on, so the three "nothing to run"
|
|
7
|
+
// cases are kept apart: waiting, stopping, and being finished are different instructions.
|
|
9
8
|
|
|
10
9
|
// What the caller should do next.
|
|
11
10
|
type EpicVerdict = 'run' | 'wait' | 'stop' | 'complete' | 'error'
|
|
@@ -13,17 +12,16 @@ type EpicVerdict = 'run' | 'wait' | 'stop' | 'complete' | 'error'
|
|
|
13
12
|
interface RepoCandidates {
|
|
14
13
|
repo: string
|
|
15
14
|
children: ReadonlyArray<EpicChild>
|
|
16
|
-
// The local checkout a runner would work in, from
|
|
15
|
+
// The local checkout a runner would work in, from the checkout discovery map. Absent when the
|
|
17
16
|
// repository is not checked out here — reported rather than cloned, since creating a working tree
|
|
18
|
-
// nobody asked for is not a step this command takes
|
|
17
|
+
// nobody asked for is not a step this command takes.
|
|
19
18
|
path?: string
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
interface EpicNextResult {
|
|
23
22
|
verdict: EpicVerdict
|
|
24
23
|
// Runnable children bundled per repository. How many of one bundle may start at once is the
|
|
25
|
-
// repository's free-lane count, which `epic-lane-offer.ts` decides and this report does not know
|
|
26
|
-
// (joshuafolkken/kit#1491).
|
|
24
|
+
// repository's free-lane count, which `epic-lane-offer.ts` decides and this report does not know.
|
|
27
25
|
candidates: ReadonlyArray<RepoCandidates>
|
|
28
26
|
waiting: ReadonlyArray<EpicChild>
|
|
29
27
|
blocked_on_people: ReadonlyArray<EpicChild>
|
|
@@ -32,12 +30,12 @@ interface EpicNextResult {
|
|
|
32
30
|
|
|
33
31
|
// Bundle by repository, repositories in name order, so a run is reproducible rather than dependent
|
|
34
32
|
// on the order GitHub happened to list the repositories in. **The children are not re-ordered at
|
|
35
|
-
// all**
|
|
33
|
+
// all** — they keep the order the epic's task list gave them, which is
|
|
36
34
|
// how an epic says which of its runnable children goes first; the reasoning is at `bundle_by_repo`
|
|
37
35
|
// below.
|
|
38
36
|
// The discovery map is keyed lowercase — GitHub resolves owner and repository names
|
|
39
37
|
// case-insensitively — so the lookup lowercases too. Without it any capital in a repository name
|
|
40
|
-
// printed "no local checkout" for a repository that is checked out
|
|
38
|
+
// printed "no local checkout" for a repository that is checked out.
|
|
41
39
|
//
|
|
42
40
|
// `exactOptionalPropertyTypes` rejects `{ path: undefined }`, so the key is added only when there
|
|
43
41
|
// is a path to put in it.
|
|
@@ -63,14 +61,14 @@ function bundle_by_repo(
|
|
|
63
61
|
for (const [repo] of grouped) repos.push(repo)
|
|
64
62
|
|
|
65
63
|
// **The children keep the order they arrived in, which is the order the epic's task list names
|
|
66
|
-
// them
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
64
|
+
// them**. Re-sorting by issue number would assume that number order is split order — true only of
|
|
65
|
+
// an epic whose children were all filed in one split, and false of every epic that grows as work
|
|
66
|
+
// is found: there the number order is *filing* order, and an epic would have no way at all to say
|
|
67
|
+
// which of its runnable children should go first.
|
|
70
68
|
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
//
|
|
69
|
+
// The body order is authoritative end to end: `epic-fetch.ts` → `fetch_children` reads the task
|
|
70
|
+
// list in body order and `epic-classify.ts` fills `runnable` in that order, so a sort here would be
|
|
71
|
+
// the one step discarding it.
|
|
74
72
|
//
|
|
75
73
|
// **The repositories are still sorted by name**, which is a different question — that is grouping,
|
|
76
74
|
// not the order work is offered in.
|
|
@@ -115,7 +113,7 @@ function build_result(
|
|
|
115
113
|
}
|
|
116
114
|
|
|
117
115
|
// Every runnable child of one repository, in the order they would be offered — **the order the
|
|
118
|
-
// epic's own task list names them
|
|
116
|
+
// epic's own task list names them**. It was lowest number first until then,
|
|
119
117
|
// on the premise that number order is split order; an epic that gains children as work is found has
|
|
120
118
|
// no such property, and the epic could not express a priority at all.
|
|
121
119
|
//
|
|
@@ -126,7 +124,7 @@ function build_result(
|
|
|
126
124
|
//
|
|
127
125
|
// The whole bundle rather than only its head, because the confirmation walk needs the rest of it: a
|
|
128
126
|
// candidate whose relations listing disagrees with its summary is withheld and the next one is
|
|
129
|
-
// confirmed in its place
|
|
127
|
+
// confirmed in its place.
|
|
130
128
|
function candidates_for_repo(result: EpicNextResult, repo: string): ReadonlyArray<EpicChild> {
|
|
131
129
|
return result.candidates.find((bundle) => bundle.repo === repo)?.children ?? []
|
|
132
130
|
}
|
|
@@ -138,8 +136,8 @@ function format_bundle_heading(bundle: RepoCandidates): string {
|
|
|
138
136
|
}
|
|
139
137
|
|
|
140
138
|
// A child in another repository is written `owner/repo#N`, not a bare `#N` — a bare number resolves
|
|
141
|
-
// against the reader's own repository and would linkify to the wrong issue there
|
|
142
|
-
//
|
|
139
|
+
// against the reader's own repository and would linkify to the wrong issue there.
|
|
140
|
+
// This reuses the one spelling `epic_graph.format_reference` already gives
|
|
143
141
|
// every other read of a child, rather than a second one here.
|
|
144
142
|
function format_child(child: EpicChild, current_repo: string): string {
|
|
145
143
|
return ` ${epic_graph.format_reference(child, current_repo)}`
|
package/scripts/epic/epic-run.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { EPIC_LABEL } from '#scripts/issue/issue-labels'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
3
4
|
import { epic_body } from './epic-body'
|
|
4
5
|
import { epic_promote } from './epic-promote'
|
|
5
6
|
import { epic_relations } from './epic-relations'
|
|
@@ -128,7 +129,7 @@ async function read_promotion_subject(epic_number: number): Promise<EpicSubject
|
|
|
128
129
|
)
|
|
129
130
|
|
|
130
131
|
if (subject === undefined) {
|
|
131
|
-
console.error(`✖ Could not read issue
|
|
132
|
+
console.error(`✖ Could not read issue ${session_cite.issue(epic_number)}.`)
|
|
132
133
|
|
|
133
134
|
return undefined
|
|
134
135
|
}
|
|
@@ -136,7 +137,7 @@ async function read_promotion_subject(epic_number: number): Promise<EpicSubject
|
|
|
136
137
|
if (epic_promote.has_conflicting_tracking(subject.body)) {
|
|
137
138
|
const reason = epic_promote.conflict_reason(subject.body)
|
|
138
139
|
|
|
139
|
-
console.error(`✖ Cannot promote
|
|
140
|
+
console.error(`✖ Cannot promote ${session_cite.issue(epic_number)}: ${reason}.`)
|
|
140
141
|
|
|
141
142
|
return undefined
|
|
142
143
|
}
|
|
@@ -168,7 +169,7 @@ async function write_promotion(
|
|
|
168
169
|
}
|
|
169
170
|
|
|
170
171
|
console.error(
|
|
171
|
-
`✖ Wrote the epic sections to
|
|
172
|
+
`✖ Wrote the epic sections to ${session_cite.issue(input.epic_number)} but could not apply the \`${EPIC_LABEL}\` label; apply it by hand.`,
|
|
172
173
|
)
|
|
173
174
|
|
|
174
175
|
return FAILURE_EXIT_CODE
|
|
@@ -188,7 +189,7 @@ async function promote_epic(input: PromoteEpicInput): Promise<number> {
|
|
|
188
189
|
const written = await write_promotion(input, subject.body)
|
|
189
190
|
if (written !== SUCCESS_EXIT_CODE) return written
|
|
190
191
|
|
|
191
|
-
console.info(`📋 Promoted
|
|
192
|
+
console.info(`📋 Promoted ${session_cite.issue(input.epic_number)} to an epic.`)
|
|
192
193
|
await apply_dependencies({ children: input.children, is_ordered: input.is_ordered })
|
|
193
194
|
console.info(`▶ Run the children with: ${epic_body.format_run_command(input.epic_number)}`)
|
|
194
195
|
|
|
@@ -200,7 +201,7 @@ async function check_epic(epic_number: number): Promise<number> {
|
|
|
200
201
|
const subject = epic_validate.parse_epic_subject(raw)
|
|
201
202
|
|
|
202
203
|
if (subject === undefined) {
|
|
203
|
-
console.error(`✖ Could not read issue
|
|
204
|
+
console.error(`✖ Could not read issue ${session_cite.issue(epic_number)}.`)
|
|
204
205
|
|
|
205
206
|
return FAILURE_EXIT_CODE
|
|
206
207
|
}
|
|
@@ -6,7 +6,7 @@ import { epic_parse } from './epic-parse'
|
|
|
6
6
|
// declaration is replaced inside it rather than wherever a declaration-shaped line happens to sit.
|
|
7
7
|
// `## Decisions` needs the identical search, and a second copy of it is the clone `CLAUDE.md`
|
|
8
8
|
// prohibits — the fence mask especially, since a heading inside a fenced block is an illustration and
|
|
9
|
-
// a copy that forgot it would append a decision into a quoted template
|
|
9
|
+
// a copy that forgot it would append a decision into a quoted template.
|
|
10
10
|
//
|
|
11
11
|
// Nothing here writes. The two consumers decide what to do with a range; this decides where one is.
|
|
12
12
|
|
|
@@ -65,7 +65,7 @@ function is_section_end(input: BodyLines, index: number, level: number): boolean
|
|
|
65
65
|
// Where the named section runs: the lines after its heading, up to the next heading **of the same or a
|
|
66
66
|
// higher level**. Not "the next heading of any level" — `## Decisions` is written as one `###` entry per
|
|
67
67
|
// decision, the template the epic body documents, so ending at any heading would make the section one
|
|
68
|
-
// line long and place every appended record after its first entry
|
|
68
|
+
// line long and place every appended record after its first entry. A `##`
|
|
69
69
|
// section running to the next `##` is what a reader of the body already takes it to mean.
|
|
70
70
|
//
|
|
71
71
|
// `undefined` is "the body has no such section", which is a different answer from an empty one — the
|
|
@@ -8,7 +8,7 @@ import { to_issue_reference } from './epic-reference'
|
|
|
8
8
|
// label, a task list to place rows in, and a declaration
|
|
9
9
|
// their edit can be relative to. It lives in one module rather than in each of them, because the two
|
|
10
10
|
// commands must refuse the same inputs for the same reasons — a second copy is where one comes to
|
|
11
|
-
// accept an epic the other refuses
|
|
11
|
+
// accept an epic the other refuses.
|
|
12
12
|
|
|
13
13
|
// The part of an epic these refusals read. Narrower than either command's own input on purpose: a
|
|
14
14
|
// shape check that could see the children being placed would invite conditions that belong to the
|
|
@@ -30,7 +30,7 @@ function missing_declaration_error(epic_number: number): string {
|
|
|
30
30
|
// choice between promoting and creating a new epic depends on what the target *is*, which only a
|
|
31
31
|
// reader of it knows (`.claude/skills/workflow-commands/split-assessment.md` → promote-or-create).
|
|
32
32
|
// Naming both arms is what keeps the refusal one command away from being actionable rather than a
|
|
33
|
-
// dead end, which is the whole point of `into <target
|
|
33
|
+
// dead end, which is the whole point of `into <target>`.
|
|
34
34
|
function promote_remedy(epic_number: number): string {
|
|
35
35
|
const promote = `josh epic --promote ${String(epic_number)} <N...>`
|
|
36
36
|
|
|
@@ -41,7 +41,7 @@ function promote_remedy(epic_number: number): string {
|
|
|
41
41
|
// differently: without rows there is nowhere to put a new one, and without a declaration there is
|
|
42
42
|
// nothing for an edit to be relative to.
|
|
43
43
|
//
|
|
44
|
-
// **A child in another repository is not a refusal
|
|
44
|
+
// **A child in another repository is not a refusal**. The declaration names
|
|
45
45
|
// bare numbers only, so neither command can write an order across repositories — such an order lives
|
|
46
46
|
// in the native relations alone (`epic_graph.child_links`), which these edits never read or drop — and
|
|
47
47
|
// the rewrite leaves a row it does not recognize exactly where it stood.
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
2
2
|
import type { OpenIssueData } from '#scripts/git/git-schemas'
|
|
3
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
4
|
import { has_any_label, IN_PROGRESS_LABEL, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
|
|
4
5
|
import { lane_await } from '#scripts/lane/lane-await'
|
|
5
6
|
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
6
7
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
7
8
|
import type { BusyRead } from './epic-busy'
|
|
8
9
|
|
|
9
|
-
// A `run:solo` holder nothing is running for
|
|
10
|
+
// A `run:solo` holder nothing is running for.
|
|
10
11
|
//
|
|
11
12
|
// A running `run:solo` issue lets nothing new start (`epic-solo.ts`), and "running" is read off the
|
|
12
13
|
// `in-progress` label alone. A label nothing removed — a child that parked itself, then had its
|
|
@@ -77,7 +78,7 @@ async function find_stale(
|
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
function stale_message(stale: ReadonlyArray<OpenIssueData>, repo: string): string {
|
|
80
|
-
const named = stale.map((issue) =>
|
|
81
|
+
const named = stale.map((issue) => issue_cite.plain(issue.number)).join(', ')
|
|
81
82
|
|
|
82
83
|
return issue_citation.linkify(
|
|
83
84
|
`${named} carries \`${RUN_SOLO_LABEL}\` and \`${IN_PROGRESS_LABEL}\`, but no process of it is running in ${repo} — the \`${IN_PROGRESS_LABEL}\` label is stale, so it does not hold the backlog. Remove the label once you have confirmed nothing is running it.`,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
1
2
|
import { has_any_label, has_label_name, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
|
|
2
3
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
3
4
|
import { epic_busy, type BusyRead } from './epic-busy'
|
|
4
5
|
import type { EpicChild } from './epic-graph'
|
|
5
6
|
import { epic_report, type EpicNextResult } from './epic-report'
|
|
6
7
|
|
|
7
|
-
// The `run:solo` gate on what a run is offered
|
|
8
|
+
// The `run:solo` gate on what a run is offered.
|
|
8
9
|
//
|
|
9
10
|
// `backlogrun-lanes.md`'s run-alone rule says an issue whose defect reaches the verification path runs
|
|
10
11
|
// alone, and until this gate that was a judgement made at dispatch — the offer handed such an issue
|
|
@@ -16,16 +17,15 @@ import { epic_report, type EpicNextResult } from './epic-report'
|
|
|
16
17
|
// disagree about what may start beside what.
|
|
17
18
|
//
|
|
18
19
|
// Three rules, all against the repository's `in-progress` holders (`epic_busy.read_repository`, with
|
|
19
|
-
// a stale `run:solo` holder taken out by `epic_solo_stale.release`
|
|
20
|
+
// a stale `run:solo` holder taken out by `epic_solo_stale.release`):
|
|
20
21
|
// a running `run:solo` issue lets nothing new start; a `run:solo` candidate starts only into an idle
|
|
21
22
|
// repository and then alone; and nothing ranked below a waiting `run:solo` candidate is offered past
|
|
22
23
|
// it, so it is not starved by the lanes it is waiting on. A listing that could not be read is not an
|
|
23
24
|
// idle repository — the same fail-safe answer `epic_busy` gives.
|
|
24
25
|
//
|
|
25
|
-
// **The label does not move a candidate up the ranking
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
// ranking's question — `issue-rank.ts` puts a verification-path defect at the head — so an idle
|
|
26
|
+
// **The label does not move a candidate up the ranking**. `run:solo` means "runs alone", and tidying
|
|
27
|
+
// that merely touches the verification path carries it as well as a defect that breaks it. Which of
|
|
28
|
+
// them goes first is the ranking's question — `issue-rank.ts` puts a verification-path defect at the head — so an idle
|
|
29
29
|
// repository takes the candidates in rank order like any other.
|
|
30
30
|
|
|
31
31
|
const SOLO_LABELS: ReadonlySet<string> = new Set([RUN_SOLO_LABEL])
|
|
@@ -55,14 +55,14 @@ function solo_holder(read: BusyRead): number | undefined {
|
|
|
55
55
|
|
|
56
56
|
function held_message(holder: number, repo: string): string {
|
|
57
57
|
return issue_citation.linkify(
|
|
58
|
-
|
|
58
|
+
`${issue_cite.plain(holder)} carries \`${RUN_SOLO_LABEL}\` and is running in ${repo}; nothing else starts until it merges or is parked.`,
|
|
59
59
|
repo,
|
|
60
60
|
)
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
function waiting_message(solo: number, repo: string): string {
|
|
64
64
|
return issue_citation.linkify(
|
|
65
|
-
|
|
65
|
+
`${issue_cite.plain(solo)} carries \`${RUN_SOLO_LABEL}\` and waits for ${repo}'s running lanes to finish; nothing ranked below it is offered past it.`,
|
|
66
66
|
repo,
|
|
67
67
|
)
|
|
68
68
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
1
2
|
import { has_label_name, RUN_LANE_LABEL, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
|
|
2
3
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
3
4
|
import type { EpicChild } from './epic-graph'
|
|
4
5
|
|
|
5
|
-
// The triage gate on what a run is offered
|
|
6
|
+
// The triage gate on what a run is offered.
|
|
6
7
|
//
|
|
7
|
-
// `run:solo`
|
|
8
|
+
// `run:solo` records that an issue runs alone, but its absence said nothing:
|
|
8
9
|
// "judged safe beside others" and "never judged" looked the same, and an issue opted in mid-run reached
|
|
9
10
|
// `backlog:drive` without any agent reading it. `run:lane` records the other answer, so an issue with
|
|
10
11
|
// neither label is one nobody has judged — and such an issue may be one that must run alone.
|
|
@@ -21,7 +22,7 @@ type TriageVerdict = 'triage'
|
|
|
21
22
|
const TRIAGE_VERDICT: TriageVerdict = 'triage'
|
|
22
23
|
|
|
23
24
|
// Read off a bare label list too, so `josh issue:file` refuses an untriaged `auto-ok` filing by the
|
|
24
|
-
// same answer the offer paths withhold it by
|
|
25
|
+
// same answer the offer paths withhold it by.
|
|
25
26
|
function has_triage_label(labels: ReadonlyArray<string>): boolean {
|
|
26
27
|
return has_label_name(labels, RUN_SOLO_LABEL) || has_label_name(labels, RUN_LANE_LABEL)
|
|
27
28
|
}
|
|
@@ -37,7 +38,7 @@ function untriaged(children: ReadonlyArray<EpicChild>): ReadonlyArray<EpicChild>
|
|
|
37
38
|
|
|
38
39
|
// Names every untriaged number, so the parent reading standard error knows which issues to judge.
|
|
39
40
|
function message(children: ReadonlyArray<EpicChild>, repo: string): string {
|
|
40
|
-
const numbers = children.map((child) =>
|
|
41
|
+
const numbers = children.map((child) => issue_cite.plain(child.number)).join(', ')
|
|
41
42
|
|
|
42
43
|
return issue_citation.linkify(
|
|
43
44
|
`Untriaged: ${numbers} carry neither \`${RUN_SOLO_LABEL}\` nor \`${RUN_LANE_LABEL}\` in ${repo}, so nothing is offered until each is judged. Read each one, record its blocked-by order and one of the two labels with a comment saying why, then ask again.`,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { epic_subject_schema } from '#scripts/git/git-schemas'
|
|
2
|
-
import {
|
|
2
|
+
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
3
3
|
import { EPIC_LABEL, has_label_name } from '#scripts/issue/issue-labels'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
5
|
import { epic_parse, type DeclarationState } from './epic-parse'
|
|
5
6
|
|
|
6
7
|
// The four requirements an epic has to satisfy are otherwise enforced only by an agent reading the
|
|
@@ -15,7 +16,7 @@ interface EpicSubject {
|
|
|
15
16
|
// The epic's own state, as GitHub returned it (`OPEN` / `CLOSED`, casing unnormalized). Only
|
|
16
17
|
// `epic-add.ts` reads it — to refuse adding a child to a closed epic — so it is optional: a read
|
|
17
18
|
// that came back without the field leaves it undefined, which the refusal treats as "not confirmed
|
|
18
|
-
// closed" rather than blocking
|
|
19
|
+
// closed" rather than blocking.
|
|
19
20
|
state?: string | undefined
|
|
20
21
|
labels: ReadonlyArray<string>
|
|
21
22
|
body: string | undefined
|
|
@@ -29,11 +30,11 @@ interface CheckResult {
|
|
|
29
30
|
|
|
30
31
|
// The `number,labels,body` read's answer, as the shape every epic writer reads. It lives beside
|
|
31
32
|
// the checks because `EpicSubject` is defined here, and each command that wanted one had otherwise
|
|
32
|
-
// to restate the unwrapping
|
|
33
|
+
// to restate the unwrapping.
|
|
33
34
|
function parse_epic_subject(raw_json: string | undefined): EpicSubject | undefined {
|
|
34
35
|
if (raw_json === undefined) return undefined
|
|
35
36
|
|
|
36
|
-
const parsed =
|
|
37
|
+
const parsed = parse_json_object_or_undefined(raw_json, epic_subject_schema)
|
|
37
38
|
if (parsed === undefined) return undefined
|
|
38
39
|
|
|
39
40
|
return {
|
|
@@ -61,7 +62,7 @@ function check_label(subject: EpicSubject): CheckResult {
|
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
function format_children(children: ReadonlyArray<number>): string {
|
|
64
|
-
return children.map((child) =>
|
|
65
|
+
return children.map((child) => session_cite.issue(child)).join(', ')
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
function check_task_list(subject: EpicSubject): CheckResult {
|
|
@@ -138,8 +139,8 @@ function format_check_line(result: CheckResult): string {
|
|
|
138
139
|
function format_check_report(epic_number: number, results: ReadonlyArray<CheckResult>): string {
|
|
139
140
|
const lines = results.map((result) => format_check_line(result))
|
|
140
141
|
const summary = is_epic_valid(results)
|
|
141
|
-
? `✅ Epic
|
|
142
|
-
: `❌ Epic
|
|
142
|
+
? `✅ Epic ${session_cite.issue(epic_number)} satisfies every requirement.`
|
|
143
|
+
: `❌ Epic ${session_cite.issue(epic_number)} does not satisfy every requirement.`
|
|
143
144
|
|
|
144
145
|
return [...lines, '', summary].join('\n')
|
|
145
146
|
}
|
package/scripts/epic/epic.ts
CHANGED
|
@@ -64,7 +64,7 @@ function to_add_input(parsed: AddArguments): AddChildrenInput {
|
|
|
64
64
|
|
|
65
65
|
// A qualified target — `owner/repo#N`. Naming this repository it is the same insertion written
|
|
66
66
|
// longer, so it is performed; naming another it is refused with the command to run there, because
|
|
67
|
-
// this command reads and writes only the repository it runs from
|
|
67
|
+
// this command reads and writes only the repository it runs from.
|
|
68
68
|
async function run_qualified_addition(found: CrossRepoAddTarget): Promise<number> {
|
|
69
69
|
const local = epic_cli.resolve_local_add(found, await git_gh_command.repo_get_name_with_owner())
|
|
70
70
|
|
|
@@ -78,7 +78,7 @@ async function run_qualified_addition(found: CrossRepoAddTarget): Promise<number
|
|
|
78
78
|
// Why an insertion could not be read. A qualified target is answered on its own terms; an unusable
|
|
79
79
|
// `--decision-file` path is named, because the generic line below would send the person after the epic
|
|
80
80
|
// number and the positioning flag when what went missing is the record path a shell expanded to
|
|
81
|
-
// nothing
|
|
81
|
+
// nothing; anything else gets the requirements and the usage line.
|
|
82
82
|
async function refuse_addition(argv: ReadonlyArray<string>): Promise<number> {
|
|
83
83
|
const qualified = epic_cli.find_cross_repo_add_target(argv)
|
|
84
84
|
|
|
@@ -104,7 +104,7 @@ async function refuse_addition(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
104
104
|
//
|
|
105
105
|
// `--decision-file` is the one text an insertion does carry, and it is a *decision* rather than the
|
|
106
106
|
// epic's rationale: it says why this child was placed here, and it goes to the epic's `## Decisions`
|
|
107
|
-
// and to each child
|
|
107
|
+
// and to each child.
|
|
108
108
|
async function run_addition(argv: ReadonlyArray<string>): Promise<number> {
|
|
109
109
|
const parsed = epic_cli.parse_add_arguments(argv)
|
|
110
110
|
|
|
@@ -115,7 +115,7 @@ async function run_addition(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
115
115
|
|
|
116
116
|
// Deleting a declared order. No position and no `--ordered`: the path itself says which orders go,
|
|
117
117
|
// and what is deleted is only ever what it names — the ends are never reconnected, since a removal
|
|
118
|
-
// that wrote an order would be declaring one nobody stated
|
|
118
|
+
// that wrote an order would be declaring one nobody stated.
|
|
119
119
|
async function run_removal(argv: ReadonlyArray<string>): Promise<number> {
|
|
120
120
|
const parsed = epic_cli.parse_remove_arguments(argv)
|
|
121
121
|
|
|
@@ -135,7 +135,7 @@ async function run_removal(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
// Reconcile an epic's declaration with its recorded relations. No decision file and no children: the
|
|
138
|
-
// repair reads what the epic already records rather than being told an order
|
|
138
|
+
// repair reads what the epic already records rather than being told an order.
|
|
139
139
|
async function run_reconciliation(argv: ReadonlyArray<string>): Promise<number> {
|
|
140
140
|
const parsed = epic_cli.parse_reconcile_arguments(argv)
|
|
141
141
|
|
|
@@ -10,7 +10,7 @@ const FAIL_EXIT_CODE = 1
|
|
|
10
10
|
// A consumer's namespaces are read from `.svelte` files and routes a TypeScript program over its
|
|
11
11
|
// `tsconfig.json` does not see, so every member they use would read as unused. The check is kit's own.
|
|
12
12
|
//
|
|
13
|
-
// **Not a skip notice
|
|
13
|
+
// **Not a skip notice**. `SKIP_MARKER` means "a check passed without running",
|
|
14
14
|
// and the gate withholds its green record on it — so a consumer, where this notice prints on every
|
|
15
15
|
// run, never got a green record. Out of scope by design is not unverified, so the marker stays out.
|
|
16
16
|
const CONSUMER_NOTICE = `josh ${CHECK}: checks only the kit repository itself — nothing to check in a consumer project.`
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
// and the run's tail cannot disagree about what "the completed issue" is.
|
|
6
6
|
//
|
|
7
7
|
// It sits in a module of its own because both consumers need it and neither may import the other:
|
|
8
|
-
// the tail reads it to record a run, and the entry point reads it to build one
|
|
9
|
-
// (joshuafolkken/kit#1539).
|
|
8
|
+
// the tail reads it to record a run, and the entry point reads it to build one.
|
|
10
9
|
function parse_issue_number_from_text(input: string | undefined): string | undefined {
|
|
11
10
|
if (input === undefined) return undefined
|
|
12
11
|
const trimmed = input.trim()
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { git_gh_helpers } from '#scripts/gh/git-gh-helpers'
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// behind for the next run to trip over.
|
|
3
|
+
// Everything a run does after its merge is cleanup, and a merge cannot be taken back. As plain
|
|
4
|
+
// sequential statements, whichever step threw first would discard every one after it — and the
|
|
5
|
+
// working-tree hold release is the last of them, so the hold would be left behind for the next run
|
|
6
|
+
// to trip over.
|
|
8
7
|
//
|
|
9
8
|
// **A step is run on its own, and its failure never reaches the next one.** The whole point is that
|
|
10
9
|
// the steps are independent: the completion comment has nothing to do with the hold release, and
|
|
11
|
-
// letting one decide the other is wrong whatever made it fail —
|
|
12
|
-
//
|
|
10
|
+
// letting one decide the other is wrong whatever made it fail — a Telegram rate limit, or a Bad
|
|
11
|
+
// Gateway from GitHub.
|
|
13
12
|
//
|
|
14
13
|
// **Reported, never swallowed.** A cleanup that failed invisibly is a run that lies about what it
|
|
15
14
|
// did, so the failure is printed where the run is being watched, with the command that finishes the
|
|
@@ -7,9 +7,9 @@ import { parse_completed_issue_number } from './followup-issue-number'
|
|
|
7
7
|
import { git_followup_cleanup, type CleanupStep } from './git-followup-cleanup'
|
|
8
8
|
import { git_followup_pending } from './git-followup-pending'
|
|
9
9
|
|
|
10
|
-
// **The count of unreleased merges, not the project version
|
|
11
|
-
//
|
|
12
|
-
//
|
|
10
|
+
// **The count of unreleased merges, not the project version**. The local `package.json` version
|
|
11
|
+
// reads as "the version this run just shipped", but children do not bump, so that number names the
|
|
12
|
+
// *previous* release and the reading is false. The count is
|
|
13
13
|
// the one `pnpm josh release` acts on, and it is printed here for the same reason it goes into the
|
|
14
14
|
// Telegram: a number that keeps climbing is a release nobody has run.
|
|
15
15
|
//
|
|
@@ -45,8 +45,8 @@ async function print_completion(
|
|
|
45
45
|
await print_pending_release()
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
// A **merged** run ends here, and the round-1 review snapshot's lifetime is one run
|
|
49
|
-
//
|
|
48
|
+
// A **merged** run ends here, and the round-1 review snapshot's lifetime is one run.
|
|
49
|
+
// `--no-merge` is not the end of one — the pull request is still open and
|
|
50
50
|
// the issue is still the current task, the same line `print_next_issues` and the epic auto-close
|
|
51
51
|
// already draw — and clearing there would be the unsafe direction: the next round-1 brief would find
|
|
52
52
|
// no record and write a fresh one against the already-fixed tree, which is the arm-A skip over
|
|
@@ -74,8 +74,7 @@ async function clear_review_records(should_merge: boolean): Promise<void> {
|
|
|
74
74
|
await clear_review_target(should_merge)
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
//
|
|
78
|
-
// released here, on the one seam every `fullrun` — and every child of an `epicrun` or a `queue` —
|
|
77
|
+
// The working-tree hold a typed entry point claims before it starts is released here, on the one seam every `fullrun` — and every child of an `epicrun` or a `queue` —
|
|
79
78
|
// passes through, so a finished run never leaves the next one locked out. **Gated on `should_merge`
|
|
80
79
|
// like the epic auto-close and the round-1 snapshot clear**: a `--no-merge` run has not finished, and
|
|
81
80
|
// its tree is still the one nobody else may start in.
|
|
@@ -95,7 +94,7 @@ async function release_worktree_hold(should_merge: boolean): Promise<void> {
|
|
|
95
94
|
}
|
|
96
95
|
}
|
|
97
96
|
|
|
98
|
-
//
|
|
97
|
+
// A `run:progress` watcher outlives the turn that started it and, left alone,
|
|
99
98
|
// waits out its whole bound — up to an hour — after the run it was watching has already merged.
|
|
100
99
|
// Removing its liveness record here, on the same merge seam that releases the working-tree hold, lets
|
|
101
100
|
// the watcher read the record gone on its next tick and stop at once. **Keyed like the hold, on the
|
|
@@ -127,10 +126,9 @@ async function end_progress_watcher(should_merge: boolean): Promise<void> {
|
|
|
127
126
|
}
|
|
128
127
|
}
|
|
129
128
|
|
|
130
|
-
// **The steps are independent, and one of them failing must not discard the rest
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
// working tree locked. The order is still the contract: `print_completion` ends with the
|
|
129
|
+
// **The steps are independent, and one of them failing must not discard the rest**.
|
|
130
|
+
// As bare statements, whichever threw first would end the process — and the hold release is the
|
|
131
|
+
// last of them, so a merged run would leave its working tree locked. The order is still the contract: `print_completion` ends with the
|
|
134
132
|
// unreleased-merge count, the final console line.
|
|
135
133
|
function build_report_steps(
|
|
136
134
|
issue_number: string | undefined,
|
|
@@ -160,7 +158,7 @@ function build_record_steps(should_merge: boolean): ReadonlyArray<CleanupStep> {
|
|
|
160
158
|
{
|
|
161
159
|
label: 'The working-tree hold release',
|
|
162
160
|
// **The forced spelling, because the run that wrote the record is this one and it is
|
|
163
|
-
// ending
|
|
161
|
+
// ending**. A release names the run it belongs to, so a person
|
|
164
162
|
// finishing this step by hand is releasing a record they did not write — the plain form
|
|
165
163
|
// would answer `held` and remove nothing, which is a printed recovery that cannot recover.
|
|
166
164
|
recovery: 'pnpm josh run:release --force',
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { git_command } from '#scripts/git/git-command'
|
|
2
2
|
import { git_spawn } from '#scripts/git/git-spawn'
|
|
3
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
4
|
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
4
5
|
import { observation_ledger_prepare } from '#scripts/observations/observation-ledger-prepare'
|
|
5
6
|
import { observations_flush } from '#scripts/observations/observations-flush'
|
|
6
7
|
|
|
7
|
-
// The residual commit path for the observation ledger
|
|
8
|
-
// ride its own commit
|
|
9
|
-
// short-circuits; what it still catches is a line appended after that commit —
|
|
10
|
-
//
|
|
8
|
+
// The residual commit path for the observation ledger. A run's appended lines
|
|
9
|
+
// ride its own commit, so the ledger is usually clean by now and this
|
|
10
|
+
// short-circuits; what it still catches is a line appended after that commit — an observation
|
|
11
|
+
// recorded between the commit and the merge — which would otherwise stay in the working tree after
|
|
12
|
+
// the merge. **A passing second review round is not one of them**: it used to
|
|
13
|
+
// be the usual case, and its push restarted the pull request's CI on six lanes of fourteen in a day,
|
|
14
|
+
// so `review:record --comment` now records that round on the issue and leaves the tree clean.
|
|
11
15
|
//
|
|
12
|
-
// **It commits onto the pull request's own branch, before the merge
|
|
16
|
+
// **It commits onto the pull request's own branch, before the merge**. It used
|
|
13
17
|
// to flush after the merge from the default branch, which a lane cannot reach, so a lane's lines
|
|
14
18
|
// waited in the primary checkout for a batch-end flush and were lost there to another run's stash.
|
|
15
19
|
// Committed to the branch instead, the lines merge with the pull request — in a lane as anywhere — and
|
|
@@ -20,10 +24,10 @@ const COMMIT_MESSAGE_PREFIX = 'Record observation ledger entries'
|
|
|
20
24
|
function commit_message(issue_number: string | undefined): string {
|
|
21
25
|
return issue_number === undefined
|
|
22
26
|
? COMMIT_MESSAGE_PREFIX
|
|
23
|
-
: `${COMMIT_MESSAGE_PREFIX}
|
|
27
|
+
: `${COMMIT_MESSAGE_PREFIX} ${issue_cite.plain(issue_number)}`
|
|
24
28
|
}
|
|
25
29
|
|
|
26
|
-
// **A broken line refuses the merge rather than riding it
|
|
30
|
+
// **A broken line refuses the merge rather than riding it**: the branch's
|
|
27
31
|
// ledger file goes away with the lane, so a line left behind here is a line lost.
|
|
28
32
|
async function assert_grammar(): Promise<void> {
|
|
29
33
|
const broken = await observation_ledger_prepare.prepare(await git_command.repository_root())
|