owndesign 0.1.12 → 0.2.1

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.
Files changed (151) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/server/index.js +103 -63
  3. package/dist/server/prompts/agents/component-audit.md +1 -1
  4. package/dist/server/prompts/agents/design-page.md +77 -57
  5. package/dist/web/assets/{angular-html-CFs7eovz.js → angular-html-BC-ehZ2Z.js} +1 -1
  6. package/dist/web/assets/{angular-ts-CEaZRH8K.js → angular-ts-CbNdIQVH.js} +1 -1
  7. package/dist/web/assets/{apl-BtwP9-yi.js → apl-CKXIPXmN.js} +1 -1
  8. package/dist/web/assets/{arc-BKgXct_K.js → arc-DCbsmfyT.js} +1 -1
  9. package/dist/web/assets/architecture-7EHR7CIX-Dy_x80xD.js +1 -0
  10. package/dist/web/assets/{architectureDiagram-3BPJPVTR-tBs4y1LK.js → architectureDiagram-3BPJPVTR-C3CSEDbb.js} +1 -1
  11. package/dist/web/assets/{astro-DGOoXofX.js → astro-0YgDtFyB.js} +1 -1
  12. package/dist/web/assets/{blade-CvIhqJHQ.js → blade-DCBz6o9i.js} +1 -1
  13. package/dist/web/assets/{blockDiagram-GPEHLZMM-Dbmmdxse.js → blockDiagram-GPEHLZMM-Wy4mtab2.js} +1 -1
  14. package/dist/web/assets/{c-cYQPp2_G.js → c-B_5YfUT4.js} +1 -1
  15. package/dist/web/assets/{c4Diagram-AAUBKEIU-CSrU4RnA.js → c4Diagram-AAUBKEIU-DvAQK-yr.js} +1 -1
  16. package/dist/web/assets/channel-CNy21oVR.js +1 -0
  17. package/dist/web/assets/{chunk-2J33WTMH-Cs-XMScI.js → chunk-2J33WTMH-D12BmulM.js} +1 -1
  18. package/dist/web/assets/{chunk-4BX2VUAB-B4ieHaCd.js → chunk-4BX2VUAB-CUsT6Yoy.js} +1 -1
  19. package/dist/web/assets/{chunk-55IACEB6-CgnoAb5q.js → chunk-55IACEB6-B1fNBh7K.js} +1 -1
  20. package/dist/web/assets/{chunk-727SXJPM-wPBSQiFA.js → chunk-727SXJPM-BNwBLitG.js} +1 -1
  21. package/dist/web/assets/{chunk-AQP2D5EJ-CqrJNLOk.js → chunk-AQP2D5EJ-Cj6w8RRN.js} +1 -1
  22. package/dist/web/assets/{chunk-FMBD7UC4-_mUgb7S8.js → chunk-FMBD7UC4-DZQMeOiP.js} +1 -1
  23. package/dist/web/assets/{chunk-ND2GUHAM-C3VW7Cve.js → chunk-ND2GUHAM-BDZZZpgK.js} +1 -1
  24. package/dist/web/assets/chunk-QZHKN3VN-ZvBMuvS3.js +1 -0
  25. package/dist/web/assets/classDiagram-4FO5ZUOK-CdVQzF3q.js +1 -0
  26. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CdVQzF3q.js +1 -0
  27. package/dist/web/assets/{cobol-CT20AbWb.js → cobol-B7rjWy71.js} +1 -1
  28. package/dist/web/assets/{coffee-0rJcXjl9.js → coffee-327Z21kX.js} +1 -1
  29. package/dist/web/assets/{cose-bilkent-S5V4N54A-DuQ1yFPA.js → cose-bilkent-S5V4N54A-D1c4YrLP.js} +1 -1
  30. package/dist/web/assets/{cpp-D5SbIIZY.js → cpp-76QBVYPh.js} +1 -1
  31. package/dist/web/assets/{crystal-Cj4TXi57.js → crystal-B4heXbZm.js} +1 -1
  32. package/dist/web/assets/{css-DtnxUqP8.js → css-CzEdf7OR.js} +1 -1
  33. package/dist/web/assets/{dagre-BM42HDAG-BqRbkxFR.js → dagre-BM42HDAG-ET87-tzF.js} +1 -1
  34. package/dist/web/assets/{diagram-2AECGRRQ-CK-zBvhd.js → diagram-2AECGRRQ-CBQXEPqZ.js} +1 -1
  35. package/dist/web/assets/{diagram-5GNKFQAL-DtRurQ3W.js → diagram-5GNKFQAL-CtNzeaR4.js} +1 -1
  36. package/dist/web/assets/{diagram-KO2AKTUF-C98kWomB.js → diagram-KO2AKTUF-DKv9ewpj.js} +1 -1
  37. package/dist/web/assets/{diagram-LMA3HP47-Bnl8AVAT.js → diagram-LMA3HP47-BdL7Q4hm.js} +1 -1
  38. package/dist/web/assets/{diagram-OG6HWLK6-CdsMzW4t.js → diagram-OG6HWLK6-BTYYRviK.js} +1 -1
  39. package/dist/web/assets/{edge-CWJ2-CvL.js → edge-CbifZx89.js} +1 -1
  40. package/dist/web/assets/{elixir-9WOcqFnG.js → elixir-D7epo7XU.js} +1 -1
  41. package/dist/web/assets/{elm-fLyiEogZ.js → elm-CDnfHiSW.js} +1 -1
  42. package/dist/web/assets/{erDiagram-TEJ5UH35-D9WhFUc7.js → erDiagram-TEJ5UH35-DoS_g6rc.js} +1 -1
  43. package/dist/web/assets/{erb-E2w2Wuk4.js → erb-CJPDtktp.js} +1 -1
  44. package/dist/web/assets/eventmodeling-FCH6USID-dHNYNvhr.js +1 -0
  45. package/dist/web/assets/{flowDiagram-I6XJVG4X-C70nakMA.js → flowDiagram-I6XJVG4X-INqAi_9A.js} +1 -1
  46. package/dist/web/assets/{ganttDiagram-6RSMTGT7-CP5KBfFN.js → ganttDiagram-6RSMTGT7-BtV9RfaV.js} +1 -1
  47. package/dist/web/assets/{git-rebase-x3KRtncF.js → git-rebase-XN1VAGxD.js} +1 -1
  48. package/dist/web/assets/gitGraph-WXDBUCRP-BTlPmENP.js +1 -0
  49. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-Df0FpR0s.js → gitGraphDiagram-PVQCEYII-Bg7oxgNx.js} +1 -1
  50. package/dist/web/assets/{glimmer-js-Cg54b2H9.js → glimmer-js-jAUeYMlX.js} +1 -1
  51. package/dist/web/assets/{glimmer-ts-CHG4mXcI.js → glimmer-ts-wcJbAc9L.js} +1 -1
  52. package/dist/web/assets/{glsl-D3AVHhgf.js → glsl-CqkwmhMS.js} +1 -1
  53. package/dist/web/assets/{graphql-Cid5k0bB.js → graphql-MSHUJ_J9.js} +1 -1
  54. package/dist/web/assets/{hack-CgNtiKFF.js → hack-o9VcDxFX.js} +1 -1
  55. package/dist/web/assets/{haml-zYfBQKD9.js → haml-yMII7dOY.js} +1 -1
  56. package/dist/web/assets/{handlebars-R3KEMud6.js → handlebars-DqywSDps.js} +1 -1
  57. package/dist/web/assets/{highlighted-body-OFNGDK62-DNkjspl7.js → highlighted-body-OFNGDK62-DZUhBEEf.js} +1 -1
  58. package/dist/web/assets/{html-BymHzFSR.js → html-D8D_RndX.js} +1 -1
  59. package/dist/web/assets/{html-derivative-DqaPDM9z.js → html-derivative-Db1SyKg8.js} +1 -1
  60. package/dist/web/assets/{http-BBfT1XoF.js → http-Bqs_GAGw.js} +1 -1
  61. package/dist/web/assets/{hurl-B3OMVWCB.js → hurl-j0mDeRMp.js} +1 -1
  62. package/dist/web/assets/{index-CA2dCiLp.js → index-DlSOjemg.js} +62 -62
  63. package/dist/web/assets/info-J43DQDTF-Dk_AfWti.js +1 -0
  64. package/dist/web/assets/{infoDiagram-5YYISTIA-BW4ua_Dm.js → infoDiagram-5YYISTIA-D4cmnLLV.js} +1 -1
  65. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-7YC9v2Lm.js → ishikawaDiagram-YF4QCWOH-BY9yvtJK.js} +1 -1
  66. package/dist/web/assets/{java-CHjBQof-.js → java-CegvNhLh.js} +1 -1
  67. package/dist/web/assets/{javascript-CI31Lbgw.js → javascript-DhcUAesx.js} +1 -1
  68. package/dist/web/assets/{jinja-D5rfCvml.js → jinja-BdSDD1Q-.js} +1 -1
  69. package/dist/web/assets/{jison-DVkmH2rX.js → jison-CarYqmfq.js} +1 -1
  70. package/dist/web/assets/{journeyDiagram-JHISSGLW-DrB9twlC.js → journeyDiagram-JHISSGLW-rDquyMpx.js} +1 -1
  71. package/dist/web/assets/{json-BOZlh-KA.js → json-wCF8Ai7e.js} +1 -1
  72. package/dist/web/assets/{jsx-D81bVyrd.js → jsx-Ct3LR2iE.js} +1 -1
  73. package/dist/web/assets/{julia-DOpgNe80.js → julia-Brh5r__6.js} +1 -1
  74. package/dist/web/assets/{just-0wiA6ro1.js → just-CK9u7rV8.js} +1 -1
  75. package/dist/web/assets/{kanban-definition-UN3LZRKU-DypN0DR-.js → kanban-definition-UN3LZRKU-DRY4BHuX.js} +1 -1
  76. package/dist/web/assets/{latex-C49JQz3C.js → latex-CnioxxTZ.js} +1 -1
  77. package/dist/web/assets/{linear-CmJuffWc.js → linear-DdVYArrQ.js} +1 -1
  78. package/dist/web/assets/{liquid-WcatxBvx.js → liquid-CWr27PHL.js} +1 -1
  79. package/dist/web/assets/{lua-CMfcWyy-.js → lua-BHz_f72B.js} +1 -1
  80. package/dist/web/assets/{marko-Ciurfdrp.js → marko-DYZOkg7A.js} +1 -1
  81. package/dist/web/assets/{mdc-BhPAXxoA.js → mdc-a5KQMe4S.js} +1 -1
  82. package/dist/web/assets/mermaid-GHXKKRXX-DsECfWij.js +1 -0
  83. package/dist/web/assets/{mermaid-parser.core-CzdVF1Y-.js → mermaid-parser.core-BAsHbYUQ.js} +2 -2
  84. package/dist/web/assets/{mindmap-definition-RKZ34NQL-kVoo0P1k.js → mindmap-definition-RKZ34NQL-C1ndv4OX.js} +1 -1
  85. package/dist/web/assets/{nginx-WlzShe2g.js → nginx-DYjAek21.js} +1 -1
  86. package/dist/web/assets/{nim-DhsH5P-A.js → nim-BY3DE5rh.js} +1 -1
  87. package/dist/web/assets/packet-YPE3B663-C6X9xd7B.js +1 -0
  88. package/dist/web/assets/{perl-BgiWtF5-.js → perl-Q7rsz5p8.js} +1 -1
  89. package/dist/web/assets/{php-bcRqBpZO.js → php-wkLOOMEB.js} +1 -1
  90. package/dist/web/assets/pie-LRSECV5Y-B7m9jxWQ.js +1 -0
  91. package/dist/web/assets/{pieDiagram-4H26LBE5-3G_1zLJc.js → pieDiagram-4H26LBE5-hbmKZkAo.js} +1 -1
  92. package/dist/web/assets/{pug-m8pTbPLN.js → pug-DBjGFTz6.js} +1 -1
  93. package/dist/web/assets/{qml-CJvFQ3Wa.js → qml-6JbnGGh-.js} +1 -1
  94. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-B6PNPjDa.js → quadrantDiagram-W4KKPZXB-Ce3Tyy1v.js} +1 -1
  95. package/dist/web/assets/{r-BClqLKAj.js → r-CpWosUkA.js} +1 -1
  96. package/dist/web/assets/radar-GUYGQ44K-CNV--1hE.js +1 -0
  97. package/dist/web/assets/{razor-NkuRFDGJ.js → razor-VaRLosil.js} +1 -1
  98. package/dist/web/assets/{regexp-J7oxKsOx.js → regexp-BXX0dR0g.js} +1 -1
  99. package/dist/web/assets/{requirementDiagram-4Y6WPE33-uhnMTTcD.js → requirementDiagram-4Y6WPE33-BvuMdAA_.js} +1 -1
  100. package/dist/web/assets/{rst-CagZgeQR.js → rst-B5mAlZz_.js} +1 -1
  101. package/dist/web/assets/{ruby-DVMSmhqW.js → ruby-CuJVGKz0.js} +1 -1
  102. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-Bl2-ZE_M.js → sankeyDiagram-5OEKKPKP-9vzIUX0R.js} +1 -1
  103. package/dist/web/assets/{sas-t3gcbp2x.js → sas-CVzjXYMr.js} +1 -1
  104. package/dist/web/assets/{scss-DiSJaDhP.js → scss-WQpgeU5g.js} +1 -1
  105. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-BuqdPJ2w.js → sequenceDiagram-3UESZ5HK-q6rXjDsy.js} +1 -1
  106. package/dist/web/assets/{shellscript-DymPm4vG.js → shellscript-CycmgFgs.js} +1 -1
  107. package/dist/web/assets/{shellsession-am0AjWwV.js → shellsession-CSmahWBB.js} +1 -1
  108. package/dist/web/assets/{soy-CfnFZXe-.js → soy-E8MJKPgz.js} +1 -1
  109. package/dist/web/assets/{sql-ASrPneJi.js → sql-ChzFHxMA.js} +1 -1
  110. package/dist/web/assets/{stata-DzHpZ_Zs.js → stata-D-Voeimj.js} +1 -1
  111. package/dist/web/assets/{stateDiagram-AJRCARHV-4pzvy1EY.js → stateDiagram-AJRCARHV-QkbVYicl.js} +1 -1
  112. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-CemwCoPd.js +1 -0
  113. package/dist/web/assets/{surrealql-Daffo6Fa.js → surrealql-CDreHe5D.js} +1 -1
  114. package/dist/web/assets/{svelte-iCkXz020.js → svelte-UtC71yfS.js} +1 -1
  115. package/dist/web/assets/{templ-i0RZk0Nv.js → templ-DI5vQSP6.js} +1 -1
  116. package/dist/web/assets/{tex-CNVvk4MJ.js → tex-B1pg-O0j.js} +1 -1
  117. package/dist/web/assets/{timeline-definition-PNZ67QCA-B4vkrP31.js → timeline-definition-PNZ67QCA-hOb9CPgd.js} +1 -1
  118. package/dist/web/assets/treeView-BLDUP644-4kzz9e5T.js +1 -0
  119. package/dist/web/assets/treemap-LRROVOQU-CUGlq2kA.js +1 -0
  120. package/dist/web/assets/{ts-tags-JKlKXvrj.js → ts-tags-DDRBQd18.js} +1 -1
  121. package/dist/web/assets/{tsx-C_VV6dl3.js → tsx-BNOyqGp9.js} +1 -1
  122. package/dist/web/assets/{twig--4lENSWn.js → twig-zClWYmrr.js} +1 -1
  123. package/dist/web/assets/{typescript-DgI0Mcyp.js → typescript-Bywfx-vz.js} +1 -1
  124. package/dist/web/assets/{vennDiagram-CIIHVFJN-Bqd01Zcu.js → vennDiagram-CIIHVFJN-Cx7yBOK-.js} +1 -1
  125. package/dist/web/assets/{vue-vi4NPaCj.js → vue-Bp_voCJR.js} +1 -1
  126. package/dist/web/assets/{vue-html-DRyHp-xX.js → vue-html-C43GF5Id.js} +1 -1
  127. package/dist/web/assets/{vue-vine-Dvq5ocm8.js → vue-vine-CSRbNOMz.js} +1 -1
  128. package/dist/web/assets/wardley-L42UT6IY-NTb3kln2.js +1 -0
  129. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-Cx9MIJxe.js → wardleyDiagram-YWT4CUSO-Cwiuub7b.js} +1 -1
  130. package/dist/web/assets/{xml-Bktrco2r.js → xml-rhD_p6eK.js} +1 -1
  131. package/dist/web/assets/{xsl-Buq9dfal.js → xsl-B-H8kR_6.js} +1 -1
  132. package/dist/web/assets/{xychartDiagram-2RQKCTM6-BqTFlb7h.js → xychartDiagram-2RQKCTM6-DAix_-GG.js} +1 -1
  133. package/dist/web/assets/{yaml-B_qEYHeC.js → yaml-CRIMWRGF.js} +1 -1
  134. package/dist/web/index.html +1 -1
  135. package/package.json +1 -1
  136. package/dist/web/assets/architecture-7EHR7CIX-BYKtSaOh.js +0 -1
  137. package/dist/web/assets/channel-5Xzz28Qt.js +0 -1
  138. package/dist/web/assets/chunk-QZHKN3VN-H7pvEW6k.js +0 -1
  139. package/dist/web/assets/classDiagram-4FO5ZUOK-ygdYN009.js +0 -1
  140. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-ygdYN009.js +0 -1
  141. package/dist/web/assets/eventmodeling-FCH6USID-CqqtP421.js +0 -1
  142. package/dist/web/assets/gitGraph-WXDBUCRP-2tg1GHmS.js +0 -1
  143. package/dist/web/assets/info-J43DQDTF-D4dOVjqy.js +0 -1
  144. package/dist/web/assets/mermaid-GHXKKRXX-CuYV6cEM.js +0 -1
  145. package/dist/web/assets/packet-YPE3B663-ojSC-sfx.js +0 -1
  146. package/dist/web/assets/pie-LRSECV5Y-DawZckTj.js +0 -1
  147. package/dist/web/assets/radar-GUYGQ44K-DiHIeStu.js +0 -1
  148. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-BtUsE_9v.js +0 -1
  149. package/dist/web/assets/treeView-BLDUP644-Btkd1NAS.js +0 -1
  150. package/dist/web/assets/treemap-LRROVOQU-Dz0O1QCQ.js +0 -1
  151. package/dist/web/assets/wardley-L42UT6IY-bwSYb6Fl.js +0 -1
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ async function main(argv) {
15
15
  return;
16
16
  }
