create-yss-spec 1.1.2 → 1.1.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.
Files changed (239) hide show
  1. package/package.json +1 -1
  2. package/template/.codex/skills/data-analytics/.app.json +84 -0
  3. package/template/.codex/skills/data-analytics/.codex-plugin/plugin.json +66 -0
  4. package/template/.codex/skills/data-analytics/.mcp.json +30 -0
  5. package/template/.codex/skills/data-analytics/AGENTS.md +20 -0
  6. package/template/.codex/skills/data-analytics/DEPENDENCIES.MD +27 -0
  7. package/template/.codex/skills/data-analytics/README.md +60 -0
  8. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html +16 -0
  9. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part001 +1 -0
  10. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part002 +1 -0
  11. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part003 +1 -0
  12. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part004 +1 -0
  13. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part005 +1 -0
  14. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part006 +1 -0
  15. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html +16 -0
  16. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part001 +1 -0
  17. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part002 +1 -0
  18. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part003 +1 -0
  19. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part004 +1 -0
  20. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part005 +1 -0
  21. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part006 +1 -0
  22. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part007 +1 -0
  23. package/template/.codex/skills/data-analytics/assets/datascience-small.svg +5 -0
  24. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html +16 -0
  25. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part001 +1 -0
  26. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part002 +1 -0
  27. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part003 +1 -0
  28. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part004 +1 -0
  29. package/template/.codex/skills/data-analytics/assets/datascience.png +0 -0
  30. package/template/.codex/skills/data-analytics/assets/datascience.svg +10 -0
  31. package/template/.codex/skills/data-analytics/mcp/server.cjs +2963 -0
  32. package/template/.codex/skills/data-analytics/package-lock.json +3048 -0
  33. package/template/.codex/skills/data-analytics/package.json +43 -0
  34. package/template/.codex/skills/data-analytics/scripts/normalize-widget-assets.mjs +75 -0
  35. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/SKILL.md +160 -0
  36. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/agents/openai.yaml +6 -0
  37. package/template/.codex/skills/data-analytics/skills/build-dashboard/SKILL.md +148 -0
  38. package/template/.codex/skills/data-analytics/skills/build-dashboard/agents/openai.yaml +6 -0
  39. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/bi-platform-dashboard.md +18 -0
  40. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/html-dashboard.md +24 -0
  41. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/mcp-artifact-dashboard.md +71 -0
  42. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/streamlit-dashboard.md +85 -0
  43. package/template/.codex/skills/data-analytics/skills/build-report/SKILL.md +207 -0
  44. package/template/.codex/skills/data-analytics/skills/build-report/agents/openai.yaml +6 -0
  45. package/template/.codex/skills/data-analytics/skills/build-report/assets/executive-report-shell.html +70 -0
  46. package/template/.codex/skills/data-analytics/skills/build-report/assets/technical-report-shell.html +66 -0
  47. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/SKILL.md +118 -0
  48. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/agents/openai.yaml +6 -0
  49. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/__init__.py +1 -0
  50. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/cli.py +57 -0
  51. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/constants.py +61 -0
  52. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/docx_writer.py +362 -0
  53. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/html_parser.py +829 -0
  54. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/model.py +30 -0
  55. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/plan.py +129 -0
  56. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/quality.py +374 -0
  57. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/rendering.py +613 -0
  58. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/table_utils.py +54 -0
  59. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/utils.py +16 -0
  60. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc_plan.py +9 -0
  61. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/SKILL.md +78 -0
  62. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/agents/openai.yaml +6 -0
  63. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/scripts/report_to_google_slides.py +2379 -0
  64. package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/SKILL.md +88 -0
  65. package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/agents/openai.yaml +6 -0
  66. package/template/.codex/skills/data-analytics/skills/build-report/specifications/executive-report.md +97 -0
  67. package/template/.codex/skills/data-analytics/skills/build-report/specifications/mcp-app-report.md +59 -0
  68. package/template/.codex/skills/data-analytics/skills/build-report/specifications/technical-report.md +75 -0
  69. package/template/.codex/skills/data-analytics/skills/design-kpis/SKILL.md +103 -0
  70. package/template/.codex/skills/data-analytics/skills/design-kpis/agents/openai.yaml +6 -0
  71. package/template/.codex/skills/data-analytics/skills/gather-business-context/SKILL.md +68 -0
  72. package/template/.codex/skills/data-analytics/skills/gather-business-context/agents/openai.yaml +6 -0
  73. package/template/.codex/skills/data-analytics/skills/index/SKILL.md +251 -0
  74. package/template/.codex/skills/data-analytics/skills/index/agents/openai.yaml +6 -0
  75. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/SKILL.md +131 -0
  76. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/agents/openai.yaml +6 -0
  77. package/template/.codex/skills/data-analytics/skills/kpi-reporting/SKILL.md +141 -0
  78. package/template/.codex/skills/data-analytics/skills/kpi-reporting/agents/openai.yaml +6 -0
  79. package/template/.codex/skills/data-analytics/skills/kpi-reporting/references/report-templates.md +32 -0
  80. package/template/.codex/skills/data-analytics/skills/market-sizing/SKILL.md +106 -0
  81. package/template/.codex/skills/data-analytics/skills/market-sizing/agents/openai.yaml +6 -0
  82. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/SKILL.md +130 -0
  83. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/agents/openai.yaml +6 -0
  84. package/template/.codex/skills/data-analytics/skills/product-business-analysis/SKILL.md +141 -0
  85. package/template/.codex/skills/data-analytics/skills/product-business-analysis/agents/openai.yaml +6 -0
  86. package/template/.codex/skills/data-analytics/skills/spreadsheets/SKILL.md +178 -0
  87. package/template/.codex/skills/data-analytics/skills/spreadsheets/agents/openai.yaml +9 -0
  88. package/template/.codex/skills/data-analytics/skills/spreadsheets/assets/file-spreadsheet.png +0 -0
  89. package/template/.codex/skills/data-analytics/skills/spreadsheets/charts.md +31 -0
  90. package/template/.codex/skills/data-analytics/skills/spreadsheets/references/artifact_tool_api.md +466 -0
  91. package/template/.codex/skills/data-analytics/skills/spreadsheets/style_guidelines.md +99 -0
  92. package/template/.codex/skills/data-analytics/skills/user-context/SKILL.md +195 -0
  93. package/template/.codex/skills/data-analytics/skills/user-context/agents/openai.yaml +6 -0
  94. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/automation-config.md +26 -0
  95. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/source-category-config.json +51 -0
  96. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/user-context-config.md +66 -0
  97. package/template/.codex/skills/data-analytics/skills/user-context/references/automation.md +69 -0
  98. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-examples.md +204 -0
  99. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-state-template.json +87 -0
  100. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding.md +497 -0
  101. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/connector-playbook.md +74 -0
  102. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/setup.md +65 -0
  103. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/skill-template.md +160 -0
  104. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/source-intake.md +75 -0
  105. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/weekly-polling-automation.md +96 -0
  106. package/template/.codex/skills/data-analytics/skills/user-context/references/source-category-runtime.md +263 -0
  107. package/template/.codex/skills/data-analytics/skills/user-context/scripts/data_analytics_preflight.py +1460 -0
  108. package/template/.codex/skills/data-analytics/skills/user-context/scripts/init_user_context_state.py +128 -0
  109. package/template/.codex/skills/data-analytics/skills/user-context/scripts/reset_user_context_state.py +101 -0
  110. package/template/.codex/skills/data-analytics/skills/user-context/scripts/validate_user_context_preflight.py +499 -0
  111. package/template/.codex/skills/data-analytics/skills/user-context/tests/test_state_helpers.py +978 -0
  112. package/template/.codex/skills/data-analytics/skills/validate-data/SKILL.md +190 -0
  113. package/template/.codex/skills/data-analytics/skills/validate-data/agents/openai.yaml +6 -0
  114. package/template/.codex/skills/data-analytics/skills/visualize-data/SKILL.md +157 -0
  115. package/template/.codex/skills/data-analytics/skills/visualize-data/agents/openai.yaml +6 -0
  116. package/template/.codex/skills/data-analytics/skills/visualize-data/references/seaborn-templates.md +774 -0
  117. package/template/.codex/skills/data-analytics/src/DESIGN.md +222 -0
  118. package/template/.codex/skills/data-analytics/src/analytics-app/App.tsx +3666 -0
  119. package/template/.codex/skills/data-analytics/src/analytics-app/analytics-layout.test.mjs +136 -0
  120. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartFrame.tsx +54 -0
  121. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartLegend.tsx +96 -0
  122. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartRenderer.tsx +1647 -0
  123. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartTooltip.tsx +245 -0
  124. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-app-helpers.tsx +462 -0
  125. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-capabilities.ts +107 -0
  126. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-compatibility.ts +164 -0
  127. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-contract.ts +192 -0
  128. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-theme.ts +203 -0
  129. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-tokens.css +619 -0
  130. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-transforms.ts +402 -0
  131. package/template/.codex/skills/data-analytics/src/analytics-app/fonts/SystemSansVariableVF.woff2 +0 -0
  132. package/template/.codex/skills/data-analytics/src/analytics-app/imageExport.ts +370 -0
  133. package/template/.codex/skills/data-analytics/src/analytics-app/layout/AnalyticsLayoutCanvas.tsx +536 -0
  134. package/template/.codex/skills/data-analytics/src/analytics-app/layout/RichMarkdown.tsx +681 -0
  135. package/template/.codex/skills/data-analytics/src/analytics-app/layout/analyticsLayoutCore.ts +164 -0
  136. package/template/.codex/skills/data-analytics/src/analytics-app/main.tsx +21 -0
  137. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/chart_contract.py +472 -0
  138. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/check_analytics_app_runtime_links.py +75 -0
  139. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/design_contract.py +142 -0
  140. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/package_utils.py +142 -0
  141. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/tests/test_package_utils.py +377 -0
  142. package/template/.codex/skills/data-analytics/src/analytics-app/styles.css +3468 -0
  143. package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.d.ts +44 -0
  144. package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.jsx +639 -0
  145. package/template/.codex/skills/data-analytics/src/analytics-app/tables/data-table.css +327 -0
  146. package/template/.codex/skills/data-analytics/src/analytics-app/tokens.css +225 -0
  147. package/template/.codex/skills/data-analytics/src/analytics-app/types.ts +204 -0
  148. package/template/.codex/skills/data-analytics/src/analytics-app-core.md +85 -0
  149. package/template/.codex/skills/data-analytics/src/codex-style-contract.md +30 -0
  150. package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.html +12 -0
  151. package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.jsx +1008 -0
  152. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.css +2117 -0
  153. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.html +122 -0
  154. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.js +3588 -0
  155. package/template/.codex/skills/data-analytics/src/datascience-table-widget.css +483 -0
  156. package/template/.codex/skills/data-analytics/src/datascience-table-widget.html +32 -0
  157. package/template/.codex/skills/data-analytics/src/datascience-table-widget.js +333 -0
  158. package/template/.codex/skills/data-analytics/src/mcp-host.js +153 -0
  159. package/template/.codex/skills/data-analytics/src/recharts-config.js +315 -0
  160. package/template/.codex/skills/data-analytics/src/recharts-renderer.jsx +294 -0
  161. package/template/.codex/skills/data-analytics/src/sql-source-view.css +33 -0
  162. package/template/.codex/skills/data-analytics/src/sql-source-view.js +157 -0
  163. package/template/.codex/skills/data-analytics/src/styles/codex-theme.css +121 -0
  164. package/template/.codex/skills/data-analytics/src/table-renderer.jsx +28 -0
  165. package/template/.codex/skills/data-analytics/tests/chart-transforms.test.mjs +87 -0
  166. package/template/.codex/skills/data-analytics/tests/funnel-smoke.html +105 -0
  167. package/template/.codex/skills/data-analytics/tests/inline-widget-compare.html +233 -0
  168. package/template/.codex/skills/data-analytics/tests/mcp-server.test.mjs +1500 -0
  169. package/template/.codex/skills/data-analytics/tests/native-style-contract.test.mjs +219 -0
  170. package/template/.codex/skills/data-analytics/tests/recharts-config.test.mjs +144 -0
  171. package/template/.codex/skills/data-analytics/tests/recharts-renderer.test.mjs +11 -0
  172. package/template/.codex/skills/data-analytics/tests/rich-markdown.test.mjs +54 -0
  173. package/template/.codex/skills/data-analytics/tests/widget-render-harness.html +321 -0
  174. package/template/.codex/skills/data-analytics/tsconfig.json +19 -0
  175. package/template/.codex/skills/data-analytics/vite.config.ts +46 -0
  176. package/template/.codex/skills/product-design/.app.json +7 -0
  177. package/template/.codex/skills/product-design/.codex-plugin/plugin.json +50 -0
  178. package/template/.codex/skills/product-design/README.md +50 -0
  179. package/template/.codex/skills/product-design/agents/openai.yaml +4 -0
  180. package/template/.codex/skills/product-design/assets/composerIcon.svg +9 -0
  181. package/template/.codex/skills/product-design/assets/logo.png +0 -0
  182. package/template/.codex/skills/product-design/package.json +11 -0
  183. package/template/.codex/skills/product-design/references/browser-order.md +9 -0
  184. package/template/.codex/skills/product-design/references/communication-protocol.md +45 -0
  185. package/template/.codex/skills/product-design/references/critical-overrides.md +58 -0
  186. package/template/.codex/skills/product-design/references/local-prototype-preflight.md +16 -0
  187. package/template/.codex/skills/product-design/scripts/bootstrap-prototype.mjs +147 -0
  188. package/template/.codex/skills/product-design/skills/audit/SKILL.md +159 -0
  189. package/template/.codex/skills/product-design/skills/audit/agents/openai.yaml +6 -0
  190. package/template/.codex/skills/product-design/skills/audit/references/design-audit-framework.md +73 -0
  191. package/template/.codex/skills/product-design/skills/design-qa/SKILL.md +133 -0
  192. package/template/.codex/skills/product-design/skills/design-qa/agents/openai.yaml +6 -0
  193. package/template/.codex/skills/product-design/skills/design-qa/references/qa-rubric.md +61 -0
  194. package/template/.codex/skills/product-design/skills/get-context/SKILL.md +81 -0
  195. package/template/.codex/skills/product-design/skills/get-context/agents/openai.yaml +6 -0
  196. package/template/.codex/skills/product-design/skills/ideate/SKILL.md +179 -0
  197. package/template/.codex/skills/product-design/skills/ideate/agents/openai.yaml +6 -0
  198. package/template/.codex/skills/product-design/skills/image-to-code/SKILL.md +105 -0
  199. package/template/.codex/skills/product-design/skills/image-to-code/agents/openai.yaml +6 -0
  200. package/template/.codex/skills/product-design/skills/index/SKILL.md +126 -0
  201. package/template/.codex/skills/product-design/skills/index/agents/openai.yaml +6 -0
  202. package/template/.codex/skills/product-design/skills/prototype/SKILL.md +128 -0
  203. package/template/.codex/skills/product-design/skills/prototype/agents/openai.yaml +6 -0
  204. package/template/.codex/skills/product-design/skills/prototype/references/existing-codebase-edits.md +18 -0
  205. package/template/.codex/skills/product-design/skills/research/SKILL.md +92 -0
  206. package/template/.codex/skills/product-design/skills/research/agents/openai.yaml +6 -0
  207. package/template/.codex/skills/product-design/skills/share/SKILL.md +41 -0
  208. package/template/.codex/skills/product-design/skills/share/agents/openai.yaml +6 -0
  209. package/template/.codex/skills/product-design/skills/url-to-code/SKILL.md +124 -0
  210. package/template/.codex/skills/product-design/skills/url-to-code/agents/openai.yaml +6 -0
  211. package/template/.codex/skills/product-design/skills/user-context/SKILL.md +147 -0
  212. package/template/.codex/skills/product-design/skills/user-context/agents/openai.yaml +6 -0
  213. package/template/.codex/skills/product-design/skills/user-context/plugin-author-config/user-context-template.md +63 -0
  214. package/template/.codex/skills/product-design/skills/user-context/references/onboarding.md +66 -0
  215. package/template/.codex/skills/product-design/skills/user-context/scripts/init_user_context.py +86 -0
  216. package/template/.codex/skills/product-design/skills/user-context/scripts/user_context_preflight.py +204 -0
  217. package/template/.codex/skills/product-design/templates/prototype/AGENTS.md +7 -0
  218. package/template/.codex/skills/product-design/templates/prototype/index.html +12 -0
  219. package/template/.codex/skills/product-design/templates/prototype/package.json +18 -0
  220. package/template/.codex/skills/product-design/templates/prototype/src/App.jsx +5 -0
  221. package/template/.codex/skills/product-design/templates/prototype/src/main.jsx +10 -0
  222. package/template/.codex/skills/product-design/templates/prototype/src/styles.css +13 -0
  223. package/template/.codex/skills/product-design/templates/prototype/vite.config.mjs +14 -0
  224. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +3 -3
  225. package/template/AGENTS.md +3 -3
  226. package/template/docs/adr/adr-product-design-prototype-entrypoint.md +54 -0
  227. package/template/docs/api/templates/openapi-draft-review-checklist.md +4 -2
  228. package/template/docs/design/README.md +8 -4
  229. package/template/docs/design/templates/interaction-spec-template.md +4 -1
  230. package/template/docs/design/templates/prototype-confirmation-template.md +57 -0
  231. package/template/docs/design/templates/prototype-review-checklist.md +6 -2
  232. package/template/docs/design/templates/state-matrix-template.md +1 -1
  233. package/template/docs/process/harness-executive-blueprint.md +2 -1
  234. package/template/docs/process/harness-process-tailoring.md +1 -1
  235. package/template/docs/process/harness-work-unit-map.md +1 -1
  236. package/template/docs/process/lifecycle-artifact-map.md +4 -3
  237. package/template/docs/process/product-prototype-workflow.md +82 -0
  238. package/template/docs/user-guide/product-lifecycle-workflow.md +2 -2
  239. package/template/docs/user-guide/product-rd-lifecycle-best-practices.md +15 -10
