@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,98 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "rules": [
4
+ {
5
+ "id": "haiku-simple-readonly",
6
+ "name": "Haiku for simple read-only tasks",
7
+ "conditions": [
8
+ { "signal": "criteriaCount", "operator": "lte", "value": 5 },
9
+ { "signal": "fileCount", "operator": "lte", "value": 3 },
10
+ { "signal": "isReadOnly", "operator": "eq", "value": true }
11
+ ],
12
+ "result": "haiku",
13
+ "weight": 1.0
14
+ },
15
+ {
16
+ "id": "haiku-search",
17
+ "name": "Haiku for search/explore tasks",
18
+ "conditions": [
19
+ { "signal": "taskType", "operator": "eq", "value": "search" },
20
+ { "signal": "criteriaCount", "operator": "lte", "value": 5 }
21
+ ],
22
+ "result": "haiku",
23
+ "weight": 0.9
24
+ },
25
+ {
26
+ "id": "sonnet-medium-generation",
27
+ "name": "Sonnet for medium code generation",
28
+ "conditions": [
29
+ { "signal": "criteriaCount", "operator": "between", "value": [6, 15] },
30
+ { "signal": "taskType", "operator": "eq", "value": "generation" }
31
+ ],
32
+ "result": "sonnet",
33
+ "weight": 0.85
34
+ },
35
+ {
36
+ "id": "sonnet-medium-files",
37
+ "name": "Sonnet for medium file count tasks",
38
+ "conditions": [{ "signal": "fileCount", "operator": "between", "value": [4, 10] }],
39
+ "result": "sonnet",
40
+ "weight": 0.75
41
+ },
42
+ {
43
+ "id": "sonnet-refactor",
44
+ "name": "Sonnet for refactoring tasks",
45
+ "conditions": [
46
+ { "signal": "taskType", "operator": "eq", "value": "refactor" },
47
+ { "signal": "crossLayerCount", "operator": "lte", "value": 2 }
48
+ ],
49
+ "result": "sonnet",
50
+ "weight": 0.8
51
+ },
52
+ {
53
+ "id": "opus-high-criteria",
54
+ "name": "Opus for specs with many criteria",
55
+ "conditions": [{ "signal": "criteriaCount", "operator": "gt", "value": 15 }],
56
+ "result": "opus",
57
+ "weight": 0.9
58
+ },
59
+ {
60
+ "id": "opus-many-files",
61
+ "name": "Opus for tasks touching many files",
62
+ "conditions": [{ "signal": "fileCount", "operator": "gt", "value": 10 }],
63
+ "result": "opus",
64
+ "weight": 0.85
65
+ },
66
+ {
67
+ "id": "opus-cross-layer",
68
+ "name": "Opus for cross-layer changes",
69
+ "conditions": [{ "signal": "crossLayerCount", "operator": "gt", "value": 2 }],
70
+ "result": "opus",
71
+ "weight": 0.9
72
+ },
73
+ {
74
+ "id": "opus-architecture",
75
+ "name": "Opus for architecture design",
76
+ "conditions": [{ "signal": "taskType", "operator": "eq", "value": "architecture" }],
77
+ "result": "opus",
78
+ "weight": 0.95
79
+ },
80
+ {
81
+ "id": "opus-security",
82
+ "name": "Opus for security-sensitive tasks",
83
+ "conditions": [
84
+ { "signal": "hasSecurityImplications", "operator": "eq", "value": true },
85
+ { "signal": "crossLayerCount", "operator": "gt", "value": 1 }
86
+ ],
87
+ "result": "opus",
88
+ "weight": 0.85
89
+ },
90
+ {
91
+ "id": "sonnet-default",
92
+ "name": "Sonnet as balanced default",
93
+ "conditions": [],
94
+ "result": "sonnet",
95
+ "weight": 0.5
96
+ }
97
+ ]
98
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "groups": [
3
+ {
4
+ "id": "core",
5
+ "name": "Core",
6
+ "description": "Essential tools always available — project setup, locale, spec listing, and group management.",
7
+ "tools": ["set_locale", "init_project", "init_constitution", "list_specs", "activate_group", "list_groups"],
8
+ "defaultEnabled": true,
9
+ "locked": true
10
+ },
11
+ {
12
+ "id": "spec-lifecycle",
13
+ "name": "Spec Lifecycle",
14
+ "description": "Create, validate, estimate, and manage specs through their full lifecycle.",
15
+ "tools": [
16
+ "create_spec",
17
+ "validate",
18
+ "estimate",
19
+ "challenge_spec",
20
+ "update_status",
21
+ "check_readiness",
22
+ "clarify_requirements",
23
+ "summarize_spec",
24
+ "reconcile_spec",
25
+ "list_templates",
26
+ "apply_template",
27
+ "spec_history",
28
+ "log_decision"
29
+ ],
30
+ "defaultEnabled": true,
31
+ "locked": false,
32
+ "triggerTools": ["create_spec", "validate", "estimate"]
33
+ },
34
+ {
35
+ "id": "analysis",
36
+ "name": "Analysis",
37
+ "description": "Audit, drift detection, contradiction checks, and deep code analysis.",
38
+ "tools": [
39
+ "audit",
40
+ "audit_stack",
41
+ "detect_drift",
42
+ "detect_contradictions",
43
+ "detect_deprecations",
44
+ "detect_agent",
45
+ "reality_check",
46
+ "check_spec_accuracy",
47
+ "paradigm_report",
48
+ "spec_coverage"
49
+ ],
50
+ "defaultEnabled": false,
51
+ "locked": false,
52
+ "triggerTools": ["audit", "detect_drift", "reality_check"]
53
+ },
54
+ {
55
+ "id": "generation",
56
+ "name": "Generation",
57
+ "description": "Generate docs, tests, schemas, UI contracts, skills, rules, and ADRs.",
58
+ "tools": [
59
+ "generate_docs",
60
+ "generate_tests",
61
+ "design_schema",
62
+ "define_ui_contract",
63
+ "generate_adr",
64
+ "generate_checklist",
65
+ "generate_rules",
66
+ "generate_skill",
67
+ "generate_sub_agent",
68
+ "consult_docs",
69
+ "event_contracts"
70
+ ],
71
+ "defaultEnabled": false,
72
+ "locked": false,
73
+ "triggerTools": ["generate_docs", "generate_tests", "design_schema"]
74
+ },
75
+ {
76
+ "id": "orchestration",
77
+ "name": "Orchestration",
78
+ "description": "Multi-agent orchestration, execution plans, handoff packages, and AI cost estimation.",
79
+ "tools": [
80
+ "orchestrate",
81
+ "orchestrate_agents",
82
+ "package_handoff",
83
+ "generate_execution_plan",
84
+ "generate_orchestration_script",
85
+ "estimate_ai_cost",
86
+ "integrate_pm"
87
+ ],
88
+ "defaultEnabled": false,
89
+ "locked": false,
90
+ "triggerTools": ["orchestrate", "orchestrate_agents", "generate_execution_plan"]
91
+ },
92
+ {
93
+ "id": "devops",
94
+ "name": "DevOps",
95
+ "description": "Git management, tooling suggestions, CI generation, upgrades, and stack recommendations.",
96
+ "tools": [
97
+ "manage_git",
98
+ "suggest_tooling",
99
+ "suggest_stack",
100
+ "suggest_mcps",
101
+ "plan_upgrade",
102
+ "check_versions",
103
+ "check_config_health",
104
+ "generate_ci",
105
+ "discover_mcps",
106
+ "validate_workflow"
107
+ ],
108
+ "defaultEnabled": false,
109
+ "locked": false,
110
+ "triggerTools": ["manage_git", "suggest_tooling", "generate_ci"]
111
+ },
112
+ {
113
+ "id": "governance",
114
+ "name": "Governance",
115
+ "description": "Security checks, data governance, scope management, and context control.",
116
+ "tools": [
117
+ "security_check",
118
+ "data_governance",
119
+ "manage_scope",
120
+ "manage_context",
121
+ "context_budget",
122
+ "request_context",
123
+ "contribute_context",
124
+ "facilitate"
125
+ ],
126
+ "defaultEnabled": false,
127
+ "locked": false,
128
+ "triggerTools": ["security_check", "data_governance", "manage_scope"]
129
+ },
130
+ {
131
+ "id": "learning",
132
+ "name": "Learning",
133
+ "description": "Pattern learning, knowledge capture, reverse engineering, and migration.",
134
+ "tools": ["learn_pattern", "capture_learning", "reverse_engineer", "migrate_tech", "manage_hooks"],
135
+ "defaultEnabled": false,
136
+ "locked": false,
137
+ "triggerTools": ["learn_pattern", "capture_learning", "reverse_engineer"]
138
+ }
139
+ ]
140
+ }
@@ -1,7 +1,7 @@
1
1
  import type { AiCostEstimateResult, EstimateAiCostInput } from '../../types/index.js';
