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,64 @@
1
+ /**
2
+ * Generator Orchestrator
3
+ * Main entry point for generating ralph configuration files
4
+ */
5
+ import type { ScanResult } from '../scanner/types.js';
6
+ import { type TemplateVariables } from './templates.js';
7
+ import { type RalphConfig } from './config.js';
8
+ import { type WriteSummary } from './writer.js';
9
+ export type { TemplateVariables } from './templates.js';
10
+ export type { RalphConfig } from './config.js';
11
+ export type { WriteOptions, WriteSummary, WriteResult } from './writer.js';
12
+ export { extractVariables, processTemplate, processTemplateFile, getTemplatesDir, } from './templates.js';
13
+ export { generateConfig, generateConfigFile } from './config.js';
14
+ export { writeFileWithOptions, formatWriteSummary, DEFAULT_WRITE_OPTIONS } from './writer.js';
15
+ /**
16
+ * Options for the generator
17
+ */
18
+ export interface GeneratorOptions {
19
+ /** Custom variables to add/override */
20
+ customVariables?: Record<string, string>;
21
+ /** How to handle existing files */
22
+ existingFiles?: 'backup' | 'skip' | 'overwrite';
23
+ /** Whether to generate config file */
24
+ generateConfig?: boolean;
25
+ /** Verbose output */
26
+ verbose?: boolean;
27
+ }
28
+ /**
29
+ * Result of generation
30
+ */
31
+ export interface GenerationResult {
32
+ /** Whether generation was successful */
33
+ success: boolean;
34
+ /** Template variables used */
35
+ variables: TemplateVariables;
36
+ /** Generated config */
37
+ config?: RalphConfig;
38
+ /** Write summary */
39
+ writeSummary: WriteSummary;
40
+ /** Errors encountered */
41
+ errors: string[];
42
+ /** Time taken in milliseconds */
43
+ generationTime: number;
44
+ }
45
+ /**
46
+ * Main Generator class
47
+ */
48
+ export declare class Generator {
49
+ private options;
50
+ constructor(options?: GeneratorOptions);
51
+ /**
52
+ * Generate all ralph files from scan result
53
+ */
54
+ generate(scanResult: ScanResult): Promise<GenerationResult>;
55
+ }
56
+ /**
57
+ * Convenience function to generate ralph files
58
+ */
59
+ export declare function generateRalph(scanResult: ScanResult, options?: GeneratorOptions): Promise<GenerationResult>;
60
+ /**
61
+ * Format generation result for display
62
+ */
63
+ export declare function formatGenerationResult(result: GenerationResult): string;
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,mCAAmC;IACnC,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAChD,sCAAsC;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAYD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,uBAAuB;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oBAAoB;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAmB;gBAEtB,OAAO,GAAE,gBAAqB;IAI1C;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA8ElE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAG3B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAwCvE"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Generator Orchestrator
3
+ * Main entry point for generating ralph configuration files
4
+ */
5
+ import { extractVariables, processAllTemplates, getTemplatesDir, } from './templates.js';
6
+ import { generateConfig, generateConfigFile } from './config.js';
7
+ import { writeFiles, createDirectoryStructure, mapTemplateOutputPaths, formatWriteSummary, } from './writer.js';
8
+ export { extractVariables, processTemplate, processTemplateFile, getTemplatesDir, } from './templates.js';
9
+ export { generateConfig, generateConfigFile } from './config.js';
10
+ export { writeFileWithOptions, formatWriteSummary, DEFAULT_WRITE_OPTIONS } from './writer.js';
11
+ /**
12
+ * Default generator options
13
+ */
14
+ const DEFAULT_GENERATOR_OPTIONS = {
15
+ customVariables: {},
16
+ existingFiles: 'backup',
17
+ generateConfig: true,
18
+ verbose: false,
19
+ };
20
+ /**
21
+ * Main Generator class
22
+ */
23
+ export class Generator {
24
+ options;
25
+ constructor(options = {}) {
26
+ this.options = { ...DEFAULT_GENERATOR_OPTIONS, ...options };
27
+ }
28
+ /**
29
+ * Generate all ralph files from scan result
30
+ */
31
+ async generate(scanResult) {
32
+ const startTime = Date.now();
33
+ const errors = [];
34
+ // Extract variables from scan result
35
+ const variables = extractVariables(scanResult, this.options.customVariables || {});
36
+ // Get templates directory
37
+ const templatesDir = getTemplatesDir();
38
+ // Process all templates
39
+ let processedTemplates;
40
+ try {
41
+ processedTemplates = await processAllTemplates(templatesDir, variables);
42
+ }
43
+ catch (error) {
44
+ errors.push(`Failed to process templates: ${error instanceof Error ? error.message : String(error)}`);
45
+ return {
46
+ success: false,
47
+ variables,
48
+ writeSummary: {
49
+ total: 0,
50
+ created: 0,
51
+ backedUp: 0,
52
+ skipped: 0,
53
+ overwritten: 0,
54
+ errors: 1,
55
+ results: [],
56
+ },
57
+ errors,
58
+ generationTime: Date.now() - startTime,
59
+ };
60
+ }
61
+ // Generate config if requested
62
+ let config;
63
+ if (this.options.generateConfig) {
64
+ config = generateConfig(scanResult, this.options.customVariables || {});
65
+ const configContent = generateConfigFile(config);
66
+ processedTemplates.set('config/ralph.config.js', configContent);
67
+ }
68
+ // Map template outputs to final paths
69
+ const mappedOutputs = mapTemplateOutputPaths(processedTemplates);
70
+ // Create directory structure
71
+ try {
72
+ await createDirectoryStructure(scanResult.projectRoot);
73
+ }
74
+ catch (error) {
75
+ errors.push(`Failed to create directory structure: ${error instanceof Error ? error.message : String(error)}`);
76
+ }
77
+ // Write all files
78
+ const writeOptions = {
79
+ existingFiles: this.options.existingFiles || 'backup',
80
+ createBackups: this.options.existingFiles === 'backup',
81
+ verbose: this.options.verbose || false,
82
+ };
83
+ const writeSummary = await writeFiles(mappedOutputs, scanResult.projectRoot, writeOptions);
84
+ // Add any write errors to errors list
85
+ for (const result of writeSummary.results) {
86
+ if (result.action === 'error' && result.error) {
87
+ errors.push(`Failed to write ${result.path}: ${result.error}`);
88
+ }
89
+ }
90
+ const generationTime = Date.now() - startTime;
91
+ return {
92
+ success: errors.length === 0,
93
+ variables,
94
+ config,
95
+ writeSummary,
96
+ errors,
97
+ generationTime,
98
+ };
99
+ }
100
+ }
101
+ /**
102
+ * Convenience function to generate ralph files
103
+ */
104
+ export async function generateRalph(scanResult, options = {}) {
105
+ const generator = new Generator(options);
106
+ return generator.generate(scanResult);
107
+ }
108
+ /**
109
+ * Format generation result for display
110
+ */
111
+ export function formatGenerationResult(result) {
112
+ const lines = [];
113
+ if (result.success) {
114
+ lines.push('Generation completed successfully!');
115
+ }
116
+ else {
117
+ lines.push('Generation completed with errors.');
118
+ }
119
+ lines.push(`Time: ${result.generationTime}ms`);
120
+ lines.push('');
121
+ // Show stack info
122
+ lines.push('Detected Stack:');
123
+ lines.push(` Framework: ${result.variables.framework}${result.variables.frameworkVersion ? ' ' + result.variables.frameworkVersion : ''}`);
124
+ lines.push(` Package Manager: ${result.variables.packageManager}`);
125
+ if (result.variables.unitTest !== 'none') {
126
+ lines.push(` Unit Testing: ${result.variables.unitTest}`);
127
+ }
128
+ if (result.variables.e2eTest !== 'none') {
129
+ lines.push(` E2E Testing: ${result.variables.e2eTest}`);
130
+ }
131
+ if (result.variables.styling !== 'css') {
132
+ lines.push(` Styling: ${result.variables.styling}`);
133
+ }
134
+ lines.push('');
135
+ // Show write summary
136
+ lines.push(formatWriteSummary(result.writeSummary));
137
+ // Show errors
138
+ if (result.errors.length > 0) {
139
+ lines.push('');
140
+ lines.push('Errors:');
141
+ for (const error of result.errors) {
142
+ lines.push(` - ${error}`);
143
+ }
144
+ }
145
+ return lines.join('\n');
146
+ }
147
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Template Processing System
3
+ * Reads template files with {{variable}} placeholders and substitutes values
4
+ */
5
+ import type { ScanResult } from '../scanner/types.js';
6
+ /**
7
+ * Template variables available for substitution
8
+ */
9
+ export interface TemplateVariables {
10
+ projectName: string;
11
+ projectRoot: string;
12
+ framework: string;
13
+ frameworkVersion: string;
14
+ frameworkVariant: string;
15
+ packageManager: string;
16
+ packageManagerVersion: string;
17
+ unitTest: string;
18
+ unitTestVersion: string;
19
+ e2eTest: string;
20
+ e2eTestVersion: string;
21
+ styling: string;
22
+ stylingVersion: string;
23
+ stylingVariant: string;
24
+ devCommand: string;
25
+ buildCommand: string;
26
+ testCommand: string;
27
+ lintCommand: string;
28
+ typecheckCommand: string;
29
+ formatCommand: string;
30
+ appDir: string;
31
+ [key: string]: string;
32
+ }
33
+ /**
34
+ * Extract template variables from scan result
35
+ */
36
+ export declare function extractVariables(scanResult: ScanResult, customVars?: Record<string, string>): TemplateVariables;
37
+ /**
38
+ * Process a template string with variable substitution
39
+ */
40
+ export declare function processTemplate(template: string, variables: TemplateVariables): string;
41
+ /**
42
+ * Read and process a template file
43
+ */
44
+ export declare function processTemplateFile(templatePath: string, variables: TemplateVariables): Promise<string>;
45
+ /**
46
+ * Get the templates directory path
47
+ */
48
+ export declare function getTemplatesDir(): string;
49
+ /**
50
+ * Template file info
51
+ */
52
+ export interface TemplateFile {
53
+ /** Source template path */
54
+ sourcePath: string;
55
+ /** Relative path from templates directory */
56
+ relativePath: string;
57
+ /** Output path (without .tmpl extension) */
58
+ outputPath: string;
59
+ /** Category (prompts, guides, specs, config) */
60
+ category: string;
61
+ }
62
+ /**
63
+ * Discover all template files
64
+ */
65
+ export declare function discoverTemplates(templatesDir: string): Promise<TemplateFile[]>;
66
+ /**
67
+ * Process all templates and return their contents
68
+ */
69
+ export declare function processAllTemplates(templatesDir: string, variables: TemplateVariables): Promise<Map<string, string>>;
70
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/generator/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,qBAAqB,CAAC;AAKrE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAEhC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAGpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IAGzB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAG9B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IAGvB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IAGvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IAGtB,MAAM,EAAE,MAAM,CAAC;IAGf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAyCD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,iBAAiB,CAmDnH;AAsKD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,MAAM,CAWtF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7G;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA2BrF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAU9B"}
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Template Processing System
3
+ * Reads template files with {{variable}} placeholders and substitutes values
4
+ */
5
+ import { readFile, readdir } from 'node:fs/promises';
6
+ import { join, dirname } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ /**
11
+ * Default template variables
12
+ */
13
+ const DEFAULT_VARIABLES = {
14
+ framework: 'unknown',
15
+ frameworkVersion: '',
16
+ frameworkVariant: '',
17
+ packageManager: 'npm',
18
+ packageManagerVersion: '',
19
+ unitTest: 'none',
20
+ unitTestVersion: '',
21
+ e2eTest: 'none',
22
+ e2eTestVersion: '',
23
+ styling: 'css',
24
+ stylingVersion: '',
25
+ stylingVariant: '',
26
+ appDir: 'app',
27
+ };
28
+ /**
29
+ * Derive commands from package manager
30
+ */
31
+ function deriveCommands(packageManager) {
32
+ const pm = packageManager.toLowerCase();
33
+ const run = pm === 'npm' ? 'npm run' : pm;
34
+ return {
35
+ devCommand: `${run} dev`,
36
+ buildCommand: `${run} build`,
37
+ testCommand: pm === 'npm' ? 'npm test' : `${pm} test`,
38
+ lintCommand: `${run} lint`,
39
+ typecheckCommand: pm === 'npm' ? 'npx tsc --noEmit' : `${pm} tsc --noEmit`,
40
+ formatCommand: pm === 'npm' ? 'npx prettier --write .' : `${pm} prettier --write .`,
41
+ };
42
+ }
43
+ /**
44
+ * Extract template variables from scan result
45
+ */
46
+ export function extractVariables(scanResult, customVars = {}) {
47
+ const { stack, projectRoot } = scanResult;
48
+ // Extract project name from path
49
+ const projectName = projectRoot.split('/').pop() || 'project';
50
+ // Extract framework info
51
+ const framework = stack.framework?.name || DEFAULT_VARIABLES.framework;
52
+ const frameworkVersion = stack.framework?.version || DEFAULT_VARIABLES.frameworkVersion;
53
+ const frameworkVariant = stack.framework?.variant || DEFAULT_VARIABLES.frameworkVariant;
54
+ // Extract package manager info
55
+ const packageManager = stack.packageManager?.name || DEFAULT_VARIABLES.packageManager;
56
+ const packageManagerVersion = stack.packageManager?.version || DEFAULT_VARIABLES.packageManagerVersion;
57
+ // Extract testing info
58
+ const unitTest = stack.testing?.unit?.name || DEFAULT_VARIABLES.unitTest;
59
+ const unitTestVersion = stack.testing?.unit?.version || DEFAULT_VARIABLES.unitTestVersion;
60
+ const e2eTest = stack.testing?.e2e?.name || DEFAULT_VARIABLES.e2eTest;
61
+ const e2eTestVersion = stack.testing?.e2e?.version || DEFAULT_VARIABLES.e2eTestVersion;
62
+ // Extract styling info
63
+ const styling = stack.styling?.name || DEFAULT_VARIABLES.styling;
64
+ const stylingVersion = stack.styling?.version || DEFAULT_VARIABLES.stylingVersion;
65
+ const stylingVariant = stack.styling?.variant || DEFAULT_VARIABLES.stylingVariant;
66
+ // Derive commands
67
+ const commands = deriveCommands(packageManager);
68
+ // Determine app directory
69
+ const appDir = frameworkVariant === 'app-router' || framework.toLowerCase().includes('next') ? 'app' : 'src';
70
+ return {
71
+ projectName,
72
+ projectRoot,
73
+ framework,
74
+ frameworkVersion,
75
+ frameworkVariant,
76
+ packageManager,
77
+ packageManagerVersion,
78
+ unitTest,
79
+ unitTestVersion,
80
+ e2eTest,
81
+ e2eTestVersion,
82
+ styling,
83
+ stylingVersion,
84
+ stylingVariant,
85
+ appDir,
86
+ ...commands,
87
+ ...customVars,
88
+ };
89
+ }
90
+ /**
91
+ * Check if a value is considered "truthy" for template conditionals
92
+ */
93
+ function isTruthyValue(value) {
94
+ return Boolean(value && value !== 'none' && value !== 'unknown' && value !== '');
95
+ }
96
+ /**
97
+ * Find matching closing tag for nested blocks
98
+ * Returns the index of the matching {{/tag}} or -1 if not found
99
+ */
100
+ function findMatchingClose(content, openTag, closeTag, startIndex = 0) {
101
+ let depth = 1;
102
+ let i = startIndex;
103
+ while (i < content.length && depth > 0) {
104
+ const openMatch = content.indexOf(openTag, i);
105
+ const closeMatch = content.indexOf(closeTag, i);
106
+ if (closeMatch === -1) {
107
+ return -1; // No more closing tags
108
+ }
109
+ if (openMatch !== -1 && openMatch < closeMatch) {
110
+ // Found another opening tag before the closing tag
111
+ depth++;
112
+ i = openMatch + openTag.length;
113
+ }
114
+ else {
115
+ // Found a closing tag
116
+ depth--;
117
+ if (depth === 0) {
118
+ return closeMatch;
119
+ }
120
+ i = closeMatch + closeTag.length;
121
+ }
122
+ }
123
+ return -1;
124
+ }
125
+ /**
126
+ * Process a single if block (handles nesting via recursion)
127
+ */
128
+ function processIfBlock(template, variables, startIndex, varName) {
129
+ const openTagEnd = template.indexOf('}}', startIndex) + 2;
130
+ const closeTag = '{{/if}}';
131
+ // Find the matching close tag (handling nesting)
132
+ let searchStart = openTagEnd;
133
+ let closeIndex = findMatchingClose(template, '{{#if', closeTag, searchStart);
134
+ if (closeIndex === -1) {
135
+ // No matching close, return as-is
136
+ return { result: template.slice(startIndex, openTagEnd), endIndex: openTagEnd };
137
+ }
138
+ const innerContent = template.slice(openTagEnd, closeIndex);
139
+ // Check for else clause (not inside nested if)
140
+ let elseIndex = -1;
141
+ let depth = 0;
142
+ for (let i = 0; i < innerContent.length; i++) {
143
+ if (innerContent.slice(i, i + 5) === '{{#if') {
144
+ depth++;
145
+ }
146
+ else if (innerContent.slice(i, i + 7) === '{{/if}}') {
147
+ depth--;
148
+ }
149
+ else if (depth === 0 && innerContent.slice(i, i + 8) === '{{else}}') {
150
+ elseIndex = i;
151
+ break;
152
+ }
153
+ }
154
+ const value = variables[varName];
155
+ const isTruthy = isTruthyValue(value);
156
+ let selectedContent;
157
+ if (elseIndex !== -1) {
158
+ const ifPart = innerContent.slice(0, elseIndex);
159
+ const elsePart = innerContent.slice(elseIndex + 8);
160
+ selectedContent = isTruthy ? ifPart : elsePart;
161
+ }
162
+ else {
163
+ selectedContent = isTruthy ? innerContent : '';
164
+ }
165
+ return { result: selectedContent, endIndex: closeIndex + closeTag.length };
166
+ }
167
+ /**
168
+ * Process conditional blocks in template
169
+ * Supports: {{#if variable}}...{{/if}} and {{#if variable}}...{{else}}...{{/if}}
170
+ * Handles nested conditionals correctly
171
+ */
172
+ function processConditionals(template, variables) {
173
+ let result = '';
174
+ let i = 0;
175
+ while (i < template.length) {
176
+ // Look for {{#if
177
+ const ifMatch = template.slice(i).match(/^\{\{#if\s+(\w+)\}\}/);
178
+ if (ifMatch) {
179
+ const varName = ifMatch[1];
180
+ const { result: blockResult, endIndex } = processIfBlock(template, variables, i, varName);
181
+ // Recursively process the content for nested conditionals
182
+ result += processConditionals(blockResult, variables);
183
+ i += endIndex - i;
184
+ continue;
185
+ }
186
+ // Look for {{#unless
187
+ const unlessMatch = template.slice(i).match(/^\{\{#unless\s+(\w+)\}\}/);
188
+ if (unlessMatch) {
189
+ const varName = unlessMatch[1];
190
+ const openTagEnd = i + unlessMatch[0].length;
191
+ const closeTag = '{{/unless}}';
192
+ const closeIndex = template.indexOf(closeTag, openTagEnd);
193
+ if (closeIndex !== -1) {
194
+ const innerContent = template.slice(openTagEnd, closeIndex);
195
+ const value = variables[varName];
196
+ const isTruthy = isTruthyValue(value);
197
+ if (!isTruthy) {
198
+ result += processConditionals(innerContent, variables);
199
+ }
200
+ i = closeIndex + closeTag.length;
201
+ continue;
202
+ }
203
+ }
204
+ // Regular character, copy it
205
+ result += template[i];
206
+ i++;
207
+ }
208
+ return result;
209
+ }
210
+ /**
211
+ * Process variable substitution in template
212
+ * Supports: {{variable}} and {{variable || default}}
213
+ */
214
+ function processVariables(template, variables) {
215
+ // Process variables with defaults
216
+ const defaultRegex = /\{\{(\w+)\s*\|\|\s*([^}]+)\}\}/g;
217
+ let result = template.replace(defaultRegex, (_, varName, defaultValue) => {
218
+ const value = variables[varName];
219
+ return value && value !== '' ? value : defaultValue.trim();
220
+ });
221
+ // Process simple variables
222
+ const varRegex = /\{\{(\w+)\}\}/g;
223
+ result = result.replace(varRegex, (_, varName) => {
224
+ const value = variables[varName];
225
+ return value !== undefined ? value : '';
226
+ });
227
+ return result;
228
+ }
229
+ /**
230
+ * Process a template string with variable substitution
231
+ */
232
+ export function processTemplate(template, variables) {
233
+ // First process conditionals
234
+ let result = processConditionals(template, variables);
235
+ // Then substitute variables
236
+ result = processVariables(result, variables);
237
+ // Clean up multiple blank lines
238
+ result = result.replace(/\n{3,}/g, '\n\n');
239
+ return result;
240
+ }
241
+ /**
242
+ * Read and process a template file
243
+ */
244
+ export async function processTemplateFile(templatePath, variables) {
245
+ const template = await readFile(templatePath, 'utf-8');
246
+ return processTemplate(template, variables);
247
+ }
248
+ /**
249
+ * Get the templates directory path
250
+ */
251
+ export function getTemplatesDir() {
252
+ // In development (src), templates are at src/templates
253
+ // In production (dist), templates are at dist/templates
254
+ const srcTemplates = join(__dirname, '..', 'templates');
255
+ return srcTemplates;
256
+ }
257
+ /**
258
+ * Discover all template files
259
+ */
260
+ export async function discoverTemplates(templatesDir) {
261
+ const templates = [];
262
+ async function scanDir(dir, category = '') {
263
+ const entries = await readdir(dir, { withFileTypes: true });
264
+ for (const entry of entries) {
265
+ const fullPath = join(dir, entry.name);
266
+ if (entry.isDirectory()) {
267
+ await scanDir(fullPath, entry.name);
268
+ }
269
+ else if (entry.name.endsWith('.tmpl')) {
270
+ const relativePath = fullPath.slice(templatesDir.length + 1);
271
+ const outputPath = relativePath.replace(/\.tmpl$/, '');
272
+ templates.push({
273
+ sourcePath: fullPath,
274
+ relativePath,
275
+ outputPath,
276
+ category,
277
+ });
278
+ }
279
+ }
280
+ }
281
+ await scanDir(templatesDir);
282
+ return templates;
283
+ }
284
+ /**
285
+ * Process all templates and return their contents
286
+ */
287
+ export async function processAllTemplates(templatesDir, variables) {
288
+ const templates = await discoverTemplates(templatesDir);
289
+ const processed = new Map();
290
+ for (const template of templates) {
291
+ const content = await processTemplateFile(template.sourcePath, variables);
292
+ processed.set(template.outputPath, content);
293
+ }
294
+ return processed;
295
+ }
296
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/generator/templates.ts"],"names":[],"mappings":"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"}