@joshuafolkken/kit 1.1471.0 → 1.1784.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/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// The text an agent launch may carry: a model id, an effort and a prompt, refused when empty, over
|
|
2
|
+
// length or carrying a control character, so nothing a value holds can inject a further argument.
|
|
3
|
+
|
|
4
|
+
const FIRST_PRINTABLE_CODE = 0x20
|
|
5
|
+
const DELETE_CODE = 0x7f
|
|
6
|
+
const FIRST_CODE_POINT = 0
|
|
7
|
+
const EMPTY_LENGTH = 0
|
|
8
|
+
const MAX_VALUE_LENGTH = 4096
|
|
9
|
+
const LINE_FEED = '\n'
|
|
10
|
+
const SPACE = ' '
|
|
11
|
+
|
|
12
|
+
function is_control_character(character: string): boolean {
|
|
13
|
+
const code = character.codePointAt(FIRST_CODE_POINT) ?? FIRST_PRINTABLE_CODE
|
|
14
|
+
|
|
15
|
+
return code < FIRST_PRINTABLE_CODE || code === DELETE_CODE
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function is_line_feed(character: string): boolean {
|
|
19
|
+
return character === LINE_FEED
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function is_never_allowed(): boolean {
|
|
23
|
+
return false
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function is_refused(character: string, is_allowed: (character: string) => boolean): boolean {
|
|
27
|
+
return is_control_character(character) && !is_allowed(character)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function is_safe_text(value: string, is_allowed: (character: string) => boolean): boolean {
|
|
31
|
+
if (value.length === EMPTY_LENGTH || value.length > MAX_VALUE_LENGTH) return false
|
|
32
|
+
|
|
33
|
+
for (const character of value) if (is_refused(character, is_allowed)) return false
|
|
34
|
+
|
|
35
|
+
return true
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function is_safe_value(value: string): boolean {
|
|
39
|
+
return is_safe_text(value, is_never_allowed)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// **An agent's prompt is the one value a line break belongs in.** A ship-stop prompt carries the failed
|
|
43
|
+
// output's lines (joshuafolkken/kit#3964); every other control character is refused as in any value.
|
|
44
|
+
function is_safe_prompt(value: string): boolean {
|
|
45
|
+
return is_safe_text(value, is_line_feed)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function printable_character(character: string): string {
|
|
49
|
+
return is_refused(character, is_line_feed) ? SPACE : character
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Command output made fit for a prompt: every control character but a line break becomes a space, so
|
|
53
|
+
// the text passes `is_safe_prompt` whatever the command printed.
|
|
54
|
+
function printable(text: string): string {
|
|
55
|
+
return Array.from(text, printable_character).join('')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const agent_safe_text = { MAX_VALUE_LENGTH, is_safe_prompt, is_safe_value, printable }
|
|
59
|
+
|
|
60
|
+
export { agent_safe_text }
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { agent_exit_record } from './agent-exit-record'
|
|
2
|
+
import type { ClaudeResultEvent } from './claude-result-event'
|
|
3
|
+
|
|
4
|
+
// Whether a Claude session's exit record is an authentication failure — measured on 2026-10-19, when
|
|
5
|
+
// an expired OAuth session ended three lane children with `Failed to authenticate: OAuth session
|
|
6
|
+
// expired and could not be refreshed` and the parent parked each as a child that stopped on its own
|
|
7
|
+
// (joshuafolkken/kit#4216).
|
|
8
|
+
//
|
|
9
|
+
// **Kept apart from `api-outage.ts`**: an outage clears on its own, so its child is re-dispatched; an
|
|
10
|
+
// authentication failure lasts until a person runs `/login`, so every dispatch fails the same way and
|
|
11
|
+
// the run has to stop instead. The read is the same mechanical one — the error flag AND a fixed
|
|
12
|
+
// marker in the harness's own `reason`, never the marker alone.
|
|
13
|
+
|
|
14
|
+
// Matched against `reason`, which carries the record's `result` text — the observed record's
|
|
15
|
+
// `error: 'authentication_failed'` code is not decoded, so it is no marker here.
|
|
16
|
+
const AUTH_MARKERS: ReadonlyArray<string> = ['failed to authenticate']
|
|
17
|
+
|
|
18
|
+
// The fixed sentence a stop caused by an authentication failure carries, so the tooling that reads a
|
|
19
|
+
// stop back (`run-ship-stop-cause.ts`) tells it from a review finding by this text, not by guessing.
|
|
20
|
+
const AUTH_FAILURE_NOTE = 'the session could not authenticate — a person has to run /login'
|
|
21
|
+
|
|
22
|
+
function is_auth_failure(record: ClaudeResultEvent | undefined): boolean {
|
|
23
|
+
if (record === undefined || !record.is_error || record.reason === undefined) return false
|
|
24
|
+
|
|
25
|
+
const lower = record.reason.toLowerCase()
|
|
26
|
+
|
|
27
|
+
return AUTH_MARKERS.some((marker) => lower.includes(marker))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The same read over a whole stream-json transcript, such as a reviewer's log: its last exit record.
|
|
31
|
+
// The log is appended across launches, so it is read only when it ends on an exit record: a later
|
|
32
|
+
// session that died before writing its own leaves an earlier session's record behind it — not read.
|
|
33
|
+
function is_auth_failed_transcript(transcript: string | undefined): boolean {
|
|
34
|
+
if (transcript === undefined || !agent_exit_record.ends_on_exit_record(transcript)) return false
|
|
35
|
+
|
|
36
|
+
return is_auth_failure(agent_exit_record.read_exit_record(transcript))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const api_auth = { AUTH_FAILURE_NOTE, is_auth_failed_transcript, is_auth_failure }
|
|
40
|
+
|
|
41
|
+
export { api_auth }
|
|
@@ -4,7 +4,7 @@ import type { ClaudeResultEvent } from './claude-result-event'
|
|
|
4
4
|
// stopped mid-implementation on its own. Measured twice: on 2026-09-15 four
|
|
5
5
|
// children ended `The socket connection was closed unexpectedly`, and on 2026-09-21 a child spent all
|
|
6
6
|
// ten connection retries on `Unable to connect to API (ConnectionRefused)`. The parent read both as
|
|
7
|
-
// ordinary failures — `in-progress` stripped,
|
|
7
|
+
// ordinary failures — `in-progress` stripped, a park label applied, counted against the
|
|
8
8
|
// consecutive-failure guard — when the child never reached the API at all.
|
|
9
9
|
//
|
|
10
10
|
// **The read is mechanical, never a similarity judgement.** A terminal `result` event that ends in
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
type AgentProfile,
|
|
7
7
|
type AgentRole,
|
|
8
8
|
} from './agent-role-profile'
|
|
9
|
+
import { lane_instructions } from './lane-instructions'
|
|
9
10
|
|
|
10
11
|
const AGENT_COMMAND = 'claude'
|
|
11
12
|
// **The permission mode is passed, not left to the checkout's `.claude/settings.json`.** Claude Code
|
|
@@ -63,6 +64,7 @@ const PROJECT_MCP_FILE = '.mcp.json'
|
|
|
63
64
|
interface ClaudeArgv {
|
|
64
65
|
command: string
|
|
65
66
|
args: ReadonlyArray<string>
|
|
67
|
+
ends_with_prompt: true
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
type ClaudeArgvResult =
|
|
@@ -87,6 +89,14 @@ function tool_flags(cwd: string = process.cwd()): ReadonlyArray<string> {
|
|
|
87
89
|
return [TOOLS_FLAG, LAUNCHED_TOOLS.join(','), ...mcp_flags]
|
|
88
90
|
}
|
|
89
91
|
|
|
92
|
+
// **A lane child and a review session start from the lane instruction set** (`lane-instructions.ts`);
|
|
93
|
+
// the scheduler keeps `CLAUDE.md`, because it is the one that stops and asks a person.
|
|
94
|
+
function instruction_flags(profile: AgentProfile, cwd?: string): ReadonlyArray<string> {
|
|
95
|
+
if (profile.role === agent_role_profile.SCHEDULER) return []
|
|
96
|
+
|
|
97
|
+
return lane_instructions.flags(cwd)
|
|
98
|
+
}
|
|
99
|
+
|
|
90
100
|
function build(
|
|
91
101
|
invocation: string,
|
|
92
102
|
profile: AgentProfile,
|
|
@@ -98,6 +108,7 @@ function build(
|
|
|
98
108
|
args: [
|
|
99
109
|
...AGENT_FLAGS,
|
|
100
110
|
...tool_flags(cwd),
|
|
111
|
+
...instruction_flags(profile, cwd),
|
|
101
112
|
...session_id_flags(session_id),
|
|
102
113
|
MODEL_FLAG,
|
|
103
114
|
profile.model,
|
|
@@ -105,6 +116,7 @@ function build(
|
|
|
105
116
|
profile.effort,
|
|
106
117
|
invocation,
|
|
107
118
|
],
|
|
119
|
+
ends_with_prompt: true,
|
|
108
120
|
}
|
|
109
121
|
}
|
|
110
122
|
|
|
@@ -121,6 +133,7 @@ function build_resume(
|
|
|
121
133
|
args: [
|
|
122
134
|
...AGENT_FLAGS,
|
|
123
135
|
...tool_flags(cwd),
|
|
136
|
+
...instruction_flags(profile, cwd),
|
|
124
137
|
RESUME_FLAG,
|
|
125
138
|
session_id,
|
|
126
139
|
MODEL_FLAG,
|
|
@@ -129,6 +142,7 @@ function build_resume(
|
|
|
129
142
|
profile.effort,
|
|
130
143
|
invocation,
|
|
131
144
|
],
|
|
145
|
+
ends_with_prompt: true,
|
|
132
146
|
}
|
|
133
147
|
}
|
|
134
148
|
|
|
@@ -19,6 +19,7 @@ const LEDGER_DIRECTORY = path.dirname(OBSERVATION_LEDGER_DIRECTORY)
|
|
|
19
19
|
interface CodexArgv {
|
|
20
20
|
command: string
|
|
21
21
|
args: ReadonlyArray<string>
|
|
22
|
+
ends_with_prompt: true
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
function effort_config(profile: AgentProfile): string {
|
|
@@ -91,6 +92,7 @@ function build(invocation: string, profile: AgentProfile, cwd?: string): CodexAr
|
|
|
91
92
|
JSON_FLAG,
|
|
92
93
|
invocation,
|
|
93
94
|
],
|
|
95
|
+
ends_with_prompt: true,
|
|
94
96
|
}
|
|
95
97
|
}
|
|
96
98
|
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { cost_tokens } from '#scripts/cost-runtime/cost-tokens'
|
|
4
|
+
import { document_section } from '#scripts/document/document-section'
|
|
5
|
+
import { distributed_paths } from '#scripts/init/distributed-paths'
|
|
6
|
+
import { find_package_directory } from '#scripts/josh/package-directory'
|
|
7
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
|
+
|
|
9
|
+
interface LaneSet {
|
|
10
|
+
text: string
|
|
11
|
+
rules_path: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// **A headless lane child or review session starts from the lane instruction set, not `CLAUDE.md`.**
|
|
15
|
+
// `CLAUDE.md` carries rules only an interactive session can act on — consultation versus execution,
|
|
16
|
+
// explicit workflow invocation, stop notifications — and every request re-reads it. The lane document
|
|
17
|
+
// names the rules a lane does need by `CLAUDE.md` heading or bold label, and each `include` line is
|
|
18
|
+
// expanded from the launch checkout's own `CLAUDE.md` here, so the rule text keeps one source (#3929).
|
|
19
|
+
const LANE_DOCUMENT = 'prompts/collaboration-workflow/lane-instructions.md'
|
|
20
|
+
const RULES_FILE = 'CLAUDE.md'
|
|
21
|
+
// `AGENTS.md` only points at `CLAUDE.md`, and Claude Code loads it once `CLAUDE.md` is excluded.
|
|
22
|
+
const POINTER_FILE = 'AGENTS.md'
|
|
23
|
+
const INCLUDE_PATTERN = /^<!-- include: CLAUDE\.md → "(?<wanted>.+)" -->$/u
|
|
24
|
+
const PROMPT_FILE_FLAG = '--append-system-prompt-file'
|
|
25
|
+
const SETTINGS_FLAG = '--settings'
|
|
26
|
+
const PROMPT_FILE_PREFIX = 'josh-lane-instructions-'
|
|
27
|
+
const PROMPT_FILE_SUFFIX = '.md'
|
|
28
|
+
const PACKAGE_DIRECTORY = find_package_directory(path.dirname(fileURLToPath(import.meta.url)))
|
|
29
|
+
|
|
30
|
+
// An include that resolves to nothing is `undefined`, never an empty string, so a renamed heading
|
|
31
|
+
// fails the whole composition rather than silently dropping a rule.
|
|
32
|
+
function expand_line(line: string, rules: string): string | undefined {
|
|
33
|
+
const wanted = INCLUDE_PATTERN.exec(line)?.groups?.['wanted']
|
|
34
|
+
|
|
35
|
+
if (wanted === undefined) return line
|
|
36
|
+
|
|
37
|
+
return document_section.section(rules, wanted)?.text
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function compose(lane_markdown: string, rules: string): string | undefined {
|
|
41
|
+
const expanded = lane_markdown.split('\n').map((line) => expand_line(line, rules))
|
|
42
|
+
|
|
43
|
+
if (expanded.includes(undefined)) return undefined
|
|
44
|
+
|
|
45
|
+
return expanded.join('\n')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// **Where the rules are: the checkout's `CLAUDE.md`, else the package copy it imports.** kit and a
|
|
49
|
+
// consumer holding a full copy keep them in `CLAUDE.md`; a consumer written by `josh init` imports
|
|
50
|
+
// them from the package, and its own `CLAUDE.md` — the bootstrap note and the project's additions —
|
|
51
|
+
// stays loaded, because only the file the set was composed from is excluded.
|
|
52
|
+
function rules_sources(cwd: string): ReadonlyArray<string> {
|
|
53
|
+
const imported = distributed_paths.CLAUDE_MD_IMPORT_LINE.replace(/^@/u, '')
|
|
54
|
+
|
|
55
|
+
return [path.join(cwd, RULES_FILE), path.join(cwd, imported)]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function composed_from(lane_markdown: string, rules_path: string): string | undefined {
|
|
59
|
+
const rules = document_section.read_optional(rules_path)
|
|
60
|
+
|
|
61
|
+
return rules === undefined ? undefined : compose(lane_markdown, rules)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function composed_set(cwd: string, package_directory: string): LaneSet | undefined {
|
|
65
|
+
const lane_markdown = document_section.read_optional(path.join(package_directory, LANE_DOCUMENT))
|
|
66
|
+
|
|
67
|
+
if (lane_markdown === undefined) return undefined
|
|
68
|
+
|
|
69
|
+
for (const rules_path of rules_sources(cwd)) {
|
|
70
|
+
const text = composed_from(lane_markdown, rules_path)
|
|
71
|
+
|
|
72
|
+
if (text !== undefined) return { text, rules_path }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function composed_in(
|
|
79
|
+
cwd: string,
|
|
80
|
+
package_directory: string = PACKAGE_DIRECTORY,
|
|
81
|
+
): string | undefined {
|
|
82
|
+
return composed_set(cwd, package_directory)?.text
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Named by its content and this account, so concurrent launches of the same text share one file and a
|
|
86
|
+
// changed `CLAUDE.md` never reuses a stale one. The name is predictable in a temp directory other
|
|
87
|
+
// accounts may write to, so an existing file is reused only when it is this account's own regular file
|
|
88
|
+
// holding exactly this text; anything else is replaced through `stamp_file`, which refuses another
|
|
89
|
+
// account's file and renames a new one into place whole. A file rather than the text itself, because
|
|
90
|
+
// the launcher refuses a line break in any argv element but the prompt.
|
|
91
|
+
function written(text: string): string | undefined {
|
|
92
|
+
const file_path = stamp_file.stamp_path(PROMPT_FILE_PREFIX, text, PROMPT_FILE_SUFFIX)
|
|
93
|
+
|
|
94
|
+
if (stamp_file.read_stamp_text(file_path) === text) return file_path
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
return stamp_file.replace_text_stamp(file_path, text)
|
|
98
|
+
} catch {
|
|
99
|
+
return undefined
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function excluded_settings(rules_path: string, cwd: string): string {
|
|
104
|
+
return JSON.stringify({ claudeMdExcludes: [rules_path, path.join(cwd, POINTER_FILE)] })
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// No flags when the set cannot be composed or safely written: the child then loads `CLAUDE.md` as
|
|
108
|
+
// before, which costs tokens but never loses a rule.
|
|
109
|
+
function flags(cwd: string = process.cwd()): ReadonlyArray<string> {
|
|
110
|
+
const set = composed_set(cwd, PACKAGE_DIRECTORY)
|
|
111
|
+
const prompt_file = set === undefined ? undefined : written(set.text)
|
|
112
|
+
|
|
113
|
+
if (set === undefined || prompt_file === undefined) return []
|
|
114
|
+
|
|
115
|
+
return [PROMPT_FILE_FLAG, prompt_file, SETTINGS_FLAG, excluded_settings(set.rules_path, cwd)]
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function tokens_of(text: string): string {
|
|
119
|
+
return cost_tokens.estimate(text).toLocaleString('en-US')
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// `read:set lane-child`'s resident line: what each lane request carries in place of the rules file.
|
|
123
|
+
function rules_tokens(rules_path: string): string {
|
|
124
|
+
return tokens_of(document_section.read_optional(rules_path) ?? '')
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function resident_line(cwd: string = process.cwd()): string {
|
|
128
|
+
const set = composed_set(cwd, PACKAGE_DIRECTORY)
|
|
129
|
+
const rules = rules_tokens(set?.rules_path ?? path.join(cwd, RULES_FILE))
|
|
130
|
+
const lane_tokens = set === undefined ? 'not composed' : `${tokens_of(set.text)} tok`
|
|
131
|
+
|
|
132
|
+
return ` resident: lane instructions ${lane_tokens} in place of ${RULES_FILE} ${rules} tok`
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const lane_instructions = {
|
|
136
|
+
PROMPT_FILE_FLAG,
|
|
137
|
+
SETTINGS_FLAG,
|
|
138
|
+
compose,
|
|
139
|
+
composed_in,
|
|
140
|
+
flags,
|
|
141
|
+
resident_line,
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export { lane_instructions }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { epic_bundle_gaps } from '#scripts/epic/epic-bundle-gaps'
|
|
4
2
|
import { epic_index, type FetchedEpics } from '#scripts/epic/epic-index'
|
|
5
3
|
import { epic_issue } from '#scripts/epic/epic-issue'
|
|
@@ -10,6 +8,8 @@ import { cutoff_cause, cutoff_of, type ScanCutoff } from '#scripts/git/listing-c
|
|
|
10
8
|
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
11
9
|
import { git_next_issues } from '#scripts/issue/git-next-issues'
|
|
12
10
|
import { AUTO_OK_LABEL } from '#scripts/issue/issue-labels'
|
|
11
|
+
import { issue_not_before } from '#scripts/issue/issue-not-before'
|
|
12
|
+
import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
|
|
13
13
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
14
14
|
|
|
15
15
|
// `josh auto-ok:next` — which issue outside the epic an unattended run picks up next.
|
|
@@ -20,7 +20,6 @@ import { session_cite } from '#scripts/issue/session-cite'
|
|
|
20
20
|
// nothing checks it. The contract is `epic:next`'s: one token on standard output, every explanation
|
|
21
21
|
// on standard error, so `answer=$(pnpm josh auto-ok:next)` reads it.
|
|
22
22
|
|
|
23
|
-
const ARGV_OFFSET = 2
|
|
24
23
|
const SUCCESS_EXIT_CODE = 0
|
|
25
24
|
const FAILURE_EXIT_CODE = 1
|
|
26
25
|
const EXCLUDE_FLAG = '--exclude'
|
|
@@ -210,7 +209,11 @@ async function fetch_opted_in(): Promise<OptedInRead> {
|
|
|
210
209
|
LISTING_LIMIT,
|
|
211
210
|
)
|
|
212
211
|
|
|
213
|
-
|
|
212
|
+
const read = json === undefined ? await classify_failed_read() : parse_listing(json, is_capped)
|
|
213
|
+
|
|
214
|
+
if (read.kind === 'read') await issue_sample_gate.prime(read.issues.map((issue) => issue.body))
|
|
215
|
+
|
|
216
|
+
return read
|
|
214
217
|
}
|
|
215
218
|
|
|
216
219
|
// Whether every issue this one declares as a blocker has closed. `blockedBy` is the same native
|
|
@@ -331,10 +334,15 @@ function is_runnable(
|
|
|
331
334
|
issue: OpenIssueData,
|
|
332
335
|
tracked: ReadonlyMap<number, number>,
|
|
333
336
|
exclude: ReadonlyArray<number>,
|
|
337
|
+
now: number = Date.now(),
|
|
334
338
|
): boolean {
|
|
335
339
|
if (tracked.has(issue.number)) return false
|
|
336
340
|
|
|
337
|
-
return
|
|
341
|
+
return (
|
|
342
|
+
is_unblocked(issue) &&
|
|
343
|
+
!exclude.includes(issue.number) &&
|
|
344
|
+
issue_not_before.is_due(issue.body, now)
|
|
345
|
+
)
|
|
338
346
|
}
|
|
339
347
|
|
|
340
348
|
function pick_next(
|
|
@@ -351,7 +359,7 @@ function pick_next(
|
|
|
351
359
|
function none_reason(count: number): string {
|
|
352
360
|
if (count === 0) return NONE_OPTED_IN_MESSAGE
|
|
353
361
|
|
|
354
|
-
return `All ${String(count)} open \`${AUTO_OK_LABEL}\` issue(s) are excluded — tracked by an opted-in epic, an epic itself, already in progress, parked, blocked by an open issue, or the one just merged.`
|
|
362
|
+
return `All ${String(count)} open \`${AUTO_OK_LABEL}\` issue(s) are excluded — tracked by an opted-in epic, an epic itself, already in progress, parked, blocked by an open issue, not due until its start time, or the one just merged.`
|
|
355
363
|
}
|
|
356
364
|
|
|
357
365
|
// Said only when the cap actually bit, and worded from the answer rather than before it: the one run
|
|
@@ -457,14 +465,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
457
465
|
return await answer(read, options.exclude)
|
|
458
466
|
}
|
|
459
467
|
|
|
460
|
-
// `process.exitCode` rather than `process.exit()`: the answer is written with `console.info`, and on
|
|
461
|
-
// macOS a write to a pipe is asynchronous — `process.exit()` can tear the process down before it has
|
|
462
|
-
// drained, and this command's whole contract is `answer=$(pnpm josh auto-ok:next)`. The same shape
|
|
463
|
-
// is already in `scripts/cost-runtime/cost-cli.ts`, which met the truncation first.
|
|
464
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
465
|
-
process.exitCode = await run(argv)
|
|
466
|
-
}
|
|
467
|
-
|
|
468
468
|
const auto_ok_cli = {
|
|
469
469
|
USAGE,
|
|
470
470
|
NONE_TOKEN,
|
|
@@ -486,7 +486,5 @@ const auto_ok_cli = {
|
|
|
486
486
|
run,
|
|
487
487
|
}
|
|
488
488
|
|
|
489
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
490
|
-
|
|
491
489
|
export { auto_ok_cli }
|
|
492
490
|
export type { NextOptions, OptedInRead, PickupContext, TrackingRead }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
1
2
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
3
|
import { issue_label_schema } from '#scripts/git/git-schemas'
|
|
3
4
|
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
@@ -25,6 +26,8 @@ const row_schema = z.looseObject({
|
|
|
25
26
|
body: z.string().nullish(),
|
|
26
27
|
labels: z.array(issue_label_schema),
|
|
27
28
|
updatedAt: z.string(),
|
|
29
|
+
author_association: z.string().nullish(),
|
|
30
|
+
user: z.looseObject({ login: z.string() }).nullish(),
|
|
28
31
|
})
|
|
29
32
|
|
|
30
33
|
interface JudgeRow extends JudgeIssue {
|
|
@@ -35,13 +38,17 @@ interface JudgeRow extends JudgeIssue {
|
|
|
35
38
|
// An issue's number to the `updatedAt` it was last seen judged at.
|
|
36
39
|
type JudgedCache = Map<number, string>
|
|
37
40
|
|
|
38
|
-
function to_row(raw: z.infer<typeof row_schema>): JudgeRow {
|
|
41
|
+
async function to_row(raw: z.infer<typeof row_schema>): Promise<JudgeRow> {
|
|
39
42
|
return {
|
|
40
43
|
number: raw.number,
|
|
41
44
|
title: raw.title,
|
|
42
45
|
body: raw.body ?? '',
|
|
43
46
|
labels: raw.labels.map((label) => label.name),
|
|
44
47
|
updated_at: raw.updatedAt,
|
|
48
|
+
is_trusted: await gh_author_association.is_trusted({
|
|
49
|
+
login: raw.user?.login,
|
|
50
|
+
association: raw.author_association,
|
|
51
|
+
}),
|
|
45
52
|
}
|
|
46
53
|
}
|
|
47
54
|
|
|
@@ -55,7 +62,9 @@ async function read_candidates(): Promise<ReadonlyArray<JudgeRow> | undefined> {
|
|
|
55
62
|
|
|
56
63
|
if (listing.kind !== 'read') return undefined
|
|
57
64
|
|
|
58
|
-
|
|
65
|
+
const rows = await Promise.all(listing.rows.map(async (raw) => await to_row(raw)))
|
|
66
|
+
|
|
67
|
+
return rows.filter((row) => auto_ok_judge.is_candidate(row))
|
|
59
68
|
}
|
|
60
69
|
|
|
61
70
|
// `true` only for an issue known to owe a judgement: a failed comment read learns nothing, so it is
|
|
@@ -63,7 +72,7 @@ async function read_candidates(): Promise<ReadonlyArray<JudgeRow> | undefined> {
|
|
|
63
72
|
async function owes_judgement(row: JudgeRow, cache: JudgedCache): Promise<boolean> {
|
|
64
73
|
if (cache.get(row.number) === row.updated_at) return false
|
|
65
74
|
|
|
66
|
-
const comments = issue_watch_diff.parse_comments(
|
|
75
|
+
const comments = await issue_watch_diff.parse_comments(
|
|
67
76
|
await git_gh_command.issue_list_comments(String(row.number)),
|
|
68
77
|
)
|
|
69
78
|
|
|
@@ -2,11 +2,8 @@ import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
|
2
2
|
import { issue_label_schema } from '#scripts/git/git-schemas'
|
|
3
3
|
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
4
4
|
import { issue_auto_ok, type AutoOkDecision } from '#scripts/issue/issue-auto-ok'
|
|
5
|
-
import {
|
|
6
|
-
import { AUTO_OK_LABEL } from '#scripts/issue/issue-labels'
|
|
5
|
+
import { AUTO_OK_LABEL, has_label_name } from '#scripts/issue/issue-labels'
|
|
7
6
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
|
-
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
9
|
-
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
10
7
|
import { z } from 'zod'
|
|
11
8
|
import { auto_ok_judge } from './auto-ok-judge'
|
|
12
9
|
|
|
@@ -14,17 +11,30 @@ import { auto_ok_judge } from './auto-ok-judge'
|
|
|
14
11
|
//
|
|
15
12
|
// **An applied judgement still passes the mechanical exclusions** — `issue_auto_ok.exclusion_of` is
|
|
16
13
|
// re-read against the labels as they stand, so a label added since the listing refuses the write
|
|
17
|
-
// rather than racing it. **The
|
|
18
|
-
//
|
|
19
|
-
//
|
|
14
|
+
// rather than racing it. **The judgement comment lands before the labels**: a re-run skips an issue
|
|
15
|
+
// that already carries `auto-ok`, so a comment failing after the labels would never be retried, while
|
|
16
|
+
// a label failing after the comment leaves `auto-ok` off and the issue open to an explicit
|
|
17
|
+
// `--apply <N>` — the refusal names it, since the listing reads the comment as judged. **The
|
|
18
|
+
// run label lands before `auto-ok`**, so the pool never holds an opted-in issue that `backlog:next`
|
|
19
|
+
// would withhold as untriaged. Both answers leave the judgement comment the next listing reads as the
|
|
20
|
+
// record; an applied one writes nothing to the run board, which shows the issue once it is dispatched
|
|
21
|
+
// (joshuafolkken/kit#4133).
|
|
20
22
|
|
|
21
23
|
const SUCCESS_EXIT_CODE = 0
|
|
22
24
|
const FAILURE_EXIT_CODE = 1
|
|
23
25
|
const UNREADABLE = 'the issue could not be read'
|
|
26
|
+
const CLOSED_STATE = 'CLOSED'
|
|
27
|
+
// The judgement comment is already posted, so the listing will not offer the issue again.
|
|
28
|
+
const RETRY_HINT = 're-run `pnpm josh auto-ok:judge --apply <N>` to finish it'
|
|
24
29
|
|
|
25
|
-
const issue_schema = z.object({
|
|
30
|
+
const issue_schema = z.object({
|
|
31
|
+
state: z.string().nullish(),
|
|
32
|
+
labels: z.array(issue_label_schema),
|
|
33
|
+
body: z.string().nullish(),
|
|
34
|
+
})
|
|
26
35
|
|
|
27
36
|
interface IssueRead {
|
|
37
|
+
is_closed: boolean
|
|
28
38
|
labels: ReadonlyArray<string>
|
|
29
39
|
body: string
|
|
30
40
|
}
|
|
@@ -35,7 +45,21 @@ async function read_issue(issue: string): Promise<IssueRead | undefined> {
|
|
|
35
45
|
|
|
36
46
|
if (parsed === undefined) return undefined
|
|
37
47
|
|
|
38
|
-
return {
|
|
48
|
+
return {
|
|
49
|
+
is_closed: parsed.state === CLOSED_STATE,
|
|
50
|
+
labels: parsed.labels.map((label) => label.name),
|
|
51
|
+
body: parsed.body ?? '',
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Why an apply has nothing to write: a closed issue is past the pool, and one already opted in was
|
|
56
|
+
// judged once — writing again would repeat the comment (joshuafolkken/kit#4097).
|
|
57
|
+
function settled_of(read: IssueRead): string | undefined {
|
|
58
|
+
if (read.is_closed) return 'the issue is closed'
|
|
59
|
+
|
|
60
|
+
return has_label_name(read.labels, AUTO_OK_LABEL)
|
|
61
|
+
? `\`${AUTO_OK_LABEL}\` is already applied`
|
|
62
|
+
: undefined
|
|
39
63
|
}
|
|
40
64
|
|
|
41
65
|
async function apply_labels(issue: string, run_label: string): Promise<string | undefined> {
|
|
@@ -74,18 +98,15 @@ async function apply_to(issue: string, run_label: string, read: IssueRead): Prom
|
|
|
74
98
|
|
|
75
99
|
if (exclusion !== undefined) return refused(issue, issue_auto_ok.line_of(exclusion))
|
|
76
100
|
|
|
77
|
-
const problem = await apply_labels(issue, run_label)
|
|
78
|
-
|
|
79
|
-
if (problem !== undefined) return refused(issue, problem)
|
|
80
|
-
|
|
81
101
|
const reason = `judged by backlogrun: no exclusion holds and no person's judgement is needed (${run_label})`
|
|
82
102
|
|
|
83
|
-
await
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
103
|
+
if ((await record(issue, { is_applied: true, reason }, read.body)) !== SUCCESS_EXIT_CODE) {
|
|
104
|
+
return FAILURE_EXIT_CODE
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const problem = await apply_labels(issue, run_label)
|
|
87
108
|
|
|
88
|
-
return
|
|
109
|
+
return problem === undefined ? SUCCESS_EXIT_CODE : refused(issue, `${problem}; ${RETRY_HINT}`)
|
|
89
110
|
}
|
|
90
111
|
|
|
91
112
|
async function apply(issue: string, run_label: string): Promise<number> {
|
|
@@ -93,7 +114,13 @@ async function apply(issue: string, run_label: string): Promise<number> {
|
|
|
93
114
|
|
|
94
115
|
if (read === undefined) return refused(issue, UNREADABLE)
|
|
95
116
|
|
|
96
|
-
|
|
117
|
+
const settled = settled_of(read)
|
|
118
|
+
|
|
119
|
+
if (settled === undefined) return await apply_to(issue, run_label, read)
|
|
120
|
+
|
|
121
|
+
console.info(`${session_cite.issue(issue)}: nothing to apply — ${settled}`)
|
|
122
|
+
|
|
123
|
+
return SUCCESS_EXIT_CODE
|
|
97
124
|
}
|
|
98
125
|
|
|
99
126
|
async function decline(issue: string, reason: string): Promise<number> {
|
|
@@ -14,11 +14,16 @@ import type { WatchComment } from '#scripts/issue/issue-watch-diff'
|
|
|
14
14
|
// **The record is the judgement comment itself.** It carries a digest of the body it judged, so an
|
|
15
15
|
// issue is judged again only when its body changed or a person commented after it — the same line
|
|
16
16
|
// `issue_watch_diff` draws between a person's update and an automated one.
|
|
17
|
+
//
|
|
18
|
+
// **Only an author with write access is read** (`gh_author_association`, joshuafolkken/kit#4021): an
|
|
19
|
+
// issue anyone else filed is never a candidate, and a judgement comment or a later comment from anyone
|
|
20
|
+
// else is not counted, so a third party can neither opt an issue in nor mark one judged.
|
|
17
21
|
|
|
18
22
|
interface JudgeIssue {
|
|
19
23
|
number: number
|
|
20
24
|
labels: ReadonlyArray<string>
|
|
21
25
|
body: string
|
|
26
|
+
is_trusted: boolean
|
|
22
27
|
}
|
|
23
28
|
|
|
24
29
|
const MARKER_PREFIX = '<!-- josh:auto-ok-judged body='
|
|
@@ -29,7 +34,7 @@ const CRLF = '\r\n'
|
|
|
29
34
|
const LF = '\n'
|
|
30
35
|
|
|
31
36
|
function is_candidate(issue: JudgeIssue): boolean {
|
|
32
|
-
if (has_label_name(issue.labels, AUTO_OK_LABEL)) return false
|
|
37
|
+
if (!issue.is_trusted || has_label_name(issue.labels, AUTO_OK_LABEL)) return false
|
|
33
38
|
|
|
34
39
|
return issue_auto_ok.exclusion_of(issue.labels) === undefined
|
|
35
40
|
}
|
|
@@ -42,9 +47,15 @@ function body_digest(body: string): string {
|
|
|
42
47
|
}
|
|
43
48
|
|
|
44
49
|
function digest_of(comment: WatchComment): string | undefined {
|
|
50
|
+
if (!comment.is_trusted) return undefined
|
|
51
|
+
|
|
45
52
|
return MARKER_PATTERN.exec(comment.body)?.groups?.['digest']
|
|
46
53
|
}
|
|
47
54
|
|
|
55
|
+
function is_person_comment(comment: WatchComment): boolean {
|
|
56
|
+
return comment.is_trusted === true && !comment.is_automated
|
|
57
|
+
}
|
|
58
|
+
|
|
48
59
|
// Judged when the newest judgement comment covers the body as it stands and no person has commented
|
|
49
60
|
// since. A failed comment read never reaches here — the caller treats it as nothing learned.
|
|
50
61
|
function is_judged(body: string, comments: ReadonlyArray<WatchComment>): boolean {
|
|
@@ -52,7 +63,7 @@ function is_judged(body: string, comments: ReadonlyArray<WatchComment>): boolean
|
|
|
52
63
|
|
|
53
64
|
if (judgement === undefined || digest_of(judgement) !== body_digest(body)) return false
|
|
54
65
|
|
|
55
|
-
return comments.every((comment) => comment.id <= judgement.id || comment
|
|
66
|
+
return comments.every((comment) => comment.id <= judgement.id || !is_person_comment(comment))
|
|
56
67
|
}
|
|
57
68
|
|
|
58
69
|
function comment_of(decision: AutoOkDecision, body: string): string {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { auto_ok_cli } from './auto-ok-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh auto-ok:next` entry, kept apart from `auto-ok-cli.ts` because other modules import that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
//
|
|
9
|
+
// `process.exitCode` rather than `process.exit()`: the answer is written with `console.info`, and on
|
|
10
|
+
// macOS a write to a pipe is asynchronous — `process.exit()` can tear the process down before it has
|
|
11
|
+
// drained, and this command's whole contract is `answer=$(pnpm josh auto-ok:next)`. The same shape
|
|
12
|
+
// is already in `scripts/cost-runtime/cost-main.ts`, which met the truncation first.
|
|
13
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
14
|
+
const ARGV_OFFSET = 2
|
|
15
|
+
|
|
16
|
+
process.exitCode = await auto_ok_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
17
|
+
}
|