@ffschrattenecker/tm1-mcp-server 6.0.0

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 (475) hide show
  1. package/CHANGELOG.md +1211 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE +34 -0
  4. package/README.md +276 -0
  5. package/dist/config.d.ts +35 -0
  6. package/dist/config.js +238 -0
  7. package/dist/http-transport.d.ts +8 -0
  8. package/dist/http-transport.js +132 -0
  9. package/dist/index.d.ts +18 -0
  10. package/dist/index.js +164 -0
  11. package/dist/lib/callgraph/callGraph.d.ts +124 -0
  12. package/dist/lib/callgraph/callGraph.js +334 -0
  13. package/dist/lib/callgraph/choreGraph.d.ts +23 -0
  14. package/dist/lib/callgraph/choreGraph.js +102 -0
  15. package/dist/lib/callgraph/dataFlow.d.ts +74 -0
  16. package/dist/lib/callgraph/dataFlow.js +271 -0
  17. package/dist/lib/callgraph/datasourceMembership.d.ts +31 -0
  18. package/dist/lib/callgraph/datasourceMembership.js +142 -0
  19. package/dist/lib/callgraph/lintTypes.d.ts +28 -0
  20. package/dist/lib/callgraph/lintTypes.js +2 -0
  21. package/dist/lib/callgraph/mdxMembers.d.ts +29 -0
  22. package/dist/lib/callgraph/mdxMembers.js +97 -0
  23. package/dist/lib/callgraph/referenceIndex.d.ts +179 -0
  24. package/dist/lib/callgraph/referenceIndex.js +584 -0
  25. package/dist/lib/callgraph/rulesLinter.d.ts +55 -0
  26. package/dist/lib/callgraph/rulesLinter.js +776 -0
  27. package/dist/lib/callgraph/rulesParser.d.ts +26 -0
  28. package/dist/lib/callgraph/rulesParser.js +71 -0
  29. package/dist/lib/callgraph/subsetUsage.d.ts +16 -0
  30. package/dist/lib/callgraph/subsetUsage.js +134 -0
  31. package/dist/lib/callgraph/tiParser.d.ts +21 -0
  32. package/dist/lib/callgraph/tiParser.js +672 -0
  33. package/dist/lib/callgraph/tiSignatures.d.ts +32 -0
  34. package/dist/lib/callgraph/tiSignatures.js +6185 -0
  35. package/dist/lib/callgraph/tm1-adapter.d.ts +32 -0
  36. package/dist/lib/callgraph/tm1-adapter.js +159 -0
  37. package/dist/lib/callgraph/types.d.ts +53 -0
  38. package/dist/lib/callgraph/types.js +2 -0
  39. package/dist/lib/callgraph/variableEnv.d.ts +86 -0
  40. package/dist/lib/callgraph/variableEnv.js +214 -0
  41. package/dist/lib/cell-address.d.ts +12 -0
  42. package/dist/lib/cell-address.js +71 -0
  43. package/dist/lib/complexity/antipatterns.d.ts +22 -0
  44. package/dist/lib/complexity/antipatterns.js +302 -0
  45. package/dist/lib/complexity/comment-classifier.d.ts +24 -0
  46. package/dist/lib/complexity/comment-classifier.js +43 -0
  47. package/dist/lib/complexity/cross-process.d.ts +78 -0
  48. package/dist/lib/complexity/cross-process.js +114 -0
  49. package/dist/lib/complexity/process-metrics.d.ts +78 -0
  50. package/dist/lib/complexity/process-metrics.js +278 -0
  51. package/dist/lib/complexity/rules-metrics.d.ts +31 -0
  52. package/dist/lib/complexity/rules-metrics.js +99 -0
  53. package/dist/lib/concurrency.d.ts +11 -0
  54. package/dist/lib/concurrency.js +27 -0
  55. package/dist/lib/control-name.d.ts +10 -0
  56. package/dist/lib/control-name.js +10 -0
  57. package/dist/lib/coordinate-error.d.ts +3 -0
  58. package/dist/lib/coordinate-error.js +29 -0
  59. package/dist/lib/credential-format.d.ts +23 -0
  60. package/dist/lib/credential-format.js +25 -0
  61. package/dist/lib/cube-stats/fetcher.d.ts +106 -0
  62. package/dist/lib/cube-stats/fetcher.js +194 -0
  63. package/dist/lib/feeders/brackets.d.ts +47 -0
  64. package/dist/lib/feeders/brackets.js +195 -0
  65. package/dist/lib/feeders/element-type-cache.d.ts +42 -0
  66. package/dist/lib/feeders/element-type-cache.js +86 -0
  67. package/dist/lib/feeders/static-heuristics.d.ts +101 -0
  68. package/dist/lib/feeders/static-heuristics.js +202 -0
  69. package/dist/lib/git-process.d.ts +67 -0
  70. package/dist/lib/git-process.js +243 -0
  71. package/dist/lib/mask-secrets.d.ts +10 -0
  72. package/dist/lib/mask-secrets.js +99 -0
  73. package/dist/lib/mdx.d.ts +3 -0
  74. package/dist/lib/mdx.js +13 -0
  75. package/dist/lib/naming/odata-filter.d.ts +15 -0
  76. package/dist/lib/naming/odata-filter.js +81 -0
  77. package/dist/lib/naming/rules.d.ts +34 -0
  78. package/dist/lib/naming/rules.js +215 -0
  79. package/dist/lib/pro-parser.d.ts +19 -0
  80. package/dist/lib/pro-parser.js +260 -0
  81. package/dist/lib/pro-serializer.d.ts +19 -0
  82. package/dist/lib/pro-serializer.js +170 -0
  83. package/dist/lib/process-parts-schema.d.ts +45 -0
  84. package/dist/lib/process-parts-schema.js +46 -0
  85. package/dist/lib/process-refs.d.ts +88 -0
  86. package/dist/lib/process-refs.js +441 -0
  87. package/dist/lib/rules-outline.d.ts +29 -0
  88. package/dist/lib/rules-outline.js +68 -0
  89. package/dist/lib/rules-patch.d.ts +6 -0
  90. package/dist/lib/rules-patch.js +59 -0
  91. package/dist/lib/safe-regex.d.ts +15 -0
  92. package/dist/lib/safe-regex.js +37 -0
  93. package/dist/lib/sample-cells.d.ts +48 -0
  94. package/dist/lib/sample-cells.js +146 -0
  95. package/dist/lib/slim-json-schema.d.ts +20 -0
  96. package/dist/lib/slim-json-schema.js +68 -0
  97. package/dist/lib/strip-comments.d.ts +23 -0
  98. package/dist/lib/strip-comments.js +61 -0
  99. package/dist/lib/tm1-events.d.ts +16 -0
  100. package/dist/lib/tm1-events.js +29 -0
  101. package/dist/lib/v12-compat/deprecated-ti.d.ts +17 -0
  102. package/dist/lib/v12-compat/deprecated-ti.js +257 -0
  103. package/dist/lib/v12-compat/scanner.d.ts +10 -0
  104. package/dist/lib/v12-compat/scanner.js +43 -0
  105. package/dist/lib/variables-ui-data.d.ts +26 -0
  106. package/dist/lib/variables-ui-data.js +77 -0
  107. package/dist/load-env.d.ts +2 -0
  108. package/dist/load-env.js +29 -0
  109. package/dist/logger.d.ts +4 -0
  110. package/dist/logger.js +60 -0
  111. package/dist/prompts/index.d.ts +3 -0
  112. package/dist/prompts/index.js +141 -0
  113. package/dist/resources/index.d.ts +5 -0
  114. package/dist/resources/index.js +237 -0
  115. package/dist/resources/list-handler.d.ts +40 -0
  116. package/dist/resources/list-handler.js +86 -0
  117. package/dist/resources/subscriptions.d.ts +19 -0
  118. package/dist/resources/subscriptions.js +80 -0
  119. package/dist/schemas/cells.d.ts +17 -0
  120. package/dist/schemas/cells.js +13 -0
  121. package/dist/schemas/common.d.ts +16 -0
  122. package/dist/schemas/common.js +14 -0
  123. package/dist/schemas/index.d.ts +10 -0
  124. package/dist/schemas/index.js +23 -0
  125. package/dist/schemas/metadata.d.ts +70 -0
  126. package/dist/schemas/metadata.js +47 -0
  127. package/dist/schemas/monitoring.d.ts +95 -0
  128. package/dist/schemas/monitoring.js +69 -0
  129. package/dist/schemas/processes.d.ts +74 -0
  130. package/dist/schemas/processes.js +66 -0
  131. package/dist/schemas/scheduling.d.ts +13 -0
  132. package/dist/schemas/scheduling.js +13 -0
  133. package/dist/schemas/security.d.ts +19 -0
  134. package/dist/schemas/security.js +16 -0
  135. package/dist/schemas/subsets.d.ts +12 -0
  136. package/dist/schemas/subsets.js +12 -0
  137. package/dist/schemas/views.d.ts +9 -0
  138. package/dist/schemas/views.js +9 -0
  139. package/dist/session-manager.d.ts +79 -0
  140. package/dist/session-manager.js +281 -0
  141. package/dist/tm1-client/connection/profile.d.ts +13 -0
  142. package/dist/tm1-client/connection/profile.js +99 -0
  143. package/dist/tm1-client/dispatcher.d.ts +5 -0
  144. package/dist/tm1-client/dispatcher.js +31 -0
  145. package/dist/tm1-client/http.d.ts +81 -0
  146. package/dist/tm1-client/http.js +547 -0
  147. package/dist/tm1-client/services/batch-service.d.ts +123 -0
  148. package/dist/tm1-client/services/batch-service.js +455 -0
  149. package/dist/tm1-client/services/cell-service.d.ts +71 -0
  150. package/dist/tm1-client/services/cell-service.js +333 -0
  151. package/dist/tm1-client/services/cellset-transform.d.ts +26 -0
  152. package/dist/tm1-client/services/cellset-transform.js +80 -0
  153. package/dist/tm1-client/services/chore-service.d.ts +68 -0
  154. package/dist/tm1-client/services/chore-service.js +179 -0
  155. package/dist/tm1-client/services/chore-status.d.ts +11 -0
  156. package/dist/tm1-client/services/chore-status.js +127 -0
  157. package/dist/tm1-client/services/cube-service.d.ts +134 -0
  158. package/dist/tm1-client/services/cube-service.js +294 -0
  159. package/dist/tm1-client/services/dimension-service.d.ts +118 -0
  160. package/dist/tm1-client/services/dimension-service.js +249 -0
  161. package/dist/tm1-client/services/element-service.d.ts +245 -0
  162. package/dist/tm1-client/services/element-service.js +809 -0
  163. package/dist/tm1-client/services/fallback.d.ts +44 -0
  164. package/dist/tm1-client/services/fallback.js +72 -0
  165. package/dist/tm1-client/services/file-service.d.ts +53 -0
  166. package/dist/tm1-client/services/file-service.js +218 -0
  167. package/dist/tm1-client/services/hierarchy-service.d.ts +129 -0
  168. package/dist/tm1-client/services/hierarchy-service.js +332 -0
  169. package/dist/tm1-client/services/monitoring-service.d.ts +34 -0
  170. package/dist/tm1-client/services/monitoring-service.js +123 -0
  171. package/dist/tm1-client/services/odata-page.d.ts +71 -0
  172. package/dist/tm1-client/services/odata-page.js +87 -0
  173. package/dist/tm1-client/services/process-service.d.ts +278 -0
  174. package/dist/tm1-client/services/process-service.js +874 -0
  175. package/dist/tm1-client/services/process-status.d.ts +21 -0
  176. package/dist/tm1-client/services/process-status.js +89 -0
  177. package/dist/tm1-client/services/security-service.d.ts +50 -0
  178. package/dist/tm1-client/services/security-service.js +93 -0
  179. package/dist/tm1-client/services/server-service.d.ts +116 -0
  180. package/dist/tm1-client/services/server-service.js +504 -0
  181. package/dist/tm1-client/services/subset-service.d.ts +37 -0
  182. package/dist/tm1-client/services/subset-service.js +122 -0
  183. package/dist/tm1-client/services/view-service.d.ts +46 -0
  184. package/dist/tm1-client/services/view-service.js +287 -0
  185. package/dist/tm1-client.d.ts +56 -0
  186. package/dist/tm1-client.js +126 -0
  187. package/dist/tools/analysis/analyze-callgraph.d.ts +28 -0
  188. package/dist/tools/analysis/analyze-callgraph.js +350 -0
  189. package/dist/tools/analysis/analyze-chore-graph.d.ts +2 -0
  190. package/dist/tools/analysis/analyze-chore-graph.js +148 -0
  191. package/dist/tools/analysis/analyze-object-usage.d.ts +2 -0
  192. package/dist/tools/analysis/analyze-object-usage.js +143 -0
  193. package/dist/tools/analysis/audit-complexity.d.ts +2 -0
  194. package/dist/tools/analysis/audit-complexity.js +255 -0
  195. package/dist/tools/analysis/audit-feeders.d.ts +2 -0
  196. package/dist/tools/analysis/audit-feeders.js +417 -0
  197. package/dist/tools/analysis/audit-naming.d.ts +2 -0
  198. package/dist/tools/analysis/audit-naming.js +379 -0
  199. package/dist/tools/analysis/check-v12-readiness.d.ts +2 -0
  200. package/dist/tools/analysis/check-v12-readiness.js +136 -0
  201. package/dist/tools/analysis/find-orphan-dimensions.d.ts +2 -0
  202. package/dist/tools/analysis/find-orphan-dimensions.js +55 -0
  203. package/dist/tools/analysis/invalidate-callgraph-cache.d.ts +2 -0
  204. package/dist/tools/analysis/invalidate-callgraph-cache.js +40 -0
  205. package/dist/tools/analysis/trace-data-flow.d.ts +2 -0
  206. package/dist/tools/analysis/trace-data-flow.js +138 -0
  207. package/dist/tools/annotations.d.ts +12 -0
  208. package/dist/tools/annotations.js +61 -0
  209. package/dist/tools/celldata/check-feeders.d.ts +2 -0
  210. package/dist/tools/celldata/check-feeders.js +48 -0
  211. package/dist/tools/celldata/check-writable-coords.d.ts +2 -0
  212. package/dist/tools/celldata/check-writable-coords.js +126 -0
  213. package/dist/tools/celldata/execute-mdx.d.ts +17 -0
  214. package/dist/tools/celldata/execute-mdx.js +126 -0
  215. package/dist/tools/celldata/get-cell-value.d.ts +2 -0
  216. package/dist/tools/celldata/get-cell-value.js +30 -0
  217. package/dist/tools/celldata/get-view-definition.d.ts +2 -0
  218. package/dist/tools/celldata/get-view-definition.js +29 -0
  219. package/dist/tools/celldata/get-view.d.ts +2 -0
  220. package/dist/tools/celldata/get-view.js +55 -0
  221. package/dist/tools/celldata/sample-cells.d.ts +2 -0
  222. package/dist/tools/celldata/sample-cells.js +101 -0
  223. package/dist/tools/celldata/trace-cell-calculation.d.ts +2 -0
  224. package/dist/tools/celldata/trace-cell-calculation.js +53 -0
  225. package/dist/tools/celldata/trace-feeders.d.ts +2 -0
  226. package/dist/tools/celldata/trace-feeders.js +44 -0
  227. package/dist/tools/celldata/write-cells.d.ts +2 -0
  228. package/dist/tools/celldata/write-cells.js +65 -0
  229. package/dist/tools/confirm.d.ts +10 -0
  230. package/dist/tools/confirm.js +64 -0
  231. package/dist/tools/define-tool.d.ts +51 -0
  232. package/dist/tools/define-tool.js +49 -0
  233. package/dist/tools/dimension-management/bulk-upsert-elements.d.ts +2 -0
  234. package/dist/tools/dimension-management/bulk-upsert-elements.js +103 -0
  235. package/dist/tools/dimension-management/create-dimension.d.ts +2 -0
  236. package/dist/tools/dimension-management/create-dimension.js +22 -0
  237. package/dist/tools/dimension-management/create-element-attribute.d.ts +2 -0
  238. package/dist/tools/dimension-management/create-element-attribute.js +26 -0
  239. package/dist/tools/dimension-management/create-element.d.ts +2 -0
  240. package/dist/tools/dimension-management/create-element.js +31 -0
  241. package/dist/tools/dimension-management/create-hierarchy.d.ts +2 -0
  242. package/dist/tools/dimension-management/create-hierarchy.js +22 -0
  243. package/dist/tools/dimension-management/delete-dimension.d.ts +2 -0
  244. package/dist/tools/dimension-management/delete-dimension.js +25 -0
  245. package/dist/tools/dimension-management/delete-element.d.ts +2 -0
  246. package/dist/tools/dimension-management/delete-element.js +26 -0
  247. package/dist/tools/dimension-management/delete-elements.d.ts +2 -0
  248. package/dist/tools/dimension-management/delete-elements.js +44 -0
  249. package/dist/tools/dimension-management/delete-hierarchy.d.ts +2 -0
  250. package/dist/tools/dimension-management/delete-hierarchy.js +35 -0
  251. package/dist/tools/dimension-management/get-element-attribute-values.d.ts +2 -0
  252. package/dist/tools/dimension-management/get-element-attribute-values.js +77 -0
  253. package/dist/tools/dimension-management/list-element-attributes.d.ts +2 -0
  254. package/dist/tools/dimension-management/list-element-attributes.js +31 -0
  255. package/dist/tools/dimension-management/move-element.d.ts +2 -0
  256. package/dist/tools/dimension-management/move-element.js +28 -0
  257. package/dist/tools/dimension-management/update-element-attribute-value.d.ts +2 -0
  258. package/dist/tools/dimension-management/update-element-attribute-value.js +80 -0
  259. package/dist/tools/dimension-management/update-element.d.ts +2 -0
  260. package/dist/tools/dimension-management/update-element.js +35 -0
  261. package/dist/tools/error-format.d.ts +22 -0
  262. package/dist/tools/error-format.js +130 -0
  263. package/dist/tools/fileops/delete-file.d.ts +2 -0
  264. package/dist/tools/fileops/delete-file.js +32 -0
  265. package/dist/tools/fileops/get-file-content.d.ts +2 -0
  266. package/dist/tools/fileops/get-file-content.js +76 -0
  267. package/dist/tools/fileops/list-files.d.ts +2 -0
  268. package/dist/tools/fileops/list-files.js +43 -0
  269. package/dist/tools/fileops/search-files.d.ts +2 -0
  270. package/dist/tools/fileops/search-files.js +76 -0
  271. package/dist/tools/fileops/upload-file.d.ts +2 -0
  272. package/dist/tools/fileops/upload-file.js +69 -0
  273. package/dist/tools/format.d.ts +57 -0
  274. package/dist/tools/format.js +157 -0
  275. package/dist/tools/hierarchy.d.ts +6 -0
  276. package/dist/tools/hierarchy.js +27 -0
  277. package/dist/tools/index.d.ts +4 -0
  278. package/dist/tools/index.js +263 -0
  279. package/dist/tools/local-file.d.ts +16 -0
  280. package/dist/tools/local-file.js +88 -0
  281. package/dist/tools/metadata/get-ancestors.d.ts +2 -0
  282. package/dist/tools/metadata/get-ancestors.js +36 -0
  283. package/dist/tools/metadata/get-descendants.d.ts +2 -0
  284. package/dist/tools/metadata/get-descendants.js +64 -0
  285. package/dist/tools/metadata/get-hierarchy.d.ts +2 -0
  286. package/dist/tools/metadata/get-hierarchy.js +130 -0
  287. package/dist/tools/metadata/list-chores.d.ts +2 -0
  288. package/dist/tools/metadata/list-chores.js +62 -0
  289. package/dist/tools/metadata/list-cubes.d.ts +2 -0
  290. package/dist/tools/metadata/list-cubes.js +128 -0
  291. package/dist/tools/metadata/list-dimensions.d.ts +2 -0
  292. package/dist/tools/metadata/list-dimensions.js +131 -0
  293. package/dist/tools/metadata/list-processes-grouped.d.ts +2 -0
  294. package/dist/tools/metadata/list-processes-grouped.js +96 -0
  295. package/dist/tools/metadata/list-processes.d.ts +2 -0
  296. package/dist/tools/metadata/list-processes.js +108 -0
  297. package/dist/tools/metadata/resolve-default-members.d.ts +2 -0
  298. package/dist/tools/metadata/resolve-default-members.js +46 -0
  299. package/dist/tools/model-building/check-cube-rule.d.ts +2 -0
  300. package/dist/tools/model-building/check-cube-rule.js +51 -0
  301. package/dist/tools/model-building/clear-cube.d.ts +2 -0
  302. package/dist/tools/model-building/clear-cube.js +46 -0
  303. package/dist/tools/model-building/create-cube.d.ts +2 -0
  304. package/dist/tools/model-building/create-cube.js +34 -0
  305. package/dist/tools/model-building/delete-cube.d.ts +2 -0
  306. package/dist/tools/model-building/delete-cube.js +27 -0
  307. package/dist/tools/model-building/get-all-cube-rules.d.ts +2 -0
  308. package/dist/tools/model-building/get-all-cube-rules.js +149 -0
  309. package/dist/tools/model-building/get-cube-rules.d.ts +2 -0
  310. package/dist/tools/model-building/get-cube-rules.js +69 -0
  311. package/dist/tools/model-building/rules-source.d.ts +21 -0
  312. package/dist/tools/model-building/rules-source.js +49 -0
  313. package/dist/tools/model-building/search-rules.d.ts +2 -0
  314. package/dist/tools/model-building/search-rules.js +132 -0
  315. package/dist/tools/model-building/set-cube-rules.d.ts +2 -0
  316. package/dist/tools/model-building/set-cube-rules.js +81 -0
  317. package/dist/tools/model-building/unload-cube.d.ts +2 -0
  318. package/dist/tools/model-building/unload-cube.js +23 -0
  319. package/dist/tools/operations/diagnose-process-error.d.ts +2 -0
  320. package/dist/tools/operations/diagnose-process-error.js +178 -0
  321. package/dist/tools/operations/error-log-helpers.d.ts +25 -0
  322. package/dist/tools/operations/error-log-helpers.js +57 -0
  323. package/dist/tools/operations/get-audit-log.d.ts +2 -0
  324. package/dist/tools/operations/get-audit-log.js +70 -0
  325. package/dist/tools/operations/get-cube-stats.d.ts +2 -0
  326. package/dist/tools/operations/get-cube-stats.js +107 -0
  327. package/dist/tools/operations/get-error-log-content.d.ts +2 -0
  328. package/dist/tools/operations/get-error-log-content.js +164 -0
  329. package/dist/tools/operations/get-jobs.d.ts +3 -0
  330. package/dist/tools/operations/get-jobs.js +51 -0
  331. package/dist/tools/operations/get-message-log.d.ts +2 -0
  332. package/dist/tools/operations/get-message-log.js +63 -0
  333. package/dist/tools/operations/get-server-info.d.ts +2 -0
  334. package/dist/tools/operations/get-server-info.js +180 -0
  335. package/dist/tools/operations/get-server-state.d.ts +2 -0
  336. package/dist/tools/operations/get-server-state.js +129 -0
  337. package/dist/tools/operations/get-sessions.d.ts +2 -0
  338. package/dist/tools/operations/get-sessions.js +76 -0
  339. package/dist/tools/operations/get-threads.d.ts +3 -0
  340. package/dist/tools/operations/get-threads.js +50 -0
  341. package/dist/tools/operations/get-transaction-log.d.ts +2 -0
  342. package/dist/tools/operations/get-transaction-log.js +63 -0
  343. package/dist/tools/operations/list-error-logs.d.ts +8 -0
  344. package/dist/tools/operations/list-error-logs.js +157 -0
  345. package/dist/tools/operations/save-data.d.ts +2 -0
  346. package/dist/tools/operations/save-data.js +50 -0
  347. package/dist/tools/pagination.d.ts +32 -0
  348. package/dist/tools/pagination.js +116 -0
  349. package/dist/tools/scheduling/create-chore.d.ts +2 -0
  350. package/dist/tools/scheduling/create-chore.js +93 -0
  351. package/dist/tools/scheduling/delete-chore.d.ts +2 -0
  352. package/dist/tools/scheduling/delete-chore.js +22 -0
  353. package/dist/tools/scheduling/execute-chore.d.ts +2 -0
  354. package/dist/tools/scheduling/execute-chore.js +52 -0
  355. package/dist/tools/scheduling/toggle-chore.d.ts +2 -0
  356. package/dist/tools/scheduling/toggle-chore.js +22 -0
  357. package/dist/tools/scheduling/update-chore.d.ts +2 -0
  358. package/dist/tools/scheduling/update-chore.js +71 -0
  359. package/dist/tools/schemas/common.d.ts +10 -0
  360. package/dist/tools/schemas/common.js +23 -0
  361. package/dist/tools/schemas/items-analysis.d.ts +394 -0
  362. package/dist/tools/schemas/items-analysis.js +419 -0
  363. package/dist/tools/schemas/items-cells.d.ts +70 -0
  364. package/dist/tools/schemas/items-cells.js +65 -0
  365. package/dist/tools/schemas/items-common.d.ts +18 -0
  366. package/dist/tools/schemas/items-common.js +39 -0
  367. package/dist/tools/schemas/items-fileops.d.ts +11 -0
  368. package/dist/tools/schemas/items-fileops.js +13 -0
  369. package/dist/tools/schemas/items-metadata.d.ts +262 -0
  370. package/dist/tools/schemas/items-metadata.js +184 -0
  371. package/dist/tools/schemas/items-monitoring.d.ts +79 -0
  372. package/dist/tools/schemas/items-monitoring.js +78 -0
  373. package/dist/tools/schemas/items-processes.d.ts +279 -0
  374. package/dist/tools/schemas/items-processes.js +235 -0
  375. package/dist/tools/schemas/items-scheduling.d.ts +25 -0
  376. package/dist/tools/schemas/items-scheduling.js +26 -0
  377. package/dist/tools/schemas/items-security.d.ts +19 -0
  378. package/dist/tools/schemas/items-security.js +12 -0
  379. package/dist/tools/schemas/items-subsets.d.ts +2 -0
  380. package/dist/tools/schemas/items-subsets.js +4 -0
  381. package/dist/tools/schemas/items-views.d.ts +38 -0
  382. package/dist/tools/schemas/items-views.js +26 -0
  383. package/dist/tools/schemas/items.d.ts +12 -0
  384. package/dist/tools/schemas/items.js +23 -0
  385. package/dist/tools/schemas/markdown-capable.d.ts +21 -0
  386. package/dist/tools/schemas/markdown-capable.js +58 -0
  387. package/dist/tools/schemas/output-schema.d.ts +24 -0
  388. package/dist/tools/schemas/output-schema.js +25 -0
  389. package/dist/tools/security/assign-client-group.d.ts +2 -0
  390. package/dist/tools/security/assign-client-group.js +20 -0
  391. package/dist/tools/security/create-client.d.ts +2 -0
  392. package/dist/tools/security/create-client.js +28 -0
  393. package/dist/tools/security/delete-client.d.ts +2 -0
  394. package/dist/tools/security/delete-client.js +22 -0
  395. package/dist/tools/security/get-client.d.ts +2 -0
  396. package/dist/tools/security/get-client.js +20 -0
  397. package/dist/tools/security/list-clients.d.ts +2 -0
  398. package/dist/tools/security/list-clients.js +86 -0
  399. package/dist/tools/security/list-groups.d.ts +2 -0
  400. package/dist/tools/security/list-groups.js +43 -0
  401. package/dist/tools/security/remove-client-group.d.ts +2 -0
  402. package/dist/tools/security/remove-client-group.js +27 -0
  403. package/dist/tools/security/update-client.d.ts +2 -0
  404. package/dist/tools/security/update-client.js +22 -0
  405. package/dist/tools/subsets/create-subset.d.ts +2 -0
  406. package/dist/tools/subsets/create-subset.js +44 -0
  407. package/dist/tools/subsets/delete-subset.d.ts +2 -0
  408. package/dist/tools/subsets/delete-subset.js +26 -0
  409. package/dist/tools/subsets/get-subset.d.ts +2 -0
  410. package/dist/tools/subsets/get-subset.js +29 -0
  411. package/dist/tools/subsets/list-subsets.d.ts +2 -0
  412. package/dist/tools/subsets/list-subsets.js +36 -0
  413. package/dist/tools/subsets/update-subset.d.ts +2 -0
  414. package/dist/tools/subsets/update-subset.js +33 -0
  415. package/dist/tools/ti-development/check-process-code.d.ts +2 -0
  416. package/dist/tools/ti-development/check-process-code.js +96 -0
  417. package/dist/tools/ti-development/compile-process.d.ts +2 -0
  418. package/dist/tools/ti-development/compile-process.js +32 -0
  419. package/dist/tools/ti-development/copy-process.d.ts +2 -0
  420. package/dist/tools/ti-development/copy-process.js +32 -0
  421. package/dist/tools/ti-development/delete-process.d.ts +2 -0
  422. package/dist/tools/ti-development/delete-process.js +26 -0
  423. package/dist/tools/ti-development/diff-process-with-file.d.ts +2 -0
  424. package/dist/tools/ti-development/diff-process-with-file.js +208 -0
  425. package/dist/tools/ti-development/diff-processes.d.ts +2 -0
  426. package/dist/tools/ti-development/diff-processes.js +312 -0
  427. package/dist/tools/ti-development/execute-process.d.ts +8 -0
  428. package/dist/tools/ti-development/execute-process.js +109 -0
  429. package/dist/tools/ti-development/export-process-to-git.d.ts +2 -0
  430. package/dist/tools/ti-development/export-process-to-git.js +113 -0
  431. package/dist/tools/ti-development/export-process-to-pro.d.ts +2 -0
  432. package/dist/tools/ti-development/export-process-to-pro.js +117 -0
  433. package/dist/tools/ti-development/get-all-processes-code.d.ts +2 -0
  434. package/dist/tools/ti-development/get-all-processes-code.js +131 -0
  435. package/dist/tools/ti-development/get-process-code.d.ts +2 -0
  436. package/dist/tools/ti-development/get-process-code.js +100 -0
  437. package/dist/tools/ti-development/get-process-datasource.d.ts +2 -0
  438. package/dist/tools/ti-development/get-process-datasource.js +20 -0
  439. package/dist/tools/ti-development/get-process-parameters.d.ts +2 -0
  440. package/dist/tools/ti-development/get-process-parameters.js +25 -0
  441. package/dist/tools/ti-development/get-process-variables.d.ts +2 -0
  442. package/dist/tools/ti-development/get-process-variables.js +38 -0
  443. package/dist/tools/ti-development/get-process.d.ts +2 -0
  444. package/dist/tools/ti-development/get-process.js +163 -0
  445. package/dist/tools/ti-development/import-pro-file.d.ts +2 -0
  446. package/dist/tools/ti-development/import-pro-file.js +153 -0
  447. package/dist/tools/ti-development/import-process-from-git.d.ts +2 -0
  448. package/dist/tools/ti-development/import-process-from-git.js +198 -0
  449. package/dist/tools/ti-development/install-pro-bundle.d.ts +2 -0
  450. package/dist/tools/ti-development/install-pro-bundle.js +288 -0
  451. package/dist/tools/ti-development/preflight.d.ts +39 -0
  452. package/dist/tools/ti-development/preflight.js +56 -0
  453. package/dist/tools/ti-development/process-backup.d.ts +29 -0
  454. package/dist/tools/ti-development/process-backup.js +118 -0
  455. package/dist/tools/ti-development/search-code.d.ts +2 -0
  456. package/dist/tools/ti-development/search-code.js +208 -0
  457. package/dist/tools/ti-development/upsert-process.d.ts +2 -0
  458. package/dist/tools/ti-development/upsert-process.js +167 -0
  459. package/dist/tools/ti-development/validate-process-refs.d.ts +2 -0
  460. package/dist/tools/ti-development/validate-process-refs.js +73 -0
  461. package/dist/tools/views/create-mdx-view.d.ts +2 -0
  462. package/dist/tools/views/create-mdx-view.js +21 -0
  463. package/dist/tools/views/create-native-view.d.ts +2 -0
  464. package/dist/tools/views/create-native-view.js +81 -0
  465. package/dist/tools/views/delete-view.d.ts +2 -0
  466. package/dist/tools/views/delete-view.js +23 -0
  467. package/dist/tools/views/list-views.d.ts +2 -0
  468. package/dist/tools/views/list-views.js +32 -0
  469. package/dist/tools/with-annotations.d.ts +6 -0
  470. package/dist/tools/with-annotations.js +339 -0
  471. package/dist/types.d.ts +409 -0
  472. package/dist/types.js +91 -0
  473. package/dist/version.d.ts +4 -0
  474. package/dist/version.js +18 -0
  475. package/package.json +107 -0
