@houtini/lm 1.0.13 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/dist/index.d.ts +5 -3
  2. package/dist/index.js +142 -213
  3. package/dist/index.js.map +1 -1
  4. package/package.json +10 -33
  5. package/CHANGELOG.md +0 -282
  6. package/dist/cache/analysis-cache.d.ts +0 -33
  7. package/dist/cache/analysis-cache.d.ts.map +0 -1
  8. package/dist/cache/analysis-cache.js +0 -56
  9. package/dist/cache/analysis-cache.js.map +0 -1
  10. package/dist/cache/cache-manager.d.ts +0 -29
  11. package/dist/cache/cache-manager.d.ts.map +0 -1
  12. package/dist/cache/cache-manager.js +0 -85
  13. package/dist/cache/cache-manager.js.map +0 -1
  14. package/dist/cache/index.d.ts +0 -16
  15. package/dist/cache/index.d.ts.map +0 -1
  16. package/dist/cache/index.js +0 -17
  17. package/dist/cache/index.js.map +0 -1
  18. package/dist/cache/prompt-cache.d.ts +0 -33
  19. package/dist/cache/prompt-cache.d.ts.map +0 -1
  20. package/dist/cache/prompt-cache.js +0 -61
  21. package/dist/cache/prompt-cache.js.map +0 -1
  22. package/dist/config.d.ts +0 -41
  23. package/dist/config.d.ts.map +0 -1
  24. package/dist/config.js +0 -71
  25. package/dist/config.js.map +0 -1
  26. package/dist/core/ThreeStagePromptManager.d.ts +0 -23
  27. package/dist/core/ThreeStagePromptManager.d.ts.map +0 -1
  28. package/dist/core/ThreeStagePromptManager.js +0 -118
  29. package/dist/core/ThreeStagePromptManager.js.map +0 -1
  30. package/dist/index.d.ts.map +0 -1
  31. package/dist/plugins/base-plugin.d.ts +0 -55
  32. package/dist/plugins/base-plugin.d.ts.map +0 -1
  33. package/dist/plugins/base-plugin.js +0 -120
  34. package/dist/plugins/base-plugin.js.map +0 -1
  35. package/dist/plugins/index.d.ts +0 -58
  36. package/dist/plugins/index.d.ts.map +0 -1
  37. package/dist/plugins/index.js +0 -162
  38. package/dist/plugins/index.js.map +0 -1
  39. package/dist/plugins/types.d.ts +0 -5
  40. package/dist/plugins/types.d.ts.map +0 -1
  41. package/dist/plugins/types.js +0 -5
  42. package/dist/plugins/types.js.map +0 -1
  43. package/dist/prompts/analyze/code-quality.d.ts +0 -116
  44. package/dist/prompts/analyze/code-quality.d.ts.map +0 -1
  45. package/dist/prompts/analyze/code-quality.js +0 -437
  46. package/dist/prompts/analyze/code-quality.js.map +0 -1
  47. package/dist/prompts/analyze/compare-integration.d.ts +0 -130
  48. package/dist/prompts/analyze/compare-integration.d.ts.map +0 -1
  49. package/dist/prompts/analyze/compare-integration.js +0 -547
  50. package/dist/prompts/analyze/compare-integration.js.map +0 -1
  51. package/dist/prompts/analyze/count-files.d.ts +0 -109
  52. package/dist/prompts/analyze/count-files.d.ts.map +0 -1
  53. package/dist/prompts/analyze/count-files.js +0 -403
  54. package/dist/prompts/analyze/count-files.js.map +0 -1
  55. package/dist/prompts/analyze/database-queries.d.ts +0 -156
  56. package/dist/prompts/analyze/database-queries.d.ts.map +0 -1
  57. package/dist/prompts/analyze/database-queries.js +0 -763
  58. package/dist/prompts/analyze/database-queries.js.map +0 -1
  59. package/dist/prompts/analyze/dependencies.d.ts +0 -97
  60. package/dist/prompts/analyze/dependencies.d.ts.map +0 -1
  61. package/dist/prompts/analyze/dependencies.js +0 -337
  62. package/dist/prompts/analyze/dependencies.js.map +0 -1
  63. package/dist/prompts/analyze/diff-signatures.d.ts +0 -139
  64. package/dist/prompts/analyze/diff-signatures.d.ts.map +0 -1
  65. package/dist/prompts/analyze/diff-signatures.js +0 -708
  66. package/dist/prompts/analyze/diff-signatures.js.map +0 -1
  67. package/dist/prompts/analyze/find-patterns.d.ts +0 -128
  68. package/dist/prompts/analyze/find-patterns.d.ts.map +0 -1
  69. package/dist/prompts/analyze/find-patterns.js +0 -524
  70. package/dist/prompts/analyze/find-patterns.js.map +0 -1
  71. package/dist/prompts/analyze/find-unused-css.d.ts +0 -151
  72. package/dist/prompts/analyze/find-unused-css.d.ts.map +0 -1
  73. package/dist/prompts/analyze/find-unused-css.js +0 -760
  74. package/dist/prompts/analyze/find-unused-css.js.map +0 -1
  75. package/dist/prompts/analyze/n8n-workflow.d.ts +0 -137
  76. package/dist/prompts/analyze/n8n-workflow.d.ts.map +0 -1
  77. package/dist/prompts/analyze/n8n-workflow.js +0 -533
  78. package/dist/prompts/analyze/n8n-workflow.js.map +0 -1
  79. package/dist/prompts/analyze/project-structure.d.ts +0 -126
  80. package/dist/prompts/analyze/project-structure.d.ts.map +0 -1
  81. package/dist/prompts/analyze/project-structure.js +0 -573
  82. package/dist/prompts/analyze/project-structure.js.map +0 -1
  83. package/dist/prompts/analyze/security-audit.d.ts +0 -142
  84. package/dist/prompts/analyze/security-audit.d.ts.map +0 -1
  85. package/dist/prompts/analyze/security-audit.js +0 -641
  86. package/dist/prompts/analyze/security-audit.js.map +0 -1
  87. package/dist/prompts/analyze/single-file.d.ts +0 -162
  88. package/dist/prompts/analyze/single-file.d.ts.map +0 -1
  89. package/dist/prompts/analyze/single-file.js +0 -669
  90. package/dist/prompts/analyze/single-file.js.map +0 -1
  91. package/dist/prompts/analyze/trace-execution.d.ts +0 -126
  92. package/dist/prompts/analyze/trace-execution.d.ts.map +0 -1
  93. package/dist/prompts/analyze/trace-execution.js +0 -613
  94. package/dist/prompts/analyze/trace-execution.js.map +0 -1
  95. package/dist/prompts/analyze/wordpress-plugin-audit.d.ts +0 -116
  96. package/dist/prompts/analyze/wordpress-plugin-audit.d.ts.map +0 -1
  97. package/dist/prompts/analyze/wordpress-plugin-audit.js +0 -456
  98. package/dist/prompts/analyze/wordpress-plugin-audit.js.map +0 -1
  99. package/dist/prompts/analyze/wordpress-plugin-readiness.d.ts +0 -103
  100. package/dist/prompts/analyze/wordpress-plugin-readiness.d.ts.map +0 -1
  101. package/dist/prompts/analyze/wordpress-plugin-readiness.js +0 -506
  102. package/dist/prompts/analyze/wordpress-plugin-readiness.js.map +0 -1
  103. package/dist/prompts/analyze/wordpress-security.d.ts +0 -146
  104. package/dist/prompts/analyze/wordpress-security.d.ts.map +0 -1
  105. package/dist/prompts/analyze/wordpress-security.js +0 -702
  106. package/dist/prompts/analyze/wordpress-security.js.map +0 -1
  107. package/dist/prompts/analyze/wordpress-theme-audit.d.ts +0 -114
  108. package/dist/prompts/analyze/wordpress-theme-audit.d.ts.map +0 -1
  109. package/dist/prompts/analyze/wordpress-theme-audit.js +0 -540
  110. package/dist/prompts/analyze/wordpress-theme-audit.js.map +0 -1
  111. package/dist/prompts/custom/custom-prompt.d.ts +0 -135
  112. package/dist/prompts/custom/custom-prompt.d.ts.map +0 -1
  113. package/dist/prompts/custom/custom-prompt.js +0 -421
  114. package/dist/prompts/custom/custom-prompt.js.map +0 -1
  115. package/dist/prompts/fun/arcade-game.d.ts +0 -152
  116. package/dist/prompts/fun/arcade-game.d.ts.map +0 -1
  117. package/dist/prompts/fun/arcade-game.js +0 -657
  118. package/dist/prompts/fun/arcade-game.js.map +0 -1
  119. package/dist/prompts/fun/create_text_adventure.d.ts +0 -100
  120. package/dist/prompts/fun/create_text_adventure.d.ts.map +0 -1
  121. package/dist/prompts/fun/create_text_adventure.js +0 -401
  122. package/dist/prompts/fun/create_text_adventure.js.map +0 -1
  123. package/dist/prompts/fun/css-art-generator.d.ts +0 -168
  124. package/dist/prompts/fun/css-art-generator.d.ts.map +0 -1
  125. package/dist/prompts/fun/css-art-generator.js +0 -831
  126. package/dist/prompts/fun/css-art-generator.js.map +0 -1
  127. package/dist/prompts/generate/project-documentation.d.ts +0 -137
  128. package/dist/prompts/generate/project-documentation.d.ts.map +0 -1
  129. package/dist/prompts/generate/project-documentation.js +0 -670
  130. package/dist/prompts/generate/project-documentation.js.map +0 -1
  131. package/dist/prompts/generate/refactoring.d.ts +0 -164
  132. package/dist/prompts/generate/refactoring.d.ts.map +0 -1
  133. package/dist/prompts/generate/refactoring.js +0 -625
  134. package/dist/prompts/generate/refactoring.js.map +0 -1
  135. package/dist/prompts/generate/responsive-component.d.ts +0 -147
  136. package/dist/prompts/generate/responsive-component.d.ts.map +0 -1
  137. package/dist/prompts/generate/responsive-component.js +0 -957
  138. package/dist/prompts/generate/responsive-component.js.map +0 -1
  139. package/dist/prompts/generate/typescript-conversion.d.ts +0 -144
  140. package/dist/prompts/generate/typescript-conversion.d.ts.map +0 -1
  141. package/dist/prompts/generate/typescript-conversion.js +0 -531
  142. package/dist/prompts/generate/typescript-conversion.js.map +0 -1
  143. package/dist/prompts/generate/unit-tests.d.ts +0 -139
  144. package/dist/prompts/generate/unit-tests.d.ts.map +0 -1
  145. package/dist/prompts/generate/unit-tests.js +0 -582
  146. package/dist/prompts/generate/unit-tests.js.map +0 -1
  147. package/dist/prompts/generate/wordpress-plugin.d.ts +0 -179
  148. package/dist/prompts/generate/wordpress-plugin.d.ts.map +0 -1
  149. package/dist/prompts/generate/wordpress-plugin.js +0 -767
  150. package/dist/prompts/generate/wordpress-plugin.js.map +0 -1
  151. package/dist/prompts/generate/wordpress-theme-from-static.d.ts +0 -177
  152. package/dist/prompts/generate/wordpress-theme-from-static.d.ts.map +0 -1
  153. package/dist/prompts/generate/wordpress-theme-from-static.js +0 -699
  154. package/dist/prompts/generate/wordpress-theme-from-static.js.map +0 -1
  155. package/dist/prompts/shared/cache-manager.d.ts +0 -45
  156. package/dist/prompts/shared/cache-manager.d.ts.map +0 -1
  157. package/dist/prompts/shared/cache-manager.js +0 -129
  158. package/dist/prompts/shared/cache-manager.js.map +0 -1
  159. package/dist/prompts/shared/helpers.d.ts +0 -39
  160. package/dist/prompts/shared/helpers.d.ts.map +0 -1
  161. package/dist/prompts/shared/helpers.js +0 -151
  162. package/dist/prompts/shared/helpers.js.map +0 -1
  163. package/dist/prompts/shared/templates.d.ts +0 -35
  164. package/dist/prompts/shared/templates.d.ts.map +0 -1
  165. package/dist/prompts/shared/templates.js +0 -77
  166. package/dist/prompts/shared/templates.js.map +0 -1
  167. package/dist/prompts/shared/types.d.ts +0 -112
  168. package/dist/prompts/shared/types.d.ts.map +0 -1
  169. package/dist/prompts/shared/types.js +0 -5
  170. package/dist/prompts/shared/types.js.map +0 -1
  171. package/dist/prompts/system/find-unused-files.d.ts +0 -106
  172. package/dist/prompts/system/find-unused-files.d.ts.map +0 -1
  173. package/dist/prompts/system/find-unused-files.js +0 -357
  174. package/dist/prompts/system/find-unused-files.js.map +0 -1
  175. package/dist/security/index.d.ts +0 -39
  176. package/dist/security/index.d.ts.map +0 -1
  177. package/dist/security/index.js +0 -46
  178. package/dist/security/index.js.map +0 -1
  179. package/dist/security/integration-helpers.d.ts +0 -121
  180. package/dist/security/integration-helpers.d.ts.map +0 -1
  181. package/dist/security/integration-helpers.js +0 -190
  182. package/dist/security/integration-helpers.js.map +0 -1
  183. package/dist/security/output-encoder.d.ts +0 -94
  184. package/dist/security/output-encoder.d.ts.map +0 -1
  185. package/dist/security/output-encoder.js +0 -295
  186. package/dist/security/output-encoder.js.map +0 -1
  187. package/dist/security/prompt-injection-guard.d.ts +0 -59
  188. package/dist/security/prompt-injection-guard.d.ts.map +0 -1
  189. package/dist/security/prompt-injection-guard.js +0 -249
  190. package/dist/security/prompt-injection-guard.js.map +0 -1
  191. package/dist/security/sanitisation.d.ts +0 -67
  192. package/dist/security/sanitisation.d.ts.map +0 -1
  193. package/dist/security/sanitisation.js +0 -398
  194. package/dist/security/sanitisation.js.map +0 -1
  195. package/dist/security/security-service.d.ts +0 -103
  196. package/dist/security/security-service.d.ts.map +0 -1
  197. package/dist/security/security-service.js +0 -303
  198. package/dist/security/security-service.js.map +0 -1
  199. package/dist/security-config.d.ts +0 -45
  200. package/dist/security-config.d.ts.map +0 -1
  201. package/dist/security-config.js +0 -63
  202. package/dist/security-config.js.map +0 -1
  203. package/dist/system/function-list.d.ts +0 -61
  204. package/dist/system/function-list.d.ts.map +0 -1
  205. package/dist/system/function-list.js +0 -111
  206. package/dist/system/function-list.js.map +0 -1
  207. package/dist/system/function-registry.d.ts +0 -23
  208. package/dist/system/function-registry.d.ts.map +0 -1
  209. package/dist/system/function-registry.js +0 -136
  210. package/dist/system/function-registry.js.map +0 -1
  211. package/dist/system/health-check.d.ts +0 -33
  212. package/dist/system/health-check.d.ts.map +0 -1
  213. package/dist/system/health-check.js +0 -98
  214. package/dist/system/health-check.js.map +0 -1
  215. package/dist/system/path-resolver.d.ts +0 -55
  216. package/dist/system/path-resolver.d.ts.map +0 -1
  217. package/dist/system/path-resolver.js +0 -90
  218. package/dist/system/path-resolver.js.map +0 -1
  219. package/dist/templates/plugin-template.d.ts +0 -121
  220. package/dist/templates/plugin-template.d.ts.map +0 -1
  221. package/dist/templates/plugin-template.js +0 -454
  222. package/dist/templates/plugin-template.js.map +0 -1
  223. package/dist/types/chunking-types.d.ts +0 -88
  224. package/dist/types/chunking-types.d.ts.map +0 -1
  225. package/dist/types/chunking-types.js +0 -18
  226. package/dist/types/chunking-types.js.map +0 -1
  227. package/dist/types/prompt-stages.d.ts +0 -30
  228. package/dist/types/prompt-stages.d.ts.map +0 -1
  229. package/dist/types/prompt-stages.js +0 -6
  230. package/dist/types/prompt-stages.js.map +0 -1
  231. package/dist/types.d.ts +0 -45
  232. package/dist/types.d.ts.map +0 -1
  233. package/dist/types.js +0 -6
  234. package/dist/types.js.map +0 -1
  235. package/dist/utils/css-parser.d.ts +0 -26
  236. package/dist/utils/css-parser.d.ts.map +0 -1
  237. package/dist/utils/css-parser.js +0 -117
  238. package/dist/utils/css-parser.js.map +0 -1
  239. package/dist/utils/path-resolver.d.ts +0 -13
  240. package/dist/utils/path-resolver.d.ts.map +0 -1
  241. package/dist/utils/path-resolver.js +0 -78
  242. package/dist/utils/path-resolver.js.map +0 -1
  243. package/dist/utils/plugin-utilities.d.ts +0 -176
  244. package/dist/utils/plugin-utilities.d.ts.map +0 -1
  245. package/dist/utils/plugin-utilities.js +0 -269
  246. package/dist/utils/plugin-utilities.js.map +0 -1
  247. package/dist/utils/streamHandler.d.ts +0 -3
  248. package/dist/utils/streamHandler.d.ts.map +0 -1
  249. package/dist/utils/streamHandler.js +0 -137
  250. package/dist/utils/streamHandler.js.map +0 -1
  251. package/dist/validation/output-validator.d.ts +0 -136
  252. package/dist/validation/output-validator.d.ts.map +0 -1
  253. package/dist/validation/output-validator.js +0 -262
  254. package/dist/validation/output-validator.js.map +0 -1
  255. package/dist/validation/response-factory.d.ts +0 -44
  256. package/dist/validation/response-factory.d.ts.map +0 -1
  257. package/dist/validation/response-factory.js +0 -202
  258. package/dist/validation/response-factory.js.map +0 -1
  259. package/dist/validation/schemas.d.ts +0 -519
  260. package/dist/validation/schemas.d.ts.map +0 -1
  261. package/dist/validation/schemas.js +0 -6
  262. package/dist/validation/schemas.js.map +0 -1
