@joshuafolkken/kit 1.1035.0 → 1.1094.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/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/verify-ui/SKILL.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +21 -13
- package/.claude/skills/workflow-commands/background-commands.md +5 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
- package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
- package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +6 -4
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +3 -3
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +3 -2
- package/.claude/skills/workflow-commands/halfrun.md +16 -19
- package/.claude/skills/workflow-commands/issue-comments.md +2 -2
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +1 -1
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +44 -89
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +24 -4
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +21 -0
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +42 -48
- package/.github/workflows/sonar-qube.yml +37 -4
- package/AGENTS.md +12 -2
- package/CLAUDE.md +15 -16
- package/GEMINI.md +14 -2
- package/README.md +59 -18
- package/SECURITY.md +36 -6
- package/cspell/index.yaml +2 -1
- package/dist/CLAUDE.md +15 -16
- package/dist/config-merge/index.js +15 -3
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
- package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
- package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
- package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
- package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
- package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +15 -34
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +23 -16
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +188 -509
- package/dist/josh.js +166 -225
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +412 -64
- package/eslint/rules/promise.js +5 -0
- package/package.json +13 -8
- package/prompts/collaboration-workflow/file-edits.md +6 -53
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/operating-rules.md +4 -4
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +4 -4
- package/prompts/collaboration-workflow/rule-delivery.md +5 -36
- package/prompts/collaboration-workflow/shell-body.md +7 -9
- package/prompts/collaboration-workflow/turn-batching.md +21 -37
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +36 -36
- package/prompts/collaboration-workflow.md +5 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +12 -4
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +2 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +15 -25
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +32 -22
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +6 -8
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +34 -17
- package/scripts/backlog/backlog-rank.ts +106 -0
- package/scripts/backlog/backlog-ready.ts +19 -3
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +47 -31
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +92 -11
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +0 -3
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +11 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +4 -6
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/document-byte-budget.ts +8 -9
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +13 -4
- package/scripts/document/lane-child-read-set.ts +1 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +1 -0
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +1 -1
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +5 -4
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +20 -30
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +37 -0
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +32 -30
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-command.ts +1 -1
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-execa-error.ts +6 -1
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +24 -6
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push-transport.ts +12 -69
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn.ts +79 -3
- package/scripts/git/git-ssh-keepalive.ts +74 -0
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +4 -2
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-cli.ts +15 -0
- package/scripts/hooks/format-edited-file.ts +4 -9
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard-cli.ts +21 -0
- package/scripts/hooks/pretool-guard.ts +36 -19
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-logic.ts +7 -0
- package/scripts/init/init.ts +0 -3
- package/scripts/init/project-profile.ts +6 -11
- package/scripts/init/start-exec.ts +8 -2
- package/scripts/init/start-plan.ts +18 -5
- package/scripts/init/start-setup-pr.ts +52 -25
- package/scripts/init/start-steps.ts +42 -9
- package/scripts/init/start.ts +40 -10
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +3 -3
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +37 -8
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +19 -3
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +2 -2
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +20 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/issue/issue-rank.ts +89 -0
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +1 -1
- package/scripts/issue/measure-rerun-cli.ts +1 -1
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -102
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +10 -3
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +7 -1
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +2 -2
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +3 -6
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-child-marker.ts +16 -2
- package/scripts/lane/lane-cli.ts +33 -18
- package/scripts/lane/lane-close.ts +1 -3
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +21 -11
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/lane-report.ts +10 -4
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +3 -0
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/lines-command.ts +0 -1
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +0 -2
- package/scripts/propagate/propagate-plan.ts +185 -0
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -3
- package/scripts/propagate/propagate-steps.ts +19 -6
- package/scripts/propagate/propagate-targets.ts +13 -6
- package/scripts/propagate/propagate.ts +60 -46
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +0 -1
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +1 -2
- package/scripts/registry-migration/migrate.ts +19 -9
- package/scripts/release/github-release-cli.ts +8 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +2 -3
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +48 -16
- package/scripts/review/review-brief-cli.ts +72 -8
- package/scripts/review/review-brief.ts +67 -9
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +1 -1
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +6 -2
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +1 -2
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/issue-fold.ts +1 -2
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-carry-conflict.ts +1 -2
- package/scripts/rules/lane-park.ts +14 -8
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/pre-gate-cut.ts +2 -2
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +13 -5
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +1 -1
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +101 -24
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +24 -8
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +25 -5
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +1 -1
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +5 -13
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +143 -0
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +2 -2
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-cli.ts +4 -7
- package/scripts/run/run-progress-clock.ts +6 -34
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +3 -3
- package/scripts/run/run-progress.ts +22 -10
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +27 -77
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +87 -0
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +23 -30
- package/scripts/run/run-ship-review.ts +20 -0
- package/scripts/run/run-ship-scoped.ts +45 -0
- package/scripts/run/run-ship-stage.ts +5 -1
- package/scripts/run/run-ship-steps.ts +105 -0
- package/scripts/run/run-ship.ts +2 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +1 -1
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +2 -1
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -5
- package/scripts/run/run-wake-describe.ts +19 -1
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +9 -7
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +0 -2
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +2 -3
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +97 -0
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-commands.ts +5 -4
- package/scripts/version/version-remote.ts +28 -14
- package/scripts/version/version-targets.ts +4 -4
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/dependabot-auto-merge.yml +5 -3
- package/templates/workflows/github-release.yml +81 -0
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
|
@@ -454,173 +454,10 @@ function should_block(
|
|
|
454
454
|
)
|
|
455
455
|
}
|
|
456
456
|
|
|
457
|
-
// What a read this rule saw was, in the four answers the rule itself can give
|
|
458
|
-
// (joshuafolkken/kit#1764). `pnpm josh time` prints them as a block, and the ids are here rather than
|
|
459
|
-
// there because each one is a fact about the guard: the two above the line are the reading §2b leaves
|
|
460
|
-
// in the main line on purpose, and the two below it are the reading it sends to a unit.
|
|
461
|
-
//
|
|
462
|
-
// **The last is the gap, and naming it is the point.** A read that reached the threshold and was not
|
|
463
|
-
// refused is neither by design nor caught, and nothing could see it — so the 35.9% of a run's turns
|
|
464
|
-
// that `investigation` accounts for could not be told apart from the reading that belongs there. Two
|
|
465
|
-
// things put a read in it, and the row deliberately covers both: a refusal already standing that the
|
|
466
|
-
// arm above had not re-armed, and a spelling the guard never refuses at all (`sed -n`, below).
|
|
467
|
-
const EDIT_TARGET_CLASS = 'edit targets'
|
|
468
|
-
const UNDER_THRESHOLD_CLASS = 'under the threshold'
|
|
469
|
-
const REFUSED_CLASS = 'refused'
|
|
470
|
-
// Kept inside `time-format.ts`'s 24-character label column, which the fuller phrasing overflowed —
|
|
471
|
-
// the prose beside the block is where the two reasons are named.
|
|
472
|
-
const LET_THROUGH_CLASS = 'let through'
|
|
473
|
-
const READ_CLASSES: ReadonlyArray<string> = [
|
|
474
|
-
EDIT_TARGET_CLASS,
|
|
475
|
-
UNDER_THRESHOLD_CLASS,
|
|
476
|
-
REFUSED_CLASS,
|
|
477
|
-
LET_THROUGH_CLASS,
|
|
478
|
-
]
|
|
479
|
-
|
|
480
|
-
// **The live guard refuses a `Read` always and a shell read only where the line cannot also write**,
|
|
481
|
-
// which is why `Bash: sed` is counted and never refused: `sed -n` prints and `sed -i` rewrites, and
|
|
482
|
-
// `time-batch-guard.ts` → `is_read_only_call` answers conservatively for both. A span carries the
|
|
483
|
-
// label but not the command, so the replay asks the question the span *can* answer — and of the eight
|
|
484
|
-
// printing commands, `sed` is the only one on `time-bundle-call.ts`'s writing list. **The residual is
|
|
485
|
-
// named rather than hidden**: a redirection inside a `cat` line also stops the live call being refusable
|
|
486
|
-
// and is invisible here, so a handful of such reads land in `refused` that the guard would have let
|
|
487
|
-
// through. It is the same direction as the row below and far smaller.
|
|
488
|
-
const NEVER_REFUSED_LABELS: ReadonlySet<string> = new Set([time_shell.bash_label('sed')])
|
|
489
|
-
|
|
490
|
-
// The guard's state as a replay walks a recorded run, which is `ReadTally` plus the one thing a live
|
|
491
|
-
// hook keeps on disk instead — the instant it last refused.
|
|
492
|
-
interface Replay {
|
|
493
|
-
pending: Map<string, number>
|
|
494
|
-
reset_ms: number
|
|
495
|
-
window_start_ms: number
|
|
496
|
-
refused_at_ms: number
|
|
497
|
-
// The whole run's successful writes, gathered once by `classified_reads` and carried so `tally_now`
|
|
498
|
-
// can hand them to the same exclusion the live guard makes (joshuafolkken/kit#1840).
|
|
499
|
-
edited: ReadonlySet<string>
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// The tally the live guard would have held at this instant, so the re-arm is asked of the one
|
|
503
|
-
// function that answers it rather than of a second copy of the rule.
|
|
504
|
-
function tally_now(replay: Replay): ReadTally {
|
|
505
|
-
return {
|
|
506
|
-
pending: [...replay.pending.keys()],
|
|
507
|
-
pending_since: pending_after(replay.pending, replay.refused_at_ms),
|
|
508
|
-
reset_ms: replay.reset_ms,
|
|
509
|
-
window_start_ms: replay.window_start_ms,
|
|
510
|
-
edited: replay.edited,
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
// The same two conditions `should_block` asks: the accumulated count is at the boundary, and this
|
|
515
|
-
// read actually adds a file to it.
|
|
516
|
-
function reaches_threshold(replay: Replay, targets: ReadonlyArray<string>): boolean {
|
|
517
|
-
const added = targets.filter((target) => !replay.pending.has(target))
|
|
518
|
-
|
|
519
|
-
return added.length > 0 && is_at_threshold(replay.pending.size)
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
// Whether the guard would have refused this read had it been armed — the same two conditions
|
|
523
|
-
// `is_refusable_call` puts in front of every refusal, asked of a span.
|
|
524
|
-
function would_refuse(replay: Replay, span: Span): boolean {
|
|
525
|
-
if (NEVER_REFUSED_LABELS.has(span.label)) return false
|
|
526
|
-
|
|
527
|
-
return is_rearmed(tally_now(replay), replay.refused_at_ms)
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
function class_of(replay: Replay, span: Span, edited: ReadonlySet<string>): string {
|
|
531
|
-
// Exclude the edited files first, so the threshold is judged on the same set `should_block` judges
|
|
532
|
-
// it on: an all-edited read is an edit target, and a mixed read reaches the threshold only on its
|
|
533
|
-
// genuinely new files, never on a file the run edited (joshuafolkken/kit#1840).
|
|
534
|
-
const fresh = subject_targets(span.targets).filter((target) => !edited.has(target))
|
|
535
|
-
|
|
536
|
-
if (fresh.length === 0) return EDIT_TARGET_CLASS
|
|
537
|
-
if (!reaches_threshold(replay, fresh)) return UNDER_THRESHOLD_CLASS
|
|
538
|
-
|
|
539
|
-
return would_refuse(replay, span) ? REFUSED_CLASS : LET_THROUGH_CLASS
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
// A span that is not a read, or whose every target was an instruction document or a session file,
|
|
543
|
-
// classifies as nothing at all — it never reached the count, so putting it in a row would report the
|
|
544
|
-
// guard as having an opinion about it.
|
|
545
|
-
function read_class(replay: Replay, span: Span, edited: ReadonlySet<string>): string | undefined {
|
|
546
|
-
if (!is_content_read(span.label)) return undefined
|
|
547
|
-
if (subject_targets(span.targets).length === 0) return undefined
|
|
548
|
-
|
|
549
|
-
return class_of(replay, span, edited)
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
function step(replay: Replay, span: Span, edited: ReadonlySet<string>): string | undefined {
|
|
553
|
-
if (DELEGATION_TOOLS.has(span.label)) {
|
|
554
|
-
replay.reset_ms = span.ended_ms
|
|
555
|
-
apply_span(replay.pending, span, edited)
|
|
556
|
-
|
|
557
|
-
return undefined
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
const found = read_class(replay, span, edited)
|
|
561
|
-
|
|
562
|
-
// A refusal moves the disarm forward, exactly as the hook's own stamp does.
|
|
563
|
-
if (found === REFUSED_CLASS) replay.refused_at_ms = span.ended_ms
|
|
564
|
-
|
|
565
|
-
apply_span(replay.pending, span, edited)
|
|
566
|
-
|
|
567
|
-
return found
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
// **A read paired with where it fell in the run** (joshuafolkken/kit#1868). `index` is the read span's
|
|
571
|
-
// position in the array handed to `classified_reads`; `time-investigation.ts` classifies that same
|
|
572
|
-
// array's phases and pairs the two by index, so it can say which phase — setup above all — each read
|
|
573
|
-
// landed in.
|
|
574
|
-
interface ClassifiedRead {
|
|
575
|
-
found: string
|
|
576
|
-
index: number
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
const FIRST_SPAN = 0
|
|
580
|
-
|
|
581
|
-
function fresh_replay(spans: ReadonlyArray<Span>, edited: ReadonlySet<string>): Replay {
|
|
582
|
-
return {
|
|
583
|
-
pending: new Map<string, number>(),
|
|
584
|
-
reset_ms: hook_decision.NEVER_MS,
|
|
585
|
-
window_start_ms: spans[FIRST_SPAN]?.ended_ms ?? hook_decision.NEVER_MS,
|
|
586
|
-
refused_at_ms: hook_decision.NEVER_MS,
|
|
587
|
-
edited,
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
// **What each of a run's reads was, replayed through this rule's own predicates**
|
|
592
|
-
// (joshuafolkken/kit#1764). It is the measurement half of the guard and shares every decision with
|
|
593
|
-
// it — the subject test, the threshold, the delegation reset and the re-arm — because a second walk
|
|
594
|
-
// that merely resembled the guard would answer about a rule nobody ships. Each read carries its span's
|
|
595
|
-
// index, so `time-investigation.ts` can place it in a phase (joshuafolkken/kit#1868).
|
|
596
|
-
function classified_reads(spans: ReadonlyArray<Span>): Array<ClassifiedRead> {
|
|
597
|
-
const edited = edited_files(spans)
|
|
598
|
-
const replay = fresh_replay(spans, edited)
|
|
599
|
-
const reads: Array<ClassifiedRead> = []
|
|
600
|
-
|
|
601
|
-
for (const [index, span] of spans.entries()) {
|
|
602
|
-
const found = step(replay, span, edited)
|
|
603
|
-
|
|
604
|
-
if (found !== undefined) reads.push({ found, index })
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
return reads
|
|
608
|
-
}
|
|
609
|
-
|
|
610
457
|
const investigation_reads = {
|
|
611
|
-
CONTENT_READ_COMMANDS,
|
|
612
|
-
EDIT_TARGET_CLASS,
|
|
613
|
-
LET_THROUGH_CLASS,
|
|
614
|
-
READ_CLASSES,
|
|
615
|
-
REFUSED_CLASS,
|
|
616
|
-
UNDER_THRESHOLD_CLASS,
|
|
617
|
-
classified_reads,
|
|
618
|
-
subject_targets,
|
|
619
|
-
DELEGATION_TOOLS,
|
|
620
458
|
READ_TOOLS,
|
|
621
459
|
REASON,
|
|
622
460
|
is_at_threshold,
|
|
623
|
-
is_content_read,
|
|
624
461
|
is_instruction_document,
|
|
625
462
|
is_rearmed,
|
|
626
463
|
is_refusable_call,
|
|
@@ -633,5 +470,5 @@ const investigation_reads = {
|
|
|
633
470
|
tally_of,
|
|
634
471
|
}
|
|
635
472
|
|
|
636
|
-
export type {
|
|
473
|
+
export type { ReadTally }
|
|
637
474
|
export { investigation_reads }
|
|
@@ -62,7 +62,7 @@ function main(argv: ReadonlyArray<string>): void {
|
|
|
62
62
|
process.exitCode = run(argv)
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
const repo_party_cli = { USAGE, decide,
|
|
65
|
+
const repo_party_cli = { USAGE, decide, run }
|
|
66
66
|
|
|
67
67
|
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
68
68
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
4
|
import { file_reader } from '#scripts/lib/read-file'
|
|
4
5
|
import { read_spawn_stdout } from '#scripts/lib/spawn-exit'
|
|
5
6
|
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
6
|
-
import { safe_json_parse } from '#scripts/version/parse-json'
|
|
7
7
|
import { execaSync } from 'execa'
|
|
8
8
|
import { z } from 'zod'
|
|
9
9
|
|
|
@@ -40,7 +40,7 @@ type ClaudeMdState = typeof STATE_OK | typeof STATE_TARGET_MISSING | typeof STAT
|
|
|
40
40
|
function parse_manifest(root: string): ManifestShape | undefined {
|
|
41
41
|
const content = file_reader.read_if_readable(path.join(root, 'package.json'))
|
|
42
42
|
if (content === undefined) return undefined
|
|
43
|
-
const parsed = manifest_schema.safeParse(
|
|
43
|
+
const parsed = manifest_schema.safeParse(json_value.parse_or_undefined(content))
|
|
44
44
|
|
|
45
45
|
return parsed.success ? parsed.data : undefined
|
|
46
46
|
}
|
|
@@ -69,7 +69,7 @@ function is_kit_consumer(root: string): boolean {
|
|
|
69
69
|
function is_plugin_declared(root: string): boolean {
|
|
70
70
|
const content = file_reader.read_if_readable(path.join(root, SETTINGS_PATH))
|
|
71
71
|
if (content === undefined) return false
|
|
72
|
-
const parsed = settings_schema.safeParse(
|
|
72
|
+
const parsed = settings_schema.safeParse(json_value.parse_or_undefined(content))
|
|
73
73
|
|
|
74
74
|
return parsed.success && parsed.data.enabledPlugins?.[PLUGIN_ID] === true
|
|
75
75
|
}
|
|
@@ -107,7 +107,7 @@ function status_line(is_ok: boolean, ok_text: string, warn_text: string): string
|
|
|
107
107
|
function plugin_line(is_declared: boolean): string {
|
|
108
108
|
return status_line(
|
|
109
109
|
is_declared,
|
|
110
|
-
|
|
110
|
+
'kit plugin declared (skills load in a trusted workspace; headless from its second session)',
|
|
111
111
|
'kit plugin not declared in .claude/settings.json — run `pnpm josh sync`',
|
|
112
112
|
)
|
|
113
113
|
}
|
|
@@ -159,8 +159,6 @@ function report_consumer_setup(root: string): void {
|
|
|
159
159
|
const doctor_consumer = {
|
|
160
160
|
claude_md_line,
|
|
161
161
|
claude_md_state,
|
|
162
|
-
configured_hooks_path,
|
|
163
|
-
consumer_setup_lines,
|
|
164
162
|
hooks_path_line,
|
|
165
163
|
is_kit_consumer,
|
|
166
164
|
is_plugin_declared,
|
|
@@ -3,7 +3,6 @@ import path from 'node:path'
|
|
|
3
3
|
const RECOVERY_COMMAND = 'josh doctor --fix'
|
|
4
4
|
const REPOSITORY_MAP_HEADING = 'Repositories (same owner, discovered next to this one):'
|
|
5
5
|
const NO_REPOSITORIES_FOUND = ' (none discovered — see JOSH_REPO_PATHS in docs/josh-commands.md)'
|
|
6
|
-
const GLOBAL_REINSTALL_COMMAND = 'pnpm add -g @joshuafolkken/kit'
|
|
7
6
|
// Markers identifying a `josh` on PATH that was generated by an old kit `postinstall`
|
|
8
7
|
// (pre-0.200.0 `install-bin.ts` wrote a shim referencing the kit package / tsx runner).
|
|
9
8
|
const KIT_SHIM_MARKERS: ReadonlyArray<string> = [
|
|
@@ -102,14 +101,11 @@ function format_shadow_warning(path_josh: string, global_josh: string): string {
|
|
|
102
101
|
|
|
103
102
|
const doctor_logic = {
|
|
104
103
|
RECOVERY_COMMAND,
|
|
105
|
-
GLOBAL_REINSTALL_COMMAND,
|
|
106
104
|
NO_SHADOW_REASON,
|
|
107
105
|
NOT_KIT_SHIM_REASON,
|
|
108
|
-
RECLAIM_REASON,
|
|
109
106
|
REPOSITORY_MAP_HEADING,
|
|
110
107
|
NO_REPOSITORIES_FOUND,
|
|
111
108
|
format_repository_map,
|
|
112
|
-
normalize_path,
|
|
113
109
|
path_lookup_command,
|
|
114
110
|
first_path_line,
|
|
115
111
|
is_shadowed,
|
package/scripts/doctor/doctor.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
|
6
6
|
import { gh_spawn } from '#scripts/gh/gh-spawn'
|
|
7
7
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
8
8
|
import { auto_merge_setting } from '#scripts/repo/auto-merge-setting'
|
|
9
|
+
import { ruleset_check } from '#scripts/repo/ruleset-check'
|
|
9
10
|
import { security_updates } from '#scripts/security/security-updates'
|
|
10
11
|
import { running_binary } from '#scripts/version/running-binary'
|
|
11
12
|
import { doctor_consumer } from './doctor-consumer'
|
|
@@ -32,8 +33,10 @@ interface GateScope {
|
|
|
32
33
|
|
|
33
34
|
// Which repository-scoped reports this project has a prerequisite for.
|
|
34
35
|
interface ApplicableSettings {
|
|
36
|
+
root: string
|
|
35
37
|
security_updates: boolean
|
|
36
38
|
auto_merge: boolean
|
|
39
|
+
required_checks: boolean
|
|
37
40
|
}
|
|
38
41
|
|
|
39
42
|
interface DoctorContext {
|
|
@@ -110,11 +113,17 @@ function resolve_gate_scope(git: GitTopLevel): GateScope | undefined {
|
|
|
110
113
|
// workflow of its own has the second prerequisite and not the first.
|
|
111
114
|
function resolve_applicable(scope: GateScope): ApplicableSettings {
|
|
112
115
|
return {
|
|
116
|
+
root: scope.root,
|
|
113
117
|
security_updates: doctor_io.has_distributed_dependabot_config(scope.root, scope.boundary),
|
|
114
118
|
auto_merge: doctor_io.has_auto_merge_workflow(scope.root, scope.boundary),
|
|
119
|
+
required_checks: ruleset_check.expected_in(scope.root).length > 0,
|
|
115
120
|
}
|
|
116
121
|
}
|
|
117
122
|
|
|
123
|
+
function has_any_applicable(applicable: ApplicableSettings): boolean {
|
|
124
|
+
return applicable.security_updates || applicable.auto_merge || applicable.required_checks
|
|
125
|
+
}
|
|
126
|
+
|
|
118
127
|
// Everything past the gate reports, including a failed lookup: `could not be read` is informative
|
|
119
128
|
// while silence is the false all-clear joshuafolkken/kit#805 exists to remove.
|
|
120
129
|
function report_applicable_settings(
|
|
@@ -123,6 +132,10 @@ function report_applicable_settings(
|
|
|
123
132
|
): void {
|
|
124
133
|
if (applicable.security_updates) security_updates.report_security_updates_section(repo)
|
|
125
134
|
if (applicable.auto_merge) auto_merge_setting.report_auto_merge_section(repo)
|
|
135
|
+
|
|
136
|
+
if (applicable.required_checks) {
|
|
137
|
+
ruleset_check.report_required_checks_section(repo, applicable.root)
|
|
138
|
+
}
|
|
126
139
|
}
|
|
127
140
|
|
|
128
141
|
// Last, and after the local diagnosis: this is the only part of `doctor` that touches the network,
|
|
@@ -143,7 +156,7 @@ function report_repository_settings(git: GitTopLevel): void {
|
|
|
143
156
|
const scope = resolve_gate_scope(git)
|
|
144
157
|
if (scope === undefined) return
|
|
145
158
|
const applicable = resolve_applicable(scope)
|
|
146
|
-
if (!applicable
|
|
159
|
+
if (!has_any_applicable(applicable)) return
|
|
147
160
|
|
|
148
161
|
report_applicable_settings(
|
|
149
162
|
applicable,
|
|
@@ -216,15 +229,7 @@ function main(): void {
|
|
|
216
229
|
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
217
230
|
|
|
218
231
|
const doctor = {
|
|
219
|
-
gather_context,
|
|
220
|
-
print_report,
|
|
221
|
-
reclaim_shim,
|
|
222
|
-
handle_shadow,
|
|
223
232
|
parse_options,
|
|
224
|
-
consumer_root,
|
|
225
|
-
run_reports,
|
|
226
|
-
report_repository_map,
|
|
227
|
-
report_port_seeds,
|
|
228
233
|
main,
|
|
229
234
|
}
|
|
230
235
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// documents no entry reads — the reference documents a human browses, drawn by
|
|
7
7
|
// `document-reachability.ts` from `read:set`'s output rather than by a hand-written table.
|
|
8
8
|
//
|
|
9
|
-
// Agent-read documents (`.claude/skills/**/*.md`, `prompts/**/*.md` and `docs/josh-commands
|
|
9
|
+
// Agent-read documents (`.claude/skills/**/*.md`, `prompts/**/*.md` and the two `docs/josh-commands*.md` references) have
|
|
10
10
|
// been shrunk by reduction epics (joshuafolkken/kit#1929, joshuafolkken/kit#1924) only to swell
|
|
11
11
|
// again, because nothing held the reduced size — a PR that adds a few lines at a time goes unseen
|
|
12
12
|
// until the next reduction epic. This list is that hold for the unreached ones:
|
|
@@ -73,7 +73,7 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
|
|
|
73
73
|
{ path: '.claude/skills/workflow-commands/issue-comments.md', bytes: 8192 },
|
|
74
74
|
{ path: '.claude/skills/workflow-commands/issue-fold-existing.md', bytes: 4096 },
|
|
75
75
|
{ path: '.claude/skills/workflow-commands/needs-human-review.md', bytes: 8192 },
|
|
76
|
-
{ path: '.claude/skills/workflow-commands/observation-filing.md', bytes:
|
|
76
|
+
{ path: '.claude/skills/workflow-commands/observation-filing.md', bytes: 24_576 },
|
|
77
77
|
// `pre-gate-cut.md` left this per-document budget in joshuafolkken/kit#2289: it became a point-of-use
|
|
78
78
|
// document, so its bytes are now held by every entry's total read (`entry-read-budget.ts`) and the
|
|
79
79
|
// two budgets must not hold it twice — the reachability line moved it from `unreached` to
|
|
@@ -81,12 +81,11 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
|
|
|
81
81
|
{ path: '.claude/skills/workflow-commands/prerequisite.md', bytes: 8192 },
|
|
82
82
|
{ path: '.claude/skills/workflow-commands/target-repository.md', bytes: 8192 },
|
|
83
83
|
{ path: '.claude/skills/workflow-commands/working-tree-hold.md', bytes: 8192 },
|
|
84
|
-
|
|
84
|
+
// joshuafolkken/kit#2998 split the reference: the developer commands stay, the rest moved out.
|
|
85
|
+
{ path: 'docs/josh-commands-automation.md', bytes: 155_648 },
|
|
86
|
+
{ path: 'docs/josh-commands.md', bytes: 36_864 },
|
|
85
87
|
{ path: 'prompts/coding-standards.md', bytes: 8192 },
|
|
86
88
|
{ path: 'prompts/collaboration-workflow.md', bytes: 8192 },
|
|
87
|
-
{ path: 'prompts/collaboration-workflow/cross-repo-epic.md', bytes: 4096 },
|
|
88
|
-
{ path: 'prompts/collaboration-workflow/epic-audit.md', bytes: 4096 },
|
|
89
|
-
{ path: 'prompts/collaboration-workflow/epic-bundle.md', bytes: 4096 },
|
|
90
89
|
{ path: 'prompts/collaboration-workflow/file-edits.md', bytes: 12_288 },
|
|
91
90
|
{ path: 'prompts/collaboration-workflow/gh-rest.md', bytes: 8192 },
|
|
92
91
|
{ path: 'prompts/collaboration-workflow/issue-citation.md', bytes: 8192 },
|
|
@@ -100,11 +99,11 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
|
|
|
100
99
|
{ path: 'prompts/collaboration-workflow/proposal-request.md', bytes: 4096 },
|
|
101
100
|
{ path: 'prompts/collaboration-workflow/report-format.md', bytes: 28_672 },
|
|
102
101
|
{ path: 'prompts/collaboration-workflow/residency.md', bytes: 28_672 },
|
|
103
|
-
{ path: 'prompts/collaboration-workflow/rule-delivery.md', bytes:
|
|
102
|
+
{ path: 'prompts/collaboration-workflow/rule-delivery.md', bytes: 45_056 },
|
|
104
103
|
{ path: 'prompts/collaboration-workflow/shell-body.md', bytes: 12_288 },
|
|
105
|
-
{ path: 'prompts/collaboration-workflow/turn-batching.md', bytes:
|
|
104
|
+
{ path: 'prompts/collaboration-workflow/turn-batching.md', bytes: 20_480 },
|
|
106
105
|
{ path: 'prompts/collaboration-workflow/upstream-interrupt.md', bytes: 12_288 },
|
|
107
|
-
{ path: 'prompts/collaboration-workflow/wip-cap.md', bytes:
|
|
106
|
+
{ path: 'prompts/collaboration-workflow/wip-cap.md', bytes: 16_384 },
|
|
108
107
|
{ path: 'prompts/refactoring.md', bytes: 8192 },
|
|
109
108
|
{ path: 'prompts/review-rubric.md', bytes: 20_480 },
|
|
110
109
|
{ path: 'prompts/review.md', bytes: 20_480 },
|
|
@@ -94,7 +94,7 @@ function main(argv: ReadonlyArray<string>): void {
|
|
|
94
94
|
process.exitCode = run(argv)
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
const document_section_cli = { FAILURE_EXIT_CODE, USAGE,
|
|
97
|
+
const document_section_cli = { FAILURE_EXIT_CODE, USAGE, resolve_document, run }
|
|
98
98
|
|
|
99
99
|
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
100
100
|
|
|
@@ -138,13 +138,10 @@ function read_optional(file_path: string): string | undefined {
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
const document_section = {
|
|
141
|
-
FENCE,
|
|
142
|
-
HEADING_PATTERN,
|
|
143
141
|
candidates,
|
|
144
142
|
headings,
|
|
145
143
|
read_optional,
|
|
146
144
|
section,
|
|
147
|
-
select,
|
|
148
145
|
titles,
|
|
149
146
|
}
|
|
150
147
|
|
|
@@ -69,7 +69,7 @@ const ENTRY_READ_BUDGET: ReadonlyArray<EntryBudget> = [
|
|
|
69
69
|
// list, so its ~48KB read crossed a block downward and the recorded ceiling drops to the block multiple
|
|
70
70
|
// the stale-ratchet message named. The other entries still read it, so their rows hold.
|
|
71
71
|
// joshuafolkken/kit#2345 added the `implementation-unit` delegation row (full fan-out procedure in
|
|
72
|
-
// `docs/josh-commands.md` → "`josh fanout`"); `SKILL.md` §2b gained only a one-clause mention and a
|
|
72
|
+
// `docs/josh-commands-automation.md` → "`josh fanout`"); `SKILL.md` §2b gained only a one-clause mention and a
|
|
73
73
|
// pointer, folded into the existing enumeration and offset by tightening §2b prose, so every entry
|
|
74
74
|
// stayed within its block (kickoff has no block of headroom — its pre-#2294 ceiling is the next
|
|
75
75
|
// multiple, which the downward ratchet holds shut).
|
|
@@ -77,10 +77,19 @@ const ENTRY_READ_BUDGET: ReadonlyArray<EntryBudget> = [
|
|
|
77
77
|
// planning entries): kickoff has no headroom, so the addition was offset by tightening that file's
|
|
78
78
|
// heartbeat prose, keeping every entry within its existing block.
|
|
79
79
|
// joshuafolkken/kit#2762 moved the rationale of five point-of-use documents to
|
|
80
|
-
// `docs/maintainers/*-rationale.md`, and the ratchet holds the reduction.
|
|
80
|
+
// `docs/maintainers/*-rationale.md`, and the ratchet holds the reduction. joshuafolkken/kit#2895 did
|
|
81
|
+
// the same for eight more, lowering fullrun, halfrun and backlogrun one block each.
|
|
82
|
+
// joshuafolkken/kit#2998 split the command reference, so every reference to an automation command
|
|
83
|
+
// now names `josh-commands-automation.md`; the longer path tipped backlogrun one block over.
|
|
84
|
+
// joshuafolkken/kit#2994 moved `CLAUDE.md`'s explanations to `docs/maintainers/claude-md-history.md`,
|
|
85
|
+
// lowering backlogrun one block; kickoff's reduction was offset by joshuafolkken/kit#3024's longer
|
|
86
|
+
// `wip-cap.md`, so its ceiling stays.
|
|
87
|
+
// joshuafolkken/kit#3023 added the `prrun` keyword to `SKILL.md` and `CLAUDE.md`, tipping backlogrun
|
|
88
|
+
// one block over; `prrun` reads `fullrun`'s set plus its own short manifest.
|
|
81
89
|
{ entry: 'kickoff', bytes: 229_376 },
|
|
82
|
-
{ entry: 'fullrun', bytes:
|
|
83
|
-
{ entry: 'halfrun', bytes:
|
|
90
|
+
{ entry: 'fullrun', bytes: 225_280 },
|
|
91
|
+
{ entry: 'halfrun', bytes: 225_280 },
|
|
92
|
+
{ entry: 'prrun', bytes: 229_376 },
|
|
84
93
|
{ entry: 'backlogrun', bytes: 233_472 },
|
|
85
94
|
{ entry: LANE_CHILD, bytes: 77_824 },
|
|
86
95
|
]
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// section level, and the point-of-use documents a leaf never reaches dropped — applied by the shared
|
|
13
13
|
// `read-set-trim`, which the `backlogrun` parent trim uses too (joshuafolkken/kit#2256).
|
|
14
14
|
|
|
15
|
-
import type {
|
|
15
|
+
import type { ReadSetCost } from './entry-read-set'
|
|
16
16
|
import { read_set_trim } from './read-set-trim'
|
|
17
17
|
|
|
18
18
|
const LANE_CHILD = 'lane-child'
|
|
@@ -73,16 +73,11 @@ function costed(root: string): ReadSetCost {
|
|
|
73
73
|
})
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
function unused_skill_cost(root: string): Cost {
|
|
77
|
-
return read_set_trim.unused_skill_cost(root, UNUSED_SKILL_SECTIONS)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
76
|
const lane_child_read_set = {
|
|
81
77
|
LANE_CHILD,
|
|
82
78
|
SKIPPED_POINT_OF_USE,
|
|
83
79
|
UNUSED_SKILL_SECTIONS,
|
|
84
80
|
costed,
|
|
85
|
-
unused_skill_cost,
|
|
86
81
|
}
|
|
87
82
|
|
|
88
83
|
export { lane_child_read_set }
|
|
@@ -62,6 +62,7 @@ const POINT_OF_USE_BY_ENTRY: ReadonlyMap<string, ReadonlySet<string>> = new Map(
|
|
|
62
62
|
['kickoff', DEFERRED_DECISIONS],
|
|
63
63
|
['fullrun', DEFERRED_DECISIONS],
|
|
64
64
|
['halfrun', DEFERRED_DECISIONS],
|
|
65
|
+
['prrun', DEFERRED_DECISIONS],
|
|
65
66
|
['backlogrun', new Set([...DEFERRED_DECISIONS, 'fullrun.md', 'split-assessment.md'])],
|
|
66
67
|
])
|
|
67
68
|
|
package/scripts/epic/epic-add.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { backlog_ready } from '#scripts/backlog/backlog-ready'
|
|
2
|
-
import { git_gh_command } from '#scripts/
|
|
2
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
3
|
import { epic_add_plan, type AddPlan } from './epic-add-plan'
|
|
4
4
|
import type { InsertPosition } from './epic-chains'
|
|
5
5
|
import { epic_decision } from './epic-decision'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { git_gh_command } from '#scripts/
|
|
3
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
4
|
import { issue_read } from '#scripts/issue/issue-read'
|
|
5
5
|
import { epic_audit_logic, type AuditFinding, type ReferenceState } from './epic-audit'
|
|
6
6
|
import { epic_audit_checks, type AuditChild } from './epic-audit-checks'
|
|
@@ -356,16 +356,13 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
356
356
|
}
|
|
357
357
|
|
|
358
358
|
const epic_audit_cli = {
|
|
359
|
-
USAGE,
|
|
360
359
|
UNREADABLE_REPO,
|
|
361
360
|
parse_epic_number: epic_issue.parse_epic_number,
|
|
362
361
|
attach_bodies,
|
|
363
362
|
resolve_reference_states,
|
|
364
363
|
outside_references,
|
|
365
|
-
read_order_comments,
|
|
366
364
|
audit,
|
|
367
365
|
run,
|
|
368
|
-
main,
|
|
369
366
|
}
|
|
370
367
|
|
|
371
368
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_command } from '#scripts/
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { cutoff_of, PAGE_CEILING_CAUSE, type ScanCutoff } from '#scripts/git/listing-cutoff'
|
|
3
3
|
import { parse_json_array_safe } from '#scripts/git/parse-json-array'
|
|
4
4
|
import { z } from 'zod'
|
|
@@ -129,8 +129,6 @@ function locally_tracked(snapshot: EpicSnapshot): Array<number> {
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
const epic_audit_orphans = {
|
|
132
|
-
PARENT_MARKERS,
|
|
133
|
-
ORPHAN_SEARCH,
|
|
134
132
|
claimed_numbers,
|
|
135
133
|
claims_parent,
|
|
136
134
|
find_claiming_issues,
|
|
@@ -39,7 +39,10 @@ const REPO_NAME_DOT = '.'
|
|
|
39
39
|
const NO_KNOWN_REPOS: ReadonlySet<string> = new Set()
|
|
40
40
|
// Where a child states what it must deliver. Both spellings, because the bodies are written in
|
|
41
41
|
// whichever language the session was in.
|
|
42
|
-
const ACCEPTANCE_HEADINGS:
|
|
42
|
+
const ACCEPTANCE_HEADINGS: ReadonlySet<string> = new Set([
|
|
43
|
+
'## 受け入れ条件',
|
|
44
|
+
'## Acceptance criteria',
|
|
45
|
+
])
|
|
43
46
|
const HEADING_PREFIX = '## '
|
|
44
47
|
|
|
45
48
|
type FindingLevel = 'error' | 'warning'
|
|
@@ -163,7 +166,7 @@ function parse_references(text: string, repo = ''): Array<number> {
|
|
|
163
166
|
}
|
|
164
167
|
|
|
165
168
|
function is_acceptance_heading(line: string): boolean {
|
|
166
|
-
return ACCEPTANCE_HEADINGS.
|
|
169
|
+
return ACCEPTANCE_HEADINGS.has(line.trim())
|
|
167
170
|
}
|
|
168
171
|
|
|
169
172
|
function is_heading(line: string): boolean {
|
|
@@ -226,13 +229,11 @@ function depends_on(
|
|
|
226
229
|
// a `#` lives in `prefix_before`, so the pattern on its own matches the tail of `owner/repo#12` —
|
|
227
230
|
// the very reading this module exists to prevent.
|
|
228
231
|
const epic_audit_logic = {
|
|
229
|
-
ACCEPTANCE_HEADINGS,
|
|
230
232
|
unique_references,
|
|
231
233
|
known_repos,
|
|
232
234
|
parse_issue_references,
|
|
233
235
|
parse_references,
|
|
234
236
|
acceptance_section,
|
|
235
|
-
collect_blockers,
|
|
236
237
|
depends_on,
|
|
237
238
|
}
|
|
238
239
|
|