create-yss-spec 3.5.2 → 3.5.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 (438) hide show
  1. package/package.json +1 -1
  2. package/src/template/asset-runtime.js +3 -1
  3. package/template/.agents/skills/.strategic-design-skills-manifest.json +1 -1
  4. package/template/.agents/skills/codebase-design/SKILL.md +4 -0
  5. package/template/{.codex/skills/improve-codebase-architecture/SKILL.md → .agents/skills/codebase-design/references/architecture-audit.md} +3 -9
  6. package/template/.agents/skills/frontend-commit/SKILL.md +4 -93
  7. package/template/.agents/skills/git-commit-core/SKILL.md +18 -0
  8. package/template/.agents/skills/java-backend-commit/SKILL.md +4 -96
  9. package/template/.agents/skills/llm-wiki/SKILL.md +12 -13
  10. package/template/.agents/skills/llm-wiki/assets/CLAUDE.md.template +7 -1
  11. package/template/.agents/skills/llm-wiki/references/compile.md +21 -114
  12. package/template/.agents/skills/llm-wiki/references/ingest.md +8 -33
  13. package/template/.agents/skills/llm-wiki/references/lint.md +9 -46
  14. package/template/.agents/skills/llm-wiki/references/query.md +9 -18
  15. package/template/.agents/skills/llm-wiki/references/schema.md +56 -29
  16. package/template/.agents/skills/llm-wiki/references/transactions.md +48 -0
  17. package/template/.agents/skills/llm-wiki/references/writing.md +4 -4
  18. package/template/.agents/skills/llm-wiki/scripts/advise.mjs +46 -58
  19. package/template/.agents/skills/llm-wiki/scripts/advise.test.mjs +11 -16
  20. package/template/.agents/skills/llm-wiki/scripts/core.mjs +262 -0
  21. package/template/.agents/skills/llm-wiki/scripts/extract.mjs +35 -18
  22. package/template/.agents/skills/llm-wiki/scripts/extract.test.mjs +5 -8
  23. package/template/.agents/skills/llm-wiki/scripts/feedback.mjs +51 -0
  24. package/template/.agents/skills/llm-wiki/scripts/inventory.mjs +43 -171
  25. package/template/.agents/skills/llm-wiki/scripts/inventory.test.mjs +25 -18
  26. package/template/.agents/skills/llm-wiki/scripts/lint-wikilinks.mjs +69 -92
  27. package/template/.agents/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +25 -37
  28. package/template/.agents/skills/llm-wiki/scripts/migrate.mjs +51 -0
  29. package/template/.agents/skills/llm-wiki/scripts/query.mjs +149 -0
  30. package/template/.agents/skills/llm-wiki/scripts/regressions.test.mjs +101 -0
  31. package/template/.agents/skills/llm-wiki/scripts/sources.mjs +166 -0
  32. package/template/.agents/skills/llm-wiki/scripts/transaction.mjs +384 -0
  33. package/template/.agents/skills/llm-wiki/scripts/v2.test.mjs +354 -0
  34. package/template/.agents/skills/prototype/LOGIC.md +1 -1
  35. package/template/.agents/skills/prototype/SKILL.md +5 -19
  36. package/template/.agents/skills/setup-matt-pocock-skills/SKILL.md +3 -3
  37. package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  38. package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +2 -3
  39. package/template/.agents/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +14 -0
  40. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +8 -8
  41. package/template/.agents/skills/yss-product-lifecycle/references/external-input-questionnaire.md +19 -0
  42. package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  43. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +20 -4
  44. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  45. package/template/.agents/skills/yss-product-lifecycle/references/plan-requirements.md +10 -0
  46. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +1 -1
  47. package/template/.agents/skills/yss-research/SKILL.md +4 -0
  48. package/template/.codex/skills/codebase-design/SKILL.md +4 -0
  49. package/template/{.pi/skills/improve-codebase-architecture/SKILL.md → .codex/skills/codebase-design/references/architecture-audit.md} +3 -9
  50. package/template/.codex/skills/frontend-commit/SKILL.md +4 -93
  51. package/template/.codex/skills/git-commit-core/SKILL.md +18 -0
  52. package/template/.codex/skills/java-backend-commit/SKILL.md +4 -96
  53. package/template/.codex/skills/llm-wiki/SKILL.md +12 -13
  54. package/template/.codex/skills/llm-wiki/assets/CLAUDE.md.template +7 -1
  55. package/template/.codex/skills/llm-wiki/references/compile.md +21 -114
  56. package/template/.codex/skills/llm-wiki/references/ingest.md +8 -33
  57. package/template/.codex/skills/llm-wiki/references/lint.md +9 -46
  58. package/template/.codex/skills/llm-wiki/references/query.md +9 -18
  59. package/template/.codex/skills/llm-wiki/references/schema.md +56 -29
  60. package/template/.codex/skills/llm-wiki/references/transactions.md +48 -0
  61. package/template/.codex/skills/llm-wiki/references/writing.md +4 -4
  62. package/template/.codex/skills/llm-wiki/scripts/advise.mjs +46 -58
  63. package/template/.codex/skills/llm-wiki/scripts/advise.test.mjs +11 -16
  64. package/template/.codex/skills/llm-wiki/scripts/core.mjs +262 -0
  65. package/template/.codex/skills/llm-wiki/scripts/extract.mjs +35 -18
  66. package/template/.codex/skills/llm-wiki/scripts/extract.test.mjs +5 -8
  67. package/template/.codex/skills/llm-wiki/scripts/feedback.mjs +51 -0
  68. package/template/.codex/skills/llm-wiki/scripts/inventory.mjs +43 -171
  69. package/template/.codex/skills/llm-wiki/scripts/inventory.test.mjs +25 -18
  70. package/template/.codex/skills/llm-wiki/scripts/lint-wikilinks.mjs +69 -92
  71. package/template/.codex/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +25 -37
  72. package/template/.codex/skills/llm-wiki/scripts/migrate.mjs +51 -0
  73. package/template/.codex/skills/llm-wiki/scripts/query.mjs +149 -0
  74. package/template/.codex/skills/llm-wiki/scripts/regressions.test.mjs +101 -0
  75. package/template/.codex/skills/llm-wiki/scripts/sources.mjs +166 -0
  76. package/template/.codex/skills/llm-wiki/scripts/transaction.mjs +384 -0
  77. package/template/.codex/skills/llm-wiki/scripts/v2.test.mjs +354 -0
  78. package/template/.codex/skills/prototype/LOGIC.md +1 -1
  79. package/template/.codex/skills/prototype/SKILL.md +5 -19
  80. package/template/.codex/skills/setup-matt-pocock-skills/SKILL.md +3 -3
  81. package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  82. package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +2 -3
  83. package/template/.codex/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +14 -0
  84. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +8 -8
  85. package/template/.codex/skills/yss-product-lifecycle/references/external-input-questionnaire.md +19 -0
  86. package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  87. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +20 -4
  88. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  89. package/template/.codex/skills/yss-product-lifecycle/references/plan-requirements.md +10 -0
  90. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +1 -1
  91. package/template/.codex/skills/yss-research/SKILL.md +4 -0
  92. package/template/.cursor/skills/codebase-design/SKILL.md +4 -0
  93. package/template/.cursor/skills/{improve-codebase-architecture/SKILL.md → codebase-design/references/architecture-audit.md} +3 -9
  94. package/template/.cursor/skills/frontend-commit/SKILL.md +4 -93
  95. package/template/.cursor/skills/git-commit-core/SKILL.md +18 -0
  96. package/template/.cursor/skills/java-backend-commit/SKILL.md +4 -96
  97. package/template/.cursor/skills/llm-wiki/SKILL.md +12 -13
  98. package/template/.cursor/skills/llm-wiki/assets/CLAUDE.md.template +7 -1
  99. package/template/.cursor/skills/llm-wiki/references/compile.md +21 -114
  100. package/template/.cursor/skills/llm-wiki/references/ingest.md +8 -33
  101. package/template/.cursor/skills/llm-wiki/references/lint.md +9 -46
  102. package/template/.cursor/skills/llm-wiki/references/query.md +9 -18
  103. package/template/.cursor/skills/llm-wiki/references/schema.md +56 -29
  104. package/template/.cursor/skills/llm-wiki/references/transactions.md +48 -0
  105. package/template/.cursor/skills/llm-wiki/references/writing.md +4 -4
  106. package/template/.cursor/skills/llm-wiki/scripts/advise.mjs +46 -58
  107. package/template/.cursor/skills/llm-wiki/scripts/advise.test.mjs +11 -16
  108. package/template/.cursor/skills/llm-wiki/scripts/core.mjs +262 -0
  109. package/template/.cursor/skills/llm-wiki/scripts/extract.mjs +35 -18
  110. package/template/.cursor/skills/llm-wiki/scripts/extract.test.mjs +5 -8
  111. package/template/.cursor/skills/llm-wiki/scripts/feedback.mjs +51 -0
  112. package/template/.cursor/skills/llm-wiki/scripts/inventory.mjs +43 -171
  113. package/template/.cursor/skills/llm-wiki/scripts/inventory.test.mjs +25 -18
  114. package/template/.cursor/skills/llm-wiki/scripts/lint-wikilinks.mjs +69 -92
  115. package/template/.cursor/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +25 -37
  116. package/template/.cursor/skills/llm-wiki/scripts/migrate.mjs +51 -0
  117. package/template/.cursor/skills/llm-wiki/scripts/query.mjs +149 -0
  118. package/template/.cursor/skills/llm-wiki/scripts/regressions.test.mjs +101 -0
  119. package/template/.cursor/skills/llm-wiki/scripts/sources.mjs +166 -0
  120. package/template/.cursor/skills/llm-wiki/scripts/transaction.mjs +384 -0
  121. package/template/.cursor/skills/llm-wiki/scripts/v2.test.mjs +354 -0
  122. package/template/.cursor/skills/prototype/LOGIC.md +1 -1
  123. package/template/.cursor/skills/prototype/SKILL.md +5 -19
  124. package/template/.cursor/skills/setup-matt-pocock-skills/SKILL.md +3 -3
  125. package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  126. package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +2 -3
  127. package/template/.cursor/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +14 -0
  128. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +8 -8
  129. package/template/.cursor/skills/yss-product-lifecycle/references/external-input-questionnaire.md +19 -0
  130. package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  131. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +20 -4
  132. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  133. package/template/.cursor/skills/yss-product-lifecycle/references/plan-requirements.md +10 -0
  134. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +1 -1
  135. package/template/.cursor/skills/yss-research/SKILL.md +4 -0
  136. package/template/.pi/skills/codebase-design/SKILL.md +4 -0
  137. package/template/{.agents/skills/improve-codebase-architecture/SKILL.md → .pi/skills/codebase-design/references/architecture-audit.md} +3 -9
  138. package/template/.pi/skills/frontend-commit/SKILL.md +4 -93
  139. package/template/.pi/skills/git-commit-core/SKILL.md +18 -0
  140. package/template/.pi/skills/java-backend-commit/SKILL.md +4 -96
  141. package/template/.pi/skills/llm-wiki/SKILL.md +12 -13
  142. package/template/.pi/skills/llm-wiki/assets/CLAUDE.md.template +7 -1
  143. package/template/.pi/skills/llm-wiki/references/compile.md +21 -114
  144. package/template/.pi/skills/llm-wiki/references/ingest.md +8 -33
  145. package/template/.pi/skills/llm-wiki/references/lint.md +9 -46
  146. package/template/.pi/skills/llm-wiki/references/query.md +9 -18
  147. package/template/.pi/skills/llm-wiki/references/schema.md +56 -29
  148. package/template/.pi/skills/llm-wiki/references/transactions.md +48 -0
  149. package/template/.pi/skills/llm-wiki/references/writing.md +4 -4
  150. package/template/.pi/skills/llm-wiki/scripts/advise.mjs +46 -58
  151. package/template/.pi/skills/llm-wiki/scripts/advise.test.mjs +11 -16
  152. package/template/.pi/skills/llm-wiki/scripts/core.mjs +262 -0
  153. package/template/.pi/skills/llm-wiki/scripts/extract.mjs +35 -18
  154. package/template/.pi/skills/llm-wiki/scripts/extract.test.mjs +5 -8
  155. package/template/.pi/skills/llm-wiki/scripts/feedback.mjs +51 -0
  156. package/template/.pi/skills/llm-wiki/scripts/inventory.mjs +43 -171
  157. package/template/.pi/skills/llm-wiki/scripts/inventory.test.mjs +25 -18
  158. package/template/.pi/skills/llm-wiki/scripts/lint-wikilinks.mjs +69 -92
  159. package/template/.pi/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +25 -37
  160. package/template/.pi/skills/llm-wiki/scripts/migrate.mjs +51 -0
  161. package/template/.pi/skills/llm-wiki/scripts/query.mjs +149 -0
  162. package/template/.pi/skills/llm-wiki/scripts/regressions.test.mjs +101 -0
  163. package/template/.pi/skills/llm-wiki/scripts/sources.mjs +166 -0
  164. package/template/.pi/skills/llm-wiki/scripts/transaction.mjs +384 -0
  165. package/template/.pi/skills/llm-wiki/scripts/v2.test.mjs +354 -0
  166. package/template/.pi/skills/prototype/LOGIC.md +1 -1
  167. package/template/.pi/skills/prototype/SKILL.md +5 -19
  168. package/template/.pi/skills/setup-matt-pocock-skills/SKILL.md +3 -3
  169. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  170. package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +2 -3
  171. package/template/.pi/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +14 -0
  172. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +8 -8
  173. package/template/.pi/skills/yss-product-lifecycle/references/external-input-questionnaire.md +19 -0
  174. package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  175. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +20 -4
  176. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  177. package/template/.pi/skills/yss-product-lifecycle/references/plan-requirements.md +10 -0
  178. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +1 -1
  179. package/template/.pi/skills/yss-research/SKILL.md +4 -0
  180. package/template/.template-spec/agents/README.md +1 -1
  181. package/template/.template-spec/agents/digital-human-roles.yaml +1 -1
  182. package/template/.template-spec/agents/skill-migrations.md +15 -0
  183. package/template/.template-spec/agents/yss-skill-registry.yaml +10 -29
  184. package/template/.template-spec/architecture/README.md +3 -34
  185. package/template/.template-spec/plan/templates/competitive-analysis-template.md +2 -2
  186. package/template/.template-spec/process/contract-reading.md +24 -0
  187. package/template/.template-spec/process/lifecycle-registry-baseline.json +3 -1
  188. package/template/.template-spec/process/lifecycle-registry.yaml +6 -0
  189. package/template/.template-spec/process/research-completion.md +23 -0
  190. package/template/.template-spec/process/schemas/digital-human-task-package.schema.json +202 -12
  191. package/template/.template-spec/process/schemas/frontend-implementation-evidence.schema.json +7 -15
  192. package/template/.template-spec/process/subagent-collaboration.md +8 -0
  193. package/template/.template-spec/process/templates/frontend-implementation-verification-template.yaml +15 -1
  194. package/template/AGENTS.md +1 -1
  195. package/template/CONTEXT.md +5 -1
  196. package/template/README.md +12 -24
  197. package/template/scripts/contract +5 -5
  198. package/template/scripts/lib/contract-views.mjs +57 -2
  199. package/template/scripts/lib/execution-evidence.mjs +51 -0
  200. package/template/scripts/lib/harness-execution-scope.mjs +1 -1
  201. package/template/scripts/lib/implementation-contract-compiler.mjs +2 -0
  202. package/template/scripts/lib/lifecycle-context-query.mjs +15 -3
  203. package/template/scripts/lib/lifecycle-status.mjs +32 -6
  204. package/template/scripts/lib/lifecycle-transition.mjs +19 -1
  205. package/template/scripts/lib/maintenance-research.mjs +63 -0
  206. package/template/scripts/lib/read-only-intake.mjs +132 -0
  207. package/template/scripts/lib/skill-registry.mjs +2 -1
  208. package/template/scripts/lib/skill-supply-chain.mjs +4 -0
  209. package/template/scripts/lib/slice-task-package.mjs +1 -1
  210. package/template/scripts/lib/task-package.mjs +9 -2
  211. package/template/scripts/lifecycle-status +2 -2
  212. package/template/scripts/prepare-read-only-intake +16 -0
  213. package/template/scripts/run-read-only-intake +14 -0
  214. package/template/scripts/verify-digital-human-task-package +2 -2
  215. package/template/scripts/verify-frontend-implementation-evidence +24 -1
  216. package/template/scripts/verify-maintenance-research +13 -0
  217. package/template/skills-lock.json +19 -76
  218. package/template.manifest.json +118 -29
  219. package/template.snapshot.json +5 -6
  220. package/template/.agents/skills/grill-with-docs/SKILL.md +0 -20
  221. package/template/.agents/skills/grill-with-docs/agents/openai.yaml +0 -5
  222. package/template/.agents/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  223. package/template/.agents/skills/prototype/UI.md +0 -112
  224. package/template/.agents/skills/setup-matt-pocock-skills/domain.md +0 -37
  225. package/template/.agents/skills/to-questionnaire/SKILL.md +0 -55
  226. package/template/.agents/skills/to-questionnaire/agents/openai.yaml +0 -5
  227. package/template/.agents/skills/wait-what/SKILL.md +0 -7
  228. package/template/.agents/skills/wait-what/agents/openai.yaml +0 -5
  229. package/template/.codex/skills/data-analytics/.app.json +0 -84
  230. package/template/.codex/skills/data-analytics/.codex-plugin/plugin.json +0 -66
  231. package/template/.codex/skills/data-analytics/.mcp.json +0 -30
  232. package/template/.codex/skills/data-analytics/AGENTS.md +0 -20
  233. package/template/.codex/skills/data-analytics/DEPENDENCIES.MD +0 -27
  234. package/template/.codex/skills/data-analytics/README.md +0 -60
  235. package/template/.codex/skills/data-analytics/__yss_dotfile__.gitignore +0 -2
  236. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html +0 -16
  237. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part001 +0 -1
  238. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part002 +0 -1
  239. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part003 +0 -1
  240. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part004 +0 -1
  241. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part005 +0 -1
  242. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part006 +0 -1
  243. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html +0 -16
  244. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part001 +0 -1
  245. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part002 +0 -1
  246. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part003 +0 -1
  247. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part004 +0 -1
  248. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part005 +0 -1
  249. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part006 +0 -1
  250. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part007 +0 -1
  251. package/template/.codex/skills/data-analytics/assets/datascience-small.svg +0 -5
  252. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html +0 -16
  253. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part001 +0 -1
  254. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part002 +0 -1
  255. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part003 +0 -1
  256. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part004 +0 -1
  257. package/template/.codex/skills/data-analytics/assets/datascience.png +0 -0
  258. package/template/.codex/skills/data-analytics/assets/datascience.svg +0 -10
  259. package/template/.codex/skills/data-analytics/mcp/server.cjs +0 -2964
  260. package/template/.codex/skills/data-analytics/package-lock.json +0 -3048
  261. package/template/.codex/skills/data-analytics/package.json +0 -43
  262. package/template/.codex/skills/data-analytics/scripts/normalize-widget-assets.mjs +0 -75
  263. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/SKILL.md +0 -137
  264. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/agents/openai.yaml +0 -6
  265. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/references/quality-checks.md +0 -29
  266. package/template/.codex/skills/data-analytics/skills/build-dashboard/SKILL.md +0 -148
  267. package/template/.codex/skills/data-analytics/skills/build-dashboard/agents/openai.yaml +0 -6
  268. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/bi-platform-dashboard.md +0 -18
  269. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/html-dashboard.md +0 -24
  270. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/mcp-artifact-dashboard.md +0 -71
  271. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/streamlit-dashboard.md +0 -85
  272. package/template/.codex/skills/data-analytics/skills/build-report/SKILL.md +0 -207
  273. package/template/.codex/skills/data-analytics/skills/build-report/agents/openai.yaml +0 -6
  274. package/template/.codex/skills/data-analytics/skills/build-report/assets/executive-report-shell.html +0 -70
  275. package/template/.codex/skills/data-analytics/skills/build-report/assets/technical-report-shell.html +0 -66
  276. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/SKILL.md +0 -108
  277. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/agents/openai.yaml +0 -6
  278. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/__init__.py +0 -1
  279. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/cli.py +0 -52
  280. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/constants.py +0 -61
  281. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/docx_writer.py +0 -362
  282. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/html_parser.py +0 -829
  283. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/model.py +0 -30
  284. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/plan.py +0 -127
  285. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/quality.py +0 -374
  286. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/rendering.py +0 -613
  287. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/table_utils.py +0 -54
  288. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/utils.py +0 -16
  289. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc_plan.py +0 -9
  290. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/tests/test_delivery_plan.py +0 -45
  291. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/SKILL.md +0 -77
  292. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/agents/openai.yaml +0 -6
  293. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/scripts/report_to_google_slides.py +0 -2379
  294. package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/SKILL.md +0 -88
  295. package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/agents/openai.yaml +0 -6
  296. package/template/.codex/skills/data-analytics/skills/build-report/specifications/executive-report.md +0 -97
  297. package/template/.codex/skills/data-analytics/skills/build-report/specifications/mcp-app-report.md +0 -59
  298. package/template/.codex/skills/data-analytics/skills/build-report/specifications/technical-report.md +0 -75
  299. package/template/.codex/skills/data-analytics/skills/design-kpis/SKILL.md +0 -103
  300. package/template/.codex/skills/data-analytics/skills/design-kpis/agents/openai.yaml +0 -6
  301. package/template/.codex/skills/data-analytics/skills/gather-business-context/SKILL.md +0 -68
  302. package/template/.codex/skills/data-analytics/skills/gather-business-context/agents/openai.yaml +0 -6
  303. package/template/.codex/skills/data-analytics/skills/index/SKILL.md +0 -251
  304. package/template/.codex/skills/data-analytics/skills/index/agents/openai.yaml +0 -6
  305. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/SKILL.md +0 -131
  306. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/agents/openai.yaml +0 -6
  307. package/template/.codex/skills/data-analytics/skills/kpi-reporting/SKILL.md +0 -141
  308. package/template/.codex/skills/data-analytics/skills/kpi-reporting/agents/openai.yaml +0 -6
  309. package/template/.codex/skills/data-analytics/skills/kpi-reporting/references/report-templates.md +0 -32
  310. package/template/.codex/skills/data-analytics/skills/market-sizing/SKILL.md +0 -106
  311. package/template/.codex/skills/data-analytics/skills/market-sizing/agents/openai.yaml +0 -6
  312. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/SKILL.md +0 -130
  313. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/agents/openai.yaml +0 -6
  314. package/template/.codex/skills/data-analytics/skills/product-business-analysis/SKILL.md +0 -141
  315. package/template/.codex/skills/data-analytics/skills/product-business-analysis/agents/openai.yaml +0 -6
  316. package/template/.codex/skills/data-analytics/skills/spreadsheets/SKILL.md +0 -178
  317. package/template/.codex/skills/data-analytics/skills/spreadsheets/agents/openai.yaml +0 -9
  318. package/template/.codex/skills/data-analytics/skills/spreadsheets/assets/file-spreadsheet.png +0 -0
  319. package/template/.codex/skills/data-analytics/skills/spreadsheets/charts.md +0 -31
  320. package/template/.codex/skills/data-analytics/skills/spreadsheets/references/artifact_tool_api.md +0 -466
  321. package/template/.codex/skills/data-analytics/skills/spreadsheets/style_guidelines.md +0 -99
  322. package/template/.codex/skills/data-analytics/skills/user-context/SKILL.md +0 -197
  323. package/template/.codex/skills/data-analytics/skills/user-context/agents/openai.yaml +0 -6
  324. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/automation-config.md +0 -26
  325. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/source-category-config.json +0 -51
  326. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/user-context-config.md +0 -66
  327. package/template/.codex/skills/data-analytics/skills/user-context/references/automation.md +0 -69
  328. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-examples.md +0 -204
  329. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-state-template.json +0 -87
  330. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding.md +0 -497
  331. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/connector-playbook.md +0 -74
  332. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/setup.md +0 -65
  333. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/skill-template.md +0 -160
  334. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/source-intake.md +0 -75
  335. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/weekly-polling-automation.md +0 -96
  336. package/template/.codex/skills/data-analytics/skills/user-context/references/source-category-runtime.md +0 -263
  337. package/template/.codex/skills/data-analytics/skills/user-context/scripts/data_analytics_preflight.py +0 -1462
  338. package/template/.codex/skills/data-analytics/skills/user-context/scripts/init_user_context_state.py +0 -128
  339. package/template/.codex/skills/data-analytics/skills/user-context/scripts/reset_user_context_state.py +0 -101
  340. package/template/.codex/skills/data-analytics/skills/user-context/scripts/validate_user_context_preflight.py +0 -499
  341. package/template/.codex/skills/data-analytics/skills/user-context/tests/test_state_helpers.py +0 -978
  342. package/template/.codex/skills/data-analytics/skills/validate-data/SKILL.md +0 -126
  343. package/template/.codex/skills/data-analytics/skills/validate-data/agents/openai.yaml +0 -6
  344. package/template/.codex/skills/data-analytics/skills/validate-data/references/validation-methods.md +0 -70
  345. package/template/.codex/skills/data-analytics/skills/visualize-data/SKILL.md +0 -157
  346. package/template/.codex/skills/data-analytics/skills/visualize-data/agents/openai.yaml +0 -6
  347. package/template/.codex/skills/data-analytics/skills/visualize-data/references/seaborn-templates.md +0 -774
  348. package/template/.codex/skills/data-analytics/src/DESIGN.md +0 -222
  349. package/template/.codex/skills/data-analytics/src/analytics-app/App.tsx +0 -3666
  350. package/template/.codex/skills/data-analytics/src/analytics-app/analytics-layout.test.mjs +0 -136
  351. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartFrame.tsx +0 -54
  352. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartLegend.tsx +0 -96
  353. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartRenderer.tsx +0 -1647
  354. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartTooltip.tsx +0 -245
  355. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-app-helpers.tsx +0 -462
  356. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-capabilities.ts +0 -107
  357. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-compatibility.ts +0 -164
  358. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-contract.ts +0 -192
  359. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-theme.ts +0 -203
  360. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-tokens.css +0 -619
  361. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-transforms.ts +0 -402
  362. package/template/.codex/skills/data-analytics/src/analytics-app/fonts/SystemSansVariableVF.woff2 +0 -0
  363. package/template/.codex/skills/data-analytics/src/analytics-app/imageExport.ts +0 -370
  364. package/template/.codex/skills/data-analytics/src/analytics-app/layout/AnalyticsLayoutCanvas.tsx +0 -536
  365. package/template/.codex/skills/data-analytics/src/analytics-app/layout/RichMarkdown.tsx +0 -681
  366. package/template/.codex/skills/data-analytics/src/analytics-app/layout/analyticsLayoutCore.ts +0 -164
  367. package/template/.codex/skills/data-analytics/src/analytics-app/main.tsx +0 -21
  368. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/chart_contract.py +0 -472
  369. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/check_analytics_app_runtime_links.py +0 -75
  370. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/design_contract.py +0 -142
  371. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/package_utils.py +0 -142
  372. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/tests/test_package_utils.py +0 -377
  373. package/template/.codex/skills/data-analytics/src/analytics-app/styles.css +0 -3468
  374. package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.d.ts +0 -44
  375. package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.jsx +0 -639
  376. package/template/.codex/skills/data-analytics/src/analytics-app/tables/data-table.css +0 -327
  377. package/template/.codex/skills/data-analytics/src/analytics-app/tokens.css +0 -225
  378. package/template/.codex/skills/data-analytics/src/analytics-app/types.ts +0 -204
  379. package/template/.codex/skills/data-analytics/src/analytics-app-core.md +0 -85
  380. package/template/.codex/skills/data-analytics/src/codex-style-contract.md +0 -30
  381. package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.html +0 -12
  382. package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.jsx +0 -1008
  383. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.css +0 -2117
  384. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.html +0 -122
  385. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.js +0 -3588
  386. package/template/.codex/skills/data-analytics/src/datascience-table-widget.css +0 -483
  387. package/template/.codex/skills/data-analytics/src/datascience-table-widget.html +0 -32
  388. package/template/.codex/skills/data-analytics/src/datascience-table-widget.js +0 -333
  389. package/template/.codex/skills/data-analytics/src/mcp-host.js +0 -153
  390. package/template/.codex/skills/data-analytics/src/recharts-config.js +0 -315
  391. package/template/.codex/skills/data-analytics/src/recharts-renderer.jsx +0 -294
  392. package/template/.codex/skills/data-analytics/src/sql-source-view.css +0 -33
  393. package/template/.codex/skills/data-analytics/src/sql-source-view.js +0 -157
  394. package/template/.codex/skills/data-analytics/src/styles/codex-theme.css +0 -121
  395. package/template/.codex/skills/data-analytics/src/table-renderer.jsx +0 -28
  396. package/template/.codex/skills/data-analytics/tests/chart-transforms.test.mjs +0 -87
  397. package/template/.codex/skills/data-analytics/tests/funnel-smoke.html +0 -105
  398. package/template/.codex/skills/data-analytics/tests/inline-widget-compare.html +0 -233
  399. package/template/.codex/skills/data-analytics/tests/mcp-server.test.mjs +0 -1500
  400. package/template/.codex/skills/data-analytics/tests/native-style-contract.test.mjs +0 -219
  401. package/template/.codex/skills/data-analytics/tests/recharts-config.test.mjs +0 -144
  402. package/template/.codex/skills/data-analytics/tests/recharts-renderer.test.mjs +0 -11
  403. package/template/.codex/skills/data-analytics/tests/rich-markdown.test.mjs +0 -54
  404. package/template/.codex/skills/data-analytics/tests/widget-render-harness.html +0 -321
  405. package/template/.codex/skills/data-analytics/tsconfig.json +0 -19
  406. package/template/.codex/skills/data-analytics/vite.config.ts +0 -46
  407. package/template/.codex/skills/grill-with-docs/SKILL.md +0 -20
  408. package/template/.codex/skills/grill-with-docs/agents/openai.yaml +0 -5
  409. package/template/.codex/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  410. package/template/.codex/skills/prototype/UI.md +0 -112
  411. package/template/.codex/skills/setup-matt-pocock-skills/domain.md +0 -37
  412. package/template/.codex/skills/to-questionnaire/SKILL.md +0 -55
  413. package/template/.codex/skills/to-questionnaire/agents/openai.yaml +0 -5
  414. package/template/.codex/skills/wait-what/SKILL.md +0 -7
  415. package/template/.codex/skills/wait-what/agents/openai.yaml +0 -5
  416. package/template/.cursor/skills/grill-with-docs/SKILL.md +0 -20
  417. package/template/.cursor/skills/grill-with-docs/agents/openai.yaml +0 -5
  418. package/template/.cursor/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  419. package/template/.cursor/skills/prototype/UI.md +0 -112
  420. package/template/.cursor/skills/setup-matt-pocock-skills/domain.md +0 -37
  421. package/template/.cursor/skills/to-questionnaire/SKILL.md +0 -55
  422. package/template/.cursor/skills/to-questionnaire/agents/openai.yaml +0 -5
  423. package/template/.cursor/skills/wait-what/SKILL.md +0 -7
  424. package/template/.cursor/skills/wait-what/agents/openai.yaml +0 -5
  425. package/template/.pi/skills/grill-with-docs/SKILL.md +0 -20
  426. package/template/.pi/skills/grill-with-docs/agents/openai.yaml +0 -5
  427. package/template/.pi/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  428. package/template/.pi/skills/prototype/UI.md +0 -112
  429. package/template/.pi/skills/setup-matt-pocock-skills/domain.md +0 -37
  430. package/template/.pi/skills/to-questionnaire/SKILL.md +0 -55
  431. package/template/.pi/skills/to-questionnaire/agents/openai.yaml +0 -5
  432. package/template/.pi/skills/wait-what/SKILL.md +0 -7
  433. package/template/.pi/skills/wait-what/agents/openai.yaml +0 -5
  434. package/template/.template-spec/agents/domain.md +0 -31
  435. /package/template/.agents/skills/{improve-codebase-architecture → codebase-design/references}/HTML-REPORT.md +0 -0
  436. /package/template/.codex/skills/{improve-codebase-architecture → codebase-design/references}/HTML-REPORT.md +0 -0
  437. /package/template/.cursor/skills/{improve-codebase-architecture → codebase-design/references}/HTML-REPORT.md +0 -0
  438. /package/template/.pi/skills/{improve-codebase-architecture → codebase-design/references}/HTML-REPORT.md +0 -0
