@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,639 @@
|
|
|
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 the default branch never
|
|
11
|
+
# cancels an earlier one. Without the sha every such push shares one group — `github.ref` is
|
|
12
|
+
# `refs/heads/main` for all of them — and the run that would have reported the commit that changed
|
|
13
|
+
# the version disappears with 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
|
+
# Declared once here because two jobs install them and the two lists must never disagree.
|
|
22
|
+
# chromium is the default because that is the single project kit scaffolds; a consumer whose
|
|
23
|
+
# config drives more sets the JOSH_PLAYWRIGHT_BROWSERS repository variable to a space-separated
|
|
24
|
+
# list (e.g. `chromium firefox webkit`) instead of editing this file, which josh sync overwrites.
|
|
25
|
+
env:
|
|
26
|
+
JOSH_PLAYWRIGHT_BROWSERS: ${{ vars.JOSH_PLAYWRIGHT_BROWSERS || 'chromium' }}
|
|
27
|
+
|
|
28
|
+
jobs:
|
|
29
|
+
playwright-image:
|
|
30
|
+
name: Resolve Playwright image
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
timeout-minutes: 2
|
|
33
|
+
permissions:
|
|
34
|
+
contents: read
|
|
35
|
+
outputs:
|
|
36
|
+
# JSON consumed via fromJSON() as the job-level `container` value: an object
|
|
37
|
+
# when the image exists, the literal `null` when it does not (= no container).
|
|
38
|
+
container: ${{ steps.resolve.outputs.container }}
|
|
39
|
+
# 'true' only when Playwright is a dependency but its image is unavailable, i.e.
|
|
40
|
+
# exactly when a job must download browsers itself.
|
|
41
|
+
should_install_browsers: ${{ steps.resolve.outputs.should_install_browsers }}
|
|
42
|
+
# The browser names the jobs below pass to `playwright install`, sanitized here so the
|
|
43
|
+
# two install steps share one list and one set of rules for what may reach a command line.
|
|
44
|
+
browsers: ${{ steps.resolve.outputs.browsers }}
|
|
45
|
+
steps:
|
|
46
|
+
- name: Checkout code
|
|
47
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
48
|
+
with:
|
|
49
|
+
persist-credentials: false
|
|
50
|
+
|
|
51
|
+
# The MCR image lags the npm publish by days, so a version-derived tag is not
|
|
52
|
+
# guaranteed to exist. Probe it first and fall back to a plain runner instead of
|
|
53
|
+
# emitting a tag that 404s and kills every dependent job before it starts.
|
|
54
|
+
- name: Resolve image
|
|
55
|
+
id: resolve
|
|
56
|
+
run: |
|
|
57
|
+
# Both dependency blocks, because `e2e-detect` below enables the E2E job from file
|
|
58
|
+
# presence alone: a project that declares @playwright/test under `dependencies` would
|
|
59
|
+
# otherwise be told it has no Playwright, get no container *and* no browser install,
|
|
60
|
+
# and run its suite on a bare runner. Whitelist the characters too: the value lands in
|
|
61
|
+
# $GITHUB_OUTPUT as JSON, so a newline or quote smuggled into the manifest could forge
|
|
62
|
+
# an extra output line.
|
|
63
|
+
version=$(node -p "const manifest = require('./package.json'); manifest.devDependencies?.['@playwright/test'] ?? manifest.dependencies?.['@playwright/test'] ?? ''" | tr -cd 'A-Za-z0-9.-')
|
|
64
|
+
|
|
65
|
+
# Sanitized once, here, for both jobs that install browsers: the value comes from
|
|
66
|
+
# repository settings and is interpolated into their command line, so only letters,
|
|
67
|
+
# dashes and the spaces between them survive. Uppercase is kept on purpose — a mistyped
|
|
68
|
+
# `Chromium` then reaches Playwright as an unknown browser and fails at the install
|
|
69
|
+
# step, where the mistake is, rather than being silently narrowed to chromium and
|
|
70
|
+
# resurfacing much later as a missing executable.
|
|
71
|
+
set -- $(printf '%s' "${JOSH_PLAYWRIGHT_BROWSERS}" | tr -cd 'A-Za-z -')
|
|
72
|
+
# Never empty: `playwright install` with no browser named fetches chromium *and*
|
|
73
|
+
# firefox *and* webkit plus ffmpeg, roughly 1 GB, which is the download this knob
|
|
74
|
+
# exists to avoid and which the 8-minute `checks` budget does not survive.
|
|
75
|
+
[ "$#" -gt 0 ] || set -- chromium
|
|
76
|
+
browsers="$*"
|
|
77
|
+
echo "browsers=${browsers}" >> "$GITHUB_OUTPUT"
|
|
78
|
+
|
|
79
|
+
if [ -z "${version}" ]; then
|
|
80
|
+
echo 'container=null' >> "$GITHUB_OUTPUT"
|
|
81
|
+
echo 'should_install_browsers=false' >> "$GITHUB_OUTPUT"
|
|
82
|
+
echo 'Playwright is not a dependency; every job runs on the plain runner.'
|
|
83
|
+
exit 0
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
tag="v${version}-noble"
|
|
87
|
+
image="mcr.microsoft.com/playwright:${tag}"
|
|
88
|
+
status=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 30 --retry 2 \
|
|
89
|
+
-H 'Accept: application/vnd.docker.distribution.manifest.list.v2+json' \
|
|
90
|
+
"https://mcr.microsoft.com/v2/playwright/manifests/${tag}" || true)
|
|
91
|
+
|
|
92
|
+
if [ "${status}" = '200' ]; then
|
|
93
|
+
printf 'container={"image":"%s","options":"--user root"}\n' "${image}" >> "$GITHUB_OUTPUT"
|
|
94
|
+
echo 'should_install_browsers=false' >> "$GITHUB_OUTPUT"
|
|
95
|
+
echo "Resolved Playwright container image ${image}."
|
|
96
|
+
else
|
|
97
|
+
echo 'container=null' >> "$GITHUB_OUTPUT"
|
|
98
|
+
echo 'should_install_browsers=true' >> "$GITHUB_OUTPUT"
|
|
99
|
+
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)."
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
checks:
|
|
103
|
+
name: Checks
|
|
104
|
+
needs: playwright-image
|
|
105
|
+
runs-on: ubuntu-latest
|
|
106
|
+
permissions:
|
|
107
|
+
contents: read
|
|
108
|
+
packages: read
|
|
109
|
+
container: ${{ fromJSON(needs.playwright-image.outputs.container) }}
|
|
110
|
+
timeout-minutes: 8
|
|
111
|
+
steps:
|
|
112
|
+
- name: Checkout code
|
|
113
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
114
|
+
with:
|
|
115
|
+
persist-credentials: false
|
|
116
|
+
|
|
117
|
+
- name: Setup Node.js
|
|
118
|
+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
119
|
+
with:
|
|
120
|
+
node-version: '24'
|
|
121
|
+
registry-url: 'https://npm.pkg.github.com'
|
|
122
|
+
|
|
123
|
+
- name: Resolve pnpm version
|
|
124
|
+
id: pnpm-version
|
|
125
|
+
run: |
|
|
126
|
+
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'")
|
|
127
|
+
test -n "$version"
|
|
128
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
129
|
+
|
|
130
|
+
- name: Setup pnpm
|
|
131
|
+
uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
|
|
132
|
+
with:
|
|
133
|
+
version: ${{ steps.pnpm-version.outputs.version }}
|
|
134
|
+
install: false
|
|
135
|
+
|
|
136
|
+
- name: Resolve pnpm store path
|
|
137
|
+
run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> "$GITHUB_ENV"
|
|
138
|
+
|
|
139
|
+
- name: Setup pnpm store cache
|
|
140
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
141
|
+
with:
|
|
142
|
+
path: ${{ env.PNPM_STORE_PATH }}
|
|
143
|
+
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
|
|
144
|
+
restore-keys: |
|
|
145
|
+
${{ runner.os }}-pnpm-store-
|
|
146
|
+
|
|
147
|
+
- name: Setup ESLint cache
|
|
148
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
149
|
+
id: eslint-cache
|
|
150
|
+
with:
|
|
151
|
+
path: |
|
|
152
|
+
.eslintcache
|
|
153
|
+
# joshuafolkken/kit#1347: the config inputs are `.js`, and the glob used to name `.ts` — which
|
|
154
|
+
# in `eslint/` is only the test files. So a rule edit left the key unchanged while a test edit
|
|
155
|
+
# busted it, the exact inverse of what invalidates a cache entry. The fingerprint in
|
|
156
|
+
# `eslint/config-fingerprint.js` now invalidates the entries themselves; this key has to move
|
|
157
|
+
# with it, or a rule edit would restore a cache whose every entry is stale, lint cold, and
|
|
158
|
+
# save nothing back under the key it already hit — a cold lint on every later run.
|
|
159
|
+
# joshuafolkken/kit#2054: the commit sha makes each run save its warmed cache under a fresh
|
|
160
|
+
# key, while the sha-less prefix restores the newest entry from an earlier run.
|
|
161
|
+
key: ${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-${{ github.sha }}
|
|
162
|
+
restore-keys: |
|
|
163
|
+
${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
|
|
164
|
+
${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
165
|
+
${{ runner.os }}-eslint-cache-
|
|
166
|
+
|
|
167
|
+
- name: Setup cspell cache
|
|
168
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
169
|
+
id: cspell-cache
|
|
170
|
+
with:
|
|
171
|
+
path: |
|
|
172
|
+
.cspellcache
|
|
173
|
+
key: ${{ runner.os }}-cspell-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
|
|
174
|
+
restore-keys: |
|
|
175
|
+
${{ runner.os }}-cspell-cache-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
176
|
+
${{ runner.os }}-cspell-cache-
|
|
177
|
+
|
|
178
|
+
- name: Setup safe-chain
|
|
179
|
+
run: pnpm dlx @aikidosec/safe-chain@1.5.1 setup-ci
|
|
180
|
+
|
|
181
|
+
- name: Install dependencies
|
|
182
|
+
env:
|
|
183
|
+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
184
|
+
run: pnpm install --frozen-lockfile --ignore-scripts
|
|
185
|
+
|
|
186
|
+
- name: Run spell check
|
|
187
|
+
run: pnpm josh cspell:dot
|
|
188
|
+
|
|
189
|
+
- name: Prepare
|
|
190
|
+
run: pnpm prepare
|
|
191
|
+
|
|
192
|
+
- name: Run type check
|
|
193
|
+
run: pnpm exec svelte-kit sync && pnpm exec svelte-check --tsconfig ./tsconfig.json --threshold error
|
|
194
|
+
|
|
195
|
+
- name: Run prettier check
|
|
196
|
+
run: pnpm exec prettier --check .
|
|
197
|
+
|
|
198
|
+
# Build before eslint so generated outputs exist for type-aware linting.
|
|
199
|
+
# The same build output is reused by the size check below.
|
|
200
|
+
- name: Build
|
|
201
|
+
run: pnpm build
|
|
202
|
+
|
|
203
|
+
- name: Run eslint check
|
|
204
|
+
run: pnpm exec eslint . --cache --cache-strategy content
|
|
205
|
+
|
|
206
|
+
# Vitest browser-mode projects (*.svelte.test.ts) drive a real Playwright browser,
|
|
207
|
+
# which the container image ships but a plain runner does not. Same guard as e2e.
|
|
208
|
+
# Named rather than left to the default, which downloads every browser Playwright ships
|
|
209
|
+
# (~1 GB) on the one path that has the least headroom to spare. Left unquoted below so a
|
|
210
|
+
# multi-browser list splits into arguments; the resolve job already whitelisted it, so
|
|
211
|
+
# nothing but browser names can reach the command line.
|
|
212
|
+
- name: Install Playwright browsers
|
|
213
|
+
if: needs.playwright-image.outputs.should_install_browsers == 'true'
|
|
214
|
+
env:
|
|
215
|
+
PLAYWRIGHT_BROWSERS: ${{ needs.playwright-image.outputs.browsers }}
|
|
216
|
+
run: ./node_modules/.bin/playwright install --with-deps ${PLAYWRIGHT_BROWSERS}
|
|
217
|
+
|
|
218
|
+
- name: Run unit tests
|
|
219
|
+
run: pnpm josh test:unit
|
|
220
|
+
|
|
221
|
+
- name: Check bundle size
|
|
222
|
+
run: pnpm size-limit
|
|
223
|
+
|
|
224
|
+
security:
|
|
225
|
+
name: Security Audit
|
|
226
|
+
runs-on: ubuntu-latest
|
|
227
|
+
timeout-minutes: 3
|
|
228
|
+
permissions:
|
|
229
|
+
contents: read
|
|
230
|
+
steps:
|
|
231
|
+
- name: Checkout code
|
|
232
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
233
|
+
with:
|
|
234
|
+
persist-credentials: false
|
|
235
|
+
|
|
236
|
+
- name: Run security audit
|
|
237
|
+
uses: google/osv-scanner-action/osv-scanner-action@9a498708959aeaef5ef730655706c5a1df1edbc2 # v2.3.8
|
|
238
|
+
with:
|
|
239
|
+
scan-args: --lockfile=pnpm-lock.yaml
|
|
240
|
+
|
|
241
|
+
e2e-detect:
|
|
242
|
+
name: Detect E2E
|
|
243
|
+
runs-on: ubuntu-latest
|
|
244
|
+
timeout-minutes: 2
|
|
245
|
+
permissions:
|
|
246
|
+
contents: read
|
|
247
|
+
outputs:
|
|
248
|
+
enabled: ${{ steps.check.outputs.enabled }}
|
|
249
|
+
steps:
|
|
250
|
+
- name: Checkout code
|
|
251
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
252
|
+
with:
|
|
253
|
+
persist-credentials: false
|
|
254
|
+
|
|
255
|
+
# The same rule `scripts/test/test-e2e-guard.ts` applies locally, so a suite that runs under
|
|
256
|
+
# `pnpm josh test:e2e` is a suite CI runs too. Every `*.e2e.{ts,js}` outside `node_modules`
|
|
257
|
+
# counts, at any depth; the guard's glob leaves dot-directories out by default, which is what
|
|
258
|
+
# the second prune term reproduces. The config filename is deliberately not consulted any
|
|
259
|
+
# more. Playwright accepts `playwright.config.js` as readily as `.ts`, and requiring one
|
|
260
|
+
# spelling made a project using the other read as "no E2E": the job's `if:` went false,
|
|
261
|
+
# GitHub recorded it as skipped, the status-check list counted the skip as a pass, and the
|
|
262
|
+
# merge went through with the suite never run. The same held for a spec kept anywhere but
|
|
263
|
+
# `tests` or `src/routes` (joshuafolkken/kit#991). The agreement is executed rather than
|
|
264
|
+
# asserted in prose: `scripts/ci/ci-yml-e2e-detect.test.ts` runs this very script against
|
|
265
|
+
# fixtures and compares its verdict to the guard's.
|
|
266
|
+
#
|
|
267
|
+
# One difference from the guard is deliberate and one-sided. The guard also skips when
|
|
268
|
+
# `@playwright/test` is not installed, which is what keeps that optional peer optional for
|
|
269
|
+
# the pre-push hook; here a spec enables the job whatever the manifest says, so a spec that
|
|
270
|
+
# cannot run ends red instead of silently green. Enabling more than the guard is safe —
|
|
271
|
+
# enabling less is the defect above, so no condition may be added that narrows this.
|
|
272
|
+
#
|
|
273
|
+
# Deliberately not `find ... | grep -q .`: `grep -q` exits on the first match and leaves
|
|
274
|
+
# `find` to be killed by the closed pipe, which is invisible under the default `bash -e` and
|
|
275
|
+
# decides the whole question under `bash -eo pipefail` — the shell GitHub selects for a step
|
|
276
|
+
# that declares `shell: bash`, or for every step once a `defaults: run: shell: bash` block is
|
|
277
|
+
# added at workflow or job level. The pipeline's status would then be 141, the `else` branch
|
|
278
|
+
# would be taken, and a repository full of specs would emit `enabled=false`: this defect
|
|
279
|
+
# again, reintroduced by a shell detail. Command substitution has no pipeline to
|
|
280
|
+
# fail, and `-print -quit` stops the walk at the first spec instead of enumerating the tree.
|
|
281
|
+
- name: Detect E2E specs
|
|
282
|
+
id: check
|
|
283
|
+
run: |
|
|
284
|
+
if [ -n "$(find . -mindepth 1 \( -name node_modules -o -name '.*' \) -prune \
|
|
285
|
+
-o \( -name '*.e2e.ts' -o -name '*.e2e.js' \) -print -quit)" ]; then
|
|
286
|
+
echo "enabled=true" >> "$GITHUB_OUTPUT"
|
|
287
|
+
else
|
|
288
|
+
echo "enabled=false" >> "$GITHUB_OUTPUT"
|
|
289
|
+
fi
|
|
290
|
+
|
|
291
|
+
e2e:
|
|
292
|
+
name: E2E
|
|
293
|
+
needs: [playwright-image, e2e-detect]
|
|
294
|
+
if: needs.e2e-detect.outputs.enabled == 'true'
|
|
295
|
+
runs-on: ubuntu-latest
|
|
296
|
+
permissions:
|
|
297
|
+
contents: read
|
|
298
|
+
packages: read
|
|
299
|
+
container: ${{ fromJSON(needs.playwright-image.outputs.container) }}
|
|
300
|
+
# Derived, not guessed: a retried run costs setup + two attempts + the upload of the first
|
|
301
|
+
# attempt's evidence. The retry repeats the whole `Run E2E tests` step — Playwright's CI
|
|
302
|
+
# webServer builds the app before serving it, so the second attempt pays for the build again,
|
|
303
|
+
# not just the specs — while checkout/install/prepare are shared. Any suite that fit the old
|
|
304
|
+
# 10-minute budget had setup + one attempt <= 10, which bounds a single attempt at 10; the
|
|
305
|
+
# extra attempt therefore adds at most 10, and the evidence upload (a failed run keeps videos
|
|
306
|
+
# and traces, so it is not instant) is allowed 5 on top. Running out mid-retry would end the
|
|
307
|
+
# job as `cancelled`, withholding the release exactly like the crash this retry absorbs and
|
|
308
|
+
# truncating the uploads that would explain it, so the headroom is the point. The cost is that
|
|
309
|
+
# a hung preview server holds a runner for 25 minutes rather than 10 before the job is killed.
|
|
310
|
+
timeout-minutes: 25
|
|
311
|
+
# Better Auth rejects any origin its BETTER_AUTH_URL does not name, so an unpinned job — one
|
|
312
|
+
# that reaches the app's production value through a repository variable or the app's own
|
|
313
|
+
# config — fails every spec. Pinning it to the preview server the suite talks to is the fix,
|
|
314
|
+
# and it has to be the port that server actually listens on. 4173 is correct here
|
|
315
|
+
# because `PORT_SEED` — the personal offset `playwright.config.ts` resolves the preview port
|
|
316
|
+
# from — is not committed (it lives in a gitignored `.env`) and is not set anywhere in this
|
|
317
|
+
# workflow, so the port resolves to its base, 4173, on every CI run. That is the invariant to
|
|
318
|
+
# preserve, not a constant in `playwright.config.ts`: the port there is seed-derived, so it is
|
|
319
|
+
# 4173 in CI and may be anything locally. The one setting that would move the port and leave
|
|
320
|
+
# this URL behind is an `env` entry for the seed in this file, at workflow or job level. A
|
|
321
|
+
# repository or organization variable would not: it reaches a step only through an explicit
|
|
322
|
+
# `vars.PORT_SEED` expression, and nothing here writes one. If a seeded CI job is ever wanted,
|
|
323
|
+
# derive this URL from `josh port preview` in the same job instead.
|
|
324
|
+
env:
|
|
325
|
+
BETTER_AUTH_URL: http://localhost:4173
|
|
326
|
+
# A crashing preview worker prints nothing but an empty `✘ [ERROR]` to the job log;
|
|
327
|
+
# the stack trace goes to wrangler's debug log file, which defaults to the global
|
|
328
|
+
# config dir (/github/home/.config/.wrangler/logs) and dies with the runner. Point it
|
|
329
|
+
# inside the workspace so the upload below can reach it. Kept relative on purpose:
|
|
330
|
+
# `${{ github.workspace }}` resolves to the host path in a container job, which is not
|
|
331
|
+
# where the workspace is mounted. The preview server inherits the workspace as its cwd
|
|
332
|
+
# and upload-artifact resolves a relative path against the same directory, so a
|
|
333
|
+
# relative path is the one spelling both sides agree on, container or plain runner.
|
|
334
|
+
WRANGLER_LOG_PATH: e2e-web-server-logs/
|
|
335
|
+
# No WRANGLER_LOG bump: that variable gates console output only — the debug file
|
|
336
|
+
# records every level unconditionally. Sanitization (wrangler's own default) is
|
|
337
|
+
# pinned here so a repository-level opt-out cannot leak tokens into the artifact.
|
|
338
|
+
WRANGLER_LOG_SANITIZE: 'true'
|
|
339
|
+
# Two rules, each declared once. E2E_RETRY_ENABLED says a run may survive its first failure
|
|
340
|
+
# long enough for the chain below to decide what to do about it; E2E_RETRY_UNCONDITIONAL says
|
|
341
|
+
# it may retry without having to justify itself. A push to the default branch is both: its
|
|
342
|
+
# failure withholds a release, and no signature is worth being wrong about there (#783). A
|
|
343
|
+
# pull request is only the first — it survives its first failure so the check below can read
|
|
344
|
+
# the preview server's log, and retries solely when that log says the server process died
|
|
345
|
+
# (#872). Keeping the two apart is what stops a failing suite from being retried until it
|
|
346
|
+
# passes, which is the masking the original default-branch-only gate was written to prevent.
|
|
347
|
+
E2E_RETRY_ENABLED:
|
|
348
|
+
${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name ==
|
|
349
|
+
'pull_request' }}
|
|
350
|
+
E2E_RETRY_UNCONDITIONAL: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
|
351
|
+
steps:
|
|
352
|
+
- name: Checkout code
|
|
353
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
354
|
+
with:
|
|
355
|
+
persist-credentials: false
|
|
356
|
+
|
|
357
|
+
- name: Setup Node.js
|
|
358
|
+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
359
|
+
with:
|
|
360
|
+
node-version: '24'
|
|
361
|
+
registry-url: 'https://npm.pkg.github.com'
|
|
362
|
+
|
|
363
|
+
- name: Resolve pnpm version
|
|
364
|
+
id: pnpm-version
|
|
365
|
+
run: |
|
|
366
|
+
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'")
|
|
367
|
+
test -n "$version"
|
|
368
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
369
|
+
|
|
370
|
+
- name: Setup pnpm
|
|
371
|
+
uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
|
|
372
|
+
with:
|
|
373
|
+
version: ${{ steps.pnpm-version.outputs.version }}
|
|
374
|
+
install: false
|
|
375
|
+
|
|
376
|
+
- name: Resolve pnpm store path
|
|
377
|
+
run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> "$GITHUB_ENV"
|
|
378
|
+
|
|
379
|
+
- name: Setup pnpm store cache
|
|
380
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
381
|
+
with:
|
|
382
|
+
path: ${{ env.PNPM_STORE_PATH }}
|
|
383
|
+
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
|
|
384
|
+
restore-keys: |
|
|
385
|
+
${{ runner.os }}-pnpm-store-
|
|
386
|
+
|
|
387
|
+
- name: Setup build cache
|
|
388
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
389
|
+
id: build-cache
|
|
390
|
+
with:
|
|
391
|
+
path: |
|
|
392
|
+
.svelte-kit
|
|
393
|
+
key: ${{ runner.os }}-build-cache-e2e-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('svelte.config.js', 'vite.config.ts', 'tsconfig.json', 'src/lib/server/auth.ts') }}
|
|
394
|
+
restore-keys: |
|
|
395
|
+
${{ runner.os }}-build-cache-e2e-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
396
|
+
${{ runner.os }}-build-cache-e2e-
|
|
397
|
+
|
|
398
|
+
- name: Setup safe-chain
|
|
399
|
+
run: pnpm dlx @aikidosec/safe-chain@1.5.1 setup-ci
|
|
400
|
+
|
|
401
|
+
- name: Install dependencies
|
|
402
|
+
env:
|
|
403
|
+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
404
|
+
run: pnpm install --frozen-lockfile --ignore-scripts
|
|
405
|
+
|
|
406
|
+
# --ignore-scripts suppresses the install-time `prepare`, so generated framework
|
|
407
|
+
# files never appear. Playwright >= 1.62 hard-throws when a tsconfig `extends`
|
|
408
|
+
# target is missing, and a SvelteKit tsconfig extends the generated
|
|
409
|
+
# .svelte-kit/tsconfig.json — without this step `playwright test` aborts before
|
|
410
|
+
# the first test (#689). The `checks` job already runs the same step.
|
|
411
|
+
- name: Prepare
|
|
412
|
+
run: pnpm prepare
|
|
413
|
+
|
|
414
|
+
# Only needed on the fallback path: the container image already ships browsers
|
|
415
|
+
# matching its own Playwright version. Invoked through the local bin rather than
|
|
416
|
+
# `pnpm exec` because Sonar's S6505 misreads `pnpm ... install` as a package
|
|
417
|
+
# install missing --ignore-scripts (this downloads browser binaries, not packages).
|
|
418
|
+
# Same named-browsers list as the checks job above, for the same reason.
|
|
419
|
+
- name: Install Playwright browsers
|
|
420
|
+
if: needs.playwright-image.outputs.should_install_browsers == 'true'
|
|
421
|
+
env:
|
|
422
|
+
PLAYWRIGHT_BROWSERS: ${{ needs.playwright-image.outputs.browsers }}
|
|
423
|
+
run: ./node_modules/.bin/playwright install --with-deps ${PLAYWRIGHT_BROWSERS}
|
|
424
|
+
|
|
425
|
+
# Only a run allowed to retry may continue past a failure: a push to the default branch gates
|
|
426
|
+
# the auto-tag dispatch below, so one transient crash there withholds the release until a
|
|
427
|
+
# human notices and re-runs the job by hand (#783). A pull request now continues past its
|
|
428
|
+
# first failure too — but only as far as the check below, which reports whether there was a
|
|
429
|
+
# reason. When there was none, `Report the unretried E2E failure` puts the job back to red,
|
|
430
|
+
# so surviving the failure never turns into shipping it.
|
|
431
|
+
#
|
|
432
|
+
# With this workflow's two triggers the flag is constantly true, so the expression currently
|
|
433
|
+
# decides nothing. It is written this way for the trigger that is not here yet — a schedule or
|
|
434
|
+
# a manual dispatch has no business surviving its first failure, and would have to remember to
|
|
435
|
+
# add the term back if it were hard-coded to `true` now.
|
|
436
|
+
- name: Run E2E tests
|
|
437
|
+
id: e2e_tests
|
|
438
|
+
continue-on-error: ${{ env.E2E_RETRY_ENABLED == 'true' }}
|
|
439
|
+
run: pnpm exec playwright test
|
|
440
|
+
|
|
441
|
+
# Did the preview server die? A fact, published once so every step below reads one output
|
|
442
|
+
# instead of re-deriving it. It is a kit command rather than shell in this file because this
|
|
443
|
+
# is the one part of the chain that can be wrong without anyone noticing: a signature that
|
|
444
|
+
# stops matching silently stops retrying. As a script it has unit tests
|
|
445
|
+
# (`scripts/test/e2e-retry-check.test.ts`) that fail the build when the rule drifts; as a `run:`
|
|
446
|
+
# block it would have none. The log it reads is wrangler's own debug output, already captured
|
|
447
|
+
# for the artifact below — not Playwright's reporter output, which is reshaped between
|
|
448
|
+
# releases and would need re-deriving each time.
|
|
449
|
+
#
|
|
450
|
+
# E2E_RETRY_UNCONDITIONAL is applied in the conditions below rather than passed down to this
|
|
451
|
+
# command, and that placement is load-bearing. continue-on-error means a step that errors
|
|
452
|
+
# publishes no output at all, so a default-branch push whose rule lived in here would lose the
|
|
453
|
+
# retry it must never lose — the withheld release of #783, reintroduced by the diagnostic
|
|
454
|
+
# meant to improve on it. Read as an OR up there, an unreadable log costs a pull request its
|
|
455
|
+
# retry (the status quo, safe) and costs the default branch nothing.
|
|
456
|
+
- name: Check whether the preview server crashed
|
|
457
|
+
id: e2e_retry_check
|
|
458
|
+
if: ${{ !cancelled() && env.E2E_RETRY_ENABLED == 'true' && steps.e2e_tests.outcome == 'failure' }}
|
|
459
|
+
continue-on-error: true
|
|
460
|
+
run: pnpm josh e2e:retry-check
|
|
461
|
+
|
|
462
|
+
# The retry overwrites both output directories, so the first attempt's evidence is moved
|
|
463
|
+
# aside before it starts and uploaded under its own -attempt-1 names. This is what keeps a
|
|
464
|
+
# green retry honest: the crash it papered over stays fully diagnosable, which is why this
|
|
465
|
+
# retry could only land after the web server log was being captured at all (#781).
|
|
466
|
+
# Every step from here to the retry carries the same condition, and each part of it is
|
|
467
|
+
# load-bearing. !cancelled() rather than the implicit success(): a bare outcome check is
|
|
468
|
+
# ANDed with success(), so a hiccup in one of these steps would skip the rest — including
|
|
469
|
+
# the retry, withholding the release over the diagnostics — while a superseded run being
|
|
470
|
+
# cancelled by the concurrency group above should not start a second suite.
|
|
471
|
+
# For a pull request, the retry chain starts only when the preview server crashed;
|
|
472
|
+
# otherwise its report and log stay from the single attempt. A default-branch push
|
|
473
|
+
# retries regardless of the crash check.
|
|
474
|
+
#
|
|
475
|
+
# This step never fails the job: it exists to save evidence, and a move that does not happen
|
|
476
|
+
# is announced instead, because the retry below will overwrite what was left behind.
|
|
477
|
+
# continue-on-error is what makes that hold rather than merely intend it. The rename is
|
|
478
|
+
# already kept from tripping `-e` by the `if !` around it, but the annotations are not: a
|
|
479
|
+
# write error exits non-zero and ends the step, on a runner that has just filled its disk
|
|
480
|
+
# with the failed attempt's videos, traces and report. Failing here would withhold the
|
|
481
|
+
# release even when the retry passes — the outcome #783 was opened to prevent (#789).
|
|
482
|
+
- name: Preserve first attempt output
|
|
483
|
+
if: >-
|
|
484
|
+
${{ !cancelled() && env.E2E_RETRY_ENABLED == 'true' && steps.e2e_tests.outcome ==
|
|
485
|
+
'failure' && (env.E2E_RETRY_UNCONDITIONAL == 'true' ||
|
|
486
|
+
steps.e2e_retry_check.outputs.crashed == 'true') }}
|
|
487
|
+
continue-on-error: true
|
|
488
|
+
run: |
|
|
489
|
+
# Announced, not just archived: a retry that passes leaves a green job, and without an
|
|
490
|
+
# annotation a test failing half the time would ship release after release with nothing
|
|
491
|
+
# on the run to read. Worded so it stays true whether or not the attempt got as far as
|
|
492
|
+
# writing a report — it points at the naming convention, never at a specific artifact.
|
|
493
|
+
echo "::warning::The first E2E attempt failed and is being retried; whatever output it produced is attached to this run under the -attempt-1 artifact names."
|
|
494
|
+
|
|
495
|
+
for dir in playwright-report "${WRANGLER_LOG_PATH%/}"; do
|
|
496
|
+
if [ -d "${dir}" ] && ! mv "${dir}" "${dir}-attempt-1"; then
|
|
497
|
+
echo "::warning::Could not set ${dir} aside; the retry will overwrite the first attempt's copy."
|
|
498
|
+
fi
|
|
499
|
+
done
|
|
500
|
+
|
|
501
|
+
# continue-on-error for the same reason the move above carries it: collecting evidence must
|
|
502
|
+
# not be what decides the release. Without it a transient artifact-service error here would
|
|
503
|
+
# end the job red even after the retry passed — withholding the tag exactly as the crash
|
|
504
|
+
# did. if-no-files-found: ignore covers the directory the move could not rename, and the
|
|
505
|
+
# consumer whose preview script is not wrangler and writes no log at all.
|
|
506
|
+
- name: Upload first attempt test results
|
|
507
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
508
|
+
if: >-
|
|
509
|
+
${{ !cancelled() && env.E2E_RETRY_ENABLED == 'true' && steps.e2e_tests.outcome ==
|
|
510
|
+
'failure' && (env.E2E_RETRY_UNCONDITIONAL == 'true' ||
|
|
511
|
+
steps.e2e_retry_check.outputs.crashed == 'true') }}
|
|
512
|
+
continue-on-error: true
|
|
513
|
+
with:
|
|
514
|
+
name: playwright-report-attempt-1
|
|
515
|
+
path: playwright-report-attempt-1/
|
|
516
|
+
if-no-files-found: ignore
|
|
517
|
+
retention-days: 30
|
|
518
|
+
|
|
519
|
+
- name: Upload first attempt web server log
|
|
520
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
521
|
+
if: >-
|
|
522
|
+
${{ !cancelled() && env.E2E_RETRY_ENABLED == 'true' && steps.e2e_tests.outcome ==
|
|
523
|
+
'failure' && (env.E2E_RETRY_UNCONDITIONAL == 'true' ||
|
|
524
|
+
steps.e2e_retry_check.outputs.crashed == 'true') }}
|
|
525
|
+
continue-on-error: true
|
|
526
|
+
with:
|
|
527
|
+
name: e2e-web-server-log-attempt-1
|
|
528
|
+
path: e2e-web-server-logs-attempt-1/
|
|
529
|
+
if-no-files-found: ignore
|
|
530
|
+
retention-days: 30
|
|
531
|
+
|
|
532
|
+
# One retry, and only after a failure — a green run never starts this step and pays nothing.
|
|
533
|
+
# On the default branch it is unconditional: a rule that can stop matching is not something
|
|
534
|
+
# to put between a merge and its release, so the price is paid there instead — a genuinely
|
|
535
|
+
# broken suite costs one extra E2E run before it reports red, and a real failure that happens
|
|
536
|
+
# to pass on the second attempt is reported green, with the -attempt-1 artifacts above the
|
|
537
|
+
# only thing that makes that case recoverable rather than invisible.
|
|
538
|
+
#
|
|
539
|
+
# A pull request pays neither price, because it retries only on the crash signature. Both
|
|
540
|
+
# ways of being wrong there are cheap, which is what makes the signature acceptable: a false
|
|
541
|
+
# positive spends one extra run and still reports red, since the second attempt fails too,
|
|
542
|
+
# and a false negative leaves the status quo of a human pressing re-run. The signature is
|
|
543
|
+
# read from wrangler's log rather than Playwright's reporter output for the same reason the
|
|
544
|
+
# default branch does not use it at all — reporter output is reshaped between releases,
|
|
545
|
+
# while `Error in ProxyController` is the server naming its own death.
|
|
546
|
+
#
|
|
547
|
+
# Known limit: nothing frees the preview port between attempts. A first attempt whose server
|
|
548
|
+
# died releases it, which is the case this retry targets; a server that survived as an
|
|
549
|
+
# orphan holding the port makes the retry stop at "port already used" instead. That is a
|
|
550
|
+
# loud, diagnosable failure, and killing by port would need tooling the container image does
|
|
551
|
+
# not guarantee and a guess at which process a consumer's preview script actually started.
|
|
552
|
+
- name: Retry E2E tests
|
|
553
|
+
id: e2e_retry
|
|
554
|
+
if: >-
|
|
555
|
+
${{ !cancelled() && env.E2E_RETRY_ENABLED == 'true' && steps.e2e_tests.outcome ==
|
|
556
|
+
'failure' && (env.E2E_RETRY_UNCONDITIONAL == 'true' ||
|
|
557
|
+
steps.e2e_retry_check.outputs.crashed == 'true') }}
|
|
558
|
+
run: pnpm exec playwright test
|
|
559
|
+
|
|
560
|
+
# The first attempt was allowed to fail only so the check above could read the log. When no
|
|
561
|
+
# retry followed, nothing in the job is red any more, and the suite's failure would ship as a
|
|
562
|
+
# green check — the one way this change could be worse than the default-branch-only gate it
|
|
563
|
+
# replaces. This step is what turns a survived failure back into a failure.
|
|
564
|
+
#
|
|
565
|
+
# It is keyed to the retry having been skipped rather than to the event name, so every way of
|
|
566
|
+
# arriving here is covered by one rule: a genuinely failing suite, a log with no signature, a
|
|
567
|
+
# consumer that writes no log at all, and a check step that errored all reach this point by
|
|
568
|
+
# the same path, and all four must be red. A default-branch push cannot reach it, because the
|
|
569
|
+
# flag alone satisfies the retry condition above — and the event is deliberately not named
|
|
570
|
+
# here even so. A gate that excused the default branch would, on any future path that skipped
|
|
571
|
+
# the retry there, let a swallowed failure ship green and take the release with it; staying
|
|
572
|
+
# unconditional costs nothing and cannot fail that way.
|
|
573
|
+
- name: Report the unretried E2E failure
|
|
574
|
+
if: >-
|
|
575
|
+
${{ !cancelled() && steps.e2e_tests.outcome == 'failure' && steps.e2e_retry.outcome ==
|
|
576
|
+
'skipped' }}
|
|
577
|
+
run: |
|
|
578
|
+
echo "::error::The E2E suite failed and no preview server crash was detected, so it was not retried."
|
|
579
|
+
exit 1
|
|
580
|
+
|
|
581
|
+
# continue-on-error for the same reason the -attempt-1 uploads above carry it, and this is
|
|
582
|
+
# the step where it matters most: it runs on always(), so it is the one evidence step still
|
|
583
|
+
# executing after a retry that passed. Without the guard a transient artifact-service error
|
|
584
|
+
# here would end the job red on a run whose tests are green — skipping the auto-tag dispatch
|
|
585
|
+
# below and withholding the release exactly as the crash the retry absorbed would have
|
|
586
|
+
# (#809). The failure is not swallowed: continue-on-error keeps the step's own outcome
|
|
587
|
+
# `failure`, so it stays marked red on the run and a missing report is never silent.
|
|
588
|
+
- name: Upload test results
|
|
589
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
590
|
+
if: always()
|
|
591
|
+
continue-on-error: true
|
|
592
|
+
with:
|
|
593
|
+
name: playwright-report
|
|
594
|
+
path: playwright-report/
|
|
595
|
+
retention-days: 30
|
|
596
|
+
|
|
597
|
+
# Separate from playwright-report: that artifact explains which tests failed, this one
|
|
598
|
+
# explains why the server they talk to went away. Consumers whose preview script is not
|
|
599
|
+
# wrangler write nothing here, so a missing directory is ignored rather than fatal.
|
|
600
|
+
# cancelled() is part of the condition because a preview server that hangs instead of
|
|
601
|
+
# crashing burns the job's timeout, and GitHub cancels a timed-out job rather than
|
|
602
|
+
# failing it — the one case where a `failure()`-only step would skip the log that
|
|
603
|
+
# explains the hang.
|
|
604
|
+
#
|
|
605
|
+
# continue-on-error completes the rule rather than fixing a live exposure: this step only
|
|
606
|
+
# runs once the job is already failing or cancelled, so its own failure withholds nothing
|
|
607
|
+
# that was not already withheld. It carries the guard so the rule holds for every artifact
|
|
608
|
+
# the job publishes instead of for the ones that need it today — a later condition change
|
|
609
|
+
# here would otherwise reintroduce #809 in a step nobody re-audits.
|
|
610
|
+
- name: Upload web server log
|
|
611
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
612
|
+
if: failure() || cancelled()
|
|
613
|
+
continue-on-error: true
|
|
614
|
+
with:
|
|
615
|
+
name: e2e-web-server-log
|
|
616
|
+
path: e2e-web-server-logs/
|
|
617
|
+
if-no-files-found: ignore
|
|
618
|
+
retention-days: 30
|
|
619
|
+
|
|
620
|
+
notify-auto-tag:
|
|
621
|
+
name: Notify Auto Tag
|
|
622
|
+
needs: [checks, security, e2e-detect, e2e]
|
|
623
|
+
if: |
|
|
624
|
+
always() &&
|
|
625
|
+
github.event_name == 'push' &&
|
|
626
|
+
github.ref == 'refs/heads/main' &&
|
|
627
|
+
needs.checks.result == 'success' &&
|
|
628
|
+
needs.security.result == 'success' &&
|
|
629
|
+
needs.e2e-detect.result == 'success' &&
|
|
630
|
+
(needs.e2e.result == 'success' || needs.e2e.result == 'skipped')
|
|
631
|
+
runs-on: ubuntu-latest
|
|
632
|
+
permissions:
|
|
633
|
+
contents: write
|
|
634
|
+
steps:
|
|
635
|
+
- name: Dispatch auto-tag
|
|
636
|
+
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
|
|
637
|
+
with:
|
|
638
|
+
event-type: ci-passed-on-main
|
|
639
|
+
client-payload: '{"sha": "${{ github.sha }}"}'
|