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,370 @@
1
+ import { useRef, useState } from "react";
2
+
3
+ type PreparedImageExportStatus = "idle" | "pending" | "ready" | "error";
4
+
5
+ type PreparedImageExport = {
6
+ blob?: Blob;
7
+ element: HTMLElement;
8
+ error?: Error;
9
+ promise: Promise<Blob>;
10
+ startedAt: number;
11
+ status: Exclude<PreparedImageExportStatus, "idle">;
12
+ };
13
+
14
+ export type ImageClipboardWriteResult = "native" | "html-fallback";
15
+
16
+ const IMAGE_EXPORT_PREPARE_TTL_MS = 30_000;
17
+
18
+ function shouldIncludeNodeInImageExport(node: unknown): boolean {
19
+ const closest = (node as { closest?: unknown } | null)?.closest;
20
+ if (typeof closest !== "function") return true;
21
+ return closest.call(node, "[data-image-export-exclude='true']") === null;
22
+ }
23
+
24
+ function isVisibleColor(value: string): boolean {
25
+ const color = value.trim().toLowerCase();
26
+ if (!color || color === "transparent") return false;
27
+ if (color.startsWith("rgba(") && /,\s*0(?:\.0+)?\s*\)$/.test(color)) return false;
28
+ return color !== "rgba(0, 0, 0, 0)";
29
+ }
30
+
31
+ function resolvedImageExportBackground(element: HTMLElement): string {
32
+ let current: HTMLElement | null = element;
33
+ while (current) {
34
+ const backgroundColor = getComputedStyle(current).backgroundColor;
35
+ if (isVisibleColor(backgroundColor)) return backgroundColor;
36
+ current = current.parentElement;
37
+ }
38
+
39
+ const bodyBackground = getComputedStyle(document.body).backgroundColor;
40
+ return isVisibleColor(bodyBackground) ? bodyBackground : "#ffffff";
41
+ }
42
+
43
+ function scrubImageExportClone(clone: HTMLElement) {
44
+ clone
45
+ .querySelectorAll<HTMLElement>(
46
+ [
47
+ "[data-image-export-exclude='true']",
48
+ ".analytics-layout-drop-indicator",
49
+ ".analytics-layout-grab-handle",
50
+ ".copy-toast",
51
+ ".menu-surface",
52
+ ".viz-card-menu",
53
+ ".viz-card-menu-button",
54
+ ".viz-card-submenu-list"
55
+ ].join(", ")
56
+ )
57
+ .forEach((node) => node.remove());
58
+
59
+ clone
60
+ .querySelectorAll<HTMLElement>("[aria-expanded='true']")
61
+ .forEach((node) => node.setAttribute("aria-expanded", "false"));
62
+
63
+ clone.classList.remove(
64
+ "intent-zone-after",
65
+ "intent-zone-before",
66
+ "intent-zone-end",
67
+ "intent-zone-pair-after",
68
+ "intent-zone-pair-before",
69
+ "is-dragging",
70
+ "is-drop-target"
71
+ );
72
+ }
73
+
74
+ function createImageExportTarget(element: HTMLElement) {
75
+ const rect = element.getBoundingClientRect();
76
+ const width = Math.max(1, Math.ceil(rect.width || element.offsetWidth || element.scrollWidth));
77
+ const backgroundColor = resolvedImageExportBackground(element);
78
+ const sandbox = document.createElement("div");
79
+ sandbox.setAttribute("data-image-export-sandbox", "true");
80
+ sandbox.style.position = "fixed";
81
+ sandbox.style.top = "0";
82
+ sandbox.style.left = "-100000px";
83
+ sandbox.style.width = `${width}px`;
84
+ sandbox.style.pointerEvents = "none";
85
+ sandbox.style.backgroundColor = backgroundColor;
86
+ sandbox.style.colorScheme = getComputedStyle(document.documentElement).colorScheme;
87
+
88
+ const clone = element.cloneNode(true) as HTMLElement;
89
+ clone.setAttribute("data-image-export-root", "true");
90
+ clone.style.width = `${width}px`;
91
+ clone.style.maxWidth = `${width}px`;
92
+ clone.style.margin = "0";
93
+ clone.style.transform = "none";
94
+ clone.style.pointerEvents = "none";
95
+ scrubImageExportClone(clone);
96
+
97
+ sandbox.appendChild(clone);
98
+ document.body.appendChild(sandbox);
99
+
100
+ return {
101
+ backgroundColor,
102
+ cleanup: () => sandbox.remove(),
103
+ node: clone,
104
+ width
105
+ };
106
+ }
107
+
108
+ function nextAnimationFrame(): Promise<void> {
109
+ return new Promise((resolve) => {
110
+ window.requestAnimationFrame(() => resolve());
111
+ });
112
+ }
113
+
114
+ function normalizePngBlob(blob: Blob): Blob {
115
+ if (blob.type === "image/png") return blob;
116
+ return new Blob([blob], { type: "image/png" });
117
+ }
118
+
119
+ async function renderElementAsImageBlob(element: HTMLElement): Promise<Blob> {
120
+ const exportTarget = createImageExportTarget(element);
121
+ try {
122
+ await document.fonts?.ready;
123
+ await nextAnimationFrame();
124
+ const { getFontEmbedCSS, toBlob } = await import("html-to-image");
125
+ const fontEmbedCSS = await getFontEmbedCSS(document.documentElement, {
126
+ cacheBust: true,
127
+ preferredFontFormat: "woff2"
128
+ }).catch(() => "");
129
+ const height = Math.max(
130
+ 1,
131
+ Math.ceil(exportTarget.node.getBoundingClientRect().height || exportTarget.node.scrollHeight)
132
+ );
133
+ const blob = await toBlob(exportTarget.node, {
134
+ backgroundColor: exportTarget.backgroundColor,
135
+ cacheBust: true,
136
+ filter: shouldIncludeNodeInImageExport,
137
+ fontEmbedCSS: fontEmbedCSS || undefined,
138
+ height,
139
+ pixelRatio: Math.min(2, window.devicePixelRatio || 1),
140
+ preferredFontFormat: "woff2",
141
+ width: exportTarget.width
142
+ });
143
+ if (!blob) throw new Error("Failed to create image.");
144
+ return normalizePngBlob(blob);
145
+ } finally {
146
+ exportTarget.cleanup();
147
+ }
148
+ }
149
+
150
+ function blobToDataUrl(blob: Blob): Promise<string> {
151
+ return new Promise((resolve, reject) => {
152
+ const reader = new FileReader();
153
+ reader.addEventListener("load", () => resolve(String(reader.result)));
154
+ reader.addEventListener("error", () => reject(reader.error ?? new Error("Failed to encode image.")));
155
+ reader.readAsDataURL(blob);
156
+ });
157
+ }
158
+
159
+ function copyRichImageToClipboard(dataUrl: string): boolean {
160
+ const container = document.createElement("div");
161
+ container.contentEditable = "true";
162
+ container.style.position = "fixed";
163
+ container.style.left = "-10000px";
164
+ container.style.top = "0";
165
+ container.innerHTML = `<img src="${dataUrl}" alt="Analytics app card" style="display:block;border:0;outline:0;box-shadow:none;max-width:100%;" />`;
166
+ document.body.appendChild(container);
167
+
168
+ const range = document.createRange();
169
+ range.selectNodeContents(container);
170
+ const selection = window.getSelection();
171
+ selection?.removeAllRanges();
172
+ selection?.addRange(range);
173
+ const copied = document.execCommand("copy");
174
+ selection?.removeAllRanges();
175
+ document.body.removeChild(container);
176
+ return copied;
177
+ }
178
+
179
+ function imageClipboardFallbackBlockedMessage(): string {
180
+ return "Native image copy is blocked in this MCP app surface, and the browser fallback cannot reliably paste into apps like Slack or Codex.";
181
+ }
182
+
183
+
184
+ function canUseRichImageClipboardFallback(): boolean {
185
+ return typeof window === "undefined" || !window.openai;
186
+ }
187
+
188
+ export function shouldOfferImageClipboardCopy(): boolean {
189
+ // The MCP host bridge blocks image clipboard writes, so the HTML fallback is
190
+ // intentionally limited to standalone browser previews.
191
+ return canUseRichImageClipboardFallback();
192
+ }
193
+
194
+ function copyImageWithFallback(dataUrl: string): ImageClipboardWriteResult {
195
+ if (!canUseRichImageClipboardFallback()) {
196
+ throw new Error(imageClipboardFallbackBlockedMessage());
197
+ }
198
+ if (copyRichImageToClipboard(dataUrl)) {
199
+ return "html-fallback";
200
+ }
201
+ throw new Error("Copy is blocked by this browser.");
202
+ }
203
+
204
+ async function writeNativeImageToClipboard(blob: Blob): Promise<void> {
205
+ if (typeof ClipboardItem === "undefined" || !navigator.clipboard?.write) {
206
+ throw new Error("Clipboard image write is unavailable.");
207
+ }
208
+ await navigator.clipboard.write([new ClipboardItem({ "image/png": normalizePngBlob(blob) })]);
209
+ }
210
+
211
+ async function writeNativeImagePromiseToClipboard(blobPromise: Promise<Blob>): Promise<void> {
212
+ if (typeof ClipboardItem === "undefined" || !navigator.clipboard?.write) {
213
+ throw new Error("Clipboard image write is unavailable.");
214
+ }
215
+ await navigator.clipboard.write([
216
+ new ClipboardItem({
217
+ "image/png": blobPromise.then(normalizePngBlob)
218
+ })
219
+ ]);
220
+ }
221
+
222
+ async function copyImageBlob(blob: Blob, dataUrl: string): Promise<ImageClipboardWriteResult> {
223
+ try {
224
+ await writeNativeImageToClipboard(blob);
225
+ return "native";
226
+ } catch {
227
+ return copyImageWithFallback(dataUrl);
228
+ }
229
+ }
230
+
231
+ async function copyPreparedImageBlob(blob: Blob): Promise<ImageClipboardWriteResult> {
232
+ try {
233
+ await writeNativeImageToClipboard(blob);
234
+ return "native";
235
+ } catch {
236
+ const dataUrl = await blobToDataUrl(blob);
237
+ return copyImageWithFallback(dataUrl);
238
+ }
239
+ }
240
+
241
+ export function usePreparedImageExport(elementRef: { current: HTMLElement | null }) {
242
+ const preparedRef = useRef<PreparedImageExport | null>(null);
243
+ const [preparedImageExportStatus, setPreparedImageExportStatus] = useState<PreparedImageExportStatus>("idle");
244
+
245
+ function resetPreparedImageExport() {
246
+ preparedRef.current = null;
247
+ setPreparedImageExportStatus("idle");
248
+ }
249
+
250
+ function prepareImageExport(options: { force?: boolean } = {}): PreparedImageExport | null {
251
+ const element = elementRef.current;
252
+ if (!element) return null;
253
+
254
+ const current = preparedRef.current;
255
+ const now = Date.now();
256
+ const currentIsFresh =
257
+ current &&
258
+ current.element === element &&
259
+ current.status !== "error" &&
260
+ now - current.startedAt < IMAGE_EXPORT_PREPARE_TTL_MS;
261
+ if (current && currentIsFresh && (current.status === "pending" || !options.force)) {
262
+ setPreparedImageExportStatus(current.status);
263
+ return current;
264
+ }
265
+
266
+ const prepared: PreparedImageExport = {
267
+ element,
268
+ promise: Promise.resolve().then(() => renderElementAsImageBlob(element)),
269
+ startedAt: now,
270
+ status: "pending"
271
+ };
272
+ prepared.promise = prepared.promise
273
+ .then((blob) => {
274
+ prepared.blob = blob;
275
+ prepared.status = "ready";
276
+ if (preparedRef.current === prepared) setPreparedImageExportStatus("ready");
277
+ return blob;
278
+ })
279
+ .catch((error) => {
280
+ prepared.error = error instanceof Error ? error : new Error("Failed to prepare image.");
281
+ prepared.status = "error";
282
+ if (preparedRef.current === prepared) {
283
+ preparedRef.current = null;
284
+ setPreparedImageExportStatus("error");
285
+ }
286
+ throw prepared.error;
287
+ });
288
+
289
+ preparedRef.current = prepared;
290
+ setPreparedImageExportStatus("pending");
291
+ return prepared;
292
+ }
293
+
294
+ function getPreparedImageBlob(): Blob | null {
295
+ const prepared = preparedRef.current;
296
+ if (
297
+ !prepared ||
298
+ prepared.element !== elementRef.current ||
299
+ prepared.status !== "ready" ||
300
+ !prepared.blob ||
301
+ Date.now() - prepared.startedAt >= IMAGE_EXPORT_PREPARE_TTL_MS
302
+ ) {
303
+ return null;
304
+ }
305
+ return prepared.blob;
306
+ }
307
+
308
+ return {
309
+ getPreparedImageBlob,
310
+ preparedImageExportStatus,
311
+ prepareImageExport,
312
+ resetPreparedImageExport
313
+ };
314
+ }
315
+
316
+ export async function copyElementAsImage(
317
+ element: HTMLElement,
318
+ preparedBlob?: Blob | null
319
+ ): Promise<ImageClipboardWriteResult> {
320
+ if (preparedBlob) return copyPreparedImageBlob(preparedBlob);
321
+ const blobPromise = renderElementAsImageBlob(element);
322
+ try {
323
+ await writeNativeImagePromiseToClipboard(blobPromise);
324
+ return "native";
325
+ } catch {
326
+ const blob = await blobPromise;
327
+ const dataUrl = await blobToDataUrl(blob);
328
+ return copyImageBlob(blob, dataUrl);
329
+ }
330
+ }
331
+
332
+ export function imageCopySuccessMessage(nativeMessage: string, result: ImageClipboardWriteResult): string {
333
+ if (result === "native") return nativeMessage;
334
+ return `${nativeMessage} Native image copy was blocked, so this browser fallback may not paste into apps like Slack or Codex.`;
335
+ }
336
+
337
+ function copyTextWithSelection(text: string): boolean {
338
+ const textarea = document.createElement("textarea");
339
+ textarea.value = text;
340
+ textarea.setAttribute("readonly", "true");
341
+ textarea.style.position = "fixed";
342
+ textarea.style.left = "-10000px";
343
+ textarea.style.top = "0";
344
+ textarea.style.opacity = "0";
345
+ document.body.appendChild(textarea);
346
+ textarea.focus({ preventScroll: true });
347
+ textarea.select();
348
+ textarea.setSelectionRange(0, text.length);
349
+ let copied = false;
350
+ try {
351
+ copied = document.execCommand("copy");
352
+ } catch {
353
+ copied = false;
354
+ }
355
+ document.body.removeChild(textarea);
356
+ return copied;
357
+ }
358
+
359
+ export async function copyTextToClipboard(text: string): Promise<void> {
360
+ try {
361
+ if (navigator.clipboard?.writeText) {
362
+ await navigator.clipboard.writeText(text);
363
+ return;
364
+ }
365
+ } catch {
366
+ // Fall through to the selection-based fallback.
367
+ }
368
+ if (copyTextWithSelection(text)) return;
369
+ throw new Error("Copy is blocked by this browser.");
370
+ }