@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,681 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main]
|
|
9
|
+
|
|
10
|
+
# A push run is grouped by the commit it carries, so a later push to main never cancels an earlier
|
|
11
|
+
# one. Without the sha every push to main shares one group — `github.ref` is `refs/heads/main` for
|
|
12
|
+
# all of them — and the run that reaches `notify-auto-tag` for the commit that changed the version
|
|
13
|
+
# disappears: no tag, no publish, and nothing reported as failed (joshuafolkken/kit#1481).
|
|
14
|
+
# The sha is added for `push` only: added unconditionally it would also stop a new push to a pull
|
|
15
|
+
# request from cancelling that pull request's older runs, which is the saving this block exists for.
|
|
16
|
+
concurrency:
|
|
17
|
+
group: ${{ github.workflow }}-${{ github.ref }}${{ github.event_name == 'push' && format('-{0}', github.sha) || '' }}
|
|
18
|
+
cancel-in-progress: true
|
|
19
|
+
|
|
20
|
+
# Which browsers the plain-runner fallback downloads when the MCR image could not be resolved.
|
|
21
|
+
# chromium is the default because that is the single project this repository's config declares;
|
|
22
|
+
# set the JOSH_PLAYWRIGHT_BROWSERS repository variable to a space-separated list to widen it.
|
|
23
|
+
env:
|
|
24
|
+
JOSH_PLAYWRIGHT_BROWSERS: ${{ vars.JOSH_PLAYWRIGHT_BROWSERS || 'chromium' }}
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
node-26-pnpm:
|
|
28
|
+
name: Node 26 pnpm
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
timeout-minutes: 5
|
|
31
|
+
permissions:
|
|
32
|
+
contents: read
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
35
|
+
- name: Resolve pnpm version
|
|
36
|
+
id: pnpm-version
|
|
37
|
+
run: |
|
|
38
|
+
version=$(node -p "const m = require('./package.json'); m.packageManager?.match(/^pnpm@([^+]+)/)?.[1] ?? (m.devEngines?.packageManager?.name === 'pnpm' ? m.devEngines.packageManager.version?.split('+')[0] : 'latest') ?? 'latest'")
|
|
39
|
+
test -n "$version"
|
|
40
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
41
|
+
- uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
|
|
42
|
+
with:
|
|
43
|
+
version: ${{ steps.pnpm-version.outputs.version }}
|
|
44
|
+
runtime: node@26
|
|
45
|
+
install: false
|
|
46
|
+
- run: node --version && pnpm --version
|
|
47
|
+
|
|
48
|
+
playwright-image:
|
|
49
|
+
name: Resolve Playwright image
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
timeout-minutes: 2
|
|
52
|
+
permissions:
|
|
53
|
+
contents: read
|
|
54
|
+
outputs:
|
|
55
|
+
# JSON consumed via fromJSON() as the job-level `container` value: an object
|
|
56
|
+
# when the image exists, the literal `null` when it does not (= no container).
|
|
57
|
+
container: ${{ steps.resolve.outputs.container }}
|
|
58
|
+
# 'true' only when Playwright is a dependency but its image is unavailable, i.e.
|
|
59
|
+
# exactly when a job must download browsers itself.
|
|
60
|
+
should_install_browsers: ${{ steps.resolve.outputs.should_install_browsers }}
|
|
61
|
+
# The browser names the e2e job passes to `playwright install`, sanitized here so one
|
|
62
|
+
# place decides both the list and what may reach a command line.
|
|
63
|
+
browsers: ${{ steps.resolve.outputs.browsers }}
|
|
64
|
+
steps:
|
|
65
|
+
- name: Checkout code
|
|
66
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
67
|
+
|
|
68
|
+
# The MCR image lags the npm publish by days, so a version-derived tag is not
|
|
69
|
+
# guaranteed to exist. Probe it first and fall back to a plain runner instead of
|
|
70
|
+
# emitting a tag that 404s and kills every dependent job before it starts.
|
|
71
|
+
- name: Resolve image
|
|
72
|
+
id: resolve
|
|
73
|
+
run: |
|
|
74
|
+
# Whitelist the characters: the value lands in $GITHUB_OUTPUT as JSON, so a
|
|
75
|
+
# newline or quote smuggled into the lockfile could forge an extra output line.
|
|
76
|
+
version=$(grep -m1 "'@playwright/test@" pnpm-lock.yaml | sed "s/.*'@playwright\/test@//" | sed "s/':.*//" | tr -cd 'A-Za-z0-9.-')
|
|
77
|
+
|
|
78
|
+
# Sanitized once, here, for the install step below: the value comes from repository
|
|
79
|
+
# settings and is interpolated into its command line, so only letters, dashes and the
|
|
80
|
+
# spaces between them survive. Uppercase is kept on purpose — a mistyped `Chromium`
|
|
81
|
+
# then reaches Playwright as an unknown browser and fails at the install step, where
|
|
82
|
+
# the mistake is, rather than being silently narrowed to chromium.
|
|
83
|
+
set -- $(printf '%s' "${JOSH_PLAYWRIGHT_BROWSERS}" | tr -cd 'A-Za-z -')
|
|
84
|
+
# Never empty: `playwright install` with no browser named fetches chromium *and*
|
|
85
|
+
# firefox *and* webkit plus ffmpeg, roughly 1 GB, which is the download this avoids.
|
|
86
|
+
[ "$#" -gt 0 ] || set -- chromium
|
|
87
|
+
browsers="$*"
|
|
88
|
+
echo "browsers=${browsers}" >> "$GITHUB_OUTPUT"
|
|
89
|
+
|
|
90
|
+
if [ -z "${version}" ]; then
|
|
91
|
+
echo 'container=null' >> "$GITHUB_OUTPUT"
|
|
92
|
+
echo 'should_install_browsers=false' >> "$GITHUB_OUTPUT"
|
|
93
|
+
echo 'Playwright is not a dependency; every job runs on the plain runner.'
|
|
94
|
+
exit 0
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
tag="v${version}-noble"
|
|
98
|
+
image="mcr.microsoft.com/playwright:${tag}"
|
|
99
|
+
status=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 30 --retry 2 \
|
|
100
|
+
-H 'Accept: application/vnd.docker.distribution.manifest.list.v2+json' \
|
|
101
|
+
"https://mcr.microsoft.com/v2/playwright/manifests/${tag}" || true)
|
|
102
|
+
|
|
103
|
+
if [ "${status}" = '200' ]; then
|
|
104
|
+
printf 'container={"image":"%s","options":"--user root"}\n' "${image}" >> "$GITHUB_OUTPUT"
|
|
105
|
+
echo 'should_install_browsers=false' >> "$GITHUB_OUTPUT"
|
|
106
|
+
echo "Resolved Playwright container image ${image}."
|
|
107
|
+
else
|
|
108
|
+
echo 'container=null' >> "$GITHUB_OUTPUT"
|
|
109
|
+
echo 'should_install_browsers=true' >> "$GITHUB_OUTPUT"
|
|
110
|
+
echo "::warning::Playwright image ${image} could not be resolved on MCR (HTTP ${status}). Running on the plain runner and installing ${browsers} instead (set the JOSH_PLAYWRIGHT_BROWSERS repository variable to change the list)."
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
# A merge commit whose tree is identical to the merged pull request's head has already passed the
|
|
114
|
+
# required Checks context. Prove all three facts before reusing that result: this push came from one
|
|
115
|
+
# merged pull request, both commits name the same tree, and GitHub reports a successful Checks run on
|
|
116
|
+
# that exact pull request head. Every API or parsing failure leaves `reuse=false`, so a direct push,
|
|
117
|
+
# a conflicted merge, or unavailable evidence falls back to running both verification jobs.
|
|
118
|
+
reuse-pr-checks:
|
|
119
|
+
name: Reuse PR Checks
|
|
120
|
+
if: github.event_name == 'push'
|
|
121
|
+
runs-on: ubuntu-latest
|
|
122
|
+
timeout-minutes: 2
|
|
123
|
+
permissions:
|
|
124
|
+
actions: read
|
|
125
|
+
checks: read
|
|
126
|
+
contents: read
|
|
127
|
+
pull-requests: read
|
|
128
|
+
outputs:
|
|
129
|
+
reuse: ${{ steps.prove.outputs.reuse }}
|
|
130
|
+
steps:
|
|
131
|
+
- name: Prove the pushed tree passed PR Checks
|
|
132
|
+
id: prove
|
|
133
|
+
env:
|
|
134
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
135
|
+
CURRENT_SHA: ${{ github.sha }}
|
|
136
|
+
REPOSITORY: ${{ github.repository }}
|
|
137
|
+
run: |
|
|
138
|
+
echo 'reuse=false' >> "$GITHUB_OUTPUT"
|
|
139
|
+
|
|
140
|
+
if ! pulls=$(gh api "repos/${REPOSITORY}/commits/${CURRENT_SHA}/pulls"); then
|
|
141
|
+
echo '::notice::Could not identify the pull request; running the verification jobs.'
|
|
142
|
+
exit 0
|
|
143
|
+
fi
|
|
144
|
+
if ! pull=$(printf '%s' "${pulls}" | jq -r --arg sha "${CURRENT_SHA}" \
|
|
145
|
+
'[.[] | select(.merged_at != null and .merge_commit_sha == $sha and .base.ref == "main")] | if length == 1 then .[0] | [.number, .head.sha, .head.ref, .created_at, .merged_at] | @tsv else empty end'); then
|
|
146
|
+
echo '::notice::Could not parse the pull request; running the verification jobs.'
|
|
147
|
+
exit 0
|
|
148
|
+
fi
|
|
149
|
+
if [ -z "${pull}" ]; then
|
|
150
|
+
echo 'No unique merged pull request matched this push; running the verification jobs.'
|
|
151
|
+
exit 0
|
|
152
|
+
fi
|
|
153
|
+
IFS=$'\t' read -r pull_number head_sha head_ref created_at merged_at <<< "${pull}"
|
|
154
|
+
|
|
155
|
+
if ! current_tree=$(gh api "repos/${REPOSITORY}/git/commits/${CURRENT_SHA}" --jq '.tree.sha') || \
|
|
156
|
+
! pr_tree=$(gh api "repos/${REPOSITORY}/git/commits/${head_sha}" --jq '.tree.sha'); then
|
|
157
|
+
echo '::notice::Could not compare Git trees; running the verification jobs.'
|
|
158
|
+
exit 0
|
|
159
|
+
fi
|
|
160
|
+
if [ "${current_tree}" != "${pr_tree}" ]; then
|
|
161
|
+
echo 'The pushed tree differs from the verified pull request; running the verification jobs.'
|
|
162
|
+
exit 0
|
|
163
|
+
fi
|
|
164
|
+
|
|
165
|
+
if ! check_runs=$(gh api --method GET "repos/${REPOSITORY}/commits/${head_sha}/check-runs" \
|
|
166
|
+
-f per_page=100); then
|
|
167
|
+
echo '::notice::Could not read pull request checks; running the verification jobs.'
|
|
168
|
+
exit 0
|
|
169
|
+
fi
|
|
170
|
+
if ! run_ids=$(printf '%s' "${check_runs}" | jq -r \
|
|
171
|
+
'.check_runs[] | select(.name == "Checks" and .app.slug == "github-actions" and .status == "completed" and .conclusion == "success") | .details_url | select(test("/actions/runs/[0-9]+/job/")) | capture("/actions/runs/(?<id>[0-9]+)/job/").id'); then
|
|
172
|
+
echo '::notice::Could not parse pull request checks; running the verification jobs.'
|
|
173
|
+
exit 0
|
|
174
|
+
fi
|
|
175
|
+
passed=false
|
|
176
|
+
for run_id in ${run_ids}; do
|
|
177
|
+
if ! run=$(gh api "repos/${REPOSITORY}/actions/runs/${run_id}"); then
|
|
178
|
+
continue
|
|
179
|
+
fi
|
|
180
|
+
if printf '%s' "${run}" | jq -e --arg head_sha "${head_sha}" --arg head_ref "${head_ref}" \
|
|
181
|
+
--arg created_at "${created_at}" --arg merged_at "${merged_at}" \
|
|
182
|
+
'.event == "pull_request" and .head_sha == $head_sha and .head_branch == $head_ref and .path == ".github/workflows/ci.yml" and .conclusion == "success" and .created_at >= $created_at and .created_at <= $merged_at' >/dev/null; then
|
|
183
|
+
if artifacts=$(gh api --method GET "repos/${REPOSITORY}/actions/runs/${run_id}/artifacts" \
|
|
184
|
+
-f per_page=100) && printf '%s' "${artifacts}" | jq -e --arg name "pr-checks-${pull_number}" \
|
|
185
|
+
'.artifacts | any(.name == $name and .expired == false)' >/dev/null; then
|
|
186
|
+
passed=true
|
|
187
|
+
break
|
|
188
|
+
fi
|
|
189
|
+
fi
|
|
190
|
+
done
|
|
191
|
+
if [ "${passed}" != 'true' ]; then
|
|
192
|
+
echo 'The pull request has no successful Checks result; running the verification jobs.'
|
|
193
|
+
exit 0
|
|
194
|
+
fi
|
|
195
|
+
|
|
196
|
+
echo 'reuse=true' >> "$GITHUB_OUTPUT"
|
|
197
|
+
echo "Reusing successful PR Checks for tree ${current_tree}."
|
|
198
|
+
|
|
199
|
+
# joshuafolkken/kit#1226 split the gate's four checks across two runners. The unit suite is the only
|
|
200
|
+
# one that fans out across every core — 8.5 of them on the machine `scripts/gate/gate-plan.ts` measures —
|
|
201
|
+
# so on a 4-core GitHub runner it and the other three spent the whole job taking cores off each
|
|
202
|
+
# other: measured here, 121 seconds for the job with 106 of them inside the one gate step, against
|
|
203
|
+
# a theoretical floor of the unit suite alone.
|
|
204
|
+
#
|
|
205
|
+
# **The required status check did not move, and that is the point of the third job below.** GitHub
|
|
206
|
+
# matches a required context by the check-run name, which is a job's `name:`, and a required
|
|
207
|
+
# context that no longer names a job is not enforced — while a job absent from the list can go red
|
|
208
|
+
# without blocking a merge from the web UI. Splitting into two *named* jobs would therefore have
|
|
209
|
+
# needed a ruleset edit to stay as strict as it was, and left every merge between the two
|
|
210
|
+
# unguarded. So the two halves run under new names and `Checks` stays exactly what the ruleset
|
|
211
|
+
# already requires: a job that is green only when both halves are.
|
|
212
|
+
static-checks:
|
|
213
|
+
name: Static Checks
|
|
214
|
+
needs: reuse-pr-checks
|
|
215
|
+
if: ${{ always() && needs.reuse-pr-checks.outputs.reuse != 'true' }}
|
|
216
|
+
runs-on: ubuntu-latest
|
|
217
|
+
timeout-minutes: 8
|
|
218
|
+
permissions:
|
|
219
|
+
contents: read
|
|
220
|
+
packages: read
|
|
221
|
+
steps:
|
|
222
|
+
- name: Checkout code
|
|
223
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
224
|
+
|
|
225
|
+
- name: Setup Node.js
|
|
226
|
+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
227
|
+
with:
|
|
228
|
+
node-version: '24'
|
|
229
|
+
registry-url: 'https://npm.pkg.github.com'
|
|
230
|
+
|
|
231
|
+
- name: Resolve pnpm version
|
|
232
|
+
id: pnpm-version
|
|
233
|
+
run: |
|
|
234
|
+
version=$(node -p "const m = require('./package.json'); m.packageManager?.match(/^pnpm@([^+]+)/)?.[1] ?? (m.devEngines?.packageManager?.name === 'pnpm' ? m.devEngines.packageManager.version?.split('+')[0] : 'latest') ?? 'latest'")
|
|
235
|
+
test -n "$version"
|
|
236
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
237
|
+
|
|
238
|
+
- name: Setup pnpm
|
|
239
|
+
uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
|
|
240
|
+
with:
|
|
241
|
+
version: ${{ steps.pnpm-version.outputs.version }}
|
|
242
|
+
install: false
|
|
243
|
+
|
|
244
|
+
- name: Resolve pnpm store path
|
|
245
|
+
run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> "$GITHUB_ENV"
|
|
246
|
+
|
|
247
|
+
- name: Setup pnpm store cache
|
|
248
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
249
|
+
with:
|
|
250
|
+
path: ${{ env.PNPM_STORE_PATH }}
|
|
251
|
+
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
|
|
252
|
+
restore-keys: |
|
|
253
|
+
${{ runner.os }}-pnpm-store-
|
|
254
|
+
|
|
255
|
+
- name: Setup ESLint cache
|
|
256
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
257
|
+
id: eslint-cache
|
|
258
|
+
with:
|
|
259
|
+
path: |
|
|
260
|
+
.eslintcache
|
|
261
|
+
# joshuafolkken/kit#1347: the config inputs are `.js`, and the glob used to name `.ts` — which
|
|
262
|
+
# in `eslint/` is only the test files. So a rule edit left the key unchanged while a test edit
|
|
263
|
+
# busted it, the exact inverse of what invalidates a cache entry. The fingerprint in
|
|
264
|
+
# `eslint/config-fingerprint.js` now invalidates the entries themselves; this key has to move
|
|
265
|
+
# with it, or a rule edit would restore a cache whose every entry is stale, lint cold, and
|
|
266
|
+
# save nothing back under the key it already hit — a cold lint on every later run.
|
|
267
|
+
# joshuafolkken/kit#2030: `${{ github.sha }}` on the tail makes every run save a fresh entry
|
|
268
|
+
# under a new key, and the sha-less prefix in `restore-keys` restores the newest previous one
|
|
269
|
+
# first — so the cache tracks `main` instead of freezing on the first commit that hit the
|
|
270
|
+
# config-hash key and never re-saving. The config-hash body above still cold-invalidates on a
|
|
271
|
+
# rule edit exactly as before; the sha only ever adds a save, never suppresses one.
|
|
272
|
+
key: ${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-${{ github.sha }}
|
|
273
|
+
restore-keys: |
|
|
274
|
+
${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
|
|
275
|
+
${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
276
|
+
${{ runner.os }}-eslint-cache-
|
|
277
|
+
|
|
278
|
+
# `.tsbuildinfo` and `.cspellcache` were not cached in CI at all, so the type check and spell
|
|
279
|
+
# check ran cold on every run. Both are content-addressed — `tsc` records its compiler options
|
|
280
|
+
# inside the build-info file and cspell records a content hash of every config and dictionary it
|
|
281
|
+
# loaded — so restoring an older entry is never wrong; the tool re-checks only what changed
|
|
282
|
+
# (`scripts/lane/lane-cache.ts` relies on the same property when it warms a fresh lane). The sha
|
|
283
|
+
# tail plus a sha-less `restore-keys` prefix is the same save-fresh-every-run shape as the eslint
|
|
284
|
+
# cache above (joshuafolkken/kit#2030). The gate writes both files to the repo root:
|
|
285
|
+
# `josh check` runs `tsc --noEmit --incremental --tsBuildInfoFile .tsbuildinfo` and `josh
|
|
286
|
+
# cspell:dot` runs `cspell . --dot --cache --cache-strategy content --cache-location .cspellcache`.
|
|
287
|
+
- name: Setup TypeScript build cache
|
|
288
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
289
|
+
id: tsbuildinfo-cache
|
|
290
|
+
with:
|
|
291
|
+
path: |
|
|
292
|
+
.tsbuildinfo
|
|
293
|
+
key: ${{ runner.os }}-tsbuildinfo-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
|
|
294
|
+
restore-keys: |
|
|
295
|
+
${{ runner.os }}-tsbuildinfo-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
296
|
+
${{ runner.os }}-tsbuildinfo-
|
|
297
|
+
|
|
298
|
+
- name: Setup cspell cache
|
|
299
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
300
|
+
id: cspell-cache
|
|
301
|
+
with:
|
|
302
|
+
path: |
|
|
303
|
+
.cspellcache
|
|
304
|
+
key: ${{ runner.os }}-cspell-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
|
|
305
|
+
restore-keys: |
|
|
306
|
+
${{ runner.os }}-cspell-cache-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
307
|
+
${{ runner.os }}-cspell-cache-
|
|
308
|
+
|
|
309
|
+
- name: Setup safe-chain
|
|
310
|
+
run: pnpm dlx @aikidosec/safe-chain@1.5.1 setup-ci
|
|
311
|
+
|
|
312
|
+
- name: Install dependencies
|
|
313
|
+
env:
|
|
314
|
+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
315
|
+
run: pnpm install --frozen-lockfile --ignore-scripts
|
|
316
|
+
|
|
317
|
+
# One step rather than five, and concurrent rather than serial (joshuafolkken/kit#1216).
|
|
318
|
+
# `josh gate` is the command a developer runs before committing; it fans out to the same
|
|
319
|
+
# `josh` sub-commands that define each check — `lint` (prettier and eslint), `check` (the
|
|
320
|
+
# type check), `cspell:dot`, `test:unit` — so nothing here restates a tool invocation and CI
|
|
321
|
+
# cannot verify a different set from the local gate. Measured on this repository the five
|
|
322
|
+
# steps took 78–162 seconds end to end while the longest of them takes a fraction of that;
|
|
323
|
+
# the serial time was pure waiting, and it sat on the critical path between the pull request
|
|
324
|
+
# opening and the merge.
|
|
325
|
+
#
|
|
326
|
+
# **Every failure is reported in one pass.** The serial form stopped at the first red step,
|
|
327
|
+
# so a tree with a lint error and a type error cost two full CI runs to discover. The gate
|
|
328
|
+
# buffers each check and prints them all, failures with their whole output, which is the
|
|
329
|
+
# property `josh gate` was written for and the reason the five steps are not merely
|
|
330
|
+
# run in the background here.
|
|
331
|
+
#
|
|
332
|
+
# `--verbose` prints every check's body, not only the failing ones. Locally the quiet form is
|
|
333
|
+
# right — the gate runs many times per issue and the bodies pile up in the conversation — but a
|
|
334
|
+
# CI log is read once, after the fact, by someone who cannot re-run it, and a check that passed
|
|
335
|
+
# with warnings is invisible in a quiet log.
|
|
336
|
+
#
|
|
337
|
+
# **`--no-unit` selects the three checks, and selecting is not skipping** (joshuafolkken/kit#1226).
|
|
338
|
+
# The unit suite runs in the `unit` job below, through the same `josh test:unit` this step used
|
|
339
|
+
# to reach, so the set of checks CI enforces is unchanged — what moved is which runner each one
|
|
340
|
+
# is on. The flag is also the *only* thing that makes the split safe on the local side:
|
|
341
|
+
# `scripts/gate/verification-gate.ts` withholds the green-gate record and the in-flight marker on a
|
|
342
|
+
# `--no-unit` run, so this narrower gate can never let a later full `pnpm josh gate` be skipped,
|
|
343
|
+
# nor tell `josh review:brief` that a unit suite it did not run has passed.
|
|
344
|
+
#
|
|
345
|
+
# Two things are given up. GitHub's per-step timing and log grouping: the run shows one `Run
|
|
346
|
+
# verification gate` step instead of five named ones, and the gate's own summary names which
|
|
347
|
+
# check failed, which is what the grouping was being read for. And each check's output is
|
|
348
|
+
# buffered until it exits, so a check that *hangs* until this job's `timeout-minutes` is
|
|
349
|
+
# cancelled with nothing printed — where a serial step streamed. That costs one local
|
|
350
|
+
# `pnpm josh gate` to identify, and it is the price of the all-failures-in-one-pass summary.
|
|
351
|
+
- name: Run verification gate
|
|
352
|
+
run: pnpm josh gate --verbose --no-unit
|
|
353
|
+
|
|
354
|
+
# The other half of the gate, on a runner of its own. It carries the same setup steps as
|
|
355
|
+
# `static-checks` rather than sharing them: a GitHub job is its own machine, so every job that
|
|
356
|
+
# needs Node sets Node up, and this workflow already writes that preamble once per job. The
|
|
357
|
+
# single-source alternative — a local composite action under `.github/actions/` — is ruled out by
|
|
358
|
+
# `scripts/ci/ci-yml-action-parity.test.ts`, which pins the set of action names in this file to the
|
|
359
|
+
# set in `templates/workflows/ci.yml`; a local action cannot appear in a distributed template,
|
|
360
|
+
# because the template travels to consumers without it.
|
|
361
|
+
#
|
|
362
|
+
# No ESLint cache here — nothing in this job lints — and no `--maxWorkers`: `gate-plan.ts` leaves
|
|
363
|
+
# any machine below its measured 11 cores uncapped, so vitest sizes its own pool from the runner
|
|
364
|
+
# exactly as it did inside the gate step.
|
|
365
|
+
unit:
|
|
366
|
+
name: Unit Tests
|
|
367
|
+
needs: reuse-pr-checks
|
|
368
|
+
if: ${{ always() && needs.reuse-pr-checks.outputs.reuse != 'true' }}
|
|
369
|
+
runs-on: ubuntu-latest
|
|
370
|
+
timeout-minutes: 8
|
|
371
|
+
permissions:
|
|
372
|
+
contents: read
|
|
373
|
+
packages: read
|
|
374
|
+
steps:
|
|
375
|
+
- name: Checkout code
|
|
376
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
377
|
+
|
|
378
|
+
- name: Setup Node.js
|
|
379
|
+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
380
|
+
with:
|
|
381
|
+
node-version: '24'
|
|
382
|
+
registry-url: 'https://npm.pkg.github.com'
|
|
383
|
+
|
|
384
|
+
- name: Resolve pnpm version
|
|
385
|
+
id: pnpm-version
|
|
386
|
+
run: |
|
|
387
|
+
version=$(node -p "const m = require('./package.json'); m.packageManager?.match(/^pnpm@([^+]+)/)?.[1] ?? (m.devEngines?.packageManager?.name === 'pnpm' ? m.devEngines.packageManager.version?.split('+')[0] : 'latest') ?? 'latest'")
|
|
388
|
+
test -n "$version"
|
|
389
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
390
|
+
|
|
391
|
+
- name: Setup pnpm
|
|
392
|
+
uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
|
|
393
|
+
with:
|
|
394
|
+
version: ${{ steps.pnpm-version.outputs.version }}
|
|
395
|
+
install: false
|
|
396
|
+
|
|
397
|
+
- name: Resolve pnpm store path
|
|
398
|
+
run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> "$GITHUB_ENV"
|
|
399
|
+
|
|
400
|
+
- name: Setup pnpm store cache
|
|
401
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
402
|
+
with:
|
|
403
|
+
path: ${{ env.PNPM_STORE_PATH }}
|
|
404
|
+
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
|
|
405
|
+
restore-keys: |
|
|
406
|
+
${{ runner.os }}-pnpm-store-
|
|
407
|
+
|
|
408
|
+
- name: Setup safe-chain
|
|
409
|
+
run: pnpm dlx @aikidosec/safe-chain@1.5.1 setup-ci
|
|
410
|
+
|
|
411
|
+
- name: Install dependencies
|
|
412
|
+
env:
|
|
413
|
+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
414
|
+
run: pnpm install --frozen-lockfile --ignore-scripts
|
|
415
|
+
|
|
416
|
+
# **Through `josh test:unit`, never `vitest run` directly, and that is what makes a job split
|
|
417
|
+
# safe rather than a hole.** The guard decides between a skip and a failure, and
|
|
418
|
+
# https://github.com/joshuafolkken/kit/issues/1224 settled which is which: vitest absent is a
|
|
419
|
+
# project with no unit suite yet, so it skips and the job stays green, while vitest present
|
|
420
|
+
# with nothing matching the test glob is a broken state and fails the job. Calling vitest here
|
|
421
|
+
# would give that second half back — a job that ran zero tests and reported success — and the
|
|
422
|
+
# split would have moved the check into a place that enforces less than the gate step did.
|
|
423
|
+
# `scripts/ci/ci-yml-unit-job.test.ts` pins the command; the guard itself is
|
|
424
|
+
# `scripts/test/test-unit-guard.ts`.
|
|
425
|
+
- name: Run unit tests
|
|
426
|
+
run: pnpm josh test:unit
|
|
427
|
+
|
|
428
|
+
# **The required status check. `Checks` is a name the branch ruleset already requires, and this job
|
|
429
|
+
# is what keeps that name meaning what it meant** (joshuafolkken/kit#1226) — every check the single
|
|
430
|
+
# `Checks` job used to run has passed. It runs no checks itself; it reads the two halves' results.
|
|
431
|
+
#
|
|
432
|
+
# `if: always()` is load-bearing and not a formality. Without it the job inherits the default "run
|
|
433
|
+
# only if every dependency succeeded", so a red `unit` would *skip* this job — and GitHub counts a
|
|
434
|
+
# skipped check as a passing one on the status rollup, which is precisely how a merge once went
|
|
435
|
+
# through with an E2E suite that never ran (see the `Detect E2E` job below, and
|
|
436
|
+
# https://github.com/joshuafolkken/kit/issues/991). A skipped aggregator would have reproduced that
|
|
437
|
+
# defect on the unit suite. Running always and failing explicitly is the only shape that cannot.
|
|
438
|
+
#
|
|
439
|
+
# The results are read from the environment rather than interpolated into the script. `needs.*.result`
|
|
440
|
+
# is a GitHub-controlled enum and not attacker-controlled, but a `${{ }}` expression spliced into a
|
|
441
|
+
# shell body is the pattern to keep out of a workflow regardless of the value's provenance.
|
|
442
|
+
checks:
|
|
443
|
+
name: Checks
|
|
444
|
+
needs: [reuse-pr-checks, static-checks, unit]
|
|
445
|
+
if: always()
|
|
446
|
+
runs-on: ubuntu-latest
|
|
447
|
+
timeout-minutes: 2
|
|
448
|
+
permissions: {}
|
|
449
|
+
steps:
|
|
450
|
+
- name: Require both halves of the verification gate
|
|
451
|
+
env:
|
|
452
|
+
REUSE_RESULT: ${{ needs.reuse-pr-checks.outputs.reuse }}
|
|
453
|
+
STATIC_RESULT: ${{ needs.static-checks.result }}
|
|
454
|
+
UNIT_RESULT: ${{ needs.unit.result }}
|
|
455
|
+
run: |
|
|
456
|
+
echo "Reuse PR Checks: ${REUSE_RESULT}"
|
|
457
|
+
echo "Static Checks: ${STATIC_RESULT}"
|
|
458
|
+
echo "Unit Tests: ${UNIT_RESULT}"
|
|
459
|
+
if [ "${STATIC_RESULT}" = 'success' ] && [ "${UNIT_RESULT}" = 'success' ]; then
|
|
460
|
+
exit 0
|
|
461
|
+
fi
|
|
462
|
+
if [ "${REUSE_RESULT}" = 'true' ] && [ "${STATIC_RESULT}" = 'skipped' ] && \
|
|
463
|
+
[ "${UNIT_RESULT}" = 'skipped' ]; then
|
|
464
|
+
exit 0
|
|
465
|
+
fi
|
|
466
|
+
echo "::error::the verification gate did not pass on both runners"
|
|
467
|
+
exit 1
|
|
468
|
+
|
|
469
|
+
# The artifact binds this successful Checks job to the pull request number. A later main push
|
|
470
|
+
# reads it from this exact Actions run before reusing the result; the name alone is sufficient
|
|
471
|
+
# because the run already proves the head SHA, branch, workflow and pull_request event.
|
|
472
|
+
- name: Write PR Checks evidence
|
|
473
|
+
if: github.event_name == 'pull_request'
|
|
474
|
+
env:
|
|
475
|
+
PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
|
|
476
|
+
run: printf '%s\n' "${PULL_REQUEST_NUMBER}" > pr-checks-evidence
|
|
477
|
+
|
|
478
|
+
- name: Upload PR Checks evidence
|
|
479
|
+
if: github.event_name == 'pull_request'
|
|
480
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
481
|
+
with:
|
|
482
|
+
name: pr-checks-${{ github.event.pull_request.number }}
|
|
483
|
+
path: pr-checks-evidence
|
|
484
|
+
retention-days: 1
|
|
485
|
+
|
|
486
|
+
security:
|
|
487
|
+
name: Security Audit
|
|
488
|
+
runs-on: ubuntu-latest
|
|
489
|
+
timeout-minutes: 3
|
|
490
|
+
permissions:
|
|
491
|
+
contents: read
|
|
492
|
+
steps:
|
|
493
|
+
- name: Checkout code
|
|
494
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
495
|
+
|
|
496
|
+
- name: Run security audit
|
|
497
|
+
uses: google/osv-scanner-action/osv-scanner-action@a345acffa64b0eaede81a3d9aae6141214d9c8fc # v2.6.0
|
|
498
|
+
with:
|
|
499
|
+
scan-args: --lockfile=pnpm-lock.yaml
|
|
500
|
+
|
|
501
|
+
e2e-detect:
|
|
502
|
+
name: Detect E2E
|
|
503
|
+
runs-on: ubuntu-latest
|
|
504
|
+
timeout-minutes: 2
|
|
505
|
+
permissions:
|
|
506
|
+
contents: read
|
|
507
|
+
outputs:
|
|
508
|
+
enabled: ${{ steps.check.outputs.enabled }}
|
|
509
|
+
steps:
|
|
510
|
+
- name: Checkout code
|
|
511
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
512
|
+
|
|
513
|
+
# The same rule `scripts/test/test-e2e-guard.ts` applies locally, so a suite that runs under
|
|
514
|
+
# `pnpm josh test:e2e` is a suite CI runs too. Every `*.e2e.{ts,js}` outside `node_modules`
|
|
515
|
+
# counts, at any depth; the guard's glob leaves dot-directories out by default, which is what
|
|
516
|
+
# the second prune term reproduces. The config filename is deliberately not consulted any
|
|
517
|
+
# more. Playwright accepts `playwright.config.js` as readily as `.ts`, and requiring one
|
|
518
|
+
# spelling made a project using the other read as "no E2E": the job's `if:` went false,
|
|
519
|
+
# GitHub recorded it as skipped, the status-check list counted the skip as a pass, and the
|
|
520
|
+
# merge went through with the suite never run. The same held for a spec kept anywhere but
|
|
521
|
+
# `tests` or `src/routes` (joshuafolkken/kit#991). The agreement is executed rather than
|
|
522
|
+
# asserted in prose: `scripts/ci/ci-yml-e2e-detect.test.ts` runs this very script against
|
|
523
|
+
# fixtures and compares its verdict to the guard's.
|
|
524
|
+
#
|
|
525
|
+
# One difference from the guard is deliberate and one-sided. The guard also skips when
|
|
526
|
+
# `@playwright/test` is not installed, which is what keeps that optional peer optional for
|
|
527
|
+
# the pre-push hook; here a spec enables the job whatever the manifest says, so a spec that
|
|
528
|
+
# cannot run ends red instead of silently green. Enabling more than the guard is safe —
|
|
529
|
+
# enabling less is the defect above, so no condition may be added that narrows this.
|
|
530
|
+
#
|
|
531
|
+
# Deliberately not `find ... | grep -q .`: `grep -q` exits on the first match and leaves
|
|
532
|
+
# `find` to be killed by the closed pipe, which is invisible under the default `bash -e` and
|
|
533
|
+
# decides the whole question under `bash -eo pipefail` — the shell GitHub selects for a step
|
|
534
|
+
# that declares `shell: bash`, or for every step once a `defaults: run: shell: bash` block is
|
|
535
|
+
# added at workflow or job level. The pipeline's status would then be 141, the `else` branch
|
|
536
|
+
# would be taken, and a repository full of specs would emit `enabled=false`: this defect
|
|
537
|
+
# again, reintroduced by a shell detail. Command substitution has no pipeline to
|
|
538
|
+
# fail, and `-print -quit` stops the walk at the first spec instead of enumerating the tree.
|
|
539
|
+
- name: Detect E2E specs
|
|
540
|
+
id: check
|
|
541
|
+
run: |
|
|
542
|
+
if [ -n "$(find . -mindepth 1 \( -name node_modules -o -name '.*' \) -prune \
|
|
543
|
+
-o \( -name '*.e2e.ts' -o -name '*.e2e.js' \) -print -quit)" ]; then
|
|
544
|
+
echo "enabled=true" >> "$GITHUB_OUTPUT"
|
|
545
|
+
else
|
|
546
|
+
echo "enabled=false" >> "$GITHUB_OUTPUT"
|
|
547
|
+
fi
|
|
548
|
+
|
|
549
|
+
e2e:
|
|
550
|
+
name: E2E
|
|
551
|
+
needs: [playwright-image, e2e-detect]
|
|
552
|
+
if: needs.e2e-detect.outputs.enabled == 'true'
|
|
553
|
+
runs-on: ubuntu-latest
|
|
554
|
+
permissions:
|
|
555
|
+
contents: read
|
|
556
|
+
packages: read
|
|
557
|
+
container: ${{ fromJSON(needs.playwright-image.outputs.container) }}
|
|
558
|
+
timeout-minutes: 10
|
|
559
|
+
# Better Auth rejects any origin its BETTER_AUTH_URL does not name, so this job pins the value
|
|
560
|
+
# to the preview server the suite talks to rather than letting a production value reach it.
|
|
561
|
+
# It has to be the port that server listens on. 4173 is correct because `PORT_SEED` — the
|
|
562
|
+
# personal offset `playwright.config.ts` resolves the preview port from — is not committed (it
|
|
563
|
+
# lives in a gitignored `.env`) and is not set anywhere in this workflow, so the port resolves
|
|
564
|
+
# to its base on every CI run. That is the invariant, not a constant in `playwright.config.ts`:
|
|
565
|
+
# the port there is seed-derived. The one setting that would move the port and leave this URL
|
|
566
|
+
# behind is an `env` entry for the seed in this file, at workflow or job level. A repository or
|
|
567
|
+
# organization variable would not: it reaches a step only through an explicit `vars.PORT_SEED`
|
|
568
|
+
# expression, and nothing here writes one. For a seeded CI job, derive this URL from
|
|
569
|
+
# `josh port preview` in the same job instead.
|
|
570
|
+
env:
|
|
571
|
+
BETTER_AUTH_URL: http://localhost:4173
|
|
572
|
+
steps:
|
|
573
|
+
- name: Checkout code
|
|
574
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
575
|
+
|
|
576
|
+
- name: Setup Node.js
|
|
577
|
+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
578
|
+
with:
|
|
579
|
+
node-version: '24'
|
|
580
|
+
registry-url: 'https://npm.pkg.github.com'
|
|
581
|
+
|
|
582
|
+
- name: Resolve pnpm version
|
|
583
|
+
id: pnpm-version
|
|
584
|
+
run: |
|
|
585
|
+
version=$(node -p "const m = require('./package.json'); m.packageManager?.match(/^pnpm@([^+]+)/)?.[1] ?? (m.devEngines?.packageManager?.name === 'pnpm' ? m.devEngines.packageManager.version?.split('+')[0] : 'latest') ?? 'latest'")
|
|
586
|
+
test -n "$version"
|
|
587
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
588
|
+
|
|
589
|
+
- name: Setup pnpm
|
|
590
|
+
uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
|
|
591
|
+
with:
|
|
592
|
+
version: ${{ steps.pnpm-version.outputs.version }}
|
|
593
|
+
install: false
|
|
594
|
+
|
|
595
|
+
- name: Resolve pnpm store path
|
|
596
|
+
run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> "$GITHUB_ENV"
|
|
597
|
+
|
|
598
|
+
- name: Setup pnpm store cache
|
|
599
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
600
|
+
with:
|
|
601
|
+
path: ${{ env.PNPM_STORE_PATH }}
|
|
602
|
+
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
|
|
603
|
+
restore-keys: |
|
|
604
|
+
${{ runner.os }}-pnpm-store-
|
|
605
|
+
|
|
606
|
+
- name: Setup build cache
|
|
607
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
608
|
+
id: build-cache
|
|
609
|
+
with:
|
|
610
|
+
path: |
|
|
611
|
+
.svelte-kit
|
|
612
|
+
key: ${{ runner.os }}-build-cache-e2e-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('svelte.config.js', 'vite.config.ts', 'tsconfig.json', 'src/lib/server/auth.ts') }}
|
|
613
|
+
restore-keys: |
|
|
614
|
+
${{ runner.os }}-build-cache-e2e-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
615
|
+
${{ runner.os }}-build-cache-e2e-
|
|
616
|
+
|
|
617
|
+
- name: Setup safe-chain
|
|
618
|
+
run: pnpm dlx @aikidosec/safe-chain@1.5.1 setup-ci
|
|
619
|
+
|
|
620
|
+
- name: Install dependencies
|
|
621
|
+
env:
|
|
622
|
+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
623
|
+
run: pnpm install --frozen-lockfile --ignore-scripts
|
|
624
|
+
|
|
625
|
+
# Only needed on the fallback path: the container image already ships browsers
|
|
626
|
+
# matching its own Playwright version. Invoked through the local bin rather than
|
|
627
|
+
# `pnpm exec` because Sonar's S6505 misreads `pnpm ... install` as a package
|
|
628
|
+
# install missing --ignore-scripts (this downloads browser binaries, not packages).
|
|
629
|
+
# Named rather than left to the default, which downloads every browser Playwright ships
|
|
630
|
+
# (~1 GB) where this config drives one of them. Left unquoted below so a multi-browser list
|
|
631
|
+
# splits into arguments; the resolve job already whitelisted it, so nothing but browser
|
|
632
|
+
# names can reach the command line.
|
|
633
|
+
- name: Install Playwright browsers
|
|
634
|
+
if: needs.playwright-image.outputs.should_install_browsers == 'true'
|
|
635
|
+
env:
|
|
636
|
+
PLAYWRIGHT_BROWSERS: ${{ needs.playwright-image.outputs.browsers }}
|
|
637
|
+
run: ./node_modules/.bin/playwright install --with-deps ${PLAYWRIGHT_BROWSERS}
|
|
638
|
+
|
|
639
|
+
- name: Build application
|
|
640
|
+
env:
|
|
641
|
+
E2E_CLEANUP_ENABLED: '1'
|
|
642
|
+
run: pnpm build
|
|
643
|
+
|
|
644
|
+
- name: Run E2E tests
|
|
645
|
+
run: pnpm test:e2e
|
|
646
|
+
|
|
647
|
+
# continue-on-error because the step exists to collect evidence, and collecting evidence must
|
|
648
|
+
# not be what decides the release: it runs on always(), so a transient artifact-service error
|
|
649
|
+
# would end the job red on a run whose tests passed, skipping the auto-tag dispatch below and
|
|
650
|
+
# withholding kit's own release (#809). The step's outcome stays `failure`, so it is still
|
|
651
|
+
# marked red on the run and a missing report is never silent. This job is skipped while kit
|
|
652
|
+
# ships no E2E specs; the guard is here so adding one cannot quietly turn the gap live.
|
|
653
|
+
- name: Upload test results
|
|
654
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
655
|
+
if: always()
|
|
656
|
+
continue-on-error: true
|
|
657
|
+
with:
|
|
658
|
+
name: playwright-report
|
|
659
|
+
path: playwright-report/
|
|
660
|
+
retention-days: 30
|
|
661
|
+
|
|
662
|
+
notify-auto-tag:
|
|
663
|
+
name: Notify Auto Tag
|
|
664
|
+
needs: [checks, security, e2e-detect, e2e]
|
|
665
|
+
if: |
|
|
666
|
+
always() &&
|
|
667
|
+
github.event_name == 'push' &&
|
|
668
|
+
github.ref == 'refs/heads/main' &&
|
|
669
|
+
needs.checks.result == 'success' &&
|
|
670
|
+
needs.security.result == 'success' &&
|
|
671
|
+
needs.e2e-detect.result == 'success' &&
|
|
672
|
+
(needs.e2e.result == 'success' || needs.e2e.result == 'skipped')
|
|
673
|
+
runs-on: ubuntu-latest
|
|
674
|
+
permissions:
|
|
675
|
+
contents: write
|
|
676
|
+
steps:
|
|
677
|
+
- name: Dispatch auto-tag
|
|
678
|
+
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
|
|
679
|
+
with:
|
|
680
|
+
event-type: ci-passed-on-main
|
|
681
|
+
client-payload: '{"sha": "${{ github.sha }}"}'
|