@@ -1,582 +0,0 @@
1
- /**
2
- * Plugin Template - Modern v4.2 (Single Source of Truth)
3
- *
4
- * Universal template that intelligently handles both single-file and multi-file analysis
5
- * Automatically detects analysis type based on provided parameters
6
- *
7
- * Copy this template for creating any new plugin - it adapts to your needs
8
- */
9
- import { BasePlugin } from '../../plugins/base-plugin.js';
10
- import { ThreeStagePromptManager } from '../../core/ThreeStagePromptManager.js';
11
- import { withSecurity } from '../../security/integration-helpers.js';
12
- import { readFileContent } from '../shared/helpers.js';
13
- import { ModelSetup, ResponseProcessor, ParameterValidator, ErrorHandler, MultiFileAnalysis, TokenCalculator } from '../../utils/plugin-utilities.js';
14
- import { getAnalysisCache } from '../../cache/index.js';
15
- export class UnitTestGenerator extends BasePlugin {
16
- constructor() {
17
- super();
18
- this.name = 'generate_unit_tests';
19
- this.category = 'generate';
20
- this.description = 'Generate comprehensive unit tests for code with framework-specific patterns and complete coverage strategies';
21
- // Universal parameter set - supports both single and multi-file scenarios
22
- this.parameters = {
23
- // Single-file parameters
24
- code: {
25
- type: 'string',
26
- description: 'The code to generate tests for (for single-file analysis)',
27
- required: false
28
- },
29
- filePath: {
30
- type: 'string',
31
- description: 'Path to single file to generate tests for',
32
- required: false
33
- },
34
- // Multi-file parameters
35
- projectPath: {
36
- type: 'string',
37
- description: 'Path to project root (for multi-file test generation)',
38
- required: false
39
- },
40
- files: {
41
- type: 'array',
42
- description: 'Array of specific file paths (for multi-file test generation)',
43
- required: false,
44
- items: { type: 'string' }
45
- },
46
- maxDepth: {
47
- type: 'number',
48
- description: 'Maximum directory depth for multi-file discovery (1-5)',
49
- required: false,
50
- default: 3
51
- },
52
- // Universal parameters
53
- language: {
54
- type: 'string',
55
- description: 'Programming language',
56
- required: false,
57
- default: 'javascript'
58
- },
59
- testFramework: {
60
- type: 'string',
61
- description: 'Testing framework to use (jest, mocha, pytest, phpunit, etc.)',
62
- required: false,
63
- default: 'jest'
64
- },
65
- coverageTarget: {
66
- type: 'string',
67
- description: 'Test coverage target level',
68
- enum: ['basic', 'comprehensive', 'edge-cases'],
69
- default: 'comprehensive',
70
- required: false
71
- },
72
- context: {
73
- type: 'object',
74
- description: 'Optional context for framework-specific testing patterns',
75
- required: false,
76
- properties: {
77
- projectType: {
78
- type: 'string',
79
- enum: ['wordpress-plugin', 'wordpress-theme', 'react-app', 'react-component', 'node-api', 'browser-extension', 'cli-tool', 'n8n-node', 'n8n-workflow', 'generic'],
80
- description: 'Project type for appropriate test patterns'
81
- },
82
- testStyle: {
83
- type: 'string',
84
- enum: ['bdd', 'tdd', 'aaa', 'given-when-then'],
85
- description: 'Testing style preference'
86
- },
87
- mockStrategy: {
88
- type: 'string',
89
- enum: ['minimal', 'comprehensive', 'integration-preferred'],
90
- description: 'Mocking approach',
91
- default: 'minimal'
92
- }
93
- }
94
- }
95
- };
96
- this.analysisCache = getAnalysisCache();
97
- this.multiFileAnalysis = new MultiFileAnalysis();
98
- // Cache and analysis utilities are initialized above
99
- }
100
- async execute(params, llmClient) {
101
- return await withSecurity(this, params, llmClient, async (secureParams) => {
102
- try {
103
- // 1. Auto-detect analysis mode based on parameters
104
- const analysisMode = this.detectAnalysisMode(secureParams);
105
- // 2. Validate parameters based on detected mode
106
- this.validateParameters(secureParams, analysisMode);
107
- // 3. Setup model
108
- const { model, contextLength } = await ModelSetup.getReadyModel(llmClient);
109
- // 4. Route to appropriate analysis method
110
- if (analysisMode === 'single-file') {
111
- return await this.executeSingleFileAnalysis(secureParams, model, contextLength);
112
- }
113
- else {
114
- return await this.executeMultiFileAnalysis(secureParams, model, contextLength);
115
- }
116
- }
117
- catch (error) {
118
- return ErrorHandler.createExecutionError('generate_unit_tests', error);
119
- }
120
- });
121
- }
122
- /**
123
- * Auto-detect whether this is single-file or multi-file analysis
124
- */
125
- detectAnalysisMode(params) {
126
- // Single-file indicators take priority (avoids default parameter issues)
127
- if (params.code || params.filePath) {
128
- return 'single-file';
129
- }
130
- // Multi-file indicators
131
- if (params.projectPath || params.files) {
132
- return 'multi-file';
133
- }
134
- // Default to single-file for test generation
135
- return 'single-file';
136
- }
137
- /**
138
- * Validate parameters based on detected analysis mode
139
- */
140
- validateParameters(params, mode) {
141
- if (mode === 'single-file') {
142
- ParameterValidator.validateCodeOrFile(params);
143
- }
144
- else {
145
- ParameterValidator.validateProjectPath(params);
146
- ParameterValidator.validateDepth(params);
147
- }
148
- // Universal validations
149
- ParameterValidator.validateEnum(params, 'coverageTarget', ['basic', 'comprehensive', 'edge-cases']);
150
- ParameterValidator.validateEnum(params, 'testFramework', ['jest', 'mocha', 'pytest', 'phpunit', 'vitest', 'jasmine']);
151
- }
152
- /**
153
- * Execute single-file analysis
154
- */
155
- async executeSingleFileAnalysis(params, model, contextLength) {
156
- // Process single file input
157
- let codeToAnalyze = params.code;
158
- if (params.filePath) {
159
- codeToAnalyze = await readFileContent(params.filePath);
160
- }
161
- // Generate prompt stages for single file
162
- const promptStages = this.getSingleFilePromptStages({
163
- ...params,
164
- code: codeToAnalyze
165
- });
166
- // Execute with appropriate method
167
- const promptManager = new ThreeStagePromptManager();
168
- const needsChunking = TokenCalculator.needsChunking(promptStages, contextLength);
169
- if (needsChunking) {
170
- const chunkSize = TokenCalculator.calculateOptimalChunkSize(promptStages, contextLength);
171
- const dataChunks = promptManager.chunkDataPayload(promptStages.dataPayload, chunkSize);
172
- const conversation = promptManager.createChunkedConversation(promptStages, dataChunks);
173
- const messages = [
174
- conversation.systemMessage,
175
- ...conversation.dataMessages,
176
- conversation.analysisMessage
177
- ];
178
- return await ResponseProcessor.executeChunked(messages, model, contextLength, 'generate_unit_tests', 'single');
179
- }
180
- else {
181
- return await ResponseProcessor.executeDirect(promptStages, model, contextLength, 'generate_unit_tests');
182
- }
183
- }
184
- /**
185
- * Execute multi-file analysis
186
- */
187
- async executeMultiFileAnalysis(params, model, contextLength) {
188
- // Discover files
189
- let filesToAnalyze = params.files ||
190
- await this.discoverRelevantFiles(params.projectPath, params.maxDepth, params.language);
191
- // Perform multi-file analysis with caching
192
- const analysisResult = await this.performMultiFileAnalysis(filesToAnalyze, params, model, contextLength);
193
- // Generate prompt stages for multi-file
194
- const promptStages = this.getMultiFilePromptStages({
195
- ...params,
196
- analysisResult,
197
- fileCount: filesToAnalyze.length
198
- });
199
- // Always use chunking for multi-file
200
- const promptManager = new ThreeStagePromptManager();
201
- const chunkSize = TokenCalculator.calculateOptimalChunkSize(promptStages, contextLength);
202
- const dataChunks = promptManager.chunkDataPayload(promptStages.dataPayload, chunkSize);
203
- const conversation = promptManager.createChunkedConversation(promptStages, dataChunks);
204
- const messages = [
205
- conversation.systemMessage,
206
- ...conversation.dataMessages,
207
- conversation.analysisMessage
208
- ];
209
- return await ResponseProcessor.executeChunked(messages, model, contextLength, 'generate_unit_tests', 'multifile');
210
- }
211
- /**
212
- * Implement single-file prompt stages for test generation
213
- */
214
- getSingleFilePromptStages(params) {
215
- const { code, language, testFramework, coverageTarget, context = {} } = params;
216
- const projectType = context.projectType || 'generic';
217
- const testStyle = context.testStyle || 'bdd';
218
- const mockStrategy = context.mockStrategy || 'minimal';
219
- const systemAndContext = `You are an expert test engineer and quality assurance specialist with 15+ years of experience in ${testFramework} testing and ${language} development.
220
-
221
- **YOUR EXPERTISE:**
222
- - Advanced ${testFramework} patterns and best practices
223
- - ${language} testing ecosystem and frameworks
224
- - Test-driven development (TDD) and behavior-driven development (BDD)
225
- - Mock strategies, fixtures, and test data management
226
- - Performance testing and security testing methodologies
227
- - CI/CD integration and test automation workflows
228
-
229
- **TESTING CONTEXT:**
230
- - Framework: ${testFramework}
231
- - Language: ${language}
232
- - Coverage Target: ${this.getCoveragePercent(coverageTarget)}%
233
- - Project Type: ${projectType}
234
- - Test Style: ${testStyle}
235
- - Mock Strategy: ${mockStrategy}
236
- - Mode: Single File Test Generation
237
-
238
- **YOUR MISSION:**
239
- Generate comprehensive, production-ready unit tests that serve as both documentation and quality assurance. Your tests should be so thorough and well-written that they become the definitive specification of how the code should behave.
240
-
241
- **QUALITY STANDARDS:**
242
- - Tests must be maintainable, readable, and serve as living documentation
243
- - Each test should have a single, clear responsibility
244
- - Test names should read like specifications in plain English
245
- - Setup and teardown should be clean and predictable
246
- - Mocks should be realistic and properly isolated
247
- - Error scenarios should be as thoroughly tested as success cases`;
248
- const dataPayload = `Code requiring comprehensive test coverage:
249
-
250
- \`\`\`${language}
251
- ${code}
252
- \`\`\``;
253
- const outputInstructions = `Generate a complete, production-ready test suite that includes:
254
-
255
- ## 🎯 REQUIRED TEST CATEGORIES
256
-
257
- ### 1. Happy Path Tests (Core Functionality)
258
- - Standard successful operations with valid inputs
259
- - Expected return values and side effects
260
- - Normal flow execution paths
261
-
262
- ### 2. Edge Cases & Boundary Conditions
263
- - Empty inputs, null/undefined values
264
- - Minimum and maximum valid values
265
- - Zero-length arrays, empty strings, edge numbers
266
- - Large datasets and performance boundaries
267
-
268
- ### 3. Error Handling & Validation
269
- - Invalid input types and formats
270
- - Out-of-range values and malformed data
271
- - Network failures, timeouts, and external service errors
272
- - Permission denied and authentication failures
273
- - Proper error types and meaningful error messages
274
-
275
- ### 4. ${projectType === 'generic' ? 'Security Validation' : this.getProjectSpecificTests(projectType)}
276
- ${this.getSecurityTestsForProject(projectType)}
277
-
278
- ### 5. Integration Points & Dependencies
279
- - External API calls and responses
280
- - Database operations and transactions
281
- - File system operations
282
- - Environment variable dependencies
283
- - Third-party library interactions
284
-
285
- ## 🏗️ TEST STRUCTURE REQUIREMENTS
286
-
287
- ### Framework: ${testFramework}
288
- ${this.getFrameworkGuidelines(testFramework)}
289
-
290
- ### Test Organization:
291
- - Group related tests using describe/context blocks
292
- - Use descriptive test names following ${testStyle} style: ${this.getTestNamingPattern(testStyle)}
293
- - Include proper setup (beforeEach/beforeAll) and cleanup (afterEach/afterAll)
294
- - Organize tests from most common to least common scenarios
295
-
296
- ### Mocking Strategy: ${mockStrategy}
297
- ${this.getMockingGuidelines(mockStrategy, testFramework)}
298
-
299
- ## 📋 DELIVERABLE REQUIREMENTS
300
-
301
- Provide a complete test file that includes:
302
- - All necessary imports and dependencies
303
- - Proper test suite structure with clear organization
304
- - Comprehensive coverage of all identified functions/methods
305
- - Realistic test data and fixtures
306
- - Proper assertions with meaningful failure messages
307
- - Performance considerations where relevant
308
- - Accessibility testing (if UI components)
309
- - Documentation comments for complex test scenarios
310
-
311
- **Coverage Target**: Achieve ${this.getCoveragePercent(coverageTarget)}% coverage with meaningful tests, not just line coverage.
312
-
313
- **Test Quality**: Each test should be independently runnable, deterministic, and provide clear diagnostics on failure.`;
314
- return { systemAndContext, dataPayload, outputInstructions };
315
- }
316
- /**
317
- * Implement multi-file prompt stages for project-wide test generation
318
- */
319
- getMultiFilePromptStages(params) {
320
- const { analysisResult, testFramework, coverageTarget, fileCount, context = {} } = params;
321
- const projectType = context.projectType || 'generic';
322
- const systemAndContext = `You are a senior test architect with expertise in large-scale test suite design and ${testFramework} testing frameworks.
323
-
324
- **YOUR EXPERTISE:**
325
- - Multi-file test suite architecture and organization
326
- - Test strategy design for complex applications
327
- - Integration testing across components
328
- - Test data management and shared fixtures
329
- - Performance testing at scale
330
- - Continuous integration and test automation
331
-
332
- **PROJECT CONTEXT:**
333
- - Framework: ${testFramework}
334
- - Files Analyzed: ${fileCount}
335
- - Coverage Target: ${this.getCoveragePercent(coverageTarget)}%
336
- - Project Type: ${projectType}
337
- - Mode: Multi-File Test Generation
338
-
339
- **YOUR MISSION:**
340
- Design and generate a comprehensive test suite architecture that covers all analyzed files while maintaining clean separation of concerns, shared utilities, and consistent testing patterns across the entire project.`;
341
- const dataPayload = `Multi-file project analysis:
342
-
343
- ${JSON.stringify(analysisResult, null, 2)}`;
344
- const outputInstructions = `Generate a comprehensive test suite architecture with:
345
-
346
- ## 🏗️ TEST SUITE ARCHITECTURE
347
-
348
- ### Test File Organization:
349
- - One test file per source file following naming conventions
350
- - Shared test utilities and fixtures in common directories
351
- - Integration test suites for cross-file functionality
352
- - Performance test suites for system-wide benchmarks
353
-
354
- ### Cross-File Testing Strategy:
355
- - **Unit Tests**: Individual file/module testing in isolation
356
- - **Integration Tests**: Inter-module communication and data flow
357
- - **System Tests**: End-to-end functionality across the entire application
358
- - **Contract Tests**: API boundaries and interface compliance
359
-
360
- ### Test Data Management:
361
- - Centralized test fixtures and mock data
362
- - Database seeding and cleanup strategies
363
- - Shared mock implementations for common dependencies
364
- - Environment-specific test configurations
365
-
366
- ### Shared Testing Utilities:
367
- - Common setup and teardown helpers
368
- - Custom matchers and assertions
369
- - Mock factories and test builders
370
- - Utility functions for data generation
371
-
372
- ## 📁 DELIVERABLES
373
-
374
- For each analyzed file, provide:
375
- 1. **Individual test file** with comprehensive coverage
376
- 2. **Integration tests** where cross-file dependencies exist
377
- 3. **Shared utilities** for common testing patterns
378
- 4. **Test configuration** for the project
379
- 5. **README documentation** explaining the test strategy
380
-
381
- ## 🎯 QUALITY STANDARDS
382
-
383
- - Maintain consistency in test style and structure across all files
384
- - Ensure tests are maintainable and don't duplicate logic unnecessarily
385
- - Create realistic integration scenarios based on actual file dependencies
386
- - Provide clear documentation for running and maintaining the test suite
387
- - Consider performance implications of the full test suite execution
388
-
389
- **Overall Coverage**: Achieve comprehensive testing across all ${fileCount} files while maintaining clean, maintainable test architecture.`;
390
- return { systemAndContext, dataPayload, outputInstructions };
391
- }
392
- /**
393
- * Implement for backwards compatibility
394
- */
395
- getPromptStages(params) {
396
- const mode = this.detectAnalysisMode(params);
397
- if (mode === 'single-file') {
398
- return this.getSingleFilePromptStages(params);
399
- }
400
- else {
401
- return this.getMultiFilePromptStages(params);
402
- }
403
- }
404
- // Helper methods for test generation
405
- async discoverRelevantFiles(projectPath, maxDepth, language) {
406
- const extensions = this.getFileExtensions(language);
407
- return await this.multiFileAnalysis.discoverFiles(projectPath, extensions, maxDepth);
408
- }
409
- async performMultiFileAnalysis(files, params, model, contextLength) {
410
- const cacheKey = this.analysisCache.generateKey('generate_unit_tests', params, files);
411
- const cached = await this.analysisCache.get(cacheKey);
412
- if (cached)
413
- return cached;
414
- const fileAnalysisResults = await this.multiFileAnalysis.analyzeBatch(files, (file) => this.analyzeIndividualFile(file, params, model), contextLength);
415
- // Aggregate results into proper analysis result format
416
- const aggregatedResult = {
417
- summary: `Test generation analysis for ${files.length} files`,
418
- findings: fileAnalysisResults,
419
- data: {
420
- fileCount: files.length,
421
- totalFunctions: fileAnalysisResults.reduce((sum, result) => sum + (result.functionCount || 0), 0),
422
- complexity: this.calculateOverallComplexity(fileAnalysisResults),
423
- dependencies: this.extractDependencies(fileAnalysisResults)
424
- }
425
- };
426
- await this.analysisCache.cacheAnalysis(cacheKey, aggregatedResult, {
427
- modelUsed: model.identifier || 'unknown',
428
- executionTime: Date.now() - Date.now(),
429
- timestamp: new Date().toISOString()
430
- });
431
- return aggregatedResult;
432
- }
433
- async analyzeIndividualFile(file, params, model) {
434
- const content = await import('fs/promises').then(fs => fs.readFile(file, 'utf-8'));
435
- return {
436
- filePath: file,
437
- size: content.length,
438
- lines: content.split('\n').length,
439
- functionCount: this.estimateFunctionCount(content, params.language),
440
- complexity: this.estimateComplexity(content),
441
- dependencies: this.extractFileDependencies(content),
442
- testable: this.isFileTestable(content, params.language)
443
- };
444
- }
445
- getFileExtensions(language) {
446
- const extensionMap = {
447
- 'javascript': ['.js', '.jsx', '.mjs'],
448
- 'typescript': ['.ts', '.tsx'],
449
- 'python': ['.py'],
450
- 'php': ['.php', '.inc', '.module'],
451
- 'java': ['.java'],
452
- 'csharp': ['.cs'],
453
- 'cpp': ['.cpp', '.cc', '.cxx', '.c++'],
454
- 'c': ['.c', '.h']
455
- };
456
- return extensionMap[language] || ['.js', '.ts', '.jsx', '.tsx', '.py', '.php', '.java', '.cs', '.cpp', '.c'];
457
- }
458
- getCoveragePercent(target) {
459
- const targets = {
460
- 'basic': 60,
461
- 'comprehensive': 80,
462
- 'edge-cases': 90
463
- };
464
- return targets[target] || 80;
465
- }
466
- getTestNamingPattern(style) {
467
- const patterns = {
468
- 'bdd': '"should [expected behavior] when [condition]"',
469
- 'given-when-then': '"Given [context], when [action], then [outcome]"',
470
- 'aaa': '"[methodName]: [scenario] - [expected result]"',
471
- 'tdd': '"test [functionality] with [input] expects [output]"'
472
- };
473
- return patterns[style] || patterns.bdd;
474
- }
475
- getProjectSpecificTests(projectType) {
476
- const tests = {
477
- 'wordpress-plugin': 'WordPress-Specific Security & Integration Tests',
478
- 'react-app': 'React Component & State Management Tests',
479
- 'node-api': 'API Endpoint & Database Integration Tests',
480
- 'browser-extension': 'Extension Permissions & Cross-Origin Tests',
481
- 'cli-tool': 'Command Line Interface & System Integration Tests',
482
- 'n8n-node': 'N8N Node Execution & Workflow Tests',
483
- 'n8n-workflow': 'Workflow Logic & Data Transformation Tests'
484
- };
485
- return tests[projectType] || 'Application-Specific Security Tests';
486
- }
487
- getSecurityTestsForProject(projectType) {
488
- const security = {
489
- 'wordpress-plugin': '- Nonce validation and CSRF protection\n- Capability checks and authorization\n- SQL injection prevention\n- XSS escaping and output sanitization\n- File upload security and path traversal prevention',
490
- 'react-app': '- XSS prevention in JSX rendering\n- Props validation and sanitization\n- State injection attacks\n- Route guard authentication\n- Component security boundaries',
491
- 'node-api': '- Input validation and sanitization\n- Authentication and authorization\n- Rate limiting and DDoS protection\n- SQL injection and NoSQL injection prevention\n- JWT token validation and refresh',
492
- 'browser-extension': '- Content Security Policy compliance\n- Cross-origin request validation\n- Permission boundary testing\n- Message passing security\n- DOM injection prevention',
493
- 'cli-tool': '- Command injection prevention\n- Path traversal attacks\n- Privilege escalation protection\n- Environment variable sanitization\n- File system permission validation',
494
- 'n8n-node': '- Credential handling and encryption\n- Input data sanitization\n- API security and rate limiting\n- Webhook validation\n- Error information leakage prevention',
495
- 'n8n-workflow': '- Data validation between nodes\n- Webhook security testing\n- Error handling without data exposure\n- Authentication token management\n- Input/output data sanitization'
496
- };
497
- return security[projectType] || '- Input validation and sanitization\n- Output encoding and escaping\n- Authentication and authorization checks\n- Error handling without information leakage';
498
- }
499
- getFrameworkGuidelines(framework) {
500
- const guidelines = {
501
- 'jest': '- Use describe() for test grouping and it()/test() for individual tests\n- Utilize beforeEach/afterEach for setup/teardown\n- Mock modules with jest.mock() and manual mocks\n- Use expect() assertions with Jest matchers\n- Implement snapshot testing for UI components',
502
- 'mocha': '- Structure tests with describe() and it() blocks\n- Use Chai for assertions (expect, should, assert)\n- Implement Sinon for spies, stubs, and mocks\n- Handle async tests with done() callbacks or promises\n- Use before/after hooks for test setup',
503
- 'pytest': '- Use fixtures for test setup and dependency injection\n- Parametrize tests with @pytest.mark.parametrize\n- Mock dependencies with unittest.mock or pytest-mock\n- Use assert statements for simple assertions\n- Mark tests with decorators for organization',
504
- 'phpunit': '- Extend TestCase class for all test classes\n- Use setUp() and tearDown() for test preparation\n- Create data providers for parametrized testing\n- Mock objects with getMockBuilder() or Prophecy\n- Use annotations (@covers, @group, @dataProvider)',
505
- 'vitest': '- Similar to Jest with describe() and it()/test()\n- Use vi.mock() for module mocking\n- Leverage Vitest UI for debugging\n- Implement in-source testing capabilities\n- Use expect() with extended Vitest matchers'
506
- };
507
- return guidelines[framework] || guidelines.jest;
508
- }
509
- getMockingGuidelines(strategy, framework) {
510
- const strategies = {
511
- 'minimal': `Mock only external dependencies and side effects:
512
- - Network calls and API requests
513
- - Database operations
514
- - File system operations
515
- - External services and third-party libraries
516
- - Keep internal logic unmocked for integration confidence`,
517
- 'comprehensive': `Mock most dependencies for isolation:
518
- - All external dependencies and services
519
- - Internal modules and complex dependencies
520
- - Database and network operations
521
- - Time-dependent functions (Date.now(), setTimeout)
522
- - Random functions and non-deterministic behavior`,
523
- 'integration-preferred': `Minimize mocks to test real integration:
524
- - Mock only external services outside your control
525
- - Use real database with test data
526
- - Test actual file operations with temporary files
527
- - Mock only network calls to external APIs
528
- - Prefer dependency injection over mocking`
529
- };
530
- return strategies[strategy] || strategies.minimal;
531
- }
532
- // Helper methods for file analysis
533
- estimateFunctionCount(content, language) {
534
- const patterns = {
535
- 'javascript': /function\s+\w+|const\s+\w+\s*=\s*\(|class\s+\w+/g,
536
- 'typescript': /function\s+\w+|const\s+\w+\s*=\s*\(|class\s+\w+/g,
537
- 'python': /def\s+\w+|class\s+\w+/g,
538
- 'php': /function\s+\w+|class\s+\w+/g,
539
- 'java': /public\s+\w+\s+\w+\(|private\s+\w+\s+\w+\(/g
540
- };
541
- const pattern = patterns[language] || patterns.javascript;
542
- const matches = content.match(pattern);
543
- return matches ? matches.length : 0;
544
- }
545
- estimateComplexity(content) {
546
- const lines = content.split('\n').length;
547
- const cyclomaticIndicators = (content.match(/if\s*\(|while\s*\(|for\s*\(|switch\s*\(|catch\s*\(/g) || []).length;
548
- if (lines < 50 && cyclomaticIndicators < 5)
549
- return 'low';
550
- if (lines < 200 && cyclomaticIndicators < 15)
551
- return 'medium';
552
- return 'high';
553
- }
554
- extractFileDependencies(content) {
555
- const importMatches = content.match(/(?:import|require)\s*\(?['"`]([^'"`]+)['"`]/g) || [];
556
- return importMatches.map(match => {
557
- const result = match.match(/['"`]([^'"`]+)['"`]/);
558
- return result ? result[1] : '';
559
- }).filter(dep => dep && !dep.startsWith('.'));
560
- }
561
- isFileTestable(content, language) {
562
- const functionCount = this.estimateFunctionCount(content, language);
563
- const hasExports = /export|module\.exports/g.test(content);
564
- return functionCount > 0 || hasExports;
565
- }
566
- calculateOverallComplexity(results) {
567
- const complexities = results.map(r => r.complexity);
568
- const highCount = complexities.filter(c => c === 'high').length;
569
- const mediumCount = complexities.filter(c => c === 'medium').length;
570
- if (highCount > results.length * 0.3)
571
- return 'high';
572
- if (mediumCount > results.length * 0.5)
573
- return 'medium';
574
- return 'low';
575
- }
576
- extractDependencies(results) {
577
- const allDeps = results.flatMap(r => r.dependencies || []);
578
- return [...new Set(allDeps)];
579
- }
580
- }
581
- export default UnitTestGenerator;
582
- //# sourceMappingURL=unit-tests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unit-tests.js","sourceRoot":"","sources":["../../../src/prompts/generate/unit-tests.ts"],"names":[],"mappings":"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"}