@@ -1,536 +0,0 @@
1
- import {
2
- type CSSProperties,
3
- type PointerEvent as ReactPointerEvent,
4
- type ReactNode,
5
- useEffect,
6
- useLayoutEffect,
7
- useMemo,
8
- useRef,
9
- useState
10
- } from "react";
11
-
12
- import {
13
- type AnalyticsLayoutItemState,
14
- type AnalyticsLayoutPlacement,
15
- type AnalyticsLayoutPlacementIntent,
16
- type AnalyticsLayoutWidth,
17
- normalize,
18
- packRows,
19
- predictPlacement
20
- } from "./analyticsLayoutCore";
21
-
22
- export type { AnalyticsLayoutWidth } from "./analyticsLayoutCore";
23
-
24
- export type AnalyticsLayoutRenderActions = {
25
- setLayout: (layout: AnalyticsLayoutWidth) => void;
26
- };
27
-
28
- export type AnalyticsLayoutBlock = {
29
- className?: string;
30
- defaultLayout?: AnalyticsLayoutWidth;
31
- id: string;
32
- render: (layout: AnalyticsLayoutWidth, actions: AnalyticsLayoutRenderActions) => ReactNode;
33
- };
34
-
35
- type BlockRect = {
36
- bottom: number;
37
- height: number;
38
- left: number;
39
- right: number;
40
- top: number;
41
- width: number;
42
- };
43
-
44
- type DragSession = {
45
- currentPoint: { x: number; y: number };
46
- draggedId: string;
47
- intent: AnalyticsLayoutPlacementIntent;
48
- isStacked: boolean;
49
- pointerOffset: { x: number; y: number };
50
- previewItems: AnalyticsLayoutItemState[];
51
- rects: Map<string, BlockRect>;
52
- sourceRect: BlockRect;
53
- startItems: AnalyticsLayoutItemState[];
54
- targetId: string | null;
55
- };
56
-
57
- const STACK_BREAKPOINT_PX = 760;
58
- const AUTO_SCROLL_EDGE_PX = 72;
59
- const AUTO_SCROLL_STEP_PX = 18;
60
- const REORDER_INSERT_BAND_RATIO = 0.3;
61
- const SPLIT_SIDE_ZONE_RATIO = 0.4;
62
- const SPLIT_INDICATOR_OUTSET_PX = 8;
63
-
64
- function parseStoredLayout(storageKey: string | null): unknown {
65
- if (!storageKey) return undefined;
66
- const stored = window.localStorage.getItem(storageKey);
67
- if (!stored) return undefined;
68
- try {
69
- return JSON.parse(stored);
70
- } catch {
71
- return undefined;
72
- }
73
- }
74
-
75
- function sameItems(first: AnalyticsLayoutItemState[], second: AnalyticsLayoutItemState[]) {
76
- return (
77
- first.length === second.length
78
- && first.every((item, index) => item.id === second[index]?.id && item.layout === second[index]?.layout)
79
- );
80
- }
81
-
82
- function rectFromElement(element: HTMLElement): BlockRect {
83
- const rect = element.getBoundingClientRect();
84
- return {
85
- bottom: rect.bottom,
86
- height: rect.height,
87
- left: rect.left,
88
- right: rect.right,
89
- top: rect.top,
90
- width: rect.width
91
- };
92
- }
93
-
94
- function distanceToRect(x: number, y: number, rect: BlockRect) {
95
- const dx = x < rect.left ? rect.left - x : x > rect.right ? x - rect.right : 0;
96
- const dy = y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0;
97
- return Math.hypot(dx, dy);
98
- }
99
-
100
- function shouldCancelDrag(target: EventTarget | null, cancelSelector: string) {
101
- return target instanceof Element && Boolean(target.closest(cancelSelector));
102
- }
103
-
104
- function DragHandleIcon() {
105
- return (
106
- <svg
107
- aria-hidden="true"
108
- className="analytics-layout-grab-handle-icon"
109
- fill="none"
110
- focusable="false"
111
- height="24"
112
- viewBox="0 0 24 24"
113
- width="24"
114
- >
115
- <g transform="rotate(-90 12 12)">
116
- <circle cx="5" cy="8.5" fill="currentColor" r="2" />
117
- <circle cx="12" cy="8.5" fill="currentColor" r="2" />
118
- <circle cx="19" cy="8.5" fill="currentColor" r="2" />
119
- <circle cx="5" cy="15.5" fill="currentColor" r="2" />
120
- <circle cx="12" cy="15.5" fill="currentColor" r="2" />
121
- <circle cx="19" cy="15.5" fill="currentColor" r="2" />
122
- </g>
123
- </svg>
124
- );
125
- }
126
-
127
- export function AnalyticsLayoutCanvas({
128
- ariaLabel,
129
- blocks,
130
- cancelSelector,
131
- className,
132
- isEditMode = false,
133
- itemClassName,
134
- layoutResetKey = 0,
135
- onLayoutChange,
136
- storageKey
137
- }: {
138
- ariaLabel: string;
139
- blocks: AnalyticsLayoutBlock[];
140
- cancelSelector: string;
141
- className?: string;
142
- isEditMode?: boolean;
143
- itemClassName?: (block: AnalyticsLayoutBlock, layout: AnalyticsLayoutWidth) => string;
144
- layoutResetKey?: number;
145
- onLayoutChange?: (items: AnalyticsLayoutItemState[]) => void;
146
- storageKey: string | null;
147
- }) {
148
- const [items, setItems] = useState<AnalyticsLayoutItemState[]>(() => normalize(blocks));
149
- const [dragSession, setDragSession] = useState<DragSession | null>(null);
150
- const blockById = useMemo(() => new Map(blocks.map((block) => [block.id, block])), [blocks]);
151
- const canvasRef = useRef<HTMLDivElement | null>(null);
152
- const itemRefs = useRef(new Map<string, HTMLElement>());
153
- const dragSessionRef = useRef<DragSession | null>(null);
154
- const dragFrameRef = useRef<number | null>(null);
155
- const dragPointRef = useRef<{ x: number; y: number } | null>(null);
156
- const layoutLoadRef = useRef<{ layoutResetKey: number; storageKey: string | null } | null>(null);
157
- const onLayoutChangeRef = useRef(onLayoutChange);
158
-
159
- useEffect(() => {
160
- onLayoutChangeRef.current = onLayoutChange;
161
- }, [onLayoutChange]);
162
-
163
- useLayoutEffect(() => {
164
- const previousLoad = layoutLoadRef.current;
165
- const shouldReloadStoredLayout =
166
- !previousLoad
167
- || previousLoad.layoutResetKey !== layoutResetKey
168
- || previousLoad.storageKey !== storageKey;
169
- layoutLoadRef.current = { layoutResetKey, storageKey };
170
- setItems((currentItems) => {
171
- const nextItems = normalize(
172
- blocks,
173
- shouldReloadStoredLayout ? parseStoredLayout(storageKey) : currentItems
174
- );
175
- onLayoutChangeRef.current?.(nextItems);
176
- return nextItems;
177
- });
178
- }, [blocks, layoutResetKey, storageKey]);
179
-
180
- useEffect(() => {
181
- dragSessionRef.current = dragSession;
182
- }, [dragSession]);
183
-
184
- useEffect(() => {
185
- if (!dragSession) return;
186
- function refreshMeasuredRects() {
187
- const session = dragSessionRef.current;
188
- const canvas = canvasRef.current;
189
- if (!session || !canvas) return;
190
- const nextSession: DragSession = {
191
- ...session,
192
- isStacked: canvas.getBoundingClientRect().width < STACK_BREAKPOINT_PX,
193
- rects: measureBlockRects()
194
- };
195
- dragSessionRef.current = nextSession;
196
- setDragSession(nextSession);
197
- }
198
- window.addEventListener("resize", refreshMeasuredRects);
199
- window.addEventListener("scroll", refreshMeasuredRects, true);
200
- return () => {
201
- window.removeEventListener("resize", refreshMeasuredRects);
202
- window.removeEventListener("scroll", refreshMeasuredRects, true);
203
- };
204
- }, [dragSession?.draggedId]);
205
-
206
- useEffect(() => {
207
- return () => {
208
- if (dragFrameRef.current != null) window.cancelAnimationFrame(dragFrameRef.current);
209
- };
210
- }, []);
211
-
212
- const rows = packRows(items);
213
-
214
- function measureBlockRects() {
215
- const rects = new Map<string, BlockRect>();
216
- itemRefs.current.forEach((element, id) => {
217
- rects.set(id, rectFromElement(element));
218
- });
219
- return rects;
220
- }
221
-
222
- function commitItems(nextItems: AnalyticsLayoutItemState[]) {
223
- const normalizedItems = normalize(blocks, nextItems);
224
- setItems(normalizedItems);
225
- onLayoutChangeRef.current?.(normalizedItems);
226
- if (!isEditMode && storageKey) {
227
- window.localStorage.setItem(storageKey, JSON.stringify(normalizedItems));
228
- }
229
- }
230
-
231
- function setBlockLayout(blockId: string, layout: AnalyticsLayoutWidth) {
232
- commitItems(items.map((item) => (item.id === blockId ? { ...item, layout } : item)));
233
- }
234
-
235
- function findPlacement(
236
- clientX: number,
237
- clientY: number,
238
- session: DragSession,
239
- rects: Map<string, BlockRect>
240
- ): AnalyticsLayoutPlacement {
241
- const candidates = [...rects.entries()]
242
- .filter(([id]) => id !== session.draggedId)
243
- .sort((first, second) => first[1].top - second[1].top || first[1].left - second[1].left);
244
- if (!candidates.length) {
245
- return { draggedId: session.draggedId, intent: "end" };
246
- }
247
-
248
- const firstRect = candidates[0][1];
249
- const lastRect = candidates[candidates.length - 1][1];
250
-
251
- let targetId = candidates[0][0];
252
- let targetRect = candidates[0][1];
253
- let bestDistance = Number.POSITIVE_INFINITY;
254
- for (const [id, rect] of candidates) {
255
- const distance = distanceToRect(clientX, clientY, rect);
256
- if (distance < bestDistance) {
257
- bestDistance = distance;
258
- targetId = id;
259
- targetRect = rect;
260
- }
261
- }
262
-
263
- const sideBand = targetRect.width * SPLIT_SIDE_ZONE_RATIO;
264
- const isInsideTargetHeight = clientY >= targetRect.top && clientY <= targetRect.bottom;
265
- const insertBand = Math.min(targetRect.height * REORDER_INSERT_BAND_RATIO, targetRect.height / 2);
266
- const isBeforeBand = isInsideTargetHeight && clientY < targetRect.top + insertBand;
267
- const isAfterBand = isInsideTargetHeight && clientY > targetRect.bottom - insertBand;
268
- if (isBeforeBand) {
269
- return { draggedId: session.draggedId, intent: "before", targetId };
270
- }
271
- if (isAfterBand) {
272
- return { draggedId: session.draggedId, intent: "after", targetId };
273
- }
274
- if (!session.isStacked && isInsideTargetHeight && clientX < targetRect.left + sideBand) {
275
- return { draggedId: session.draggedId, intent: "pair-before", targetId };
276
- }
277
- if (!session.isStacked && isInsideTargetHeight && clientX > targetRect.right - sideBand) {
278
- return { draggedId: session.draggedId, intent: "pair-after", targetId };
279
- }
280
-
281
- if (clientY < firstRect.top + firstRect.height / 2) {
282
- return { draggedId: session.draggedId, intent: "before", targetId: candidates[0][0] };
283
- }
284
- if (clientY > lastRect.top + lastRect.height / 2) {
285
- return { draggedId: session.draggedId, intent: "end" };
286
- }
287
-
288
- const targetItem = session.startItems.find((item) => item.id === targetId);
289
- if (targetItem?.layout === "half") {
290
- const targetCenterX = targetRect.left + targetRect.width / 2;
291
- return {
292
- draggedId: session.draggedId,
293
- intent: clientX < targetCenterX ? "before" : "after",
294
- targetId
295
- };
296
- }
297
-
298
- const targetCenterY = targetRect.top + targetRect.height / 2;
299
- return {
300
- draggedId: session.draggedId,
301
- intent: clientY < targetCenterY ? "before" : "after",
302
- targetId
303
- };
304
- }
305
-
306
- function autoScroll(clientY: number) {
307
- if (clientY < AUTO_SCROLL_EDGE_PX) {
308
- window.scrollBy({ top: -AUTO_SCROLL_STEP_PX });
309
- } else if (clientY > window.innerHeight - AUTO_SCROLL_EDGE_PX) {
310
- window.scrollBy({ top: AUTO_SCROLL_STEP_PX });
311
- }
312
- }
313
-
314
- function applyDragPoint(clientX: number, clientY: number) {
315
- const session = dragSessionRef.current;
316
- if (!session) return;
317
- autoScroll(clientY);
318
- const rects = measureBlockRects();
319
- const placement = findPlacement(clientX, clientY, session, rects);
320
- const predictedItems = predictPlacement(session.startItems, placement);
321
- const previewChanged = !sameItems(predictedItems, session.previewItems);
322
- const previewItems = previewChanged ? predictedItems : session.previewItems;
323
- const nextSession: DragSession = {
324
- ...session,
325
- currentPoint: { x: clientX, y: clientY },
326
- intent: placement.intent,
327
- previewItems,
328
- rects,
329
- targetId: placement.targetId ?? null
330
- };
331
- dragSessionRef.current = nextSession;
332
- setDragSession(nextSession);
333
- }
334
-
335
- function scheduleDragPoint(clientX: number, clientY: number) {
336
- dragPointRef.current = { x: clientX, y: clientY };
337
- if (dragFrameRef.current != null) return;
338
- dragFrameRef.current = window.requestAnimationFrame(() => {
339
- dragFrameRef.current = null;
340
- const point = dragPointRef.current;
341
- if (!point) return;
342
- applyDragPoint(point.x, point.y);
343
- });
344
- }
345
-
346
- function startDragSession(event: ReactPointerEvent<HTMLElement>, blockId: string) {
347
- if (!isEditMode) return;
348
- if (event.pointerType === "mouse" && event.button !== 0) return;
349
- if (shouldCancelDrag(event.target, cancelSelector)) return;
350
- const element = itemRefs.current.get(blockId);
351
- const canvas = canvasRef.current;
352
- if (!element || !canvas) return;
353
- event.preventDefault();
354
- element.setPointerCapture?.(event.pointerId);
355
- const sourceRect = rectFromElement(element);
356
- const rects = measureBlockRects();
357
- const canvasRect = canvas.getBoundingClientRect();
358
- const startItems = normalize(blocks, items);
359
- const session: DragSession = {
360
- currentPoint: { x: event.clientX, y: event.clientY },
361
- draggedId: blockId,
362
- intent: "end",
363
- isStacked: canvasRect.width < STACK_BREAKPOINT_PX,
364
- pointerOffset: {
365
- x: event.clientX - sourceRect.left,
366
- y: event.clientY - sourceRect.top
367
- },
368
- previewItems: startItems,
369
- rects,
370
- sourceRect,
371
- startItems,
372
- targetId: null
373
- };
374
- dragSessionRef.current = session;
375
- setDragSession(session);
376
- }
377
-
378
- function handlePointerDown(event: ReactPointerEvent<HTMLDivElement>, blockId: string) {
379
- startDragSession(event, blockId);
380
- }
381
-
382
- function finishDrag(commit: boolean) {
383
- const session = dragSessionRef.current;
384
- if (dragFrameRef.current != null) {
385
- window.cancelAnimationFrame(dragFrameRef.current);
386
- dragFrameRef.current = null;
387
- }
388
- dragPointRef.current = null;
389
- dragSessionRef.current = null;
390
- setDragSession(null);
391
- if (commit && session) {
392
- commitItems(session.previewItems);
393
- }
394
- }
395
-
396
- function handlePointerMove(event: ReactPointerEvent<HTMLDivElement>) {
397
- if (!dragSessionRef.current) return;
398
- event.preventDefault();
399
- scheduleDragPoint(event.clientX, event.clientY);
400
- }
401
-
402
- function ghostStyle(session: DragSession): CSSProperties {
403
- return {
404
- height: session.sourceRect.height,
405
- left: session.currentPoint.x - session.pointerOffset.x,
406
- top: session.currentPoint.y - session.pointerOffset.y,
407
- width: session.sourceRect.width
408
- };
409
- }
410
-
411
- function dropIndicatorStyle(session: DragSession): { className: string; style: CSSProperties } | null {
412
- if (session.intent === "hold") return null;
413
- const canvas = canvasRef.current;
414
- if (!canvas) return null;
415
- const canvasRect = canvas.getBoundingClientRect();
416
- const candidates = [...session.rects.entries()]
417
- .filter(([id]) => id !== session.draggedId)
418
- .sort((first, second) => first[1].top - second[1].top || first[1].left - second[1].left);
419
- if (!candidates.length) return null;
420
-
421
- if (session.intent === "pair-before" || session.intent === "pair-after") {
422
- if (!session.targetId) return null;
423
- const targetRect = session.rects.get(session.targetId);
424
- if (!targetRect) return null;
425
- const lineX = session.intent === "pair-before"
426
- ? targetRect.left - SPLIT_INDICATOR_OUTSET_PX
427
- : targetRect.right + SPLIT_INDICATOR_OUTSET_PX;
428
- return {
429
- className: "analytics-layout-drop-indicator is-split",
430
- style: {
431
- height: targetRect.height,
432
- left: lineX - canvasRect.left,
433
- top: targetRect.top - canvasRect.top
434
- }
435
- };
436
- }
437
-
438
- const targetRect = session.targetId
439
- ? session.rects.get(session.targetId)
440
- : candidates[candidates.length - 1]?.[1];
441
- if (!targetRect) return null;
442
- const lineY = session.intent === "before"
443
- ? targetRect.top
444
- : targetRect.bottom;
445
- return {
446
- className: "analytics-layout-drop-indicator is-reorder",
447
- style: {
448
- left: 0,
449
- top: lineY - canvasRect.top,
450
- width: canvasRect.width
451
- }
452
- };
453
- }
454
-
455
- const dropIndicator = dragSession ? dropIndicatorStyle(dragSession) : null;
456
-
457
- return (
458
- <section
459
- aria-label={ariaLabel}
460
- className={`analytics-layout-canvas ${isEditMode ? "is-edit-mode" : ""} ${dragSession ? "is-layout-dragging" : ""} ${className ?? ""}`.trim()}
461
- data-analytics-layout-canvas
462
- data-edit-mode={isEditMode ? "true" : "false"}
463
- onPointerCancel={() => finishDrag(false)}
464
- onPointerMove={handlePointerMove}
465
- onPointerUp={() => finishDrag(true)}
466
- ref={canvasRef}
467
- >
468
- {dropIndicator ? (
469
- <div
470
- aria-hidden="true"
471
- className={dropIndicator.className}
472
- data-image-export-exclude="true"
473
- style={dropIndicator.style}
474
- />
475
- ) : null}
476
- {rows.map((row, rowIndex) => (
477
- <div
478
- className={`analytics-layout-row ${row.length === 2 ? "is-half-row" : "is-full-row"}`}
479
- key={row.map((item) => item.id).join(":")}
480
- >
481
- {row.map((item) => {
482
- const block = blockById.get(item.id);
483
- if (!block) return null;
484
- const isDragged = dragSession?.draggedId === item.id;
485
- const isTarget = dragSession?.targetId === item.id;
486
- const rendered = block.render(item.layout, {
487
- setLayout: (nextLayout) => setBlockLayout(item.id, nextLayout)
488
- });
489
- return (
490
- <div
491
- className={`analytics-layout-item layout-${item.layout} ${block.className ?? ""} ${itemClassName?.(block, item.layout) ?? ""} ${isDragged ? "is-dragging" : ""} ${isTarget ? `is-drop-target intent-zone-${dragSession?.intent}` : ""}`.trim()}
492
- data-analytics-layout-item
493
- data-layout-block-id={item.id}
494
- data-layout-row-index={rowIndex}
495
- data-layout-width={item.layout}
496
- key={item.id}
497
- ref={(node) => {
498
- if (node) itemRefs.current.set(item.id, node);
499
- else itemRefs.current.delete(item.id);
500
- }}
501
- >
502
- {isEditMode ? (
503
- <div
504
- aria-hidden="true"
505
- className="analytics-layout-grab-handle"
506
- data-image-export-exclude="true"
507
- onPointerDown={(event) => handlePointerDown(event, item.id)}
508
- title="Drag to reorder"
509
- >
510
- <DragHandleIcon />
511
- </div>
512
- ) : null}
513
- <div className="analytics-layout-item-shell">
514
- {rendered}
515
- </div>
516
- </div>
517
- );
518
- })}
519
- </div>
520
- ))}
521
- {dragSession ? (
522
- <div
523
- aria-hidden="true"
524
- className="analytics-layout-ghost"
525
- data-image-export-exclude="true"
526
- style={ghostStyle(dragSession)}
527
- >
528
- {blockById.get(dragSession.draggedId)?.render(
529
- dragSession.startItems.find((item) => item.id === dragSession.draggedId)?.layout ?? "full",
530
- { setLayout: () => undefined }
531
- )}
532
- </div>
533
- ) : null}
534
- </section>
535
- );
536
- }