diffing 0.18.1 → 0.18.3
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/dist/{cli-agent-Cf6SAnH4.mjs → cli-agent-DV5ZhMX1.mjs} +209 -25
- package/dist/{cli-gh-2NEumKQB.mjs → cli-gh-0hY7pvwJ.mjs} +2 -2
- package/dist/cli.mjs +13 -12
- package/dist/client/assets/{angular-html-BV3gPi7L.js → angular-html-DgLkj6cM.js} +1 -1
- package/dist/client/assets/{angular-ts-DuuSfKJK.js → angular-ts-S7IdfqOh.js} +1 -1
- package/dist/client/assets/{apl-BMc69egk.js → apl-dC851k0e.js} +1 -1
- package/dist/client/assets/{arc-CEC1cz1S.js → arc-v8u_6qG_.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-BmJ5OHgd.js → architectureDiagram-3BPJPVTR-CtfNNxPZ.js} +1 -1
- package/dist/client/assets/{astro-Bg_CYwmB.js → astro-DgnNzfoZ.js} +1 -1
- package/dist/client/assets/{blade-Mca0XoRC.js → blade-By7nZeyV.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM--XrThRLW.js → blockDiagram-GPEHLZMM-cfmYosKW.js} +1 -1
- package/dist/client/assets/{c-B2Uqi6oI.js → c-C6I1CPq_.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-W8w5oiRi.js → c4Diagram-AAUBKEIU-L52oIoFq.js} +1 -1
- package/dist/client/assets/channel-B8Y5aSHX.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-Bpr3MqKf.js → chunk-2J33WTMH-Dpy-98nI.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-DdMV_3DM.js → chunk-3OPIFGDE-DsFmltuQ.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-BkfeLLsz.js → chunk-4BX2VUAB-B1PXeD30.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-pCwXbxR0.js → chunk-55IACEB6-BkfaPY5R.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-BGFzCgvs.js → chunk-5ZQYHXKU-kHj4q0HC.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DU7oVWfJ.js → chunk-727SXJPM-DYndNEF7.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-DaVYG1qm.js → chunk-AQP2D5EJ-CGgu3cJd.js} +1 -1
- package/dist/client/assets/{chunk-BSJP7CBP-DAvnzgjY.js → chunk-BSJP7CBP-B85q9YnN.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-D6ZDvMsi.js → chunk-CSCIHK7Q-D4izdgab.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BFDCYCqF.js → chunk-FMBD7UC4-CwH6kGrM.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-BmD6XY52.js → chunk-KSCS5N6A-D6WNG6Qv.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-Dl9iUIBf.js → chunk-L5ZTLDWV-BFzgANjL.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-rOOJDxdB.js → chunk-LZXEDZCA-CXVdeXQA.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-DBDu-JeD.js → chunk-ND2GUHAM-nez7hw5f.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-CRyk4F3R.js → chunk-NZK2D7GU-DQxrGm1r.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-DcKB07iP.js → chunk-O5CBEL6O-BAYDbzO8.js} +1 -1
- package/dist/client/assets/chunk-QZHKN3VN-DPZNzASS.js +1 -0
- package/dist/client/assets/chunk-WU5MYG2G-DOKX6dPU.js +1 -0
- package/dist/client/assets/{chunk-XPW4576I-WuzWMSrp.js → chunk-XPW4576I-DdtioiQK.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CkitIGos.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BD7zcbFa.js +1 -0
- package/dist/client/assets/{cobol-oQ1i-YtO.js → cobol-DVRUz845.js} +1 -1
- package/dist/client/assets/{coffee-s9XlmHbB.js → coffee-ywp-ztcj.js} +1 -1
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CymUm7fn.js → cose-bilkent-S5V4N54A-YAV-XlD-.js} +1 -1
- package/dist/client/assets/{cpp-D60LxTox.js → cpp-lGJg5yP8.js} +1 -1
- package/dist/client/assets/{crystal-CHrCczDb.js → crystal-C255DQNq.js} +1 -1
- package/dist/client/assets/{css-1PQO32Hw.js → css-D0fueLBG.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-DOHZc0tO.js → dagre-BM42HDAG-C-nRRJ_h.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-D8O2cleS.js → diagram-2AECGRRQ-Cy08G2GT.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-CO-Ej4UD.js → diagram-5GNKFQAL-B5KxlMfb.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DCUr4wzS.js → diagram-KO2AKTUF-BtlklsuV.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-D9HnA0Qg.js → diagram-LMA3HP47-DwJhvsVf.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-BxAitO2n.js → diagram-OG6HWLK6-e6mkflzE.js} +1 -1
- package/dist/client/assets/{dist-N-ROBnkL.js → dist-8nkFH_K6.js} +1 -1
- package/dist/client/assets/{edge-Ck54Fn7y.js → edge-Cy4Xn6qQ.js} +1 -1
- package/dist/client/assets/{edit-B8RwtrDs.js → edit-C3wvBNC7.js} +1 -1
- package/dist/client/assets/{elixir-xXxdfsfU.js → elixir-CHz66mgQ.js} +1 -1
- package/dist/client/assets/{elm-g0vLRWbF.js → elm-CuSKJX5P.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-1ZMg7g98.js → erDiagram-TEJ5UH35-U7lAAznz.js} +1 -1
- package/dist/client/assets/{erb-CGFnxOST.js → erb-BbtQ1hep.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-D5u9lhJ-.js → flowDiagram-I6XJVG4X-jIylSBs9.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BbVKEzs8.js → ganttDiagram-6RSMTGT7-DW3d8a36.js} +1 -1
- package/dist/client/assets/{git-rebase-B3s6bE5_.js → git-rebase-R-XkmJUY.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-sAottiiz.js → gitGraphDiagram-PVQCEYII-BHzkJu8s.js} +1 -1
- package/dist/client/assets/{glimmer-js-C2Xff18_.js → glimmer-js-C_yhese4.js} +1 -1
- package/dist/client/assets/{glimmer-ts-CRBS8ftd.js → glimmer-ts-DKD-Bn0M.js} +1 -1
- package/dist/client/assets/{glsl-aOY_t6dG.js → glsl-CJScdeHB.js} +1 -1
- package/dist/client/assets/{graphql-Cucpdpc6.js → graphql-BUP7lnbX.js} +1 -1
- package/dist/client/assets/{hack-Bw0KkVza.js → hack-Uu2tSM5_.js} +1 -1
- package/dist/client/assets/{haml-DnyaPoa2.js → haml-BKKDeeb3.js} +1 -1
- package/dist/client/assets/{handlebars-AedEof-m.js → handlebars-DXZJVvuj.js} +1 -1
- package/dist/client/assets/{html-Bu5h_Kgf.js → html-BNpfcyGi.js} +1 -1
- package/dist/client/assets/{html-derivative-CNiVLld1.js → html-derivative-D2Zj9RHU.js} +1 -1
- package/dist/client/assets/{http-B9-oOYPw.js → http-BDjsRgLN.js} +1 -1
- package/dist/client/assets/{hurl-Bo6NUnnd.js → hurl-D_YxHbnH.js} +1 -1
- package/dist/client/assets/{index-BkwV-g6J.js → index-CpN9wq1L.js} +142 -142
- package/dist/client/assets/{index-C73yr1tm.css → index-EoTRSuBL.css} +1 -1
- package/dist/client/assets/{infoDiagram-5YYISTIA-CfVELF4R.js → infoDiagram-5YYISTIA-oGpzG0Af.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DztjIGfb.js → ishikawaDiagram-YF4QCWOH-066RGSaQ.js} +1 -1
- package/dist/client/assets/{java-JJ3dl_jz.js → java-DeOKsdfJ.js} +1 -1
- package/dist/client/assets/{javascript-QgUuQNTw.js → javascript-oM5JhL2b.js} +1 -1
- package/dist/client/assets/{jinja-GbeEm2-u.js → jinja-CpW87uSV.js} +1 -1
- package/dist/client/assets/{jison-BXZbHsO3.js → jison-Du6rTe9r.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-Lg8CkxeI.js → journeyDiagram-JHISSGLW-BB4Aymt4.js} +1 -1
- package/dist/client/assets/{json-D02YvQSa.js → json-Cl5vEJGM.js} +1 -1
- package/dist/client/assets/{jsx-eZde6NZS.js → jsx-D3lCkT_f.js} +1 -1
- package/dist/client/assets/{julia-CfcuUD-A.js → julia-P1bWdzXQ.js} +1 -1
- package/dist/client/assets/{just-hQr8WcQp.js → just-BQHIj4wn.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-BWIeZIf6.js → kanban-definition-UN3LZRKU-CveGMVSw.js} +1 -1
- package/dist/client/assets/{latex-BxffZwv_.js → latex-CzeBoguz.js} +1 -1
- package/dist/client/assets/{line-Cy1AFxf0.js → line-CjLRf0wl.js} +1 -1
- package/dist/client/assets/{linear-Kk5IbGHr.js → linear-GmrB0HMZ.js} +1 -1
- package/dist/client/assets/{liquid-BvKnpUyR.js → liquid-BNh96Tca.js} +1 -1
- package/dist/client/assets/{lua-Bcds2vY9.js → lua-CNQoqqQP.js} +1 -1
- package/dist/client/assets/{marko-CZJQLjYc.js → marko-C_xevFIb.js} +1 -1
- package/dist/client/assets/{mdc-BRigtixg.js → mdc-XPBTv6ak.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-Dh2uTVxt.js → mermaid-parser.core-HsXe3oD9.js} +1 -1
- package/dist/client/assets/{mermaid.core-CXIGVQ74.js → mermaid.core-BukRjtV2.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-DQNQJuAB.js → mindmap-definition-RKZ34NQL-VTmEFYO4.js} +1 -1
- package/dist/client/assets/{nginx-BI3-LI9U.js → nginx-C6cZlyey.js} +1 -1
- package/dist/client/assets/{nim-PEd8ZOME.js → nim-Cd9xainG.js} +1 -1
- package/dist/client/assets/{perl-BPTGdP4p.js → perl-DUfKG3XX.js} +1 -1
- package/dist/client/assets/{php-C8BKL0yL.js → php-DqMFPxyM.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-Dz7gE0t5.js → pieDiagram-4H26LBE5-Bwlobw-Z.js} +1 -1
- package/dist/client/assets/{pug-H5z9rtbz.js → pug-GUix1iYH.js} +1 -1
- package/dist/client/assets/{qml-EzSpo2aM.js → qml-CqF34de7.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-pTnmYdEJ.js → quadrantDiagram-W4KKPZXB-CMujQAS2.js} +1 -1
- package/dist/client/assets/{r-VMeUwMIt.js → r-BxeiO8R8.js} +1 -1
- package/dist/client/assets/{razor-Ne05zcaj.js → razor-Cu8elnMU.js} +1 -1
- package/dist/client/assets/{regexp-i5_jUZAj.js → regexp-DxNPsA-x.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-GVw3NOxE.js → requirementDiagram-4Y6WPE33-CrrnxwFz.js} +1 -1
- package/dist/client/assets/{review-export-B4TOUDUE.js → review-export-Bd6rUYIi.js} +1 -1
- package/dist/client/assets/{rst-BZWuei_6.js → rst-2Xzw7kAb.js} +1 -1
- package/dist/client/assets/{ruby-CApICFTD.js → ruby-tZt1Nxb8.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CwWzwmqj.js → sankeyDiagram-5OEKKPKP-ihur8vgn.js} +1 -1
- package/dist/client/assets/{sas-BzEPX6GL.js → sas-DjpUVtXs.js} +1 -1
- package/dist/client/assets/{scss-B6Ld2NRm.js → scss-CZffX3V1.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Bz_Q76Kt.js → sequenceDiagram-3UESZ5HK-Bg7fvZIu.js} +1 -1
- package/dist/client/assets/{shellscript-KmoqGVVu.js → shellscript-B7bmiOyR.js} +1 -1
- package/dist/client/assets/{shellsession-CsSh_KTo.js → shellsession-CS7D1mSi.js} +1 -1
- package/dist/client/assets/{soy-CLgOu1If.js → soy-B9Nii6ks.js} +1 -1
- package/dist/client/assets/{sql-BdCh56kU.js → sql-CzQPwj1z.js} +1 -1
- package/dist/client/assets/{src-D7QQkGEc.js → src-DNsvZq9f.js} +1 -1
- package/dist/client/assets/{stata-C3fo8EYS.js → stata-BjQgQlmT.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-D0pZtzLu.js → stateDiagram-AJRCARHV-DsgTVCaj.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CwRm1eh7.js +1 -0
- package/dist/client/assets/{surrealql-qzihsJw_.js → surrealql-D6DnLnn1.js} +1 -1
- package/dist/client/assets/{svelte-B4tbn_KI.js → svelte-DRgP3jXp.js} +1 -1
- package/dist/client/assets/{templ-Ddev3BvY.js → templ-Cwgx1vj-.js} +1 -1
- package/dist/client/assets/{tex-DJLtgNQ6.js → tex-RzUmM9ei.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CWTWgYi0.js → timeline-definition-PNZ67QCA-rG2Mo1Zq.js} +1 -1
- package/dist/client/assets/{ts-tags-qqxigRtr.js → ts-tags-gdlLe8LD.js} +1 -1
- package/dist/client/assets/{tsx-Pkf9BaPv.js → tsx-C3y6O1l0.js} +1 -1
- package/dist/client/assets/{twig-BiScb10p.js → twig-DLMzUdS6.js} +1 -1
- package/dist/client/assets/{typescript-Bhy3UXig.js → typescript-T8PJwqaO.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-DwB89v9I.js → vennDiagram-CIIHVFJN-B-eDjTJG.js} +1 -1
- package/dist/client/assets/{vue-CANMWBRv.js → vue-BMIaruOV.js} +1 -1
- package/dist/client/assets/{vue-html-DtS6f62r.js → vue-html-D4e4SuHW.js} +1 -1
- package/dist/client/assets/{vue-vine-BpQ9kwSB.js → vue-vine-DU2nprLA.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DNwwPk4s.js → wardleyDiagram-YWT4CUSO-BkcHoefB.js} +1 -1
- package/dist/client/assets/{xml-CD5eIXsm.js → xml-DD7circ2.js} +1 -1
- package/dist/client/assets/{xsl-DGNZQAUu.js → xsl-Bu-TQ7Ag.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-L7M4YSvw.js → xychartDiagram-2RQKCTM6-BGa1-yRO.js} +1 -1
- package/dist/client/assets/{yaml-Cm8mwIB7.js → yaml-C12ZIXNt.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/completions-C0ERX2wC.mjs +2 -0
- package/dist/design-system-types-QR9xS7o3.mjs +2 -0
- package/dist/design-system-types-uiP9W2uj.mjs +75 -0
- package/dist/{doctor-BxTaLqAF.mjs → doctor-Dg61wsBc.mjs} +6 -6
- package/dist/{doctor-BdDB6p27.mjs → doctor-Y8l1LEDM.mjs} +1 -1
- package/dist/{github-CToLsvPu.mjs → github-BtABlwOZ.mjs} +3 -3
- package/dist/{github--rpPZ3vK.mjs → github-BuBcy-co.mjs} +1 -1
- package/dist/{github-attachments-DEvAeo5P.mjs → github-attachments-Bwr25ItV.mjs} +1 -1
- package/dist/{mcp-DoNBucix.mjs → mcp-45VPdWIr.mjs} +136 -17
- package/dist/{mockup-format-D4Ln0WxJ.mjs → mockup-lint-BRjhxXSw.mjs} +160 -7
- package/dist/native/tui-darwin-arm64/diffing-tui +0 -0
- package/dist/native/tui-darwin-x64/diffing-tui +0 -0
- package/dist/native/tui-linux-arm64-gnu/diffing-tui +0 -0
- package/dist/native/tui-linux-arm64-musl/diffing-tui +0 -0
- package/dist/native/tui-linux-x64-gnu/diffing-tui +0 -0
- package/dist/native/tui-linux-x64-musl/diffing-tui +0 -0
- package/dist/native/tui-win32-x64-msvc/diffing-tui.exe +0 -0
- package/dist/{review-export-DoST2oPt.mjs → review-export-BXCeRNjk.mjs} +1 -1
- package/dist/{server-BRQdb64n.mjs → server-CH-UPGFR.mjs} +1145 -127
- package/dist/{server-lock-CdaUNZyX.mjs → server-lock-ACw2cKDI.mjs} +22 -5
- package/dist/{session-conflict-BVgyyerQ.mjs → session-conflict-oUPEv3YT.mjs} +3 -3
- package/dist/{session-manager-CUqF8hkP.mjs → session-manager-C9KjVkzq.mjs} +2 -2
- package/dist/{session-url-B9FOnF3F.mjs → session-url-CyBpcLAH.mjs} +1 -1
- package/dist/{settings-DkPDB_hS.mjs → settings-DIa-3C8o.mjs} +1 -1
- package/dist/{setup-BwWZ9Fzq.mjs → setup-B6bOeWQl.mjs} +6 -6
- package/dist/{setup-first-run-i1o7DBki.mjs → setup-first-run-CAjtqBal.mjs} +2 -2
- package/dist/{setup-first-run-DyT0PlOZ.mjs → setup-first-run-DPXLAMqa.mjs} +1 -1
- package/extensions/pi/index.ts +128 -60
- package/extensions/pi/skill-heal.ts +73 -0
- package/extensions/pi/tsconfig.json +2 -1
- package/package.json +1 -1
- package/dist/client/assets/channel-C9URWRe4.js +0 -1
- package/dist/client/assets/chunk-QZHKN3VN-BBNO2-yv.js +0 -1
- package/dist/client/assets/chunk-WU5MYG2G-HP2Om5f9.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BW_ZPHe7.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DOd628kk.js +0 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-P0vTqsyH.js +0 -1
- package/dist/completions-CYa5usLb.mjs +0 -2
- /package/dist/{apply-suggestion-BsR_8FXW.mjs → apply-suggestion-tLsWREyb.mjs} +0 -0
- /package/dist/{comment-format-D4mCqr7T.mjs → comment-format-DS1wOWj_.mjs} +0 -0
- /package/dist/{completions-2aHVTmiJ.mjs → completions-ClqvbDYF.mjs} +0 -0
- /package/dist/{diff-fingerprint-BL5jNHnP.mjs → diff-fingerprint-PnC8Fs1-.mjs} +0 -0
- /package/dist/{find-tui-binary-DGspwyvd.mjs → find-tui-binary-DvADkBkP.mjs} +0 -0
- /package/dist/{handoff-DcShCxWJ.mjs → handoff-B85WLpcN.mjs} +0 -0
- /package/dist/{terminal-BroplOnw.mjs → terminal-Ce7OL1A-.mjs} +0 -0
- /package/dist/{tui-search-bridge-fFKqX4Fi.mjs → tui-search-bridge-N33QmB0q.mjs} +0 -0
- /package/dist/{update-check-ISaw61qS.mjs → update-check-D0yDl7sZ.mjs} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { i as buildGitDiffArgs, s as parseDiffOptions, t as startServer } from "./server-
|
|
2
|
-
import {
|
|
3
|
-
import { t as formatComments } from "./comment-format-
|
|
4
|
-
import { _ as generateSessionToken, c as removeServerLockIfOwned, i as isLockAlive, p as writeServerLock, r as diffScopeKey, s as removeServerLock, t as acquireServerStartupLease, u as resolveActiveServerLock, x as SESSION_TOKEN_HEADER, y as isLoopbackHost } from "./server-lock-
|
|
5
|
-
import { i as reviewSessionUrl, n as joinSessionApiUrl, r as reviewSessionBaseUrl, t as appendSessionToken } from "./session-url-
|
|
6
|
-
import { n as AWAIT_REVIEW_TIMEOUT_NEXT_ACTION, r as AWAIT_TOOL_DESCRIPTION_SUFFIX, s as PLAN_SUBMIT_NEXT_ACTION, t as AWAIT_PLAN_TIMEOUT_NEXT_ACTION } from "./handoff-
|
|
1
|
+
import { i as buildGitDiffArgs, s as parseDiffOptions, t as startServer } from "./server-CH-UPGFR.mjs";
|
|
2
|
+
import { a as formatPlanReview, r as formatMockupReview, t as formatSubmitHints } from "./mockup-lint-BRjhxXSw.mjs";
|
|
3
|
+
import { t as formatComments } from "./comment-format-DS1wOWj_.mjs";
|
|
4
|
+
import { _ as generateSessionToken, c as removeServerLockIfOwned, i as isLockAlive, p as writeServerLock, r as diffScopeKey, s as removeServerLock, t as acquireServerStartupLease, u as resolveActiveServerLock, x as SESSION_TOKEN_HEADER, y as isLoopbackHost } from "./server-lock-ACw2cKDI.mjs";
|
|
5
|
+
import { i as reviewSessionUrl, n as joinSessionApiUrl, r as reviewSessionBaseUrl, t as appendSessionToken } from "./session-url-CyBpcLAH.mjs";
|
|
6
|
+
import { n as AWAIT_REVIEW_TIMEOUT_NEXT_ACTION, r as AWAIT_TOOL_DESCRIPTION_SUFFIX, s as PLAN_SUBMIT_NEXT_ACTION, t as AWAIT_PLAN_TIMEOUT_NEXT_ACTION } from "./handoff-B85WLpcN.mjs";
|
|
7
7
|
import { execFileSync } from "node:child_process";
|
|
8
8
|
import { randomUUID } from "node:crypto";
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
@@ -1517,11 +1517,18 @@ function createMcpServer(options) {
|
|
|
1517
1517
|
screens: z.array(z.object({
|
|
1518
1518
|
id: z.string().optional(),
|
|
1519
1519
|
label: z.string().optional(),
|
|
1520
|
-
html: z.string()
|
|
1520
|
+
html: z.string(),
|
|
1521
|
+
stateOf: z.string().optional(),
|
|
1522
|
+
flow: z.string().optional()
|
|
1521
1523
|
})).optional(),
|
|
1522
1524
|
mockupId: z.string().optional(),
|
|
1523
1525
|
source: z.string().optional(),
|
|
1524
|
-
model: z.string().optional()
|
|
1526
|
+
model: z.string().optional(),
|
|
1527
|
+
mode: z.enum(["fragment", "document"]).optional(),
|
|
1528
|
+
designSystem: z.string().optional(),
|
|
1529
|
+
planId: z.string().optional(),
|
|
1530
|
+
fromMockupId: z.string().optional(),
|
|
1531
|
+
blank: z.boolean().optional()
|
|
1525
1532
|
},
|
|
1526
1533
|
outputSchema: {
|
|
1527
1534
|
mockupId: z.string(),
|
|
@@ -1533,7 +1540,7 @@ function createMcpServer(options) {
|
|
|
1533
1540
|
readOnlyHint: false,
|
|
1534
1541
|
idempotentHint: false
|
|
1535
1542
|
}
|
|
1536
|
-
}, async ({ title, html, screens, mockupId, source, model }) => {
|
|
1543
|
+
}, async ({ title, html, screens, mockupId, source, model, mode, designSystem, planId, fromMockupId, blank }) => {
|
|
1537
1544
|
const session = requireWebSession();
|
|
1538
1545
|
await seedMockupCursor(session, void 0, true);
|
|
1539
1546
|
const mockup = await requestSessionJson(session, "/api/mockups", {
|
|
@@ -1545,12 +1552,17 @@ function createMcpServer(options) {
|
|
|
1545
1552
|
html,
|
|
1546
1553
|
screens,
|
|
1547
1554
|
source,
|
|
1548
|
-
model
|
|
1555
|
+
model,
|
|
1556
|
+
mode,
|
|
1557
|
+
designSystemId: designSystem,
|
|
1558
|
+
planId,
|
|
1559
|
+
fromMockupId,
|
|
1560
|
+
blank
|
|
1549
1561
|
})
|
|
1550
1562
|
});
|
|
1551
1563
|
const url = appendSessionToken(`${session.apiOrigin}/mockup/${mockup.id}`, session.lock.authToken);
|
|
1552
1564
|
const hints = mockup.hints ?? [];
|
|
1553
|
-
const hintText = hints
|
|
1565
|
+
const hintText = formatSubmitHints(hints);
|
|
1554
1566
|
return textResult(`Submitted mockup ${mockup.id} (v${mockup.version}) at ${url}.${hintText} ${MOCKUP_SUBMIT_NEXT_ACTION}`, {
|
|
1555
1567
|
mockupId: mockup.id,
|
|
1556
1568
|
version: mockup.version,
|
|
@@ -1724,7 +1736,8 @@ function createMcpServer(options) {
|
|
|
1724
1736
|
"summary",
|
|
1725
1737
|
"comments",
|
|
1726
1738
|
"comment",
|
|
1727
|
-
"screen"
|
|
1739
|
+
"screen",
|
|
1740
|
+
"preview"
|
|
1728
1741
|
]).default("summary"),
|
|
1729
1742
|
status: z.enum(["open", "resolved"]).optional(),
|
|
1730
1743
|
screenId: z.string().optional(),
|
|
@@ -1761,18 +1774,20 @@ function createMcpServer(options) {
|
|
|
1761
1774
|
});
|
|
1762
1775
|
server.registerTool("revise_mockup", {
|
|
1763
1776
|
title: "Revise a mockup screen",
|
|
1764
|
-
description: "One-screen revision of an HTML mockup. op=upsert adds/replaces a screen (html inline, never files on disk), op=remove deletes a screen, op=patch replaces the first exact occurrence of expectedText with replacement. Every success bumps the mockup version; pass expectedVersion to guard against racing edits (409 version-mismatch on conflict, nothing applied). For revisions touching many screens, resubmit via submit_mockup with the same mockupId instead.",
|
|
1777
|
+
description: "One-screen revision of an HTML mockup. op=upsert adds/replaces a screen (html inline, never files on disk), op=remove deletes a screen, op=patch replaces the first exact occurrence of expectedText with replacement, op=replace-region replaces the inner HTML of the first [data-diffing=region] element. Every success bumps the mockup version; pass expectedVersion to guard against racing edits (409 version-mismatch on conflict, nothing applied). For revisions touching many screens, resubmit via submit_mockup with the same mockupId instead.",
|
|
1765
1778
|
inputSchema: {
|
|
1766
1779
|
mockupId: z.string().min(1),
|
|
1767
1780
|
op: z.enum([
|
|
1768
1781
|
"upsert",
|
|
1769
1782
|
"remove",
|
|
1770
|
-
"patch"
|
|
1783
|
+
"patch",
|
|
1784
|
+
"replace-region"
|
|
1771
1785
|
]),
|
|
1772
1786
|
screenId: z.string().min(1),
|
|
1773
1787
|
html: z.string().optional(),
|
|
1774
1788
|
label: z.string().optional(),
|
|
1775
1789
|
expectedText: z.string().optional(),
|
|
1790
|
+
region: z.string().optional(),
|
|
1776
1791
|
replacement: z.string().optional(),
|
|
1777
1792
|
expectedVersion: z.number().int().positive().optional()
|
|
1778
1793
|
},
|
|
@@ -1783,7 +1798,7 @@ function createMcpServer(options) {
|
|
|
1783
1798
|
occurrences: z.number().optional()
|
|
1784
1799
|
},
|
|
1785
1800
|
annotations: MUTATING
|
|
1786
|
-
}, async ({ mockupId, op, screenId, html, label, expectedText, replacement, expectedVersion }) => {
|
|
1801
|
+
}, async ({ mockupId, op, screenId, html, label, expectedText, region, replacement, expectedVersion }) => {
|
|
1787
1802
|
const headers = { "Content-Type": "application/json" };
|
|
1788
1803
|
const base = `/api/mockups/${encodeURIComponent(mockupId)}/screens/${encodeURIComponent(screenId)}`;
|
|
1789
1804
|
if (op === "upsert") {
|
|
@@ -1798,7 +1813,7 @@ function createMcpServer(options) {
|
|
|
1798
1813
|
})
|
|
1799
1814
|
});
|
|
1800
1815
|
const hints = mockup.hints ?? [];
|
|
1801
|
-
const hintText = hints
|
|
1816
|
+
const hintText = formatSubmitHints(hints);
|
|
1802
1817
|
return textResult(`Upserted screen ${screenId} on ${mockupId} → v${mockup.version}.${hintText}`, {
|
|
1803
1818
|
mockupId,
|
|
1804
1819
|
version: mockup.version,
|
|
@@ -1814,6 +1829,24 @@ function createMcpServer(options) {
|
|
|
1814
1829
|
screenIds: mockup.screens.map((s) => s.id)
|
|
1815
1830
|
});
|
|
1816
1831
|
}
|
|
1832
|
+
if (op === "replace-region") {
|
|
1833
|
+
if (!region || replacement === void 0) throw new Error("revise_mockup op=replace-region requires region and replacement");
|
|
1834
|
+
const data = await requestBaseJson(base, {
|
|
1835
|
+
method: "PATCH",
|
|
1836
|
+
headers,
|
|
1837
|
+
body: JSON.stringify({
|
|
1838
|
+
region,
|
|
1839
|
+
replacement,
|
|
1840
|
+
expectedVersion
|
|
1841
|
+
})
|
|
1842
|
+
});
|
|
1843
|
+
return textResult(`Replaced region "${region}" on ${screenId} (${data.occurrences} match(es)) → v${data.mockup.version}`, {
|
|
1844
|
+
mockupId,
|
|
1845
|
+
version: data.mockup.version,
|
|
1846
|
+
screenIds: data.mockup.screens.map((s) => s.id),
|
|
1847
|
+
occurrences: data.occurrences
|
|
1848
|
+
});
|
|
1849
|
+
}
|
|
1817
1850
|
if (expectedText === void 0 || replacement === void 0) throw new Error("revise_mockup op=patch requires expectedText and replacement");
|
|
1818
1851
|
const data = await requestBaseJson(base, {
|
|
1819
1852
|
method: "PATCH",
|
|
@@ -1882,6 +1915,92 @@ function createMcpServer(options) {
|
|
|
1882
1915
|
results: data.results
|
|
1883
1916
|
});
|
|
1884
1917
|
});
|
|
1918
|
+
server.registerTool("get_design_system", {
|
|
1919
|
+
title: "Get the repo design system",
|
|
1920
|
+
description: "Read the published (or draft) per-repo design system: tokens, guidelines, components. Call this before authoring mockup HTML. Omit id for the default system.",
|
|
1921
|
+
inputSchema: { id: z.string().optional() },
|
|
1922
|
+
outputSchema: { system: z.unknown().nullable() },
|
|
1923
|
+
annotations: READ_ONLY
|
|
1924
|
+
}, async ({ id }) => {
|
|
1925
|
+
const path = id ? `/api/design-systems/${encodeURIComponent(id)}` : "/api/design-systems/default";
|
|
1926
|
+
try {
|
|
1927
|
+
return textResult("design system", { system: await requestBaseJson(path) });
|
|
1928
|
+
} catch {
|
|
1929
|
+
return textResult("No design system published yet.", { system: null });
|
|
1930
|
+
}
|
|
1931
|
+
});
|
|
1932
|
+
server.registerTool("extract_design_system", {
|
|
1933
|
+
title: "Extract a draft design system from the repo",
|
|
1934
|
+
description: "Scan the consumer repo for CSS custom properties / token JSON and write a draft design system. Does not publish. Human must publish before fragment mockups inherit it.",
|
|
1935
|
+
inputSchema: {
|
|
1936
|
+
id: z.string().optional(),
|
|
1937
|
+
title: z.string().optional()
|
|
1938
|
+
},
|
|
1939
|
+
outputSchema: {
|
|
1940
|
+
system: z.unknown(),
|
|
1941
|
+
extract: z.unknown()
|
|
1942
|
+
},
|
|
1943
|
+
annotations: MUTATING
|
|
1944
|
+
}, async ({ id, title }) => {
|
|
1945
|
+
const systemId = id || "default";
|
|
1946
|
+
const data = await requestBaseJson(`/api/design-systems/${encodeURIComponent(systemId)}/extract`, {
|
|
1947
|
+
method: "POST",
|
|
1948
|
+
headers: { "Content-Type": "application/json" },
|
|
1949
|
+
body: JSON.stringify({
|
|
1950
|
+
from: "css",
|
|
1951
|
+
title
|
|
1952
|
+
})
|
|
1953
|
+
});
|
|
1954
|
+
return textResult(`Draft design system ${systemId}. Human must publish before it wraps mockups.`, data);
|
|
1955
|
+
});
|
|
1956
|
+
server.registerTool("propose_design_system", {
|
|
1957
|
+
title: "Propose a design-system draft",
|
|
1958
|
+
description: "Update the draft design system (tokens, guidelines, components). Does not publish. Agents may propose; only the human publishes.",
|
|
1959
|
+
inputSchema: {
|
|
1960
|
+
id: z.string().optional(),
|
|
1961
|
+
title: z.string().optional(),
|
|
1962
|
+
guidelines: z.string().optional(),
|
|
1963
|
+
tokens: z.unknown().optional()
|
|
1964
|
+
},
|
|
1965
|
+
outputSchema: { system: z.unknown() },
|
|
1966
|
+
annotations: MUTATING
|
|
1967
|
+
}, async ({ id, title, guidelines, tokens }) => {
|
|
1968
|
+
const systemId = id || "default";
|
|
1969
|
+
const system = await requestBaseJson(`/api/design-systems/${encodeURIComponent(systemId)}`, {
|
|
1970
|
+
method: "PUT",
|
|
1971
|
+
headers: { "Content-Type": "application/json" },
|
|
1972
|
+
body: JSON.stringify({
|
|
1973
|
+
title,
|
|
1974
|
+
guidelines,
|
|
1975
|
+
tokens
|
|
1976
|
+
})
|
|
1977
|
+
});
|
|
1978
|
+
return textResult(`Proposed draft on ${systemId}`, { system });
|
|
1979
|
+
});
|
|
1980
|
+
server.registerTool("publish_design_system", {
|
|
1981
|
+
title: "Publish the design system",
|
|
1982
|
+
description: "Publish the current draft as a new revision. Prefer letting the human do this in the UI. Use only when the user explicitly asked to publish.",
|
|
1983
|
+
inputSchema: { id: z.string().optional() },
|
|
1984
|
+
outputSchema: { system: z.unknown() },
|
|
1985
|
+
annotations: MUTATING
|
|
1986
|
+
}, async ({ id }) => {
|
|
1987
|
+
const systemId = id || "default";
|
|
1988
|
+
const system = await requestBaseJson(`/api/design-systems/${encodeURIComponent(systemId)}/publish`, { method: "POST" });
|
|
1989
|
+
return textResult(`Published ${systemId}`, { system });
|
|
1990
|
+
});
|
|
1991
|
+
server.registerTool("get_mockup_handoff", {
|
|
1992
|
+
title: "Get mockup implementation handoff",
|
|
1993
|
+
description: "Compact handoff after a mockup is approved: tokens, screens with intent, components used, leftover nits. Prefer this over dumping every screen's HTML.",
|
|
1994
|
+
inputSchema: { mockupId: z.string().min(1) },
|
|
1995
|
+
outputSchema: {
|
|
1996
|
+
xml: z.string().optional(),
|
|
1997
|
+
mockupId: z.string().optional()
|
|
1998
|
+
},
|
|
1999
|
+
annotations: READ_ONLY
|
|
2000
|
+
}, async ({ mockupId }) => {
|
|
2001
|
+
const data = await requestBaseJson(`/api/mockups/${encodeURIComponent(mockupId)}/handoff`);
|
|
2002
|
+
return textResult(typeof data.xml === "string" ? data.xml : "handoff", data);
|
|
2003
|
+
});
|
|
1885
2004
|
server.registerResource("agent-guide", "diffing://agent-guide", {
|
|
1886
2005
|
title: "diffing agent guide",
|
|
1887
2006
|
description: "Portable quick reference for the native code-review and plan-review workflows.",
|
|
@@ -1916,7 +2035,7 @@ This MCP connection is immutably bound to \`${repoRoot}\`.
|
|
|
1916
2035
|
1. Call \`submit_mockup\`, share the URL, and park unless asked to wait; resubmit with the same \`mockupId\` to bump the version.
|
|
1917
2036
|
2. On resume or sync wait, call \`await_mockup_review\` (or \`list_mockups\` / \`get_mockup\`).
|
|
1918
2037
|
3. For bounded reads prefer \`inspect_mockup\` (view=summary/comments/comment/screen, filters by status/screenId/viewport/version).
|
|
1919
|
-
4. To revise one screen use \`revise_mockup\` (upsert/remove/patch with \`expectedVersion\` guard); thread ops go through atomic \`update_mockup_threads\`.
|
|
2038
|
+
4. To revise one screen use \`revise_mockup\` (upsert/remove/patch/replace-region with \`expectedVersion\` guard); thread ops go through atomic \`update_mockup_threads\`.
|
|
1920
2039
|
5. On \`approved\`, implement; on \`changes-requested\`, revise and resubmit; on \`rejected\`, stop.
|
|
1921
2040
|
|
|
1922
2041
|
## GitHub PR
|
|
@@ -35,9 +35,9 @@ function normalizeSubmitScreens(input) {
|
|
|
35
35
|
ok: false,
|
|
36
36
|
error: "A mockup html body or screens[] is required"
|
|
37
37
|
};
|
|
38
|
-
if (raw.length >
|
|
38
|
+
if (raw.length > 24) return {
|
|
39
39
|
ok: false,
|
|
40
|
-
error: `At most
|
|
40
|
+
error: `At most 24 screens are allowed`
|
|
41
41
|
};
|
|
42
42
|
const seen = /* @__PURE__ */ new Set();
|
|
43
43
|
const screens = [];
|
|
@@ -60,12 +60,14 @@ function normalizeSubmitScreens(input) {
|
|
|
60
60
|
error: `Duplicate screen id "${id}"`
|
|
61
61
|
};
|
|
62
62
|
seen.add(id);
|
|
63
|
-
const
|
|
64
|
-
screens.push({
|
|
63
|
+
const screen = {
|
|
65
64
|
id,
|
|
66
|
-
label,
|
|
65
|
+
label: typeof item.label === "string" && item.label.trim() ? item.label.trim() : defaultScreenLabel(id),
|
|
67
66
|
html: item.html.replace(/\r\n/g, "\n")
|
|
68
|
-
}
|
|
67
|
+
};
|
|
68
|
+
if (item.stateOf) screen.stateOf = item.stateOf;
|
|
69
|
+
if (item.flow) screen.flow = item.flow;
|
|
70
|
+
screens.push(screen);
|
|
69
71
|
}
|
|
70
72
|
return {
|
|
71
73
|
ok: true,
|
|
@@ -324,4 +326,155 @@ function formatComment(comment, fallbackVersion, includeContext) {
|
|
|
324
326
|
return parts.join("\n");
|
|
325
327
|
}
|
|
326
328
|
//#endregion
|
|
327
|
-
|
|
329
|
+
//#region src/lib/mockup-lint.ts
|
|
330
|
+
const RULES = [
|
|
331
|
+
{
|
|
332
|
+
label: "tabs",
|
|
333
|
+
re: /role\s*=\s*["']tab(list|panel)?["']/i
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
label: "tabs",
|
|
337
|
+
re: /aria-selected\s*=/i
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
label: "tabs",
|
|
341
|
+
re: /data-(?:bs-)?toggle\s*=\s*["'](?:tab|pill)["']/i
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
label: "tabs",
|
|
345
|
+
re: /\bdata-tabs?\s*=/i
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
label: "accordion",
|
|
349
|
+
re: /<details[\s>]/i
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
label: "accordion",
|
|
353
|
+
re: /data-(?:bs-)?toggle\s*=\s*["']collapse["']/i
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
label: "accordion",
|
|
357
|
+
re: /class\s*=\s*["'][^"']*\baccordion\b/i
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
label: "modal",
|
|
361
|
+
re: /role\s*=\s*["'](?:alert)?dialog["']/i
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
label: "modal",
|
|
365
|
+
re: /data-(?:bs-)?toggle\s*=\s*["']modal["']/i
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
label: "modal",
|
|
369
|
+
re: /class\s*=\s*["'][^"']*\bmodal\b/i
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
label: "dropdown",
|
|
373
|
+
re: /role\s*=\s*["']menu(?:bar)?["']/i
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
label: "dropdown",
|
|
377
|
+
re: /data-(?:bs-)?toggle\s*=\s*["']dropdown["']/i
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
label: "dropdown",
|
|
381
|
+
re: /class\s*=\s*["'][^"']*\bdropdown\b/i
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
label: "toggle",
|
|
385
|
+
re: /role\s*=\s*["']switch["']/i
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
label: "toggle",
|
|
389
|
+
re: /class\s*=\s*["'][^"']*\b(?:toggle|switch)\b/i
|
|
390
|
+
}
|
|
391
|
+
];
|
|
392
|
+
const ORDERED_LABELS = [
|
|
393
|
+
"tabs",
|
|
394
|
+
"accordion",
|
|
395
|
+
"modal",
|
|
396
|
+
"dropdown",
|
|
397
|
+
"toggle"
|
|
398
|
+
];
|
|
399
|
+
/** Find the in-page state UI patterns present in one screen's HTML. */
|
|
400
|
+
function detectInPageState(html) {
|
|
401
|
+
const found = /* @__PURE__ */ new Set();
|
|
402
|
+
for (const rule of RULES) {
|
|
403
|
+
if (found.has(rule.label)) continue;
|
|
404
|
+
if (rule.re.test(html)) found.add(rule.label);
|
|
405
|
+
}
|
|
406
|
+
return ORDERED_LABELS.filter((label) => found.has(label));
|
|
407
|
+
}
|
|
408
|
+
const STYLE_RULES = [
|
|
409
|
+
{
|
|
410
|
+
label: "tailwind-cdn",
|
|
411
|
+
re: /cdn\.tailwindcss\.com/i
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
label: "tailwind-cdn",
|
|
415
|
+
re: /(?:unpkg\.com|cdn\.jsdelivr\.net|esm\.sh)\/(?:npm\/)?tailwindcss/i
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
label: "google-fonts",
|
|
419
|
+
re: /fonts\.googleapis\.com/i
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
label: "google-fonts",
|
|
423
|
+
re: /fonts\.gstatic\.com/i
|
|
424
|
+
}
|
|
425
|
+
];
|
|
426
|
+
const GENERIC_FONT_RE = /font-family\s*:\s*[^;{]*\bInter\b/i;
|
|
427
|
+
const GENERIC_INDIGO_RE = /#(?:4f46e5|4338ca|6366f1|818cf8|7c3aed|8b5cf6|a78bfa)\b|\b(?:indigo|violet)-(?:[4-9]00|950)\b/i;
|
|
428
|
+
/** Off-brand / generic-AI styling that should not ship as the product look. */
|
|
429
|
+
function detectGenericStyle(html) {
|
|
430
|
+
const found = /* @__PURE__ */ new Set();
|
|
431
|
+
for (const rule of STYLE_RULES) {
|
|
432
|
+
if (found.has(rule.label)) continue;
|
|
433
|
+
if (rule.re.test(html)) found.add(rule.label);
|
|
434
|
+
}
|
|
435
|
+
if (GENERIC_FONT_RE.test(html) && GENERIC_INDIGO_RE.test(html)) found.add("generic-palette");
|
|
436
|
+
return [
|
|
437
|
+
"tailwind-cdn",
|
|
438
|
+
"google-fonts",
|
|
439
|
+
"generic-palette"
|
|
440
|
+
].filter((label) => found.has(label));
|
|
441
|
+
}
|
|
442
|
+
/** Build submit-time hints for a set of screens (empty when all clean). */
|
|
443
|
+
function lintMockupScreens(screens) {
|
|
444
|
+
const hints = [];
|
|
445
|
+
for (const screen of screens) {
|
|
446
|
+
const state = detectInPageState(screen.html);
|
|
447
|
+
if (state.length > 0) hints.push({
|
|
448
|
+
screenId: screen.id,
|
|
449
|
+
kind: "state",
|
|
450
|
+
patterns: state,
|
|
451
|
+
message: `Screen "${screen.id}" contains in-page state UI (${state.join(", ")}). Split each state into its own screen instead.`
|
|
452
|
+
});
|
|
453
|
+
const style = detectGenericStyle(screen.html);
|
|
454
|
+
if (style.length > 0) hints.push({
|
|
455
|
+
screenId: screen.id,
|
|
456
|
+
kind: "style",
|
|
457
|
+
patterns: style,
|
|
458
|
+
message: `Screen "${screen.id}" looks generic (${style.join(", ")}). Drop CDN Tailwind / Google Fonts and do not invent Inter + indigo — match the product.`
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
return hints;
|
|
462
|
+
}
|
|
463
|
+
/** Compact submit/revise warning for CLI and MCP. */
|
|
464
|
+
function formatSubmitHints(hints) {
|
|
465
|
+
if (hints.length === 0) return "";
|
|
466
|
+
const state = hints.filter((h) => h.kind !== "style");
|
|
467
|
+
const style = hints.filter((h) => h.kind === "style");
|
|
468
|
+
const lines = [];
|
|
469
|
+
if (state.length > 0) {
|
|
470
|
+
lines.push("⚠️ In-page state UI detected — split each state into its own screen:");
|
|
471
|
+
for (const hint of state) lines.push(` • ${hint.screenId}: ${hint.patterns.join(", ")}`);
|
|
472
|
+
}
|
|
473
|
+
if (style.length > 0) {
|
|
474
|
+
lines.push("⚠️ Generic styling — match the product (no CDN Tailwind, Google Fonts, or Inter+indigo):");
|
|
475
|
+
for (const hint of style) lines.push(` • ${hint.screenId}: ${hint.patterns.join(", ")}`);
|
|
476
|
+
}
|
|
477
|
+
return `\n${lines.join("\n")}`;
|
|
478
|
+
}
|
|
479
|
+
//#endregion
|
|
480
|
+
export { formatPlanReview as a, MOCKUP_SCREEN_ID_RE as c, isMockupViewport as d, normalizeMockupViewport as f, extractPlanLines as i, commentViewport as l, slugifyScreenId as m, lintMockupScreens as n, sectionTitleForLine as o, normalizeSubmitScreens as p, formatMockupReview as r, MOCKUP_MAX_SCREEN_BYTES as s, formatSubmitHints as t, defaultScreenLabel as u };
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as reviewDecisionSummary } from "./comment-format-
|
|
1
|
+
import { n as reviewDecisionSummary } from "./comment-format-DS1wOWj_.mjs";
|
|
2
2
|
//#region src/lib/review-export.ts
|
|
3
3
|
/**
|
|
4
4
|
* Export a review as human-readable Markdown (clipboard / download / CLI).
|