@planu/cli 0.28.0 → 0.30.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 (297) hide show
  1. package/dist/config/model-routing-rules.json +98 -0
  2. package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
  3. package/dist/engine/ai-cost-estimator/core.js +2 -202
  4. package/dist/engine/ai-cost-estimator/core.js.map +1 -1
  5. package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
  6. package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
  7. package/dist/engine/ai-cost-estimator/recommender.js +94 -0
  8. package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
  9. package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
  10. package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
  11. package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
  12. package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
  13. package/dist/engine/ci-generator/planu-config.d.ts +7 -0
  14. package/dist/engine/ci-generator/planu-config.d.ts.map +1 -0
  15. package/dist/engine/ci-generator/planu-config.js +40 -0
  16. package/dist/engine/ci-generator/planu-config.js.map +1 -0
  17. package/dist/engine/ci-generator/planu-steps.d.ts +11 -0
  18. package/dist/engine/ci-generator/planu-steps.d.ts.map +1 -0
  19. package/dist/engine/ci-generator/planu-steps.js +292 -0
  20. package/dist/engine/ci-generator/planu-steps.js.map +1 -0
  21. package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
  22. package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
  23. package/dist/engine/code-transforms/transform-engine.js +67 -0
  24. package/dist/engine/code-transforms/transform-engine.js.map +1 -0
  25. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
  26. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
  27. package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
  28. package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
  29. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
  30. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
  31. package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
  32. package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
  33. package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
  34. package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
  35. package/dist/engine/code-transforms/typescript/add-types.js +182 -0
  36. package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
  37. package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
  38. package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
  39. package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
  40. package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
  41. package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
  42. package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
  43. package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
  44. package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
  45. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
  46. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
  47. package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
  48. package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
  49. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
  50. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
  51. package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
  52. package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
  53. package/dist/engine/mermaid/core.d.ts +18 -0
  54. package/dist/engine/mermaid/core.d.ts.map +1 -0
  55. package/dist/engine/mermaid/core.js +88 -0
  56. package/dist/engine/mermaid/core.js.map +1 -0
  57. package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
  58. package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
  59. package/dist/engine/mermaid/diagram-generators.js +139 -0
  60. package/dist/engine/mermaid/diagram-generators.js.map +1 -0
  61. package/dist/engine/mermaid/helpers.d.ts +8 -0
  62. package/dist/engine/mermaid/helpers.d.ts.map +1 -0
  63. package/dist/engine/mermaid/helpers.js +61 -0
  64. package/dist/engine/mermaid/helpers.js.map +1 -0
  65. package/dist/engine/mermaid-generator.d.ts +2 -37
  66. package/dist/engine/mermaid-generator.d.ts.map +1 -1
  67. package/dist/engine/mermaid-generator.js +4 -276
  68. package/dist/engine/mermaid-generator.js.map +1 -1
  69. package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
  70. package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
  71. package/dist/engine/model-router/complexity-analyzer.js +182 -0
  72. package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
  73. package/dist/engine/model-router/cost-estimator.d.ts +6 -0
  74. package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
  75. package/dist/engine/model-router/cost-estimator.js +60 -0
  76. package/dist/engine/model-router/cost-estimator.js.map +1 -0
  77. package/dist/engine/model-router/historical-learner.d.ts +26 -0
  78. package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
  79. package/dist/engine/model-router/historical-learner.js +91 -0
  80. package/dist/engine/model-router/historical-learner.js.map +1 -0
  81. package/dist/engine/model-router/rules-engine.d.ts +13 -0
  82. package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
  83. package/dist/engine/model-router/rules-engine.js +142 -0
  84. package/dist/engine/model-router/rules-engine.js.map +1 -0
  85. package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
  86. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
  87. package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
  88. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
  89. package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
  90. package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
  91. package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
  92. package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
  93. package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
  94. package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
  95. package/dist/engine/spec-coverage/test-matchers.js +59 -0
  96. package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
  97. package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
  98. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
  99. package/dist/engine/spec-templates/catalog-extra.js +8 -363
  100. package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
  101. package/dist/engine/spec-templates/catalog-industry.d.ts +4 -0
  102. package/dist/engine/spec-templates/catalog-industry.d.ts.map +1 -0
  103. package/dist/engine/spec-templates/catalog-industry.js +19 -0
  104. package/dist/engine/spec-templates/catalog-industry.js.map +1 -0
  105. package/dist/engine/spec-templates/catalog.d.ts +1 -1
  106. package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
  107. package/dist/engine/spec-templates/catalog.js +12 -381
  108. package/dist/engine/spec-templates/catalog.js.map +1 -1
  109. package/dist/engine/spec-templates/custom-loader.d.ts +12 -0
  110. package/dist/engine/spec-templates/custom-loader.d.ts.map +1 -0
  111. package/dist/engine/spec-templates/custom-loader.js +99 -0
  112. package/dist/engine/spec-templates/custom-loader.js.map +1 -0
  113. package/dist/engine/spec-templates/index.d.ts +4 -2
  114. package/dist/engine/spec-templates/index.d.ts.map +1 -1
  115. package/dist/engine/spec-templates/index.js +4 -2
  116. package/dist/engine/spec-templates/index.js.map +1 -1
  117. package/dist/engine/spec-templates/query.d.ts +12 -4
  118. package/dist/engine/spec-templates/query.d.ts.map +1 -1
  119. package/dist/engine/spec-templates/query.js +29 -7
  120. package/dist/engine/spec-templates/query.js.map +1 -1
  121. package/dist/engine/spec-templates/renderer.d.ts +27 -2
  122. package/dist/engine/spec-templates/renderer.d.ts.map +1 -1
  123. package/dist/engine/spec-templates/renderer.js +119 -4
  124. package/dist/engine/spec-templates/renderer.js.map +1 -1
  125. package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
  126. package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
  127. package/dist/engine/spec-templates/templates-api-ui.js +215 -0
  128. package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
  129. package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
  130. package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
  131. package/dist/engine/spec-templates/templates-auth-crud.js +225 -0
  132. package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
  133. package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
  134. package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
  135. package/dist/engine/spec-templates/templates-data-security.js +198 -0
  136. package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
  137. package/dist/engine/spec-templates/templates-industry-ecom.d.ts +6 -0
  138. package/dist/engine/spec-templates/templates-industry-ecom.d.ts.map +1 -0
  139. package/dist/engine/spec-templates/templates-industry-ecom.js +209 -0
  140. package/dist/engine/spec-templates/templates-industry-ecom.js.map +1 -0
  141. package/dist/engine/spec-templates/templates-industry-fintech.d.ts +8 -0
  142. package/dist/engine/spec-templates/templates-industry-fintech.d.ts.map +1 -0
  143. package/dist/engine/spec-templates/templates-industry-fintech.js +350 -0
  144. package/dist/engine/spec-templates/templates-industry-fintech.js.map +1 -0
  145. package/dist/engine/spec-templates/templates-industry-health-ecom.d.ts +3 -0
  146. package/dist/engine/spec-templates/templates-industry-health-ecom.d.ts.map +1 -0
  147. package/dist/engine/spec-templates/templates-industry-health-ecom.js +5 -0
  148. package/dist/engine/spec-templates/templates-industry-health-ecom.js.map +1 -0
  149. package/dist/engine/spec-templates/templates-industry-health.d.ts +6 -0
  150. package/dist/engine/spec-templates/templates-industry-health.d.ts.map +1 -0
  151. package/dist/engine/spec-templates/templates-industry-health.js +208 -0
  152. package/dist/engine/spec-templates/templates-industry-health.js.map +1 -0
  153. package/dist/engine/spec-templates/templates-industry-saas.d.ts +8 -0
  154. package/dist/engine/spec-templates/templates-industry-saas.d.ts.map +1 -0
  155. package/dist/engine/spec-templates/templates-industry-saas.js +323 -0
  156. package/dist/engine/spec-templates/templates-industry-saas.js.map +1 -0
  157. package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
  158. package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
  159. package/dist/engine/spec-templates/templates-perf-integration.js +226 -0
  160. package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
  161. package/dist/engine/vector-store/hnsw.d.ts +37 -0
  162. package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
  163. package/dist/engine/vector-store/hnsw.js +294 -0
  164. package/dist/engine/vector-store/hnsw.js.map +1 -0
  165. package/dist/engine/vector-store/similarity.d.ts +21 -0
  166. package/dist/engine/vector-store/similarity.d.ts.map +1 -0
  167. package/dist/engine/vector-store/similarity.js +86 -0
  168. package/dist/engine/vector-store/similarity.js.map +1 -0
  169. package/dist/engine/vector-store/tfidf.d.ts +35 -0
  170. package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
  171. package/dist/engine/vector-store/tfidf.js +255 -0
  172. package/dist/engine/vector-store/tfidf.js.map +1 -0
  173. package/dist/index.js +6 -0
  174. package/dist/index.js.map +1 -1
  175. package/dist/storage/vector-store/backend-factory.d.ts +9 -0
  176. package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
  177. package/dist/storage/vector-store/backend-factory.js +33 -0
  178. package/dist/storage/vector-store/backend-factory.js.map +1 -0
  179. package/dist/storage/vector-store/json-fallback.d.ts +21 -0
  180. package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
  181. package/dist/storage/vector-store/json-fallback.js +85 -0
  182. package/dist/storage/vector-store/json-fallback.js.map +1 -0
  183. package/dist/storage/vector-store/migrator.d.ts +10 -0
  184. package/dist/storage/vector-store/migrator.d.ts.map +1 -0
  185. package/dist/storage/vector-store/migrator.js +139 -0
  186. package/dist/storage/vector-store/migrator.js.map +1 -0
  187. package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
  188. package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
  189. package/dist/storage/vector-store/sqlite-adapter.js +142 -0
  190. package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
  191. package/dist/tools/ci-planu-handler.d.ts +8 -0
  192. package/dist/tools/ci-planu-handler.d.ts.map +1 -0
  193. package/dist/tools/ci-planu-handler.js +44 -0
  194. package/dist/tools/ci-planu-handler.js.map +1 -0
  195. package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
  196. package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
  197. package/dist/tools/create-spec/constitution-validator.js +37 -0
  198. package/dist/tools/create-spec/constitution-validator.js.map +1 -0
  199. package/dist/tools/create-spec/post-creation.d.ts +11 -0
  200. package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
  201. package/dist/tools/create-spec/post-creation.js +48 -0
  202. package/dist/tools/create-spec/post-creation.js.map +1 -0
  203. package/dist/tools/create-spec/spec-builder.d.ts +14 -0
  204. package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
  205. package/dist/tools/create-spec/spec-builder.js +131 -0
  206. package/dist/tools/create-spec/spec-builder.js.map +1 -0
  207. package/dist/tools/create-spec.d.ts.map +1 -1
  208. package/dist/tools/create-spec.js +42 -172
  209. package/dist/tools/create-spec.js.map +1 -1
  210. package/dist/tools/init-project/handler.d.ts.map +1 -1
  211. package/dist/tools/init-project/handler.js +24 -159
  212. package/dist/tools/init-project/handler.js.map +1 -1
  213. package/dist/tools/init-project/result-builder.d.ts +4 -0
  214. package/dist/tools/init-project/result-builder.d.ts.map +1 -0
  215. package/dist/tools/init-project/result-builder.js +150 -0
  216. package/dist/tools/init-project/result-builder.js.map +1 -0
  217. package/dist/tools/learn.d.ts.map +1 -1
  218. package/dist/tools/learn.js +67 -14
  219. package/dist/tools/learn.js.map +1 -1
  220. package/dist/tools/recommend-model-handler.d.ts +8 -0
  221. package/dist/tools/recommend-model-handler.d.ts.map +1 -0
  222. package/dist/tools/recommend-model-handler.js +65 -0
  223. package/dist/tools/recommend-model-handler.js.map +1 -0
  224. package/dist/tools/register-ci-tools.d.ts.map +1 -1
  225. package/dist/tools/register-ci-tools.js +36 -0
  226. package/dist/tools/register-ci-tools.js.map +1 -1
  227. package/dist/tools/register-model-tools.d.ts +3 -0
  228. package/dist/tools/register-model-tools.d.ts.map +1 -0
  229. package/dist/tools/register-model-tools.js +50 -0
  230. package/dist/tools/register-model-tools.js.map +1 -0
  231. package/dist/tools/register-search-tools.d.ts +7 -0
  232. package/dist/tools/register-search-tools.d.ts.map +1 -0
  233. package/dist/tools/register-search-tools.js +34 -0
  234. package/dist/tools/register-search-tools.js.map +1 -0
  235. package/dist/tools/register-template-tools.d.ts.map +1 -1
  236. package/dist/tools/register-template-tools.js +21 -8
  237. package/dist/tools/register-template-tools.js.map +1 -1
  238. package/dist/tools/register-transform-tools.d.ts +3 -0
  239. package/dist/tools/register-transform-tools.d.ts.map +1 -0
  240. package/dist/tools/register-transform-tools.js +29 -0
  241. package/dist/tools/register-transform-tools.js.map +1 -0
  242. package/dist/tools/semantic-search-handler.d.ts +7 -0
  243. package/dist/tools/semantic-search-handler.d.ts.map +1 -0
  244. package/dist/tools/semantic-search-handler.js +72 -0
  245. package/dist/tools/semantic-search-handler.js.map +1 -0
  246. package/dist/tools/spec-templates.d.ts +1 -1
  247. package/dist/tools/spec-templates.d.ts.map +1 -1
  248. package/dist/tools/spec-templates.js +20 -6
  249. package/dist/tools/spec-templates.js.map +1 -1
  250. package/dist/tools/transform-code-handler.d.ts +7 -0
  251. package/dist/tools/transform-code-handler.d.ts.map +1 -0
  252. package/dist/tools/transform-code-handler.js +58 -0
  253. package/dist/tools/transform-code-handler.js.map +1 -0
  254. package/dist/types/advanced-framework.d.ts +47 -0
  255. package/dist/types/advanced-framework.d.ts.map +1 -0
  256. package/dist/types/advanced-framework.js +3 -0
  257. package/dist/types/advanced-framework.js.map +1 -0
  258. package/dist/types/ci.d.ts +51 -0
  259. package/dist/types/ci.d.ts.map +1 -1
  260. package/dist/types/code-transforms.d.ts +114 -0
  261. package/dist/types/code-transforms.d.ts.map +1 -0
  262. package/dist/types/code-transforms.js +11 -0
  263. package/dist/types/code-transforms.js.map +1 -0
  264. package/dist/types/css-framework.d.ts +110 -0
  265. package/dist/types/css-framework.d.ts.map +1 -0
  266. package/dist/types/css-framework.js +3 -0
  267. package/dist/types/css-framework.js.map +1 -0
  268. package/dist/types/dashboard.d.ts +77 -0
  269. package/dist/types/dashboard.d.ts.map +1 -0
  270. package/dist/types/dashboard.js +2 -0
  271. package/dist/types/dashboard.js.map +1 -0
  272. package/dist/types/index.d.ts +3 -0
  273. package/dist/types/index.d.ts.map +1 -1
  274. package/dist/types/index.js +3 -0
  275. package/dist/types/index.js.map +1 -1
  276. package/dist/types/model-routing.d.ts +127 -0
  277. package/dist/types/model-routing.d.ts.map +1 -0
  278. package/dist/types/model-routing.js +3 -0
  279. package/dist/types/model-routing.js.map +1 -0
  280. package/dist/types/project/core.d.ts +46 -5
  281. package/dist/types/project/core.d.ts.map +1 -1
  282. package/dist/types/spec/core.d.ts +28 -1
  283. package/dist/types/spec/core.d.ts.map +1 -1
  284. package/dist/types/spec/inputs.d.ts +1 -6
  285. package/dist/types/spec/inputs.d.ts.map +1 -1
  286. package/dist/types/spec-templates.d.ts +51 -1
  287. package/dist/types/spec-templates.d.ts.map +1 -1
  288. package/dist/types/ui.d.ts +3 -231
  289. package/dist/types/ui.d.ts.map +1 -1
  290. package/dist/types/ui.js +7 -1
  291. package/dist/types/ui.js.map +1 -1
  292. package/dist/types/vector-store.d.ts +144 -0
  293. package/dist/types/vector-store.d.ts.map +1 -0
  294. package/dist/types/vector-store.js +3 -0
  295. package/dist/types/vector-store.js.map +1 -0
  296. package/package.json +1 -1
  297. package/src/config/model-routing-rules.json +98 -0
