@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,232 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { readFileSync, rmSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
6
|
+
import { gh_spawn } from '#scripts/gh/gh-spawn'
|
|
7
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
8
|
+
import { auto_merge_setting } from '#scripts/repo/auto-merge-setting'
|
|
9
|
+
import { security_updates } from '#scripts/security/security-updates'
|
|
10
|
+
import { running_binary } from '#scripts/version/running-binary'
|
|
11
|
+
import { doctor_consumer } from './doctor-consumer'
|
|
12
|
+
import { doctor_io, type GitTopLevel } from './doctor-io'
|
|
13
|
+
import { doctor_logic } from './doctor-logic'
|
|
14
|
+
import { doctor_ports } from './doctor-ports'
|
|
15
|
+
|
|
16
|
+
const FIX_FLAG = '--fix'
|
|
17
|
+
const PORTS_FLAG = '--ports'
|
|
18
|
+
const UNKNOWN = '(unknown)'
|
|
19
|
+
const NOT_ON_PATH = '(not on PATH)'
|
|
20
|
+
const SELF_DIR = path.dirname(fileURLToPath(import.meta.url))
|
|
21
|
+
// Deliberately smaller than the setting query's budget: the two run back to back, so `doctor`'s
|
|
22
|
+
// worst case is the git probe plus this plus GH_TIMEOUT_MS — 2000 + 3000 + 5000, ten seconds. That
|
|
23
|
+
// keeps a command which made no network calls at all before joshuafolkken/kit#805 prompt enough to
|
|
24
|
+
// stay usable when the network is unreachable.
|
|
25
|
+
const REPO_LOOKUP_TIMEOUT_MS = 3000
|
|
26
|
+
|
|
27
|
+
// Where the local applicability gates look for the artifacts that decide whether a report applies.
|
|
28
|
+
interface GateScope {
|
|
29
|
+
root: string
|
|
30
|
+
boundary: string | undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Which repository-scoped reports this project has a prerequisite for.
|
|
34
|
+
interface ApplicableSettings {
|
|
35
|
+
security_updates: boolean
|
|
36
|
+
auto_merge: boolean
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface DoctorContext {
|
|
40
|
+
running_version: string | undefined
|
|
41
|
+
running_path: string
|
|
42
|
+
path_josh: string | undefined
|
|
43
|
+
global_josh: string | undefined
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function gather_context(): DoctorContext {
|
|
47
|
+
return {
|
|
48
|
+
running_version: running_binary.read_running_version(SELF_DIR),
|
|
49
|
+
running_path: running_binary.running_package_directory(SELF_DIR),
|
|
50
|
+
path_josh: doctor_io.resolve_path_josh(),
|
|
51
|
+
global_josh: doctor_io.resolve_pnpm_global_josh(),
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function print_report(ctx: DoctorContext): void {
|
|
56
|
+
console.info('josh doctor')
|
|
57
|
+
console.info(` Running: ${ctx.running_version ?? UNKNOWN} (${ctx.running_path})`)
|
|
58
|
+
console.info(` On PATH: ${ctx.path_josh ?? NOT_ON_PATH}`)
|
|
59
|
+
console.info(` pnpm global: ${ctx.global_josh ?? UNKNOWN}`)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Remove a confirmed stale kit shim so the pnpm-global josh reclaims PATH precedence. Any other
|
|
63
|
+
// shadowing binary is left in place and reported for manual review.
|
|
64
|
+
function reclaim_shim(path_josh: string, global_josh: string): void {
|
|
65
|
+
const content = readFileSync(path_josh, 'utf8')
|
|
66
|
+
const decision = doctor_logic.decide_reclaim(path_josh, global_josh, content)
|
|
67
|
+
|
|
68
|
+
if (decision.action !== 'remove' || decision.target === undefined) {
|
|
69
|
+
console.info(` ${decision.reason}`)
|
|
70
|
+
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
rmSync(decision.target)
|
|
75
|
+
console.info(` ✓ ${decision.reason}: ${decision.target}`)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function handle_shadow(ctx: DoctorContext, is_fix: boolean): void {
|
|
79
|
+
if (ctx.path_josh === undefined || ctx.global_josh === undefined) return
|
|
80
|
+
console.info('')
|
|
81
|
+
console.info(doctor_logic.format_shadow_warning(ctx.path_josh, ctx.global_josh))
|
|
82
|
+
if (is_fix) reclaim_shim(ctx.path_josh, ctx.global_josh)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function report_path_diagnosis(ctx: DoctorContext, is_fix: boolean): void {
|
|
86
|
+
if (doctor_logic.is_shadowed(ctx.path_josh, ctx.global_josh)) {
|
|
87
|
+
handle_shadow(ctx, is_fix)
|
|
88
|
+
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
console.info(' ✓ no PATH shadowing detected')
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Where a repository-scoped check should look for the artifact that decides whether it applies.
|
|
96
|
+
// An undetermined root still gets gated, against the working directory as the best root available:
|
|
97
|
+
// skipping the gate there would warn about a nonexistent repository from a home directory whenever
|
|
98
|
+
// `git` is missing or refuses the repository. Inside a known repository the search is bounded to its
|
|
99
|
+
// root, so a repository nested under a kit consumer does not inherit the parent's files.
|
|
100
|
+
function resolve_gate_scope(git: GitTopLevel): GateScope | undefined {
|
|
101
|
+
if (git.state === 'outside') return undefined
|
|
102
|
+
if (git.state === 'inside') return { root: git.top_level, boundary: git.top_level }
|
|
103
|
+
|
|
104
|
+
return { root: PROJECT_ROOT, boundary: undefined }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Which prerequisites this repository actually has, decided locally so the answer does not depend on
|
|
108
|
+
// `gh` working. The two are independent: a consumer synced before joshuafolkken/kit#834 has the
|
|
109
|
+
// Dependabot config and no auto-merge workflow, and a repository that only ever added an auto-merge
|
|
110
|
+
// workflow of its own has the second prerequisite and not the first.
|
|
111
|
+
function resolve_applicable(scope: GateScope): ApplicableSettings {
|
|
112
|
+
return {
|
|
113
|
+
security_updates: doctor_io.has_distributed_dependabot_config(scope.root, scope.boundary),
|
|
114
|
+
auto_merge: doctor_io.has_auto_merge_workflow(scope.root, scope.boundary),
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Everything past the gate reports, including a failed lookup: `could not be read` is informative
|
|
119
|
+
// while silence is the false all-clear joshuafolkken/kit#805 exists to remove.
|
|
120
|
+
function report_applicable_settings(
|
|
121
|
+
applicable: ApplicableSettings,
|
|
122
|
+
repo: string | undefined,
|
|
123
|
+
): void {
|
|
124
|
+
if (applicable.security_updates) security_updates.report_security_updates_section(repo)
|
|
125
|
+
if (applicable.auto_merge) auto_merge_setting.report_auto_merge_section(repo)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Last, and after the local diagnosis: this is the only part of `doctor` that touches the network,
|
|
129
|
+
// and `doctor` is what a user runs when the install is already broken. Offline or behind a hanging
|
|
130
|
+
// proxy the PATH report and `--fix` must still complete (joshuafolkken/kit#805).
|
|
131
|
+
//
|
|
132
|
+
// Applicability is decided by the artifact rather than by the directory. `doctor` diagnoses the
|
|
133
|
+
// global install and is routinely run from a home directory or from a clone of an unrelated project;
|
|
134
|
+
// each prerequisite only exists where the file that creates it landed, so those files are the gates.
|
|
135
|
+
// Without them the warnings would describe a repository that either does not exist or never consumed
|
|
136
|
+
// kit, and would print enabling commands for someone else's repository. `init` and `sync` always run
|
|
137
|
+
// inside the project they just wrote those files into.
|
|
138
|
+
//
|
|
139
|
+
// The repository name is resolved once, and only when at least one report will use it: `doctor`
|
|
140
|
+
// writes nothing, so the bounded lookup is the right one, and spawning it for a repository with no
|
|
141
|
+
// prerequisite at all would be a network call with nothing to report.
|
|
142
|
+
function report_repository_settings(git: GitTopLevel): void {
|
|
143
|
+
const scope = resolve_gate_scope(git)
|
|
144
|
+
if (scope === undefined) return
|
|
145
|
+
const applicable = resolve_applicable(scope)
|
|
146
|
+
if (!applicable.security_updates && !applicable.auto_merge) return
|
|
147
|
+
|
|
148
|
+
report_applicable_settings(
|
|
149
|
+
applicable,
|
|
150
|
+
gh_spawn.get_repo_name_with_owner_within(REPO_LOOKUP_TIMEOUT_MS),
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The discovery map, printed for whichever repository `doctor` is standing in. Nothing is printed
|
|
155
|
+
// from outside a repository: discovery is anchored on the current repository's own owner, so without
|
|
156
|
+
// one there is no map to be right or wrong about (joshuafolkken/kit#869).
|
|
157
|
+
function report_repository_map(git: GitTopLevel): void {
|
|
158
|
+
if (git.state !== 'inside') return
|
|
159
|
+
|
|
160
|
+
const map = repo_discovery.discover_repositories(git.top_level)
|
|
161
|
+
|
|
162
|
+
console.info('')
|
|
163
|
+
console.info(doctor_logic.format_repository_map(map))
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Each discovered repository's port seed and the ports it resolves to, and any seed shared by more
|
|
167
|
+
// than one of them (joshuafolkken/kit#1494). Anchored on the same map as `report_repository_map`, so
|
|
168
|
+
// it prints from inside a repository and nowhere else.
|
|
169
|
+
function report_port_seeds(git: GitTopLevel): void {
|
|
170
|
+
if (git.state !== 'inside') return
|
|
171
|
+
|
|
172
|
+
const map = repo_discovery.discover_repositories(git.top_level)
|
|
173
|
+
|
|
174
|
+
console.info('')
|
|
175
|
+
console.info(doctor_ports.report_port_seeds(map))
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
interface DoctorOptions {
|
|
179
|
+
is_fix: boolean
|
|
180
|
+
show_ports: boolean
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function parse_options(argv: ReadonlyArray<string>): DoctorOptions {
|
|
184
|
+
return { is_fix: argv.includes(FIX_FLAG), show_ports: argv.includes(PORTS_FLAG) }
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// The consumer checks run against the repository root when inside one, and against the working
|
|
188
|
+
// directory otherwise — the same best-available root the settings gate falls back to.
|
|
189
|
+
function consumer_root(git: GitTopLevel): string {
|
|
190
|
+
return git.state === 'inside' ? git.top_level : PROJECT_ROOT
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// The port seed table is opt-in since joshuafolkken/kit#1930: it discovers every sibling repository
|
|
194
|
+
// and was the slowest, least diagnostic part of the default output. `--ports` brings it back.
|
|
195
|
+
function run_reports(ctx: DoctorContext, git: GitTopLevel, options: DoctorOptions): void {
|
|
196
|
+
print_report(ctx)
|
|
197
|
+
report_path_diagnosis(ctx, options.is_fix)
|
|
198
|
+
doctor_consumer.report_consumer_setup(consumer_root(git))
|
|
199
|
+
report_repository_map(git)
|
|
200
|
+
if (options.show_ports) report_port_seeds(git)
|
|
201
|
+
report_repository_settings(git)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function main(): void {
|
|
205
|
+
const options = parse_options(process.argv)
|
|
206
|
+
const ctx = gather_context()
|
|
207
|
+
|
|
208
|
+
// Resolved once and shared: `doctor` is what a user runs when things are already broken, and a
|
|
209
|
+
// second `git rev-parse` would add a second timeout to a command whose whole contract is to stay
|
|
210
|
+
// responsive when git itself is hanging (joshuafolkken/kit#805).
|
|
211
|
+
const git = doctor_io.resolve_git_top_level()
|
|
212
|
+
|
|
213
|
+
run_reports(ctx, git, options)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
217
|
+
|
|
218
|
+
const doctor = {
|
|
219
|
+
gather_context,
|
|
220
|
+
print_report,
|
|
221
|
+
reclaim_shim,
|
|
222
|
+
handle_shadow,
|
|
223
|
+
parse_options,
|
|
224
|
+
consumer_root,
|
|
225
|
+
run_reports,
|
|
226
|
+
report_repository_map,
|
|
227
|
+
report_port_seeds,
|
|
228
|
+
main,
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export type { DoctorContext }
|
|
232
|
+
export { doctor }
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// What a `backlogrun` parent reads, and what that trims from a full read (joshuafolkken/kit#2256).
|
|
2
|
+
//
|
|
3
|
+
// **The parent is the scheduler, and it never implements.** It reads `backlog:next`, dispatches each
|
|
4
|
+
// child in its own delegated `fullrun` unit, opens lanes, runs the progress watcher and the hand-off,
|
|
5
|
+
// and parks a child that cannot finish (`backlogrun.md` step 1: "Claim nothing at the entry — this
|
|
6
|
+
// parent orchestrates and never implements"). So the `SKILL.md` sections only an *implementing* entry
|
|
7
|
+
// uses are read at the section level rather than whole, exactly as the worker trims its own read
|
|
8
|
+
// (`lane-child-read-set.ts`) — through the shared `read-set-trim`.
|
|
9
|
+
//
|
|
10
|
+
// **This is a different set from the worker's.** The parent keeps §0 (its session-cut / resume
|
|
11
|
+
// paragraph is the parent's own), §2b (the parent's whole job is the epic-child delegation §2b
|
|
12
|
+
// defines), §2c (the parent is the entry that receives an `owner/repo#` prefix), §2e and §2i (the
|
|
13
|
+
// parent files prerequisites and observations for the batch) — all of which the worker drops. What the
|
|
14
|
+
// parent drops is the implementer-only set below. **The parent owns every point-of-use document**, so
|
|
15
|
+
// unlike the worker it drops none of them: the trim is the `SKILL.md` sections alone.
|
|
16
|
+
|
|
17
|
+
import type { ReadSetCost } from './entry-read-set'
|
|
18
|
+
import { read_set_trim } from './read-set-trim'
|
|
19
|
+
|
|
20
|
+
const BACKLOGRUN = 'backlogrun'
|
|
21
|
+
|
|
22
|
+
// **The `SKILL.md` sections the `backlogrun` parent never uses.** The parent has no `new` entry, so it
|
|
23
|
+
// names no `into` target (§2a); it claims no working tree, a dispatched child does that in its own
|
|
24
|
+
// unit (§2f, `backlogrun.md:47-49`); it implements nothing, so it reads no Issue's comments before
|
|
25
|
+
// implementing (§2g); and it edits no rule mid-run (§3, read only on an editing turn).
|
|
26
|
+
const UNUSED_SKILL_SECTIONS: ReadonlyArray<string> = [
|
|
27
|
+
'2a. The `into <target>` suffix — where the new Issue lands',
|
|
28
|
+
'2f. The working-tree hold — one run per tree',
|
|
29
|
+
"2g. An Issue's comments are part of the Issue",
|
|
30
|
+
'3. What stays resident, and what is read from here',
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
// The parent runs every point-of-use document itself — child dispatch, lanes, the progress watcher,
|
|
34
|
+
// the park — so it drops none. Named empty so the shared trim reads the same shape as the worker's.
|
|
35
|
+
const SKIPPED_POINT_OF_USE: ReadonlySet<string> = new Set<string>()
|
|
36
|
+
|
|
37
|
+
function costed(root: string): ReadSetCost {
|
|
38
|
+
return read_set_trim.costed(root, {
|
|
39
|
+
base_entry: BACKLOGRUN,
|
|
40
|
+
label: BACKLOGRUN,
|
|
41
|
+
unused_skill_sections: UNUSED_SKILL_SECTIONS,
|
|
42
|
+
skipped_point_of_use: SKIPPED_POINT_OF_USE,
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const backlogrun_parent_read_set = { BACKLOGRUN, UNUSED_SKILL_SECTIONS, costed }
|
|
47
|
+
|
|
48
|
+
export { backlogrun_parent_read_set }
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// The character cap a Bash result is truncated at, read from the settings file rather than restated
|
|
2
|
+
// (joshuafolkken/kit#1797). Every entry-read document is larger than it, so a `cat` of one hands back
|
|
3
|
+
// a middle-truncated preview and the file is then read a second time — the two wasted requests #1797
|
|
4
|
+
// measured. A number copied into code would be a second declaration of the cap and would drift the
|
|
5
|
+
// first time the settings changed; the harness's own default stands in only where the file declares
|
|
6
|
+
// nothing. Split out of `entry-read-set.ts` in joshuafolkken/kit#2161 to keep that file under its
|
|
7
|
+
// line ceiling.
|
|
8
|
+
|
|
9
|
+
import path from 'node:path'
|
|
10
|
+
import { document_section } from './document-section'
|
|
11
|
+
|
|
12
|
+
const SETTINGS_FILE = path.join('.claude', 'settings.json')
|
|
13
|
+
const HARNESS_DEFAULT_CAP_CHARS = 30_000
|
|
14
|
+
const ENV_KEY = 'env'
|
|
15
|
+
const CAP_KEY = 'BASH_MAX_OUTPUT_LENGTH'
|
|
16
|
+
const NONE = 0
|
|
17
|
+
|
|
18
|
+
function property_of(value: unknown, key: string): unknown {
|
|
19
|
+
if (typeof value !== 'object' || value === null) return undefined
|
|
20
|
+
|
|
21
|
+
return Reflect.get(value, key)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// **Parsed as JSON rather than matched in the raw text.** A regular expression takes the first
|
|
25
|
+
// occurrence anywhere in the file, so a hook command string naming the variable would win over the
|
|
26
|
+
// `env` block — and the report would then mark a file `cat`-able that a `cat` truncates. A file that
|
|
27
|
+
// is missing or does not parse answers `undefined` and falls through to the harness default below.
|
|
28
|
+
function declared_cap(text: string): unknown {
|
|
29
|
+
try {
|
|
30
|
+
return property_of(property_of(JSON.parse(text), ENV_KEY), CAP_KEY)
|
|
31
|
+
} catch {
|
|
32
|
+
return undefined
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function bash_output_cap(root: string): number {
|
|
37
|
+
const text = document_section.read_optional(path.join(root, SETTINGS_FILE)) ?? ''
|
|
38
|
+
const chars = Number(declared_cap(text))
|
|
39
|
+
|
|
40
|
+
return Number.isSafeInteger(chars) && chars > NONE ? chars : HARNESS_DEFAULT_CAP_CHARS
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const bash_output_cap_reader = { HARNESS_DEFAULT_CAP_CHARS, bash_output_cap }
|
|
44
|
+
|
|
45
|
+
export { bash_output_cap_reader }
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// The byte ceiling for every agent-read document NO entry reads — the fallback budget, a ratchet.
|
|
2
|
+
//
|
|
3
|
+
// **This is now the secondary budget** (joshuafolkken/kit#2257). The primary one is the entry total
|
|
4
|
+
// (`entry-read-budget.ts`): a document a workflow entry reads is held by that entry's total and
|
|
5
|
+
// carries no ceiling here, so neither budget holds it twice. What is left for this list is the
|
|
6
|
+
// documents no entry reads — the reference documents a human browses, drawn by
|
|
7
|
+
// `document-reachability.ts` from `read:set`'s output rather than by a hand-written table.
|
|
8
|
+
//
|
|
9
|
+
// Agent-read documents (`.claude/skills/**/*.md`, `prompts/**/*.md` and `docs/josh-commands.md`) have
|
|
10
|
+
// been shrunk by reduction epics (joshuafolkken/kit#1929, joshuafolkken/kit#1924) only to swell
|
|
11
|
+
// again, because nothing held the reduced size — a PR that adds a few lines at a time goes unseen
|
|
12
|
+
// until the next reduction epic. This list is that hold for the unreached ones:
|
|
13
|
+
// `document-byte-budget.test.ts` fails `pnpm josh gate` when such a document grows past its recorded
|
|
14
|
+
// ceiling, when the list names a file that no longer exists, or when an unreached file has no entry
|
|
15
|
+
// here.
|
|
16
|
+
//
|
|
17
|
+
// THE RECORDED CEILING IS BLOCK-QUANTIZED — this is what stops parallel command-adding lanes from
|
|
18
|
+
// serializing on this file (joshuafolkken/kit#2231). Each entry's `bytes` is not the document's exact
|
|
19
|
+
// size but the smallest multiple of `BLOCK_BYTES` at or above it, and that value IS the ceiling. A
|
|
20
|
+
// document that grows within its current block needs no edit here, so most command-adding PRs leave
|
|
21
|
+
// this file untouched rather than bumping a shared line; a document that crosses a block boundary
|
|
22
|
+
// bumps to the next multiple — the same value from every lane, an identical change git auto-merges,
|
|
23
|
+
// not a hand-picked slack unit two branches fight over. Growth is still bounded: the block is the
|
|
24
|
+
// whole of a document's headroom, so it cannot swell without a visible, deterministic bump in the
|
|
25
|
+
// diff. This replaced the earlier exact-size-plus-512-slack ratchet, whose tight slack forced
|
|
26
|
+
// `docs/josh-commands.md` — pinned at its ceiling — to bump on every command addition, the
|
|
27
|
+
// serialization point #2231 removed. It also retired the bespoke `JOSH_COMMANDS_CEILING_BYTES` hard
|
|
28
|
+
// cap and its per-bump changelog comment: the uniform block ratchet now holds that document like any
|
|
29
|
+
// other, so the second cap was a second line to bump for no added hold.
|
|
30
|
+
//
|
|
31
|
+
// HOW TO RAISE (or LOWER) A CEILING — this file is the only place, on purpose. When the gate reports a
|
|
32
|
+
// document over its ceiling, copy the exact value the message names (the next block multiple) into
|
|
33
|
+
// that document's entry, in the same PR, so the reason for the growth is visible in the diff a
|
|
34
|
+
// reviewer reads. A reduction epic that shrinks a document below a block lowers its entry the same
|
|
35
|
+
// way, to the multiple the stale-ratchet message names. Do NOT widen `BLOCK_BYTES` to dodge a bump —
|
|
36
|
+
// that loosens every ceiling at once, which is the opposite of the ratchet's purpose.
|
|
37
|
+
//
|
|
38
|
+
// It is a list of records rather than a path-keyed object because file paths are not valid object
|
|
39
|
+
// property names under the naming-convention lint rule.
|
|
40
|
+
|
|
41
|
+
interface DocumentBudget {
|
|
42
|
+
path: string
|
|
43
|
+
bytes: number
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The quantization block. A recorded ceiling is a multiple of this, so a document growing within a
|
|
47
|
+
// block needs no edit and one crossing a boundary bumps to the same next multiple from every lane —
|
|
48
|
+
// the property that keeps parallel lanes from conflicting on this file. Kept small enough that the
|
|
49
|
+
// ratchet still holds growth tightly: the block is the entire headroom a document has before its next
|
|
50
|
+
// deterministic bump. Widening it to dodge a bump is the workaround the ratchet exists to forbid, so
|
|
51
|
+
// its value is pinned by a test.
|
|
52
|
+
const BLOCK_BYTES = 4096
|
|
53
|
+
|
|
54
|
+
// The smallest multiple of `BLOCK_BYTES` at or above `size` — the recorded ceiling for a document of
|
|
55
|
+
// that size. Two lanes that grow the same document into the same block compute the same ceiling, so
|
|
56
|
+
// the edit they both make is identical and merges cleanly; a document growing within its block
|
|
57
|
+
// computes the ceiling it already has, so it needs no edit at all.
|
|
58
|
+
function block_ceiling(size: number): number {
|
|
59
|
+
return Math.ceil(size / BLOCK_BYTES) * BLOCK_BYTES
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Recorded byte ceiling of each unreached document — the block multiple at or above its size. Must
|
|
63
|
+
// name exactly the documents `document_reachability.unreached_documents()` derives: the test fails on
|
|
64
|
+
// a stale entry (a file that no longer exists or that an entry now reads) and on an un-budgeted
|
|
65
|
+
// unreached file, so the definition cannot rot as documents move on or off the execution path.
|
|
66
|
+
const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
|
|
67
|
+
{ path: '.claude/skills/dependency-update/SKILL.md', bytes: 8192 },
|
|
68
|
+
{ path: '.claude/skills/epic-commands/SKILL.md', bytes: 32_768 },
|
|
69
|
+
{ path: '.claude/skills/verify-ui/SKILL.md', bytes: 8192 },
|
|
70
|
+
{ path: '.claude/skills/workflow-commands/followup-reference.md', bytes: 16_384 },
|
|
71
|
+
{ path: '.claude/skills/workflow-commands/fullrun-steps.md', bytes: 8192 },
|
|
72
|
+
{ path: '.claude/skills/workflow-commands/into-target.md', bytes: 4096 },
|
|
73
|
+
{ path: '.claude/skills/workflow-commands/issue-comments.md', bytes: 8192 },
|
|
74
|
+
{ path: '.claude/skills/workflow-commands/issue-fold-existing.md', bytes: 4096 },
|
|
75
|
+
{ path: '.claude/skills/workflow-commands/needs-human-review.md', bytes: 8192 },
|
|
76
|
+
{ path: '.claude/skills/workflow-commands/observation-filing.md', bytes: 28_672 },
|
|
77
|
+
// `pre-gate-cut.md` left this per-document budget in joshuafolkken/kit#2289: it became a point-of-use
|
|
78
|
+
// document, so its bytes are now held by every entry's total read (`entry-read-budget.ts`) and the
|
|
79
|
+
// two budgets must not hold it twice — the reachability line moved it from `unreached` to
|
|
80
|
+
// `point-of-use`.
|
|
81
|
+
{ path: '.claude/skills/workflow-commands/prerequisite.md', bytes: 8192 },
|
|
82
|
+
{ path: '.claude/skills/workflow-commands/rule-residency.md', bytes: 24_576 },
|
|
83
|
+
{ path: '.claude/skills/workflow-commands/target-repository.md', bytes: 8192 },
|
|
84
|
+
{ path: '.claude/skills/workflow-commands/working-tree-hold.md', bytes: 8192 },
|
|
85
|
+
{ path: 'docs/josh-commands.md', bytes: 163_840 },
|
|
86
|
+
{ path: 'prompts/agent-rules.md', bytes: 4096 },
|
|
87
|
+
{ path: 'prompts/coding-standards.md', bytes: 16_384 },
|
|
88
|
+
{ path: 'prompts/collaboration-workflow.md', bytes: 8192 },
|
|
89
|
+
{ path: 'prompts/collaboration-workflow/consultation-vs-execution.md', bytes: 4096 },
|
|
90
|
+
{ path: 'prompts/collaboration-workflow/cross-repo-epic.md', bytes: 8192 },
|
|
91
|
+
{ path: 'prompts/collaboration-workflow/distributed-docs.md', bytes: 4096 },
|
|
92
|
+
{ path: 'prompts/collaboration-workflow/durable-rules.md', bytes: 4096 },
|
|
93
|
+
{ path: 'prompts/collaboration-workflow/epic-audit.md', bytes: 12_288 },
|
|
94
|
+
{ path: 'prompts/collaboration-workflow/epic-bundle.md', bytes: 24_576 },
|
|
95
|
+
{ path: 'prompts/collaboration-workflow/file-edits.md', bytes: 12_288 },
|
|
96
|
+
{ path: 'prompts/collaboration-workflow/gh-rest.md', bytes: 8192 },
|
|
97
|
+
{ path: 'prompts/collaboration-workflow/issue-citation.md', bytes: 8192 },
|
|
98
|
+
{ path: 'prompts/collaboration-workflow/issue-template.md', bytes: 24_576 },
|
|
99
|
+
{ path: 'prompts/collaboration-workflow/latest-first.md', bytes: 4096 },
|
|
100
|
+
{ path: 'prompts/collaboration-workflow/no-clones.md', bytes: 4096 },
|
|
101
|
+
{ path: 'prompts/collaboration-workflow/operating-rules.md', bytes: 24_576 },
|
|
102
|
+
{ path: 'prompts/collaboration-workflow/output-bounds.md', bytes: 16_384 },
|
|
103
|
+
{ path: 'prompts/collaboration-workflow/overview.md', bytes: 8192 },
|
|
104
|
+
{ path: 'prompts/collaboration-workflow/plan-comment.md', bytes: 20_480 },
|
|
105
|
+
{ path: 'prompts/collaboration-workflow/proposal-request.md', bytes: 4096 },
|
|
106
|
+
{ path: 'prompts/collaboration-workflow/report-format.md', bytes: 28_672 },
|
|
107
|
+
{ path: 'prompts/collaboration-workflow/residency.md', bytes: 20_480 },
|
|
108
|
+
{ path: 'prompts/collaboration-workflow/rule-delivery.md', bytes: 57_344 },
|
|
109
|
+
{ path: 'prompts/collaboration-workflow/shell-body.md', bytes: 12_288 },
|
|
110
|
+
{ path: 'prompts/collaboration-workflow/simplicity-first.md', bytes: 4096 },
|
|
111
|
+
{ path: 'prompts/collaboration-workflow/single-source-rules.md', bytes: 4096 },
|
|
112
|
+
{ path: 'prompts/collaboration-workflow/turn-batching.md', bytes: 24_576 },
|
|
113
|
+
{ path: 'prompts/collaboration-workflow/upstream-interrupt.md', bytes: 12_288 },
|
|
114
|
+
{ path: 'prompts/collaboration-workflow/wip-cap.md', bytes: 20_480 },
|
|
115
|
+
{ path: 'prompts/refactoring.md', bytes: 8192 },
|
|
116
|
+
{ path: 'prompts/review-rubric.md', bytes: 20_480 },
|
|
117
|
+
{ path: 'prompts/review.md', bytes: 20_480 },
|
|
118
|
+
{ path: 'prompts/sonar-hotspot-handling.md', bytes: 8192 },
|
|
119
|
+
{ path: 'prompts/testing-guide.md', bytes: 20_480 },
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
// The recorded ceiling for one path, or undefined when it carries no budget entry.
|
|
123
|
+
function recorded_bytes_for(relative_path: string): number | undefined {
|
|
124
|
+
return DOCUMENT_BYTE_BUDGET.find((entry) => entry.path === relative_path)?.bytes
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// The bytes an entry has left before its ceiling — the recorded ceiling minus the document's current
|
|
128
|
+
// size. Negative when the document is already over. `josh bytes` prints it as the headroom before an
|
|
129
|
+
// edit, the same number `josh lines` prints for code lines (joshuafolkken/kit#2176).
|
|
130
|
+
function remaining_bytes(recorded_bytes: number, current_bytes: number): number {
|
|
131
|
+
return recorded_bytes - current_bytes
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// The failure message the size test raises — names the file, its current byte size, its recorded
|
|
135
|
+
// ceiling, and where to raise it (this file), per the acceptance criteria.
|
|
136
|
+
//
|
|
137
|
+
// **It names the exact value to record**: the recorded ceiling is the block multiple at or above the
|
|
138
|
+
// document's size, so the number to write is `block_ceiling(current)` — a reader raising the ceiling
|
|
139
|
+
// copies it rather than computing it by hand. Two lanes that both cross into the same block copy the
|
|
140
|
+
// same value, so the edit they make merges without conflict.
|
|
141
|
+
function over_budget_message(
|
|
142
|
+
relative_path: string,
|
|
143
|
+
current_bytes: number,
|
|
144
|
+
recorded_bytes: number,
|
|
145
|
+
): string {
|
|
146
|
+
const ceiling = recorded_bytes.toString()
|
|
147
|
+
const current = current_bytes.toString()
|
|
148
|
+
const next = block_ceiling(current_bytes).toString()
|
|
149
|
+
const raise_hint = `raise its recorded size to ${next} in scripts/document/document-byte-budget.ts so the reason shows in the PR diff`
|
|
150
|
+
|
|
151
|
+
return `${relative_path} is ${current} bytes, over its ${ceiling}-byte ceiling. Shrink the document, or ${raise_hint}.`
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The failure message the staleness test raises. A recorded ceiling more than a block above the
|
|
155
|
+
// document's actual size is a stale-loose ratchet: the document shrank across a block boundary and
|
|
156
|
+
// its record was never lowered, so the ceiling no longer holds the reduction (the drift
|
|
157
|
+
// joshuafolkken/kit#2125 swept). It names the file, its recorded ceiling, its actual size, and the
|
|
158
|
+
// block multiple to lower the record to.
|
|
159
|
+
function stale_budget_message(
|
|
160
|
+
relative_path: string,
|
|
161
|
+
recorded_bytes: number,
|
|
162
|
+
current_bytes: number,
|
|
163
|
+
): string {
|
|
164
|
+
const recorded = recorded_bytes.toString()
|
|
165
|
+
const current = current_bytes.toString()
|
|
166
|
+
const next = block_ceiling(current_bytes).toString()
|
|
167
|
+
const lower_hint = `lower its recorded size to ${next} in scripts/document/document-byte-budget.ts so the ratchet holds the reduction`
|
|
168
|
+
|
|
169
|
+
return `${relative_path} records ${recorded} bytes but is ${current}, more than a block above actual. ${lower_hint}.`
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const document_byte_budget = {
|
|
173
|
+
DOCUMENT_BYTE_BUDGET,
|
|
174
|
+
BLOCK_BYTES,
|
|
175
|
+
block_ceiling,
|
|
176
|
+
over_budget_message,
|
|
177
|
+
recorded_bytes_for,
|
|
178
|
+
remaining_bytes,
|
|
179
|
+
stale_budget_message,
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export type { DocumentBudget }
|
|
183
|
+
export { document_byte_budget }
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { existsSync, statSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { document_byte_budget } from './document-byte-budget'
|
|
4
|
+
import { document_reachability } from './document-reachability'
|
|
5
|
+
import { entry_read_budget } from './entry-read-budget'
|
|
6
|
+
|
|
7
|
+
// The byte-ceiling check the gate's `document-byte-budget.test.ts` runs, made reachable on the fast
|
|
8
|
+
// between-edits path — `josh lint:related` calls it over the files it already resolved so a mandated
|
|
9
|
+
// documentation update that grows a document past its ceiling is caught in seconds rather than after
|
|
10
|
+
// the 80–90-second gate (joshuafolkken/kit#2176). The ceiling and its message are
|
|
11
|
+
// `document-byte-budget.ts`'s alone: this adds no budget of its own, so the fast path can never hold
|
|
12
|
+
// a different line from the gate, and widening one can never loosen the other.
|
|
13
|
+
//
|
|
14
|
+
// **It reads no change of its own.** `lint:related` has already resolved which files the change
|
|
15
|
+
// touched; taking that same list keeps the check inside the lint command's git contract — no second
|
|
16
|
+
// reading, and none at all when the caller narrowed by explicit arguments.
|
|
17
|
+
|
|
18
|
+
const LABEL = 'byte budget'
|
|
19
|
+
|
|
20
|
+
// The over-ceiling message given a size that is already known — the recorded value and the current
|
|
21
|
+
// size are handed in, so the decision is pure and tested without a filesystem or a budget lookup. A
|
|
22
|
+
// path with no budget entry (`recorded` undefined) is out of scope: the budget names exactly the
|
|
23
|
+
// agent-read documents, and everything else is not this check's to hold.
|
|
24
|
+
function ceiling_message(
|
|
25
|
+
relative_path: string,
|
|
26
|
+
current_bytes: number,
|
|
27
|
+
recorded_bytes: number | undefined,
|
|
28
|
+
): string | undefined {
|
|
29
|
+
if (recorded_bytes === undefined) return undefined
|
|
30
|
+
if (current_bytes <= recorded_bytes) return undefined
|
|
31
|
+
|
|
32
|
+
return document_byte_budget.over_budget_message(relative_path, current_bytes, recorded_bytes)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The same decision for an absolute path the caller resolved: its budget looked up by the
|
|
36
|
+
// repository-relative spelling, its size read from disk. A path with no budget entry, or one the
|
|
37
|
+
// tree no longer holds, is not over budget.
|
|
38
|
+
function over_budget_for(root: string, absolute_path: string): string | undefined {
|
|
39
|
+
const relative_path = path.relative(root, absolute_path)
|
|
40
|
+
const recorded = document_byte_budget.recorded_bytes_for(relative_path)
|
|
41
|
+
if (recorded === undefined || !existsSync(absolute_path)) return undefined
|
|
42
|
+
|
|
43
|
+
return ceiling_message(relative_path, statSync(absolute_path).size, recorded)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Every over-ceiling message across the resolved file list, in the order the files came in.
|
|
47
|
+
function over_budget_messages(
|
|
48
|
+
root: string,
|
|
49
|
+
absolute_files: ReadonlyArray<string>,
|
|
50
|
+
): ReadonlyArray<string> {
|
|
51
|
+
return absolute_files
|
|
52
|
+
.map((absolute_path) => over_budget_for(root, absolute_path))
|
|
53
|
+
.filter((message): message is string => message !== undefined)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The entry-total counterpart: an entry over its recorded ceiling. This is the primary budget
|
|
57
|
+
// (joshuafolkken/kit#2257), so an edit to a covered document — which grows an entry's total, not a
|
|
58
|
+
// per-document ceiling — is caught here on the same fast path. Stale ceilings are left to the gate's
|
|
59
|
+
// `entry-read-budget.test.ts`, exactly as the per-document staleness is: this path blocks growth.
|
|
60
|
+
function entry_over_budget_message(root: string, entry: string): string | undefined {
|
|
61
|
+
const recorded = entry_read_budget.recorded_bytes_for(entry)
|
|
62
|
+
if (recorded === undefined) return undefined
|
|
63
|
+
|
|
64
|
+
const current = entry_read_budget.entry_total_bytes(root, entry)
|
|
65
|
+
if (current <= recorded) return undefined
|
|
66
|
+
|
|
67
|
+
return entry_read_budget.over_budget_message(entry, current, recorded)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function entry_over_budget_messages(root: string): ReadonlyArray<string> {
|
|
71
|
+
return entry_read_budget.ENTRY_READ_BUDGET.map((entry) =>
|
|
72
|
+
entry_over_budget_message(root, entry.entry),
|
|
73
|
+
).filter((message): message is string => message !== undefined)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Whether the change touches a document some entry reads. A covered document's edit moves an entry
|
|
77
|
+
// total rather than a per-document ceiling, so the entry check runs only when one is in scope.
|
|
78
|
+
function touches_covered(root: string, absolute_files: ReadonlyArray<string>): boolean {
|
|
79
|
+
const covered = new Set(document_reachability.covered_documents(root))
|
|
80
|
+
|
|
81
|
+
return absolute_files.some((absolute_path) => covered.has(path.relative(root, absolute_path)))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Prints one labelled line per over-ceiling message and answers non-zero, or stays silent and
|
|
85
|
+
// answers zero when nothing is over budget.
|
|
86
|
+
function report(messages: ReadonlyArray<string>): number {
|
|
87
|
+
if (messages.length === 0) return 0
|
|
88
|
+
|
|
89
|
+
const lines = messages.map((message) => `${LABEL}: ${message}`)
|
|
90
|
+
|
|
91
|
+
process.stdout.write(`${lines.join('\n')}\n`)
|
|
92
|
+
|
|
93
|
+
return 1
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// The check over a resolved change — every over-ceiling document among the files the caller narrowed
|
|
97
|
+
// by, plus the entry totals when the change touches a document some entry reads.
|
|
98
|
+
function check_files(root: string, absolute_files: ReadonlyArray<string>): number {
|
|
99
|
+
const entry_messages = touches_covered(root, absolute_files)
|
|
100
|
+
? entry_over_budget_messages(root)
|
|
101
|
+
: []
|
|
102
|
+
|
|
103
|
+
return report([...over_budget_messages(root, absolute_files), ...entry_messages])
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// The check the caller runs when its scope widened to the whole tree (`mode === 'all'`) instead of a
|
|
107
|
+
// resolved change. `lint:related`'s own fallback lints a superset of the change, so the byte check
|
|
108
|
+
// widens to the whole budget rather than an empty file list — otherwise the fallback would report
|
|
109
|
+
// success on a tree it never read for bytes, and the green record the caller then writes would vouch
|
|
110
|
+
// for a byte dimension it never checked (joshuafolkken/kit#2176).
|
|
111
|
+
function check_all(root: string): number {
|
|
112
|
+
const absolute_files = document_byte_budget.DOCUMENT_BYTE_BUDGET.map((entry) =>
|
|
113
|
+
path.join(root, entry.path),
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
return report([
|
|
117
|
+
...over_budget_messages(root, absolute_files),
|
|
118
|
+
...entry_over_budget_messages(root),
|
|
119
|
+
])
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const document_byte_check = {
|
|
123
|
+
ceiling_message,
|
|
124
|
+
check_all,
|
|
125
|
+
check_files,
|
|
126
|
+
entry_over_budget_messages,
|
|
127
|
+
over_budget_for,
|
|
128
|
+
over_budget_messages,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export { document_byte_check }
|