@planu/cli 0.27.0 → 0.29.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 (273) hide show
  1. package/dist/config/model-routing-rules.json +98 -0
  2. package/dist/config/tool-groups.json +140 -0
  3. package/dist/engine/ai-cost-estimator/core.d.ts +1 -1
  4. package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
  5. package/dist/engine/ai-cost-estimator/core.js +3 -167
  6. package/dist/engine/ai-cost-estimator/core.js.map +1 -1
  7. package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
  8. package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
  9. package/dist/engine/ai-cost-estimator/recommender.js +94 -0
  10. package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
  11. package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
  12. package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
  13. package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
  14. package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
  15. package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
  16. package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
  17. package/dist/engine/code-transforms/transform-engine.js +67 -0
  18. package/dist/engine/code-transforms/transform-engine.js.map +1 -0
  19. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
  20. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
  21. package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
  22. package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
  23. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
  24. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
  25. package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
  26. package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
  27. package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
  28. package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
  29. package/dist/engine/code-transforms/typescript/add-types.js +182 -0
  30. package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
  31. package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
  32. package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
  33. package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
  34. package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
  35. package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
  36. package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
  37. package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
  38. package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
  39. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
  40. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
  41. package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
  42. package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
  43. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
  44. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
  45. package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
  46. package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
  47. package/dist/engine/focus-tracker.d.ts.map +1 -1
  48. package/dist/engine/focus-tracker.js +1 -0
  49. package/dist/engine/focus-tracker.js.map +1 -1
  50. package/dist/engine/mermaid/core.d.ts +18 -0
  51. package/dist/engine/mermaid/core.d.ts.map +1 -0
  52. package/dist/engine/mermaid/core.js +88 -0
  53. package/dist/engine/mermaid/core.js.map +1 -0
  54. package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
  55. package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
  56. package/dist/engine/mermaid/diagram-generators.js +139 -0
  57. package/dist/engine/mermaid/diagram-generators.js.map +1 -0
  58. package/dist/engine/mermaid/helpers.d.ts +8 -0
  59. package/dist/engine/mermaid/helpers.d.ts.map +1 -0
  60. package/dist/engine/mermaid/helpers.js +61 -0
  61. package/dist/engine/mermaid/helpers.js.map +1 -0
  62. package/dist/engine/mermaid-generator.d.ts +2 -37
  63. package/dist/engine/mermaid-generator.d.ts.map +1 -1
  64. package/dist/engine/mermaid-generator.js +4 -276
  65. package/dist/engine/mermaid-generator.js.map +1 -1
  66. package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
  67. package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
  68. package/dist/engine/model-router/complexity-analyzer.js +182 -0
  69. package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
  70. package/dist/engine/model-router/cost-estimator.d.ts +6 -0
  71. package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
  72. package/dist/engine/model-router/cost-estimator.js +60 -0
  73. package/dist/engine/model-router/cost-estimator.js.map +1 -0
  74. package/dist/engine/model-router/historical-learner.d.ts +26 -0
  75. package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
  76. package/dist/engine/model-router/historical-learner.js +91 -0
  77. package/dist/engine/model-router/historical-learner.js.map +1 -0
  78. package/dist/engine/model-router/rules-engine.d.ts +13 -0
  79. package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
  80. package/dist/engine/model-router/rules-engine.js +142 -0
  81. package/dist/engine/model-router/rules-engine.js.map +1 -0
  82. package/dist/engine/planu-config-writer.d.ts +2 -2
  83. package/dist/engine/planu-config-writer.d.ts.map +1 -1
  84. package/dist/engine/planu-config-writer.js +4 -6
  85. package/dist/engine/planu-config-writer.js.map +1 -1
  86. package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
  87. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
  88. package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
  89. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
  90. package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
  91. package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
  92. package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
  93. package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
  94. package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
  95. package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
  96. package/dist/engine/spec-coverage/test-matchers.js +59 -0
  97. package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
  98. package/dist/engine/spec-migrator.d.ts +17 -0
  99. package/dist/engine/spec-migrator.d.ts.map +1 -0
  100. package/dist/engine/spec-migrator.js +119 -0
  101. package/dist/engine/spec-migrator.js.map +1 -0
  102. package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
  103. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
  104. package/dist/engine/spec-templates/catalog-extra.js +8 -363
  105. package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
  106. package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
  107. package/dist/engine/spec-templates/catalog.js +10 -381
  108. package/dist/engine/spec-templates/catalog.js.map +1 -1
  109. package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
  110. package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
  111. package/dist/engine/spec-templates/templates-api-ui.js +188 -0
  112. package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
  113. package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
  114. package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
  115. package/dist/engine/spec-templates/templates-auth-crud.js +198 -0
  116. package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
  117. package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
  118. package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
  119. package/dist/engine/spec-templates/templates-data-security.js +172 -0
  120. package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
  121. package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
  122. package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
  123. package/dist/engine/spec-templates/templates-perf-integration.js +199 -0
  124. package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
  125. package/dist/engine/tool-groups/context-analyzer.d.ts +11 -0
  126. package/dist/engine/tool-groups/context-analyzer.d.ts.map +1 -0
  127. package/dist/engine/tool-groups/context-analyzer.js +40 -0
  128. package/dist/engine/tool-groups/context-analyzer.js.map +1 -0
  129. package/dist/engine/tool-groups/group-manager.d.ts +35 -0
  130. package/dist/engine/tool-groups/group-manager.d.ts.map +1 -0
  131. package/dist/engine/tool-groups/group-manager.js +201 -0
  132. package/dist/engine/tool-groups/group-manager.js.map +1 -0
  133. package/dist/engine/vector-store/hnsw.d.ts +37 -0
  134. package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
  135. package/dist/engine/vector-store/hnsw.js +294 -0
  136. package/dist/engine/vector-store/hnsw.js.map +1 -0
  137. package/dist/engine/vector-store/similarity.d.ts +21 -0
  138. package/dist/engine/vector-store/similarity.d.ts.map +1 -0
  139. package/dist/engine/vector-store/similarity.js +86 -0
  140. package/dist/engine/vector-store/similarity.js.map +1 -0
  141. package/dist/engine/vector-store/tfidf.d.ts +35 -0
  142. package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
  143. package/dist/engine/vector-store/tfidf.js +255 -0
  144. package/dist/engine/vector-store/tfidf.js.map +1 -0
  145. package/dist/engine/web-fetcher/registry-loader.d.ts.map +1 -1
  146. package/dist/engine/web-fetcher/registry-loader.js +2 -0
  147. package/dist/engine/web-fetcher/registry-loader.js.map +1 -1
  148. package/dist/index.js +19 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/storage/vector-store/backend-factory.d.ts +9 -0
  151. package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
  152. package/dist/storage/vector-store/backend-factory.js +33 -0
  153. package/dist/storage/vector-store/backend-factory.js.map +1 -0
  154. package/dist/storage/vector-store/json-fallback.d.ts +21 -0
  155. package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
  156. package/dist/storage/vector-store/json-fallback.js +85 -0
  157. package/dist/storage/vector-store/json-fallback.js.map +1 -0
  158. package/dist/storage/vector-store/migrator.d.ts +10 -0
  159. package/dist/storage/vector-store/migrator.d.ts.map +1 -0
  160. package/dist/storage/vector-store/migrator.js +139 -0
  161. package/dist/storage/vector-store/migrator.js.map +1 -0
  162. package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
  163. package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
  164. package/dist/storage/vector-store/sqlite-adapter.js +142 -0
  165. package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
  166. package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
  167. package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
  168. package/dist/tools/create-spec/constitution-validator.js +37 -0
  169. package/dist/tools/create-spec/constitution-validator.js.map +1 -0
  170. package/dist/tools/create-spec/post-creation.d.ts +11 -0
  171. package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
  172. package/dist/tools/create-spec/post-creation.js +48 -0
  173. package/dist/tools/create-spec/post-creation.js.map +1 -0
  174. package/dist/tools/create-spec/spec-builder.d.ts +14 -0
  175. package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
  176. package/dist/tools/create-spec/spec-builder.js +131 -0
  177. package/dist/tools/create-spec/spec-builder.js.map +1 -0
  178. package/dist/tools/create-spec.d.ts.map +1 -1
  179. package/dist/tools/create-spec.js +42 -172
  180. package/dist/tools/create-spec.js.map +1 -1
  181. package/dist/tools/data-governance/audit-handler.d.ts.map +1 -1
  182. package/dist/tools/data-governance/audit-handler.js +1 -0
  183. package/dist/tools/data-governance/audit-handler.js.map +1 -1
  184. package/dist/tools/design-schema.d.ts.map +1 -1
  185. package/dist/tools/design-schema.js +1 -0
  186. package/dist/tools/design-schema.js.map +1 -1
  187. package/dist/tools/init-project/handler.d.ts.map +1 -1
  188. package/dist/tools/init-project/handler.js +48 -14
  189. package/dist/tools/init-project/handler.js.map +1 -1
  190. package/dist/tools/recommend-model-handler.d.ts +8 -0
  191. package/dist/tools/recommend-model-handler.d.ts.map +1 -0
  192. package/dist/tools/recommend-model-handler.js +65 -0
  193. package/dist/tools/recommend-model-handler.js.map +1 -0
  194. package/dist/tools/register-ai-cost-tools.js +1 -1
  195. package/dist/tools/register-ai-cost-tools.js.map +1 -1
  196. package/dist/tools/register-model-tools.d.ts +3 -0
  197. package/dist/tools/register-model-tools.d.ts.map +1 -0
  198. package/dist/tools/register-model-tools.js +50 -0
  199. package/dist/tools/register-model-tools.js.map +1 -0
  200. package/dist/tools/register-search-tools.d.ts +7 -0
  201. package/dist/tools/register-search-tools.d.ts.map +1 -0
  202. package/dist/tools/register-search-tools.js +34 -0
  203. package/dist/tools/register-search-tools.js.map +1 -0
  204. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  205. package/dist/tools/register-spec-tools/core-spec-tools.js +0 -4
  206. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  207. package/dist/tools/register-tool-groups.d.ts +7 -0
  208. package/dist/tools/register-tool-groups.d.ts.map +1 -0
  209. package/dist/tools/register-tool-groups.js +39 -0
  210. package/dist/tools/register-tool-groups.js.map +1 -0
  211. package/dist/tools/register-transform-tools.d.ts +3 -0
  212. package/dist/tools/register-transform-tools.d.ts.map +1 -0
  213. package/dist/tools/register-transform-tools.js +29 -0
  214. package/dist/tools/register-transform-tools.js.map +1 -0
  215. package/dist/tools/semantic-search-handler.d.ts +7 -0
  216. package/dist/tools/semantic-search-handler.d.ts.map +1 -0
  217. package/dist/tools/semantic-search-handler.js +72 -0
  218. package/dist/tools/semantic-search-handler.js.map +1 -0
  219. package/dist/tools/suggest-tooling/orchestration-generator.js +1 -1
  220. package/dist/tools/suggest-tooling/orchestration-generator.js.map +1 -1
  221. package/dist/tools/tool-group-handler.d.ts +9 -0
  222. package/dist/tools/tool-group-handler.d.ts.map +1 -0
  223. package/dist/tools/tool-group-handler.js +82 -0
  224. package/dist/tools/tool-group-handler.js.map +1 -0
  225. package/dist/tools/transform-code-handler.d.ts +7 -0
  226. package/dist/tools/transform-code-handler.d.ts.map +1 -0
  227. package/dist/tools/transform-code-handler.js +58 -0
  228. package/dist/tools/transform-code-handler.js.map +1 -0
  229. package/dist/types/advanced-framework.d.ts +47 -0
  230. package/dist/types/advanced-framework.d.ts.map +1 -0
  231. package/dist/types/advanced-framework.js +3 -0
  232. package/dist/types/advanced-framework.js.map +1 -0
  233. package/dist/types/code-transforms.d.ts +114 -0
  234. package/dist/types/code-transforms.d.ts.map +1 -0
  235. package/dist/types/code-transforms.js +11 -0
  236. package/dist/types/code-transforms.js.map +1 -0
  237. package/dist/types/css-framework.d.ts +110 -0
  238. package/dist/types/css-framework.d.ts.map +1 -0
  239. package/dist/types/css-framework.js +3 -0
  240. package/dist/types/css-framework.js.map +1 -0
  241. package/dist/types/dashboard.d.ts +77 -0
  242. package/dist/types/dashboard.d.ts.map +1 -0
  243. package/dist/types/dashboard.js +2 -0
  244. package/dist/types/dashboard.js.map +1 -0
  245. package/dist/types/index.d.ts +4 -0
  246. package/dist/types/index.d.ts.map +1 -1
  247. package/dist/types/index.js +4 -0
  248. package/dist/types/index.js.map +1 -1
  249. package/dist/types/model-routing.d.ts +127 -0
  250. package/dist/types/model-routing.d.ts.map +1 -0
  251. package/dist/types/model-routing.js +3 -0
  252. package/dist/types/model-routing.js.map +1 -0
  253. package/dist/types/project/inputs.d.ts +0 -1
  254. package/dist/types/project/inputs.d.ts.map +1 -1
  255. package/dist/types/spec/core.d.ts +28 -1
  256. package/dist/types/spec/core.d.ts.map +1 -1
  257. package/dist/types/spec/inputs.d.ts +9 -6
  258. package/dist/types/spec/inputs.d.ts.map +1 -1
  259. package/dist/types/tool-groups.d.ts +57 -0
  260. package/dist/types/tool-groups.d.ts.map +1 -0
  261. package/dist/types/tool-groups.js +3 -0
  262. package/dist/types/tool-groups.js.map +1 -0
  263. package/dist/types/ui.d.ts +3 -231
  264. package/dist/types/ui.d.ts.map +1 -1
  265. package/dist/types/ui.js +7 -1
  266. package/dist/types/ui.js.map +1 -1
  267. package/dist/types/vector-store.d.ts +137 -0
  268. package/dist/types/vector-store.d.ts.map +1 -0
  269. package/dist/types/vector-store.js +3 -0
  270. package/dist/types/vector-store.js.map +1 -0
  271. package/package.json +1 -1
  272. package/src/config/model-routing-rules.json +98 -0
  273. package/src/config/tool-groups.json +140 -0