@@ -0,0 +1,302 @@
1
+ /**
2
+ * TI anti-pattern lint engine.
3
+ *
4
+ * Walks the parsed AST of each process tab and emits a flat list of findings —
5
+ * a different shape from the metrics ranking in {@link ./process-metrics}, kept
6
+ * separate on purpose (rule violations, not a score). The same engine is meant
7
+ * to be reusable later from a single-process pre-commit lint entry point.
8
+ */
9
+ import { parseTiCode } from "../callgraph/tiParser.js";
10
+ const TABS = ["prolog", "metadata", "data", "epilog"];
11
+ /**
12
+ * Destructive ops that wipe data/objects. Unconditional use (no enclosing If)
13
+ * is treated as an error — a guard expresses deliberate intent. Lowercased.
14
+ */
15
+ const DESTRUCTIVE = new Set([
16
+ "cubecleardata",
17
+ "dimensiondeleteallelements",
18
+ "processdestroy",
19
+ ]);
20
+ /**
21
+ * A destructive op is by-design (not a bug) when the process is a dedicated
22
+ * clear/init/reset/test proc — those exist to wipe data. Matching the name
23
+ * downgrades destructive-unguarded from error to warn (still surfaced, not
24
+ * silenced). Substring match on the lowercased process name.
25
+ */
26
+ const CLEAR_PROC_TOKENS = [
27
+ "init",
28
+ "zeroout",
29
+ "zero_out",
30
+ "clear",
31
+ "reset",
32
+ "test",
33
+ "wipe",
34
+ ];
35
+ function isClearProc(name) {
36
+ const n = name.toLowerCase();
37
+ return CLEAR_PROC_TOKENS.some((t) => n.includes(t));
38
+ }
39
+ /** Process-invocation calls; in a loop they recurse/serialize. Lowercased. */
40
+ const PROCESS_CALLS = new Set(["executeprocess", "runprocess"]);
41
+ const DEFAULT_CELLGET_DIM_THRESHOLD = 12;
42
+ // ---- dead-assignment helpers ----
43
+ /** TI implicit / datasource variables — never flagged as dead assignments. */
44
+ const IMPLICIT_VARS = new Set([
45
+ "value_is_string",
46
+ "nvalue",
47
+ "svalue",
48
+ "datasourcenamescript",
49
+ "datasourceasciidelimiter",
50
+ "datasourceasciiquotecharacter",
51
+ "datasourceasciithousandseparator",
52
+ "datasourceasciiheaderrecords",
53
+ "datasourceasciiDecimalseparator",
54
+ "datasourceasciidecimalseparator",
55
+ "datasourceview",
56
+ "datasourcecube",
57
+ "datasourcedimension",
58
+ "datasourcedimensionsubset",
59
+ "datasourcetype",
60
+ "datasourcenameforserver",
61
+ "datasourcenameforserverisoctet",
62
+ ]);
63
+ function isImplicitVar(name) {
64
+ const n = name.toLowerCase();
65
+ if (IMPLICIT_VARS.has(n))
66
+ return true;
67
+ // V1, V2, ..., Vn (datasource column vars)
68
+ if (/^v\d+$/.test(n))
69
+ return true;
70
+ return false;
71
+ }
72
+ /** RHS functions whose capture is idiomatically a return-code — skip dead check on the LHS. */
73
+ const SIDE_EFFECT_RHS = new Set([
74
+ "executeprocess",
75
+ "runprocess",
76
+ "fileop",
77
+ "executeview",
78
+ ]);
79
+ function hasSideEffectRhs(expr) {
80
+ const lo = expr.toLowerCase();
81
+ for (const fn of SIDE_EFFECT_RHS) {
82
+ if (lo.includes(fn + "("))
83
+ return true;
84
+ }
85
+ return false;
86
+ }
87
+ const IDENTIFIER_RE = /\b([A-Za-z_]\w*)\b/g;
88
+ const EXPAND_VAR_RE = /%([A-Za-z_]\w*)%/g;
89
+ /** Extract all potential variable-read tokens from a raw TI expression/arg/condition string. */
90
+ function collectReads(text, out) {
91
+ // %varName% inside Expand calls
92
+ for (const m of text.matchAll(EXPAND_VAR_RE)) {
93
+ if (m[1])
94
+ out.add(m[1].toLowerCase());
95
+ }
96
+ // Strip string literals so identifiers inside them don't pollute the read-set
97
+ const stripped = text.replace(/'(?:[^']|'')*'/g, "''");
98
+ for (const m of stripped.matchAll(IDENTIFIER_RE)) {
99
+ if (m[1])
100
+ out.add(m[1].toLowerCase());
101
+ }
102
+ }
103
+ function collectReadsFromStmts(stmts, out) {
104
+ for (const s of stmts) {
105
+ if (s.type === "assignment") {
106
+ collectReads(s.expression, out);
107
+ }
108
+ else if (s.type === "if") {
109
+ const blk = s;
110
+ collectReads(blk.condition, out);
111
+ collectReadsFromStmts(blk.thenBody, out);
112
+ for (const c of blk.elseIfClauses) {
113
+ collectReads(c.condition, out);
114
+ collectReadsFromStmts(c.body, out);
115
+ }
116
+ collectReadsFromStmts(blk.elseBody, out);
117
+ }
118
+ else if (s.type === "while") {
119
+ const blk = s;
120
+ collectReads(blk.condition, out);
121
+ collectReadsFromStmts(blk.body, out);
122
+ }
123
+ else if (s.type === "functionCall") {
124
+ for (const arg of s.args) {
125
+ collectReads(arg, out);
126
+ }
127
+ }
128
+ }
129
+ }
130
+ function collectDeadCandidates(stmts, tab, out) {
131
+ for (const s of stmts) {
132
+ if (s.type === "assignment") {
133
+ if (!isImplicitVar(s.variable) && !hasSideEffectRhs(s.expression)) {
134
+ out.push({
135
+ variable: s.variable.toLowerCase(),
136
+ originalVar: s.variable,
137
+ tab,
138
+ line: s.line,
139
+ });
140
+ }
141
+ }
142
+ else if (s.type === "if") {
143
+ const blk = s;
144
+ collectDeadCandidates(blk.thenBody, tab, out);
145
+ for (const c of blk.elseIfClauses) {
146
+ collectDeadCandidates(c.body, tab, out);
147
+ }
148
+ collectDeadCandidates(blk.elseBody, tab, out);
149
+ }
150
+ else if (s.type === "while") {
151
+ const blk = s;
152
+ collectDeadCandidates(blk.body, tab, out);
153
+ }
154
+ }
155
+ }
156
+ /**
157
+ * Strip a TI single-quoted string literal to its inner value, or return null if
158
+ * the arg is not a string literal (e.g. a variable or number).
159
+ */
160
+ function stringLiteralValue(arg) {
161
+ const t = arg.trim();
162
+ if (t.length < 2 || t[0] !== "'" || t[t.length - 1] !== "'")
163
+ return null;
164
+ return t.slice(1, -1).replace(/''/g, "'");
165
+ }
166
+ /** UNC (`\\srv\…`) or drive-letter (`C:\…`) absolute path. */
167
+ const PATH_LITERAL = /^(?:\\\\|[A-Za-z]:[\\/])/;
168
+ function walk(stmts, loopDepth, ifDepth, ctx) {
169
+ for (const s of stmts) {
170
+ if (s.type === "assignment") {
171
+ const cg = s.cellGetInfo;
172
+ if (cg) {
173
+ // params[0] is the cube; remaining args are one element ref per
174
+ // dimension, so dimCount = params.length - 1.
175
+ const dimCount = Math.max(cg.params.length - 1, 0);
176
+ if (dimCount >= ctx.cellGetDimThreshold) {
177
+ const inLoop = loopDepth > 0;
178
+ ctx.findings.push({
179
+ process: ctx.process,
180
+ tab: ctx.tab,
181
+ line: s.line,
182
+ rule: "cellget-perf",
183
+ severity: inLoop ? "warn" : "info",
184
+ snippet: `${s.variable} = ${cg.fn}(${cg.params.join(", ")})`,
185
+ hint: `${cg.fn} on a ${dimCount}-dimension cube` +
186
+ (inLoop ? ` inside a loop (depth ${loopDepth})` : "") +
187
+ ` can be a perf hot path on large cubes — worse when many consolidated (C) elements are addressed (not statically detectable here). Consider an MDX/view read or caching.`,
188
+ });
189
+ }
190
+ }
191
+ }
192
+ else if (s.type === "if") {
193
+ const blk = s;
194
+ walk(blk.thenBody, loopDepth, ifDepth + 1, ctx);
195
+ for (const c of blk.elseIfClauses)
196
+ walk(c.body, loopDepth, ifDepth + 1, ctx);
197
+ walk(blk.elseBody, loopDepth, ifDepth + 1, ctx);
198
+ }
199
+ else if (s.type === "while") {
200
+ const blk = s;
201
+ walk(blk.body, loopDepth + 1, ifDepth, ctx);
202
+ }
203
+ else if (s.type === "functionCall") {
204
+ const name = s.name.toLowerCase();
205
+ const snippet = `${s.name}(${s.args.join(", ")})`;
206
+ if (ifDepth === 0 && DESTRUCTIVE.has(name)) {
207
+ ctx.findings.push({
208
+ process: ctx.process,
209
+ tab: ctx.tab,
210
+ line: s.line,
211
+ rule: "destructive-unguarded",
212
+ severity: ctx.clearProc ? "warn" : "error",
213
+ snippet,
214
+ hint: ctx.clearProc
215
+ ? `${s.name} wipes data/objects unconditionally. The process name marks it a clear/init proc, so this is likely by-design — confirm it can only target the intended cube.`
216
+ : `${s.name} wipes data/objects unconditionally — wrap in an If guard so it cannot run by accident.`,
217
+ });
218
+ }
219
+ if (loopDepth > 0 && PROCESS_CALLS.has(name)) {
220
+ const isAsync = name === "runprocess";
221
+ ctx.findings.push({
222
+ process: ctx.process,
223
+ tab: ctx.tab,
224
+ line: s.line,
225
+ rule: "exec-in-loop",
226
+ severity: "warn",
227
+ snippet,
228
+ hint: isAsync
229
+ ? `RunProcess in a loop runs async — you lose control over timing and persistence (when each child commits). Prefer a single child that loops internally.`
230
+ : `ExecuteProcess in a loop runs sync per iteration — adds compounding complexity and overhead. Consider pushing the loop into the child.`,
231
+ });
232
+ }
233
+ for (const arg of s.args) {
234
+ const val = stringLiteralValue(arg);
235
+ if (val && PATH_LITERAL.test(val)) {
236
+ ctx.findings.push({
237
+ process: ctx.process,
238
+ tab: ctx.tab,
239
+ line: s.line,
240
+ rule: "hardcoded-path",
241
+ severity: "warn",
242
+ snippet: `${s.name}(… ${arg} …)`,
243
+ hint: `Hardcoded path '${val}' in ${s.name} — move it to a process parameter or a config cube so it survives environment moves.`,
244
+ });
245
+ }
246
+ }
247
+ }
248
+ }
249
+ }
250
+ export function lintProcess(process, code, opts) {
251
+ const cellGetDimThreshold = opts?.cellGetDimThreshold ?? DEFAULT_CELLGET_DIM_THRESHOLD;
252
+ const clearProc = isClearProc(process);
253
+ const findings = [];
254
+ // Parse all tabs once; reuse for both walk and dead-assignment passes.
255
+ const parsedTabs = new Map();
256
+ for (const tab of TABS) {
257
+ const src = code[tab] ?? "";
258
+ if (src.trim() === "")
259
+ continue;
260
+ const parsed = parseTiCode(src);
261
+ if (!parsed.ok)
262
+ continue;
263
+ parsedTabs.set(tab, parsed.ast);
264
+ }
265
+ // Existing per-tab rules
266
+ for (const [tab, ast] of parsedTabs) {
267
+ walk(ast, 0, 0, { process, tab, cellGetDimThreshold, clearProc, findings });
268
+ }
269
+ // dead-assignment: two-pass over all parsed tabs
270
+ const readSet = new Set();
271
+ for (const ast of parsedTabs.values()) {
272
+ collectReadsFromStmts(ast, readSet);
273
+ }
274
+ const excludeSet = new Set((opts?.excludeVarsFromDeadCheck ?? []).map((v) => v.toLowerCase()));
275
+ const deadCandidates = [];
276
+ for (const tab of ["metadata", "data"]) {
277
+ const ast = parsedTabs.get(tab);
278
+ if (ast)
279
+ collectDeadCandidates(ast, tab, deadCandidates);
280
+ }
281
+ const reported = new Set();
282
+ for (const c of deadCandidates) {
283
+ if (reported.has(c.variable))
284
+ continue;
285
+ if (excludeSet.has(c.variable))
286
+ continue;
287
+ if (!readSet.has(c.variable)) {
288
+ reported.add(c.variable);
289
+ findings.push({
290
+ process,
291
+ tab: c.tab,
292
+ line: c.line,
293
+ rule: "dead-assignment",
294
+ severity: "info",
295
+ snippet: `${c.originalVar} = ...`,
296
+ hint: `'${c.originalVar}' is assigned in the ${c.tab} tab but never read — remove or use it.`,
297
+ });
298
+ }
299
+ }
300
+ return findings;
301
+ }
302
+ //# sourceMappingURL=antipatterns.js.map
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Heuristic split of `#`-comment lines into real comments (natural-language
3
+ * documentation) vs commented-out code (disabled TM1 rule/TI statements).
4
+ *
5
+ * In TM1 the `#` prefix serves both roles, so a naive "starts with #" comment
6
+ * count conflates the two. That matters because the complexity scorer can
7
+ * *discount* a score by its comment ratio (commentDiscountMax): disabled dead
8
+ * code masquerading as documentation would make a complex object look simpler,
9
+ * and inflate "well-documented" signals. This classifier lets callers count the
10
+ * two separately.
11
+ *
12
+ * The heuristic favours low false positives on prose: the dominant signal is a
13
+ * trailing `;` (almost every active TM1 statement ends with one; prose rarely
14
+ * does), backed by structural signals (rule-area assignment, variable
15
+ * assignment, known function calls, control-flow keywords with a paren, bare
16
+ * directives). It is intentionally fuzzy — there is no parser that can tell a
17
+ * disabled statement from prose with certainty.
18
+ */
19
+ /**
20
+ * True when a `#`-prefixed comment line looks like disabled TM1 code rather
21
+ * than prose. Accepts the trimmed line with or without its leading `#`.
22
+ */
23
+ export declare function isCommentedOutCode(commentLine: string): boolean;
24
+ //# sourceMappingURL=comment-classifier.d.ts.map
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Heuristic split of `#`-comment lines into real comments (natural-language
3
+ * documentation) vs commented-out code (disabled TM1 rule/TI statements).
4
+ *
5
+ * In TM1 the `#` prefix serves both roles, so a naive "starts with #" comment
6
+ * count conflates the two. That matters because the complexity scorer can
7
+ * *discount* a score by its comment ratio (commentDiscountMax): disabled dead
8
+ * code masquerading as documentation would make a complex object look simpler,
9
+ * and inflate "well-documented" signals. This classifier lets callers count the
10
+ * two separately.
11
+ *
12
+ * The heuristic favours low false positives on prose: the dominant signal is a
13
+ * trailing `;` (almost every active TM1 statement ends with one; prose rarely
14
+ * does), backed by structural signals (rule-area assignment, variable
15
+ * assignment, known function calls, control-flow keywords with a paren, bare
16
+ * directives). It is intentionally fuzzy — there is no parser that can tell a
17
+ * disabled statement from prose with certainty.
18
+ */
19
+ const CODE_SIGNALS = [
20
+ // Statement terminator at end of line — the strongest TM1 signal.
21
+ /;\s*$/,
22
+ // Rule-area assignment: `['Sales'] = ...`
23
+ /^\[[^\]]*\]\s*=/,
24
+ // Variable / cube-cell assignment: `vX = ...` or `nResult=...` (not `==`).
25
+ /^[A-Za-z_]\w*\s*=(?!=)/,
26
+ // Known TM1 function call: `Name(` (case-insensitive — TM1 is).
27
+ /\b(?:CellPutN|CellPutS|CellGetN|CellGetS|CellIsUpdateable|DB|DBRW|DBRA|DBSW|DBSS|AttrPutN|AttrPutS|AttrN|AttrS|ElementName|ElementIndex|DimensionElementInsert|DimensionElementComponentAdd|HierarchyElementInsert|ExecuteProcess|ExecuteCommand|RunProcess|ProcessQuit|ProcessBreak|ItemSkip|ItemReject|ViewZeroOut|CubeClearData|CubeSetLogChanges|ASCIIOutput|TextOutput|SubsetCreate|NumberToString|StringToNumber)\s*\(/i,
28
+ // Control-flow keyword immediately followed by a paren: `IF(`, `WHILE (`.
29
+ /^(?:IF|WHILE|ELSEIF)\s*\(/i,
30
+ // Bare block directives / keywords on their own line.
31
+ /^(?:SKIPCHECK|FEEDERS|FEEDSTRINGS|ENDIF|ELSE|END|PROCESSBREAK|PROCESSQUIT|ITEMSKIP)\s*;?\s*$/i,
32
+ ];
33
+ /**
34
+ * True when a `#`-prefixed comment line looks like disabled TM1 code rather
35
+ * than prose. Accepts the trimmed line with or without its leading `#`.
36
+ */
37
+ export function isCommentedOutCode(commentLine) {
38
+ const body = commentLine.replace(/^#+/, "").trim();
39
+ if (body === "")
40
+ return false;
41
+ return CODE_SIGNALS.some((re) => re.test(body));
42
+ }
43
+ //# sourceMappingURL=comment-classifier.js.map
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Cross-process consistency metrics. Focus: naming + structure coherence
3
+ * across many TI processes, not per-process micro-metrics.
4
+ *
5
+ * Premise: variability across processes is the maintenance cost driver, not
6
+ * raw counts. A 200-line process with idiosyncratic naming hurts more than a
7
+ * 1000-line process that follows the same patterns as its 50 siblings.
8
+ */
9
+ import type { TiTab } from "./process-metrics.js";
10
+ export type VarType = "String" | "Numeric";
11
+ export interface ProcessVarInput {
12
+ process: string;
13
+ variables: Array<{
14
+ name: string;
15
+ type: VarType;
16
+ }>;
17
+ }
18
+ /** ── 1) Variable-name clusters ──────────────────────────────────────────── */
19
+ export interface NameCluster {
20
+ /** Canonical key (prefix-stripped, lowercased). */
21
+ normalized: string;
22
+ /** Original distinct variants encountered across processes. */
23
+ variants: string[];
24
+ /** Process names that contain at least one of the variants. */
25
+ processes: string[];
26
+ }
27
+ /**
28
+ * Normalize: strip a single leading [pvns] when followed by uppercase/underscore,
29
+ * strip underscores, lowercase. So `pYear`, `vYear`, `Year`, `p_year` all map
30
+ * to `year`. Names like `p` or `value` stay as-is (no prefix match).
31
+ */
32
+ export declare function normalizeVarName(raw: string): string;
33
+ export declare function clusterVariableNames(processes: ProcessVarInput[]): NameCluster[];
34
+ /** ── 2) Type inconsistencies ─────────────────────────────────────────────── */
35
+ export interface TypeConflict {
36
+ variable: string;
37
+ /** Per-type list of processes declaring that name with that type. */
38
+ occurrences: Array<{
39
+ type: VarType;
40
+ processes: string[];
41
+ }>;
42
+ }
43
+ export declare function findTypeInconsistencies(processes: ProcessVarInput[]): TypeConflict[];
44
+ /** ── 3) Prefix-convention adherence ─────────────────────────────────────── */
45
+ export type PrefixClass = "p" | "v" | "n" | "s" | "none";
46
+ export interface PrefixConventionReport {
47
+ /** All non-"none" prefixes ranked by frequency. */
48
+ distribution: Array<{
49
+ prefix: PrefixClass;
50
+ count: number;
51
+ }>;
52
+ /** Adherence to convention `[pvns]` followed by upper/underscore. 0..1. */
53
+ adherence: number;
54
+ /** Total variables sampled. */
55
+ total: number;
56
+ /** Variables that don't fit any [pvns] prefix. */
57
+ unprefixed: number;
58
+ }
59
+ export declare function reportPrefixConvention(processes: ProcessVarInput[]): PrefixConventionReport;
60
+ /** ── 4) Cohort grouping by name suffix ──────────────────────────────────── */
61
+ export interface CohortInput {
62
+ process: string;
63
+ /** Optional pre-computed per-tab LOC for structural comparison (future use). */
64
+ tabLoc?: Record<TiTab, number>;
65
+ }
66
+ export interface Cohort {
67
+ key: string;
68
+ members: string[];
69
+ }
70
+ /**
71
+ * Group processes by trailing alpha token after `_` or `-`. So `Load_Sales`
72
+ * and `Aggregate_Sales` cohort as `Sales`; `Daily_Load` and `Weekly_Load`
73
+ * cohort as `Load`. Singleton cohorts are omitted.
74
+ */
75
+ export declare function groupByCohort(processes: Array<{
76
+ process: string;
77
+ }>): Cohort[];
78
+ //# sourceMappingURL=cross-process.d.ts.map
@@ -0,0 +1,114 @@
1
+ const PREFIX_RE = /^[pvns](?=[A-Z_])/;
2
+ /**
3
+ * Normalize: strip a single leading [pvns] when followed by uppercase/underscore,
4
+ * strip underscores, lowercase. So `pYear`, `vYear`, `Year`, `p_year` all map
5
+ * to `year`. Names like `p` or `value` stay as-is (no prefix match).
6
+ */
7
+ export function normalizeVarName(raw) {
8
+ const stripped = raw.replace(PREFIX_RE, "");
9
+ return stripped.replace(/_/g, "").toLowerCase();
10
+ }
11
+ export function clusterVariableNames(processes) {
12
+ const byKey = new Map();
13
+ for (const p of processes) {
14
+ for (const v of p.variables) {
15
+ const key = normalizeVarName(v.name);
16
+ let bucket = byKey.get(key);
17
+ if (!bucket) {
18
+ bucket = { variants: new Set(), processes: new Set() };
19
+ byKey.set(key, bucket);
20
+ }
21
+ bucket.variants.add(v.name);
22
+ bucket.processes.add(p.process);
23
+ }
24
+ }
25
+ const out = [];
26
+ for (const [normalized, b] of byKey) {
27
+ if (b.variants.size > 1) {
28
+ out.push({
29
+ normalized,
30
+ variants: [...b.variants].sort(),
31
+ processes: [...b.processes].sort(),
32
+ });
33
+ }
34
+ }
35
+ return out.sort((a, b) => b.variants.length - a.variants.length);
36
+ }
37
+ export function findTypeInconsistencies(processes) {
38
+ const byName = new Map();
39
+ for (const p of processes) {
40
+ for (const v of p.variables) {
41
+ let typeMap = byName.get(v.name);
42
+ if (!typeMap) {
43
+ typeMap = new Map();
44
+ byName.set(v.name, typeMap);
45
+ }
46
+ let procSet = typeMap.get(v.type);
47
+ if (!procSet) {
48
+ procSet = new Set();
49
+ typeMap.set(v.type, procSet);
50
+ }
51
+ procSet.add(p.process);
52
+ }
53
+ }
54
+ const out = [];
55
+ for (const [variable, typeMap] of byName) {
56
+ if (typeMap.size > 1) {
57
+ const occurrences = [...typeMap.entries()]
58
+ .map(([type, procSet]) => ({ type, processes: [...procSet].sort() }))
59
+ .sort((a, b) => a.type.localeCompare(b.type));
60
+ out.push({ variable, occurrences });
61
+ }
62
+ }
63
+ return out.sort((a, b) => a.variable.localeCompare(b.variable));
64
+ }
65
+ function classifyPrefix(name) {
66
+ const m = PREFIX_RE.exec(name);
67
+ return m ? m[0] : "none";
68
+ }
69
+ export function reportPrefixConvention(processes) {
70
+ const counts = {
71
+ p: 0,
72
+ v: 0,
73
+ n: 0,
74
+ s: 0,
75
+ none: 0,
76
+ };
77
+ let total = 0;
78
+ for (const p of processes) {
79
+ for (const v of p.variables) {
80
+ counts[classifyPrefix(v.name)]++;
81
+ total++;
82
+ }
83
+ }
84
+ const distribution = ["p", "v", "n", "s"]
85
+ .map((prefix) => ({ prefix, count: counts[prefix] }))
86
+ .filter((d) => d.count > 0)
87
+ .sort((a, b) => b.count - a.count);
88
+ const prefixed = total - counts.none;
89
+ const adherence = total === 0 ? 0 : prefixed / total;
90
+ return { distribution, adherence, total, unprefixed: counts.none };
91
+ }
92
+ const COHORT_SUFFIX_RE = /[_-]([A-Za-z]+)$/;
93
+ /**
94
+ * Group processes by trailing alpha token after `_` or `-`. So `Load_Sales`
95
+ * and `Aggregate_Sales` cohort as `Sales`; `Daily_Load` and `Weekly_Load`
96
+ * cohort as `Load`. Singleton cohorts are omitted.
97
+ */
98
+ export function groupByCohort(processes) {
99
+ const map = new Map();
100
+ for (const p of processes) {
101
+ const m = COHORT_SUFFIX_RE.exec(p.process);
102
+ const key = m ? m[1].toLowerCase() : "_other";
103
+ const arr = map.get(key) ?? [];
104
+ arr.push(p.process);
105
+ map.set(key, arr);
106
+ }
107
+ const out = [];
108
+ for (const [key, members] of map) {
109
+ if (members.length >= 2)
110
+ out.push({ key, members: members.sort() });
111
+ }
112
+ return out.sort((a, b) => b.members.length - a.members.length);
113
+ }
114
+ //# sourceMappingURL=cross-process.js.map
@@ -0,0 +1,78 @@
1
+ export type TiTab = "prolog" | "metadata" | "data" | "epilog";
2
+ /**
3
+ * Tunable weights for the v2 cognitive-style score. All optional; unset fields
4
+ * fall back to the defaults below. Exposed so callers (e.g. tm1_audit_complexity)
5
+ * can recalibrate without recompiling.
6
+ */
7
+ export interface ScoreWeights {
8
+ /** Base cost of a single while loop (multiplied by nestMult^loopDepth). */
9
+ loopBase: number;
10
+ /** Geometric factor applied per enclosing loop — this is the "multiplication". */
11
+ nestMult: number;
12
+ /** Base cost of an if/elseif, scaled by condition complexity and if-depth. */
13
+ ifBase: number;
14
+ /** Penalty per hot op (CellPutN, ASCIIOutput, ExecuteProcess, …) per loop depth. */
15
+ hotPenalty: number;
16
+ /** Max fraction (0..1) of scoreV2 discounted by commentRatio. 0 = off (default). */
17
+ commentDiscountMax: number;
18
+ }
19
+ /** Partial override accepted from callers; undefined fields fall back to defaults. */
20
+ export type ScoreWeightsInput = {
21
+ [K in keyof ScoreWeights]?: ScoreWeights[K] | undefined;
22
+ };
23
+ export interface TabMetrics {
24
+ /** Non-blank, non-comment source lines. */
25
+ loc: number;
26
+ /** `#` lines that are real comments (prose), not disabled code. */
27
+ commentLines: number;
28
+ /** `#` lines that look like commented-out TI code (disabled statements). */
29
+ deadCodeLines: number;
30
+ /** Lines that are purely whitespace. */
31
+ blankLines: number;
32
+ /** if + elseIf + while statements (recursive). */
33
+ branches: number;
34
+ /** Deepest control-flow nesting reached (0 = no control flow). */
35
+ maxNesting: number;
36
+ /** v2: Σ loopBase * nestMult^loopDepth over every while (multiplicative nesting). */
37
+ loopCost: number;
38
+ /** v2: Σ ifBase * conditionComplexity * (1 + ifDepth) over every if/elseif. */
39
+ ifCost: number;
40
+ /** v2: Σ hotPenalty * loopDepth over hot ops executed inside loops. */
41
+ hotInLoop: number;
42
+ /** True if the parser rejected this tab — metrics still emitted for raw lines. */
43
+ parseError: boolean;
44
+ }
45
+ export interface ProcessMetrics {
46
+ name: string;
47
+ tabs: Record<TiTab, TabMetrics>;
48
+ totals: {
49
+ loc: number;
50
+ commentLines: number;
51
+ deadCodeLines: number;
52
+ branches: number;
53
+ maxNesting: number;
54
+ /** Heuristic (v1): loc + 2*branches + 3*maxNesting. Unchanged for compatibility. */
55
+ score: number;
56
+ /** v2: Σ loopCost across tabs (loop nesting multiplies). */
57
+ loopCost: number;
58
+ /** v2: Σ ifCost across tabs (condition complexity × if-depth). */
59
+ ifCost: number;
60
+ /** v2: Σ hotInLoop across tabs (hot ops penalised by loop depth). */
61
+ hotInLoop: number;
62
+ /** v2: loc + ifCost + loopCost + hotInLoop, optionally discounted by comments. */
63
+ scoreV2: number;
64
+ /** commentLines / max(loc + commentLines + deadCodeLines, 1). 0..1. Real comments only. */
65
+ commentRatio: number;
66
+ /** deadCodeLines / max(loc + commentLines + deadCodeLines, 1). 0..1. */
67
+ deadCodeRatio: number;
68
+ };
69
+ }
70
+ export interface ProcessCodeInput {
71
+ prolog: string;
72
+ metadata: string;
73
+ data: string;
74
+ epilog: string;
75
+ }
76
+ export declare function computeTabMetrics(src: string, weights?: ScoreWeightsInput): TabMetrics;
77
+ export declare function computeProcessMetrics(name: string, code: ProcessCodeInput, weights?: ScoreWeightsInput): ProcessMetrics;
78
+ //# sourceMappingURL=process-metrics.d.ts.map