@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
|
@@ -13,16 +13,16 @@ const telegram_environment_schema = z.object({
|
|
|
13
13
|
telegram_chat_id: z.string().min(1, { message: 'TELEGRAM_CHAT_ID is required' }),
|
|
14
14
|
})
|
|
15
15
|
|
|
16
|
-
// **`warning` is not `failure
|
|
16
|
+
// **`warning` is not `failure`**. It names a run that finished and merged,
|
|
17
17
|
// alongside something that did not work — a post-merge cleanup step that could not complete is one.
|
|
18
18
|
// Sending `failure` (❌) there would say the merge failed, which is false and is
|
|
19
19
|
// the more expensive lie of the two; sending `completion` (✅) twice says nothing went wrong, which
|
|
20
20
|
// is the silence this type exists to end.
|
|
21
|
-
// **`stalled` is not `warning
|
|
21
|
+
// **`stalled` is not `warning`**. `warning` names a run that *finished* and
|
|
22
22
|
// merged alongside something that did not work; a stall is the opposite — the run is alive and has not
|
|
23
23
|
// finished, it has simply stopped advancing while ready work waits for a free lane. The ⏳ icon says
|
|
24
24
|
// exactly that: not done, not broken, just not moving.
|
|
25
|
-
// **`stranded` is not `stalled
|
|
25
|
+
// **`stranded` is not `stalled`**. A stall is a *live* run that is not
|
|
26
26
|
// dispatching; a strand is the step before it — the run's own driver is gone. The session that cut the
|
|
27
27
|
// budget handed it off and died, no successor claimed it, and no supervisor is watching, so nothing can
|
|
28
28
|
// take the next step at all. The 🚨 icon says a run needs a hand, not that ready work is merely waiting.
|
|
@@ -35,6 +35,7 @@ type TelegramTaskType =
|
|
|
35
35
|
| 'confirmation'
|
|
36
36
|
| 'stalled'
|
|
37
37
|
| 'stranded'
|
|
38
|
+
| 'progress'
|
|
38
39
|
|
|
39
40
|
interface TelegramSendInput {
|
|
40
41
|
task_type: TelegramTaskType
|
|
@@ -64,6 +65,7 @@ const TASK_DEFINITIONS: Record<TelegramTaskType, TaskDefinition> = {
|
|
|
64
65
|
confirmation: { icon: '⏸️', label: 'Confirmation required' },
|
|
65
66
|
stalled: { icon: '⏳', label: 'Ready work is sitting undispatched' },
|
|
66
67
|
stranded: { icon: '🚨', label: 'Run stranded — nobody is driving it' },
|
|
68
|
+
progress: { icon: '📊', label: 'Progress' },
|
|
67
69
|
}
|
|
68
70
|
|
|
69
71
|
const NOTIFY_SWITCH_KEY = 'JOSH_NOTIFY'
|
|
@@ -82,9 +84,8 @@ function parse_environment_string(value: string | undefined): string {
|
|
|
82
84
|
// so it would pull a subprocess concern into an HTTP one and degrade to exactly this line anyway.
|
|
83
85
|
// **The `cause` is read, not only the message.** A `fetch` rejection's own message is the bare string
|
|
84
86
|
// `fetch failed`; what says whether this was DNS, a refused connection or a timeout lives one level
|
|
85
|
-
// down. Reporting the top line alone would exit non-zero with nothing a reader can act on
|
|
86
|
-
//
|
|
87
|
-
// deeper line is covered exactly as the top one is.
|
|
87
|
+
// down. Reporting the top line alone would exit non-zero with nothing a reader can act on.
|
|
88
|
+
// Redaction runs over the joined text, so the deeper line is covered exactly as the top one is.
|
|
88
89
|
function join_cause(error: Error): string {
|
|
89
90
|
const { cause } = error
|
|
90
91
|
|
|
@@ -114,17 +115,14 @@ function describe_symptom(error: unknown): string {
|
|
|
114
115
|
|
|
115
116
|
// The request URL carries the bot token in its own path, so an error raised anywhere near the
|
|
116
117
|
// request can carry a credential into a log. Both values are taken out of the text before it leaves
|
|
117
|
-
// this module, so no caller has to remember to do it
|
|
118
|
+
// this module, so no caller has to remember to do it.
|
|
118
119
|
function redact_credentials(text: string, config: TelegramConfig): string {
|
|
119
120
|
return text.split(config.bot_token).join(REDACTED).split(config.chat_id).join(REDACTED)
|
|
120
121
|
}
|
|
121
122
|
|
|
122
|
-
// **Missing credentials are a failure, not a skip
|
|
123
|
-
//
|
|
124
|
-
//
|
|
125
|
-
// `--env-file=.env` flag on `josh notify` and `josh followup` made a machine without that file die
|
|
126
|
-
// before node started, which was loud by accident; with the flag relaxed to the optional form, this
|
|
127
|
-
// is where the noise has to come from instead.
|
|
123
|
+
// **Missing credentials are a failure, not a skip**: a run with no credentials that returned quietly
|
|
124
|
+
// would be indistinguishable from one whose notification arrived. `josh notify` and `josh followup`
|
|
125
|
+
// load `.env` only optionally, so this is where the noise has to come from.
|
|
128
126
|
//
|
|
129
127
|
// The message names the variables and never their values — the schema's own messages are the
|
|
130
128
|
// variable names, so nothing read out of the environment reaches it.
|
|
@@ -143,10 +141,10 @@ function load_config(): TelegramConfig {
|
|
|
143
141
|
return { bot_token: result.data.telegram_bot_token, chat_id: result.data.telegram_chat_id }
|
|
144
142
|
}
|
|
145
143
|
|
|
146
|
-
// **An explicit opt-out is not a missing credential
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
144
|
+
// **An explicit opt-out is not a missing credential**: a consumer who never means to use Telegram
|
|
145
|
+
// says so, rather than seeing the missing-credential failure on every stop. Only the stated value
|
|
146
|
+
// `off` disables the send: an unset or mistyped switch still falls through to `load_config`, so a
|
|
147
|
+
// forgotten setup stays a loud failure.
|
|
150
148
|
function is_notify_disabled(): boolean {
|
|
151
149
|
return parse_environment_string(process.env[NOTIFY_SWITCH_KEY]).toLowerCase() === NOTIFY_OFF_VALUE
|
|
152
150
|
}
|
|
@@ -204,10 +202,9 @@ function head_of(body: string, kept: number): string {
|
|
|
204
202
|
return TRAILING_HIGH_SURROGATE.test(head) ? head.slice(0, -1) : head
|
|
205
203
|
}
|
|
206
204
|
|
|
207
|
-
// **The body is cut to fit Telegram's length limit, keeping its head
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
// header and the URLs around the body survive.
|
|
205
|
+
// **The body is cut to fit Telegram's length limit, keeping its head**: a text past the limit is
|
|
206
|
+
// refused with `400 Bad Request` and reaches nobody. A caller puts the cause first, so the tail is
|
|
207
|
+
// what is dropped, and the header and the URLs around the body survive.
|
|
211
208
|
function build_text(input: TelegramSendInput): string {
|
|
212
209
|
const text = join_blocks(input)
|
|
213
210
|
const overflow = text.length - TELEGRAM_TEXT_LIMIT
|
|
@@ -230,7 +227,7 @@ async function post_message(config: TelegramConfig, text: string): Promise<void>
|
|
|
230
227
|
}
|
|
231
228
|
}
|
|
232
229
|
|
|
233
|
-
// **The cause is re-wrapped rather than passed through
|
|
230
|
+
// **The cause is re-wrapped rather than passed through**. The chain is kept,
|
|
234
231
|
// because a symptom error that drops its cause loses where the failure came from — but the original
|
|
235
232
|
// is the one object on this path nothing has redacted, and `git_error.handle` prints a cause's own
|
|
236
233
|
// message straight to the console. Both layers therefore carry the same already-redacted text.
|
|
@@ -241,9 +238,8 @@ function build_send_failure(error: unknown, config: TelegramConfig): Error {
|
|
|
241
238
|
}
|
|
242
239
|
|
|
243
240
|
// **The strict form.** A caller whose whole job is the notification has nothing left to report when
|
|
244
|
-
// this fails, so it throws and `pnpm josh notify` exits non-zero
|
|
245
|
-
//
|
|
246
|
-
// warning and exiting 0, so a message that reached nobody looked exactly like one that arrived.
|
|
241
|
+
// this fails, so it throws and `pnpm josh notify` exits non-zero — a warning and exit 0 would make a
|
|
242
|
+
// message that reached nobody look exactly like one that arrived.
|
|
247
243
|
//
|
|
248
244
|
// The failure it throws carries a `cause`, and that cause is redacted too — see `build_send_failure`.
|
|
249
245
|
//
|
|
@@ -272,13 +268,12 @@ async function send(input: TelegramSendInput): Promise<void> {
|
|
|
272
268
|
|
|
273
269
|
// **The tolerant form**, for a caller whose job is something other than the notification.
|
|
274
270
|
// `followup` sends the completion message on its way to the merge, and a gateway timeout at
|
|
275
|
-
// Telegram is not a reason to leave a reviewed, green pull request unmerged
|
|
276
|
-
//
|
|
277
|
-
// carries on.
|
|
271
|
+
// Telegram is not a reason to leave a reviewed, green pull request unmerged. So the failure is
|
|
272
|
+
// reported and the run carries on.
|
|
278
273
|
//
|
|
279
274
|
// **Reported under `❗` on stderr, in its own block, with the caller's own recovery line** — the bar
|
|
280
|
-
//
|
|
281
|
-
//
|
|
275
|
+
// for a step that failed and was not allowed to end the run. A `⚠️` is what every routine notice
|
|
276
|
+
// prints, so the failure would be buried under one.
|
|
282
277
|
//
|
|
283
278
|
// `recovery` is the caller's because only the caller knows one. It is `string | undefined` and not
|
|
284
279
|
// optional for the reason `CleanupStep.recovery` is: a caller with no command that finishes the job
|
|
@@ -326,7 +321,7 @@ interface WarningInput {
|
|
|
326
321
|
/**
|
|
327
322
|
* Warn that something an unattended run depended on did not work.
|
|
328
323
|
*
|
|
329
|
-
* **One function rather than one per caller
|
|
324
|
+
* **One function rather than one per caller**. Every warning fills in the
|
|
330
325
|
* same four fields the same way — the task type, the repository looked up under the same bound, and
|
|
331
326
|
* two urls that are never known here — so a second caller composing its own would be free to drift
|
|
332
327
|
* on the one field that is not obvious: a repository lookup with no timeout hangs the warning behind
|
|
@@ -354,8 +349,7 @@ interface ConfirmInput {
|
|
|
354
349
|
|
|
355
350
|
/**
|
|
356
351
|
* Push the ⏸️ confirmation type — a state change an unattended run made that a person now has to act
|
|
357
|
-
* on, a `backlogrun` that stopped needing a decision being the one this was written for
|
|
358
|
-
* (joshuafolkken/kit#2136).
|
|
352
|
+
* on, a `backlogrun` that stopped needing a decision being the one this was written for.
|
|
359
353
|
*
|
|
360
354
|
* **One function rather than one per caller, for `warn`'s reason exactly**: the repository lookup
|
|
361
355
|
* under a timeout is the field a second caller composing the four itself would drift on, and a lookup
|
|
@@ -384,8 +378,8 @@ interface StalledInput {
|
|
|
384
378
|
}
|
|
385
379
|
|
|
386
380
|
/**
|
|
387
|
-
* Push the ⏳ stalled type — ready backlog work with a free lane that nothing has dispatched for a while
|
|
388
|
-
*
|
|
381
|
+
* Push the ⏳ stalled type — ready backlog work with a free lane that nothing has dispatched for a while.
|
|
382
|
+
* Off-screen is the whole point: the state is invisible on the terminal until
|
|
389
383
|
* a person asks, so it reaches them where they are not watching.
|
|
390
384
|
*
|
|
391
385
|
* **`warn`'s shape exactly** — the repository looked up under the shared bound, the tolerant
|
|
@@ -413,8 +407,8 @@ interface StrandedInput {
|
|
|
413
407
|
}
|
|
414
408
|
|
|
415
409
|
/**
|
|
416
|
-
* Push the 🚨 stranded type — a run whose driver is gone and which nothing can advance
|
|
417
|
-
*
|
|
410
|
+
* Push the 🚨 stranded type — a run whose driver is gone and which nothing can advance.
|
|
411
|
+
* Off-screen is the whole point, as it is for `stalled`: the state is
|
|
418
412
|
* invisible on the terminal because the session that would show it has died, so the person hears about
|
|
419
413
|
* it where they are not watching, rather than by asking.
|
|
420
414
|
*
|
|
@@ -437,8 +431,30 @@ async function stranded(input: StrandedInput): Promise<boolean> {
|
|
|
437
431
|
)
|
|
438
432
|
}
|
|
439
433
|
|
|
434
|
+
/**
|
|
435
|
+
* Push the 📊 progress type — one `run:board` frame a person asked to receive periodically off-screen
|
|
436
|
+
* with `run:board --every`. Never a heartbeat: nothing sends it unasked.
|
|
437
|
+
*
|
|
438
|
+
* **`stranded`'s shape exactly**, with the board's own one-frame answer as the recovery — a frame lost
|
|
439
|
+
* to a Telegram timeout is read again by asking for it.
|
|
440
|
+
*/
|
|
441
|
+
async function progress(body: string): Promise<boolean> {
|
|
442
|
+
return await send_or_report(
|
|
443
|
+
{
|
|
444
|
+
task_type: 'progress',
|
|
445
|
+
repo_name: gh_spawn.get_repo_name_with_owner_within(REPO_LOOKUP_TIMEOUT_MS),
|
|
446
|
+
issue_title: undefined,
|
|
447
|
+
body,
|
|
448
|
+
issue_url: undefined,
|
|
449
|
+
pr_url: undefined,
|
|
450
|
+
},
|
|
451
|
+
'pnpm josh run:board --chat',
|
|
452
|
+
)
|
|
453
|
+
}
|
|
454
|
+
|
|
440
455
|
const telegram_notify = {
|
|
441
456
|
confirm,
|
|
457
|
+
progress,
|
|
442
458
|
send,
|
|
443
459
|
send_or_report,
|
|
444
460
|
stalled,
|
|
@@ -44,7 +44,7 @@ function parse_task_type(raw: string | undefined): TelegramTaskType {
|
|
|
44
44
|
|
|
45
45
|
// A flag counts as given only when it carries text, so `--issue-title ''` is not an answer. The
|
|
46
46
|
// callers that *skip* a lookup because the flag already answered it read the same predicate, or the
|
|
47
|
-
// two could disagree about an empty string and leave the field blank
|
|
47
|
+
// two could disagree about an empty string and leave the field blank.
|
|
48
48
|
// It is `cli_body`'s predicate rather than a second copy: the body flags are resolved there, and two
|
|
49
49
|
// definitions of "given" would let `--body ''` count on one side and not the other.
|
|
50
50
|
const has_flag_value = cli_body.has_value
|
|
@@ -56,8 +56,8 @@ function coalesce(primary: string | undefined, fallback: string | undefined): st
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
// `--body-file` is the form to reach for whenever the body carries a backtick or a `$`: inside shell
|
|
59
|
-
// double quotes those are evaluated before this process starts, and the text runs
|
|
60
|
-
//
|
|
59
|
+
// double quotes those are evaluated before this process starts, and the text runs.
|
|
60
|
+
// The resolution itself is `cli_body`'s, shared with `josh followup`.
|
|
61
61
|
function normalize_body(values: CliValues): string | undefined {
|
|
62
62
|
return cli_body.resolve({
|
|
63
63
|
inline: values.body,
|
|
@@ -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 }
|