@joshuafolkken/kit 1.1035.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/verify-ui/SKILL.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +21 -13
- package/.claude/skills/workflow-commands/background-commands.md +5 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
- package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
- package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +6 -4
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +3 -3
- 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 +2 -2
- 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 +44 -89
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
- 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 +24 -4
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +21 -0
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +42 -48
- 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-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
- package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
- package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
- package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
- package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
- package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +15 -34
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +23 -16
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +188 -509
- package/dist/josh.js +166 -225
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +412 -64
- package/eslint/rules/promise.js +5 -0
- package/package.json +13 -8
- package/prompts/collaboration-workflow/file-edits.md +6 -53
- 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 +4 -4
- package/prompts/collaboration-workflow/rule-delivery.md +5 -36
- package/prompts/collaboration-workflow/shell-body.md +7 -9
- package/prompts/collaboration-workflow/turn-batching.md +21 -37
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +36 -36
- 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 +12 -4
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +2 -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 +15 -25
- 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 +32 -22
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +6 -8
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +34 -17
- package/scripts/backlog/backlog-rank.ts +106 -0
- 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 +47 -31
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +92 -11
- 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 +11 -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 +8 -9
- 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 +13 -4
- 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 +20 -30
- 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 +37 -0
- 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 +32 -30
- 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-command.ts +1 -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-execa-error.ts +6 -1
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +24 -6
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push-transport.ts +12 -69
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn.ts +79 -3
- package/scripts/git/git-ssh-keepalive.ts +74 -0
- 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 +4 -2
- 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-cli.ts +15 -0
- package/scripts/hooks/format-edited-file.ts +4 -9
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard-cli.ts +21 -0
- package/scripts/hooks/pretool-guard.ts +36 -19
- 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 +8 -2
- package/scripts/init/start-plan.ts +18 -5
- package/scripts/init/start-setup-pr.ts +52 -25
- package/scripts/init/start-steps.ts +42 -9
- package/scripts/init/start.ts +40 -10
- 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 +37 -8
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +19 -3
- 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 +20 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/issue/issue-rank.ts +89 -0
- 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 -102
- 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 +10 -3
- 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 +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-child-marker.ts +16 -2
- package/scripts/lane/lane-cli.ts +33 -18
- 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/lane-report.ts +10 -4
- 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-plan.ts +185 -0
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -3
- package/scripts/propagate/propagate-steps.ts +19 -6
- package/scripts/propagate/propagate-targets.ts +13 -6
- package/scripts/propagate/propagate.ts +60 -46
- 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 +1 -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 +48 -16
- package/scripts/review/review-brief-cli.ts +72 -8
- package/scripts/review/review-brief.ts +67 -9
- 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 +6 -2
- 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 +1 -2
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/issue-fold.ts +1 -2
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-carry-conflict.ts +1 -2
- package/scripts/rules/lane-park.ts +14 -8
- 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/pre-gate-cut.ts +2 -2
- 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 +24 -8
- 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 +143 -0
- 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 +3 -3
- package/scripts/run/run-progress.ts +22 -10
- 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 +27 -77
- 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 +87 -0
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +23 -30
- package/scripts/run/run-ship-review.ts +20 -0
- package/scripts/run/run-ship-scoped.ts +45 -0
- package/scripts/run/run-ship-stage.ts +5 -1
- package/scripts/run/run-ship-steps.ts +105 -0
- package/scripts/run/run-ship.ts +2 -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 +4 -5
- package/scripts/run/run-wake-describe.ts +19 -1
- 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 +2 -3
- 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 +97 -0
- 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 +5 -4
- package/scripts/version/version-remote.ts +28 -14
- 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
|
@@ -54,7 +54,7 @@ inside the invocation" below):
|
|
|
54
54
|
| `--max` | how many issues one invocation may merge — a run's own filing competes for that number rather than extending it | `run:carry --merged` |
|
|
55
55
|
| `--idle`, and the 8-hour whole-run bound | how long one invocation may go on looking for more | the record's `started_at` |
|
|
56
56
|
| **Ten filings per invocation** | how much one invocation may add to the pool at all, on **every** filing route (`SKILL.md` → §2d) | `run:carry --filed` |
|
|
57
|
-
| The WIP cap
|
|
57
|
+
| The WIP cap on open issues | how large the pool may become, across invocations | `prompts/collaboration-workflow/wip-cap.md` |
|
|
58
58
|
|
|
59
59
|
One invocation may add at most ten issues to the pool and merge at most `--max` of them, after which
|
|
60
60
|
the run ends and the next one waits for a person to type the keyword.
|
|
@@ -131,7 +131,7 @@ single source.
|
|
|
131
131
|
carried in a record rather than in the conversation:
|
|
132
132
|
|
|
133
133
|
```bash
|
|
134
|
-
pnpm josh run:carry --begin "backlogrun --max 5 --idle 30" --owner "$PPID"
|
|
134
|
+
pnpm josh run:carry --begin "backlogrun --max 5 --idle 30" --owner "$PPID"
|
|
135
135
|
pnpm josh run:carry --json # read it back in a resumed session
|
|
136
136
|
```
|
|
137
137
|
|
|
@@ -140,7 +140,7 @@ be answered and every standing record is refused rather than resumed. A live PID
|
|
|
140
140
|
the sandbox cannot read is held as `busy`.
|
|
141
141
|
|
|
142
142
|
**Ask it before the plan, in the same turn as the first `git switch main && git pull`.** The contract
|
|
143
|
-
is `docs/josh-commands.md` → "`josh run:carry`"; what this loop does with each answer is here:
|
|
143
|
+
is `docs/josh-commands-automation.md` → "`josh run:carry`"; what this loop does with each answer is here:
|
|
144
144
|
|
|
145
145
|
| It answers | What the run does |
|
|
146
146
|
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -204,7 +204,7 @@ judgment starts an AI session, with the branch result and resume flags in its pr
|
|
|
204
204
|
**Start it in the same turn as `--begin`, and stop it in the same turn as `--end`:**
|
|
205
205
|
|
|
206
206
|
```bash
|
|
207
|
-
pnpm josh run:wake --start #
|
|
207
|
+
pnpm josh run:wake --start # right after `run:carry --begin`
|
|
208
208
|
pnpm josh run:wake --stop # in the same turn as `run:carry --end`
|
|
209
209
|
```
|
|
210
210
|
|
|
@@ -233,7 +233,7 @@ expired or cannot be read ends it the same way. `none` — the run having finish
|
|
|
233
233
|
|
|
234
234
|
**A person keeps control of it.** `pnpm josh run:wake --list` names the running supervisor and
|
|
235
235
|
`--stop` ends it; the full contract, what it launches and why that is a constant rather than a
|
|
236
|
-
setting are `docs/josh-commands.md` → "`josh run:wake`".
|
|
236
|
+
setting are `docs/josh-commands-automation.md` → "`josh run:wake`".
|
|
237
237
|
|
|
238
238
|
**Every unattended role runs with the provider selected from the invoking CLI and its own profile.**
|
|
239
239
|
Codex sessions use OpenAI; Claude Code sessions use Anthropic. Anthropic uses scheduler
|
|
@@ -244,7 +244,7 @@ and legacy `JOSH_LANE_*` values to the worker only. Invalid configuration, a mis
|
|
|
244
244
|
session marker, or a missing, outdated or unauthenticated CLI refuses without fallback, promotion or
|
|
245
245
|
worker retry. `run:wake --list`, `lane:list`, the review brief and each launch
|
|
246
246
|
log expose the resolved provider, role, model and effort.
|
|
247
|
-
`docs/josh-commands.md` → "`josh lane:dispatch`" and `backlogrun-child.md` → "Each child runs in a
|
|
247
|
+
`docs/josh-commands-automation.md` → "`josh lane:dispatch`" and `backlogrun-child.md` → "Each child runs in a
|
|
248
248
|
delegated unit" are the single sources.
|
|
249
249
|
|
|
250
250
|
**It relays progress from the existing report record.** The driver keeps the same `run:merge` event
|
|
@@ -267,7 +267,7 @@ run.
|
|
|
267
267
|
**The plan is one command's output, not an assembly of several:**
|
|
268
268
|
|
|
269
269
|
```bash
|
|
270
|
-
pnpm josh backlog:plan
|
|
270
|
+
pnpm josh backlog:plan
|
|
271
271
|
```
|
|
272
272
|
|
|
273
273
|
**It renders the same classified pool `backlog:next` answers from**, so **the plan cannot promise an
|
|
@@ -282,9 +282,8 @@ order the run does not take**. Its four sections are:
|
|
|
282
282
|
is distinguished from "not reached yet".
|
|
283
283
|
|
|
284
284
|
**Report all four to the person, in the session language, before the first child starts.** Epic
|
|
285
|
-
children are enumerated individually rather than summarized under their root.
|
|
286
|
-
|
|
287
|
-
complete.
|
|
285
|
+
children are enumerated individually rather than summarized under their root. Report a truncated-listing
|
|
286
|
+
`⚠` with them: the plan is then partial.
|
|
288
287
|
|
|
289
288
|
### Resolve what the plan can resolve, before starting
|
|
290
289
|
|
|
@@ -293,27 +292,28 @@ stop at a time.**
|
|
|
293
292
|
|
|
294
293
|
- **Decide everything decidable from the issue itself.** Read the issue's body **and its comments**
|
|
295
294
|
(`SKILL.md` → §2g), and where the answer is already there, record it as an Issue comment and
|
|
296
|
-
**remove the label** — `CLAUDE.md` → "Decision autonomy" already makes that Tier A. **Read
|
|
297
|
-
|
|
298
|
-
"Waiting on a person" — rather than a `gh api` pair per issue.
|
|
295
|
+
**remove the label** — `CLAUDE.md` → "Decision autonomy" already makes that Tier A. **Read them all in
|
|
296
|
+
one `pnpm josh issue:read <N> <N> …` call**, not a `gh api` pair per issue.
|
|
299
297
|
- **Never measure in order to decide.** A question needing a benchmark, a profile, or a run of the
|
|
300
298
|
thing itself is not settled here: it stays labelled and the plan says so.
|
|
301
|
-
- **Label what you find.** An issue
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
body again.
|
|
299
|
+
- **Label what you find.** An issue needing a person's judgement gets `needs-decision`, applied as
|
|
300
|
+
`backlogrun-park.md` → "park and continue" does. **The next plan classifies it by the label alone**,
|
|
301
|
+
never the body.
|
|
305
302
|
- **Order and isolate the pool in the same pass** (joshuafolkken/kit#2776), from the same
|
|
306
303
|
`issue:read`: an issue that must land first (it builds what another reuses, or both edit one code
|
|
307
|
-
path) becomes a native `blocked-by`; an issue the `wip-cap.md` → 「実行のしかた」
|
|
308
|
-
gets `run:solo`, **every other one `run:lane`**. Comment the reason; the offer commands enforce all
|
|
304
|
+
path) becomes a native `blocked-by`; an issue meeting all three of the `wip-cap.md` → 「実行のしかた」
|
|
305
|
+
conditions gets `run:solo`, **every other one `run:lane`**. Comment the reason; the offer commands enforce all
|
|
309
306
|
three, answering `triage` while an issue has neither.
|
|
307
|
+
- **`priority:high` puts an issue first** (joshuafolkken/kit#2928; ranking: `docs/josh-commands-automation.md` →
|
|
308
|
+
`josh backlog:next`). Apply it only on a cited ground — a stated deadline or urgency, or a person's
|
|
309
|
+
written policy — commenting the ground; **never remove it**.
|
|
310
310
|
- **Report the order those labels produce — `pnpm josh backlog:plan --waves`** (joshuafolkken/kit#2778),
|
|
311
311
|
`backlog:next` played forward wave by wave. Report it with the plan, never an order derived by hand.
|
|
312
312
|
- **Then start the loop.** Whatever is still labelled is reported as parked and left standing; the
|
|
313
313
|
run does not wait on it.
|
|
314
314
|
|
|
315
|
-
**`needs-decision`, `run:solo` and `
|
|
316
|
-
`auto-ok` or `needs-human-review`.** Those two stay a person's alone (this file, `SKILL.md` → §2z); a
|
|
315
|
+
**`needs-decision`, `run:solo`, `run:lane` and `priority:high` are the workflow labels a run may
|
|
316
|
+
apply, and none is `auto-ok` or `needs-human-review`.** Those two stay a person's alone (this file, `SKILL.md` → §2z); a
|
|
317
317
|
run parks with `needs-decision` and a person clears it.
|
|
318
318
|
|
|
319
319
|
Rationale: `docs/maintainers/backlogrun-steps-rationale.md` → "Why the plan and the decision pass come first"
|
|
@@ -331,7 +331,7 @@ returns the verdict with the issues to start. It stays both halves' contract sou
|
|
|
331
331
|
*means* changes here.
|
|
332
332
|
|
|
333
333
|
```bash
|
|
334
|
-
offer=$(pnpm josh backlog:offer --started "$started" --active "$active")
|
|
334
|
+
offer=$(pnpm josh backlog:offer --started "$started" --active "$active")
|
|
335
335
|
offer=$(pnpm josh backlog:offer --started "$started" --active "$active" --exclude 1630,1631) # after #1630, #1631 merged
|
|
336
336
|
```
|
|
337
337
|
|
|
@@ -342,7 +342,7 @@ follow, one per line.** `backlog:offer` forwards `--exclude` and `--repo` to `ba
|
|
|
342
342
|
in `--json`. **The verdict table is "The two budgets" below; the answer-to-word mapping it applies is
|
|
343
343
|
this section's table.**
|
|
344
344
|
|
|
345
|
-
**`backlog:next`'s output contract is `docs/josh-commands.md` → "`josh backlog:next`", and four parts
|
|
345
|
+
**`backlog:next`'s output contract is `docs/josh-commands-automation.md` → "`josh backlog:next`", and four parts
|
|
346
346
|
of it decide how the mapping is written:**
|
|
347
347
|
|
|
348
348
|
1. **Standard output is one token per line, and everything else is standard error.**
|
|
@@ -398,7 +398,7 @@ records.
|
|
|
398
398
|
blocker sits in another opted-in epic — or is an opted-in standalone issue — makes the child wait on
|
|
399
399
|
time, so one `backlogrun` runs both epics in that order. A blocker outside the opted-in backlog, or one
|
|
400
400
|
inside it that itself waits on a person, makes the child wait on a person instead, and a cycle across
|
|
401
|
-
epics answers `error`. The table is `docs/josh-commands.md` → "`josh epic:next`".
|
|
401
|
+
epics answers `error`. The table is `docs/josh-commands-automation.md` → "`josh epic:next`".
|
|
402
402
|
|
|
403
403
|
**New work is picked up without restarting anything.** The command re-derives its pool from GitHub
|
|
404
404
|
labels on every ask, so an issue filed and opted in while the run is going is offered on the next
|
|
@@ -466,7 +466,7 @@ again at its full budget. Both are ISO-8601 timestamps (`date -u +%FT%TZ`), and
|
|
|
466
466
|
`--active` is refused. `--merged` is what has merged and `--running` what is still in a lane; **both
|
|
467
467
|
count against the maximum**. **No ending abandons a lane**: whatever would have ended the run answers
|
|
468
468
|
`watch` while `--running` is above zero, so the lanes drain and their merges reach the report. The full
|
|
469
|
-
contract is `docs/josh-commands.md` → "`josh backlog:budget`".
|
|
469
|
+
contract is `docs/josh-commands-automation.md` → "`josh backlog:budget`".
|
|
470
470
|
|
|
471
471
|
**The completion report names three things the budgets make meaningful**: how many issues this run
|
|
472
472
|
took, how many of them were picked up during an idle watch, and the termination reason — quoted from
|
|
@@ -48,8 +48,8 @@ Each step is a terse trigger and a pointer; the procedure is read on demand from
|
|
|
48
48
|
that bounds the amount. `auto-ok` is a person's alone.
|
|
49
49
|
4. **Report the plan before the first child** — `pnpm josh backlog:plan`, then resolve every
|
|
50
50
|
`needs-decision` issue decidable from its body in one pass. In the same pass, record `blocked-by`
|
|
51
|
-
between issues that must land in order, and apply `run:solo` where the
|
|
52
|
-
|
|
51
|
+
between issues that must land in order, and apply `run:solo` where all three of the
|
|
52
|
+
`wip-cap.md` → 「実行のしかた」 conditions hold, `run:lane` elsewhere. `backlogrun-steps.md` → "The plan,
|
|
53
53
|
before the first child starts" and its "Resolve what the plan can resolve, before starting".
|
|
54
54
|
5. **Named issues run first, in order** — `backlogrun-steps.md` → "Named issues run first, in order":
|
|
55
55
|
the supervisor's driver dispatches each as a delegated `fullrun`, one at a time, then drains the
|
|
@@ -7,8 +7,10 @@ Review results and successful pushes are never turn boundaries.
|
|
|
7
7
|
|
|
8
8
|
0. **A lane child** (#2428): `pnpm josh main:merge`, the scoped pair, `pnpm josh ship --detach --review
|
|
9
9
|
"<title> #<N>"` (`--cite <N>`), then **end the turn** on `launched`/`busy`. A stop relaunches a child
|
|
10
|
-
whose
|
|
11
|
-
|
|
10
|
+
whose prompt names `pnpm josh ship --log <N>` and (Anthropic lane, #2964) the re-detach to run after
|
|
11
|
+
the fix — `pnpm josh ship --detach`, `--review` only if the stopped ship carried it and stopped before
|
|
12
|
+
round 2, which is final (`scripts/run/run-ship-next.ts`); the supervisor skips a recorded round 1.
|
|
13
|
+
`failed` → step 1.
|
|
12
14
|
1. Run `pnpm josh main:merge`. **Then issue `pnpm josh run:cut <N>` alone, before the scoped pair and
|
|
13
15
|
the gate** — the pre-gate cut (a no-op outside a lane, joshuafolkken/kit#2177). Then run the final scoped lint/test pair and `pnpm josh run:review`: it starts
|
|
14
16
|
`pnpm josh gate` in the background and prints the `/code-review` brief in one call, so the two overlap
|
|
@@ -35,8 +37,8 @@ Review results and successful pushes are never turn boundaries.
|
|
|
35
37
|
**`pnpm josh followup` refuses the merge until the round is recorded**
|
|
36
38
|
(`pnpm josh review:record --check --issue <N>`, joshuafolkken/kit#2343).
|
|
37
39
|
5. **The clean path ships in one call** — with no second round due, background
|
|
38
|
-
`pnpm josh ship "<title> #<N>" --body-file <evidence.md>`: gate → `git -y` →
|
|
39
|
-
first failure (
|
|
40
|
+
`pnpm josh ship "<title> #<N>" --body-file <evidence.md>`: PR preflight (#2946) → gate → `git -y` →
|
|
41
|
+
`followup` → `run:tail`, stopping at the first failure (#2398). `--review` runs both rounds (#2489). **Else a due round 2
|
|
40
42
|
does not fit `ship`**: the PR opens between the rounds — background `pnpm josh git -y "<title> #<N>"`, round 2 beside CI, then
|
|
41
43
|
`pnpm josh followup`.
|
|
42
44
|
|
|
@@ -17,13 +17,13 @@ pnpm josh delegate --list # the enumeration, and what was rejected and why
|
|
|
17
17
|
**how a wrong result is caught** cheaply in the parent tier, not merely by being unlikely to fail.
|
|
18
18
|
`pnpm josh delegate --list` names both delegatable and rejected steps; a rejected step either has no
|
|
19
19
|
verifier or lets a wrong result propagate too far. The command distinguishes `kept deliberately`
|
|
20
|
-
from `kept by default`. `docs/josh-commands.md` → "`josh delegate`" carries the full enumeration.
|
|
20
|
+
from `kept by default`. `docs/josh-commands-automation.md` → "`josh delegate`" carries the full enumeration.
|
|
21
21
|
|
|
22
22
|
**The mechanism is not the unit.** `pnpm josh delegate` covers a run step, a file-disjoint Step 0
|
|
23
23
|
implementation unit (`pnpm josh fanout`), and `epic-child` — an epic's child and a named issue of a
|
|
24
24
|
`backlogrun` alike. Do not add a second batch-child mechanism. Read `backlogrun-child.md` → "Each child
|
|
25
25
|
runs in a delegated unit" at child dispatch; `backlogrun-steps.md` → "Named issues run first, in order"
|
|
26
|
-
applies to named issues. `docs/josh-commands.md` → "`josh fanout`" carries file-disjoint dispatch.
|
|
26
|
+
applies to named issues. `docs/josh-commands-automation.md` → "`josh fanout`" carries file-disjoint dispatch.
|
|
27
27
|
|
|
28
28
|
**`followup-filing` delegates the late review-finding filing chain** with the parent's finding text;
|
|
29
29
|
the parent verifies the new Issue using `pnpm josh issue:state <new>`. For `epic-child`, the parent
|
|
@@ -41,7 +41,7 @@ a temporary probe script and return its output.
|
|
|
41
41
|
delegate the unread investigation. Brief the unit on what was already read; do not re-read it there.
|
|
42
42
|
**A delegation resets the counter rather than spending it**; `pnpm josh investigation:guard` counts
|
|
43
43
|
unedited files and refuses the threshold read. `pnpm josh delegate --list` prints the threshold.
|
|
44
|
-
`docs/josh-commands.md` → "`josh investigation:guard`" carries the command's counting details.
|
|
44
|
+
`docs/josh-commands-automation.md` → "`josh investigation:guard`" carries the command's counting details.
|
|
45
45
|
|
|
46
46
|
**The main line does not idle while the unit reads:** read files this run will edit, then verify the
|
|
47
47
|
unit's cited lines. Independent investigations launch together; a brief that needs another unit's
|
|
@@ -84,7 +84,7 @@ pnpm josh notify --task-type failure --issue-url "<issue-url>" --body "<the reas
|
|
|
84
84
|
**The matching itself is unchanged, and so is the reason it is mechanical.** The instruction the mechanical read replaced was skipped in two runs out of three on the day it was measured, and one of those two could not have succeeded by eye at all: `AI_COPY_DIRECTORIES` holds directories, so a distributed path such as `.claude/skills/workflow-commands/backlogrun.md` appears in no list textually.
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
|
-
pnpm josh sync:scope # managed | clean, naming which list claimed each path
|
|
87
|
+
pnpm josh sync:scope # managed | clean, naming which list claimed each path
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
- **There is no flag to pass and nothing to approve.** `--managed-config-ignore-reason` is gone with the stop it existed to get past.
|
|
@@ -99,7 +99,7 @@ pnpm josh sync:scope # managed | clean, naming which list claimed each path;
|
|
|
99
99
|
**The answer: `pnpm josh release:scope`.**
|
|
100
100
|
|
|
101
101
|
```bash
|
|
102
|
-
pnpm josh release:scope # → required | skip | unknown
|
|
102
|
+
pnpm josh release:scope # → required | skip | unknown
|
|
103
103
|
pnpm josh release:scope --json # the same answer as one JSON object
|
|
104
104
|
```
|
|
105
105
|
|
|
@@ -115,4 +115,4 @@ pnpm josh release:scope --json # the same answer as one JSON object
|
|
|
115
115
|
|
|
116
116
|
**`pnpm josh release --dry-run` was checked first and does not answer this.** It refuses off the default branch and on a dirty working tree, and it counts against `HEAD` rather than `origin/<default>` — and every position above is a feature branch or a lane, which is exactly where it throws. So `release:scope` adds **no counting of its own**: it reads `git_followup_pending.read_pending`, the same fetch-then-count `pnpm josh followup` already uses for the Telegram line, and the two therefore cannot disagree.
|
|
117
117
|
|
|
118
|
-
**This section is the single source.** `fullrun.md`, `backlogrun.md` and `backlogrun.md` point here rather than restating it, and `docs/josh-commands.md` → "`josh release:scope`" documents the command itself.
|
|
118
|
+
**This section is the single source.** `fullrun.md`, `backlogrun.md` and `backlogrun.md` point here rather than restating it, and `docs/josh-commands-automation.md` → "`josh release:scope`" documents the command itself.
|
|
@@ -19,7 +19,10 @@ bullets. Use the file option whenever it contains a command or path.
|
|
|
19
19
|
|
|
20
20
|
It waits for required CI, checks CodeRabbit and top-level AI review comments, sends the completion
|
|
21
21
|
Telegram, merges by default, posts the Issue report, closes completed epics, removes `in-progress`,
|
|
22
|
-
and releases the hold. Only `--no-merge` stops the merge; `--merge` is a deprecated no-op.
|
|
22
|
+
and releases the hold. Only `--no-merge` stops the merge; `--merge` is a deprecated no-op. **A pull
|
|
23
|
+
request already merged by hand** (a `prrun` stop, joshuafolkken/kit#3023) skips the CI wait, the AI
|
|
24
|
+
review scan and the merge and runs only the post-merge tail; a completion report already on the Issue
|
|
25
|
+
is not posted or notified twice, so re-running is safe. Keep the
|
|
23
26
|
default Issue target. Ignore a finding only after verifying it is inapplicable; rate-limit text is not
|
|
24
27
|
a finding.
|
|
25
28
|
|
|
@@ -174,8 +177,9 @@ pnpm josh ms
|
|
|
174
177
|
Review findings before merging. If blockers are found, it sends a `confirmation` Telegram and exits
|
|
175
178
|
non-zero — fix the findings and re-run. **Green CI is not authorization to merge while AI review
|
|
176
179
|
findings are open.** (SonarCloud findings are not scanned by `followup`; the `sonar-qube.yml` CI
|
|
177
|
-
workflow runs the scan with `sonar.qualitygate.wait=true`, so a red
|
|
178
|
-
`SonarQube` check,
|
|
180
|
+
workflow runs the scan with `sonar.qualitygate.wait=true` and then `josh sonar:new-code`, so a red
|
|
181
|
+
Quality Gate or a single new Sonar issue or duplicated block fails the required `SonarQube` check,
|
|
182
|
+
which `followup` waits on.)
|
|
179
183
|
- **CodeRabbit rate-limit is not a finding.** If the only CodeRabbit comment is a rate-limit warning
|
|
180
184
|
(`rate limited by coderabbit.ai` or `Rate limit exceeded`) and there is no substantive review, treat
|
|
181
185
|
it as "no findings" and proceed. Same if CodeRabbit produced no comment on the latest commit.
|
|
@@ -26,7 +26,7 @@ in outline: refactor → `pnpm josh main:merge` → **a dispatched lane child ha
|
|
|
26
26
|
joshuafolkken/kit#2428) → otherwise `pnpm josh run:cut <N>` (the pre-gate cut, before the gate; a no-op
|
|
27
27
|
outside a lane) → start `pnpm josh gate` and a subagent `/code-review`
|
|
28
28
|
with the brief `pnpm josh review:brief` prints on `git diff main`, join the gate before the commit,
|
|
29
|
-
iterate to no high/medium findings,
|
|
29
|
+
iterate to no high/medium findings, within the round cap (`prompts/review.md`) → **the clean path folds the ship region into
|
|
30
30
|
one call**, `pnpm josh ship "<title> #<N>"` (gate → commit/push/PR → the CI-wait `followup` → the
|
|
31
31
|
`run:tail` report bookkeeping, stopping at the first failed step; joshuafolkken/kit#2398), with any
|
|
32
32
|
branch-2 filing (`pnpm josh issue:file`, which runs `epic:bundle` itself) run before it → **when a second round is due `ship` does not
|
|
@@ -44,7 +44,8 @@ implementation summary via `--notify-message` in the session language, leading w
|
|
|
44
44
|
plain-language lines: `"Implemented <title>\nCause: ...\nFix: ...\nResult: ...\n\nDetails:\n-
|
|
45
45
|
<change1>\n- <change2>"`. **`pnpm josh followup` waits for CI, verifies AI review findings, sends the
|
|
46
46
|
completion notification, then merges; if blockers are found it exits non-zero — fix and re-run.**
|
|
47
|
-
|
|
47
|
+
**Run `pnpm josh ms` after the merge.** A Codex lane skips it — the parent's `run:merge` syncs the
|
|
48
|
+
primary checkout; a Claude run keeps it.
|
|
48
49
|
|
|
49
50
|
## The `fullrun new` step list
|
|
50
51
|
|
|
@@ -21,7 +21,7 @@ single sources). Step 2 — the `in-progress` label — stays its own call, appl
|
|
|
21
21
|
call reports `hold`.
|
|
22
22
|
|
|
23
23
|
1. **Claim the working tree — first, before anything else.** For `fullrun #N`, first run the folded
|
|
24
|
-
`pnpm josh run:entry <N>` above; it calls `run:hold` as its first step. For `fullrun new`, call
|
|
24
|
+
`pnpm josh run:entry <N>` above (no `--to` is `fullrun`, §2k); it calls `run:hold` as its first step. For `fullrun new`, call
|
|
25
25
|
bare `pnpm josh run:hold`, ahead of the title and filing. `hold` continues; `busy` / `unknown` stop
|
|
26
26
|
with a `confirmation` Telegram carrying stderr.
|
|
27
27
|
`working-tree-hold.md` is the single source; a cross-repository target resolves its checkout from
|
|
@@ -63,7 +63,8 @@ call reports `hold`.
|
|
|
63
63
|
boundary — immediately after `pnpm josh main:merge`, before the gate — it takes the cut with
|
|
64
64
|
`pnpm josh run:cut <N>` (the ordered step in `chain-rule.md`), and it records any park on the Issue before the stop notify.
|
|
65
65
|
`pre-gate-cut.md` is the single source of both.
|
|
66
|
-
- **`resume: halfrun`** adopted a stopped `halfrun` (#2796): gate in full; `
|
|
66
|
+
- **`resume: halfrun`** adopted a stopped `halfrun` (#2796): gate in full; `resume: prrun-*` a stopped
|
|
67
|
+
`prrun` (#3023); `working-tree-hold.md`.
|
|
67
68
|
|
|
68
69
|
## The stop branches
|
|
69
70
|
|
|
@@ -4,51 +4,48 @@ When this run files a new Issue, file it with `pnpm josh issue:file`, which lint
|
|
|
4
4
|
|
|
5
5
|
`halfrun` sits between `kickoff` (plan only) and `fullrun` (full execution with auto-merge). It
|
|
6
6
|
implements the change and runs the full verification gate, then **stops before commit** — nothing is
|
|
7
|
-
committed, pushed, or opened as a PR — so
|
|
8
|
-
the UI in a browser) against the working tree. Use `halfrun` when the change has UI/UX implications or
|
|
9
|
-
anything else that requires human eyes before shipping.
|
|
7
|
+
committed, pushed, or opened as a PR — so a person verifies the working tree by hand. Use it when a change needs human eyes before shipping.
|
|
10
8
|
|
|
11
|
-
**This file is the manifest** (joshuafolkken/kit#2189):
|
|
12
|
-
|
|
9
|
+
**This file is the manifest** (joshuafolkken/kit#2189): terse ordered steps, each pointing at the file
|
|
10
|
+
that holds its detail.
|
|
13
11
|
|
|
14
12
|
## The ordered entry sequence
|
|
15
13
|
|
|
16
|
-
1. **Claim the working tree first** — `pnpm josh run:
|
|
17
|
-
title and a `new`
|
|
18
|
-
|
|
14
|
+
1. **Claim the working tree first** — `pnpm josh run:entry <N> --to halfrun` (bare `pnpm josh
|
|
15
|
+
run:hold` for `new`), ahead of the title and a `new` filing; it folds steps 3 and 5 and starts
|
|
16
|
+
at its stage line's `start:` (`SKILL.md` → §2k). `busy` / `unknown` stop with a `confirmation` Telegram. **The stop
|
|
17
|
+
before commit keeps the hold** (a second run would trample the uncommitted work); a stop on a
|
|
19
18
|
split, prerequisite or third-party target releases it. `working-tree-hold.md` is the single source; a
|
|
20
19
|
cross-repository target resolves its checkout from `pnpm josh doctor` first (`target-repository.md`).
|
|
21
20
|
2. **Apply `in-progress` the moment `run:hold` answered `hold`** — the stop before commit keeps it on;
|
|
22
21
|
a stop that leaves the tree clean removes it in the same turn as `pnpm josh run:release` (`gh api -X
|
|
23
22
|
DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress 2>/dev/null || true`).
|
|
24
|
-
3. **Ask the session boundary
|
|
25
|
-
`fullrun`; `over` stops with a `confirmation` Telegram and the resume command (`halfrun #<N>` /
|
|
23
|
+
3. **Ask the session boundary** — `pnpm josh cost --cut` (folded into `run:entry`); `over` stops with a `confirmation` Telegram and the resume command (`halfrun #<N>` /
|
|
26
24
|
`halfrun new`). **Skip it when dispatched by a batch.** `backlogrun-progress.md` → "The hand-off" is
|
|
27
25
|
the single source of the check and the shared 135,000 threshold.
|
|
28
26
|
4. **Start the progress watcher once the hold is claimed** — `pnpm josh run:progress --wait` in the
|
|
29
27
|
background, `--mark` in the same turn as every real report; the stop before commit ends the watcher
|
|
30
28
|
itself (`backlogrun-progress.md` → "Progress while the run is quiet").
|
|
31
|
-
5. **
|
|
32
|
-
|
|
33
|
-
run:next <N>`.
|
|
29
|
+
5. **The mechanical reads** — `run:entry` folds `run:prep` (body/comments — `SKILL.md` → §2g;
|
|
30
|
+
`human_review`; `latest:scope`); a `new` entry runs `pnpm josh run:prep <N>` once filed.
|
|
34
31
|
|
|
35
32
|
## The step list
|
|
36
33
|
|
|
37
34
|
`halfrun #<N>`: add `in-progress` → read Issue #N and its comments → **normalize the title** (same as
|
|
38
35
|
`fullrun`) → post the agreed plan only if the body is blank → `git switch main && git pull`, then `pnpm
|
|
39
|
-
josh latest:scope` and update dependencies only on `required` (`latest-gate.md`;
|
|
40
|
-
`dependency-update` skill
|
|
36
|
+
josh latest:scope` and update dependencies only on `required` (`latest-gate.md`; the
|
|
37
|
+
`dependency-update` skill) → implement → run the **full verification gate** (refactor →
|
|
41
38
|
start `pnpm josh gate` beside a subagent `/code-review` with the brief `pnpm josh review:brief` prints,
|
|
42
|
-
join the gate before the stop, iterate to no high/medium findings,
|
|
39
|
+
join the gate before the stop, iterate to no high/medium findings, within the round cap (`prompts/review.md`) → `pnpm josh
|
|
43
40
|
test:e2e`, run by **you**, because `halfrun` opens no pull request and there is no CI E2E job; a printed
|
|
44
41
|
skip is the answer where the project has no suite) → **mark the stop: `pnpm josh run:hold <N>
|
|
45
42
|
--halfrun-stop`** (the record `fullrun #<N>` adopts; `new` passes the filed number) → send a
|
|
46
43
|
`confirmation` Telegram with the resume commands in the body → **stop**. Plan comments are in the session language. The `confirmation` Telegram
|
|
47
|
-
body MUST include the exact resume commands —
|
|
44
|
+
body MUST include the exact resume commands — **the `Next:` line first**, since that is how a verified
|
|
48
45
|
`halfrun` ships (joshuafolkken/kit#2796): its `run:entry` adopts this stop's marked hold and resumes at
|
|
49
46
|
the gate. The direct commands follow for shipping without an agent:
|
|
50
47
|
`pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'halfrun ready for manual
|
|
51
|
-
verification\nNext: fullrun #<N>\nWithout an agent: pnpm josh git -y "<title> #<N>" && pnpm josh
|
|
48
|
+
verification\nNext: prrun #<N> | fullrun #<N>\nWithout an agent: pnpm josh git -y "<title> #<N>" && pnpm josh
|
|
52
49
|
followup "<title> #<N>" --notify-message "Implemented <title>\\nCause: ...\\nFix: ...\\nResult:
|
|
53
50
|
...\\n\\nDetails:\\n- <change1>"'`. The stop report names the same two, in the same order.
|
|
54
51
|
**Invoking `halfrun` is _not_ authorization to commit, push, or merge** — do not run `pnpm josh git -y` or `pnpm josh followup` yourself. If the user comes
|
|
@@ -72,7 +69,7 @@ Telegram and **stop**.
|
|
|
72
69
|
- **A split** — the assessment (`split-assessment.md` → "The question") finds two or more
|
|
73
70
|
separately-mergeable deliverables over one gate: file the children (each `route:split`) and the epic,
|
|
74
71
|
then **STOP** with "Please run `backlogrun #<E> --only` to execute this epic." Typing `halfrun`
|
|
75
|
-
authorized
|
|
72
|
+
authorized **one** Issue, never a batch.
|
|
76
73
|
- **A prerequisite** — file it (`route:tier-a`), stash, record the dependency, and **STOP**;
|
|
77
74
|
`prerequisite.md` is the single source of the filing, the `-u` stash and the epic:bundle branch.
|
|
78
75
|
- **An observation** — file it without asking and carry on; `SKILL.md` → §2i.
|
|
@@ -12,7 +12,7 @@ delegated unit executing `fullrun`'s procedure, and the hook keys its once-per-r
|
|
|
12
12
|
same turn as whatever else the run already needs:
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
pnpm josh issue:read <N> [<N> ...] # body and comments, one call per batch
|
|
15
|
+
pnpm josh issue:read <N> [<N> ...] # body and comments, one call per batch
|
|
16
16
|
gh api repos/{owner}/{repo}/issues/<N>/comments --jq '.[] | {user: .user.login, created_at, body}'
|
|
17
17
|
```
|
|
18
18
|
|
|
@@ -66,7 +66,7 @@ procedure and not two. **Parking it is not the place**: `needs-decision` means "
|
|
|
66
66
|
nobody has given", and here the answer exists.
|
|
67
67
|
|
|
68
68
|
**The exit is the `already-done` label.** It is `needs-decision`'s counterpart: `epic:next`,
|
|
69
|
-
`backlog:next` and `auto-ok:next` all stop offering the Issue (`scripts/
|
|
69
|
+
`backlog:next` and `auto-ok:next` all stop offering the Issue (`scripts/issue/issue-labels.ts` →
|
|
70
70
|
`NOT_DIRECTLY_RUNNABLE_LABELS`, `epic-classify.ts` → `human`), and `epic:busy` stops counting it as
|
|
71
71
|
holding a lane. **Only a person removes it, by closing the Issue.**
|
|
72
72
|
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Folding added requirements into an unstarted Issue
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Reading the candidates
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Pass the whole draft — purpose, requirements and acceptance criteria — to `pnpm josh issue:scout "<title>" --body-file <draft.md>`. An explicitly referenced `#N` is a candidate even when its title looks unrelated. `Duplicates: incomplete` means the read or the search fell short; it is not a conclusion that no candidate exists.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Read each candidate's body and every comment with `pnpm josh issue:read <N>`, and its state and labels with `pnpm josh issue:state <N>`. Check the linked PRs and the dependencies and run order too. When the body and a later comment disagree, the later comment wins. A failed or truncated read leaves the fold decision undetermined.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Deciding
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Match each acceptance criterion of the draft against the existing Issue. A complete duplicate is neither filed nor edited. A separate deliverable takes the ordinary filing path. Added requirements of its own may be folded in only when the existing Issue is open and unstarted with no PR, its dependencies and run order do not conflict, and the combined size fits the one verification pass of `split-assessment.md` → "The question". When the state or any input to the decision is unknown, do not fold.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Write the assessment as JSON and run `pnpm josh issue:fold-existing <assessment.json> --json`. `content` is `duplicate` / `compatible` / `separate` / `unknown`, and `size_verdict` is `single` / `split`. Also record `is_open`, `is_unstarted`, `has_pull_request`, `has_complete_read`, `has_dependency_conflict`, `is_separable`, `existing_body`, `draft_body` and `verification`. Omit a fact you do not know, and the answer is `inspect`. The assessment is evidence of the reading, never a substitute for it.
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Appending and re-reading
|
|
16
16
|
|
|
17
|
-
`fold
|
|
17
|
+
On `fold`, the proposed `body` keeps the original body and appends the added requirements and how to verify them. Immediately before writing, confirm the body and comments have not changed since the assessment; if they have, assess again.
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
20
|
pnpm josh issue:fold-existing assessment.json --json > result.json
|
|
@@ -24,4 +24,4 @@ gh api -X PATCH repos/{owner}/{repo}/issues/<N> --input patch.json
|
|
|
24
24
|
pnpm josh issue:read <N>
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
Re-read it and confirm the original requirements, the decisions recorded in comments, the added requirements and the verification all remain. A failed write or re-read means the fold is not complete. A fold never creates a new Issue. `separate` returns to the ordinary filing path, and `inspect` re-reads the missing information.
|
|
@@ -41,4 +41,4 @@ pnpm josh issue:file "<title>" --body-file <complete-draft.md> --depth <n> --dis
|
|
|
41
41
|
- **The split path files each child through the same command.** The epic is created with
|
|
42
42
|
`pnpm josh epic` over children that were scanned.
|
|
43
43
|
|
|
44
|
-
Full behavior: `docs/josh-commands.md` → "`josh issue:file`" and "`josh issue:scout`".
|
|
44
|
+
Full behavior: `docs/josh-commands-automation.md` → "`josh issue:file`" and "`josh issue:scout`".
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
# `kickoff` — Planning phase only (plan → Issue → Telegram notify → stop)
|
|
2
2
|
|
|
3
|
-
- `kickoff #<N>`:
|
|
3
|
+
- `kickoff #<N>`: **First `pnpm josh run:entry <N> --to kickoff`** (`SKILL.md` → §2k) — it claims
|
|
4
|
+
nothing and prints the stage line alone; `start: reached` means the Issue is already planned or further
|
|
5
|
+
up the ladder, so report the stage line and **stop**. Otherwise read existing Issue #N **and every comment on it** — `pnpm josh issue:read <N>`; a
|
|
4
6
|
decision recorded after the body was written lives only in a comment, and the later text is the
|
|
5
7
|
agreement in force (`SKILL.md` → §2g, which also carries the two answers that stop the run instead) →
|
|
6
8
|
**normalize the title**: if the title is not in English or can be phrased more clearly, derive a
|
|
7
9
|
better English title and run `gh api -X PATCH repos/{owner}/{repo}/issues/<N> -f title="<title>"` →
|
|
8
10
|
analyze requirements → **scope assessment per `split-assessment.md`** → post the plan to the Issue (if
|
|
9
11
|
body is blank, `gh api -X PATCH repos/{owner}/{repo}/issues/<N> -f body="<plan>"`; otherwise
|
|
10
|
-
`pnpm josh issue:comment <N> --body-file <path>`) →
|
|
12
|
+
`pnpm josh issue:comment <N> --body-file <path>`) → **apply the `run:planned` label** — the mark the next
|
|
13
|
+
command's `run:entry` reads to start at the implementation, provisioned by `josh sync` (`gh api
|
|
14
|
+
repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=run:planned' --silent`) → send Telegram
|
|
15
|
+
notification, its last line `Next: halfrun #<N> | prrun #<N> | fullrun #<N>` → **stop**
|
|
11
16
|
(do not implement). **When the assessment finds two or more separately-mergeable deliverables**, take
|
|
12
17
|
the split path instead of posting a plan: create the children as in `kickoff new`, then either
|
|
13
18
|
**promote `#N`** with `pnpm josh epic --promote <N> <N1> <N2> ... [--ordered] [--rationale-file
|
|
@@ -37,7 +42,7 @@ than filing.
|
|
|
37
42
|
**Read `split-assessment.md` → "The question" first.** It is the split decision every entry point
|
|
38
43
|
applies, including this one — `kickoff #N` assesses scope exactly as `kickoff new` does. Its default is
|
|
39
44
|
not to split: separability and a scope that clearly exceeds what one verification gate can confirm in
|
|
40
|
-
one pass (the guide is
|
|
45
|
+
one pass (the size guide is stated there) have to hold **together**.
|
|
41
46
|
The rest of `split-assessment.md` — what each entry does with the answer — is read on demand when a
|
|
42
47
|
split is found.
|
|
43
48
|
|
|
@@ -80,4 +85,4 @@ split is found.
|
|
|
80
85
|
creation call. (3) Send Telegram notification listing all created issues. (4) Present the command
|
|
81
86
|
`backlogrun #<E> --only`. (5) **Stop** — do not implement.
|
|
82
87
|
|
|
83
|
-
`pnpm josh issue:file` lints the body and applies the classification labels it declares, following `prompts/collaboration-workflow/issue-template.md` for classification (`docs/josh-commands.md` → `josh issue:file`).
|
|
88
|
+
`pnpm josh issue:file` lints the body and applies the classification labels it declares, following `prompts/collaboration-workflow/issue-template.md` for classification (`docs/josh-commands-automation.md` → `josh issue:file`).
|
|
@@ -82,4 +82,4 @@ found once — fix it forward before parking the issue for it.
|
|
|
82
82
|
|
|
83
83
|
This file is the single source of the rule. `fullrun.md`, `halfrun.md`, `backlogrun.md` and `backlogrun.md`
|
|
84
84
|
each name `pnpm josh latest:scope` at the point their procedure reaches it and route here for
|
|
85
|
-
everything else; `docs/josh-commands.md` documents the command itself.
|
|
85
|
+
everything else; `docs/josh-commands-automation.md` documents the command itself.
|
|
@@ -57,7 +57,7 @@ run's *start*; this withholds its *end*. So a `needs-human-review` issue is stil
|
|
|
57
57
|
the artifact a person is meant to look at would never be produced — and a child stopped by it **goes on
|
|
58
58
|
holding its repository**, because the uncommitted work is still in the checkout; read as parked there,
|
|
59
59
|
the next child would start `git switch main && git pull` on top of it. The code encodes both halves by
|
|
60
|
-
leaving the label out of two sets: `scripts/
|
|
60
|
+
leaving the label out of two sets: `scripts/issue/issue-labels.ts` keeps it out of
|
|
61
61
|
`NOT_DIRECTLY_RUNNABLE_LABELS` and `scripts/epic/epic-busy.ts` keeps it out of the parked set.
|
|
62
62
|
|
|
63
63
|
Each entry point's own branch stays in its own file — `fullrun.md`, `halfrun.md`,
|