@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
|
@@ -104,7 +104,7 @@ function add_missing_labels(): void {
|
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
// Main already has a history here, so the setup reaches it the way every other change does: through
|
|
107
|
-
// an Issue and a pull request a person merges
|
|
107
|
+
// an Issue and a pull request a person merges.
|
|
108
108
|
async function open_setup_pull_request(context: RunContext): Promise<void> {
|
|
109
109
|
await start_setup_pr.open(context.root, context.baseline)
|
|
110
110
|
}
|
|
@@ -112,7 +112,7 @@ async function open_setup_pull_request(context: RunContext): Promise<void> {
|
|
|
112
112
|
// What was already changed before the setup ran, read whenever a setup pull request will follow, so
|
|
113
113
|
// it can tell the setup's files from the user's own (#2872). Kit's own `josh init` needs it as much as
|
|
114
114
|
// a caller's command: its `josh format` rewrites the project's own sources, which kit cannot name, and
|
|
115
|
-
// leaving them out failed the pull request's Prettier check
|
|
115
|
+
// leaving them out failed the pull request's Prettier check.
|
|
116
116
|
function baseline_of(
|
|
117
117
|
steps: ReadonlyArray<StartStep>,
|
|
118
118
|
context: StepContext,
|
|
@@ -12,7 +12,7 @@ import { string_array_schema } from '#scripts/lib/schemas'
|
|
|
12
12
|
// `*.json`; a consumer whose `extends` still points at the old path would never be repaired by the
|
|
13
13
|
// ensure-based merge — an `@joshuafolkken/*` tsconfig entry is already present, so nothing is added
|
|
14
14
|
// — hence the rewrite here. Scoped to `@joshuafolkken/*/tsconfig/*` paths so an unrelated
|
|
15
|
-
// project-local `.jsonc` config is left alone.
|
|
15
|
+
// project-local `.jsonc` config is left alone.
|
|
16
16
|
const LEGACY_PRESET_ENTRY = /@joshuafolkken\/[^/]+\/tsconfig\/[^/]+\.jsonc$/u
|
|
17
17
|
const LEGACY_SUFFIX = '.jsonc'
|
|
18
18
|
const CURRENT_SUFFIX = '.json'
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { parse_jsonc } from '#scripts/config-merge/parse-jsonc'
|
|
2
|
+
import { patch_json_array } from '#scripts/config-merge/patch-json-array'
|
|
3
|
+
import { json_object_schema } from '#scripts/lib/schemas'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import { init_logic_json_merge } from './init-logic-json-merge'
|
|
6
|
+
|
|
7
|
+
type Task = Record<string, unknown>
|
|
8
|
+
|
|
9
|
+
const TASKS_KEY = 'tasks'
|
|
10
|
+
const LABEL_KEY = 'label'
|
|
11
|
+
const TASKS_VERSION = '2.0.0'
|
|
12
|
+
const VSCODE_TASKS_FILENAME = 'tasks.json'
|
|
13
|
+
|
|
14
|
+
// A label kit once shipped a task under, mapped to the label that replaced it. A consumer's task still
|
|
15
|
+
// carrying the retired label is the same kit task under its old name, so it is replaced in place — an
|
|
16
|
+
// append would leave the retired folder-open pane starting beside its successor.
|
|
17
|
+
const RETIRED_LABELS: ReadonlyMap<unknown, string> = new Map([
|
|
18
|
+
['josh: run event watch', 'josh: run board'],
|
|
19
|
+
])
|
|
20
|
+
|
|
21
|
+
const task_array_schema = z.array(json_object_schema)
|
|
22
|
+
|
|
23
|
+
function read_tasks(parsed: Record<string, unknown>): Array<Task> {
|
|
24
|
+
const result = task_array_schema.safeParse(parsed[TASKS_KEY])
|
|
25
|
+
|
|
26
|
+
return result.success ? result.data : []
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// A task is identified by its `label` — the name VSCode runs it by and `dependsOn` refers to it by.
|
|
30
|
+
function has_label(element: unknown, label: unknown): boolean {
|
|
31
|
+
const result = json_object_schema.safeParse(element)
|
|
32
|
+
if (!result.success) return false
|
|
33
|
+
const own = result.data[LABEL_KEY]
|
|
34
|
+
|
|
35
|
+
return (RETIRED_LABELS.get(own) ?? own) === label
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Kit owns the tasks whose label it ships: each is replaced with kit's current definition in place,
|
|
39
|
+
// a kit task the file lacks is appended, and every other task the consumer declared is kept as
|
|
40
|
+
// authored, comments included — the label-level counterpart of the key-level merge
|
|
41
|
+
// `.vscode/settings.json` gets.
|
|
42
|
+
function merge_tasks(content: string, kit_tasks: ReadonlyArray<Task>): string {
|
|
43
|
+
let merged = init_logic_json_merge.merge_json_object(content, { version: TASKS_VERSION })
|
|
44
|
+
|
|
45
|
+
for (const task of kit_tasks) {
|
|
46
|
+
merged = patch_json_array.upsert_element(merged, {
|
|
47
|
+
key: TASKS_KEY,
|
|
48
|
+
value: task,
|
|
49
|
+
is_target: (element) => has_label(element, task[LABEL_KEY]),
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return merged
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function read_kit_tasks(content: string): Array<Task> {
|
|
57
|
+
return read_tasks(parse_jsonc(content))
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const vscode_tasks = { VSCODE_TASKS_FILENAME, merge_tasks, read_kit_tasks }
|
|
61
|
+
|
|
62
|
+
export { vscode_tasks }
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { markdown_section } from './markdown-section'
|
|
2
2
|
|
|
3
3
|
// A behavior-change Issue's baseline section is written as `command + value`, never prose, so that
|
|
4
|
-
// `pnpm josh measure:rerun` can re-run the command after merge and print a before/after pair
|
|
5
|
-
//
|
|
4
|
+
// `pnpm josh measure:rerun` can re-run the command after merge and print a before/after pair.
|
|
5
|
+
// When the value has not moved, the premise the rule rested on is recorded
|
|
6
6
|
// as refuted in the observation ledger — reusing that append-only mechanism rather than a second one.
|
|
7
7
|
|
|
8
8
|
const BASELINE_HEADING = '## ベースライン'
|
|
@@ -6,8 +6,8 @@ import { reproduction_measure } from './reproduction-measure'
|
|
|
6
6
|
// A behavior-change Issue owes three headings the ordinary template does not — a firing-point heading
|
|
7
7
|
// (the tool call the rule breaks on), a baseline heading (a re-runnable measurement) and a
|
|
8
8
|
// reproduction heading (the command and its actual output). This checks them, but only for an Issue
|
|
9
|
-
// that declares itself one, and never asks the model to judge whether it is
|
|
10
|
-
//
|
|
9
|
+
// that declares itself one, and never asks the model to judge whether it is. The declaration, the
|
|
10
|
+
// headings and the grammars are the template's, pinned
|
|
11
11
|
// by the document test.
|
|
12
12
|
|
|
13
13
|
// The body declares itself a behavior-change Issue with this exact line under its opening heading.
|
|
@@ -79,7 +79,7 @@ function search_path(query: string, page: number = FIRST_PAGE): string {
|
|
|
79
79
|
|
|
80
80
|
// How many pages the search holds, read off the first page's own count. Bounded by the API's
|
|
81
81
|
// ceiling, past which GitHub serves no page at all — so this asks for exactly the pages `gh api
|
|
82
|
-
// --paginate`
|
|
82
|
+
// --paginate` would walk to.
|
|
83
83
|
function page_count(first: SearchPage): number {
|
|
84
84
|
return Math.ceil(Math.min(first.total_count, SEARCH_RESULT_CEILING) / Number(PER_PAGE))
|
|
85
85
|
}
|
|
@@ -87,13 +87,12 @@ function page_count(first: SearchPage): number {
|
|
|
87
87
|
async function read_page(query: string, page: number): Promise<SearchPage | undefined> {
|
|
88
88
|
const raw = await git_gh_exec.exec_gh_api({ path: search_path(query, page) })
|
|
89
89
|
|
|
90
|
-
return parse_json.
|
|
90
|
+
return parse_json.parse_json_object_or_undefined(raw, search_page_schema)
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
// Every page of one search.
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
// the whole search, as a failed `--paginate` did.
|
|
93
|
+
// Every page of one search. Not `gh api --paginate`: it follows each page's `next` link one page
|
|
94
|
+
// after another, at about 1.5 s a page, on every `backlog:plan`. The first page names the total, so
|
|
95
|
+
// the rest are fetched together; any page that does not read fails the whole search.
|
|
97
96
|
async function read_pages(query: string): Promise<ReadonlyArray<SearchPage> | undefined> {
|
|
98
97
|
const first = await read_page(query, FIRST_PAGE)
|
|
99
98
|
|
|
@@ -138,7 +137,7 @@ async function search(query: string): Promise<SearchResult | undefined> {
|
|
|
138
137
|
}
|
|
139
138
|
|
|
140
139
|
// The rate over a window, or `undefined` when either search could not be read. `backlog:next` asks
|
|
141
|
-
// this same measurement
|
|
140
|
+
// this same measurement, so the two cannot disagree about the rate.
|
|
142
141
|
async function measure_window(
|
|
143
142
|
repo: string,
|
|
144
143
|
days: number,
|
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
import { behavior_change_lint } from './behavior-change-lint'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BUG_LABEL,
|
|
4
|
+
BUGFIX_LABEL,
|
|
5
|
+
ENHANCEMENT_LABEL,
|
|
6
|
+
has_label_name,
|
|
7
|
+
INTERRUPT_ROUTE_LABEL,
|
|
8
|
+
} from './issue-labels'
|
|
3
9
|
import { markdown_section } from './markdown-section'
|
|
4
10
|
|
|
5
|
-
// The defect rate of merged work over a window
|
|
6
|
-
// divided by
|
|
7
|
-
//
|
|
11
|
+
// The defect rate of merged work over a window: issues filed as defects
|
|
12
|
+
// divided by enhancements completed. Both sides are read from labels and the defect declaration line,
|
|
13
|
+
// so nothing here asks for a judgement.
|
|
8
14
|
|
|
9
15
|
// A body declares itself a defect with this exact line, the sibling of the behavior-change declaration.
|
|
10
|
-
//
|
|
11
|
-
//
|
|
16
|
+
// Older bodies rarely wrote it, so the labels a maintainer re-applied after review count as well — the
|
|
17
|
+
// name changed over time (`bugfix` earlier, `bug` from `issue:file`), and the labels read both periods
|
|
18
|
+
// by one standard where the declaration alone moved the rate with the filing habit.
|
|
12
19
|
const DEFECT_DECLARATION_LINE = '- 種別: 不具合'
|
|
20
|
+
const DEFECT_LABELS: ReadonlyArray<string> = [BUG_LABEL, BUGFIX_LABEL, INTERRUPT_ROUTE_LABEL]
|
|
13
21
|
const DEFAULT_WINDOW_DAYS = 14
|
|
14
|
-
// The rate
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
const BASELINE_RATE = 0.42
|
|
22
|
+
// The rate over 2026-09-09 to 2026-09-23 measured by the label definition — 150 / 206, rounded.
|
|
23
|
+
// `backlog:next` defers new mechanisms while the current rate is above it.
|
|
24
|
+
const BASELINE_RATE = 0.73
|
|
18
25
|
const MS_PER_DAY = 86_400_000
|
|
19
26
|
const ISO_DATE_LENGTH = 10
|
|
20
27
|
const RATE_DIGITS = 2
|
|
@@ -28,7 +35,7 @@ interface DefectRate {
|
|
|
28
35
|
days: number
|
|
29
36
|
since: string
|
|
30
37
|
defects: number
|
|
31
|
-
|
|
38
|
+
enhancements: number
|
|
32
39
|
is_capped: boolean
|
|
33
40
|
}
|
|
34
41
|
|
|
@@ -53,27 +60,30 @@ function filed_query(repo: string, since: string): string {
|
|
|
53
60
|
return `repo:${repo} is:issue created:>=${since}`
|
|
54
61
|
}
|
|
55
62
|
|
|
63
|
+
// Narrowed to the denominator's label, so the search pages only through what is counted.
|
|
56
64
|
function completed_query(repo: string, since: string): string {
|
|
57
|
-
return `repo:${repo} is:issue is:closed reason:completed closed:>=${since}`
|
|
65
|
+
return `repo:${repo} is:issue is:closed reason:completed label:${ENHANCEMENT_LABEL} closed:>=${since}`
|
|
58
66
|
}
|
|
59
67
|
|
|
60
68
|
function is_defect(issue: RateIssue): boolean {
|
|
61
69
|
return (
|
|
62
70
|
markdown_section.has_line(issue.body, DEFECT_DECLARATION_LINE) ||
|
|
63
|
-
has_label_name(issue.labels,
|
|
71
|
+
DEFECT_LABELS.some((label) => has_label_name(issue.labels, label))
|
|
64
72
|
)
|
|
65
73
|
}
|
|
66
74
|
|
|
67
|
-
|
|
68
|
-
|
|
75
|
+
// The denominator is every enhancement, not only the behavior changes `backlog:next` defers: a count
|
|
76
|
+
// the priority itself shrinks would push the rate further up while it is above the baseline.
|
|
77
|
+
function is_enhancement(issue: RateIssue): boolean {
|
|
78
|
+
return has_label_name(issue.labels, ENHANCEMENT_LABEL)
|
|
69
79
|
}
|
|
70
80
|
|
|
71
|
-
// A defect
|
|
72
|
-
//
|
|
81
|
+
// A defect label or declaration wins over a behavior-change declaration, so an issue that is both
|
|
82
|
+
// counts as the fix it is.
|
|
73
83
|
function kind_of(issue: RateIssue): IssueKind {
|
|
74
84
|
if (is_defect(issue)) return 'defect'
|
|
75
85
|
|
|
76
|
-
return
|
|
86
|
+
return behavior_change_lint.is_target(issue.body) ? 'mechanism' : 'other'
|
|
77
87
|
}
|
|
78
88
|
|
|
79
89
|
function measure(input: DefectRateInput): DefectRate {
|
|
@@ -81,17 +91,17 @@ function measure(input: DefectRateInput): DefectRate {
|
|
|
81
91
|
days: input.days,
|
|
82
92
|
since: input.since,
|
|
83
93
|
defects: input.filed.filter((issue) => is_defect(issue)).length,
|
|
84
|
-
|
|
94
|
+
enhancements: input.completed.filter((issue) => is_enhancement(issue)).length,
|
|
85
95
|
is_capped: input.is_capped,
|
|
86
96
|
}
|
|
87
97
|
}
|
|
88
98
|
|
|
89
|
-
// Undefined when no
|
|
90
|
-
//
|
|
99
|
+
// Undefined when no enhancement completed in the window: a rate over zero is no answer, and printing
|
|
100
|
+
// 0 or Infinity would read as one.
|
|
91
101
|
function rate_of(result: DefectRate): number | undefined {
|
|
92
|
-
if (result.
|
|
102
|
+
if (result.enhancements === 0) return undefined
|
|
93
103
|
|
|
94
|
-
return result.defects / result.
|
|
104
|
+
return result.defects / result.enhancements
|
|
95
105
|
}
|
|
96
106
|
|
|
97
107
|
// Strictly above: a rate equal to the baseline has not risen, and a window with no rate is no answer.
|
|
@@ -104,16 +114,16 @@ function is_above_baseline(result: DefectRate): boolean {
|
|
|
104
114
|
function rate_text(result: DefectRate): string {
|
|
105
115
|
const rate = rate_of(result)
|
|
106
116
|
|
|
107
|
-
if (rate === undefined) return 'n/a (no
|
|
117
|
+
if (rate === undefined) return 'n/a (no enhancement completed in the window)'
|
|
108
118
|
|
|
109
|
-
return `${rate.toFixed(RATE_DIGITS)} (${String(result.defects)} / ${String(result.
|
|
119
|
+
return `${rate.toFixed(RATE_DIGITS)} (${String(result.defects)} / ${String(result.enhancements)})`
|
|
110
120
|
}
|
|
111
121
|
|
|
112
122
|
function format(result: DefectRate): ReadonlyArray<string> {
|
|
113
123
|
const lines = [
|
|
114
124
|
`Defect rate over the last ${String(result.days)} days (since ${result.since}): ${rate_text(result)}`,
|
|
115
|
-
` Defects filed: ${String(result.defects)} —
|
|
116
|
-
`
|
|
125
|
+
` Defects filed: ${String(result.defects)} — labelled ${DEFECT_LABELS.join(' / ')} or declared \`${DEFECT_DECLARATION_LINE}\``,
|
|
126
|
+
` Enhancements completed: ${String(result.enhancements)} — labelled ${ENHANCEMENT_LABEL}, closed as completed`,
|
|
117
127
|
]
|
|
118
128
|
|
|
119
129
|
if (!result.is_capped) return lines
|
|
@@ -3,14 +3,15 @@ import { open_issue_schema, type OpenIssueData } from '#scripts/git/git-schemas'
|
|
|
3
3
|
import { parse_json_array_safe } from '#scripts/git/parse-json-array'
|
|
4
4
|
import { has_any_label, NOT_DIRECTLY_RUNNABLE_LABELS } from './issue-labels'
|
|
5
5
|
import { issue_rank, type DependencyRow } from './issue-rank'
|
|
6
|
+
import { session_cite } from './session-cite'
|
|
6
7
|
|
|
7
|
-
// The next-issues display printed when a workflow completes
|
|
8
|
+
// The next-issues display printed when a workflow completes: up to five open issues in
|
|
8
9
|
// priority order, so the user picks the next run from the completion output instead of opening the
|
|
9
10
|
// issue list. Priority is recency — a newer issue usually encodes the most current understanding
|
|
10
11
|
// of the backlog — with the label-based exclusions below, under the ranking keys `issue-rank.ts`
|
|
11
|
-
// defines
|
|
12
|
+
// defines.
|
|
12
13
|
//
|
|
13
|
-
// `prioritize` is also the order `epicrun` picks up `auto-ok` issues in
|
|
14
|
+
// `prioritize` is also the order `epicrun` picks up `auto-ok` issues in.
|
|
14
15
|
// The two ask one question — which open issue outside an epic is run next — so they share one
|
|
15
16
|
// answer; a second ordering would have the run start something other than what this display, shown
|
|
16
17
|
// at the end of every workflow, has just told the person is next.
|
|
@@ -19,7 +20,7 @@ const DISPLAY_LIMIT = 5
|
|
|
19
20
|
const HEADER = '🗒 Next issues (newest first):'
|
|
20
21
|
|
|
21
22
|
// Surfacing an `epic`, an `in-progress` or a `needs-decision` issue as "next" would suggest a run
|
|
22
|
-
// the workflow rules forbid, duplicate, or cannot finish
|
|
23
|
+
// the workflow rules forbid, duplicate, or cannot finish. The set itself is
|
|
23
24
|
// shared with the `auto-ok` pickup, which asks the same question of the same listing shape.
|
|
24
25
|
function has_excluded_label(issue: OpenIssueData): boolean {
|
|
25
26
|
return has_any_label(issue.labels, NOT_DIRECTLY_RUNNABLE_LABELS)
|
|
@@ -51,7 +52,7 @@ function dependency_row(issue: OpenIssueData): DependencyRow {
|
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
// Every candidate in rank order, uncapped. `backlog:next` takes this rather than `prioritize`, so the
|
|
54
|
-
// `run:solo` gate sees the whole ranking before anything is cut
|
|
55
|
+
// `run:solo` gate sees the whole ranking before anything is cut.
|
|
55
56
|
function order(
|
|
56
57
|
issues: ReadonlyArray<OpenIssueData>,
|
|
57
58
|
completed_issue_number?: number,
|
|
@@ -69,7 +70,7 @@ function order(
|
|
|
69
70
|
|
|
70
71
|
// **This display deliberately does not drop a blocked issue, and the `auto-ok` pickup deliberately
|
|
71
72
|
// does.** They share this ordering and differ on the set, which reads as an inconsistency and is not
|
|
72
|
-
// one
|
|
73
|
+
// one.
|
|
73
74
|
//
|
|
74
75
|
// The display is read by a person, who can see that an issue is blocked, judge that the blocker is
|
|
75
76
|
// nearly done or does not really block it, and start anyway. The pickup feeds an unattended run,
|
|
@@ -87,7 +88,7 @@ function prioritize(
|
|
|
87
88
|
function format_lines(issues: ReadonlyArray<OpenIssueData>): Array<string> {
|
|
88
89
|
if (issues.length === 0) return []
|
|
89
90
|
const rows = issues.map(
|
|
90
|
-
(issue, index) => ` ${String(index + 1)}.
|
|
91
|
+
(issue, index) => ` ${String(index + 1)}. ${session_cite.issue(issue.number, issue.title)}`,
|
|
91
92
|
)
|
|
92
93
|
|
|
93
94
|
return [HEADER, ...rows]
|
|
@@ -99,7 +100,7 @@ function format_lines(issues: ReadonlyArray<OpenIssueData>): Array<string> {
|
|
|
99
100
|
// failed over a purely informational display.
|
|
100
101
|
async function fetch_next_issue_lines(completed_issue_number?: number): Promise<Array<string>> {
|
|
101
102
|
try {
|
|
102
|
-
// **`is_capped` is deliberately not read here
|
|
103
|
+
// **`is_capped` is deliberately not read here**. The paging is
|
|
103
104
|
// newest-first and this display keeps only the five newest of the twenty it asks for, so a
|
|
104
105
|
// listing the page ceiling cut short is a *prefix* of the one it would otherwise have got — the
|
|
105
106
|
// same five rows, in the same order. There is nothing the truncation hides that this display
|
|
@@ -5,18 +5,24 @@ import { issue_file } from './issue-file'
|
|
|
5
5
|
import { AUTO_OK_LABEL, has_label_name, RELEASE_LABEL } from './issue-labels'
|
|
6
6
|
import { issue_state_cli } from './issue-state-cli'
|
|
7
7
|
|
|
8
|
-
// Whether `josh issue:file` applies `auto-ok` to the Issue it files
|
|
9
|
-
//
|
|
10
|
-
//
|
|
8
|
+
// Whether `josh issue:file` applies `auto-ok` to the Issue it files. So that work found during an
|
|
9
|
+
// unattended run does not wait in the backlog until a person labels it, the filing computes the
|
|
10
|
+
// answer instead of leaving it to the agent's memory: an Issue filed while a
|
|
11
11
|
// `backlogrun` carry record is live, or from a branch whose Issue carries `auto-ok`, is opted in by
|
|
12
12
|
// default. `--no-auto-ok` is the one exception, declared for an Issue that needs a person's judgement
|
|
13
13
|
// (a Tier B toss-up or a Tier C action). A filing to another repository is never opted in: that
|
|
14
14
|
// repository's own `backlogrun` would implement and merge it though nobody opted that repository in.
|
|
15
|
-
// A `release` Issue is never opted in either
|
|
15
|
+
// A `release` Issue is never opted in either: a release is Tier C, so only a
|
|
16
16
|
// person applies `auto-ok` to it, whatever the carry record or the branch's Issue says.
|
|
17
|
+
// `--requested` withholds the default the same way: a person asked for this filing (a `new` entry, or
|
|
18
|
+
// a request in conversation), so the run's own opt-in does not speak for them — `auto-ok` comes only
|
|
19
|
+
// from their own `--label auto-ok`. A filing without the declaration — an observation, a
|
|
20
|
+
// retrospective, a routed filing — keeps the default above.
|
|
17
21
|
|
|
18
22
|
interface AutoOkSignals {
|
|
19
23
|
is_opted_out: boolean
|
|
24
|
+
// `--requested`: a person asked for the filing, so neither the carry record nor the branch speaks.
|
|
25
|
+
is_requested: boolean
|
|
20
26
|
// The filing carries the `release` label.
|
|
21
27
|
is_release: boolean
|
|
22
28
|
is_carried: boolean
|
|
@@ -39,6 +45,10 @@ const RELEASE: AutoOkDecision = {
|
|
|
39
45
|
is_applied: false,
|
|
40
46
|
reason: `a ${RELEASE_LABEL} Issue is opted in by a person only`,
|
|
41
47
|
}
|
|
48
|
+
const REQUESTED: AutoOkDecision = {
|
|
49
|
+
is_applied: false,
|
|
50
|
+
reason: 'a person asked for this filing; auto-ok only when they declare it',
|
|
51
|
+
}
|
|
42
52
|
const CARRIED: AutoOkDecision = { is_applied: true, reason: 'a backlogrun carry record is live' }
|
|
43
53
|
const BRANCH_OPTED_IN: AutoOkDecision = {
|
|
44
54
|
is_applied: true,
|
|
@@ -49,18 +59,21 @@ const NOT_OPTED_IN: AutoOkDecision = {
|
|
|
49
59
|
reason: 'no backlogrun carry record is live and the branch names no auto-ok Issue',
|
|
50
60
|
}
|
|
51
61
|
|
|
52
|
-
|
|
62
|
+
// What the filing itself declares: `--no-auto-ok` and `--requested`.
|
|
63
|
+
type AutoOkDeclared = Pick<AutoOkSignals, 'is_opted_out' | 'is_requested'>
|
|
64
|
+
type Withholding = AutoOkDeclared & Pick<AutoOkSignals, 'is_release'>
|
|
53
65
|
|
|
54
|
-
// The
|
|
66
|
+
// The three signals that withhold `auto-ok` before any other is read, or `undefined` when none holds.
|
|
55
67
|
function withheld(signals: Withholding): AutoOkDecision | undefined {
|
|
56
68
|
if (signals.is_opted_out) return OPTED_OUT
|
|
57
69
|
if (signals.is_release) return RELEASE
|
|
70
|
+
if (signals.is_requested) return REQUESTED
|
|
58
71
|
|
|
59
72
|
return undefined
|
|
60
73
|
}
|
|
61
74
|
|
|
62
|
-
// The opt-out
|
|
63
|
-
// Issue.
|
|
75
|
+
// The opt-out, the `release` label and `--requested` win over every signal, then the carry record,
|
|
76
|
+
// then the branch's Issue.
|
|
64
77
|
function decide(signals: AutoOkSignals): AutoOkDecision {
|
|
65
78
|
const decision = withheld(signals)
|
|
66
79
|
|
|
@@ -99,12 +112,12 @@ async function branch_labels(current: string): Promise<ReadonlyArray<string> | u
|
|
|
99
112
|
// Each read is skipped once an earlier signal has already decided the answer; a cross-repository
|
|
100
113
|
// filing is refused before any signal is read. `labels` are the ones the filing declares.
|
|
101
114
|
async function resolve(
|
|
102
|
-
|
|
115
|
+
declared: AutoOkDeclared,
|
|
103
116
|
target: string,
|
|
104
117
|
current: string,
|
|
105
118
|
labels: ReadonlyArray<string> = [],
|
|
106
119
|
): Promise<AutoOkDecision> {
|
|
107
|
-
const withholding = {
|
|
120
|
+
const withholding = { ...declared, is_release: has_label_name(labels, RELEASE_LABEL) }
|
|
108
121
|
const decision = withheld(withholding)
|
|
109
122
|
|
|
110
123
|
if (decision !== undefined) return decision
|
|
@@ -116,5 +129,5 @@ async function resolve(
|
|
|
116
129
|
|
|
117
130
|
const issue_auto_ok = { decide, line_of, resolve }
|
|
118
131
|
|
|
119
|
-
export type { AutoOkDecision, AutoOkSignals }
|
|
132
|
+
export type { AutoOkDeclared, AutoOkDecision, AutoOkSignals }
|
|
120
133
|
export { issue_auto_ok }
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
|
-
import {
|
|
4
|
+
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
5
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
6
|
import { z } from 'zod'
|
|
6
7
|
import { issue_backlinks, type UpstreamEntry } from './issue-backlinks'
|
|
7
8
|
|
|
8
9
|
// `josh issue:backlinks <N>` — read origin issue N, then the upstream issues it lists, and print one
|
|
9
10
|
// of `ok` / `missing-origin` / `missing-upstream` / `wrong-heading`, exiting non-zero on anything but
|
|
10
|
-
// `ok` so it works as a gate
|
|
11
|
+
// `ok` so it works as a gate.
|
|
11
12
|
|
|
12
13
|
const SUCCESS_EXIT_CODE = 0
|
|
13
14
|
const FAILURE_EXIT_CODE = 1
|
|
14
15
|
const ARGV_OFFSET = 2
|
|
15
|
-
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
16
16
|
const REF_PATTERN = /^([\w.-]+\/[\w.-]+)#(\d+)$/u
|
|
17
17
|
const BODY_FIELD = 'body'
|
|
18
18
|
const USAGE = 'Usage: josh issue:backlinks <issue-number>'
|
|
@@ -21,7 +21,7 @@ const body_schema = z.object({ body: z.string().nullish() })
|
|
|
21
21
|
|
|
22
22
|
function parse_body(raw_json: string | undefined): string | undefined {
|
|
23
23
|
if (raw_json === undefined) return undefined
|
|
24
|
-
const parsed =
|
|
24
|
+
const parsed = parse_json_object_or_undefined(raw_json, body_schema)
|
|
25
25
|
|
|
26
26
|
return parsed === undefined ? undefined : (parsed.body ?? '')
|
|
27
27
|
}
|
|
@@ -67,7 +67,7 @@ async function classify(issue_number: string): Promise<string | undefined> {
|
|
|
67
67
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
68
68
|
const [issue_number] = argv
|
|
69
69
|
|
|
70
|
-
if (issue_number === undefined || !ISSUE_NUMBER_PATTERN.test(issue_number)) {
|
|
70
|
+
if (issue_number === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)) {
|
|
71
71
|
console.error(USAGE)
|
|
72
72
|
|
|
73
73
|
return FAILURE_EXIT_CODE
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// The upstream backlink headings (`prompts/collaboration-workflow/issue-template.md`) are fixed so
|
|
2
2
|
// they can be found by grep — the document says so outright — yet nothing greps them, and a
|
|
3
3
|
// one-directional link (an origin that lists an upstream the upstream never points back at) survives
|
|
4
|
-
// undetected. This classifies an origin issue's filed backlinks into one of four fixed words
|
|
5
|
-
//
|
|
4
|
+
// undetected. This classifies an origin issue's filed backlinks into one of four fixed words.
|
|
5
|
+
// The headings are the single source's, pinned by the document test.
|
|
6
6
|
|
|
7
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
7
8
|
import { markdown_section } from './markdown-section'
|
|
8
9
|
|
|
9
10
|
const ORIGIN_HEADING = '## Origin'
|
|
@@ -12,7 +13,6 @@ const UPSTREAM_CANDIDATE_HEADING = '## Upstream candidate'
|
|
|
12
13
|
const CHECKBOX_PATTERN = /^\s*-\s*\[[ xX]\]/u
|
|
13
14
|
const WRONG_UPSTREAM_HEADING_PATTERN = /^##\s+Upstream\b/iu
|
|
14
15
|
const BARE_REFERENCE_PATTERN = /^#\d+$/u
|
|
15
|
-
const DIGITS_PATTERN = /^\d+$/u
|
|
16
16
|
const REFERENCE_MARK = '#'
|
|
17
17
|
const PATH_SEPARATOR = '/'
|
|
18
18
|
const PATH_SEGMENT_COUNT = 2
|
|
@@ -28,7 +28,7 @@ interface UpstreamEntry {
|
|
|
28
28
|
body: string
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
// A heading inside a code fence is example text, so neither lookup counts one
|
|
31
|
+
// A heading inside a code fence is example text, so neither lookup counts one.
|
|
32
32
|
function has_heading(body: string, heading: string): boolean {
|
|
33
33
|
return markdown_section.has_line(body, heading)
|
|
34
34
|
}
|
|
@@ -71,7 +71,7 @@ function is_qualified_reference(token: string): boolean {
|
|
|
71
71
|
const [path, number, ...rest] = token.split(REFERENCE_MARK)
|
|
72
72
|
if (number === undefined || rest.length > 0) return false
|
|
73
73
|
|
|
74
|
-
return
|
|
74
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && has_two_segments(path)
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
function has_bare_reference(section: ReadonlyArray<string>): boolean {
|
|
@@ -134,7 +134,7 @@ function upstream_references(origin_body: string): ReadonlyArray<string> {
|
|
|
134
134
|
// Whether classifying the origin needs the upstream bodies fetched. Only the `## Origin` back-check
|
|
135
135
|
// does; a wrong, malformed or missing upstream heading is decided from the origin body alone. So the
|
|
136
136
|
// CLI can skip the network for those, and never mask a `wrong-heading` verdict behind an upstream
|
|
137
|
-
// that happens to be unreadable
|
|
137
|
+
// that happens to be unreadable.
|
|
138
138
|
function needs_upstreams(origin_body: string): boolean {
|
|
139
139
|
if (has_wrong_upstream_heading(origin_body)) return false
|
|
140
140
|
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { parseArgs } from 'node:util'
|
|
4
3
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
4
|
import type { IssueRead } from '#scripts/gh/git-gh-issue-read'
|
|
6
5
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
6
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
7
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
7
8
|
import { z } from 'zod'
|
|
8
9
|
import { issue_cite, type CiteTarget } from './issue-cite'
|
|
9
10
|
|
|
10
11
|
// `josh issue:cite <N> [<N> ...] [--repo <owner/repo>]` — the paste-ready citation line for every
|
|
11
|
-
// Issue named, in one call
|
|
12
|
+
// Issue named, in one call.
|
|
12
13
|
//
|
|
13
|
-
// It answers the cost that
|
|
14
|
-
//
|
|
15
|
-
// lane status report
|
|
16
|
-
//
|
|
14
|
+
// It answers the cost that makes the bare `#N` cheaper than the correct citation: a per-Issue
|
|
15
|
+
// `gh api` read for each title means several round trips before a single correct line of a backlog
|
|
16
|
+
// listing or lane status report can be written. The numbers go in together and the titles come back
|
|
17
|
+
// together, so the correct form is the cheap one.
|
|
17
18
|
//
|
|
18
19
|
// **A token that is not a number refuses the whole invocation**, exactly as `issue:read` does: an
|
|
19
20
|
// argument the parser cannot read is a mistake, and dropping it answers fewer Issues than were asked
|
|
@@ -30,6 +31,7 @@ const READ_CONCURRENCY = 8
|
|
|
30
31
|
const TITLE_FIELD = 'title'
|
|
31
32
|
const LINE_SEPARATOR = '\n'
|
|
32
33
|
const USAGE = 'Usage: josh issue:cite <issue-number|owner/repo#N> [ ... ] [--repo <owner/repo>]'
|
|
34
|
+
const OPTIONS = { repo: { type: 'string' } } as const
|
|
33
35
|
|
|
34
36
|
const title_schema = z.looseObject({ title: z.string() })
|
|
35
37
|
|
|
@@ -38,13 +40,9 @@ type LineResult = { kind: 'ok'; line: string } | { kind: 'fail'; line: string }
|
|
|
38
40
|
// The title out of the one-field read, or `undefined` for an empty or unparseable one — an empty title
|
|
39
41
|
// is not a summary, so it is reported as a read that produced nothing rather than cited as a blank.
|
|
40
42
|
function parse_title(json: string): string | undefined {
|
|
41
|
-
|
|
42
|
-
const title = title_schema.parse(JSON.parse(json)).title.trim()
|
|
43
|
+
const title = json_value.parse_with(json, title_schema)?.title.trim()
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
} catch {
|
|
46
|
-
return undefined
|
|
47
|
-
}
|
|
45
|
+
return title === '' ? undefined : title
|
|
48
46
|
}
|
|
49
47
|
|
|
50
48
|
// A read's outcome as one line: the citation on success, the matching failure line otherwise. The
|
|
@@ -115,13 +113,17 @@ function report(results: ReadonlyArray<LineResult>): number {
|
|
|
115
113
|
return failures.length === 0 ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
116
114
|
}
|
|
117
115
|
|
|
116
|
+
// The targets the command line names, or `undefined` for a line nobody can read — an unknown flag and
|
|
117
|
+
// a `--repo` given no value are refused with the same usage a non-numeric token is.
|
|
118
|
+
function read_targets(args: ReadonlyArray<string>): ReadonlyArray<CiteTarget> | undefined {
|
|
119
|
+
const parsed = cli_flags.arguments_of(args, OPTIONS)
|
|
120
|
+
if (parsed === undefined) return undefined
|
|
121
|
+
|
|
122
|
+
return parse_targets(parsed.positionals, parsed.values.repo)
|
|
123
|
+
}
|
|
124
|
+
|
|
118
125
|
async function run(args: ReadonlyArray<string>): Promise<number> {
|
|
119
|
-
const
|
|
120
|
-
args: [...args],
|
|
121
|
-
options: { repo: { type: 'string' } },
|
|
122
|
-
allowPositionals: true,
|
|
123
|
-
})
|
|
124
|
-
const targets = parse_targets(parsed.positionals, parsed.values.repo)
|
|
126
|
+
const targets = read_targets(args)
|
|
125
127
|
|
|
126
128
|
if (targets === undefined) {
|
|
127
129
|
console.error(USAGE)
|