2
2
  /**
3
3
  * Estimates the AI cost for implementing a spec.
4
- * Reads the spec from docs/sdd/specs/, loads pricing from config JSON,
4
+ * Reads the spec from planu/specs/ (or legacy docs/sdd/specs/), loads pricing from config JSON,
5
5
  * and returns a full AiCostEstimateResult with per-model breakdown.
6
6
  */
7
7
  export declare function estimateAiCost(input: EstimateAiCostInput): Promise<AiCostEstimateResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/core.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,oBAAoB,EAEpB,mBAAmB,EAEpB,MAAM,sBAAsB,CAAC;AAmQ9B;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmF9F"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAqD9B;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmF9F"}
@@ -1,9 +1,9 @@
1
1
  // engine/ai-cost-estimator/core.ts — Orchestrates AI cost estimation for specs.
2
2
  // Coordinates token-estimator + model-pricing to produce AiCostEstimateResult.
3
- import { readFile } from 'node:fs/promises';
4
- import { join } from 'node:path';
5
3
  import { loadPricingConfig, getAllModels, calculateCost, calculateAgentTurns, isPricingStale, } from './model-pricing.js';
6
4
  import { buildTokenEstimate } from './token-estimator.js';
5
+ import { loadSpecContent, countAcceptanceCriteria, readUsageAvgTokensPerCall, } from './spec-loader.js';
6
+ import { selectRecommendedModel, buildRecommendationReason, formatMarkdownTable, } from './recommender.js';
7
7
  // ---------------------------------------------------------------------------
