@planu/cli 0.28.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 (218) 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/code-transforms/transform-engine.d.ts +7 -0
  14. package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
  15. package/dist/engine/code-transforms/transform-engine.js +67 -0
  16. package/dist/engine/code-transforms/transform-engine.js.map +1 -0
  17. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
  18. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
  19. package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
  20. package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
  21. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
  22. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
  23. package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
  24. package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
  25. package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
  26. package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
  27. package/dist/engine/code-transforms/typescript/add-types.js +182 -0
  28. package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
  29. package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
  30. package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
  31. package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
  32. package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
  33. package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
  34. package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
  35. package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
  36. package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
  37. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
  38. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
  39. package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
  40. package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
  41. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
  42. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
  43. package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
  44. package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
  45. package/dist/engine/mermaid/core.d.ts +18 -0
  46. package/dist/engine/mermaid/core.d.ts.map +1 -0
  47. package/dist/engine/mermaid/core.js +88 -0
  48. package/dist/engine/mermaid/core.js.map +1 -0
  49. package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
  50. package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
  51. package/dist/engine/mermaid/diagram-generators.js +139 -0
  52. package/dist/engine/mermaid/diagram-generators.js.map +1 -0
  53. package/dist/engine/mermaid/helpers.d.ts +8 -0
  54. package/dist/engine/mermaid/helpers.d.ts.map +1 -0
  55. package/dist/engine/mermaid/helpers.js +61 -0
  56. package/dist/engine/mermaid/helpers.js.map +1 -0
  57. package/dist/engine/mermaid-generator.d.ts +2 -37
  58. package/dist/engine/mermaid-generator.d.ts.map +1 -1
  59. package/dist/engine/mermaid-generator.js +4 -276
  60. package/dist/engine/mermaid-generator.js.map +1 -1
  61. package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
  62. package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
  63. package/dist/engine/model-router/complexity-analyzer.js +182 -0
  64. package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
  65. package/dist/engine/model-router/cost-estimator.d.ts +6 -0
  66. package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
  67. package/dist/engine/model-router/cost-estimator.js +60 -0
  68. package/dist/engine/model-router/cost-estimator.js.map +1 -0
  69. package/dist/engine/model-router/historical-learner.d.ts +26 -0
  70. package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
  71. package/dist/engine/model-router/historical-learner.js +91 -0
  72. package/dist/engine/model-router/historical-learner.js.map +1 -0
  73. package/dist/engine/model-router/rules-engine.d.ts +13 -0
  74. package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
  75. package/dist/engine/model-router/rules-engine.js +142 -0
  76. package/dist/engine/model-router/rules-engine.js.map +1 -0
  77. package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
  78. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
  79. package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
  80. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
  81. package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
  82. package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
  83. package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
  84. package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
  85. package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
  86. package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
  87. package/dist/engine/spec-coverage/test-matchers.js +59 -0
  88. package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
  89. package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
  90. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
  91. package/dist/engine/spec-templates/catalog-extra.js +8 -363
  92. package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
  93. package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
  94. package/dist/engine/spec-templates/catalog.js +10 -381
  95. package/dist/engine/spec-templates/catalog.js.map +1 -1
  96. package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
  97. package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
  98. package/dist/engine/spec-templates/templates-api-ui.js +188 -0
  99. package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
  100. package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
  101. package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
  102. package/dist/engine/spec-templates/templates-auth-crud.js +198 -0
  103. package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
  104. package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
  105. package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
  106. package/dist/engine/spec-templates/templates-data-security.js +172 -0
  107. package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
  108. package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
  109. package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
  110. package/dist/engine/spec-templates/templates-perf-integration.js +199 -0
  111. package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
  112. package/dist/engine/vector-store/hnsw.d.ts +37 -0
  113. package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
  114. package/dist/engine/vector-store/hnsw.js +294 -0
  115. package/dist/engine/vector-store/hnsw.js.map +1 -0
  116. package/dist/engine/vector-store/similarity.d.ts +21 -0
  117. package/dist/engine/vector-store/similarity.d.ts.map +1 -0
  118. package/dist/engine/vector-store/similarity.js +86 -0
  119. package/dist/engine/vector-store/similarity.js.map +1 -0
  120. package/dist/engine/vector-store/tfidf.d.ts +35 -0
  121. package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
  122. package/dist/engine/vector-store/tfidf.js +255 -0
  123. package/dist/engine/vector-store/tfidf.js.map +1 -0
  124. package/dist/index.js +6 -0
  125. package/dist/index.js.map +1 -1
  126. package/dist/storage/vector-store/backend-factory.d.ts +9 -0
  127. package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
  128. package/dist/storage/vector-store/backend-factory.js +33 -0
  129. package/dist/storage/vector-store/backend-factory.js.map +1 -0
  130. package/dist/storage/vector-store/json-fallback.d.ts +21 -0
  131. package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
  132. package/dist/storage/vector-store/json-fallback.js +85 -0
  133. package/dist/storage/vector-store/json-fallback.js.map +1 -0
  134. package/dist/storage/vector-store/migrator.d.ts +10 -0
  135. package/dist/storage/vector-store/migrator.d.ts.map +1 -0
  136. package/dist/storage/vector-store/migrator.js +139 -0
  137. package/dist/storage/vector-store/migrator.js.map +1 -0
  138. package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
  139. package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
  140. package/dist/storage/vector-store/sqlite-adapter.js +142 -0
  141. package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
  142. package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
  143. package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
  144. package/dist/tools/create-spec/constitution-validator.js +37 -0
  145. package/dist/tools/create-spec/constitution-validator.js.map +1 -0
  146. package/dist/tools/create-spec/post-creation.d.ts +11 -0
  147. package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
  148. package/dist/tools/create-spec/post-creation.js +48 -0
  149. package/dist/tools/create-spec/post-creation.js.map +1 -0
  150. package/dist/tools/create-spec/spec-builder.d.ts +14 -0
  151. package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
  152. package/dist/tools/create-spec/spec-builder.js +131 -0
  153. package/dist/tools/create-spec/spec-builder.js.map +1 -0
  154. package/dist/tools/create-spec.d.ts.map +1 -1
  155. package/dist/tools/create-spec.js +42 -172
  156. package/dist/tools/create-spec.js.map +1 -1
  157. package/dist/tools/recommend-model-handler.d.ts +8 -0
  158. package/dist/tools/recommend-model-handler.d.ts.map +1 -0
  159. package/dist/tools/recommend-model-handler.js +65 -0
  160. package/dist/tools/recommend-model-handler.js.map +1 -0
  161. package/dist/tools/register-model-tools.d.ts +3 -0
  162. package/dist/tools/register-model-tools.d.ts.map +1 -0
  163. package/dist/tools/register-model-tools.js +50 -0
  164. package/dist/tools/register-model-tools.js.map +1 -0
  165. package/dist/tools/register-search-tools.d.ts +7 -0
  166. package/dist/tools/register-search-tools.d.ts.map +1 -0
  167. package/dist/tools/register-search-tools.js +34 -0
  168. package/dist/tools/register-search-tools.js.map +1 -0
  169. package/dist/tools/register-transform-tools.d.ts +3 -0
  170. package/dist/tools/register-transform-tools.d.ts.map +1 -0
  171. package/dist/tools/register-transform-tools.js +29 -0
  172. package/dist/tools/register-transform-tools.js.map +1 -0
  173. package/dist/tools/semantic-search-handler.d.ts +7 -0
  174. package/dist/tools/semantic-search-handler.d.ts.map +1 -0
  175. package/dist/tools/semantic-search-handler.js +72 -0
  176. package/dist/tools/semantic-search-handler.js.map +1 -0
  177. package/dist/tools/transform-code-handler.d.ts +7 -0
  178. package/dist/tools/transform-code-handler.d.ts.map +1 -0
  179. package/dist/tools/transform-code-handler.js +58 -0
  180. package/dist/tools/transform-code-handler.js.map +1 -0
  181. package/dist/types/advanced-framework.d.ts +47 -0
  182. package/dist/types/advanced-framework.d.ts.map +1 -0
  183. package/dist/types/advanced-framework.js +3 -0
  184. package/dist/types/advanced-framework.js.map +1 -0
  185. package/dist/types/code-transforms.d.ts +114 -0
  186. package/dist/types/code-transforms.d.ts.map +1 -0
  187. package/dist/types/code-transforms.js +11 -0
  188. package/dist/types/code-transforms.js.map +1 -0
  189. package/dist/types/css-framework.d.ts +110 -0
  190. package/dist/types/css-framework.d.ts.map +1 -0
  191. package/dist/types/css-framework.js +3 -0
  192. package/dist/types/css-framework.js.map +1 -0
  193. package/dist/types/dashboard.d.ts +77 -0
  194. package/dist/types/dashboard.d.ts.map +1 -0
  195. package/dist/types/dashboard.js +2 -0
  196. package/dist/types/dashboard.js.map +1 -0
  197. package/dist/types/index.d.ts +3 -0
  198. package/dist/types/index.d.ts.map +1 -1
  199. package/dist/types/index.js +3 -0
  200. package/dist/types/index.js.map +1 -1
  201. package/dist/types/model-routing.d.ts +127 -0
  202. package/dist/types/model-routing.d.ts.map +1 -0
  203. package/dist/types/model-routing.js +3 -0
  204. package/dist/types/model-routing.js.map +1 -0
  205. package/dist/types/spec/core.d.ts +28 -1
  206. package/dist/types/spec/core.d.ts.map +1 -1
  207. package/dist/types/spec/inputs.d.ts +1 -6
  208. package/dist/types/spec/inputs.d.ts.map +1 -1
  209. package/dist/types/ui.d.ts +3 -231
  210. package/dist/types/ui.d.ts.map +1 -1
  211. package/dist/types/ui.js +7 -1
  212. package/dist/types/ui.js.map +1 -1
  213. package/dist/types/vector-store.d.ts +137 -0
  214. package/dist/types/vector-store.d.ts.map +1 -0
  215. package/dist/types/vector-store.js +3 -0
  216. package/dist/types/vector-store.js.map +1 -0
  217. package/package.json +1 -1
  218. package/src/config/model-routing-rules.json +98 -0
