@joshuafolkken/kit 1.1050.0 → 1.1094.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 +19 -11
- package/.claude/skills/workflow-commands/background-commands.md +4 -3
- 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 +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- 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 +3 -2
- package/.claude/skills/workflow-commands/halfrun.md +16 -19
- 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 +1 -1
- 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/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/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +33 -38
- package/.github/workflows/sonar-qube.yml +37 -4
- package/AGENTS.md +12 -2
- package/CLAUDE.md +15 -16
- package/GEMINI.md +14 -2
- package/README.md +59 -18
- package/SECURITY.md +36 -6
- package/cspell/index.yaml +2 -1
- package/dist/CLAUDE.md +15 -16
- package/dist/config-merge/index.js +15 -3
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-7ZPFAVR7.js} +7 -88
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-E54KGFEQ.js} +2 -2
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M2XDCUKD.js} +997 -478
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-NKOG3XAV.js} +150 -153
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-OIZUHPJI.js} +2 -2
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-UD24EAIL.js} +2084 -1412
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +279 -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 +178 -324
- package/dist/josh.js +162 -119
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +34 -58
- package/eslint/rules/promise.js +5 -0
- package/package.json +9 -4
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/operating-rules.md +4 -4
- package/prompts/collaboration-workflow/overview.md +13 -1
- 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 +5 -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-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 +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +19 -3
- 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/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 +0 -3
- 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 +4 -6
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/document-byte-budget.ts +4 -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 +10 -2
- package/scripts/document/lane-child-read-set.ts +1 -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 +1 -0
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +1 -1
- 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 +5 -4
- 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 +2 -0
- 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-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-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-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} +1 -1
- 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-logic.ts +7 -0
- package/scripts/init/init.ts +0 -3
- package/scripts/init/project-profile.ts +6 -11
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +1 -0
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +3 -3
- 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-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +0 -2
- 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 +2 -2
- 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 +1 -1
- package/scripts/issue/measure-rerun-cli.ts +1 -1
- 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 +6 -0
- 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 +2 -2
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +3 -6
- 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 +1 -3
- 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 +21 -11
- 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 +3 -0
- package/scripts/lib/bounded-pool.ts +1 -0
- 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/lines-command.ts +0 -1
- 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 +0 -2
- 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 +0 -1
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +0 -2
- package/scripts/registry-migration/migrate.ts +19 -9
- package/scripts/release/github-release-cli.ts +8 -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 +2 -3
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- 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-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 +1 -1
- 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/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 +13 -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 +13 -5
- 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-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-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +1 -1
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +101 -24
- 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.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 +25 -5
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +1 -1
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +5 -13
- 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 +0 -1
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +2 -2
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-cli.ts +4 -7
- package/scripts/run/run-progress-clock.ts +6 -34
- 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 +21 -3
- 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-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 +1 -1
- 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 +2 -1
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +2 -3
- 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 +9 -7
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- 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-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-logic.ts +0 -1
- package/scripts/test/test-declared.ts +0 -2
- 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-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/dependabot-auto-merge.yml +5 -3
- package/templates/workflows/github-release.yml +81 -0
- 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-write.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-auto-merge.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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# オープン Issue の WIP
|
|
1
|
+
# オープン Issue の WIP 上限
|
|
2
2
|
|
|
3
3
|
**単一ソースはこのファイルである。**
|
|
4
4
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
## 規則
|
|
10
10
|
|
|
11
|
-
**オープン Issue
|
|
11
|
+
**オープン Issue が上限を超えている状態で新しく起票するときは、先に 1 件閉じる。**
|
|
12
12
|
|
|
13
13
|
件数は毎回数える。見積もりでも記憶でもない。
|
|
14
14
|
|
|
@@ -19,7 +19,7 @@ gh api "repos/{owner}/{repo}/issues?state=open&per_page=100" --paginate \
|
|
|
19
19
|
|
|
20
20
|
- **数えるのは「起票しようとしているリポジトリ」のオープン Issue 全件**である。`{owner}/{repo}` はカレントリポジトリに展開されるので、**別リポジトリへ起票するときはそのリポジトリのパスを直接書く**(例: `repos/joshuafolkken/app-kit/issues?...`)。自リポジトリの件数で他リポジトリへの起票を判断するのは、別のバックログを見ているのと同じである。
|
|
21
21
|
- epic も子も含める。epic を除外すると、epic を作ることで上限を回避できてしまう。
|
|
22
|
-
- **上限は 30。**
|
|
22
|
+
- **上限は 30。** これを超える 1 件を作る前に 1 件閉じる。エージェントが読む文書(`CLAUDE.md`・`prompts/`・配布 skill)がこの数字を書くのはこの行だけで、一次情報は `scripts/rules/delivered-rules.ts` の `WIP_CAP` である(一致はテストが固定する)。
|
|
23
23
|
- **プルリクエストは数えない。** REST の `issues` エンドポイントは PR も返すため、`select(.pull_request == null)` で落とす。この 1 句を省くと、PR が開いているだけで上限に達する。
|
|
24
24
|
- **`gh issue list` は使わない。** 配布ドキュメントの実行可能ブロックに置ける `gh` は REST のものだけで、`gh issue list` は GraphQL 経由のためクラウドセッションで 403 になる。
|
|
25
25
|
|
|
@@ -27,11 +27,11 @@ gh api "repos/{owner}/{repo}/issues?state=open&per_page=100" --paginate \
|
|
|
27
27
|
|
|
28
28
|
測定は `docs/maintainers/wip-cap-rationale.md` →「なぜ上限が要るのか — 測定」。
|
|
29
29
|
|
|
30
|
-
**上限は、増加を見えるようにするための強制装置である。**
|
|
30
|
+
**上限は、増加を見えるようにするための強制装置である。** 数を減らすこと自体が目的ではない。上限を超えた状態で起票しようとしたときに「本当にこれは 1 件増やす価値があるか」を必ず 1 回考えさせる、そこだけが役割である。
|
|
31
31
|
|
|
32
32
|
## 超過時の手順
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
起票しようとした時点で上限を超えていたら、**その起票が裁量によるものか、実行がそれに詰まっているか、割り込みか**の 3 つに分岐する。判断ではなく、起票の種類で決まる。**上限が効くのは裁量側だけである。**
|
|
35
35
|
|
|
36
36
|
**判定するのは「起票 1 件」ではなく「起票のひとまとまり」である。** 分割判定が作る子 N 件とその epic、割り込み Issue とその上流バックリンク、起票直後の `epic:bundle` が `create_epic` と答えたときの epic — これらは 1 回の起票行為であり、途中で上限に当たって半分だけ作るのが最悪の結果になる。**ひとまとまりの先頭で 1 回だけ判定し、通ったらまとまり全体を作り切る。**
|
|
37
37
|
|
|
@@ -71,36 +71,39 @@ gh api "repos/{owner}/{repo}/issues?state=open&per_page=100" --paginate \
|
|
|
71
71
|
|
|
72
72
|
#### 該当したときの手順
|
|
73
73
|
|
|
74
|
-
1. **上限に関係なく起票する。** 1 件閉じることを条件にしない。起票は `pnpm josh issue:file` で行う。本文の検査、本文が宣言する分類ラベルの付与、重複探し、`epic:bundle` はこのコマンドが実行する(`docs/josh-commands.md` → `josh issue:file`)。
|
|
74
|
+
1. **上限に関係なく起票する。** 1 件閉じることを条件にしない。起票は `pnpm josh issue:file` で行う。本文の検査、本文が宣言する分類ラベルの付与、重複探し、`epic:bundle` はこのコマンドが実行する(`docs/josh-commands-automation.md` → `josh issue:file`)。
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
77
|
pnpm josh issue:file "<title>" --body-file <body-file> --depth <n> --route interrupt
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
2. **超過している事実と、当たった条件の番号を本文に 1 行書く**(例:「オープン 37 件で起票。3 条件のうち 2(文書化された手順が完了できない)に該当」)。**どちらか一方では足りない** — 件数だけでは判定が再現できず、条件だけでは上限の可視化が効かない。
|
|
81
|
-
3. **次に実行されるものとして挿入する。** epic の下にあるなら `pnpm josh epic --add <E> <N>` で、**位置を指定せずに**追加する(`<E>` が epic、`<N>` が起票した割り込み)。**`--before` / `--after` を使ってはならない。** それらは `blocked-by` 関係を実際に書き込むため(`docs/josh-commands.md` →「`josh epic --add`」)、「発見したランをブロックしていない欠陥」という割り込みの定義と矛盾する**偽の依存関係**になり、`epic:next` が実装中の子を「割り込みにブロックされている」として出さなくなる。位置を指定しない追加は依存を一切宣言しない(joshuafolkken/kit#1253)ので、**順序は実行側が持つ** — 次に取り上げるのは実行側の選択であって、宣言された関係ではない(経緯は `docs/maintainers/wip-cap-rationale.md` →「位置を指定しない追加の経緯」)。**先に提示させたいときは `--order-before <M>` を使う**(joshuafolkken/kit#1738)— これはタスクリストの行だけを動かし、依存宣言も `blocked-by` も一切書かないので、上の禁止には当たらない。**禁止しているのは依存を書き込む `--before` / `--after` であって、順序そのものではない。** `epic:next` は runnable な子をタスクリスト順に提示する(joshuafolkken/kit#1583)ため、位置を指定しない追加は「末尾に提示される」を意味する — 割り込みを次に取り上げてほしいなら、行だけを前に出すこの指定がその手段である。**epic の下に無いなら挿入先そのものが無い**ので、この手順は飛ばして 4 だけを行う。
|
|
81
|
+
3. **次に実行されるものとして挿入する。** epic の下にあるなら `pnpm josh epic --add <E> <N>` で、**位置を指定せずに**追加する(`<E>` が epic、`<N>` が起票した割り込み)。**`--before` / `--after` を使ってはならない。** それらは `blocked-by` 関係を実際に書き込むため(`docs/josh-commands-automation.md` →「`josh epic --add`」)、「発見したランをブロックしていない欠陥」という割り込みの定義と矛盾する**偽の依存関係**になり、`epic:next` が実装中の子を「割り込みにブロックされている」として出さなくなる。位置を指定しない追加は依存を一切宣言しない(joshuafolkken/kit#1253)ので、**順序は実行側が持つ** — 次に取り上げるのは実行側の選択であって、宣言された関係ではない(経緯は `docs/maintainers/wip-cap-rationale.md` →「位置を指定しない追加の経緯」)。**先に提示させたいときは `--order-before <M>` を使う**(joshuafolkken/kit#1738)— これはタスクリストの行だけを動かし、依存宣言も `blocked-by` も一切書かないので、上の禁止には当たらない。**禁止しているのは依存を書き込む `--before` / `--after` であって、順序そのものではない。** `epic:next` は runnable な子をタスクリスト順に提示する(joshuafolkken/kit#1583)ため、位置を指定しない追加は「末尾に提示される」を意味する — 割り込みを次に取り上げてほしいなら、行だけを前に出すこの指定がその手段である。**epic の下に無いなら挿入先そのものが無い**ので、この手順は飛ばして 4 だけを行う。
|
|
82
82
|
4. **着手は、既にある承認の内側でのみ、指示を待たずに行う。** `backlogrun` の中なら、打たれたキーワードがバッチを承認しているので、割り込みは次の子として着手してよい。**バッチの外では `CLAUDE.md` →「Explicit invocation required」が変わらず効く** — 起票と挿入まで済ませたうえで、利用者に打つべきコマンド(`fullrun #<N>`)を報告して止まる。**割り込みは上限の例外であって、明示起動規則の例外ではない。**
|
|
83
83
|
|
|
84
84
|
**起票と、実行されるようにするところまでが 1 つのまとまりである。** epic の下にある割り込みを起票だけして追加しなければ、`epic:next` はそれを候補にすら出さない — Issue は残るが実行されないという、コメントに埋もれるのと大差ない状態になる。**epic の外にある割り込みでは、まとまりの後半は 4 の報告そのもの**であり、打つべきコマンドを利用者に渡すまでが 1 回の行為である。上の「ひとまとまりで判定する」がここにも効く。
|
|
85
85
|
|
|
86
|
-
#### 実行のしかた —
|
|
86
|
+
#### 実行のしかた — `main` で誤答している検証の欠陥は単独で走らせる
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
**kit 自身の検証が今の `main` で無関係な PR の判定まで誤らせている欠陥を直す Issue は単独で実行し、バッチを再開するのはそれが `main` へマージされてからとする。** 「着地」はマージであって、PR を開いた時点でもレビューが収束した時点でもない。
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
**該当するかは判断ではなく、次の 3 条件で決まる。**
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
92
|
+
1. **欠陥である**(`- 種別: 不具合`)。改善・リファクタ・削除・機能追加は当たらない。
|
|
93
|
+
2. **kit 自身の検証の欠陥である。** 検証とは次の 4 つを指し、配布先リポジトリ向けの CI・テンプレートの不具合は当たらない。
|
|
94
|
+
- **検証ゲート**(lint / 型チェック / スペルチェック / 単体テスト)
|
|
95
|
+
- **コードレビュー**
|
|
96
|
+
- **push 時のフック**
|
|
97
|
+
- **マージ時のチェック**
|
|
98
|
+
3. **今の `main` で、その Issue と無関係な PR の判定まで誤らせている**(嘘の緑 / 嘘の赤)。効率の問題や、特定の条件でしか起きないものは当たらない。
|
|
96
99
|
|
|
97
|
-
|
|
100
|
+
**3 条件すべてに当たれば単独実行、1 つでも外れれば `run:lane`。** 単独実行なら `run:solo` を付け、強制はそれを読む `backlog:next` と `epic:next --lanes` が行う(joshuafolkken/kit#2776)。外れれば(改善、機能追加、文書修正、配布先 CI の修正など)`run:lane` を付け、並列バッチの一員として走らせてよい。どちらもなければ `triage` が返り何も始まらない(joshuafolkken/kit#2779)ので、run が起票する Issue(割り込み・分割・前提)は起票時にどちらかを付ける。**「重大だと感じるか」は判定条件ではない**(起票側の 3 条件と同じ理由)。
|
|
98
101
|
|
|
99
|
-
|
|
102
|
+
**他レーンを止める根拠は 1 つ — 壊れた検証の上でバッチを回すと、全員の結果が信用できないこと。** 割り込み自身の検証が欠陥の影響下にあることはその Issue 自身の扱い(修正後の検証で確かめる)であって、他レーンを止める根拠にはしない。根拠と、判定を条件にした由来・狭めた経緯は `docs/maintainers/wip-cap-rationale.md` →「単独実行の理由と由来」。
|
|
100
103
|
|
|
101
104
|
## 上限そのものを変えるとき
|
|
102
105
|
|
|
103
|
-
|
|
106
|
+
**上限の数字は Tier C ではない** — 引き上げも引き下げも、測定を添えて提案してよい。ただし**変更は必ず `WIP_CAP` と「規則」節の 1 行を同じコミットで動かす**。片方だけ動かすと一致を固定するテストが落ちる。
|
|
104
107
|
|
|
105
108
|
**引き上げる条件は「窮屈だから」ではない。** オープン件数が 7 日移動平均で減り続けていて、なお上限が起票を止めているとき — つまり装置が目的を果たし終えたときだけである。
|
|
106
109
|
|
|
@@ -108,8 +111,8 @@ gh api "repos/{owner}/{repo}/issues?state=open&per_page=100" --paginate \
|
|
|
108
111
|
|
|
109
112
|
上限は単独では効かない。**製造側を止めないまま上限だけ入れると、製造は続いたまま実行だけが止まる。** 経緯は `docs/maintainers/wip-cap-rationale.md` →「3 つを 1 コミットで着地させた経緯」。
|
|
110
113
|
|
|
111
|
-
| 製造元 | 変更
|
|
112
|
-
| ------------------------- |
|
|
113
|
-
| 分割判定 |
|
|
114
|
-
| レビュー round 2 の残指摘 | 既定を branch 3(PR に 1 行残して落とす)に
|
|
115
|
-
| オープン件数 |
|
|
114
|
+
| 製造元 | 変更 | 単一ソース |
|
|
115
|
+
| ------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------- |
|
|
116
|
+
| 分割判定 | 既定を「分割しない」に。目安は単一ソースにある | `.claude/skills/workflow-commands/split-assessment.md` → "The question" |
|
|
117
|
+
| レビュー round 2 の残指摘 | 既定を branch 3(PR に 1 行残して落とす)に | `prompts/review.md` → "Three-way disposition after the cap" |
|
|
118
|
+
| オープン件数 | WIP 上限 | このファイル |
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- cspell:words coderabbit -->
|
|
4
4
|
|
|
5
|
-
このドキュメントは、Claude / Cursor / Gemini を含む複数の AI ツールで共通に使う Issue
|
|
5
|
+
このドキュメントは、Claude / Cursor / Gemini を含む複数の AI ツールで共通に使う Issue 駆動の共同作業ワークフローの**索引**である。
|
|
6
6
|
|
|
7
7
|
## この索引の使い方
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
**これは人間が読むための索引であり、規則を定める場所ではない。** 常駐の引き金は `CLAUDE.md` に、実行中の操作手順は `.claude/skills/workflow-commands/` に、各話題の規則は下の表のファイルにあり、それぞれが自分の規則の一次情報である。この索引はそれらを言い直さない。
|
|
10
10
|
|
|
11
11
|
**話題ごとにファイルが分かれている。** 以前はこの内容が 1 本の 169KB のファイルにあり、1 つの節を確かめるだけでも全体を読む必要があった。読んだものはそのセッションの残り全ターンで積み上がった前置きとして課金され続けるため、確認 1 回の費用が会話の長さに比例して効いていた(joshuafolkken/kit#965)。**必要な 1 本だけを開くこと。この索引を入口に、下の表から選ぶ。**
|
|
12
12
|
|
|
@@ -17,11 +17,8 @@
|
|
|
17
17
|
| Step 2: 提案依頼(AI 共通) | [`proposal-request.md`](./collaboration-workflow/proposal-request.md) |
|
|
18
18
|
| Step 3: 計画コメントを記録して通知する | [`plan-comment.md`](./collaboration-workflow/plan-comment.md) |
|
|
19
19
|
| 報告フォーマット(平易な概要 + 技術詳細) | [`report-format.md`](./collaboration-workflow/report-format.md) |
|
|
20
|
-
| セッション向け出力で Issue
|
|
21
|
-
|
|
|
22
|
-
| オープン Issue の WIP 上限(30 件) | [`wip-cap.md`](./collaboration-workflow/wip-cap.md) |
|
|
23
|
-
| リポジトリをまたぐ EPIC(本文は `epic-commands` skill) | [`cross-repo-epic.md`](./collaboration-workflow/cross-repo-epic.md) |
|
|
24
|
-
| `josh epic:audit` — 子 Issue 群を横断して矛盾を検出する(本文は `epic-commands` skill) | [`epic-audit.md`](./collaboration-workflow/epic-audit.md) |
|
|
20
|
+
| セッション向け出力で Issue はリンク+セッション言語の短い要約で参照する | [`issue-citation.md`](./collaboration-workflow/issue-citation.md) |
|
|
21
|
+
| オープン Issue の WIP 上限 | [`wip-cap.md`](./collaboration-workflow/wip-cap.md) |
|
|
25
22
|
| 別パッケージ起因の問題は割り込み Issue で対応する | [`upstream-interrupt.md`](./collaboration-workflow/upstream-interrupt.md) |
|
|
26
23
|
| 原則 — クローン禁止・シンプル第一・相談と実行の区別・最新優先・恒久ルールと配布物と規則の置き場所 | [`principles.md`](./collaboration-workflow/principles.md) |
|
|
27
24
|
| ファイル編集はコマンド本文に本文を載せない | [`file-edits.md`](./collaboration-workflow/file-edits.md) |
|
|
@@ -37,7 +34,7 @@
|
|
|
37
34
|
|
|
38
35
|
## 参照の書き方
|
|
39
36
|
|
|
40
|
-
`CLAUDE.md` と `.claude/skills/`
|
|
37
|
+
`CLAUDE.md` と `.claude/skills/` からこれらの話題を指すときは、**本文があるファイルを直接指す**(話題ファイル、skill へ単一ソース化済みならその skill。[`residency.md`](./collaboration-workflow/residency.md))。索引や指し先を経由させる形(`prompts/collaboration-workflow.md` → 「節名」)は、読み手に 2 回読みを強いるうえ、節名が変わると黙って行き止まりになる。
|
|
41
38
|
|
|
42
39
|
```md
|
|
43
40
|
See `prompts/collaboration-workflow/upstream-interrupt.md`.
|
package/prompts/review-rubric.md
CHANGED
|
@@ -74,7 +74,7 @@ code changed, because returning none is what the instruction rules out. So a Med
|
|
|
74
74
|
the second round even where the fixes were sufficient. The second round is narrowed to remove that.
|
|
75
75
|
|
|
76
76
|
**What changes is the question, never the standard.** A confirmed High still blocks the merge
|
|
77
|
-
whatever the round count, the cap
|
|
77
|
+
whatever the round count, the cap in `prompts/review.md` → "Review round cap" still holds, and every rule here applies to this pass
|
|
78
78
|
unchanged.
|
|
79
79
|
|
|
80
80
|
| | The first round | The second round |
|
package/prompts/review.md
CHANGED
|
@@ -27,8 +27,8 @@ points to them rather than restating them:
|
|
|
27
27
|
The workflow review uses the `reviewer` role profile printed by `pnpm josh review:brief`. Pass its
|
|
28
28
|
model and effort explicitly to the review subagent; do not substitute the review level for effort.
|
|
29
29
|
|
|
30
|
-
Re-run after applying fixes until **no high or medium findings remain — or until
|
|
31
|
-
|
|
30
|
+
Re-run after applying fixes until **no high or medium findings remain — or until the round cap below is
|
|
31
|
+
reached, the first review included — whichever comes first.** The cap below is not optional. The second round
|
|
32
32
|
is a verification pass over the fixes, not the first review again
|
|
33
33
|
(`prompts/review-rubric.md` → "The second round is a verification pass, not a second full review").
|
|
34
34
|
|
|
@@ -197,7 +197,7 @@ Only branch 2 files an Issue. What follows applies to that branch.
|
|
|
197
197
|
1. File the follow-up Issue referencing the current one, tagged `route:review-cap` — **before the current Issue closes.**
|
|
198
198
|
`pnpm josh issue:file "<title>" --body-file <body-file> --depth <n> --route review-cap`.
|
|
199
199
|
The command lints the body, applies the classification labels it declares, runs the duplicate scan
|
|
200
|
-
and then `epic:bundle` on the new Issue (`docs/josh-commands.md` → `josh issue:file`). The
|
|
200
|
+
and then `epic:bundle` on the new Issue (`docs/josh-commands-automation.md` → `josh issue:file`). The
|
|
201
201
|
`epic:bundle` candidate search reads open issues only, so once the parent has closed it answers
|
|
202
202
|
`none` permanently.
|
|
203
203
|
2. Act on the `epic:bundle` answer it prints. **`epic:bundle` recommends and writes nothing**, so acting means running the
|
|
@@ -9,9 +9,13 @@ AI tools cannot perform OAuth browser login to SonarCloud, so this guide assumes
|
|
|
9
9
|
## Quality Gate enforcement (CI blocks PRs)
|
|
10
10
|
|
|
11
11
|
The distributed `.github/workflows/sonar-qube.yml` runs the SonarCloud scan with
|
|
12
|
-
`-Dsonar.qualitygate.wait=true
|
|
13
|
-
Quality Gate
|
|
14
|
-
|
|
12
|
+
`-Dsonar.qualitygate.wait=true`, so the `SonarQube` job — a required PR check — fails when the
|
|
13
|
+
Quality Gate is red. **The gate alone is not enough**: `Sonar way` judges ratings and ratios, so a
|
|
14
|
+
few MINOR code smells keep the maintainability rating at A and a small copied block stays under the
|
|
15
|
+
duplication threshold. On a pull request the job therefore ends with `pnpm josh sonar:new-code <PR>`,
|
|
16
|
+
which **fails on a single new issue of any type or severity, or a single new duplicated block**
|
|
17
|
+
(joshuafolkken/kit#3045). An issue resolved in SonarCloud as accepted or a false positive is not
|
|
18
|
+
counted — that resolution is the route for a deliberate exception. This job is the single enforcement point:
|
|
15
19
|
`josh followup` does **not** scan SonarCloud findings (it only scans CodeRabbit / Claude Review
|
|
16
20
|
comments), but it **does** wait on the required `SonarQube` CI check, so a red gate also blocks the
|
|
17
21
|
`followup` merge. Consumers pick the workflow up verbatim via `josh sync`; do not re-implement the
|
|
@@ -25,6 +29,10 @@ run without the secret in the Dependabot store), so a repository that relies on
|
|
|
25
29
|
|
|
26
30
|
### New Code vs Overall Code semantics
|
|
27
31
|
|
|
32
|
+
The scan passes `package.json`'s `version` as `sonar.projectVersion`, so New Code — "since the
|
|
33
|
+
previous version" — restarts at every `josh bump` that reaches main instead of growing from the
|
|
34
|
+
first analysis on.
|
|
35
|
+
|
|
28
36
|
SonarCloud's default **Sonar way** Quality Gate evaluates **New Code only** — conditions
|
|
29
37
|
(new bugs, new code smells above the Maintainability rating, new coverage/duplication) apply to
|
|
30
38
|
lines changed in the PR's New Code period, not the whole codebase. Consequences:
|
package/prompts/testing-guide.md
CHANGED
|
@@ -264,9 +264,9 @@ a repository whose CI reports no `E2E` context at all resolves the required entr
|
|
|
264
264
|
which is never `pass`, so the evaluation stays `pending` until the 32-minute wait times out with
|
|
265
265
|
nothing actually wrong. What guarantees the job runs is the detection rule above, not the required
|
|
266
266
|
list. A project that wants it required opts in through `JOSH_REQUIRED_CHECKS`, which
|
|
267
|
-
`scripts/
|
|
267
|
+
`scripts/gh/git-pr-checks-eval.test.ts` covers; the decision itself — `E2E` off the default list,
|
|
268
268
|
and a repository reporting no `E2E` check still mergeable — is pinned in
|
|
269
|
-
`scripts/
|
|
269
|
+
`scripts/gh/git-pr-checks-e2e-gate.test.ts`.
|
|
270
270
|
|
|
271
271
|
**A red E2E is reported as soon as it goes red, and by name.** `E2E` is not on the required list, so
|
|
272
272
|
until joshuafolkken/kit#990 nothing ended the wait when it failed: the rollup read as pending,
|
|
@@ -275,4 +275,4 @@ to complete.` — a message naming neither the job nor the cause. Any failing ch
|
|
|
275
275
|
on the poll that sees it, and the error names it (`PR checks failed (failed checks: E2E).`).
|
|
276
276
|
The poll loop keeps CodeRabbit exempt under the temporary kit#753 policy. **This is a change to how fast the gate
|
|
277
277
|
reports, never to what it lets through** — no failing check gained a path to `success`, which
|
|
278
|
-
`scripts/
|
|
278
|
+
`scripts/gh/git-pr-checks-e2e-gate.test.ts` continues to assert.
|
|
@@ -167,7 +167,6 @@ const adopt_toolkits = {
|
|
|
167
167
|
TOOLKIT_SCOPE,
|
|
168
168
|
LATEST_VERSION,
|
|
169
169
|
is_toolkit_package,
|
|
170
|
-
compare_toolkits,
|
|
171
170
|
declared_toolkits,
|
|
172
171
|
misplaced_toolkits,
|
|
173
172
|
pick_bin_name,
|
|
@@ -175,7 +174,6 @@ const adopt_toolkits = {
|
|
|
175
174
|
read_bin_name,
|
|
176
175
|
all_declared_toolkits,
|
|
177
176
|
is_unreachable_toolkit,
|
|
178
|
-
resolve_toolkit,
|
|
179
177
|
discover_toolkits,
|
|
180
178
|
unresolved_toolkits,
|
|
181
179
|
}
|
package/scripts/adopt/adopt.ts
CHANGED
|
@@ -156,13 +156,11 @@ function main(argv: ReadonlyArray<string>): void {
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
const adopt = {
|
|
159
|
-
DRY_RUN_REASON,
|
|
160
159
|
KNOWN_FLAGS,
|
|
161
160
|
NOTHING_TO_ADOPT,
|
|
162
161
|
parse_options,
|
|
163
162
|
run_here,
|
|
164
163
|
run,
|
|
165
|
-
main,
|
|
166
164
|
}
|
|
167
165
|
|
|
168
166
|
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -115,7 +115,7 @@ function check(profile: AgentProfile, ports: DiagnosticPorts = default_ports): D
|
|
|
115
115
|
return check_auth(cli, ports)
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
const agent_diagnostics = {
|
|
118
|
+
const agent_diagnostics = { check }
|
|
119
119
|
|
|
120
120
|
export type { DiagnosticPorts, DiagnosticResult, ProcessOutcome }
|
|
121
121
|
export { agent_diagnostics }
|
|
@@ -302,17 +302,11 @@ function parse(value: unknown): AgentProfile | undefined {
|
|
|
302
302
|
|
|
303
303
|
const agent_role_profile = {
|
|
304
304
|
DEFAULT_PROFILES,
|
|
305
|
-
EFFORT_SCHEMA,
|
|
306
|
-
ENV_KEYS,
|
|
307
305
|
HANDED_PROVIDER_KEY,
|
|
308
306
|
IMPLEMENTATION_PHASE,
|
|
309
|
-
LEGACY_WORKER_KEYS,
|
|
310
307
|
MAX_VALUE_LENGTH,
|
|
311
308
|
OPENAI_PROFILES,
|
|
312
|
-
PHASE_EFFORT,
|
|
313
|
-
PHASE_SCHEMA,
|
|
314
309
|
PRE_GATE_PHASE,
|
|
315
|
-
PROVIDER_SCHEMA,
|
|
316
310
|
PROFILE_SCHEMA,
|
|
317
311
|
REVIEWER,
|
|
318
312
|
SCHEDULER,
|
|
@@ -322,7 +316,6 @@ const agent_role_profile = {
|
|
|
322
316
|
has_completion_callback,
|
|
323
317
|
is_safe_value,
|
|
324
318
|
parse,
|
|
325
|
-
phase_effort,
|
|
326
319
|
resolve,
|
|
327
320
|
resolve_provider,
|
|
328
321
|
with_phase_effort,
|
|
@@ -88,7 +88,7 @@ function build(invocation: string, profile: AgentProfile, cwd?: string): CodexAr
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
const codex_agent_argv = {
|
|
91
|
+
const codex_agent_argv = { build }
|
|
92
92
|
|
|
93
93
|
export type { CodexArgv }
|
|
94
94
|
export { codex_agent_argv }
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { hook_launch } from '#scripts/init/hook-launch'
|
|
2
|
+
|
|
3
|
+
// `.codex/hooks.json` is derived from `.claude/settings.json`, never written by hand
|
|
4
|
+
// (joshuafolkken/kit#2997). The hand copy carried every hook command twice, so a change to one side
|
|
5
|
+
// left the other silently stale. Codex differs from Claude Code in three places only, and each is a
|
|
6
|
+
// rule applied here rather than a line maintained in the copy:
|
|
7
|
+
//
|
|
8
|
+
// 1. The pretool and posttool handlers run through the Codex input adapter, which translates the
|
|
9
|
+
// `apply_patch` payload into the Edit/Write shape the Claude-side guards read.
|
|
10
|
+
// 2. The PreToolUse and PostToolUse matchers also select `apply_patch`, Codex's edit tool.
|
|
11
|
+
// 3. UserPromptSubmit carries no matcher — Codex documents that the event ignores it.
|
|
12
|
+
|
|
13
|
+
interface HookHandler {
|
|
14
|
+
type: string
|
|
15
|
+
command: string
|
|
16
|
+
timeout?: number
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface MatcherGroup {
|
|
20
|
+
matcher?: string
|
|
21
|
+
hooks: Array<HookHandler>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type HookEvents = Record<string, Array<MatcherGroup>>
|
|
25
|
+
|
|
26
|
+
interface HookConfig {
|
|
27
|
+
hooks: HookEvents
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const CODEX_EDIT_TOOL = 'apply_patch'
|
|
31
|
+
const TOOL_EVENTS: ReadonlySet<string> = new Set(['PreToolUse', 'PostToolUse'])
|
|
32
|
+
const UNMATCHED_EVENTS: ReadonlySet<string> = new Set(['UserPromptSubmit'])
|
|
33
|
+
const JSON_INDENT = '\t'
|
|
34
|
+
|
|
35
|
+
function adapter_command(mode: string): string {
|
|
36
|
+
return hook_launch.bundle_launch_command(
|
|
37
|
+
`codex-hook-adapter.js ${mode}`,
|
|
38
|
+
`pnpm exec tsx scripts/hooks/codex-hook-adapter.ts ${mode}`,
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Each Claude-side guard command the adapter stands in for, keyed by that command verbatim.
|
|
43
|
+
const ADAPTED_COMMANDS: ReadonlyMap<string, string> = new Map([
|
|
44
|
+
[
|
|
45
|
+
hook_launch.hook_launch_command('pretool-guard.js', 'pretool:guard'),
|
|
46
|
+
adapter_command('pretool'),
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
hook_launch.hook_launch_command('format-edited.js', 'format:edited'),
|
|
50
|
+
adapter_command('posttool'),
|
|
51
|
+
],
|
|
52
|
+
])
|
|
53
|
+
|
|
54
|
+
function codex_handler(handler: HookHandler): HookHandler {
|
|
55
|
+
return { ...handler, command: ADAPTED_COMMANDS.get(handler.command) ?? handler.command }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function codex_matcher(event: string, matcher: string | undefined): string | undefined {
|
|
59
|
+
if (UNMATCHED_EVENTS.has(event)) return undefined
|
|
60
|
+
if (matcher !== undefined && TOOL_EVENTS.has(event)) return `${matcher}|${CODEX_EDIT_TOOL}`
|
|
61
|
+
|
|
62
|
+
return matcher
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function codex_group(event: string, group: MatcherGroup): MatcherGroup {
|
|
66
|
+
const matcher = codex_matcher(event, group.matcher)
|
|
67
|
+
const hooks = group.hooks.map((handler) => codex_handler(handler))
|
|
68
|
+
|
|
69
|
+
return matcher === undefined ? { hooks } : { matcher, hooks }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function codex_hook_config(claude: HookConfig): HookConfig {
|
|
73
|
+
const events = Object.entries(claude.hooks).map(([event, groups]) => [
|
|
74
|
+
event,
|
|
75
|
+
groups.map((group) => codex_group(event, group)),
|
|
76
|
+
])
|
|
77
|
+
|
|
78
|
+
return { hooks: Object.fromEntries(events) as HookEvents }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The file text `.codex/hooks.json` holds — the formatter's own output for this JSON, so a write
|
|
82
|
+
// followed by `pnpm josh format:edited` leaves it byte-identical.
|
|
83
|
+
function codex_hooks_text(claude_settings_text: string): string {
|
|
84
|
+
const claude = JSON.parse(claude_settings_text) as HookConfig
|
|
85
|
+
|
|
86
|
+
return `${JSON.stringify(codex_hook_config(claude), undefined, JSON_INDENT)}\n`
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const codex_hooks = { adapter_command, codex_hook_config, codex_hooks_text }
|
|
90
|
+
|
|
91
|
+
export { codex_hooks }
|
|
92
|
+
export type { HookConfig }
|
|
@@ -86,6 +86,6 @@ function refused_ask_of(permission_denials: unknown): string | undefined {
|
|
|
86
86
|
return questions.map((question) => render_question(question)).join(QUESTION_SEPARATOR)
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
const interactive_ask = {
|
|
89
|
+
const interactive_ask = { is_interactive_tool, refused_ask_of }
|
|
90
90
|
|
|
91
91
|
export { interactive_ask }
|
|
@@ -3,19 +3,19 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { epic_bundle_gaps } from '#scripts/epic/epic-bundle-gaps'
|
|
4
4
|
import { epic_index, type FetchedEpics } from '#scripts/epic/epic-index'
|
|
5
5
|
import { epic_issue } from '#scripts/epic/epic-issue'
|
|
6
|
-
import { git_gh_command } from '#scripts/
|
|
7
|
-
import { SUMMARY_FIELDS } from '#scripts/
|
|
8
|
-
import { git_next_issues } from '#scripts/git/git-next-issues'
|
|
9
|
-
import { AUTO_OK_LABEL } from '#scripts/git/issue-labels'
|
|
6
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
7
|
+
import { SUMMARY_FIELDS } from '#scripts/gh/git-gh-issue'
|
|
10
8
|
import { cutoff_cause, cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
|
|
11
9
|
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
12
10
|
import { open_issue_schema, type OpenIssueData } from '#scripts/git/schemas'
|
|
11
|
+
import { git_next_issues } from '#scripts/issue/git-next-issues'
|
|
12
|
+
import { AUTO_OK_LABEL } from '#scripts/issue/issue-labels'
|
|
13
13
|
|
|
14
14
|
// `josh auto-ok:next` — which issue outside the epic an unattended run picks up next
|
|
15
15
|
// (joshuafolkken/kit#906).
|
|
16
16
|
//
|
|
17
17
|
// A command rather than a documented `gh` invocation, for the reason the label constant exists: the
|
|
18
|
-
// name `auto-ok` is single-sourced in `scripts/
|
|
18
|
+
// name `auto-ok` is single-sourced in `scripts/issue/issue-labels.ts`, and a procedure that told an
|
|
19
19
|
// agent to type `gh issue list --label auto-ok` would put a second copy of it in prose, where
|
|
20
20
|
// nothing checks it. The contract is `epic:next`'s: one token on standard output, every explanation
|
|
21
21
|
// on standard error, so `answer=$(pnpm josh auto-ok:next)` reads it.
|
|
@@ -48,7 +48,7 @@ const LISTING_LIMIT = 200
|
|
|
48
48
|
// CLI's version cannot be what changed the row shape — the same misdirection the message below
|
|
49
49
|
// already refuses to repeat for the blocker relations, left standing one constant above it.
|
|
50
50
|
const UNREADABLE_MESSAGE = `Could not read the \`${AUTO_OK_LABEL}\` listing. That is not "nothing is opted in" — check \`gh auth status\` and ask again.`
|
|
51
|
-
const UNEXPECTED_SHAPE_MESSAGE = `Read the \`${AUTO_OK_LABEL}\` listing but could not parse it. That is not "nothing is opted in" — the rows came back in a shape this command does not recognize, so check the fields it asks for and the REST field mapping in \`scripts/
|
|
51
|
+
const UNEXPECTED_SHAPE_MESSAGE = `Read the \`${AUTO_OK_LABEL}\` listing but could not parse it. That is not "nothing is opted in" — the rows came back in a shape this command does not recognize, so check the fields it asks for and the REST field mapping in \`scripts/gh/git-gh-issue-rest.ts\` rather than your authentication.`
|
|
52
52
|
// The blocker relations failing takes the whole listing with them, and `issue_list` swallows
|
|
53
53
|
// the error — so the read looks exactly like an access failure and sends the reader to
|
|
54
54
|
// `gh auth status`, which is green. That is the misdirection joshuafolkken/kit#996 added the message
|
|
@@ -491,23 +491,13 @@ const auto_ok_cli = {
|
|
|
491
491
|
TRUNCATED_WITHOUT_ANSWER,
|
|
492
492
|
NONE_OPTED_IN_MESSAGE,
|
|
493
493
|
truncated_cause,
|
|
494
|
-
parse_issue_number,
|
|
495
|
-
parse_exclude,
|
|
496
|
-
parse_pair,
|
|
497
494
|
parse_options,
|
|
498
495
|
fetch_opted_in,
|
|
499
|
-
parse_listing,
|
|
500
|
-
is_page_complete,
|
|
501
|
-
is_closed,
|
|
502
|
-
is_unblocked,
|
|
503
496
|
fetch_tracking,
|
|
504
497
|
is_runnable,
|
|
505
498
|
pick_next,
|
|
506
499
|
truncation_note,
|
|
507
|
-
none_reason,
|
|
508
|
-
report,
|
|
509
500
|
run,
|
|
510
|
-
main,
|
|
511
501
|
}
|
|
512
502
|
|
|
513
503
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -268,7 +268,6 @@ function decide(input: BudgetInput): BudgetDecision {
|
|
|
268
268
|
|
|
269
269
|
const backlog_budget = {
|
|
270
270
|
ANSWERS,
|
|
271
|
-
ANSWER_STOP_REASONS,
|
|
272
271
|
BLOCKED_REASON,
|
|
273
272
|
DEFAULT_IDLE_MINUTES,
|
|
274
273
|
DEFAULT_IDLE_MS,
|
|
@@ -283,7 +282,6 @@ const backlog_budget = {
|
|
|
283
282
|
UNREADABLE_REASON,
|
|
284
283
|
WATCH_VERDICT,
|
|
285
284
|
WHOLE_RUN_BUDGET_HOURS,
|
|
286
|
-
WHOLE_RUN_BUDGET_MINUTES,
|
|
287
285
|
WHOLE_RUN_BUDGET_MS,
|
|
288
286
|
WHOLE_RUN_REASON,
|
|
289
287
|
decide,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { EpicChild } from '#scripts/epic/epic-graph'
|
|
2
2
|
import type { EpicNextResult, RepoCandidates } from '#scripts/epic/epic-report'
|
|
3
|
-
import { git_gh_command } from '#scripts/
|
|
3
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
4
|
import { defect_rate, type DefectRate, type IssueKind } from '#scripts/issue/defect-rate'
|
|
5
5
|
import { defect_rate_cli } from '#scripts/issue/defect-rate-cli'
|
|
6
6
|
|
|
@@ -72,6 +72,6 @@ async function prioritize(
|
|
|
72
72
|
return await reorder(result, repo)
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
const backlog_defect_priority = { UNMEASURED_MESSAGE,
|
|
75
|
+
const backlog_defect_priority = { UNMEASURED_MESSAGE, prioritize }
|
|
76
76
|
|
|
77
77
|
export { backlog_defect_priority }
|
|
@@ -5,13 +5,13 @@ import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-thresho
|
|
|
5
5
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
6
6
|
import { josh_command } from '#scripts/josh/josh-run'
|
|
7
7
|
import { lane_await, type AwaitState } from '#scripts/lane/lane-await'
|
|
8
|
-
import { lane_launch_cli } from '#scripts/lane/lane-launch-cli'
|
|
8
|
+
import { lane_launch_cli, type LaunchOutcome } from '#scripts/lane/lane-launch-cli'
|
|
9
9
|
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
10
10
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
11
11
|
import { error_text } from '#scripts/lib/error-message'
|
|
12
12
|
import { run_carry, type RunCarry } from '#scripts/run/run-carry'
|
|
13
13
|
import { run_event_stream_emit } from '#scripts/run/run-event-stream-emit'
|
|
14
|
-
import { run_merge_cli } from '#scripts/run/run-merge-cli'
|
|
14
|
+
import { run_merge_cli, type MergeResult } from '#scripts/run/run-merge-cli'
|
|
15
15
|
import { z } from 'zod'
|
|
16
16
|
import {
|
|
17
17
|
backlog_drive,
|
|
@@ -28,6 +28,7 @@ import { backlog_drive_owner } from './backlog-drive-owner'
|
|
|
28
28
|
import { backlog_drive_restore } from './backlog-drive-restore'
|
|
29
29
|
import { backlog_drive_retrospective } from './backlog-drive-retrospective'
|
|
30
30
|
import { backlog_offer_cli } from './backlog-offer-cli'
|
|
31
|
+
import { backlog_ready } from './backlog-ready'
|
|
31
32
|
|
|
32
33
|
// `josh backlog:drive` — the backlogrun parent's loop as one resident wait (joshuafolkken/kit#2499).
|
|
33
34
|
// The parent issues it once, in the background, and is woken only when it exits — with a token the model
|
|
@@ -217,7 +218,7 @@ function merge_token(out: string, code: number): string {
|
|
|
217
218
|
|
|
218
219
|
// The child's transcript, where its lane recorded one, so `run:merge` can tell an API outage from a
|
|
219
220
|
// failure exactly as it does for the parent that passes `--output` by hand.
|
|
220
|
-
async function merge(issue: string, owner: string): Promise<
|
|
221
|
+
async function merge(issue: string, owner: string): Promise<MergeResult> {
|
|
221
222
|
await backlog_drive_owner.assert_current(owner)
|
|
222
223
|
const lane = await lane_registry.find_open_lane(issue)
|
|
223
224
|
const result = await run_merge_cli.merge_child({
|
|
@@ -231,13 +232,15 @@ async function merge(issue: string, owner: string): Promise<string> {
|
|
|
231
232
|
|
|
232
233
|
await backlog_drive_named.mark_done(issue, result, owner)
|
|
233
234
|
|
|
234
|
-
return result
|
|
235
|
+
return result
|
|
235
236
|
}
|
|
236
237
|
|
|
237
|
-
async function launch(issue: string, owner: string): Promise<
|
|
238
|
+
async function launch(issue: string, owner: string): Promise<LaunchOutcome['kind']> {
|
|
238
239
|
await backlog_drive_owner.assert_current(owner)
|
|
239
240
|
|
|
240
|
-
|
|
241
|
+
const outcome = await lane_launch_cli.launch_lane({ issue, stash: undefined })
|
|
242
|
+
|
|
243
|
+
return outcome.kind
|
|
241
244
|
}
|
|
242
245
|
|
|
243
246
|
// `lane:await`'s re-confirmed check, one state per child. A child already gone when the loop starts —
|
|
@@ -304,6 +307,7 @@ function ports_of(
|
|
|
304
307
|
merge: async (issue) => await merge(issue, context.owner),
|
|
305
308
|
offer: async (state) => await read_offer(state, context),
|
|
306
309
|
launch: async (issue) => await launch(issue, context.owner),
|
|
310
|
+
free_lanes: backlog_ready.drive_free_lane_count,
|
|
307
311
|
now: () => new Date(),
|
|
308
312
|
sleep: async (milliseconds) => {
|
|
309
313
|
await sleep(milliseconds)
|
|
@@ -375,14 +379,12 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
375
379
|
}
|
|
376
380
|
|
|
377
381
|
const backlog_drive_cli = {
|
|
378
|
-
USAGE,
|
|
379
382
|
end_line,
|
|
380
383
|
finish: backlog_drive_finish.finish,
|
|
381
384
|
merge_token,
|
|
382
385
|
offer_argv: backlog_drive_offer_argv.offer_argv,
|
|
383
386
|
parse,
|
|
384
387
|
resume_line,
|
|
385
|
-
run,
|
|
386
388
|
to_offer,
|
|
387
389
|
}
|
|
388
390
|
|