@joshuafolkken/kit 1.1240.0 → 1.1373.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +52 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +195 -181
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +282 -95
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +17 -11
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +30 -5
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +21 -7
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +6 -7
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +26 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +64 -18
- package/scripts/run/run-step.ts +107 -51
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -6,7 +6,7 @@ import { lane_cache_run } from '#scripts/lane/lane-cache-run'
|
|
|
6
6
|
import { buffered_process, FAIL_EXIT_CODE } from '#scripts/lib/buffered-process'
|
|
7
7
|
|
|
8
8
|
const ARGV_START = 2
|
|
9
|
-
// `--no-progress` turns off cspell's per-file `N/1607 <path> cached` line
|
|
9
|
+
// `--no-progress` turns off cspell's per-file `N/1607 <path> cached` line.
|
|
10
10
|
// Those lines ran to 1,607 of them — the whole output past the 8,000-character tool cap — so a gate
|
|
11
11
|
// that failed on one unknown word buried the failure under progress and a run could read only the
|
|
12
12
|
// first of several failures. The summary and the issue lines it prints are untouched; only the
|
package/scripts/lint/format.ts
CHANGED
|
@@ -19,8 +19,7 @@ async function run_step(args: ReadonlyArray<string>, directory: string): Promise
|
|
|
19
19
|
|
|
20
20
|
// prettier first, deliberately: `eslint --fix` exits 1 whenever a non-autofixable error remains, so
|
|
21
21
|
// putting it first would mean one unused variable anywhere in the tree stops prettier from running.
|
|
22
|
-
// A basic project without Prettier or ESLint is skipped with the same reason `josh lint` prints
|
|
23
|
-
// (joshuafolkken/kit#2693, joshuafolkken/kit#2606).
|
|
22
|
+
// A basic project without Prettier or ESLint is skipped with the same reason `josh lint` prints.
|
|
24
23
|
async function run_unless_skipped(
|
|
25
24
|
check: string,
|
|
26
25
|
reason: string | undefined,
|
|
@@ -8,22 +8,35 @@ import {
|
|
|
8
8
|
FAIL_EXIT_CODE,
|
|
9
9
|
type BufferedProcessResult,
|
|
10
10
|
} from '#scripts/lib/buffered-process'
|
|
11
|
+
import { cross_file_recheck, type CrossFileRecheckOptions } from './cross-file-recheck'
|
|
11
12
|
|
|
12
13
|
const PRETTIER_ARGS = ['exec', 'prettier', '--check', '.'] as const
|
|
13
14
|
// This — not the `lint:eslint` map entry — is the eslint invocation `josh gate` reaches, so the
|
|
14
|
-
// cache flags come from the same constant the ignore rules are asserted against
|
|
15
|
-
//
|
|
15
|
+
// cache flags come from the same constant the ignore rules are asserted against.
|
|
16
|
+
// A copy here would keep writing the old location the day that constant
|
|
16
17
|
// moves, with every test still green.
|
|
17
|
-
const
|
|
18
|
+
const WHOLE_TREE = '.'
|
|
19
|
+
const ESLINT_ARGS = ['exec', 'eslint', WHOLE_TREE, ...ESLINT_CACHE_FLAGS] as const
|
|
20
|
+
const WHOLE_TREE_RECHECK: CrossFileRecheckOptions = {
|
|
21
|
+
cache_file: ESLINT_CACHE_FILE,
|
|
22
|
+
patterns: [WHOLE_TREE],
|
|
23
|
+
}
|
|
18
24
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
// What one eslint run is made of: the child's arguments, and what re-reading a cached cross-file report
|
|
26
|
+
// (`cross-file-recheck.ts`) needs to ask the same question again — the cache file and the targets.
|
|
27
|
+
interface EslintRun {
|
|
28
|
+
args: ReadonlyArray<string>
|
|
29
|
+
recheck: CrossFileRecheckOptions
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// The finished report is re-read before it is returned, inside the lane's cache sharing, because
|
|
33
|
+
// the re-reading uses that same cache file.
|
|
34
|
+
async function run_eslint(eslint: EslintRun): Promise<BufferedProcessResult> {
|
|
35
|
+
return await lane_cache_run.run(eslint.recheck.cache_file, async () => {
|
|
36
|
+
const result = await buffered_process.run_buffered_process(eslint.args)
|
|
37
|
+
|
|
38
|
+
return await cross_file_recheck.verify(result, eslint.recheck)
|
|
39
|
+
})
|
|
27
40
|
}
|
|
28
41
|
|
|
29
42
|
function write_output(result: BufferedProcessResult): void {
|
|
@@ -46,13 +59,12 @@ async function run_prettier(
|
|
|
46
59
|
|
|
47
60
|
async function run_checked_eslint(
|
|
48
61
|
directory: string,
|
|
49
|
-
|
|
50
|
-
cache_file: string,
|
|
62
|
+
eslint: EslintRun,
|
|
51
63
|
): Promise<BufferedProcessResult> {
|
|
52
64
|
const reason = project_checks.eslint_skip_reason(directory)
|
|
53
65
|
if (reason !== undefined) return skipped('eslint', reason)
|
|
54
66
|
|
|
55
|
-
return await run_eslint(
|
|
67
|
+
return await run_eslint(eslint)
|
|
56
68
|
}
|
|
57
69
|
|
|
58
70
|
function lint_exit_code(prettier: BufferedProcessResult, eslint: BufferedProcessResult): number {
|
|
@@ -63,19 +75,23 @@ function lint_exit_code(prettier: BufferedProcessResult, eslint: BufferedProcess
|
|
|
63
75
|
|
|
64
76
|
// The two checks are run from here whether they were pointed at the whole tree or at one change's
|
|
65
77
|
// files, so `josh lint:related` reaches prettier and eslint through the same buffering, the same
|
|
66
|
-
// "one failure does not abort the other" reading, and the same exit code
|
|
78
|
+
// "one failure does not abort the other" reading, and the same exit code —
|
|
67
79
|
// and through the same basic-project skip, so a narrowed run never reaches a tool the whole-tree
|
|
68
|
-
// run would have skipped
|
|
80
|
+
// run would have skipped. The skip reasons answer nothing for a full
|
|
69
81
|
// project, so the one path serves both profiles.
|
|
82
|
+
//
|
|
83
|
+
// A narrowed run re-reads a cached cross-file report too (`cross-file-recheck.ts`): one change's
|
|
84
|
+
// files can hold both the reported file and the one it reads, and fixing the second leaves the
|
|
85
|
+
// first's cached report standing.
|
|
70
86
|
async function run_lint_checks(
|
|
71
87
|
prettier_args: ReadonlyArray<string>,
|
|
72
88
|
eslint_args: ReadonlyArray<string>,
|
|
73
|
-
|
|
89
|
+
recheck: CrossFileRecheckOptions,
|
|
74
90
|
): Promise<number> {
|
|
75
91
|
const directory = process.cwd()
|
|
76
92
|
const [prettier, eslint] = await Promise.all([
|
|
77
93
|
run_prettier(directory, prettier_args),
|
|
78
|
-
run_checked_eslint(directory, eslint_args,
|
|
94
|
+
run_checked_eslint(directory, { args: eslint_args, recheck }),
|
|
79
95
|
])
|
|
80
96
|
|
|
81
97
|
write_output(prettier)
|
|
@@ -85,7 +101,7 @@ async function run_lint_checks(
|
|
|
85
101
|
}
|
|
86
102
|
|
|
87
103
|
async function run_lint_parallel_checks(): Promise<number> {
|
|
88
|
-
return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS)
|
|
104
|
+
return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS, WHOLE_TREE_RECHECK)
|
|
89
105
|
}
|
|
90
106
|
|
|
91
107
|
// `process.exitCode` rather than `process.exit()`: both reports are buffered and written here in
|
|
@@ -5,12 +5,14 @@ import {
|
|
|
5
5
|
type ScopeInputs,
|
|
6
6
|
type ScopeVocabulary,
|
|
7
7
|
} from '#scripts/git/changed-file-scope'
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
ESLINT_RELATED_CACHE_FILE,
|
|
10
|
+
ESLINT_RELATED_CACHE_FLAGS,
|
|
11
|
+
} from '#scripts/josh/josh-command-types'
|
|
12
|
+
import type { CrossFileRecheckOptions } from './cross-file-recheck'
|
|
9
13
|
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// `pnpm josh time`, that came to 47–188 seconds per run — 18% of #1292's 1,043-second
|
|
13
|
-
// implementation phase, spent re-reading files the change never touched.
|
|
14
|
+
// `josh lint` reads the whole repository on every call, and an implementation loop calls it after
|
|
15
|
+
// every few edits — re-reading files the change never touched.
|
|
14
16
|
//
|
|
15
17
|
// **This narrowing is added in front of the whole check, never in place of it.** `josh gate` still
|
|
16
18
|
// runs `josh lint` over everything before the commit: a formatting rule can be broken by a file the
|
|
@@ -96,17 +98,14 @@ function prettier_arguments(files: ReadonlyArray<string>): ReadonlyArray<string>
|
|
|
96
98
|
return [...PRETTIER_ARGS, ...files]
|
|
97
99
|
}
|
|
98
100
|
|
|
99
|
-
// The cache file is this command's own rather than the gate's, because the two run at the same time
|
|
100
|
-
//
|
|
101
|
+
// The cache file is this command's own rather than the gate's, because the two run at the same time.
|
|
102
|
+
// `josh gate` lints the whole tree beside the review while an
|
|
101
103
|
// implementation loop calls this command between edits, and each eslint run rewrites its cache file
|
|
102
|
-
// whole from the copy it loaded at start-up — so on one file the run that finished last
|
|
103
|
-
// the other's entries, and a narrowed run finishing during a whole-tree run
|
|
104
|
-
// its pre-gate state.
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
// sharing let a narrowed run warm the gate's cache, since eslint leaves the entries a run did not
|
|
108
|
-
// visit alone; that holds for pruning and says nothing about two writers. It is the same judgement
|
|
109
|
-
// joshuafolkken/kit#1332 made for the edit hook, applied to the second place it was needed.
|
|
104
|
+
// whole from the copy it loaded at start-up — so on one file the run that finished last would
|
|
105
|
+
// discard the other's entries, and a narrowed run finishing during a whole-tree run would roll the
|
|
106
|
+
// cache back to its pre-gate state. Sharing would let a narrowed run warm the gate's cache only for
|
|
107
|
+
// pruning, which says nothing about two writers. It is the same judgement the edit hook's own cache
|
|
108
|
+
// file makes.
|
|
110
109
|
//
|
|
111
110
|
// **What is narrowed is still only the target list, never the gate.** `josh gate` runs `josh lint`
|
|
112
111
|
// over the whole tree before any commit; this file decides which files a repeat call reads.
|
|
@@ -114,8 +113,19 @@ function eslint_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
|
114
113
|
return [...ESLINT_ARGS, ...files, ...ESLINT_RELATED_CACHE_FLAGS, ...ESLINT_SCOPED_FLAGS]
|
|
115
114
|
}
|
|
116
115
|
|
|
116
|
+
// What re-reading a cached cross-file report (`cross-file-recheck.ts`) needs to ask the narrowed run's question
|
|
117
|
+
// again: the same targets, the same cache file, and the Node API's spelling of `--no-warn-ignored`.
|
|
118
|
+
function cross_file_recheck_options(files: ReadonlyArray<string>): CrossFileRecheckOptions {
|
|
119
|
+
return {
|
|
120
|
+
cache_file: ESLINT_RELATED_CACHE_FILE,
|
|
121
|
+
patterns: files,
|
|
122
|
+
eslint_options: { warnIgnored: false },
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
117
126
|
const lint_related_scope = {
|
|
118
127
|
COMMAND_LABEL,
|
|
128
|
+
cross_file_recheck_options,
|
|
119
129
|
NOTHING_LINTABLE_REASON,
|
|
120
130
|
describe_scope,
|
|
121
131
|
eslint_arguments,
|
|
@@ -4,13 +4,12 @@ import { fileURLToPath } from 'node:url'
|
|
|
4
4
|
import { document_byte_check } from '#scripts/document/document-byte-check'
|
|
5
5
|
import { scoped_green } from '#scripts/gate/scoped-green'
|
|
6
6
|
import { changed_file_scope, type ChangedFileScope } from '#scripts/git/changed-file-scope'
|
|
7
|
-
import { ESLINT_RELATED_CACHE_FILE } from '#scripts/josh/josh-command-types'
|
|
8
7
|
import { review_stamps } from '#scripts/review/review-stamps'
|
|
9
8
|
import { lint_parallel } from './lint-parallel'
|
|
10
9
|
import { lint_related_scope } from './lint-related-scope'
|
|
11
10
|
|
|
12
|
-
// `josh lint:related` — the lint check an implementation loop runs between edits
|
|
13
|
-
//
|
|
11
|
+
// `josh lint:related` — the lint check an implementation loop runs between edits.
|
|
12
|
+
// The narrowing itself is `lint-related-scope.ts` over the shared
|
|
14
13
|
// decision in `changed-file-scope.ts`; this is the process around it — how the run reaches the same
|
|
15
14
|
// two child processes `josh lint` runs.
|
|
16
15
|
|
|
@@ -37,20 +36,20 @@ async function lint_exit_code(scope: ChangedFileScope): Promise<number> {
|
|
|
37
36
|
return await lint_parallel.run_lint_checks(
|
|
38
37
|
lint_related_scope.prettier_arguments(scope.files),
|
|
39
38
|
lint_related_scope.eslint_arguments(scope.files),
|
|
40
|
-
|
|
39
|
+
lint_related_scope.cross_file_recheck_options(scope.files),
|
|
41
40
|
)
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
// The byte check over the same scope the lint just ran: the resolved file list when narrowed, and
|
|
45
44
|
// the whole budget when lint fell back to the whole tree — so the byte check is a superset in the
|
|
46
|
-
// fallback exactly as lint is, never an empty list that would pass silently
|
|
45
|
+
// fallback exactly as lint is, never an empty list that would pass silently.
|
|
47
46
|
function byte_check_exit_code(scope: ChangedFileScope, root: string): number {
|
|
48
47
|
if (scope.mode === 'all') return document_byte_check.check_all(root)
|
|
49
48
|
|
|
50
49
|
return document_byte_check.check_files(root, scope.files)
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
// The lint result folded together with the fast byte-ceiling check
|
|
52
|
+
// The lint result folded together with the fast byte-ceiling check: the
|
|
54
53
|
// same check the gate's `document-byte-budget.test.ts` runs, brought forward to this between-edits
|
|
55
54
|
// path so a mandated documentation update over its ceiling surfaces in seconds. It reads no change
|
|
56
55
|
// of its own — it takes the files this run already resolved, so the git contract is the lint
|
|
@@ -68,7 +67,7 @@ async function scoped_exit_code(scope: ChangedFileScope, root: string): Promise<
|
|
|
68
67
|
// whole one, and a fallback says which of the two it was rather than looking like a narrow run
|
|
69
68
|
// that found nothing.
|
|
70
69
|
//
|
|
71
|
-
// **A green run leaves a record of the tree it was green on
|
|
70
|
+
// **A green run leaves a record of the tree it was green on**, so
|
|
72
71
|
// `josh review:brief` can tell a tree this check has read from one it has not. What the record means,
|
|
73
72
|
// and the three states in which it is withheld, are `scoped-green.ts`.
|
|
74
73
|
async function run_related_lint(command_arguments: ReadonlyArray<string>): Promise<number> {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// The public surface a downstream distribution package imports to stamp the workflows it writes.
|
|
2
2
|
// Exported rather than left internal because the alternative is every distributor re-implementing
|
|
3
3
|
// the header, and a second implementation that spells the token differently or stacks a duplicate
|
|
4
|
-
// silently breaks the check that reads it
|
|
4
|
+
// silently breaks the check that reads it.
|
|
5
5
|
export { managed_marker_logic } from './managed-marker-logic'
|
|
@@ -4,8 +4,7 @@ import { is_workflow_destination } from '#scripts/claude/workflow-destination'
|
|
|
4
4
|
// answer has to survive being copied on: a consumer of a consumer receives `ci.yml` from kit and
|
|
5
5
|
// `dast.yml` from app-kit, and neither distributor knows what the other manages. So the answer is
|
|
6
6
|
// written into the artifact rather than kept in a list beside it — every distributor stamps its own
|
|
7
|
-
// output, and the auto-merge workflow reads the stamp off the very file it is asking about
|
|
8
|
-
// (joshuafolkken/kit#844).
|
|
7
|
+
// output, and the auto-merge workflow reads the stamp off the very file it is asking about.
|
|
9
8
|
//
|
|
10
9
|
// A list cannot reach that far. kit's write time is the only moment kit controls, and at that moment
|
|
11
10
|
// it knows nothing of what app-kit distributes; whichever sync ran last would decide the list, and
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
|
|
1
3
|
type NotifyTarget = 'pr' | 'issue' | 'both'
|
|
2
4
|
|
|
3
5
|
interface GitNotifyConfig {
|
|
@@ -35,14 +37,13 @@ function parse_notify_mentions(raw_mentions: string | undefined): Array<string>
|
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
// The `\n` escape the inline `--notify-message` form needs is expanded by `cli_body` at the point the
|
|
38
|
-
// flag is read, not here
|
|
40
|
+
// flag is read, not here. Expanding again would rewrite a literal backslash-n
|
|
39
41
|
// that `--notify-message-file` legitimately carries — a file already holds real newlines, so an
|
|
40
42
|
// escape sequence in one is the author's text rather than a quoting workaround.
|
|
41
43
|
//
|
|
42
|
-
// **Trimming
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
// produced. `trim` survives only as the emptiness test, where the whitespace is being counted rather
|
|
44
|
+
// **Trimming happens with the expansion, and for the same reason.** Trimming here, after the
|
|
45
|
+
// expansion, would make `--notify-message "…\n"` lose the newline its own escape had just produced.
|
|
46
|
+
// `trim` survives only as the emptiness test, where the whitespace is being counted rather
|
|
46
47
|
// than removed.
|
|
47
48
|
function resolve_notify_message(raw_message: string | undefined): string {
|
|
48
49
|
if (raw_message === undefined || raw_message.trim().length === 0) return DEFAULT_NOTIFY_MESSAGE
|
|
@@ -66,7 +67,7 @@ function build_notify_config(input: {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
// **`notes` is what the run has to say about itself beyond the message it was handed**, and today
|
|
69
|
-
// that is the managed config-file report
|
|
70
|
+
// that is the managed config-file report. It is a separate field rather than
|
|
70
71
|
// text folded into `message`, because the message is the person's own completion summary and the
|
|
71
72
|
// notes are the command's — folding them together would leave a caller unable to tell which half it
|
|
72
73
|
// wrote. **A run with nothing to note adds no line at all**, blank separator included, so the
|
|
@@ -87,7 +88,8 @@ function build_completion_comment_body(input: {
|
|
|
87
88
|
notes?: ReadonlyArray<string>
|
|
88
89
|
}): string {
|
|
89
90
|
const base_lines = [`✅ ${input.message}`]
|
|
90
|
-
const issue_lines =
|
|
91
|
+
const issue_lines =
|
|
92
|
+
input.issue_number === undefined ? [] : [`Issue: ${issue_cite.plain(input.issue_number)}`]
|
|
91
93
|
const pr_lines = input.pr_url === undefined ? [] : [`PR: ${input.pr_url}`]
|
|
92
94
|
const note_lines = note_section(input.notes)
|
|
93
95
|
const mention_lines = input.mentions.length === 0 ? [] : ['', input.mentions.join(' ')]
|
|
@@ -13,16 +13,16 @@ const telegram_environment_schema = z.object({
|
|
|
13
13
|
telegram_chat_id: z.string().min(1, { message: 'TELEGRAM_CHAT_ID is required' }),
|
|
14
14
|
})
|
|
15
15
|
|
|
16
|
-
// **`warning` is not `failure
|
|
16
|
+
// **`warning` is not `failure`**. It names a run that finished and merged,
|
|
17
17
|
// alongside something that did not work — a post-merge cleanup step that could not complete is one.
|
|
18
18
|
// Sending `failure` (❌) there would say the merge failed, which is false and is
|
|
19
19
|
// the more expensive lie of the two; sending `completion` (✅) twice says nothing went wrong, which
|
|
20
20
|
// is the silence this type exists to end.
|
|
21
|
-
// **`stalled` is not `warning
|
|
21
|
+
// **`stalled` is not `warning`**. `warning` names a run that *finished* and
|
|
22
22
|
// merged alongside something that did not work; a stall is the opposite — the run is alive and has not
|
|
23
23
|
// finished, it has simply stopped advancing while ready work waits for a free lane. The ⏳ icon says
|
|
24
24
|
// exactly that: not done, not broken, just not moving.
|
|
25
|
-
// **`stranded` is not `stalled
|
|
25
|
+
// **`stranded` is not `stalled`**. A stall is a *live* run that is not
|
|
26
26
|
// dispatching; a strand is the step before it — the run's own driver is gone. The session that cut the
|
|
27
27
|
// budget handed it off and died, no successor claimed it, and no supervisor is watching, so nothing can
|
|
28
28
|
// take the next step at all. The 🚨 icon says a run needs a hand, not that ready work is merely waiting.
|
|
@@ -35,6 +35,7 @@ type TelegramTaskType =
|
|
|
35
35
|
| 'confirmation'
|
|
36
36
|
| 'stalled'
|
|
37
37
|
| 'stranded'
|
|
38
|
+
| 'progress'
|
|
38
39
|
|
|
39
40
|
interface TelegramSendInput {
|
|
40
41
|
task_type: TelegramTaskType
|
|
@@ -64,6 +65,7 @@ const TASK_DEFINITIONS: Record<TelegramTaskType, TaskDefinition> = {
|
|
|
64
65
|
confirmation: { icon: '⏸️', label: 'Confirmation required' },
|
|
65
66
|
stalled: { icon: '⏳', label: 'Ready work is sitting undispatched' },
|
|
66
67
|
stranded: { icon: '🚨', label: 'Run stranded — nobody is driving it' },
|
|
68
|
+
progress: { icon: '📊', label: 'Progress' },
|
|
67
69
|
}
|
|
68
70
|
|
|
69
71
|
const NOTIFY_SWITCH_KEY = 'JOSH_NOTIFY'
|
|
@@ -82,9 +84,8 @@ function parse_environment_string(value: string | undefined): string {
|
|
|
82
84
|
// so it would pull a subprocess concern into an HTTP one and degrade to exactly this line anyway.
|
|
83
85
|
// **The `cause` is read, not only the message.** A `fetch` rejection's own message is the bare string
|
|
84
86
|
// `fetch failed`; what says whether this was DNS, a refused connection or a timeout lives one level
|
|
85
|
-
// down. Reporting the top line alone would exit non-zero with nothing a reader can act on
|
|
86
|
-
//
|
|
87
|
-
// deeper line is covered exactly as the top one is.
|
|
87
|
+
// down. Reporting the top line alone would exit non-zero with nothing a reader can act on.
|
|
88
|
+
// Redaction runs over the joined text, so the deeper line is covered exactly as the top one is.
|
|
88
89
|
function join_cause(error: Error): string {
|
|
89
90
|
const { cause } = error
|
|
90
91
|
|
|
@@ -114,17 +115,14 @@ function describe_symptom(error: unknown): string {
|
|
|
114
115
|
|
|
115
116
|
// The request URL carries the bot token in its own path, so an error raised anywhere near the
|
|
116
117
|
// request can carry a credential into a log. Both values are taken out of the text before it leaves
|
|
117
|
-
// this module, so no caller has to remember to do it
|
|
118
|
+
// this module, so no caller has to remember to do it.
|
|
118
119
|
function redact_credentials(text: string, config: TelegramConfig): string {
|
|
119
120
|
return text.split(config.bot_token).join(REDACTED).split(config.chat_id).join(REDACTED)
|
|
120
121
|
}
|
|
121
122
|
|
|
122
|
-
// **Missing credentials are a failure, not a skip
|
|
123
|
-
//
|
|
124
|
-
//
|
|
125
|
-
// `--env-file=.env` flag on `josh notify` and `josh followup` made a machine without that file die
|
|
126
|
-
// before node started, which was loud by accident; with the flag relaxed to the optional form, this
|
|
127
|
-
// is where the noise has to come from instead.
|
|
123
|
+
// **Missing credentials are a failure, not a skip**: a run with no credentials that returned quietly
|
|
124
|
+
// would be indistinguishable from one whose notification arrived. `josh notify` and `josh followup`
|
|
125
|
+
// load `.env` only optionally, so this is where the noise has to come from.
|
|
128
126
|
//
|
|
129
127
|
// The message names the variables and never their values — the schema's own messages are the
|
|
130
128
|
// variable names, so nothing read out of the environment reaches it.
|
|
@@ -143,10 +141,10 @@ function load_config(): TelegramConfig {
|
|
|
143
141
|
return { bot_token: result.data.telegram_bot_token, chat_id: result.data.telegram_chat_id }
|
|
144
142
|
}
|
|
145
143
|
|
|
146
|
-
// **An explicit opt-out is not a missing credential
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
144
|
+
// **An explicit opt-out is not a missing credential**: a consumer who never means to use Telegram
|
|
145
|
+
// says so, rather than seeing the missing-credential failure on every stop. Only the stated value
|
|
146
|
+
// `off` disables the send: an unset or mistyped switch still falls through to `load_config`, so a
|
|
147
|
+
// forgotten setup stays a loud failure.
|
|
150
148
|
function is_notify_disabled(): boolean {
|
|
151
149
|
return parse_environment_string(process.env[NOTIFY_SWITCH_KEY]).toLowerCase() === NOTIFY_OFF_VALUE
|
|
152
150
|
}
|
|
@@ -204,10 +202,9 @@ function head_of(body: string, kept: number): string {
|
|
|
204
202
|
return TRAILING_HIGH_SURROGATE.test(head) ? head.slice(0, -1) : head
|
|
205
203
|
}
|
|
206
204
|
|
|
207
|
-
// **The body is cut to fit Telegram's length limit, keeping its head
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
// header and the URLs around the body survive.
|
|
205
|
+
// **The body is cut to fit Telegram's length limit, keeping its head**: a text past the limit is
|
|
206
|
+
// refused with `400 Bad Request` and reaches nobody. A caller puts the cause first, so the tail is
|
|
207
|
+
// what is dropped, and the header and the URLs around the body survive.
|
|
211
208
|
function build_text(input: TelegramSendInput): string {
|
|
212
209
|
const text = join_blocks(input)
|
|
213
210
|
const overflow = text.length - TELEGRAM_TEXT_LIMIT
|
|
@@ -230,7 +227,7 @@ async function post_message(config: TelegramConfig, text: string): Promise<void>
|
|
|
230
227
|
}
|
|
231
228
|
}
|
|
232
229
|
|
|
233
|
-
// **The cause is re-wrapped rather than passed through
|
|
230
|
+
// **The cause is re-wrapped rather than passed through**. The chain is kept,
|
|
234
231
|
// because a symptom error that drops its cause loses where the failure came from — but the original
|
|
235
232
|
// is the one object on this path nothing has redacted, and `git_error.handle` prints a cause's own
|
|
236
233
|
// message straight to the console. Both layers therefore carry the same already-redacted text.
|
|
@@ -241,9 +238,8 @@ function build_send_failure(error: unknown, config: TelegramConfig): Error {
|
|
|
241
238
|
}
|
|
242
239
|
|
|
243
240
|
// **The strict form.** A caller whose whole job is the notification has nothing left to report when
|
|
244
|
-
// this fails, so it throws and `pnpm josh notify` exits non-zero
|
|
245
|
-
//
|
|
246
|
-
// warning and exiting 0, so a message that reached nobody looked exactly like one that arrived.
|
|
241
|
+
// this fails, so it throws and `pnpm josh notify` exits non-zero — a warning and exit 0 would make a
|
|
242
|
+
// message that reached nobody look exactly like one that arrived.
|
|
247
243
|
//
|
|
248
244
|
// The failure it throws carries a `cause`, and that cause is redacted too — see `build_send_failure`.
|
|
249
245
|
//
|
|
@@ -272,13 +268,12 @@ async function send(input: TelegramSendInput): Promise<void> {
|
|
|
272
268
|
|
|
273
269
|
// **The tolerant form**, for a caller whose job is something other than the notification.
|
|
274
270
|
// `followup` sends the completion message on its way to the merge, and a gateway timeout at
|
|
275
|
-
// Telegram is not a reason to leave a reviewed, green pull request unmerged
|
|
276
|
-
//
|
|
277
|
-
// carries on.
|
|
271
|
+
// Telegram is not a reason to leave a reviewed, green pull request unmerged. So the failure is
|
|
272
|
+
// reported and the run carries on.
|
|
278
273
|
//
|
|
279
274
|
// **Reported under `❗` on stderr, in its own block, with the caller's own recovery line** — the bar
|
|
280
|
-
//
|
|
281
|
-
//
|
|
275
|
+
// for a step that failed and was not allowed to end the run. A `⚠️` is what every routine notice
|
|
276
|
+
// prints, so the failure would be buried under one.
|
|
282
277
|
//
|
|
283
278
|
// `recovery` is the caller's because only the caller knows one. It is `string | undefined` and not
|
|
284
279
|
// optional for the reason `CleanupStep.recovery` is: a caller with no command that finishes the job
|
|
@@ -326,7 +321,7 @@ interface WarningInput {
|
|
|
326
321
|
/**
|
|
327
322
|
* Warn that something an unattended run depended on did not work.
|
|
328
323
|
*
|
|
329
|
-
* **One function rather than one per caller
|
|
324
|
+
* **One function rather than one per caller**. Every warning fills in the
|
|
330
325
|
* same four fields the same way — the task type, the repository looked up under the same bound, and
|
|
331
326
|
* two urls that are never known here — so a second caller composing its own would be free to drift
|
|
332
327
|
* on the one field that is not obvious: a repository lookup with no timeout hangs the warning behind
|
|
@@ -354,8 +349,7 @@ interface ConfirmInput {
|
|
|
354
349
|
|
|
355
350
|
/**
|
|
356
351
|
* Push the ⏸️ confirmation type — a state change an unattended run made that a person now has to act
|
|
357
|
-
* on, a `backlogrun` that stopped needing a decision being the one this was written for
|
|
358
|
-
* (joshuafolkken/kit#2136).
|
|
352
|
+
* on, a `backlogrun` that stopped needing a decision being the one this was written for.
|
|
359
353
|
*
|
|
360
354
|
* **One function rather than one per caller, for `warn`'s reason exactly**: the repository lookup
|
|
361
355
|
* under a timeout is the field a second caller composing the four itself would drift on, and a lookup
|
|
@@ -384,8 +378,8 @@ interface StalledInput {
|
|
|
384
378
|
}
|
|
385
379
|
|
|
386
380
|
/**
|
|
387
|
-
* Push the ⏳ stalled type — ready backlog work with a free lane that nothing has dispatched for a while
|
|
388
|
-
*
|
|
381
|
+
* Push the ⏳ stalled type — ready backlog work with a free lane that nothing has dispatched for a while.
|
|
382
|
+
* Off-screen is the whole point: the state is invisible on the terminal until
|
|
389
383
|
* a person asks, so it reaches them where they are not watching.
|
|
390
384
|
*
|
|
391
385
|
* **`warn`'s shape exactly** — the repository looked up under the shared bound, the tolerant
|
|
@@ -413,8 +407,8 @@ interface StrandedInput {
|
|
|
413
407
|
}
|
|
414
408
|
|
|
415
409
|
/**
|
|
416
|
-
* Push the 🚨 stranded type — a run whose driver is gone and which nothing can advance
|
|
417
|
-
*
|
|
410
|
+
* Push the 🚨 stranded type — a run whose driver is gone and which nothing can advance.
|
|
411
|
+
* Off-screen is the whole point, as it is for `stalled`: the state is
|
|
418
412
|
* invisible on the terminal because the session that would show it has died, so the person hears about
|
|
419
413
|
* it where they are not watching, rather than by asking.
|
|
420
414
|
*
|
|
@@ -437,8 +431,30 @@ async function stranded(input: StrandedInput): Promise<boolean> {
|
|
|
437
431
|
)
|
|
438
432
|
}
|
|
439
433
|
|
|
434
|
+
/**
|
|
435
|
+
* Push the 📊 progress type — one `run:board` frame a person asked to receive periodically off-screen
|
|
436
|
+
* with `run:board --every`. Never a heartbeat: nothing sends it unasked.
|
|
437
|
+
*
|
|
438
|
+
* **`stranded`'s shape exactly**, with the board's own one-frame answer as the recovery — a frame lost
|
|
439
|
+
* to a Telegram timeout is read again by asking for it.
|
|
440
|
+
*/
|
|
441
|
+
async function progress(body: string): Promise<boolean> {
|
|
442
|
+
return await send_or_report(
|
|
443
|
+
{
|
|
444
|
+
task_type: 'progress',
|
|
445
|
+
repo_name: gh_spawn.get_repo_name_with_owner_within(REPO_LOOKUP_TIMEOUT_MS),
|
|
446
|
+
issue_title: undefined,
|
|
447
|
+
body,
|
|
448
|
+
issue_url: undefined,
|
|
449
|
+
pr_url: undefined,
|
|
450
|
+
},
|
|
451
|
+
'pnpm josh run:board --chat',
|
|
452
|
+
)
|
|
453
|
+
}
|
|
454
|
+
|
|
440
455
|
const telegram_notify = {
|
|
441
456
|
confirm,
|
|
457
|
+
progress,
|
|
442
458
|
send,
|
|
443
459
|
send_or_report,
|
|
444
460
|
stalled,
|
|
@@ -44,7 +44,7 @@ function parse_task_type(raw: string | undefined): TelegramTaskType {
|
|
|
44
44
|
|
|
45
45
|
// A flag counts as given only when it carries text, so `--issue-title ''` is not an answer. The
|
|
46
46
|
// callers that *skip* a lookup because the flag already answered it read the same predicate, or the
|
|
47
|
-
// two could disagree about an empty string and leave the field blank
|
|
47
|
+
// two could disagree about an empty string and leave the field blank.
|
|
48
48
|
// It is `cli_body`'s predicate rather than a second copy: the body flags are resolved there, and two
|
|
49
49
|
// definitions of "given" would let `--body ''` count on one side and not the other.
|
|
50
50
|
const has_flag_value = cli_body.has_value
|
|
@@ -56,8 +56,8 @@ function coalesce(primary: string | undefined, fallback: string | undefined): st
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
// `--body-file` is the form to reach for whenever the body carries a backtick or a `$`: inside shell
|
|
59
|
-
// double quotes those are evaluated before this process starts, and the text runs
|
|
60
|
-
//
|
|
59
|
+
// double quotes those are evaluated before this process starts, and the text runs.
|
|
60
|
+
// The resolution itself is `cli_body`'s, shared with `josh followup`.
|
|
61
61
|
function normalize_body(values: CliValues): string | undefined {
|
|
62
62
|
return cli_body.resolve({
|
|
63
63
|
inline: values.body,
|