@joshuafolkken/kit 1.872.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/.claude-plugin/plugin.json +11 -0
- package/.claude/settings.json +110 -0
- package/.claude/skills/dependency-update/SKILL.md +76 -0
- package/.claude/skills/epic-commands/SKILL.md +463 -0
- package/.claude/skills/verify-ui/SKILL.md +96 -0
- package/.claude/skills/workflow-commands/SKILL.md +265 -0
- package/.claude/skills/workflow-commands/background-commands.md +130 -0
- package/.claude/skills/workflow-commands/backlogrun-child.md +364 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +345 -0
- package/.claude/skills/workflow-commands/backlogrun-park.md +179 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +600 -0
- package/.claude/skills/workflow-commands/backlogrun-steps.md +604 -0
- package/.claude/skills/workflow-commands/backlogrun.md +109 -0
- package/.claude/skills/workflow-commands/chain-rule.md +98 -0
- package/.claude/skills/workflow-commands/delegation.md +52 -0
- package/.claude/skills/workflow-commands/followup-reference.md +118 -0
- package/.claude/skills/workflow-commands/followup.md +222 -0
- package/.claude/skills/workflow-commands/fullrun-steps.md +93 -0
- package/.claude/skills/workflow-commands/fullrun.md +82 -0
- package/.claude/skills/workflow-commands/halfrun.md +73 -0
- package/.claude/skills/workflow-commands/into-target.md +48 -0
- package/.claude/skills/workflow-commands/issue-comments.md +109 -0
- package/.claude/skills/workflow-commands/issue-fold-existing.md +27 -0
- package/.claude/skills/workflow-commands/issue-scout.md +45 -0
- package/.claude/skills/workflow-commands/kickoff.md +82 -0
- package/.claude/skills/workflow-commands/latest-gate.md +85 -0
- package/.claude/skills/workflow-commands/needs-human-review.md +64 -0
- package/.claude/skills/workflow-commands/observation-filing.md +349 -0
- package/.claude/skills/workflow-commands/pre-gate-cut.md +340 -0
- package/.claude/skills/workflow-commands/prerequisite.md +62 -0
- package/.claude/skills/workflow-commands/retrospective.md +81 -0
- package/.claude/skills/workflow-commands/rule-residency.md +267 -0
- package/.claude/skills/workflow-commands/split-assessment.md +130 -0
- package/.claude/skills/workflow-commands/target-repository.md +58 -0
- package/.claude/skills/workflow-commands/working-tree-hold.md +66 -0
- package/.claude-plugin/marketplace.json +15 -0
- package/.coderabbit.yaml +50 -0
- package/.codex/config.toml +8 -0
- package/.codex/hooks.json +71 -0
- package/.cursorrules +45 -0
- package/.gitattributes +7 -0
- package/.github/dependabot.yml +19 -0
- package/.github/pull_request_template.md +1 -0
- package/.github/release.yml +18 -0
- package/.github/workflows/auto-tag.yml +111 -0
- package/.github/workflows/ci.yml +681 -0
- package/.github/workflows/dependabot-auto-merge.yml +55 -0
- package/.github/workflows/production.yml +47 -0
- package/.github/workflows/publish.yml +39 -0
- package/.github/workflows/sonar-qube.yml +34 -0
- package/.mcp.json +8 -0
- package/.ncurc.json +3 -0
- package/.prettierignore +20 -0
- package/.vscode/extensions.json +21 -0
- package/.vscode/settings.json +41 -0
- package/AGENTS.md +29 -0
- package/CLAUDE.md +207 -0
- package/CODE_OF_CONDUCT.md +132 -0
- package/GEMINI.md +30 -0
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/SECURITY.md +34 -0
- package/cspell/index.yaml +177 -0
- package/dist/CLAUDE.md +207 -0
- package/dist/config-merge/index.d.ts +29 -0
- package/dist/config-merge/index.js +459 -0
- package/dist/hooks/batch-guard.js +28 -0
- package/dist/hooks/chunk-25JL6FMS.js +4970 -0
- package/dist/hooks/chunk-2ANGT3XM.js +375 -0
- package/dist/hooks/chunk-2EI5GBSW.js +42 -0
- package/dist/hooks/chunk-2OT5XE2N.js +5014 -0
- package/dist/hooks/chunk-2RUPMGGV.js +137 -0
- package/dist/hooks/chunk-2XIGZQMQ.js +3299 -0
- package/dist/hooks/chunk-33ELOKEV.js +910 -0
- package/dist/hooks/chunk-33YRTKM7.js +230 -0
- package/dist/hooks/chunk-36JQU5NN.js +77 -0
- package/dist/hooks/chunk-3EJBTWVS.js +1769 -0
- package/dist/hooks/chunk-3FK5SFAC.js +432 -0
- package/dist/hooks/chunk-3PWPYDD2.js +240 -0
- package/dist/hooks/chunk-3TQU7TDH.js +375 -0
- package/dist/hooks/chunk-3TVLSFZ6.js +432 -0
- package/dist/hooks/chunk-3VXYCB4E.js +77 -0
- package/dist/hooks/chunk-44M6JXGV.js +3398 -0
- package/dist/hooks/chunk-46EEEHC3.js +240 -0
- package/dist/hooks/chunk-4A7UVP2P.js +364 -0
- package/dist/hooks/chunk-4LFQEZS4.js +137 -0
- package/dist/hooks/chunk-4OCX3V2T.js +469 -0
- package/dist/hooks/chunk-4OHA5DE7.js +49 -0
- package/dist/hooks/chunk-4PMDW3YD.js +68 -0
- package/dist/hooks/chunk-4QHBNAI4.js +68 -0
- package/dist/hooks/chunk-4SSB3FEE.js +3273 -0
- package/dist/hooks/chunk-5A2WQ2CQ.js +5390 -0
- package/dist/hooks/chunk-5EVA2JQB.js +5390 -0
- package/dist/hooks/chunk-5P7VF5VE.js +3230 -0
- package/dist/hooks/chunk-5QWJGGZP.js +49 -0
- package/dist/hooks/chunk-5U5EZYG6.js +77 -0
- package/dist/hooks/chunk-5VUUF3ZV.js +240 -0
- package/dist/hooks/chunk-5WA7UBT3.js +374 -0
- package/dist/hooks/chunk-6EBGRQ3Q.js +301 -0
- package/dist/hooks/chunk-6TVHWMD3.js +432 -0
- package/dist/hooks/chunk-6V5OPIUU.js +13 -0
- package/dist/hooks/chunk-6VAGLEMB.js +68 -0
- package/dist/hooks/chunk-75BTXKFJ.js +3424 -0
- package/dist/hooks/chunk-75RHN67S.js +137 -0
- package/dist/hooks/chunk-76KC3BDD.js +3414 -0
- package/dist/hooks/chunk-76SLS7CZ.js +898 -0
- package/dist/hooks/chunk-7DHZ4DWT.js +5015 -0
- package/dist/hooks/chunk-7INSJDGE.js +458 -0
- package/dist/hooks/chunk-7VJ4FTDX.js +268 -0
- package/dist/hooks/chunk-7XCYNHQK.js +77 -0
- package/dist/hooks/chunk-A5YJ3H7E.js +375 -0
- package/dist/hooks/chunk-AAEXXUUL.js +268 -0
- package/dist/hooks/chunk-ABVEVV2M.js +432 -0
- package/dist/hooks/chunk-ACN3YXFL.js +68 -0
- package/dist/hooks/chunk-AD3XE3QZ.js +397 -0
- package/dist/hooks/chunk-AENFZPZH.js +230 -0
- package/dist/hooks/chunk-AFKRFQ6W.js +68 -0
- package/dist/hooks/chunk-AHD5IPWI.js +375 -0
- package/dist/hooks/chunk-AMK5JGV7.js +77 -0
- package/dist/hooks/chunk-ARN7NCQI.js +425 -0
- package/dist/hooks/chunk-AUFY653N.js +3425 -0
- package/dist/hooks/chunk-AXQBNFEF.js +375 -0
- package/dist/hooks/chunk-AYC7R6U4.js +3316 -0
- package/dist/hooks/chunk-AYEA2FJ7.js +5015 -0
- package/dist/hooks/chunk-B2LIXYFL.js +77 -0
- package/dist/hooks/chunk-B4HPNY2I.js +375 -0
- package/dist/hooks/chunk-B4YNCUGB.js +469 -0
- package/dist/hooks/chunk-B57S3VWT.js +922 -0
- package/dist/hooks/chunk-BINZ3PLI.js +364 -0
- package/dist/hooks/chunk-BIWLABFK.js +432 -0
- package/dist/hooks/chunk-BODUSXKK.js +410 -0
- package/dist/hooks/chunk-BQBAT2YK.js +375 -0
- package/dist/hooks/chunk-BUJEBW75.js +391 -0
- package/dist/hooks/chunk-BVNWORKA.js +72 -0
- package/dist/hooks/chunk-BWI47LQS.js +5205 -0
- package/dist/hooks/chunk-C25HRMJX.js +137 -0
- package/dist/hooks/chunk-CBFZNC74.js +375 -0
- package/dist/hooks/chunk-CECYXS4Y.js +3424 -0
- package/dist/hooks/chunk-CELGUP5F.js +49 -0
- package/dist/hooks/chunk-CMHANU3F.js +3442 -0
- package/dist/hooks/chunk-CMN372LI.js +68 -0
- package/dist/hooks/chunk-CPGZLMMK.js +3299 -0
- package/dist/hooks/chunk-CTQKXDC7.js +268 -0
- package/dist/hooks/chunk-CYAT4RIT.js +68 -0
- package/dist/hooks/chunk-CYTWYCH2.js +5014 -0
- package/dist/hooks/chunk-CZSOLRBA.js +77 -0
- package/dist/hooks/chunk-D2PIDYJR.js +3438 -0
- package/dist/hooks/chunk-DE57HI6T.js +137 -0
- package/dist/hooks/chunk-DGXDGAPG.js +5306 -0
- package/dist/hooks/chunk-DNYRSYQG.js +5014 -0
- package/dist/hooks/chunk-DTAXH2A2.js +240 -0
- package/dist/hooks/chunk-E2IZUWI5.js +375 -0
- package/dist/hooks/chunk-E4L2K2BL.js +397 -0
- package/dist/hooks/chunk-E55NKX5F.js +68 -0
- package/dist/hooks/chunk-ECXVCCVD.js +3079 -0
- package/dist/hooks/chunk-EPHO443D.js +68 -0
- package/dist/hooks/chunk-EUFK2BI2.js +375 -0
- package/dist/hooks/chunk-EYCD5ZAV.js +137 -0
- package/dist/hooks/chunk-F2SDYJU4.js +240 -0
- package/dist/hooks/chunk-F4B5D5TF.js +68 -0
- package/dist/hooks/chunk-FGEO3NDX.js +432 -0
- package/dist/hooks/chunk-FJYI52RE.js +137 -0
- package/dist/hooks/chunk-FXAKJKTB.js +18 -0
- package/dist/hooks/chunk-FYTZHIY4.js +3085 -0
- package/dist/hooks/chunk-G7JL2A5K.js +375 -0
- package/dist/hooks/chunk-GA3ITDBW.js +42 -0
- package/dist/hooks/chunk-GDR4H4SV.js +469 -0
- package/dist/hooks/chunk-GFKDXPSM.js +2855 -0
- package/dist/hooks/chunk-GIMRTKFU.js +566 -0
- package/dist/hooks/chunk-GOPHRLGO.js +240 -0
- package/dist/hooks/chunk-GX4HO7SJ.js +230 -0
- package/dist/hooks/chunk-GXKKK23T.js +240 -0
- package/dist/hooks/chunk-GZ6FUVIK.js +566 -0
- package/dist/hooks/chunk-H5HPY5M5.js +2869 -0
- package/dist/hooks/chunk-HCF3OGEE.js +1829 -0
- package/dist/hooks/chunk-HDEXAOUM.js +469 -0
- package/dist/hooks/chunk-HM2TY3TN.js +469 -0
- package/dist/hooks/chunk-HOA7NXA2.js +55 -0
- package/dist/hooks/chunk-HOFEWH6H.js +240 -0
- package/dist/hooks/chunk-HUUI6S5J.js +2669 -0
- package/dist/hooks/chunk-I4D3NVUD.js +469 -0
- package/dist/hooks/chunk-I4Q6WAJE.js +68 -0
- package/dist/hooks/chunk-IB6N4CR2.js +432 -0
- package/dist/hooks/chunk-IFLDYJMD.js +469 -0
- package/dist/hooks/chunk-IGU466YD.js +77 -0
- package/dist/hooks/chunk-IJCQUHKY.js +375 -0
- package/dist/hooks/chunk-IKUMBDJB.js +230 -0
- package/dist/hooks/chunk-IM3BDIBJ.js +5005 -0
- package/dist/hooks/chunk-IMYMAODK.js +3431 -0
- package/dist/hooks/chunk-IN2ZVGXA.js +5005 -0
- package/dist/hooks/chunk-ITVJ2MKQ.js +18 -0
- package/dist/hooks/chunk-J5RIJYTM.js +2669 -0
- package/dist/hooks/chunk-JFLMH4K5.js +3460 -0
- package/dist/hooks/chunk-JR25IFML.js +77 -0
- package/dist/hooks/chunk-JT5AUXFI.js +432 -0
- package/dist/hooks/chunk-JY5YVN6N.js +3234 -0
- package/dist/hooks/chunk-K5Q4ETVI.js +391 -0
- package/dist/hooks/chunk-K67V2F24.js +137 -0
- package/dist/hooks/chunk-KABG6AEW.js +3460 -0
- package/dist/hooks/chunk-KATZESEC.js +3273 -0
- package/dist/hooks/chunk-KFH4H7W7.js +469 -0
- package/dist/hooks/chunk-KMUEI6RX.js +910 -0
- package/dist/hooks/chunk-KMV4OY77.js +3438 -0
- package/dist/hooks/chunk-KQAZNWEY.js +137 -0
- package/dist/hooks/chunk-KZZR6JER.js +5015 -0
- package/dist/hooks/chunk-LAR6DREP.js +77 -0
- package/dist/hooks/chunk-LNCJWEZD.js +5015 -0
- package/dist/hooks/chunk-LRYD2GLM.js +6 -0
- package/dist/hooks/chunk-LXBKYHDV.js +77 -0
- package/dist/hooks/chunk-LYLKIUNE.js +5024 -0
- package/dist/hooks/chunk-LZKCFOVC.js +432 -0
- package/dist/hooks/chunk-M4FCIYRI.js +77 -0
- package/dist/hooks/chunk-M5M7327Q.js +3425 -0
- package/dist/hooks/chunk-MF72MHSX.js +3455 -0
- package/dist/hooks/chunk-MK56LKDO.js +397 -0
- package/dist/hooks/chunk-N3MJADY7.js +240 -0
- package/dist/hooks/chunk-NFQSUDBN.js +458 -0
- package/dist/hooks/chunk-NHREKY45.js +137 -0
- package/dist/hooks/chunk-NP5TTAAW.js +375 -0
- package/dist/hooks/chunk-NQTLTKTJ.js +2993 -0
- package/dist/hooks/chunk-NVRCZPBZ.js +391 -0
- package/dist/hooks/chunk-O46HMMLJ.js +469 -0
- package/dist/hooks/chunk-OFJGH2L4.js +240 -0
- package/dist/hooks/chunk-OLFMCZH5.js +240 -0
- package/dist/hooks/chunk-OMCZS46I.js +49 -0
- package/dist/hooks/chunk-OQZEZW5G.js +469 -0
- package/dist/hooks/chunk-P2MDAT2Y.js +1897 -0
- package/dist/hooks/chunk-P3M2JJIF.js +68 -0
- package/dist/hooks/chunk-PDVHQITQ.js +3453 -0
- package/dist/hooks/chunk-PNT2AMDH.js +391 -0
- package/dist/hooks/chunk-PR2LVSY6.js +3445 -0
- package/dist/hooks/chunk-PRR5R4JK.js +137 -0
- package/dist/hooks/chunk-PXT44QVN.js +566 -0
- package/dist/hooks/chunk-PZLWJLAP.js +469 -0
- package/dist/hooks/chunk-Q2FEAZJ2.js +77 -0
- package/dist/hooks/chunk-Q32WETDO.js +3265 -0
- package/dist/hooks/chunk-Q45DUBLE.js +3600 -0
- package/dist/hooks/chunk-Q7NZSWQ5.js +240 -0
- package/dist/hooks/chunk-QH2JNAMK.js +3085 -0
- package/dist/hooks/chunk-QNNWYQ2R.js +375 -0
- package/dist/hooks/chunk-QPU5H2OS.js +68 -0
- package/dist/hooks/chunk-QRAHZ5TO.js +1829 -0
- package/dist/hooks/chunk-QUZ5HPIE.js +469 -0
- package/dist/hooks/chunk-QVCRG34O.js +2893 -0
- package/dist/hooks/chunk-R3MY4E3S.js +1675 -0
- package/dist/hooks/chunk-R6TXJJXP.js +77 -0
- package/dist/hooks/chunk-REJU6VT7.js +1829 -0
- package/dist/hooks/chunk-REQAQLRC.js +2993 -0
- package/dist/hooks/chunk-RFCXPAHH.js +391 -0
- package/dist/hooks/chunk-RHI6Y22X.js +137 -0
- package/dist/hooks/chunk-RKZVOBBS.js +469 -0
- package/dist/hooks/chunk-RL57TT2Y.js +566 -0
- package/dist/hooks/chunk-RORDOD4S.js +3321 -0
- package/dist/hooks/chunk-RZKYW5P2.js +77 -0
- package/dist/hooks/chunk-SJPJ6VSI.js +391 -0
- package/dist/hooks/chunk-SKSIJQQQ.js +432 -0
- package/dist/hooks/chunk-SSQDZKXG.js +268 -0
- package/dist/hooks/chunk-SSX23SJ2.js +89 -0
- package/dist/hooks/chunk-SYHFKE4C.js +77 -0
- package/dist/hooks/chunk-TCGNI2ZY.js +42 -0
- package/dist/hooks/chunk-TG3WXJF5.js +137 -0
- package/dist/hooks/chunk-TH7IJAY5.js +77 -0
- package/dist/hooks/chunk-TLZ27PCY.js +240 -0
- package/dist/hooks/chunk-U652FXTN.js +566 -0
- package/dist/hooks/chunk-UEK47YUF.js +268 -0
- package/dist/hooks/chunk-UIO45H3O.js +432 -0
- package/dist/hooks/chunk-UNLZEEVH.js +5005 -0
- package/dist/hooks/chunk-UNRVF3SZ.js +432 -0
- package/dist/hooks/chunk-USLFAFOI.js +3453 -0
- package/dist/hooks/chunk-VAEELMLL.js +442 -0
- package/dist/hooks/chunk-VALSWLDQ.js +3453 -0
- package/dist/hooks/chunk-VC5JEPNY.js +3398 -0
- package/dist/hooks/chunk-VEZVK6C7.js +230 -0
- package/dist/hooks/chunk-VK5JKFAR.js +49 -0
- package/dist/hooks/chunk-VNF2KP7Z.js +469 -0
- package/dist/hooks/chunk-VWWCUMW6.js +2669 -0
- package/dist/hooks/chunk-W4JARUQV.js +137 -0
- package/dist/hooks/chunk-WCYPBPJC.js +5014 -0
- package/dist/hooks/chunk-WEOBMNJG.js +2993 -0
- package/dist/hooks/chunk-WKJU3J5Y.js +5390 -0
- package/dist/hooks/chunk-WMN4TSVF.js +3299 -0
- package/dist/hooks/chunk-WNON54PT.js +3469 -0
- package/dist/hooks/chunk-WOVKBPPX.js +137 -0
- package/dist/hooks/chunk-WRVFORYJ.js +432 -0
- package/dist/hooks/chunk-WUBVYGQZ.js +240 -0
- package/dist/hooks/chunk-WWULTUOM.js +68 -0
- package/dist/hooks/chunk-WXHKKB45.js +4962 -0
- package/dist/hooks/chunk-XAI3YTHJ.js +469 -0
- package/dist/hooks/chunk-XFZH6JZJ.js +77 -0
- package/dist/hooks/chunk-XGPWX6IA.js +137 -0
- package/dist/hooks/chunk-XIXXIVGY.js +566 -0
- package/dist/hooks/chunk-XKDOYJGA.js +922 -0
- package/dist/hooks/chunk-YALTVBHM.js +432 -0
- package/dist/hooks/chunk-YEBEPBFK.js +5014 -0
- package/dist/hooks/chunk-YI2BQ3DK.js +3441 -0
- package/dist/hooks/chunk-YVNBCFGG.js +1829 -0
- package/dist/hooks/chunk-YXBN3RGG.js +432 -0
- package/dist/hooks/chunk-Z2OOJSW3.js +3163 -0
- package/dist/hooks/chunk-ZA3HVBOY.js +2644 -0
- package/dist/hooks/chunk-ZKID46U3.js +137 -0
- package/dist/hooks/chunk-ZPMU2JV6.js +49 -0
- package/dist/hooks/chunk-ZRKY4W7O.js +432 -0
- package/dist/hooks/chunk-ZTMRB7LJ.js +268 -0
- package/dist/hooks/chunk-ZVPPBQ3L.js +3413 -0
- package/dist/hooks/codex-hook-adapter.js +164 -0
- package/dist/hooks/duplicate-read-guard.js +29 -0
- package/dist/hooks/format-edited.js +37 -0
- package/dist/hooks/investigation-guard.js +31 -0
- package/dist/hooks/pretool-guard.js +21 -0
- package/dist/hooks/session-lang.js +34 -0
- package/dist/hooks/stop-guard.js +1597 -0
- package/dist/josh.js +1795 -0
- package/dist/managed-marker/index.d.ts +10 -0
- package/dist/managed-marker/index.js +32 -0
- package/dist/self-sync-guard/index.d.ts +10 -0
- package/dist/self-sync-guard/index.js +49 -0
- package/dist/version/index.d.ts +93 -0
- package/dist/version/index.js +1024 -0
- package/env/index.d.ts +7 -0
- package/env/index.js +62 -0
- package/eslint/base.js +233 -0
- package/eslint/checkout-rooted-parser.js +34 -0
- package/eslint/config-fingerprint.js +103 -0
- package/eslint/rules/code-quality.js +292 -0
- package/eslint/rules/english-only-prose.js +135 -0
- package/eslint/rules/formatting.js +44 -0
- package/eslint/rules/import.js +83 -0
- package/eslint/rules/namespace-object-export.js +107 -0
- package/eslint/rules/naming-convention.js +109 -0
- package/eslint/rules/promise.js +17 -0
- package/eslint/rules/sonarjs.js +45 -0
- package/eslint/rules/test-filename.js +91 -0
- package/eslint/rules/typescript.js +186 -0
- package/eslint/rules/unicorn.js +191 -0
- package/eslint/vanilla.js +1 -0
- package/evals/scenarios/consult-not-execute.json +20 -0
- package/evals/scenarios/no-implicit-workflow.json +26 -0
- package/evals/scenarios/overrides-both-locations.json +29 -0
- package/evals/scenarios/upstream-interrupt.json +23 -0
- package/evals/scenarios/workflow-skill-loaded.json +16 -0
- package/lefthook/base.yml +131 -0
- package/lefthook/vanilla.yml +7 -0
- package/package.json +169 -0
- package/playwright.config.ts +160 -0
- package/pnpm-workspace.yaml +41 -0
- package/ports/index.d.ts +17 -0
- package/ports/index.js +256 -0
- package/prettier/index.d.ts +3 -0
- package/prettier/index.js +31 -0
- package/prompts/agent-lint-protocol.json +79 -0
- package/prompts/agent-rules.md +63 -0
- package/prompts/coding-standards.md +382 -0
- package/prompts/collaboration-workflow/consultation-vs-execution.md +8 -0
- package/prompts/collaboration-workflow/cross-repo-epic.md +54 -0
- package/prompts/collaboration-workflow/distributed-docs.md +7 -0
- package/prompts/collaboration-workflow/durable-rules.md +24 -0
- package/prompts/collaboration-workflow/epic-audit.md +56 -0
- package/prompts/collaboration-workflow/epic-bundle.md +109 -0
- package/prompts/collaboration-workflow/file-edits.md +124 -0
- package/prompts/collaboration-workflow/gh-rest.md +57 -0
- package/prompts/collaboration-workflow/issue-citation.md +38 -0
- package/prompts/collaboration-workflow/issue-template.md +190 -0
- package/prompts/collaboration-workflow/latest-first.md +14 -0
- package/prompts/collaboration-workflow/no-clones.md +11 -0
- package/prompts/collaboration-workflow/operating-rules.md +123 -0
- package/prompts/collaboration-workflow/output-bounds.md +107 -0
- package/prompts/collaboration-workflow/overview.md +35 -0
- package/prompts/collaboration-workflow/plan-comment.md +85 -0
- package/prompts/collaboration-workflow/proposal-request.md +23 -0
- package/prompts/collaboration-workflow/report-format.md +206 -0
- package/prompts/collaboration-workflow/residency.md +94 -0
- package/prompts/collaboration-workflow/rule-delivery.md +146 -0
- package/prompts/collaboration-workflow/shell-body.md +82 -0
- package/prompts/collaboration-workflow/simplicity-first.md +9 -0
- package/prompts/collaboration-workflow/single-source-rules.md +13 -0
- package/prompts/collaboration-workflow/turn-batching.md +137 -0
- package/prompts/collaboration-workflow/upstream-interrupt.md +51 -0
- package/prompts/collaboration-workflow/wip-cap.md +118 -0
- package/prompts/collaboration-workflow.md +52 -0
- package/prompts/refactoring.md +103 -0
- package/prompts/review-rubric.md +338 -0
- package/prompts/review.md +217 -0
- package/prompts/sonar-hotspot-handling.md +77 -0
- package/prompts/testing-guide.md +277 -0
- package/scripts/adopt/adopt-logic.ts +107 -0
- package/scripts/adopt/adopt-toolkits.ts +181 -0
- package/scripts/adopt/adopt.ts +171 -0
- package/scripts/agent/agent-argv.ts +140 -0
- package/scripts/agent/agent-diagnostics.ts +120 -0
- package/scripts/agent/agent-event.ts +173 -0
- package/scripts/agent/agent-exit-record.ts +32 -0
- package/scripts/agent/agent-launch-environment.ts +71 -0
- package/scripts/agent/agent-role-profile.ts +329 -0
- package/scripts/agent/api-outage.ts +51 -0
- package/scripts/agent/claude-agent-argv.ts +151 -0
- package/scripts/agent/claude-result-event.ts +98 -0
- package/scripts/agent/codex-agent-argv.ts +94 -0
- package/scripts/agent/codex-home-source.ts +11 -0
- package/scripts/agent/interactive-ask.ts +91 -0
- package/scripts/auto-ok/auto-ok-cli.ts +516 -0
- package/scripts/backlog/backlog-arrival.ts +147 -0
- package/scripts/backlog/backlog-budget-cli.ts +220 -0
- package/scripts/backlog/backlog-budget.ts +284 -0
- package/scripts/backlog/backlog-defect-priority.ts +77 -0
- package/scripts/backlog/backlog-drive-cli.ts +377 -0
- package/scripts/backlog/backlog-drive-finish.ts +23 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +81 -0
- package/scripts/backlog/backlog-drive-named.ts +101 -0
- package/scripts/backlog/backlog-drive-offer-argv.ts +29 -0
- package/scripts/backlog/backlog-drive-owner.ts +22 -0
- package/scripts/backlog/backlog-drive-restore.ts +67 -0
- package/scripts/backlog/backlog-drive.ts +322 -0
- package/scripts/backlog/backlog-named.ts +164 -0
- package/scripts/backlog/backlog-next.ts +376 -0
- package/scripts/backlog/backlog-offer-cli.ts +279 -0
- package/scripts/backlog/backlog-offer.ts +93 -0
- package/scripts/backlog/backlog-plan-cli.ts +235 -0
- package/scripts/backlog/backlog-plan.ts +231 -0
- package/scripts/backlog/backlog-pool.ts +322 -0
- package/scripts/backlog/backlog-ready.ts +146 -0
- package/scripts/backlog/backlog-scope.ts +144 -0
- package/scripts/backlog/backlog-stalled-cli.ts +30 -0
- package/scripts/backlog/backlog-stalled-detect.ts +143 -0
- package/scripts/backlog/backlog-stalled.ts +118 -0
- package/scripts/behavior/behavior-assertion.ts +87 -0
- package/scripts/behavior/behavior-cli.ts +88 -0
- package/scripts/behavior/behavior-rules.ts +128 -0
- package/scripts/build/build-bin.ts +36 -0
- package/scripts/build/build-claude-md.ts +42 -0
- package/scripts/build/build-config-merge.ts +26 -0
- package/scripts/build/build-hooks.ts +79 -0
- package/scripts/build/build-library.ts +83 -0
- package/scripts/build/build-managed-marker.ts +26 -0
- package/scripts/build/build-self-sync-guard.ts +26 -0
- package/scripts/build/build-version.ts +25 -0
- package/scripts/build/local-bin.ts +97 -0
- package/scripts/build/shim-shell.ts +25 -0
- package/scripts/bytes/bytes-command.ts +181 -0
- package/scripts/cases/cases-cli.ts +48 -0
- package/scripts/cases/cases-logic.ts +100 -0
- package/scripts/claude/skill-meta.ts +37 -0
- package/scripts/claude/workflow-destination.ts +13 -0
- package/scripts/clone/clone-aggregate.ts +76 -0
- package/scripts/clone/clone-fingerprint.ts +96 -0
- package/scripts/clone/clone-scan-cli.ts +39 -0
- package/scripts/clone/clone-scan.ts +158 -0
- package/scripts/config-merge/index.ts +19 -0
- package/scripts/config-merge/json-format.ts +128 -0
- package/scripts/config-merge/list-patch.ts +61 -0
- package/scripts/config-merge/parse-jsonc.ts +14 -0
- package/scripts/config-merge/patch-json-key.ts +439 -0
- package/scripts/config-merge/patch-json-list.ts +38 -0
- package/scripts/config-merge/patch-yaml-list.ts +107 -0
- package/scripts/cost-runtime/codex-usage.ts +119 -0
- package/scripts/cost-runtime/context-cut-payback.ts +77 -0
- package/scripts/cost-runtime/context-cut-threshold.ts +21 -0
- package/scripts/cost-runtime/cost-attribute.ts +168 -0
- package/scripts/cost-runtime/cost-blocks.ts +149 -0
- package/scripts/cost-runtime/cost-cli.ts +318 -0
- package/scripts/cost-runtime/cost-corpus.ts +278 -0
- package/scripts/cost-runtime/cost-format.ts +32 -0
- package/scripts/cost-runtime/cost-pricing.ts +176 -0
- package/scripts/cost-runtime/cost-tokens.ts +84 -0
- package/scripts/cost-runtime/cost-transcript.ts +531 -0
- package/scripts/cost-runtime/cost-usage.ts +287 -0
- package/scripts/cost-runtime/cost-verdict.ts +89 -0
- package/scripts/cost-runtime/own-session.ts +58 -0
- package/scripts/cost-runtime/transcript-cwd.ts +14 -0
- package/scripts/delegation/delegation-cli.ts +91 -0
- package/scripts/delegation/delegation-policy.ts +178 -0
- package/scripts/delegation/duplicate-read-guard.ts +244 -0
- package/scripts/delegation/fanout-cli.ts +61 -0
- package/scripts/delegation/fanout.ts +95 -0
- package/scripts/delegation/investigation-guard.ts +131 -0
- package/scripts/delegation/investigation-reads.ts +637 -0
- package/scripts/discovery/repo-discovery.ts +166 -0
- package/scripts/discovery/repo-map-logic.ts +102 -0
- package/scripts/discovery/repo-origin.ts +153 -0
- package/scripts/discovery/repo-party-cli.ts +69 -0
- package/scripts/discovery/repo-party.ts +46 -0
- package/scripts/doctor/doctor-consumer.ts +181 -0
- package/scripts/doctor/doctor-io.ts +210 -0
- package/scripts/doctor/doctor-logic.ts +122 -0
- package/scripts/doctor/doctor-ports.ts +117 -0
- package/scripts/doctor/doctor.ts +232 -0
- package/scripts/document/backlogrun-parent-read-set.ts +48 -0
- package/scripts/document/bash-output-cap.ts +45 -0
- package/scripts/document/document-byte-budget.ts +183 -0
- package/scripts/document/document-byte-check.ts +131 -0
- package/scripts/document/document-reachability.ts +131 -0
- package/scripts/document/document-read-cli.ts +82 -0
- package/scripts/document/document-scan.ts +108 -0
- package/scripts/document/document-section-cli.ts +101 -0
- package/scripts/document/document-section.ts +156 -0
- package/scripts/document/edit-files-cli.ts +280 -0
- package/scripts/document/entry-read-budget.ts +154 -0
- package/scripts/document/entry-read-set.ts +471 -0
- package/scripts/document/generate-catalog.ts +69 -0
- package/scripts/document/lane-child-read-set.ts +88 -0
- package/scripts/document/read-files-cli.ts +135 -0
- package/scripts/document/read-set-cli.ts +295 -0
- package/scripts/document/read-set-point-of-use.ts +89 -0
- package/scripts/document/read-set-pricing.ts +52 -0
- package/scripts/document/read-set-trim.ts +78 -0
- package/scripts/document/retired-phrases.ts +143 -0
- package/scripts/document/review-agent-type.ts +46 -0
- package/scripts/document/single-source.ts +73 -0
- package/scripts/epic/epic-audit-checks.ts +452 -0
- package/scripts/epic/epic-audit-cli.ts +374 -0
- package/scripts/epic/epic-audit-orphans.ts +142 -0
- package/scripts/epic/epic-audit-rationale.ts +191 -0
- package/scripts/epic/epic-audit-report.ts +101 -0
- package/scripts/epic/epic-audit.ts +240 -0
- package/scripts/epic/epic-bundle-cli.ts +472 -0
- package/scripts/epic/epic-bundle-evidence.ts +147 -0
- package/scripts/epic/epic-bundle-gaps.ts +86 -0
- package/scripts/epic/epic-bundle-referenced.ts +195 -0
- package/scripts/epic/epic-bundle.ts +309 -0
- package/scripts/epic/epic-busy.ts +204 -0
- package/scripts/epic/epic-candidate-confirm.ts +279 -0
- package/scripts/epic/epic-classify.ts +294 -0
- package/scripts/epic/epic-cross-repo.ts +366 -0
- package/scripts/epic/epic-fetch.ts +370 -0
- package/scripts/epic/epic-graph.ts +279 -0
- package/scripts/epic/epic-index.ts +209 -0
- package/scripts/epic/epic-issue.ts +172 -0
- package/scripts/epic/epic-lane-offer.ts +207 -0
- package/scripts/epic/epic-nested.ts +37 -0
- package/scripts/epic/epic-next-read.ts +141 -0
- package/scripts/epic/epic-next-views.ts +144 -0
- package/scripts/epic/epic-next.ts +477 -0
- package/scripts/epic/epic-outside-blocker.ts +113 -0
- package/scripts/epic/epic-relation-recheck.ts +108 -0
- package/scripts/epic/epic-report.ts +200 -0
- package/scripts/gate/core-budget.ts +292 -0
- package/scripts/gate/gate-log.ts +95 -0
- package/scripts/gate/gate-plan.ts +356 -0
- package/scripts/gate/gate-report.ts +207 -0
- package/scripts/gate/gate-skip.ts +123 -0
- package/scripts/gate/gate-tree.ts +49 -0
- package/scripts/gate/hook-gate-reuse.ts +130 -0
- package/scripts/gate/pre-commit-type-check.ts +187 -0
- package/scripts/gate/scoped-green.ts +260 -0
- package/scripts/gate/type-check-step.ts +90 -0
- package/scripts/gate/verification-gate.ts +531 -0
- package/scripts/gh/fix-gh-packages-logic.ts +232 -0
- package/scripts/gh/fix-gh-packages.ts +129 -0
- package/scripts/gh/gh-cli-token.ts +18 -0
- package/scripts/gh/gh-spawn.ts +44 -0
- package/scripts/git/animation-helpers.ts +81 -0
- package/scripts/git/change-base.ts +26 -0
- package/scripts/git/changed-file-scope.ts +209 -0
- package/scripts/git/changed-paths.ts +30 -0
- package/scripts/git/constants.ts +41 -0
- package/scripts/git/git-ai-review-scan.ts +154 -0
- package/scripts/git/git-animation.ts +41 -0
- package/scripts/git/git-branch.ts +127 -0
- package/scripts/git/git-command.ts +587 -0
- package/scripts/git/git-commit.ts +27 -0
- package/scripts/git/git-common-directory.ts +38 -0
- package/scripts/git/git-epic-add-body.ts +365 -0
- package/scripts/git/git-epic-add-plan.ts +421 -0
- package/scripts/git/git-epic-add.ts +249 -0
- package/scripts/git/git-epic-body.ts +150 -0
- package/scripts/git/git-epic-chains.ts +411 -0
- package/scripts/git/git-epic-close-comment.ts +199 -0
- package/scripts/git/git-epic-close.ts +393 -0
- package/scripts/git/git-epic-decision.ts +171 -0
- package/scripts/git/git-epic-parse.ts +351 -0
- package/scripts/git/git-epic-promote.ts +102 -0
- package/scripts/git/git-epic-read.ts +73 -0
- package/scripts/git/git-epic-reconcile.ts +246 -0
- package/scripts/git/git-epic-reference.ts +98 -0
- package/scripts/git/git-epic-relations.ts +78 -0
- package/scripts/git/git-epic-remove-plan.ts +152 -0
- package/scripts/git/git-epic-remove.ts +101 -0
- package/scripts/git/git-epic-run.ts +223 -0
- package/scripts/git/git-epic-sections.ts +98 -0
- package/scripts/git/git-epic-shape.ts +81 -0
- package/scripts/git/git-epic-validate.ts +155 -0
- package/scripts/git/git-error.ts +78 -0
- package/scripts/git/git-execa-error.ts +35 -0
- package/scripts/git/git-fixture-workspace.ts +88 -0
- package/scripts/git/git-followup-cleanup.ts +88 -0
- package/scripts/git/git-followup-flush.ts +63 -0
- package/scripts/git/git-followup-label.ts +67 -0
- package/scripts/git/git-followup-pending.ts +95 -0
- package/scripts/git/git-followup-stages.ts +149 -0
- package/scripts/git/git-gh-api-path.ts +118 -0
- package/scripts/git/git-gh-check.ts +21 -0
- package/scripts/git/git-gh-command.ts +17 -0
- package/scripts/git/git-gh-exec.ts +344 -0
- package/scripts/git/git-gh-failure.ts +103 -0
- package/scripts/git/git-gh-helpers.ts +44 -0
- package/scripts/git/git-gh-issue-list.ts +257 -0
- package/scripts/git/git-gh-issue-read.ts +457 -0
- package/scripts/git/git-gh-issue-rest.ts +238 -0
- package/scripts/git/git-gh-issue-write.ts +285 -0
- package/scripts/git/git-gh-issue.ts +161 -0
- package/scripts/git/git-gh-pr-auto-merge.ts +85 -0
- package/scripts/git/git-gh-pr-read.ts +322 -0
- package/scripts/git/git-gh-pr-rest.ts +172 -0
- package/scripts/git/git-gh-pr-review.ts +103 -0
- package/scripts/git/git-gh-pr-rollup.ts +91 -0
- package/scripts/git/git-gh-pr-snapshot.ts +138 -0
- package/scripts/git/git-gh-pr.ts +219 -0
- package/scripts/git/git-gh-reachability.ts +56 -0
- package/scripts/git/git-gh-repo.ts +37 -0
- package/scripts/git/git-gh-rest-state.ts +14 -0
- package/scripts/git/git-issue.ts +168 -0
- package/scripts/git/git-location-environment.ts +62 -0
- package/scripts/git/git-ls-remote.ts +28 -0
- package/scripts/git/git-next-issues.ts +98 -0
- package/scripts/git/git-notify.ts +104 -0
- package/scripts/git/git-pr-ai-review.ts +180 -0
- package/scripts/git/git-pr-checks-eval.ts +265 -0
- package/scripts/git/git-pr-checks-parse.ts +153 -0
- package/scripts/git/git-pr-checks-watch.ts +184 -0
- package/scripts/git/git-pr-checks.ts +387 -0
- package/scripts/git/git-pr-coderabbit.ts +129 -0
- package/scripts/git/git-pr-confirmation.ts +64 -0
- package/scripts/git/git-pr-error.ts +25 -0
- package/scripts/git/git-pr-followup-wrapup.ts +225 -0
- package/scripts/git/git-pr-followup.ts +436 -0
- package/scripts/git/git-pr-managed-config.ts +69 -0
- package/scripts/git/git-pr-messages.ts +37 -0
- package/scripts/git/git-pr.ts +181 -0
- package/scripts/git/git-prompt-display.ts +22 -0
- package/scripts/git/git-prompt.ts +207 -0
- package/scripts/git/git-push-transport.ts +173 -0
- package/scripts/git/git-push.ts +27 -0
- package/scripts/git/git-remote-branch.ts +40 -0
- package/scripts/git/git-spawn.ts +47 -0
- package/scripts/git/git-staging.ts +128 -0
- package/scripts/git/git-stash.ts +124 -0
- package/scripts/git/git-status.ts +198 -0
- package/scripts/git/git-worktree.ts +110 -0
- package/scripts/git/github-issue-url.ts +105 -0
- package/scripts/git/gone-branch.ts +113 -0
- package/scripts/git/issue-labels.ts +279 -0
- package/scripts/git/listing-cutoff.ts +51 -0
- package/scripts/git/main-merge-guard.ts +134 -0
- package/scripts/git/main-merge.ts +120 -0
- package/scripts/git/main-sync.ts +121 -0
- package/scripts/git/parse-json-array.ts +102 -0
- package/scripts/git/schemas.ts +166 -0
- package/scripts/git/stash-orphans.ts +91 -0
- package/scripts/git/stash-pop-args.ts +59 -0
- package/scripts/git/stash-pop-cli.ts +105 -0
- package/scripts/git/telegram-notify.ts +404 -0
- package/scripts/hooks/batch-guard.ts +144 -0
- package/scripts/hooks/check-commit-message.ts +134 -0
- package/scripts/hooks/codex-hook-adapter.ts +155 -0
- package/scripts/hooks/edited-cspell.ts +128 -0
- package/scripts/hooks/format-edited-file-fixtures.ts +109 -0
- package/scripts/hooks/format-edited-file.ts +510 -0
- package/scripts/hooks/format-rewrite-notice.ts +99 -0
- package/scripts/hooks/pre-push-unit.ts +146 -0
- package/scripts/hooks/pretool-guard.ts +96 -0
- package/scripts/hooks/prevent-main-commit.ts +38 -0
- package/scripts/hooks/prompt-hooks.ts +38 -0
- package/scripts/hooks/reserved-run.ts +90 -0
- package/scripts/hooks/stop-guard.ts +135 -0
- package/scripts/init/claude-plugin-config.ts +51 -0
- package/scripts/init/distributed-paths.ts +100 -0
- package/scripts/init/hook-command-rewrite.ts +85 -0
- package/scripts/init/hook-launch.ts +31 -0
- package/scripts/init/init-actions.ts +147 -0
- package/scripts/init/init-ai-copy.ts +235 -0
- package/scripts/init/init-copy-content.ts +50 -0
- package/scripts/init/init-logic-deploy-vps.ts +43 -0
- package/scripts/init/init-logic-json-merge.ts +340 -0
- package/scripts/init/init-logic-migrate.ts +62 -0
- package/scripts/init/init-logic-package-key-order.ts +50 -0
- package/scripts/init/init-logic-secretlint.ts +36 -0
- package/scripts/init/init-logic-sonar.ts +197 -0
- package/scripts/init/init-logic-templates.ts +142 -0
- package/scripts/init/init-logic-workspace.ts +59 -0
- package/scripts/init/init-logic-yaml-merge.ts +57 -0
- package/scripts/init/init-logic.ts +474 -0
- package/scripts/init/init-paths.ts +11 -0
- package/scripts/init/init-sonar.ts +32 -0
- package/scripts/init/init.ts +219 -0
- package/scripts/init/kit-base-preset.ts +60 -0
- package/scripts/init/plugin-install-hint.ts +47 -0
- package/scripts/init/tsconfig-preset-migration.ts +67 -0
- package/scripts/issue/baseline-measure.ts +105 -0
- package/scripts/issue/behavior-change-lint.ts +122 -0
- package/scripts/issue/defect-rate-cli.ts +167 -0
- package/scripts/issue/defect-rate.ts +145 -0
- package/scripts/issue/issue-backlinks-cli.ts +97 -0
- package/scripts/issue/issue-backlinks.ts +164 -0
- package/scripts/issue/issue-cite-cli.ts +158 -0
- package/scripts/issue/issue-cite.ts +102 -0
- package/scripts/issue/issue-comment-cli.ts +95 -0
- package/scripts/issue/issue-fold-cli.ts +104 -0
- package/scripts/issue/issue-fold-existing-cli.ts +81 -0
- package/scripts/issue/issue-fold-existing.ts +73 -0
- package/scripts/issue/issue-fold.ts +42 -0
- package/scripts/issue/issue-lint-cli.ts +60 -0
- package/scripts/issue/issue-lint.ts +26 -0
- package/scripts/issue/issue-logic.ts +50 -0
- package/scripts/issue/issue-read-cli.ts +190 -0
- package/scripts/issue/issue-read.ts +145 -0
- package/scripts/issue/issue-scout-cli.ts +482 -0
- package/scripts/issue/issue-scout.ts +244 -0
- package/scripts/issue/issue-state-cli.ts +260 -0
- package/scripts/issue/issue-state.ts +109 -0
- package/scripts/issue/markdown-section.ts +39 -0
- package/scripts/issue/measure-rerun-cli.ts +98 -0
- package/scripts/issue/reproduction-measure.ts +59 -0
- package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +1171 -0
- package/scripts/josh/agent-session-environment.ts +188 -0
- package/scripts/josh/cli-body.ts +96 -0
- package/scripts/josh/command-suggest.ts +57 -0
- package/scripts/josh/file-map-stamp.ts +264 -0
- package/scripts/josh/hook-decision.ts +479 -0
- package/scripts/josh/josh-command-map.ts +196 -0
- package/scripts/josh/josh-command-types.ts +226 -0
- package/scripts/josh/josh-commands-ai.ts +327 -0
- package/scripts/josh/josh-commands-backlog.ts +54 -0
- package/scripts/josh/josh-commands-clone.ts +18 -0
- package/scripts/josh/josh-commands-development.ts +206 -0
- package/scripts/josh/josh-commands-document.ts +45 -0
- package/scripts/josh/josh-commands-guard.ts +38 -0
- package/scripts/josh/josh-commands-hooks.ts +42 -0
- package/scripts/josh/josh-commands-issue.ts +69 -0
- package/scripts/josh/josh-commands-lane.ts +75 -0
- package/scripts/josh/josh-commands-lint.ts +37 -0
- package/scripts/josh/josh-commands-maintenance.ts +80 -0
- package/scripts/josh/josh-commands-project.ts +53 -0
- package/scripts/josh/josh-commands-split.ts +20 -0
- package/scripts/josh/josh-commands-versioning.ts +48 -0
- package/scripts/josh/josh-commands-workflow.ts +116 -0
- package/scripts/josh/josh-composite-arguments.ts +55 -0
- package/scripts/josh/josh-environment-file.ts +31 -0
- package/scripts/josh/josh-in-process.ts +80 -0
- package/scripts/josh/josh-logic.ts +308 -0
- package/scripts/josh/josh-run.ts +53 -0
- package/scripts/josh/josh-script-reader.ts +11 -0
- package/scripts/josh/josh-verdict.ts +111 -0
- package/scripts/josh/josh.ts +60 -0
- package/scripts/josh/kit-only.ts +33 -0
- package/scripts/josh/path-decision.ts +104 -0
- package/scripts/josh/platform-temporary.ts +66 -0
- package/scripts/josh/process-identity.ts +335 -0
- package/scripts/josh/session-language-cli.ts +51 -0
- package/scripts/josh/session-language.ts +30 -0
- package/scripts/josh/stamp-file.ts +194 -0
- package/scripts/lane/lane-await.ts +165 -0
- package/scripts/lane/lane-cache-run.ts +39 -0
- package/scripts/lane/lane-cache.ts +135 -0
- package/scripts/lane/lane-capacity.ts +69 -0
- package/scripts/lane/lane-child-invocation.ts +73 -0
- package/scripts/lane/lane-child-marker.ts +58 -0
- package/scripts/lane/lane-cli.ts +410 -0
- package/scripts/lane/lane-close.ts +197 -0
- package/scripts/lane/lane-dispatch-log.ts +13 -0
- package/scripts/lane/lane-dispatch.ts +458 -0
- package/scripts/lane/lane-environment.ts +253 -0
- package/scripts/lane/lane-guard-policy.ts +136 -0
- package/scripts/lane/lane-install.ts +94 -0
- package/scripts/lane/lane-launch-cli.ts +133 -0
- package/scripts/lane/lane-occupancy.ts +112 -0
- package/scripts/lane/lane-open.ts +275 -0
- package/scripts/lane/lane-output.ts +124 -0
- package/scripts/lane/lane-paths.ts +96 -0
- package/scripts/lane/lane-reap.ts +137 -0
- package/scripts/lane/lane-registry.ts +261 -0
- package/scripts/lane/lane-relaunch.ts +68 -0
- package/scripts/lane/lane-report.ts +95 -0
- package/scripts/lane/lane-resume.ts +61 -0
- package/scripts/lane/lane-seed.ts +44 -0
- package/scripts/lane/lane-start-point.ts +175 -0
- package/scripts/lane/openai-lane-supervisor-cli.ts +32 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +63 -0
- package/scripts/lane/openai-lane-supervisor.ts +337 -0
- package/scripts/lib/bounded-pool.ts +109 -0
- package/scripts/lib/buffered-process.ts +82 -0
- package/scripts/lib/caddy-logs.sh +45 -0
- package/scripts/lib/cli-flags.ts +19 -0
- package/scripts/lib/json-value.ts +24 -0
- package/scripts/lib/poll.ts +57 -0
- package/scripts/lib/read-file.ts +16 -0
- package/scripts/lib/schemas.ts +67 -0
- package/scripts/lib/spawn-exit.ts +45 -0
- package/scripts/lib/status-icons.ts +24 -0
- package/scripts/lines/effective-limit.ts +156 -0
- package/scripts/lines/line-budget.ts +404 -0
- package/scripts/lines/line-targets.ts +80 -0
- package/scripts/lines/lines-command.ts +174 -0
- package/scripts/lint/cspell-cached.ts +41 -0
- package/scripts/lint/lint-parallel.ts +72 -0
- package/scripts/lint/lint-related-scope.ts +128 -0
- package/scripts/lint/lint-related.ts +104 -0
- package/scripts/managed-marker/index.ts +5 -0
- package/scripts/managed-marker/managed-marker-logic.ts +67 -0
- package/scripts/observations/observation-ledger-home.ts +32 -0
- package/scripts/observations/observation-ledger-line.ts +93 -0
- package/scripts/observations/observation-ledger.ts +35 -0
- package/scripts/observations/observations-flush-cli.ts +42 -0
- package/scripts/observations/observations-flush-landing.ts +97 -0
- package/scripts/observations/observations-flush.ts +420 -0
- package/scripts/overrides/lockfile-overrides.ts +105 -0
- package/scripts/overrides/overrides-check.ts +84 -0
- package/scripts/overrides/overrides-files.ts +19 -0
- package/scripts/overrides/overrides-logic.ts +211 -0
- package/scripts/overrides/schemas.ts +49 -0
- package/scripts/package/package-scout-cli.ts +195 -0
- package/scripts/package/package-scout-format.ts +151 -0
- package/scripts/package/package-scout.ts +121 -0
- package/scripts/ports/port-command.ts +87 -0
- package/scripts/propagate/propagate-git-failure.ts +191 -0
- package/scripts/propagate/propagate-git.ts +224 -0
- package/scripts/propagate/propagate-publish.ts +181 -0
- package/scripts/propagate/propagate-run.ts +201 -0
- package/scripts/propagate/propagate-steps.ts +421 -0
- package/scripts/propagate/propagate-targets.ts +160 -0
- package/scripts/propagate/propagate.ts +216 -0
- package/scripts/refactor/import-graph.ts +187 -0
- package/scripts/refactor/refactor-lint.ts +250 -0
- package/scripts/refactor/refactor-scan-cli.ts +10 -0
- package/scripts/refactor/refactor-scan.ts +124 -0
- package/scripts/refactor/refactor-targets.ts +103 -0
- package/scripts/release/release-cli.ts +88 -0
- package/scripts/release/release-history.ts +132 -0
- package/scripts/release/release-plan.ts +130 -0
- package/scripts/release/release-publish.ts +152 -0
- package/scripts/release/release-scope-cli.ts +103 -0
- package/scripts/release/release-tag.ts +93 -0
- package/scripts/release/release-worktree.ts +71 -0
- package/scripts/repo/auto-merge-setting-logic.ts +100 -0
- package/scripts/repo/auto-merge-setting.ts +37 -0
- package/scripts/repo/repo-setting.ts +112 -0
- package/scripts/report/report-lint-cli.ts +49 -0
- package/scripts/report/report-lint.ts +250 -0
- package/scripts/retrospective/retrospective-cli.ts +97 -0
- package/scripts/retrospective/retrospective.ts +127 -0
- package/scripts/review/disposition-cli.ts +44 -0
- package/scripts/review/disposition-logic.ts +45 -0
- package/scripts/review/live-evidence.ts +62 -0
- package/scripts/review/review-attest-cli.ts +115 -0
- package/scripts/review/review-attest.ts +319 -0
- package/scripts/review/review-brief-cli.ts +290 -0
- package/scripts/review/review-brief.ts +440 -0
- package/scripts/review/review-checkout.ts +56 -0
- package/scripts/review/review-finding-ledger.ts +167 -0
- package/scripts/review/review-findings-cli.ts +57 -0
- package/scripts/review/review-level.ts +86 -0
- package/scripts/review/review-record-cli.ts +196 -0
- package/scripts/review/review-record.ts +74 -0
- package/scripts/review/review-round2-cli.ts +84 -0
- package/scripts/review/review-round2.ts +139 -0
- package/scripts/review/review-stamps.ts +113 -0
- package/scripts/review/review-tree.ts +58 -0
- package/scripts/rules/bash-triggers.ts +44 -0
- package/scripts/rules/decision-oracle.ts +342 -0
- package/scripts/rules/delivered-rules-harness.ts +72 -0
- package/scripts/rules/delivered-rules.ts +793 -0
- package/scripts/rules/early-heartbeat.ts +241 -0
- package/scripts/rules/file-body.ts +150 -0
- package/scripts/rules/filing-cap.ts +133 -0
- package/scripts/rules/filing-offer.ts +81 -0
- package/scripts/rules/firing-point.ts +63 -0
- package/scripts/rules/gh-api.ts +65 -0
- package/scripts/rules/git-argv.ts +129 -0
- package/scripts/rules/git-force.ts +104 -0
- package/scripts/rules/implementation-cut-verdict.ts +84 -0
- package/scripts/rules/implementation-cut.ts +202 -0
- package/scripts/rules/issue-citation.ts +242 -0
- package/scripts/rules/issue-fold.ts +73 -0
- package/scripts/rules/issue-scout.ts +64 -0
- package/scripts/rules/josh-git-bare.ts +80 -0
- package/scripts/rules/lane-carry-conflict.ts +96 -0
- package/scripts/rules/lane-interactive-ask.ts +71 -0
- package/scripts/rules/lane-park.ts +122 -0
- package/scripts/rules/lane-switch-main.ts +139 -0
- package/scripts/rules/oracle-consulted.ts +81 -0
- package/scripts/rules/oracle-firing.ts +151 -0
- package/scripts/rules/oracle-list-cli.ts +81 -0
- package/scripts/rules/piped-verification.ts +126 -0
- package/scripts/rules/poll-loop.ts +125 -0
- package/scripts/rules/pre-gate-cut.ts +207 -0
- package/scripts/rules/prior-comment-read.ts +106 -0
- package/scripts/rules/raw-field-body.ts +56 -0
- package/scripts/rules/reply-language.ts +116 -0
- package/scripts/rules/rule-body-guard.ts +206 -0
- package/scripts/rules/rule-guard.ts +23 -0
- package/scripts/rules/rule-value-cli.ts +129 -0
- package/scripts/rules/rule-value.ts +397 -0
- package/scripts/rules/run-tail.ts +178 -0
- package/scripts/rules/shell-body-trigger.ts +204 -0
- package/scripts/rules/shell-segments.ts +45 -0
- package/scripts/rules/stop-rules.ts +329 -0
- package/scripts/rules/tail-commands.ts +35 -0
- package/scripts/rules/test-declared-commit.ts +51 -0
- package/scripts/rules/third-party-write.ts +90 -0
- package/scripts/rules/top-level-scripts-guard.ts +47 -0
- package/scripts/rules/worktree-guard.ts +130 -0
- package/scripts/run/detached-launch.ts +360 -0
- package/scripts/run/run-carry-args.ts +264 -0
- package/scripts/run/run-carry-change.ts +69 -0
- package/scripts/run/run-carry-cli.ts +441 -0
- package/scripts/run/run-carry-flush.ts +63 -0
- package/scripts/run/run-carry-stash.ts +71 -0
- package/scripts/run/run-carry-streak.ts +113 -0
- package/scripts/run/run-carry.ts +550 -0
- package/scripts/run/run-cut-args.ts +132 -0
- package/scripts/run/run-cut-cli.ts +461 -0
- package/scripts/run/run-cut-handoff.ts +126 -0
- package/scripts/run/run-cut.ts +531 -0
- package/scripts/run/run-ending-cli.ts +111 -0
- package/scripts/run/run-ending.ts +239 -0
- package/scripts/run/run-entry-cli.ts +135 -0
- package/scripts/run/run-entry.ts +95 -0
- package/scripts/run/run-event-cli.ts +210 -0
- package/scripts/run/run-event-follow.ts +65 -0
- package/scripts/run/run-event-render.ts +75 -0
- package/scripts/run/run-event-scope.ts +127 -0
- package/scripts/run/run-event-stream-emit.ts +140 -0
- package/scripts/run/run-event-stream.ts +258 -0
- package/scripts/run/run-event-watch.ts +37 -0
- package/scripts/run/run-headless.ts +105 -0
- package/scripts/run/run-hold-cli.ts +310 -0
- package/scripts/run/run-hold.ts +264 -0
- package/scripts/run/run-invocation.ts +237 -0
- package/scripts/run/run-issue-number.ts +19 -0
- package/scripts/run/run-liveness-cli.ts +169 -0
- package/scripts/run/run-liveness.ts +424 -0
- package/scripts/run/run-merge-cli.ts +385 -0
- package/scripts/run/run-merge-steps.ts +326 -0
- package/scripts/run/run-merge.ts +158 -0
- package/scripts/run/run-next-cli.ts +48 -0
- package/scripts/run/run-next.ts +80 -0
- package/scripts/run/run-preflight.ts +337 -0
- package/scripts/run/run-prep-cli.ts +151 -0
- package/scripts/run/run-prep.ts +84 -0
- package/scripts/run/run-progress-args.ts +65 -0
- package/scripts/run/run-progress-cli.ts +508 -0
- package/scripts/run/run-progress-clock.ts +320 -0
- package/scripts/run/run-progress-config.ts +119 -0
- package/scripts/run/run-progress-read.ts +199 -0
- package/scripts/run/run-progress.ts +366 -0
- package/scripts/run/run-report-cli.ts +71 -0
- package/scripts/run/run-report.ts +78 -0
- package/scripts/run/run-review-cli.ts +130 -0
- package/scripts/run/run-review-steps.ts +161 -0
- package/scripts/run/run-review.ts +121 -0
- package/scripts/run/run-ship-cli.ts +431 -0
- package/scripts/run/run-ship-detach.ts +200 -0
- package/scripts/run/run-ship-probe.ts +103 -0
- package/scripts/run/run-ship-return.ts +75 -0
- package/scripts/run/run-ship-review-steps.ts +227 -0
- package/scripts/run/run-ship-review.ts +177 -0
- package/scripts/run/run-ship-stage.ts +150 -0
- package/scripts/run/run-ship.ts +78 -0
- package/scripts/run/run-status-cli.ts +175 -0
- package/scripts/run/run-status.ts +77 -0
- package/scripts/run/run-step-cli.ts +111 -0
- package/scripts/run/run-step.ts +292 -0
- package/scripts/run/run-stop-notify.ts +52 -0
- package/scripts/run/run-stranded-cli.ts +31 -0
- package/scripts/run/run-stranded-detect.ts +134 -0
- package/scripts/run/run-stranded.ts +120 -0
- package/scripts/run/run-tail-cli.ts +105 -0
- package/scripts/run/run-tail.ts +61 -0
- package/scripts/run/run-transcript.golden.txt +57 -0
- package/scripts/run/run-wake-cli.ts +428 -0
- package/scripts/run/run-wake-describe.ts +97 -0
- package/scripts/run/run-wake-driver.ts +80 -0
- package/scripts/run/run-wake-handoff.ts +29 -0
- package/scripts/run/run-wake-loop.ts +223 -0
- package/scripts/run/run-wake-session.ts +150 -0
- package/scripts/run/run-wake-work.ts +104 -0
- package/scripts/run/run-wake.ts +607 -0
- package/scripts/run/run-watcher-guard-cli.ts +37 -0
- package/scripts/run/run-watcher-guard.ts +59 -0
- package/scripts/run/run-watcher-hook.ts +86 -0
- package/scripts/security/secretlint-scan.ts +86 -0
- package/scripts/security/security-audit-logic.ts +51 -0
- package/scripts/security/security-audit-provision-logic.ts +217 -0
- package/scripts/security/security-audit-provision.ts +186 -0
- package/scripts/security/security-audit.ts +132 -0
- package/scripts/security/security-updates-logic.ts +131 -0
- package/scripts/security/security-updates.ts +38 -0
- package/scripts/security/sonar-file.ts +44 -0
- package/scripts/self-sync-guard/index.ts +5 -0
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +98 -0
- package/scripts/self-sync-guard/self-sync-refusal.ts +22 -0
- package/scripts/sonar/sonar-hotspots-cli.ts +149 -0
- package/scripts/sonar/sonar-hotspots.ts +111 -0
- package/scripts/split/split-assess-cli.ts +52 -0
- package/scripts/split/split-assess.ts +124 -0
- package/scripts/sync/dependabot-pin-logic.ts +135 -0
- package/scripts/sync/directory-copy-guard.ts +187 -0
- package/scripts/sync/file-content.ts +49 -0
- package/scripts/sync/managed-config-scope-cli.ts +64 -0
- package/scripts/sync/managed-config-scope.ts +123 -0
- package/scripts/sync/plugin-skill-directories.ts +15 -0
- package/scripts/sync/reconcile-templates.ts +53 -0
- package/scripts/sync/removed-skill-manifest.ts +27 -0
- package/scripts/sync/skill-migration.ts +192 -0
- package/scripts/sync/sync-configs.ts +156 -0
- package/scripts/sync/sync-hook-safety.ts +82 -0
- package/scripts/sync/sync.ts +417 -0
- package/scripts/sync/synced-paths.ts +52 -0
- package/scripts/sync/template-source-logic.ts +122 -0
- package/scripts/sync/workflow-pin-logic.ts +240 -0
- package/scripts/test/classify-isolation.ts +149 -0
- package/scripts/test/e2e-retry-check.ts +150 -0
- package/scripts/test/http-fault-injection.ts +79 -0
- package/scripts/test/josh-harness-environment.ts +260 -0
- package/scripts/test/josh-harness.ts +96 -0
- package/scripts/test/pilot-files.ts +457 -0
- package/scripts/test/pilot-measure.ts +78 -0
- package/scripts/test/test-declared-changed.ts +99 -0
- package/scripts/test/test-declared-logic.ts +91 -0
- package/scripts/test/test-declared-match.ts +106 -0
- package/scripts/test/test-declared.ts +180 -0
- package/scripts/test/test-e2e-guard.ts +86 -0
- package/scripts/test/test-network-guard.ts +453 -0
- package/scripts/test/test-red-commit.ts +51 -0
- package/scripts/test/test-red-logic.ts +76 -0
- package/scripts/test/test-red.ts +154 -0
- package/scripts/test/test-related-scope.ts +115 -0
- package/scripts/test/test-related.ts +73 -0
- package/scripts/test/test-repository-guard.ts +317 -0
- package/scripts/test/test-state-guard.ts +85 -0
- package/scripts/test/test-stdout-guard.ts +54 -0
- package/scripts/test/test-telegram-guard.ts +90 -0
- package/scripts/test/test-type-logic.ts +31 -0
- package/scripts/test/test-unit-guard.ts +185 -0
- package/scripts/test/unit-guard-environment.ts +12 -0
- package/scripts/test/unit-projects.ts +139 -0
- package/scripts/test/unit-worker-share.ts +251 -0
- package/scripts/test/vitest-include-globs.ts +12 -0
- package/scripts/time-runtime/time-agent-bundles.ts +128 -0
- package/scripts/time-runtime/time-background.ts +300 -0
- package/scripts/time-runtime/time-batch-guard-fixtures.ts +66 -0
- package/scripts/time-runtime/time-batch-guard.ts +529 -0
- package/scripts/time-runtime/time-bundle-call.ts +575 -0
- package/scripts/time-runtime/time-bundles.ts +536 -0
- package/scripts/time-runtime/time-call-identity.ts +37 -0
- package/scripts/time-runtime/time-command-key.ts +35 -0
- package/scripts/time-runtime/time-density-hook.ts +166 -0
- package/scripts/time-runtime/time-density.ts +147 -0
- package/scripts/time-runtime/time-followup-stage.ts +107 -0
- package/scripts/time-runtime/time-format.ts +186 -0
- package/scripts/time-runtime/time-hook-transcript.ts +82 -0
- package/scripts/time-runtime/time-instant.ts +20 -0
- package/scripts/time-runtime/time-markers.ts +228 -0
- package/scripts/time-runtime/time-phase-names.ts +123 -0
- package/scripts/time-runtime/time-reported-failure.ts +227 -0
- package/scripts/time-runtime/time-round-trips.ts +279 -0
- package/scripts/time-runtime/time-shell.ts +286 -0
- package/scripts/time-runtime/time-single-check.ts +65 -0
- package/scripts/time-runtime/time-spans.ts +545 -0
- package/scripts/time-runtime/time-transcript-line.ts +253 -0
- package/scripts/time-runtime/time-writes.ts +71 -0
- package/scripts/ui/ui-routes-cli.ts +122 -0
- package/scripts/ui/ui-routes.ts +102 -0
- package/scripts/version/bump-version.ts +71 -0
- package/scripts/version/effective-upstream.ts +93 -0
- package/scripts/version/index.ts +25 -0
- package/scripts/version/kit-descriptor.ts +10 -0
- package/scripts/version/kit-version-config.ts +30 -0
- package/scripts/version/latest-corepack.ts +404 -0
- package/scripts/version/latest-lane-guard.ts +49 -0
- package/scripts/version/latest-regression.ts +93 -0
- package/scripts/version/latest-scope-cli.ts +147 -0
- package/scripts/version/latest-stamp.ts +107 -0
- package/scripts/version/latest-update.ts +198 -0
- package/scripts/version/package-manager-version.ts +95 -0
- package/scripts/version/parse-json.ts +13 -0
- package/scripts/version/preinstall-version-update.ts +84 -0
- package/scripts/version/publishable-range-check.ts +74 -0
- package/scripts/version/publishable-range.ts +123 -0
- package/scripts/version/release-age.ts +146 -0
- package/scripts/version/release-hold.ts +142 -0
- package/scripts/version/running-binary.ts +42 -0
- package/scripts/version/upgrade-command-guard.ts +49 -0
- package/scripts/version/upgrade-shell-command.ts +30 -0
- package/scripts/version/version-check-logic.ts +333 -0
- package/scripts/version/version-check.ts +14 -0
- package/scripts/version/version-command-config.ts +177 -0
- package/scripts/version/version-commands.ts +296 -0
- package/scripts/version/version-remote.ts +86 -0
- package/scripts/version/version-targets.ts +81 -0
- package/scripts/yaml/yaml-document.ts +46 -0
- package/scripts-ai/completion-gate.ts +13 -0
- package/scripts-ai/environment-loader.ts +9 -0
- package/scripts-ai/epic-check.ts +34 -0
- package/scripts-ai/epic-cli-argv.ts +77 -0
- package/scripts-ai/epic-cli-remove.ts +71 -0
- package/scripts-ai/epic-cli.ts +413 -0
- package/scripts-ai/epic.ts +192 -0
- package/scripts-ai/followup-issue-number.ts +31 -0
- package/scripts-ai/git-followup-finish.ts +217 -0
- package/scripts-ai/git-followup-workflow.ts +252 -0
- package/scripts-ai/git-workflow.ts +246 -0
- package/scripts-ai/telegram-test-logic.ts +88 -0
- package/scripts-ai/telegram-test.ts +130 -0
- package/templates/gitignore +76 -0
- package/templates/sonar-project.properties +52 -0
- package/templates/workflows/ci.yml +639 -0
- package/templates/workflows/dependabot-auto-merge.yml +428 -0
- package/tsconfig/base.json +50 -0
- package/tsconfig.sonar.json +34 -0
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
// What a workflow entry point reads before it does anything, and what that costs
|
|
2
|
+
// (joshuafolkken/kit#1776).
|
|
3
|
+
//
|
|
4
|
+
// **The entry read was the largest fixed cost a run had, and nothing measured it.** Measured on the
|
|
5
|
+
// `queue` parent of 2026-09-11: 159,323 billed input tokens per request at 16 requests, with the
|
|
6
|
+
// whole of those 16 requests spent reading the mandated documents and nothing implemented. The
|
|
7
|
+
// number could only be obtained after the fact, from a transcript, which is no use to the run that
|
|
8
|
+
// is about to pay it.
|
|
9
|
+
//
|
|
10
|
+
// **The set is derived, never transcribed.** The files come from `SKILL.md` → "1. Which file to
|
|
11
|
+
// read", the table a run reads first anyway, and the sections come from the `` `X.md` → "Heading" ``
|
|
12
|
+
// references those files actually carry. A hand-written copy of either would be the clone
|
|
13
|
+
// `CLAUDE.md` prohibits, and it would drift the first time a row moved.
|
|
14
|
+
|
|
15
|
+
import { existsSync } from 'node:fs'
|
|
16
|
+
import path from 'node:path'
|
|
17
|
+
import { cost_tokens } from '#scripts/cost-runtime/cost-tokens'
|
|
18
|
+
import { PACKAGE_DIR } from '#scripts/init/init-paths'
|
|
19
|
+
import { bash_output_cap_reader } from './bash-output-cap'
|
|
20
|
+
import { document_section, type Section } from './document-section'
|
|
21
|
+
import { read_set_point_of_use } from './read-set-point-of-use'
|
|
22
|
+
|
|
23
|
+
const { POINT_OF_USE_FILES, POINT_OF_USE_BY_ENTRY, is_point_of_use, point_of_use_files } =
|
|
24
|
+
read_set_point_of_use
|
|
25
|
+
|
|
26
|
+
const SKILL_DIRECTORY = path.join('.claude', 'skills', 'workflow-commands')
|
|
27
|
+
const SKILL_FILE = 'SKILL.md'
|
|
28
|
+
const TABLE_SECTION = '1. Which file to read'
|
|
29
|
+
const NOTHING = 0
|
|
30
|
+
const ONE_LINE = 1
|
|
31
|
+
|
|
32
|
+
// The point-of-use classification — which documents an entry names but reads only at a later step —
|
|
33
|
+
// is its own concern, split into `read-set-point-of-use.ts` in joshuafolkken/kit#2289. This file
|
|
34
|
+
// reads that classification to drop those files from the entry read and to cost them separately.
|
|
35
|
+
|
|
36
|
+
// The fetch cap a `cat` truncates at, and the harness default it falls back to, are read from
|
|
37
|
+
// `bash-output-cap.ts` — split out in joshuafolkken/kit#2161 to keep this file under its line ceiling.
|
|
38
|
+
// `section()` hands back a `##` heading's `###` children with it, so the table parse has to say
|
|
39
|
+
// where it stops — see `table_rows`.
|
|
40
|
+
const SUBSECTION_PREFIX = '### '
|
|
41
|
+
|
|
42
|
+
const TABLE_ROW = /^\|(?<entry>[^|]+)\|(?<files>[^|]+)\|\s*$/u
|
|
43
|
+
const MARKDOWN_NAME = /`(?<name>[\w.-]+\.md)`/gu
|
|
44
|
+
// The entry keyword is the first backticked word of the row's first column — `` `queue #N1 #N2 …` ``
|
|
45
|
+
// and `` `kickoff` / `kickoff #N` `` both yield the keyword and nothing else.
|
|
46
|
+
const ENTRY_KEYWORD = /`(?<keyword>[a-z]+)/u
|
|
47
|
+
// The cross-reference form every one of these documents uses. The arrow is the one character that
|
|
48
|
+
// distinguishes a pointer at a section from a mention of a file.
|
|
49
|
+
const SECTION_REFERENCE = /`(?<file>[\w.-]+\.md)` *→ *"(?<heading>[^"]+)"/gu
|
|
50
|
+
const WHITESPACE_RUN = /\s+/gu
|
|
51
|
+
|
|
52
|
+
interface SectionReference {
|
|
53
|
+
file: string
|
|
54
|
+
heading: string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface Cost {
|
|
58
|
+
bytes: number
|
|
59
|
+
tokens: number
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface SectionCost extends SectionReference {
|
|
63
|
+
cost: Cost
|
|
64
|
+
is_resolved: boolean
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface FileCost {
|
|
68
|
+
file: string
|
|
69
|
+
cost: Cost
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface TableRow {
|
|
73
|
+
keyword: string
|
|
74
|
+
files: ReadonlyArray<string>
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
interface ReadSet {
|
|
78
|
+
entry: string
|
|
79
|
+
files: ReadonlyArray<string>
|
|
80
|
+
sections: ReadonlyArray<SectionReference>
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface ReadSetCost {
|
|
84
|
+
entry: string
|
|
85
|
+
files: ReadonlyArray<FileCost>
|
|
86
|
+
sections: ReadonlyArray<SectionCost>
|
|
87
|
+
// What the entry reads later: the section named in the trigger table, or the whole document when
|
|
88
|
+
// none is named. Listed rather than dropped so the reported total has no hidden cost.
|
|
89
|
+
point_of_use: ReadonlyArray<SectionCost>
|
|
90
|
+
// The character cap a Bash result is truncated at, so the report can say which of the files above
|
|
91
|
+
// a `cat` cannot deliver whole. **Compared against each file's byte count, which is a deliberate
|
|
92
|
+
// conservative proxy**: these documents are heavily non-ASCII, so bytes run above characters and
|
|
93
|
+
// the comparison can only over-mark, never under-mark. Over-marking costs nothing — the rule
|
|
94
|
+
// beneath the report is one `Read` per file either way — while under-marking would invite the
|
|
95
|
+
// `cat` that truncates.
|
|
96
|
+
bash_output_cap: number
|
|
97
|
+
// Every file in the set read in full, the referenced ones included — what a run pays with no way
|
|
98
|
+
// to fetch a heading.
|
|
99
|
+
whole: Cost
|
|
100
|
+
// The set's own files in full plus the referenced sections alone — what it pays with one.
|
|
101
|
+
scoped: Cost
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// **Use the running package's skill before a consumer's legacy copy.** Old copied skill bodies
|
|
105
|
+
// can remain after the plugin migration, including when josh is installed globally. Reading them
|
|
106
|
+
// would measure old instructions against the package's current budget. A fixture without a project
|
|
107
|
+
// manifest keeps its own skill tree, so tests can supply alternate documents.
|
|
108
|
+
function document_path(root: string, name: string): string {
|
|
109
|
+
const in_project = path.join(root, SKILL_DIRECTORY, name)
|
|
110
|
+
const in_package = path.join(PACKAGE_DIR, SKILL_DIRECTORY, name)
|
|
111
|
+
const project_manifest = path.join(root, 'package.json')
|
|
112
|
+
|
|
113
|
+
if (root !== '' && existsSync(project_manifest) && existsSync(in_package)) return in_package
|
|
114
|
+
|
|
115
|
+
return existsSync(in_project) ? in_project : in_package
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function read_document(root: string, name: string): string {
|
|
119
|
+
return document_section.read_optional(document_path(root, name)) ?? ''
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function unique(names: ReadonlyArray<string>): Array<string> {
|
|
123
|
+
return [...new Set(names)]
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// **Scanned with `exec` rather than collected from `matchAll`.** A fresh `RegExp` rather than the
|
|
127
|
+
// shared one, so the caller's `lastIndex` is never carried between two scans of different documents.
|
|
128
|
+
//
|
|
129
|
+
// This spelling used to be forced rather than chosen: `unicorn/prefer-iterator-to-array` rejected
|
|
130
|
+
// the spread while the `--fix` for a `for…of` push loop put the spread straight back, so neither
|
|
131
|
+
// form was green. joshuafolkken/kit#1783 removed that contradiction — the spread is accepted now —
|
|
132
|
+
// and rewriting this helper was left outside that Issue's scope, so the loop stands on the
|
|
133
|
+
// `lastIndex` isolation above alone.
|
|
134
|
+
function all_matches(text: string, pattern: RegExp): Array<RegExpExecArray> {
|
|
135
|
+
const scanner = new RegExp(pattern.source, pattern.flags)
|
|
136
|
+
const found: Array<RegExpExecArray> = []
|
|
137
|
+
let match = scanner.exec(text)
|
|
138
|
+
|
|
139
|
+
while (match !== null) {
|
|
140
|
+
found.push(match)
|
|
141
|
+
match = scanner.exec(text)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return found
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function group_of(match: RegExpExecArray, name: string): string {
|
|
148
|
+
return match.groups?.[name] ?? ''
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function names_in(text: string): Array<string> {
|
|
152
|
+
return all_matches(text, MARKDOWN_NAME).map((match) => group_of(match, 'name'))
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function columns_of(line: string): { entry: string; files: string } | undefined {
|
|
156
|
+
const groups = TABLE_ROW.exec(line)?.groups
|
|
157
|
+
|
|
158
|
+
if (groups === undefined) return undefined
|
|
159
|
+
|
|
160
|
+
// Destructured rather than read as properties: `noPropertyAccessFromIndexSignature` refuses
|
|
161
|
+
// `groups.entry`. The bracket form was refused too, until joshuafolkken/kit#1783 switched off the
|
|
162
|
+
// `dot-notation` fix that rewrote it back — so this is a choice now rather than the only spelling.
|
|
163
|
+
const { entry = '', files = '' } = groups
|
|
164
|
+
|
|
165
|
+
return { entry, files }
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function to_row(line: string): TableRow | undefined {
|
|
169
|
+
const columns = columns_of(line)
|
|
170
|
+
|
|
171
|
+
if (columns === undefined) return undefined
|
|
172
|
+
|
|
173
|
+
const { keyword } = ENTRY_KEYWORD.exec(columns.entry)?.groups ?? {}
|
|
174
|
+
|
|
175
|
+
return keyword === undefined ? undefined : { keyword, files: names_in(columns.files) }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function push_row(rows: Map<string, ReadonlyArray<string>>, line: string): void {
|
|
179
|
+
const row = to_row(line)
|
|
180
|
+
|
|
181
|
+
// A row with no `.md` in its second column is the header separator, not an entry.
|
|
182
|
+
if (row !== undefined && row.files.length > NOTHING) rows.set(row.keyword, row.files)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// The table lives inside `SKILL.md` → "1. Which file to read", so the parse is scoped to that
|
|
186
|
+
// section: every other table in the document would otherwise contribute rows of its own.
|
|
187
|
+
//
|
|
188
|
+
// **And it stops at the section's first subsection.** `section()` returns a `##` heading's `###`
|
|
189
|
+
// children with it, and joshuafolkken/kit#1797 put a second two-column table under one of them — the
|
|
190
|
+
// point-of-use triggers. Its rows parse as entry rows, and only the "no `.md` in the second column"
|
|
191
|
+
// guard kept `latest`, `eval` and `followup` out of the keyword set; one edit adding a document name
|
|
192
|
+
// to a trigger cell would have registered them as entry points. The stop makes that explicit rather
|
|
193
|
+
// than incidental.
|
|
194
|
+
function table_rows(root: string): Map<string, ReadonlyArray<string>> {
|
|
195
|
+
const rows = new Map<string, ReadonlyArray<string>>()
|
|
196
|
+
const found = document_section.section(read_document(root, SKILL_FILE), TABLE_SECTION)
|
|
197
|
+
const lines = (found?.text ?? '').split('\n')
|
|
198
|
+
|
|
199
|
+
for (const line of lines) {
|
|
200
|
+
if (line.startsWith(SUBSECTION_PREFIX)) break
|
|
201
|
+
|
|
202
|
+
push_row(rows, line)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return rows
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// **A point-of-use document is dropped from the set wherever a table row still names it**, so the
|
|
209
|
+
// entry cost cannot be reported as including a file the entry does not read. The drop is per entry:
|
|
210
|
+
// `backlogrun` lists `fullrun.md` and `split-assessment.md` in its row to document that a child reads
|
|
211
|
+
// them, and the per-entry map takes them back out of the parent's entry cost.
|
|
212
|
+
function files_for(root: string, entry: string): ReadonlyArray<string> {
|
|
213
|
+
const declared = table_rows(root).get(entry) ?? []
|
|
214
|
+
|
|
215
|
+
return unique([SKILL_FILE, ...declared]).filter((file) => !is_point_of_use(entry, file))
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// A reference that wrapped across a source line carries the newline and the next line's indent
|
|
219
|
+
// inside its quotes, so it is folded before it is compared with a heading.
|
|
220
|
+
function fold(text: string): string {
|
|
221
|
+
return text.replaceAll(WHITESPACE_RUN, ' ').trim()
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function is_sibling_document(root: string, name: string): boolean {
|
|
225
|
+
return document_section.read_optional(document_path(root, name)) !== undefined
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// **Only the references that point *out* of the set are counted.** A pointer into a file the entry
|
|
229
|
+
// already reads in full costs nothing extra, and counting it would make the saving look larger than
|
|
230
|
+
// it is. **And only into a sibling workflow document**: a pointer at `CLAUDE.md` names text that is
|
|
231
|
+
// resident on every request already, and one at a `prompts/` topic names a file reached on its own
|
|
232
|
+
// step rather than at the entry.
|
|
233
|
+
//
|
|
234
|
+
// **A pointer into a point-of-use document is not an entry cost either** (joshuafolkken/kit#1797).
|
|
235
|
+
// Counting one would put `followup.md` straight back into the entry figure under another name, when
|
|
236
|
+
// the whole point is that the run reaches it half an hour later — and then only by fetching it whole
|
|
237
|
+
// at that moment, which is a cost of that step rather than of the entry.
|
|
238
|
+
function is_counted(
|
|
239
|
+
root: string,
|
|
240
|
+
entry: string,
|
|
241
|
+
reference: SectionReference,
|
|
242
|
+
files: ReadonlyArray<string>,
|
|
243
|
+
): boolean {
|
|
244
|
+
if (is_point_of_use(entry, reference.file)) return false
|
|
245
|
+
|
|
246
|
+
return !files.includes(reference.file) && is_sibling_document(root, reference.file)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function to_reference(match: RegExpExecArray): SectionReference {
|
|
250
|
+
return { file: group_of(match, 'file'), heading: fold(group_of(match, 'heading')) }
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function references_from(
|
|
254
|
+
root: string,
|
|
255
|
+
entry: string,
|
|
256
|
+
text: string,
|
|
257
|
+
files: ReadonlyArray<string>,
|
|
258
|
+
): Array<SectionReference> {
|
|
259
|
+
return all_matches(text, SECTION_REFERENCE)
|
|
260
|
+
.map((match) => to_reference(match))
|
|
261
|
+
.filter((reference) => is_counted(root, entry, reference, files))
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function sort_key(reference: SectionReference): string {
|
|
265
|
+
return `${reference.file} ${reference.heading}`
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function dedupe(references: ReadonlyArray<SectionReference>): Array<SectionReference> {
|
|
269
|
+
const seen = new Map<string, SectionReference>()
|
|
270
|
+
|
|
271
|
+
for (const reference of references) seen.set(sort_key(reference), reference)
|
|
272
|
+
|
|
273
|
+
return [...seen].map(([, reference]) => reference)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// **`SKILL.md`'s own cross-references are not part of the entry read, and leaving them out is the
|
|
277
|
+
// difference between measuring the entry and measuring the whole document set.** §2 states each
|
|
278
|
+
// shared rule in full and then names the single source, so following one at the entry re-reads text
|
|
279
|
+
// the run already holds — and several of them are `epicrun.md` sections a `kickoff` or a `queue`
|
|
280
|
+
// never reaches at all. A command file's references are the other kind: `fullrun.md` says outright
|
|
281
|
+
// that the procedure "is not repeated here", so the section it names is reading this entry owes.
|
|
282
|
+
function sections_for(
|
|
283
|
+
root: string,
|
|
284
|
+
entry: string,
|
|
285
|
+
files: ReadonlyArray<string>,
|
|
286
|
+
): Array<SectionReference> {
|
|
287
|
+
const found = files
|
|
288
|
+
.filter((file) => file !== SKILL_FILE)
|
|
289
|
+
.flatMap((file) => references_from(root, entry, read_document(root, file), files))
|
|
290
|
+
|
|
291
|
+
return dedupe(found).toSorted((left, right) => sort_key(left).localeCompare(sort_key(right)))
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function read_set(root: string, entry: string): ReadSet {
|
|
295
|
+
const files = files_for(root, entry)
|
|
296
|
+
|
|
297
|
+
return { entry, files, sections: sections_for(root, entry, files) }
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function cost_of(text: string): Cost {
|
|
301
|
+
return { bytes: Buffer.byteLength(text, 'utf8'), tokens: cost_tokens.estimate(text) }
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function total(costs: ReadonlyArray<Cost>): Cost {
|
|
305
|
+
const running = { bytes: NOTHING, tokens: NOTHING }
|
|
306
|
+
|
|
307
|
+
for (const cost of costs) {
|
|
308
|
+
running.bytes += cost.bytes
|
|
309
|
+
running.tokens += cost.tokens
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return running
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function section_cost(root: string, reference: SectionReference): SectionCost {
|
|
316
|
+
const found = document_section.section(read_document(root, reference.file), reference.heading)
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
...reference,
|
|
320
|
+
// **An unresolvable reference is charged at the whole file.** Reporting it at zero would let a
|
|
321
|
+
// broken pointer read as a saving, which is the one direction this measurement must not move.
|
|
322
|
+
cost: cost_of(found?.text ?? read_document(root, reference.file)),
|
|
323
|
+
is_resolved: found !== undefined,
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
function referenced_cost(root: string, sections: ReadonlyArray<SectionReference>): Cost {
|
|
328
|
+
const files = unique(sections.map((reference) => reference.file))
|
|
329
|
+
|
|
330
|
+
return total(files.map((file) => cost_of(read_document(root, file))))
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function headings_for(sections: ReadonlyArray<SectionReference>, file: string): Array<string> {
|
|
334
|
+
return sections.filter((reference) => reference.file === file).map((one) => one.heading)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function add_range(charged: Set<number>, found: Section): void {
|
|
338
|
+
for (let index = found.first_line; index <= found.last_line; index += ONE_LINE) charged.add(index)
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// `undefined` the moment one heading does not resolve, because that reference is charged at its whole
|
|
342
|
+
// file and there is then nothing to union.
|
|
343
|
+
function charged_lines(markdown: string, headings: ReadonlyArray<string>): Set<number> | undefined {
|
|
344
|
+
const charged = new Set<number>()
|
|
345
|
+
|
|
346
|
+
for (const heading of headings) {
|
|
347
|
+
const found = document_section.section(markdown, heading)
|
|
348
|
+
|
|
349
|
+
if (found === undefined) return undefined
|
|
350
|
+
|
|
351
|
+
add_range(charged, found)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return charged
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// **The union's charged lines are split into contiguous runs, and each run is costed on its own
|
|
358
|
+
// natural text.** Joining non-adjacent lines with `\n` into one string fabricates a token boundary at
|
|
359
|
+
// every gap the union skipped, so the estimate could drift a token *above* the per-reference sum even
|
|
360
|
+
// with no real overlap — a false negative saving the measurement must never print
|
|
361
|
+
// (joshuafolkken/kit#1934). A run is a maximal stretch of consecutive charged lines, which is exactly
|
|
362
|
+
// the contiguous text a reader of that section actually reads, so summing the runs both mirrors the
|
|
363
|
+
// real read and keeps `scoped` at or below the per-reference sum by construction.
|
|
364
|
+
function extend_or_start(runs: Array<Array<number>>, index: number): void {
|
|
365
|
+
const current = runs.at(-1)
|
|
366
|
+
|
|
367
|
+
if (current?.at(-1) === index - ONE_LINE) current.push(index)
|
|
368
|
+
else runs.push([index])
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function contiguous_runs(charged: ReadonlySet<number>): Array<Array<number>> {
|
|
372
|
+
const runs: Array<Array<number>> = []
|
|
373
|
+
const ascending = [...charged].toSorted((left, right) => left - right)
|
|
374
|
+
|
|
375
|
+
for (const index of ascending) extend_or_start(runs, index)
|
|
376
|
+
|
|
377
|
+
return runs
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function run_text(lines: ReadonlyArray<string>, run: ReadonlyArray<number>): string {
|
|
381
|
+
return run.map((index) => lines[index] ?? '').join('\n')
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// **Charged per file over the union of the lines its references cover, never per reference.**
|
|
385
|
+
// Summing the references instead double-counts the two ways one file can be cited twice — two
|
|
386
|
+
// unresolved headings each charged at the whole file, and a `##` section cited beside one of its own
|
|
387
|
+
// `###` children, which `section()` already returns inside the parent. Either one could push the
|
|
388
|
+
// scoped figure above the whole one and print a *negative* saving, which is the single direction this
|
|
389
|
+
// measurement must not be able to move (joshuafolkken/kit#1776 review round 1).
|
|
390
|
+
function file_scoped_cost(root: string, file: string, headings: ReadonlyArray<string>): Cost {
|
|
391
|
+
const markdown = read_document(root, file)
|
|
392
|
+
const charged = charged_lines(markdown, headings)
|
|
393
|
+
|
|
394
|
+
if (charged === undefined) return cost_of(markdown)
|
|
395
|
+
|
|
396
|
+
const lines = markdown.split('\n')
|
|
397
|
+
|
|
398
|
+
return total(contiguous_runs(charged).map((run) => cost_of(run_text(lines, run))))
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function scoped_cost(root: string, sections: ReadonlyArray<SectionReference>): Cost {
|
|
402
|
+
const files = unique(sections.map((reference) => reference.file))
|
|
403
|
+
|
|
404
|
+
return total(files.map((file) => file_scoped_cost(root, file, headings_for(sections, file))))
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function file_costs(root: string, names: ReadonlyArray<string>): Array<FileCost> {
|
|
408
|
+
return names.map((file) => ({ file, cost: cost_of(read_document(root, file)) }))
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
function point_of_use_cost(
|
|
412
|
+
root: string,
|
|
413
|
+
file: string,
|
|
414
|
+
references: ReadonlyArray<SectionReference>,
|
|
415
|
+
): SectionCost {
|
|
416
|
+
const reference = references.find((one) => one.file === file)
|
|
417
|
+
|
|
418
|
+
if (reference !== undefined) return section_cost(root, reference)
|
|
419
|
+
|
|
420
|
+
return { file, heading: '', cost: cost_of(read_document(root, file)), is_resolved: true }
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
function point_of_use_costs(root: string, entry: string): Array<SectionCost> {
|
|
424
|
+
const found = document_section.section(read_document(root, SKILL_FILE), TABLE_SECTION)
|
|
425
|
+
const references = all_matches(found?.text ?? '', SECTION_REFERENCE).map((match) =>
|
|
426
|
+
to_reference(match),
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
return point_of_use_files(entry).map((file) => point_of_use_cost(root, file, references))
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
function costed(root: string, entry: string): ReadSetCost {
|
|
433
|
+
const { files, sections } = read_set(root, entry)
|
|
434
|
+
const own_costs = file_costs(root, files)
|
|
435
|
+
const section_costs = sections.map((reference) => section_cost(root, reference))
|
|
436
|
+
const own = total(own_costs.map((row) => row.cost))
|
|
437
|
+
|
|
438
|
+
return {
|
|
439
|
+
entry,
|
|
440
|
+
files: own_costs,
|
|
441
|
+
sections: section_costs,
|
|
442
|
+
point_of_use: point_of_use_costs(root, entry),
|
|
443
|
+
bash_output_cap: bash_output_cap_reader.bash_output_cap(root),
|
|
444
|
+
whole: total([own, referenced_cost(root, sections)]),
|
|
445
|
+
scoped: total([own, scoped_cost(root, sections)]),
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function entries(root: string): Array<string> {
|
|
450
|
+
return [...table_rows(root)].map(([keyword]) => keyword)
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
const entry_read_set = {
|
|
454
|
+
HARNESS_DEFAULT_CAP_CHARS: bash_output_cap_reader.HARNESS_DEFAULT_CAP_CHARS,
|
|
455
|
+
POINT_OF_USE_BY_ENTRY,
|
|
456
|
+
POINT_OF_USE_FILES,
|
|
457
|
+
SECTION_REFERENCE,
|
|
458
|
+
SKILL_DIRECTORY,
|
|
459
|
+
SKILL_FILE,
|
|
460
|
+
TABLE_SECTION,
|
|
461
|
+
bash_output_cap: bash_output_cap_reader.bash_output_cap,
|
|
462
|
+
cost_of,
|
|
463
|
+
costed,
|
|
464
|
+
document_path,
|
|
465
|
+
entries,
|
|
466
|
+
read_set,
|
|
467
|
+
total,
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
export type { Cost, FileCost, ReadSet, ReadSetCost, SectionCost, SectionReference }
|
|
471
|
+
export { entry_read_set }
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { writeFileSync } from 'node:fs'
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import {
|
|
4
|
+
ALIASES,
|
|
5
|
+
CATEGORY_ORDER,
|
|
6
|
+
COMMAND_MAP,
|
|
7
|
+
type CommandCategory,
|
|
8
|
+
type CommandEntry,
|
|
9
|
+
} from '#scripts/josh/josh-command-map'
|
|
10
|
+
|
|
11
|
+
const CATALOG_FILE = fileURLToPath(new URL('../../docs/josh-command-catalog.md', import.meta.url))
|
|
12
|
+
|
|
13
|
+
const PREAMBLE = `# josh CLI — Command Catalog
|
|
14
|
+
|
|
15
|
+
Auto-generated — do not edit.
|
|
16
|
+
Run \`tsx scripts/document/generate-catalog.ts\` to regenerate.
|
|
17
|
+
|
|
18
|
+
`
|
|
19
|
+
|
|
20
|
+
function aliases_for(command_name: string): ReadonlyArray<string> {
|
|
21
|
+
return Object.entries(ALIASES)
|
|
22
|
+
.filter(([, target]) => target === command_name)
|
|
23
|
+
.map(([alias]) => alias)
|
|
24
|
+
.toSorted((x, y) => x.localeCompare(y))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function format_alias_heading(name: string, aliases: ReadonlyArray<string>): string {
|
|
28
|
+
if (aliases.length === 0) return `### \`josh ${name}\``
|
|
29
|
+
const alias_spans = aliases.map((al) => `\`josh ${al}\``).join(' · ')
|
|
30
|
+
|
|
31
|
+
return `### \`josh ${name}\` · ${alias_spans}`
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function format_command_entry(name: string, entry: CommandEntry): string {
|
|
35
|
+
const [synopsis, audience, side_effects] = entry.reference
|
|
36
|
+
const aliases = aliases_for(name)
|
|
37
|
+
const kit_note = entry.is_kit_only === true ? ' · **kit only**' : ''
|
|
38
|
+
const heading = format_alias_heading(name, aliases)
|
|
39
|
+
const meta = `> **Audience:** ${audience} · **Side effects:** ${side_effects.join(', ')}${kit_note}`
|
|
40
|
+
const synopsis_line = synopsis ? `\`${synopsis}\`` : '_No arguments._'
|
|
41
|
+
|
|
42
|
+
return [heading, '', meta, '', synopsis_line, '', entry.description].join('\n')
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function entries_for_category(category: CommandCategory): Array<[string, CommandEntry]> {
|
|
46
|
+
return Object.entries(COMMAND_MAP)
|
|
47
|
+
.filter(([, entry]) => entry.category === category)
|
|
48
|
+
.toSorted(([name_a], [name_b]) => name_a.localeCompare(name_b))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function generate_category_section(category: CommandCategory): string {
|
|
52
|
+
const entries = entries_for_category(category)
|
|
53
|
+
if (entries.length === 0) return ''
|
|
54
|
+
const command_blocks = entries.map(([name, entry]) => format_command_entry(name, entry))
|
|
55
|
+
|
|
56
|
+
return `## ${category}\n\n${command_blocks.join('\n\n---\n\n')}\n\n`
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function generate_catalog(): string {
|
|
60
|
+
const content = PREAMBLE + CATEGORY_ORDER.map((cat) => generate_category_section(cat)).join('')
|
|
61
|
+
|
|
62
|
+
return `${content.trimEnd()}\n`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
66
|
+
writeFileSync(CATALOG_FILE, generate_catalog())
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { CATALOG_FILE, generate_catalog }
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// What a dispatched lane child reads, and what that costs (joshuafolkken/kit#2021).
|
|
2
|
+
//
|
|
3
|
+
// **A lane child is the largest fixed cost a `backlogrun` has.** Measured on the batch of
|
|
4
|
+
// 2026-09-13, the lane child sessions were 72% of the run's whole input (joshuafolkken/kit#1936),
|
|
5
|
+
// and each `claude -p fullrun #N` child read the `fullrun` entry set in full — around 227KB. Most of
|
|
6
|
+
// that is spent on procedure a leaf child never carries out: it dispatches no child of its own, opens
|
|
7
|
+
// no lane, runs no progress watcher and performs no hand-off, so the point-of-use documents that
|
|
8
|
+
// carry those steps are read by the parent and never by the child.
|
|
9
|
+
//
|
|
10
|
+
// **This models the child as a trimmed `fullrun`, derived rather than transcribed.** The set is the
|
|
11
|
+
// `fullrun` entry read with two subtractions — the `SKILL.md` sections a child never uses read at the
|
|
12
|
+
// section level, and the point-of-use documents a leaf never reaches dropped — applied by the shared
|
|
13
|
+
// `read-set-trim`, which the `backlogrun` parent trim uses too (joshuafolkken/kit#2256).
|
|
14
|
+
|
|
15
|
+
import type { Cost, ReadSetCost } from './entry-read-set'
|
|
16
|
+
import { read_set_trim } from './read-set-trim'
|
|
17
|
+
|
|
18
|
+
const LANE_CHILD = 'lane-child'
|
|
19
|
+
const FULLRUN = 'fullrun'
|
|
20
|
+
|
|
21
|
+
// **The `SKILL.md` sections a dispatched lane child never uses**, read at the section level rather
|
|
22
|
+
// than in full. A child is handed one issue to run, so it never files a new one with an `into`
|
|
23
|
+
// target (§2a), never delegates its own pre-implementation reading (§2b), never names a repository or
|
|
24
|
+
// scouts for a duplicate at its entry (§2c, §2e), returns an observation to the parent rather than
|
|
25
|
+
// filing it (§2i), and never edits these documents (§3). Its dispatch is already an explicit workflow
|
|
26
|
+
// invocation, so §0 cannot decide anything for it either. Review delegation remains in chain-rule.md.
|
|
27
|
+
const UNUSED_SKILL_SECTIONS: ReadonlyArray<string> = [
|
|
28
|
+
'0. The rule that fires before any of them — explicit invocation',
|
|
29
|
+
'2a. The `into <target>` suffix — where the new Issue lands',
|
|
30
|
+
'2b. Delegating a step to a cheaper tier',
|
|
31
|
+
'2c. The `owner/repo#` prefix — which repository the run acts on',
|
|
32
|
+
'2e. Before filing a new Issue — `pnpm josh issue:scout`',
|
|
33
|
+
'2i. An observation worth filing is filed without asking',
|
|
34
|
+
'2j. The end-of-run retrospective — read when `run:step` prints it',
|
|
35
|
+
'3. What stays resident, and what is read from here',
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
// **The point-of-use documents a leaf child never reaches**: child dispatch, lane opening and the
|
|
39
|
+
// progress watcher / hand-off are the parent's, so their single-source documents are dropped from
|
|
40
|
+
// the child's read. **`latest-gate.md` is the parent's too** (joshuafolkken/kit#2189): the dependency
|
|
41
|
+
// update runs once per session in the outermost run, never in a dispatched lane child (`latest:scope`
|
|
42
|
+
// answers `skip` in a lane via the lane guard), so the child never opens `latest-gate.md`. The gate documents
|
|
43
|
+
// (`chain-rule.md`, `background-commands.md`), `followup.md` and `backlogrun-park.md` stay — a child
|
|
44
|
+
// runs the gate, opens its PR, and may park on a decision, so it does reach every one of those.
|
|
45
|
+
// **`retrospective.md` is the parent's too** (joshuafolkken/kit#2328): the end-of-run retrospective
|
|
46
|
+
// runs once at the batch's own end, never in a leaf child, so `run:step` answers `stop` for a child at
|
|
47
|
+
// the stop position and the child never opens it.
|
|
48
|
+
// **`backlogrun-steps.md` is the parent's too** (joshuafolkken/kit#2357): it is the scheduler's step
|
|
49
|
+
// list — what one invocation approves, the named-issue order, the session-cut record, the loop and the
|
|
50
|
+
// once-per-session tail — none of which a leaf child performs. Every reference to it lives in a
|
|
51
|
+
// document the child never reads (`backlogrun.md`, `backlogrun-progress.md`, `retrospective.md`) or in a
|
|
52
|
+
// `SKILL.md` section the child trims (§0's session-cut note, §2b, §2i, §2j), so the child has no path
|
|
53
|
+
// that opens it. It was the child's single largest read — ~16,000 tokens read whole — charged for a
|
|
54
|
+
// document it never reaches, so dropping it is a correction of an over-count, not a loss of any rule the
|
|
55
|
+
// child needs. The parent still reads it in full.
|
|
56
|
+
const SKIPPED_POINT_OF_USE: ReadonlySet<string> = new Set([
|
|
57
|
+
'backlogrun-child.md',
|
|
58
|
+
'backlogrun-lanes.md',
|
|
59
|
+
'backlogrun-progress.md',
|
|
60
|
+
'backlogrun-steps.md',
|
|
61
|
+
'delegation.md',
|
|
62
|
+
'issue-scout.md',
|
|
63
|
+
'latest-gate.md',
|
|
64
|
+
'retrospective.md',
|
|
65
|
+
])
|
|
66
|
+
|
|
67
|
+
function costed(root: string): ReadSetCost {
|
|
68
|
+
return read_set_trim.costed(root, {
|
|
69
|
+
base_entry: FULLRUN,
|
|
70
|
+
label: LANE_CHILD,
|
|
71
|
+
unused_skill_sections: UNUSED_SKILL_SECTIONS,
|
|
72
|
+
skipped_point_of_use: SKIPPED_POINT_OF_USE,
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function unused_skill_cost(root: string): Cost {
|
|
77
|
+
return read_set_trim.unused_skill_cost(root, UNUSED_SKILL_SECTIONS)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const lane_child_read_set = {
|
|
81
|
+
LANE_CHILD,
|
|
82
|
+
SKIPPED_POINT_OF_USE,
|
|
83
|
+
UNUSED_SKILL_SECTIONS,
|
|
84
|
+
costed,
|
|
85
|
+
unused_skill_cost,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { lane_child_read_set }
|