@adaptabletools/adaptable-mcp 0.1.0-canary.0 → 0.1.0-canary.2

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 (348) hide show
  1. package/README.md +58 -61
  2. package/data/changes/21-22.json +542 -0
  3. package/data/changes/22-23.json +639 -0
  4. package/data/changes/23-24.json +1874 -0
  5. package/data/manifest.snapshot.json +202 -0
  6. package/data/templates/angular/src/app/adaptableOptions.ts +40 -0
  7. package/data/templates/angular/src/app/agGridModules.ts +7 -0
  8. package/data/templates/angular/src/app/app.component.ts +66 -0
  9. package/data/templates/angular/src/app/app.module.ts +14 -0
  10. package/data/templates/angular/src/app/columnDefs.ts +121 -0
  11. package/data/templates/angular/src/app/gridOptions.ts +32 -0
  12. package/data/templates/angular/src/app/onAdaptableReady.ts +11 -0
  13. package/data/templates/angular/src/app/rowData.ts +851 -0
  14. package/data/templates/angular/src/app/styles.css +50 -0
  15. package/data/templates/angular/src/index.html +17 -0
  16. package/data/templates/angular/src/main.ts +18 -0
  17. package/data/templates/angular/src/polyfills.ts +1 -0
  18. package/data/templates/angular/tsconfig.json +16 -0
  19. package/data/templates/manifest.json +406 -0
  20. package/data/templates/react/src/App.tsx +71 -0
  21. package/data/templates/react/src/adaptableOptions.ts +40 -0
  22. package/data/templates/react/src/agGridModules.ts +7 -0
  23. package/data/templates/react/src/columnDefs.ts +121 -0
  24. package/data/templates/react/src/gridOptions.ts +32 -0
  25. package/data/templates/react/src/index.tsx +8 -0
  26. package/data/templates/react/src/onAdaptableReady.ts +11 -0
  27. package/data/templates/react/src/rowData.ts +851 -0
  28. package/data/templates/react/src/styles.css +50 -0
  29. package/data/templates/react/tsconfig.json +9 -0
  30. package/data/templates/vanilla/index.html +18 -0
  31. package/data/templates/vanilla/src/adaptableOptions.ts +40 -0
  32. package/data/templates/vanilla/src/agGridModules.ts +7 -0
  33. package/data/templates/vanilla/src/columnDefs.ts +121 -0
  34. package/data/templates/vanilla/src/gridOptions.ts +32 -0
  35. package/data/templates/vanilla/src/index.ts +41 -0
  36. package/data/templates/vanilla/src/onAdaptableReady.ts +11 -0
  37. package/data/templates/vanilla/src/rowData.ts +851 -0
  38. package/data/templates/vanilla/src/styles.css +50 -0
  39. package/data/templates/vanilla/tsconfig.json +14 -0
  40. package/data/templates/vue/.babelrc +3 -0
  41. package/data/templates/vue/public/index.html +19 -0
  42. package/data/templates/vue/src/App.vue +35 -0
  43. package/data/templates/vue/src/adaptableOptions.ts +40 -0
  44. package/data/templates/vue/src/agGridModules.ts +7 -0
  45. package/data/templates/vue/src/columnDefs.ts +121 -0
  46. package/data/templates/vue/src/gridOptions.ts +32 -0
  47. package/data/templates/vue/src/main.ts +6 -0
  48. package/data/templates/vue/src/onAdaptableReady.ts +11 -0
  49. package/data/templates/vue/src/rowData.ts +851 -0
  50. package/data/templates/vue/src/shims-vue.d.ts +6 -0
  51. package/data/templates/vue/src/styles.css +50 -0
  52. package/data/templates/vue/tsconfig.json +30 -0
  53. package/dist/bin.js +23 -0
  54. package/dist/bin.js.map +1 -0
  55. package/dist/cli/build-commands.js +200 -0
  56. package/dist/cli/build-commands.js.map +1 -0
  57. package/dist/cli/index.js +94 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/render.js +57 -0
  60. package/dist/cli/render.js.map +1 -0
  61. package/dist/core/anonymise/anonymise.js +315 -0
  62. package/dist/core/anonymise/anonymise.js.map +1 -0
  63. package/dist/core/anonymise/capabilities.js +94 -0
  64. package/dist/core/anonymise/capabilities.js.map +1 -0
  65. package/dist/core/aql/capabilities.js +339 -0
  66. package/dist/core/aql/capabilities.js.map +1 -0
  67. package/dist/core/aql/check.js +204 -0
  68. package/dist/core/aql/check.js.map +1 -0
  69. package/dist/core/aql/engine.js +92 -0
  70. package/dist/core/aql/engine.js.map +1 -0
  71. package/dist/core/aql/functions.js +108 -0
  72. package/dist/core/aql/functions.js.map +1 -0
  73. package/dist/core/aql/migrate.js +62 -0
  74. package/dist/core/aql/migrate.js.map +1 -0
  75. package/dist/core/capabilities.js +105 -0
  76. package/dist/core/capabilities.js.map +1 -0
  77. package/dist/core/changes/capabilities.js +92 -0
  78. package/dist/core/changes/capabilities.js.map +1 -0
  79. package/dist/core/changes/changes.js +101 -0
  80. package/dist/core/changes/changes.js.map +1 -0
  81. package/dist/core/changes/grep.js +183 -0
  82. package/dist/core/changes/grep.js.map +1 -0
  83. package/dist/core/changes/records.js +172 -0
  84. package/dist/core/changes/records.js.map +1 -0
  85. package/dist/core/changes/render-md.js +101 -0
  86. package/dist/core/changes/render-md.js.map +1 -0
  87. package/dist/core/changes/with-docs.js +86 -0
  88. package/dist/core/changes/with-docs.js.map +1 -0
  89. package/dist/core/compat/capabilities.js +127 -0
  90. package/dist/core/compat/capabilities.js.map +1 -0
  91. package/dist/core/compat/manifest.js +203 -0
  92. package/dist/core/compat/manifest.js.map +1 -0
  93. package/dist/core/constants.js +38 -0
  94. package/dist/core/constants.js.map +1 -0
  95. package/dist/core/context/capabilities.js +106 -0
  96. package/dist/core/context/capabilities.js.map +1 -0
  97. package/dist/core/context/detect.js +370 -0
  98. package/dist/core/context/detect.js.map +1 -0
  99. package/dist/core/context/projects.js +159 -0
  100. package/dist/core/context/projects.js.map +1 -0
  101. package/dist/core/context/resolve.js +85 -0
  102. package/dist/core/context/resolve.js.map +1 -0
  103. package/dist/core/convert/capabilities.js +86 -0
  104. package/dist/core/convert/capabilities.js.map +1 -0
  105. package/dist/core/convert/coldefs.js +313 -0
  106. package/dist/core/convert/coldefs.js.map +1 -0
  107. package/dist/core/docs/areas.js +22 -0
  108. package/dist/core/docs/areas.js.map +1 -0
  109. package/dist/core/docs/cache.js +133 -0
  110. package/dist/core/docs/cache.js.map +1 -0
  111. package/dist/core/docs/capabilities.js +377 -0
  112. package/dist/core/docs/capabilities.js.map +1 -0
  113. package/dist/core/docs/corpus.js.map +1 -0
  114. package/dist/core/docs/demos.js +105 -0
  115. package/dist/core/docs/demos.js.map +1 -0
  116. package/dist/core/docs/get-page.js +182 -0
  117. package/dist/core/docs/get-page.js.map +1 -0
  118. package/dist/core/docs/hosts.js +74 -0
  119. package/dist/core/docs/hosts.js.map +1 -0
  120. package/dist/core/docs/search.js.map +1 -0
  121. package/dist/core/envelope.js +79 -0
  122. package/dist/core/envelope.js.map +1 -0
  123. package/dist/core/extract/imports.js +163 -0
  124. package/dist/core/extract/imports.js.map +1 -0
  125. package/dist/core/extract/input.js +140 -0
  126. package/dist/core/extract/input.js.map +1 -0
  127. package/dist/core/extract/line-map.js +90 -0
  128. package/dist/core/extract/line-map.js.map +1 -0
  129. package/dist/core/extract/ts-literal.js +963 -0
  130. package/dist/core/extract/ts-literal.js.map +1 -0
  131. package/dist/core/index.js +13 -0
  132. package/dist/core/index.js.map +1 -0
  133. package/dist/core/migrate/capabilities.js +143 -0
  134. package/dist/core/migrate/capabilities.js.map +1 -0
  135. package/dist/core/migrate/leftovers.js +119 -0
  136. package/dist/core/migrate/leftovers.js.map +1 -0
  137. package/dist/core/migrate/state.js +295 -0
  138. package/dist/core/migrate/state.js.map +1 -0
  139. package/dist/core/packages/cache.js +139 -0
  140. package/dist/core/packages/cache.js.map +1 -0
  141. package/dist/core/packages/capabilities.js +95 -0
  142. package/dist/core/packages/capabilities.js.map +1 -0
  143. package/dist/{adaptable/types.js → core/packages/entry-types.js} +1 -1
  144. package/dist/core/packages/entry-types.js.map +1 -0
  145. package/dist/core/packages/exec.js +37 -0
  146. package/dist/core/packages/exec.js.map +1 -0
  147. package/dist/core/packages/load-entry.js +123 -0
  148. package/dist/core/packages/load-entry.js.map +1 -0
  149. package/dist/core/packages/prepare.js +122 -0
  150. package/dist/core/packages/prepare.js.map +1 -0
  151. package/dist/core/packages/registry.js +75 -0
  152. package/dist/core/packages/registry.js.map +1 -0
  153. package/dist/core/packages/resolve.js +94 -0
  154. package/dist/core/packages/resolve.js.map +1 -0
  155. package/dist/core/packages/versions.js +71 -0
  156. package/dist/core/packages/versions.js.map +1 -0
  157. package/dist/core/ping.js +22 -0
  158. package/dist/core/ping.js.map +1 -0
  159. package/dist/core/register.js +18 -0
  160. package/dist/core/register.js.map +1 -0
  161. package/dist/core/scaffold/capabilities.js +434 -0
  162. package/dist/core/scaffold/capabilities.js.map +1 -0
  163. package/dist/core/scaffold/generate.js +409 -0
  164. package/dist/core/scaffold/generate.js.map +1 -0
  165. package/dist/core/scaffold/infer.js +441 -0
  166. package/dist/core/scaffold/infer.js.map +1 -0
  167. package/dist/core/scaffold/overlay.js +290 -0
  168. package/dist/core/scaffold/overlay.js.map +1 -0
  169. package/dist/core/scaffold/readers/csv.js +146 -0
  170. package/dist/core/scaffold/readers/csv.js.map +1 -0
  171. package/dist/core/scaffold/readers/dataset.js +53 -0
  172. package/dist/core/scaffold/readers/dataset.js.map +1 -0
  173. package/dist/core/scaffold/readers/index.js +62 -0
  174. package/dist/core/scaffold/readers/index.js.map +1 -0
  175. package/dist/core/scaffold/readers/json.js +101 -0
  176. package/dist/core/scaffold/readers/json.js.map +1 -0
  177. package/dist/core/scaffold/readers/xlsx.js +81 -0
  178. package/dist/core/scaffold/readers/xlsx.js.map +1 -0
  179. package/dist/core/scaffold/suggestions.js +57 -0
  180. package/dist/core/scaffold/suggestions.js.map +1 -0
  181. package/dist/core/scaffold/templates.js +59 -0
  182. package/dist/core/scaffold/templates.js.map +1 -0
  183. package/dist/core/setup/audit.js +91 -0
  184. package/dist/core/setup/audit.js.map +1 -0
  185. package/dist/core/setup/capabilities.js +80 -0
  186. package/dist/core/setup/capabilities.js.map +1 -0
  187. package/dist/core/setup/context.js +118 -0
  188. package/dist/core/setup/context.js.map +1 -0
  189. package/dist/core/setup/rules/cell-data-type.js +40 -0
  190. package/dist/core/setup/rules/cell-data-type.js.map +1 -0
  191. package/dist/core/setup/rules/coldef-ownership.js +67 -0
  192. package/dist/core/setup/rules/coldef-ownership.js.map +1 -0
  193. package/dist/core/setup/rules/css-import.js +34 -0
  194. package/dist/core/setup/rules/css-import.js.map +1 -0
  195. package/dist/core/setup/rules/direct-grid.js +42 -0
  196. package/dist/core/setup/rules/direct-grid.js.map +1 -0
  197. package/dist/core/setup/rules/index.js +53 -0
  198. package/dist/core/setup/rules/index.js.map +1 -0
  199. package/dist/core/setup/rules/licence-literal.js +23 -0
  200. package/dist/core/setup/rules/licence-literal.js.map +1 -0
  201. package/dist/core/setup/rules/modules.js +86 -0
  202. package/dist/core/setup/rules/modules.js.map +1 -0
  203. package/dist/core/setup/rules/react-stable-refs.js +20 -0
  204. package/dist/core/setup/rules/react-stable-refs.js.map +1 -0
  205. package/dist/core/setup/rules/ready-hook.js +33 -0
  206. package/dist/core/setup/rules/ready-hook.js.map +1 -0
  207. package/dist/core/setup/rules/required-options.js +43 -0
  208. package/dist/core/setup/rules/required-options.js.map +1 -0
  209. package/dist/core/setup/rules/rule.js +10 -0
  210. package/dist/core/setup/rules/rule.js.map +1 -0
  211. package/dist/core/setup/rules/version-skew.js +65 -0
  212. package/dist/core/setup/rules/version-skew.js.map +1 -0
  213. package/dist/core/state/capabilities.js +78 -0
  214. package/dist/core/state/capabilities.js.map +1 -0
  215. package/dist/core/state/check.js +216 -0
  216. package/dist/core/state/check.js.map +1 -0
  217. package/dist/core/state/columns.js +130 -0
  218. package/dist/core/state/columns.js.map +1 -0
  219. package/dist/core/state/did-you-mean.js +83 -0
  220. package/dist/core/state/did-you-mean.js.map +1 -0
  221. package/dist/core/state/expressions.js +170 -0
  222. package/dist/core/state/expressions.js.map +1 -0
  223. package/dist/core/state/known-names.js +96 -0
  224. package/dist/core/state/known-names.js.map +1 -0
  225. package/dist/core/state/rules/aql-legacy-shape.js +42 -0
  226. package/dist/core/state/rules/aql-legacy-shape.js.map +1 -0
  227. package/dist/core/state/rules/aql-missing.js +21 -0
  228. package/dist/core/state/rules/aql-missing.js.map +1 -0
  229. package/dist/core/state/rules/aql-syntax.js +77 -0
  230. package/dist/core/state/rules/aql-syntax.js.map +1 -0
  231. package/dist/core/state/rules/calculated-settings.js +23 -0
  232. package/dist/core/state/rules/calculated-settings.js.map +1 -0
  233. package/dist/core/state/rules/column-id-exists.js +29 -0
  234. package/dist/core/state/rules/column-id-exists.js.map +1 -0
  235. package/dist/core/state/rules/dashboard-module-names.js +31 -0
  236. package/dist/core/state/rules/dashboard-module-names.js.map +1 -0
  237. package/dist/core/state/rules/dashboard-toolbar-names.js +48 -0
  238. package/dist/core/state/rules/dashboard-toolbar-names.js.map +1 -0
  239. package/dist/core/state/rules/format-column-pivot-display-format.js +43 -0
  240. package/dist/core/state/rules/format-column-pivot-display-format.js.map +1 -0
  241. package/dist/core/state/rules/helpers.js +39 -0
  242. package/dist/core/state/rules/helpers.js.map +1 -0
  243. package/dist/core/state/rules/index.js +80 -0
  244. package/dist/core/state/rules/index.js.map +1 -0
  245. package/dist/core/state/rules/layout-column-refs.js +60 -0
  246. package/dist/core/state/rules/layout-column-refs.js.map +1 -0
  247. package/dist/core/state/rules/layout-current-exists.js +27 -0
  248. package/dist/core/state/rules/layout-current-exists.js.map +1 -0
  249. package/dist/core/state/rules/layout-non-empty.js +32 -0
  250. package/dist/core/state/rules/layout-non-empty.js.map +1 -0
  251. package/dist/core/state/rules/rule.js +2 -0
  252. package/dist/core/state/rules/rule.js.map +1 -0
  253. package/dist/core/state/rules/scope-column-refs.js +32 -0
  254. package/dist/core/state/rules/scope-column-refs.js.map +1 -0
  255. package/dist/core/state/rules/scope-shape.js +61 -0
  256. package/dist/core/state/rules/scope-shape.js.map +1 -0
  257. package/dist/core/state/rules/state-unique-name.js +40 -0
  258. package/dist/core/state/rules/state-unique-name.js.map +1 -0
  259. package/dist/core/state/rules/state-unknown-section.js +30 -0
  260. package/dist/core/state/rules/state-unknown-section.js.map +1 -0
  261. package/dist/core/state/rules/type-discriminator.js +70 -0
  262. package/dist/core/state/rules/type-discriminator.js.map +1 -0
  263. package/dist/core/state/type-check.js +408 -0
  264. package/dist/core/state/type-check.js.map +1 -0
  265. package/dist/mcp/index.js +109 -0
  266. package/dist/mcp/index.js.map +1 -0
  267. package/dist/mcp/server.js +110 -0
  268. package/dist/mcp/server.js.map +1 -0
  269. package/dist/skills/adaptable-debug/SKILL.md +145 -0
  270. package/dist/skills/adaptable-debug/VERSION.md +1 -0
  271. package/dist/skills/adaptable-debug/references/_shared/agents-snippet.md +3 -0
  272. package/dist/skills/adaptable-debug/references/_shared/capabilities.md +35 -0
  273. package/dist/skills/adaptable-debug/references/_shared/conversation.md +20 -0
  274. package/dist/skills/adaptable-debug/references/_shared/docs-protocol.md +36 -0
  275. package/dist/skills/adaptable-debug/references/_shared/grounding.md +54 -0
  276. package/dist/skills/adaptable-debug/references/_shared/guards.md +20 -0
  277. package/dist/skills/adaptable-debug/references/_shared/validation-loop.md +42 -0
  278. package/dist/skills/adaptable-debug/references/devtools-api.md +36 -0
  279. package/dist/skills/adaptable-debug/references/feedback-template.md +36 -0
  280. package/dist/skills/adaptable-debug/references/symptoms.md +37 -0
  281. package/dist/skills/adaptable-debug/references/ticket-template.md +50 -0
  282. package/dist/skills/adaptable-dev/SKILL.md +97 -0
  283. package/dist/skills/adaptable-dev/VERSION.md +1 -0
  284. package/dist/skills/adaptable-dev/references/_shared/agents-snippet.md +3 -0
  285. package/dist/skills/adaptable-dev/references/_shared/capabilities.md +35 -0
  286. package/dist/skills/adaptable-dev/references/_shared/conversation.md +20 -0
  287. package/dist/skills/adaptable-dev/references/_shared/docs-protocol.md +36 -0
  288. package/dist/skills/adaptable-dev/references/_shared/grounding.md +54 -0
  289. package/dist/skills/adaptable-dev/references/_shared/guards.md +20 -0
  290. package/dist/skills/adaptable-dev/references/_shared/validation-loop.md +42 -0
  291. package/dist/skills/adaptable-dev/references/recommendations.md +93 -0
  292. package/dist/skills/adaptable-setup/SKILL.md +158 -0
  293. package/dist/skills/adaptable-setup/VERSION.md +1 -0
  294. package/dist/skills/adaptable-setup/references/_shared/agents-snippet.md +3 -0
  295. package/dist/skills/adaptable-setup/references/_shared/capabilities.md +35 -0
  296. package/dist/skills/adaptable-setup/references/_shared/conversation.md +20 -0
  297. package/dist/skills/adaptable-setup/references/_shared/docs-protocol.md +36 -0
  298. package/dist/skills/adaptable-setup/references/_shared/grounding.md +54 -0
  299. package/dist/skills/adaptable-setup/references/_shared/guards.md +20 -0
  300. package/dist/skills/adaptable-setup/references/_shared/validation-loop.md +42 -0
  301. package/dist/skills/adaptable-setup/references/paths.md +45 -0
  302. package/dist/skills/adaptable-upgrade/SKILL.md +269 -0
  303. package/dist/skills/adaptable-upgrade/VERSION.md +1 -0
  304. package/dist/skills/adaptable-upgrade/references/_shared/agents-snippet.md +3 -0
  305. package/dist/skills/adaptable-upgrade/references/_shared/capabilities.md +35 -0
  306. package/dist/skills/adaptable-upgrade/references/_shared/conversation.md +20 -0
  307. package/dist/skills/adaptable-upgrade/references/_shared/docs-protocol.md +36 -0
  308. package/dist/skills/adaptable-upgrade/references/_shared/grounding.md +54 -0
  309. package/dist/skills/adaptable-upgrade/references/_shared/guards.md +20 -0
  310. package/dist/skills/adaptable-upgrade/references/_shared/validation-loop.md +42 -0
  311. package/dist/skills/adaptable-upgrade/references/apply-order.md +171 -0
  312. package/dist/skills/adaptable-upgrade/references/plan-preamble.md +151 -0
  313. package/dist/skills/adaptable-upgrade/scripts/adaptable.mjs +24 -0
  314. package/package.json +34 -13
  315. package/dist/adaptable/loadEntry.js +0 -94
  316. package/dist/adaptable/loadEntry.js.map +0 -1
  317. package/dist/adaptable/types.js.map +0 -1
  318. package/dist/cache.js +0 -11
  319. package/dist/cache.js.map +0 -1
  320. package/dist/checks/stateRules.js +0 -389
  321. package/dist/checks/stateRules.js.map +0 -1
  322. package/dist/checks/stateTypes.js +0 -142
  323. package/dist/checks/stateTypes.js.map +0 -1
  324. package/dist/context.js +0 -39
  325. package/dist/context.js.map +0 -1
  326. package/dist/docs/corpus.js.map +0 -1
  327. package/dist/docs/search.js.map +0 -1
  328. package/dist/docs/source.js +0 -151
  329. package/dist/docs/source.js.map +0 -1
  330. package/dist/environment.js +0 -181
  331. package/dist/environment.js.map +0 -1
  332. package/dist/index.js +0 -7
  333. package/dist/index.js.map +0 -1
  334. package/dist/prompts.js +0 -84
  335. package/dist/prompts.js.map +0 -1
  336. package/dist/resources.js +0 -59
  337. package/dist/resources.js.map +0 -1
  338. package/dist/server.js +0 -23
  339. package/dist/server.js.map +0 -1
  340. package/dist/tools/checks.js +0 -250
  341. package/dist/tools/checks.js.map +0 -1
  342. package/dist/tools/docs.js +0 -173
  343. package/dist/tools/docs.js.map +0 -1
  344. package/dist/tools/environment.js +0 -52
  345. package/dist/tools/environment.js.map +0 -1
  346. package/skills/adaptable-dev/SKILL.md +0 -42
  347. /package/dist/{docs → core/docs}/corpus.js +0 -0
  348. /package/dist/{docs → core/docs}/search.js +0 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * JSON reader for `scaffold --data <file.json>` and `--sample <file.json>` (plan §8.11
3
+ * Inference: "a JSON array the agent fetched from a REST endpoint or exported from a
4
+ * database"). Accepts a top-level array of objects, or an object envelope whose single
5
+ * array-of-objects property holds the rows (`{ data: [...] }`, `{ items: [...] }`,
6
+ * `{ results: [...] }` — any name, as long as exactly one such property exists; with
7
+ * several, the conventional names above win in that order). Strict JSON first, JSON5
8
+ * as a fallback for commented or trailing-comma exports. Columns are the union of the
9
+ * row keys in first-seen order; a missing key is `null`.
10
+ */
11
+ import JSON5 from 'json5';
12
+ import { CapabilityError } from '../../envelope.js';
13
+ const ENVELOPE_PREFERENCE = ['data', 'items', 'results', 'rows', 'records', 'value', 'content'];
14
+ function isRecord(value) {
15
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
16
+ }
17
+ function isRowArray(value) {
18
+ return Array.isArray(value) && value.length > 0 && value.every(isRecord);
19
+ }
20
+ function parse(text, file) {
21
+ try {
22
+ return JSON.parse(text);
23
+ }
24
+ catch (strictError) {
25
+ try {
26
+ return JSON5.parse(text);
27
+ }
28
+ catch {
29
+ const message = strictError instanceof Error ? strictError.message : String(strictError);
30
+ throw new CapabilityError('EXTRACTION_FAILED', `${file}: ${message}`, 'Pass a JSON file holding an array of row objects (or an object with one array property holding them).');
31
+ }
32
+ }
33
+ }
34
+ /** Finds the row array: the value itself, or the one array-of-objects property of an envelope */
35
+ export function locateRows(value, file) {
36
+ if (isRowArray(value)) {
37
+ return { rows: value };
38
+ }
39
+ if (Array.isArray(value)) {
40
+ if (value.length === 0) {
41
+ throw new CapabilityError('EXTRACTION_FAILED', `${file} is an empty array.`, 'Pass at least one row object so column types can be inferred.');
42
+ }
43
+ throw new CapabilityError('EXTRACTION_FAILED', `${file}: the array holds ${describe(value.find((item) => !isRecord(item)))} values, not row objects.`, 'Each element must be an object whose keys are the column names, e.g. [{ "id": 1, "name": "…" }].');
44
+ }
45
+ if (isRecord(value)) {
46
+ const candidates = Object.keys(value).filter((key) => isRowArray(value[key]));
47
+ if (candidates.length === 1) {
48
+ return { rows: value[candidates[0]], arrayPath: candidates[0] };
49
+ }
50
+ if (candidates.length > 1) {
51
+ const preferred = ENVELOPE_PREFERENCE.find((name) => candidates.includes(name));
52
+ if (preferred) {
53
+ return { rows: value[preferred], arrayPath: preferred };
54
+ }
55
+ throw new CapabilityError('EXTRACTION_FAILED', `${file}: the object has several array properties that could be the rows (${candidates.join(', ')}).`, 'Save just the row array to a file, or rename the rows property to "data".');
56
+ }
57
+ throw new CapabilityError('EXTRACTION_FAILED', `${file}: the object has no array-of-objects property to read rows from.`, 'Pass a JSON array of row objects, or an object with one property holding that array (e.g. { "data": [...] }).');
58
+ }
59
+ throw new CapabilityError('EXTRACTION_FAILED', `${file}: expected an array of row objects, found ${describe(value)}.`, 'Pass a JSON array of row objects.');
60
+ }
61
+ function describe(value) {
62
+ if (value === null) {
63
+ return 'null';
64
+ }
65
+ if (Array.isArray(value)) {
66
+ return 'array';
67
+ }
68
+ return typeof value;
69
+ }
70
+ export function readJsonDataset(text, file) {
71
+ const { rows: raw, arrayPath } = locateRows(parse(text, file), file);
72
+ const columns = [];
73
+ const seen = new Set();
74
+ for (const row of raw) {
75
+ for (const key of Object.keys(row)) {
76
+ if (!seen.has(key)) {
77
+ seen.add(key);
78
+ columns.push(key);
79
+ }
80
+ }
81
+ }
82
+ const notes = [];
83
+ if (arrayPath) {
84
+ notes.push(`Rows read from the "${arrayPath}" property of the top-level object.`);
85
+ }
86
+ const rows = raw.map((row) => {
87
+ const record = {};
88
+ for (const column of columns) {
89
+ const value = row[column];
90
+ record[column] = value === undefined || value === '' ? null : value;
91
+ }
92
+ return record;
93
+ });
94
+ return {
95
+ columns,
96
+ rows,
97
+ source: { file, format: 'json', rowCount: rows.length, ...(arrayPath ? { arrayPath } : {}) },
98
+ notes,
99
+ };
100
+ }
101
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../../src/core/scaffold/readers/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * XLSX reader for `scaffold --data <file.xlsx>` (plan §8.11 Inference, §23 item 3:
3
+ * "first sheet, header row detected"). The spreadsheet itself is read by
4
+ * `read-excel-file` (decision 14: `xlsx` on npm is frozen at 0.18.5 with unpatched
5
+ * advisories and `exceljs` is 22 MB; `read-excel-file` is 5 MB installed, Node ≥ 18,
6
+ * and returns typed cells — strings, numbers, booleans, `Date`s for date-formatted
7
+ * cells, with the 1904 epoch honoured). It is imported lazily so no other capability
8
+ * pays for it.
9
+ *
10
+ * Header detection: leading empty rows are skipped; among the first `HEADER_SCAN_ROWS`
11
+ * rows the header is the first whose non-empty cells are all strings and whose count
12
+ * is at least half the widest row seen — a title row ("Trades report") or a
13
+ * date stamp above the table therefore does not become the header. With no such row
14
+ * the first non-empty row is used. Everything skipped is noted.
15
+ */
16
+ import { CapabilityError } from '../../envelope.js';
17
+ import { normaliseHeader, rowsFromCells } from './dataset.js';
18
+ export const HEADER_SCAN_ROWS = 25;
19
+ function isEmpty(cell) {
20
+ return cell === null || cell === undefined || cell === '';
21
+ }
22
+ /** Index of the header row in `rows`, or -1 when the sheet has no non-empty row */
23
+ export function detectHeaderRow(rows) {
24
+ const window = rows.slice(0, HEADER_SCAN_ROWS);
25
+ const filled = window.map((row) => row.filter((cell) => !isEmpty(cell)));
26
+ const width = Math.max(0, ...filled.map((cells) => cells.length));
27
+ if (width === 0) {
28
+ return -1;
29
+ }
30
+ const minimum = Math.ceil(width / 2);
31
+ const header = filled.findIndex((cells) => cells.length >= minimum && cells.every((cell) => typeof cell === 'string'));
32
+ if (header >= 0) {
33
+ return header;
34
+ }
35
+ return filled.findIndex((cells) => cells.length > 0);
36
+ }
37
+ /** Reads the first sheet; split out so tests can feed rows without a file */
38
+ export async function readFirstSheet(file) {
39
+ let sheets;
40
+ try {
41
+ const { default: readXlsxFile } = await import('read-excel-file/node');
42
+ sheets = (await readXlsxFile(file));
43
+ }
44
+ catch (error) {
45
+ const message = error instanceof Error ? error.message : String(error);
46
+ throw new CapabilityError('EXTRACTION_FAILED', `${file}: could not read the workbook: ${message}`, 'Pass an .xlsx workbook (Office Open XML); legacy .xls, password-protected and CSV-renamed files are not readable. Re-save from the spreadsheet application as .xlsx if needed.');
47
+ }
48
+ if (sheets.length === 0) {
49
+ throw new CapabilityError('EXTRACTION_FAILED', `${file} has no sheets.`, 'Pass a workbook whose first sheet holds a header row and the data rows.');
50
+ }
51
+ return { sheet: sheets[0].sheet, rows: sheets[0].data };
52
+ }
53
+ /** Builds the dataset from sheet rows (the pure part of the reader) */
54
+ export function datasetFromSheet(file, sheet, rows) {
55
+ const headerIndex = detectHeaderRow(rows);
56
+ if (headerIndex < 0) {
57
+ throw new CapabilityError('EXTRACTION_FAILED', `${file}: sheet "${sheet}" is empty.`, 'Pass a workbook whose first sheet holds a header row and the data rows.');
58
+ }
59
+ const headerCells = rows[headerIndex].map((cell) => (isEmpty(cell) ? null : String(cell)));
60
+ const { columns, notes } = normaliseHeader(headerCells);
61
+ if (headerIndex > 0) {
62
+ notes.push(`Header found on row ${headerIndex + 1} of sheet "${sheet}"; ${headerIndex} row(s) above it skipped.`);
63
+ }
64
+ const body = rows.slice(headerIndex + 1);
65
+ const nonEmpty = body.filter((row) => row.some((cell) => !isEmpty(cell)));
66
+ if (nonEmpty.length < body.length) {
67
+ notes.push(`${body.length - nonEmpty.length} empty row(s) skipped.`);
68
+ }
69
+ const data = rowsFromCells(columns, nonEmpty, notes);
70
+ return {
71
+ columns,
72
+ rows: data,
73
+ source: { file, format: 'xlsx', rowCount: data.length, sheet, headerRow: headerIndex + 1 },
74
+ notes,
75
+ };
76
+ }
77
+ export async function readXlsxDataset(file) {
78
+ const { sheet, rows } = await readFirstSheet(file);
79
+ return datasetFromSheet(file, sheet, rows);
80
+ }
81
+ //# sourceMappingURL=xlsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx.js","sourceRoot":"","sources":["../../../../src/core/scaffold/readers/xlsx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /** Features a schema can show and the demo vocabulary they map to */
2
+ export function featuresOf(schema) {
3
+ const features = [];
4
+ const types = new Set(schema.columns.map((c) => c.cellDataType));
5
+ const enumText = schema.columns.filter((c) => c.enumLike && c.cellDataType === 'text');
6
+ if (enumText.length > 0) {
7
+ features.push({
8
+ id: 'enum',
9
+ label: `${enumText.length} enum-like text column${enumText.length === 1 ? '' : 's'} (${enumText.map((c) => c.field).slice(0, 3).join(', ')})`,
10
+ keywords: ['badge', 'icon', 'styled column', 'row grouping', 'grouping rows', 'pivot', 'in filter'],
11
+ });
12
+ }
13
+ if (types.has('number')) {
14
+ features.push({
15
+ id: 'number',
16
+ label: 'number columns',
17
+ keywords: ['format column', 'number format', 'range bar', 'percent bar', 'calculated column', 'aggregation', 'flashing', 'cell summary', 'quantile', 'weighted average'],
18
+ });
19
+ }
20
+ if (types.has('date')) {
21
+ features.push({ id: 'date', label: 'date columns', keywords: ['date', 'calendar', 'holiday'] });
22
+ }
23
+ if (types.has('boolean')) {
24
+ features.push({ id: 'boolean', label: 'boolean columns', keywords: ['boolean', 'checkbox'] });
25
+ }
26
+ if (types.has('object')) {
27
+ features.push({ id: 'array', label: 'array / object columns', keywords: ['array', 'sparkline'] });
28
+ }
29
+ if (schema.rowCount >= 10_000) {
30
+ features.push({ id: 'volume', label: `${schema.rowCount} rows`, keywords: ['performance', 'big data'] });
31
+ }
32
+ return features;
33
+ }
34
+ const normalise = (text) => (text ?? '').toLowerCase().replace(/[-_/]+/g, ' ');
35
+ /** The best-matching demos, most features matched first, then by name; at most `limit` */
36
+ export function suggestDemos(schema, demos, limit = 10) {
37
+ const features = featuresOf(schema);
38
+ if (features.length === 0) {
39
+ return [];
40
+ }
41
+ const scored = [];
42
+ for (const demo of demos) {
43
+ const haystack = `${normalise(demo.title)} ${normalise(demo.description)} ${normalise(demo.page)} ${normalise(demo.name)}`;
44
+ const matched = features.filter((feature) => feature.keywords.some((keyword) => haystack.includes(keyword)));
45
+ if (matched.length > 0) {
46
+ scored.push({ demo, matched });
47
+ }
48
+ }
49
+ scored.sort((x, y) => y.matched.length - x.matched.length || x.demo.name.localeCompare(y.demo.name));
50
+ return scored.slice(0, limit).map(({ demo, matched }) => ({
51
+ name: demo.name,
52
+ title: demo.title,
53
+ page: demo.page,
54
+ reason: matched.map((f) => f.label).join('; '),
55
+ }));
56
+ }
57
+ //# sourceMappingURL=suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../../../src/core/scaffold/suggestions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Run-time access to `data/templates/` (synced by `scripts/sync-templates.ts`, plan §13):
3
+ * the per-framework manifest and file contents the scaffold overlays (§8.11 Overlay),
4
+ * plus the `AGENTS.md` snippet of Appendix D from the built skills.
5
+ */
6
+ import { existsSync, readFileSync } from 'node:fs';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { CLI_PACKAGE, CLI_RANGE } from '../constants.js';
9
+ import { CapabilityError } from '../envelope.js';
10
+ export const SCAFFOLD_FRAMEWORKS = ['vanilla', 'react', 'angular', 'vue'];
11
+ /** `data/templates/` — same depth from `src/core/scaffold/` and `dist/core/scaffold/` */
12
+ const TEMPLATES_URL = new URL('../../../data/templates/', import.meta.url);
13
+ let cached;
14
+ export function templatesDir() {
15
+ return fileURLToPath(TEMPLATES_URL);
16
+ }
17
+ export function loadTemplatesManifest() {
18
+ if (cached) {
19
+ return cached;
20
+ }
21
+ const file = new URL('manifest.json', TEMPLATES_URL);
22
+ if (!existsSync(file)) {
23
+ throw new CapabilityError('NOT_FOUND', `The scaffold templates are missing from this installation (${fileURLToPath(file)}).`, 'Reinstall the package; in the repository run `npm run generate` to sync data/templates from the docs.');
24
+ }
25
+ cached = JSON.parse(readFileSync(file, 'utf8'));
26
+ return cached;
27
+ }
28
+ /** The content of a template file (`path` as in the manifest) for a framework */
29
+ export function readTemplateFile(framework, path) {
30
+ const file = new URL(`${framework}/${path}`, TEMPLATES_URL);
31
+ if (!existsSync(file)) {
32
+ throw new CapabilityError('NOT_FOUND', `Template file ${framework}/${path} is missing.`, 'Reinstall the package; in the repository run `npm run generate`.');
33
+ }
34
+ return readFileSync(file, 'utf8');
35
+ }
36
+ /** Appendix D markers; kept so a later `ai init` can manage the block idempotently */
37
+ export const AGENTS_SNIPPET_BEGIN = '<!-- BEGIN:adaptable-agent-rules -->';
38
+ export const AGENTS_SNIPPET_END = '<!-- END:adaptable-agent-rules -->';
39
+ /**
40
+ * The `AGENTS.md` snippet: the built copy (`dist/skills/<skill>/references/_shared/agents-snippet.md`,
41
+ * package and range injected by `build-skills.ts`) when running from `dist/`, else the
42
+ * source `skills/_shared/agents-snippet.md` with the placeholders substituted here.
43
+ */
44
+ export function loadAgentsSnippet() {
45
+ const built = new URL('../../skills/adaptable-setup/references/_shared/agents-snippet.md', import.meta.url);
46
+ if (existsSync(built)) {
47
+ return readFileSync(built, 'utf8').trim();
48
+ }
49
+ const source = new URL('../../../skills/_shared/agents-snippet.md', import.meta.url);
50
+ if (existsSync(source)) {
51
+ return readFileSync(source, 'utf8').replaceAll('{{CLI_PACKAGE}}', CLI_PACKAGE).replaceAll('{{CLI_RANGE}}', CLI_RANGE).trim();
52
+ }
53
+ throw new CapabilityError('NOT_FOUND', 'The AGENTS.md snippet is missing from this installation.', 'Reinstall the package; in the repository run `npm run build`.');
54
+ }
55
+ /** `true` when the text already carries the Appendix D block */
56
+ export function hasAgentsSnippet(text) {
57
+ return text.includes(AGENTS_SNIPPET_BEGIN) && text.includes(AGENTS_SNIPPET_END);
58
+ }
59
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/core/scaffold/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * `check setup` (plan §8.6): the static rules over the project plus
3
+ * `setup/options-shape`, the `adaptableOptions` literal type-checked against
4
+ * `AdaptableOptions` from the types package of the project's major.
5
+ */
6
+ import { basename } from 'node:path';
7
+ import { CapabilityError } from '../envelope.js';
8
+ import { packageLocation, sourceOverride } from '../packages/load-entry.js';
9
+ import { resolvePackage } from '../packages/resolve.js';
10
+ import { bundledRenamesFor } from '../changes/records.js';
11
+ import { checkShape } from '../state/type-check.js';
12
+ import { buildSetupContext } from './context.js';
13
+ import { OPTIONS_SHAPE_RULE, runStaticRules } from './rules/index.js';
14
+ const describeExtraction = (extraction, root) => extraction ? `${extraction.source.file.startsWith(root) ? extraction.source.file.slice(root.length + 1) : basename(extraction.source.file)}:${extraction.source.line} (${extraction.source.locatedBy})` : 'not found';
15
+ export async function auditSetup(project, deps = {}) {
16
+ const ctx = buildSetupContext(project, { manifest: deps.manifest, boundary: deps.boundary, major: deps.major });
17
+ const warnings = [];
18
+ const statics = runStaticRules(ctx);
19
+ const issues = [...statics.issues];
20
+ const applied = [...statics.applied];
21
+ let unverifiable = ctx.options?.unverifiable ?? [];
22
+ let optionsShape = 'skipped (no Options literal found)';
23
+ let codeSource;
24
+ let requiresAnotherCheckAfterFix = false;
25
+ if (ctx.options && ctx.options.value && typeof ctx.options.value === 'object' && !Array.isArray(ctx.options.value)) {
26
+ try {
27
+ const override = sourceOverride();
28
+ const resolved = override ? undefined : await resolvePackage({ kind: 'types', major: ctx.major }, { projectDir: project.path, offline: deps.offline, installed: deps.installed });
29
+ const types = override ?? packageLocation(resolved);
30
+ codeSource = resolved?.source;
31
+ const shape = await checkShape({
32
+ value: ctx.options.value,
33
+ type: 'AdaptableOptions',
34
+ types,
35
+ lineMap: ctx.options.lineMap,
36
+ unverifiable: ctx.options.unverifiable,
37
+ renames: deps.renames ?? bundledRenamesFor(ctx.major),
38
+ });
39
+ if (shape.ok) {
40
+ applied.push(OPTIONS_SHAPE_RULE);
41
+ optionsShape = `${shape.checked.types}${shape.checked.agGridTypes ? '' : ' (AG Grid types absent)'}`;
42
+ for (const issue of shape.issues) {
43
+ issues.push({ ...issue, code: OPTIONS_SHAPE_RULE, docs: issue.docs ?? 'technical-reference-adaptable-options', message: `${issue.code === 'shape/unknown-key' ? 'Unknown option' : 'Options shape'}: ${issue.message}` });
44
+ }
45
+ requiresAnotherCheckAfterFix = shape.issues.length > 0;
46
+ const suppressed = new Map();
47
+ for (const s of shape.suppressed) {
48
+ const owner = ctx.options.unverifiable.find((u) => s.path === u.path || s.path.startsWith(`${u.path}.`) || s.path.startsWith(`${u.path}[`));
49
+ if (owner) {
50
+ suppressed.set(owner.path, [...(suppressed.get(owner.path) ?? []), s.message]);
51
+ }
52
+ }
53
+ unverifiable = ctx.options.unverifiable.map((u) => (suppressed.has(u.path) ? { ...u, suppressed: suppressed.get(u.path) } : u));
54
+ }
55
+ else {
56
+ optionsShape = `not checked (${shape.reason})`;
57
+ warnings.push(`The Adaptable Options were not type-checked: ${shape.reason}`);
58
+ }
59
+ }
60
+ catch (error) {
61
+ if (!(error instanceof CapabilityError)) {
62
+ throw error;
63
+ }
64
+ // the other ten rules do not need the types package: degrade, do not fail (unlike `check state`)
65
+ optionsShape = `not checked (${error.code})`;
66
+ warnings.push(`The Adaptable Options were not type-checked: ${error.message} ${error.hint}`);
67
+ }
68
+ }
69
+ return {
70
+ data: {
71
+ checked: {
72
+ project: project.path,
73
+ framework: ctx.framework,
74
+ major: ctx.major,
75
+ files: { sources: ctx.sources.length, styles: ctx.styles.length },
76
+ options: describeExtraction(ctx.options, project.path),
77
+ optionsShape,
78
+ columnDefs: describeExtraction(ctx.columnDefs, project.path),
79
+ state: describeExtraction(ctx.state, project.path),
80
+ manifest: ctx.manifest ? 'yes' : 'no',
81
+ },
82
+ rules: applied,
83
+ unverifiable,
84
+ requiresAnotherCheckAfterFix,
85
+ },
86
+ issues,
87
+ warnings,
88
+ ...(codeSource ? { codeSource } : {}),
89
+ };
90
+ }
91
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/core/setup/audit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,EAAE,eAAe,EAAc,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAsB,MAAM,2BAA2B,CAAC;AAChG,OAAO,EAAE,cAAc,EAAyB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAyCtE,MAAM,kBAAkB,GAAG,CAAC,UAAmC,EAAE,IAAY,EAAU,EAAE,CACvF,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;AAExN,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAwB,EAAE,OAAkB,EAAE;IAC7E,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAChH,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,MAAM,GAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,YAAY,GAAmC,GAAG,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;IACnF,IAAI,YAAY,GAAG,oCAAoC,CAAC;IACxD,IAAI,UAA0C,CAAC;IAC/C,IAAI,4BAA4B,GAAG,KAAK,CAAC;IAEzC,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAClL,MAAM,KAAK,GAAkB,QAAQ,IAAI,eAAe,CAAC,QAAS,CAAC,CAAC;YACpE,UAAU,GAAG,QAAQ,EAAE,MAAM,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC;gBAC7B,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK;gBACxB,IAAI,EAAE,kBAAkB;gBACxB,KAAK;gBACL,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;gBAC5B,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY;gBACtC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;aACtD,CAAC,CAAC;YACH,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACjC,YAAY,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;gBACrG,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,uCAAuC,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC5N,CAAC;gBACD,4BAA4B,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACvD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;gBAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACjC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;oBAC5I,IAAI,KAAK,EAAE,CAAC;wBACV,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;gBACD,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnI,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,gBAAgB,KAAK,CAAC,MAAM,GAAG,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC,gDAAgD,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,eAAe,CAAC,EAAE,CAAC;gBACxC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,iGAAiG;YACjG,YAAY,GAAG,gBAAgB,KAAK,CAAC,IAAI,GAAG,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC,gDAAgD,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;gBACjE,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;gBACtD,YAAY;gBACZ,UAAU,EAAE,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC;gBAC5D,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;gBAClD,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;aACtC;YACD,KAAK,EAAE,OAAO;YACd,YAAY;YACZ,4BAA4B;SAC7B;QACD,MAAM;QACN,QAAQ;QACR,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * `adaptable check setup [--cwd <dir>] [--project <path>]` · MCP `check_setup` (stdio only) — plan §8.6.
3
+ */
4
+ import { resolve } from 'node:path';
5
+ import { z } from 'zod';
6
+ import { registerCapability } from '../capabilities.js';
7
+ import { getManifestInfo } from '../compat/manifest.js';
8
+ import { findProjects } from '../context/projects.js';
9
+ import { FRAMEWORKS } from '../docs/corpus.js';
10
+ import { CapabilityError, ok } from '../envelope.js';
11
+ import { auditSetup } from './audit.js';
12
+ const Position = z.object({ file: z.string(), line: z.number(), column: z.number() });
13
+ const CheckSetupOutput = z.object({
14
+ checked: z.object({
15
+ project: z.string(),
16
+ framework: z.enum(FRAMEWORKS),
17
+ major: z.number(),
18
+ files: z.object({ sources: z.number(), styles: z.number() }),
19
+ options: z.string(),
20
+ optionsShape: z.string(),
21
+ columnDefs: z.string(),
22
+ state: z.string(),
23
+ manifest: z.enum(['yes', 'no']),
24
+ }),
25
+ rules: z.array(z.string()),
26
+ unverifiable: z.array(Position.extend({ path: z.string(), kind: z.string(), reason: z.string(), suppressed: z.array(z.string()).optional() })),
27
+ requiresAnotherCheckAfterFix: z.boolean(),
28
+ });
29
+ registerCapability({
30
+ name: 'check-setup',
31
+ description: 'Audits how AdapTable is wired into a project: stylesheet, required options, licence literal, version skew, AG Grid modules, column typing, direct grid use, ColDef ownership, React refs, ready hook, and the Options shape against the major’s types.',
32
+ cli: { command: ['check', 'setup'] },
33
+ mcp: { tool: 'check_setup', stdioOnly: true },
34
+ input: z.object({
35
+ project: z.string().optional().describe('Project folder (its package.json) when the cwd holds several or none'),
36
+ }),
37
+ output: CheckSetupOutput,
38
+ run: async (input, ctx) => {
39
+ const start = input.project ? resolve(ctx.cwd, input.project) : ctx.cwd;
40
+ const projects = findProjects(start);
41
+ if (!projects.length) {
42
+ throw new CapabilityError('NO_ADAPTABLE_DEPENDENCY', `No package.json depending on @adaptabletools/adaptable was found at or below ${start}.`, 'Run inside the project, pass --project <folder>, or use the adaptable-setup skill to add AdapTable first.');
43
+ }
44
+ if (projects.length > 1) {
45
+ throw new CapabilityError('MULTIPLE_PROJECTS', `${projects.length} AdapTable projects were found below ${start}: ${projects.map((p) => p.path).join(', ')}.`, 'Pass --project <folder> to pick one.');
46
+ }
47
+ const [project] = projects;
48
+ const resolution = await ctx.resolveContext();
49
+ const manifest = await getManifestInfo(ctx.manifest);
50
+ const result = await auditSetup(project, { manifest, offline: ctx.globals.offline, major: ctx.globals.major });
51
+ return ok(result.data, {
52
+ issues: result.issues,
53
+ warnings: [...resolution.warnings, ...result.warnings],
54
+ resolvedContext: { ...resolution.context, ...(result.codeSource ? { codeSource: result.codeSource } : {}) },
55
+ });
56
+ },
57
+ markdown: (data, envelope) => {
58
+ const errors = envelope.issues.filter((i) => i.severity === 'error').length;
59
+ const warnings = envelope.issues.filter((i) => i.severity === 'warning').length;
60
+ const lines = [
61
+ `# check setup — ${errors ? `${errors} error${errors === 1 ? '' : 's'}` : 'no errors'}${warnings ? `, ${warnings} warning${warnings === 1 ? '' : 's'}` : ''}`,
62
+ '',
63
+ `- Project: ${data.checked.project} (${data.checked.framework}, AdapTable ${data.checked.major}); ${data.checked.files.sources} source and ${data.checked.files.styles} style files scanned`,
64
+ `- Options: ${data.checked.options}; shape ${data.checked.optionsShape}`,
65
+ `- columnDefs: ${data.checked.columnDefs}; State: ${data.checked.state}; manifest ${data.checked.manifest}`,
66
+ `- Rules: ${data.rules.join(', ')}`,
67
+ ];
68
+ if (data.unverifiable.length) {
69
+ lines.push('', '## Options not verifiable statically', '');
70
+ for (const u of data.unverifiable) {
71
+ lines.push(`- \`${u.path || '(root)'}\` — ${u.reason} (${u.file}:${u.line}:${u.column})`);
72
+ }
73
+ }
74
+ if (data.requiresAnotherCheckAfterFix) {
75
+ lines.push('', '_The Options type-check reports one problem per property; run `check setup` again after fixing._');
76
+ }
77
+ return lines.join('\n');
78
+ },
79
+ });
80
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/core/setup/capabilities.ts"],"names":[],"mappings":"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"}