17
17
  if (options === "version") {
18
- console.log("0.1.12");
18
+ console.log("0.2.1");
19
19
  return;
20
20
  }
21
21
  const cliRoot = path.dirname(fileURLToPath(import.meta.url));
@@ -56834,14 +56834,32 @@ function createDeleteToolDefinition() {
56834
56834
  }
56835
56835
 
56836
56836
  // ../core/src/agent/tools/edit.ts
56837
+ var DESCRIPTION = [
56838
+ "Performs exact string replacements in Project Workspace files.",
56839
+ "",
56840
+ "Usage:",
56841
+ "- You must use the read tool before editing an existing file so you can match the current contents exactly.",
56842
+ "- The path parameter must be a relative file path inside the Project Workspace.",
56843
+ "- When editing text from read tool output, preserve the exact indentation after the line number prefix.",
56844
+ "- The line number prefix format is `<line>: `. Everything after that prefix is the actual file content to match.",
56845
+ "- Never include any part of the line number prefix in oldString or newString.",
56846
+ "- Prefer editing existing files. Only create new files when the user request explicitly requires it.",
56847
+ "- Only use emojis if the user explicitly requests them.",
56848
+ "- The edit will fail if oldString is not found in the file.",
56849
+ "- The edit will fail if oldString is found multiple times unless replaceAll is true.",
56850
+ "- Provide more surrounding context in oldString when you need to identify one specific match.",
56851
+ "- Use replaceAll for replacing or renaming every occurrence of a string across the file."
56852
+ ].join("\n");
56837
56853
  function createEditToolDefinition() {
56838
56854
  return {
56839
- description: "Edit one UTF-8 text file by replacing oldString with newString. By default oldString must occur exactly once; set replaceAll to replace every occurrence.",
56855
+ description: DESCRIPTION,
56840
56856
  inputSchema: external_exports.object({
56841
- newString: external_exports.string().describe("Replacement text."),
56842
- oldString: external_exports.string().describe("Text to replace."),
56843
- path: external_exports.string().describe("Relative file path inside the Project Workspace."),
56844
- replaceAll: external_exports.boolean().describe("Replace every occurrence of oldString instead of requiring exactly one match.").optional()
56857
+ newString: external_exports.string().describe("Replacement text. Must be different from oldString."),
56858
+ oldString: external_exports.string().describe("Exact text to replace from the current file contents."),
56859
+ path: external_exports.string().describe("Relative file path inside the Project Workspace to modify."),
56860
+ replaceAll: external_exports.boolean().describe(
56861
+ "Replace every occurrence of oldString instead of requiring exactly one match. Default false."
56862
+ ).optional()
56845
56863
  }).strict(),
56846
56864
  name: "edit",
56847
56865
  parallelSafe: false,
@@ -56850,12 +56868,24 @@ function createEditToolDefinition() {
56850
56868
  }
56851
56869
 
56852
56870
  // ../core/src/agent/tools/glob.ts
56871
+ var DESCRIPTION2 = [
56872
+ "- Fast file pattern matching tool for the current Project Workspace.",
56873
+ '- Supports glob patterns like "**/*.html" or "assets/*.{css,js}".',
56874
+ "- Returns matching Project Workspace relative file and directory paths.",
56875
+ "- Use this tool when you need to find files by name patterns.",
56876
+ "- The optional path parameter must be a relative directory path inside the Project Workspace.",
56877
+ "- You can call multiple read, glob, and grep tools in parallel when several searches are useful."
56878
+ ].join("\n");
56853
56879
  function createGlobToolDefinition() {
56854
56880
  return {
56855
- description: "Find files and directories in the current Project Workspace by glob pattern, sorted by most recently modified first.",
56881
+ description: DESCRIPTION2,
56856
56882
  inputSchema: external_exports.object({
56857
- path: external_exports.string().describe("Optional relative directory path inside the Project Workspace to search from.").optional(),
56858
- pattern: external_exports.string().describe('Glob pattern such as "**/*.html", "assets/*.{css,js}", or "index.html".')
56883
+ path: external_exports.string().describe(
56884
+ "Optional relative directory path inside the Project Workspace to search from. Omit this field to search from the workspace root."
56885
+ ).optional(),
56886
+ pattern: external_exports.string().describe(
56887
+ 'Glob pattern to match Project Workspace files against, such as "**/*.html", "assets/*.{css,js}", or "index.html".'
56888
+ )
56859
56889
  }).strict(),
56860
56890
  name: "glob",
56861
56891
  parallelSafe: true,
@@ -56866,15 +56896,26 @@ function createGlobToolDefinition() {
56866
56896
  }
56867
56897
 
56868
56898
  // ../core/src/agent/tools/grep.ts
56899
+ var DESCRIPTION3 = [
56900
+ "- Fast content search tool for UTF-8 text files in the current Project Workspace.",
56901
+ "- Searches file contents using JavaScript regular expressions.",
56902
+ '- Supports regex patterns such as "log.*Error" or "function\\s+\\w+".',
56903
+ '- Filter files by pattern with the include parameter, such as "*.html" or "**/*.{css,js}".',
56904
+ "- Returns Project Workspace relative file paths and line numbers with matching lines.",
56905
+ "- Use this tool when you need to find files containing specific patterns.",
56906
+ "- Use a more specific path or include pattern if the result is too broad or truncated."
56907
+ ].join("\n");
56869
56908
  function createGrepToolDefinition() {
56870
56909
  return {
56871
- description: "Search UTF-8 text files in the current Project Workspace using a JavaScript regular expression.",
56910
+ description: DESCRIPTION3,
56872
56911
  inputSchema: external_exports.object({
56873
- include: external_exports.string().describe('Optional file glob to include, such as "*.html" or "**/*.{css,js}".').optional(),
56912
+ include: external_exports.string().describe(
56913
+ 'Optional Project Workspace file glob to include, such as "*.html" or "**/*.{css,js}".'
56914
+ ).optional(),
56874
56915
  path: external_exports.string().describe(
56875
- "Optional relative file or directory path inside the Project Workspace to search."
56916
+ "Optional relative file or directory path inside the Project Workspace to search. Omit this field to search the workspace root."
56876
56917
  ).optional(),
56877
- pattern: external_exports.string().describe("JavaScript regular expression pattern to search for.")
56918
+ pattern: external_exports.string().describe("JavaScript regular expression pattern to search for in file contents.")
56878
56919
  }).strict(),
56879
56920
  name: "grep",
56880
56921
  parallelSafe: true,
@@ -56887,43 +56928,6 @@ function createGrepToolDefinition() {
56887
56928
  };
56888
56929
  }
56889
56930
 
56890
- // ../core/src/agent/tools/patch.ts
56891
- function createPatchToolDefinition() {
56892
- return {
56893
- description: "Apply coordinated UTF-8 file changes inside the current Project Workspace. Supports add/write, edit, and delete changes.",
56894
- inputSchema: external_exports.object({
56895
- changes: external_exports.array(
56896
- external_exports.discriminatedUnion("operation", [
56897
- external_exports.object({
56898
- content: external_exports.string().describe("Complete file content for add operations."),
56899
- operation: external_exports.literal("add"),
56900
- path: external_exports.string().describe("Relative file or directory path inside the Project Workspace.")
56901
- }).strict(),
56902
- external_exports.object({
56903
- content: external_exports.string().describe("Complete file content for write operations."),
56904
- operation: external_exports.literal("write"),
56905
- path: external_exports.string().describe("Relative file or directory path inside the Project Workspace.")
56906
- }).strict(),
56907
- external_exports.object({
56908
- newString: external_exports.string().describe("Replacement text for edit operations."),
56909
- oldString: external_exports.string().describe("Text to replace for edit operations."),
56910
- operation: external_exports.literal("edit"),
56911
- path: external_exports.string().describe("Relative file or directory path inside the Project Workspace."),
56912
- replaceAll: external_exports.boolean().describe("For edit operations, replace every occurrence of oldString.").optional()
56913
- }).strict(),
56914
- external_exports.object({
56915
- operation: external_exports.literal("delete"),
56916
- path: external_exports.string().describe("Relative file or directory path inside the Project Workspace.")
56917
- }).strict()
56918
- ])
56919
- ).min(1)
56920
- }).strict(),
56921
- name: "patch",
56922
- parallelSafe: false,
56923
- execute: async ({ changes }, { projectId, workspaceStore }) => workspaceStore.applyProjectWorkspacePatch(projectId, changes)
56924
- };
56925
- }
56926
-
56927
56931
  // ../core/src/realtime/frontend-command-bus.ts
56928
56932
  var KEEPALIVE_INTERVAL_MS = 15e3;
56929
56933
  var FrontendCommandBus = class {
@@ -57066,9 +57070,25 @@ function createPreviewRefreshToolDefinition() {
57066
57070
  }
57067
57071
 
57068
57072
  // ../core/src/agent/tools/read.ts
57073
+ var DESCRIPTION4 = [
57074
+ "Read a file or directory from the current Project Workspace. If the path does not exist, an error is returned.",
57075
+ "",
57076
+ "Usage:",
57077
+ "- The path parameter must be a relative file or directory path inside the Project Workspace.",
57078
+ "- By default, this tool returns up to 2000 lines or directory entries from the start of the target.",
57079
+ "- The offset parameter is the line number or directory-entry number to start from (1-indexed).",
57080
+ "- To read later sections, call this tool again with a larger offset.",
57081
+ "- Use the grep tool to find specific content in large files or files with long lines.",
57082
+ "- If you are unsure of the correct path, use the glob tool to look up filenames by glob pattern.",
57083
+ "- File contents are returned with each line prefixed by its line number as `<line>: <content>`.",
57084
+ "- Directory entries are returned as Project Workspace relative paths.",
57085
+ "- Long lines and large files may be truncated. Use offset and limit to inspect the needed section.",
57086
+ "- Call this tool in parallel when you know there are multiple files you want to read.",
57087
+ "- Avoid tiny repeated slices. If you need more context, read a larger window."
57088
+ ].join("\n");
57069
57089
  function createReadToolDefinition() {
57070
57090
  return {
57071
- description: "Read one UTF-8 file or directory from the current Project Workspace. Files are returned with 1-indexed line numbers.",
57091
+ description: DESCRIPTION4,
57072
57092
  inputSchema: external_exports.object({
57073
57093
  limit: external_exports.number().describe("Maximum number of lines or directory entries to read. Defaults to 2000.").optional(),
57074
57094
  offset: external_exports.number().describe(
@@ -57088,12 +57108,24 @@ function createReadToolDefinition() {
57088
57108
  }
57089
57109
 
57090
57110
  // ../core/src/agent/tools/write.ts
57111
+ var DESCRIPTION5 = [
57112
+ "Writes a file in the current Project Workspace.",
57113
+ "",
57114
+ "Usage:",
57115
+ "- This tool will overwrite the existing file if there is one at the provided path.",
57116
+ "- The path parameter must be a relative file path inside the Project Workspace.",
57117
+ "- If this is an existing file, you must use the read tool first to read the file contents.",
57118
+ "- Prefer editing existing files with the edit tool. Only write full files when intentional.",
57119
+ "- Do not use write to create the initial index.html; use createHtml first.",
57120
+ "- Never proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the user.",
57121
+ "- Only use emojis if the user explicitly requests them."
57122
+ ].join("\n");
57091
57123
  function createWriteToolDefinition() {
57092
57124
  return {
57093
- description: "Create or overwrite one UTF-8 text file in the current Project Workspace.",
57125
+ description: DESCRIPTION5,
57094
57126
  inputSchema: external_exports.object({
57095
- content: external_exports.string().describe("Complete UTF-8 text file content."),
57096
- path: external_exports.string().describe("Relative file path inside the Project Workspace.")
57127
+ content: external_exports.string().describe("Complete UTF-8 text file content to write."),
57128
+ path: external_exports.string().describe("Relative file path inside the Project Workspace to create or overwrite.")
57097
57129
  }).strict(),
57098
57130
  name: "write",
57099
57131
  parallelSafe: false,
@@ -57110,7 +57142,6 @@ function createProjectWorkspaceToolDefinitions() {
57110
57142
  createEditToolDefinition(),
57111
57143
  createGlobToolDefinition(),
57112
57144
  createGrepToolDefinition(),
57113
- createPatchToolDefinition(),
57114
57145
  createPreviewRefreshToolDefinition(),
57115
57146
  createReadToolDefinition(),
57116
57147
  createWriteToolDefinition()
@@ -57179,7 +57210,7 @@ function buildFrontendCapabilityPrompt() {
57179
57210
  }
57180
57211
 
57181
57212
  // ../core/src/agent/design-page-agent.ts
57182
- var DESIGN_PAGE_AGENT_PROMPT_VERSION = 1;
57213
+ var DESIGN_PAGE_AGENT_PROMPT_VERSION = 3;
57183
57214
  var AiSdkDesignPageAgent = class {
57184
57215
  constructor(workspaceStore) {
57185
57216
  this.workspaceStore = workspaceStore;
@@ -57337,12 +57368,10 @@ function buildDesignPageConversationInstructions(resources) {
57337
57368
  tag: "frontend_capabilities",
57338
57369
  content: buildFrontendCapabilityPrompt()
57339
57370
  },
57340
- ...resources ? [
57341
- {
57342
- tag: "resource_policy",
57343
- content: buildResourcePolicyPrompt(resources)
57344
- }
57345
- ] : []
57371
+ {
57372
+ tag: "resource_policy",
57373
+ content: resources ? buildResourcePolicyPrompt(resources) : buildResourcePolicyFallbackPrompt()
57374
+ }
57346
57375
  ];
57347
57376
  return renderDesignPromptSections(sections);
57348
57377
  }
@@ -57386,7 +57415,6 @@ function buildToolWorkflowPrompt() {
57386
57415
  "Choose tools by intent:",
57387
57416
  "- Use `createHtml` only to create a missing `index.html` file.",
57388
57417
  "- Use `edit` for small, focused replacements in one existing file.",
57389
- "- Use `patch` for coordinated changes or repeated replacements.",
57390
57418
  "- Use `write` only for deliberate full-file replacement of `index.html`.",
57391
57419
  "- Do not use `write` to create the initial `index.html`; use `createHtml` first.",
57392
57420
  "- Use `copyFile` only when the current user message explicitly asks you to duplicate an existing file.",
@@ -57397,7 +57425,8 @@ function buildToolWorkflowPrompt() {
57397
57425
  "- When `index.html` exists, read it before editing and do not call `createHtml`.",
57398
57426
  "",
57399
57427
  "Recover from tool failures:",
57400
- "- If an edit fails, read the file again and retry with a smaller edit or patch.",
57428
+ "- If an edit fails, read the file again and retry with a smaller, exact edit.",
57429
+ "- If repeated focused edits would be more fragile than replacing the file, use `write` for an intentional full-file replacement.",
57401
57430
  "- If a generated prototype becomes too large or brittle, simplify the file while preserving visible quality."
57402
57431
  ].join("\n");
57403
57432
  }
@@ -57429,6 +57458,17 @@ function buildResourcePolicyPrompt(resources) {
57429
57458
  "Use regular inline CSS as the primary styling method."
57430
57459
  ].join("\n");
57431
57460
  }
57461
+ function buildResourcePolicyFallbackPrompt() {
57462
+ return [
57463
+ "## Resource Policy",
57464
+ "No global resource settings were provided for this run.",
57465
+ "Use resources already present in the existing `index.html` or the default HTML template.",
57466
+ "Prefer local CSS and built-in browser capabilities before adding any external resource.",
57467
+ "Do not add a new font, icon, image, script, or CDN dependency unless the user explicitly requests it or it is necessary for prototype quality.",
57468
+ "If no icon library is configured, use text labels or simple CSS shapes instead of assuming a specific icon system.",
57469
+ "Use regular inline CSS as the primary styling method."
57470
+ ].join("\n");
57471
+ }
57432
57472
  function getDefaultResourceLibrary(libraries) {
57433
57473
  return libraries.find((library) => library.isDefault) ?? libraries[0];
57434
57474
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  You are a read-only design consistency auditor for OwnDesign HTML workspaces.
4
4
  Inspect the final workspace state after the main design agent finishes a user task.
5
- Use only read, glob, and grep tools. Never edit files and never ask to call write, edit, patch, createHtml, delete, copyFile, preview tools, or syncSharedComponent yourself.
5
+ Use only read, glob, and grep tools. Never edit files and never ask to call write, edit, createHtml, delete, copyFile, preview tools, or syncSharedComponent yourself.
6
6
 
7
7
  Return JSON only with this shape:
8
8
  {"passed": boolean, "findings": [{"type": string, "severity": "high" | "medium" | "low", "message": string, "path"?: string, "recommendedAction"?: string}], "summary": string}
@@ -1,54 +1,67 @@
1
1
  # OwnDesign Single HTML Page Agent
2
2
 
3
- You design and implement high-quality previewable page prototypes in a single `index.html` file inside the Project Workspace.
3
+ You are OwnDesign's single HTML page design agent. You turn a user's product idea, redesign request, or interface change into one polished, previewable `index.html` prototype inside the Project Workspace.
4
4
 
5
- The user's result is judged by what appears in the Preview Pane iframe. A task is complete only when `index.html` renders an intentional, polished, useful interface prototype, not merely valid markup.
5
+ The user's result is judged by what appears in the Preview Pane iframe. A task is complete only when `index.html` communicates a coherent product experience with useful interface states, not merely valid markup.
6
6
 
7
- ## Core Output Model
7
+ ## Identity
8
8
 
9
- - `index.html` is the only previewable page and the main design canvas.
10
- - Put the page structure, CSS, and local prototype JavaScript directly in `index.html`.
11
- - Do not create additional HTML pages for different screens.
12
- - Do not use custom elements, Shadow DOM, React, framework build files, page/component metadata files, or shared component modules.
13
- - For multi-page experiences, implement internal views in `index.html` using state, hash routing, tabs, buttons, or `[data-view]` sections.
9
+ - Act as a product-minded frontend designer and implementer for a single preview canvas.
10
+ - Stay grounded in the current project. If `index.html` exists, understand its structure, visual language, and interaction model before changing it.
11
+ - Be decisive once the design direction is clear. Build the visible experience instead of narrating possibilities.
12
+ - Preserve useful existing intent. Replace the whole file only when that is the cleanest way to deliver the requested result.
13
+
14
+ ## Operating Priorities
15
+
16
+ When instructions pull in different directions, follow this order:
17
+
18
+ 1. The single `index.html` target, available workspace tools, configured resources, and Preview Pane constraints.
19
+ 2. The user's explicit product goal, content request, audience, and visual preferences.
20
+ 3. Domain-appropriate design judgment and prototype quality.
21
+ 4. Local consistency with the existing `index.html`.
22
+
23
+ User requests guide the design intent, but they do not override the single-file target, the workspace tool boundary, the resource policy, or the requirement that the result be previewable in `index.html`.
24
+
25
+ Do not inherit assumptions from general coding agents or full application builders. Use only the project workspace tools supplied to you and keep the work focused on the previewable prototype.
14
26
 
15
- ## Work Rhythm
27
+ ## Design Judgment
16
28
 
17
- Before editing, make the design decision first:
29
+ Before editing, form a compact design brief in your own reasoning:
18
30
 
19
- 1. Identify the interface purpose, target user, primary task, and product tone.
20
- 2. Choose one clear visual direction that fits the domain and makes the page memorable.
21
- 3. Plan the first viewport, key workflow, primary actions, supporting content, and interaction states.
22
- 4. When the product needs mobile support, plan the mobile structure as a real responsive layout, not as a device mockup.
23
- 5. Then implement the design in `index.html`.
31
+ 1. What is the interface for, and what outcome should the user reach first?
32
+ 2. Who is the target user, and what level of density, guidance, and polish do they expect?
33
+ 3. What product tone fits the domain: operational, editorial, playful, premium, technical, calm, expressive, or another clear direction?
34
+ 4. What must be visible in the first viewport so the page feels useful immediately?
35
+ 5. Which interaction states will make the prototype feel alive without pretending to be a real backend product?
24
36
 
25
- Prefer finishing the visible page over maintaining abstractions. One coherent single file is the intended architecture.
37
+ Choose one strong visual direction that fits the product instead of blending generic patterns. SaaS, CRM, admin, and productivity tools should be organized for scanning, comparison, and repeated action. Consumer, brand, portfolio, game, and story-driven pages may be more expressive, visual, and immersive when the user's request calls for it.
26
38
 
27
- ## Implementation Contract
39
+ ## Single HTML Craft
28
40
 
29
- - Keep the whole previewable prototype in `index.html`.
41
+ - `index.html` is the only previewable page and the main design canvas.
42
+ - Put the page structure, CSS, and local prototype JavaScript directly in `index.html`.
43
+ - Do not create additional HTML pages, React/Vue/Svelte apps, framework build files, custom elements, Shadow DOM, component module folders, or reuse metadata.
44
+ - For multiple pages, screens, routes, or steps, implement internal views in `index.html` using state, hash routing, tabs, buttons, or `[data-view]` sections.
30
45
  - Use `<main id="app">` for the visible app/page body.
31
- - Keep CSS in the file's `<style>` block and organize it clearly: reset, tokens, layout, components, responsive rules, and motion.
32
- - Keep JavaScript in the file's `<script>` block and include only prototype behavior that is needed for the requested interaction.
33
- - For multiple screens or routes, use `[data-view]` sections with a single active state, hash/state/tab navigation, and clear button/link handlers.
34
- - Do not leave default template placeholders, empty sections, unfinished scripts, or dead controls.
46
+ - Keep CSS in the file's `<style>` block and organize it clearly: reset, tokens, layout, components, states, responsive rules, and motion.
47
+ - Keep JavaScript in the file's `<script>` block and include only prototype behavior that is needed for visible interaction.
48
+ - Prefer one coherent, finished file over abstractions that make the prototype harder to inspect.
35
49
 
36
- ## Design Quality
50
+ ## Frontend Taste Model
37
51
 
38
52
  Every rendered `index.html` should feel like a complete product-quality prototype:
39
53
 
40
54
  - Give the first viewport a clear visual focus and at least one useful product action or workflow entry point.
55
+ - Let the subject matter shape the interface. Use realistic labels, domain-specific copy, representative data, and controls the target user would expect.
41
56
  - Use a deliberate visual system with clear typography, spacing, color, hierarchy, density, radius, shadow, and motion choices.
42
- - Use CSS variables or clear repeated values for the page's color, spacing, radius, shadow, and motion system.
43
- - Build realistic labels, concise content, minimal mock data, and useful interface states. Avoid lorem ipsum, vague placeholder copy, and empty marketing filler.
44
- - Make common workflows visible and understandable, including relevant hover, focus, active, selected, empty, loading, or error states.
45
- - Adapt to mobile when the interface calls for it (for example consumer-facing or touch-first products); when you do, reorganize navigation, actions, and dense content for small screens instead of only shrinking columns. Desktop-only tools do not need a mobile layout.
46
- - For mobile interfaces, design the real app/page layout only. Do not add simulated system status bars, notches, home indicators, phone frames, device chrome, browser chrome, or screenshot containers unless the user explicitly asks for a device mockup or app-store-style screenshot.
47
- - Keep text readable and prevent overflow, clipping, and accidental overlap.
48
- - Prefer polished, domain-specific UI over generic sections.
49
- - Use spatial composition intentionally: density, negative space, asymmetry, layering, or grid discipline should match the product tone.
50
- - Add motion, background treatment, texture, depth, hover states, and micro-interactions only when they improve the user's understanding or make the interface feel more finished.
51
- - Use icons, controls, data, imagery, and interaction states when they fit the user's request.
57
+ - Use CSS variables or an obvious reusable scale for repeated colors, spacing, radii, shadows, and motion values.
58
+ - Build with stable layout dimensions where UI elements have fixed roles, such as toolbars, boards, grids, counters, tabs, icon buttons, and cards.
59
+ - Keep text readable and prevent overflow, clipping, accidental overlap, cramped buttons, and mobile horizontal scrolling.
60
+ - Match display type to context. Use large type for true hero moments and tighter headings inside panels, dashboards, sidebars, and tool surfaces.
61
+ - Show relevant hover, focus, active, selected, empty, loading, disabled, success, and error states when they help the workflow read clearly.
62
+ - Use icons, controls, data, imagery, texture, depth, and motion when they serve the product experience. Avoid decoration that competes with comprehension.
63
+ - Treat mobile as a real layout when the product needs it. Reorganize navigation, actions, and dense content instead of only shrinking columns.
64
+ - For mobile interfaces, design the real app/page layout only. Do not add simulated status bars, notches, home indicators, phone frames, device chrome, browser chrome, or screenshot containers unless the user explicitly asks for a device mockup.
52
65
 
53
66
  ## Mock Data Minimalism
54
67
 
@@ -69,6 +82,18 @@ For content-heavy interfaces, use short excerpts and visual placeholders. Do not
69
82
 
70
83
  Avoid data-first implementation. Start from the visible interface structure, then add only the smallest amount of mock content needed to make the prototype convincing.
71
84
 
85
+ ## Prototype Behavior
86
+
87
+ Build frontend prototypes. Interactions should demonstrate interface states, user flows, and visual feedback; they should not turn the prototype into a real browser, OS, local file tool, or business workflow unless the user explicitly asks for that capability.
88
+
89
+ Good prototype interactions include active tabs, modal open/close, drawer visibility, filter chips, selected rows, toast messages, simple steppers, hash/view switching, local preview toggles, and small local state changes that make the UI intention clear.
90
+
91
+ For complex actions such as Add, Import, Upload, Select folder, Connect source, Sync, Export, Pay, Sign in, or Publish, default to a mock UI flow: open a modal, show sample items, update a visible state, or display a credible simulated result. Do not access local files or external services by default.
92
+
93
+ Do not use `<input type="file">`, `webkitdirectory`, `showOpenFilePicker`, `FileReader`, drag-and-drop file reading, real file counting, or real local file previews unless the user explicitly asks for upload, import, local file access, or file preview behavior.
94
+
95
+ Forms may validate required fields, show error/success states, and update local mock content. Do not submit data, persist data, call APIs, authenticate, upload files, process payments, integrate services, or implement databases unless the user explicitly asks for that behavior.
96
+
72
97
  ## Anti-Patterns
73
98
 
74
99
  Avoid common low-quality output:
@@ -77,37 +102,32 @@ Avoid common low-quality output:
77
102
  - One-note palettes, low-contrast gray text, excessive blur, heavy shadows, and decorative effects that fight readability.
78
103
  - Repeated same-looking rounded cards for unrelated content.
79
104
  - Hero sections so tall that the actual product workflow is not visible.
80
- - Desktop layouts that cause mobile horizontal overflow or cramped button text.
81
- - Icons that are vertically misaligned with text or controls.
105
+ - In-app text that explains the prototype, styling, keyboard shortcuts, or how to use the page instead of presenting the actual product UI.
82
106
  - Navigation, filters, forms, charts, drawers, modals, or tabs that give no visible prototype feedback.
83
-
84
- ## Prototype Boundary
85
-
86
- Build frontend prototypes. Interactions should demonstrate interface states, user flows, and visual feedback; they should not turn the prototype into a real browser, OS, or business workflow unless the user explicitly asks for that capability.
87
-
88
- Good prototype interactions include active tabs, modal open/close, drawer visibility, filter chips, selected rows, toast messages, simple steppers, hash/view switching, and small local state changes that make the UI intention clear.
89
-
90
- For complex actions such as Add, Import, Upload, Select folder, Connect source, Sync, or Export, default to a mock UI flow: open a modal, show sample items, update a visible state, or display a credible simulated result. Do not access local files or external services by default.
91
-
92
- Do not use `<input type="file">`, `webkitdirectory`, `showOpenFilePicker`, `FileReader`, drag-and-drop file reading, real file counting, or real local file previews unless the user explicitly asks for upload, import, local file access, or file preview behavior.
93
-
94
- Forms may validate required fields, show error/success states, and update local mock content. Do not submit data, persist data, call APIs, authenticate, upload files, process payments, integrate services, or implement databases unless the user explicitly asks for that behavior.
107
+ - Controls that look clickable but do nothing.
108
+ - Icons that are visually misaligned, inconsistent, or used where a clearer control pattern exists.
109
+ - Layouts dominated by a single fashionable color treatment when the product needs contrast, hierarchy, and domain specificity.
95
110
 
96
111
  ## Resource Rules
97
112
 
98
- Fonts, icons, and external dependencies follow the `resource_policy` section provided with these instructions. In short: keep the configured fonts and design typography through size, weight, line-height, spacing, and hierarchy; use the configured icon set (Lucide by default) rather than other icon systems or emoji; and keep external dependencies minimal and purposeful. Prefer code that works directly when `index.html` is loaded by the Preview Pane.
113
+ Fonts, icons, external dependencies, and CDN usage follow the `resource_policy` section provided with these instructions. Keep this core prompt focused on design intent and defer concrete resource choices to that section.
114
+
115
+ Prefer code that works directly when `index.html` is loaded by the Preview Pane. Add external resources only when allowed by the resource policy and needed for the prototype quality or explicitly requested by the user.
99
116
 
100
- ## Pre-Output Checklist
117
+ ## Quality Gate
101
118
 
102
- Before calling `previewRefresh`, re-read the rendered `index.html` and verify every item below. If any item fails, fix it first; do not refresh on a page that fails the checklist.
119
+ Before calling `previewRefresh`, review the current `index.html` source and verify every item below. If any item fails, fix it first; do not refresh on a page that fails the checklist.
103
120
 
104
- - First viewport: at least one clear primary action or workflow entry point is visible without scrolling.
105
- - Readability: body text is at least 14px and has enough contrast against its background to read comfortably; no low-contrast gray-on-gray text.
106
- - Design tokens: every color, spacing, radius, and shadow value comes from a CSS variable or a consistent repeated value, with no one-off magic numbers.
107
- - Icons: each Lucide icon is vertically centered with its adjacent text or control.
108
- - No dead ends: every nav item, filter, tab, button, modal, and drawer produces a visible response; there are no placeholder sections, unfinished scripts, or controls that do nothing.
109
- - States: interactive elements show the relevant hover, focus, active, or selected states.
110
- - Content: labels and copy are specific to the product domain, with no lorem ipsum or vague placeholder text.
121
+ - First viewport: the product purpose, visual direction, and at least one primary action or workflow entry point are visible without scrolling.
122
+ - Single target: the complete previewable prototype lives in `index.html` and uses `<main id="app">` for the visible body.
123
+ - Readability: body text is at least 14px, contrast is comfortable, and no important text is clipped, hidden, or overlapping.
124
+ - Layout: desktop and any required mobile layout have no accidental horizontal overflow, cramped controls, or incoherent stacking.
125
+ - States: navigation, filters, tabs, buttons, modals, drawers, and form controls produce visible feedback when included.
126
+ - Content: labels, sample data, and copy are specific to the product domain, with no lorem ipsum or vague placeholder filler.
127
+ - Resources: font, icon, image, and dependency choices follow `resource_policy`.
128
+ - Icons: configured icons are aligned with adjacent text and controls, and dynamically inserted icons are initialized when needed.
129
+ - Code: CSS and JavaScript are organized inside the file and contain no unfinished template placeholders or dead handlers.
130
+ - Finish: the page feels like a polished interface prototype, not a wireframe, empty scaffold, or code exercise.
111
131
 
112
132
  ## Final Reply
113
133