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,402 +0,0 @@
1
- import type { ChartSeriesSpec, ChartSpec, ValueFormat } from "./chart-contract";
2
-
3
- export type ChartDataRow = Record<string, string | number | boolean | [number, number] | null | undefined>;
4
-
5
- export const PERCENT_AXIS_TICKS = [0, 0.25, 0.5, 0.75, 1];
6
- const Y_AXIS_TICK_COUNT = 5;
7
- const COMPACT_VALUE_THRESHOLD = 100_000;
8
- const DATE_AXIS_MIN_TICKS = 5;
9
- const DATE_AXIS_MAX_TICKS = 10;
10
- const DATE_AXIS_ESTIMATED_TICK_WIDTH = 90;
11
-
12
- export function asNumber(value: unknown): number | null {
13
- if (typeof value === "number" && Number.isFinite(value)) return value;
14
- if (typeof value === "string" && value.trim() !== "") {
15
- const numeric = Number(value);
16
- if (Number.isFinite(numeric)) return numeric;
17
- }
18
- return null;
19
- }
20
-
21
- export function asFiniteNumber(value: unknown, fallback = 0): number {
22
- return asNumber(value) ?? fallback;
23
- }
24
-
25
- export function clamp(value: number, min: number, max: number): number {
26
- return Math.max(min, Math.min(max, value));
27
- }
28
-
29
- function isUsdUnit(unit: string): boolean {
30
- return unit === "$" || unit.toUpperCase() === "USD";
31
- }
32
-
33
- function unitScaleSuffix(unit: string): string | null {
34
- const normalized = unit.toLowerCase();
35
- if (normalized === "usd millions" || normalized === "usd million") return "M";
36
- if (normalized === "usd billions" || normalized === "usd billion") return "B";
37
- if (normalized === "usd thousands" || normalized === "usd thousand") return "K";
38
- if (/^\$[kmbt]$/i.test(unit)) return unit.slice(1).toUpperCase();
39
- return null;
40
- }
41
-
42
- function compactDigits(value: number): number {
43
- const absolute = Math.abs(value);
44
- if (absolute >= COMPACT_VALUE_THRESHOLD) return 1;
45
- return 2;
46
- }
47
-
48
- function formatPlainNumber(value: number, compact = false): string {
49
- const absolute = Math.abs(value);
50
- return new Intl.NumberFormat(undefined, {
51
- maximumFractionDigits: compactDigits(value),
52
- notation: compact && absolute >= COMPACT_VALUE_THRESHOLD ? "compact" : "standard",
53
- }).format(value);
54
- }
55
-
56
- function formatCurrency(value: number): string {
57
- const absolute = Math.abs(value);
58
- return new Intl.NumberFormat(undefined, {
59
- currency: "USD",
60
- maximumFractionDigits: compactDigits(value),
61
- notation: absolute >= COMPACT_VALUE_THRESHOLD ? "compact" : "standard",
62
- style: "currency",
63
- }).format(value);
64
- }
65
-
66
- function isPercentWordUnit(unit: string): boolean {
67
- const normalized = unit.toLowerCase();
68
- return normalized === "percent" || normalized === "percentage";
69
- }
70
-
71
- export function formatValue(value: unknown, format: ValueFormat = "compact", unit?: string): string {
72
- const numeric = asNumber(value);
73
- if (numeric == null) return value == null ? "n/a" : String(value);
74
- const cleanUnit = unit?.trim();
75
- if (cleanUnit) {
76
- if (isPercentWordUnit(cleanUnit)) {
77
- return new Intl.NumberFormat(undefined, {
78
- maximumFractionDigits: 1,
79
- style: "percent",
80
- }).format(numeric);
81
- }
82
- if (cleanUnit === "%" || cleanUnit.startsWith("%")) return `${formatPlainNumber(numeric)}%`;
83
- if (isUsdUnit(cleanUnit)) return formatCurrency(numeric);
84
- const scaleSuffix = unitScaleSuffix(cleanUnit);
85
- if (scaleSuffix) return `$${formatPlainNumber(numeric)}${scaleSuffix}`;
86
- if (cleanUnit.startsWith("$")) return `$${formatPlainNumber(numeric)}${cleanUnit.slice(1)}`;
87
- return `${formatPlainNumber(numeric, format === "compact")} ${cleanUnit}`;
88
- }
89
- if (format === "percent") {
90
- return new Intl.NumberFormat(undefined, {
91
- maximumFractionDigits: 1,
92
- style: "percent",
93
- }).format(numeric);
94
- }
95
- if (format === "currency") {
96
- return formatCurrency(numeric);
97
- }
98
- if (format === "number") {
99
- return formatPlainNumber(numeric);
100
- }
101
- return formatPlainNumber(numeric, true);
102
- }
103
-
104
- export function isDateAxisValue(value: unknown): value is string {
105
- return dateAxisParts(value) != null;
106
- }
107
-
108
- function dateAxisParts(value: unknown): { day: number; granularity: "day"; month: number; year: number } | { granularity: "month"; month: number; year: number } | null {
109
- if (typeof value !== "string") return null;
110
- const trimmed = value.trim();
111
- const match = trimmed.match(/^(\d{4})-(\d{2})-(\d{2})(?:$|[T\s])/);
112
- if (!match) {
113
- const monthMatch = trimmed.match(/^(\d{4})-(\d{2})$/);
114
- if (!monthMatch) return null;
115
- const [, monthYear, monthValue] = monthMatch;
116
- const monthParts = {
117
- granularity: "month" as const,
118
- month: Number(monthValue),
119
- year: Number(monthYear),
120
- };
121
- const date = new Date(Date.UTC(monthParts.year, monthParts.month - 1, 1));
122
- if (date.getUTCFullYear() !== monthParts.year || date.getUTCMonth() !== monthParts.month - 1) {
123
- return null;
124
- }
125
- return monthParts;
126
- }
127
- const [, year, month, day] = match;
128
- const parts = {
129
- day: Number(day),
130
- granularity: "day" as const,
131
- month: Number(month),
132
- year: Number(year),
133
- };
134
- const date = new Date(Date.UTC(parts.year, parts.month - 1, parts.day));
135
- if (
136
- date.getUTCFullYear() !== parts.year ||
137
- date.getUTCMonth() !== parts.month - 1 ||
138
- date.getUTCDate() !== parts.day
139
- ) {
140
- return null;
141
- }
142
- return parts;
143
- }
144
-
145
- export function formatDateAxisLabel(value: unknown, options: { includeYear?: boolean } = {}): string {
146
- const parts = dateAxisParts(value);
147
- if (!parts) return value == null ? "" : String(value);
148
- if (parts.granularity === "month") {
149
- return new Intl.DateTimeFormat(undefined, {
150
- month: "short",
151
- timeZone: "UTC",
152
- year: "numeric",
153
- }).format(new Date(Date.UTC(parts.year, parts.month - 1, 1)));
154
- }
155
- return new Intl.DateTimeFormat(undefined, {
156
- day: "numeric",
157
- month: "short",
158
- timeZone: "UTC",
159
- year: options.includeYear ? "numeric" : undefined,
160
- }).format(new Date(Date.UTC(parts.year, parts.month - 1, parts.day)));
161
- }
162
-
163
- function uniqueOrderedValues(values: string[]): string[] {
164
- const seen = new Set<string>();
165
- const unique: string[] = [];
166
- for (const value of values) {
167
- if (seen.has(value)) continue;
168
- seen.add(value);
169
- unique.push(value);
170
- }
171
- return unique;
172
- }
173
-
174
- function targetDateAxisTickCount(valueCount: number, availableWidth: number): number {
175
- if (valueCount <= 7) return valueCount;
176
- const widthTarget = Math.floor(availableWidth / DATE_AXIS_ESTIMATED_TICK_WIDTH);
177
- return clamp(widthTarget, DATE_AXIS_MIN_TICKS, Math.min(valueCount, DATE_AXIS_MAX_TICKS));
178
- }
179
-
180
- export function getDateAxisTicks(rows: ChartDataRow[], xField: string, availableWidth = 760): string[] | undefined {
181
- const values = uniqueOrderedValues(
182
- rows
183
- .map((row) => row[xField])
184
- .filter((value): value is string => typeof value === "string"),
185
- );
186
- if (values.length === 0 || !values.every(isDateAxisValue)) return undefined;
187
- if (values.length === 1) return values;
188
- const targetCount = targetDateAxisTickCount(values.length, availableWidth);
189
- if (targetCount >= values.length) return values;
190
-
191
- const lastIndex = values.length - 1;
192
- const step = Math.max(1, Math.ceil(lastIndex / Math.max(1, targetCount - 1)));
193
- const ticks = values.filter((_, index) => index % step === 0);
194
- const last = values[lastIndex];
195
- if (ticks[ticks.length - 1] !== last) ticks.push(last);
196
- return ticks;
197
- }
198
-
199
- function niceAxisStep(value: number): number {
200
- if (!Number.isFinite(value) || value <= 0) return 1;
201
- const magnitude = 10 ** Math.floor(Math.log10(value));
202
- const normalized = value / magnitude;
203
- const niceStep = [1, 1.5, 2, 2.5, 3, 4, 5, 7.5, 9, 10].find(
204
- (candidate) => normalized <= candidate,
205
- );
206
- return (niceStep ?? 10) * magnitude;
207
- }
208
-
209
- export function getYAxisScaleForSeries(
210
- chart: ChartSpec,
211
- rows: ChartDataRow[],
212
- seriesList: ChartSeriesSpec[],
213
- ): { labels: string[]; ticks: number[] } {
214
- const barGroupMode = chart.settings?.groupMode;
215
- const normalizedStackedBars =
216
- chart.type === "stackedBar100" ||
217
- chart.type === "horizontalStackedBar100" ||
218
- (chart.type === "bar" && barGroupMode === "stacked100");
219
- const stackedBars =
220
- chart.type === "stackedBar" ||
221
- chart.type === "horizontalStackedBar" ||
222
- (chart.type === "bar" && (barGroupMode === "stacked" || barGroupMode === "stacked100"));
223
-
224
- if (normalizedStackedBars) {
225
- return {
226
- labels: PERCENT_AXIS_TICKS.map((value) => formatValue(value, "percent")),
227
- ticks: PERCENT_AXIS_TICKS,
228
- };
229
- }
230
-
231
- const values: number[] = [0];
232
- for (const row of rows) {
233
- if (chart.type === "stackedArea" || stackedBars) {
234
- let positiveTotal = 0;
235
- let negativeTotal = 0;
236
- for (const series of seriesList) {
237
- const value = asNumber(row[series.field]);
238
- if (value == null) continue;
239
- if (value >= 0) positiveTotal += value;
240
- else negativeTotal += value;
241
- }
242
- values.push(positiveTotal, negativeTotal);
243
- } else {
244
- for (const series of seriesList) {
245
- const value = asNumber(row[series.field]);
246
- if (value != null) values.push(value);
247
- }
248
- }
249
- }
250
-
251
- const min = Math.min(...values);
252
- const max = Math.max(...values);
253
- const roughTickStep = niceAxisStep((max - min) / Math.max(1, Y_AXIS_TICK_COUNT - 1));
254
- const axisMin = min < 0 ? Math.floor(min / roughTickStep) * roughTickStep : 0;
255
- const tickStep = niceAxisStep((max - axisMin) / Math.max(1, Y_AXIS_TICK_COUNT - 1));
256
- const axisMax = max > 0 ? Math.ceil(max / tickStep) * tickStep : 0;
257
- const tickSlots = Math.max(1, Math.round((axisMax - axisMin) / tickStep));
258
- const ticks =
259
- axisMin === axisMax
260
- ? [axisMin]
261
- : Array.from({ length: tickSlots + 1 }, (_, index) => axisMin + tickStep * index);
262
- return {
263
- labels: ticks.map((value) => formatValue(value, chart.valueFormat)),
264
- ticks,
265
- };
266
- }
267
-
268
- export type BoxPlotDataRow = ChartDataRow & {
269
- __boxMax: number;
270
- __boxMedian: number;
271
- __boxMin: number;
272
- __boxQ1: number;
273
- __boxQ3: number;
274
- __boxRange: [number, number];
275
- };
276
-
277
- export function buildBoxPlotRows(chart: ChartSpec, rows: ChartDataRow[]): BoxPlotDataRow[] {
278
- const [minSeries, q1Series, medianSeries, q3Series, maxSeries] = chart.series;
279
- return rows.map((row) => {
280
- const min = asFiniteNumber(row[minSeries?.field ?? ""]);
281
- const q1 = asFiniteNumber(row[q1Series?.field ?? ""], min);
282
- const median = asFiniteNumber(row[medianSeries?.field ?? ""], q1);
283
- const q3 = asFiniteNumber(row[q3Series?.field ?? ""], median);
284
- const max = asFiniteNumber(row[maxSeries?.field ?? ""], q3);
285
- return {
286
- ...row,
287
- __boxMax: max,
288
- __boxMedian: median,
289
- __boxMin: min,
290
- __boxQ1: q1,
291
- __boxQ3: q3,
292
- __boxRange: [q1, q3],
293
- };
294
- });
295
- }
296
-
297
- export function getBoxPlotXAxisScale(rows: BoxPlotDataRow[]): { domain: [number, number]; ticks: number[] } {
298
- const values = rows.flatMap((row) => [row.__boxMin, row.__boxMax]);
299
- const min = Math.min(0, ...values);
300
- const max = Math.max(0, ...values);
301
- const roughTickStep = niceAxisStep((max - min) / Math.max(1, Y_AXIS_TICK_COUNT - 1));
302
- const axisMin = min < 0 ? Math.floor(min / roughTickStep) * roughTickStep : 0;
303
- const tickStep = niceAxisStep((max - axisMin) / Math.max(1, Y_AXIS_TICK_COUNT - 1));
304
- const axisMax = max > 0 ? Math.ceil(max / tickStep) * tickStep : 0;
305
- if (axisMin === axisMax) {
306
- const fallbackMax = axisMin + tickStep;
307
- return { domain: [axisMin, fallbackMax], ticks: [axisMin, fallbackMax] };
308
- }
309
- const tickSlots = Math.max(1, Math.round((axisMax - axisMin) / tickStep));
310
- const ticks = Array.from({ length: tickSlots + 1 }, (_, index) => axisMin + tickStep * index);
311
- return { domain: [axisMin, axisMax], ticks };
312
- }
313
-
314
- export type WaterfallDataRow = ChartDataRow & {
315
- __waterfallEnd: number;
316
- __waterfallIsLast: boolean;
317
- __waterfallIsPositive: boolean;
318
- __waterfallRange: [number, number];
319
- __waterfallRowCount: number;
320
- __waterfallStart: number;
321
- __waterfallValue: number;
322
- };
323
-
324
- export function buildWaterfallRows(chart: ChartSpec, rows: ChartDataRow[]): WaterfallDataRow[] {
325
- const series = chart.series[0];
326
- let running = 0;
327
- return rows.map((row, index) => {
328
- const value = asFiniteNumber(row[series?.field ?? ""]);
329
- const start = running;
330
- const end = start + value;
331
- running = end;
332
- return {
333
- ...row,
334
- __waterfallEnd: end,
335
- __waterfallIsLast: index === rows.length - 1,
336
- __waterfallIsPositive: value >= 0,
337
- __waterfallRange: [Math.min(start, end), Math.max(start, end)],
338
- __waterfallRowCount: rows.length,
339
- __waterfallStart: start,
340
- __waterfallValue: value,
341
- };
342
- });
343
- }
344
-
345
- export function buildPieRows(chart: ChartSpec, rows: ChartDataRow[]): ChartDataRow[] {
346
- if (chart.series.length > 1) {
347
- return chart.series
348
- .map((series, index) => ({
349
- __pieIndex: index,
350
- __pieField: series.field,
351
- __pieName: String(series.label ?? series.field),
352
- __pieValue: rows.reduce((sum, row) => sum + Math.max(0, asNumber(row[series.field]) ?? 0), 0),
353
- }))
354
- .filter((row) => Number(row.__pieValue) > 0);
355
- }
356
- const series = chart.series[0];
357
- return rows
358
- .map((row, index) => ({
359
- ...row,
360
- __pieIndex: index,
361
- __pieName: formatDateAxisLabel(row[chart.xField]),
362
- __pieValue: Math.max(0, asNumber(row[series?.field ?? ""]) ?? 0),
363
- }))
364
- .filter((row) => asNumber(row.__pieValue) != null && Number(row.__pieValue) > 0);
365
- }
366
-
367
- export function buildFunnelRows(chart: ChartSpec, rows: ChartDataRow[], getStageColor: (index: number, rowCount: number) => string): ChartDataRow[] {
368
- const series = chart.series[0];
369
- return rows.map((row, index) => {
370
- const value = asNumber(row[series?.field ?? ""]) ?? 0;
371
- const baseline = (asNumber(rows[0]?.[series?.field ?? ""]) ?? value) || 1;
372
- return {
373
- ...row,
374
- __funnelIndex: index,
375
- __funnelLabel: formatDateAxisLabel(row[chart.xField]),
376
- __funnelPairLabel: `${formatDateAxisLabel(row[chart.xField])}\u0000${formatValue(value, chart.valueFormat, chart.unit)}`,
377
- __funnelRowCount: rows.length,
378
- __funnelShareLabel: index === 0 ? "100%" : formatValue(value / baseline, "percent"),
379
- __funnelStageColor: getStageColor(index, rows.length),
380
- __funnelValueLabel: formatValue(value, chart.valueFormat, chart.unit),
381
- };
382
- });
383
- }
384
-
385
- export function chartEmptyMessage(chart: ChartSpec, rows: ChartDataRow[], visibleFields?: Set<string>): string {
386
- if (!rows.length) return chart.emptyState || "No rows match the selected filters.";
387
- const visibleSeries = chart.series.filter(
388
- (series) => !visibleFields || !visibleFields.size || visibleFields.has(series.field),
389
- );
390
- if (chart.series.length && !visibleSeries.length) return "No visible series selected.";
391
- if (chart.type === "scatter" && !rows.some((row) => asNumber(row[chart.xField]) != null && visibleSeries.some((series) => asNumber(row[series.field]) != null))) {
392
- return "Scatter plots need numeric x and y values.";
393
- }
394
- if (chart.type === "histogram" && !rows.some((row) => asNumber(row[chart.series[0]?.field ?? chart.xField]) != null)) {
395
- return "Histogram needs numeric values.";
396
- }
397
- if (chart.type === "pie" && !buildPieRows(chart, rows).length) return "Pie charts need positive values.";
398
- if ((chart.type === "line" || chart.type === "area" || chart.type === "stackedArea" || chart.type === "sparkline") && new Set(rows.map((row) => String(row[chart.xField] ?? ""))).size < 2) {
399
- return `${chart.type === "stackedArea" ? "Stacked area" : "Trend"} charts need at least two x values.`;
400
- }
401
- return "";
402
- }