@@ -0,0 +1,102 @@
1
+ // engine/ai-cost-estimator/spec-loader.ts — Loads spec content and counts acceptance criteria.
2
+ // Extracted from core.ts to keep file sizes within limits.
3
+ import { readFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ /**
6
+ * Reads spec content from a sdd/specs directory.
7
+ * Tries to find the spec directory by matching specId prefix.
8
+ */
9
+ export async function loadSpecContent(specId) {
10
+ // Try modern location first, fallback to legacy
11
+ let specsRoot = 'planu/specs';
12
+ try {
13
+ const { access: fsAccess } = await import('node:fs/promises');
14
+ await fsAccess(specsRoot);
15
+ }
16
+ catch {
17
+ specsRoot = 'docs/sdd/specs';
18
+ }
19
+ const { readdir } = await import('node:fs/promises');
20
+ let specDir = null;
21
+ try {
22
+ const topEntries = await readdir(specsRoot);
23
+ // Try flat layout first: planu/specs/SPEC-069-name/ or docs/sdd/specs/SPEC-069-name/
24
+ const flatMatch = topEntries.find((e) => e.startsWith(specId));
25
+ if (flatMatch) {
26
+ specDir = join(specsRoot, flatMatch);
27
+ }
28
+ else {
29
+ // Try nested layout: planu/specs/{feature}/SPEC-069-name/
30
+ for (const group of topEntries) {
31
+ try {
32
+ const groupEntries = await readdir(join(specsRoot, group));
33
+ const nestedMatch = groupEntries.find((e) => e.startsWith(specId));
34
+ if (nestedMatch) {
35
+ specDir = join(specsRoot, group, nestedMatch);
36
+ break;
37
+ }
38
+ }
39
+ catch {
40
+ // Not a directory — skip
41
+ }
42
+ }
43
+ }
44
+ }
45
+ catch {
46
+ throw new Error(`Spec directory not found at "${specsRoot}". ` +
47
+ 'Make sure you are running from the project root.');
48
+ }
49
+ if (!specDir) {
50
+ throw new Error(`Spec "${specId}" not found in "${specsRoot}". ` + 'Check that the spec directory exists.');
51
+ }
52
+ const parts = [];
53
+ // Try modern names first, fallback to legacy — only read one of each pair
54
+ for (const [modern, legacy] of [
55
+ ['spec.md', 'HU.md'],
56
+ ['technical.md', 'FICHA-TECNICA.md'],
57
+ ]) {
58
+ let found = false;
59
+ for (const filename of [modern, legacy]) {
60
+ if (found) {
61
+ break;
62
+ }
63
+ try {
64
+ const content = await readFile(join(specDir, filename), 'utf-8');
65
+ parts.push(content);
66
+ found = true;
67
+ }
68
+ catch {
69
+ // File not present — try next
70
+ }
71
+ }
72
+ }
73
+ if (parts.length === 0) {
74
+ throw new Error(`Spec "${specId}" has no spec files in "${specDir}". ` +
75
+ 'Cannot estimate without spec content.');
76
+ }
77
+ return { content: parts.join('\n\n'), specDir };
78
+ }
79
+ /** Counts acceptance criteria (lines starting with "- [ ]" or "- [x]") in spec content. */
80
+ export function countAcceptanceCriteria(specContent) {
81
+ const matches = specContent.match(/^- \[[ xX]\]/gm);
82
+ return matches?.length ?? 0;
83
+ }
84
+ /** Reads average tokens per call from usage.json if available. */
85
+ export async function readUsageAvgTokensPerCall() {
86
+ try {
87
+ const { readFile: rf } = await import('node:fs/promises');
88
+ const raw = await rf('data/global/usage.json', 'utf-8');
89
+ /* v8 ignore start */
90
+ const log = JSON.parse(raw);
91
+ if (log.events.length === 0) {
92
+ return undefined;
93
+ }
94
+ // Usage events don't track token counts — return undefined to use defaults
95
+ return undefined;
96
+ /* v8 ignore stop */
97
+ }
98
+ catch {
99
+ return undefined;
100
+ }
101
+ }
102
+ //# sourceMappingURL=spec-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-loader.js","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/spec-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type TransformRequest, type TransformResult } from '../../types/index.js';
2
+ /**
3
+ * Execute a code transform based on the request intent.
4
+ * Returns a TransformResult with the transformed source, changes list, and timing.
5
+ */
6
+ export declare function executeTransform(request: TransformRequest): TransformResult;
7
+ //# sourceMappingURL=transform-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-engine.d.ts","sourceRoot":"","sources":["../../../src/engine/code-transforms/transform-engine.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EASrB,MAAM,sBAAsB,CAAC;AAQ9B;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAiC3E"}
@@ -0,0 +1,67 @@
1
+ // engine/code-transforms/transform-engine.ts — Transform orchestrator (AC-01).
2
+ // Validates intent, dispatches to the correct transform implementation, measures timing.
3
+ import { TRANSFORM_INTENTS, } from '../../types/index.js';
4
+ import { renameSymbol } from './typescript/rename-symbol.js';
5
+ import { addTypes } from './typescript/add-types.js';
6
+ import { addErrorHandling } from './typescript/add-error-handling.js';
7
+ import { modernizeSyntax } from './typescript/modernize-syntax.js';
8
+ import { extractInterface } from './typescript/extract-interface.js';
9
+ import { addJSDoc } from './typescript/add-jsdoc.js';
10
+ /**
11
+ * Execute a code transform based on the request intent.
12
+ * Returns a TransformResult with the transformed source, changes list, and timing.
13
+ */
14
+ export function executeTransform(request) {
15
+ const start = performance.now();
16
+ const fileName = request.fileName ?? 'input.ts';
17
+ // Validate intent
18
+ if (!TRANSFORM_INTENTS.includes(request.intent)) {
19
+ return {
20
+ success: false,
21
+ transformed: request.source,
22
+ changes: [],
23
+ durationMs: performance.now() - start,
24
+ error: `Unknown transform intent: '${request.intent}'. Valid intents: ${TRANSFORM_INTENTS.join(', ')}`,
25
+ };
26
+ }
27
+ try {
28
+ const result = dispatch(request.intent, request.source, request.options, fileName);
29
+ return {
30
+ success: true,
31
+ transformed: result.transformed,
32
+ changes: result.changes,
33
+ durationMs: performance.now() - start,
34
+ };
35
+ }
36
+ catch (error) {
37
+ const message = error instanceof Error ? error.message : String(error);
38
+ return {
39
+ success: false,
40
+ transformed: request.source,
41
+ changes: [],
42
+ durationMs: performance.now() - start,
43
+ error: message,
44
+ };
45
+ }
46
+ }
47
+ function dispatch(intent, source, options, fileName) {
48
+ switch (intent) {
49
+ case 'rename-symbol':
50
+ return renameSymbol(source, options, fileName);
51
+ case 'add-types':
52
+ return addTypes(source, options, fileName);
53
+ case 'add-error-handling':
54
+ return addErrorHandling(source, options, fileName);
55
+ case 'modernize-syntax':
56
+ return modernizeSyntax(source, options, fileName);
57
+ case 'extract-interface':
58
+ return extractInterface(source, options, fileName);
59
+ case 'add-jsdoc':
60
+ return addJSDoc(source, options, fileName);
61
+ /* v8 ignore next 4 -- exhaustive check: unreachable thanks to TRANSFORM_INTENTS validation */
62
+ default: {
63
+ throw new Error(`Unhandled transform intent: ${String(intent)}`);
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=transform-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-engine.js","sourceRoot":"","sources":["../../../src/engine/code-transforms/transform-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AddErrorHandlingOptions, ErrorHandlingResult } from '../../../types/index.js';
2
+ /**
3
+ * Add try/catch error handling to async functions.
4
+ */
5
+ export declare function addErrorHandling(source: string, options: AddErrorHandlingOptions, fileName: string): ErrorHandlingResult;
6
+ //# sourceMappingURL=add-error-handling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-error-handling.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-error-handling.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,uBAAuB,EAGvB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAoDjC;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,MAAM,GACf,mBAAmB,CAiDrB"}
@@ -0,0 +1,92 @@
1
+ // engine/code-transforms/typescript/add-error-handling.ts — (AC-04).
2
+ // Wraps async function bodies with try/catch blocks.
3
+ import { getTypeScript, parseSource, getLineNumber, createChange } from './ast-utils.js';
4
+ function isAsyncFunction(ts, node) {
5
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isArrowFunction(node)) {
6
+ const mods = ts.getModifiers(node);
7
+ return mods?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) === true;
8
+ }
9
+ return false;
10
+ }
11
+ function getNodeName(ts, node, sourceFile) {
12
+ if ((ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) && node.name) {
13
+ return node.name.getText(sourceFile);
14
+ }
15
+ return '<anonymous>';
16
+ }
17
+ function buildCatchBlock(style, fnName) {
18
+ switch (style) {
19
+ case 'return-null':
20
+ return [
21
+ `catch (error: unknown) {`,
22
+ ` console.error('Error in ${fnName}:', error);`,
23
+ ` return null;`,
24
+ ` }`,
25
+ ].join('\n');
26
+ case 'log-and-rethrow':
27
+ return [
28
+ `catch (error: unknown) {`,
29
+ ` console.error('Error in ${fnName}:', error);`,
30
+ ` throw error;`,
31
+ ` }`,
32
+ ].join('\n');
33
+ default: // 'rethrow'
34
+ return [`catch (error: unknown) {`, ` throw error;`, ` }`].join('\n');
35
+ }
36
+ }
37
+ function hasExistingTryCatch(ts, body) {
38
+ for (const stmt of body.statements) {
39
+ if (ts.isTryStatement(stmt)) {
40
+ return true;
41
+ }
42
+ }
43
+ return false;
44
+ }
45
+ /**
46
+ * Add try/catch error handling to async functions.
47
+ */
48
+ export function addErrorHandling(source, options, fileName) {
49
+ const ts = getTypeScript();
50
+ const sourceFile = parseSource(source, fileName);
51
+ const style = options.style ?? 'rethrow';
52
+ const targets = [];
53
+ function visit(node) {
54
+ if (isAsyncFunction(ts, node)) {
55
+ let body;
56
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) {
57
+ body = node.body;
58
+ }
59
+ else if (ts.isArrowFunction(node) && ts.isBlock(node.body)) {
60
+ body = node.body;
61
+ }
62
+ if (body && !hasExistingTryCatch(ts, body)) {
63
+ const name = getNodeName(ts, node, sourceFile);
64
+ targets.push({
65
+ name,
66
+ bodyStart: body.getStart(sourceFile) + 1,
67
+ bodyEnd: body.getEnd() - 1,
68
+ line: getLineNumber(sourceFile, node.getStart(sourceFile)),
69
+ });
70
+ }
71
+ }
72
+ ts.forEachChild(node, visit);
73
+ }
74
+ visit(sourceFile);
75
+ if (targets.length === 0) {
76
+ return { transformed: source, changes: [] };
77
+ }
78
+ // Apply in reverse order
79
+ targets.sort((a, b) => b.bodyStart - a.bodyStart);
80
+ let result = source;
81
+ const changes = [];
82
+ for (const target of targets) {
83
+ const innerBody = result.slice(target.bodyStart, target.bodyEnd);
84
+ const catchBlock = buildCatchBlock(style, target.name);
85
+ const wrapped = `\n try {${innerBody}} ${catchBlock}\n`;
86
+ result = result.slice(0, target.bodyStart) + wrapped + result.slice(target.bodyEnd);
87
+ changes.push(createChange(target.line, `Wrapped '${target.name}' with try/catch (${style})`));
88
+ }
89
+ changes.sort((a, b) => a.line - b.line);
90
+ return { transformed: result, changes };
91
+ }
92
+ //# sourceMappingURL=add-error-handling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-error-handling.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-error-handling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AddJSDocOptions, AddJSDocResult } from '../../../types/index.js';
2
+ /**
3
+ * Add JSDoc comments to functions and methods that don't have them.
4
+ */
5
+ export declare function addJSDoc(source: string, options: AddJSDocOptions, fileName: string): AddJSDocResult;
6
+ //# sourceMappingURL=add-jsdoc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-jsdoc.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-jsdoc.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EAGf,cAAc,EACf,MAAM,yBAAyB,CAAC;AAwDjC;;GAEG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,GACf,cAAc,CAwChB"}
@@ -0,0 +1,83 @@
1
+ // engine/code-transforms/typescript/add-jsdoc.ts — Add JSDoc comments (AC-07).
2
+ // Generates JSDoc stubs with @param, @returns, @throws for functions.
3
+ import { getTypeScript, parseSource, getLineNumber, createChange } from './ast-utils.js';
4
+ function hasJSDoc(source, nodeStart) {
5
+ // Check if there is already a JSDoc comment before this node
6
+ const before = source.slice(Math.max(0, nodeStart - 200), nodeStart);
7
+ return before.trimEnd().endsWith('*/');
8
+ }
9
+ function bodyHasThrow(ts, body) {
10
+ if (ts.isThrowStatement(body)) {
11
+ return true;
12
+ }
13
+ let found = false;
14
+ ts.forEachChild(body, (child) => {
15
+ if (bodyHasThrow(ts, child)) {
16
+ found = true;
17
+ }
18
+ });
19
+ return found;
20
+ }
21
+ function buildJSDoc(ts, node, sourceFile, options) {
22
+ const lines = ['/**'];
23
+ /* v8 ignore next 1 -- FunctionDeclaration without name is extremely rare in valid TS */
24
+ const name = node.name ? node.name.getText(sourceFile) : 'anonymous';
25
+ lines.push(` * ${name}`);
26
+ if (options.includeParams !== false) {
27
+ for (const param of node.parameters) {
28
+ const pName = param.name.getText(sourceFile);
29
+ const pType = param.type ? param.type.getText(sourceFile) : 'unknown';
30
+ lines.push(` * @param {${pType}} ${pName}`);
31
+ }
32
+ }
33
+ if (options.includeReturns !== false && node.type) {
34
+ const retType = node.type.getText(sourceFile);
35
+ if (retType !== 'void') {
36
+ lines.push(` * @returns {${retType}}`);
37
+ }
38
+ }
39
+ if (options.includeThrows !== false && node.body && bodyHasThrow(ts, node.body)) {
40
+ lines.push(` * @throws {Error}`);
41
+ }
42
+ lines.push(' */');
43
+ return lines.join('\n');
44
+ }
45
+ /**
46
+ * Add JSDoc comments to functions and methods that don't have them.
47
+ */
48
+ export function addJSDoc(source, options, fileName) {
49
+ const ts = getTypeScript();
50
+ const sourceFile = parseSource(source, fileName);
51
+ const insertions = [];
52
+ function visit(node) {
53
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) {
54
+ const start = node.getStart(sourceFile);
55
+ if (!hasJSDoc(source, start) && node.name) {
56
+ const name = node.name.getText(sourceFile);
57
+ const doc = buildJSDoc(ts, node, sourceFile, options);
58
+ insertions.push({
59
+ position: start,
60
+ text: doc + '\n',
61
+ line: getLineNumber(sourceFile, start),
62
+ name,
63
+ });
64
+ }
65
+ }
66
+ ts.forEachChild(node, visit);
67
+ }
68
+ visit(sourceFile);
69
+ if (insertions.length === 0) {
70
+ return { transformed: source, changes: [] };
71
+ }
72
+ // Apply in reverse order
73
+ insertions.sort((a, b) => b.position - a.position);
74
+ let result = source;
75
+ const changes = [];
76
+ for (const ins of insertions) {
77
+ result = result.slice(0, ins.position) + ins.text + result.slice(ins.position);
78
+ changes.push(createChange(ins.line, `Added JSDoc to '${ins.name}'`));
79
+ }
80
+ changes.sort((a, b) => a.line - b.line);
81
+ return { transformed: result, changes };
82
+ }
83
+ //# sourceMappingURL=add-jsdoc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-jsdoc.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-jsdoc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AddTypesOptions, AddTypesResult } from '../../../types/index.js';
2
+ export declare function addTypes(source: string, _options: AddTypesOptions, fileName: string): AddTypesResult;
3
+ //# sourceMappingURL=add-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-types.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EAGf,cAAc,EACf,MAAM,yBAAyB,CAAC;AA0LjC,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,cAAc,CAwBhB"}
@@ -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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"}