@@ -1,157 +1,49 @@
1
1
  import { ti } from '../i18n/index.js';
2
- import { hashProjectPath, specStore, knowledgeStore, globalStore } from '../storage/index.js';
3
- import { getCurrentTier } from './license-gate.js';
4
- import { checkLimits } from '../engine/license-validator.js';
5
- import { inferDifficulty, calculateEstimation } from '../engine/estimator.js';
6
- import { generateDiagrams } from '../engine/mermaid-generator.js';
7
- import { analyzeSplit, formatSplitSuggestion } from '../engine/spec-splitter.js';
8
- import { getScopeFilters, describeFilters, isExtendedChallenge } from '../engine/scope-filter.js';
2
+ import { knowledgeStore, specStore } from '../storage/index.js';
3
+ import { describeFilters, isExtendedChallenge } from '../engine/scope-filter.js';
9
4
  import { generateHUContent } from './create-spec-hu.js';
10
5
  import { buildAgentHuSection } from './create-spec/agent-spec-adapter.js';
11
6
  import { isMcpSpec, buildMcpHuSection } from './create-spec/mcp-spec-adapter.js';
12
- import { generateFichaTecnicaContent, detectContextFlags, checkConstitutionCompliance, } from './create-spec-tech.js';
7
+ import { generateFichaTecnicaContent } from './create-spec-tech.js';
13
8
  import { writeFile, mkdir } from 'node:fs/promises';