@@ -0,0 +1,182 @@
1
+ // engine/code-transforms/typescript/add-types.ts — Add types transform (AC-03).
2
+ // Infers types from initializers and adds type annotations.
3
+ import { getTypeScript, parseSource, getLineNumber, createChange } from './ast-utils.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Type inference from initializer
6
+ // ---------------------------------------------------------------------------
7
+ function inferTypeFromInit(ts, init) {
8
+ if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) {
9
+ return 'string';
10
+ }
11
+ if (ts.isNumericLiteral(init)) {
12
+ return 'number';
13
+ }
14
+ if (init.kind === ts.SyntaxKind.TrueKeyword || init.kind === ts.SyntaxKind.FalseKeyword) {
15
+ return 'boolean';
16
+ }
17
+ if (init.kind === ts.SyntaxKind.NullKeyword) {
18
+ return 'null';
19
+ }
20
+ /* v8 ignore start -- UndefinedKeyword is rarely emitted; TS parses `undefined` as Identifier */
21
+ if (init.kind === ts.SyntaxKind.UndefinedKeyword) {
22
+ return 'undefined';
23
+ }
24
+ /* v8 ignore stop */
25
+ if (ts.isArrayLiteralExpression(init)) {
26
+ return inferArrayType(ts, init);
27
+ }
28
+ if (ts.isObjectLiteralExpression(init)) {
29
+ return 'Record<string, unknown>';
30
+ }
31
+ return undefined;
32
+ }
33
+ function inferArrayType(ts, arr) {
34
+ if (arr.elements.length === 0) {
35
+ return 'unknown[]';
36
+ }
37
+ const first = arr.elements[0];
38
+ /* v8 ignore start -- defensive: elements[0] always exists when length > 0 */
39
+ if (!first) {
40
+ return 'unknown[]';
41
+ }
42
+ /* v8 ignore stop */
43
+ const elemType = inferTypeFromInit(ts, first);
44
+ return elemType ? `${elemType}[]` : 'unknown[]';
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Collect replacements from variable declarations
48
+ // ---------------------------------------------------------------------------
49
+ function collectVariableTypes(ts, sourceFile, replacements) {
50
+ function visit(node) {
51
+ if (ts.isVariableDeclaration(node) && !node.type && node.initializer) {
52
+ const inferred = inferTypeFromInit(ts, node.initializer);
53
+ if (inferred) {
54
+ const nameEnd = node.name.getEnd();
55
+ replacements.push({
56
+ position: nameEnd,
57
+ length: 0,
58
+ newText: `: ${inferred}`,
59
+ line: getLineNumber(sourceFile, node.getStart(sourceFile)),
60
+ description: `Added type annotation ': ${inferred}' to variable '${node.name.getText(sourceFile)}'`,
61
+ });
62
+ }
63
+ }
64
+ ts.forEachChild(node, visit);
65
+ }
66
+ visit(sourceFile);
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Collect replacements from function return types
70
+ // ---------------------------------------------------------------------------
71
+ function inferReturnType(ts, body) {
72
+ let foundType;
73
+ for (const stmt of body.statements) {
74
+ if (ts.isReturnStatement(stmt) && stmt.expression) {
75
+ const t = inferTypeFromInit(ts, stmt.expression);
76
+ if (t && !foundType) {
77
+ foundType = t;
78
+ }
79
+ else if (t && foundType && t !== foundType) {
80
+ return undefined; // mixed return types
81
+ }
82
+ }
83
+ }
84
+ return foundType;
85
+ }
86
+ function findClosingParen(source, startPos) {
87
+ let depth = 0;
88
+ for (let i = startPos; i < source.length; i++) {
89
+ const ch = source[i];
90
+ if (ch === '(') {
91
+ depth++;
92
+ }
93
+ if (ch === ')') {
94
+ depth--;
95
+ if (depth === 0) {
96
+ return i;
97
+ }
98
+ }
99
+ }
100
+ /* v8 ignore next 1 */
101
+ return -1;
102
+ }
103
+ function collectFunctionReturnTypes(ts, sourceFile, source, replacements) {
104
+ function visit(node) {
105
+ if ((ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) &&
106
+ !node.type &&
107
+ node.body) {
108
+ const retType = inferReturnType(ts, node.body);
109
+ if (retType) {
110
+ const parenPos = findClosingParen(source, node.getStart(sourceFile));
111
+ /* v8 ignore start -- defensive: findClosingParen always succeeds for valid function decls */
112
+ if (parenPos > 0) {
113
+ /* v8 ignore stop */
114
+ const insertPos = parenPos + 1;
115
+ /* v8 ignore start -- FunctionDeclaration without name is extremely rare */
116
+ const name = node.name ? node.name.getText(sourceFile) : '<anonymous>';
117
+ /* v8 ignore stop */
118
+ replacements.push({
119
+ position: insertPos,
120
+ length: 0,
121
+ newText: `: ${retType}`,
122
+ line: getLineNumber(sourceFile, node.getStart(sourceFile)),
123
+ description: `Added return type ': ${retType}' to function '${name}'`,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ ts.forEachChild(node, visit);
129
+ }
130
+ visit(sourceFile);
131
+ }
132
+ // ---------------------------------------------------------------------------
133
+ // Collect replacements from function parameters
134
+ // ---------------------------------------------------------------------------
135
+ function collectParameterTypes(ts, sourceFile, replacements) {
136
+ function visit(node) {
137
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) {
138
+ for (const param of node.parameters) {
139
+ if (!param.type && param.initializer) {
140
+ const inferred = inferTypeFromInit(ts, param.initializer);
141
+ if (inferred) {
142
+ const nameEnd = param.name.getEnd();
143
+ replacements.push({
144
+ position: nameEnd,
145
+ length: 0,
146
+ newText: `: ${inferred}`,
147
+ line: getLineNumber(sourceFile, param.getStart(sourceFile)),
148
+ description: `Added type ': ${inferred}' to parameter '${param.name.getText(sourceFile)}'`,
149
+ });
150
+ }
151
+ }
152
+ }
153
+ }
154
+ ts.forEachChild(node, visit);
155
+ }
156
+ visit(sourceFile);
157
+ }
158
+ // ---------------------------------------------------------------------------
159
+ // Main export
160
+ // ---------------------------------------------------------------------------
161
+ export function addTypes(source, _options, fileName) {
162
+ const ts = getTypeScript();
163
+ const sourceFile = parseSource(source, fileName);
164
+ const replacements = [];
165
+ collectVariableTypes(ts, sourceFile, replacements);
166
+ collectFunctionReturnTypes(ts, sourceFile, source, replacements);
167
+ collectParameterTypes(ts, sourceFile, replacements);
168
+ if (replacements.length === 0) {
169
+ return { transformed: source, changes: [] };
170
+ }
171
+ // Apply in reverse position order
172
+ replacements.sort((a, b) => b.position - a.position);
173
+ let result = source;
174
+ const changes = [];
175
+ for (const rep of replacements) {
176
+ result = result.slice(0, rep.position) + rep.newText + result.slice(rep.position + rep.length);
177
+ changes.push(createChange(rep.line, rep.description));
178
+ }
179
+ changes.sort((a, b) => a.line - b.line);
180
+ return { transformed: result, changes };
181
+ }
182
+ //# sourceMappingURL=add-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-types.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type TSModule from 'typescript';
2
+ /**
3
+ * Lazy-load the TypeScript compiler API. Caches after first call.
4
+ * Throws if `typescript` is not installed as a peer dependency.
5
+ */
6
+ export declare function getTypeScript(): typeof TSModule;
7
+ /** Reset the TS cache — used in tests. */
8
+ export declare function resetTypeScriptCache(): void;
9
+ /**
10
+ * Parse source code into a TS SourceFile AST node.
11
+ */
12
+ export declare function parseSource(source: string, fileName: string): TSModule.SourceFile;
13
+ /**
14
+ * Pretty-print a SourceFile AST back to string.
15
+ */
16
+ export declare function printSource(sourceFile: TSModule.SourceFile): string;
17
+ /**
18
+ * Find all AST nodes of a given SyntaxKind in a source file.
19
+ */
20
+ export declare function findNodes(sourceFile: TSModule.SourceFile, kind: TSModule.SyntaxKind): TSModule.Node[];
21
+ /**
22
+ * Get 1-based line number for a position in the source file.
23
+ */
24
+ export declare function getLineNumber(sourceFile: TSModule.SourceFile, pos: number): number;
25
+ /**
26
+ * Create a change record for reporting.
27
+ */
28
+ export declare function createChange(line: number, description: string): {
29
+ line: number;
30
+ description: string;
31
+ };
32
+ /**
33
+ * Apply a text replacement at a specific range in the source string.
34
+ * Replacements must be applied in reverse order (highest position first)
35
+ * to keep earlier positions valid.
36
+ */
37
+ export declare function replaceRange(source: string, start: number, end: number, replacement: string): string;
38
+ //# sourceMappingURL=ast-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/ast-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAQvC;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,QAAQ,CAa/C;AAED,0CAA0C;AAC1C,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,UAAU,CAGjF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAG,MAAM,CAInE;AAMD;;GAEG;AACH,wBAAgB,SAAS,CACvB,UAAU,EAAE,QAAQ,CAAC,UAAU,EAC/B,IAAI,EAAE,QAAQ,CAAC,UAAU,GACxB,QAAQ,CAAC,IAAI,EAAE,CAajB;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAElF;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB,MAAM,CAER"}
@@ -0,0 +1,90 @@
1
+ // engine/code-transforms/typescript/ast-utils.ts — Shared AST utilities (AC-08).
2
+ // Lazy-loads TypeScript compiler API and provides common helpers.
3
+ // ---------------------------------------------------------------------------
4
+ // Lazy TypeScript loader with cache
5
+ // ---------------------------------------------------------------------------
6
+ let tsCache;
7
+ /**
8
+ * Lazy-load the TypeScript compiler API. Caches after first call.
9
+ * Throws if `typescript` is not installed as a peer dependency.
10
+ */
11
+ export function getTypeScript() {
12
+ if (tsCache) {
13
+ return tsCache;
14
+ }
15
+ try {
16
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
17
+ tsCache = require('typescript');
18
+ return tsCache;
19
+ }
20
+ catch {
21
+ throw new Error('TypeScript compiler API not available. Install typescript as a peer dependency.');
22
+ }
23
+ }
24
+ /** Reset the TS cache — used in tests. */
25
+ export function resetTypeScriptCache() {
26
+ tsCache = undefined;
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Parse / print helpers
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Parse source code into a TS SourceFile AST node.
33
+ */
34
+ export function parseSource(source, fileName) {
35
+ const ts = getTypeScript();
36
+ return ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true);
37
+ }
38
+ /**
39
+ * Pretty-print a SourceFile AST back to string.
40
+ */
41
+ export function printSource(sourceFile) {
42
+ const ts = getTypeScript();
43
+ const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
44
+ return printer.printFile(sourceFile);
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // AST traversal
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * Find all AST nodes of a given SyntaxKind in a source file.
51
+ */
52
+ export function findNodes(sourceFile, kind) {
53
+ const ts = getTypeScript();
54
+ const results = [];
55
+ function visit(node) {
56
+ if (node.kind === kind) {
57
+ results.push(node);
58
+ }
59
+ ts.forEachChild(node, visit);
60
+ }
61
+ visit(sourceFile);
62
+ return results;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Position helpers
66
+ // ---------------------------------------------------------------------------
67
+ /**
68
+ * Get 1-based line number for a position in the source file.
69
+ */
70
+ export function getLineNumber(sourceFile, pos) {
71
+ return sourceFile.getLineAndCharacterOfPosition(pos).line + 1;
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Text replacement helper
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Create a change record for reporting.
78
+ */
79
+ export function createChange(line, description) {
80
+ return { line, description };
81
+ }
82
+ /**
83
+ * Apply a text replacement at a specific range in the source string.
84
+ * Replacements must be applied in reverse order (highest position first)
85
+ * to keep earlier positions valid.
86
+ */
87
+ export function replaceRange(source, start, end, replacement) {
88
+ return source.slice(0, start) + replacement + source.slice(end);
89
+ }
90
+ //# sourceMappingURL=ast-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/ast-utils.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kEAAkE;AAIlE,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E,IAAI,OAAoC,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC;QACH,iEAAiE;QACjE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAoB,CAAC;QACnD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,oBAAoB;IAClC,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAgB;IAC1D,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,UAA+B;IACzD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,UAA+B,EAC/B,IAAyB;IAEzB,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,SAAS,KAAK,CAAC,IAAmB;QAChC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,CAAC;IAClB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAA+B,EAAE,GAAW;IACxE,OAAO,UAAU,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,WAAmB;IAEnB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,KAAa,EACb,GAAW,EACX,WAAmB;IAEnB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ExtractInterfaceOptions, ExtractResult } from '../../../types/index.js';
2
+ /**
3
+ * Extract an interface from a class declaration.
4
+ */
5
+ export declare function extractInterface(source: string, options: ExtractInterfaceOptions, fileName: string): ExtractResult;
6
+ //# sourceMappingURL=extract-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-interface.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/extract-interface.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,uBAAuB,EAEvB,aAAa,EAEd,MAAM,yBAAyB,CAAC;AAyEjC;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,MAAM,GACf,aAAa,CA0Df"}
@@ -0,0 +1,103 @@
1
+ // engine/code-transforms/typescript/extract-interface.ts — Extract interface (AC-06).
2
+ // Extracts an interface from a class declaration and adds implements clause.
3
+ import { getTypeScript, parseSource, getLineNumber, createChange } from './ast-utils.js';
4
+ function collectMembers(ts, node, sourceFile) {
5
+ const members = [];
6
+ for (const member of node.members) {
7
+ // Skip private members
8
+ /* v8 ignore start -- canHaveModifiers is true for all property/method class members */
9
+ const mods = ts.canHaveModifiers(member) ? ts.getModifiers(member) : undefined;
10
+ /* v8 ignore stop */
11
+ if (mods?.some((m) => m.kind === ts.SyntaxKind.PrivateKeyword)) {
12
+ continue;
13
+ }
14
+ if (ts.isPropertyDeclaration(member)) {
15
+ const name = member.name.getText(sourceFile);
16
+ const type = member.type ? member.type.getText(sourceFile) : 'unknown';
17
+ members.push({ name, signature: `${name}: ${type}` });
18
+ }
19
+ if (ts.isMethodDeclaration(member)) {
20
+ const name = member.name.getText(sourceFile);
21
+ const params = member.parameters
22
+ .map((p) => {
23
+ const pName = p.name.getText(sourceFile);
24
+ const pType = p.type ? p.type.getText(sourceFile) : 'unknown';
25
+ return `${pName}: ${pType}`;
26
+ })
27
+ .join(', ');
28
+ const retType = member.type ? member.type.getText(sourceFile) : 'void';
29
+ members.push({ name, signature: `${name}(${params}): ${retType}` });
30
+ }
31
+ }
32
+ return members;
33
+ }
34
+ function addImplementsClause(ts, classNode, sourceFile, source, interfaceName) {
35
+ // Find the position of the opening brace
36
+ const openBrace = source.indexOf('{', classNode.getStart(sourceFile));
37
+ /* v8 ignore start -- defensive: class should always have { */
38
+ if (openBrace < 0) {
39
+ return source;
40
+ }
41
+ /* v8 ignore stop */
42
+ // Check if class already has an implements clause
43
+ if (classNode.heritageClauses?.some((h) => h.token === ts.SyntaxKind.ImplementsKeyword)) {
44
+ // Append to existing implements
45
+ const impl = classNode.heritageClauses.find((h) => h.token === ts.SyntaxKind.ImplementsKeyword);
46
+ /* v8 ignore start -- impl is always found since .some() above confirmed it exists */
47
+ if (impl) {
48
+ /* v8 ignore stop */
49
+ const end = impl.getEnd();
50
+ return source.slice(0, end) + `, ${interfaceName}` + source.slice(end);
51
+ }
52
+ }
53
+ // Insert implements before opening brace
54
+ return source.slice(0, openBrace) + `implements ${interfaceName} ` + source.slice(openBrace);
55
+ }
56
+ /**
57
+ * Extract an interface from a class declaration.
58
+ */
59
+ export function extractInterface(source, options, fileName) {
60
+ const ts = getTypeScript();
61
+ const sourceFile = parseSource(source, fileName);
62
+ const changes = [];
63
+ // Find the target class
64
+ let targetClass;
65
+ function visit(node) {
66
+ if (ts.isClassDeclaration(node) && node.name?.getText(sourceFile) === options.className) {
67
+ targetClass = node;
68
+ }
69
+ ts.forEachChild(node, visit);
70
+ }
71
+ visit(sourceFile);
72
+ if (!targetClass) {
73
+ return { transformed: source, changes: [] };
74
+ }
75
+ const members = collectMembers(ts, targetClass, sourceFile);
76
+ if (members.length === 0) {
77
+ return { transformed: source, changes: [] };
78
+ }
79
+ const ifaceName = options.interfaceName ?? `I${options.className}`;
80
+ const memberLines = members.map((m) => ` ${m.signature};`).join('\n');
81
+ const interfaceDecl = `interface ${ifaceName} {\n${memberLines}\n}\n\n`;
82
+ // Insert interface before the class
83
+ const classStart = targetClass.getStart(sourceFile);
84
+ let result = source.slice(0, classStart) + interfaceDecl + source.slice(classStart);
85
+ // Re-parse and add implements clause
86
+ const newSourceFile = parseSource(result, fileName);
87
+ let newClassNode;
88
+ function visitNew(node) {
89
+ if (ts.isClassDeclaration(node) && node.name?.getText(newSourceFile) === options.className) {
90
+ newClassNode = node;
91
+ }
92
+ ts.forEachChild(node, visitNew);
93
+ }
94
+ visitNew(newSourceFile);
95
+ if (newClassNode) {
96
+ result = addImplementsClause(ts, newClassNode, newSourceFile, result, ifaceName);
97
+ }
98
+ const line = getLineNumber(sourceFile, classStart);
99
+ changes.push(createChange(line, `Extracted interface '${ifaceName}' from class '${options.className}'`));
100
+ changes.push(createChange(line, `Added 'implements ${ifaceName}' to class '${options.className}'`));
101
+ return { transformed: result, changes };
102
+ }
103
+ //# sourceMappingURL=extract-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-interface.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/extract-interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ModernizeSyntaxOptions, ModernizeResult } from '../../../types/index.js';
2
+ export declare function modernizeSyntax(source: string, options: ModernizeSyntaxOptions, fileName: string): ModernizeResult;
3
+ //# sourceMappingURL=modernize-syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modernize-syntax.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/modernize-syntax.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,sBAAsB,EAEtB,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AAuOjC,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,EAAE,MAAM,GACf,eAAe,CAkCjB"}