@joshuafolkken/kit 1.1240.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 +19 -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 +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- 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/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- 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-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.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-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- 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 +216 -202
- 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 -187
- package/dist/josh.js +281 -94
- 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 +3 -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 +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- 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 +168 -30
- 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 +53 -51
- 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 +7 -7
- 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 +1 -1
- 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 +24 -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 +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- 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 +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- 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 +30 -35
- 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 +25 -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 +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- 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 +6 -7
- 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 +12 -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 +2 -2
- 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 +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -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 +1 -1
- 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-runs.ts +1 -1
- 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 +54 -36
- 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 +9 -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 +171 -46
- 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 +58 -47
- 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 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- 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 +9 -9
- 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 -279
- 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 +26 -26
- 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/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- 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,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { parseArgs } from 'node:util'
|
|
4
3
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
5
4
|
import { git_gh_repo } from '#scripts/gh/git-gh-repo'
|
|
6
5
|
import { github_issue_url, type IssueUrlTarget } from '#scripts/gh/github-issue-url'
|
|
7
6
|
import { git_error } from '#scripts/git/git-error'
|
|
7
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
8
|
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
9
9
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
10
10
|
import { telegram_notify } from './telegram-notify'
|
|
@@ -12,36 +12,44 @@ import { telegram_test_logic, type CliValues, type ResolvedContext } from './tel
|
|
|
12
12
|
|
|
13
13
|
const REPO_NAME_SEPARATOR = '/'
|
|
14
14
|
const ARGV_OFFSET = 2
|
|
15
|
+
const FAILURE_EXIT_CODE = 1
|
|
16
|
+
const USAGE =
|
|
17
|
+
'Usage: josh notify [--task-type <type>] [--body <text> | --body-file <path>] [--issue-url <url>] [--pr-url <url>] [--issue-title <text>] [--repo-name <name>]'
|
|
15
18
|
|
|
16
19
|
// The free-text values a caller writes, often opening with a Markdown `-` bullet.
|
|
17
20
|
const FREE_TEXT_FLAGS = ['--body', '--issue-title']
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
const OPTIONS = {
|
|
23
|
+
'task-type': { type: 'string' },
|
|
24
|
+
'repo-name': { type: 'string' },
|
|
25
|
+
'issue-title': { type: 'string' },
|
|
26
|
+
body: { type: 'string' },
|
|
27
|
+
'body-file': { type: 'string' },
|
|
28
|
+
'issue-url': { type: 'string' },
|
|
29
|
+
'pr-url': { type: 'string' },
|
|
30
|
+
} as const
|
|
31
|
+
|
|
32
|
+
// `undefined` for a line nobody can read — an unknown flag, or a flag given no value.
|
|
33
|
+
function parse_cli_arguments(): CliValues | undefined {
|
|
34
|
+
return cli_flags.values_of(
|
|
35
|
+
cli_flags.attach_values(process.argv.slice(ARGV_OFFSET), FREE_TEXT_FLAGS),
|
|
36
|
+
OPTIONS,
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// A refused line sends nothing: the notification a misspelled flag would have produced is not the one
|
|
41
|
+
// the caller wrote, and the non-zero exit is what tells a workflow it never went out.
|
|
42
|
+
function refuse_usage(): void {
|
|
43
|
+
console.error(USAGE)
|
|
44
|
+
process.exitCode = FAILURE_EXIT_CODE
|
|
34
45
|
}
|
|
35
46
|
|
|
36
47
|
// The repository this notification is about, for the Telegram header.
|
|
37
48
|
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
// The same fact is already read over REST by `git_gh_repo`, whose failure contract is the
|
|
44
|
-
// `undefined` this caller was already handling, so it is read from there rather than from a second
|
|
49
|
+
// Not `gh repo view`: it goes through GraphQL and is answered 403 in a cloud session, which would
|
|
50
|
+
// lose the header's repository name there. The same fact is already read over REST by
|
|
51
|
+
// `git_gh_repo`, whose failure contract is the `undefined` this caller handles, so it is read from
|
|
52
|
+
// there rather than from a second
|
|
45
53
|
// spawn (`CLAUDE.md` → "No clones").
|
|
46
54
|
async function fetch_repo_name(): Promise<string | undefined> {
|
|
47
55
|
const name_with_owner = await git_gh_repo.repo_get_name_with_owner()
|
|
@@ -53,8 +61,7 @@ async function fetch_repo_name(): Promise<string | undefined> {
|
|
|
53
61
|
|
|
54
62
|
// The title is read from the repository the URL names, through the same reader every other
|
|
55
63
|
// cross-repository read goes through. Read unqualified, `gh` would answer with the issue of that
|
|
56
|
-
// number in the working directory's repository — a different issue with a different title
|
|
57
|
-
// (joshuafolkken/kit#903).
|
|
64
|
+
// number in the working directory's repository — a different issue with a different title.
|
|
58
65
|
//
|
|
59
66
|
// A repository the token cannot read answers the same `undefined` as an issue that does not exist,
|
|
60
67
|
// and the notification would then go out with no title line at all. Say so, so the gap is visible
|
|
@@ -65,7 +72,9 @@ async function fetch_issue_title(target: IssueUrlTarget | undefined): Promise<st
|
|
|
65
72
|
const title = await git_gh_issue_read.issue_get_title(target.issue_number, target.name_with_owner)
|
|
66
73
|
|
|
67
74
|
if (title === undefined) {
|
|
68
|
-
console.warn(
|
|
75
|
+
console.warn(
|
|
76
|
+
`⚠️ Could not read ${session_cite.issue(target.issue_number, undefined, target.name_with_owner)}.`,
|
|
77
|
+
)
|
|
69
78
|
}
|
|
70
79
|
|
|
71
80
|
return title
|
|
@@ -90,9 +99,8 @@ async function resolve_issue_title(
|
|
|
90
99
|
//
|
|
91
100
|
// `--issue-url` outranks `--pr-url` because it identifies the issue the title is read from as well
|
|
92
101
|
// as the repository. A pull URL answers the repository half only, which is why it is read for
|
|
93
|
-
// `repo_name` and not passed to `resolve_issue_title` — a completion notification carrying
|
|
94
|
-
// PR link
|
|
95
|
-
// (joshuafolkken/kit#994).
|
|
102
|
+
// `repo_name` and not passed to `resolve_issue_title` — otherwise a completion notification carrying
|
|
103
|
+
// only a PR link goes out under the working directory's repository while its link points elsewhere.
|
|
96
104
|
async function resolve_context(values: CliValues): Promise<ResolvedContext> {
|
|
97
105
|
const target = github_issue_url.parse(values['issue-url'])
|
|
98
106
|
const pull_target = github_issue_url.parse_pull(values['pr-url'])
|
|
@@ -105,13 +113,20 @@ async function resolve_context(values: CliValues): Promise<ResolvedContext> {
|
|
|
105
113
|
async function main(): Promise<void> {
|
|
106
114
|
josh_environment_file.load_environment_file()
|
|
107
115
|
const values = parse_cli_arguments()
|
|
116
|
+
|
|
117
|
+
if (values === undefined) {
|
|
118
|
+
refuse_usage()
|
|
119
|
+
|
|
120
|
+
return
|
|
121
|
+
}
|
|
122
|
+
|
|
108
123
|
const context = await resolve_context(values)
|
|
109
124
|
const input = telegram_test_logic.build_input({ values, context })
|
|
110
125
|
|
|
111
126
|
await telegram_notify.send(input)
|
|
112
127
|
}
|
|
113
128
|
|
|
114
|
-
// **A notification nobody received must not read as success
|
|
129
|
+
// **A notification nobody received must not read as success**. This command
|
|
115
130
|
// *is* the notification, so a failed send is its result and the exit code has to say so — the state
|
|
116
131
|
// that Issue measured was three lost messages, each printing a warning and exiting 0.
|
|
117
132
|
//
|
|
@@ -7,10 +7,10 @@ import { observation_ledger_migrate } from './observation-ledger-migrate'
|
|
|
7
7
|
|
|
8
8
|
// Where the observation ledger is read and written, whichever work tree a command runs in.
|
|
9
9
|
//
|
|
10
|
-
// **The ledger lives in the work tree the command runs in — a lane's in a lane
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
10
|
+
// **The ledger lives in the work tree the command runs in — a lane's in a lane**.
|
|
11
|
+
// Resolved to the primary checkout from every lane, a lane's lines would wait there for a batch-end
|
|
12
|
+
// flush; another run's stash of that checkout would take them, the flush would read `git status` and
|
|
13
|
+
// find nothing, and the lines would be lost. Each run appends to its own
|
|
14
14
|
// issue's file in its own tree, `git-staging.ts` commits it with the run, and `pnpm josh followup`
|
|
15
15
|
// commits whatever was appended after that commit before it merges — so a lane's lines reach the
|
|
16
16
|
// default branch with the lane's own pull request, and the primary checkout holds none of them.
|
|
@@ -21,8 +21,7 @@ function ledger_root(cwd: string = process.cwd()): string {
|
|
|
21
21
|
return cwd
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
// **Resolving the directory migrates the single-file ledgers first
|
|
25
|
-
// joshuafolkken/kit#2919). Every reader and writer asks here — `review:record --check`,
|
|
24
|
+
// **Resolving the directory migrates the single-file ledgers first**. Every reader and writer asks here — `review:record --check`,
|
|
26
25
|
// `review:findings`, the retrospective, the stash carry's duplicate check — so none of them can read a
|
|
27
26
|
// directory without the lines that still sit at an old path, which for the review-record check would
|
|
28
27
|
// answer `missing` for a round recorded before the move.
|
|
@@ -52,6 +51,12 @@ async function current_branch(cwd: string): Promise<string> {
|
|
|
52
51
|
}
|
|
53
52
|
}
|
|
54
53
|
|
|
54
|
+
// The `<YYYY-MM-DD>` a ledger line carries, and the name of a date file — one spelling for every
|
|
55
|
+
// writer, so a line and the file it lands in never disagree about the day.
|
|
56
|
+
function ledger_date(now: Date): string {
|
|
57
|
+
return now.toISOString().slice(0, DATE_END)
|
|
58
|
+
}
|
|
59
|
+
|
|
55
60
|
// **The file a writer that names no issue appends to** — the issue the checked-out branch leads with
|
|
56
61
|
// (`2919-lane`, `2919-store-the-ledger`), so a lane's lines land in its own issue's file; or the date,
|
|
57
62
|
// for a line written on the default branch outside any issue's run, which `pnpm josh
|
|
@@ -59,7 +64,7 @@ async function current_branch(cwd: string): Promise<string> {
|
|
|
59
64
|
async function writer_path(now: Date, cwd: string = process.cwd()): Promise<string> {
|
|
60
65
|
const issue = git_branch.issue_from_branch(await current_branch(cwd))
|
|
61
66
|
|
|
62
|
-
return file_path(issue ?? now
|
|
67
|
+
return file_path(issue ?? ledger_date(now), cwd)
|
|
63
68
|
}
|
|
64
69
|
|
|
65
70
|
// A file whose last line has no newline would otherwise run into the next file's first line.
|
|
@@ -104,7 +109,7 @@ async function read(cwd: string = process.cwd()): Promise<string | undefined> {
|
|
|
104
109
|
|
|
105
110
|
// The one append every ledger writer goes through. A consumer that does not keep the ledger has no
|
|
106
111
|
// `docs/` at its root, so the parent is created first — the one write path that can bring the ledger
|
|
107
|
-
// into existence there
|
|
112
|
+
// into existence there.
|
|
108
113
|
async function append(target: string, lines: ReadonlyArray<string>): Promise<void> {
|
|
109
114
|
if (lines.length === 0) return
|
|
110
115
|
|
|
@@ -115,6 +120,7 @@ async function append(target: string, lines: ReadonlyArray<string>): Promise<voi
|
|
|
115
120
|
const observation_ledger_home = {
|
|
116
121
|
append,
|
|
117
122
|
issue_path,
|
|
123
|
+
ledger_date,
|
|
118
124
|
ledger_root,
|
|
119
125
|
read,
|
|
120
126
|
writer_path,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// The observation ledger's line grammar (`.claude/skills/workflow-commands/observation-ledger.md`)
|
|
2
2
|
// is fixed — `- k:<slug> | d<n> | <YYYY-MM-DD> | <where> | <what>` — but the path was collected in
|
|
3
3
|
// `observation-ledger.ts` without a line ever being parsed, so a malformed append rode a flush
|
|
4
|
-
// through unremarked. This validates a ledger entry line and reports why a broken one is broken
|
|
5
|
-
//
|
|
4
|
+
// through unremarked. This validates a ledger entry line and reports why a broken one is broken.
|
|
5
|
+
// The grammar is the single source's, pinned by the document test.
|
|
6
6
|
|
|
7
7
|
const KEY_PREFIX = '- k:'
|
|
8
8
|
const FIELD_SEPARATOR = ' | '
|
|
@@ -96,6 +96,7 @@ function missing_lines(candidates: ReadonlyArray<string>, ledger: string): Array
|
|
|
96
96
|
const observation_ledger_line = {
|
|
97
97
|
broken_ledger_lines,
|
|
98
98
|
is_ledger_entry_line,
|
|
99
|
+
line_reason,
|
|
99
100
|
missing_lines,
|
|
100
101
|
}
|
|
101
102
|
|
|
@@ -19,9 +19,8 @@ import {
|
|
|
19
19
|
} from './observation-ledger'
|
|
20
20
|
import { observation_ledger_line } from './observation-ledger-line'
|
|
21
21
|
|
|
22
|
-
// Moves the ledger's lines from
|
|
23
|
-
//
|
|
24
|
-
// recognized). Changing a constant alone splits the appends: a run still on the old code recreates the
|
|
22
|
+
// Moves the ledger's lines from its old single files into the directory, as `legacy.md`
|
|
23
|
+
// (`observation-ledger.ts` carries why the old paths are still recognized). Changing a constant alone splits the appends: a run still on the old code recreates the
|
|
25
24
|
// old file, and a consumer repository's existing ledger stays where nothing reads it. So resolving the
|
|
26
25
|
// ledger migrates first (`observation-ledger-home.ts`), and whatever reached an old path lands in the
|
|
27
26
|
// directory before anything reads or appends.
|
|
@@ -164,7 +163,7 @@ function legacy_directory_names(directory: string): ReadonlyArray<string> {
|
|
|
164
163
|
}
|
|
165
164
|
}
|
|
166
165
|
|
|
167
|
-
// **The old directory moves file by file into the same names
|
|
166
|
+
// **The old directory moves file by file into the same names**, so an
|
|
168
167
|
// issue's lines stay in that issue's file; the emptied directory is removed when nothing else is left.
|
|
169
168
|
function migrate_directory(root: string): boolean {
|
|
170
169
|
const legacy_directory = path.join(root, LEGACY_OBSERVATION_LEDGER_DIRECTORY)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { observation_ledger_home } from './observation-ledger-home'
|
|
2
2
|
import { observation_ledger_line, type BrokenLine } from './observation-ledger-line'
|
|
3
3
|
|
|
4
|
-
// **What has to hold before a ledger line is committed, asked by every path that commits one
|
|
5
|
-
//
|
|
4
|
+
// **What has to hold before a ledger line is committed, asked by every path that commits one**:
|
|
5
|
+
// `pnpm josh observations:flush`, the run's own commit in
|
|
6
6
|
// `scripts/git/git-staging.ts` and `pnpm josh followup`'s pre-merge ledger commit. Lines still on an
|
|
7
|
-
// old path are moved first
|
|
7
|
+
// old path are moved first, so the commit carries the
|
|
8
8
|
// move and the lines together, and every entry line is then parsed against the grammar
|
|
9
|
-
//
|
|
9
|
+
// — each caller decides what a broken line costs it.
|
|
10
10
|
//
|
|
11
11
|
// **A ledger that is not there has no line to break** — the change a status saw is then its deletion,
|
|
12
12
|
// and a commit carries that like any other change to it.
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
// The observation ledger's one location, named here rather than inside any of the places that act on
|
|
2
|
-
// it
|
|
3
|
-
// holds
|
|
2
|
+
// it. `git-staging.ts` stages it with the run's own commit when its grammar
|
|
3
|
+
// holds, `hook-gate-reuse.ts` excludes it from what a hook calls a carried
|
|
4
4
|
// tree, and `observations-flush.ts` commits what no run carried — so a literal in each would be three
|
|
5
5
|
// answers to one question, and a rename reaching only some of them would silently split them.
|
|
6
6
|
//
|
|
7
|
-
// **It sits outside `docs
|
|
8
|
-
// documents a person reads, and at about forty new files a day they
|
|
7
|
+
// **It sits outside `docs/`**: its files are machine-written data lines, not
|
|
8
|
+
// documents a person reads, and at about forty new files a day they would be most of `docs/`.
|
|
9
9
|
//
|
|
10
|
-
// **It is a directory of one file per issue, not one file
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
10
|
+
// **It is a directory of one file per issue, not one file**. One file every run appends to makes two
|
|
11
|
+
// lanes' pull requests conflict at its tail, and parking the lines in the primary checkout for a
|
|
12
|
+
// batch-end flush lets another run's stash take them before the flush sees them. A run appends to
|
|
13
|
+
// `<issue>.md` in its own work tree and merges it with its own pull request: parallel lanes write
|
|
14
|
+
// different files, so nothing conflicts and nothing waits.
|
|
15
15
|
const OBSERVATION_LEDGER_DIRECTORY = '.josh/observations'
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// The directory's previous location, a migration source for the same reasons as
|
|
18
18
|
// the single-file ledgers below: each `<name>.md` in it moves to the same name in the directory.
|
|
19
19
|
const LEGACY_OBSERVATION_LEDGER_DIRECTORY = 'docs/maintainers/observations'
|
|
20
20
|
|
|
@@ -29,10 +29,9 @@ const LEDGER_FILE_EXTENSION = '.md'
|
|
|
29
29
|
// lost to the split.
|
|
30
30
|
const LEGACY_LEDGER_FILE = `legacy${LEDGER_FILE_EXTENSION}`
|
|
31
31
|
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
// existing ledger all write there, and `observation-ledger-migrate.ts` moves what it finds into the
|
|
32
|
+
// The single-file ledger paths, `docs/observations.md` and `docs/maintainers/observations.md`, kept
|
|
33
|
+
// as migration sources rather than forgotten: a run still on the old code, a stash cut before the
|
|
34
|
+
// move and a consumer repository's existing ledger all write there, and `observation-ledger-migrate.ts` moves what it finds into the
|
|
36
35
|
// directory. Every place that recognizes the ledger recognizes them, so a line on either path is never
|
|
37
36
|
// staged into an ordinary commit. Remove them once every repository holding a ledger has migrated.
|
|
38
37
|
const LEGACY_OBSERVATION_LEDGER_PATHS: ReadonlyArray<string> = [
|
|
@@ -105,7 +104,7 @@ function ledger_paths(status_output: string): ReadonlyArray<string> {
|
|
|
105
104
|
|
|
106
105
|
// **The one place that answers "does this working tree hold a pending observation append?"**
|
|
107
106
|
// `observations-flush.ts`'s `has_ledger_change` and `pnpm josh followup`'s pre-merge ledger commit
|
|
108
|
-
// both ask it
|
|
107
|
+
// both ask it, so a literal in each would be the clone the header above
|
|
109
108
|
// warns against. A blank porcelain line carries no ledger path, so `is_ledger_line` answers false for
|
|
110
109
|
// it and no filtering is needed.
|
|
111
110
|
function has_pending_append(status_output: string): boolean {
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
4
|
+
import { observation_ledger_home } from './observation-ledger-home'
|
|
5
|
+
import {
|
|
6
|
+
observation_record,
|
|
7
|
+
REFUSED_VERDICT,
|
|
8
|
+
type ObservationEntry,
|
|
9
|
+
type RecordResult,
|
|
10
|
+
} from './observation-record'
|
|
11
|
+
|
|
12
|
+
// `josh observation:record <key> <depth> <where> <what>` — count the key's earlier sightings, append
|
|
13
|
+
// this one, and answer what the run does next. Exactly one token on stdout:
|
|
14
|
+
// `file` on the second sighting, which the promotion rule files; `ledger` on any other, which the line
|
|
15
|
+
// alone records. The earlier sightings and the file written go to stderr, so the Issue a `file` answer
|
|
16
|
+
// opens can quote the first sighting's date from them.
|
|
17
|
+
|
|
18
|
+
const ARGV_OFFSET = 2
|
|
19
|
+
const FAILURE_EXIT_CODE = 1
|
|
20
|
+
const ENTRY_FIELDS = 4
|
|
21
|
+
const USAGE = 'Usage: josh observation:record <key> <depth> <where> <what> [--checkout <path>]'
|
|
22
|
+
const OPTIONS = { checkout: { type: 'string' } } as const
|
|
23
|
+
|
|
24
|
+
interface RecordArguments {
|
|
25
|
+
entry: ObservationEntry
|
|
26
|
+
checkout: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function entry_of(fields: ReadonlyArray<string>): ObservationEntry {
|
|
30
|
+
const [slug = '', depth = '', where = '', what = ''] = fields
|
|
31
|
+
|
|
32
|
+
return { slug, depth, where, what }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function parse_arguments(argv: ReadonlyArray<string>): RecordArguments | undefined {
|
|
36
|
+
const parsed = cli_flags.arguments_of(argv, OPTIONS)
|
|
37
|
+
|
|
38
|
+
if (parsed?.positionals.length !== ENTRY_FIELDS) return undefined
|
|
39
|
+
|
|
40
|
+
const { checkout } = parsed.values
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
entry: entry_of(parsed.positionals),
|
|
44
|
+
checkout: checkout ?? observation_ledger_home.ledger_root(),
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function report(result: RecordResult): number {
|
|
49
|
+
if (result.verdict === REFUSED_VERDICT) {
|
|
50
|
+
console.error(`Refused: ${result.reason}\n${USAGE}`)
|
|
51
|
+
|
|
52
|
+
return FAILURE_EXIT_CODE
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const sighting = `${String(result.earlier.length)} earlier sighting(s); appended to ${result.target}`
|
|
56
|
+
|
|
57
|
+
console.error([sighting, ...result.earlier].join('\n'))
|
|
58
|
+
console.info(result.verdict)
|
|
59
|
+
|
|
60
|
+
return 0
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function run(argv: ReadonlyArray<string>, now: Date): Promise<number> {
|
|
64
|
+
const parsed = parse_arguments(argv)
|
|
65
|
+
|
|
66
|
+
if (parsed === undefined) {
|
|
67
|
+
console.error(USAGE)
|
|
68
|
+
|
|
69
|
+
return FAILURE_EXIT_CODE
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return report(await observation_record.record({ ...parsed, now }))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
76
|
+
process.exitCode = await run(argv, new Date())
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const observation_record_cli = { USAGE, run }
|
|
80
|
+
|
|
81
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
82
|
+
|
|
83
|
+
export { observation_record_cli }
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { observation_ledger_home } from './observation-ledger-home'
|
|
2
|
+
import { observation_ledger_line } from './observation-ledger-line'
|
|
3
|
+
|
|
4
|
+
// The count, the append and the promotion verdict of one observation-ledger sighting, as one command.
|
|
5
|
+
// They were a `cat | grep -c … || true` a run typed by hand, an append it
|
|
6
|
+
// wrote itself, and a "does the count answer exactly 1" it judged — three steps whose answers are
|
|
7
|
+
// fixed, now read off the ledger rather than re-derived in every run. The grammar and the promotion
|
|
8
|
+
// rule are `.claude/skills/workflow-commands/observation-ledger.md`'s.
|
|
9
|
+
|
|
10
|
+
const FILE_VERDICT = 'file'
|
|
11
|
+
const LEDGER_VERDICT = 'ledger'
|
|
12
|
+
const REFUSED_VERDICT = 'refused'
|
|
13
|
+
// The sample line in `observation-ledger.md` carries it, so a real sighting under it would be counted
|
|
14
|
+
// against the sample.
|
|
15
|
+
const RESERVED_SLUG = 'example'
|
|
16
|
+
const RESERVED_REASON = '`k:example` is reserved for the sample in observation-ledger.md'
|
|
17
|
+
// The one earlier sighting that makes this one the second — a higher count means the sighting that
|
|
18
|
+
// answered `1` already filed the Issue.
|
|
19
|
+
const PROMOTING_COUNT = 1
|
|
20
|
+
|
|
21
|
+
interface ObservationEntry {
|
|
22
|
+
slug: string
|
|
23
|
+
depth: string
|
|
24
|
+
where: string
|
|
25
|
+
what: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface RecordRequest {
|
|
29
|
+
entry: ObservationEntry
|
|
30
|
+
checkout: string
|
|
31
|
+
now: Date
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type RecordResult =
|
|
35
|
+
| { verdict: typeof REFUSED_VERDICT; reason: string }
|
|
36
|
+
| {
|
|
37
|
+
verdict: typeof FILE_VERDICT | typeof LEDGER_VERDICT
|
|
38
|
+
earlier: ReadonlyArray<string>
|
|
39
|
+
line: string
|
|
40
|
+
target: string
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function entry_line(entry: ObservationEntry, date: string): string {
|
|
44
|
+
return `- k:${entry.slug} | ${entry.depth} | ${date} | ${entry.where} | ${entry.what}`
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function refusal_of(entry: ObservationEntry, line: string): string | undefined {
|
|
48
|
+
if (entry.slug === RESERVED_SLUG) return RESERVED_REASON
|
|
49
|
+
|
|
50
|
+
return observation_ledger_line.line_reason(line)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Every ledger line already carrying the key, across every file — a recurrence is a recurrence
|
|
54
|
+
// whichever issue's file each sighting sits in. No ledger at all is a first sighting.
|
|
55
|
+
function sightings(ledger: string | undefined, slug: string): ReadonlyArray<string> {
|
|
56
|
+
const prefix = `- k:${slug} |`
|
|
57
|
+
|
|
58
|
+
return (ledger ?? '').split('\n').filter((line) => line.startsWith(prefix))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The count is read before the append, so it is the sightings *before* this one.
|
|
62
|
+
async function record(request: RecordRequest): Promise<RecordResult> {
|
|
63
|
+
const date = observation_ledger_home.ledger_date(request.now)
|
|
64
|
+
const line = entry_line(request.entry, date)
|
|
65
|
+
const reason = refusal_of(request.entry, line)
|
|
66
|
+
|
|
67
|
+
if (reason !== undefined) return { verdict: REFUSED_VERDICT, reason }
|
|
68
|
+
|
|
69
|
+
const earlier = sightings(
|
|
70
|
+
await observation_ledger_home.read(request.checkout),
|
|
71
|
+
request.entry.slug,
|
|
72
|
+
)
|
|
73
|
+
const target = await observation_ledger_home.writer_path(request.now, request.checkout)
|
|
74
|
+
|
|
75
|
+
await observation_ledger_home.append(target, [line])
|
|
76
|
+
|
|
77
|
+
const verdict = earlier.length === PROMOTING_COUNT ? FILE_VERDICT : LEDGER_VERDICT
|
|
78
|
+
|
|
79
|
+
return { verdict, earlier, line, target }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const observation_record = { record }
|
|
83
|
+
|
|
84
|
+
export {
|
|
85
|
+
FILE_VERDICT,
|
|
86
|
+
LEDGER_VERDICT,
|
|
87
|
+
observation_record,
|
|
88
|
+
REFUSED_VERDICT,
|
|
89
|
+
type ObservationEntry,
|
|
90
|
+
type RecordResult,
|
|
91
|
+
}
|
|
@@ -9,7 +9,7 @@ const FAILURE_EXIT_CODE = 1
|
|
|
9
9
|
// as a stack: "this checkout is on a feature branch" and "the tree holds somebody else's work" are
|
|
10
10
|
// both things the person fixes in one step, and a trace hides the sentence that says which.
|
|
11
11
|
//
|
|
12
|
-
// **It acts on the checkout it runs in
|
|
12
|
+
// **It acts on the checkout it runs in**. A lane's ledger lines merge with
|
|
13
13
|
// the lane's own pull request, so a lane has nothing to flush and is refused like any feature branch.
|
|
14
14
|
async function main(): Promise<void> {
|
|
15
15
|
try {
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import type { OpenPull } from '#scripts/gh/git-gh-pr-auto-merge'
|
|
3
3
|
import { git_pr_checks } from '#scripts/gh/git-pr-checks'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
5
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
6
|
|
|
6
|
-
// **A flush pull request lands whether or not the flush that opened it is still alive
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
7
|
+
// **A flush pull request lands whether or not the flush that opened it is still alive**.
|
|
8
|
+
// A merge only inside the flush's own wait would let a session cut or a killed process leave a green
|
|
9
|
+
// pull request open with nobody to merge it — and once a later flush appended to the same ledger
|
|
10
|
+
// tail, it would conflict and could not land at all. Auto-merge moves
|
|
10
11
|
// the merge to GitHub, and the wait that remains is only for fast-forwarding the local default
|
|
11
12
|
// branch.
|
|
12
13
|
|
|
@@ -18,7 +19,7 @@ const MERGE_FAILED_REASON =
|
|
|
18
19
|
'a required check failed or the branch conflicts, so auto-merge will not land the pull request'
|
|
19
20
|
|
|
20
21
|
// **Best-effort, and the answer says which wait to use.** GraphQL — the only way to enable auto-merge
|
|
21
|
-
// — can be refused in a cloud session
|
|
22
|
+
// — can be refused in a cloud session, and that loses the safety net rather
|
|
22
23
|
// than the flush: the in-process wait-and-merge still runs, exactly as before auto-merge existed.
|
|
23
24
|
async function request_auto_merge(branch_name: string): Promise<boolean> {
|
|
24
25
|
try {
|
|
@@ -49,7 +50,7 @@ async function wait_for_landing(branch_name: string, is_auto_merge: boolean): Pr
|
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
function describe_pull(pull: OpenPull): string {
|
|
52
|
-
return
|
|
53
|
+
return `${issue_cite.plain(pull.number)} (\`${pull.head_ref}\`)`
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
// **Landing means GitHub will merge it with nobody watching**: auto-merge is on and the merge gate has
|