@joshuafolkken/kit 1.1050.0 → 1.1094.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/workflow-commands/SKILL.md +19 -11
- package/.claude/skills/workflow-commands/background-commands.md +4 -3
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
- package/.claude/skills/workflow-commands/backlogrun-progress.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +1 -1
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +3 -2
- package/.claude/skills/workflow-commands/halfrun.md +16 -19
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +1 -1
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +3 -3
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +33 -38
- package/.github/workflows/sonar-qube.yml +37 -4
- package/AGENTS.md +12 -2
- package/CLAUDE.md +15 -16
- package/GEMINI.md +14 -2
- package/README.md +59 -18
- package/SECURITY.md +36 -6
- package/cspell/index.yaml +2 -1
- package/dist/CLAUDE.md +15 -16
- package/dist/config-merge/index.js +15 -3
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-7ZPFAVR7.js} +7 -88
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-E54KGFEQ.js} +2 -2
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M2XDCUKD.js} +997 -478
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-NKOG3XAV.js} +150 -153
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-OIZUHPJI.js} +2 -2
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-UD24EAIL.js} +2084 -1412
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +178 -324
- package/dist/josh.js +162 -119
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +34 -58
- package/eslint/rules/promise.js +5 -0
- package/package.json +9 -4
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/operating-rules.md +4 -4
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +3 -3
- package/prompts/collaboration-workflow/rule-delivery.md +1 -1
- package/prompts/collaboration-workflow/turn-batching.md +3 -3
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +25 -22
- package/prompts/collaboration-workflow.md +5 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +11 -3
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +0 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +6 -16
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +9 -15
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +19 -3
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +5 -2
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +85 -9
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +0 -3
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +0 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +4 -6
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/document-byte-budget.ts +4 -5
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +10 -2
- package/scripts/document/lane-child-read-set.ts +1 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +1 -0
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +1 -1
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +5 -4
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +9 -8
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +2 -2
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +3 -2
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +2 -2
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +1 -0
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +2 -0
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard.ts +22 -4
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-logic.ts +7 -0
- package/scripts/init/init.ts +0 -3
- package/scripts/init/project-profile.ts +6 -11
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +1 -0
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +3 -3
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +3 -3
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +0 -2
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +2 -2
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +8 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/{git → issue}/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +1 -1
- package/scripts/issue/measure-rerun-cli.ts +1 -1
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +8 -1
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +6 -0
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +2 -2
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +3 -6
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-cli.ts +1 -4
- package/scripts/lane/lane-close.ts +1 -3
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +21 -11
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +3 -0
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/lines-command.ts +0 -1
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +0 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +0 -2
- package/scripts/propagate/propagate-steps.ts +3 -5
- package/scripts/propagate/propagate-targets.ts +0 -4
- package/scripts/propagate/propagate.ts +0 -4
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +0 -1
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +0 -2
- package/scripts/registry-migration/migrate.ts +19 -9
- package/scripts/release/github-release-cli.ts +8 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +2 -3
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +4 -16
- package/scripts/review/review-brief-cli.ts +23 -6
- package/scripts/review/review-brief.ts +21 -8
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +1 -1
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +0 -3
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +0 -1
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-park.ts +13 -6
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +13 -5
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +1 -1
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +101 -24
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +2 -2
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +25 -5
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +1 -1
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +5 -13
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +0 -1
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +2 -2
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-cli.ts +4 -7
- package/scripts/run/run-progress-clock.ts +6 -34
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +1 -2
- package/scripts/run/run-progress.ts +1 -2
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +21 -3
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +1 -1
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +18 -4
- package/scripts/run/run-ship-review.ts +11 -0
- package/scripts/run/run-ship-scoped.ts +1 -0
- package/scripts/run/run-ship-steps.ts +1 -1
- package/scripts/run/run-ship.ts +0 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +1 -1
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +2 -1
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +2 -3
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +9 -7
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +0 -2
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +0 -1
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/dependabot-auto-merge.yml +5 -3
- package/templates/workflows/github-release.yml +81 -0
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
package/.claude/settings.json
CHANGED
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
"deny": [
|
|
6
6
|
"Bash(rm -rf *)",
|
|
7
7
|
"Bash(rm -rf /*)",
|
|
8
|
+
"Bash(rm -fr *)",
|
|
9
|
+
"Bash(gh repo delete*)",
|
|
10
|
+
"Bash(gh repo archive*)",
|
|
11
|
+
"Bash(gh pr close*)",
|
|
12
|
+
"Read(./.env)",
|
|
8
13
|
"Bash(git push --force*)",
|
|
9
14
|
"Bash(git push -f*)",
|
|
10
15
|
"Bash(git push *--force*)",
|
|
@@ -56,11 +61,7 @@
|
|
|
56
61
|
"hooks": [
|
|
57
62
|
{
|
|
58
63
|
"type": "command",
|
|
59
|
-
"command": "
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"type": "command",
|
|
63
|
-
"command": "if [ -f dist/hooks/session-lang.js ]; then node dist/hooks/session-lang.js; else pnpm josh session:lang; fi",
|
|
64
|
+
"command": "if project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\" || exit 1; fi; cd \"$project_root\" && if node --disable-warning=ExperimentalWarning scripts/hooks/hook-bundle-ready.ts; then node dist/hooks/session-lang.js; else pnpm josh session:lang; fi",
|
|
64
65
|
"timeout": 10
|
|
65
66
|
}
|
|
66
67
|
]
|
|
@@ -72,7 +73,7 @@
|
|
|
72
73
|
"hooks": [
|
|
73
74
|
{
|
|
74
75
|
"type": "command",
|
|
75
|
-
"command": "if
|
|
76
|
+
"command": "if project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\" || exit 1; fi; cd \"$project_root\" && if node --disable-warning=ExperimentalWarning scripts/hooks/hook-bundle-ready.ts; then node dist/hooks/pretool-guard.js; else pnpm josh pretool:guard; fi",
|
|
76
77
|
"timeout": 20
|
|
77
78
|
}
|
|
78
79
|
]
|
|
@@ -84,7 +85,7 @@
|
|
|
84
85
|
"hooks": [
|
|
85
86
|
{
|
|
86
87
|
"type": "command",
|
|
87
|
-
"command": "if
|
|
88
|
+
"command": "if project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\" || exit 1; fi; cd \"$project_root\" && if node --disable-warning=ExperimentalWarning scripts/hooks/hook-bundle-ready.ts; then node dist/hooks/format-edited.js; else pnpm josh format:edited; fi",
|
|
88
89
|
"timeout": 90
|
|
89
90
|
}
|
|
90
91
|
]
|
|
@@ -96,7 +97,7 @@
|
|
|
96
97
|
"hooks": [
|
|
97
98
|
{
|
|
98
99
|
"type": "command",
|
|
99
|
-
"command": "if
|
|
100
|
+
"command": "if project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\" || exit 1; fi; cd \"$project_root\" && if node --disable-warning=ExperimentalWarning scripts/hooks/hook-bundle-ready.ts; then node dist/hooks/stop-guard.js; else pnpm josh stop:guard; fi",
|
|
100
101
|
"timeout": 20
|
|
101
102
|
}
|
|
102
103
|
]
|
|
@@ -6,9 +6,7 @@ description: The procedures for the `josh epic:*` commands that make an epic run
|
|
|
6
6
|
# The `josh epic:*` commands
|
|
7
7
|
|
|
8
8
|
These three commands are what turn an epic from a list of issue numbers into something a run can
|
|
9
|
-
execute unattended. **This skill is their single source
|
|
10
|
-
`epic-bundle.md`, `epic-audit.md` and `cross-repo-epic.md` only as pointers here, and the history
|
|
11
|
-
behind the rules is `docs/maintainers/epic-commands-rationale.md` (joshuafolkken/kit#2892).
|
|
9
|
+
execute unattended. **This skill is their single source**, and the history behind the rules is `docs/maintainers/epic-commands-rationale.md` (joshuafolkken/kit#2892).
|
|
12
10
|
|
|
13
11
|
The workflow keywords themselves — `kickoff`, `fullrun`, `halfrun`, `backlogrun` — live in the
|
|
14
12
|
`workflow-commands` skill.
|
|
@@ -118,7 +116,7 @@ about the search itself rather than about anything the children say (joshuafolkk
|
|
|
118
116
|
|
|
119
117
|
**One thing it cannot check** belongs to planning: when a child introduces a new label, command,
|
|
120
118
|
state or artifact, list the existing code referencing that concept and confirm some child owns
|
|
121
|
-
updating it. Label names are single-sourced in `scripts/
|
|
119
|
+
updating it. Label names are single-sourced in `scripts/issue/issue-labels.ts`.
|
|
122
120
|
|
|
123
121
|
History: `docs/maintainers/epic-commands-rationale.md` → "`epic:audit` — why the children are read across".
|
|
124
122
|
|
|
@@ -153,7 +151,7 @@ command prints a ⚠️ line naming that child rather than reporting a reorderin
|
|
|
153
151
|
`owner/repo#number` and kept by the epic named earlier; withheld there, it stays withheld, because a
|
|
154
152
|
`blocked-by` relation belongs to the issue rather than to the epic listing it. **One unusable graph
|
|
155
153
|
refuses the whole answer**, and **one reference that does not parse fails the read** rather than
|
|
156
|
-
being dropped. `docs/josh-commands.md` → "`josh epic:next`" carries the worked form.
|
|
154
|
+
being dropped. `docs/josh-commands-automation.md` → "`josh epic:next`" carries the worked form.
|
|
157
155
|
|
|
158
156
|
**An `in-progress` issue occupies a lane rather than the whole repository.** The occupancy is counted
|
|
159
157
|
from that repository's own `in-progress` listing — never from anything the session remembers, since
|
|
@@ -196,7 +194,7 @@ inherits; open and tracked by none, the child waits on a person and the
|
|
|
196
194
|
blocker is named on standard error; a state the relation did not carry reads as waiting. **So an order
|
|
197
195
|
between two epics is recorded with a native `blocked-by` relation and honoured by naming both epics**
|
|
198
196
|
— `epic:next 1936 1931`, or `backlog:next`, whose set is the whole opted-in backlog. The table is
|
|
199
|
-
`docs/josh-commands.md` → "`josh epic:next`".
|
|
197
|
+
`docs/josh-commands-automation.md` → "`josh epic:next`".
|
|
200
198
|
|
|
201
199
|
Two things stop the command rather than being worked around: a **circular dependency**, and a
|
|
202
200
|
**disagreement between the epic body and the `blocked-by` relations** (an epic written before `josh`
|
|
@@ -484,7 +482,7 @@ than restated — and beside it the one thing this one deliberately refuses: whe
|
|
|
484
482
|
already been filed, from a title comparison (joshuafolkken/kit#1252). **Both run**, and neither
|
|
485
483
|
replaces the other: `pnpm josh issue:file` runs the scout before it creates the issue, and
|
|
486
484
|
`epic:bundle` afterwards, from the real number and the relations recorded against it.
|
|
487
|
-
Full behavior: `docs/josh-commands.md` → "`josh issue:file`".
|
|
485
|
+
Full behavior: `docs/josh-commands-automation.md` → "`josh issue:file`".
|
|
488
486
|
|
|
489
487
|
**When the relation carries an order, record it** in `blocked-by` and in the epic's `Dependencies` —
|
|
490
488
|
on an addition as much as on a new epic. Without it the batch survives and the reason for it does
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: workflow-commands
|
|
3
|
-
description: The procedures for the Issue-driven shorthand commands `kickoff`, `fullrun`, `halfrun` and `backlogrun` — planning, implementation, the verification gate, unattended epic and backlog execution, the `/code-review` → `followup` chain rule, auto-merge and the Telegram notifications. Read this the moment the user types one of those keywords (with or without `#N` / `new`), before running any command, and read it too when asked what one of them does or when a run of one has to be resumed or repaired.
|
|
3
|
+
description: The procedures for the Issue-driven shorthand commands `kickoff`, `fullrun`, `halfrun`, `prrun` and `backlogrun` — planning, implementation, the verification gate, unattended epic and backlog execution, the `/code-review` → `followup` chain rule, auto-merge and the Telegram notifications. Read this the moment the user types one of those keywords (with or without `#N` / `new`), before running any command, and read it too when asked what one of them does or when a run of one has to be resumed or repaired.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Issue-driven workflow commands
|
|
7
7
|
|
|
8
|
-
`kickoff`, `fullrun`, `halfrun` and `backlogrun` are the shorthand commands this
|
|
8
|
+
`kickoff`, `fullrun`, `halfrun`, `prrun` and `backlogrun` are the shorthand commands this
|
|
9
9
|
package's collaboration workflow is built on. Their procedures live here rather than in `CLAUDE.md`
|
|
10
10
|
because each one applies only while its own command is running.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
Each topic file under `prompts/collaboration-workflow/` sources its own rule; this skill sources the
|
|
13
|
+
procedures. Neither restates the other.
|
|
14
14
|
|
|
15
15
|
## 0. The rule that fires before any of them — explicit invocation
|
|
16
16
|
|
|
17
|
-
**Never start a `kickoff` / `halfrun` / `fullrun` / `backlogrun` workflow (including their
|
|
17
|
+
**Never start a `kickoff` / `halfrun` / `prrun` / `fullrun` / `backlogrun` workflow (including their
|
|
18
18
|
`#N` and `new` variants) unless the user has typed the keyword in the current turn's prompt.** This rule is also
|
|
19
19
|
resident in the AI documents, because it has to hold when this skill has *not* been loaded.
|
|
20
20
|
|
|
@@ -44,6 +44,7 @@ the file its pointer names (for `fullrun`, the step lists are `fullrun-steps.md`
|
|
|
44
44
|
| `kickoff` / `kickoff #N` / `kickoff new` | `kickoff.md` |
|
|
45
45
|
| `fullrun` / `fullrun #N` / `fullrun new` | `fullrun.md` |
|
|
46
46
|
| `halfrun` / `halfrun #N` / `halfrun new` | `halfrun.md` |
|
|
47
|
+
| `prrun` / `prrun #N` / `prrun new` | `prrun.md` — the difference over `fullrun.md`, read with it |
|
|
47
48
|
| `backlogrun` / `backlogrun #N…` / `backlogrun #E…` | `backlogrun.md` — its dispatched child reads `fullrun.md` + `split-assessment.md` in its own unit, not the parent at entry |
|
|
48
49
|
|
|
49
50
|
Each command manifest cites `split-assessment.md` → "The question" — the split decision, read at the
|
|
@@ -115,12 +116,12 @@ procedure.
|
|
|
115
116
|
| While implementing | Re-run one check by name, not the whole gate — `pnpm josh lint:related`, `pnpm josh cspell:dot`, `pnpm josh test:related`; the last pair runs in front of the gate, and `pnpm josh review:brief` refuses a brief on a tree neither was green on | `chain-rule.md` |
|
|
116
117
|
| A review has run | Its verdict counts only once `pnpm josh review:attest --check` answers `ok`; `missing` / `mismatch` are refusals `pnpm josh followup` blocks the merge on | `chain-rule.md` → "The brief names the checkout, and a review that read another one is refused" |
|
|
117
118
|
| E2E gate | The CI E2E job where the command ends in a PR (`fullrun` / `backlogrun`, enforced by `pnpm josh followup`); you run `pnpm josh test:e2e` yourself where it does not (`halfrun`) | `prompts/testing-guide.md` → "Closing the E2E gate without a human run" |
|
|
118
|
-
| A defect in
|
|
119
|
+
| A defect in kit's own verification turns up | It runs alone, and a batch resumes only once it has merged, when three conditions all hold (a defect, in kit's own verification, making unrelated PRs answer wrongly on `main` now) — never from how serious it looks | `prompts/collaboration-workflow/wip-cap.md` → 「実行のしかた」 |
|
|
119
120
|
| A command can take minutes | Issue it in the background; the turn never ends at the push (`pnpm josh followup` stays foreground) | §2h → `background-commands.md` → "Background the gate and push" |
|
|
120
121
|
| `pnpm josh issue:state <N>` answers `human_review: yes` | Implement and gate, then stop before the commit | §2z → `needs-human-review.md` |
|
|
121
122
|
| Under `backlogrun`, a stop that would end a batch, or a named non-epic item | Park one child and continue; run a named non-epic item as a `fullrun` | `backlogrun-park.md` → "park and continue"; `backlogrun-child.md` → "When `#N` is not an epic" |
|
|
122
123
|
| `backlogrun`'s authorization | The whole `auto-ok` opted-in pool as well as its named items; `pnpm josh backlog:next` offers them | `backlogrun.md` |
|
|
123
|
-
| First call of
|
|
124
|
+
| First call of any entry | `#N`: `pnpm josh run:entry <N> --to <command>` (claims the tree, except `kickoff`); `new` (not `kickoff`): `pnpm josh run:hold` | §2k; §2f → `working-tree-hold.md` |
|
|
124
125
|
| Same turn as the hold (not a dispatched child, not `kickoff`) | `pnpm josh cost --cut`; `under` continues, `over` stops with a `confirmation` Telegram and the resume command, then `pnpm josh run:release` | `backlogrun-progress.md` → "The hand-off" (shared 135,000 threshold) |
|
|
125
126
|
| Before any work starts (every entry) | The split assessment; the default is not to split — separability **and** a scope clearly over one gate must hold together; a `fullrun` / `halfrun` that finds a split files the epic and **stops** | `split-assessment.md` → "The question" |
|
|
126
127
|
| Another Issue here must land first | A prerequisite is a dependency, not a park (the third of four mid-run discoveries) | §2d → `prerequisite.md` |
|
|
@@ -193,14 +194,14 @@ refuses the second `pnpm josh issue:file` call until it has.
|
|
|
193
194
|
its duplicate and epic answers.** This applies inside every workflow, including observations and review
|
|
194
195
|
follow-ups. The guard refuses any other filing call. Read `issue-scout.md` at that point for the
|
|
195
196
|
duplicate, closed-Issue and epic decisions and for `--distinct`; `issue-fold-existing.md` handles a
|
|
196
|
-
compatible duplicate. `docs/josh-commands.md` → "`josh issue:file`" defines the command.
|
|
197
|
+
compatible duplicate. `docs/josh-commands-automation.md` → "`josh issue:file`" defines the command.
|
|
197
198
|
|
|
198
199
|
## 2f. The working-tree hold — one run per tree
|
|
199
200
|
|
|
200
201
|
**Trigger:** the first call of `fullrun` and `halfrun` alike — before the title is normalized, before
|
|
201
|
-
`git switch main`, and before a `new` entry files its Issue. **Then:**
|
|
202
|
-
`pnpm josh run:entry <N
|
|
203
|
-
`pnpm josh run:hold
|
|
202
|
+
`git switch main`, and before a `new` entry files its Issue. **Then:** a `#N` entry first runs
|
|
203
|
+
`pnpm josh run:entry <N> --to <command>` (§2k, the tree claim included); `new` runs bare
|
|
204
|
+
`pnpm josh run:hold`. `hold` continues; `busy` and `unknown` stop with a `confirmation` Telegram
|
|
204
205
|
carrying what stderr printed. **`kickoff` is exempt** (it edits nothing). A stop that leaves the tree
|
|
205
206
|
clean releases explicitly with `pnpm josh run:release [<N>]`; a `halfrun` or `needs-human-review` stop
|
|
206
207
|
keeps the hold; `pnpm josh followup` releases a merged run. The answer table, the per-child rule and
|
|
@@ -241,6 +242,13 @@ digest it names once.** File up to two worthwhile improvements through `issue:fi
|
|
|
241
242
|
`epic:bundle` included), stack the rest in the observation ledger, and close the step with the command described
|
|
242
243
|
there. A dispatched lane child never runs the retrospective.
|
|
243
244
|
|
|
245
|
+
## 2k. The stage ladder
|
|
246
|
+
|
|
247
|
+
`kickoff` → `halfrun` → `prrun` → `fullrun` (joshuafolkken/kit#3042): the command sets how far a run
|
|
248
|
+
goes, the Issue where it starts. `run:entry <N> --to <command>` prints `stage #<N> — at: … · start:
|
|
249
|
+
…`; **`start: reached` redoes nothing — stop** (at `merged`, the next line answers). A
|
|
250
|
+
stop's `Next:` line names the commands further up. Table: `docs/how-to/run-issues.md`.
|
|
251
|
+
|
|
244
252
|
## 3. What stays resident, and what is read from here
|
|
245
253
|
|
|
246
254
|
**The residency criterion is `prompts/collaboration-workflow/residency.md`, its single source — read
|
|
@@ -131,9 +131,10 @@ turn-end this section forbids. The boundary, its two commands and the resume ver
|
|
|
131
131
|
|
|
132
132
|
**A headless lane child (`claude -p`) is where "a background command re-invokes the run" does not
|
|
133
133
|
hold: its background Bash tasks are killed when its turn ends** (joshuafolkken/kit#2704). It hands the
|
|
134
|
-
gate-to-merge region to `pnpm josh ship --detach` instead (`chain-rule.md` step 0)
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
gate-to-merge region to a foreground `pnpm josh ship --detach` instead (`chain-rule.md` step 0) —
|
|
135
|
+
its preflight runs before the supervisor exists, so a backgrounded `ship` dies with the turn
|
|
136
|
+
(joshuafolkken/kit#3027); `pnpm josh rule:guard` refuses a backgrounded `josh gate` / `git` /
|
|
137
|
+
`followup` / `ship` there, and the `Stop` hook sends a child with a task still running back to wait.
|
|
137
138
|
|
|
138
139
|
The operational section above is the single source of the rule. `followup.md`, `chain-rule.md` and
|
|
139
140
|
`backlogrun-progress.md` → "Progress while the run is quiet" route here for it rather than restating it.
|
|
@@ -94,7 +94,7 @@ child over" in `backlogrun-lanes.md` carries the command.
|
|
|
94
94
|
JSONL. `JOSH_WORKER_MODEL` overrides Claude Code only; `JOSH_WORKER_EFFORT` covers both providers,
|
|
95
95
|
and legacy `JOSH_LANE_*` applies only here. Bad markers, missing CLI/auth and failure
|
|
96
96
|
refuse or park without fallback or retry.
|
|
97
|
-
`docs/josh-commands.md` → "`josh lane:dispatch`" is the single source.
|
|
97
|
+
`docs/josh-commands-automation.md` → "`josh lane:dispatch`" is the single source.
|
|
98
98
|
|
|
99
99
|
**The parent reads GitHub, never the summary.** That is `epic-child`'s verifier: a unit that reports
|
|
100
100
|
a child finished without its PR merged leaves that child open, and `pnpm josh issue:state <N>` says so
|
|
@@ -65,7 +65,7 @@ it is".
|
|
|
65
65
|
|
|
66
66
|
`pnpm josh epic:next <E> --repo <owner/repo> --lanes` answers with **one issue number per line**, up to
|
|
67
67
|
the number of free lanes, and each of those children runs in a **lane** of its own: a linked git work
|
|
68
|
-
tree with its own branch, its own `.env` and its own dev and preview ports (`docs/josh-commands.md` →
|
|
68
|
+
tree with its own branch, its own `.env` and its own dev and preview ports (`docs/josh-commands-automation.md` →
|
|
69
69
|
"`josh lane:open` / `josh lane:close` / `josh lane:list` / `josh lane:prune`"). **Implementation, the
|
|
70
70
|
verification gate and the review run in parallel; the merges stay serial** — each one lands on the
|
|
71
71
|
`main` the next is then measured against.
|
|
@@ -76,12 +76,14 @@ verification are `pre-gate-cut.md`, the single source. **The child is told apart
|
|
|
76
76
|
resume stage is handed to it, by a mark the dispatch sets** — `JOSH_LANE_CHILD`, the lane's issue
|
|
77
77
|
number (`pre-gate-cut.md` → "The dispatch mark" and "The stage is passed to the resumed child").
|
|
78
78
|
|
|
79
|
-
**One kind of child takes no lane beside anything:
|
|
80
|
-
|
|
81
|
-
from
|
|
79
|
+
**One kind of child takes no lane beside anything: a defect in kit's own verification that makes
|
|
80
|
+
unrelated PRs answer wrongly on `main` today.** It runs alone, and the batch resumes only once it has
|
|
81
|
+
merged. **Decide it from three conditions that must all hold, never from how serious it looks** — is
|
|
82
|
+
it a defect (not an improvement, refactor, removal or feature)? Is it in kit's own verification gate
|
|
82
83
|
(lint / type check / spell check / unit tests), the code review, the pre-push hook, or the merge
|
|
83
|
-
checks
|
|
84
|
-
|
|
84
|
+
checks — not a consumer repository's CI or template? Does it, on `main` now, make unrelated PRs
|
|
85
|
+
answer wrongly (a false green or a false red)? All three, and the issue carries `run:solo`; any one
|
|
86
|
+
missing, and it carries `run:lane` and fills a lane like any other child. `backlog:next` and `epic:next --lanes` enforce both (joshuafolkken/kit#2776,
|
|
85
87
|
#2779). The rule is
|
|
86
88
|
`prompts/collaboration-workflow/wip-cap.md` → 「実行のしかた」, its single source.
|
|
87
89
|
|
|
@@ -48,7 +48,7 @@ for a whole interval (that exit says so on standard error). **Nothing in flight
|
|
|
48
48
|
|
|
49
49
|
**`--mark` at every real report.** Whenever this loop reports something of its own — a child merged,
|
|
50
50
|
parked, a stop — run `pnpm josh run:progress --mark` in the same turn to restart the silence clock. The clock is silence, never a timer
|
|
51
|
-
(`docs/josh-commands.md` → "`josh run:progress`").
|
|
51
|
+
(`docs/josh-commands-automation.md` → "`josh run:progress`").
|
|
52
52
|
|
|
53
53
|
**Do not keep a progress clock of your own** — the hook refuses the arm rather than asking
|
|
54
54
|
(`scripts/rules/early-heartbeat.ts` → `decide`), though **a single correctly-spaced arm is allowed**. It
|
|
@@ -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.**
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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.
|
|
@@ -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.
|