@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,85 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process'
|
|
2
|
+
|
|
3
|
+
// Environment variables that git reads from the environment. A test that sets these affects every
|
|
4
|
+
// subsequent git command in the same worker when isolation is disabled.
|
|
5
|
+
const GIT_ENV_KEYS: ReadonlyArray<string> = [
|
|
6
|
+
'GIT_DIR',
|
|
7
|
+
'GIT_INDEX_FILE',
|
|
8
|
+
'GIT_OBJECT_DIRECTORY',
|
|
9
|
+
'GIT_WORK_TREE',
|
|
10
|
+
'GIT_COMMON_DIR',
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
interface StateSnapshot {
|
|
14
|
+
branch: string
|
|
15
|
+
status: string
|
|
16
|
+
git_env: Record<string, string | undefined>
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function run_git(args: string): string {
|
|
20
|
+
try {
|
|
21
|
+
return execSync(`git ${args}`, { encoding: 'utf8', stdio: 'pipe' }).trim()
|
|
22
|
+
} catch {
|
|
23
|
+
return '(error)'
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function capture_git_environment(): Record<string, string | undefined> {
|
|
28
|
+
return Object.fromEntries(GIT_ENV_KEYS.map((key) => [key, process.env[key]]))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function capture_state(): StateSnapshot {
|
|
32
|
+
return {
|
|
33
|
+
branch: run_git('rev-parse --abbrev-ref HEAD'),
|
|
34
|
+
status: run_git('status --porcelain'),
|
|
35
|
+
git_env: capture_git_environment(),
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function environment_diff(
|
|
40
|
+
before: Record<string, string | undefined>,
|
|
41
|
+
after: Record<string, string | undefined>,
|
|
42
|
+
): Array<string> {
|
|
43
|
+
return GIT_ENV_KEYS.filter((key) => before[key] !== after[key]).map(
|
|
44
|
+
(key) => ` ${key}: ${String(before[key])} → ${String(after[key])}`,
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function format_violations(before: StateSnapshot, after: StateSnapshot): string | undefined {
|
|
49
|
+
const lines: Array<string> = []
|
|
50
|
+
|
|
51
|
+
if (before.branch !== after.branch) {
|
|
52
|
+
lines.push(` branch: ${before.branch} → ${after.branch}`)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (before.status !== after.status) {
|
|
56
|
+
lines.push(' working tree changed (run "git status" to inspect)')
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
lines.push(...environment_diff(before.git_env, after.git_env))
|
|
60
|
+
|
|
61
|
+
if (lines.length === 0) return undefined
|
|
62
|
+
|
|
63
|
+
return `test-state-guard: tests mutated repository state:\n${lines.join('\n')}`
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function setup(): () => void {
|
|
67
|
+
const before = capture_state()
|
|
68
|
+
|
|
69
|
+
return function disarm(): void {
|
|
70
|
+
const after = capture_state()
|
|
71
|
+
const violation = format_violations(before, after)
|
|
72
|
+
|
|
73
|
+
if (violation !== undefined) throw new Error(violation)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const test_state_guard = {
|
|
78
|
+
GIT_ENV_KEYS,
|
|
79
|
+
capture_state,
|
|
80
|
+
env_diff: environment_diff,
|
|
81
|
+
format_violations,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type { StateSnapshot }
|
|
85
|
+
export { setup, test_state_guard }
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { beforeEach } from 'vitest'
|
|
2
|
+
|
|
3
|
+
// **Fixture writes to the real streams no longer reach the gate's output** (joshuafolkken/kit#2296).
|
|
4
|
+
// A unit test that drives a CLI `main`/`run` — `test:declared --match`, `run:review` with a bad
|
|
5
|
+
// argument — writes its `match:` / `Usage: josh …` lines straight to `process.stdout` and
|
|
6
|
+
// `process.stderr`, which Vitest forwards from the worker verbatim. Those lines then sat at the tail
|
|
7
|
+
// of `pnpm josh test:unit`, and a run reading the gate with `tail` took them for the suite's own
|
|
8
|
+
// output. Silencing the two streams for the body of every test drops them; console.* is untouched, so
|
|
9
|
+
// a deliberate debug line still shows, and the restore is a per-test teardown so nothing leaks between
|
|
10
|
+
// tests or into Vitest's own reporter.
|
|
11
|
+
|
|
12
|
+
type WriteFunction = typeof process.stdout.write
|
|
13
|
+
|
|
14
|
+
interface SavedWrites {
|
|
15
|
+
stdout: WriteFunction
|
|
16
|
+
stderr: WriteFunction
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function swallow(): true {
|
|
20
|
+
return true
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Swaps both streams' `write` for a no-op and returns what was there, so the caller restores exactly
|
|
24
|
+
// what it replaced rather than a stream reference captured somewhere else — Vitest wraps these in the
|
|
25
|
+
// worker, and that wrapper is what must come back.
|
|
26
|
+
function silence_streams(): SavedWrites {
|
|
27
|
+
const saved: SavedWrites = { stdout: process.stdout.write, stderr: process.stderr.write }
|
|
28
|
+
|
|
29
|
+
process.stdout.write = swallow
|
|
30
|
+
process.stderr.write = swallow
|
|
31
|
+
|
|
32
|
+
return saved
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function restore_streams(saved: SavedWrites): void {
|
|
36
|
+
process.stdout.write = saved.stdout
|
|
37
|
+
process.stderr.write = saved.stderr
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The teardown is returned from `beforeEach` rather than kept in a module binding, so two tests never
|
|
41
|
+
// share one saved pair and nothing here writes to a top-level variable from inside a hook. The hook
|
|
42
|
+
// registration is the setup file's whole purpose, so its top-level effect is deliberate.
|
|
43
|
+
// eslint-disable-next-line unicorn/no-top-level-side-effects
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
const saved = silence_streams()
|
|
46
|
+
|
|
47
|
+
return () => {
|
|
48
|
+
restore_streams(saved)
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const test_stdout_guard = { restore_streams, silence_streams }
|
|
53
|
+
|
|
54
|
+
export { test_stdout_guard }
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { appendFileSync } from 'node:fs'
|
|
2
|
+
import { expect } from 'vitest'
|
|
3
|
+
import { GUARD_LOG_KEY } from './unit-guard-environment'
|
|
4
|
+
|
|
5
|
+
// **A unit test that forgets to mock a notification must fail rather than notify**
|
|
6
|
+
// (joshuafolkken/kit#2494). A lane child's new test drove `run_carry_cli.run(['--end', '--stopped',
|
|
7
|
+
// …])` without replacing `./run-stop-notify`, and two runs of it sent two real "backlogrun stopped"
|
|
8
|
+
// confirmations — while the run was still going — and the test passed. `telegram-notify.ts` posts
|
|
9
|
+
// with Node's own `fetch`, which the `gh` / `git` `PATH` shims in `test-network-guard.ts` never see.
|
|
10
|
+
//
|
|
11
|
+
// **This wraps `fetch` in every worker rather than mocking the notifier module**, for the reason the
|
|
12
|
+
// network guard shims a binary rather than mocking a module: any caller that reaches Telegram is
|
|
13
|
+
// caught, not only the import graph a mock was written against. Anything not addressed to Telegram
|
|
14
|
+
// is handed to the real `fetch` untouched, and a test that stubs `fetch` itself replaces this
|
|
15
|
+
// wrapper for its own duration, so the correctly mocked suites (`telegram-notify.test.ts`) see
|
|
16
|
+
// nothing of it.
|
|
17
|
+
//
|
|
18
|
+
// **The attempt is recorded in the network guard's own log, not a second one.** `disarm` already
|
|
19
|
+
// reads that record at teardown and throws with every line in it, so a Telegram send fails the run
|
|
20
|
+
// and is reported exactly as a live `gh api` is — naming the test that made it, since a `fetch` has
|
|
21
|
+
// no command line to quote. The call itself is refused either way, so even an unarmed run sends
|
|
22
|
+
// nothing.
|
|
23
|
+
//
|
|
24
|
+
// **Only this process is covered.** A CLI a test spawns as a subprocess loads no setup file; the
|
|
25
|
+
// unit suite's Telegram sends so far have all been in-process, and the subprocess case is left to
|
|
26
|
+
// the notifier's own mocks.
|
|
27
|
+
|
|
28
|
+
const TELEGRAM_HOST = 'api.telegram.org'
|
|
29
|
+
const RECORD_NAME = 'telegram'
|
|
30
|
+
const BLOCKED_MESSAGE =
|
|
31
|
+
'josh: the unit suite must not send a Telegram notification — mock it instead'
|
|
32
|
+
const UNKNOWN_TEST = '(outside a test)'
|
|
33
|
+
// Marks a `fetch` that is already this wrapper. `isolate: false` re-runs a setup file for every test
|
|
34
|
+
// file in one worker, and wrapping the wrapper each time would stack one closure per file.
|
|
35
|
+
const GUARDED_MARK = Symbol.for('josh.unit-telegram-guard')
|
|
36
|
+
|
|
37
|
+
type Fetch = typeof globalThis.fetch
|
|
38
|
+
type GuardedFetch = Fetch & { [GUARDED_MARK]?: true }
|
|
39
|
+
|
|
40
|
+
function request_url(input: Parameters<Fetch>[0]): string {
|
|
41
|
+
if (typeof input === 'string') return input
|
|
42
|
+
|
|
43
|
+
return input instanceof URL ? input.href : input.url
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The host, compared exactly. The URL carries the bot token in its path, so nothing of it is kept.
|
|
47
|
+
function is_telegram(input: Parameters<Fetch>[0]): boolean {
|
|
48
|
+
return URL.parse(request_url(input))?.hostname === TELEGRAM_HOST
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function current_test(): string {
|
|
52
|
+
const state = expect.getState()
|
|
53
|
+
|
|
54
|
+
return [state.testPath, state.currentTestName ?? UNKNOWN_TEST].filter(Boolean).join(' > ')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// `>>`-style append, for `shim_shell.record_line`'s reason: every worker writes the one record.
|
|
58
|
+
function record(log_file: string | undefined): void {
|
|
59
|
+
if (log_file !== undefined) appendFileSync(log_file, `${RECORD_NAME} ${current_test()}\n`)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function guarded_fetch(real_fetch: Fetch): GuardedFetch {
|
|
63
|
+
const guarded: GuardedFetch = async function (input, init) {
|
|
64
|
+
if (!is_telegram(input)) return await real_fetch(input, init)
|
|
65
|
+
|
|
66
|
+
record(process.env[GUARD_LOG_KEY])
|
|
67
|
+
|
|
68
|
+
throw new Error(BLOCKED_MESSAGE)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
guarded[GUARDED_MARK] = true
|
|
72
|
+
|
|
73
|
+
return guarded
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// A plain assignment rather than `vi.stubGlobal`: a test's own `vi.unstubAllGlobals` restores what
|
|
77
|
+
// was there before the *first* stub, which would be the unguarded `fetch` had this been one.
|
|
78
|
+
function install(): void {
|
|
79
|
+
const current: GuardedFetch = fetch
|
|
80
|
+
|
|
81
|
+
if (current[GUARDED_MARK] !== true) Reflect.set(globalThis, 'fetch', guarded_fetch(current))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The wrapping is the setup file's whole purpose, so its top-level effect is deliberate.
|
|
85
|
+
// eslint-disable-next-line unicorn/no-top-level-side-effects
|
|
86
|
+
install()
|
|
87
|
+
|
|
88
|
+
const test_telegram_guard = { BLOCKED_MESSAGE, RECORD_NAME, guarded_fetch, is_telegram }
|
|
89
|
+
|
|
90
|
+
export { test_telegram_guard }
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// The test type a changed path calls for — `Unit` or `E2E` — decided from the path alone
|
|
2
|
+
// (joshuafolkken/kit#2181).
|
|
3
|
+
//
|
|
4
|
+
// **This mechanizes `prompts/testing-guide.md` §1's two-row table**, whose last line used to be "When
|
|
5
|
+
// ambiguous, ask the user" — a Tier B stop on a question the path already answers. The table routes
|
|
6
|
+
// `src/routes/` pages and interactive UI to E2E and everything else (utilities, `src/lib/server/`,
|
|
7
|
+
// display-only components) to Unit. The mechanically certain half of that is location: a change under
|
|
8
|
+
// `src/routes/` is a page whose behavior is observed through the browser, so it takes E2E; every other
|
|
9
|
+
// runtime path is exercised by a colocated unit test. A component with interaction is reached through
|
|
10
|
+
// the route that renders it, and that route is under `src/routes/` — so the location rule covers it
|
|
11
|
+
// without reading the file.
|
|
12
|
+
|
|
13
|
+
type TestType = 'Unit' | 'E2E'
|
|
14
|
+
|
|
15
|
+
const UNIT: TestType = 'Unit'
|
|
16
|
+
const E2E: TestType = 'E2E'
|
|
17
|
+
|
|
18
|
+
// The paths whose changes are observed through the browser, so their test is an E2E spec. Everything
|
|
19
|
+
// else is a utility, a server module or a display-only component — all Unit.
|
|
20
|
+
const E2E_PREFIXES: ReadonlyArray<string> = ['src/routes/']
|
|
21
|
+
|
|
22
|
+
function test_type_for(path: string): TestType {
|
|
23
|
+
const normalized = path.trim()
|
|
24
|
+
|
|
25
|
+
return E2E_PREFIXES.some((prefix) => normalized.startsWith(prefix)) ? E2E : UNIT
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const test_type_logic = { E2E, E2E_PREFIXES, UNIT, test_type_for }
|
|
29
|
+
|
|
30
|
+
export type { TestType }
|
|
31
|
+
export { test_type_logic }
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { existsSync, globSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { PROJECT_ENVIRONMENT_KEYS } from '#ports'
|
|
6
|
+
import { execa } from 'execa'
|
|
7
|
+
import { unit_worker_share } from './unit-worker-share'
|
|
8
|
+
|
|
9
|
+
const PNPM = 'pnpm'
|
|
10
|
+
const FAIL_EXIT_CODE = 1
|
|
11
|
+
const ARGV_START = 2
|
|
12
|
+
const VITEST_PACKAGE = path.join('node_modules', 'vitest')
|
|
13
|
+
const UNIT_GLOB = '**/*.{test,spec}.{ts,js}'
|
|
14
|
+
const NODE_MODULES = 'node_modules'
|
|
15
|
+
|
|
16
|
+
// **A unit check that executed nothing may report success only where the project has no unit suite
|
|
17
|
+
// at all** (joshuafolkken/kit#1224). The two halves of "nothing ran" are not the same state:
|
|
18
|
+
//
|
|
19
|
+
// - **`vitest` absent is the young project.** `josh init` installs no vitest and writes no
|
|
20
|
+
// `test:unit` script, so a freshly-bootstrapped project always lands here — which is the case the
|
|
21
|
+
// skip was written for, and it keeps it.
|
|
22
|
+
// - **`vitest` present is the project declaring that it runs unit tests.** Zero matching files
|
|
23
|
+
// there is a broken state rather than a young one — a mis-scoped glob, or a suite that was
|
|
24
|
+
// deleted — and reporting it as a passing check hands `pnpm josh followup`, which reads
|
|
25
|
+
// only the exit code, a verification that verified nothing. That half fails.
|
|
26
|
+
//
|
|
27
|
+
// Rejected: leaving both halves green — joshuafolkken/kit#1216's `--verbose` makes the zero count
|
|
28
|
+
// *readable* in the CI log, but nobody reads a green log and the merge gate reads only pass/fail;
|
|
29
|
+
// and putting the failing half behind an opt-in such as `JOSH_REQUIRE_UNIT_TESTS`, which is off in
|
|
30
|
+
// exactly the projects that need it. The full decision, including why the absent-vitest half is
|
|
31
|
+
// deliberately left asymmetric, is on joshuafolkken/kit#1224.
|
|
32
|
+
//
|
|
33
|
+
// **`scripts/test/test-e2e-guard.ts` deliberately keeps both skips, and that divergence is not an
|
|
34
|
+
// oversight.** The argument above rests on the package's presence being a declaration, and
|
|
35
|
+
// `@playwright/test` is not one: it is an optional peer dependency that vitest's browser mode also
|
|
36
|
+
// needs, so a project can legitimately have it installed with no `*.e2e.{ts,js}` file at all.
|
|
37
|
+
const SKIP_ACTION = 'skip-missing-package'
|
|
38
|
+
const FAIL_ACTION = 'fail-no-tests'
|
|
39
|
+
|
|
40
|
+
type GuardAction = 'run' | typeof SKIP_ACTION | typeof FAIL_ACTION
|
|
41
|
+
|
|
42
|
+
// The word the gate looks for to know a passing step did not actually run. Exported and reused on
|
|
43
|
+
// both sides rather than matched by eye: joshuafolkken/kit#967 stopped printing a passing check's
|
|
44
|
+
// body, and without this a gate that skipped the whole unit suite printed the same five lines as one
|
|
45
|
+
// that ran it.
|
|
46
|
+
const SKIP_MARKER = '— skipping'
|
|
47
|
+
|
|
48
|
+
const SKIP_REASON = 'vitest is not installed'
|
|
49
|
+
const FAIL_REASON =
|
|
50
|
+
'vitest is installed but no *.{test,spec}.{ts,js} test file was found — refusing to report a unit check that ran nothing'
|
|
51
|
+
|
|
52
|
+
function resolve_guard_action(is_installed: boolean, has_tests: boolean): GuardAction {
|
|
53
|
+
if (!is_installed) return SKIP_ACTION
|
|
54
|
+
if (!has_tests) return FAIL_ACTION
|
|
55
|
+
|
|
56
|
+
return 'run'
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function is_vitest_installed(project_directory: string): boolean {
|
|
60
|
+
return existsSync(path.join(project_directory, VITEST_PACKAGE))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function is_in_node_modules(entry: string): boolean {
|
|
64
|
+
return entry.split(/[/\\]/u).includes(NODE_MODULES)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function has_unit_tests(project_directory: string): boolean {
|
|
68
|
+
const matches = globSync(UNIT_GLOB, {
|
|
69
|
+
cwd: project_directory,
|
|
70
|
+
exclude: is_in_node_modules,
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
return matches.length > 0
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// A lane's port allocation belongs to its development and preview servers, not to unit fixtures.
|
|
77
|
+
// Passing it into Vitest makes every case that deliberately omits or replaces the seed inherit the
|
|
78
|
+
// checkout's seat instead. Keep the rest of the caller's environment, including CI and PATH guards.
|
|
79
|
+
function isolated_unit_environment(
|
|
80
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
81
|
+
): NodeJS.ProcessEnv {
|
|
82
|
+
const isolated = { ...environment }
|
|
83
|
+
|
|
84
|
+
for (const key of PROJECT_ENVIRONMENT_KEYS) Reflect.deleteProperty(isolated, key)
|
|
85
|
+
|
|
86
|
+
return isolated
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The whole vitest invocation after the binary, not just the flags: `josh test:related` runs
|
|
90
|
+
// `vitest related <files> --run` where this command runs `vitest run`, and the two must not grow
|
|
91
|
+
// two copies of the guard, the spawn or the skip notice around that one difference
|
|
92
|
+
// (joshuafolkken/kit#1257).
|
|
93
|
+
// **The share is read from inside the marker, not before it.** This is the one funnel every
|
|
94
|
+
// josh-driven vitest goes through — `test:unit`, `test:related` and the pre-push hook alike — so it is
|
|
95
|
+
// where a run both learns how many others are in flight and announces itself to them
|
|
96
|
+
// (joshuafolkken/kit#1515). The pre-push hook is the reason it is here rather than only in the gate:
|
|
97
|
+
// it passed no cap at all, so vitest opened one worker per core in every lane at once.
|
|
98
|
+
//
|
|
99
|
+
// Reading the share first and claiming afterwards leaves a window in which two hooks firing together
|
|
100
|
+
// both count "alone" and both run uncapped. Inside the marker the number is identical — this run's own
|
|
101
|
+
// record is now on disk and `is_nested_run` therefore contributes nothing — and the window is gone.
|
|
102
|
+
async function run_vitest(vitest_arguments: ReadonlyArray<string>): Promise<number> {
|
|
103
|
+
return await unit_worker_share.with_run_marker(async () => {
|
|
104
|
+
const sized = unit_worker_share.worker_arguments(
|
|
105
|
+
vitest_arguments,
|
|
106
|
+
unit_worker_share.current_share(),
|
|
107
|
+
)
|
|
108
|
+
const result = await execa(PNPM, ['exec', 'vitest', ...vitest_arguments, ...sized], {
|
|
109
|
+
env: isolated_unit_environment(),
|
|
110
|
+
extendEnv: false,
|
|
111
|
+
stdio: 'inherit',
|
|
112
|
+
reject: false,
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
return result.exitCode ?? FAIL_EXIT_CODE
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// The label names the command the notice is printed for, so a skipped scoped run says
|
|
120
|
+
// `josh test:related` rather than reporting itself as the full suite. `SKIP_MARKER` is unchanged
|
|
121
|
+
// either way: the gate reads that word, never the label.
|
|
122
|
+
const UNIT_COMMAND_LABEL = 'test:unit'
|
|
123
|
+
|
|
124
|
+
// The two non-running outcomes report through different streams and different exit codes, because
|
|
125
|
+
// they mean different things: one says the project has no unit suite yet, the other says it has one
|
|
126
|
+
// that could not be found (joshuafolkken/kit#1224). Only the first keeps `SKIP_MARKER`, so the
|
|
127
|
+
// gate's "passed without running" handling still means exactly what it did.
|
|
128
|
+
function report_no_run(action: Exclude<GuardAction, 'run'>, command_label: string): number {
|
|
129
|
+
if (action === FAIL_ACTION) {
|
|
130
|
+
console.error(`josh ${command_label}: ${FAIL_REASON}.`)
|
|
131
|
+
|
|
132
|
+
return FAIL_EXIT_CODE
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
console.info(`josh ${command_label}: ${SKIP_REASON} ${SKIP_MARKER} vitest unit tests.`)
|
|
136
|
+
|
|
137
|
+
return 0
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// `announcement` is printed only on the branch that actually spawns vitest. A caller that wrote it
|
|
141
|
+
// itself would claim a run before this guard had decided there would be one — the same "a passing
|
|
142
|
+
// step did not actually run" ambiguity `SKIP_MARKER` exists for, reintroduced one layer up
|
|
143
|
+
// (joshuafolkken/kit#1257).
|
|
144
|
+
async function run_guarded_vitest(
|
|
145
|
+
project_directory: string,
|
|
146
|
+
vitest_arguments: ReadonlyArray<string>,
|
|
147
|
+
command_label: string = UNIT_COMMAND_LABEL,
|
|
148
|
+
announcement?: string,
|
|
149
|
+
): Promise<number> {
|
|
150
|
+
const is_installed = is_vitest_installed(project_directory)
|
|
151
|
+
const has_tests = has_unit_tests(project_directory)
|
|
152
|
+
const action = resolve_guard_action(is_installed, has_tests)
|
|
153
|
+
|
|
154
|
+
if (action !== 'run') return report_no_run(action, command_label)
|
|
155
|
+
if (announcement !== undefined) process.stdout.write(`${announcement}\n`)
|
|
156
|
+
|
|
157
|
+
return await run_vitest(vitest_arguments)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async function run_guarded_unit(
|
|
161
|
+
project_directory: string,
|
|
162
|
+
extra_arguments: ReadonlyArray<string>,
|
|
163
|
+
): Promise<number> {
|
|
164
|
+
return await run_guarded_vitest(project_directory, ['run', ...extra_arguments])
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
168
|
+
const extra_arguments = process.argv.slice(ARGV_START)
|
|
169
|
+
const exit_code = await run_guarded_unit(process.cwd(), extra_arguments)
|
|
170
|
+
|
|
171
|
+
process.exit(exit_code)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const test_unit_guard = {
|
|
175
|
+
SKIP_MARKER,
|
|
176
|
+
resolve_guard_action,
|
|
177
|
+
is_vitest_installed,
|
|
178
|
+
has_unit_tests,
|
|
179
|
+
isolated_unit_environment,
|
|
180
|
+
run_guarded_unit,
|
|
181
|
+
run_guarded_vitest,
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export type { GuardAction }
|
|
185
|
+
export { test_unit_guard }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// The environment variable the network guard's record is handed to the test workers under
|
|
2
|
+
// (joshuafolkken/kit#2494). The `gh` and `git` shims carry the record's path baked into their own
|
|
3
|
+
// script, but an in-process guard — the Telegram one wraps `fetch` inside each worker — has nothing
|
|
4
|
+
// baked in, so `arm` exports the path and every worker inherits it with `PATH`.
|
|
5
|
+
//
|
|
6
|
+
// A module of its own because both sides must name it and neither may load the other: the network
|
|
7
|
+
// guard runs in Vitest's main process and must not import `vitest`, and the Telegram guard runs in
|
|
8
|
+
// every worker, where loading the network guard would resolve the guarded repository with a `git`
|
|
9
|
+
// spawn once per test file.
|
|
10
|
+
const GUARD_LOG_KEY = 'JOSH_UNIT_GUARD_LOG'
|
|
11
|
+
|
|
12
|
+
export { GUARD_LOG_KEY }
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
2
|
+
import { PILOT_FILES } from './pilot-files'
|
|
3
|
+
import { VITEST_INCLUDE_GLOBS } from './vitest-include-globs'
|
|
4
|
+
|
|
5
|
+
// The unit suite runs as two Vitest projects so the isolation-safe files can skip per-file worker
|
|
6
|
+
// isolation, which re-evaluates every shared module once per file (joshuafolkken/kit#2170). Measured
|
|
7
|
+
// back to back on the pilot set, isolate:false ran it in 27.5s against 64.7s isolated — a 57% cut,
|
|
8
|
+
// because module evaluation is about half of a run's wall clock.
|
|
9
|
+
//
|
|
10
|
+
// **The two projects partition the suite exactly.** `pure` runs the classifier's isolation-free set;
|
|
11
|
+
// `isolated` runs everything else the main globs match, excluding the pilot files so no file lands in
|
|
12
|
+
// both. Their union is every included file bar the packed-consumer smoke test, and nothing runs
|
|
13
|
+
// twice — which is what keeps the gate's green condition identical to the single-project suite it
|
|
14
|
+
// replaces. `classify-isolation.ts` lists a file as pure only when it mutates no state a sibling in
|
|
15
|
+
// the same worker could observe, so isolate:false changes how the pure files run, never whether they
|
|
16
|
+
// pass.
|
|
17
|
+
|
|
18
|
+
const TEST_TIMEOUT_MS = 10_000
|
|
19
|
+
|
|
20
|
+
// Smoke test packs and installs the real tarball — too slow (~60 s setup) for the unit gate. Run
|
|
21
|
+
// before release with: pnpm vitest run --config vitest.harness.config.ts
|
|
22
|
+
const MAIN_EXCLUDE: ReadonlyArray<string> = ['scripts/build/packed-consumer.test.ts']
|
|
23
|
+
|
|
24
|
+
// **`JOSH_LANE_CHILD` is blanked so the unit suite never inherits the lane it happens to run in**
|
|
25
|
+
// (joshuafolkken/kit#2310). The gate runs inside a dispatched lane child, whose mark and lane cwd would
|
|
26
|
+
// otherwise make every world-consulting rule guard (`pre-gate-cut`, `implementation-cut`, `lane-park`)
|
|
27
|
+
// read a delivery fixture as a real lane-child call and fire on it. A suite that wants to test
|
|
28
|
+
// lane-child behavior sets the mark itself in its own `beforeEach`, exactly as it always has; blank is
|
|
29
|
+
// the "no dispatch mark" a person's session carries, which `marked_issue` reads as absent.
|
|
30
|
+
//
|
|
31
|
+
// **The proxy spellings are blanked for the same reason** (joshuafolkken/kit#2436): a package-manager
|
|
32
|
+
// wrapper writes its loopback proxy and CA into everything `pnpm` spawns, so a suite asserting what a
|
|
33
|
+
// `gh` spawn receives would pass in CI and fail on a machine with the wrapper. A suite about proxies
|
|
34
|
+
// declares the one it is testing in its own `beforeEach`.
|
|
35
|
+
//
|
|
36
|
+
// **The detached ship supervisor's marks are blanked too** (joshuafolkken/kit#2456): the pre-push unit
|
|
37
|
+
// run inherits `JOSH_SHIP_SUPERVISED` and `JOSH_AGENT_PROVIDER` from the supervisor that pushes, so a
|
|
38
|
+
// ship fixture would take the supervised stop path — and try to relaunch a real lane child — only there.
|
|
39
|
+
const PROXY_ENV: Record<string, string> = Object.fromEntries(
|
|
40
|
+
[...agent_session_environment.PROXY_KEYS, agent_session_environment.PROXY_CERTIFICATE_KEY].map(
|
|
41
|
+
(key) => [key, ''],
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
const ENV: Record<string, string> = {
|
|
46
|
+
...PROXY_ENV,
|
|
47
|
+
CLAUDE_CODE_SESSION_ID: 'vitest-session',
|
|
48
|
+
CODEX_THREAD_ID: '',
|
|
49
|
+
JOSH_AGENT_PROVIDER: '',
|
|
50
|
+
JOSH_LANE_CHILD: '',
|
|
51
|
+
JOSH_SHIP_SUPERVISED: '',
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const PURE_PROJECT = 'pure'
|
|
55
|
+
const ISOLATED_PROJECT = 'isolated'
|
|
56
|
+
|
|
57
|
+
// The state guard runs on the pure project alone. isolate:false is what lets one file see the git
|
|
58
|
+
// branch, working tree or GIT_* variables a sibling left changed, so that is the only run where a leak
|
|
59
|
+
// is a correctness problem rather than a latent one — and the isolated project keeps exactly the guards
|
|
60
|
+
// the single-project suite had. The network guard is armed once at the root instead, since it arms
|
|
61
|
+
// `PATH` before any worker of either project forks.
|
|
62
|
+
const STATE_GUARD: ReadonlyArray<string> = ['./scripts/test/test-state-guard.ts']
|
|
63
|
+
|
|
64
|
+
// Runs in every worker of both projects, before each test, and silences the real streams for the test
|
|
65
|
+
// body so a fixture's direct `process.stdout` write cannot leak into `pnpm josh test:unit`'s output
|
|
66
|
+
// (joshuafolkken/kit#2296). `setupFiles` rather than `globalSetup` because it must run inside the
|
|
67
|
+
// worker where the test's writes happen, not once in the main process.
|
|
68
|
+
const STDOUT_GUARD: ReadonlyArray<string> = ['./scripts/test/test-stdout-guard.ts']
|
|
69
|
+
|
|
70
|
+
// Runs in every worker for the same reason: it wraps that worker's own `fetch`, refusing a real
|
|
71
|
+
// Telegram send and recording which test tried (joshuafolkken/kit#2494).
|
|
72
|
+
const TELEGRAM_GUARD: ReadonlyArray<string> = ['./scripts/test/test-telegram-guard.ts']
|
|
73
|
+
|
|
74
|
+
interface UnitProjectTest {
|
|
75
|
+
name: string
|
|
76
|
+
env: Record<string, string>
|
|
77
|
+
include: ReadonlyArray<string>
|
|
78
|
+
exclude: ReadonlyArray<string>
|
|
79
|
+
isolate: boolean
|
|
80
|
+
testTimeout: number
|
|
81
|
+
globalSetup: ReadonlyArray<string>
|
|
82
|
+
setupFiles: ReadonlyArray<string>
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
interface UnitProject {
|
|
86
|
+
test: UnitProjectTest
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface UnitProjectSpec {
|
|
90
|
+
name: string
|
|
91
|
+
include: ReadonlyArray<string>
|
|
92
|
+
isolate: boolean
|
|
93
|
+
exclude?: ReadonlyArray<string>
|
|
94
|
+
globalSetup?: ReadonlyArray<string>
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function unit_project(spec: UnitProjectSpec): UnitProject {
|
|
98
|
+
return {
|
|
99
|
+
test: {
|
|
100
|
+
name: spec.name,
|
|
101
|
+
env: ENV,
|
|
102
|
+
include: [...spec.include],
|
|
103
|
+
exclude: [...(spec.exclude ?? [])],
|
|
104
|
+
isolate: spec.isolate,
|
|
105
|
+
testTimeout: TEST_TIMEOUT_MS,
|
|
106
|
+
globalSetup: [...(spec.globalSetup ?? [])],
|
|
107
|
+
setupFiles: [...STDOUT_GUARD, ...TELEGRAM_GUARD],
|
|
108
|
+
},
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const UNIT_PROJECTS: ReadonlyArray<UnitProject> = [
|
|
113
|
+
unit_project({
|
|
114
|
+
name: PURE_PROJECT,
|
|
115
|
+
include: PILOT_FILES,
|
|
116
|
+
isolate: false,
|
|
117
|
+
globalSetup: STATE_GUARD,
|
|
118
|
+
}),
|
|
119
|
+
unit_project({
|
|
120
|
+
name: ISOLATED_PROJECT,
|
|
121
|
+
include: VITEST_INCLUDE_GLOBS,
|
|
122
|
+
isolate: true,
|
|
123
|
+
exclude: [...MAIN_EXCLUDE, ...PILOT_FILES],
|
|
124
|
+
}),
|
|
125
|
+
]
|
|
126
|
+
|
|
127
|
+
const unit_projects = {
|
|
128
|
+
ENV,
|
|
129
|
+
ISOLATED_PROJECT,
|
|
130
|
+
MAIN_EXCLUDE,
|
|
131
|
+
PURE_PROJECT,
|
|
132
|
+
STATE_GUARD,
|
|
133
|
+
STDOUT_GUARD,
|
|
134
|
+
TELEGRAM_GUARD,
|
|
135
|
+
UNIT_PROJECTS,
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export type { UnitProject, UnitProjectTest }
|
|
139
|
+
export { unit_projects }
|