@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,100 @@
|
|
|
1
|
+
// The path transform that makes kit's distributed AI documents resolve in a consumer, and the
|
|
2
|
+
// one-line CLAUDE.md import that replaces the old byte-copy (joshuafolkken/kit#1878). Applied at
|
|
3
|
+
// publish time to CLAUDE.md (scripts/build/build-claude-md.ts) and at copy time to the pointer files kit
|
|
4
|
+
// still ships whole (AGENTS.md / GEMINI.md / .cursorrules, via init-copy-content.ts).
|
|
5
|
+
|
|
6
|
+
// Where kit's own published files sit once a consumer has installed the package. Backtick-quoted
|
|
7
|
+
// references to anything kit ships are rewritten to this location so a consumer opens the installed
|
|
8
|
+
// copy rather than a path that exists only in the kit repository.
|
|
9
|
+
const KIT_PACKAGE_PATH_PREFIX = 'node_modules/@joshuafolkken/kit/'
|
|
10
|
+
|
|
11
|
+
const PROMPTS_PACKAGE_PREFIX = `${KIT_PACKAGE_PATH_PREFIX}prompts/`
|
|
12
|
+
const ESLINT_PACKAGE_PREFIX = `${KIT_PACKAGE_PATH_PREFIX}eslint/`
|
|
13
|
+
|
|
14
|
+
// kit files that are NOT published (tests, docs/) cannot be rewritten to a node_modules path — the
|
|
15
|
+
// consumer never receives them — so their backtick references become full GitHub URLs instead. A
|
|
16
|
+
// directory reference (trailing slash) points at the tree view, a file at the blob view.
|
|
17
|
+
const GITHUB_REPO_BLOB_BASE = 'https://github.com/joshuafolkken/kit/blob/main/'
|
|
18
|
+
const GITHUB_REPO_TREE_BASE = 'https://github.com/joshuafolkken/kit/tree/main/'
|
|
19
|
+
|
|
20
|
+
// The single line a consumer's CLAUDE.md carries: an import of kit's published, already
|
|
21
|
+
// path-transformed rules. The consumer's own additions sit below it. Distributed at publish time via
|
|
22
|
+
// dist/CLAUDE.md (build-claude-md.ts) rather than byte-copied at sync time, so a package update alone
|
|
23
|
+
// keeps the rules current (joshuafolkken/kit#1878).
|
|
24
|
+
const CLAUDE_MD_IMPORT_LINE = '@node_modules/@joshuafolkken/kit/dist/CLAUDE.md'
|
|
25
|
+
|
|
26
|
+
// A span containing `*` is excluded: it is a **glob**, not a reference to a file a consumer can
|
|
27
|
+
// open. A distributed document that writes a directory set as `prompts/**` means "anything beneath
|
|
28
|
+
// it", and rewriting that to `node_modules/@joshuafolkken/kit/prompts/**` would print a path that can
|
|
29
|
+
// never appear in a consumer's diff and is not what the set matches (joshuafolkken/kit#907).
|
|
30
|
+
function transform_prompt_paths(content: string): string {
|
|
31
|
+
return content.replaceAll(
|
|
32
|
+
/`prompts\/([^`*]+)`/gu,
|
|
33
|
+
(_match, prompt_path: string) => `\`${PROMPTS_PACKAGE_PREFIX}${prompt_path}\``,
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// The eslint/ directory is published (package.json `files`), so its backtick references — the
|
|
38
|
+
// distributed lint rules such as `eslint/rules/test-filename.js` — resolve in a consumer once
|
|
39
|
+
// rewritten to the installed location. Globs are skipped for the same reason prompts globs are.
|
|
40
|
+
function transform_eslint_paths(content: string): string {
|
|
41
|
+
return content.replaceAll(
|
|
42
|
+
/`eslint\/([^`*]+)`/gu,
|
|
43
|
+
(_match, eslint_path: string) => `\`${ESLINT_PACKAGE_PREFIX}${eslint_path}\``,
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Test files are excluded from the package (`files` carries `!**/*.test.ts`), so a backtick
|
|
48
|
+
// reference to one would be dead in a consumer. Rewrite it to the GitHub source instead, wherever in
|
|
49
|
+
// the tree it lives.
|
|
50
|
+
function transform_test_file_paths(content: string): string {
|
|
51
|
+
return content.replaceAll(
|
|
52
|
+
/`([^`*]+\.(?:test|spec)\.ts)`/gu,
|
|
53
|
+
(_match, test_path: string) => `\`${GITHUB_REPO_BLOB_BASE}${test_path}\``,
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function github_url_base(reference_path: string): string {
|
|
58
|
+
return reference_path.endsWith('/') ? GITHUB_REPO_TREE_BASE : GITHUB_REPO_BLOB_BASE
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// docs/ is not published, so its backtick references become GitHub URLs too. A bare `docs/` points at
|
|
62
|
+
// the tree view; a file underneath it at the blob view.
|
|
63
|
+
function transform_documentation_paths(content: string): string {
|
|
64
|
+
return content.replaceAll(
|
|
65
|
+
/`(docs\/[^`*]*)`/gu,
|
|
66
|
+
(_match, documentation_path: string) =>
|
|
67
|
+
`\`${github_url_base(documentation_path)}${documentation_path}\``,
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Every rewrite applied to a file kit distributes verbatim, so its backtick path references resolve
|
|
72
|
+
// in a consumer: bundled paths (prompts/, eslint/) point into node_modules, unbundled ones (tests,
|
|
73
|
+
// docs/) point at GitHub.
|
|
74
|
+
function transform_distributed_paths(content: string): string {
|
|
75
|
+
const with_prompts = transform_prompt_paths(content)
|
|
76
|
+
const with_eslint = transform_eslint_paths(with_prompts)
|
|
77
|
+
const with_tests = transform_test_file_paths(with_eslint)
|
|
78
|
+
|
|
79
|
+
return transform_documentation_paths(with_tests)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The consumer CLAUDE.md is one @import of kit's published rules plus whatever the project adds below
|
|
83
|
+
// it. Ensure the import line is present without disturbing those additions: an absent file becomes
|
|
84
|
+
// the line alone, a file already carrying it is returned untouched, and any other file keeps all its
|
|
85
|
+
// content with the import prepended. The substring check makes it idempotent.
|
|
86
|
+
function ensure_claude_md_import(existing: string | undefined): string {
|
|
87
|
+
if (existing === undefined) return `${CLAUDE_MD_IMPORT_LINE}\n`
|
|
88
|
+
if (existing.includes(CLAUDE_MD_IMPORT_LINE)) return existing
|
|
89
|
+
|
|
90
|
+
return `${CLAUDE_MD_IMPORT_LINE}\n\n${existing}`
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const distributed_paths = {
|
|
94
|
+
transform_prompt_paths,
|
|
95
|
+
transform_distributed_paths,
|
|
96
|
+
ensure_claude_md_import,
|
|
97
|
+
CLAUDE_MD_IMPORT_LINE,
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export { distributed_paths }
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { claude_plugin_config } from './claude-plugin-config'
|
|
2
|
+
import { hook_launch } from './hook-launch'
|
|
3
|
+
|
|
4
|
+
// The consumer's `.claude/settings.json` runs its hooks off the published package directly, not
|
|
5
|
+
// through `pnpm josh` (joshuafolkken/kit#1930, joshuafolkken/kit#2023). Two paths inside a hook
|
|
6
|
+
// command are rebased onto the installed package: the per-hook bundle `dist/hooks/<name>.js` a hook
|
|
7
|
+
// prefers, and the `pnpm josh <command>` fallback it drops to when that bundle is missing — which for
|
|
8
|
+
// a consumer becomes the `dist/josh.js` dispatcher, since the published package always ships `dist`
|
|
9
|
+
// and a `pnpm` launch would only add the wrapper this exists to remove.
|
|
10
|
+
//
|
|
11
|
+
// kit's own settings file keeps the `pnpm josh` fallback (`tsx scripts/josh/josh.ts` against live
|
|
12
|
+
// source), so a fresh clone with no `dist/` still runs the current guards. The rewrite is gated on the
|
|
13
|
+
// copy destination, exactly as the plugin injection is — kit's source tree is never transformed in
|
|
14
|
+
// place.
|
|
15
|
+
|
|
16
|
+
const PNPM_JOSH_PREFIX = 'pnpm josh '
|
|
17
|
+
const CODEX_ADAPTER_SOURCE = 'pnpm exec tsx scripts/hooks/codex-hook-adapter.ts'
|
|
18
|
+
// Relative to the consumer's project root, which is the working directory a Claude Code hook runs in.
|
|
19
|
+
// The path is the plugin marketplace's `node_modules` location plus the built entry `bin.josh` names.
|
|
20
|
+
const BUNDLE_INVOCATION = `node ${claude_plugin_config.MARKETPLACE_PATH}/dist/josh.js `
|
|
21
|
+
// The per-hook bundle directory a fresh clone builds, and where it lives inside the installed package.
|
|
22
|
+
const HOOK_BUNDLE_DIR = `${hook_launch.HOOK_DIST_DIR}/`
|
|
23
|
+
const CONSUMER_HOOK_BUNDLE_DIR = `${claude_plugin_config.MARKETPLACE_PATH}/${HOOK_BUNDLE_DIR}`
|
|
24
|
+
const CODEX_ADAPTER_BUNDLE = `node ${CONSUMER_HOOK_BUNDLE_DIR}codex-hook-adapter.js`
|
|
25
|
+
const CODEX_HOOKS_DESTINATION = '.codex/hooks.json'
|
|
26
|
+
const CODEX_ROOT_PREFIX = String.raw`cd \"$(git rev-parse --show-toplevel)\" && `
|
|
27
|
+
// Capture the value of every `"command"` field, escapes and all, so the rewrites below touch command
|
|
28
|
+
// values alone — never an echo reminder's prose or a `"description"` that merely mentions the string.
|
|
29
|
+
const COMMAND_FIELD = /("command":\s*")((?:[^"\\]|\\.)*)(")/gu
|
|
30
|
+
|
|
31
|
+
// Idempotent on its own: `CONSUMER_HOOK_BUNDLE_DIR` still contains `HOOK_BUNDLE_DIR`, so a blind
|
|
32
|
+
// second pass would rebase an already-rebased path onto itself. A value already targeting the
|
|
33
|
+
// installed package is left untouched, restoring the idempotency the earlier `pnpm josh`-anchored
|
|
34
|
+
// rewrite had for free.
|
|
35
|
+
function rebase_bundle_directory(value: string): string {
|
|
36
|
+
return value.includes(CONSUMER_HOOK_BUNDLE_DIR)
|
|
37
|
+
? value
|
|
38
|
+
: value.split(HOOK_BUNDLE_DIR).join(CONSUMER_HOOK_BUNDLE_DIR)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Rebase both paths a hook command can carry: the bundle it prefers, then the `pnpm josh` fallback.
|
|
42
|
+
// The bundle rewrite runs first — its replacement never contains `pnpm josh`, so the two are
|
|
43
|
+
// independent whichever order they run. The fallback rewrite is idempotent too (`BUNDLE_INVOCATION`
|
|
44
|
+
// holds no `pnpm josh `), so the whole rewrite is safe to run more than once.
|
|
45
|
+
function rewrite_command_value(value: string): string {
|
|
46
|
+
return rebase_bundle_directory(value)
|
|
47
|
+
.split(PNPM_JOSH_PREFIX)
|
|
48
|
+
.join(BUNDLE_INVOCATION)
|
|
49
|
+
.split(CODEX_ADAPTER_SOURCE)
|
|
50
|
+
.join(CODEX_ADAPTER_BUNDLE)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function rewrite_hook_commands(content: string, is_codex = false): string {
|
|
54
|
+
return content.replaceAll(COMMAND_FIELD, (_match, open: string, value: string, close: string) => {
|
|
55
|
+
const rewritten = rewrite_command_value(value)
|
|
56
|
+
const prefix = is_codex && !rewritten.startsWith(CODEX_ROOT_PREFIX) ? CODEX_ROOT_PREFIX : ''
|
|
57
|
+
|
|
58
|
+
return `${open}${prefix}${rewritten}${close}`
|
|
59
|
+
})
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Rewrite copied Claude and Codex hook files only; kit's source files keep their live-source fallback.
|
|
63
|
+
function apply_hook_command_rewrite_for_destination(
|
|
64
|
+
destination_path: string,
|
|
65
|
+
content: string,
|
|
66
|
+
): string {
|
|
67
|
+
if (destination_path.endsWith(CODEX_HOOKS_DESTINATION)) {
|
|
68
|
+
return rewrite_hook_commands(content, true)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (destination_path.endsWith(claude_plugin_config.CLAUDE_SETTINGS_DESTINATION)) {
|
|
72
|
+
return rewrite_hook_commands(content)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return content
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const hook_command_rewrite = {
|
|
79
|
+
apply_hook_command_rewrite_for_destination,
|
|
80
|
+
BUNDLE_INVOCATION,
|
|
81
|
+
PNPM_JOSH_PREFIX,
|
|
82
|
+
rewrite_hook_commands,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { hook_command_rewrite }
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// The shell command a Claude Code hook is launched with, so it starts without a `pnpm` wrapper — and,
|
|
2
|
+
// for a consumer, without the `dist/josh.js` dispatcher re-spawning `tsx` for the hook's `.ts`
|
|
3
|
+
// (joshuafolkken/kit#2023). Each hook is pre-built to its own `dist/hooks/<name>.js`
|
|
4
|
+
// (`scripts/build/build-hooks.ts`) and launched directly with `node`.
|
|
5
|
+
//
|
|
6
|
+
// **The fallback is a real branch, not a courtesy.** A fresh clone has no `dist/hooks/` until
|
|
7
|
+
// `pnpm build` runs, so the command prefers the bundle and drops to `pnpm josh <command>` (the live
|
|
8
|
+
// `tsx` source) when the bundle is absent, rather than passing silently. **An `if`/`else`, never
|
|
9
|
+
// `&&`/`||`**: a guard's refusal is a non-zero exit, and a `node … || pnpm josh …` chain would read
|
|
10
|
+
// that refusal as a missing bundle and run the hook twice. `[ -f ]` decides on the file alone and
|
|
11
|
+
// leaves the chosen branch's exit code untouched.
|
|
12
|
+
|
|
13
|
+
// Relative to the working directory a hook runs in — kit's own root, where the built `dist/hooks/`
|
|
14
|
+
// sits. The consumer rewrite (`hook-command-rewrite.ts`) rebases this onto the installed package.
|
|
15
|
+
const HOOK_DIST_DIR = 'dist/hooks'
|
|
16
|
+
|
|
17
|
+
// Prefer `primary_path` (run as `node <path>`) when it exists, else run `fallback_command` verbatim.
|
|
18
|
+
// Kept generic so a test can exercise the branch selection with stub commands rather than real hooks.
|
|
19
|
+
function launch_command(primary_path: string, fallback_command: string): string {
|
|
20
|
+
return `if [ -f ${primary_path} ]; then node ${primary_path}; else ${fallback_command}; fi`
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// `bundle` is the hook's file under `dist/hooks` (e.g. `pretool-guard.js`); `command` is the josh
|
|
24
|
+
// subcommand the fallback runs (e.g. `pretool:guard`).
|
|
25
|
+
function hook_launch_command(bundle: string, command: string): string {
|
|
26
|
+
return launch_command(`${HOOK_DIST_DIR}/${bundle}`, `pnpm josh ${command}`)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const hook_launch = { HOOK_DIST_DIR, hook_launch_command, launch_command }
|
|
30
|
+
|
|
31
|
+
export { hook_launch }
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { string_array_schema, vscode_settings_schema } from '#scripts/lib/schemas'
|
|
4
|
+
import { init_logic } from './init-logic'
|
|
5
|
+
import { package_path, PROJECT_ROOT } from './init-paths'
|
|
6
|
+
|
|
7
|
+
const PRETTIER_CONFIG_JS = 'prettier.config.js'
|
|
8
|
+
|
|
9
|
+
interface FileAction {
|
|
10
|
+
dest: string
|
|
11
|
+
create: () => string
|
|
12
|
+
merge?: (existing: string) => string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function read_package_file(relative_path: string): string {
|
|
16
|
+
return readFileSync(package_path(relative_path), 'utf8')
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function read_package_json(relative_path: string): unknown {
|
|
20
|
+
return JSON.parse(read_package_file(relative_path))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type MergeFunction = (existing: string) => string
|
|
24
|
+
|
|
25
|
+
function build_action(destination: string, create: () => string, merge: MergeFunction): FileAction {
|
|
26
|
+
return { dest: destination, create, merge }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function build_vscode_actions(): ReadonlyArray<FileAction> {
|
|
30
|
+
const extensions_path = path.join('.vscode', init_logic.VSCODE_EXTENSIONS_FILENAME)
|
|
31
|
+
const settings_path = path.join('.vscode', init_logic.get_vscode_settings_filename())
|
|
32
|
+
const extensions_raw = vscode_settings_schema.parse(read_package_json(extensions_path))
|
|
33
|
+
const raw_recommendations = extensions_raw['recommendations']
|
|
34
|
+
const recommendations = string_array_schema.parse(raw_recommendations)
|
|
35
|
+
const settings_data = init_logic.strip_kit_only_vscode_settings(
|
|
36
|
+
vscode_settings_schema.parse(read_package_json(settings_path)),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
return [
|
|
40
|
+
{
|
|
41
|
+
dest: '.vscode/extensions.json',
|
|
42
|
+
create: () => read_package_file(extensions_path),
|
|
43
|
+
merge: (existing) =>
|
|
44
|
+
init_logic.merge_json_array_field(existing, 'recommendations', recommendations),
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
dest: '.vscode/settings.json',
|
|
48
|
+
create: () =>
|
|
49
|
+
init_logic.strip_kit_only_vscode_settings_content(read_package_file(settings_path)),
|
|
50
|
+
merge: (existing) => init_logic.merge_json_object(existing, settings_data),
|
|
51
|
+
},
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Create-only: the rule list is a project-owned allowlist once it exists, so a consumer
|
|
56
|
+
// that added custom rules or disabled a noisy one must not have that overwritten.
|
|
57
|
+
function build_secretlint_action(): FileAction {
|
|
58
|
+
return {
|
|
59
|
+
dest: init_logic.get_secretlint_config_filename(),
|
|
60
|
+
create: () => init_logic.generate_secretlint_config(),
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// PROJECT_ROOT is what the consumer's `extends` paths resolve against, which the merge needs to
|
|
65
|
+
// migrate a retired `*.jsonc` preset path only once its renamed target is installed (#681).
|
|
66
|
+
function build_tsconfig_action(): FileAction {
|
|
67
|
+
return build_action(
|
|
68
|
+
'tsconfig.json',
|
|
69
|
+
() => init_logic.generate_tsconfig(),
|
|
70
|
+
(existing) =>
|
|
71
|
+
init_logic.merge_tsconfig_exclude(
|
|
72
|
+
init_logic.merge_tsconfig_extends(
|
|
73
|
+
existing,
|
|
74
|
+
init_logic.get_tsconfig_extends_entry(),
|
|
75
|
+
PROJECT_ROOT,
|
|
76
|
+
),
|
|
77
|
+
),
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function build_config_file_actions(): ReadonlyArray<FileAction> {
|
|
82
|
+
const lefthook_extends = init_logic.get_lefthook_extends_value()
|
|
83
|
+
|
|
84
|
+
return [
|
|
85
|
+
build_tsconfig_action(),
|
|
86
|
+
build_action(
|
|
87
|
+
'cspell.config.yaml',
|
|
88
|
+
() => init_logic.generate_cspell_config(),
|
|
89
|
+
(existing) => init_logic.merge_cspell_import(existing, init_logic.get_cspell_import_value()),
|
|
90
|
+
),
|
|
91
|
+
build_action(
|
|
92
|
+
'lefthook.yml',
|
|
93
|
+
() => init_logic.generate_lefthook_config(),
|
|
94
|
+
(existing) => init_logic.merge_lefthook_extends(existing, lefthook_extends),
|
|
95
|
+
),
|
|
96
|
+
build_secretlint_action(),
|
|
97
|
+
...build_vscode_actions(),
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function build_playwright_action(): FileAction {
|
|
102
|
+
return { dest: 'playwright.config.ts', create: () => init_logic.generate_playwright_config() }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function build_eslint_action(): FileAction {
|
|
106
|
+
return build_action(
|
|
107
|
+
'eslint.config.js',
|
|
108
|
+
() => init_logic.generate_eslint_config(),
|
|
109
|
+
(existing) => init_logic.merge_eslint_config(existing),
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Union-merge (not byte-copy) so an existing consumer .gitignore keeps its project-local
|
|
114
|
+
// entries while gaining any missing kit patterns.
|
|
115
|
+
function build_gitignore_action(): FileAction {
|
|
116
|
+
const template = read_package_file('templates/gitignore')
|
|
117
|
+
|
|
118
|
+
return build_action(
|
|
119
|
+
'.gitignore',
|
|
120
|
+
() => template,
|
|
121
|
+
(existing) => init_logic.merge_gitignore(existing, template),
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function build_file_actions(): ReadonlyArray<FileAction> {
|
|
126
|
+
return [
|
|
127
|
+
build_gitignore_action(),
|
|
128
|
+
build_action(
|
|
129
|
+
'.npmrc',
|
|
130
|
+
() => init_logic.generate_npmrc(),
|
|
131
|
+
(existing) => init_logic.merge_npmrc(existing),
|
|
132
|
+
),
|
|
133
|
+
build_eslint_action(),
|
|
134
|
+
build_action(
|
|
135
|
+
PRETTIER_CONFIG_JS,
|
|
136
|
+
() => init_logic.generate_prettier_config(),
|
|
137
|
+
(existing) => init_logic.merge_prettier_config(existing),
|
|
138
|
+
),
|
|
139
|
+
build_playwright_action(),
|
|
140
|
+
...build_config_file_actions(),
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const init_actions = { build_file_actions, read_package_json }
|
|
145
|
+
|
|
146
|
+
export type { FileAction }
|
|
147
|
+
export { init_actions, PRETTIER_CONFIG_JS }
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { is_workflow_destination } from '#scripts/claude/workflow-destination'
|
|
4
|
+
import { gh_spawn } from '#scripts/gh/gh-spawn'
|
|
5
|
+
import { managed_marker_logic } from '#scripts/managed-marker/managed-marker-logic'
|
|
6
|
+
import {
|
|
7
|
+
classify_path,
|
|
8
|
+
copy_directory_failure,
|
|
9
|
+
directory_copy_blocker,
|
|
10
|
+
} from '#scripts/sync/directory-copy-guard'
|
|
11
|
+
import { transform_copied_content } from './init-copy-content'
|
|
12
|
+
import { init_logic } from './init-logic'
|
|
13
|
+
import { package_path, PROJECT_ROOT } from './init-paths'
|
|
14
|
+
import { init_sonar } from './init-sonar'
|
|
15
|
+
|
|
16
|
+
const WORKSPACE_YAML = 'pnpm-workspace.yaml'
|
|
17
|
+
const CLAUDE_MD_FILENAME = 'CLAUDE.md'
|
|
18
|
+
|
|
19
|
+
// Whether the existing file is a workflow that carries no header. A read failure answers "no": the
|
|
20
|
+
// point is to warn, and a warning is not worth failing a command that used to open nothing.
|
|
21
|
+
function did_read_unstamped(destination_path: string): boolean {
|
|
22
|
+
try {
|
|
23
|
+
return !managed_marker_logic.is_marked(readFileSync(destination_path, 'utf8'))
|
|
24
|
+
} catch {
|
|
25
|
+
return false
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function copy_ai_file(source_path: string, destination_path: string): void {
|
|
30
|
+
const content = readFileSync(source_path, 'utf8')
|
|
31
|
+
|
|
32
|
+
mkdirSync(path.dirname(destination_path), { recursive: true })
|
|
33
|
+
writeFileSync(destination_path, transform_copied_content(destination_path, content))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// `init` declines to modify a file that already exists, and that includes not stamping it: the
|
|
37
|
+
// destination may hold a workflow the consumer wrote themselves, and a header claiming this package
|
|
38
|
+
// owns it would hold every bump to it back on a false premise. But an unstamped workflow is not
|
|
39
|
+
// merely out of date either — the consumer's auto-merge workflow reads the stamp, so until `sync`
|
|
40
|
+
// writes one, a bump to a workflow this package does overwrite merges and the next sync reverts it
|
|
41
|
+
// (joshuafolkken/kit#844). A warning is the honest middle: `sync` resolves it either way, and this
|
|
42
|
+
// names the consequence rather than leaving it to be discovered from a revert.
|
|
43
|
+
//
|
|
44
|
+
// The destination is checked before the file is opened, and a read failure is stepped over, so
|
|
45
|
+
// nothing here can turn a skipped file into a failed `init` the way it never was before.
|
|
46
|
+
function did_warn_unstamped_workflow(destination_path: string, label: string): boolean {
|
|
47
|
+
if (!is_workflow_destination(destination_path) || !did_read_unstamped(destination_path)) {
|
|
48
|
+
return false
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
console.warn(` ⚠ ${label} has no managed-workflow header — run josh sync before merging bumps`)
|
|
52
|
+
|
|
53
|
+
return true
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function did_skip_copy_if_absent(
|
|
57
|
+
source_path: string,
|
|
58
|
+
destination_path: string,
|
|
59
|
+
label: string,
|
|
60
|
+
): boolean {
|
|
61
|
+
if (existsSync(destination_path)) {
|
|
62
|
+
console.info(` ⏭ skipped ${label} (already exists — run josh sync to update)`)
|
|
63
|
+
did_warn_unstamped_workflow(destination_path, label)
|
|
64
|
+
|
|
65
|
+
return true
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
copy_ai_file(source_path, destination_path)
|
|
69
|
+
console.info(` ✔ created ${label}`)
|
|
70
|
+
|
|
71
|
+
return false
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function did_skip_workspace_yaml_copy(source_path: string, destination_path: string): boolean {
|
|
75
|
+
if (!existsSync(destination_path)) {
|
|
76
|
+
copy_ai_file(source_path, destination_path)
|
|
77
|
+
console.info(` ✔ created ${WORKSPACE_YAML}`)
|
|
78
|
+
|
|
79
|
+
return false
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const template = readFileSync(source_path, 'utf8')
|
|
83
|
+
const existing = readFileSync(destination_path, 'utf8')
|
|
84
|
+
const merged = init_logic.merge_workspace_yaml(existing, template)
|
|
85
|
+
|
|
86
|
+
if (merged !== existing) writeFileSync(destination_path, merged)
|
|
87
|
+
console.info(` ✔ updated ${WORKSPACE_YAML}`)
|
|
88
|
+
|
|
89
|
+
return false
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function did_skip_ai_file_copy(filename: string): boolean {
|
|
93
|
+
const source_path = package_path(filename)
|
|
94
|
+
const destination_path = path.join(PROJECT_ROOT, filename)
|
|
95
|
+
|
|
96
|
+
if (filename === WORKSPACE_YAML) {
|
|
97
|
+
return did_skip_workspace_yaml_copy(source_path, destination_path)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return did_skip_copy_if_absent(source_path, destination_path, filename)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function did_skip_ai_file_mapping(source: string, destination: string): boolean {
|
|
104
|
+
return did_skip_copy_if_absent(
|
|
105
|
+
package_path(source),
|
|
106
|
+
path.join(PROJECT_ROOT, destination),
|
|
107
|
+
destination,
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
interface DirectorySkip {
|
|
112
|
+
reason: string
|
|
113
|
+
is_blocked: boolean
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Two different skips, and telling them apart is what keeps the advice honest. A destination that is
|
|
117
|
+
// already a directory is `josh init` declining to overwrite, and `josh sync` is the answer. Anything
|
|
118
|
+
// the shared guard blocks — a source the package does not carry, a destination that is a file or a
|
|
119
|
+
// symlink — is a condition `josh sync` refuses in exactly the same way, so it is reported as a
|
|
120
|
+
// warning and not with a hint that would send the user around the same loop. The blocker runs first
|
|
121
|
+
// for that reason: it is the more specific reading of the same destination.
|
|
122
|
+
function directory_copy_skip(
|
|
123
|
+
source_path: string,
|
|
124
|
+
destination_path: string,
|
|
125
|
+
): DirectorySkip | undefined {
|
|
126
|
+
const blocker = directory_copy_blocker(source_path, destination_path)
|
|
127
|
+
|
|
128
|
+
if (blocker !== undefined) return { reason: blocker, is_blocked: true }
|
|
129
|
+
|
|
130
|
+
if (classify_path(destination_path) !== 'absent') {
|
|
131
|
+
return { reason: 'already exists — run josh sync to update', is_blocked: false }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return undefined
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function report_directory_skip(directory_name: string, skip: DirectorySkip): void {
|
|
138
|
+
const line = `${directory_name}/ (${skip.reason})`
|
|
139
|
+
|
|
140
|
+
if (skip.is_blocked) console.warn(` ⚠ skipped ${line}`)
|
|
141
|
+
else console.info(` ⏭ skipped ${line}`)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// The boolean answers "would `josh sync` overwrite this?", which is what the hint at the end of the
|
|
145
|
+
// run offers — not "did anything happen?". A blocked copy, and one whose walk failed part way, are
|
|
146
|
+
// both refused by `sync` for the same reason they were refused here, so raising the hint on either
|
|
147
|
+
// would send the user around the loop rather than at the cause.
|
|
148
|
+
function did_copy_directory(directory_name: string): boolean {
|
|
149
|
+
const failure = copy_directory_failure(
|
|
150
|
+
package_path(directory_name),
|
|
151
|
+
path.join(PROJECT_ROOT, directory_name),
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
if (failure !== undefined) {
|
|
155
|
+
console.warn(` ⚠ skipped ${directory_name}/ (${failure})`)
|
|
156
|
+
|
|
157
|
+
return false
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
console.info(` ✔ created ${directory_name}/`)
|
|
161
|
+
|
|
162
|
+
return true
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function did_skip_ai_directory_copy(directory_name: string): boolean {
|
|
166
|
+
const skip = directory_copy_skip(
|
|
167
|
+
package_path(directory_name),
|
|
168
|
+
path.join(PROJECT_ROOT, directory_name),
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
if (skip === undefined) {
|
|
172
|
+
did_copy_directory(directory_name)
|
|
173
|
+
|
|
174
|
+
return false
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
report_directory_skip(directory_name, skip)
|
|
178
|
+
|
|
179
|
+
return !skip.is_blocked
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// `josh init` writes the one-line CLAUDE.md import when the consumer has none, and — like every other
|
|
183
|
+
// AI file — leaves an existing one untouched so a consumer's additions are never disturbed. `josh sync`
|
|
184
|
+
// is what ensures the import line on an existing file (sync.ts). CLAUDE.md is no longer byte-copied
|
|
185
|
+
// (joshuafolkken/kit#1878), so it is handled here rather than through AI_COPY_FILES.
|
|
186
|
+
function did_skip_claude_md_import(): boolean {
|
|
187
|
+
const destination_path = path.join(PROJECT_ROOT, CLAUDE_MD_FILENAME)
|
|
188
|
+
|
|
189
|
+
if (existsSync(destination_path)) {
|
|
190
|
+
console.info(` ⏭ skipped ${CLAUDE_MD_FILENAME} (already exists — run josh sync to update)`)
|
|
191
|
+
|
|
192
|
+
return true
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
writeFileSync(destination_path, init_logic.ensure_claude_md_import(undefined))
|
|
196
|
+
console.info(` ✔ created ${CLAUDE_MD_FILENAME}`)
|
|
197
|
+
|
|
198
|
+
return false
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Returns the repository name resolved for the Sonar config, so `josh init` can reuse it for the
|
|
202
|
+
// security-updates report instead of spawning a second `gh repo view` (joshuafolkken/kit#805).
|
|
203
|
+
// Resolving it here rather than in the caller keeps every AI-file write ahead of the network call.
|
|
204
|
+
function run_ai_copies(): string | undefined {
|
|
205
|
+
const did_skip_claude_md = did_skip_claude_md_import()
|
|
206
|
+
const file_skips = init_logic
|
|
207
|
+
.get_ai_copy_files()
|
|
208
|
+
.map((filename) => did_skip_ai_file_copy(filename))
|
|
209
|
+
const mapping_skips = init_logic
|
|
210
|
+
.get_ai_copy_file_mappings()
|
|
211
|
+
.map(({ src: source, dest: destination }) => did_skip_ai_file_mapping(source, destination))
|
|
212
|
+
const directory_skips = init_logic
|
|
213
|
+
.get_ai_copy_directories()
|
|
214
|
+
.map((directory_name) => did_skip_ai_directory_copy(directory_name))
|
|
215
|
+
const has_skips = [did_skip_claude_md, ...file_skips, ...mapping_skips, ...directory_skips].some(
|
|
216
|
+
Boolean,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
const name_with_owner = gh_spawn.get_repo_name_with_owner()
|
|
220
|
+
|
|
221
|
+
init_sonar.copy_sonar_with_template(name_with_owner)
|
|
222
|
+
|
|
223
|
+
if (has_skips) {
|
|
224
|
+
console.info('\n 💡 Run `josh sync` to overwrite skipped AI files with the latest version.')
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return name_with_owner
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const init_ai_copy = {
|
|
231
|
+
copy_ai_file,
|
|
232
|
+
run_ai_copies,
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export { init_ai_copy }
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { managed_marker_logic } from '#scripts/managed-marker/managed-marker-logic'
|
|
2
|
+
import { workflow_pin_logic } from '#scripts/sync/workflow-pin-logic'
|
|
3
|
+
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
4
|
+
import { claude_plugin_config } from './claude-plugin-config'
|
|
5
|
+
import { hook_command_rewrite } from './hook-command-rewrite'
|
|
6
|
+
import { init_logic } from './init-logic'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The single transform applied to every file kit copies verbatim into a consumer
|
|
10
|
+
* repository, by both `josh init` and `josh sync`.
|
|
11
|
+
*
|
|
12
|
+
* Workflow destinations get two further passes. Their action pins are resolved from
|
|
13
|
+
* .github/workflows, so the committed template refs never have to be current; and they are
|
|
14
|
+
* stamped as written by this package, so the consumer's auto-merge workflow can tell a bump
|
|
15
|
+
* kit will overwrite from one the consumer owns. Keeping both write paths on this one
|
|
16
|
+
* function is what makes either guarantee hold: a path that called only
|
|
17
|
+
* transform_prompt_paths would ship whatever ref the template happens to carry, and an
|
|
18
|
+
* unstamped workflow would read as consumer-owned and merge itself into a revert loop. See
|
|
19
|
+
* workflow-pin-logic.ts for why the template refs are not authoritative, and
|
|
20
|
+
* managed-marker-logic.ts for why the stamp is on the file rather than in a list.
|
|
21
|
+
*
|
|
22
|
+
* The consumer's `.claude/settings.json` gets two further passes. The kit plugin's marketplace and
|
|
23
|
+
* `enabledPlugins` declaration is injected, because the skills that used to be copied now ship as the
|
|
24
|
+
* `kit` plugin and load from that declaration (joshuafolkken/kit#1879). And its hook commands are
|
|
25
|
+
* rewritten from `pnpm josh` to the published bundle invoked directly with node
|
|
26
|
+
* (joshuafolkken/kit#1930), so a consumer's guarded call does not pay a `pnpm` launch it never needed.
|
|
27
|
+
* Keeping both on this one function is the same guarantee as the workflow passes — a copy path that
|
|
28
|
+
* skipped the plugin block would ship a settings file that never enables the plugin, and one that
|
|
29
|
+
* skipped the rewrite would leave every consumer hook slower than it has to be.
|
|
30
|
+
*/
|
|
31
|
+
function transform_copied_content(destination_path: string, content: string): string {
|
|
32
|
+
const with_paths = init_logic.transform_distributed_paths(content)
|
|
33
|
+
const with_pins = workflow_pin_logic.apply_pins_for_destination(destination_path, with_paths)
|
|
34
|
+
const with_marker = managed_marker_logic.apply_marker_for_destination(
|
|
35
|
+
destination_path,
|
|
36
|
+
with_pins,
|
|
37
|
+
KIT_PACKAGE_NAME,
|
|
38
|
+
)
|
|
39
|
+
const with_plugin = claude_plugin_config.apply_plugin_config_for_destination(
|
|
40
|
+
destination_path,
|
|
41
|
+
with_marker,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
return hook_command_rewrite.apply_hook_command_rewrite_for_destination(
|
|
45
|
+
destination_path,
|
|
46
|
+
with_plugin,
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { transform_copied_content }
|