@joshuafolkken/kit 1.1229.0 → 1.1370.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 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +24 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +213 -197
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -201
- package/dist/josh.js +540 -137
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +4 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +313 -0
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +60 -53
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +12 -8
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +35 -0
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +49 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +32 -34
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +33 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +10 -10
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +20 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +44 -30
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +140 -0
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +68 -37
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +10 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +172 -43
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +62 -48
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +13 -21
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -328
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +129 -98
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { status_icons } from '#scripts/lib/status-icons'
|
|
2
2
|
|
|
3
|
-
// A josh command's own overall verdict, and the one place its line is written
|
|
3
|
+
// A josh command's own overall verdict, and the one place its line is written.
|
|
4
4
|
//
|
|
5
|
-
// `status-icons.ts` single-
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// of a step that passed with warnings or skipped (joshuafolkken/kit#1328), and that body is written by
|
|
5
|
+
// `status-icons.ts` single-sources the *character* a failure line opens with, which is not enough for
|
|
6
|
+
// a command that **forwards another tool's output**. `josh gate` prints the body
|
|
7
|
+
// of a step that passed with warnings or skipped, and that body is written by
|
|
9
8
|
// eslint, svelte-check, vitest or cspell — this repository owns none of those formats. One of them
|
|
10
9
|
// opening a line with the failure icon makes a *green* gate read as a failed call, and the re-run that
|
|
11
|
-
// follows it is then charged as rework
|
|
10
|
+
// follows it is then charged as rework, which the rework figure exists to keep honest.
|
|
12
11
|
//
|
|
13
12
|
// **The anchor is the command's own verdict, not the shape of every line it prints.** A command that
|
|
14
13
|
// forwards other tools' output states its own result in one line, and that line outranks the body it
|
|
@@ -17,21 +16,20 @@ import { status_icons } from '#scripts/lib/status-icons'
|
|
|
17
16
|
// each consumer's gate with inherited stdio — so a `passed` verdict speaks for the lines in front of
|
|
18
17
|
// it and the reading resumes after it (`time-reported-failure.ts` → `lines_after_last_pass`).
|
|
19
18
|
//
|
|
20
|
-
// **Why not enumerate every josh failure-line shape.**
|
|
21
|
-
// names as most likely, and rejects for the reason it names: the gate's step line is
|
|
19
|
+
// **Why not enumerate every josh failure-line shape.** The gate's step line is
|
|
22
20
|
// `✗ <label> (pnpm <cmd>) <n>s`, `josh health`'s is ` ✗ <label>` and `josh propagate`'s is
|
|
23
21
|
// ` ✗ <repo> <reason>`, so a pattern list tight enough to exclude a third-party warning is a list of
|
|
24
22
|
// per-command patterns — and the next josh command to print a failure line is silently not counted,
|
|
25
23
|
// which is the detector going quiet without failing. Reading the verdict instead leaves every other
|
|
26
24
|
// josh command exactly as it was: no verdict line, so nothing changes for them.
|
|
27
25
|
//
|
|
28
|
-
// **What it degrades to is
|
|
26
|
+
// **What it degrades to is the bare-icon reading, not silence.** A body the harness truncated past the
|
|
29
27
|
// verdict line falls back to the bare-icon reading, so the figure stays a floor. The gate's verdict is
|
|
30
28
|
// its **last** line, which is what survives the `2>&1 | tail -40` agents actually type
|
|
31
29
|
// (`prompts/collaboration-workflow/output-bounds.md`), so the fallback is the rare case rather than
|
|
32
30
|
// the common one.
|
|
33
31
|
//
|
|
34
|
-
// **The opening line is here for the same reason the verdict is
|
|
32
|
+
// **The opening line is here for the same reason the verdict is**. A verdict
|
|
35
33
|
// says where the gate's output *ended*; nothing said where it began, so a green verdict silenced every
|
|
36
34
|
// failure mark printed before it — including one written by a command that had already finished. The
|
|
37
35
|
// gate's plan line is what says "the gate starts here", and it is single-sourced for the reason the
|
|
@@ -41,8 +39,7 @@ const { FAIL_ICON, PASS_ICON } = status_icons
|
|
|
41
39
|
const GATE_SUBJECT = 'verification gate'
|
|
42
40
|
|
|
43
41
|
// The prefixes are what the detector matches **and** what the printer builds its line from, so a
|
|
44
|
-
// reworded verdict moves both ends at once — the property
|
|
45
|
-
// applied to the line. Splitting them into a printed string and a matched string is exactly the drift
|
|
42
|
+
// reworded verdict moves both ends at once — the property the icon has, applied to the line. Splitting them into a printed string and a matched string is exactly the drift
|
|
46
43
|
// this module exists to prevent.
|
|
47
44
|
const GATE_PASSED_PREFIX = `${PASS_ICON} ${GATE_SUBJECT} passed`
|
|
48
45
|
const GATE_FAILED_PREFIX = `${FAIL_ICON} ${GATE_SUBJECT} failed`
|
package/scripts/josh/josh.ts
CHANGED
|
@@ -24,8 +24,8 @@ function handle_unknown(cmd: string): never {
|
|
|
24
24
|
process.exit(1)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
// `process.exit` truncates a piped stdout at its buffer size, and
|
|
28
|
-
//
|
|
27
|
+
// `process.exit` truncates a piped stdout at its buffer size, and the output at risk is the script's
|
|
28
|
+
// own — `scripts/gate/verification-gate.ts` writes its per-check blocks
|
|
29
29
|
// and its failure summary through this process, and sets `process.exitCode` rather than exiting for
|
|
30
30
|
// exactly that reason. Recording the code and letting node exit when the loop drains keeps every
|
|
31
31
|
// byte, and it leaves the last word with a script that finishes work after module evaluation
|
|
@@ -36,7 +36,7 @@ function record_exit_code(exit_code: number): void {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
// `run_command` answers with a number for a shell command and a promise for a script it runs in
|
|
39
|
-
// this same process
|
|
39
|
+
// this same process; `await` covers both, and the argv slice is taken
|
|
40
40
|
// before it because the in-process branch replaces `process.argv` with the script's own.
|
|
41
41
|
async function main(): Promise<void> {
|
|
42
42
|
const cmd = process.argv[ARGV_OFFSET]
|
package/scripts/josh/kit-only.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { COMMAND_MAP } from './josh-command-map'
|
|
|
2
2
|
import type { CommandEntry } from './josh-command-types'
|
|
3
3
|
|
|
4
4
|
// The commands marked `is_kit_only` in the map only make sense inside the kit repository itself, so a
|
|
5
|
-
// consumer never sees them in `josh --help` and is refused with guidance when it runs one
|
|
6
|
-
//
|
|
5
|
+
// consumer never sees them in `josh --help` and is refused with guidance when it runs one.
|
|
6
|
+
// The flag lives on the entry; everything a reader needs to act on it is
|
|
7
7
|
// here, so the help filter, the dispatch guard and the distributed-doc test read one definition.
|
|
8
8
|
|
|
9
9
|
// Where a consumer is told to go. A script-emitted string, so it stays English (`CLAUDE.md` →
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
2
2
|
|
|
3
|
-
// The shape both path-decided commands share
|
|
3
|
+
// The shape both path-decided commands share.
|
|
4
4
|
//
|
|
5
5
|
// `josh review:level` and `josh review:round2` ask different questions of the same tree, and they answer
|
|
6
6
|
// the same way: read the changed paths, decide from them alone, print the answer on stdout and the reason on
|
|
@@ -29,8 +29,8 @@ interface DecisionCommand<Answer extends string> {
|
|
|
29
29
|
explain: (paths: ReadonlyArray<string>, answer: Answer) => string
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
// The flag contract every mechanically-decided command shares — the two here and `josh review:round2
|
|
33
|
-
//
|
|
32
|
+
// The flag contract every mechanically-decided command shares — the two here and `josh review:round2`.
|
|
33
|
+
// An argument that is not a known flag makes the whole invocation
|
|
34
34
|
// unreadable, and an unreadable invocation is never answered with a default. Shared because the
|
|
35
35
|
// *direction* is the load-bearing part rather than the `some` call: a command that guessed would
|
|
36
36
|
// hand the caller the answer they were reaching for instead of the one their tree supports, and two
|
|
@@ -5,9 +5,9 @@ import { tmpdir } from 'node:os'
|
|
|
5
5
|
// "the temp directory"**: it honors `TMPDIR`, which on macOS names a per-user `/var/folders/…/T`, so
|
|
6
6
|
// two processes with different `TMPDIR` values resolve two different places. A record one josh
|
|
7
7
|
// command writes for another to read then lands where the reader never looks — the transcript a
|
|
8
|
-
// harness wrote under `/tmp` that `os.tmpdir()` could not name
|
|
9
|
-
// record a `backlogrun` handed off that the `run:wake`-launched session began again from nothing
|
|
10
|
-
//
|
|
8
|
+
// harness wrote under `/tmp` that `os.tmpdir()` could not name, and the run
|
|
9
|
+
// record a `backlogrun` handed off that the `run:wake`-launched session began again from nothing.
|
|
10
|
+
// A cross-process handoff has to key on a root neither end's own `TMPDIR`
|
|
11
11
|
// can move, and that is what this pins.
|
|
12
12
|
//
|
|
13
13
|
// **It is decided by platform rather than written as a bare `/tmp`, because a POSIX literal is not
|
|
@@ -42,12 +42,14 @@ function resolve_temporary_root(
|
|
|
42
42
|
return can_write(POSIX_TEMP_ROOT) ? POSIX_TEMP_ROOT : tmpdir()
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
// **An explicit root wins, and the unit suite is who sets one
|
|
45
|
+
// **An explicit root wins, and the unit suite is who sets one**. Every
|
|
46
46
|
// record keyed here is shared by the whole host, so a unit test that drove a writer for real wrote
|
|
47
47
|
// into the live run's records — progress lines for issues the run never touched, relayed to the
|
|
48
48
|
// session watching it. The network guard's `arm` points this at a directory of its own before any
|
|
49
49
|
// worker forks, so every process of one test run shares a root no real run reads, and `disarm`
|
|
50
|
-
// removes it with the rest of the guard.
|
|
50
|
+
// removes it with the rest of the guard. Live evidence of `run:carry` sets it for the same
|
|
51
|
+
// reason: the run's state records are keyed here too, and evidence taken against the default root
|
|
52
|
+
// once ended the record of the run that was actually going.
|
|
51
53
|
const TEMP_ROOT_KEY = 'JOSH_TEMP_ROOT'
|
|
52
54
|
|
|
53
55
|
function temporary_root(override: string | undefined, platform: string): string {
|
|
@@ -6,7 +6,7 @@ import path from 'node:path'
|
|
|
6
6
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
7
7
|
import { PLATFORM_TEMP_ROOT } from './platform-temporary'
|
|
8
8
|
|
|
9
|
-
// Whether the process a record names is still the one that wrote it
|
|
9
|
+
// Whether the process a record names is still the one that wrote it.
|
|
10
10
|
//
|
|
11
11
|
// **A pid is not a process identity, and every record here was treating it as one.** `process.kill(
|
|
12
12
|
// pid, 0)` answers "alive" for whatever holds that number *now*, so a marker left behind by a gate
|
|
@@ -63,8 +63,14 @@ const BEACON_PREFIX = `josh-process-identity-${String(process.getuid?.() ?? '')}
|
|
|
63
63
|
const BEACON_ID_LENGTH = 36
|
|
64
64
|
const BEACON_ID_PATTERN = /^[\da-f-]+$/u
|
|
65
65
|
const WINDOWS_PLATFORM = 'win32'
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
// The probe's three exits. Only a refused connection or a missing socket
|
|
67
|
+
// proves the listener gone; any other error, the probe's own socket timeout, and a probe killed by
|
|
68
|
+
// `PROBE_TIMEOUT_MS` or a signal leave the answer unknown, since a loaded machine produces all three
|
|
69
|
+
// for a holder that is still running.
|
|
70
|
+
const BEACON_LIVE_STATUS = 0
|
|
71
|
+
const BEACON_UNKNOWN_STATUS = 1
|
|
72
|
+
const BEACON_GONE_STATUS = 2
|
|
73
|
+
const SOCKET_PROBE_SOURCE = `const net=require('node:net');const socket=net.createConnection(process.argv[1]);socket.once('connect',()=>process.exit(${String(BEACON_LIVE_STATUS)}));socket.once('error',(error)=>process.exit(['ECONNREFUSED','ENOENT'].includes(error.code)?${String(BEACON_GONE_STATUS)}:${String(BEACON_UNKNOWN_STATUS)}));socket.setTimeout(1000,()=>process.exit(${String(BEACON_UNKNOWN_STATUS)}));`
|
|
68
74
|
const beacons = new Map<string, Server>()
|
|
69
75
|
const exit_cleanup = { is_registered: false }
|
|
70
76
|
|
|
@@ -219,15 +225,26 @@ function beacon_target(token: string): string | undefined {
|
|
|
219
225
|
return is_valid_beacon_name(path.basename(target)) ? target : undefined
|
|
220
226
|
}
|
|
221
227
|
|
|
222
|
-
|
|
228
|
+
// No status is a probe killed by its timeout or a signal — unknown, the same as its own timeout.
|
|
229
|
+
function run_socket_probe(target: string): number | undefined {
|
|
223
230
|
return (
|
|
224
231
|
spawnSync(process.execPath, ['-e', SOCKET_PROBE_SOURCE, target], {
|
|
225
232
|
stdio: 'ignore',
|
|
226
233
|
timeout: PROBE_TIMEOUT_MS,
|
|
227
|
-
}).status
|
|
234
|
+
}).status ?? undefined
|
|
228
235
|
)
|
|
229
236
|
}
|
|
230
237
|
|
|
238
|
+
function is_live_beacon(
|
|
239
|
+
target: string,
|
|
240
|
+
probe: (target: string) => number | undefined = run_socket_probe,
|
|
241
|
+
): boolean | undefined {
|
|
242
|
+
const status = probe(target)
|
|
243
|
+
if (status === BEACON_LIVE_STATUS) return true
|
|
244
|
+
|
|
245
|
+
return status === BEACON_GONE_STATUS ? false : undefined
|
|
246
|
+
}
|
|
247
|
+
|
|
231
248
|
function has_matching_start(
|
|
232
249
|
pid: number,
|
|
233
250
|
recorded_start: string,
|
|
@@ -299,7 +316,7 @@ function is_same_process(
|
|
|
299
316
|
}
|
|
300
317
|
|
|
301
318
|
// **Whether a record is the caller's own, which is a different question from whether its writer is
|
|
302
|
-
// alive
|
|
319
|
+
// alive**. `is_same_process` asks about the recorded process; this asks
|
|
303
320
|
// whether that process *is this one*. A supervisor that has been replaced reads its successor's
|
|
304
321
|
// record as perfectly live, so liveness alone can never tell a hand-over from an ordinary pass — and
|
|
305
322
|
// a writer deciding by liveness overwrites whatever it finds.
|
|
@@ -319,6 +336,7 @@ function is_own_process(pid: number | undefined, recorded_start: string | undefi
|
|
|
319
336
|
|
|
320
337
|
const process_identity = {
|
|
321
338
|
close_beacon,
|
|
339
|
+
is_live_beacon,
|
|
322
340
|
is_live_pid,
|
|
323
341
|
is_own_process,
|
|
324
342
|
is_same_process,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
2
|
|
|
3
|
-
// The pair a record names its writing process by, as `process_identity` reads it back
|
|
4
|
-
//
|
|
3
|
+
// The pair a record names its writing process by, as `process_identity` reads it back:
|
|
4
|
+
// the pid, and the opaque start token `process_identity.own_fields` wrote
|
|
5
5
|
// beside it. Every lock, marker and ledger entry that later asks `is_same_process` carries this pair,
|
|
6
|
-
// so its shape is declared once here and each record extends it
|
|
6
|
+
// so its shape is declared once here and each record extends it.
|
|
7
7
|
//
|
|
8
|
-
// `process_start` is optional because
|
|
8
|
+
// `process_start` is optional because an older record, or one written on a platform
|
|
9
9
|
// whose start time cannot be read, carries only the pid — `is_same_process` has an answer of its own
|
|
10
10
|
// for that case rather than the record being rejected.
|
|
11
11
|
const process_owner_schema = z.object({ pid: z.number(), process_start: z.string().optional() })
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { backlogrun_launch } from '#scripts/backlog/backlogrun-launch'
|
|
4
|
+
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
3
5
|
import { josh_environment_file } from './josh-environment-file'
|
|
4
6
|
import { session_language, type Resolution } from './session-language'
|
|
5
7
|
|
|
6
8
|
// `josh session:lang` — say, on stdout, which language this session writes in, so a
|
|
7
|
-
// `SessionStart` / `UserPromptSubmit` hook injects the resolved value into context every turn
|
|
8
|
-
//
|
|
9
|
+
// `SessionStart` / `UserPromptSubmit` hook injects the resolved value into context every turn.
|
|
10
|
+
// Before this, `JOSH_SESSION_LANG` lived only in `.env` — a personal,
|
|
9
11
|
// non-committed file the harness never loads into the process environment — so the value was
|
|
10
12
|
// invisible unless the agent read the file itself, and a one-word prompt like `diag` had nothing to
|
|
11
13
|
// infer a language from and drifted to the surrounding English.
|
|
@@ -18,32 +20,72 @@ import { session_language, type Resolution } from './session-language'
|
|
|
18
20
|
// The line itself is a script-fixed string, so it stays English by the same rule that pins the
|
|
19
21
|
// Telegram header labels and the `--notify-message` default (`CLAUDE.md` → "Output language").
|
|
20
22
|
|
|
23
|
+
//
|
|
24
|
+
// **The same hook carries the board rule while a `backlogrun` is live.** The rule
|
|
25
|
+
// that a progress question is answered with `run:board --chat` is read only by the session driving a
|
|
26
|
+
// run, so a session asked from the side never met it. The prompt is the one moment every session
|
|
27
|
+
// shares, and the line is gated on the run being live, so a repository with no run pays nothing for
|
|
28
|
+
// it. Live is `backlogrun_launch.is_running`'s answer, not a second reading of the records.
|
|
29
|
+
|
|
21
30
|
const { DEFAULT_SESSION_LANG, ENV_KEY, resolve_session_lang } = session_language
|
|
22
|
-
|
|
31
|
+
|
|
32
|
+
const BOARD_LINE =
|
|
33
|
+
'A backlogrun is live here: answer a progress question with `pnpm josh run:board --chat`, verbatim in one code block.'
|
|
34
|
+
|
|
35
|
+
interface LivePorts {
|
|
36
|
+
// The common git directory the run's records are keyed on; `undefined` outside a repository.
|
|
37
|
+
repository_directory: () => Promise<string | undefined>
|
|
38
|
+
is_running: (git_directory: string) => boolean
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const LIVE_PORTS: LivePorts = {
|
|
42
|
+
repository_directory: run_carry.repository_directory,
|
|
43
|
+
is_running: backlogrun_launch.is_running,
|
|
44
|
+
}
|
|
23
45
|
|
|
24
46
|
// The file load happens in `main`, on the command path only; the resolver reads the environment.
|
|
25
47
|
// The line carries the value alone: what the language covers is `CLAUDE.md` → "Output language",
|
|
26
|
-
// already in context every turn, so repeating it here only spent context on each prompt.
|
|
48
|
+
// already in context every turn, so repeating it here only spent context on each prompt. The default
|
|
49
|
+
// prints nothing — that resident line already names `ja`.
|
|
27
50
|
function format_line(resolution: Resolution): string {
|
|
28
|
-
|
|
29
|
-
? ` (default; set ${ENV_KEY}=${ENGLISH_OPT_IN_LANG} for English)`
|
|
30
|
-
: ''
|
|
51
|
+
if (resolution.is_default) return ''
|
|
31
52
|
|
|
32
|
-
return `Session language (${ENV_KEY}): ${resolution.lang}
|
|
53
|
+
return `Session language (${ENV_KEY}): ${resolution.lang}`
|
|
33
54
|
}
|
|
34
55
|
|
|
35
|
-
|
|
56
|
+
// A throw is answered `false`: a hook that failed here would cost the prompt its language line too.
|
|
57
|
+
async function is_run_live(ports: LivePorts = LIVE_PORTS): Promise<boolean> {
|
|
58
|
+
try {
|
|
59
|
+
const git_directory = await ports.repository_directory()
|
|
60
|
+
|
|
61
|
+
return git_directory !== undefined && ports.is_running(git_directory)
|
|
62
|
+
} catch {
|
|
63
|
+
return false
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function prompt_lines(resolution: Resolution, is_live: boolean): Array<string> {
|
|
68
|
+
return [format_line(resolution), is_live ? BOARD_LINE : ''].filter((line) => line !== '')
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function main(): Promise<void> {
|
|
36
72
|
josh_environment_file.load_environment_file()
|
|
37
|
-
|
|
73
|
+
const lines = prompt_lines(resolve_session_lang(), await is_run_live())
|
|
74
|
+
|
|
75
|
+
for (const line of lines) console.info(line)
|
|
38
76
|
}
|
|
39
77
|
|
|
40
78
|
const session_language_cli = {
|
|
79
|
+
BOARD_LINE,
|
|
41
80
|
DEFAULT_SESSION_LANG,
|
|
42
81
|
ENV_KEY,
|
|
43
82
|
format_line,
|
|
83
|
+
is_run_live,
|
|
84
|
+
prompt_lines,
|
|
44
85
|
resolve_session_lang,
|
|
45
86
|
}
|
|
46
87
|
|
|
47
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
88
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
48
89
|
|
|
90
|
+
export type { LivePorts }
|
|
49
91
|
export { session_language_cli }
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// prints nothing (`build-hooks.ts` → "`splitting: true` is load-bearing").
|
|
6
6
|
//
|
|
7
7
|
// Unset and empty resolve to `ja`, because a worktree without a `.env`, a cloud session and a
|
|
8
|
-
// consumer repository are exactly where the drift recurs
|
|
8
|
+
// consumer repository are exactly where the drift recurs.
|
|
9
9
|
|
|
10
10
|
const ENV_KEY = 'JOSH_SESSION_LANG'
|
|
11
11
|
const DEFAULT_SESSION_LANG = 'ja'
|
|
@@ -6,8 +6,8 @@ import { PLATFORM_TEMP_ROOT } from './platform-temporary'
|
|
|
6
6
|
|
|
7
7
|
// A small record one josh command writes and another reads, kept per checkout in the temp directory.
|
|
8
8
|
//
|
|
9
|
-
// Extracted from `scripts/eval/eval-stamp.ts` when `josh latest:scope` needed the same handoff
|
|
10
|
-
//
|
|
9
|
+
// Extracted from `scripts/eval/eval-stamp.ts` when `josh latest:scope` needed the same handoff.
|
|
10
|
+
// The mechanics below are not boilerplate — the symlink defense on the
|
|
11
11
|
// write, the ownership check on the read, and the deterministic per-checkout path are each load
|
|
12
12
|
// bearing — so a second copy of them is the clone `CLAUDE.md` prohibits. What differs between the
|
|
13
13
|
// two records is their *payload* and the question asked of it, and that is all either module keeps.
|
|
@@ -42,7 +42,7 @@ function digest(content: Buffer | string): string {
|
|
|
42
42
|
// without this two accounts would name one file — and the second one's unlink of a file the first owns
|
|
43
43
|
// fails on the sticky directory, ending its command. Folding the account in keeps accidental
|
|
44
44
|
// collisions apart; a hostile local account can still pre-create a predictable name, which fails the
|
|
45
|
-
// write rather than redirecting it
|
|
45
|
+
// write rather than redirecting it. Windows has no `getuid` and keeps the
|
|
46
46
|
// per-user `os.tmpdir()`, so it contributes an empty account.
|
|
47
47
|
function account_key(): string {
|
|
48
48
|
return String(process.getuid?.() ?? '')
|
|
@@ -56,17 +56,17 @@ function account_key(): string {
|
|
|
56
56
|
// `TMPDIR`.** A record this module keeps is read by a *different* process than wrote it — the second
|
|
57
57
|
// half of a handoff — and `os.tmpdir()` honors each process's own `TMPDIR`, so a session a
|
|
58
58
|
// `run:wake` or a `lane:dispatch` launched resolves a different directory than its launcher and the
|
|
59
|
-
// handoff is lost
|
|
59
|
+
// handoff is lost. The keyed digest below already keeps one checkout apart
|
|
60
60
|
// from another; the root is what has to stop moving per process, which `platform-temporary.ts` pins.
|
|
61
61
|
//
|
|
62
62
|
// **`root` is what the record is keyed to, and the right answer differs per caller.** `PACKAGE_DIR`
|
|
63
63
|
// is the default because `josh eval` measures the kit package's own files. A record about the
|
|
64
64
|
// *project* must key on `PROJECT_ROOT` instead: a globally installed `josh` has one `PACKAGE_DIR`
|
|
65
65
|
// for every project on the machine, so keying on it would let a run in one project answer for
|
|
66
|
-
// another
|
|
66
|
+
// another.
|
|
67
67
|
//
|
|
68
68
|
// **`suffix` is what the file is, not decoration.** Every record here was JSON until `josh gate`
|
|
69
|
-
// needed to keep another tool's output verbatim
|
|
69
|
+
// needed to keep another tool's output verbatim, and a log named `.json`
|
|
70
70
|
// tells every reader — a person, an editor, a `less` — that it is something it is not.
|
|
71
71
|
function stamp_path(
|
|
72
72
|
prefix: string,
|
|
@@ -95,17 +95,46 @@ function write_stamp(target: string, payload: unknown): string {
|
|
|
95
95
|
return write_exclusively(target, JSON.stringify(payload))
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
// The read side of the write's problem. A record is trusted to say something is still current, so a
|
|
99
|
+
// planted one suppresses the work the check exists to force. `lstatSync` reports the link rather than
|
|
100
|
+
// what it points at, and it throws where the path is simply absent — both of which are "no record".
|
|
101
|
+
// `getuid` is missing on Windows, where a shared temp directory is not the same hazard; the check
|
|
102
|
+
// reduces to "is it a regular file" there.
|
|
103
|
+
function is_own_regular_file(source: string): boolean {
|
|
104
|
+
const stats = lstatSync(source)
|
|
105
|
+
|
|
106
|
+
if (!stats.isFile()) return false
|
|
107
|
+
|
|
108
|
+
const uid = process.getuid?.()
|
|
109
|
+
|
|
110
|
+
return uid === undefined || stats.uid === uid
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// A regular file at `target` that another account owns. An absent path or a symlink is not one: the
|
|
114
|
+
// replace below swaps either out without following it.
|
|
115
|
+
function is_foreign_file(target: string): boolean {
|
|
116
|
+
try {
|
|
117
|
+
return lstatSync(target).isFile() && !is_own_regular_file(target)
|
|
118
|
+
} catch {
|
|
119
|
+
return false
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
98
123
|
// Mutable coordination state cannot disappear between an unlink and its replacement: a reader that
|
|
99
124
|
// mistakes that gap for "no child" can start the same generation twice. The temporary file lives
|
|
100
125
|
// beside the target, uses the same exclusive/symlink-safe create, and rename publishes it atomically.
|
|
101
|
-
|
|
126
|
+
// `rename` replaces the path itself rather than following a symlink planted there, so the write still
|
|
127
|
+
// never lands somewhere else; a regular file another account owns is refused before it is replaced,
|
|
128
|
+
// the same answer the unlink gives on a sticky temp directory.
|
|
129
|
+
function replace_text_stamp(target: string, text: string): string {
|
|
130
|
+
if (is_foreign_file(target)) {
|
|
131
|
+
throw new Error(`refusing to replace another account's file: ${target}`)
|
|
132
|
+
}
|
|
133
|
+
|
|
102
134
|
const temporary = `${target}.${String(process.pid)}.${randomUUID()}`
|
|
103
135
|
|
|
104
136
|
try {
|
|
105
|
-
writeFileSync(temporary,
|
|
106
|
-
flag: STAMP_CREATE_FLAG,
|
|
107
|
-
mode: STAMP_FILE_MODE,
|
|
108
|
-
})
|
|
137
|
+
writeFileSync(temporary, text, { flag: STAMP_CREATE_FLAG, mode: STAMP_FILE_MODE })
|
|
109
138
|
renameSync(temporary, target)
|
|
110
139
|
|
|
111
140
|
return target
|
|
@@ -114,8 +143,12 @@ function replace_stamp(target: string, payload: unknown): string {
|
|
|
114
143
|
}
|
|
115
144
|
}
|
|
116
145
|
|
|
146
|
+
function replace_stamp(target: string, payload: unknown): string {
|
|
147
|
+
return replace_text_stamp(target, JSON.stringify(payload))
|
|
148
|
+
}
|
|
149
|
+
|
|
117
150
|
// The same write for a payload that is already text. `josh gate`'s log is another tool's output read
|
|
118
|
-
// by a person or by an agent's `tail
|
|
151
|
+
// by a person or by an agent's `tail`, and JSON-encoding it would put `\n`
|
|
119
152
|
// escapes between the reader and the thing they came to read. **It shares the body above rather than
|
|
120
153
|
// repeating it**: the unlink-then-create-exclusively pair is the symlink defense, and a second copy
|
|
121
154
|
// of it is the clone `CLAUDE.md` prohibits.
|
|
@@ -124,7 +157,7 @@ function write_text_stamp(target: string, text: string): string {
|
|
|
124
157
|
}
|
|
125
158
|
|
|
126
159
|
// `write_stamp` for a record whose *absence* is what the caller checked, and which two processes may
|
|
127
|
-
// therefore try to create at once
|
|
160
|
+
// therefore try to create at once. It does **not** unlink first, so `wx` is
|
|
128
161
|
// doing the job it exists for: the second writer loses and is told so, rather than both being told
|
|
129
162
|
// they won. `false` is that loss and never an error, because "someone else got here first" is an
|
|
130
163
|
// answer; anything else still throws, since a record that could not be written for another reason
|
|
@@ -145,28 +178,13 @@ function create_stamp(target: string, payload: unknown): boolean {
|
|
|
145
178
|
}
|
|
146
179
|
|
|
147
180
|
// The counterpart to `write_stamp`, for a record that means something only while it exists — the
|
|
148
|
-
// in-flight gate marker `josh gate` clears when its checks finish
|
|
181
|
+
// in-flight gate marker `josh gate` clears when its checks finish. `force`
|
|
149
182
|
// makes an absent path a success, because "there is no record" is the state the caller wanted; and
|
|
150
183
|
// `rmSync` removes a symlink rather than following it, the same reason the write unlinks first.
|
|
151
184
|
function remove_stamp(target: string): void {
|
|
152
185
|
rmSync(target, { force: true })
|
|
153
186
|
}
|
|
154
187
|
|
|
155
|
-
// The read side of the write's problem. A record is trusted to say something is still current, so a
|
|
156
|
-
// planted one suppresses the work the check exists to force. `lstatSync` reports the link rather than
|
|
157
|
-
// what it points at, and it throws where the path is simply absent — both of which are "no record".
|
|
158
|
-
// `getuid` is missing on Windows, where a shared temp directory is not the same hazard; the check
|
|
159
|
-
// reduces to "is it a regular file" there.
|
|
160
|
-
function is_own_regular_file(source: string): boolean {
|
|
161
|
-
const stats = lstatSync(source)
|
|
162
|
-
|
|
163
|
-
if (!stats.isFile()) return false
|
|
164
|
-
|
|
165
|
-
const uid = process.getuid?.()
|
|
166
|
-
|
|
167
|
-
return uid === undefined || stats.uid === uid
|
|
168
|
-
}
|
|
169
|
-
|
|
170
188
|
// `undefined` rather than a throw or an empty string: "there is no record" and "the record says
|
|
171
189
|
// nothing has to be done" are two different answers, and only the first of them is a reason to act.
|
|
172
190
|
function read_stamp_text(source: string): string | undefined {
|
|
@@ -185,6 +203,7 @@ const stamp_file = {
|
|
|
185
203
|
is_own_regular_file,
|
|
186
204
|
read_stamp_text,
|
|
187
205
|
replace_stamp,
|
|
206
|
+
replace_text_stamp,
|
|
188
207
|
remove_stamp,
|
|
189
208
|
stamp_path,
|
|
190
209
|
write_stamp,
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// What every aged record `stamp-file.ts` keeps is asked on the read: is it there, can it be read, and
|
|
2
|
+
// has its bound run out.
|
|
3
|
+
//
|
|
4
|
+
// `run-carry.ts`, `run-cut.ts` and `run-hold.ts` each carried the expiry below, and the first two the
|
|
5
|
+
// classification as well. What an unparsable or a future time means is one decision, so it is made
|
|
6
|
+
// here once; what differs between the records is their payload, their timestamp field and their bound,
|
|
7
|
+
// and that is all a `StampRecordSpec` names.
|
|
8
|
+
|
|
9
|
+
interface StampRecordSpec<T> {
|
|
10
|
+
parse: (raw: string) => T | undefined
|
|
11
|
+
timestamp_of: (record: T) => string
|
|
12
|
+
max_age_ms: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type StampRecordRead<T> =
|
|
16
|
+
| { kind: 'none' }
|
|
17
|
+
| { kind: 'carried'; record: T }
|
|
18
|
+
| { kind: 'expired'; record: T }
|
|
19
|
+
| { kind: 'unreadable' }
|
|
20
|
+
|
|
21
|
+
const NONE_READ = { kind: 'none' } as const
|
|
22
|
+
const UNREADABLE_READ = { kind: 'unreadable' } as const
|
|
23
|
+
|
|
24
|
+
// **A time that is not a date is older than any bound, not current.** It passes a schema — it is a
|
|
25
|
+
// string — so reading it as current would leave a record nothing can ever expire, which is the one
|
|
26
|
+
// state a bound exists to make impossible. A time ahead of `now` (a skewed clock) has a negative age
|
|
27
|
+
// and is not older; the bound is exclusive, so a record exactly at it is still current.
|
|
28
|
+
function is_older_than(iso: string, max_age_ms: number, now: Date): boolean {
|
|
29
|
+
const at = Date.parse(iso)
|
|
30
|
+
|
|
31
|
+
if (Number.isNaN(at)) return true
|
|
32
|
+
|
|
33
|
+
return now.getTime() - at > max_age_ms
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// **A record that cannot be read is `unreadable`, never `none`.** Absent is none; present and
|
|
37
|
+
// unparseable is the state a guard must not fall open on.
|
|
38
|
+
function classify<T>(
|
|
39
|
+
raw: string | undefined,
|
|
40
|
+
spec: StampRecordSpec<T>,
|
|
41
|
+
now: Date,
|
|
42
|
+
): StampRecordRead<T> {
|
|
43
|
+
if (raw === undefined) return NONE_READ
|
|
44
|
+
|
|
45
|
+
const record = spec.parse(raw)
|
|
46
|
+
|
|
47
|
+
if (record === undefined) return UNREADABLE_READ
|
|
48
|
+
|
|
49
|
+
const is_expired = is_older_than(spec.timestamp_of(record), spec.max_age_ms, now)
|
|
50
|
+
|
|
51
|
+
return { kind: is_expired ? 'expired' : 'carried', record }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const stamp_record = { classify, is_older_than }
|
|
55
|
+
|
|
56
|
+
export { stamp_record }
|
|
57
|
+
export type { StampRecordRead, StampRecordSpec }
|