@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,219 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { resolve_local_bin } from '#scripts/build/local-bin'
|
|
6
|
+
import { doctor_io } from '#scripts/doctor/doctor-io'
|
|
7
|
+
import { package_version_schema, with_package_manager_schema } from '#scripts/lib/schemas'
|
|
8
|
+
import { auto_merge_setting } from '#scripts/repo/auto-merge-setting'
|
|
9
|
+
import { security_updates } from '#scripts/security/security-updates'
|
|
10
|
+
import { did_refuse_self_run } from '#scripts/self-sync-guard/self-sync-refusal'
|
|
11
|
+
import { sync } from '#scripts/sync/sync'
|
|
12
|
+
import { package_manager_version } from '#scripts/version/package-manager-version'
|
|
13
|
+
import { execaSync } from 'execa'
|
|
14
|
+
import { init_actions, PRETTIER_CONFIG_JS, type FileAction } from './init-actions'
|
|
15
|
+
import { init_ai_copy } from './init-ai-copy'
|
|
16
|
+
import { init_logic } from './init-logic'
|
|
17
|
+
import { PACKAGE_DIR, PROJECT_ROOT } from './init-paths'
|
|
18
|
+
import { plugin_install_hint_module } from './plugin-install-hint'
|
|
19
|
+
|
|
20
|
+
const PACKAGE_JSON = 'package.json'
|
|
21
|
+
const KIT_PACKAGE_NAME = '@joshuafolkken/kit'
|
|
22
|
+
const LEFTHOOK_BIN = 'lefthook'
|
|
23
|
+
const SAMPLE_INDENT_WIDTH = 4
|
|
24
|
+
const SAMPLE_INDENT = ' '.repeat(SAMPLE_INDENT_WIDTH)
|
|
25
|
+
|
|
26
|
+
function write_new_file(action: FileAction, destination_path: string): void {
|
|
27
|
+
mkdirSync(path.dirname(destination_path), { recursive: true })
|
|
28
|
+
writeFileSync(destination_path, action.create())
|
|
29
|
+
console.info(` ✔ created ${action.dest}`)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function show_sample(action: FileAction): void {
|
|
33
|
+
console.info(` ⚠ exists ${action.dest} — add manually:`)
|
|
34
|
+
console.info('')
|
|
35
|
+
console.info(action.create().replaceAll(/^/gmu, () => SAMPLE_INDENT))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function merge_existing_file(
|
|
39
|
+
merge_function: (existing: string) => string,
|
|
40
|
+
destination_path: string,
|
|
41
|
+
destination: string,
|
|
42
|
+
): void {
|
|
43
|
+
const existing = readFileSync(destination_path, 'utf8')
|
|
44
|
+
const merged = merge_function(existing)
|
|
45
|
+
|
|
46
|
+
if (merged === existing) {
|
|
47
|
+
console.info(` ✔ unchanged ${destination}`)
|
|
48
|
+
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
writeFileSync(destination_path, merged)
|
|
53
|
+
console.info(` ✔ updated ${destination}`)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function execute_file_action(action: FileAction): void {
|
|
57
|
+
const destination_path = path.join(PROJECT_ROOT, action.dest)
|
|
58
|
+
const is_existing = existsSync(destination_path)
|
|
59
|
+
|
|
60
|
+
if (!is_existing) {
|
|
61
|
+
write_new_file(action, destination_path)
|
|
62
|
+
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (action.merge === undefined) {
|
|
67
|
+
show_sample(action)
|
|
68
|
+
|
|
69
|
+
return
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
merge_existing_file(action.merge, destination_path, action.dest)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function get_kit_package_manager(): string | undefined {
|
|
76
|
+
const { packageManager: package_manager } = with_package_manager_schema.parse(
|
|
77
|
+
init_actions.read_package_json(PACKAGE_JSON),
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
return package_manager !== undefined && package_manager.length > 0 ? package_manager : undefined
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function get_kit_development_engines(): Record<string, unknown> {
|
|
84
|
+
return init_logic.get_development_engines_value()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Pin the kit to its own published version so the generated configs (which all import
|
|
88
|
+
// `@joshuafolkken/kit/...`) resolve. Exact pin matches the consumer convention.
|
|
89
|
+
function get_kit_self_dependency(): Record<string, string> {
|
|
90
|
+
const { version } = package_version_schema.parse(init_actions.read_package_json(PACKAGE_JSON))
|
|
91
|
+
|
|
92
|
+
return { [KIT_PACKAGE_NAME]: version }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function apply_dependency_merges(content: string): string {
|
|
96
|
+
const migrated = init_logic.strip_managed_postinstall(content)
|
|
97
|
+
const merged = init_logic.merge_package_scripts(
|
|
98
|
+
migrated,
|
|
99
|
+
init_logic.get_suggested_scripts_for_content(migrated),
|
|
100
|
+
)
|
|
101
|
+
const with_prettier = init_logic.merge_prettier_plugin_development_deps(merged)
|
|
102
|
+
const with_secretlint = init_logic.merge_secretlint_development_deps(with_prettier)
|
|
103
|
+
|
|
104
|
+
return init_logic.merge_development_dependencies(with_secretlint, get_kit_self_dependency())
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function apply_package_json_merges(content: string): string {
|
|
108
|
+
const with_kit = apply_dependency_merges(content)
|
|
109
|
+
const upgraded = init_logic.upgrade_prepare_lefthook_warning(with_kit)
|
|
110
|
+
const with_lifecycle = init_logic.merge_prepare_lifecycle_cmd(upgraded)
|
|
111
|
+
const kit_pm = get_kit_package_manager()
|
|
112
|
+
const with_pm =
|
|
113
|
+
kit_pm === undefined ? with_lifecycle : init_logic.merge_package_manager(with_lifecycle, kit_pm)
|
|
114
|
+
const with_de = init_logic.merge_development_engines(with_pm, get_kit_development_engines())
|
|
115
|
+
const sorted = init_logic.sort_package_json_keys(with_de)
|
|
116
|
+
|
|
117
|
+
// Pin devEngines.packageManager.version to the packageManager just written so a
|
|
118
|
+
// freshly scaffolded (or re-initialized) consumer never trips the pnpm
|
|
119
|
+
// dual-declaration warning.
|
|
120
|
+
return package_manager_version.align_development_engines_version(sorted)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function merge_project_package_json(): void {
|
|
124
|
+
const package_json_path = path.join(PROJECT_ROOT, PACKAGE_JSON)
|
|
125
|
+
if (!existsSync(package_json_path)) return
|
|
126
|
+
|
|
127
|
+
const existing = readFileSync(package_json_path, 'utf8')
|
|
128
|
+
const merged = apply_package_json_merges(existing)
|
|
129
|
+
|
|
130
|
+
if (merged === existing) {
|
|
131
|
+
console.info(' ✔ unchanged package.json')
|
|
132
|
+
|
|
133
|
+
return
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
writeFileSync(package_json_path, merged)
|
|
137
|
+
console.info(' ✔ updated package.json')
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function install_lefthook(): void {
|
|
141
|
+
console.info('\nLefthook:')
|
|
142
|
+
const bin = resolve_local_bin(PROJECT_ROOT, LEFTHOOK_BIN)
|
|
143
|
+
const result = execaSync(bin, ['install'], { cwd: PROJECT_ROOT, stdio: 'inherit', reject: false })
|
|
144
|
+
|
|
145
|
+
if (result.exitCode === undefined) {
|
|
146
|
+
console.warn(' ⚠ lefthook install failed — run it manually: lefthook install')
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function run_config_file_actions(): void {
|
|
151
|
+
console.info('Config files:')
|
|
152
|
+
|
|
153
|
+
if (sync.migrate_prettierrc(path.join(PROJECT_ROOT, PRETTIER_CONFIG_JS))) {
|
|
154
|
+
console.info(' ✔ migrated .prettierrc → prettier.config.js')
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
for (const action of init_actions.build_file_actions()) {
|
|
158
|
+
execute_file_action(action)
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Gated, unlike `sync`: `init` skips a file the consumer already has, so neither the npm-disable
|
|
163
|
+
// (joshuafolkken/kit#803) nor the auto-merge workflow (joshuafolkken/kit#834) may have landed, and a
|
|
164
|
+
// report's claim would then be false. `sync` overwrites both unconditionally, which is why it needs
|
|
165
|
+
// no gate. The gates are the artifacts themselves, so a consumer's own pre-existing auto-merge
|
|
166
|
+
// workflow still gets its prerequisite reported — it needs the same repository setting kit's does.
|
|
167
|
+
function report_repository_settings(name_with_owner: string | undefined): void {
|
|
168
|
+
if (doctor_io.has_distributed_dependabot_config(PROJECT_ROOT, PROJECT_ROOT)) {
|
|
169
|
+
security_updates.report_security_updates_section(name_with_owner)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (doctor_io.has_auto_merge_workflow(PROJECT_ROOT, PROJECT_ROOT)) {
|
|
173
|
+
auto_merge_setting.report_auto_merge_section(name_with_owner)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// The same refusal `sync` makes, for a larger blast radius: `init` calls the `sync` writers directly
|
|
178
|
+
// rather than through `sync`'s own `main()`, so the guard there never ran for it — and on top of the
|
|
179
|
+
// 14 files #868 reproduced, `init` also rewrites `package.json` scripts and devDependencies
|
|
180
|
+
// (joshuafolkken/kit#879). Checked before the first write, for the reason the sync guard is.
|
|
181
|
+
function run_ai_file_actions(): void {
|
|
182
|
+
console.info('\nAI files:')
|
|
183
|
+
// `init` writes the same npm-disabling `.github/dependabot.yml` that `sync` distributes, so a
|
|
184
|
+
// freshly scaffolded repository is exposed from its first commit — and a new private repository
|
|
185
|
+
// is exactly where the setting is off by default. The name is the one the Sonar config already
|
|
186
|
+
// resolved, so `gh repo view` runs once; the position is the pre-existing one.
|
|
187
|
+
const name_with_owner = init_ai_copy.run_ai_copies()
|
|
188
|
+
|
|
189
|
+
install_lefthook()
|
|
190
|
+
|
|
191
|
+
report_repository_settings(name_with_owner)
|
|
192
|
+
|
|
193
|
+
plugin_install_hint_module.report_plugin_install_hint()
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function main(): void {
|
|
197
|
+
if (did_refuse_self_run(PACKAGE_DIR, PROJECT_ROOT)) return
|
|
198
|
+
|
|
199
|
+
console.info('\n🚀 Initializing @joshuafolkken/kit\n')
|
|
200
|
+
run_config_file_actions()
|
|
201
|
+
|
|
202
|
+
console.info('\nPackage scripts:')
|
|
203
|
+
merge_project_package_json()
|
|
204
|
+
|
|
205
|
+
run_ai_file_actions()
|
|
206
|
+
console.info('\n✅ Done.\n')
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
210
|
+
|
|
211
|
+
const init = {
|
|
212
|
+
copy_ai_file: init_ai_copy.copy_ai_file,
|
|
213
|
+
apply_package_json_merges,
|
|
214
|
+
install_lefthook,
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// `init` is the entry point; `main` is exported for its own unit test, the way `sync.ts` exports the
|
|
218
|
+
// `main()` its self-run guard lives in.
|
|
219
|
+
export { init, main }
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Detect whether a consumer's managed-config list already references a `@joshuafolkken/*`
|
|
2
|
+
// preset for a given subsystem (lefthook / cspell / tsconfig). Every ecosystem preset — kit's
|
|
3
|
+
// own base as well as an app-kit / game-kit framework preset — embeds, extends, or imports kit
|
|
4
|
+
// base by construction, so the presence of ANY such entry means kit base is already layered
|
|
5
|
+
// exactly once. `josh sync` uses these predicates to avoid adding a SECOND kit-base reference
|
|
6
|
+
// (which double-extends `lefthook/base.yml` into a hard recursion crash, and redundantly re-imports
|
|
7
|
+
// the cspell / tsconfig base). Matching the consumer's own config content — not the dependency
|
|
8
|
+
// tree — keeps the check source-of-truth-driven and free of any hardcoded package name.
|
|
9
|
+
|
|
10
|
+
// A lefthook `extends` path such as `node_modules/@joshuafolkken/app-kit/lefthook/sveltekit.yml`
|
|
11
|
+
// or `node_modules/@joshuafolkken/kit/lefthook/vanilla.yml`.
|
|
12
|
+
const KIT_LEFTHOOK_PRESET = /@joshuafolkken\/[^/]+\/lefthook\//u
|
|
13
|
+
// A cspell `import` value such as `@joshuafolkken/app-kit/cspell/sveltekit` or the bare base
|
|
14
|
+
// `@joshuafolkken/kit/cspell` (hence the trailing `/`-or-end alternation).
|
|
15
|
+
const KIT_CSPELL_PRESET = /@joshuafolkken\/[^/]+\/cspell(?:\/|$)/u
|
|
16
|
+
// A tsconfig `extends` path such as `./node_modules/@joshuafolkken/app-kit/tsconfig/sveltekit.json`
|
|
17
|
+
// or `./node_modules/@joshuafolkken/kit/tsconfig/base.json`. Extension-agnostic on purpose, so the
|
|
18
|
+
// retired `.jsonc` form still matches and gets migrated rather than double-extended (#681).
|
|
19
|
+
const KIT_TSCONFIG_PRESET = /@joshuafolkken\/[^/]+\/tsconfig\//u
|
|
20
|
+
// A `*/sveltekit` framework preset referenced by an in-repo RELATIVE path that carries no
|
|
21
|
+
// `@joshuafolkken/` prefix — the shape a self-hosting repo (app-kit's own repo) uses, e.g.
|
|
22
|
+
// `./tsconfig/sveltekit.json`, `./cspell/sveltekit.yaml`, `lefthook/sveltekit.yml`. Such a preset
|
|
23
|
+
// re-exports / inlines kit base by construction, so kit base must not be injected alongside it. The
|
|
24
|
+
// KIT_*_PRESET regexes above only catch the installed-dependency form (`@joshuafolkken/…/sveltekit`);
|
|
25
|
+
// this segment-anchored fallback covers the prefix-less relative form. The `(?<![\w-])` /
|
|
26
|
+
// `(?![\w-])` boundaries anchor `sveltekit` to a complete path segment — mirroring app-kit's
|
|
27
|
+
// config-patch anchoring — so a `sveltekit-*` / `*-sveltekit` sibling and hyphenated `svelte-kit`
|
|
28
|
+
// are left untouched. See joshuafolkken/kit#664.
|
|
29
|
+
const SVELTEKIT_PRESET = /(?<![\w-])sveltekit(?![\w-])/u
|
|
30
|
+
|
|
31
|
+
function has_match(entries: ReadonlyArray<string>, pattern: RegExp): boolean {
|
|
32
|
+
return entries.some((entry) => pattern.test(entry))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// True when any entry references kit base for this subsystem (via a `@joshuafolkken/*` preset) or a
|
|
36
|
+
// prefix-less `*/sveltekit` framework preset that re-exports it — either means kit base is already
|
|
37
|
+
// layered exactly once, so `josh sync` must skip injecting a second base reference.
|
|
38
|
+
function is_base_present(entries: ReadonlyArray<string>, subsystem_pattern: RegExp): boolean {
|
|
39
|
+
return has_match(entries, subsystem_pattern) || has_match(entries, SVELTEKIT_PRESET)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function is_lefthook_base_present(entries: ReadonlyArray<string>): boolean {
|
|
43
|
+
return is_base_present(entries, KIT_LEFTHOOK_PRESET)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function is_cspell_base_present(entries: ReadonlyArray<string>): boolean {
|
|
47
|
+
return is_base_present(entries, KIT_CSPELL_PRESET)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function is_tsconfig_base_present(entries: ReadonlyArray<string>): boolean {
|
|
51
|
+
return is_base_present(entries, KIT_TSCONFIG_PRESET)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const kit_base_preset = {
|
|
55
|
+
is_lefthook_base_present,
|
|
56
|
+
is_cspell_base_present,
|
|
57
|
+
is_tsconfig_base_present,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export { kit_base_preset }
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { readdirSync } from 'node:fs'
|
|
2
|
+
import os from 'node:os'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { claude_plugin_config } from './claude-plugin-config'
|
|
5
|
+
|
|
6
|
+
// `josh init` / `josh sync` declare the kit plugin in the consumer's `.claude/settings.json`, but the
|
|
7
|
+
// CLI does not install it from the declaration alone — a consumer runs `claude plugin install kit@kit`
|
|
8
|
+
// once (joshuafolkken/kit#1930). Nothing said so at the end of init or sync, so a consumer whose
|
|
9
|
+
// skills silently never loaded had no pointer to the one command that fixes it. This prints that
|
|
10
|
+
// command on completion, unless the plugin already appears installed.
|
|
11
|
+
|
|
12
|
+
const PLUGINS_SUBDIR = path.join('.claude', 'plugins')
|
|
13
|
+
|
|
14
|
+
// Best effort: Claude Code records installed marketplaces under `~/.claude/plugins`. The kit
|
|
15
|
+
// marketplace directory being present is the strongest signal available at the shell; the plugin's
|
|
16
|
+
// enabled state is not readable here, so an uncertain read (no directory, no permission) counts as
|
|
17
|
+
// "not installed". A hint shown once too often costs a line; one never shown costs a consumer its skills.
|
|
18
|
+
function is_plugin_installed(home_directory: string = os.homedir()): boolean {
|
|
19
|
+
try {
|
|
20
|
+
return readdirSync(path.join(home_directory, PLUGINS_SUBDIR)).some(
|
|
21
|
+
(entry) =>
|
|
22
|
+
entry === claude_plugin_config.MARKETPLACE_NAME ||
|
|
23
|
+
entry.startsWith(`${claude_plugin_config.MARKETPLACE_NAME}@`),
|
|
24
|
+
)
|
|
25
|
+
} catch {
|
|
26
|
+
return false
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function plugin_install_hint(is_installed: boolean): string | undefined {
|
|
31
|
+
if (is_installed) return undefined
|
|
32
|
+
|
|
33
|
+
return ` ℹ Skills load from the kit plugin. If they are missing, run: claude plugin install ${claude_plugin_config.PLUGIN_ID}`
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function report_plugin_install_hint(home_directory?: string): void {
|
|
37
|
+
const hint = plugin_install_hint(is_plugin_installed(home_directory))
|
|
38
|
+
if (hint !== undefined) console.info(hint)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const plugin_install_hint_module = {
|
|
42
|
+
is_plugin_installed,
|
|
43
|
+
plugin_install_hint,
|
|
44
|
+
report_plugin_install_hint,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { plugin_install_hint_module }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { parse_jsonc } from '#scripts/config-merge/parse-jsonc'
|
|
4
|
+
import { patch_json_key } from '#scripts/config-merge/patch-json-key'
|
|
5
|
+
import { string_array_schema } from '#scripts/lib/schemas'
|
|
6
|
+
|
|
7
|
+
// kit-family tsconfig presets used to ship with a `.jsonc` extension. Playwright (>= 1.62) appends
|
|
8
|
+
// `.json` to any `extends` entry that does not already end in it and then hard-throws when the
|
|
9
|
+
// resulting path is missing, so `…/tsconfig/base.jsonc` resolved to `…/tsconfig/base.jsonc.json`
|
|
10
|
+
// and the entire E2E suite failed to start. (Before the throw was added the preset was simply never
|
|
11
|
+
// applied, so the mis-resolution was silently wrong there too.) The presets are now shipped as
|
|
12
|
+
// `*.json`; a consumer whose `extends` still points at the old path would never be repaired by the
|
|
13
|
+
// ensure-based merge — an `@joshuafolkken/*` tsconfig entry is already present, so nothing is added
|
|
14
|
+
// — hence the rewrite here. Scoped to `@joshuafolkken/*/tsconfig/*` paths so an unrelated
|
|
15
|
+
// project-local `.jsonc` config is left alone. See joshuafolkken/kit#681.
|
|
16
|
+
const LEGACY_PRESET_ENTRY = /@joshuafolkken\/[^/]+\/tsconfig\/[^/]+\.jsonc$/u
|
|
17
|
+
const LEGACY_SUFFIX = '.jsonc'
|
|
18
|
+
const CURRENT_SUFFIX = '.json'
|
|
19
|
+
|
|
20
|
+
// Single-sourced with init-logic-json-merge, which reads and patches the same field — a drift
|
|
21
|
+
// between the key this module writes and the key that module reads would silently break the merge.
|
|
22
|
+
const EXTENDS_FIELD = 'extends'
|
|
23
|
+
|
|
24
|
+
// The rename lands package by package, so the `.json` preset may not exist yet in the version of
|
|
25
|
+
// app-kit / game-kit the consumer has installed. Rewriting blindly would swap a path Playwright
|
|
26
|
+
// cannot resolve for one `tsc` cannot resolve either — strictly worse. Rewriting only once the
|
|
27
|
+
// target is actually on disk makes the migration order-independent: the entry stays untouched until
|
|
28
|
+
// the package shipping it catches up, and the next sync repairs it.
|
|
29
|
+
function is_migration_target_present(base_directory: string, entry: string): boolean {
|
|
30
|
+
return existsSync(path.resolve(base_directory, entry))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function migrate_entry(base_directory: string, entry: string): string {
|
|
34
|
+
if (!LEGACY_PRESET_ENTRY.test(entry)) return entry
|
|
35
|
+
|
|
36
|
+
const migrated = `${entry.slice(0, -LEGACY_SUFFIX.length)}${CURRENT_SUFFIX}`
|
|
37
|
+
|
|
38
|
+
return is_migration_target_present(base_directory, migrated) ? migrated : entry
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Preserve the authored shape: a string `extends` stays a string, an array stays an array.
|
|
42
|
+
function migrate_extends_value(base_directory: string, raw: unknown): unknown {
|
|
43
|
+
if (typeof raw === 'string') return migrate_entry(base_directory, raw)
|
|
44
|
+
|
|
45
|
+
if (Array.isArray(raw)) {
|
|
46
|
+
return string_array_schema.parse(raw).map((entry) => migrate_entry(base_directory, entry))
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return raw
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// `base_directory` is the consumer project root the `extends` paths are relative to — the directory
|
|
53
|
+
// holding the `tsconfig.json` being merged.
|
|
54
|
+
function migrate_preset_paths(content: string, base_directory: string): string {
|
|
55
|
+
const parsed = parse_jsonc(content)
|
|
56
|
+
const raw = parsed[EXTENDS_FIELD]
|
|
57
|
+
const migrated = migrate_extends_value(base_directory, raw)
|
|
58
|
+
if (JSON.stringify(migrated) === JSON.stringify(raw)) return content
|
|
59
|
+
|
|
60
|
+
return patch_json_key.set_json_key(content, EXTENDS_FIELD, migrated)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const tsconfig_preset_migration = {
|
|
64
|
+
migrate_preset_paths,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export { EXTENDS_FIELD, tsconfig_preset_migration }
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { markdown_section } from './markdown-section'
|
|
2
|
+
|
|
3
|
+
// A behavior-change Issue's baseline section is written as `command + value`, never prose, so that
|
|
4
|
+
// `pnpm josh measure:rerun` can re-run the command after merge and print a before/after pair
|
|
5
|
+
// (joshuafolkken/kit#2212). When the value has not moved, the premise the rule rested on is recorded
|
|
6
|
+
// as refuted in the observation ledger — reusing that append-only mechanism rather than a second one.
|
|
7
|
+
|
|
8
|
+
const BASELINE_HEADING = '## ベースライン'
|
|
9
|
+
// `- `<command>` → <value>` (an ASCII `->` is accepted for the arrow). Prose with no backticked
|
|
10
|
+
// command does not match, which is exactly how a natural-language measurement is rejected.
|
|
11
|
+
const BASELINE_LINE = /^-\s*`([^`]+)`\s*(?:→|->)\s*(\S.*)$/u
|
|
12
|
+
const VALUE_GROUP = 2
|
|
13
|
+
|
|
14
|
+
const LEDGER_KEY_PREFIX = '- k:'
|
|
15
|
+
const LEDGER_DEPTH = 'd1'
|
|
16
|
+
const FIELD_SEPARATOR = ' | '
|
|
17
|
+
// The ledger splits on ` | ` into exactly five fields, so free text may not carry that separator.
|
|
18
|
+
const FIELD_SEPARATOR_REPLACEMENT = ' ; '
|
|
19
|
+
const REMEASURE_COMMAND = 'pnpm josh measure:rerun'
|
|
20
|
+
const NON_SLUG_RUN = /[^a-z0-9]+/gu
|
|
21
|
+
// The key when a command has no alphanumerics to slug (e.g. an all-symbol shell expression); without it
|
|
22
|
+
// the ledger key would be empty and the appended line would fail the ledger's own slug grammar.
|
|
23
|
+
const EMPTY_SLUG_FALLBACK = 'baseline'
|
|
24
|
+
|
|
25
|
+
interface Baseline {
|
|
26
|
+
command: string
|
|
27
|
+
value: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function normalize(value: string): string {
|
|
31
|
+
return value.trim()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Every `command + value` line under the baseline section; an empty array is a section written in
|
|
35
|
+
// prose, which is the case the lint rejects.
|
|
36
|
+
function parse_baselines(body: string): ReadonlyArray<Baseline> {
|
|
37
|
+
return markdown_section
|
|
38
|
+
.section_lines(body, BASELINE_HEADING)
|
|
39
|
+
.map((line) => BASELINE_LINE.exec(line.trim()))
|
|
40
|
+
.filter((match): match is RegExpExecArray => match !== null)
|
|
41
|
+
.map((match) => ({ command: match[1] ?? '', value: normalize(match[VALUE_GROUP] ?? '') }))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// A body carries a re-runnable baseline when at least one line parses to `command + value`.
|
|
45
|
+
function has_command_value(body: string): boolean {
|
|
46
|
+
return parse_baselines(body).length > 0
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The value did not move between the recorded baseline and the re-measurement.
|
|
50
|
+
function is_no_change(before: string, after: string): boolean {
|
|
51
|
+
return normalize(before) === normalize(after)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The before/after pair for one baseline, printed under the command it was measured with.
|
|
55
|
+
function format_pair(baseline: Baseline, after: string): string {
|
|
56
|
+
return [
|
|
57
|
+
`\`${baseline.command}\``,
|
|
58
|
+
` before: ${normalize(baseline.value)}`,
|
|
59
|
+
` after: ${normalize(after)}`,
|
|
60
|
+
].join('\n')
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function sanitize_field(text: string): string {
|
|
64
|
+
return text.split(FIELD_SEPARATOR).join(FIELD_SEPARATOR_REPLACEMENT).trim()
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// `NON_SLUG_RUN` collapses every non-alphanumeric run to a single `-`, so the only empty segments a
|
|
68
|
+
// split can produce are the leading and trailing ones; dropping them trims the edge dashes without a
|
|
69
|
+
// second anchored regex.
|
|
70
|
+
function slug_of(command: string): string {
|
|
71
|
+
const runs = command.toLowerCase().replaceAll(NON_SLUG_RUN, '-').split('-')
|
|
72
|
+
const slug = runs.filter(Boolean).join('-')
|
|
73
|
+
|
|
74
|
+
return slug === '' ? EMPTY_SLUG_FALLBACK : slug
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The observation-ledger line for a refuted premise, in the grammar
|
|
78
|
+
// `- k:<slug> | d1 | <date> | <where> | <what>` (`observation-ledger-line.ts`). The key is derived
|
|
79
|
+
// from the command, so a second refutation of the same measurement appends a same-key line and the
|
|
80
|
+
// existing reappearance count sees it.
|
|
81
|
+
function ledger_line(baseline: Baseline, date: string): string {
|
|
82
|
+
const what = sanitize_field(
|
|
83
|
+
`反証: ${baseline.command} は before/after とも ${normalize(baseline.value)}(変化なし)`,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
return [
|
|
87
|
+
`${LEDGER_KEY_PREFIX}${slug_of(baseline.command)}`,
|
|
88
|
+
LEDGER_DEPTH,
|
|
89
|
+
date,
|
|
90
|
+
REMEASURE_COMMAND,
|
|
91
|
+
what,
|
|
92
|
+
].join(FIELD_SEPARATOR)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const baseline_measure = {
|
|
96
|
+
parse_baselines,
|
|
97
|
+
has_command_value,
|
|
98
|
+
is_no_change,
|
|
99
|
+
format_pair,
|
|
100
|
+
ledger_line,
|
|
101
|
+
slug_of,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export type { Baseline }
|
|
105
|
+
export { baseline_measure }
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { firing_point } from '#scripts/rules/firing-point'
|
|
2
|
+
import { baseline_measure } from './baseline-measure'
|
|
3
|
+
import { markdown_section } from './markdown-section'
|
|
4
|
+
import { reproduction_measure } from './reproduction-measure'
|
|
5
|
+
|
|
6
|
+
// A behavior-change Issue owes three headings the ordinary template does not — a firing-point heading
|
|
7
|
+
// (the tool call the rule breaks on), a baseline heading (a re-runnable measurement) and a
|
|
8
|
+
// reproduction heading (the command and its actual output). This checks them, but only for an Issue
|
|
9
|
+
// that declares itself one, and never asks the model to judge whether it is (joshuafolkken/kit#2212,
|
|
10
|
+
// joshuafolkken/kit#2353). The declaration, the headings and the grammars are the template's, pinned
|
|
11
|
+
// by the document test.
|
|
12
|
+
|
|
13
|
+
// The body declares itself a behavior-change Issue with this exact line under its opening heading.
|
|
14
|
+
// Read from the declaration, never inferred, so a code-only Issue is never held to the headings.
|
|
15
|
+
const DECLARATION_LINE = '- 種別: 振る舞い変更'
|
|
16
|
+
const FIRING_POINT_HEADING = '## 発火点'
|
|
17
|
+
const BASELINE_HEADING = '## ベースライン'
|
|
18
|
+
const REPRODUCTION_HEADING = '## 再現'
|
|
19
|
+
const REQUIRED_HEADINGS: ReadonlyArray<string> = [
|
|
20
|
+
FIRING_POINT_HEADING,
|
|
21
|
+
BASELINE_HEADING,
|
|
22
|
+
REPRODUCTION_HEADING,
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
// A template placeholder line — the `<...>` guidance a filed Issue replaces. It is not a firing point.
|
|
26
|
+
const PLACEHOLDER_PREFIX = '<'
|
|
27
|
+
const BACKTICKED = /`([^`]+)`/u
|
|
28
|
+
const WHITESPACE = /\s+/u
|
|
29
|
+
// A leading Markdown bullet marker (`- ` / `* `), stripped before the firing-point token is read so a
|
|
30
|
+
// bulleted line (`- Bash`) yields `Bash` rather than the dash.
|
|
31
|
+
const BULLET_MARKER = /^[-*]\s+/u
|
|
32
|
+
|
|
33
|
+
// Whether the body declares itself a behavior-change Issue.
|
|
34
|
+
function is_target(body: string): boolean {
|
|
35
|
+
return markdown_section.has_line(body, DECLARATION_LINE)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The required headings a behavior-change body lacks, in template order.
|
|
39
|
+
function missing_headings(body: string): ReadonlyArray<string> {
|
|
40
|
+
return REQUIRED_HEADINGS.filter((heading) => !markdown_section.has_line(body, heading))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function is_content(line: string): boolean {
|
|
44
|
+
return line.length > 0 && !line.startsWith(PLACEHOLDER_PREFIX)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function first_content_line(lines: ReadonlyArray<string>): string | undefined {
|
|
48
|
+
return lines.map((line) => line.trim()).find((line) => is_content(line))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// The tool call name written under the firing-point heading, or undefined when the section names none.
|
|
52
|
+
// A backticked token wins (`` `Bash` ``); otherwise a leading bullet marker is stripped and the first
|
|
53
|
+
// whitespace-delimited word is taken, so both `Bash` and `- Bash` yield `Bash`.
|
|
54
|
+
function firing_point_name(body: string): string | undefined {
|
|
55
|
+
const line = first_content_line(markdown_section.section_lines(body, FIRING_POINT_HEADING))
|
|
56
|
+
|
|
57
|
+
if (line === undefined) return undefined
|
|
58
|
+
|
|
59
|
+
return BACKTICKED.exec(line)?.[1] ?? line.replace(BULLET_MARKER, '').split(WHITESPACE, 1)[0]
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function firing_point_problem(body: string): string | undefined {
|
|
63
|
+
const name = firing_point_name(body)
|
|
64
|
+
|
|
65
|
+
if (name === undefined) return undefined
|
|
66
|
+
|
|
67
|
+
if (firing_point.classify(name) === 'not-delivered') {
|
|
68
|
+
return `firing point \`${name}\` is a real tool call, but no hook can deliver a rule on it`
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (firing_point.classify(name) === 'unknown') {
|
|
72
|
+
return `firing point \`${name}\` is not on the delivery table (not a recognized tool call)`
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function baseline_problem(body: string): string | undefined {
|
|
79
|
+
if (!markdown_section.has_line(body, BASELINE_HEADING)) return undefined
|
|
80
|
+
|
|
81
|
+
if (baseline_measure.has_command_value(body)) return undefined
|
|
82
|
+
|
|
83
|
+
return 'baseline must be written as `command → value`, not prose (it has to be re-runnable)'
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The reproduction section is checked for format only where the heading is present — a missing heading
|
|
87
|
+
// is already reported by `heading_problems`, so reporting it here too would double the message.
|
|
88
|
+
function reproduction_problem(body: string): string | undefined {
|
|
89
|
+
if (!markdown_section.has_line(body, REPRODUCTION_HEADING)) return undefined
|
|
90
|
+
|
|
91
|
+
if (reproduction_measure.has_command_output(body)) return undefined
|
|
92
|
+
|
|
93
|
+
return 'reproduction must be a command and its actual output (a fenced block), not prose ("確認した" is not re-runnable)'
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function heading_problems(body: string): ReadonlyArray<string> {
|
|
97
|
+
return missing_headings(body).map((heading) => `missing heading: ${heading}`)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Every behavior-change problem a body has, or an empty array. A body that does not declare itself a
|
|
101
|
+
// behavior-change Issue has none — the headings are not required of it.
|
|
102
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
103
|
+
if (!is_target(body)) return []
|
|
104
|
+
|
|
105
|
+
return [
|
|
106
|
+
...heading_problems(body),
|
|
107
|
+
firing_point_problem(body),
|
|
108
|
+
baseline_problem(body),
|
|
109
|
+
reproduction_problem(body),
|
|
110
|
+
].filter((problem): problem is string => problem !== undefined)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const behavior_change_lint = {
|
|
114
|
+
is_target,
|
|
115
|
+
missing_headings,
|
|
116
|
+
firing_point_name,
|
|
117
|
+
problems,
|
|
118
|
+
REQUIRED_HEADINGS,
|
|
119
|
+
DECLARATION_LINE,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export { behavior_change_lint }
|