@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,217 @@
|
|
|
1
|
+
# Code Review Prompt
|
|
2
|
+
|
|
3
|
+
This document is the review **policy**: which level a change is reviewed at, how many rounds a review
|
|
4
|
+
runs, and what happens to a finding after the cap. Two other documents hold the rest, and this file
|
|
5
|
+
points to them rather than restating them:
|
|
6
|
+
|
|
7
|
+
- The **rubric** the reviewer applies — the severity tests, the nine categories, the output format and
|
|
8
|
+
the stop conditions — is `prompts/review-rubric.md`, handed to `/code-review` by
|
|
9
|
+
`pnpm josh review:brief`.
|
|
10
|
+
- The **orchestration** around a review — how the gate runs beside it, when the pull request opens, how
|
|
11
|
+
the merge is issued — is `.claude/skills/workflow-commands/chain-rule.md` → "Orchestration facts
|
|
12
|
+
single-sourced here".
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## When to run
|
|
17
|
+
|
|
18
|
+
- **Pre-commit self-review** (implementing session, inline): before every `git commit` on a feature
|
|
19
|
+
branch — scope: the staged diff (`git diff --staged`), level from
|
|
20
|
+
`pnpm josh review:brief --level-only`.
|
|
21
|
+
- **Workflow review step** (same session, inline): the last stage of the verification gate in `fullrun`
|
|
22
|
+
/ `halfrun` / `backlogrun`, driven by the brief `pnpm josh review:brief` prints. Round 1 runs before the
|
|
23
|
+
commit — scope: `git diff main`. Round 2 runs after it, beside the CI the commit started
|
|
24
|
+
(`.claude/skills/workflow-commands/chain-rule.md` → "The pull request opens between the rounds, so CI
|
|
25
|
+
runs beside round 2").
|
|
26
|
+
|
|
27
|
+
The workflow review uses the `reviewer` role profile printed by `pnpm josh review:brief`. Pass its
|
|
28
|
+
model and effort explicitly to the review subagent; do not substitute the review level for effort.
|
|
29
|
+
|
|
30
|
+
Re-run after applying fixes until **no high or medium findings remain — or until two reviews have run
|
|
31
|
+
in total, the first included — whichever comes first.** The cap below is not optional. The second round
|
|
32
|
+
is a verification pass over the fixes, not the first review again
|
|
33
|
+
(`prompts/review-rubric.md` → "The second round is a verification pass, not a second full review").
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Review level (decided by `pnpm josh review:brief --level-only`, never by judgement)
|
|
38
|
+
|
|
39
|
+
**Run `pnpm josh review:brief --level-only` and use what it prints.** It reads the changed paths and
|
|
40
|
+
answers `low` or `medium`; `--staged` classifies the staged diff instead of the branch diff, and
|
|
41
|
+
`--json` adds the reason. Inside a workflow, `pnpm josh review:brief` prints the same level on its first
|
|
42
|
+
line and the rest of the brief with it.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pnpm josh review:brief --level-only # the branch diff
|
|
46
|
+
pnpm josh review:brief --level-only --staged # the staged diff
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**The level is decided from the changed paths and nothing else.** "This one is small" is a judgement
|
|
50
|
+
made under cost pressure, and cost pressure resolves it toward "small" exactly when a defect is most
|
|
51
|
+
likely to be shipped. A rule an agent applies from memory is a rule an agent can talk itself out of;
|
|
52
|
+
one it has to run answers the same way every time.
|
|
53
|
+
|
|
54
|
+
| Every changed path is… | Level | Rounds |
|
|
55
|
+
| ---------------------------------------------------------------------------------------- | -------- | ----------------------- |
|
|
56
|
+
| **inert** — `.editorconfig`, `.gitignore`, `LICENSE`, `CHANGELOG.md`, `*.code-workspace` | `low` | 1 |
|
|
57
|
+
| anything else | `medium` | up to 2 (the cap below) |
|
|
58
|
+
|
|
59
|
+
**One non-inert path decides the whole change.** A review reads the change, not a subset of it, so
|
|
60
|
+
there is no per-file level. An empty diff also takes `medium` — answering `low` to "nothing changed"
|
|
61
|
+
would hand a reduced level to a caller that failed to read the diff.
|
|
62
|
+
|
|
63
|
+
**Three things that look inert are not.** `.vscode/**`, `.gitattributes` and `.prettierignore` are all
|
|
64
|
+
in `package.json`'s `files` and are written into every consumer project by `josh init` / `josh sync`,
|
|
65
|
+
so a defect in one reaches a consumer and is reviewed at `medium` like any other shipped file.
|
|
66
|
+
|
|
67
|
+
**Documentation is not inert either, and that is deliberate.** `CLAUDE.md`, `prompts/**`, `.claude/**`
|
|
68
|
+
and `docs/**` are all reviewed at `medium`. The "Non-runtime updates" exception in `CLAUDE.md` exempts
|
|
69
|
+
them from _testing_ — which asks whether an automated test could have caught the defect — while this
|
|
70
|
+
asks whether a human reading the diff is the only thing that can. Measured on joshuafolkken/kit#963 and
|
|
71
|
+
#965, both documentation-only by that classification: a `medium` review found ten real defects in each
|
|
72
|
+
— pointers into sections that had been removed, and citations naming the wrong file, in artifacts
|
|
73
|
+
distributed to every consumer — that nothing else would have caught.
|
|
74
|
+
|
|
75
|
+
**A confirmed High blocks regardless of round count**, and the round cap below does not change that.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Review round cap (2 rounds)
|
|
80
|
+
|
|
81
|
+
The severity rule in the rubric is not a stopping condition on its own. Every fix creates new surface,
|
|
82
|
+
and a review whose scope is the whole change finds something in it — so the loop is bounded by how much
|
|
83
|
+
new code the fixes produce, which is unbounded.
|
|
84
|
+
|
|
85
|
+
**Two rounds is the ceiling, not the schedule.** Whether the second one is due at all is
|
|
86
|
+
`pnpm josh review:round2`'s answer — "When round 2 is skipped entirely, and when it is not" below is
|
|
87
|
+
the single source of that condition (joshuafolkken/kit#1433).
|
|
88
|
+
|
|
89
|
+
This is measured, not theorized. On joshuafolkken/kit#854 four rounds produced 18 findings; on #855
|
|
90
|
+
two rounds produced 19. Almost none of them was a repeat: each round found new things, and many of
|
|
91
|
+
those were about code the **previous round's fix** had just written. Two rounds of that is diligence; a
|
|
92
|
+
third is the review chasing its own tail.
|
|
93
|
+
|
|
94
|
+
### A merge-conflict resolution review is not one of the two
|
|
95
|
+
|
|
96
|
+
**When `pnpm josh followup` reports `PR checks failed (merge conflict)`, the child resolves the conflict
|
|
97
|
+
in its own lane and reviews the resolution — and that round does not count against the cap**
|
|
98
|
+
(joshuafolkken/kit#1623). The cap bounds re-reading _the change under review_; a resolution review reads
|
|
99
|
+
a different subject — not the change, but what merging a moved `main` into it did.
|
|
100
|
+
`.claude/skills/workflow-commands/backlogrun-lanes.md` → "Conflicts are not predicted" is the single source of
|
|
101
|
+
the procedure and of the four conditions under which the run steps back instead of resolving.
|
|
102
|
+
`pnpm josh review:attest --check` must answer `ok` before the merge is re-issued, and a confirmed High
|
|
103
|
+
parks the child rather than buying it a further round.
|
|
104
|
+
|
|
105
|
+
### When round 2 is skipped entirely, and when it is not
|
|
106
|
+
|
|
107
|
+
**Two rounds is the ceiling; whether the second round runs at all is a command's answer, not a reading
|
|
108
|
+
of a list** (joshuafolkken/kit#1433):
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
pnpm josh review:round2 --round-1-closed # → required | skip ; the reason on stderr
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Ask it once round 1's fixes are in and before the commit.** Pass `--round-1-closed` only where every
|
|
115
|
+
round-1 High/Medium finding actually closed — by a fix in this working tree, or as a verified false
|
|
116
|
+
positive — and none was filed or deferred. **Without the flag the answer is `required`**, which is also
|
|
117
|
+
what the command answers to every uncertainty it meets, a missing round-1 snapshot included.
|
|
118
|
+
|
|
119
|
+
**`skip` has exactly two arms, and both are states in which round 1's fix code needs no review**
|
|
120
|
+
(joshuafolkken/kit#1222 — the round exists because round 1's fix code is otherwise unreviewed):
|
|
121
|
+
|
|
122
|
+
| Arm | What it is |
|
|
123
|
+
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
124
|
+
| **A — no fix code** | The fix delta is empty: round 1's findings closed without an edit, so there is no unreviewed fix code |
|
|
125
|
+
| **B — inert fix code** | Every path in the fix delta is inert by the review-level classification above — neither executing, instructing, nor shipping |
|
|
126
|
+
|
|
127
|
+
**Neither arm weakens the standard.** A round-1 High/Medium that did not close is not a closed finding,
|
|
128
|
+
so the flag is not passable; the cap is still two rounds; and a confirmed High still blocks the merge.
|
|
129
|
+
**The wider line joshuafolkken/kit#1433 proposed — exempting anything that is not a runtime code path —
|
|
130
|
+
is not adopted**: a documentation-only diff is exactly where the review is the only detector (the #963 /
|
|
131
|
+
#965 measurement above), so a prompt fix answers `required`.
|
|
132
|
+
|
|
133
|
+
**A skipped round is recorded on the Issue**, so the condition stays auditable and can be withdrawn if
|
|
134
|
+
a defect is later traced to a skipped delta:
|
|
135
|
+
|
|
136
|
+
1. Label the Issue `review-round2-skipped`, created once per repository:
|
|
137
|
+
`gh api repos/{owner}/{repo}/labels -f name=review-round2-skipped -f color=c5def5 -f description="Review round 2 was skipped under the condition in prompts/review.md" --silent 2>/dev/null || true`,
|
|
138
|
+
then `gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=review-round2-skipped'`.
|
|
139
|
+
2. Post an Issue comment under the heading `## Round 2 skipped`, naming **which arm fired** and quoting
|
|
140
|
+
**the reason line the command printed**, verbatim.
|
|
141
|
+
|
|
142
|
+
### Three-way disposition after the cap
|
|
143
|
+
|
|
144
|
+
**After the second round, place every remaining non-High finding in exactly one of three exits, decided
|
|
145
|
+
from what the finding is rather than from the filer's discretion** (joshuafolkken/kit#1469). **The
|
|
146
|
+
default exit is branch 3, and branch 2 has to be earned**. Read them in order — branch 1 where the fix is
|
|
147
|
+
trivial and local, branch 2 only where the finding clears the bar it names, branch 3 for everything
|
|
148
|
+
left, which is most of them. "It might matter later" is branch 3.
|
|
149
|
+
|
|
150
|
+
1. **Fix it in place.** The finding closes in a few lines inside a file the diff already touches, with
|
|
151
|
+
no design judgement — a stale comment, a name, an unused export. **A fix-in-place never starts a new
|
|
152
|
+
review round**: the fix widens the diff, so a naive re-review would re-open the loop the cap just
|
|
153
|
+
closed. The fix must stay **inside a file the diff already changed** and carry **no design decision**;
|
|
154
|
+
a finding that cannot close under both limits is filed, not fixed in place.
|
|
155
|
+
2. **File it as an Issue.** The finding is a **confirmed defect that reaches a runtime code path** —
|
|
156
|
+
both halves, and neither on its own. Confirmed means the failure scenario is stated in concrete
|
|
157
|
+
inputs and state. **Reaching is read exactly as the rubric's Severity test 1 reads it** — a runtime
|
|
158
|
+
code path, a distributed artifact a consumer reads, or the verification that guards either — so in a
|
|
159
|
+
repository whose product is its distributed documents, a defect in one of those is a branch-2 finding
|
|
160
|
+
like any other. **The reaching half is not a judgement**: `pnpm josh disposition <path>` answers
|
|
161
|
+
`runtime` / `non-runtime` from the finding's paths, sharing the same inert set the review level uses,
|
|
162
|
+
so only "is the defect confirmed" is left to decide. **"It needs a decision" is no longer a branch-2
|
|
163
|
+
condition on its own**: a design question with no defect under it takes branch 3.
|
|
164
|
+
3. **Drop it with a one-line note in the PR body.** **This is the default, and it takes everything the
|
|
165
|
+
other two branches did not**: a Low that does not reach the user, and every remaining finding that is
|
|
166
|
+
neither closable in place nor a confirmed runtime defect — a design preference or an unproven
|
|
167
|
+
suspicion included. **The note is not optional**: one line naming the finding and why it was dropped
|
|
168
|
+
is what keeps a dropped finding auditable rather than invisible.
|
|
169
|
+
|
|
170
|
+
**What it costs, and why that is the right trade.** A dropped finding that later turns out to matter is
|
|
171
|
+
re-found by the next review of that code, at the price of one round it would have paid anyway. A filed
|
|
172
|
+
finding that never mattered is carried forever — placed in an epic, offered by `epic:next`, read by
|
|
173
|
+
everyone who scans the backlog. The two errors are not symmetric, and the old default was on the
|
|
174
|
+
expensive side of them.
|
|
175
|
+
|
|
176
|
+
**Findings that reduce to one root judgement are filed as one Issue, not several** — a single follow-up
|
|
177
|
+
Issue with a section per symptom (`## 現象 1` / `## 現象 2`).
|
|
178
|
+
|
|
179
|
+
Only branch 2 files an Issue. What follows applies to that branch.
|
|
180
|
+
|
|
181
|
+
- **A finding routed to branch 2 is filed as a follow-up Issue referencing the current one, and the
|
|
182
|
+
current Issue completes.** (A confirmed High is not a branch-2 finding: it blocks the merge rather
|
|
183
|
+
than being deferred — see below.)
|
|
184
|
+
- **Filing does not end at the Issue.** `epic:next` only ever offers a child the task list of an epic
|
|
185
|
+
names, so an Issue in no epic is never handed to a running `backlogrun` — the deferred finding is parked
|
|
186
|
+
forever, which reads the same from the backlog. **The three steps run inside the CI wait, not before
|
|
187
|
+
the commit.** Where the run opens a pull request — `fullrun`, `backlogrun` — they go after
|
|
188
|
+
`pnpm josh git -y` and before `pnpm josh followup`; where it does not — `halfrun`, or a standalone
|
|
189
|
+
pre-commit self-review — they run as soon as the disposition is decided. **The chain may run in a
|
|
190
|
+
delegated unit** — `pnpm josh delegate followup-filing` (joshuafolkken/kit#1892).
|
|
191
|
+
- **When the round files a second follow-up, run `pnpm josh issue:fold` first.** Several findings from
|
|
192
|
+
one review fold into one Issue by default — the filing-time counterpart to the split assessment,
|
|
193
|
+
reading the same two questions (`.claude/skills/workflow-commands/split-assessment.md` → "The same
|
|
194
|
+
two questions decide the filing-time fold"). `pnpm josh rule:guard` refuses the second `gh api …
|
|
195
|
+
issues` call until it is folded; the first filing asks nothing.
|
|
196
|
+
|
|
197
|
+
1. File the follow-up Issue referencing the current one, tagged `route:review-cap`:
|
|
198
|
+
`gh api repos/{owner}/{repo}/issues -f title="<title>" -f 'labels[]=route:review-cap' -f 'labels[]=depth:<n>' -f body="<body referencing the current Issue>"`.
|
|
199
|
+
2. Run `pnpm josh epic:bundle <new>` — **before the current Issue closes.** The candidate search reads
|
|
200
|
+
open issues only, so once the parent has closed the command answers `none` permanently.
|
|
201
|
+
3. Act on its answer. **`epic:bundle` recommends and writes nothing**, so acting means running the
|
|
202
|
+
write command yourself — never a hand edit of the epic body, which leaves the task list and the
|
|
203
|
+
`blocked-by` relations disagreeing and `epic:next` returning `error`.
|
|
204
|
+
|
|
205
|
+
| Answer | Do | Tier |
|
|
206
|
+
| ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |
|
|
207
|
+
| `add_to_epic` | `pnpm josh epic --add <E> <new>` — add `--before <M>` / `--after <M>` when the relation carries an order | **A — no confirmation** |
|
|
208
|
+
| `create_epic` | `pnpm josh epic "<title>" <new> <other> [--ordered]` | **A — no confirmation** |
|
|
209
|
+
| `ask` — candidates spread across two or more epics | **Choose the epic you recommend, run its write command, and record the decision** — what was taken, what was rejected, why — on both the new Issue and that epic's `## Decisions`. This does not stop a run and does not park a child (joshuafolkken/kit#1339); stop only where the two epics are genuinely too close to separate | **A — no confirmation** |
|
|
210
|
+
| `none` | Nothing | — |
|
|
211
|
+
| **The command could not answer** — non-zero exit, or **any** ⚠ warning above `Nothing to bundle.` | Stop and report, naming what it said. **A `none` printed after such a warning is not "nothing to bundle"** — the search was incomplete | — |
|
|
212
|
+
|
|
213
|
+
- **A confirmed High is never deferred.** A real defect does not ship because a round counter ran out,
|
|
214
|
+
so a standing High blocks the merge — never fixed-in-place, filed, or dropped as one of the three
|
|
215
|
+
exits. If a High is still standing after the second round, do not start a third: stop, send a
|
|
216
|
+
`confirmation` Telegram, and put the scope back to the user, where splitting the Issue is usually the
|
|
217
|
+
answer.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# SonarCloud Hotspot Handling (project-local extension)
|
|
2
|
+
|
|
3
|
+
<!-- cspell:words hotspot Hotspot hotspots Hotspots NOSONAR -->
|
|
4
|
+
|
|
5
|
+
This guide extends the collaboration workflow with a project-local procedure for handling SonarCloud Security Hotspots. It is kept out of the upstream-synced `prompts/collaboration-workflow/` topics so those stay identical across the projects that consume them.
|
|
6
|
+
|
|
7
|
+
AI tools cannot perform OAuth browser login to SonarCloud, so this guide assumes public-API and config-based actions as the primary path.
|
|
8
|
+
|
|
9
|
+
## Quality Gate enforcement (CI blocks PRs)
|
|
10
|
+
|
|
11
|
+
The distributed `.github/workflows/sonar-qube.yml` runs the SonarCloud scan with
|
|
12
|
+
`-Dsonar.qualitygate.wait=true`. The scanner waits for SonarCloud to evaluate the project's
|
|
13
|
+
Quality Gate and **fails the `SonarQube` job — a required PR check — when the gate is red**, so a
|
|
14
|
+
PR that introduces a finding cannot be merged green. This is the single enforcement point:
|
|
15
|
+
`josh followup` does **not** scan SonarCloud findings (it only scans CodeRabbit / Claude Review
|
|
16
|
+
comments), but it **does** wait on the required `SonarQube` CI check, so a red gate also blocks the
|
|
17
|
+
`followup` merge. Consumers pick the workflow up verbatim via `josh sync`; do not re-implement the
|
|
18
|
+
gate per consumer.
|
|
19
|
+
|
|
20
|
+
### New Code vs Overall Code semantics
|
|
21
|
+
|
|
22
|
+
SonarCloud's default **Sonar way** Quality Gate evaluates **New Code only** — conditions
|
|
23
|
+
(new bugs, new code smells above the Maintainability rating, new coverage/duplication) apply to
|
|
24
|
+
lines changed in the PR's New Code period, not the whole codebase. Consequences:
|
|
25
|
+
|
|
26
|
+
- A PR is blocked when it **introduces or modifies** code that trips a condition — this is what
|
|
27
|
+
catches the recurring Maintainability `0 -> 1` regression that motivated this gate.
|
|
28
|
+
- Pre-existing Overall-Code findings on untouched files do **not** fail an unrelated PR. To make
|
|
29
|
+
the gate enforce Overall Code as well, add Overall conditions to the gate in the SonarCloud
|
|
30
|
+
project settings (Quality Gates UI) — that is a SonarCloud-side configuration, not a repo file.
|
|
31
|
+
|
|
32
|
+
When triaging a red gate, confirm via the PR analysis whether the failing condition is a **New
|
|
33
|
+
Code** condition (caused by this PR — fix it) or an **Overall** condition (pre-existing — handle
|
|
34
|
+
per the table below, and do not let it silently block an unrelated change).
|
|
35
|
+
|
|
36
|
+
## Step A / Step B: fetch the hotspots and read each one's disposition
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pnpm josh sonar:hotspots <PR> # alias: josh shs
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The command fetches the hotspots on the pull request from SonarCloud's public API (no auth), reading
|
|
43
|
+
the project key from `sonar-project.properties`, and prints per hotspot its `status`, `component`,
|
|
44
|
+
`line`, `ruleKey` and the Step B branch it falls into. The one branch key that used to be walked by
|
|
45
|
+
eye — "is this path upstream-synced?" — is answered by calling `josh sync:scope`'s own detection, so
|
|
46
|
+
no distribution path list is duplicated. The four branches:
|
|
47
|
+
|
|
48
|
+
| Branch | Meaning |
|
|
49
|
+
| ---------- | ---------------------------------------------------------------------------------------------------------- |
|
|
50
|
+
| `excluded` | A `TO_REVIEW` hotspot on an upstream-synced file — add the path to `sonar.exclusions`, never edit the file |
|
|
51
|
+
| `local` | A `TO_REVIEW` hotspot on project-local code — a targeted `sonar.issue.ignore.*` rule or NOSONAR comment |
|
|
52
|
+
| `fix` | A reviewed-and-fixed hotspot — the real issue was fixed |
|
|
53
|
+
| `defer` | A reviewed hotspot set aside — out of scope for this PR |
|
|
54
|
+
|
|
55
|
+
A read that failed (rate-limit, network) prints `unreadable: <reason>`, told apart from a success
|
|
56
|
+
that found no hotspots. `pnpm josh oracle:list` carries the same vocabulary. **The only judgement
|
|
57
|
+
left to you is whether a `TO_REVIEW` hotspot is really a false positive** — if it is, apply its
|
|
58
|
+
`excluded` / `local` branch; if it is instead a real issue fix the code and add a regression test,
|
|
59
|
+
and if it is out of scope mention it in the completion comment and open a follow-up Issue.
|
|
60
|
+
|
|
61
|
+
## Step C: optional — mark SAFE via API if a token is available
|
|
62
|
+
|
|
63
|
+
If `SONAR_TOKEN` is exported (SonarCloud user token with write scope):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
curl -sS -u "$SONAR_TOKEN:" -X POST \
|
|
67
|
+
"https://sonarcloud.io/api/hotspots/change_status" \
|
|
68
|
+
-d "hotspot=<hotspot-key>&status=REVIEWED&resolution=SAFE&comment=<reason>"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Without a token, prefer Step B's config-based approach — that change is reviewable in the PR diff, whereas API-side state changes are not.
|
|
72
|
+
|
|
73
|
+
## Reporting rules
|
|
74
|
+
|
|
75
|
+
- List every outstanding hotspot in the completion comment (never hide a failing SonarCloud analysis).
|
|
76
|
+
- State which action you took (excluded / marked SAFE / fixed / deferred) and why.
|
|
77
|
+
- If you deferred, include a link to the follow-up Issue.
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# Test Generation Guide
|
|
2
|
+
|
|
3
|
+
## 0. Per-Requirement Test Coverage (MANDATORY)
|
|
4
|
+
|
|
5
|
+
Before writing any implementation code, **list every requirement from the user's request and assign a test to each one**. This step is non-negotiable.
|
|
6
|
+
|
|
7
|
+
### Planning template
|
|
8
|
+
|
|
9
|
+
For a user request with N requirements, enumerate each one before touching any source files:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
Req 1: "Label chip shown immediately"
|
|
13
|
+
→ E2E: open editor, type new label, press Enter → chip visible without blurring
|
|
14
|
+
|
|
15
|
+
Req 2: "Down arrow moves to next row"
|
|
16
|
+
→ E2E: open editor on row 1, press ↓ → row 2 enters edit mode
|
|
17
|
+
|
|
18
|
+
Req N: ...
|
|
19
|
+
→ Unit/E2E: ...
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Rules
|
|
23
|
+
|
|
24
|
+
- **Every user-facing behavior change** (UI interaction, keyboard shortcut, visible state change) must have a corresponding E2E test.
|
|
25
|
+
- **Every logic/utility change** (pure functions, filters, transforms) must have a unit test.
|
|
26
|
+
- If a test is genuinely infeasible (e.g., native OS date-picker popup cannot be driven by Playwright), write a comment in the test file explaining why and test the closest observable behavior instead (e.g., that the editor remains open after the `change` event fires).
|
|
27
|
+
- Do **not** report a requirement as done if its test is missing.
|
|
28
|
+
|
|
29
|
+
### Verification checklist (add to the completion gate)
|
|
30
|
+
|
|
31
|
+
- [ ] Count requirements in the user's request.
|
|
32
|
+
- [ ] Count tests added/updated for those requirements.
|
|
33
|
+
- [ ] The two counts match (or each gap is documented as infeasible with a comment).
|
|
34
|
+
- [ ] **UI changes only:** a screenshot of the affected screen was captured and visually confirmed before reporting completion (passing tests are not proof the UI looks correct — see the **UI verification (screenshot)** rule in the completion gate). If a screenshot is impossible in this environment, that is stated and the user is asked to verify visually.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 1. Test Type Selection
|
|
39
|
+
|
|
40
|
+
| Condition | Type |
|
|
41
|
+
| ----------------------------------------------------------------- | ------------------------- |
|
|
42
|
+
| `src/routes/` pages, UI components with user interaction | E2E (Playwright) |
|
|
43
|
+
| `.ts`/`.js` utilities, `src/lib/server/`, display-only components | Unit/Integration (Vitest) |
|
|
44
|
+
|
|
45
|
+
**The type is decided from the path, not by asking.** A change under `src/routes/` takes E2E; every other runtime path takes Unit — a component with interaction is reached through the route that renders it, and that route is under `src/routes/`. `pnpm josh test:declared` prints the type each untested runtime file calls for on its `required` detail line, so the choice never becomes a stop.
|
|
46
|
+
|
|
47
|
+
### Test file naming & placement (one unambiguous rule)
|
|
48
|
+
|
|
49
|
+
There is exactly **one** convention for every test file — never choose between two. The rules below are mandatory; some are config-enforced (a violating file runs under the wrong vitest project or not at all), others are enforced by convention/review — each rule states which.
|
|
50
|
+
|
|
51
|
+
| Test kind | Required filename | Routed to |
|
|
52
|
+
| ------------------- | ------------------------ | -------------------------------- |
|
|
53
|
+
| Unit / integration | `*.test.ts` | node/unit vitest project |
|
|
54
|
+
| Component / browser | `*.svelte.test.ts` | browser/component vitest project |
|
|
55
|
+
| E2E | `src/routes/**/*.e2e.ts` | Playwright |
|
|
56
|
+
|
|
57
|
+
- **Use `*.test.ts` — never `*.spec.ts`.** The `.spec.ts` suffix is forbidden for unit/integration tests. This is **lint-enforced**: the test-filename rule building blocks (`eslint/rules/test-filename.js`) are wired into `eslint/base.js` itself, so every project built on `create_base_config` — kit included, since joshuafolkken/kit#1233 — flags any `*.spec.*` file, and any file under a top-level `tests/` directory, and fails `josh lint`. **Both bans cover every JS/TS extension** — `.ts` `.tsx` `.mts` `.cts` `.js` `.jsx` `.mjs` `.cjs` — since joshuafolkken/kit#1414; `.svelte` is deliberately outside them, because the base config has no Svelte parser and a `tests/Foo.svelte` would report a parse error instead of the move instruction. A config that does not use the base can still import the blocks alone, as `@joshuafolkken/kit/eslint/test-filename` — but **wire them through `extend_restricted_syntax(<your own rules>, SPEC_FILENAME_ENTRY)`**, because flat config replaces `no-restricted-syntax` rather than merging it, so the ready-made `spec_filename_rules` / `centralized_tests_directory_rules` records drop whatever selectors that config already restricted, on exactly the files the ban applies to (joshuafolkken/kit#1414). (A vitest `{test,spec}` matcher would still accept both, but the lint rule fails loudly before a stray `.spec.ts` can drift in.)
|
|
58
|
+
- **The `.svelte.` infix is required for component/browser tests and must be preserved.** `*.svelte.test.ts` routes the file to the **browser/component** vitest project (`include: src/**/*.svelte.{test,spec}.{js,ts}`); plain `*.test.ts` routes to the **node/unit** project (`include: src/**/*.{test,spec}.{js,ts}`). Renaming `Foo.svelte.test.ts` → `Foo.test.ts` silently moves it to the wrong project — do not drop the `.svelte.` infix.
|
|
59
|
+
- **Colocate every test next to the code it exercises.** A top-level `tests/` directory is **not used** — place `foo.test.ts` beside `foo.ts`, and E2E specs under the relevant `src/routes/**` path. The top-level `tests/` ban is **lint-enforced** by the same rule (`eslint/rules/test-filename.js`). Note: `playwright.config.ts` discovers E2E via `testMatch: '**/*.e2e.{ts,js}'`, so an `*.e2e.ts` placed outside `src/routes/**` would still run — that specific `src/routes/**` placement is enforced by **convention/review, not config**, and must be upheld manually.
|
|
60
|
+
|
|
61
|
+
> **Enforcement:** the `*.spec.ts` ban and the top-level `tests/` ban are enforced by the test-filename rule (`eslint/rules/test-filename.js`), wired into the shared `eslint/base.js`, so they fail loudly in `josh lint` for kit itself, for every consumer of that base config, and for every AI tool. Left as an export a consumer had to remember to wire in, the ban reached only the projects that did — and never the repository distributing it (joshuafolkken/kit#1233). This was chosen over tightening the vitest `{test,spec}` matchers to `{test}` only, because matcher-tightening causes **silent non-execution** of stray `*.spec.ts` files whereas a lint rule fails loudly. (Doc-only guidance had already failed to prevent this drift twice.)
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 2. Test Guidelines
|
|
66
|
+
|
|
67
|
+
### Naming
|
|
68
|
+
|
|
69
|
+
- Variables/functions: `snake_case` | Constants: `UPPER_SNAKE_CASE`
|
|
70
|
+
- Boolean prefix: `is_`, `has_`, `should_`, `can_`, `will_`, `did_`
|
|
71
|
+
|
|
72
|
+
### Test Functions
|
|
73
|
+
|
|
74
|
+
- Outside `describe`: `test`; inside `describe`: `it`
|
|
75
|
+
- Use `describe` only when grouping multiple tests is necessary
|
|
76
|
+
|
|
77
|
+
### Parameterized Tests
|
|
78
|
+
|
|
79
|
+
- Playwright: `for` loop; Vitest: `test.each` / `it.each`
|
|
80
|
+
- Test cases: define as `cases` or `*_cases` array at file top (outside test functions)
|
|
81
|
+
|
|
82
|
+
### Constants
|
|
83
|
+
|
|
84
|
+
- All magic numbers/strings except `0`, `1`, `-1` must be `UPPER_SNAKE_CASE` constants
|
|
85
|
+
- Place after imports at file top
|
|
86
|
+
|
|
87
|
+
### Imports
|
|
88
|
+
|
|
89
|
+
- Always include `.js` extension: `import { foo } from './bar.js'`
|
|
90
|
+
- Type imports: `import { type Foo } from '...'`
|
|
91
|
+
|
|
92
|
+
### Playwright
|
|
93
|
+
|
|
94
|
+
- Element selection: `page.getByTestId('id')` — add `data-testid` to implementation files
|
|
95
|
+
- Test functions always `async`
|
|
96
|
+
- **Project split:** `playwright.config.ts` defines **`e2e-guest`** (no auth: `src/routes/**/dash-guest.e2e.ts`, `src/routes/**/demo.e2e.ts`), then **`e2e-main`** (depends on `e2e-guest`), then **`e2e-leak-check`** (depends on `e2e-main`). Authenticated projects set `storageState` to `src/routes/.auth/user.json` when that file exists — **there is no UI login on every test**; cookies/session are restored from disk.
|
|
97
|
+
- **Workers:** Playwright uses `workers: 1` because authenticated E2E shares one storage state; higher parallelism races on the same DB user.
|
|
98
|
+
- **Timeouts:** Guest/main/leak projects use **per-project test timeouts** in `playwright.config.ts` so switching tabs and dash actions are not cut off by the global default.
|
|
99
|
+
|
|
100
|
+
### Regression fix workflow (E2E data / cleanup bugs)
|
|
101
|
+
|
|
102
|
+
When fixing bugs where tests leave data behind (or similar persistent state):
|
|
103
|
+
|
|
104
|
+
1. **Add or extend a failing guard** — e.g. `src/routes/dash/dash-leak-check.e2e.ts` exports `dash_leak_guard.scrub_then_assert_clean`: it scrubs tasks whose titles contain the `E2E_` automation prefix, then asserts none remain. Confirm it **fails** while scrub or per-test teardown is broken (red).
|
|
105
|
+
2. **Fix production code or test teardown** — cleanup must be reliable (prefer `data-testid` over locale-specific `aria-label` for automation; avoid swallowing cleanup errors unless explicitly intended).
|
|
106
|
+
3. **Confirm the guard passes** (green) with full `pnpm test:e2e` (or targeted Playwright command above).
|
|
107
|
+
4. **Document** any new invariant in this guide or the relevant E2E helper module.
|
|
108
|
+
|
|
109
|
+
### Error Messages
|
|
110
|
+
|
|
111
|
+
- Include expected and actual values explicitly
|
|
112
|
+
- Wrap `number` in template literals with `String()`
|
|
113
|
+
- Don't add `?? ''` unless the value can genuinely be `undefined`
|
|
114
|
+
|
|
115
|
+
### Type Safety
|
|
116
|
+
|
|
117
|
+
- No `any`; always use loop variables (avoids unused-variable lint errors)
|
|
118
|
+
- Use `@ts-expect-error`, not `@ts-ignore`
|
|
119
|
+
|
|
120
|
+
### Statement Limit
|
|
121
|
+
|
|
122
|
+
- Max 10 statements per test function; split complex tests if exceeded
|
|
123
|
+
|
|
124
|
+
### No live network
|
|
125
|
+
|
|
126
|
+
- **A unit test must not reach the network.** Mock every read that leaves the process — a `gh` call, an HTTP request, a CLI subprocess that makes one
|
|
127
|
+
- **Mock the whole read, not the first half of it.** A helper that stubs one call and leaves a second one on its default calls through, and the test still **passes** — slower, and against whatever the remote answers. That is how joshuafolkken/kit#1353 reached a 10-second timeout in CI on a change that had nothing to do with it
|
|
128
|
+
- In kit's own checkout `vitest.config.ts` arms a guard that fails the run and lists the `gh` invocations it recorded — the commands, not the test that made them, which the command text is usually enough to find (`docs/josh-commands.md` → `josh test:unit`). Elsewhere the rule holds without one
|
|
129
|
+
|
|
130
|
+
### A josh command that writes state runs through the integration harness (kit only)
|
|
131
|
+
|
|
132
|
+
- **A new or changed state-writing josh command needs a test in all three environments of `scripts/test/josh-harness.ts`** — kit, a consumer without `docs/`, a lane worktree (joshuafolkken/kit#2402). Packed suite: `vitest.harness.config.ts`
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 3. Checklist
|
|
137
|
+
|
|
138
|
+
- [ ] **Before “done”:** **Completion gate** in `CLAUDE.md` — `pnpm josh gate` (lint, type check, spell check and unit tests), then E2E per § 6 below: the CI E2E job where a pull request is open, **`pnpm josh test:e2e`** run by you where there is none. **Do not** stop at `pnpm josh test:unit` when E2E applies, and **never** ask the user to run it. Run it with `CI` unset so Playwright uses **DEV** (`pnpm run dev` on the port `playwright.config.ts` resolves from `PORT_SEED`), matching the VS Code Test plugin. ReadLints **0 errors** on touched files; Playwright **no failures and no flaky** runs in what you report. **If Playwright cannot run in your environment:** do **not** use `pnpm build` or `CI=true` unless the user asked — say the E2E result is missing and that the gate is therefore not closed
|
|
139
|
+
- [ ] Magic numbers/strings → constants (except `0`, `1`, `-1`)
|
|
140
|
+
- [ ] `.js` on all import paths
|
|
141
|
+
- [ ] Playwright: `data-testid` selectors only
|
|
142
|
+
- [ ] `async`/`await` used correctly
|
|
143
|
+
- [ ] No `any`; all loop variables used
|
|
144
|
+
- [ ] Max 10 statements per test function
|
|
145
|
+
- [ ] `read_lints` run; 0 errors before reporting done
|
|
146
|
+
- [ ] No unnecessary `?? ''`; `String()` for numbers in template literals
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 4. Reference Files
|
|
151
|
+
|
|
152
|
+
**E2E:** `src/routes/**/page.e2e.ts`, `src/routes/**/praise.e2e.ts`
|
|
153
|
+
**Unit:** `src/lib/data/phrases/phrases.test.ts`, `src/lib/data/praise-audio.test.ts`
|
|
154
|
+
**ESLint:** `eslint.config.js`
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 5. Unit Test Example — Stateful Functions
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
import { expect, test } from 'vitest'
|
|
162
|
+
import { get_praise_audio_file, reset_praise_audio_index } from './praise-audio.js'
|
|
163
|
+
|
|
164
|
+
test('returns expected values in sequence', () => {
|
|
165
|
+
reset_praise_audio_index() // reset state at the start of each test
|
|
166
|
+
|
|
167
|
+
const first_result = get_praise_audio_file()
|
|
168
|
+
expect(first_result).toBe('expected-value-1')
|
|
169
|
+
|
|
170
|
+
const second_result = get_praise_audio_file()
|
|
171
|
+
expect(second_result).toBe('expected-value-2')
|
|
172
|
+
})
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 6. Closing the E2E gate without a human run
|
|
178
|
+
|
|
179
|
+
The completion gate used to end by asking the user to run `pnpm josh test` and paste the output.
|
|
180
|
+
That step is gone (joshuafolkken/kit#902). It is the rule below that replaces it, and the
|
|
181
|
+
replacement is **not** a relaxation — nothing that a red local run stopped is allowed through.
|
|
182
|
+
|
|
183
|
+
### Why it existed, and why it no longer does
|
|
184
|
+
|
|
185
|
+
The reason was never that a human reads E2E output better. It was that `followup` waited 180
|
|
186
|
+
seconds for CI, which no suite containing E2E can finish in — so the command exited red beside a CI
|
|
187
|
+
that was still running, and the only reliable E2E signal left was a person's terminal. That budget
|
|
188
|
+
is now derived from the distributed `templates/workflows/ci.yml` rather than picked as a round
|
|
189
|
+
number: 1920 seconds, the longest run its `needs` graph permits plus runner-queue headroom, with a
|
|
190
|
+
unit test that fails if a declared job budget outgrows it (joshuafolkken/kit#851). CI can now be
|
|
191
|
+
waited on, so it can be relied on.
|
|
192
|
+
|
|
193
|
+
### Which result closes the gate
|
|
194
|
+
|
|
195
|
+
Decided by whether a pull request is open, never by judgement:
|
|
196
|
+
|
|
197
|
+
| Situation | What closes the gate |
|
|
198
|
+
| -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
199
|
+
| A pull request is open — `fullrun`, `backlogrun` | The CI E2E job. `pnpm josh followup` waits for the checks and refuses to merge while any of them is non-passing. |
|
|
200
|
+
| No pull request — `halfrun`'s stop before commit, a completion reported outside any workflow | `pnpm josh test:e2e`, run by **you**, output read by you. |
|
|
201
|
+
|
|
202
|
+
**Never ask the user to run it, in either row.** A completion report is not allowed to depend on
|
|
203
|
+
somebody being at the keyboard; that dependency is what made a `fullrun` chain stall at its last
|
|
204
|
+
step. And never report completion on an E2E result nobody read — an unread result is not a pass.
|
|
205
|
+
|
|
206
|
+
**Where the application layer ships an integrated gate, prefer it** over a bare `pnpm josh test:e2e`
|
|
207
|
+
for the second row: `@joshuafolkken/app-kit` ships `pnpm josh-app verify`, which builds once and
|
|
208
|
+
boots once to run the E2E suite and the DAST scan against that one server — and which delegates E2E
|
|
209
|
+
to `josh test:e2e`, so the skip below still applies. **Decide by the command list the installed
|
|
210
|
+
toolkit prints, not by which toolkit is installed and not by a version number written here**: the
|
|
211
|
+
same rule the UI gate uses, and the only one that survives a release.
|
|
212
|
+
|
|
213
|
+
### A project with no E2E suite
|
|
214
|
+
|
|
215
|
+
`pnpm josh test:e2e` runs through `scripts/test/test-e2e-guard.ts`, which **skips and exits 0**, naming
|
|
216
|
+
the reason, when `@playwright/test` is not installed or no `*.e2e.{ts,js}` file exists. That skip is
|
|
217
|
+
a **defined** outcome, not an accident: a project with no E2E suite has nothing for the gate to
|
|
218
|
+
read, and the run says so out loud. **A skip you did not see printed is not one** — it is an unread
|
|
219
|
+
result, and it falls under the previous paragraph.
|
|
220
|
+
|
|
221
|
+
**CI decides the same question, and now by the same rule.** The `e2e-detect` job in
|
|
222
|
+
`templates/workflows/ci.yml` enables the `e2e` job when any `*.e2e.{ts,js}` exists outside
|
|
223
|
+
`node_modules` — the guard's own glob, dot-directories left out the way the guard's default leaves
|
|
224
|
+
them out — and it does not look at the config's filename at all (joshuafolkken/kit#991). Before
|
|
225
|
+
that it required a file named exactly `playwright.config.ts` **and** an `*.e2e.{ts,js}` under `tests` or
|
|
226
|
+
`src/routes`, so a suite kept anywhere else, or a config named `playwright.config.js`, read as
|
|
227
|
+
"no E2E" in CI while `josh test:e2e` ran it locally: the job's `if:` went false, GitHub recorded it
|
|
228
|
+
as `skipped`, the rollup parser counted the skip as passing exactly as it does for every other
|
|
229
|
+
conditional job, and the first row of the table above closed the gate on a suite nobody ran.
|
|
230
|
+
**Where the specs live was a precondition on the CI signal; it is now a property of the workflow.**
|
|
231
|
+
The agreement is executed rather than described — `scripts/ci/ci-yml-e2e-detect.test.ts` runs the
|
|
232
|
+
workflow's own script against each layout and compares its verdict to the guard's, and asserts over
|
|
233
|
+
the whole matrix that no layout containing specs can yield `enabled=false`. § 1's placement
|
|
234
|
+
convention still stands on its own merits (`eslint/rules/test-filename.js` bans a top-level
|
|
235
|
+
`tests/` directory outright), but the CI signal no longer depends on following it.
|
|
236
|
+
|
|
237
|
+
**One difference from the guard remains, and it is deliberate and one-sided.** The guard also skips
|
|
238
|
+
when `@playwright/test` is not installed, which is what keeps that optional peer optional for the
|
|
239
|
+
pre-push hook; CI enables the job on the spec alone, so a spec that cannot run ends red rather than
|
|
240
|
+
silently green. Enabling more than the guard costs a failed job, enabling less costs a merge — so
|
|
241
|
+
the difference may widen in that direction and never narrow.
|
|
242
|
+
|
|
243
|
+
### The gate is not weakened
|
|
244
|
+
|
|
245
|
+
Two properties carry the verification the human step used to carry, and both are asserted by tests
|
|
246
|
+
rather than left to prose:
|
|
247
|
+
|
|
248
|
+
- **A non-passing check keeps the merge closed.** `evaluate_pr_state` returns `success` only when
|
|
249
|
+
GitHub reports the pull request `CLEAN` **and** every required check passes. A failing E2E job
|
|
250
|
+
makes GitHub report `UNSTABLE`, and the one opening in that wall — `is_unstable_only_from_coderabbit`,
|
|
251
|
+
the temporary kit#753 policy — applies only when _every_ non-passing check is CodeRabbit's. So a
|
|
252
|
+
red E2E can never reach `success`, and `followup` exits non-zero instead of merging.
|
|
253
|
+
- **Weakening the gate is a workaround, and the workaround rules apply to it.** Filtering,
|
|
254
|
+
narrowing or reinterpreting E2E output to get past it is the violation `CLAUDE.md` names under
|
|
255
|
+
"Cross-package problems"; reporting the filtered result honestly does not make it compliant.
|
|
256
|
+
|
|
257
|
+
**`E2E` stays off the required-check list, and that is a decision rather than an oversight**
|
|
258
|
+
(joshuafolkken/kit#991). A required check is satisfied by a _skipped_ job — the rollup parser maps
|
|
259
|
+
`SKIPPED` to `pass` — so requiring `E2E` would have passed on exactly the skipped job described
|
|
260
|
+
above, which is the failure it looks like it would have caught. It adds nothing to the failure path
|
|
261
|
+
either: a red E2E already ends the wait on the poll that sees it. What it would add is a cost —
|
|
262
|
+
a repository whose CI reports no `E2E` context at all resolves the required entry to `missing`,
|
|
263
|
+
which is never `pass`, so the evaluation stays `pending` until the 32-minute wait times out with
|
|
264
|
+
nothing actually wrong. What guarantees the job runs is the detection rule above, not the required
|
|
265
|
+
list. A project that wants it required opts in through `JOSH_REQUIRED_CHECKS`, which
|
|
266
|
+
`scripts/git/git-pr-checks-eval.test.ts` covers; the decision itself — `E2E` off the default list,
|
|
267
|
+
and a repository reporting no `E2E` check still mergeable — is pinned in
|
|
268
|
+
`scripts/git/git-pr-checks-e2e-gate.test.ts`.
|
|
269
|
+
|
|
270
|
+
**A red E2E is reported as soon as it goes red, and by name.** `E2E` is not on the required list, so
|
|
271
|
+
until joshuafolkken/kit#990 nothing ended the wait when it failed: the rollup read as pending,
|
|
272
|
+
`followup` ran out its 32-minute budget, and the run ended in `Timed out while waiting for PR checks
|
|
273
|
+
to complete.` — a message naming neither the job nor the cause. Any failing check now ends the wait
|
|
274
|
+
on the poll that sees it, and the error names it (`PR checks failed (failed checks: E2E).`).
|
|
275
|
+
The poll loop keeps CodeRabbit exempt under the temporary kit#753 policy. **This is a change to how fast the gate
|
|
276
|
+
reports, never to what it lets through** — no failing check gained a path to `success`, which
|
|
277
|
+
`scripts/git/git-pr-checks-e2e-gate.test.ts` continues to assert.
|