14
9
  import { join } from 'node:path';
15
- import { detectContradictions } from '../engine/contradiction-detector.js';
16
10
  import { detectTeamScale } from '../engine/platform-engineering/idp-detector.js';
17
11
  import { runPreSpecDepCheck } from '../engine/dep-auditor/pre-spec-check.js';
18
12
  import { generateProgressContent } from '../engine/progress-writer.js';
19
- import { isLegacyLocation, getSpecFileNames } from '../engine/planu-config-writer.js';
20
13
  import { generatePerSpecExecutiveReport, generatePerSpecTechnicalReport, } from '../engine/doc-generator/per-spec-report/index.js';
21
- import { dispatchHookEvent } from './manage-hooks.js';
22
- import { buildSpecCreatedPayload } from '../engine/hooks/triggers.js';
23
- import { slugify, generateSpecId, generateBranchName, tryAutoSetupGit, } from './create-spec-helpers.js';
14
+ import { buildSpecContext, buildSplitResult } from './create-spec/spec-builder.js';
15
+ import { validateConstitution } from './create-spec/constitution-validator.js';
16
+ import { setupGitBranch, checkContradictions, fireSpecCreatedHook, } from './create-spec/post-creation.js';
24
17
  export async function handleCreateSpec(params) {
25
- const { title, description, projectPath, type = 'feature', scope = 'feature', target = 'fullstack', tags = [], feature, clarificationSessionId, } = params;
18
+ const { description, clarificationSessionId } = params;
26
19
  try {
27
- const projectId = hashProjectPath(projectPath);
28
- // Load project knowledge (optional, but enriches the spec)
20
+ // Build spec context (ID, estimation, diagrams, scope filters)
21
+ const buildResult = await buildSpecContext(params);
22
+ if (!buildResult.ok) {
23
+ return { content: [{ type: 'text', text: buildResult.errorMessage }], isError: true };
24
+ }
25
+ const { spec, specDir, specPath, technicalPath, progressPath, diagrams, estimation, splitSuggestion, scopeFilters, duplicate, projectId, } = buildResult.context;
26
+ // Load project knowledge and clarification session
29
27
  const knowledge = await knowledgeStore.getKnowledge(projectId);
30
- // Load clarification session if provided
31
28
  const clarificationSession = clarificationSessionId
32
29
  ? await knowledgeStore.getClarification(projectId, clarificationSessionId)
33
30
  : null;
34
- // Get existing specs to generate next ID
35
- const existingSpecs = await specStore.listSpecs(projectId);
36
- // License: check active spec limit (exclude completed specs)
37
- const activeSpecs = existingSpecs.filter((s) => s.status !== 'done');
38
- const tier = await getCurrentTier();
39
- const specLimit = checkLimits(tier, activeSpecs.length, 'maxActiveSpecs');
40
- /* v8 ignore start -- license limit requires paid tier test env */
41
- if (!specLimit.allowed) {
42
- return { content: [{ type: 'text', text: specLimit.message }], isError: true };
43
- }
44
- /* v8 ignore stop */
45
- // Generate spec ID and slug
46
- const specId = generateSpecId(existingSpecs.length);
47
- const slug = slugify(title);
48
- // Check for duplicate title
49
- const duplicate = existingSpecs.find((s) => slugify(s.title) === slug);
50
- if (duplicate) {
51
- // Allow creation but warn
52
- }
53
- // Infer difficulty and calculate estimation
54
- const difficulty = inferDifficulty(type, scope);
55
- const globalConfig = await globalStore.getGlobalConfig();
56
- const estimation = calculateEstimation(type, scope, difficulty, globalConfig);
57
- // Determine risk level from difficulty and scope
58
- const risk = difficulty >= 4 || scope === 'architectural'
59
- ? 'high'
60
- : difficulty >= 3 || scope === 'cross-module'
61
- ? 'medium'
62
- : 'low';
63
- // Build spec location with naming convention detection
64
- const specLocation = knowledge?.specLocation ?? 'planu/specs';
65
- const naming = isLegacyLocation(specLocation) ? 'legacy' : 'modern';
66
- const fileNames = getSpecFileNames(naming);
67
- const featureSlug = feature ? slugify(feature) : '_general';
68
- const specDir = join(projectPath, specLocation, featureSlug, slug);
69
- const specPath = join(specDir, fileNames.spec);
70
- const technicalPath = join(specDir, fileNames.technical);
71
- const progressPath = join(specDir, fileNames.progress);
72
- // Generate git branch name
73
- const gitBranch = generateBranchName(specId, slug, type);
74
- // Build the Spec object
75
- const now = new Date().toISOString();
76
- const spec = {
77
- id: specId,
78
- title,
79
- slug,
80
- feature: featureSlug,
81
- type,
82
- scope,
83
- status: 'draft',
84
- difficulty,
85
- risk,
86
- projectId,
87
- createdAt: now,
88
- updatedAt: now,
89
- specPath,
90
- technicalPath,
91
- progressPath,
92
- estimation,
93
- actuals: null,
94
- target,
95
- tags,
96
- dependencies: [],
97
- blockedBy: [],
98
- gitBranch,
99
- impactAnalysis: null,
100
- };
101
- // Detect context flags for diagrams and filters
102
- const contextFlags = detectContextFlags(spec, knowledge);
103
- // Generate Mermaid diagrams
104
- const diagrams = generateDiagrams(spec, knowledge, contextFlags);
105
- // Analyze if spec should be split
106
- const splitSuggestion = analyzeSplit({
107
- criteriaCount: 4, // Default criteria for new specs
108
- moduleCount: scope === 'cross-module' ? 5 : scope === 'architectural' ? 6 : 2,
109
- estimatedHours: estimation.devHours,
110
- description,
111
- type,
112
- scope,
113
- target,
114
- }, specId);
115
- // Get scope filter configuration
116
- const scopeFilters = getScopeFilters(scope, {
117
- hasDatabase: contextFlags.hasDatabase,
118
- hasUi: contextFlags.hasUi,
119
- });
120
- // Validate spec against Constitution (strict violations block creation)
121
- const constitution = await knowledgeStore.getConstitution(projectId);
122
- let constitutionWarnings = [];
123
- if (constitution && constitution.principles.length > 0) {
124
- const violations = checkConstitutionCompliance(title, tags, constitution.principles);
125
- const strictViolations = violations.filter((v) => v.severity === 'error');
126
- if (strictViolations.length > 0) {
127
- return {
128
- content: [
129
- {
130
- type: 'text',
131
- text: JSON.stringify({
132
- error: 'Constitution violation',
133
- strictViolations,
134
- message: `Spec violates ${strictViolations.length} strict Constitution principle(s). Revise the spec or update the Constitution.`,
135
- }, null, 2),
136
- },
137
- ],
138
- isError: true,
139
- };
140
- }
141
- constitutionWarnings = violations.filter((v) => v.severity === 'warning');
31
+ // Validate against Constitution
32
+ const constitutionCheck = await validateConstitution(projectId, spec.title, spec.tags);
33
+ if (constitutionCheck.blocked && constitutionCheck.errorResult) {
34
+ return constitutionCheck.errorResult;
142
35
  }
143
- // Create spec directory and files
36
+ // Create spec directory and write files
144
37
  await mkdir(specDir, { recursive: true });
145
- const agentSection = type === 'agent'
146
- ? buildAgentHuSection(title, description, knowledge, knowledge?.experienceLevel === 'beginner' ? 'beginner' : 'expert')
38
+ const agentSection = spec.type === 'agent'
39
+ ? buildAgentHuSection(spec.title, description, knowledge, knowledge?.experienceLevel === 'beginner' ? 'beginner' : 'expert')
40
+ : '';
41
+ const mcpSection = isMcpSpec(knowledge)
42
+ ? buildMcpHuSection(spec.title, description, knowledge)
147
43
  : '';
148
- // SPEC-016b: MCP server spec section (tool definitions, resources, protocol compliance)
149
- const mcpSection = isMcpSpec(knowledge) ? buildMcpHuSection(title, description, knowledge) : '';
150
- // SPEC-048: Detect team scale for platform engineering sections
151
44
  const teamScale = knowledge?.projectPath
152
45
  ? await detectTeamScale(knowledge.projectPath)
153
46
  : undefined;
154
- // SPEC-025 tech debt: run pre-spec dep check to surface warnings in HU.md
155
47
  const depWarnings = knowledge?.projectPath && knowledge.projectPath.length > 0
156
48
  ? await runPreSpecDepCheck(knowledge.projectPath, knowledge)
157
49
  : undefined;
@@ -171,41 +63,20 @@ export async function handleCreateSpec(params) {
171
63
  const techReportPath = join(specDir, 'technical-report.html');
172
64
  await writeFile(execReportPath, execReport.content, 'utf-8');
173
65
  await writeFile(techReportPath, techReport.content, 'utf-8');
174
- // Update spec with report paths
175
66
  spec.executiveReportPath = execReportPath;
176
67
  spec.technicalReportPath = techReportPath;
177
68
  // Persist spec in storage
178
69
  await specStore.createSpec(projectId, spec);
179
- // Auto-setup git branch (non-blocking — if git fails, spec is still created)
180
- const gitSetupResult = await tryAutoSetupGit(projectId, specId);
70
+ // Auto-setup git branch (non-blocking)
71
+ const gitSetupResult = await setupGitBranch(projectId, spec.id);
181
72
  /* v8 ignore start -- requires real git repo */
182
73
  if (gitSetupResult) {
183
74
  spec.gitBranch = gitSetupResult.branch;
184
75
  }
185
76
  /* v8 ignore stop */
186
- // Brief contradiction check (non-blocking — warns but does not prevent creation)
187
- const allSpecs = await specStore.listSpecs(projectId);
188
- const contradictionHint = (() => {
189
- try {
190
- const specInputs = allSpecs.map((s) => ({
191
- id: s.id,
192
- title: s.title,
193
- content: s.title + ' ' + description,
194
- }));
195
- const contradictions = detectContradictions(specInputs);
196
- const newSpecContradictions = contradictions.filter((c) => c.specA === specId || c.specB === specId);
197
- if (newSpecContradictions.length === 0) {
198
- return undefined;
199
- }
200
- const blockers = newSpecContradictions.filter((c) => c.severity === 'blocker');
201
- return blockers.length > 0
202
- ? `[CONFLICT] ${blockers.length} potential blocker contradiction(s) detected. Run detect_contradictions for details.`
203
- : `[WARNING] ${newSpecContradictions.length} potential contradiction(s) detected. Run detect_contradictions for details.`;
204
- }
205
- catch {
206
- return undefined;
207
- }
208
- })();
77
+ // Brief contradiction check (non-blocking)
78
+ const contradictionHint = await checkContradictions(projectId, spec.id, description);
79
+ // Build result
209
80
  const result = {
210
81
  specId: spec.id,
211
82
  title: spec.title,
@@ -233,10 +104,14 @@ export async function handleCreateSpec(params) {
233
104
  scopeFilters: {
234
105
  filters: scopeFilters.filters,
235
106
  description: describeFilters(scopeFilters),
236
- extendedChallenge: isExtendedChallenge(scope),
107
+ extendedChallenge: isExtendedChallenge(spec.scope),
237
108
  },
238
- duplicateWarning: duplicate ? ti('spec.duplicateTitle', { title, slug }) : undefined,
239
- ...(constitutionWarnings.length > 0 ? { constitutionWarnings } : {}),
109
+ duplicateWarning: duplicate
110
+ ? ti('spec.duplicateTitle', { title: spec.title, slug: spec.slug })
111
+ : undefined,
112
+ ...(constitutionCheck.warnings.length > 0
113
+ ? { constitutionWarnings: constitutionCheck.warnings }
114
+ : {}),
240
115
  ...(clarificationSession
241
116
  ? {
242
117
  linkedClarificationSession: clarificationSession.id,
@@ -246,22 +121,17 @@ export async function handleCreateSpec(params) {
246
121
  : {
247
122
  clarificationNote: 'Spec created directly from description — Planu inferred requirements from project context.',
248
123
  }),
249
- message: ti('tools.create_spec.success', { id: specId, title }),
124
+ message: ti('tools.create_spec.success', { id: spec.id, title: spec.title }),
250
125
  ...(contradictionHint ? { contradictionHint } : {}),
251
126
  /* v8 ignore next -- requires real git repo */
252
127
  ...(gitSetupResult ? { gitAutoSetup: gitSetupResult.data } : {}),
253
128
  };
254
- if (splitSuggestion) {
255
- const level = knowledge?.experienceLevel ?? 'intermediate';
256
- result.splitSuggestion = {
257
- shouldSplit: true,
258
- reason: splitSuggestion.reason,
259
- subSpecs: splitSuggestion.suggestedSpecs,
260
- formatted: formatSplitSuggestion(splitSuggestion, level === 'beginner' ? 'beginner' : 'expert'),
261
- };
129
+ const splitResult = buildSplitResult(splitSuggestion, knowledge?.experienceLevel);
130
+ if (splitResult) {
131
+ result.splitSuggestion = splitResult;
262
132
  }
263
- // Dispatch on_spec_created hook event (fire-and-forget)
264
- void dispatchHookEvent(projectId, buildSpecCreatedPayload(projectId, spec.id, spec.title, spec.type));
133
+ // Dispatch hook event (fire-and-forget)
134
+ fireSpecCreatedHook(projectId, spec);
265
135
  return {
266
136
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
267
137
  };
@@ -1 +1 @@
1
- {"version":3,"file":"create-spec.js","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-spec.js","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RecommendModelInput, ToolResult } from '../types/index.js';
2
+ /**
3
+ * Handle the recommend_model tool call.
4
+ * Accepts a specId, taskDescription, or explicit signals and returns
5
+ * a model recommendation with reasoning and cost estimate.
6
+ */
7
+ export declare function handleRecommendModel(args: RecommendModelInput): ToolResult;
8
+ //# sourceMappingURL=recommend-model-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend-model-handler.d.ts","sourceRoot":"","sources":["../../src/tools/recommend-model-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,UAAU,EAEX,MAAM,mBAAmB,CAAC;AAY3B;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,UAAU,CAuE1E"}
@@ -0,0 +1,65 @@
1
+ // tools/recommend-model-handler.ts — Handler for the recommend_model MCP tool.
2
+ // SPEC-076 AC-05
3
+ import { extractSignals, buildSignalsFromPartial, } from '../engine/model-router/complexity-analyzer.js';
4
+ import { evaluateRules } from '../engine/model-router/rules-engine.js';
5
+ import { adjustFromHistory, computeTaskSignature, } from '../engine/model-router/historical-learner.js';
6
+ import { calculateCost } from '../engine/model-router/cost-estimator.js';
7
+ /**
8
+ * Handle the recommend_model tool call.
9
+ * Accepts a specId, taskDescription, or explicit signals and returns
10
+ * a model recommendation with reasoning and cost estimate.
11
+ */
12
+ export function handleRecommendModel(args) {
13
+ // 1. Build signals
14
+ const text = args.taskDescription ?? args.specId ?? '';
15
+ const signals = args.signals
16
+ ? buildSignalsFromPartial(args.signals)
17
+ : extractSignals(text, undefined);
18
+ // 2. Evaluate rules
19
+ const rulesResult = evaluateRules(signals);
20
+ // 3. Apply historical adjustment
21
+ const taskSig = computeTaskSignature(text || 'unnamed-task');
22
+ const adjustment = adjustFromHistory(rulesResult.model, taskSig);
23
+ const finalModel = adjustment.adjusted ? adjustment.adjustedModel : rulesResult.model;
24
+ const reasoning = [...rulesResult.reasoning];
25
+ if (adjustment.adjusted) {
26
+ reasoning.push(adjustment.reason);
27
+ }
28
+ // 4. Calculate costs
29
+ const costEstimate = calculateCost(finalModel, signals);
30
+ const alternatives = rulesResult.alternatives.map((alt) => ({
31
+ model: alt.model,
32
+ confidence: alt.confidence,
33
+ costEstimate: calculateCost(alt.model, signals),
34
+ }));
35
+ const recommendation = {
36
+ model: finalModel,
37
+ confidence: adjustment.adjusted
38
+ ? Math.max(rulesResult.confidence * 0.9, 0.5)
39
+ : rulesResult.confidence,
40
+ reasoning,
41
+ costEstimate,
42
+ alternatives,
43
+ };
44
+ // 5. Format output
45
+ const lines = [
46
+ `## Model Recommendation: **${recommendation.model}**`,
47
+ '',
48
+ `**Confidence:** ${(recommendation.confidence * 100).toFixed(0)}%`,
49
+ `**Estimated cost:** $${recommendation.costEstimate.estimatedUSD.toFixed(4)} (${String(recommendation.costEstimate.estimatedTokens)} tokens)`,
50
+ '',
51
+ '### Reasoning',
52
+ ...recommendation.reasoning.map((r) => `- ${r}`),
53
+ ];
54
+ if (recommendation.alternatives.length > 0) {
55
+ lines.push('', '### Alternatives');
56
+ for (const alt of recommendation.alternatives) {
57
+ lines.push(`- **${alt.model}** (${(alt.confidence * 100).toFixed(0)}% confidence) — $${alt.costEstimate.estimatedUSD.toFixed(4)}`);
58
+ }
59
+ }
60
+ lines.push('', '### Complexity Signals', `- Criteria: ${String(signals.criteriaCount)}`, `- Files: ${String(signals.fileCount)}`, `- Cross-layer: ${String(signals.crossLayerCount)}`, `- Task type: ${signals.taskType}`, `- Overall score: ${signals.overallScore.toFixed(2)}`);
61
+ return {
62
+ content: [{ type: 'text', text: lines.join('\n') }],
63
+ };
64
+ }
65
+ //# sourceMappingURL=recommend-model-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend-model-handler.js","sourceRoot":"","sources":["../../src/tools/recommend-model-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerModelTools(server: McpServer): void;
3
+ //# sourceMappingURL=register-model-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-model-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-model-tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoD1D"}
@@ -0,0 +1,50 @@
1
+ // tools/register-model-tools.ts — Registers the recommend_model MCP tool.
2
+ // SPEC-076
3
+ import { z } from 'zod';
4
+ import { handleRecommendModel } from './recommend-model-handler.js';
5
+ import { safeLicensed } from './safe-handler.js';
6
+ export function registerModelTools(server) {
7
+ server.registerTool('recommend_model', {
8
+ description: 'Recommend the best AI model tier (haiku, sonnet, or opus) for a given task or spec. ' +
9
+ 'Analyzes complexity signals, applies configurable rules, learns from past outcomes, ' +
10
+ 'and estimates token cost in USD. Returns a recommendation with reasoning and alternatives.',
11
+ inputSchema: {
12
+ specId: z
13
+ .string()
14
+ .optional()
15
+ .describe('Optional spec ID to analyse (e.g., "SPEC-076"). ' +
16
+ 'The router will extract complexity signals from the spec content.'),
17
+ taskDescription: z
18
+ .string()
19
+ .optional()
20
+ .describe('Optional natural-language description of the task. ' +
21
+ 'Used to infer complexity signals when no specId is provided.'),
22
+ signals: z
23
+ .object({
24
+ criteriaCount: z.number().optional().describe('Number of acceptance criteria.'),
25
+ fileCount: z.number().optional().describe('Number of files to create or modify.'),
26
+ dependencyDepth: z.number().optional().describe('Depth of dependency chain.'),
27
+ crossLayerCount: z
28
+ .number()
29
+ .optional()
30
+ .describe('Number of architectural layers involved.'),
31
+ hasNewTypes: z.boolean().optional().describe('Whether new types are introduced.'),
32
+ hasDBChanges: z.boolean().optional().describe('Whether database changes are needed.'),
33
+ hasSecurityImplications: z
34
+ .boolean()
35
+ .optional()
36
+ .describe('Whether the task has security implications.'),
37
+ estimatedHours: z.number().optional().describe('Estimated hours to complete.'),
38
+ isReadOnly: z.boolean().optional().describe('Whether the task is read-only.'),
39
+ taskType: z
40
+ .enum(['search', 'generation', 'architecture', 'debugging', 'refactor'])
41
+ .optional()
42
+ .describe('Type of task: search | generation | architecture | debugging | refactor'),
43
+ })
44
+ .optional()
45
+ .describe('Optional explicit complexity signals. Overrides signals extracted from text.'),
46
+ },
47
+ annotations: { title: 'Recommend Model', readOnlyHint: true },
48
+ }, safeLicensed('recommend_model', (args) => Promise.resolve(handleRecommendModel(args))));
49
+ }
50
+ //# sourceMappingURL=register-model-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-model-tools.js","sourceRoot":"","sources":["../../src/tools/register-model-tools.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,WAAW;AAGX,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EACT,sFAAsF;YACtF,sFAAsF;YACtF,4FAA4F;QAC9F,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,kDAAkD;gBAChD,mEAAmE,CACtE;YACH,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,qDAAqD;gBACnD,8DAA8D,CACjE;YACH,OAAO,EAAE,CAAC;iBACP,MAAM,CAAC;gBACN,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;gBAC/E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;gBACjF,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;gBAC7E,eAAe,EAAE,CAAC;qBACf,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,0CAA0C,CAAC;gBACvD,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;gBACjF,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;gBACrF,uBAAuB,EAAE,CAAC;qBACvB,OAAO,EAAE;qBACT,QAAQ,EAAE;qBACV,QAAQ,CAAC,6CAA6C,CAAC;gBAC1D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;gBAC9E,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;gBAC7E,QAAQ,EAAE,CAAC;qBACR,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;qBACvE,QAAQ,EAAE;qBACV,QAAQ,CAAC,yEAAyE,CAAC;aACvF,CAAC;iBACD,QAAQ,EAAE;iBACV,QAAQ,CAAC,8EAA8E,CAAC;SAC5F;QACD,WAAW,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,IAAI,EAAE;KAC9D,EACD,YAAY,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CACvF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Registers the semantic_search tool (SPEC-075) on the MCP server.
4
+ * Pro tier: semantic search across project knowledge.
5
+ */
6
+ export declare function registerSearchTools(server: McpServer): void;
7
+ //# sourceMappingURL=register-search-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-search-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-search-tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4B3D"}
@@ -0,0 +1,34 @@
1
+ // tools/register-search-tools.ts — Registers the semantic_search tool on the MCP server.
2
+ // SPEC-075 AC-07: TF-IDF + vector search across specs, patterns, knowledge, decisions.
3
+ import { z } from 'zod';
4
+ import { safeLicensed } from './safe-handler.js';
5
+ import { handleSemanticSearch } from './semantic-search-handler.js';
6
+ /**
7
+ * Registers the semantic_search tool (SPEC-075) on the MCP server.
8
+ * Pro tier: semantic search across project knowledge.
9
+ */
10
+ export function registerSearchTools(server) {
11
+ server.registerTool('semantic_search', {
12
+ description: 'Search your project knowledge (specs, patterns, decisions, learned knowledge) by meaning — ' +
13
+ 'not just by exact text. Uses TF-IDF embeddings to find semantically similar documents. ' +
14
+ 'Requires init_project first.',
15
+ inputSchema: {
16
+ projectId: z.string().describe('Project ID returned by init_project'),
17
+ query: z.string().describe('Natural language search query'),
18
+ scope: z
19
+ .enum(['spec', 'pattern', 'knowledge', 'decision', 'all'])
20
+ .default('all')
21
+ .describe('Scope: spec | pattern | knowledge | decision | all'),
22
+ topK: z.number().default(5).describe('Maximum results to return (default 5)'),
23
+ threshold: z
24
+ .number()
25
+ .default(0.3)
26
+ .describe('Minimum similarity threshold 0-1 (default 0.3)'),
27
+ },
28
+ annotations: {
29
+ title: 'Semantic Search',
30
+ readOnlyHint: true,
31
+ },
32
+ }, safeLicensed('semantic_search', async (args) => handleSemanticSearch(args)));
33
+ }
34
+ //# sourceMappingURL=register-search-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-search-tools.js","sourceRoot":"","sources":["../../src/tools/register-search-tools.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,uFAAuF;AAGvF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EACT,6FAA6F;YAC7F,yFAAyF;YACzF,8BAA8B;QAChC,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC3D,KAAK,EAAE,CAAC;iBACL,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;iBACzD,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,oDAAoD,CAAC;YACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YAC7E,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,OAAO,CAAC,GAAG,CAAC;iBACZ,QAAQ,CAAC,gDAAgD,CAAC;SAC9D;QACD,WAAW,EAAE;YACX,KAAK,EAAE,iBAAiB;YACxB,YAAY,EAAE,IAAI;SACnB;KACF,EACD,YAAY,CAAC,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTransformTools(server: McpServer): void;
3
+ //# sourceMappingURL=register-transform-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-transform-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-transform-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgC9D"}
@@ -0,0 +1,29 @@
1
+ // tools/register-transform-tools.ts — Registers SPEC-077 transform_code MCP tool (AC-09).
2
+ import { z } from 'zod';
3
+ import { safeLicensed } from './safe-handler.js';
4
+ import { handleTransformCode } from './transform-code-handler.js';
5
+ export function registerTransformTools(server) {
6
+ server.registerTool('transform_code', {
7
+ description: 'Apply deterministic code transformations using the TypeScript Compiler API. ' +
8
+ 'Supports: rename-symbol, add-types, add-error-handling, modernize-syntax, extract-interface, add-jsdoc. ' +
9
+ 'Returns the transformed source code with a list of changes made.',
10
+ inputSchema: {
11
+ source: z.string().describe('The source code to transform'),
12
+ intent: z
13
+ .string()
14
+ .describe('Transform intent: rename-symbol | add-types | add-error-handling | modernize-syntax | extract-interface | add-jsdoc'),
15
+ options: z
16
+ .record(z.string(), z.unknown())
17
+ .optional()
18
+ .describe('Intent-specific options. rename-symbol: {oldName, newName}. add-types: {inferFromUsage}. ' +
19
+ 'add-error-handling: {style: "rethrow"|"return-null"|"log-and-rethrow"}. ' +
20
+ 'modernize-syntax: {varToConst, requireToImport, moduleExportsToExport, templateLiterals}. ' +
21
+ 'extract-interface: {className, interfaceName}. add-jsdoc: {includeParams, includeReturns, includeThrows}.'),
22
+ },
23
+ annotations: {
24
+ title: 'Transform Code',
25
+ readOnlyHint: true,
26
+ },
27
+ }, safeLicensed('transform_code', (args) => Promise.resolve(handleTransformCode(args))));
28
+ }
29
+ //# sourceMappingURL=register-transform-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-transform-tools.js","sourceRoot":"","sources":["../../src/tools/register-transform-tools.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAG1F,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,8EAA8E;YAC9E,0GAA0G;YAC1G,kEAAkE;QACpE,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YAC3D,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CACP,qHAAqH,CACtH;YACH,OAAO,EAAE,CAAC;iBACP,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC/B,QAAQ,EAAE;iBACV,QAAQ,CACP,2FAA2F;gBACzF,0EAA0E;gBAC1E,4FAA4F;gBAC5F,2GAA2G,CAC9G;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,gBAAgB;YACvB,YAAY,EAAE,IAAI;SACnB;KACF,EACD,YAAY,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CACrF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ToolResult, SemanticSearchArgs } from '../types/index.js';
2
+ /**
3
+ * Handle a semantic_search request.
4
+ * Embeds the query with TF-IDF, then searches the vector backend.
5
+ */
6
+ export declare function handleSemanticSearch(args: SemanticSearchArgs): Promise<ToolResult>;
7
+ //# sourceMappingURL=semantic-search-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-search-handler.d.ts","sourceRoot":"","sources":["../../src/tools/semantic-search-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAmB,MAAM,mBAAmB,CAAC;AAIzF;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAyExF"}