@joshuafolkken/kit 1.1050.0 → 1.1128.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/workflow-commands/SKILL.md +20 -12
- package/.claude/skills/workflow-commands/background-commands.md +36 -84
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
- package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +1 -1
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +8 -6
- package/.claude/skills/workflow-commands/halfrun.md +19 -21
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +8 -16
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +3 -3
- package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +4 -18
- package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-node/action.yml +33 -0
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +2 -3
- package/.github/workflows/ci.yml +31 -134
- package/.github/workflows/dependabot-auto-merge.yml +1 -0
- package/.github/workflows/pr-classification.yml +6 -44
- package/.github/workflows/production.yml +1 -0
- package/.github/workflows/publish.yml +43 -47
- package/.github/workflows/sonar-qube.yml +41 -4
- package/.pnpmfile.mjs +29 -0
- package/AGENTS.md +5 -2
- package/CLAUDE.md +33 -27
- package/GEMINI.md +5 -2
- package/README.md +66 -20
- package/SECURITY.md +37 -6
- package/cspell/index.yaml +6 -1
- package/dist/CLAUDE.basic.md +6 -6
- package/dist/CLAUDE.md +33 -27
- package/dist/CLAUDE.static.md +6 -6
- package/dist/config-merge/index.js +48 -12
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
- package/dist/hooks/codex-hook-adapter.js +12 -48
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +280 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +192 -333
- package/dist/josh.js +240 -148
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +70 -78
- package/eslint/rules/promise.js +5 -0
- package/eslint/rules/unicorn.js +3 -2
- package/package.json +26 -5
- package/pnpm-workspace.yaml +5 -7
- package/prompts/collaboration-workflow/glossary.md +17 -0
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/issue-template.md +1 -1
- package/prompts/collaboration-workflow/operating-rules.md +5 -5
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +3 -3
- package/prompts/collaboration-workflow/rule-delivery.md +1 -1
- package/prompts/collaboration-workflow/turn-batching.md +3 -3
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +25 -22
- package/prompts/collaboration-workflow.md +6 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +11 -3
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +0 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +6 -16
- package/scripts/backlog/backlog-arrival.ts +30 -10
- package/scripts/backlog/backlog-budget-cli.ts +15 -16
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +9 -15
- package/scripts/backlog/backlog-offer-cli.ts +6 -19
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +30 -19
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +39 -10
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +5 -2
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +85 -9
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/parse-jsonc.ts +33 -3
- package/scripts/config-merge/patch-json-key.ts +13 -6
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +3 -10
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +0 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +6 -10
- package/scripts/doctor/doctor-io.ts +9 -13
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/backlogrun-parent-read-set.ts +12 -1
- package/scripts/document/document-byte-budget.ts +5 -5
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +21 -7
- package/scripts/document/entry-read-set.ts +32 -8
- package/scripts/document/lane-child-read-set.ts +8 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +9 -3
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +4 -2
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +8 -22
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +9 -8
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +2 -2
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +3 -2
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-command.ts +6 -1
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +2 -2
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn-sync.ts +65 -0
- package/scripts/git/git-spawn.ts +5 -4
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +1 -0
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +2 -0
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard.ts +22 -4
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-file-action.ts +54 -0
- package/scripts/init/init-logic-migrate.ts +35 -17
- package/scripts/init/init-logic-secretlint.ts +1 -1
- package/scripts/init/init-logic.ts +10 -19
- package/scripts/init/init.ts +11 -71
- package/scripts/init/kit-written-paths.ts +2 -0
- package/scripts/init/project-profile.ts +9 -17
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +3 -1
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +64 -23
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +3 -3
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-backlinks.ts +7 -14
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +12 -8
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +7 -14
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +8 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/{git → issue}/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +21 -6
- package/scripts/issue/measure-rerun-cli.ts +74 -15
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +8 -1
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +7 -1
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +3 -3
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/run-github-prerequisite.ts +3 -6
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +46 -19
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-cli.ts +1 -4
- package/scripts/lane/lane-close.ts +5 -4
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +31 -27
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +7 -1
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/cli-flags.ts +31 -2
- package/scripts/lib/error-message.ts +12 -1
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/line-targets.ts +0 -11
- package/scripts/lines/lines-command.ts +5 -4
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +3 -10
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +0 -2
- package/scripts/propagate/propagate-steps.ts +3 -5
- package/scripts/propagate/propagate-targets.ts +0 -4
- package/scripts/propagate/propagate.ts +0 -4
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +28 -21
- package/scripts/registry-migration/migrate.ts +25 -14
- package/scripts/release/github-release-cli.ts +19 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +38 -5
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/release/release-worktree.ts +97 -2
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +4 -16
- package/scripts/review/review-brief-cli.ts +23 -6
- package/scripts/review/review-brief.ts +21 -8
- package/scripts/review/review-checkout.ts +3 -2
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +10 -17
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +0 -3
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/early-heartbeat.ts +4 -3
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +0 -1
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-park.ts +22 -6
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +20 -9
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-args.ts +8 -12
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-args.ts +1 -6
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +2 -6
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +133 -25
- package/scripts/run/run-entry-stop.ts +104 -0
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream-emit.ts +7 -2
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +2 -2
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +29 -6
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +2 -6
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +7 -23
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +4 -2
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +6 -3
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-args.ts +20 -4
- package/scripts/run/run-progress-cli.ts +35 -36
- package/scripts/run/run-progress-clock.ts +10 -35
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +1 -2
- package/scripts/run/run-progress.ts +1 -2
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +29 -19
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +1 -1
- package/scripts/run/run-ship-probe.ts +4 -1
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +18 -4
- package/scripts/run/run-ship-review.ts +11 -0
- package/scripts/run/run-ship-scoped.ts +1 -0
- package/scripts/run/run-ship-steps.ts +1 -1
- package/scripts/run/run-ship.ts +0 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +3 -16
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +6 -2
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -13
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +18 -12
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/pack-hook.ts +92 -0
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-ai-files.ts +4 -0
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-changed.ts +13 -16
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +3 -9
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +0 -1
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-commands.ts +11 -1
- package/scripts/version/version-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/CLAUDE.basic.md +6 -6
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/ci.yml +16 -82
- package/templates/workflows/dependabot-auto-merge.yml +6 -3
- package/templates/workflows/github-release.yml +79 -0
- package/tsconfig.sonar.json +4 -22
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
|
@@ -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.
|
|
@@ -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
|
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -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
|
|
@@ -301,10 +301,10 @@ stop at a time.**
|
|
|
301
301
|
never the body.
|
|
302
302
|
- **Order and isolate the pool in the same pass** (joshuafolkken/kit#2776), from the same
|
|
303
303
|
`issue:read`: an issue that must land first (it builds what another reuses, or both edit one code
|
|
304
|
-
path) becomes a native `blocked-by`; an issue the `wip-cap.md` → 「実行のしかた」
|
|
305
|
-
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
|
|
306
306
|
three, answering `triage` while an issue has neither.
|
|
307
|
-
- **`priority:high` puts an issue first** (joshuafolkken/kit#2928; ranking: `docs/josh-commands.md` →
|
|
307
|
+
- **`priority:high` puts an issue first** (joshuafolkken/kit#2928; ranking: `docs/josh-commands-automation.md` →
|
|
308
308
|
`josh backlog:next`). Apply it only on a cited ground — a stated deadline or urgency, or a person's
|
|
309
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),
|
|
@@ -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.**
|
|
@@ -365,7 +365,7 @@ subsection.
|
|
|
365
365
|
| Answer | What to do | Budget answer |
|
|
366
366
|
| --- | --- | --- |
|
|
367
367
|
| One or more issue numbers | Start each one as a child, up to the free lanes — `backlogrun-lanes.md` → "Lanes" and "Each child runs in a delegated unit", unchanged. Then **ask the command again**, with the merged numbers added to `--exclude` | `candidates` |
|
|
368
|
-
| `wait`, with something of this run's own still in flight | Everything opted in is blocked or already running, so waiting can still change the answer. **Ask the command again on the wake the progress watcher's exit
|
|
368
|
+
| `wait`, with something of this run's own still in flight | Everything opted in is blocked or already running, so waiting can still change the answer. **Ask the command again on the in-flight wake — `pnpm josh lane:await` or the progress watcher's arrival exit, never a report** — the parent starts no sleep of its own, and the interval is a floor on the re-ask rather than a clock (`backlogrun-progress.md` → "Waiting, and never waiting forever" and "The parent keeps no clock of its own") | `blocked` |
|
|
369
369
|
| `wait` this checkout can never resolve — the only candidates the command reported on standard error are in other repositories, and this run has nothing of its own in flight | Report those candidates with their checkouts. **Waiting cannot resolve them, but a person opting a new issue in here still can**, so the ending is the idle watch's rather than this row's | `exhausted` |
|
|
370
370
|
| `stop` | Nothing can proceed without a person. Report the parked issues and finish | `parked` |
|
|
371
371
|
| `triage` | A candidate lacks `run:solo` / `run:lane` (joshuafolkken/kit#2779). Judge each one stderr names as the pre-start pass does, then **ask again**; running children continue | `untriaged` |
|
|
@@ -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
|
|
@@ -451,7 +451,7 @@ tracks.
|
|
|
451
451
|
| Verdict | What the loop does |
|
|
452
452
|
| --- | --- |
|
|
453
453
|
| `run` | Start what `backlog:next` offered, up to the free lanes. The reason names how many more the maximum still allows; start no more than that |
|
|
454
|
-
| `watch` | Ask both commands again — at the 5-minute idle poll while the backlog is empty **and** nothing of this run's is in flight, and at the 60-second polling interval in every other case (a blocked backlog, a drain, or a watch that opened while children were still merging). *Whether the parent keeps that interval as a clock of its own* is the in-flight test: with nothing in flight the watcher declines for the whole watch and never exits, so the parent sleeps the interval itself; with something in flight the wake is the watcher's exit and the interval is only a floor on the re-ask (`backlogrun-progress.md` → "The wake exists only while something is in flight"). **Nothing is held while watching** — the working tree's hold and each drained lane were released at the last child's merge, so a watching run blocks no other run |
|
|
454
|
+
| `watch` | Ask both commands again — at the 5-minute idle poll while the backlog is empty **and** nothing of this run's is in flight, and at the 60-second polling interval in every other case (a blocked backlog, a drain, or a watch that opened while children were still merging). *Whether the parent keeps that interval as a clock of its own* is the in-flight test: with nothing in flight the watcher declines for the whole watch and never exits, so the parent sleeps the interval itself; with something in flight the wake is `pnpm josh lane:await` or the watcher's arrival exit — never a report — and the interval is only a floor on the re-ask (`backlogrun-progress.md` → "The wake exists only while something is in flight"). **Nothing is held while watching** — the working tree's hold and each drained lane were released at the last child's merge, so a watching run blocks no other run |
|
|
455
455
|
| `stop` | Report and finish. The reason it printed **is** the termination reason the completion report carries |
|
|
456
456
|
|
|
457
457
|
**At the drain the retrospective fires before this watch, not after it** (joshuafolkken/kit#2335):
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -32,8 +32,8 @@ call reports `hold`.
|
|
|
32
32
|
`pnpm josh run:release`: `gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress
|
|
33
33
|
2>/dev/null || true`. A `needs-human-review` stop keeps both hold and label.
|
|
34
34
|
3. **Ask the session boundary in the same turn as the hold** — `pnpm josh cost --cut`. `under`
|
|
35
|
-
continues; `over` (or unanswerable) stops before the title
|
|
36
|
-
|
|
35
|
+
continues; `over` (or unanswerable) stops before the title — `run:entry` sends this and step 1's
|
|
36
|
+
`confirmation` Telegram and runs `run:release` (`stop notified: …`); by hand only for `new`.
|
|
37
37
|
**Skip it when dispatched by `backlogrun`** (that batch owns the question). `backlogrun-progress.md`
|
|
38
38
|
→ "The hand-off" is the single source of the check and the shared 135,000 threshold.
|
|
39
39
|
4. **Gather the mechanical reads — `pnpm josh run:prep <N>`**: `issue:read`'s body/comments
|
|
@@ -51,7 +51,7 @@ call reports `hold`.
|
|
|
51
51
|
## The progress step and the lane-child seam
|
|
52
52
|
|
|
53
53
|
- **Start the progress watcher once the hold is claimed** — `pnpm josh run:progress --wait` in the
|
|
54
|
-
background,
|
|
54
|
+
background, started once and relayed never, and `pnpm josh run:progress --mark` in the same turn as
|
|
55
55
|
every real report (`backlogrun-progress.md` → "Progress while the run is quiet"). A `fullrun`
|
|
56
56
|
dispatched as a lane child starts none and never reads that document (`pnpm josh read:set
|
|
57
57
|
lane-child`). **The watcher is a per-session heartbeat; the run's report surface is not it** — the
|
|
@@ -62,8 +62,10 @@ call reports `hold`.
|
|
|
62
62
|
before the hold, joshuafolkken/kit#2760); on `resume` it skips the title, plan, hold and implementation and goes to the gate. At the pre-gate
|
|
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
|
-
`pre-gate-cut.md`
|
|
66
|
-
|
|
65
|
+
`pre-gate-cut.md` → "Resuming — the fresh process's entry check" and `pre-gate-cut.md` → "Taking
|
|
66
|
+
the cut" are the single sources of the two.
|
|
67
|
+
- **`resume: halfrun`** adopted a stopped `halfrun` (#2796): gate in full; `resume: prrun-*` a stopped
|
|
68
|
+
`prrun` (#3023); `working-tree-hold.md`.
|
|
67
69
|
|
|
68
70
|
## The stop branches
|
|
69
71
|
|
|
@@ -4,51 +4,49 @@ 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 (`run:entry` sends it). **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
|
-
`
|
|
26
|
-
`halfrun new`). **Skip it when dispatched by a batch.** `backlogrun-progress.md` → "The hand-off" is
|
|
23
|
+
3. **Ask the session boundary** — `pnpm josh cost --cut` (folded into `run:entry`); `over` stops — `run:entry` notifies and releases
|
|
24
|
+
(`halfrun new`: by hand). **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
|
-
background,
|
|
27
|
+
background, started once — it reports to the event stream itself and nothing is relayed — and
|
|
28
|
+
`--mark` in the same turn as every real report; the stop before commit ends the watcher
|
|
30
29
|
itself (`backlogrun-progress.md` → "Progress while the run is quiet").
|
|
31
|
-
5. **
|
|
32
|
-
|
|
33
|
-
run:next <N>`.
|
|
30
|
+
5. **The mechanical reads** — `run:entry` folds `run:prep` (body/comments — `SKILL.md` → §2g;
|
|
31
|
+
`human_review`; `latest:scope`); a `new` entry runs `pnpm josh run:prep <N>` once filed.
|
|
34
32
|
|
|
35
33
|
## The step list
|
|
36
34
|
|
|
37
35
|
`halfrun #<N>`: add `in-progress` → read Issue #N and its comments → **normalize the title** (same as
|
|
38
36
|
`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
|
|
37
|
+
josh latest:scope` and update dependencies only on `required` (`latest-gate.md`; the
|
|
38
|
+
`dependency-update` skill) → implement → run the **full verification gate** (refactor →
|
|
41
39
|
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,
|
|
40
|
+
join the gate before the stop, iterate to no high/medium findings, within the round cap (`prompts/review.md`) → `pnpm josh
|
|
43
41
|
test:e2e`, run by **you**, because `halfrun` opens no pull request and there is no CI E2E job; a printed
|
|
44
42
|
skip is the answer where the project has no suite) → **mark the stop: `pnpm josh run:hold <N>
|
|
45
43
|
--halfrun-stop`** (the record `fullrun #<N>` adopts; `new` passes the filed number) → send a
|
|
46
44
|
`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 —
|
|
45
|
+
body MUST include the exact resume commands — **the `Next:` line first**, since that is how a verified
|
|
48
46
|
`halfrun` ships (joshuafolkken/kit#2796): its `run:entry` adopts this stop's marked hold and resumes at
|
|
49
47
|
the gate. The direct commands follow for shipping without an agent:
|
|
50
48
|
`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
|
|
49
|
+
verification\nNext: prrun #<N> | fullrun #<N>\nWithout an agent: pnpm josh git -y "<title> #<N>" && pnpm josh
|
|
52
50
|
followup "<title> #<N>" --notify-message "Implemented <title>\\nCause: ...\\nFix: ...\\nResult:
|
|
53
51
|
...\\n\\nDetails:\\n- <change1>"'`. The stop report names the same two, in the same order.
|
|
54
52
|
**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 +70,7 @@ Telegram and **stop**.
|
|
|
72
70
|
- **A split** — the assessment (`split-assessment.md` → "The question") finds two or more
|
|
73
71
|
separately-mergeable deliverables over one gate: file the children (each `route:split`) and the epic,
|
|
74
72
|
then **STOP** with "Please run `backlogrun #<E> --only` to execute this epic." Typing `halfrun`
|
|
75
|
-
authorized
|
|
73
|
+
authorized **one** Issue, never a batch.
|
|
76
74
|
- **A prerequisite** — file it (`route:tier-a`), stash, record the dependency, and **STOP**;
|
|
77
75
|
`prerequisite.md` is the single source of the filing, the `-u` stash and the epic:bundle branch.
|
|
78
76
|
- **An observation** — file it without asking and carry on; `SKILL.md` → §2i.
|
|
@@ -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`).
|
|
@@ -64,22 +64,14 @@ merge is CI**: the `Security Audit` job runs on every pull request and is one of
|
|
|
64
64
|
whatever this gate answered locally. The local reading is a head start on a failure CI would catch
|
|
65
65
|
anyway; it was never the only net.
|
|
66
66
|
|
|
67
|
-
##
|
|
68
|
-
|
|
69
|
-
The
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
so no entry needs a rule of its own — and the batch hoists survive it unchanged, because a batch's
|
|
75
|
-
second child asks the same command and is told `skip`.
|
|
76
|
-
|
|
77
|
-
**The lock file the update rewrites still lands with whichever issue ran it.** `josh latest` leaves
|
|
78
|
-
`pnpm-lock.yaml` modified and that issue's `pnpm josh git -y` commits it, exactly as before. What the
|
|
79
|
-
window removes is the other runs carrying the same bumps; it does not make that one diff clean.
|
|
80
|
-
Should the issue then fail CI on a bump rather than on its own change, that is a dependency problem
|
|
81
|
-
found once — fix it forward before parking the issue for it.
|
|
67
|
+
## The lock file lands with the issue that ran the update
|
|
68
|
+
|
|
69
|
+
**The lock file the update rewrites lands with whichever issue ran it.** `josh latest` leaves
|
|
70
|
+
`pnpm-lock.yaml` modified and that issue's `pnpm josh git -y` commits it. Should the issue then fail
|
|
71
|
+
CI on a bump rather than on its own change, fix it forward before parking the issue for it. Rationale
|
|
72
|
+
for the elapsed-time window: `docs/maintainers/latest-gate-rationale.md` → "Why an elapsed-time
|
|
73
|
+
window rather than once per batch".
|
|
82
74
|
|
|
83
75
|
This file is the single source of the rule. `fullrun.md`, `halfrun.md`, `backlogrun.md` and `backlogrun.md`
|
|
84
76
|
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.
|
|
77
|
+
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`,
|
|
@@ -19,7 +19,7 @@ Tier C (`CLAUDE.md`). Name what was filed in the completion report. An observati
|
|
|
19
19
|
on is dropped rather than filed.
|
|
20
20
|
|
|
21
21
|
**The filing ceilings still apply.** Count this filing in the ten-Issue limit for the run. An
|
|
22
|
-
observation is discretionary, so above
|
|
22
|
+
observation is discretionary, so above the WIP cap in the target repository, close one first or do
|
|
23
23
|
not file (`prompts/collaboration-workflow/wip-cap.md`). File it with `pnpm josh issue:file`
|
|
24
24
|
(`issue-scout.md`), which lints the body against `prompts/collaboration-workflow/issue-template.md`,
|
|
25
25
|
applies the classification labels it declares, runs the duplicate scan, and runs `epic:bundle` on the
|
|
@@ -42,7 +42,7 @@ The detail below is read at the filing decision, and the marker suite pins the r
|
|
|
42
42
|
|
|
43
43
|
**The depth is recorded on the Issue as a label, and the label is applied when the Issue is filed**
|
|
44
44
|
(joshuafolkken/kit#1729). `depth:0`, `depth:1` and `depth:2` are the three, defined once in
|
|
45
|
-
`scripts/
|
|
45
|
+
`scripts/issue/issue-labels.ts` and carrying no definition of their own — **the table above is the
|
|
46
46
|
single source**, and a label description that paraphrased it would be a second copy of the rule.
|
|
47
47
|
**Every filing route applies one**, this route and the other three of §2d's table alike: a `new`
|
|
48
48
|
entry point, a `route:tier-a` prerequisite, a `route:interrupt`, a split child and a review round
|
|
@@ -56,7 +56,7 @@ gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=depth:1' # an Issue
|
|
|
56
56
|
|
|
57
57
|
**Create the three once per repository**, before the first filing that applies one — REST auto-creates
|
|
58
58
|
a missing label with a generated color and no description, and the three lines below are what give
|
|
59
|
-
each a stable color a reader can scan a listing by. `DEPTH_LABELS` in `scripts/
|
|
59
|
+
each a stable color a reader can scan a listing by. `DEPTH_LABELS` in `scripts/issue/issue-labels.ts`
|
|
60
60
|
is the single source of the colors and descriptions, and `scripts/rules/issue-depth-label.test.ts` keys
|
|
61
61
|
these lines to it so the two cannot drift.
|
|
62
62
|
|
|
@@ -69,9 +69,8 @@ pnpm josh run:cut <N>
|
|
|
69
69
|
**`cut` is the only verdict that ends the turn.** Every other one — `under-threshold` included — leaves
|
|
70
70
|
the current process to carry the run on itself.
|
|
71
71
|
|
|
72
|
-
### The gate refuses until the cut has been taken
|
|
72
|
+
### The gate refuses until the cut has been taken
|
|
73
73
|
|
|
74
|
-
**This step was carried as prose and fired exactly never.** In measured lane children the cut was taken **0 times**, so
|
|
75
74
|
`pnpm josh rule:guard` **refuses `pnpm josh gate`** while this checkout is a lane and no cut record is
|
|
76
75
|
carried, handing back the command above. Rationale:
|
|
77
76
|
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
|
|
@@ -165,13 +164,10 @@ hand-off". The parent's seam and the child's `run_cut.IMPLEMENTATION_CONTEXT_THR
|
|
|
165
164
|
**135_000** `CONTEXT_CUT_THRESHOLD` (aliased so the tests cannot drift). No separate measurement is
|
|
166
165
|
built for the lane child.
|
|
167
166
|
|
|
168
|
-
### It is a guard, fired at the edit that crosses the threshold
|
|
167
|
+
### It is a guard, fired at the edit that crosses the threshold
|
|
169
168
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
|
|
173
|
-
|
|
174
|
-
So `pnpm josh rule:guard` **refuses an `Edit` / `Write`** while this checkout is a dispatched lane child
|
|
169
|
+
Rationale: `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
|
|
170
|
+
`pnpm josh rule:guard` **refuses an `Edit` / `Write`** while this checkout is a dispatched lane child
|
|
175
171
|
whose recent-context cost is over threshold, handing back `pnpm josh run:cut --impl <N> --handoff <path>` — the
|
|
176
172
|
refusal lands _before_ the edit. `cut` ends the turn, the rest leave this process implementing; a fresh
|
|
177
173
|
process's `pnpm josh run:cut --resume <N>` then answers **`resume-impl`**, so it **skips the title, plan,
|
|
@@ -31,7 +31,7 @@ pnpm josh issue:file "<title>" --body-file <body-file> --depth <n> --route tier-
|
|
|
31
31
|
|
|
32
32
|
The command lints the body against `prompts/collaboration-workflow/issue-template.md`, applies the
|
|
33
33
|
classification labels it declares, and runs the duplicate scan and `epic:bundle` itself
|
|
34
|
-
(`docs/josh-commands.md` → `josh issue:file`).
|
|
34
|
+
(`docs/josh-commands-automation.md` → `josh issue:file`).
|
|
35
35
|
|
|
36
36
|
Every "file the prerequisite" below means that labelled filing, and it always happens **first**: the
|
|
37
37
|
steps after it name a number that does not exist until it is. **Its duplicate scan is read exactly as
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# `prrun` — the manifest (plan → implement → PR → green → stop, a person merges)
|
|
2
|
+
|
|
3
|
+
`prrun` sits between `halfrun` (stop before commit) and `fullrun` (auto-merge). It runs `fullrun`
|
|
4
|
+
up to a green, mergeable pull request and **stops before the merge**, so a person merges by hand
|
|
5
|
+
(joshuafolkken/kit#3023). **Read `fullrun.md` for every step** — the entry sequence, the step lists,
|
|
6
|
+
the gate, the review and the stop branches are `fullrun`'s, unchanged. This file names only the
|
|
7
|
+
difference, never a second copy of the procedure.
|
|
8
|
+
|
|
9
|
+
## The difference — the entry
|
|
10
|
+
|
|
11
|
+
`prrun #<N>` opens with `pnpm josh run:entry <N> --to prrun` where `fullrun` passes no `--to`
|
|
12
|
+
(`SKILL.md` → §2k): a planned Issue starts at the implementation, a `halfrun` stop is adopted and
|
|
13
|
+
resumes at the gate, and an Issue already stopped by a `prrun` is reached — report the stage line and
|
|
14
|
+
stop. A merged Issue is reached too, but the `entry #<N>` line after the stage line answers it (§2k).
|
|
15
|
+
|
|
16
|
+
## The difference — the end of the run
|
|
17
|
+
|
|
18
|
+
Where `fullrun` runs `pnpm josh followup` and merges, `prrun` does three things and stops:
|
|
19
|
+
|
|
20
|
+
1. **Watch the pull request to mergeable** — `pnpm josh followup "<title> #<N>" --no-merge`
|
|
21
|
+
(`followup.md` → "Run `pnpm josh followup`", read in the same turn): required CI green and the AI
|
|
22
|
+
review findings resolved. A failure stops the run exactly as it stops a `fullrun`.
|
|
23
|
+
2. **Mark the stop — `pnpm josh run:hold <N> --prrun-stop`.** It records the commit the pull request is
|
|
24
|
+
on in this run's own hold, the record `fullrun #<N>` adopts (its prrun resume, `working-tree-hold.md`). **The hold and `in-progress` stay**: the run is not finished until the merge's tail runs.
|
|
25
|
+
3. **Send a `confirmation` Telegram with the resume commands, then stop.** **`fullrun #<N>` first** —
|
|
26
|
+
its `run:entry` reads where the pull request stands and resumes from there; the direct command
|
|
27
|
+
follows for finishing without an agent:
|
|
28
|
+
`pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'prrun ready to
|
|
29
|
+
merge: <pr-url>\nNext: fullrun #<N>\nAfter a manual merge, without an agent: pnpm josh followup
|
|
30
|
+
"<title> #<N>"'`. The stop report names the same two, in the same order.
|
|
31
|
+
|
|
32
|
+
**Invoking `prrun` is _not_ authorization to merge** — never run `pnpm josh followup` without
|
|
33
|
+
`--no-merge` in a `prrun`. After a person merges by hand, the same `pnpm josh followup "<title> #<N>"`
|
|
34
|
+
runs only the post-merge tail (`followup.md`).
|
|
35
|
+
|
|
36
|
+
`prrun new`: `fullrun new` up to the pull request, then the three steps above with the filed number.
|
|
@@ -65,7 +65,7 @@ Issue, as after any filing.
|
|
|
65
65
|
input, so the next run picks the improvements up without waiting for a person. **`backlogrun-steps.md` →
|
|
66
66
|
"What one invocation approves" is that carve-out's single source**; it is written there, beside the
|
|
67
67
|
brakes that bound it, rather than restated here. Every brake still counts a retrospective's filings: the
|
|
68
|
-
ten-per-invocation ceiling, the WIP cap
|
|
68
|
+
ten-per-invocation ceiling, the WIP cap, `--max`, the 150,000-token session budget and the 8-hour
|
|
69
69
|
whole-run bound.
|
|
70
70
|
|
|
71
71
|
**Close with `pnpm josh run:carry --retrospective --summary "<result>" --owner "$PPID"`.** It marks the
|