wiggum-cli 0.1.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 (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/bin/ralph.js +8 -0
  4. package/dist/ai/enhancer.d.ts +100 -0
  5. package/dist/ai/enhancer.d.ts.map +1 -0
  6. package/dist/ai/enhancer.js +233 -0
  7. package/dist/ai/enhancer.js.map +1 -0
  8. package/dist/ai/index.d.ts +8 -0
  9. package/dist/ai/index.d.ts.map +1 -0
  10. package/dist/ai/index.js +11 -0
  11. package/dist/ai/index.js.map +1 -0
  12. package/dist/ai/prompts.d.ts +26 -0
  13. package/dist/ai/prompts.d.ts.map +1 -0
  14. package/dist/ai/prompts.js +201 -0
  15. package/dist/ai/prompts.js.map +1 -0
  16. package/dist/ai/providers.d.ts +35 -0
  17. package/dist/ai/providers.d.ts.map +1 -0
  18. package/dist/ai/providers.js +104 -0
  19. package/dist/ai/providers.js.map +1 -0
  20. package/dist/cli.d.ts +6 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +196 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/commands/init.d.ts +16 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +124 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/monitor.d.ts +17 -0
  29. package/dist/commands/monitor.d.ts.map +1 -0
  30. package/dist/commands/monitor.js +342 -0
  31. package/dist/commands/monitor.js.map +1 -0
  32. package/dist/commands/new.d.ts +19 -0
  33. package/dist/commands/new.d.ts.map +1 -0
  34. package/dist/commands/new.js +272 -0
  35. package/dist/commands/new.js.map +1 -0
  36. package/dist/commands/run.d.ts +16 -0
  37. package/dist/commands/run.d.ts.map +1 -0
  38. package/dist/commands/run.js +175 -0
  39. package/dist/commands/run.js.map +1 -0
  40. package/dist/generator/config.d.ts +59 -0
  41. package/dist/generator/config.d.ts.map +1 -0
  42. package/dist/generator/config.js +68 -0
  43. package/dist/generator/config.js.map +1 -0
  44. package/dist/generator/index.d.ts +64 -0
  45. package/dist/generator/index.d.ts.map +1 -0
  46. package/dist/generator/index.js +147 -0
  47. package/dist/generator/index.js.map +1 -0
  48. package/dist/generator/templates.d.ts +70 -0
  49. package/dist/generator/templates.d.ts.map +1 -0
  50. package/dist/generator/templates.js +296 -0
  51. package/dist/generator/templates.js.map +1 -0
  52. package/dist/generator/writer.d.ts +93 -0
  53. package/dist/generator/writer.d.ts.map +1 -0
  54. package/dist/generator/writer.js +213 -0
  55. package/dist/generator/writer.js.map +1 -0
  56. package/dist/index.d.ts +12 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +17 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/scanner/detectors/core/framework.d.ts +11 -0
  61. package/dist/scanner/detectors/core/framework.d.ts.map +1 -0
  62. package/dist/scanner/detectors/core/framework.js +275 -0
  63. package/dist/scanner/detectors/core/framework.js.map +1 -0
  64. package/dist/scanner/detectors/core/packageManager.d.ts +11 -0
  65. package/dist/scanner/detectors/core/packageManager.d.ts.map +1 -0
  66. package/dist/scanner/detectors/core/packageManager.js +74 -0
  67. package/dist/scanner/detectors/core/packageManager.js.map +1 -0
  68. package/dist/scanner/detectors/core/styling.d.ts +12 -0
  69. package/dist/scanner/detectors/core/styling.d.ts.map +1 -0
  70. package/dist/scanner/detectors/core/styling.js +230 -0
  71. package/dist/scanner/detectors/core/styling.js.map +1 -0
  72. package/dist/scanner/detectors/core/testing.d.ts +12 -0
  73. package/dist/scanner/detectors/core/testing.d.ts.map +1 -0
  74. package/dist/scanner/detectors/core/testing.js +190 -0
  75. package/dist/scanner/detectors/core/testing.js.map +1 -0
  76. package/dist/scanner/detectors/data/api.d.ts +12 -0
  77. package/dist/scanner/detectors/data/api.d.ts.map +1 -0
  78. package/dist/scanner/detectors/data/api.js +261 -0
  79. package/dist/scanner/detectors/data/api.js.map +1 -0
  80. package/dist/scanner/detectors/data/database.d.ts +12 -0
  81. package/dist/scanner/detectors/data/database.d.ts.map +1 -0
  82. package/dist/scanner/detectors/data/database.js +213 -0
  83. package/dist/scanner/detectors/data/database.js.map +1 -0
  84. package/dist/scanner/detectors/data/orm.d.ts +12 -0
  85. package/dist/scanner/detectors/data/orm.d.ts.map +1 -0
  86. package/dist/scanner/detectors/data/orm.js +160 -0
  87. package/dist/scanner/detectors/data/orm.js.map +1 -0
  88. package/dist/scanner/detectors/frontend/formHandling.d.ts +12 -0
  89. package/dist/scanner/detectors/frontend/formHandling.d.ts.map +1 -0
  90. package/dist/scanner/detectors/frontend/formHandling.js +211 -0
  91. package/dist/scanner/detectors/frontend/formHandling.js.map +1 -0
  92. package/dist/scanner/detectors/frontend/stateManagement.d.ts +12 -0
  93. package/dist/scanner/detectors/frontend/stateManagement.d.ts.map +1 -0
  94. package/dist/scanner/detectors/frontend/stateManagement.js +221 -0
  95. package/dist/scanner/detectors/frontend/stateManagement.js.map +1 -0
  96. package/dist/scanner/detectors/frontend/uiComponents.d.ts +12 -0
  97. package/dist/scanner/detectors/frontend/uiComponents.d.ts.map +1 -0
  98. package/dist/scanner/detectors/frontend/uiComponents.js +285 -0
  99. package/dist/scanner/detectors/frontend/uiComponents.js.map +1 -0
  100. package/dist/scanner/detectors/infra/deployment.d.ts +12 -0
  101. package/dist/scanner/detectors/infra/deployment.d.ts.map +1 -0
  102. package/dist/scanner/detectors/infra/deployment.js +301 -0
  103. package/dist/scanner/detectors/infra/deployment.js.map +1 -0
  104. package/dist/scanner/detectors/infra/monorepo.d.ts +12 -0
  105. package/dist/scanner/detectors/infra/monorepo.d.ts.map +1 -0
  106. package/dist/scanner/detectors/infra/monorepo.js +219 -0
  107. package/dist/scanner/detectors/infra/monorepo.js.map +1 -0
  108. package/dist/scanner/detectors/mcp/mcpProject.d.ts +12 -0
  109. package/dist/scanner/detectors/mcp/mcpProject.d.ts.map +1 -0
  110. package/dist/scanner/detectors/mcp/mcpProject.js +154 -0
  111. package/dist/scanner/detectors/mcp/mcpProject.js.map +1 -0
  112. package/dist/scanner/detectors/mcp/mcpServers.d.ts +17 -0
  113. package/dist/scanner/detectors/mcp/mcpServers.d.ts.map +1 -0
  114. package/dist/scanner/detectors/mcp/mcpServers.js +193 -0
  115. package/dist/scanner/detectors/mcp/mcpServers.js.map +1 -0
  116. package/dist/scanner/detectors/services/analytics.d.ts +12 -0
  117. package/dist/scanner/detectors/services/analytics.d.ts.map +1 -0
  118. package/dist/scanner/detectors/services/analytics.js +236 -0
  119. package/dist/scanner/detectors/services/analytics.js.map +1 -0
  120. package/dist/scanner/detectors/services/auth.d.ts +12 -0
  121. package/dist/scanner/detectors/services/auth.d.ts.map +1 -0
  122. package/dist/scanner/detectors/services/auth.js +217 -0
  123. package/dist/scanner/detectors/services/auth.js.map +1 -0
  124. package/dist/scanner/detectors/services/email.d.ts +12 -0
  125. package/dist/scanner/detectors/services/email.d.ts.map +1 -0
  126. package/dist/scanner/detectors/services/email.js +211 -0
  127. package/dist/scanner/detectors/services/email.js.map +1 -0
  128. package/dist/scanner/detectors/services/payments.d.ts +12 -0
  129. package/dist/scanner/detectors/services/payments.d.ts.map +1 -0
  130. package/dist/scanner/detectors/services/payments.js +185 -0
  131. package/dist/scanner/detectors/services/payments.js.map +1 -0
  132. package/dist/scanner/detectors/utils.d.ts +160 -0
  133. package/dist/scanner/detectors/utils.d.ts.map +1 -0
  134. package/dist/scanner/detectors/utils.js +222 -0
  135. package/dist/scanner/detectors/utils.js.map +1 -0
  136. package/dist/scanner/index.d.ts +42 -0
  137. package/dist/scanner/index.d.ts.map +1 -0
  138. package/dist/scanner/index.js +282 -0
  139. package/dist/scanner/index.js.map +1 -0
  140. package/dist/scanner/registry.d.ts +43 -0
  141. package/dist/scanner/registry.d.ts.map +1 -0
  142. package/dist/scanner/registry.js +243 -0
  143. package/dist/scanner/registry.js.map +1 -0
  144. package/dist/scanner/types.d.ts +112 -0
  145. package/dist/scanner/types.d.ts.map +1 -0
  146. package/dist/scanner/types.js +6 -0
  147. package/dist/scanner/types.js.map +1 -0
  148. package/dist/templates/config/ralph.config.js.tmpl +38 -0
  149. package/dist/templates/guides/AGENTS.md.tmpl +100 -0
  150. package/dist/templates/guides/FRONTEND.md.tmpl +523 -0
  151. package/dist/templates/guides/PERFORMANCE.md.tmpl +264 -0
  152. package/dist/templates/guides/SECURITY.md.tmpl +100 -0
  153. package/dist/templates/prompts/PROMPT.md.tmpl +77 -0
  154. package/dist/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
  155. package/dist/templates/prompts/PROMPT_feature.md.tmpl +83 -0
  156. package/dist/templates/prompts/PROMPT_review.md.tmpl +167 -0
  157. package/dist/templates/prompts/PROMPT_verify.md.tmpl +72 -0
  158. package/dist/templates/root/.gitignore.tmpl +5 -0
  159. package/dist/templates/root/LEARNINGS.md.tmpl +24 -0
  160. package/dist/templates/root/README.md.tmpl +61 -0
  161. package/dist/templates/scripts/feature-loop.sh.tmpl +267 -0
  162. package/dist/templates/scripts/loop.sh.tmpl +59 -0
  163. package/dist/templates/scripts/ralph-monitor.sh.tmpl +244 -0
  164. package/dist/templates/specs/README.md.tmpl +57 -0
  165. package/dist/templates/specs/_example.md.tmpl +71 -0
  166. package/dist/utils/config.d.ts +95 -0
  167. package/dist/utils/config.d.ts.map +1 -0
  168. package/dist/utils/config.js +148 -0
  169. package/dist/utils/config.js.map +1 -0
  170. package/dist/utils/header.d.ts +5 -0
  171. package/dist/utils/header.d.ts.map +1 -0
  172. package/dist/utils/header.js +15 -0
  173. package/dist/utils/header.js.map +1 -0
  174. package/dist/utils/logger.d.ts +11 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +24 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/package.json +44 -0
  179. package/src/ai/enhancer.ts +350 -0
  180. package/src/ai/index.ts +38 -0
  181. package/src/ai/prompts.ts +217 -0
  182. package/src/ai/providers.ts +136 -0
  183. package/src/cli.ts +255 -0
  184. package/src/commands/init.ts +149 -0
  185. package/src/commands/monitor.ts +412 -0
  186. package/src/commands/new.ts +312 -0
  187. package/src/commands/run.ts +214 -0
  188. package/src/generator/config.ts +116 -0
  189. package/src/generator/index.ts +227 -0
  190. package/src/generator/templates.ts +412 -0
  191. package/src/generator/writer.ts +293 -0
  192. package/src/index.ts +41 -0
  193. package/src/scanner/detectors/core/framework.ts +332 -0
  194. package/src/scanner/detectors/core/packageManager.ts +91 -0
  195. package/src/scanner/detectors/core/styling.ts +261 -0
  196. package/src/scanner/detectors/core/testing.ts +221 -0
  197. package/src/scanner/detectors/data/api.ts +303 -0
  198. package/src/scanner/detectors/data/database.ts +245 -0
  199. package/src/scanner/detectors/data/orm.ts +180 -0
  200. package/src/scanner/detectors/frontend/formHandling.ts +244 -0
  201. package/src/scanner/detectors/frontend/stateManagement.ts +261 -0
  202. package/src/scanner/detectors/frontend/uiComponents.ts +328 -0
  203. package/src/scanner/detectors/infra/deployment.ts +343 -0
  204. package/src/scanner/detectors/infra/monorepo.ts +251 -0
  205. package/src/scanner/detectors/mcp/mcpProject.ts +176 -0
  206. package/src/scanner/detectors/mcp/mcpServers.ts +237 -0
  207. package/src/scanner/detectors/services/analytics.ts +273 -0
  208. package/src/scanner/detectors/services/auth.ts +254 -0
  209. package/src/scanner/detectors/services/email.ts +244 -0
  210. package/src/scanner/detectors/services/payments.ts +213 -0
  211. package/src/scanner/detectors/utils.ts +251 -0
  212. package/src/scanner/index.ts +354 -0
  213. package/src/scanner/registry.ts +301 -0
  214. package/src/scanner/types.ts +152 -0
  215. package/src/templates/config/ralph.config.js.tmpl +38 -0
  216. package/src/templates/guides/AGENTS.md.tmpl +100 -0
  217. package/src/templates/guides/FRONTEND.md.tmpl +523 -0
  218. package/src/templates/guides/PERFORMANCE.md.tmpl +264 -0
  219. package/src/templates/guides/SECURITY.md.tmpl +100 -0
  220. package/src/templates/prompts/PROMPT.md.tmpl +77 -0
  221. package/src/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
  222. package/src/templates/prompts/PROMPT_feature.md.tmpl +83 -0
  223. package/src/templates/prompts/PROMPT_review.md.tmpl +167 -0
  224. package/src/templates/prompts/PROMPT_verify.md.tmpl +72 -0
  225. package/src/templates/root/.gitignore.tmpl +5 -0
  226. package/src/templates/root/LEARNINGS.md.tmpl +24 -0
  227. package/src/templates/root/README.md.tmpl +61 -0
  228. package/src/templates/scripts/feature-loop.sh.tmpl +267 -0
  229. package/src/templates/scripts/loop.sh.tmpl +59 -0
  230. package/src/templates/scripts/ralph-monitor.sh.tmpl +244 -0
  231. package/src/templates/specs/README.md.tmpl +57 -0
  232. package/src/templates/specs/_example.md.tmpl +71 -0
  233. package/src/utils/config.ts +221 -0
  234. package/src/utils/header.ts +15 -0
  235. package/src/utils/logger.ts +28 -0
  236. package/tsconfig.json +19 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Package Manager Detector
3
+ * Detects: pnpm, yarn, bun, npm
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * Package manager detector
8
+ */
9
+ export declare const packageManagerDetector: Detector;
10
+ export default packageManagerDetector;
11
+ //# sourceMappingURL=packageManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageManager.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/core/packageManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAehE;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,QA+DpC,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Package Manager Detector
3
+ * Detects: pnpm, yarn, bun, npm
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ const LOCK_FILES = [
8
+ { name: 'pnpm', file: 'pnpm-lock.yaml', confidence: 95 },
9
+ { name: 'yarn', file: 'yarn.lock', confidence: 95 },
10
+ { name: 'bun', file: 'bun.lockb', confidence: 95 },
11
+ { name: 'npm', file: 'package-lock.json', confidence: 95 },
12
+ ];
13
+ /**
14
+ * Package manager detector
15
+ */
16
+ export const packageManagerDetector = {
17
+ category: 'packageManager',
18
+ name: 'Package Manager Detector',
19
+ async detect(projectRoot) {
20
+ const evidence = [];
21
+ // Check for lock files in order of preference
22
+ for (const lockFile of LOCK_FILES) {
23
+ const lockFilePath = join(projectRoot, lockFile.file);
24
+ if (existsSync(lockFilePath)) {
25
+ evidence.push(`${lockFile.file} found`);
26
+ return {
27
+ name: lockFile.name,
28
+ confidence: lockFile.confidence,
29
+ evidence,
30
+ };
31
+ }
32
+ }
33
+ // Check for packageManager field in package.json
34
+ const packageJsonPath = join(projectRoot, 'package.json');
35
+ if (existsSync(packageJsonPath)) {
36
+ try {
37
+ const { readFileSync } = await import('node:fs');
38
+ const content = readFileSync(packageJsonPath, 'utf-8');
39
+ const pkg = JSON.parse(content);
40
+ if (pkg.packageManager) {
41
+ const match = pkg.packageManager.match(/^(pnpm|yarn|npm|bun)@/);
42
+ if (match) {
43
+ const manager = match[1];
44
+ const versionMatch = pkg.packageManager.match(/@([^\s]+)/);
45
+ evidence.push(`packageManager field: ${pkg.packageManager}`);
46
+ return {
47
+ name: manager,
48
+ version: versionMatch ? versionMatch[1] : undefined,
49
+ confidence: 90,
50
+ evidence,
51
+ };
52
+ }
53
+ }
54
+ }
55
+ catch {
56
+ // Ignore parse errors
57
+ }
58
+ }
59
+ // Check for node_modules (fallback, assume npm)
60
+ const nodeModulesPath = join(projectRoot, 'node_modules');
61
+ if (existsSync(nodeModulesPath)) {
62
+ evidence.push('node_modules exists, no lock file found');
63
+ return {
64
+ name: 'npm',
65
+ confidence: 30, // Low confidence since we're just guessing
66
+ evidence,
67
+ };
68
+ }
69
+ // No package manager detected
70
+ return null;
71
+ },
72
+ };
73
+ export default packageManagerDetector;
74
+ //# sourceMappingURL=packageManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/core/packageManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Styling Detector
3
+ * Detects: Tailwind, CSS Modules, styled-components, Sass/SCSS
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * Styling detector
8
+ * Returns the primary styling approach detected
9
+ */
10
+ export declare const stylingDetector: Detector;
11
+ export default stylingDetector;
12
+ //# sourceMappingURL=styling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styling.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/core/styling.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAkNhE;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,QAqC7B,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Styling Detector
3
+ * Detects: Tailwind, CSS Modules, styled-components, Sass/SCSS
4
+ */
5
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ /**
8
+ * Read and parse package.json from a directory
9
+ */
10
+ function readPackageJson(projectRoot) {
11
+ const packageJsonPath = join(projectRoot, 'package.json');
12
+ if (!existsSync(packageJsonPath)) {
13
+ return null;
14
+ }
15
+ try {
16
+ const content = readFileSync(packageJsonPath, 'utf-8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * Get all dependencies from package.json (deps + devDeps)
25
+ */
26
+ function getDependencies(pkg) {
27
+ const deps = pkg.dependencies || {};
28
+ const devDeps = pkg.devDependencies || {};
29
+ return { ...deps, ...devDeps };
30
+ }
31
+ /**
32
+ * Check if a config file exists (supports multiple extensions)
33
+ */
34
+ function findConfigFile(projectRoot, baseName, extensions) {
35
+ for (const ext of extensions) {
36
+ const filePath = join(projectRoot, `${baseName}${ext}`);
37
+ if (existsSync(filePath)) {
38
+ return `${baseName}${ext}`;
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ /**
44
+ * Check if CSS Module files exist in common directories
45
+ */
46
+ function hasCssModules(projectRoot) {
47
+ const dirsToCheck = ['src', 'app', 'pages', 'components', 'styles'];
48
+ for (const dir of dirsToCheck) {
49
+ const dirPath = join(projectRoot, dir);
50
+ if (existsSync(dirPath)) {
51
+ try {
52
+ const files = readdirSync(dirPath, { recursive: true });
53
+ for (const file of files) {
54
+ const fileName = typeof file === 'string' ? file : file.toString();
55
+ if (fileName.includes('.module.css') || fileName.includes('.module.scss')) {
56
+ return true;
57
+ }
58
+ }
59
+ }
60
+ catch {
61
+ // Ignore directory read errors
62
+ }
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+ /**
68
+ * Detect Tailwind CSS
69
+ */
70
+ function detectTailwind(projectRoot, deps) {
71
+ const evidence = [];
72
+ let confidence = 0;
73
+ if (deps.tailwindcss) {
74
+ evidence.push(`tailwindcss@${deps.tailwindcss} in dependencies`);
75
+ confidence += 50;
76
+ }
77
+ // Check for tailwind config
78
+ const configExtensions = ['.config.js', '.config.ts', '.config.mjs', '.config.cjs'];
79
+ const configFile = findConfigFile(projectRoot, 'tailwind', configExtensions);
80
+ if (configFile) {
81
+ evidence.push(`${configFile} found`);
82
+ confidence += 40;
83
+ }
84
+ // Check for postcss config (often paired with Tailwind)
85
+ const postcssConfig = findConfigFile(projectRoot, 'postcss.config', ['.js', '.mjs', '.cjs']);
86
+ if (postcssConfig && deps.tailwindcss) {
87
+ evidence.push(`${postcssConfig} found`);
88
+ confidence += 10;
89
+ }
90
+ if (confidence === 0)
91
+ return null;
92
+ // Detect Tailwind v4 (uses CSS-based config)
93
+ let variant;
94
+ if (deps.tailwindcss) {
95
+ const version = deps.tailwindcss.replace(/[\^~]/, '');
96
+ if (version.startsWith('4.')) {
97
+ variant = 'v4';
98
+ }
99
+ }
100
+ return {
101
+ name: 'Tailwind CSS',
102
+ version: deps.tailwindcss,
103
+ variant,
104
+ confidence: Math.min(confidence, 100),
105
+ evidence,
106
+ };
107
+ }
108
+ /**
109
+ * Detect styled-components
110
+ */
111
+ function detectStyledComponents(projectRoot, deps) {
112
+ const evidence = [];
113
+ let confidence = 0;
114
+ if (deps['styled-components']) {
115
+ evidence.push(`styled-components@${deps['styled-components']} in dependencies`);
116
+ confidence += 80;
117
+ }
118
+ // Check for babel plugin
119
+ if (deps['babel-plugin-styled-components']) {
120
+ evidence.push('babel-plugin-styled-components in dependencies');
121
+ confidence += 10;
122
+ }
123
+ if (confidence === 0)
124
+ return null;
125
+ return {
126
+ name: 'styled-components',
127
+ version: deps['styled-components'],
128
+ confidence: Math.min(confidence, 100),
129
+ evidence,
130
+ };
131
+ }
132
+ /**
133
+ * Detect Emotion
134
+ */
135
+ function detectEmotion(projectRoot, deps) {
136
+ const evidence = [];
137
+ let confidence = 0;
138
+ if (deps['@emotion/react'] || deps['@emotion/styled']) {
139
+ const version = deps['@emotion/react'] || deps['@emotion/styled'];
140
+ evidence.push(`@emotion packages@${version} in dependencies`);
141
+ confidence += 80;
142
+ }
143
+ if (confidence === 0)
144
+ return null;
145
+ return {
146
+ name: 'Emotion',
147
+ version: deps['@emotion/react'] || deps['@emotion/styled'],
148
+ confidence: Math.min(confidence, 100),
149
+ evidence,
150
+ };
151
+ }
152
+ /**
153
+ * Detect Sass/SCSS
154
+ */
155
+ function detectSass(projectRoot, deps) {
156
+ const evidence = [];
157
+ let confidence = 0;
158
+ if (deps.sass) {
159
+ evidence.push(`sass@${deps.sass} in dependencies`);
160
+ confidence += 70;
161
+ }
162
+ else if (deps['node-sass']) {
163
+ evidence.push(`node-sass@${deps['node-sass']} in dependencies`);
164
+ confidence += 70;
165
+ }
166
+ if (confidence === 0)
167
+ return null;
168
+ return {
169
+ name: 'Sass/SCSS',
170
+ version: deps.sass || deps['node-sass'],
171
+ confidence: Math.min(confidence, 100),
172
+ evidence,
173
+ };
174
+ }
175
+ /**
176
+ * Detect CSS Modules
177
+ */
178
+ function detectCssModules(projectRoot) {
179
+ const evidence = [];
180
+ let confidence = 0;
181
+ if (hasCssModules(projectRoot)) {
182
+ evidence.push('*.module.css or *.module.scss files found');
183
+ confidence += 80;
184
+ }
185
+ if (confidence === 0)
186
+ return null;
187
+ return {
188
+ name: 'CSS Modules',
189
+ confidence: Math.min(confidence, 100),
190
+ evidence,
191
+ };
192
+ }
193
+ /**
194
+ * Styling detector
195
+ * Returns the primary styling approach detected
196
+ */
197
+ export const stylingDetector = {
198
+ category: 'styling',
199
+ name: 'Styling Detector',
200
+ async detect(projectRoot) {
201
+ const pkg = readPackageJson(projectRoot);
202
+ if (!pkg) {
203
+ // Still check for CSS Modules even without package.json
204
+ return detectCssModules(projectRoot);
205
+ }
206
+ const deps = getDependencies(pkg);
207
+ // Priority order for styling detection
208
+ // Tailwind is checked first as it's often the primary styling approach
209
+ const detectors = [
210
+ () => detectTailwind(projectRoot, deps),
211
+ () => detectStyledComponents(projectRoot, deps),
212
+ () => detectEmotion(projectRoot, deps),
213
+ () => detectSass(projectRoot, deps),
214
+ () => detectCssModules(projectRoot),
215
+ ];
216
+ // Find the highest confidence result
217
+ let bestResult = null;
218
+ let bestConfidence = 0;
219
+ for (const detector of detectors) {
220
+ const result = detector();
221
+ if (result && result.confidence > bestConfidence) {
222
+ bestResult = result;
223
+ bestConfidence = result.confidence;
224
+ }
225
+ }
226
+ return bestResult;
227
+ },
228
+ };
229
+ export default stylingDetector;
230
+ //# sourceMappingURL=styling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styling.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/core/styling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Testing Framework Detector
3
+ * Detects unit testing (Jest, Vitest) and E2E testing (Playwright, Cypress)
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * Testing framework detector
8
+ * Returns both unit and e2e test frameworks
9
+ */
10
+ export declare const testingDetector: Detector;
11
+ export default testingDetector;
12
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/core/testing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAoKhE;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,QA2C7B,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Testing Framework Detector
3
+ * Detects unit testing (Jest, Vitest) and E2E testing (Playwright, Cypress)
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { readPackageJson, getDependencies, findConfigFile, } from '../utils.js';
8
+ /**
9
+ * Detect Vitest
10
+ */
11
+ function detectVitest(projectRoot, deps) {
12
+ const evidence = [];
13
+ let confidence = 0;
14
+ if (deps.vitest) {
15
+ evidence.push(`vitest@${deps.vitest} in dependencies`);
16
+ confidence += 60;
17
+ }
18
+ // Check for vitest config
19
+ const configExtensions = ['.config.ts', '.config.js', '.config.mts', '.config.mjs'];
20
+ const configFile = findConfigFile(projectRoot, 'vitest', configExtensions);
21
+ if (configFile) {
22
+ evidence.push(`${configFile} found`);
23
+ confidence += 30;
24
+ }
25
+ // Vitest can also be configured in vite.config
26
+ if (!configFile && deps.vitest) {
27
+ const viteConfig = findConfigFile(projectRoot, 'vite.config', ['.ts', '.js', '.mjs']);
28
+ if (viteConfig) {
29
+ evidence.push('Vitest likely configured in vite.config');
30
+ confidence += 10;
31
+ }
32
+ }
33
+ if (confidence === 0)
34
+ return null;
35
+ return {
36
+ name: 'Vitest',
37
+ version: deps.vitest,
38
+ confidence: Math.min(confidence, 100),
39
+ evidence,
40
+ };
41
+ }
42
+ /**
43
+ * Detect Jest
44
+ */
45
+ function detectJest(projectRoot, deps, pkg) {
46
+ const evidence = [];
47
+ let confidence = 0;
48
+ if (deps.jest) {
49
+ evidence.push(`jest@${deps.jest} in dependencies`);
50
+ confidence += 50;
51
+ }
52
+ // Check for jest config files
53
+ const configExtensions = ['.config.js', '.config.ts', '.config.mjs', '.config.cjs'];
54
+ const configFile = findConfigFile(projectRoot, 'jest', configExtensions);
55
+ if (configFile) {
56
+ evidence.push(`${configFile} found`);
57
+ confidence += 30;
58
+ }
59
+ // Check for jest field in package.json
60
+ if (pkg.jest) {
61
+ evidence.push('jest config in package.json');
62
+ confidence += 20;
63
+ }
64
+ // Check for related packages
65
+ if (deps['@types/jest']) {
66
+ evidence.push('@types/jest in dependencies');
67
+ confidence += 10;
68
+ }
69
+ if (deps['ts-jest']) {
70
+ evidence.push('ts-jest in dependencies');
71
+ confidence += 10;
72
+ }
73
+ if (confidence === 0)
74
+ return null;
75
+ return {
76
+ name: 'Jest',
77
+ version: deps.jest,
78
+ confidence: Math.min(confidence, 100),
79
+ evidence,
80
+ };
81
+ }
82
+ /**
83
+ * Detect Playwright
84
+ */
85
+ function detectPlaywright(projectRoot, deps) {
86
+ const evidence = [];
87
+ let confidence = 0;
88
+ if (deps['@playwright/test']) {
89
+ evidence.push(`@playwright/test@${deps['@playwright/test']} in dependencies`);
90
+ confidence += 60;
91
+ }
92
+ else if (deps.playwright) {
93
+ evidence.push(`playwright@${deps.playwright} in dependencies`);
94
+ confidence += 50;
95
+ }
96
+ // Check for playwright config
97
+ const configExtensions = ['.config.ts', '.config.js', '.config.mjs'];
98
+ const configFile = findConfigFile(projectRoot, 'playwright', configExtensions);
99
+ if (configFile) {
100
+ evidence.push(`${configFile} found`);
101
+ confidence += 30;
102
+ }
103
+ if (confidence === 0)
104
+ return null;
105
+ return {
106
+ name: 'Playwright',
107
+ version: deps['@playwright/test'] || deps.playwright,
108
+ confidence: Math.min(confidence, 100),
109
+ evidence,
110
+ };
111
+ }
112
+ /**
113
+ * Detect Cypress
114
+ */
115
+ function detectCypress(projectRoot, deps) {
116
+ const evidence = [];
117
+ let confidence = 0;
118
+ if (deps.cypress) {
119
+ evidence.push(`cypress@${deps.cypress} in dependencies`);
120
+ confidence += 60;
121
+ }
122
+ // Check for cypress config
123
+ const configExtensions = ['.config.ts', '.config.js', '.config.mjs', '.config.cjs'];
124
+ const configFile = findConfigFile(projectRoot, 'cypress', configExtensions);
125
+ if (configFile) {
126
+ evidence.push(`${configFile} found`);
127
+ confidence += 30;
128
+ }
129
+ // Check for cypress folder
130
+ const cypressFolder = join(projectRoot, 'cypress');
131
+ if (existsSync(cypressFolder)) {
132
+ evidence.push('cypress/ folder found');
133
+ confidence += 10;
134
+ }
135
+ if (confidence === 0)
136
+ return null;
137
+ return {
138
+ name: 'Cypress',
139
+ version: deps.cypress,
140
+ confidence: Math.min(confidence, 100),
141
+ evidence,
142
+ };
143
+ }
144
+ /**
145
+ * Testing framework detector
146
+ * Returns both unit and e2e test frameworks
147
+ */
148
+ export const testingDetector = {
149
+ category: 'testing',
150
+ name: 'Testing Framework Detector',
151
+ async detect(projectRoot) {
152
+ const pkg = readPackageJson(projectRoot);
153
+ if (!pkg) {
154
+ return null;
155
+ }
156
+ const deps = getDependencies(pkg);
157
+ const results = [];
158
+ // Detect unit testing frameworks
159
+ // Prefer Vitest if both are present (as Vitest is often added later)
160
+ const vitest = detectVitest(projectRoot, deps);
161
+ const jest = detectJest(projectRoot, deps, pkg);
162
+ if (vitest && vitest.confidence >= 40) {
163
+ results.push({ ...vitest, variant: 'unit' });
164
+ }
165
+ else if (jest && jest.confidence >= 40) {
166
+ results.push({ ...jest, variant: 'unit' });
167
+ }
168
+ // Detect E2E testing frameworks
169
+ const playwright = detectPlaywright(projectRoot, deps);
170
+ const cypress = detectCypress(projectRoot, deps);
171
+ // If both are present, include the one with higher confidence
172
+ if (playwright && cypress) {
173
+ if (playwright.confidence >= cypress.confidence) {
174
+ results.push({ ...playwright, variant: 'e2e' });
175
+ }
176
+ else {
177
+ results.push({ ...cypress, variant: 'e2e' });
178
+ }
179
+ }
180
+ else if (playwright && playwright.confidence >= 40) {
181
+ results.push({ ...playwright, variant: 'e2e' });
182
+ }
183
+ else if (cypress && cypress.confidence >= 40) {
184
+ results.push({ ...cypress, variant: 'e2e' });
185
+ }
186
+ return results.length > 0 ? results : null;
187
+ },
188
+ };
189
+ export default testingDetector;
190
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/core/testing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * API Pattern Detector
3
+ * Detects: tRPC, GraphQL, TanStack Query, REST patterns
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * API pattern detector
8
+ * Returns all detected API patterns
9
+ */
10
+ export declare const apiDetector: Detector;
11
+ export default apiDetector;
12
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/data/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AA6PhE;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,QAoCzB,CAAC;AAEF,eAAe,WAAW,CAAC"}