create-yss-spec 1.1.1 → 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 (257) hide show
  1. package/package.json +1 -1
  2. package/template/.agents/skills/high-fidelity-html-prototype/SKILL.md +102 -0
  3. package/template/.codex/skills/data-analytics/.app.json +84 -0
  4. package/template/.codex/skills/data-analytics/.codex-plugin/plugin.json +66 -0
  5. package/template/.codex/skills/data-analytics/.mcp.json +30 -0
  6. package/template/.codex/skills/data-analytics/AGENTS.md +20 -0
  7. package/template/.codex/skills/data-analytics/DEPENDENCIES.MD +27 -0
  8. package/template/.codex/skills/data-analytics/README.md +60 -0
  9. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html +16 -0
  10. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part001 +1 -0
  11. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part002 +1 -0
  12. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part003 +1 -0
  13. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part004 +1 -0
  14. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part005 +1 -0
  15. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part006 +1 -0
  16. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html +16 -0
  17. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part001 +1 -0
  18. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part002 +1 -0
  19. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part003 +1 -0
  20. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part004 +1 -0
  21. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part005 +1 -0
  22. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part006 +1 -0
  23. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part007 +1 -0
  24. package/template/.codex/skills/data-analytics/assets/datascience-small.svg +5 -0
  25. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html +16 -0
  26. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part001 +1 -0
  27. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part002 +1 -0
  28. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part003 +1 -0
  29. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part004 +1 -0
  30. package/template/.codex/skills/data-analytics/assets/datascience.png +0 -0
  31. package/template/.codex/skills/data-analytics/assets/datascience.svg +10 -0
  32. package/template/.codex/skills/data-analytics/mcp/server.cjs +2963 -0
  33. package/template/.codex/skills/data-analytics/package-lock.json +3048 -0
  34. package/template/.codex/skills/data-analytics/package.json +43 -0
  35. package/template/.codex/skills/data-analytics/scripts/normalize-widget-assets.mjs +75 -0
  36. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/SKILL.md +160 -0
  37. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/agents/openai.yaml +6 -0
  38. package/template/.codex/skills/data-analytics/skills/build-dashboard/SKILL.md +148 -0
  39. package/template/.codex/skills/data-analytics/skills/build-dashboard/agents/openai.yaml +6 -0
  40. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/bi-platform-dashboard.md +18 -0
  41. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/html-dashboard.md +24 -0
  42. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/mcp-artifact-dashboard.md +71 -0
  43. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/streamlit-dashboard.md +85 -0
  44. package/template/.codex/skills/data-analytics/skills/build-report/SKILL.md +207 -0
  45. package/template/.codex/skills/data-analytics/skills/build-report/agents/openai.yaml +6 -0
  46. package/template/.codex/skills/data-analytics/skills/build-report/assets/executive-report-shell.html +70 -0
  47. package/template/.codex/skills/data-analytics/skills/build-report/assets/technical-report-shell.html +66 -0
  48. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/SKILL.md +118 -0
  49. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/agents/openai.yaml +6 -0
  50. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/__init__.py +1 -0
  51. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/cli.py +57 -0
  52. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/constants.py +61 -0
  53. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/docx_writer.py +362 -0
  54. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/html_parser.py +829 -0
  55. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/model.py +30 -0
  56. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/plan.py +129 -0
  57. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/quality.py +374 -0
  58. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/rendering.py +613 -0
  59. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/table_utils.py +54 -0
  60. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/utils.py +16 -0
  61. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc_plan.py +9 -0
  62. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/SKILL.md +78 -0
  63. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/agents/openai.yaml +6 -0
  64. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/scripts/report_to_google_slides.py +2379 -0
  65. package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/SKILL.md +88 -0
  66. package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/agents/openai.yaml +6 -0
  67. package/template/.codex/skills/data-analytics/skills/build-report/specifications/executive-report.md +97 -0
  68. package/template/.codex/skills/data-analytics/skills/build-report/specifications/mcp-app-report.md +59 -0
  69. package/template/.codex/skills/data-analytics/skills/build-report/specifications/technical-report.md +75 -0
  70. package/template/.codex/skills/data-analytics/skills/design-kpis/SKILL.md +103 -0
  71. package/template/.codex/skills/data-analytics/skills/design-kpis/agents/openai.yaml +6 -0
  72. package/template/.codex/skills/data-analytics/skills/gather-business-context/SKILL.md +68 -0
  73. package/template/.codex/skills/data-analytics/skills/gather-business-context/agents/openai.yaml +6 -0
  74. package/template/.codex/skills/data-analytics/skills/index/SKILL.md +251 -0
  75. package/template/.codex/skills/data-analytics/skills/index/agents/openai.yaml +6 -0
  76. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/SKILL.md +131 -0
  77. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/agents/openai.yaml +6 -0
  78. package/template/.codex/skills/data-analytics/skills/kpi-reporting/SKILL.md +141 -0
  79. package/template/.codex/skills/data-analytics/skills/kpi-reporting/agents/openai.yaml +6 -0
  80. package/template/.codex/skills/data-analytics/skills/kpi-reporting/references/report-templates.md +32 -0
  81. package/template/.codex/skills/data-analytics/skills/market-sizing/SKILL.md +106 -0
  82. package/template/.codex/skills/data-analytics/skills/market-sizing/agents/openai.yaml +6 -0
  83. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/SKILL.md +130 -0
  84. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/agents/openai.yaml +6 -0
  85. package/template/.codex/skills/data-analytics/skills/product-business-analysis/SKILL.md +141 -0
  86. package/template/.codex/skills/data-analytics/skills/product-business-analysis/agents/openai.yaml +6 -0
  87. package/template/.codex/skills/data-analytics/skills/spreadsheets/SKILL.md +178 -0
  88. package/template/.codex/skills/data-analytics/skills/spreadsheets/agents/openai.yaml +9 -0
  89. package/template/.codex/skills/data-analytics/skills/spreadsheets/assets/file-spreadsheet.png +0 -0
  90. package/template/.codex/skills/data-analytics/skills/spreadsheets/charts.md +31 -0
  91. package/template/.codex/skills/data-analytics/skills/spreadsheets/references/artifact_tool_api.md +466 -0
  92. package/template/.codex/skills/data-analytics/skills/spreadsheets/style_guidelines.md +99 -0
  93. package/template/.codex/skills/data-analytics/skills/user-context/SKILL.md +195 -0
  94. package/template/.codex/skills/data-analytics/skills/user-context/agents/openai.yaml +6 -0
  95. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/automation-config.md +26 -0
  96. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/source-category-config.json +51 -0
  97. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/user-context-config.md +66 -0
  98. package/template/.codex/skills/data-analytics/skills/user-context/references/automation.md +69 -0
  99. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-examples.md +204 -0
  100. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-state-template.json +87 -0
  101. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding.md +497 -0
  102. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/connector-playbook.md +74 -0
  103. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/setup.md +65 -0
  104. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/skill-template.md +160 -0
  105. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/source-intake.md +75 -0
  106. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/weekly-polling-automation.md +96 -0
  107. package/template/.codex/skills/data-analytics/skills/user-context/references/source-category-runtime.md +263 -0
  108. package/template/.codex/skills/data-analytics/skills/user-context/scripts/data_analytics_preflight.py +1460 -0
  109. package/template/.codex/skills/data-analytics/skills/user-context/scripts/init_user_context_state.py +128 -0
  110. package/template/.codex/skills/data-analytics/skills/user-context/scripts/reset_user_context_state.py +101 -0
  111. package/template/.codex/skills/data-analytics/skills/user-context/scripts/validate_user_context_preflight.py +499 -0
  112. package/template/.codex/skills/data-analytics/skills/user-context/tests/test_state_helpers.py +978 -0
  113. package/template/.codex/skills/data-analytics/skills/validate-data/SKILL.md +190 -0
  114. package/template/.codex/skills/data-analytics/skills/validate-data/agents/openai.yaml +6 -0
  115. package/template/.codex/skills/data-analytics/skills/visualize-data/SKILL.md +157 -0
  116. package/template/.codex/skills/data-analytics/skills/visualize-data/agents/openai.yaml +6 -0
  117. package/template/.codex/skills/data-analytics/skills/visualize-data/references/seaborn-templates.md +774 -0
  118. package/template/.codex/skills/data-analytics/src/DESIGN.md +222 -0
  119. package/template/.codex/skills/data-analytics/src/analytics-app/App.tsx +3666 -0
  120. package/template/.codex/skills/data-analytics/src/analytics-app/analytics-layout.test.mjs +136 -0
  121. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartFrame.tsx +54 -0
  122. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartLegend.tsx +96 -0
  123. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartRenderer.tsx +1647 -0
  124. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartTooltip.tsx +245 -0
  125. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-app-helpers.tsx +462 -0
  126. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-capabilities.ts +107 -0
  127. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-compatibility.ts +164 -0
  128. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-contract.ts +192 -0
  129. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-theme.ts +203 -0
  130. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-tokens.css +619 -0
  131. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-transforms.ts +402 -0
  132. package/template/.codex/skills/data-analytics/src/analytics-app/fonts/SystemSansVariableVF.woff2 +0 -0
  133. package/template/.codex/skills/data-analytics/src/analytics-app/imageExport.ts +370 -0
  134. package/template/.codex/skills/data-analytics/src/analytics-app/layout/AnalyticsLayoutCanvas.tsx +536 -0
  135. package/template/.codex/skills/data-analytics/src/analytics-app/layout/RichMarkdown.tsx +681 -0
  136. package/template/.codex/skills/data-analytics/src/analytics-app/layout/analyticsLayoutCore.ts +164 -0
  137. package/template/.codex/skills/data-analytics/src/analytics-app/main.tsx +21 -0
  138. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/chart_contract.py +472 -0
  139. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/check_analytics_app_runtime_links.py +75 -0
  140. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/design_contract.py +142 -0
  141. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/package_utils.py +142 -0
  142. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/tests/test_package_utils.py +377 -0
  143. package/template/.codex/skills/data-analytics/src/analytics-app/styles.css +3468 -0
  144. package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.d.ts +44 -0
  145. package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.jsx +639 -0
  146. package/template/.codex/skills/data-analytics/src/analytics-app/tables/data-table.css +327 -0
  147. package/template/.codex/skills/data-analytics/src/analytics-app/tokens.css +225 -0
  148. package/template/.codex/skills/data-analytics/src/analytics-app/types.ts +204 -0
  149. package/template/.codex/skills/data-analytics/src/analytics-app-core.md +85 -0
  150. package/template/.codex/skills/data-analytics/src/codex-style-contract.md +30 -0
  151. package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.html +12 -0
  152. package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.jsx +1008 -0
  153. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.css +2117 -0
  154. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.html +122 -0
  155. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.js +3588 -0
  156. package/template/.codex/skills/data-analytics/src/datascience-table-widget.css +483 -0
  157. package/template/.codex/skills/data-analytics/src/datascience-table-widget.html +32 -0
  158. package/template/.codex/skills/data-analytics/src/datascience-table-widget.js +333 -0
  159. package/template/.codex/skills/data-analytics/src/mcp-host.js +153 -0
  160. package/template/.codex/skills/data-analytics/src/recharts-config.js +315 -0
  161. package/template/.codex/skills/data-analytics/src/recharts-renderer.jsx +294 -0
  162. package/template/.codex/skills/data-analytics/src/sql-source-view.css +33 -0
  163. package/template/.codex/skills/data-analytics/src/sql-source-view.js +157 -0
  164. package/template/.codex/skills/data-analytics/src/styles/codex-theme.css +121 -0
  165. package/template/.codex/skills/data-analytics/src/table-renderer.jsx +28 -0
  166. package/template/.codex/skills/data-analytics/tests/chart-transforms.test.mjs +87 -0
  167. package/template/.codex/skills/data-analytics/tests/funnel-smoke.html +105 -0
  168. package/template/.codex/skills/data-analytics/tests/inline-widget-compare.html +233 -0
  169. package/template/.codex/skills/data-analytics/tests/mcp-server.test.mjs +1500 -0
  170. package/template/.codex/skills/data-analytics/tests/native-style-contract.test.mjs +219 -0
  171. package/template/.codex/skills/data-analytics/tests/recharts-config.test.mjs +144 -0
  172. package/template/.codex/skills/data-analytics/tests/recharts-renderer.test.mjs +11 -0
  173. package/template/.codex/skills/data-analytics/tests/rich-markdown.test.mjs +54 -0
  174. package/template/.codex/skills/data-analytics/tests/widget-render-harness.html +321 -0
  175. package/template/.codex/skills/data-analytics/tsconfig.json +19 -0
  176. package/template/.codex/skills/data-analytics/vite.config.ts +46 -0
  177. package/template/.codex/skills/high-fidelity-html-prototype/SKILL.md +102 -0
  178. package/template/.codex/skills/high-fidelity-html-prototype/agents/openai.yaml +5 -0
  179. package/template/.codex/skills/product-design/.app.json +7 -0
  180. package/template/.codex/skills/product-design/.codex-plugin/plugin.json +50 -0
  181. package/template/.codex/skills/product-design/README.md +50 -0
  182. package/template/.codex/skills/product-design/agents/openai.yaml +4 -0
  183. package/template/.codex/skills/product-design/assets/composerIcon.svg +9 -0
  184. package/template/.codex/skills/product-design/assets/logo.png +0 -0
  185. package/template/.codex/skills/product-design/package.json +11 -0
  186. package/template/.codex/skills/product-design/references/browser-order.md +9 -0
  187. package/template/.codex/skills/product-design/references/communication-protocol.md +45 -0
  188. package/template/.codex/skills/product-design/references/critical-overrides.md +58 -0
  189. package/template/.codex/skills/product-design/references/local-prototype-preflight.md +16 -0
  190. package/template/.codex/skills/product-design/scripts/bootstrap-prototype.mjs +147 -0
  191. package/template/.codex/skills/product-design/skills/audit/SKILL.md +159 -0
  192. package/template/.codex/skills/product-design/skills/audit/agents/openai.yaml +6 -0
  193. package/template/.codex/skills/product-design/skills/audit/references/design-audit-framework.md +73 -0
  194. package/template/.codex/skills/product-design/skills/design-qa/SKILL.md +133 -0
  195. package/template/.codex/skills/product-design/skills/design-qa/agents/openai.yaml +6 -0
  196. package/template/.codex/skills/product-design/skills/design-qa/references/qa-rubric.md +61 -0
  197. package/template/.codex/skills/product-design/skills/get-context/SKILL.md +81 -0
  198. package/template/.codex/skills/product-design/skills/get-context/agents/openai.yaml +6 -0
  199. package/template/.codex/skills/product-design/skills/ideate/SKILL.md +179 -0
  200. package/template/.codex/skills/product-design/skills/ideate/agents/openai.yaml +6 -0
  201. package/template/.codex/skills/product-design/skills/image-to-code/SKILL.md +105 -0
  202. package/template/.codex/skills/product-design/skills/image-to-code/agents/openai.yaml +6 -0
  203. package/template/.codex/skills/product-design/skills/index/SKILL.md +126 -0
  204. package/template/.codex/skills/product-design/skills/index/agents/openai.yaml +6 -0
  205. package/template/.codex/skills/product-design/skills/prototype/SKILL.md +128 -0
  206. package/template/.codex/skills/product-design/skills/prototype/agents/openai.yaml +6 -0
  207. package/template/.codex/skills/product-design/skills/prototype/references/existing-codebase-edits.md +18 -0
  208. package/template/.codex/skills/product-design/skills/research/SKILL.md +92 -0
  209. package/template/.codex/skills/product-design/skills/research/agents/openai.yaml +6 -0
  210. package/template/.codex/skills/product-design/skills/share/SKILL.md +41 -0
  211. package/template/.codex/skills/product-design/skills/share/agents/openai.yaml +6 -0
  212. package/template/.codex/skills/product-design/skills/url-to-code/SKILL.md +124 -0
  213. package/template/.codex/skills/product-design/skills/url-to-code/agents/openai.yaml +6 -0
  214. package/template/.codex/skills/product-design/skills/user-context/SKILL.md +147 -0
  215. package/template/.codex/skills/product-design/skills/user-context/agents/openai.yaml +6 -0
  216. package/template/.codex/skills/product-design/skills/user-context/plugin-author-config/user-context-template.md +63 -0
  217. package/template/.codex/skills/product-design/skills/user-context/references/onboarding.md +66 -0
  218. package/template/.codex/skills/product-design/skills/user-context/scripts/init_user_context.py +86 -0
  219. package/template/.codex/skills/product-design/skills/user-context/scripts/user_context_preflight.py +204 -0
  220. package/template/.codex/skills/product-design/templates/prototype/AGENTS.md +7 -0
  221. package/template/.codex/skills/product-design/templates/prototype/index.html +12 -0
  222. package/template/.codex/skills/product-design/templates/prototype/package.json +18 -0
  223. package/template/.codex/skills/product-design/templates/prototype/src/App.jsx +5 -0
  224. package/template/.codex/skills/product-design/templates/prototype/src/main.jsx +10 -0
  225. package/template/.codex/skills/product-design/templates/prototype/src/styles.css +13 -0
  226. package/template/.codex/skills/product-design/templates/prototype/vite.config.mjs +14 -0
  227. package/template/.codex/skills/product-design-prototype/SKILL.md +2 -4
  228. package/template/.codex/skills/prototype-review/SKILL.md +7 -7
  229. package/template/.codex/skills/yss-design-system/SKILL.md +4 -2
  230. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +10 -7
  231. package/template/.codex/skills/yss-product-lifecycle/references/artifact-checklist.md +1 -0
  232. package/template/.codex/skills/yss-product-lifecycle/references/stage-routing.md +1 -1
  233. package/template/.codex/skills/yss-ui/SKILL.md +4 -10
  234. package/template/.codex/skills/yss-ui/references/quick-recipes.md +1 -1
  235. package/template/AGENTS.md +9 -3
  236. package/template/CONTEXT.md +1 -0
  237. package/template/docs/adr/adr-product-design-prototype-entrypoint.md +54 -0
  238. package/template/docs/api/templates/openapi-draft-review-checklist.md +5 -1
  239. package/template/docs/design/README.md +13 -6
  240. package/template/docs/design/prototypes/.gitkeep +1 -0
  241. package/template/docs/design/templates/interaction-spec-template.md +8 -3
  242. package/template/docs/design/templates/product-overview-design-template.md +34 -5
  243. package/template/docs/design/templates/prototype-confirmation-template.md +57 -0
  244. package/template/docs/design/templates/prototype-review-checklist.md +7 -3
  245. package/template/docs/design/templates/state-matrix-template.md +1 -1
  246. package/template/docs/process/harness-executive-blueprint.md +6 -1
  247. package/template/docs/process/harness-process-tailoring.md +3 -3
  248. package/template/docs/process/harness-work-unit-map.md +1 -1
  249. package/template/docs/process/lifecycle-artifact-map.md +7 -5
  250. package/template/docs/process/product-prototype-workflow.md +82 -0
  251. package/template/docs/templates/requirement-freeze-template.md +4 -3
  252. package/template/docs/user-guide/product-lifecycle-workflow.md +2 -2
  253. package/template/docs/user-guide/product-rd-lifecycle-best-practices.md +54 -24
  254. package/template/.codex/skills/component-story-prototype/SKILL.md +0 -55
  255. package/template/.codex/skills/component-story-prototype/agents/openai.yaml +0 -4
  256. package/template/.codex/skills/mock-api-prototype/SKILL.md +0 -48
  257. package/template/.codex/skills/mock-api-prototype/agents/openai.yaml +0 -4
