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,93 @@
1
+ /**
2
+ * File Writer
3
+ * Creates .ralph directory structure and writes processed templates
4
+ */
5
+ /**
6
+ * Options for file writing
7
+ */
8
+ export interface WriteOptions {
9
+ /** How to handle existing files: 'backup', 'skip', 'overwrite' */
10
+ existingFiles: 'backup' | 'skip' | 'overwrite';
11
+ /** Whether to create backup files */
12
+ createBackups: boolean;
13
+ /** Verbose output */
14
+ verbose: boolean;
15
+ }
16
+ /**
17
+ * Default write options
18
+ */
19
+ export declare const DEFAULT_WRITE_OPTIONS: WriteOptions;
20
+ /**
21
+ * Result of a write operation
22
+ */
23
+ export interface WriteResult {
24
+ /** Path that was written */
25
+ path: string;
26
+ /** Whether the write was successful */
27
+ success: boolean;
28
+ /** Action taken: created, backed_up, skipped, overwritten */
29
+ action: 'created' | 'backed_up' | 'skipped' | 'overwritten' | 'error';
30
+ /** Error message if any */
31
+ error?: string;
32
+ /** Backup path if created */
33
+ backupPath?: string;
34
+ }
35
+ /**
36
+ * Summary of all write operations
37
+ */
38
+ export interface WriteSummary {
39
+ /** Total files processed */
40
+ total: number;
41
+ /** Files created (new) */
42
+ created: number;
43
+ /** Files backed up and replaced */
44
+ backedUp: number;
45
+ /** Files skipped (already existed) */
46
+ skipped: number;
47
+ /** Files overwritten */
48
+ overwritten: number;
49
+ /** Files that failed */
50
+ errors: number;
51
+ /** Individual results */
52
+ results: WriteResult[];
53
+ }
54
+ /**
55
+ * Create a directory and all parent directories
56
+ */
57
+ export declare function ensureDir(dirPath: string): Promise<void>;
58
+ /**
59
+ * Check if a file exists
60
+ */
61
+ export declare function fileExists(filePath: string): Promise<boolean>;
62
+ /**
63
+ * Create a backup of an existing file
64
+ */
65
+ export declare function backupFile(filePath: string): Promise<string>;
66
+ /**
67
+ * Write a single file with options
68
+ */
69
+ export declare function writeFileWithOptions(filePath: string, content: string, options?: WriteOptions): Promise<WriteResult>;
70
+ /**
71
+ * Write multiple files from a Map
72
+ */
73
+ export declare function writeFiles(files: Map<string, string>, baseDir: string, options?: WriteOptions): Promise<WriteSummary>;
74
+ /**
75
+ * Directory structure for .ralph
76
+ */
77
+ export declare const RALPH_DIRECTORY_STRUCTURE: {
78
+ root: string;
79
+ directories: string[];
80
+ };
81
+ /**
82
+ * Create the .ralph directory structure
83
+ */
84
+ export declare function createDirectoryStructure(projectRoot: string): Promise<void>;
85
+ /**
86
+ * Map template output paths to their final locations in .ralph
87
+ */
88
+ export declare function mapTemplateOutputPaths(templateOutputs: Map<string, string>): Map<string, string>;
89
+ /**
90
+ * Format write summary for display
91
+ */
92
+ export declare function formatWriteSummary(summary: WriteSummary): string;
93
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/generator/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,aAAa,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAC/C,qCAAqC;IACrC,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAInC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;IACtE,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAoC,GAC5C,OAAO,CAAC,WAAW,CAAC,CAkDtB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAoC,GAC5C,OAAO,CAAC,YAAY,CAAC,CAoCvB;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;CAQrC,CAAC;AAEF;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA+BhG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA6BhE"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * File Writer
3
+ * Creates .ralph directory structure and writes processed templates
4
+ */
5
+ import { mkdir, writeFile, copyFile, stat } from 'node:fs/promises';
6
+ import { join, dirname, basename } from 'node:path';
7
+ /**
8
+ * Default write options
9
+ */
10
+ export const DEFAULT_WRITE_OPTIONS = {
11
+ existingFiles: 'backup',
12
+ createBackups: true,
13
+ verbose: false,
14
+ };
15
+ /**
16
+ * Create a directory and all parent directories
17
+ */
18
+ export async function ensureDir(dirPath) {
19
+ await mkdir(dirPath, { recursive: true });
20
+ }
21
+ /**
22
+ * Check if a file exists
23
+ */
24
+ export async function fileExists(filePath) {
25
+ try {
26
+ await stat(filePath);
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ /**
34
+ * Create a backup of an existing file
35
+ */
36
+ export async function backupFile(filePath) {
37
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
38
+ const dir = dirname(filePath);
39
+ const name = basename(filePath);
40
+ const backupPath = join(dir, `.${name}.backup-${timestamp}`);
41
+ await copyFile(filePath, backupPath);
42
+ return backupPath;
43
+ }
44
+ /**
45
+ * Write a single file with options
46
+ */
47
+ export async function writeFileWithOptions(filePath, content, options = DEFAULT_WRITE_OPTIONS) {
48
+ const result = {
49
+ path: filePath,
50
+ success: false,
51
+ action: 'created',
52
+ };
53
+ try {
54
+ // Ensure directory exists
55
+ await ensureDir(dirname(filePath));
56
+ // Check if file exists
57
+ const exists = await fileExists(filePath);
58
+ if (exists) {
59
+ switch (options.existingFiles) {
60
+ case 'skip':
61
+ result.action = 'skipped';
62
+ result.success = true;
63
+ return result;
64
+ case 'backup':
65
+ if (options.createBackups) {
66
+ result.backupPath = await backupFile(filePath);
67
+ result.action = 'backed_up';
68
+ }
69
+ else {
70
+ result.action = 'overwritten';
71
+ }
72
+ break;
73
+ case 'overwrite':
74
+ result.action = 'overwritten';
75
+ break;
76
+ }
77
+ }
78
+ // Write the file
79
+ await writeFile(filePath, content, 'utf-8');
80
+ result.success = true;
81
+ if (options.verbose) {
82
+ console.log(` ${result.action}: ${filePath}`);
83
+ }
84
+ }
85
+ catch (error) {
86
+ result.action = 'error';
87
+ result.error = error instanceof Error ? error.message : String(error);
88
+ result.success = false;
89
+ }
90
+ return result;
91
+ }
92
+ /**
93
+ * Write multiple files from a Map
94
+ */
95
+ export async function writeFiles(files, baseDir, options = DEFAULT_WRITE_OPTIONS) {
96
+ const summary = {
97
+ total: files.size,
98
+ created: 0,
99
+ backedUp: 0,
100
+ skipped: 0,
101
+ overwritten: 0,
102
+ errors: 0,
103
+ results: [],
104
+ };
105
+ for (const [relativePath, content] of files) {
106
+ const fullPath = join(baseDir, relativePath);
107
+ const result = await writeFileWithOptions(fullPath, content, options);
108
+ summary.results.push(result);
109
+ switch (result.action) {
110
+ case 'created':
111
+ summary.created++;
112
+ break;
113
+ case 'backed_up':
114
+ summary.backedUp++;
115
+ break;
116
+ case 'skipped':
117
+ summary.skipped++;
118
+ break;
119
+ case 'overwritten':
120
+ summary.overwritten++;
121
+ break;
122
+ case 'error':
123
+ summary.errors++;
124
+ break;
125
+ }
126
+ }
127
+ return summary;
128
+ }
129
+ /**
130
+ * Directory structure for .ralph
131
+ */
132
+ export const RALPH_DIRECTORY_STRUCTURE = {
133
+ root: '.ralph',
134
+ directories: [
135
+ '.ralph/prompts',
136
+ '.ralph/guides',
137
+ '.ralph/specs',
138
+ '.ralph/scripts',
139
+ ],
140
+ };
141
+ /**
142
+ * Create the .ralph directory structure
143
+ */
144
+ export async function createDirectoryStructure(projectRoot) {
145
+ for (const dir of RALPH_DIRECTORY_STRUCTURE.directories) {
146
+ await ensureDir(join(projectRoot, dir));
147
+ }
148
+ }
149
+ /**
150
+ * Map template output paths to their final locations in .ralph
151
+ */
152
+ export function mapTemplateOutputPaths(templateOutputs) {
153
+ const mapped = new Map();
154
+ for (const [outputPath, content] of templateOutputs) {
155
+ // Map template categories to .ralph structure
156
+ let finalPath;
157
+ if (outputPath.startsWith('prompts/')) {
158
+ finalPath = `.ralph/${outputPath}`;
159
+ }
160
+ else if (outputPath.startsWith('guides/')) {
161
+ finalPath = `.ralph/${outputPath}`;
162
+ }
163
+ else if (outputPath.startsWith('specs/')) {
164
+ finalPath = `.ralph/${outputPath}`;
165
+ }
166
+ else if (outputPath.startsWith('scripts/')) {
167
+ // Scripts go to .ralph/scripts/
168
+ finalPath = `.ralph/${outputPath}`;
169
+ }
170
+ else if (outputPath.startsWith('config/')) {
171
+ // ralph.config.js goes to project root
172
+ finalPath = outputPath.replace('config/', '');
173
+ }
174
+ else if (outputPath.startsWith('root/')) {
175
+ // Root files go to .ralph/
176
+ finalPath = `.ralph/${outputPath.replace('root/', '')}`;
177
+ }
178
+ else {
179
+ // Default: put in .ralph/
180
+ finalPath = `.ralph/${outputPath}`;
181
+ }
182
+ mapped.set(finalPath, content);
183
+ }
184
+ return mapped;
185
+ }
186
+ /**
187
+ * Format write summary for display
188
+ */
189
+ export function formatWriteSummary(summary) {
190
+ const lines = [];
191
+ lines.push('Write Summary:');
192
+ lines.push(` Total files: ${summary.total}`);
193
+ lines.push(` Created: ${summary.created}`);
194
+ if (summary.backedUp > 0) {
195
+ lines.push(` Backed up & updated: ${summary.backedUp}`);
196
+ }
197
+ if (summary.skipped > 0) {
198
+ lines.push(` Skipped (existing): ${summary.skipped}`);
199
+ }
200
+ if (summary.overwritten > 0) {
201
+ lines.push(` Overwritten: ${summary.overwritten}`);
202
+ }
203
+ if (summary.errors > 0) {
204
+ lines.push(` Errors: ${summary.errors}`);
205
+ for (const result of summary.results) {
206
+ if (result.action === 'error') {
207
+ lines.push(` - ${result.path}: ${result.error}`);
208
+ }
209
+ }
210
+ }
211
+ return lines.join('\n');
212
+ }
213
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/generator/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Main entry point for the Ralph CLI
3
+ */
4
+ export declare function main(): Promise<void>;
5
+ export { createCli } from './cli.js';
6
+ export { displayHeader } from './utils/header.js';
7
+ export { logger } from './utils/logger.js';
8
+ export { Scanner, scanProject, formatScanResult } from './scanner/index.js';
9
+ export type { DetectionResult, DetectedStack, ScanResult, ScannerOptions, } from './scanner/index.js';
10
+ export { Generator, generateRalph, formatGenerationResult, extractVariables, generateConfig, generateConfigFile, } from './generator/index.js';
11
+ export type { GeneratorOptions, GenerationResult, TemplateVariables, RalphConfig, WriteOptions, WriteSummary, } from './generator/index.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAG1C;AAGD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ import { createCli } from './cli.js';
2
+ /**
3
+ * Main entry point for the Ralph CLI
4
+ */
5
+ export async function main() {
6
+ const program = createCli();
7
+ await program.parseAsync(process.argv);
8
+ }
9
+ // Export for programmatic use
10
+ export { createCli } from './cli.js';
11
+ export { displayHeader } from './utils/header.js';
12
+ export { logger } from './utils/logger.js';
13
+ // Export scanner
14
+ export { Scanner, scanProject, formatScanResult } from './scanner/index.js';
15
+ // Export generator
16
+ export { Generator, generateRalph, formatGenerationResult, extractVariables, generateConfig, generateConfigFile, } from './generator/index.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,8BAA8B;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,iBAAiB;AACjB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAQ5E,mBAAmB;AACnB,OAAO,EACL,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Framework Detector
3
+ * Detects web frameworks: Next.js, React, Vue, Svelte, Remix, Astro
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * Framework detector
8
+ */
9
+ export declare const frameworkDetector: Detector;
10
+ export default frameworkDetector;
11
+ //# sourceMappingURL=framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/core/framework.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAgShE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,QA+B/B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Framework Detector
3
+ * Detects web frameworks: Next.js, React, Vue, Svelte, Remix, Astro
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { readPackageJson, getDependencies, findConfigFile, } from '../utils.js';
8
+ /**
9
+ * Detect Next.js variant (app router vs pages router)
10
+ */
11
+ function detectNextJsVariant(projectRoot) {
12
+ const appDir = join(projectRoot, 'app');
13
+ const srcAppDir = join(projectRoot, 'src', 'app');
14
+ if (existsSync(appDir) || existsSync(srcAppDir)) {
15
+ return 'app-router';
16
+ }
17
+ const pagesDir = join(projectRoot, 'pages');
18
+ const srcPagesDir = join(projectRoot, 'src', 'pages');
19
+ if (existsSync(pagesDir) || existsSync(srcPagesDir)) {
20
+ return 'pages-router';
21
+ }
22
+ return undefined;
23
+ }
24
+ /**
25
+ * Detect Next.js
26
+ */
27
+ function detectNextJs(projectRoot, deps) {
28
+ const evidence = [];
29
+ let confidence = 0;
30
+ // Check for next dependency
31
+ if (deps.next) {
32
+ evidence.push(`next@${deps.next} in dependencies`);
33
+ confidence += 60;
34
+ }
35
+ // Check for next.config.* files
36
+ const configExtensions = ['.js', '.mjs', '.ts'];
37
+ const configFile = findConfigFile(projectRoot, 'next.config', configExtensions);
38
+ if (configFile) {
39
+ evidence.push(`${configFile} found`);
40
+ confidence += 30;
41
+ }
42
+ if (confidence === 0)
43
+ return null;
44
+ const variant = detectNextJsVariant(projectRoot);
45
+ if (variant) {
46
+ evidence.push(`${variant} detected`);
47
+ confidence += 10;
48
+ }
49
+ return {
50
+ name: 'Next.js',
51
+ version: deps.next,
52
+ variant,
53
+ confidence: Math.min(confidence, 100),
54
+ evidence,
55
+ };
56
+ }
57
+ /**
58
+ * Detect Vue/Nuxt
59
+ */
60
+ function detectVue(projectRoot, deps) {
61
+ const evidence = [];
62
+ let confidence = 0;
63
+ // Check for nuxt (takes precedence as it includes Vue)
64
+ if (deps.nuxt) {
65
+ evidence.push(`nuxt@${deps.nuxt} in dependencies`);
66
+ confidence += 70;
67
+ const nuxtConfig = findConfigFile(projectRoot, 'nuxt.config', ['.js', '.ts']);
68
+ if (nuxtConfig) {
69
+ evidence.push(`${nuxtConfig} found`);
70
+ confidence += 30;
71
+ }
72
+ return {
73
+ name: 'Nuxt',
74
+ version: deps.nuxt,
75
+ confidence: Math.min(confidence, 100),
76
+ evidence,
77
+ };
78
+ }
79
+ // Check for vue
80
+ if (deps.vue) {
81
+ evidence.push(`vue@${deps.vue} in dependencies`);
82
+ confidence += 50;
83
+ // Check for Vue-specific configs
84
+ const vueConfig = findConfigFile(projectRoot, 'vue.config', ['.js', '.ts']);
85
+ if (vueConfig) {
86
+ evidence.push(`${vueConfig} found`);
87
+ confidence += 20;
88
+ }
89
+ const viteConfig = findConfigFile(projectRoot, 'vite.config', ['.js', '.ts', '.mjs']);
90
+ if (viteConfig && deps['@vitejs/plugin-vue']) {
91
+ evidence.push('Vite + Vue plugin detected');
92
+ confidence += 20;
93
+ }
94
+ if (confidence === 0)
95
+ return null;
96
+ return {
97
+ name: 'Vue',
98
+ version: deps.vue,
99
+ confidence: Math.min(confidence, 100),
100
+ evidence,
101
+ };
102
+ }
103
+ return null;
104
+ }
105
+ /**
106
+ * Detect Svelte/SvelteKit
107
+ */
108
+ function detectSvelte(projectRoot, deps) {
109
+ const evidence = [];
110
+ let confidence = 0;
111
+ // Check for SvelteKit (takes precedence)
112
+ if (deps['@sveltejs/kit']) {
113
+ evidence.push(`@sveltejs/kit@${deps['@sveltejs/kit']} in dependencies`);
114
+ confidence += 70;
115
+ const svelteConfig = findConfigFile(projectRoot, 'svelte.config', ['.js', '.ts']);
116
+ if (svelteConfig) {
117
+ evidence.push(`${svelteConfig} found`);
118
+ confidence += 30;
119
+ }
120
+ return {
121
+ name: 'SvelteKit',
122
+ version: deps['@sveltejs/kit'],
123
+ confidence: Math.min(confidence, 100),
124
+ evidence,
125
+ };
126
+ }
127
+ // Check for Svelte
128
+ if (deps.svelte) {
129
+ evidence.push(`svelte@${deps.svelte} in dependencies`);
130
+ confidence += 50;
131
+ const svelteConfig = findConfigFile(projectRoot, 'svelte.config', ['.js', '.ts']);
132
+ if (svelteConfig) {
133
+ evidence.push(`${svelteConfig} found`);
134
+ confidence += 30;
135
+ }
136
+ if (confidence === 0)
137
+ return null;
138
+ return {
139
+ name: 'Svelte',
140
+ version: deps.svelte,
141
+ confidence: Math.min(confidence, 100),
142
+ evidence,
143
+ };
144
+ }
145
+ return null;
146
+ }
147
+ /**
148
+ * Detect Remix
149
+ */
150
+ function detectRemix(projectRoot, deps) {
151
+ const evidence = [];
152
+ let confidence = 0;
153
+ if (deps['@remix-run/react'] || deps['@remix-run/node']) {
154
+ const version = deps['@remix-run/react'] || deps['@remix-run/node'];
155
+ evidence.push(`@remix-run packages@${version} in dependencies`);
156
+ confidence += 70;
157
+ // Check for remix config
158
+ const remixConfig = findConfigFile(projectRoot, 'remix.config', ['.js', '.ts']);
159
+ if (remixConfig) {
160
+ evidence.push(`${remixConfig} found`);
161
+ confidence += 20;
162
+ }
163
+ // Remix v2+ uses vite
164
+ const viteConfig = findConfigFile(projectRoot, 'vite.config', ['.js', '.ts', '.mjs']);
165
+ if (viteConfig && deps['@remix-run/dev']) {
166
+ evidence.push('Vite-based Remix setup detected');
167
+ confidence += 10;
168
+ }
169
+ return {
170
+ name: 'Remix',
171
+ version,
172
+ confidence: Math.min(confidence, 100),
173
+ evidence,
174
+ };
175
+ }
176
+ return null;
177
+ }
178
+ /**
179
+ * Detect Astro
180
+ */
181
+ function detectAstro(projectRoot, deps) {
182
+ const evidence = [];
183
+ let confidence = 0;
184
+ if (deps.astro) {
185
+ evidence.push(`astro@${deps.astro} in dependencies`);
186
+ confidence += 60;
187
+ const astroConfig = findConfigFile(projectRoot, 'astro.config', ['.mjs', '.js', '.ts']);
188
+ if (astroConfig) {
189
+ evidence.push(`${astroConfig} found`);
190
+ confidence += 30;
191
+ }
192
+ return {
193
+ name: 'Astro',
194
+ version: deps.astro,
195
+ confidence: Math.min(confidence, 100),
196
+ evidence,
197
+ };
198
+ }
199
+ return null;
200
+ }
201
+ /**
202
+ * Detect plain React (no framework)
203
+ */
204
+ function detectReact(projectRoot, deps) {
205
+ const evidence = [];
206
+ let confidence = 0;
207
+ if (deps.react) {
208
+ evidence.push(`react@${deps.react} in dependencies`);
209
+ confidence += 40;
210
+ // Check for common React setups
211
+ if (deps['react-scripts']) {
212
+ evidence.push('Create React App detected (react-scripts)');
213
+ confidence += 40;
214
+ return {
215
+ name: 'React',
216
+ version: deps.react,
217
+ variant: 'create-react-app',
218
+ confidence: Math.min(confidence, 100),
219
+ evidence,
220
+ };
221
+ }
222
+ // Vite + React
223
+ if (deps['@vitejs/plugin-react'] || deps['@vitejs/plugin-react-swc']) {
224
+ evidence.push('Vite + React setup detected');
225
+ confidence += 30;
226
+ return {
227
+ name: 'React',
228
+ version: deps.react,
229
+ variant: 'vite',
230
+ confidence: Math.min(confidence, 100),
231
+ evidence,
232
+ };
233
+ }
234
+ // Plain React
235
+ return {
236
+ name: 'React',
237
+ version: deps.react,
238
+ confidence: Math.min(confidence, 100),
239
+ evidence,
240
+ };
241
+ }
242
+ return null;
243
+ }
244
+ /**
245
+ * Framework detector
246
+ */
247
+ export const frameworkDetector = {
248
+ category: 'framework',
249
+ name: 'Framework Detector',
250
+ async detect(projectRoot) {
251
+ const pkg = readPackageJson(projectRoot);
252
+ if (!pkg) {
253
+ return null;
254
+ }
255
+ const deps = getDependencies(pkg);
256
+ // Order matters: check meta-frameworks first, then base frameworks
257
+ const detectors = [
258
+ detectNextJs,
259
+ detectRemix,
260
+ detectAstro,
261
+ detectVue, // Also handles Nuxt
262
+ detectSvelte, // Also handles SvelteKit
263
+ detectReact, // Check React last as it's often a dependency of frameworks
264
+ ];
265
+ for (const detector of detectors) {
266
+ const result = detector(projectRoot, deps);
267
+ if (result && result.confidence >= 40) {
268
+ return result;
269
+ }
270
+ }
271
+ return null;
272
+ },
273
+ };
274
+ export default frameworkDetector;
275
+ //# sourceMappingURL=framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/core/framework.ts"],"names":[],"mappings":"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"}