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,30 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass, field
4
- from typing import Any
5
-
6
-
7
- @dataclass
8
- class Builder:
9
- chart_mode: str = "image"
10
- parts: list[str] = field(default_factory=list)
11
- offset: int = 0
12
- inline_styles: list[dict[str, Any]] = field(default_factory=list)
13
- headings: list[dict[str, Any]] = field(default_factory=list)
14
- blocks: list[dict[str, Any]] = field(default_factory=list)
15
- lists: list[dict[str, Any]] = field(default_factory=list)
16
- placeholders: list[dict[str, Any]] = field(default_factory=list)
17
- tables: list[dict[str, Any]] = field(default_factory=list)
18
- chart_images: list[dict[str, Any]] = field(default_factory=list)
19
- two_col_text_blocks: int = 0
20
- table_counter: int = 0
21
- chart_counter: int = 0
22
-
23
- def add(self, text: str) -> tuple[int, int]:
24
- start = self.offset
25
- self.parts.append(text)
26
- self.offset += len(text)
27
- return start, self.offset
28
-
29
- def text(self) -> str:
30
- return "".join(self.parts)
@@ -1,127 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- from pathlib import Path
5
- from typing import Any
6
-
7
- from .constants import DEFAULT_RENDER_WORKERS, DOC_CONTENT_WIDTH_PT
8
-
9
-
10
- def build_docx_upload_plan(
11
- manifest: dict[str, Any],
12
- docx_path: Path,
13
- preflight: dict[str, Any],
14
- target: str = "local-docx",
15
- ) -> dict[str, Any]:
16
- if target not in {"local-docx", "hosted-docx", "native-google-docs"}:
17
- raise ValueError(f"Unsupported delivery target: {target}")
18
- cloud = target != "local-docx"
19
- sequence = []
20
- if cloud and preflight["status"] == "passed":
21
- sequence = [{
22
- "capability": "upload_file" if target == "hosted-docx" else "import_native_google_document",
23
- "discovery_required": True,
24
- "requires_explicit_user_request": True,
25
- "file": str(docx_path),
26
- "note": "Discover the actual tool schema; capability names are not callable tools.",
27
- }]
28
- return {
29
- "title": manifest["title"],
30
- "source_html": manifest["source_html"],
31
- "docx_file": str(docx_path),
32
- "preflight_status": preflight["status"],
33
- "doc_content_width_pt": DOC_CONTENT_WIDTH_PT,
34
- "target": target,
35
- "remote_action_performed": False,
36
- "sequence": sequence,
37
- "expected_result": {
38
- "local-docx": "Validated local DOCX; no upload or sharing change.",
39
- "hosted-docx": "Readable hosted DOCX; not a native Google Doc.",
40
- "native-google-docs": "Reopened native Google Doc; a hosted DOCX does not satisfy this target.",
41
- }[target],
42
- "verification": [
43
- "compare text and structure against manifest.json and source HTML",
44
- "inspect headings, tables, lists, links and image relationships",
45
- "compare rendered charts with source visuals when applicable",
46
- ] + (["reopen the cloud result and verify content and actual native/hosted type"] if cloud else []),
47
- }
48
-
49
-
50
- def write_json(path: Path, obj: Any) -> None:
51
- path.write_text(json.dumps(obj, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
52
-
53
-
54
- def write_docx_upload_readme(
55
- html: Path,
56
- manifest: dict[str, Any],
57
- preflight: dict[str, Any],
58
- docx_path: Path,
59
- target: str = "local-docx",
60
- ) -> str:
61
- plan = build_docx_upload_plan(manifest, docx_path, preflight, target)
62
- return f"""# HTML report delivery plan
63
-
64
- Source: `{html}`
65
- Local DOCX: `{docx_path}`
66
- Target: `{target}`
67
- Preflight: `{preflight["status"]}`
68
- Expected result: {plan["expected_result"]}
69
-
70
- Check the source inventory in `manifest.json` and `preflight_checks.json`.
71
- For local-docx, validate and return the local file. Do not upload.
72
- A cloud target requires an explicit user request, passed preflight, actual tool
73
- capability discovery, and content/type verification after reopening the result.
74
- Missing capability is a delivery gap; a local file is not proof of cloud completion.
75
- This helper performs no remote actions. `docx_upload_plan.json` is a planning
76
- artifact with conditional capabilities, not executable tool instructions.
77
- """
78
-
79
-
80
- def write_outputs(
81
- html: Path,
82
- out_dir: Path,
83
- chart_mode: str = "image",
84
- render_workers: int = DEFAULT_RENDER_WORKERS,
85
- strict_preflight: bool = True,
86
- target: str = "local-docx",
87
- ) -> None:
88
- from .docx_writer import write_docx
89
- from .html_parser import parse_html
90
- from .quality import build_preflight_checks
91
- from .rendering import render_chart_images
92
-
93
- out_dir.mkdir(parents=True, exist_ok=True)
94
- manifest = parse_html(html, chart_mode=chart_mode)
95
- if manifest.get("chart_images"):
96
- render_chart_images(manifest, out_dir, render_workers=render_workers)
97
- preflight = build_preflight_checks(
98
- manifest,
99
- out_dir,
100
- )
101
-
102
- (out_dir / "skeleton.txt").write_text(manifest["skeleton_text"], encoding="utf-8")
103
- write_json(out_dir / "manifest.json", manifest)
104
- write_json(out_dir / "preflight_checks.json", preflight)
105
- write_json(out_dir / "placeholder_queries.json", manifest["placeholders"])
106
-
107
- docx_path = write_docx(manifest, out_dir)
108
- docx_upload_plan = build_docx_upload_plan(
109
- manifest,
110
- docx_path,
111
- preflight,
112
- target,
113
- )
114
- write_json(out_dir / "docx_upload_plan.json", docx_upload_plan)
115
- readme = write_docx_upload_readme(
116
- html,
117
- manifest,
118
- preflight,
119
- docx_path,
120
- target,
121
- )
122
- (out_dir / "README.md").write_text(readme, encoding="utf-8")
123
- if strict_preflight and preflight["status"] != "passed":
124
- raise SystemExit(
125
- f"Preflight failed with {preflight['summary']['errors']} error(s). "
126
- f"Inspect {out_dir / 'preflight_checks.json'}."
127
- )
@@ -1,374 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from pathlib import Path
5
- from typing import Any
6
-
7
- from .constants import BAR_CHART_HEX_COLORS, DOC_CONTENT_WIDTH_PT, NEUTRAL_SVG_COLORS
8
- from .table_utils import table_column_widths
9
-
10
-
11
- def add_preflight_check(
12
- checks: list[dict[str, Any]],
13
- *,
14
- name: str,
15
- passed: bool,
16
- severity: str,
17
- message: str,
18
- details: dict[str, Any] | None = None,
19
- ) -> None:
20
- checks.append(
21
- {
22
- "name": name,
23
- "status": "passed" if passed else "failed",
24
- "severity": severity,
25
- "message": message,
26
- "details": details or {},
27
- }
28
- )
29
-
30
-
31
- def hex_to_rgb_tuple(value: str) -> tuple[int, int, int]:
32
- raw = value.strip().lstrip("#")
33
- return (int(raw[0:2], 16), int(raw[2:4], 16), int(raw[4:6], 16))
34
-
35
-
36
- def is_expected_svg_mark_color(color: str) -> bool:
37
- normalized = color.lower()
38
- if normalized in BAR_CHART_HEX_COLORS:
39
- return True
40
- if normalized in NEUTRAL_SVG_COLORS:
41
- return False
42
- red, green, blue = hex_to_rgb_tuple(normalized)
43
- return max(red, green, blue) - min(red, green, blue) >= 45 and max(red, green, blue) < 245
44
-
45
-
46
- def expected_chart_colors(chart: dict[str, Any]) -> list[tuple[int, int, int]]:
47
- """Return colors that prove the rendered PNG kept the source visual marks.
48
-
49
- This is intentionally conservative: it checks report-specific bar and
50
- positive/negative table colors, plus saturated SVG colors, but ignores text,
51
- gridline, and background colors that would let a broken chart pass.
52
- """
53
- kind = chart.get("kind")
54
- if kind == "bar_chart":
55
- return [hex_to_rgb_tuple("#1d4ed8" if chart.get("bar_color") == "blue" else "#0f766e")]
56
- if kind == "two_col_table_grid":
57
- has_positive = any(
58
- "positive" in cell_styles
59
- for panel in chart.get("panels", [])
60
- for row_styles in panel.get("cell_styles", [])
61
- for cell_styles in row_styles
62
- )
63
- has_negative = any(
64
- "negative" in cell_styles
65
- for panel in chart.get("panels", [])
66
- for row_styles in panel.get("cell_styles", [])
67
- for cell_styles in row_styles
68
- )
69
- colors: list[str] = []
70
- if has_positive:
71
- colors.append("#26845f")
72
- if has_negative:
73
- colors.append("#c75146")
74
- return [hex_to_rgb_tuple(color) for color in colors]
75
- if kind == "svg":
76
- markup = str(chart.get("svg_markup", "")).lower()
77
- return [
78
- hex_to_rgb_tuple(color)
79
- for color in sorted(set(re.findall(r"#[0-9a-f]{6}", markup)))
80
- if is_expected_svg_mark_color(color)
81
- ]
82
- return []
83
-
84
-
85
- def image_pixels(image: Any) -> list[tuple[int, int, int]]:
86
- if hasattr(image, "get_flattened_data"):
87
- return list(image.get_flattened_data())
88
- return list(image.getdata())
89
-
90
-
91
- def count_expected_color_hits(
92
- image: Any,
93
- expected_colors: list[tuple[int, int, int]],
94
- tolerance: int = 40,
95
- ) -> dict[str, int]:
96
- if not expected_colors:
97
- return {}
98
-
99
- color_hits = {"#%02x%02x%02x" % color: 0 for color in expected_colors}
100
- color_table = image.getcolors(maxcolors=image.size[0] * image.size[1])
101
- if color_table is None:
102
- pixel_iter = (
103
- image.get_flattened_data() if hasattr(image, "get_flattened_data") else image.getdata()
104
- )
105
- color_table = [(1, pixel) for pixel in pixel_iter]
106
- for count, pixel in color_table:
107
- for expected in expected_colors:
108
- if sum(abs(pixel[channel] - expected[channel]) for channel in range(3)) <= tolerance:
109
- color_hits["#%02x%02x%02x" % expected] += count
110
- return color_hits
111
-
112
-
113
- def inspect_image_object(
114
- image: Any,
115
- expected_colors: list[tuple[int, int, int]],
116
- exact_color_scan: bool = False,
117
- ) -> dict[str, Any]:
118
- """Return cheap local evidence that a rendered image is usable in Docs."""
119
- from PIL import Image
120
-
121
- rgb_image = image.convert("RGB")
122
- width, height = rgb_image.size
123
- sample = rgb_image.resize((min(width, 160), min(height, 160)))
124
- pixels = image_pixels(sample)
125
- # Full-image color scans are expensive on large chart screenshots. Use
126
- # exact scans only for rendered table grids, where tiny red/green text is
127
- # easy to miss after downsampling.
128
- if exact_color_scan:
129
- color_image = rgb_image
130
- else:
131
- color_image = rgb_image.resize(
132
- (min(width, 160), min(height, 160)),
133
- getattr(Image, "Resampling", Image).NEAREST,
134
- )
135
- color_hits = count_expected_color_hits(color_image, expected_colors)
136
-
137
- total = max(1, len(pixels))
138
- extrema = sample.getextrema()
139
- uniform = all(channel_min == channel_max for channel_min, channel_max in extrema)
140
- non_white = sum(1 for r, g, b in pixels if min(r, g, b) < 245)
141
- non_white_ratio = non_white / total
142
-
143
- return {
144
- "width_px": width,
145
- "height_px": height,
146
- "uniform": uniform,
147
- "non_white_ratio": round(non_white_ratio, 4),
148
- "expected_color_hits": color_hits,
149
- }
150
-
151
-
152
- def inspect_png(
153
- path: Path, expected_colors: list[tuple[int, int, int]], exact_color_scan: bool = False
154
- ) -> dict[str, Any]:
155
- try:
156
- from PIL import Image
157
- except ImportError as exc: # pragma: no cover - dependency check path
158
- raise RuntimeError("PNG preflight requires pillow") from exc
159
-
160
- with Image.open(path) as image:
161
- return inspect_image_object(image, expected_colors, exact_color_scan=exact_color_scan)
162
-
163
-
164
- def build_preflight_checks(
165
- manifest: dict[str, Any],
166
- out_dir: Path,
167
- ) -> dict[str, Any]:
168
- """Build the local quality gate that must pass before Google Docs writes."""
169
- checks: list[dict[str, Any]] = []
170
- doc_width = DOC_CONTENT_WIDTH_PT
171
-
172
- add_preflight_check(
173
- checks,
174
- name="source_is_report_html",
175
- passed=not manifest.get("source_flags", {}).get("auth_page_detected", False),
176
- severity="error",
177
- message="Source HTML must be the report, not an auth/login page.",
178
- )
179
-
180
- source_two_col = manifest["counts"].get("two_col_source_blocks", 0)
181
- rendered_two_col = manifest["counts"].get("two_col_image_blocks", 0)
182
- text_two_col = manifest["counts"].get("two_col_text_blocks", 0)
183
- add_preflight_check(
184
- checks,
185
- name="two_col_blocks_preserved",
186
- passed=source_two_col == rendered_two_col + text_two_col,
187
- severity="error",
188
- message="Every source .two-col block should map to either one rendered multi-column block or preserved native text blocks.",
189
- details={
190
- "source_two_col_blocks": source_two_col,
191
- "rendered_two_col_blocks": rendered_two_col,
192
- "native_text_two_col_blocks": text_two_col,
193
- },
194
- )
195
-
196
- source_svgs = manifest["counts"].get("svgs", 0)
197
- rendered_svgs = manifest["counts"].get("svg_image_blocks", 0)
198
- add_preflight_check(
199
- checks,
200
- name="svg_blocks_preserved",
201
- passed=source_svgs == rendered_svgs,
202
- severity="error",
203
- message="Every source SVG visual should map to one rendered DOCX image.",
204
- details={"source_svgs": source_svgs, "rendered_svg_images": rendered_svgs},
205
- )
206
-
207
- source_bars = manifest["counts"].get("bar_source_blocks", 0)
208
- rendered_bars = manifest["counts"].get("bar_image_blocks", 0)
209
- table_bars = manifest["counts"].get("bar_table_blocks", 0)
210
- add_preflight_check(
211
- checks,
212
- name="bar_chart_blocks_preserved",
213
- passed=source_bars == rendered_bars + table_bars,
214
- severity="error",
215
- message="Every source bar-chart block should map to one rendered DOCX image or native table fallback.",
216
- details={
217
- "source_bar_blocks": source_bars,
218
- "rendered_bar_images": rendered_bars,
219
- "native_bar_tables": table_bars,
220
- },
221
- )
222
-
223
- for chart in manifest.get("chart_images", []):
224
- width = float(chart.get("docs_width_pt", doc_width))
225
- add_preflight_check(
226
- checks,
227
- name=f"{chart['id']}_width_cap",
228
- passed=width <= doc_width,
229
- severity="error",
230
- message="Rendered image width is capped to the report text column.",
231
- details={"docs_width_pt": width, "doc_width_pt": doc_width},
232
- )
233
- if chart.get("kind") == "two_col_table_grid":
234
- missing_titles = [
235
- idx
236
- for idx, panel in enumerate(chart.get("panels", []), start=1)
237
- if not str(panel.get("title", "")).strip()
238
- ]
239
- add_preflight_check(
240
- checks,
241
- name=f"{chart['id']}_panel_titles",
242
- passed=not missing_titles,
243
- severity="error",
244
- message="Rendered multi-column table panels preserve visible source titles.",
245
- details={"missing_title_panel_indices": missing_titles},
246
- )
247
-
248
- image_path = out_dir / chart["image_file"]
249
- add_preflight_check(
250
- checks,
251
- name=f"{chart['id']}_png_exists",
252
- passed=image_path.exists(),
253
- severity="error",
254
- message="Every chart placeholder has a rendered local PNG.",
255
- details={"image_file": chart["image_file"]},
256
- )
257
- if image_path.exists():
258
- try:
259
- stats = chart.get("render_preflight_stats") or inspect_png(
260
- image_path,
261
- expected_chart_colors(chart),
262
- exact_color_scan=chart.get("kind") == "two_col_table_grid",
263
- )
264
- color_hits = stats.get("expected_color_hits", {})
265
- expected_colors_present = not color_hits or any(
266
- count > 0 for count in color_hits.values()
267
- )
268
- add_preflight_check(
269
- checks,
270
- name=f"{chart['id']}_png_not_blank",
271
- passed=not stats["uniform"] and stats["non_white_ratio"] > 0.002,
272
- severity="error",
273
- message="Rendered image is not blank or near-empty.",
274
- details=stats,
275
- )
276
- add_preflight_check(
277
- checks,
278
- name=f"{chart['id']}_expected_colors_visible",
279
- passed=expected_colors_present,
280
- severity="error",
281
- message="Expected chart/table colors are visible in the rendered PNG.",
282
- details=stats,
283
- )
284
- except Exception as exc:
285
- add_preflight_check(
286
- checks,
287
- name=f"{chart['id']}_png_inspection",
288
- passed=False,
289
- severity="error",
290
- message=f"Could not inspect rendered PNG: {exc}",
291
- details={"image_file": chart["image_file"]},
292
- )
293
-
294
- table_width_failures: list[dict[str, Any]] = []
295
- for table in manifest.get("tables", []):
296
- rows = table.get("rows", [])
297
- if not rows:
298
- continue
299
- widths = table_column_widths(table, len(rows[0]))
300
- total = round(sum(widths), 1)
301
- if total > doc_width:
302
- table_width_failures.append(
303
- {"id": table["id"], "total_width_pt": total, "column_widths_pt": widths}
304
- )
305
- add_preflight_check(
306
- checks,
307
- name="native_table_width_cap",
308
- passed=not table_width_failures,
309
- severity="error",
310
- message="Native table column widths do not exceed the report text column.",
311
- details={"failures": table_width_failures},
312
- )
313
-
314
- image_size_failures = []
315
- for chart in manifest.get("chart_images", []):
316
- width = chart.get("docs_width_pt")
317
- height = chart.get("docs_height_pt")
318
- if width is None or height is None or float(width) > doc_width:
319
- image_size_failures.append({"id": chart.get("id"), "width": width, "height": height})
320
- add_preflight_check(
321
- checks,
322
- name="docx_images_have_explicit_sizes",
323
- passed=not image_size_failures,
324
- severity="error",
325
- message="DOCX image entries carry explicit text-width object sizes.",
326
- details={"failures": image_size_failures},
327
- )
328
-
329
- chart_count = len(manifest.get("chart_images", []))
330
- add_preflight_check(
331
- checks,
332
- name="docx_image_count_matches_manifest",
333
- passed=chart_count
334
- == len(
335
- [
336
- chart
337
- for chart in manifest.get("chart_images", [])
338
- if chart.get("image_file") and chart.get("docs_width_pt")
339
- ]
340
- ),
341
- severity="error",
342
- message="Every rendered image has the metadata needed for one DOCX image.",
343
- details={
344
- "manifest_chart_images": chart_count,
345
- "docx_image_entries": len(
346
- [
347
- chart
348
- for chart in manifest.get("chart_images", [])
349
- if chart.get("image_file") and chart.get("docs_width_pt")
350
- ]
351
- ),
352
- },
353
- )
354
-
355
- errors = [
356
- check for check in checks if check["severity"] == "error" and check["status"] == "failed"
357
- ]
358
- warnings = [
359
- check for check in checks if check["severity"] == "warning" and check["status"] == "failed"
360
- ]
361
- return {
362
- "status": "failed" if errors else "passed",
363
- "doc_content_width_pt": doc_width,
364
- "summary": {
365
- "checks": len(checks),
366
- "errors": len(errors),
367
- "warnings": len(warnings),
368
- "tables": len(manifest.get("tables", [])),
369
- "chart_images": chart_count,
370
- },
371
- "errors": errors,
372
- "warnings": warnings,
373
- "checks": checks,
374
- }