8
8
  // Complexity thresholds
9
9
  // ---------------------------------------------------------------------------
@@ -30,175 +30,11 @@ function getComplexityLevel(acCount) {
30
30
  return 'high';
31
31
  }
32
32
  // ---------------------------------------------------------------------------
33
- // Spec content loading
34
- // ---------------------------------------------------------------------------
35
- /**
36
- * Reads spec content from a sdd/specs directory.
37
- * Tries to find the spec directory by matching specId prefix.
38
- */
39
- async function loadSpecContent(specId) {
40
- const specsRoot = 'docs/sdd/specs';
41
- let entries;
42
- try {
43
- const { readdir } = await import('node:fs/promises');
44
- entries = await readdir(specsRoot);
45
- }
46
- catch {
47
- throw new Error(`Spec directory not found at "${specsRoot}". ` +
48
- 'Make sure you are running from the project root.');
49
- }
50
- // Find a directory matching the specId (e.g., "SPEC-069" matches "SPEC-069-ai-cost-estimator")
51
- const specDirName = entries.find((e) => e.startsWith(specId));
52
- if (!specDirName) {
53
- throw new Error(`Spec "${specId}" not found in "${specsRoot}". ` +
54
- `Available specs: ${entries.slice(0, 5).join(', ')}...`);
55
- }
56
- const specDir = join(specsRoot, specDirName);
57
- const parts = [];
58
- for (const filename of ['HU.md', 'FICHA-TECNICA.md']) {
59
- try {
60
- const content = await readFile(join(specDir, filename), 'utf-8');
61
- parts.push(content);
62
- }
63
- catch {
64
- // File not present — skip (not fatal)
65
- }
66
- }
67
- if (parts.length === 0) {
68
- throw new Error(`Spec "${specId}" has no HU.md or FICHA-TECNICA.md in "${specDir}". ` +
69
- 'Cannot estimate without spec content.');
70
- }
71
- return { content: parts.join('\n\n'), specDir };
72
- }
73
- /** Counts acceptance criteria (lines starting with "- [ ]" or "- [x]") in spec content. */
74
- function countAcceptanceCriteria(specContent) {
75
- const matches = specContent.match(/^- \[[ xX]\]/gm);
76
- return matches?.length ?? 0;
77
- }
78
- // ---------------------------------------------------------------------------
79
- // Usage calibration
80
- // ---------------------------------------------------------------------------
81
- /** Reads average tokens per call from usage.json if available. */
82
- async function readUsageAvgTokensPerCall() {
83
- try {
84
- const { readFile: rf } = await import('node:fs/promises');
85
- const raw = await rf('data/global/usage.json', 'utf-8');
86
- /* v8 ignore start */
87
- const log = JSON.parse(raw);
88
- if (log.events.length === 0) {
89
- return undefined;
90
- }
91
- // Usage events don't track token counts — return undefined to use defaults
92
- return undefined;
93
- /* v8 ignore stop */
94
- }
95
- catch {
96
- return undefined;
97
- }
98
- }
99
- // ---------------------------------------------------------------------------
100
- // Recommendation logic
101
- // ---------------------------------------------------------------------------
102
- /** Selects the recommended model based on spec complexity. */
103
- function selectRecommendedModel(models, complexity) {
104
- const preferencesByComplexity = {
105
- low: [
106
- 'claude-haiku-3-5',
107
- 'gemini-2-5-pro',
108
- 'gpt-4-1',
109
- 'gpt-4o',
110
- 'claude-sonnet-4',
111
- 'claude-opus-4',
112
- ],
113
- medium: [
114
- 'claude-sonnet-4',
115
- 'gpt-4o',
116
- 'gpt-4-1',
117
- 'gemini-2-5-pro',
118
- 'claude-haiku-3-5',
119
- 'claude-opus-4',
120
- ],
121
- high: [
122
- 'claude-opus-4',
123
- 'claude-sonnet-4',
124
- 'gpt-4o',
125
- 'gpt-4-1',
126
- 'gemini-2-5-pro',
127
- 'claude-haiku-3-5',
128
- ],
129
- };
130
- const preferences = preferencesByComplexity[complexity] ?? preferencesByComplexity.medium ?? [];
131
- for (const modelId of preferences) {
132
- const model = models.find((m) => m.id === modelId);
133
- if (model) {
134
- return model;
135
- }
136
- }
137
- // Fallback: cheapest model
138
- /* v8 ignore start */
139
- const sorted = [...models].sort((a, b) => a.inputPricePerMillion - b.inputPricePerMillion);
140
- const first = sorted[0];
141
- if (!first) {
142
- throw new Error('No models available in pricing config');
143
- }
144
- return first;
145
- /* v8 ignore stop */
146
- }
147
- /** Builds a human-readable recommendation reason. */
148
- function buildRecommendationReason(model, complexity, savingsVsMostExpensive) {
149
- const complexityLabel = { low: 'baja', medium: 'media', high: 'alta' }[complexity];
150
- const baseReason = `Para complejidad ${complexityLabel}, **${model.displayName}** ofrece `;
151
- if (complexity === 'low') {
152
- return (baseReason +
153
- `el mejor precio sin sacrificar calidad. ` +
154
- `Ahorro estimado vs modelo más caro: $${savingsVsMostExpensive.toFixed(4)} USD.`);
155
- }
156
- if (complexity === 'medium') {
157
- return (baseReason +
158
- `el mejor balance calidad/precio. ` +
159
- `Ahorro estimado vs modelo más caro: $${savingsVsMostExpensive.toFixed(4)} USD.`);
160
- }
161
- return (baseReason +
162
- `máxima calidad para specs complejas. ` +
163
- `El costo adicional se justifica por la reducción de iteraciones.`);
164
- }
165
- // ---------------------------------------------------------------------------
166
- // Markdown formatting
167
- // ---------------------------------------------------------------------------
168
- /** Formats the cost estimates as a markdown table. */
169
- function formatMarkdownTable(estimates, recommendedModelId, recommendationReason, staleWarning) {
170
- const header = '| Modelo | Tokens Input | Tokens Output | Costo Estimado | Rango (±) | Agent Turns |\n' +
171
- '|--------|-------------|---------------|----------------|-----------|-------------|';
172
- const rows = estimates.map((est) => {
173
- const marker = est.modelId === recommendedModelId ? ' ⭐' : '';
174
- const cost = `$${est.estimatedCostUsd.toFixed(4)}`;
175
- const range = `±${est.confidenceRangePct}%`;
176
- return (`| ${est.displayName}${marker} | ${est.inputTokens.toLocaleString()} | ` +
177
- `${est.outputTokens.toLocaleString()} | ${cost} | ${range} | ${est.agentTurns} |`);
178
- });
179
- const recommended = estimates.find((e) => e.modelId === recommendedModelId);
180
- const recommendedName = recommended?.displayName ?? recommendedModelId;
181
- const lines = [
182
- '## Estimación de Costo por Modelo IA',
183
- '',
184
- header,
185
- ...rows,
186
- '',
187
- `## Recomendación: ${recommendedName}`,
188
- '',
189
- recommendationReason,
190
- ];
191
- if (staleWarning) {
192
- lines.push('', `> **Aviso**: ${staleWarning}`);
193
- }
194
- return lines.join('\n');
195
- }
196
- // ---------------------------------------------------------------------------
197
33
  // Main orchestrator