@@ -0,0 +1,157 @@
1
+ function text(value) {
2
+ return value == null ? "" : String(value);
3
+ }
4
+
5
+ function collapseSqlWhitespace(sql) {
6
+ let output = "";
7
+ let quote = "";
8
+ let previousWasSpace = false;
9
+ for (let index = 0; index < sql.length; index += 1) {
10
+ const char = sql[index];
11
+ const next = sql[index + 1];
12
+ if (quote) {
13
+ output += char;
14
+ if (char === quote) {
15
+ if (quote === "'" && next === "'") {
16
+ output += next;
17
+ index += 1;
18
+ } else {
19
+ quote = "";
20
+ }
21
+ }
22
+ previousWasSpace = false;
23
+ continue;
24
+ }
25
+ if (char === "'" || char === '"') {
26
+ quote = char;
27
+ output += char;
28
+ previousWasSpace = false;
29
+ continue;
30
+ }
31
+ if (/\s/.test(char)) {
32
+ if (!previousWasSpace) output += " ";
33
+ previousWasSpace = true;
34
+ continue;
35
+ }
36
+ output += char;
37
+ previousWasSpace = false;
38
+ }
39
+ return output.trim();
40
+ }
41
+
42
+ function uppercaseSqlKeywords(sql) {
43
+ return sql.replace(
44
+ /\b(select|from|where|and|or|group|by|order|having|limit|join|left|right|inner|outer|full|cross|on|with|as|case|when|then|else|end|not|in|is|null|between|like|true|false|desc|asc|union|all|over|partition)\b/gi,
45
+ (match) => match.toUpperCase(),
46
+ );
47
+ }
48
+
49
+ function indentContinuation(line) {
50
+ return line
51
+ .replace(/\bAND\b/g, "\n AND")
52
+ .replace(/\bOR\b/g, "\n OR")
53
+ .replace(/\bWHEN\b/g, "\n WHEN")
54
+ .replace(/\bELSE\b/g, "\n ELSE");
55
+ }
56
+
57
+ export function formatSql(sql) {
58
+ const normalized = uppercaseSqlKeywords(collapseSqlWhitespace(text(sql)));
59
+ if (!normalized) return "";
60
+ if (!/\b(SELECT|WITH|FROM|WHERE|ORDER BY|GROUP BY|HAVING|LIMIT)\b/.test(normalized)) {
61
+ return normalized;
62
+ }
63
+
64
+ let formatted = normalized
65
+ .replace(/\s*,\s*/g, ",\n ")
66
+ .replace(/\bWITH\b\s*/g, "WITH\n ")
67
+ .replace(/\bSELECT\b\s*/g, "SELECT\n ")
68
+ .replace(/\bFROM\b\s*/g, "\nFROM ")
69
+ .replace(/\bWHERE\b\s*/g, "\nWHERE\n ")
70
+ .replace(/\bGROUP\s+BY\b\s*/g, "\nGROUP BY\n ")
71
+ .replace(/\bHAVING\b\s*/g, "\nHAVING\n ")
72
+ .replace(/\bORDER\s+BY\b\s*/g, "\nORDER BY\n ")
73
+ .replace(/\bLIMIT\b\s*/g, "\nLIMIT ");
74
+
75
+ formatted = formatted
76
+ .split("\n")
77
+ .map((line) => indentContinuation(line.trimEnd()))
78
+ .join("\n")
79
+ .replace(/\n{3,}/g, "\n\n")
80
+ .replace(/[ \t]+\n/g, "\n")
81
+ .trim();
82
+
83
+ return formatted.endsWith(";") ? formatted : formatted.replace(/\s*;?\s*$/, ";");
84
+ }
85
+
86
+ export function sourceQueryFromSource(source) {
87
+ const sourceObject = source && typeof source === "object" && !Array.isArray(source) ? source : null;
88
+ const query = sourceObject && sourceObject.query && typeof sourceObject.query === "object" && !Array.isArray(sourceObject.query)
89
+ ? sourceObject.query
90
+ : null;
91
+ if (query) {
92
+ return {
93
+ engine: query.engine,
94
+ id: query.id,
95
+ url: query.url,
96
+ sql: query.sql,
97
+ description: query.description,
98
+ language: query.language,
99
+ executed_at: query.executed_at,
100
+ label: sourceObject.label,
101
+ filters: query.filters,
102
+ metric_definitions: query.metric_definitions,
103
+ tables_used: query.tables_used,
104
+ };
105
+ }
106
+ return null;
107
+ }
108
+
109
+ export function sourceCodeText(sourceQuery) {
110
+ const source = sourceQuery && typeof sourceQuery === "object" ? sourceQuery : {};
111
+ const code = text(source.sql).trim();
112
+ return code ? text(source.sql) : "";
113
+ }
114
+
115
+ export function sourceCodeLanguage(sourceQuery) {
116
+ const source = sourceQuery && typeof sourceQuery === "object" ? sourceQuery : {};
117
+ const raw = text(source.language || source.engine).toLowerCase();
118
+ if (raw.includes("python")) return "Python";
119
+ if (raw.includes("sql") || raw.includes("databricks") || raw.includes("trino") || raw.includes("snowflake")) return "SQL";
120
+ return sourceCodeText(sourceQuery) ? "Query" : "";
121
+ }
122
+
123
+ export function formatSourceCode(code, language) {
124
+ return language === "SQL" ? formatSql(code) : text(code);
125
+ }
126
+
127
+ function codeTokenPattern(language) {
128
+ if (language === "Python") {
129
+ return /(#.*|"""[\s\S]*?"""|'''[\s\S]*?'''|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\b(?:and|as|assert|async|await|break|class|continue|def|elif|else|except|False|finally|for|from|if|import|in|is|lambda|None|not|or|pass|raise|return|True|try|while|with|yield)\b|\b\d+(?:\.\d+)?\b)/g;
130
+ }
131
+ return /(--[^\n]*|\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|'(?:''|[^'])*'|\b(?:select|from|where|group|by|order|limit|having|join|left|right|inner|outer|full|cross|on|with|as|case|when|then|else|end|and|or|not|in|is|null|between|like|sum|avg|min|max|count|date_trunc|cast|try_cast|coalesce|distinct|union|all|over|partition|row_number|rank|desc|asc|true|false)\b|\b\d+(?:\.\d+)?\b)/gi;
132
+ }
133
+
134
+ function codeTokenClass(token, language) {
135
+ if (language === "Python" && token.startsWith("#")) return "code-comment";
136
+ if (token.startsWith("--") || token.startsWith("/*")) return "code-comment";
137
+ if (token.startsWith("\"") || token.startsWith("'")) return "code-string";
138
+ if (/^\d/.test(token)) return "code-number";
139
+ return "code-keyword";
140
+ }
141
+
142
+ export function renderSourceCode(root, code, language) {
143
+ root.innerHTML = "";
144
+ const formatted = formatSourceCode(code, language);
145
+ const pattern = codeTokenPattern(language);
146
+ let lastIndex = 0;
147
+ formatted.replace(pattern, (match, _token, offset) => {
148
+ if (offset > lastIndex) root.appendChild(document.createTextNode(formatted.slice(lastIndex, offset)));
149
+ const token = document.createElement("span");
150
+ token.className = `code-token ${codeTokenClass(match, language)}`;
151
+ token.textContent = match;
152
+ root.appendChild(token);
153
+ lastIndex = offset + match.length;
154
+ return match;
155
+ });
156
+ if (lastIndex < formatted.length) root.appendChild(document.createTextNode(formatted.slice(lastIndex)));
157
+ }
@@ -0,0 +1,121 @@
1
+ :root,
2
+ [data-theme="light"] {
3
+ color-scheme: light;
4
+
5
+ --codex-gray-0: #ffffff;
6
+ --codex-gray-25: #fcfcfc;
7
+ --codex-gray-50: #f9f9f9;
8
+ --codex-gray-75: #f3f3f3;
9
+ --codex-gray-100: #ededed;
10
+ --codex-gray-150: #dfdfdf;
11
+ --codex-gray-200: #cdcdcd;
12
+ --codex-gray-300: #afafaf;
13
+ --codex-gray-500: #5d5d5d;
14
+ --codex-gray-800: #212121;
15
+ --codex-gray-900: #181818;
16
+ --codex-gray-1000: #0d0d0d;
17
+
18
+ --codex-accent: var(--color-ring-primary, #339cff);
19
+ --codex-success: var(--color-text-success, #00a240);
20
+ --codex-danger: var(--color-text-danger, #ba2623);
21
+ --codex-warning: var(--color-text-warning, #e0ac00);
22
+
23
+ --codex-font-sans:
24
+ var(--font-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
25
+ --codex-font-mono:
26
+ var(--font-mono, ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, "Liberation Mono", monospace);
27
+
28
+ --codex-bg: var(--color-background-primary, var(--codex-gray-0));
29
+ --codex-bg-under: var(--color-background-secondary, var(--codex-gray-50));
30
+ --codex-panel: var(--color-background-secondary, rgba(255, 255, 255, 0.96));
31
+ --codex-raised: var(--color-background-tertiary, rgba(255, 255, 255, 0.98));
32
+ --codex-control: var(--color-background-ghost, rgba(26, 28, 31, 0.05));
33
+ --codex-control-hover: rgba(26, 28, 31, 0.08);
34
+ --codex-text: var(--color-text-primary, #1a1c1f);
35
+ --codex-text-secondary: var(--color-text-secondary, rgba(26, 28, 31, 0.7));
36
+ --codex-text-tertiary: var(--color-text-tertiary, rgba(26, 28, 31, 0.5));
37
+ --codex-border: var(--color-border-primary, rgba(26, 28, 31, 0.08));
38
+ --codex-border-heavy: var(--color-border-secondary, rgba(26, 28, 31, 0.12));
39
+ --codex-border-light: var(--color-border-tertiary, rgba(26, 28, 31, 0.05));
40
+
41
+ --codex-radius-xs: var(--border-radius-xs, 4px);
42
+ --codex-radius-sm: var(--border-radius-sm, 6px);
43
+ --codex-radius-md: var(--border-radius-md, 8px);
44
+ --codex-radius-lg: var(--border-radius-lg, 10px);
45
+ --codex-radius-xl: var(--border-radius-xl, 12px);
46
+ --codex-radius-2xl: 16px;
47
+ --codex-radius-3xl: 20px;
48
+ --codex-radius-pill: var(--border-radius-full, 9999px);
49
+
50
+ --codex-font-size-xs: var(--font-text-xs-size, 11px);
51
+ --codex-font-size-sm: var(--font-text-sm-size, 12px);
52
+ --codex-font-size-base: var(--font-text-md-size, 14px);
53
+ --codex-font-size-lg: var(--font-text-lg-size, 16px);
54
+ --codex-heading-sm: var(--font-heading-sm-size, 18px);
55
+ --codex-heading-md: var(--font-heading-md-size, 20px);
56
+ --codex-heading-lg: var(--font-heading-lg-size, 24px);
57
+
58
+ --codex-space-1: 4px;
59
+ --codex-space-2: 8px;
60
+ --codex-space-3: 12px;
61
+ --codex-space-4: 16px;
62
+ --codex-space-5: 20px;
63
+ --codex-space-6: 24px;
64
+ --codex-space-8: 32px;
65
+
66
+ --codex-button-height-sm: 28px;
67
+ --codex-button-height: 32px;
68
+ --codex-button-height-lg: 40px;
69
+
70
+ --codex-shadow-hairline: var(--shadow-hairline, 0 0 0 0.5px rgba(0, 0, 0, 0.1));
71
+ --codex-shadow-sm: var(--shadow-sm, 0 1px 2px -1px rgba(0, 0, 0, 0.08));
72
+ --codex-shadow-md: var(--shadow-md, 0 2px 4px -1px rgba(0, 0, 0, 0.08));
73
+ --codex-shadow-lg: var(--shadow-lg, 0 4px 8px -2px rgba(0, 0, 0, 0.1));
74
+
75
+ --codex-transition: 150ms ease;
76
+ --codex-transition-relaxed: 300ms ease;
77
+ }
78
+
79
+ [data-theme="dark"] {
80
+ color-scheme: dark;
81
+
82
+ --codex-bg: var(--color-background-primary, var(--codex-gray-900));
83
+ --codex-bg-under: var(--color-background-secondary, #000000);
84
+ --codex-panel: var(--color-background-secondary, rgba(24, 24, 24, 0.96));
85
+ --codex-raised: var(--color-background-tertiary, rgba(33, 33, 33, 0.98));
86
+ --codex-control: var(--color-background-ghost, rgba(255, 255, 255, 0.05));
87
+ --codex-control-hover: rgba(255, 255, 255, 0.08);
88
+ --codex-text: var(--color-text-primary, var(--codex-gray-0));
89
+ --codex-text-secondary: var(--color-text-secondary, rgba(255, 255, 255, 0.7));
90
+ --codex-text-tertiary: var(--color-text-tertiary, rgba(255, 255, 255, 0.5));
91
+ --codex-border: var(--color-border-primary, rgba(255, 255, 255, 0.08));
92
+ --codex-border-heavy: var(--color-border-secondary, rgba(255, 255, 255, 0.16));
93
+ --codex-border-light: var(--color-border-tertiary, rgba(255, 255, 255, 0.04));
94
+ }
95
+
96
+ * {
97
+ box-sizing: border-box;
98
+ }
99
+
100
+ body {
101
+ margin: 0;
102
+ background: var(--codex-bg);
103
+ color: var(--codex-text);
104
+ font-family: var(--codex-font-sans);
105
+ font-size: var(--codex-font-size-base);
106
+ letter-spacing: 0;
107
+ }
108
+
109
+ button,
110
+ input,
111
+ textarea,
112
+ select {
113
+ font: inherit;
114
+ letter-spacing: 0;
115
+ }
116
+
117
+ .codex-app {
118
+ min-height: 100vh;
119
+ background: var(--codex-bg);
120
+ color: var(--codex-text);
121
+ }
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import { createRoot } from "react-dom/client";
3
+
4
+ import { DataTable } from "./analytics-app/tables/DataTable.jsx";
5
+ import "./analytics-app/tables/data-table.css";
6
+
7
+ export function destroyDataTable(container) {
8
+ if (!container || !container.__datascienceDataTableRoot) return;
9
+ container.__datascienceDataTableRoot.unmount();
10
+ container.__datascienceDataTableRoot = null;
11
+ }
12
+
13
+ export function renderDataTable(container, options = {}) {
14
+ if (!container) return;
15
+ destroyDataTable(container);
16
+ const root = createRoot(container);
17
+ container.__datascienceDataTableRoot = root;
18
+ root.render(
19
+ <DataTable
20
+ columns={options.columns}
21
+ emptyLabel={options.emptyLabel}
22
+ maxRows={options.maxRows}
23
+ pageSize={options.pageSize}
24
+ rows={options.rows}
25
+ showCount={options.showCount}
26
+ />,
27
+ );
28
+ }
@@ -0,0 +1,87 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { Buffer } from "node:buffer";
4
+ import test from "node:test";
5
+ import ts from "typescript";
6
+
7
+ async function loadChartTransforms() {
8
+ const source = await readFile(new URL("../src/analytics-app/charting/chart-transforms.ts", import.meta.url), "utf8");
9
+ const { outputText } = ts.transpileModule(source, {
10
+ compilerOptions: {
11
+ module: ts.ModuleKind.ES2022,
12
+ target: ts.ScriptTarget.ES2022,
13
+ },
14
+ });
15
+ const url = `data:text/javascript;base64,${Buffer.from(outputText).toString("base64")}`;
16
+ return import(url);
17
+ }
18
+
19
+ function dailyRows(startDate, count) {
20
+ const start = new Date(`${startDate}T00:00:00.000Z`);
21
+ return Array.from({ length: count }, (_, index) => {
22
+ const date = new Date(start);
23
+ date.setUTCDate(start.getUTCDate() + index);
24
+ return {
25
+ reporting_date: date.toISOString().slice(0, 10),
26
+ value: index,
27
+ };
28
+ });
29
+ }
30
+
31
+ test("date axis ticks show every label for short windows", async () => {
32
+ const { getDateAxisTicks } = await loadChartTransforms();
33
+
34
+ assert.deepEqual(
35
+ getDateAxisTicks(dailyRows("2026-05-04", 7), "reporting_date", 760),
36
+ [
37
+ "2026-05-04",
38
+ "2026-05-05",
39
+ "2026-05-06",
40
+ "2026-05-07",
41
+ "2026-05-08",
42
+ "2026-05-09",
43
+ "2026-05-10",
44
+ ],
45
+ );
46
+ });
47
+
48
+ test("date axis ticks keep enough context for a two-week daily trend", async () => {
49
+ const { getDateAxisTicks } = await loadChartTransforms();
50
+
51
+ assert.deepEqual(
52
+ getDateAxisTicks(dailyRows("2026-05-04", 14), "reporting_date", 760),
53
+ [
54
+ "2026-05-04",
55
+ "2026-05-06",
56
+ "2026-05-08",
57
+ "2026-05-10",
58
+ "2026-05-12",
59
+ "2026-05-14",
60
+ "2026-05-16",
61
+ "2026-05-17",
62
+ ],
63
+ );
64
+ });
65
+
66
+ test("date axis ticks stay bounded for longer ranges", async () => {
67
+ const { getDateAxisTicks } = await loadChartTransforms();
68
+ const ticks = getDateAxisTicks(dailyRows("2026-01-01", 60), "reporting_date", 760);
69
+
70
+ assert.equal(ticks.length, 8);
71
+ assert.equal(ticks[0], "2026-01-01");
72
+ assert.equal(ticks[ticks.length - 1], "2026-03-01");
73
+ });
74
+
75
+ test("date axis ticks ignore non-date axes", async () => {
76
+ const { getDateAxisTicks } = await loadChartTransforms();
77
+
78
+ assert.equal(getDateAxisTicks([{ x: "alpha" }, { x: "beta" }], "x", 760), undefined);
79
+ });
80
+
81
+ test("word percent units format semantic rates", async () => {
82
+ const { formatValue } = await loadChartTransforms();
83
+
84
+ assert.equal(formatValue(0.6, "compact", "percent"), "60%");
85
+ assert.equal(formatValue(0.625, "number", "percentage"), "62.5%");
86
+ assert.equal(formatValue(60, "compact", "%"), "60%");
87
+ });
@@ -0,0 +1,105 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Funnel smoke</title>
7
+ <style>
8
+ html,
9
+ body {
10
+ height: 100%;
11
+ margin: 0;
12
+ }
13
+
14
+ iframe {
15
+ width: 100%;
16
+ height: 100%;
17
+ border: 0;
18
+ }
19
+ </style>
20
+ </head>
21
+ <body>
22
+ <iframe
23
+ id="chart"
24
+ title="Funnel smoke chart"
25
+ src="./funnel-smoke-widget.html?displayMode=fullscreen&widgetInstanceId=funnel-smoke"
26
+ ></iframe>
27
+ <script>
28
+ const payload = {
29
+ ok: true,
30
+ widget_type: "chart",
31
+ title: "Funnel smoke",
32
+ table: {
33
+ columns: [
34
+ { key: "stage", label: "Stage", type: "text" },
35
+ { key: "value", label: "Value", type: "number", unit: "USD millions" },
36
+ ],
37
+ rows: [
38
+ { stage: "Oct", value: 24.03 },
39
+ { stage: "Nov", value: 24.92 },
40
+ { stage: "Dec", value: 25.88 },
41
+ { stage: "Jan", value: 26.75 },
42
+ { stage: "Feb", value: 27.9 },
43
+ { stage: "Mar", value: 29.18 },
44
+ ],
45
+ row_count: 6,
46
+ truncated: false,
47
+ },
48
+ chart: {
49
+ type: "funnel",
50
+ fields: {
51
+ x: { field: "stage", type: "ordinal" },
52
+ y: { field: "value", type: "quantitative", aggregate: "sum", unit: "USD millions" },
53
+ },
54
+ },
55
+ display: {
56
+ controls: true,
57
+ unit: "USD millions",
58
+ },
59
+ };
60
+
61
+
62
+ function toolOutput(targetWidgetId) {
63
+ return {
64
+ content: [{ type: "text", text: JSON.stringify(payload) }],
65
+ structuredContent: payload,
66
+ isError: false,
67
+ _meta: {
68
+ ["openai/outputTemplate"]: "ui://widget/datascience-chart.html",
69
+ "ui/resourceUri": "ui://widget/datascience-chart.html",
70
+ targetWidgetId,
71
+ },
72
+ };
73
+ }
74
+
75
+ function sendPayload() {
76
+ const frame = document.getElementById("chart");
77
+ const win = frame && frame.contentWindow;
78
+ if (!win) return;
79
+ const output = toolOutput("funnel-smoke");
80
+ win.openai = {
81
+ availableDisplayModes: ["inline", "fullscreen"],
82
+ displayMode: "fullscreen",
83
+ toolOutput: output,
84
+ widgetInstanceId: "funnel-smoke",
85
+ async requestDisplayMode({ mode }) {
86
+ this.displayMode = mode;
87
+ return { mode };
88
+ },
89
+ };
90
+ win.dispatchEvent(
91
+ new win.CustomEvent("openai:set_globals", {
92
+ detail: { globals: { targetWidgetId: "funnel-smoke", toolOutput: output } },
93
+ }),
94
+ );
95
+ win.postMessage(output, "*");
96
+ }
97
+
98
+ document.getElementById("chart").addEventListener("load", () => {
99
+ sendPayload();
100
+ window.setTimeout(sendPayload, 100);
101
+ });
102
+ window.setTimeout(sendPayload, 100);
103
+ </script>
104
+ </body>
105
+ </html>