@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
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,13 +116,13 @@ 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
|
-
| Same turn as the hold (not a dispatched child, not `kickoff`) | `pnpm josh cost --cut`; `under` continues, `over` stops
|
|
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` |
|
|
125
|
+
| Same turn as the hold (not a dispatched child, not `kickoff`) | `pnpm josh cost --cut`; `under` continues, `over` stops — `run:entry` notifies and runs `run:release` (by hand for `new`) | `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` |
|
|
127
128
|
| Something worth filing, none of the three | File it without asking (Tier A, first-party) and carry on; a delegated child returns it to the parent instead | §2i → `observation-filing.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
|
|
@@ -28,83 +28,39 @@ command finished.
|
|
|
28
28
|
|
|
29
29
|
**Never hand-write a `while`/`until` … `sleep` loop over the output file.** The loop does not know
|
|
30
30
|
when the command finished: a regex that never matches waits to the block limit, and one that matches
|
|
31
|
-
a mid-run line exits too early
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
landed. `pnpm josh rule:guard` refuses the poll loop and hands back this route, so the guarantee is a
|
|
35
|
-
mechanism rather than prose to remember (`prompts/collaboration-workflow/rule-delivery.md`).
|
|
31
|
+
a mid-run line exits too early. `pnpm josh rule:guard` refuses the poll loop and hands back this route
|
|
32
|
+
(`prompts/collaboration-workflow/rule-delivery.md`). Rationale:
|
|
33
|
+
`docs/maintainers/background-commands-rationale.md` → "Why a poll loop is refused".
|
|
36
34
|
|
|
37
35
|
**To glance at interim output, `Read` the output file once** — the notification names its path — and
|
|
38
36
|
never in a sleep loop. If what you are waiting on is CI, `pnpm josh followup` waits on it for you in
|
|
39
37
|
the foreground; a bare `sleep` that arms a progress heartbeat is `run:progress --wait`'s job, refused
|
|
40
|
-
in front of a hand-armed timer by `early-heartbeat
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
(`SKILL.md` → §1, "Five documents are read at the point of use"). `SKILL.md` → §2h is the resident
|
|
50
|
-
pointer to it, and carries the one thing it does not: the same rule at a batch's scale.
|
|
51
|
-
|
|
52
|
-
**A run's idle time collects in its tail, and the two ways it collects there are one mistake**
|
|
53
|
-
(joshuafolkken/kit#1510). `fullrun #1501` ran 45m03s on about 17 minutes of work. Of the 25 minutes
|
|
54
|
-
nothing was running, **6m28s** was a `pnpm josh git -y` issued in the **foreground** with a
|
|
55
|
-
900-second tool timeout — above the harness's own 600-second cap, so the harness detached it at the
|
|
56
|
-
cap and nothing read the output file for six and a half minutes afterwards — and **6m06s** was bare
|
|
57
|
-
CI: the push landed, the turn ended, and the merge started only once the person asked whether it was
|
|
58
|
-
merging. Both halves handed the deciding of *when to look back* to something that was never going to
|
|
59
|
-
decide it.
|
|
60
|
-
|
|
61
|
-
**Issue it in the background, and never give a foreground call a timeout above the harness cap.**
|
|
62
|
-
The cap decides how long a foreground call waits, not the number passed to it, so a number above the
|
|
63
|
-
cap chooses the detached path without choosing the completion notification that should come with it.
|
|
64
|
-
A call issued detached from the start re-invokes the run when it exits — which is what makes the
|
|
65
|
-
completion *delivered* rather than something to remember to poll for.
|
|
66
|
-
|
|
67
|
-
The measured outliers were a 6m28s foreground `git -y`, 6m06s of unattended CI and a 19m26s push
|
|
68
|
-
transport fault. The operational section above maps those waits to background gate/push and a
|
|
69
|
-
foreground `followup`; `followup.md` remains its command procedure.
|
|
70
|
-
|
|
71
|
-
**A tail does follow the merge, and it is not small** (joshuafolkken/kit#1462). This section first
|
|
72
|
-
gave a different reason for that last bullet — that the merge ends the run, leaving no tail to
|
|
73
|
-
overlap — and the measurement says otherwise. The run-timing report charges to **`post-run`** exactly what runs
|
|
74
|
-
after the last `followup` span ends: **3.0 min, 5.9% of a 50.5-minute run**, in the lane child
|
|
75
|
-
`--issue 1599` (PR #1602); **2 min 31 s, 14% of 20m15s**, in the plain `fullrun #1597` (PR #1603);
|
|
76
|
-
**3.1 min** hand-measured in run #1441's delegated child, which is where this Issue started. **What
|
|
77
|
-
was wrong is the premise, not the conclusion** — `followup` stays foreground, and what changes is
|
|
78
|
-
*where the tail's work is done*.
|
|
79
|
-
|
|
80
|
-
**So the tail is emptied before `followup` is issued, rather than worked through after it returns.**
|
|
38
|
+
in front of a hand-armed timer by `early-heartbeat`.
|
|
39
|
+
|
|
40
|
+
## The tail and what overlaps each wait
|
|
41
|
+
|
|
42
|
+
**Never give a foreground call a timeout above the harness cap** — the cap decides how long a
|
|
43
|
+
foreground call waits, so a larger number detaches the call without the completion notification.
|
|
44
|
+
Rationale: `docs/maintainers/background-commands-rationale.md` → "Why the tail collects idle time".
|
|
45
|
+
|
|
46
|
+
**The tail is emptied before `followup` is issued, rather than worked through after it returns.**
|
|
81
47
|
One question decides each step, and it is asked of the step rather than judged: **does it read the
|
|
82
48
|
merge result?**
|
|
83
49
|
|
|
84
50
|
- **It does — the step stays after `followup`.** `pnpm josh ms`, `pnpm josh issue:state <N>`,
|
|
85
51
|
`pnpm josh epic:next`, `pnpm josh backlog:next --exclude <N>`, and `pnpm josh lane:close` /
|
|
86
|
-
`pnpm josh lane:list`.
|
|
87
|
-
|
|
88
|
-
not removing it**: the parent reads the child's state from GitHub *because* a summary is not a
|
|
89
|
-
verifier ("Each child runs in a delegated unit"), so none of these may be dropped or answered from
|
|
90
|
-
memory.
|
|
52
|
+
`pnpm josh lane:list`. **De-duplicating a step is not removing it**: none of these may be dropped or
|
|
53
|
+
answered from memory.
|
|
91
54
|
- **It does not — the step is composed in the turn that issues `followup`.** The epic progress
|
|
92
|
-
comment's counter *values*
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
on. It is seconds of tail against a guard on session size, so it keeps its documented seam
|
|
102
|
-
(`backlogrun-progress.md` → "The check is asked at every merge").
|
|
103
|
-
|
|
104
|
-
**What runs beside a backgrounded command is the work that writes nothing to the working tree.** That
|
|
105
|
-
is the whole test, and it is the same one that lets the gate and the review overlap (`SKILL.md` →
|
|
106
|
-
§2): a step that edits makes the background command's result stale, so it is not something to overlap
|
|
107
|
-
with. Applied to the three waits a run actually has:
|
|
55
|
+
comment's counter *values* and the completion report body (placed beside `pnpm josh git -y` in the
|
|
56
|
+
table below). **Only the write follows the merge.**
|
|
57
|
+
- **`pnpm josh cost --cut` stays after the merge, and reads nothing from it** — its answer grows with
|
|
58
|
+
the session, so it keeps its documented seam (`backlogrun-progress.md` → "The check is asked at
|
|
59
|
+
every merge").
|
|
60
|
+
|
|
61
|
+
**What runs beside a backgrounded command is the work that writes nothing to the working tree** — a
|
|
62
|
+
step that edits makes the background command's result stale. Applied to the three waits a run
|
|
63
|
+
actually has:
|
|
108
64
|
|
|
109
65
|
| While this runs | Do this beside it |
|
|
110
66
|
| --------------- | ----------------- |
|
|
@@ -115,25 +71,21 @@ with. Applied to the three waits a run actually has:
|
|
|
115
71
|
|
|
116
72
|
**The turn never ends at the push.** The completion notification for `pnpm josh git -y` is what
|
|
117
73
|
resumes the run, and the turn that reads it goes straight through any branch-2 filing and
|
|
118
|
-
`pnpm josh epic:bundle` to `pnpm josh followup`.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
**One turn does end before the push, and only one: a dispatched lane child's pre-gate cut**
|
|
127
|
-
(joshuafolkken/kit#1839). It ends the turn before the gate and relaunches a fresh process in the same
|
|
128
|
-
act, so the run continues rather than stalling — the sanctioned boundary distinct from the push
|
|
129
|
-
turn-end this section forbids. The boundary, its two commands and the resume verification are the
|
|
130
|
-
`pre-gate-cut.md` skill document, its single source.
|
|
74
|
+
`pnpm josh epic:bundle` to `pnpm josh followup`. `pnpm josh rule:guard` refuses the foreground push
|
|
75
|
+
step and states both halves at that call (`prompts/collaboration-workflow/rule-delivery.md`); the push
|
|
76
|
+
reissued detached is not refused again. Rationale: `docs/maintainers/background-commands-rationale.md`
|
|
77
|
+
→ "Why the push is guarded".
|
|
78
|
+
|
|
79
|
+
**One turn does end before the push, and only one: a dispatched lane child's pre-gate cut.** It ends
|
|
80
|
+
the turn before the gate and relaunches a fresh process in the same act — `pre-gate-cut.md` → "Taking
|
|
81
|
+
the cut" is its single source.
|
|
131
82
|
|
|
132
83
|
**A headless lane child (`claude -p`) is where "a background command re-invokes the run" does not
|
|
133
|
-
hold: its background Bash tasks are killed when its turn ends
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
84
|
+
hold: its background Bash tasks are killed when its turn ends.** It hands the gate-to-merge region to
|
|
85
|
+
a foreground `pnpm josh ship --detach` instead (`chain-rule.md` step 0) — its preflight runs before the
|
|
86
|
+
supervisor exists, so a backgrounded `ship` dies with the turn; `pnpm josh rule:guard` refuses a
|
|
87
|
+
backgrounded `josh gate` / `git` / `followup` / `ship` there, and the `Stop` hook sends a child with a
|
|
88
|
+
task still running back to wait.
|
|
137
89
|
|
|
138
90
|
The operational section above is the single source of the rule. `followup.md`, `chain-rule.md` and
|
|
139
91
|
`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
|
|
|
@@ -18,14 +18,16 @@ by that supervisor; an AI parent is started only for a driver branch that requir
|
|
|
18
18
|
pnpm josh run:progress --wait --output <the transcript path of each delegated unit> # in the background
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
**Start it once; it reports by itself** (joshuafolkken/kit#3102). Each silence interval appends the
|
|
22
|
+
five labelled lines to the run's event stream as a heartbeat and to the ambient log, prints nothing to
|
|
23
|
+
standard output and keeps running — so a scheduled report never wakes the parent, and the parent
|
|
24
|
+
relays none. **It exits only on one of three, and the command computes which:**
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
| Exit | What the parent does |
|
|
27
|
+
| ------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
28
|
+
| Newly runnable backlog work (the `ready #N` line) | Read the ready line, act on it, and restart the watcher in that turn |
|
|
29
|
+
| `pnpm josh followup` removed the run's life record | Nothing — the run has ended |
|
|
30
|
+
| `--hours` elapsed (8 by default for `--wait`) | Restart the watcher in that turn |
|
|
29
31
|
|
|
30
32
|
**`pnpm josh run:watcher:guard` detects a missed restart** (joshuafolkken/kit#2113): it refuses when
|
|
31
33
|
lane children are in-flight but the watcher's life record has gone stale. **It is wired into
|
|
@@ -33,22 +35,22 @@ lane children are in-flight but the watcher's life record has gone stale. **It i
|
|
|
33
35
|
until the watcher is restarted — once per run, so the `pnpm josh run:progress --wait` that fixes it is
|
|
34
36
|
not blocked.
|
|
35
37
|
|
|
36
|
-
**`run:progress`
|
|
38
|
+
**`run:progress` writes the five labelled lines itself (joshuafolkken/kit#2026).** It emits the observation instant (`at`, local first and UTC beside it), the elapsed figures
|
|
37
39
|
(`quiet` and `unchanged`), the children in flight, the run state (`lanes`, `load`, `record`), and the
|
|
38
|
-
scheduled `next`, each behind its own label and on its own line — so
|
|
39
|
-
|
|
40
|
+
scheduled `next`, each behind its own label and on its own line — so where a session does present them
|
|
41
|
+
(`--once`), it relays the output verbatim and rounds, rephrases or re-labels nothing. How each field reads when it has nothing to report (`record
|
|
40
42
|
unread`, `no in-progress child yet`, `lanes none`, an absent `next`) is fixed by the command's own unit
|
|
41
43
|
tests. **A value said that way is still an observation, never a state**: `record unread` means no
|
|
42
44
|
`--output` path was given, not *not stalled*; `lanes none` is *no lane is open*, not *nothing is
|
|
43
45
|
running*; and the `next` line is a schedule — the time *if the silence continues*, superseded when a
|
|
44
46
|
real report resets the clock through `--mark`.
|
|
45
47
|
|
|
46
|
-
**
|
|
47
|
-
|
|
48
|
+
**A report is not an exit, and neither is a decline** — with no run recorded it keeps waiting, and the
|
|
49
|
+
`--hours` exit says so on standard error.
|
|
48
50
|
|
|
49
51
|
**`--mark` at every real report.** Whenever this loop reports something of its own — a child merged,
|
|
50
52
|
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`").
|
|
53
|
+
(`docs/josh-commands-automation.md` → "`josh run:progress`").
|
|
52
54
|
|
|
53
55
|
**Do not keep a progress clock of your own** — the hook refuses the arm rather than asking
|
|
54
56
|
(`scripts/rules/early-heartbeat.ts` → `decide`), though **a single correctly-spaced arm is allowed**. It
|
|
@@ -130,21 +132,13 @@ in the same turn as each: **the Step 0 work summary, the pull request opening, e
|
|
|
130
132
|
verdict, and any `confirmation` / `failure` / `completion` notification or stop.** **A tool result only
|
|
131
133
|
you read is not one** — a gate run, a `gh` read, an edit.
|
|
132
134
|
|
|
133
|
-
**On a quiet tick the turn is the relayed line plus at most two lines of the run's own prose**, saying
|
|
134
|
-
only what changed stage and what is being waited on. **A tick is quiet when none of the real reports
|
|
135
|
-
happened since the last one**; a gate that went green, a review round, a file edited, a poll answering
|
|
136
|
-
`wait` are the run working, not a report. **No table, no re-listing of children, no restating of the
|
|
137
|
-
plan** — `epic:next`, the epic body and the progress comment hold all three. **A real report is not
|
|
138
|
-
bounded by that**: `--mark` restarts the clock, so a merge, a park or a stop is where the run may be
|
|
139
|
-
long.
|
|
140
|
-
|
|
141
135
|
**`--output` is omitted in a single-issue run, and `record` reads `unread`.** Rationale for the
|
|
142
136
|
watcher's scope and placement: `docs/maintainers/backlogrun-progress-rationale.md` → "Why the watcher
|
|
143
137
|
runs where it does".
|
|
144
138
|
|
|
145
139
|
**A run that merges needs no teardown; a run that stops has to end the reporting itself.** **A stop
|
|
146
140
|
keeps the `in-progress` label on purpose** — so **no further `--wait` is started** after the stop
|
|
147
|
-
notification, and
|
|
141
|
+
notification, and the running `--wait` is stopped in the same turn, since no report ends it. That
|
|
148
142
|
covers `halfrun`'s stop before commit, a `needs-human-review` stop, a split or prerequisite stop, and
|
|
149
143
|
a `backlogrun` named issue's failure stop.
|
|
150
144
|
|
|
@@ -275,11 +269,12 @@ run in lanes".
|
|
|
275
269
|
a session that cannot measure is read as `over`. **Never read the condition off `pnpm josh delegate
|
|
276
270
|
epic-child`** ("The check is asked at every merge" below).
|
|
277
271
|
3. **`wait`** — go back to step 1. **With something of this run's own in flight, that happens on the
|
|
278
|
-
wake the progress watcher's exit delivers** and the parent starts no sleep
|
|
279
|
-
figure bounds how soon the ask may be repeated. **
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
something is in flight" below decides
|
|
272
|
+
wake `lane:await` or the progress watcher's arrival exit delivers** and the parent starts no sleep
|
|
273
|
+
of its own; the 60 s figure bounds how soon the ask may be repeated. **A scheduled report is not one
|
|
274
|
+
of those wakes** (joshuafolkken/kit#3102). **With nothing in flight neither wake comes, so the parent
|
|
275
|
+
keeps the interval** — the case for "another repository has work but this one does not", and for a
|
|
276
|
+
cross-repository publish wait. "The wake exists only while something is in flight" below decides
|
|
277
|
+
which.
|
|
283
278
|
4. **`stop`** — report the parked children and finish.
|
|
284
279
|
5. **`complete`** — post the epic summary and finish.
|
|
285
280
|
6. **Exit code 1** — `epic:next` refused a cyclic or contradictory graph, or could not read a child.
|
|
@@ -421,8 +416,8 @@ in the background, in the same turn as that first `lane:list`. The wired `run:wa
|
|
|
421
416
|
|
|
422
417
|
**A carried-over child finishes in its own detached unit, and the resumed parent does not stand in front
|
|
423
418
|
of its merge.** A lane handed over at the cut is still running its own `fullrun` — the foreground
|
|
424
|
-
`pnpm josh followup` and the CI wait included — in a process of its own (background-commands.md →
|
|
425
|
-
"
|
|
419
|
+
`pnpm josh followup` and the CI wait included — in a process of its own (`background-commands.md` →
|
|
420
|
+
"Background the gate and push": foreground is *within the unit*, the background from the parent).
|
|
426
421
|
**So the parent never runs a carried-over child's `followup` itself**: it polls the handed-over lane and
|
|
427
422
|
opens new work beside it. **The reads and the dispatches go out together, in one turn** — `pnpm josh lane:list`,
|
|
428
423
|
`pnpm josh run:liveness`, `epic:next --lanes`, and opening a lane for a child it offers take none of each
|
|
@@ -472,7 +467,7 @@ clock". A stale child's label is
|
|
|
472
467
|
removed first, so the next poll can offer it. **A graph that has deadlocked on a cycle is not this loop's
|
|
473
468
|
to untangle**: `epic:next` detects it and exits with an error.
|
|
474
469
|
|
|
475
|
-
### The parent keeps no clock of its own —
|
|
470
|
+
### The parent keeps no clock of its own — a child's completion or an arrival is the wake
|
|
476
471
|
|
|
477
472
|
**After hand-off, the supervisor's driver owns the mechanical clock.** `backlog:drive` polls lane
|
|
478
473
|
completion and the backlog inside the detached process, without waking an AI parent; the parent-turn
|
|
@@ -483,12 +478,14 @@ source and `run:report` the final report.
|
|
|
483
478
|
`docs/maintainers/backlogrun-progress-rationale.md` → "Why the parent waits on classification, not a
|
|
484
479
|
clock".
|
|
485
480
|
|
|
486
|
-
The watcher reports on its own interval
|
|
481
|
+
The watcher reports on its own interval to the event stream and exits only on an arrival, so a judgment
|
|
482
|
+
session takes that exit — or a `lane:await` completion — as its prompt to act, never a report.
|
|
487
483
|
|
|
488
484
|
#### The wake exists only while something is in flight
|
|
489
485
|
|
|
490
|
-
`
|
|
491
|
-
decline; the driver still polls for new work and enforces the
|
|
486
|
+
`lane:await` wakes on a child's completion and `run:progress --wait` on an arrival; its reports wake
|
|
487
|
+
nobody. With no child in flight it may decline; the driver still polls for new work and enforces the
|
|
488
|
+
idle and whole-run bounds. A GitHub
|
|
492
489
|
listing failure stays a retry or unreadable answer from the offer command, never an empty backlog.
|
|
493
490
|
|
|
494
491
|
`epic:next` does not report when a label was applied, so read that from the issue's timeline:
|