@@ -0,0 +1,333 @@
1
+ import React from "react";
2
+ import { createRoot } from "react-dom/client";
3
+
4
+ import { connectMcpWidgetHost } from "./mcp-host.js";
5
+ import { DataTable } from "./analytics-app/tables/DataTable.jsx";
6
+ import { renderSourceCode, sourceCodeLanguage, sourceCodeText, sourceQueryFromSource } from "./sql-source-view.js";
7
+ import "./styles/codex-theme.css";
8
+ import "./analytics-app/tokens.css";
9
+ import "./analytics-app/tables/data-table.css";
10
+ import "./sql-source-view.css";
11
+ import "./datascience-table-widget.css";
12
+
13
+ connectMcpWidgetHost({
14
+ name: "Data Analytics Table Widget",
15
+ version: "0.1.1",
16
+ availableDisplayModes: ["inline", "fullscreen"],
17
+ });
18
+
19
+
20
+ const TABLE_CARD_PAGE_SIZE = 15;
21
+
22
+ const fallbackPayload = {
23
+ title: "Top segments by week-over-week change",
24
+ subtitle: "Sorted by absolute contribution to the weekly movement.",
25
+ source: {
26
+ label: "Warehouse",
27
+ query: {
28
+ engine: "static-demo",
29
+ id: "table-widget-demo",
30
+ sql: "SELECT segment, wau, wow, driver FROM demo.weekly_segment_movements ORDER BY ABS(wow) DESC LIMIT 5",
31
+ description: "Ranks demo segments by absolute week-over-week movement.",
32
+ executed_at: "2026-05-01T00:00:00Z",
33
+ },
34
+ },
35
+ metrics: [
36
+ { label: "Rows", value: 5 },
37
+ { label: "Window", value: "7d" },
38
+ ],
39
+ columns: [
40
+ { key: "segment", label: "Segment", type: "text" },
41
+ { key: "wau", label: "WAU", type: "number" },
42
+ { key: "wow", label: "WoW", type: "percent" },
43
+ { key: "driver", label: "Driver", type: "text" },
44
+ ],
45
+ rows: [
46
+ { segment: "Team", wau: 182300, wow: 0.083, driver: "Onboarding recovery" },
47
+ { segment: "Enterprise", wau: 109420, wow: 0.041, driver: "Seat expansion" },
48
+ { segment: "Free", wau: 761020, wow: -0.018, driver: "Seasonality" },
49
+ { segment: "Plus", wau: 323110, wow: 0.012, driver: "Normal variance" },
50
+ { segment: "Edu", wau: 38440, wow: -0.031, driver: "Term break" },
51
+ ],
52
+ notes: ["Rows are capped to the current preview."],
53
+ max_rows: 50,
54
+ };
55
+
56
+ let payload = fallbackPayload;
57
+ let displayMode = "inline";
58
+ let lastPayloadSignature = "";
59
+ let tableRoot = null;
60
+
61
+ function decodePayload(raw) {
62
+ if (typeof raw !== "string") return raw;
63
+ try {
64
+ return JSON.parse(raw);
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+
70
+ function pickPayload(raw) {
71
+ raw = decodePayload(raw);
72
+ if (!raw || typeof raw !== "object") return null;
73
+ if (Array.isArray(raw.content)) {
74
+ for (const item of raw.content) {
75
+ const found = pickPayload(item && (item.text || item));
76
+ if (found) return found;
77
+ }
78
+ }
79
+ if (raw.structuredContent && typeof raw.structuredContent === "object") {
80
+ return pickPayload(raw.structuredContent);
81
+ }
82
+ if (raw.payload && typeof raw.payload === "object") {
83
+ return pickPayload(raw.payload);
84
+ }
85
+ if (Array.isArray(raw.rows) || raw.result_table) return raw;
86
+ return null;
87
+ }
88
+
89
+ function payloadSignature(value) {
90
+ try {
91
+ return JSON.stringify(value);
92
+ } catch {
93
+ return String(Date.now());
94
+ }
95
+ }
96
+
97
+ function currentHostPayload() {
98
+ return (
99
+ pickPayload(window.openai && window.openai.toolOutput) ||
100
+ pickPayload(window.openai && window.openai.toolResponseMetadata)
101
+ );
102
+ }
103
+
104
+ function readUrlDisplayMode() {
105
+ try {
106
+ const params = new URLSearchParams(window.location.search);
107
+ const hashParams = new URLSearchParams(window.location.hash.replace(/^#/, ""));
108
+ const raw = (
109
+ params.get("displayMode") ||
110
+ params.get("display_mode") ||
111
+ hashParams.get("displayMode") ||
112
+ hashParams.get("display_mode") ||
113
+ ""
114
+ ).toLowerCase();
115
+ if (raw === "fullscreen" || raw === "full" || raw === "expanded") return "fullscreen";
116
+ if (raw === "inline" || raw === "compact") return "inline";
117
+ } catch {
118
+ return "";
119
+ }
120
+ return "";
121
+ }
122
+
123
+ function setDisplayMode(mode) {
124
+ if (mode !== "inline" && mode !== "fullscreen") return;
125
+ displayMode = mode;
126
+ document.documentElement.dataset.displayMode = mode;
127
+ document.body.dataset.displayMode = mode;
128
+ const widget = document.querySelector(".widget");
129
+ if (widget) widget.dataset.displayMode = mode;
130
+ }
131
+
132
+ function applyHostState(raw) {
133
+ const next = decodePayload(raw);
134
+ if (!next || typeof next !== "object") return;
135
+ const mode =
136
+ next.displayMode ||
137
+ next.display_mode ||
138
+ (next.view && next.view.displayMode) ||
139
+ (next.hostContext && next.hostContext.displayMode) ||
140
+ (next.globals && (next.globals.displayMode || (next.globals.view && next.globals.view.displayMode)));
141
+ if (mode === "inline" || mode === "fullscreen") {
142
+ setDisplayMode(mode);
143
+ renderTable();
144
+ renderQueryPreview();
145
+ }
146
+ }
147
+
148
+ function hostedEmptyPayload() {
149
+ return {
150
+ title: "Data Analytics table",
151
+ rows: [],
152
+ notes: ["Waiting for widget data."],
153
+ max_rows: 50,
154
+ };
155
+ }
156
+
157
+ function applyPayload(raw) {
158
+ const next = pickPayload(raw);
159
+ if (!next) return false;
160
+ const signature = payloadSignature(next);
161
+ if (signature === lastPayloadSignature) return true;
162
+ lastPayloadSignature = signature;
163
+ payload = next;
164
+ render();
165
+ return true;
166
+ }
167
+
168
+ function text(value) {
169
+ return value == null ? "" : String(value);
170
+ }
171
+
172
+ function resultTable() {
173
+ return payload.result_table && typeof payload.result_table === "object" ? payload.result_table : null;
174
+ }
175
+
176
+ function sourceQuery() {
177
+ return sourceQueryFromSource(payload.source);
178
+ }
179
+
180
+ function sourceLabel() {
181
+ const source = payload.source;
182
+ if (source && typeof source === "object" && !Array.isArray(source)) return text(source.label);
183
+ return text(source);
184
+ }
185
+
186
+ function queryText() {
187
+ return sourceCodeText(sourceQuery());
188
+ }
189
+
190
+ function queryLanguage() {
191
+ return sourceCodeLanguage(sourceQuery());
192
+ }
193
+
194
+ function setQueryStatus(message) {
195
+ const status = document.getElementById("query-status");
196
+ if (status) status.textContent = message || "";
197
+ }
198
+
199
+ function renderQueryControls() {
200
+ if (displayMode !== "fullscreen") {
201
+ setQueryStatus("");
202
+ return;
203
+ }
204
+ const source = sourceQuery();
205
+ const table = resultTable();
206
+ const label =
207
+ (source && (source.label || source.id || source.engine)) || sourceLabel();
208
+ const rowCount = table && Number.isFinite(Number(table.row_count)) ? Number(table.row_count) : null;
209
+ const suffix = rowCount != null ? ` · ${new Intl.NumberFormat().format(rowCount)} rows${table.truncated ? " sampled" : ""}` : "";
210
+ setQueryStatus(label ? `${label}${suffix}` : "");
211
+ }
212
+
213
+ function inferColumns(rows) {
214
+ const seen = new Set();
215
+ const columns = [];
216
+ for (const row of rows) {
217
+ if (!row || typeof row !== "object") continue;
218
+ for (const key of Object.keys(row)) {
219
+ if (seen.has(key)) continue;
220
+ seen.add(key);
221
+ columns.push({ key, label: key.replaceAll("_", " ") });
222
+ }
223
+ }
224
+ return columns;
225
+ }
226
+
227
+ function renderTable() {
228
+ const tablePayload = resultTable();
229
+ const rows = Array.isArray(tablePayload?.rows) ? tablePayload.rows : Array.isArray(payload.rows) ? payload.rows : [];
230
+ const columns =
231
+ Array.isArray(tablePayload?.columns) && tablePayload.columns.length
232
+ ? tablePayload.columns
233
+ : Array.isArray(payload.columns) && payload.columns.length
234
+ ? payload.columns
235
+ : inferColumns(rows);
236
+ const maxRows = Math.max(1, Number(payload.max_rows || 50));
237
+ const pageSize = displayMode === "fullscreen" ? Math.max(1, Math.min(rows.length, maxRows)) : TABLE_CARD_PAGE_SIZE;
238
+
239
+ const wrap = document.getElementById("table-wrap");
240
+ if (!wrap) return;
241
+ wrap.className = `table-wrap table-density-dense ${displayMode === "fullscreen" ? "fullscreen" : ""}`;
242
+ if (!tableRoot) tableRoot = createRoot(wrap);
243
+
244
+ tableRoot.render(
245
+ React.createElement(DataTable, {
246
+ columns,
247
+ maxRows,
248
+ pageSize,
249
+ rows,
250
+ showCount: false,
251
+ }),
252
+ );
253
+
254
+ const pagination = document.getElementById("pagination");
255
+ if (pagination) pagination.hidden = true;
256
+
257
+ const count = document.getElementById("count");
258
+ const totalRows = tablePayload && Number.isFinite(Number(tablePayload.row_count)) ? Number(tablePayload.row_count) : rows.length;
259
+ const shownRows = Math.min(rows.length, maxRows);
260
+ count.textContent = rows.length && totalRows > shownRows ? `${shownRows} of ${totalRows} results` : "";
261
+ count.hidden = !count.textContent;
262
+ }
263
+
264
+ function renderQueryPreview() {
265
+ const preview = document.getElementById("query-preview");
266
+ const code = document.getElementById("query-code");
267
+ const heading = document.getElementById("query-heading");
268
+ if (!preview || !code) return;
269
+ const sql = queryText();
270
+ const shouldShow = displayMode === "fullscreen" && Boolean(sql);
271
+ preview.hidden = !shouldShow;
272
+ if (!shouldShow) {
273
+ code.textContent = "";
274
+ return;
275
+ }
276
+ const language = queryLanguage() || "Query";
277
+ if (heading) heading.textContent = language === "SQL" ? "Source SQL" : `Source ${language}`;
278
+ code.dataset.language = language;
279
+ renderSourceCode(code, sql, language);
280
+ }
281
+
282
+ function render() {
283
+ document.getElementById("title").textContent = text(payload.title || "Data Analytics table");
284
+ document.getElementById("subtitle").textContent = text(payload.subtitle);
285
+ document.getElementById("subtitle").hidden = !payload.subtitle;
286
+ renderQueryControls();
287
+ renderTable();
288
+ renderQueryPreview();
289
+
290
+ const notes = document.getElementById("notes");
291
+ notes.innerHTML = "";
292
+ const noteItems = Array.isArray(payload.notes) ? payload.notes : [];
293
+ notes.hidden = !noteItems.length;
294
+ for (const item of noteItems.slice(0, 4)) {
295
+ const li = document.createElement("li");
296
+ li.className = "note";
297
+ li.textContent = item;
298
+ notes.appendChild(li);
299
+ }
300
+ document.getElementById("footer").hidden = !document.getElementById("count").textContent && !noteItems.length;
301
+ }
302
+
303
+ setDisplayMode(readUrlDisplayMode() || "inline");
304
+
305
+ window.addEventListener("message", (event) => {
306
+ applyHostState(event.data);
307
+ applyPayload(event.data);
308
+ });
309
+
310
+ window.addEventListener("openai:set_globals", (event) => {
311
+ const globals = event.detail && event.detail.globals;
312
+ applyHostState(globals);
313
+ if (globals && applyPayload(globals.toolOutput)) return;
314
+ applyPayload(currentHostPayload());
315
+ });
316
+
317
+ if (!applyPayload(currentHostPayload())) {
318
+ const initialPayload = window.openai ? hostedEmptyPayload() : fallbackPayload;
319
+ payload = initialPayload;
320
+ lastPayloadSignature = payloadSignature(initialPayload);
321
+ render();
322
+ }
323
+
324
+ let hostPollAttempts = 0;
325
+ const hostPoll = window.setInterval(() => {
326
+ hostPollAttempts += 1;
327
+ const hostApi = window.openai || {};
328
+ applyHostState(hostApi);
329
+ applyPayload(currentHostPayload());
330
+ if (hostPollAttempts >= 80) {
331
+ window.clearInterval(hostPoll);
332
+ }
333
+ }, 250);
@@ -0,0 +1,153 @@
1
+ import {
2
+ App,
3
+ applyDocumentTheme,
4
+ applyHostFonts,
5
+ applyHostStyleVariables,
6
+ } from "@modelcontextprotocol/ext-apps/app-with-deps";
7
+
8
+ function publishHostGlobals(globals) {
9
+ window.openai = {
10
+ ...(window.openai || {}),
11
+ ...globals,
12
+ };
13
+ window.dispatchEvent(
14
+ new CustomEvent("openai:set_globals", {
15
+ detail: {
16
+ globals: window.openai,
17
+ },
18
+ }),
19
+ );
20
+ }
21
+
22
+ function displayModeDismissedKey(name, mode) {
23
+ return `datascience-widget:${name}:dismissed-initial-${mode}`;
24
+ }
25
+
26
+ function hasDismissedInitialDisplayMode(name, mode) {
27
+ try {
28
+ return window.sessionStorage?.getItem(displayModeDismissedKey(name, mode)) === "1";
29
+ } catch {
30
+ return false;
31
+ }
32
+ }
33
+
34
+ function rememberDismissedInitialDisplayMode(name, mode) {
35
+ try {
36
+ window.sessionStorage?.setItem(displayModeDismissedKey(name, mode), "1");
37
+ } catch {
38
+ // Storage can be unavailable in sandboxed previews.
39
+ }
40
+ }
41
+
42
+ function clearDismissedInitialDisplayMode(name, mode) {
43
+ try {
44
+ window.sessionStorage?.removeItem(displayModeDismissedKey(name, mode));
45
+ } catch {
46
+ // Storage can be unavailable in sandboxed previews.
47
+ }
48
+ }
49
+
50
+ function applyHostContext(context) {
51
+ if (!context) return;
52
+ if (context.theme) applyDocumentTheme(context.theme);
53
+ if (context.styles?.variables) applyHostStyleVariables(context.styles.variables);
54
+ if (context.styles?.css?.fonts) applyHostFonts(context.styles.css.fonts);
55
+
56
+ publishHostGlobals({
57
+ hostContext: context,
58
+ displayMode: context.displayMode,
59
+ availableDisplayModes: context.availableDisplayModes,
60
+ });
61
+ }
62
+
63
+ function normalizeDisplayModeRequest(request) {
64
+ if (typeof request === "string") return { mode: request };
65
+ if (request && typeof request === "object") return request;
66
+ return { mode: "inline" };
67
+ }
68
+
69
+ function normalizeDisplayMode(mode) {
70
+ return mode === "inline" || mode === "fullscreen" || mode === "pip" ? mode : "";
71
+ }
72
+
73
+ async function requestInitialDisplayMode(app, name, mode) {
74
+ const normalized = normalizeDisplayMode(mode);
75
+ if (!normalized) return;
76
+ if (hasDismissedInitialDisplayMode(name, normalized)) return;
77
+
78
+ try {
79
+ const result = await app.requestDisplayMode({ mode: normalized });
80
+ publishHostGlobals({
81
+ displayMode: normalizeDisplayMode(result?.mode || result?.displayMode) || normalized,
82
+ });
83
+ } catch {
84
+ // Hosts may decline an app-start display request; the widget still renders inline.
85
+ }
86
+ }
87
+
88
+ function installHostCompatibilityShim(app, name) {
89
+ const existing = window.openai || {};
90
+ window.openai = existing;
91
+
92
+ if (typeof existing.requestDisplayMode !== "function") {
93
+ existing.requestDisplayMode = async (request) => {
94
+ const normalized = normalizeDisplayModeRequest(request);
95
+ const result = await app.requestDisplayMode(normalized);
96
+ const resultMode = normalizeDisplayMode(result?.mode || result?.displayMode || normalized.mode);
97
+ if (resultMode === "fullscreen") {
98
+ clearDismissedInitialDisplayMode(name, "fullscreen");
99
+ }
100
+ if (resultMode) publishHostGlobals({ displayMode: resultMode });
101
+ return result;
102
+ };
103
+ }
104
+ }
105
+
106
+ export function connectMcpWidgetHost({
107
+ name,
108
+ version,
109
+ availableDisplayModes = ["inline", "fullscreen"],
110
+ initialDisplayMode,
111
+ }) {
112
+ let lastDisplayMode = "";
113
+ const app = new App(
114
+ { name, version },
115
+ { availableDisplayModes },
116
+ { autoResize: true },
117
+ );
118
+ if (window.openai) {
119
+ installHostCompatibilityShim(app, name);
120
+ }
121
+
122
+ app.addEventListener("hostcontextchanged", (context) => {
123
+ const nextDisplayMode = normalizeDisplayMode(context?.displayMode);
124
+ if (lastDisplayMode === "fullscreen" && nextDisplayMode === "inline") {
125
+ rememberDismissedInitialDisplayMode(name, "fullscreen");
126
+ }
127
+ if (nextDisplayMode) lastDisplayMode = nextDisplayMode;
128
+ applyHostContext(context);
129
+ });
130
+
131
+ app.addEventListener("toolresult", (result) => {
132
+ const payload = result?.structuredContent || result;
133
+ publishHostGlobals({ toolOutput: payload });
134
+ window.dispatchEvent(
135
+ new CustomEvent("datascience-widget-tool-result", {
136
+ detail: payload,
137
+ }),
138
+ );
139
+ });
140
+
141
+ app.ready = app
142
+ .connect()
143
+ .then(() => {
144
+ installHostCompatibilityShim(app, name);
145
+ applyHostContext(app.getHostContext());
146
+ return requestInitialDisplayMode(app, name, initialDisplayMode);
147
+ })
148
+ .catch(() => {
149
+ // The static file preview uses the same bundle without an MCP Apps host.
150
+ });
151
+
152
+ return app;
153
+ }