198
34
  // ---------------------------------------------------------------------------
199
35
  /**
200
36
  * Estimates the AI cost for implementing a spec.
201
- * Reads the spec from docs/sdd/specs/, loads pricing from config JSON,
37
+ * Reads the spec from planu/specs/ (or legacy docs/sdd/specs/), loads pricing from config JSON,
202
38
  * and returns a full AiCostEstimateResult with per-model breakdown.
203
39
  */
204
40
  export async function estimateAiCost(input) {
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AiCostEstimate, AiModelConfig } from '../../types/index.js';
2
+ /** Selects the recommended model based on spec complexity. */
3
+ export declare function selectRecommendedModel(models: readonly AiModelConfig[], complexity: 'low' | 'medium' | 'high'): AiModelConfig;
4
+ /** Builds a human-readable recommendation reason. */
5
+ export declare function buildRecommendationReason(model: AiModelConfig, complexity: 'low' | 'medium' | 'high', savingsVsMostExpensive: number): string;
6
+ /** Formats the cost estimates as a markdown table. */
7
+ export declare function formatMarkdownTable(estimates: readonly AiCostEstimate[], recommendedModelId: string, recommendationReason: string, staleWarning: string): string;
8
+ //# sourceMappingURL=recommender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommender.d.ts","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/recommender.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1E,8DAA8D;AAC9D,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GACpC,aAAa,CA8Cf;AAED,qDAAqD;AACrD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,EACrC,sBAAsB,EAAE,MAAM,GAC7B,MAAM,CA0BR;AAED,sDAAsD;AACtD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,cAAc,EAAE,EACpC,kBAAkB,EAAE,MAAM,EAC1B,oBAAoB,EAAE,MAAM,EAC5B,YAAY,EAAE,MAAM,GACnB,MAAM,CAkCR"}
@@ -0,0 +1,94 @@
1
+ // engine/ai-cost-estimator/recommender.ts — Model recommendation and markdown formatting.
2
+ // Extracted from core.ts to keep file sizes within limits.
3
+ /** Selects the recommended model based on spec complexity. */
4
+ export function selectRecommendedModel(models, complexity) {
5
+ const preferencesByComplexity = {
6
+ low: [
7
+ 'claude-haiku-3-5',
8
+ 'gemini-2-5-pro',
9
+ 'gpt-4-1',
10
+ 'gpt-4o',
11
+ 'claude-sonnet-4',
12
+ 'claude-opus-4',
13
+ ],
14
+ medium: [
15
+ 'claude-sonnet-4',
16
+ 'gpt-4o',
17
+ 'gpt-4-1',
18
+ 'gemini-2-5-pro',
19
+ 'claude-haiku-3-5',
20
+ 'claude-opus-4',
21
+ ],
22
+ high: [
23
+ 'claude-opus-4',
24
+ 'claude-sonnet-4',
25
+ 'gpt-4o',
26
+ 'gpt-4-1',
27
+ 'gemini-2-5-pro',
28
+ 'claude-haiku-3-5',
29
+ ],
30
+ };
31
+ const preferences = preferencesByComplexity[complexity] ?? preferencesByComplexity.medium ?? [];
32
+ for (const modelId of preferences) {
33
+ const model = models.find((m) => m.id === modelId);
34
+ if (model) {
35
+ return model;
36
+ }
37
+ }
38
+ // Fallback: cheapest model
39
+ /* v8 ignore start */
40
+ const sorted = [...models].sort((a, b) => a.inputPricePerMillion - b.inputPricePerMillion);
41
+ const first = sorted[0];
42
+ if (!first) {
43
+ throw new Error('No models available in pricing config');
44
+ }
45
+ return first;
46
+ /* v8 ignore stop */
47
+ }
48
+ /** Builds a human-readable recommendation reason. */
49
+ export function buildRecommendationReason(model, complexity, savingsVsMostExpensive) {
50
+ const complexityLabel = { low: 'baja', medium: 'media', high: 'alta' }[complexity];
51
+ const baseReason = `Para complejidad ${complexityLabel}, **${model.displayName}** ofrece `;
52
+ if (complexity === 'low') {
53
+ return (baseReason +
54
+ `el mejor precio sin sacrificar calidad. ` +
55
+ `Ahorro estimado vs modelo más caro: $${savingsVsMostExpensive.toFixed(4)} USD.`);
56
+ }
57
+ if (complexity === 'medium') {
58
+ return (baseReason +
59
+ `el mejor balance calidad/precio. ` +
60
+ `Ahorro estimado vs modelo más caro: $${savingsVsMostExpensive.toFixed(4)} USD.`);
61
+ }
62
+ return (baseReason +
63
+ `máxima calidad para specs complejas. ` +
64
+ `El costo adicional se justifica por la reducción de iteraciones.`);
65
+ }
66
+ /** Formats the cost estimates as a markdown table. */
67
+ export function formatMarkdownTable(estimates, recommendedModelId, recommendationReason, staleWarning) {
68
+ const header = '| Modelo | Tokens Input | Tokens Output | Costo Estimado | Rango (±) | Agent Turns |\n' +
69
+ '|--------|-------------|---------------|----------------|-----------|-------------|';
70
+ const rows = estimates.map((est) => {
71
+ const marker = est.modelId === recommendedModelId ? ' ⭐' : '';
72
+ const cost = `$${est.estimatedCostUsd.toFixed(4)}`;
73
+ const range = `±${est.confidenceRangePct}%`;
74
+ return (`| ${est.displayName}${marker} | ${est.inputTokens.toLocaleString()} | ` +
75
+ `${est.outputTokens.toLocaleString()} | ${cost} | ${range} | ${est.agentTurns} |`);
76
+ });
77
+ const recommended = estimates.find((e) => e.modelId === recommendedModelId);
78
+ const recommendedName = recommended?.displayName ?? recommendedModelId;
79
+ const lines = [
80
+ '## Estimación de Costo por Modelo IA',
81
+ '',
82
+ header,
83
+ ...rows,
84
+ '',
85
+ `## Recomendación: ${recommendedName}`,
86
+ '',
87
+ recommendationReason,
88
+ ];
89
+ if (staleWarning) {
90
+ lines.push('', `> **Aviso**: ${staleWarning}`);
91
+ }
92
+ return lines.join('\n');
93
+ }
94
+ //# sourceMappingURL=recommender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommender.js","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/recommender.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Reads spec content from a sdd/specs directory.
3
+ * Tries to find the spec directory by matching specId prefix.
4
+ */
5
+ export declare function loadSpecContent(specId: string): Promise<{
6
+ content: string;
7
+ specDir: string;
8
+ }>;
9
+ /** Counts acceptance criteria (lines starting with "- [ ]" or "- [x]") in spec content. */
10
+ export declare function countAcceptanceCriteria(specContent: string): number;
11
+ /** Reads average tokens per call from usage.json if available. */
12
+ export declare function readUsageAvgTokensPerCall(): Promise<number | undefined>;
13
+ //# sourceMappingURL=spec-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-loader.d.ts","sourceRoot":"","sources":["../../../src/engine/ai-cost-estimator/spec-loader.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA6E/C;AAED,2FAA2F;AAC3F,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGnE;AAED,kEAAkE;AAClE,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAe7E"}