@joshuafolkken/kit 1.1050.0 → 1.1128.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/workflow-commands/SKILL.md +20 -12
- package/.claude/skills/workflow-commands/background-commands.md +36 -84
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
- package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +1 -1
- 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 +8 -6
- package/.claude/skills/workflow-commands/halfrun.md +19 -21
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- 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 +8 -16
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +3 -3
- package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
- 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/split-assessment.md +4 -18
- package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-node/action.yml +33 -0
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +2 -3
- package/.github/workflows/ci.yml +31 -134
- package/.github/workflows/dependabot-auto-merge.yml +1 -0
- package/.github/workflows/pr-classification.yml +6 -44
- package/.github/workflows/production.yml +1 -0
- package/.github/workflows/publish.yml +43 -47
- package/.github/workflows/sonar-qube.yml +41 -4
- package/.pnpmfile.mjs +29 -0
- package/AGENTS.md +5 -2
- package/CLAUDE.md +33 -27
- package/GEMINI.md +5 -2
- package/README.md +66 -20
- package/SECURITY.md +37 -6
- package/cspell/index.yaml +6 -1
- package/dist/CLAUDE.basic.md +6 -6
- package/dist/CLAUDE.md +33 -27
- package/dist/CLAUDE.static.md +6 -6
- package/dist/config-merge/index.js +48 -12
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
- package/dist/hooks/codex-hook-adapter.js +12 -48
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +280 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +192 -333
- package/dist/josh.js +240 -148
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +70 -78
- package/eslint/rules/promise.js +5 -0
- package/eslint/rules/unicorn.js +3 -2
- package/package.json +26 -5
- package/pnpm-workspace.yaml +5 -7
- package/prompts/collaboration-workflow/glossary.md +17 -0
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/issue-template.md +1 -1
- package/prompts/collaboration-workflow/operating-rules.md +5 -5
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +3 -3
- package/prompts/collaboration-workflow/rule-delivery.md +1 -1
- package/prompts/collaboration-workflow/turn-batching.md +3 -3
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +25 -22
- package/prompts/collaboration-workflow.md +6 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +11 -3
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +0 -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 +6 -16
- package/scripts/backlog/backlog-arrival.ts +30 -10
- package/scripts/backlog/backlog-budget-cli.ts +15 -16
- 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 +9 -15
- package/scripts/backlog/backlog-offer-cli.ts +6 -19
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +30 -19
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +39 -10
- 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 +5 -2
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +85 -9
- 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/parse-jsonc.ts +33 -3
- package/scripts/config-merge/patch-json-key.ts +13 -6
- 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 +3 -10
- 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 +0 -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 +6 -10
- package/scripts/doctor/doctor-io.ts +9 -13
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/backlogrun-parent-read-set.ts +12 -1
- package/scripts/document/document-byte-budget.ts +5 -5
- 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 +21 -7
- package/scripts/document/entry-read-set.ts +32 -8
- package/scripts/document/lane-child-read-set.ts +8 -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 +9 -3
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +4 -2
- 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 +8 -22
- 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 +9 -8
- 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 +2 -2
- 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 +3 -2
- 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 +13 -10
- 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-issue-write.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
- 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 +6 -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-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +2 -2
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn-sync.ts +65 -0
- package/scripts/git/git-spawn.ts +5 -4
- 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 +1 -0
- 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} +2 -7
- 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-file.ts +2 -0
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard.ts +22 -4
- 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-file-action.ts +54 -0
- package/scripts/init/init-logic-migrate.ts +35 -17
- package/scripts/init/init-logic-secretlint.ts +1 -1
- package/scripts/init/init-logic.ts +10 -19
- package/scripts/init/init.ts +11 -71
- package/scripts/init/kit-written-paths.ts +2 -0
- package/scripts/init/project-profile.ts +9 -17
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +3 -1
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +64 -23
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +3 -3
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-backlinks.ts +7 -14
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +12 -8
- 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 +7 -14
- 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 +8 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/{git → issue}/issue-rank.ts +1 -1
- 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 +21 -6
- package/scripts/issue/measure-rerun-cli.ts +74 -15
- 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 -0
- 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 +8 -1
- 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 +3 -3
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/run-github-prerequisite.ts +3 -6
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +46 -19
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-cli.ts +1 -4
- package/scripts/lane/lane-close.ts +5 -4
- 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 +31 -27
- 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/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 +7 -1
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/cli-flags.ts +31 -2
- package/scripts/lib/error-message.ts +12 -1
- 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/line-targets.ts +0 -11
- package/scripts/lines/lines-command.ts +5 -4
- 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 +3 -10
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +0 -2
- package/scripts/propagate/propagate-steps.ts +3 -5
- package/scripts/propagate/propagate-targets.ts +0 -4
- package/scripts/propagate/propagate.ts +0 -4
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +28 -21
- package/scripts/registry-migration/migrate.ts +25 -14
- package/scripts/release/github-release-cli.ts +19 -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 +38 -5
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/release/release-worktree.ts +97 -2
- 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 +4 -16
- package/scripts/review/review-brief-cli.ts +23 -6
- package/scripts/review/review-brief.ts +21 -8
- package/scripts/review/review-checkout.ts +3 -2
- 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 +10 -17
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +0 -3
- 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/early-heartbeat.ts +4 -3
- 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 +0 -1
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-park.ts +22 -6
- 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/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 +20 -9
- 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-args.ts +8 -12
- 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-args.ts +1 -6
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +2 -6
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +133 -25
- package/scripts/run/run-entry-stop.ts +104 -0
- 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-emit.ts +7 -2
- 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 +2 -2
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +29 -6
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +2 -6
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +7 -23
- 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 +4 -2
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +6 -3
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-args.ts +20 -4
- package/scripts/run/run-progress-cli.ts +35 -36
- package/scripts/run/run-progress-clock.ts +10 -35
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +1 -2
- package/scripts/run/run-progress.ts +1 -2
- 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 +29 -19
- 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 +1 -1
- package/scripts/run/run-ship-probe.ts +4 -1
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +18 -4
- package/scripts/run/run-ship-review.ts +11 -0
- package/scripts/run/run-ship-scoped.ts +1 -0
- package/scripts/run/run-ship-steps.ts +1 -1
- package/scripts/run/run-ship.ts +0 -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 +3 -16
- 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 +6 -2
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -13
- 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 +18 -12
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/pack-hook.ts +92 -0
- 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-ai-files.ts +4 -0
- 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-changed.ts +13 -16
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +3 -9
- 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 +0 -1
- 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 +2 -2
- 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 +11 -1
- package/scripts/version/version-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/CLAUDE.basic.md +6 -6
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/ci.yml +16 -82
- package/templates/workflows/dependabot-auto-merge.yml +6 -3
- package/templates/workflows/github-release.yml +79 -0
- package/tsconfig.sonar.json +4 -22
- 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.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,10 +1,9 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
4
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
5
|
import { file_reader } from '#scripts/lib/read-file'
|
|
4
|
-
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
|
-
import { execaSync } from 'execa'
|
|
8
7
|
import { z } from 'zod'
|
|
9
8
|
|
|
10
9
|
// The consumer-setup checks `josh doctor` runs in a repository that installs kit (joshuafolkken/kit#1930).
|
|
@@ -40,7 +39,7 @@ type ClaudeMdState = typeof STATE_OK | typeof STATE_TARGET_MISSING | typeof STAT
|
|
|
40
39
|
function parse_manifest(root: string): ManifestShape | undefined {
|
|
41
40
|
const content = file_reader.read_if_readable(path.join(root, 'package.json'))
|
|
42
41
|
if (content === undefined) return undefined
|
|
43
|
-
const parsed = manifest_schema.safeParse(
|
|
42
|
+
const parsed = manifest_schema.safeParse(json_value.parse_or_undefined(content))
|
|
44
43
|
|
|
45
44
|
return parsed.success ? parsed.data : undefined
|
|
46
45
|
}
|
|
@@ -69,7 +68,7 @@ function is_kit_consumer(root: string): boolean {
|
|
|
69
68
|
function is_plugin_declared(root: string): boolean {
|
|
70
69
|
const content = file_reader.read_if_readable(path.join(root, SETTINGS_PATH))
|
|
71
70
|
if (content === undefined) return false
|
|
72
|
-
const parsed = settings_schema.safeParse(
|
|
71
|
+
const parsed = settings_schema.safeParse(json_value.parse_or_undefined(content))
|
|
73
72
|
|
|
74
73
|
return parsed.success && parsed.data.enabledPlugins?.[PLUGIN_ID] === true
|
|
75
74
|
}
|
|
@@ -77,11 +76,9 @@ function is_plugin_declared(root: string): boolean {
|
|
|
77
76
|
// The value of `core.hooksPath`, or undefined when it is unset. A set value is what stops lefthook
|
|
78
77
|
// from installing kit's git hooks — the failure is silent but for one stderr line.
|
|
79
78
|
function configured_hooks_path(root: string): string | undefined {
|
|
80
|
-
const
|
|
81
|
-
reject: false,
|
|
79
|
+
const value = git_spawn_sync.read(['-C', root, 'config', '--get', 'core.hooksPath'], {
|
|
82
80
|
timeout: GIT_TIMEOUT_MS,
|
|
83
81
|
})
|
|
84
|
-
const value = read_spawn_stdout(result).trim()
|
|
85
82
|
|
|
86
83
|
return value === '' ? undefined : value
|
|
87
84
|
}
|
|
@@ -107,7 +104,7 @@ function status_line(is_ok: boolean, ok_text: string, warn_text: string): string
|
|
|
107
104
|
function plugin_line(is_declared: boolean): string {
|
|
108
105
|
return status_line(
|
|
109
106
|
is_declared,
|
|
110
|
-
|
|
107
|
+
'kit plugin declared (skills load in a trusted workspace; headless from its second session)',
|
|
111
108
|
'kit plugin not declared in .claude/settings.json — run `pnpm josh sync`',
|
|
112
109
|
)
|
|
113
110
|
}
|
|
@@ -160,7 +157,6 @@ const doctor_consumer = {
|
|
|
160
157
|
claude_md_line,
|
|
161
158
|
claude_md_state,
|
|
162
159
|
configured_hooks_path,
|
|
163
|
-
consumer_setup_lines,
|
|
164
160
|
hooks_path_line,
|
|
165
161
|
is_kit_consumer,
|
|
166
162
|
is_plugin_declared,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
-
import {
|
|
3
|
+
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
4
|
+
import { read_spawn_stdout } from '#scripts/lib/spawn-exit'
|
|
4
5
|
import { execaSync } from 'execa'
|
|
5
6
|
import { doctor_logic } from './doctor-logic'
|
|
6
7
|
|
|
@@ -69,18 +70,13 @@ function classify_git_failure(exit_code: number | undefined, stderr: string): Gi
|
|
|
69
70
|
// caller's check, because reporting an unknown as a clean result is the false all-clear
|
|
70
71
|
// joshuafolkken/kit#805 exists to remove. See the two classifiers above for what proves what.
|
|
71
72
|
function resolve_git_top_level(): GitTopLevel {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
if (result.exitCode === 0) return classify_top_level(read_spawn_stdout(result).trim())
|
|
82
|
-
|
|
83
|
-
return classify_git_failure(result.exitCode, read_spawn_stderr(result))
|
|
73
|
+
// The C locale `toplevel` asks under is what keeps the stderr match below from failing on a
|
|
74
|
+
// translated message and bringing the spurious warning back.
|
|
75
|
+
const result = git_spawn_sync.toplevel(GIT_TIMEOUT_MS)
|
|
76
|
+
|
|
77
|
+
if (result.exit_code === 0) return classify_top_level(result.stdout.trim())
|
|
78
|
+
|
|
79
|
+
return classify_git_failure(result.exit_code, result.stderr)
|
|
84
80
|
}
|
|
85
81
|
|
|
86
82
|
// Whether one line is the setting itself rather than prose about it. kit's own template explains the
|
|
@@ -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
|
|
|
@@ -34,15 +34,26 @@ const UNUSED_SKILL_SECTIONS: ReadonlyArray<string> = [
|
|
|
34
34
|
// the park — so it drops none. Named empty so the shared trim reads the same shape as the worker's.
|
|
35
35
|
const SKIPPED_POINT_OF_USE: ReadonlySet<string> = new Set<string>()
|
|
36
36
|
|
|
37
|
+
// **The parent runs the end-of-run retrospective** (`SKILL.md` §2j) when `run:step` prints it, but its
|
|
38
|
+
// manifest names `retrospective.md` only through `backlogrun-steps.md` — one hop further than the
|
|
39
|
+
// derivation follows — so the parent's reach names it (joshuafolkken/kit#3078).
|
|
40
|
+
const REACHED_POINT_OF_USE: ReadonlySet<string> = new Set(['retrospective.md'])
|
|
41
|
+
|
|
37
42
|
function costed(root: string): ReadSetCost {
|
|
38
43
|
return read_set_trim.costed(root, {
|
|
39
44
|
base_entry: BACKLOGRUN,
|
|
40
45
|
label: BACKLOGRUN,
|
|
41
46
|
unused_skill_sections: UNUSED_SKILL_SECTIONS,
|
|
42
47
|
skipped_point_of_use: SKIPPED_POINT_OF_USE,
|
|
48
|
+
reached_point_of_use: REACHED_POINT_OF_USE,
|
|
43
49
|
})
|
|
44
50
|
}
|
|
45
51
|
|
|
46
|
-
const backlogrun_parent_read_set = {
|
|
52
|
+
const backlogrun_parent_read_set = {
|
|
53
|
+
BACKLOGRUN,
|
|
54
|
+
REACHED_POINT_OF_USE,
|
|
55
|
+
UNUSED_SKILL_SECTIONS,
|
|
56
|
+
costed,
|
|
57
|
+
}
|
|
47
58
|
|
|
48
59
|
export { backlogrun_parent_read_set }
|
|
@@ -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:
|
|
@@ -81,14 +81,14 @@ 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 },
|
|
91
|
+
{ path: 'prompts/collaboration-workflow/glossary.md', bytes: 4096 },
|
|
92
92
|
{ path: 'prompts/collaboration-workflow/issue-citation.md', bytes: 8192 },
|
|
93
93
|
// #2662 adds the feature and compatibility declarations to the canonical filing procedure.
|
|
94
94
|
{ path: 'prompts/collaboration-workflow/issue-template.md', bytes: 28_672 },
|
|
@@ -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
|
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
//
|
|
4
4
|
// **The per-document ceiling was a proxy for a run's cost, not the cost.** A run does not pay "one
|
|
5
5
|
// document's size"; it pays the total its entry reads — the mandated skill files, the sections they
|
|
6
|
-
// point out to, the point-of-use documents
|
|
7
|
-
// carries. `read:set`
|
|
6
|
+
// point out to, the point-of-use documents that entry reaches later, and the resident `CLAUDE.md` every
|
|
7
|
+
// request carries. `read:set`'s `total read` is that sum less `CLAUDE.md`, which `entry_total_bytes`
|
|
8
|
+
// adds back (`RESIDENT_BASE`), so this budgets the whole directly: the entry total is
|
|
8
9
|
// the primary ceiling, and the per-document ceiling (`document-byte-budget.ts`) falls back to the
|
|
9
10
|
// documents no entry reads (`document-reachability.ts` draws the line). A document an entry reads is
|
|
10
11
|
// held by the entry total and carries no per-document ceiling, so neither budget holds it twice.
|
|
@@ -69,7 +70,7 @@ const ENTRY_READ_BUDGET: ReadonlyArray<EntryBudget> = [
|
|
|
69
70
|
// list, so its ~48KB read crossed a block downward and the recorded ceiling drops to the block multiple
|
|
70
71
|
// the stale-ratchet message named. The other entries still read it, so their rows hold.
|
|
71
72
|
// 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
|
|
73
|
+
// `docs/josh-commands-automation.md` → "`josh fanout`"); `SKILL.md` §2b gained only a one-clause mention and a
|
|
73
74
|
// pointer, folded into the existing enumeration and offset by tightening §2b prose, so every entry
|
|
74
75
|
// stayed within its block (kickoff has no block of headroom — its pre-#2294 ceiling is the next
|
|
75
76
|
// multiple, which the downward ratchet holds shut).
|
|
@@ -79,10 +80,23 @@ const ENTRY_READ_BUDGET: ReadonlyArray<EntryBudget> = [
|
|
|
79
80
|
// joshuafolkken/kit#2762 moved the rationale of five point-of-use documents to
|
|
80
81
|
// `docs/maintainers/*-rationale.md`, and the ratchet holds the reduction. joshuafolkken/kit#2895 did
|
|
81
82
|
// the same for eight more, lowering fullrun, halfrun and backlogrun one block each.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
// joshuafolkken/kit#2998 split the command reference, so every reference to an automation command
|
|
84
|
+
// now names `josh-commands-automation.md`; the longer path tipped backlogrun one block over.
|
|
85
|
+
// joshuafolkken/kit#2994 moved `CLAUDE.md`'s explanations to `docs/maintainers/claude-md-history.md`,
|
|
86
|
+
// lowering backlogrun one block; kickoff's reduction was offset by joshuafolkken/kit#3024's longer
|
|
87
|
+
// `wip-cap.md`, so its ceiling stays.
|
|
88
|
+
// joshuafolkken/kit#3023 added the `prrun` keyword to `SKILL.md` and `CLAUDE.md`, tipping backlogrun
|
|
89
|
+
// one block over; `prrun` reads `fullrun`'s set plus its own short manifest.
|
|
90
|
+
// Lowered in joshuafolkken/kit#3078 — a correction of an over-count, not a trim: every entry was
|
|
91
|
+
// charged for every global point-of-use document, so `kickoff` paid for `followup.md` and the
|
|
92
|
+
// `backlogrun-*` phase documents it never opens. Each total now counts only what its path reaches.
|
|
93
|
+
// joshuafolkken/kit#3077 trimmed non-resident rule bodies from `CLAUDE.md`, lowering fullrun, prrun
|
|
94
|
+
// and backlogrun one block each.
|
|
95
|
+
{ entry: 'kickoff', bytes: 65_536 },
|
|
96
|
+
{ entry: 'fullrun', bytes: 126_976 },
|
|
97
|
+
{ entry: 'halfrun', bytes: 106_496 },
|
|
98
|
+
{ entry: 'prrun', bytes: 131_072 },
|
|
99
|
+
{ entry: 'backlogrun', bytes: 212_992 },
|
|
86
100
|
{ entry: LANE_CHILD, bytes: 77_824 },
|
|
87
101
|
]
|
|
88
102
|
|
|
@@ -420,16 +420,40 @@ function point_of_use_cost(
|
|
|
420
420
|
return { file, heading: '', cost: cost_of(read_document(root, file)), is_resolved: true }
|
|
421
421
|
}
|
|
422
422
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
423
|
+
// **What an entry's path names: its own manifests, and the §1 trigger rows that name the entry**
|
|
424
|
+
// (joshuafolkken/kit#3078). `SKILL.md`'s other text is left out for the reason `sections_for` gives —
|
|
425
|
+
// §2 names every document, so counting it would charge a `kickoff` for `followup.md`. One hop only:
|
|
426
|
+
// the point-of-use documents cite one another, and following them would reach the whole set again.
|
|
427
|
+
// `also` is what a role reaches beside its base entry's path (`read-set-trim.ts`).
|
|
428
|
+
function cited_by(
|
|
429
|
+
root: string,
|
|
430
|
+
entry: string,
|
|
431
|
+
table_text: string,
|
|
432
|
+
also: ReadonlySet<string>,
|
|
433
|
+
): Set<string> {
|
|
434
|
+
const manifests = files_for(root, entry).filter((file) => file !== SKILL_FILE)
|
|
435
|
+
const rows = table_text
|
|
436
|
+
.split('\n')
|
|
437
|
+
.filter((line) => line.startsWith('|') && line.includes(`\`${entry}\``))
|
|
438
|
+
const texts = [...manifests.map((file) => read_document(root, file)), ...rows]
|
|
439
|
+
|
|
440
|
+
return new Set([...also, ...texts.flatMap((text) => names_in(text))])
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function point_of_use_costs(
|
|
444
|
+
root: string,
|
|
445
|
+
entry: string,
|
|
446
|
+
also: ReadonlySet<string>,
|
|
447
|
+
): Array<SectionCost> {
|
|
448
|
+
const table_text =
|
|
449
|
+
document_section.section(read_document(root, SKILL_FILE), TABLE_SECTION)?.text ?? ''
|
|
450
|
+
const references = all_matches(table_text, SECTION_REFERENCE).map((match) => to_reference(match))
|
|
451
|
+
const cited = cited_by(root, entry, table_text, also)
|
|
428
452
|
|
|
429
|
-
return point_of_use_files(entry).map((file) => point_of_use_cost(root, file, references))
|
|
453
|
+
return point_of_use_files(entry, cited).map((file) => point_of_use_cost(root, file, references))
|
|
430
454
|
}
|
|
431
455
|
|
|
432
|
-
function costed(root: string, entry: string): ReadSetCost {
|
|
456
|
+
function costed(root: string, entry: string, also: ReadonlySet<string> = new Set()): ReadSetCost {
|
|
433
457
|
const { files, sections } = read_set(root, entry)
|
|
434
458
|
const own_costs = file_costs(root, files)
|
|
435
459
|
const section_costs = sections.map((reference) => section_cost(root, reference))
|
|
@@ -439,7 +463,7 @@ function costed(root: string, entry: string): ReadSetCost {
|
|
|
439
463
|
entry,
|
|
440
464
|
files: own_costs,
|
|
441
465
|
sections: section_costs,
|
|
442
|
-
point_of_use: point_of_use_costs(root, entry),
|
|
466
|
+
point_of_use: point_of_use_costs(root, entry, also),
|
|
443
467
|
bash_output_cap: bash_output_cap_reader.bash_output_cap(root),
|
|
444
468
|
whole: total([own, referenced_cost(root, sections)]),
|
|
445
469
|
scoped: total([own, scoped_cost(root, sections)]),
|
|
@@ -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'
|
|
@@ -64,25 +64,27 @@ const SKIPPED_POINT_OF_USE: ReadonlySet<string> = new Set([
|
|
|
64
64
|
'retrospective.md',
|
|
65
65
|
])
|
|
66
66
|
|
|
67
|
+
// **A child that parks reads `backlogrun-park.md`** (`SKILL.md` §1, "A lane child that parks"), a
|
|
68
|
+
// document a standalone `fullrun`'s path never names — so the child's reach adds it to its base
|
|
69
|
+
// entry's (joshuafolkken/kit#3078).
|
|
70
|
+
const REACHED_POINT_OF_USE: ReadonlySet<string> = new Set(['backlogrun-park.md'])
|
|
71
|
+
|
|
67
72
|
function costed(root: string): ReadSetCost {
|
|
68
73
|
return read_set_trim.costed(root, {
|
|
69
74
|
base_entry: FULLRUN,
|
|
70
75
|
label: LANE_CHILD,
|
|
71
76
|
unused_skill_sections: UNUSED_SKILL_SECTIONS,
|
|
72
77
|
skipped_point_of_use: SKIPPED_POINT_OF_USE,
|
|
78
|
+
reached_point_of_use: REACHED_POINT_OF_USE,
|
|
73
79
|
})
|
|
74
80
|
}
|
|
75
81
|
|
|
76
|
-
function unused_skill_cost(root: string): Cost {
|
|
77
|
-
return read_set_trim.unused_skill_cost(root, UNUSED_SKILL_SECTIONS)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
82
|
const lane_child_read_set = {
|
|
81
83
|
LANE_CHILD,
|
|
84
|
+
REACHED_POINT_OF_USE,
|
|
82
85
|
SKIPPED_POINT_OF_USE,
|
|
83
86
|
UNUSED_SKILL_SECTIONS,
|
|
84
87
|
costed,
|
|
85
|
-
unused_skill_cost,
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
export { lane_child_read_set }
|