@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,131 @@
|
|
|
1
|
+
// Where each agent-read document sits on the execution path, derived from `read:set` — never
|
|
2
|
+
// hand-listed (joshuafolkken/kit#2257).
|
|
3
|
+
//
|
|
4
|
+
// **The per-document byte ceiling could not tell an entry read from a reference document.** A
|
|
5
|
+
// document a run reads on every entry costs it every session; one nothing routes to costs it nothing.
|
|
6
|
+
// The per-document ceiling held both to the same rule, so a reference document a human browses was
|
|
7
|
+
// budgeted as tightly as the workflow text a run actually reads. This splits the corpus so the
|
|
8
|
+
// primary budget (`entry-read-budget.ts`) can be the total each entry reads, and the per-document
|
|
9
|
+
// ceiling falls back to the documents no entry reaches.
|
|
10
|
+
//
|
|
11
|
+
// **The split is derived, not transcribed.** `read:set` already computes, per entry, the files it
|
|
12
|
+
// reads and the point-of-use documents it reaches — `covered` is that union, plus the resident
|
|
13
|
+
// `CLAUDE.md` every entry loads. A document `read:set` never enumerates is `unreached`, and a
|
|
14
|
+
// hand-written table of which is which would be the clone `CLAUDE.md` prohibits, drifting the first
|
|
15
|
+
// time a trigger table row moved. `CLAUDE.md` is resident by construction rather than by the graph,
|
|
16
|
+
// because it is loaded on every request whatever the entry — the misclassification joshuafolkken/kit#2257
|
|
17
|
+
// singled out (a bare reachability walk drops it to "off-path", which is wrong).
|
|
18
|
+
//
|
|
19
|
+
// **The corpus is passed in, never imported here.** This module sits on the runtime path
|
|
20
|
+
// (`lint-related` → `document-byte-check` → here), so it may not import `ai-document-fixture` — a test
|
|
21
|
+
// fixture the published package excludes (`skill-meta.ts`). `covered_documents` needs no corpus at all
|
|
22
|
+
// (it is resident ∪ point-of-use, both from `read:set`); the classification helpers that do enumerate
|
|
23
|
+
// the whole corpus take it as an argument, and their only callers are tests, which own the fixture.
|
|
24
|
+
|
|
25
|
+
import { entry_read_set } from './entry-read-set'
|
|
26
|
+
|
|
27
|
+
// The always-resident rule document. It is not an entry read — every request carries it — so it is
|
|
28
|
+
// named here rather than derived from a trigger table, and the entry-total budget adds it to every
|
|
29
|
+
// entry's total so its growth is held (joshuafolkken/kit#2257).
|
|
30
|
+
const RESIDENT_BASE: ReadonlyArray<string> = ['CLAUDE.md']
|
|
31
|
+
const WORKFLOW_DIRECTORY = '.claude/skills/workflow-commands'
|
|
32
|
+
|
|
33
|
+
type Reachability = 'resident' | 'point-of-use' | 'unreached'
|
|
34
|
+
|
|
35
|
+
// The trigger table names the workflow documents by base name (`fullrun.md`, `SKILL.md`); they all
|
|
36
|
+
// live in the workflow-commands skill, so the corpus path is that directory plus the name.
|
|
37
|
+
function workflow_path(name: string): string {
|
|
38
|
+
return `${WORKFLOW_DIRECTORY}/${name}`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Every base name `read:set` reads at an entry — the files across all trigger-table entries and the
|
|
42
|
+
// referenced sections those files point out to. Point-of-use names are handled on their own below.
|
|
43
|
+
function names_of(set: ReturnType<typeof entry_read_set.read_set>): Array<string> {
|
|
44
|
+
return [...set.files, ...set.sections.map((reference) => reference.file)]
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function entry_read_names(root: string): Set<string> {
|
|
48
|
+
const names = entry_read_set
|
|
49
|
+
.entries(root)
|
|
50
|
+
.flatMap((entry) => names_of(entry_read_set.read_set(root, entry)))
|
|
51
|
+
|
|
52
|
+
return new Set(names)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function resident_documents(root: string): Set<string> {
|
|
56
|
+
return new Set([
|
|
57
|
+
...RESIDENT_BASE,
|
|
58
|
+
...[...entry_read_names(root)].map((name) => workflow_path(name)),
|
|
59
|
+
])
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function point_of_use_documents(): Set<string> {
|
|
63
|
+
const per_entry = [...entry_read_set.POINT_OF_USE_BY_ENTRY.values()].flatMap((files) => [
|
|
64
|
+
...files,
|
|
65
|
+
])
|
|
66
|
+
|
|
67
|
+
return new Set(
|
|
68
|
+
[...entry_read_set.POINT_OF_USE_FILES, ...per_entry].map((name) => workflow_path(name)),
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function label_of(
|
|
73
|
+
relative_path: string,
|
|
74
|
+
resident: ReadonlySet<string>,
|
|
75
|
+
point_of_use: ReadonlySet<string>,
|
|
76
|
+
): Reachability {
|
|
77
|
+
if (resident.has(relative_path)) return 'resident'
|
|
78
|
+
|
|
79
|
+
return point_of_use.has(relative_path) ? 'point-of-use' : 'unreached'
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Every document in the given corpus mapped to where it sits on the execution path. The corpus is
|
|
83
|
+
// passed in (the caller owns `agent_read_documents`) so this runtime module carries no fixture import.
|
|
84
|
+
function classify(
|
|
85
|
+
corpus: ReadonlyArray<string>,
|
|
86
|
+
root: string = process.cwd(),
|
|
87
|
+
): Map<string, Reachability> {
|
|
88
|
+
const resident = resident_documents(root)
|
|
89
|
+
const point_of_use = point_of_use_documents()
|
|
90
|
+
|
|
91
|
+
return new Map(corpus.map((one) => [one, label_of(one, resident, point_of_use)]))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function documents_labelled(
|
|
95
|
+
label: Reachability,
|
|
96
|
+
corpus: ReadonlyArray<string>,
|
|
97
|
+
root: string = process.cwd(),
|
|
98
|
+
): Array<string> {
|
|
99
|
+
return [...classify(corpus, root)]
|
|
100
|
+
.filter(([, value]) => value === label)
|
|
101
|
+
.map(([one]) => one)
|
|
102
|
+
.toSorted((left, right) => left.localeCompare(right))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// The documents an entry reads — resident plus point-of-use. The entry-total budget governs these;
|
|
106
|
+
// the per-document ceiling falls back to the unreached rest, so neither holds a document the other
|
|
107
|
+
// does (joshuafolkken/kit#2257). Both sides come from `read:set`, so no corpus is needed — which is
|
|
108
|
+
// what keeps the runtime caller (`document-byte-check`) free of the fixture the corpus lives in.
|
|
109
|
+
function covered_documents(root: string = process.cwd()): Array<string> {
|
|
110
|
+
return [...new Set([...resident_documents(root), ...point_of_use_documents()])].toSorted(
|
|
111
|
+
(left, right) => left.localeCompare(right),
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function unreached_documents(
|
|
116
|
+
corpus: ReadonlyArray<string>,
|
|
117
|
+
root: string = process.cwd(),
|
|
118
|
+
): Array<string> {
|
|
119
|
+
return documents_labelled('unreached', corpus, root)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const document_reachability = {
|
|
123
|
+
RESIDENT_BASE,
|
|
124
|
+
classify,
|
|
125
|
+
covered_documents,
|
|
126
|
+
documents_labelled,
|
|
127
|
+
unreached_documents,
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export type { Reachability }
|
|
131
|
+
export { document_reachability }
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { bash_output_cap_reader } from './bash-output-cap'
|
|
4
|
+
import { document_section } from './document-section'
|
|
5
|
+
import { document_section_cli } from './document-section-cli'
|
|
6
|
+
|
|
7
|
+
// `josh doc:read <file>` — a Bash-cap-safe read path for a whole document (joshuafolkken/kit#2188).
|
|
8
|
+
//
|
|
9
|
+
// **A `cat` of a document larger than the Bash output cap is a truncated preview, then a second read.**
|
|
10
|
+
// `read:set` measured one entry paying for the same five files twice this way (joshuafolkken/kit#1797):
|
|
11
|
+
// the shell hands back a middle-truncated preview, so the file is read again with the `Read` tool. This
|
|
12
|
+
// command is the path that avoids it — it never emits an over-cap document through the shell at all.
|
|
13
|
+
//
|
|
14
|
+
// **Under the cap it prints the document; over it, it prints a directive and no content.** A document
|
|
15
|
+
// that fits is delivered here in one call. One that does not is *not* printed — a truncated preview is
|
|
16
|
+
// the failure this exists to refuse — so what comes back is one line naming the file and the `Read`
|
|
17
|
+
// tool, which reads it once. `doc:section` remains the way to fetch a single heading; this is for the
|
|
18
|
+
// whole file when a heading will not do.
|
|
19
|
+
|
|
20
|
+
const ARGV_OFFSET = 2
|
|
21
|
+
const FAILURE_EXIT_CODE = 1
|
|
22
|
+
const FILE_ARGUMENT = 0
|
|
23
|
+
const USAGE = 'Usage: josh doc:read <file.md>'
|
|
24
|
+
const OVER_CAP_PREFIX = 'Over the Bash cap'
|
|
25
|
+
const READ_TOOL_DIRECTIVE = 'read it with the Read tool, not cat:'
|
|
26
|
+
|
|
27
|
+
function byte_length(text: string): number {
|
|
28
|
+
return Buffer.byteLength(text, 'utf8')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// The one line that stands in for an over-cap document. It names both figures so the reason is legible
|
|
32
|
+
// and the path so the `Read` tool has its argument, and it carries no content of the file.
|
|
33
|
+
function over_cap_directive(file_path: string, bytes: number, cap: number): string {
|
|
34
|
+
const figures = `(${bytes.toLocaleString('en-US')} B > ${cap.toLocaleString('en-US')} B)`
|
|
35
|
+
|
|
36
|
+
return `${OVER_CAP_PREFIX} ${figures} — ${READ_TOOL_DIRECTIVE} ${file_path}`
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function print_document(file_path: string, text: string, cap: number): number {
|
|
40
|
+
if (byte_length(text) > cap) console.info(over_cap_directive(file_path, byte_length(text), cap))
|
|
41
|
+
else console.info(text)
|
|
42
|
+
|
|
43
|
+
return 0
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function run(argv: ReadonlyArray<string>, root: string = process.cwd()): number {
|
|
47
|
+
const name = argv[FILE_ARGUMENT]
|
|
48
|
+
|
|
49
|
+
if (name === undefined) {
|
|
50
|
+
console.error(USAGE)
|
|
51
|
+
|
|
52
|
+
return FAILURE_EXIT_CODE
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const file_path = document_section_cli.resolve_document(name, root)
|
|
56
|
+
const text = document_section.read_optional(file_path)
|
|
57
|
+
|
|
58
|
+
if (text === undefined) {
|
|
59
|
+
console.error(`Cannot read ${file_path}`)
|
|
60
|
+
|
|
61
|
+
return FAILURE_EXIT_CODE
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return print_document(file_path, text, bash_output_cap_reader.bash_output_cap(root))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
68
|
+
process.exitCode = run(argv)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const document_read_cli = {
|
|
72
|
+
OVER_CAP_PREFIX,
|
|
73
|
+
READ_TOOL_DIRECTIVE,
|
|
74
|
+
USAGE,
|
|
75
|
+
main,
|
|
76
|
+
over_cap_directive,
|
|
77
|
+
run,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
81
|
+
|
|
82
|
+
export { document_read_cli }
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Pulling machine-checkable references out of the distributed documents, so a few structural scans
|
|
2
|
+
// can replace the ~140 per-phrase marker suites the documents used to carry (joshuafolkken/kit#1923).
|
|
3
|
+
// Every function here is a pure string extractor: it takes document text and returns the references
|
|
4
|
+
// it names, which is what lets the scans that call it be checked on a synthetic string with a
|
|
5
|
+
// deliberately broken reference in it.
|
|
6
|
+
|
|
7
|
+
// A command reference, only inside a code span. `` `pnpm josh gate` `` and `` `josh review:brief` ``
|
|
8
|
+
// are the copy-and-paste form; the leading backtick keeps prose like "josh will decide" out, which
|
|
9
|
+
// would otherwise read "will" as a command name.
|
|
10
|
+
const COMMAND_PATTERN = /`(?:pnpm )?josh ([a-z][a-z0-9:-]+)/gu
|
|
11
|
+
|
|
12
|
+
// A label the documents operate on — applied (`labels[]=…`), removed (`…/labels/<name>`) or created
|
|
13
|
+
// (`labels -f name=…`). Prose that merely names a label is not scanned; a mistyped name only breaks
|
|
14
|
+
// where a command carries it.
|
|
15
|
+
const LABEL_PATTERN = /(?:labels\[\]=|\/labels\/|labels -f name=)([a-z][a-z0-9:_-]*)/gu
|
|
16
|
+
|
|
17
|
+
// A section reference: a markdown file in a code span, an arrow, and the cited heading in straight or
|
|
18
|
+
// Japanese quotes — `` `backlogrun-progress.md` → "The hand-off" ``.
|
|
19
|
+
const SECTION_PATTERN = /`([\w./-]+\.md)`\s*→\s*["「]([^"」]+)["」]/gu
|
|
20
|
+
|
|
21
|
+
// A relative markdown link target, with an optional `#anchor`. External `https://…` links carry no
|
|
22
|
+
// `.md`, so the pattern never matches them.
|
|
23
|
+
const LINK_PATTERN = /\]\(([\w./-]+\.md)(?:#[\w-]+)?\)/gu
|
|
24
|
+
|
|
25
|
+
// Filenames that appear in the documents as illustrations of the reference form itself, never as real
|
|
26
|
+
// targets — the doc-section explanation cites `` `path.md` → "Heading" `` and `` `X.md` → "Heading" ``.
|
|
27
|
+
const PLACEHOLDER_FILES: ReadonlySet<string> = new Set(['x.md', 'foo.md', 'file.md', 'path.md'])
|
|
28
|
+
|
|
29
|
+
function matches(text: string, pattern: RegExp): Array<RegExpMatchArray> {
|
|
30
|
+
return [...text.matchAll(pattern)]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// A trailing colon is a placeholder for the sub-command that follows — `` `josh epic:` `` stands for
|
|
34
|
+
// `epic:audit`, `epic:next` and the rest — so it names no command of its own.
|
|
35
|
+
function command_references(text: string): Array<string> {
|
|
36
|
+
return matches(text, COMMAND_PATTERN)
|
|
37
|
+
.map((match) => match[1] ?? '')
|
|
38
|
+
.filter((name) => !name.endsWith(':'))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// A `<placeholder>` inside a command, and `depth:<n>` after the char class stops at `<`, both leave a
|
|
42
|
+
// token that is not a real label. Real labels never end in a colon and never carry angle brackets.
|
|
43
|
+
function is_real_label(token: string): boolean {
|
|
44
|
+
return token.length > 0 && !token.endsWith(':') && !token.includes('<')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function label_references(text: string): Array<string> {
|
|
48
|
+
return matches(text, LABEL_PATTERN)
|
|
49
|
+
.map((match) => match[1] ?? '')
|
|
50
|
+
.filter((token) => is_real_label(token))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function base_name(path: string): string {
|
|
54
|
+
return path.split('/').at(-1) ?? path
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function is_placeholder_file(name: string): boolean {
|
|
58
|
+
return name.includes('<') || PLACEHOLDER_FILES.has(base_name(name).toLowerCase())
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
interface SectionReference {
|
|
62
|
+
file: string
|
|
63
|
+
heading: string
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function section_references(text: string): Array<SectionReference> {
|
|
67
|
+
return matches(text, SECTION_PATTERN)
|
|
68
|
+
.map(([, file, heading]) => ({ file: file ?? '', heading: heading ?? '' }))
|
|
69
|
+
.filter((reference) => !is_placeholder_file(reference.file))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function link_targets(text: string): Array<string> {
|
|
73
|
+
return matches(text, LINK_PATTERN)
|
|
74
|
+
.map((match) => match[1] ?? '')
|
|
75
|
+
.filter((file) => !is_placeholder_file(file))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// A cited heading and the heading it names are compared with backticks dropped and whitespace
|
|
79
|
+
// collapsed, because a reference wraps at the column the prose wraps at — sometimes across a
|
|
80
|
+
// blockquote `> ` continuation — while the heading it points at is one unbroken line.
|
|
81
|
+
function normalize_reference(heading: string): string {
|
|
82
|
+
return heading
|
|
83
|
+
.replaceAll('`', '')
|
|
84
|
+
.split(/\s+/u)
|
|
85
|
+
.filter((word) => word !== '>')
|
|
86
|
+
.join(' ')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The two forms a heading can be cited by: with its leading number (`2b. Delegating…`) and without
|
|
90
|
+
// (`Delegating…`), since a document's own numbering is a prefix a reference may or may not carry.
|
|
91
|
+
function reference_forms(title: string): Array<string> {
|
|
92
|
+
const normalized = normalize_reference(title)
|
|
93
|
+
|
|
94
|
+
return [normalized, normalized.replace(/^\d+[a-z]?\. /u, '')]
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const document_scan = {
|
|
98
|
+
command_references,
|
|
99
|
+
is_placeholder_file,
|
|
100
|
+
label_references,
|
|
101
|
+
link_targets,
|
|
102
|
+
normalize_reference,
|
|
103
|
+
reference_forms,
|
|
104
|
+
section_references,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export type { SectionReference }
|
|
108
|
+
export { document_scan }
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { existsSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { document_section } from './document-section'
|
|
6
|
+
import { entry_read_set } from './entry-read-set'
|
|
7
|
+
|
|
8
|
+
// `josh doc:section` — print one section of a markdown document (joshuafolkken/kit#1776).
|
|
9
|
+
//
|
|
10
|
+
// **It exists because the documents already cite each other by section and the reader could only
|
|
11
|
+
// fetch files.** `` `backlogrun-progress.md` → "The hand-off" `` names 249 lines; opening
|
|
12
|
+
// `backlogrun-progress.md` costs far more. Every entry point pays that difference at the moment it
|
|
13
|
+
// starts, before anything has been implemented.
|
|
14
|
+
//
|
|
15
|
+
// **What it is not is a summary.** The section is printed verbatim, headings and all, so a run that
|
|
16
|
+
// reads a section has read the same words a run that opened the file would have. Nothing is deferred
|
|
17
|
+
// and nothing is condensed — the extent of the read changes, not its content, which is why this is
|
|
18
|
+
// not the "read it later" scheme joshuafolkken/kit#1344 and joshuafolkken/kit#1460 each measured
|
|
19
|
+
// never firing.
|
|
20
|
+
//
|
|
21
|
+
// **A heading that does not resolve is a refusal, not an empty answer.** A pointer whose target was
|
|
22
|
+
// renamed would otherwise print nothing and read as a section with nothing in it — the one outcome
|
|
23
|
+
// that is worse than reading the whole file.
|
|
24
|
+
|
|
25
|
+
const ARGV_OFFSET = 2
|
|
26
|
+
const FAILURE_EXIT_CODE = 1
|
|
27
|
+
const FILE_ARGUMENT = 0
|
|
28
|
+
const HEADING_ARGUMENT = 1
|
|
29
|
+
const NO_CANDIDATE = 0
|
|
30
|
+
const USAGE = 'Usage: josh doc:section <file.md> "<heading>"'
|
|
31
|
+
|
|
32
|
+
// A bare `backlogrun.md` means the workflow skill's own copy, because that is how every reference in
|
|
33
|
+
// those documents spells it; anything that resolves as a path is taken as one.
|
|
34
|
+
//
|
|
35
|
+
// **Every branch resolves against `root`, including the first.** Left relative to the process's own
|
|
36
|
+
// directory, a bare name that happened to exist beside the caller would beat the document under
|
|
37
|
+
// `root` and print a section of the wrong file — silently, which is the failure this command exists
|
|
38
|
+
// to refuse (joshuafolkken/kit#1776 review round 2).
|
|
39
|
+
function resolve_document(name: string, root: string = process.cwd()): string {
|
|
40
|
+
const named = path.resolve(root, name)
|
|
41
|
+
|
|
42
|
+
if (existsSync(named)) return named
|
|
43
|
+
|
|
44
|
+
const in_skill = entry_read_set.document_path(root, name)
|
|
45
|
+
|
|
46
|
+
return existsSync(in_skill) ? in_skill : named
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function report_missing(markdown: string, heading: string): number {
|
|
50
|
+
const near = document_section.candidates(markdown, heading)
|
|
51
|
+
const listed = near.length > NO_CANDIDATE ? near : document_section.titles(markdown)
|
|
52
|
+
|
|
53
|
+
console.error(`No single section matches ${JSON.stringify(heading)}. Headings it could mean:`)
|
|
54
|
+
for (const title of listed) console.error(` ${title}`)
|
|
55
|
+
|
|
56
|
+
return FAILURE_EXIT_CODE
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function print_section(markdown: string, heading: string): number {
|
|
60
|
+
const found = document_section.section(markdown, heading)
|
|
61
|
+
|
|
62
|
+
if (found === undefined) return report_missing(markdown, heading)
|
|
63
|
+
|
|
64
|
+
console.info(found.text)
|
|
65
|
+
|
|
66
|
+
return 0
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function read_named(name: string, root: string): string | undefined {
|
|
70
|
+
const file_path = resolve_document(name, root)
|
|
71
|
+
const markdown = document_section.read_optional(file_path)
|
|
72
|
+
|
|
73
|
+
if (markdown === undefined) console.error(`Cannot read ${file_path}`)
|
|
74
|
+
|
|
75
|
+
return markdown
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function run(argv: ReadonlyArray<string>, root: string = process.cwd()): number {
|
|
79
|
+
const name = argv[FILE_ARGUMENT]
|
|
80
|
+
const heading = argv[HEADING_ARGUMENT]
|
|
81
|
+
|
|
82
|
+
if (name === undefined || heading === undefined) {
|
|
83
|
+
console.error(USAGE)
|
|
84
|
+
|
|
85
|
+
return FAILURE_EXIT_CODE
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const markdown = read_named(name, root)
|
|
89
|
+
|
|
90
|
+
return markdown === undefined ? FAILURE_EXIT_CODE : print_section(markdown, heading)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
94
|
+
process.exitCode = run(argv)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const document_section_cli = { FAILURE_EXIT_CODE, USAGE, main, resolve_document, run }
|
|
98
|
+
|
|
99
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
100
|
+
|
|
101
|
+
export { document_section_cli }
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// Reading one **section** of a markdown document, because a section is the unit these documents
|
|
2
|
+
// cross-reference each other in (joshuafolkken/kit#1776).
|
|
3
|
+
//
|
|
4
|
+
// **The reference form was already a section reference, and only the reader was missing.** Every
|
|
5
|
+
// workflow document points at another one as `` `backlogrun-progress.md` → "The hand-off" `` — a file
|
|
6
|
+
// *and* a heading. A reader with no way to fetch a heading has one move left, which is to open the
|
|
7
|
+
// file, so a pointer at 249 lines was costing 2,121. `backlogrun.md` and its point-of-use phase
|
|
8
|
+
// documents are opened for many such references and are among the largest items an entry reads.
|
|
9
|
+
//
|
|
10
|
+
// **Nothing here defers a read.** The section is fetched in the same turn, in the main line, by the
|
|
11
|
+
// run that has to obey it — what changes is the extent of the fetch, never whether it happens. That
|
|
12
|
+
// is the distinction joshuafolkken/kit#1344 and joshuafolkken/kit#1460 were written after: a rule
|
|
13
|
+
// moved to "read it later" is a rule that measurably never fires, and this moves nothing to later.
|
|
14
|
+
|
|
15
|
+
import { readFileSync } from 'node:fs'
|
|
16
|
+
|
|
17
|
+
// `#` to `######`, one space, then the title. Written with a literal space rather than `\s+` and a
|
|
18
|
+
// lazy title so it cannot backtrack: `sonarjs/super-linear-regex` rejects the `\s+…+?\s*$` shape,
|
|
19
|
+
// and the trim below does the same job in linear time.
|
|
20
|
+
const HEADING_PATTERN = /^(?<hashes>#{1,6}) (?<title>.*)$/u
|
|
21
|
+
const FENCE = '```'
|
|
22
|
+
const SINGLE_MATCH = 1
|
|
23
|
+
|
|
24
|
+
interface Heading {
|
|
25
|
+
level: number
|
|
26
|
+
title: string
|
|
27
|
+
// Zero-based index into the document's lines, so a slice needs no arithmetic.
|
|
28
|
+
line: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface Section {
|
|
32
|
+
title: string
|
|
33
|
+
level: number
|
|
34
|
+
first_line: number
|
|
35
|
+
last_line: number
|
|
36
|
+
text: string
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function to_heading(line: string, index: number): Heading | undefined {
|
|
40
|
+
const groups = HEADING_PATTERN.exec(line)?.groups
|
|
41
|
+
|
|
42
|
+
if (groups === undefined) return undefined
|
|
43
|
+
|
|
44
|
+
// Destructured rather than read as properties: `noPropertyAccessFromIndexSignature` refuses
|
|
45
|
+
// `groups.title`. The bracket form was refused too, until joshuafolkken/kit#1783 switched off the
|
|
46
|
+
// `dot-notation` fix that rewrote it back — so this is a choice now rather than the only spelling.
|
|
47
|
+
const { hashes = '', title = '' } = groups
|
|
48
|
+
|
|
49
|
+
return { level: hashes.length, title: title.trim(), line: index }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function push_heading(found: Array<Heading>, line: string, index: number): void {
|
|
53
|
+
const heading = to_heading(line, index)
|
|
54
|
+
|
|
55
|
+
if (heading !== undefined) found.push(heading)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// **Fenced blocks are skipped, and that is not defensive tidying.** These documents quote shell, and
|
|
59
|
+
// a shell comment at the start of a line is a `#` in column one. Counted as a heading it would end
|
|
60
|
+
// the section above it early, which is a silent wrong answer rather than a visible failure.
|
|
61
|
+
function headings(markdown: string): Array<Heading> {
|
|
62
|
+
const found: Array<Heading> = []
|
|
63
|
+
let is_inside_fence = false
|
|
64
|
+
|
|
65
|
+
for (const [index, line] of markdown.split('\n').entries()) {
|
|
66
|
+
if (line.startsWith(FENCE)) is_inside_fence = !is_inside_fence
|
|
67
|
+
else if (!is_inside_fence) push_heading(found, line, index)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return found
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function titles(markdown: string): Array<string> {
|
|
74
|
+
return headings(markdown).map((heading) => heading.title)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// **Prefix, because a reference cites the name and the heading carries the name plus its gloss.**
|
|
78
|
+
// `` → "The hand-off" `` points at `## The hand-off — one session does not have to run the whole
|
|
79
|
+
// epic`, and `` → "The check is asked at every merge" `` at a heading that continues with a comma.
|
|
80
|
+
// Requiring the whole heading would make every such reference unresolvable, and citing the whole
|
|
81
|
+
// heading in the prose would put the gloss into every pointer.
|
|
82
|
+
function is_match(heading: Heading, wanted: string): boolean {
|
|
83
|
+
return heading.title.startsWith(wanted)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function prefixed(found: ReadonlyArray<Heading>, wanted: string): Array<Heading> {
|
|
87
|
+
return found.filter((heading) => is_match(heading, wanted))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// **Exact wins, and an ambiguous prefix is refused rather than ranked.** Two headings that both
|
|
91
|
+
// start with the cited text is a document whose reference is genuinely ambiguous; picking the first
|
|
92
|
+
// would hand back a section nobody named, which is a failure a whole-file read does not have.
|
|
93
|
+
function select(found: ReadonlyArray<Heading>, wanted: string): Heading | undefined {
|
|
94
|
+
const exact = found.find((heading) => heading.title === wanted)
|
|
95
|
+
|
|
96
|
+
if (exact !== undefined) return exact
|
|
97
|
+
|
|
98
|
+
const near = prefixed(found, wanted)
|
|
99
|
+
|
|
100
|
+
return near.length === SINGLE_MATCH ? near[0] : undefined
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// A section ends where the next heading of the same or higher rank begins, so a `##` section carries
|
|
104
|
+
// its `###` subsections with it — which is what a pointer at a `##` heading means.
|
|
105
|
+
function last_line_of(found: ReadonlyArray<Heading>, chosen: Heading, total_lines: number): number {
|
|
106
|
+
const index = found.indexOf(chosen)
|
|
107
|
+
const next = found.slice(index + SINGLE_MATCH).find((heading) => heading.level <= chosen.level)
|
|
108
|
+
|
|
109
|
+
return (next === undefined ? total_lines : next.line) - SINGLE_MATCH
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function section(markdown: string, wanted: string): Section | undefined {
|
|
113
|
+
const lines = markdown.split('\n')
|
|
114
|
+
const found = headings(markdown)
|
|
115
|
+
const chosen = select(found, wanted)
|
|
116
|
+
|
|
117
|
+
if (chosen === undefined) return undefined
|
|
118
|
+
|
|
119
|
+
const last_line = last_line_of(found, chosen, lines.length)
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
title: chosen.title,
|
|
123
|
+
level: chosen.level,
|
|
124
|
+
first_line: chosen.line,
|
|
125
|
+
last_line,
|
|
126
|
+
text: lines.slice(chosen.line, last_line + SINGLE_MATCH).join('\n'),
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Ambiguity and absence are different answers, and the caller reports them differently: one names
|
|
131
|
+
// the candidates, the other lists every heading the file has.
|
|
132
|
+
function candidates(markdown: string, wanted: string): Array<string> {
|
|
133
|
+
return prefixed(headings(markdown), wanted).map((heading) => heading.title)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function read_optional(file_path: string): string | undefined {
|
|
137
|
+
try {
|
|
138
|
+
return readFileSync(file_path, 'utf8')
|
|
139
|
+
} catch {
|
|
140
|
+
return undefined
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const document_section = {
|
|
145
|
+
FENCE,
|
|
146
|
+
HEADING_PATTERN,
|
|
147
|
+
candidates,
|
|
148
|
+
headings,
|
|
149
|
+
read_optional,
|
|
150
|
+
section,
|
|
151
|
+
select,
|
|
152
|
+
titles,
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export type { Heading, Section }
|
|
156
|
+
export { document_section }
|