@joshuafolkken/kit 1.1050.0 → 1.1128.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/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/workflow-commands/SKILL.md +20 -12
- package/.claude/skills/workflow-commands/background-commands.md +36 -84
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
- package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +1 -1
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +8 -6
- package/.claude/skills/workflow-commands/halfrun.md +19 -21
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +8 -16
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +3 -3
- package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +4 -18
- package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-node/action.yml +33 -0
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +2 -3
- package/.github/workflows/ci.yml +31 -134
- package/.github/workflows/dependabot-auto-merge.yml +1 -0
- package/.github/workflows/pr-classification.yml +6 -44
- package/.github/workflows/production.yml +1 -0
- package/.github/workflows/publish.yml +43 -47
- package/.github/workflows/sonar-qube.yml +41 -4
- package/.pnpmfile.mjs +29 -0
- package/AGENTS.md +5 -2
- package/CLAUDE.md +33 -27
- package/GEMINI.md +5 -2
- package/README.md +66 -20
- package/SECURITY.md +37 -6
- package/cspell/index.yaml +6 -1
- package/dist/CLAUDE.basic.md +6 -6
- package/dist/CLAUDE.md +33 -27
- package/dist/CLAUDE.static.md +6 -6
- package/dist/config-merge/index.js +48 -12
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
- package/dist/hooks/codex-hook-adapter.js +12 -48
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +280 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +192 -333
- package/dist/josh.js +240 -148
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +70 -78
- package/eslint/rules/promise.js +5 -0
- package/eslint/rules/unicorn.js +3 -2
- package/package.json +26 -5
- package/pnpm-workspace.yaml +5 -7
- package/prompts/collaboration-workflow/glossary.md +17 -0
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/issue-template.md +1 -1
- package/prompts/collaboration-workflow/operating-rules.md +5 -5
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +3 -3
- package/prompts/collaboration-workflow/rule-delivery.md +1 -1
- package/prompts/collaboration-workflow/turn-batching.md +3 -3
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +25 -22
- package/prompts/collaboration-workflow.md +6 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +11 -3
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +0 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +6 -16
- package/scripts/backlog/backlog-arrival.ts +30 -10
- package/scripts/backlog/backlog-budget-cli.ts +15 -16
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +9 -15
- package/scripts/backlog/backlog-offer-cli.ts +6 -19
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +30 -19
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +39 -10
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +5 -2
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +85 -9
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/parse-jsonc.ts +33 -3
- package/scripts/config-merge/patch-json-key.ts +13 -6
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +3 -10
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +0 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +6 -10
- package/scripts/doctor/doctor-io.ts +9 -13
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/backlogrun-parent-read-set.ts +12 -1
- package/scripts/document/document-byte-budget.ts +5 -5
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +21 -7
- package/scripts/document/entry-read-set.ts +32 -8
- package/scripts/document/lane-child-read-set.ts +8 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +9 -3
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +4 -2
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +8 -22
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +9 -8
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +2 -2
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +3 -2
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-command.ts +6 -1
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +2 -2
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn-sync.ts +65 -0
- package/scripts/git/git-spawn.ts +5 -4
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +1 -0
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +2 -0
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard.ts +22 -4
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-file-action.ts +54 -0
- package/scripts/init/init-logic-migrate.ts +35 -17
- package/scripts/init/init-logic-secretlint.ts +1 -1
- package/scripts/init/init-logic.ts +10 -19
- package/scripts/init/init.ts +11 -71
- package/scripts/init/kit-written-paths.ts +2 -0
- package/scripts/init/project-profile.ts +9 -17
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +3 -1
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +64 -23
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +3 -3
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-backlinks.ts +7 -14
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +12 -8
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +7 -14
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +8 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/{git → issue}/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +21 -6
- package/scripts/issue/measure-rerun-cli.ts +74 -15
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +8 -1
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +7 -1
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +3 -3
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/run-github-prerequisite.ts +3 -6
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +46 -19
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-cli.ts +1 -4
- package/scripts/lane/lane-close.ts +5 -4
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +31 -27
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +7 -1
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/cli-flags.ts +31 -2
- package/scripts/lib/error-message.ts +12 -1
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/line-targets.ts +0 -11
- package/scripts/lines/lines-command.ts +5 -4
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +3 -10
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +0 -2
- package/scripts/propagate/propagate-steps.ts +3 -5
- package/scripts/propagate/propagate-targets.ts +0 -4
- package/scripts/propagate/propagate.ts +0 -4
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +28 -21
- package/scripts/registry-migration/migrate.ts +25 -14
- package/scripts/release/github-release-cli.ts +19 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +38 -5
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/release/release-worktree.ts +97 -2
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +4 -16
- package/scripts/review/review-brief-cli.ts +23 -6
- package/scripts/review/review-brief.ts +21 -8
- package/scripts/review/review-checkout.ts +3 -2
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +10 -17
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +0 -3
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/early-heartbeat.ts +4 -3
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +0 -1
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-park.ts +22 -6
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +20 -9
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-args.ts +8 -12
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-args.ts +1 -6
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +2 -6
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +133 -25
- package/scripts/run/run-entry-stop.ts +104 -0
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream-emit.ts +7 -2
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +2 -2
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +29 -6
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +2 -6
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +7 -23
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +4 -2
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +6 -3
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-args.ts +20 -4
- package/scripts/run/run-progress-cli.ts +35 -36
- package/scripts/run/run-progress-clock.ts +10 -35
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +1 -2
- package/scripts/run/run-progress.ts +1 -2
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +29 -19
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +1 -1
- package/scripts/run/run-ship-probe.ts +4 -1
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +18 -4
- package/scripts/run/run-ship-review.ts +11 -0
- package/scripts/run/run-ship-scoped.ts +1 -0
- package/scripts/run/run-ship-steps.ts +1 -1
- package/scripts/run/run-ship.ts +0 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +3 -16
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +6 -2
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -13
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +18 -12
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/pack-hook.ts +92 -0
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-ai-files.ts +4 -0
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-changed.ts +13 -16
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +3 -9
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +0 -1
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-commands.ts +11 -1
- package/scripts/version/version-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/CLAUDE.basic.md +6 -6
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/ci.yml +16 -82
- package/templates/workflows/dependabot-auto-merge.yml +6 -3
- package/templates/workflows/github-release.yml +79 -0
- package/tsconfig.sonar.json +4 -22
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// The failure report `issue:read` and `issue:state` share (joshuafolkken/kit#3046). Both read a batch
|
|
2
|
+
// of numbers, print a block for each one that answered, and name every one that did not; only the
|
|
3
|
+
// result kind that counts as an answer and what a gap must not be mistaken for differ between them.
|
|
4
|
+
|
|
5
|
+
const SUCCESS_EXIT_CODE = 0
|
|
6
|
+
const FAILURE_EXIT_CODE = 1
|
|
7
|
+
|
|
8
|
+
// The two failure kinds a read can end in, kept apart all the way to the report: `missing` is the
|
|
9
|
+
// number resolving to nothing and `unreadable` is a read that failed, and the documents ask a
|
|
10
|
+
// caller to report the two differently. Folding them together to simplify the batch would destroy
|
|
11
|
+
// exactly that distinction.
|
|
12
|
+
type ReadFailureKind = 'missing' | 'unreadable'
|
|
13
|
+
|
|
14
|
+
interface NumberReport<K extends string> {
|
|
15
|
+
issue_number: string
|
|
16
|
+
result: { kind: K | ReadFailureKind }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface FailureTerms<K extends string> {
|
|
20
|
+
success_kind: K
|
|
21
|
+
// What a failed read would be misread as if it were printed silently — "the issue is empty".
|
|
22
|
+
misreading: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function print_blocks(blocks: ReadonlyArray<string>, separator: string): void {
|
|
26
|
+
if (blocks.length === 0) return
|
|
27
|
+
|
|
28
|
+
console.info(blocks.join(separator))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// A number that resolves to nothing is an answer — a typo, or another repository's number quoted in
|
|
32
|
+
// prose — and it is reported as one. Everything else is a gap, and the message says so, because the
|
|
33
|
+
// caller's next move differs: a gap is retried, an answer is not.
|
|
34
|
+
function report_failure(kind: ReadFailureKind, issue_number: string, misreading: string): void {
|
|
35
|
+
if (kind === 'missing') {
|
|
36
|
+
console.error(`✖ issue #${issue_number} does not resolve — check the number and the repository`)
|
|
37
|
+
} else {
|
|
38
|
+
console.error(
|
|
39
|
+
`✖ could not read issue #${issue_number} — a rate limit, expired auth, or a dropped connection. This is not "${misreading}"`,
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function is_failure_kind(kind: string): kind is ReadFailureKind {
|
|
45
|
+
return kind === 'missing' || kind === 'unreadable'
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function report_one_failure<K extends string>(
|
|
49
|
+
report: NumberReport<K>,
|
|
50
|
+
terms: FailureTerms<K>,
|
|
51
|
+
): boolean {
|
|
52
|
+
const { kind } = report.result
|
|
53
|
+
|
|
54
|
+
if (!is_failure_kind(kind)) return false
|
|
55
|
+
|
|
56
|
+
report_failure(kind, report.issue_number, terms.misreading)
|
|
57
|
+
|
|
58
|
+
return true
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Every number that produced no answer is named, so a caller is told which ones it has no answer for
|
|
62
|
+
// rather than being left to subtract the printed blocks from what it asked. A single failure makes
|
|
63
|
+
// the exit code non-zero.
|
|
64
|
+
function report_failures<K extends string>(
|
|
65
|
+
reports: ReadonlyArray<NumberReport<K>>,
|
|
66
|
+
terms: FailureTerms<K>,
|
|
67
|
+
): number {
|
|
68
|
+
let has_failure = false
|
|
69
|
+
|
|
70
|
+
for (const report of reports) {
|
|
71
|
+
has_failure = report_one_failure(report, terms) || has_failure
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return has_failure ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const issue_report_failures = { print_blocks, report_failures }
|
|
78
|
+
|
|
79
|
+
export type { ReadFailureKind }
|
|
80
|
+
export { issue_report_failures }
|
|
@@ -5,7 +5,7 @@ import { epic_audit_logic } from '#scripts/epic/epic-audit'
|
|
|
5
5
|
import { epic_bundle, type BacklogIssue, type BundleDecision } from '#scripts/epic/epic-bundle'
|
|
6
6
|
import { epic_bundle_cli } from '#scripts/epic/epic-bundle-cli'
|
|
7
7
|
import { epic_bundle_gaps } from '#scripts/epic/epic-bundle-gaps'
|
|
8
|
-
import { git_gh_command } from '#scripts/
|
|
8
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
9
9
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
10
10
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
11
11
|
import {
|
|
@@ -403,16 +403,10 @@ const issue_scout_cli = {
|
|
|
403
403
|
NO_REFERENCE_LINE,
|
|
404
404
|
CLOSED_UNREADABLE_LINE,
|
|
405
405
|
CLOSED_CEILING_LINE,
|
|
406
|
-
DRAFT_NUMBER,
|
|
407
406
|
read_arguments,
|
|
408
407
|
with_draft_body,
|
|
409
|
-
draft_of,
|
|
410
|
-
format_duplicates,
|
|
411
|
-
format_epic_decision,
|
|
412
|
-
format_report,
|
|
413
408
|
scout,
|
|
414
409
|
run,
|
|
415
|
-
main,
|
|
416
410
|
}
|
|
417
411
|
|
|
418
412
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
2
|
-
import { EPIC_LABEL, has_any_label } from '#scripts/git/issue-labels'
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
2
|
import { PAGE_CEILING_CAUSE } from '#scripts/git/listing-cutoff'
|
|
4
3
|
import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
|
|
5
4
|
import { issue_label_schema } from '#scripts/git/schemas'
|
|
6
5
|
import { z } from 'zod'
|
|
6
|
+
import { EPIC_LABEL, has_any_label } from './issue-labels'
|
|
7
7
|
import type { ScoutIssue } from './issue-scout'
|
|
8
8
|
|
|
9
9
|
// The closed half of `issue:scout`'s duplicate scan (joshuafolkken/kit#1679), held apart from the CLI
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { git_gh_command } from '#scripts/
|
|
3
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
4
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
5
|
+
import { issue_report_failures, type ReadFailureKind } from './issue-report-failures'
|
|
5
6
|
import { issue_state, type IssueState } from './issue-state'
|
|
6
7
|
|
|
7
8
|
// `josh issue:state <N> [<N> ...]` — print each issue's state and labels, in the spelling the
|
|
@@ -25,7 +26,6 @@ import { issue_state, type IssueState } from './issue-state'
|
|
|
25
26
|
// answer as "not CLOSED" would report a child as failed because nobody could reach GitHub. The two
|
|
26
27
|
// are told apart here and neither is a state.
|
|
27
28
|
|
|
28
|
-
const SUCCESS_EXIT_CODE = 0
|
|
29
29
|
const FAILURE_EXIT_CODE = 1
|
|
30
30
|
const ARGV_OFFSET = 2
|
|
31
31
|
const REPO_FLAG = '--repo'
|
|
@@ -43,18 +43,13 @@ const READ_CONCURRENCY = 8
|
|
|
43
43
|
// The two fields, under the names `gh issue view --json` gave them. `git-gh-issue-rest.ts` maps them
|
|
44
44
|
// back from REST, which is what keeps `OPEN` / `CLOSED` / `MERGED` out of this file.
|
|
45
45
|
const STATE_FIELDS = 'state,labels'
|
|
46
|
+
const FAILURE_TERMS = { success_kind: 'state', misreading: 'the issue is open' } as const
|
|
46
47
|
|
|
47
48
|
interface StateRequest {
|
|
48
49
|
issue_numbers: ReadonlyArray<string>
|
|
49
50
|
repo?: string
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
// The two failure kinds a read can end in, kept apart all the way to the report: `missing` is the
|
|
53
|
-
// number resolving to nothing and `unreadable` is a read that failed, and the documents ask a
|
|
54
|
-
// caller to report the two differently. Folding them together to simplify the batch would destroy
|
|
55
|
-
// exactly that distinction.
|
|
56
|
-
type ReadFailureKind = 'missing' | 'unreadable'
|
|
57
|
-
|
|
58
53
|
// One issue's state, or the failure kind. Named for export because `run:prep` reads the state beside
|
|
59
54
|
// the body and the dependency-update scope (joshuafolkken/kit#1978), reusing this read rather than a
|
|
60
55
|
// second one that would drift from the `human_review` decision `parse_issue_state` owns.
|
|
@@ -146,19 +141,6 @@ function parse_request(argv: ReadonlyArray<string>): StateRequest | undefined {
|
|
|
146
141
|
return repo_flag.kind === 'named' ? { issue_numbers, repo: repo_flag.repo } : { issue_numbers }
|
|
147
142
|
}
|
|
148
143
|
|
|
149
|
-
// A number that resolves to nothing is an answer — a typo, or another repository's number quoted in
|
|
150
|
-
// prose — and it is reported as one. Everything else is a gap, and the message says so, because the
|
|
151
|
-
// caller's next move differs: a gap is retried, an answer is not.
|
|
152
|
-
function report_failure(kind: ReadFailureKind, issue_number: string): void {
|
|
153
|
-
if (kind === 'missing') {
|
|
154
|
-
console.error(`✖ issue #${issue_number} does not resolve — check the number and the repository`)
|
|
155
|
-
} else {
|
|
156
|
-
console.error(
|
|
157
|
-
`✖ could not read issue #${issue_number} — a rate limit, expired auth, or a dropped connection. This is not "the issue is open"`,
|
|
158
|
-
)
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
144
|
// One number's read, reduced to what the report needs and nothing printed yet. Separating the two
|
|
163
145
|
// is what lets the whole batch be in flight at once: the numbers are independent, so reading them
|
|
164
146
|
// one after the other spends a round trip per number for no reason.
|
|
@@ -206,30 +188,7 @@ function print_states(reports: ReadonlyArray<IssueReport>): void {
|
|
|
206
188
|
const should_attribute = reports.length > 1
|
|
207
189
|
const blocks = reports.flatMap((report) => state_blocks(report, should_attribute))
|
|
208
190
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
console.info(blocks.join(BLOCK_SEPARATOR))
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
function report_one_failure(report: IssueReport): boolean {
|
|
215
|
-
if (report.result.kind === 'state') return false
|
|
216
|
-
|
|
217
|
-
report_failure(report.result.kind, report.issue_number)
|
|
218
|
-
|
|
219
|
-
return true
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Every number that produced no state is named, so a caller is told which ones it has no answer for
|
|
223
|
-
// rather than being left to subtract the printed blocks from what it asked. A single failure still
|
|
224
|
-
// makes the exit code non-zero, exactly as it did when only one number could be passed.
|
|
225
|
-
function report_failures(reports: ReadonlyArray<IssueReport>): number {
|
|
226
|
-
let has_failure = false
|
|
227
|
-
|
|
228
|
-
for (const report of reports) {
|
|
229
|
-
has_failure = report_one_failure(report) || has_failure
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
return has_failure ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
191
|
+
issue_report_failures.print_blocks(blocks, BLOCK_SEPARATOR)
|
|
233
192
|
}
|
|
234
193
|
|
|
235
194
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
@@ -245,7 +204,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
245
204
|
|
|
246
205
|
print_states(reports)
|
|
247
206
|
|
|
248
|
-
return report_failures(reports)
|
|
207
|
+
return issue_report_failures.report_failures(reports, FAILURE_TERMS)
|
|
249
208
|
}
|
|
250
209
|
|
|
251
210
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { has_any_label, NEEDS_HUMAN_REVIEW_LABEL } from '#scripts/git/issue-labels'
|
|
2
1
|
import { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
3
2
|
import { z } from 'zod'
|
|
3
|
+
import { has_any_label, NEEDS_HUMAN_REVIEW_LABEL } from './issue-labels'
|
|
4
4
|
|
|
5
5
|
// The answer `josh issue:state` prints, kept apart from the reading and the printing so the shape of
|
|
6
6
|
// the report is decided by one pure function (joshuafolkken/kit#1054).
|
|
@@ -96,10 +96,6 @@ function format_attributed_issue_state(issue_number: string, state: IssueState):
|
|
|
96
96
|
|
|
97
97
|
const issue_state = {
|
|
98
98
|
NO_LABELS,
|
|
99
|
-
STATE_LABEL,
|
|
100
|
-
LABELS_LABEL,
|
|
101
|
-
HUMAN_REVIEW_LABEL_LINE,
|
|
102
|
-
ISSUE_LABEL,
|
|
103
99
|
parse_issue_state,
|
|
104
100
|
format_issue_state,
|
|
105
101
|
format_attributed_issue_state,
|
|
@@ -52,13 +52,16 @@ function has_line(body: string, text: string): boolean {
|
|
|
52
52
|
return has_unfenced_line(body, text)
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
// The lines between `
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
function
|
|
55
|
+
// The lines between the first unfenced line `is_target` accepts and the next unfenced `## ` heading,
|
|
56
|
+
// trimmed of the heading line itself; an empty array when no line is accepted. A `## ` line inside a
|
|
57
|
+
// code fence is example text, so it neither opens nor closes a section (joshuafolkken/kit#3066).
|
|
58
|
+
function section_lines_matching(
|
|
59
|
+
body: string,
|
|
60
|
+
is_target: (line: string) => boolean,
|
|
61
|
+
): ReadonlyArray<string> {
|
|
59
62
|
const lines = body.split('\n')
|
|
60
63
|
const visible = unfenced_lines(body)
|
|
61
|
-
const start = visible.findIndex((line) =>
|
|
64
|
+
const start = visible.findIndex((line) => is_target(line))
|
|
62
65
|
|
|
63
66
|
if (start === -1) return []
|
|
64
67
|
|
|
@@ -68,6 +71,18 @@ function section_lines(body: string, heading: string): ReadonlyArray<string> {
|
|
|
68
71
|
return end === -1 ? rest : rest.slice(0, end)
|
|
69
72
|
}
|
|
70
73
|
|
|
71
|
-
|
|
74
|
+
// A heading matched inside a sentence is not the section heading, so only a line that is exactly the
|
|
75
|
+
// heading opens the section.
|
|
76
|
+
function section_lines(body: string, heading: string): ReadonlyArray<string> {
|
|
77
|
+
return section_lines_matching(body, (line) => is_the_heading(line, heading))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const markdown_section = {
|
|
81
|
+
section_lines,
|
|
82
|
+
section_lines_matching,
|
|
83
|
+
unfenced_lines,
|
|
84
|
+
has_line,
|
|
85
|
+
has_unfenced_line,
|
|
86
|
+
}
|
|
72
87
|
|
|
73
88
|
export { markdown_section }
|
|
@@ -1,26 +1,52 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { execSync } from 'node:child_process'
|
|
3
|
-
import { readFile } from 'node:fs/promises'
|
|
4
3
|
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
5
|
+
import { parse_json_object_safe } from '#scripts/git/parse-json-array'
|
|
5
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
6
7
|
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
8
|
+
import { z } from 'zod'
|
|
7
9
|
import { baseline_measure, type Baseline } from './baseline-measure'
|
|
8
10
|
|
|
9
|
-
// `josh measure:rerun <
|
|
11
|
+
// `josh measure:rerun <N>` — read a behavior-change Issue body after merge, re-run each baseline
|
|
10
12
|
// command, and print the before/after pair (joshuafolkken/kit#2212). A value that did not move means
|
|
11
13
|
// the premise the rule rested on is refuted, so a line is appended to the observation ledger — reusing
|
|
12
14
|
// that append-only, same-key mechanism rather than a second one.
|
|
15
|
+
//
|
|
16
|
+
// **The baseline is shell, and the body is written by whoever filed the Issue** (joshuafolkken/kit#3064).
|
|
17
|
+
// A baseline needs pipes and loops (`git log … | wc -l`, `for d in $(ls …)`), so an allow-list of
|
|
18
|
+
// commands cannot make it safe; what can is who wrote it. The input is therefore the Issue number, not
|
|
19
|
+
// a file, so the author's `author_association` arrives with the body from the same REST read, and only
|
|
20
|
+
// a body written by someone with write access to the repository is run.
|
|
13
21
|
|
|
14
22
|
const FAILURE_EXIT_CODE = 1
|
|
15
|
-
const
|
|
23
|
+
const ARGV_OFFSET = 2
|
|
24
|
+
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
25
|
+
const ISSUE_FIELDS = 'body,author_association'
|
|
26
|
+
const TRUSTED_ASSOCIATIONS: ReadonlySet<string> = new Set(['OWNER', 'MEMBER', 'COLLABORATOR'])
|
|
27
|
+
const TRUSTED_LIST = [...TRUSTED_ASSOCIATIONS].join(' / ')
|
|
28
|
+
const UNKNOWN_ASSOCIATION = 'unknown'
|
|
29
|
+
const USAGE = 'Usage: josh measure:rerun <issue-number>'
|
|
16
30
|
const NO_BASELINE = 'no `command → value` baseline found in ## ベースライン — nothing to re-run'
|
|
17
31
|
const DATE_END = 10
|
|
18
|
-
|
|
19
|
-
//
|
|
20
|
-
//
|
|
32
|
+
// One baseline command's budget — the same minute `josh-harness.ts` gives one command it spawns. A
|
|
33
|
+
// baseline is a count or a digest that answers in seconds, so a command still running after a minute
|
|
34
|
+
// is stuck, and without a bound it would hold the whole re-measurement open with nothing printed.
|
|
35
|
+
const MEASURE_TIMEOUT_MS = 60_000
|
|
36
|
+
const issue_schema = z.object({
|
|
37
|
+
body: z.string().nullish(),
|
|
38
|
+
author_association: z.string().nullish(),
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
type IssueFields = z.infer<typeof issue_schema>
|
|
42
|
+
type BodyRead = { kind: 'trusted'; body: string } | { kind: 'refused'; reason: string }
|
|
43
|
+
|
|
44
|
+
// The command's stdout, trimmed to one value. A failing or timed-out command yields its message so the
|
|
45
|
+
// pair still prints and the remaining baselines still run, rather than aborting the whole
|
|
46
|
+
// re-measurement.
|
|
21
47
|
function measure(command: string): string {
|
|
22
48
|
try {
|
|
23
|
-
return execSync(command, { encoding: 'utf8' }).trim()
|
|
49
|
+
return execSync(command, { encoding: 'utf8', timeout: MEASURE_TIMEOUT_MS }).trim()
|
|
24
50
|
} catch (error) {
|
|
25
51
|
return `(command failed: ${error_text.message_of(error)})`
|
|
26
52
|
}
|
|
@@ -56,8 +82,35 @@ function today(now: Date): string {
|
|
|
56
82
|
return now.toISOString().slice(0, DATE_END)
|
|
57
83
|
}
|
|
58
84
|
|
|
59
|
-
async function
|
|
60
|
-
const
|
|
85
|
+
async function read_issue(issue_number: string): Promise<IssueFields | undefined> {
|
|
86
|
+
const json = await git_gh_issue_read.issue_view_json(issue_number, ISSUE_FIELDS)
|
|
87
|
+
|
|
88
|
+
return json === undefined ? undefined : parse_json_object_safe(json, issue_schema)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The body, only when its author can write to the repository. A read that fails is refused as well:
|
|
92
|
+
// an unknown author is not a trusted one.
|
|
93
|
+
async function read_trusted_body(issue_number: string): Promise<BodyRead> {
|
|
94
|
+
const issue = await read_issue(issue_number)
|
|
95
|
+
|
|
96
|
+
if (issue === undefined) {
|
|
97
|
+
return { kind: 'refused', reason: `could not read issue #${issue_number}` }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const association = issue.author_association ?? UNKNOWN_ASSOCIATION
|
|
101
|
+
|
|
102
|
+
if (!TRUSTED_ASSOCIATIONS.has(association)) {
|
|
103
|
+
return {
|
|
104
|
+
kind: 'refused',
|
|
105
|
+
reason: `refusing to run the baseline of #${issue_number}: its author is ${association}, not ${TRUSTED_LIST}`,
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return { kind: 'trusted', body: issue.body ?? '' }
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function rerun(body: string, now: Date): Promise<number> {
|
|
113
|
+
const baselines = baseline_measure.parse_baselines(body)
|
|
61
114
|
|
|
62
115
|
if (baselines.length === 0) {
|
|
63
116
|
console.error(NO_BASELINE)
|
|
@@ -76,23 +129,29 @@ async function rerun(body_path: string, now: Date): Promise<number> {
|
|
|
76
129
|
return 0
|
|
77
130
|
}
|
|
78
131
|
|
|
79
|
-
async function run(
|
|
80
|
-
if (
|
|
132
|
+
async function run(issue_number: string | undefined, now: Date): Promise<number> {
|
|
133
|
+
if (issue_number === undefined || !ISSUE_NUMBER_PATTERN.test(issue_number)) {
|
|
81
134
|
console.error(USAGE)
|
|
82
135
|
|
|
83
136
|
return FAILURE_EXIT_CODE
|
|
84
137
|
}
|
|
85
138
|
|
|
86
|
-
|
|
139
|
+
const read = await read_trusted_body(issue_number)
|
|
140
|
+
|
|
141
|
+
if (read.kind === 'refused') {
|
|
142
|
+
console.error(read.reason)
|
|
143
|
+
|
|
144
|
+
return FAILURE_EXIT_CODE
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return await rerun(read.body, now)
|
|
87
148
|
}
|
|
88
149
|
|
|
89
150
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
90
151
|
process.exitCode = await run(argv[0], new Date())
|
|
91
152
|
}
|
|
92
153
|
|
|
93
|
-
const measure_rerun_cli = { run
|
|
94
|
-
|
|
95
|
-
const ARGV_OFFSET = 2
|
|
154
|
+
const measure_rerun_cli = { run }
|
|
96
155
|
|
|
97
156
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
98
157
|
|
|
@@ -53,7 +53,7 @@ function has_command_output(body: string, heading: string = REPRODUCTION_HEADING
|
|
|
53
53
|
return reproduction.has_command && reproduction.has_output
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
const reproduction_measure = {
|
|
56
|
+
const reproduction_measure = { has_command_output }
|
|
57
57
|
|
|
58
58
|
export type { Reproduction }
|
|
59
59
|
export { reproduction_measure }
|
package/scripts/josh/cli-body.ts
CHANGED
|
@@ -40,6 +40,7 @@ const ALIASES: Record<string, string> = {
|
|
|
40
40
|
f: 'format',
|
|
41
41
|
sd: 'cspell:dot',
|
|
42
42
|
bh: 'behavior',
|
|
43
|
+
eu: 'exports:unused',
|
|
43
44
|
t: 'test',
|
|
44
45
|
tu: 'test:unit',
|
|
45
46
|
tr: 'test:related',
|
|
@@ -62,6 +63,7 @@ const ALIASES: Record<string, string> = {
|
|
|
62
63
|
v: 'version',
|
|
63
64
|
r: 'ranges',
|
|
64
65
|
dr: 'doctor',
|
|
66
|
+
rc: 'ruleset:check',
|
|
65
67
|
pg: 'propagate',
|
|
66
68
|
ad: 'adopt',
|
|
67
69
|
ov: 'overrides',
|
|
@@ -4,10 +4,9 @@ import { DOCUMENT_COMMANDS } from './josh-commands-document'
|
|
|
4
4
|
import { GUARD_COMMANDS } from './josh-commands-guard'
|
|
5
5
|
import { ISSUE_COMMANDS } from './josh-commands-issue'
|
|
6
6
|
import { LANE_COMMANDS } from './josh-commands-lane'
|
|
7
|
+
import { RUN_COMMANDS } from './josh-commands-run'
|
|
7
8
|
import { SPLIT_COMMANDS } from './josh-commands-split'
|
|
8
9
|
|
|
9
|
-
// One script answers both `run:hold` and `run:release`; the flag below is what tells them apart.
|
|
10
|
-
const RUN_HOLD_SCRIPT = 'scripts/run/run-hold-cli.ts'
|
|
11
10
|
const ISSUE_WITH_OPTIONS = '<issue> [options]'
|
|
12
11
|
|
|
13
12
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
@@ -21,7 +20,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
21
20
|
reference: ['<keywords> [--size <n>]', 'automation', ['network']],
|
|
22
21
|
},
|
|
23
22
|
'stash:pop': {
|
|
24
|
-
script: 'scripts/git/stash-pop-cli.ts',
|
|
23
|
+
script: 'scripts/git/stash/stash-pop-cli.ts',
|
|
25
24
|
description: 'Pop the stash matching this message, not whichever a shared stack has on top',
|
|
26
25
|
category: 'AI tools',
|
|
27
26
|
reference: ['<message>', 'automation', ['git']],
|
|
@@ -36,7 +35,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
36
35
|
script: 'scripts/epic/epic-next.ts',
|
|
37
36
|
description: "List an epic's runnable children, bundled per repository",
|
|
38
37
|
category: 'AI tools',
|
|
39
|
-
reference: ['<epic>', 'automation', ['network']],
|
|
38
|
+
reference: ['<epic>... [--repo <owner/repo>] [--lanes]', 'automation', ['network']],
|
|
40
39
|
},
|
|
41
40
|
'epic:bundle': {
|
|
42
41
|
script: 'scripts/epic/epic-bundle-cli.ts',
|
|
@@ -65,9 +64,10 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
65
64
|
...BACKLOG_COMMANDS,
|
|
66
65
|
cost: {
|
|
67
66
|
script: 'scripts/cost-runtime/cost-cli.ts',
|
|
68
|
-
description:
|
|
67
|
+
description:
|
|
68
|
+
'Say whether the next turn of a run crosses the context-cut threshold (--cut) or a given tokens-per-request figure (--over)',
|
|
69
69
|
category: 'AI tools',
|
|
70
|
-
reference: ['
|
|
70
|
+
reference: ['(--cut | --over <tokens-per-request>) [--path <dir>]', 'automation', ['none']],
|
|
71
71
|
},
|
|
72
72
|
...DOCUMENT_COMMANDS,
|
|
73
73
|
time: {
|
|
@@ -134,100 +134,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
134
134
|
category: 'AI tools',
|
|
135
135
|
reference: ['<unit-files> <unit-files> [<unit-files> …]', 'automation', ['none']],
|
|
136
136
|
},
|
|
137
|
-
|
|
138
|
-
script: RUN_HOLD_SCRIPT,
|
|
139
|
-
description: 'Claim this working tree for a run, or say which run already holds it',
|
|
140
|
-
category: 'AI tools',
|
|
141
|
-
reference: ['[issue]', 'automation', ['files']],
|
|
142
|
-
},
|
|
143
|
-
'run:release': {
|
|
144
|
-
script: RUN_HOLD_SCRIPT,
|
|
145
|
-
description: "Release this working tree's run record",
|
|
146
|
-
category: 'AI tools',
|
|
147
|
-
reference: ['[issue|--force]', 'automation', ['files']],
|
|
148
|
-
default_script_arguments: ['--release'],
|
|
149
|
-
},
|
|
150
|
-
'run:tidy': {
|
|
151
|
-
script: 'scripts/run/run-tidy-cli.ts',
|
|
152
|
-
description: 'Close merged lanes and drop stashes whose issues are all merged',
|
|
153
|
-
category: 'AI tools',
|
|
154
|
-
reference: ['', 'automation', ['git', 'network', 'files']],
|
|
155
|
-
},
|
|
156
|
-
'run:carry': {
|
|
157
|
-
script: 'scripts/run/run-carry-cli.ts',
|
|
158
|
-
description: 'Carry one invocation’s budget across its own session cuts',
|
|
159
|
-
category: 'AI tools',
|
|
160
|
-
reference: ['<operation> [arguments...]', 'automation', ['files']],
|
|
161
|
-
},
|
|
162
|
-
'run:wake': {
|
|
163
|
-
script: 'scripts/run/run-wake-cli.ts',
|
|
164
|
-
// `.env` rather than the ambient environment:
|
|
165
|
-
// the failure warning needs the Telegram credentials, the same
|
|
166
|
-
// reasons `notify` and `followup` carry these flags.
|
|
167
|
-
tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
|
|
168
|
-
description: 'Wake the next session of a cut backlogrun from outside the conversation',
|
|
169
|
-
category: 'AI tools',
|
|
170
|
-
reference: ['[options]', 'automation', ['processes', 'notifications']],
|
|
171
|
-
},
|
|
172
|
-
'run:cut': {
|
|
173
|
-
script: 'scripts/run/run-cut-cli.ts',
|
|
174
|
-
description: 'Cut a lane child before the gate and resume a fresh process',
|
|
175
|
-
category: 'AI tools',
|
|
176
|
-
reference: ['[--resume] <issue> [--impl] [--handoff <path>]', 'automation', ['files']],
|
|
177
|
-
},
|
|
178
|
-
'run:liveness': {
|
|
179
|
-
script: 'scripts/run/run-liveness-cli.ts',
|
|
180
|
-
description: 'Say whether a delegated unit is still working, or stopped without reporting',
|
|
181
|
-
category: 'AI tools',
|
|
182
|
-
reference: ['<issue> --output <path> [options]', 'automation', ['processes']],
|
|
183
|
-
},
|
|
184
|
-
'run:ending': {
|
|
185
|
-
script: 'scripts/run/run-ending-cli.ts',
|
|
186
|
-
description: 'Classify how a dispatched lane child ended (merged, cut, abandoned, unreadable)',
|
|
187
|
-
category: 'AI tools',
|
|
188
|
-
reference: ['<issue> --output <path> [--repo <owner/repo>]', 'automation', ['network']],
|
|
189
|
-
},
|
|
190
|
-
'run:progress': {
|
|
191
|
-
script: 'scripts/run/run-progress-cli.ts',
|
|
192
|
-
description: 'Report an unattended run’s progress once it has gone quiet for an interval',
|
|
193
|
-
category: 'AI tools',
|
|
194
|
-
reference: ['[--wait|--mark]', 'automation', ['files']],
|
|
195
|
-
},
|
|
196
|
-
'run:prep': {
|
|
197
|
-
script: 'scripts/run/run-prep-cli.ts',
|
|
198
|
-
description: 'Bundle a run’s pre-edit reads: body, comments, state, dependency scope',
|
|
199
|
-
category: 'AI tools',
|
|
200
|
-
reference: ['<issue>', 'automation', ['network']],
|
|
201
|
-
},
|
|
202
|
-
// The entry sequence a lane opened on, folded into one call (joshuafolkken/kit#2372): claim the tree,
|
|
203
|
-
// read the budget, gather the issue reads and decide the pre-implementation step. `run:hold`,
|
|
204
|
-
// `cost --cut`, `run:prep` and `run:step` were four round trips re-billing a lane's full context each.
|
|
205
|
-
'run:entry': {
|
|
206
|
-
script: 'scripts/run/run-entry-cli.ts',
|
|
207
|
-
description:
|
|
208
|
-
'Open a run in one call: claim the tree, read the budget, bundle the reads, decide the pre-implementation step',
|
|
209
|
-
category: 'AI tools',
|
|
210
|
-
reference: ['<issue>', 'automation', ['git', 'network', 'files']],
|
|
211
|
-
},
|
|
212
|
-
'run:status': {
|
|
213
|
-
script: 'scripts/run/run-status-cli.ts',
|
|
214
|
-
description: 'Bundle a run’s read-only status: issue state, cost verdict, carry counters',
|
|
215
|
-
category: 'AI tools',
|
|
216
|
-
reference: ['<issue> [--repo <owner/repo>]', 'automation', ['network']],
|
|
217
|
-
},
|
|
218
|
-
'run:next': {
|
|
219
|
-
script: 'scripts/run/run-next-cli.ts',
|
|
220
|
-
description: 'Print the next step a fullrun takes, computed from the run’s state',
|
|
221
|
-
category: 'AI tools',
|
|
222
|
-
reference: ['<issue>', 'automation', ['network']],
|
|
223
|
-
},
|
|
224
|
-
'run:step': {
|
|
225
|
-
script: 'scripts/run/run-step-cli.ts',
|
|
226
|
-
description:
|
|
227
|
-
'Print the run’s next single action, computed from the event stream, carry record and issue state',
|
|
228
|
-
category: 'AI tools',
|
|
229
|
-
reference: ['<issue>', 'automation', ['network', 'files']],
|
|
230
|
-
},
|
|
137
|
+
...RUN_COMMANDS,
|
|
231
138
|
'repo:party': {
|
|
232
139
|
script: 'scripts/discovery/repo-party-cli.ts',
|
|
233
140
|
description:
|
|
@@ -255,7 +162,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
255
162
|
'run:tail': {
|
|
256
163
|
script: 'scripts/run/run-tail-cli.ts',
|
|
257
164
|
description:
|
|
258
|
-
'Close a run in one call: commit the observation ledger, read the citations, decide the release scope',
|
|
165
|
+
'Close a run in one call: return to the default branch, commit the observation ledger, read the citations, decide the release scope',
|
|
259
166
|
category: 'AI tools',
|
|
260
167
|
reference: ['[<issue> ...]', 'automation', ['git', 'network']],
|
|
261
168
|
},
|
|
@@ -269,7 +176,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
269
176
|
'Ship a change in one call: gate, commit/push/PR, the CI-wait merge and the report bookkeeping, stopping at the first failed step',
|
|
270
177
|
category: 'AI tools',
|
|
271
178
|
reference: [
|
|
272
|
-
'"<title> #<N>" [<follow-up-N> ...] [--cite <N>] [--review] [--detach] [--notify-message <text> | --notify-message-file <path>] | --log <N>',
|
|
179
|
+
'"<title> #<N>" [<follow-up-N> ...] [--cite <N>] [--review] [--detach] [--body-file <path>] [--notify-message <text> | --notify-message-file <path>] | --log <N>',
|
|
273
180
|
'automation',
|
|
274
181
|
['git', 'network'],
|
|
275
182
|
],
|
|
@@ -33,7 +33,11 @@ const BACKLOG_COMMANDS: Record<string, CommandEntry> = {
|
|
|
33
33
|
description:
|
|
34
34
|
'Print the whole backlog as a plan: ready now, waiting on what, waiting on a person, out of scope',
|
|
35
35
|
category: 'AI tools',
|
|
36
|
-
reference: [
|
|
36
|
+
reference: [
|
|
37
|
+
'[issue...] [--only] [--waves] [--exclude <n>[,<n>...]]',
|
|
38
|
+
'automation',
|
|
39
|
+
['network'],
|
|
40
|
+
],
|
|
37
41
|
},
|
|
38
42
|
'backlog:stalled': {
|
|
39
43
|
script: 'scripts/backlog/backlog-stalled-cli.ts',
|