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,16 @@
1
+ /**
2
+ * Init Command
3
+ * Initialize Ralph in the current project - scans and generates configuration
4
+ */
5
+ import { type AIProvider } from '../ai/index.js';
6
+ export interface InitOptions {
7
+ ai?: boolean;
8
+ provider?: AIProvider;
9
+ yes?: boolean;
10
+ }
11
+ /**
12
+ * Initialize Ralph in the current project
13
+ * Scans the project and generates configuration
14
+ */
15
+ export declare function initCommand(options: InitOptions): Promise<void>;
16
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyHrE"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Init Command
3
+ * Initialize Ralph in the current project - scans and generates configuration
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ import { Scanner, formatScanResult } from '../scanner/index.js';
7
+ import { Generator, formatGenerationResult } from '../generator/index.js';
8
+ import { AIEnhancer, formatAIAnalysis, } from '../ai/index.js';
9
+ import * as prompts from '@clack/prompts';
10
+ import pc from 'picocolors';
11
+ /**
12
+ * Initialize Ralph in the current project
13
+ * Scans the project and generates configuration
14
+ */
15
+ export async function initCommand(options) {
16
+ const projectRoot = process.cwd();
17
+ logger.info('Initializing Ralph...');
18
+ logger.info(`Project: ${projectRoot}`);
19
+ console.log('');
20
+ // Step 1: Scan the project
21
+ const spinner = prompts.spinner();
22
+ spinner.start('Scanning project...');
23
+ const scanner = new Scanner();
24
+ let scanResult;
25
+ try {
26
+ scanResult = await scanner.scan(projectRoot);
27
+ spinner.stop('Project scanned successfully');
28
+ }
29
+ catch (error) {
30
+ spinner.stop('Scan failed');
31
+ logger.error(`Failed to scan project: ${error instanceof Error ? error.message : String(error)}`);
32
+ process.exit(1);
33
+ }
34
+ // Display scan results
35
+ console.log('');
36
+ console.log(pc.cyan('--- Scan Results ---'));
37
+ console.log(formatScanResult(scanResult));
38
+ console.log('');
39
+ // Step 2: AI Enhancement (if enabled)
40
+ let enhancedResult;
41
+ if (options.ai) {
42
+ const provider = options.provider || 'anthropic';
43
+ console.log(pc.cyan(`--- AI Enhancement (${provider}) ---`));
44
+ const aiEnhancer = new AIEnhancer({
45
+ provider,
46
+ verbose: true,
47
+ });
48
+ // Check if API key is available
49
+ if (!aiEnhancer.isAvailable()) {
50
+ const envVar = aiEnhancer.getRequiredEnvVar();
51
+ logger.warn(`AI enhancement skipped: ${envVar} not set`);
52
+ logger.info(`To enable AI enhancement, set the ${envVar} environment variable`);
53
+ console.log('');
54
+ }
55
+ else {
56
+ spinner.start('Running AI analysis...');
57
+ try {
58
+ enhancedResult = await aiEnhancer.enhance(scanResult);
59
+ if (enhancedResult.aiEnhanced && enhancedResult.aiAnalysis) {
60
+ spinner.stop('AI analysis complete');
61
+ console.log('');
62
+ console.log(formatAIAnalysis(enhancedResult.aiAnalysis));
63
+ // Use enhanced result for generation
64
+ scanResult = enhancedResult;
65
+ }
66
+ else if (enhancedResult.aiError) {
67
+ spinner.stop('AI analysis failed');
68
+ logger.warn(`AI enhancement error: ${enhancedResult.aiError}`);
69
+ console.log('');
70
+ }
71
+ }
72
+ catch (error) {
73
+ spinner.stop('AI analysis failed');
74
+ logger.warn(`AI enhancement error: ${error instanceof Error ? error.message : String(error)}`);
75
+ console.log('');
76
+ }
77
+ }
78
+ }
79
+ // Step 3: Confirm with user (unless --yes)
80
+ if (!options.yes) {
81
+ const shouldContinue = await prompts.confirm({
82
+ message: 'Generate Ralph configuration files?',
83
+ initialValue: true,
84
+ });
85
+ if (prompts.isCancel(shouldContinue) || !shouldContinue) {
86
+ logger.info('Initialization cancelled');
87
+ return;
88
+ }
89
+ }
90
+ // Step 4: Generate configuration files
91
+ console.log('');
92
+ spinner.start('Generating configuration files...');
93
+ const generator = new Generator({
94
+ existingFiles: 'backup',
95
+ generateConfig: true,
96
+ verbose: false,
97
+ });
98
+ try {
99
+ const generationResult = await generator.generate(scanResult);
100
+ spinner.stop('Configuration files generated');
101
+ console.log('');
102
+ console.log(pc.cyan('--- Generation Results ---'));
103
+ console.log(formatGenerationResult(generationResult));
104
+ if (generationResult.success) {
105
+ console.log('');
106
+ logger.success('Ralph initialized successfully!');
107
+ console.log('');
108
+ console.log('Next steps:');
109
+ console.log(' 1. Review the generated files in .ralph/');
110
+ console.log(' 2. Customize the prompts in .ralph/prompts/');
111
+ console.log(' 3. Run "ralph new <feature>" to create a feature spec');
112
+ console.log(' 4. Run "ralph run <feature>" to start development');
113
+ }
114
+ else {
115
+ logger.warn('Initialization completed with some errors');
116
+ }
117
+ }
118
+ catch (error) {
119
+ spinner.stop('Generation failed');
120
+ logger.error(`Failed to generate files: ${error instanceof Error ? error.message : String(error)}`);
121
+ process.exit(1);
122
+ }
123
+ }
124
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Monitor Command
3
+ * Display real-time status of a feature loop
4
+ */
5
+ export interface MonitorOptions {
6
+ /** Use bash script monitor instead of built-in */
7
+ bash?: boolean;
8
+ /** Use Python TUI monitor */
9
+ python?: boolean;
10
+ /** Refresh interval in seconds */
11
+ interval?: number;
12
+ }
13
+ /**
14
+ * Launch the monitoring dashboard for a feature
15
+ */
16
+ export declare function monitorCommand(feature: string, options?: MonitorOptions): Promise<void>;
17
+ //# sourceMappingURL=monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6BAA6B;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2SD;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FjG"}
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Monitor Command
3
+ * Display real-time status of a feature loop
4
+ */
5
+ import { spawn, execFileSync } from 'node:child_process';
6
+ import { existsSync, readFileSync } from 'node:fs';
7
+ import { join, dirname } from 'node:path';
8
+ import { logger } from '../utils/logger.js';
9
+ import { loadConfigWithDefaults } from '../utils/config.js';
10
+ import pc from 'picocolors';
11
+ /**
12
+ * Find the ralph-monitor.sh script
13
+ */
14
+ function findMonitorScript(projectRoot) {
15
+ // Check .ralph/scripts first
16
+ const localScript = join(projectRoot, '.ralph', 'scripts', 'ralph-monitor.sh');
17
+ if (existsSync(localScript)) {
18
+ return localScript;
19
+ }
20
+ // Check for ralph directory as sibling (development setup)
21
+ const siblingRalph = join(projectRoot, '..', 'ralph', 'ralph-monitor.sh');
22
+ if (existsSync(siblingRalph)) {
23
+ return siblingRalph;
24
+ }
25
+ // Check in current directory (ralph repo)
26
+ const currentRalph = join(projectRoot, 'ralph-monitor.sh');
27
+ if (existsSync(currentRalph)) {
28
+ return currentRalph;
29
+ }
30
+ return null;
31
+ }
32
+ /**
33
+ * Check if a process matching pattern is running
34
+ * Uses pgrep with -f flag for full command line matching
35
+ */
36
+ function isProcessRunning(pattern) {
37
+ try {
38
+ // Use execFileSync for safer execution
39
+ const result = execFileSync('pgrep', ['-f', pattern], { encoding: 'utf-8' });
40
+ return result.trim().length > 0;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ /**
47
+ * Detect current phase of the loop
48
+ */
49
+ function detectPhase(feature) {
50
+ if (isProcessRunning('PROMPT_feature.md'))
51
+ return 'Planning';
52
+ if (isProcessRunning('PROMPT_e2e.md'))
53
+ return 'E2E Testing';
54
+ if (isProcessRunning('PROMPT_verify.md'))
55
+ return 'Verification';
56
+ if (isProcessRunning('PROMPT_review.md'))
57
+ return 'PR Review';
58
+ if (isProcessRunning('PROMPT.md'))
59
+ return 'Implementation';
60
+ if (isProcessRunning(`feature-loop.sh.*${feature}`))
61
+ return 'Running';
62
+ return 'Idle';
63
+ }
64
+ /**
65
+ * Read status from temp files
66
+ */
67
+ function readStatus(feature) {
68
+ const statusFile = `/tmp/ralph-loop-${feature}.status`;
69
+ const tokensFile = `/tmp/ralph-loop-${feature}.tokens`;
70
+ let iteration = 0;
71
+ let maxIterations = 50;
72
+ // Read status file
73
+ if (existsSync(statusFile)) {
74
+ try {
75
+ const content = readFileSync(statusFile, 'utf-8').trim();
76
+ const parts = content.split('|');
77
+ iteration = parseInt(parts[0]) || 0;
78
+ maxIterations = parseInt(parts[1]) || 50;
79
+ }
80
+ catch {
81
+ // Ignore errors
82
+ }
83
+ }
84
+ // Read tokens file
85
+ let tokensInput = 0;
86
+ let tokensOutput = 0;
87
+ if (existsSync(tokensFile)) {
88
+ try {
89
+ const content = readFileSync(tokensFile, 'utf-8').trim();
90
+ const parts = content.split('|');
91
+ tokensInput = parseInt(parts[0]) || 0;
92
+ tokensOutput = parseInt(parts[1]) || 0;
93
+ }
94
+ catch {
95
+ // Ignore errors
96
+ }
97
+ }
98
+ return {
99
+ running: isProcessRunning(`feature-loop.sh.*${feature}`),
100
+ phase: detectPhase(feature),
101
+ iteration,
102
+ maxIterations,
103
+ tokensInput,
104
+ tokensOutput,
105
+ tasksDone: 0,
106
+ tasksPending: 0,
107
+ e2eDone: 0,
108
+ e2ePending: 0,
109
+ branch: '',
110
+ elapsed: '',
111
+ };
112
+ }
113
+ /**
114
+ * Parse implementation plan for task counts
115
+ */
116
+ async function parseImplementationPlan(projectRoot, feature) {
117
+ const config = await loadConfigWithDefaults(projectRoot);
118
+ const planPath = join(projectRoot, config.paths.specs, `${feature}-implementation-plan.md`);
119
+ let tasksDone = 0;
120
+ let tasksPending = 0;
121
+ let e2eDone = 0;
122
+ let e2ePending = 0;
123
+ if (existsSync(planPath)) {
124
+ try {
125
+ const content = readFileSync(planPath, 'utf-8');
126
+ const lines = content.split('\n');
127
+ for (const line of lines) {
128
+ if (line.match(/^- \[x\]/)) {
129
+ if (line.includes('E2E:')) {
130
+ e2eDone++;
131
+ }
132
+ else {
133
+ tasksDone++;
134
+ }
135
+ }
136
+ else if (line.match(/^- \[ \]/)) {
137
+ if (line.includes('E2E:')) {
138
+ e2ePending++;
139
+ }
140
+ else {
141
+ tasksPending++;
142
+ }
143
+ }
144
+ }
145
+ }
146
+ catch {
147
+ // Ignore errors
148
+ }
149
+ }
150
+ return { tasksDone, tasksPending, e2eDone, e2ePending };
151
+ }
152
+ /**
153
+ * Get current git branch
154
+ */
155
+ function getGitBranch(projectRoot) {
156
+ try {
157
+ // Try app directory first
158
+ const appDir = join(projectRoot, '..', 'app');
159
+ if (existsSync(appDir)) {
160
+ return execFileSync('git', ['branch', '--show-current'], {
161
+ cwd: appDir,
162
+ encoding: 'utf-8',
163
+ }).trim();
164
+ }
165
+ return execFileSync('git', ['branch', '--show-current'], {
166
+ cwd: projectRoot,
167
+ encoding: 'utf-8',
168
+ }).trim();
169
+ }
170
+ catch {
171
+ return '-';
172
+ }
173
+ }
174
+ /**
175
+ * Format number with K/M suffix
176
+ */
177
+ function formatNumber(num) {
178
+ if (num >= 1000000) {
179
+ return (num / 1000000).toFixed(1) + 'M';
180
+ }
181
+ if (num >= 1000) {
182
+ return (num / 1000).toFixed(1) + 'K';
183
+ }
184
+ return String(num);
185
+ }
186
+ /**
187
+ * Create a progress bar
188
+ */
189
+ function progressBar(percent, width = 15) {
190
+ const filled = Math.round((percent / 100) * width);
191
+ const empty = width - filled;
192
+ return pc.green('\u2588'.repeat(filled)) + pc.dim('\u2591'.repeat(empty));
193
+ }
194
+ /**
195
+ * Display built-in monitor dashboard
196
+ */
197
+ async function displayDashboard(feature, projectRoot, interval = 5) {
198
+ const status = readStatus(feature);
199
+ const tasks = await parseImplementationPlan(projectRoot, feature);
200
+ const branch = getGitBranch(projectRoot);
201
+ // Calculate progress
202
+ const totalTasks = tasks.tasksDone + tasks.tasksPending;
203
+ const totalE2e = tasks.e2eDone + tasks.e2ePending;
204
+ const totalAll = totalTasks + totalE2e;
205
+ const doneAll = tasks.tasksDone + tasks.e2eDone;
206
+ const percentTasks = totalTasks > 0 ? Math.round((tasks.tasksDone / totalTasks) * 100) : 0;
207
+ const percentE2e = totalE2e > 0 ? Math.round((tasks.e2eDone / totalE2e) * 100) : 0;
208
+ const percentAll = totalAll > 0 ? Math.round((doneAll / totalAll) * 100) : 0;
209
+ // Clear screen
210
+ console.clear();
211
+ // Header
212
+ const timestamp = new Date().toLocaleTimeString();
213
+ console.log(pc.bold('='.repeat(78)));
214
+ console.log(pc.bold(' ') +
215
+ pc.cyan('RALPH MONITOR') +
216
+ `: ${pc.bold(feature)}` +
217
+ ` ${pc.dim(timestamp)}`);
218
+ console.log(pc.bold('='.repeat(78)));
219
+ console.log('');
220
+ // Status line
221
+ const phaseColors = {
222
+ Planning: pc.blue,
223
+ Implementation: pc.yellow,
224
+ 'E2E Testing': pc.cyan,
225
+ Verification: pc.magenta,
226
+ 'PR Review': pc.green,
227
+ Idle: pc.dim,
228
+ Running: pc.white,
229
+ };
230
+ const phaseColor = phaseColors[status.phase] || pc.white;
231
+ console.log(` Phase: ${phaseColor(pc.bold(status.phase))}` +
232
+ ` | Iter: ${pc.bold(String(status.iteration))}/${pc.dim(String(status.maxIterations))}` +
233
+ ` | Branch: ${pc.cyan(branch)}`);
234
+ const totalTokens = status.tokensInput + status.tokensOutput;
235
+ console.log(` Tokens: ${pc.magenta(formatNumber(totalTokens))}` +
236
+ pc.dim(` (in:${formatNumber(status.tokensInput)} out:${formatNumber(status.tokensOutput)})`));
237
+ console.log(pc.dim(' ' + '-'.repeat(74)));
238
+ // Progress
239
+ console.log('');
240
+ console.log(` ${pc.bold('Implementation:')} ${progressBar(percentTasks)} ${pc.bold(percentTasks + '%')}` +
241
+ ` ${pc.green('\u2713 ' + tasks.tasksDone)} / ${pc.yellow('\u25cb ' + tasks.tasksPending)}`);
242
+ if (totalE2e > 0) {
243
+ console.log(` ${pc.bold('E2E Tests: ')} ${progressBar(percentE2e)} ${pc.bold(percentE2e + '%')}` +
244
+ ` ${pc.green('\u2713 ' + tasks.e2eDone)} / ${pc.yellow('\u25cb ' + tasks.e2ePending)}`);
245
+ }
246
+ console.log(pc.dim(' ' + '-'.repeat(40)));
247
+ console.log(` ${pc.bold('Overall: ')} ${progressBar(percentAll)} ${pc.bold(percentAll + '%')}` +
248
+ ` ${pc.green('\u2713 ' + doneAll)} / ${pc.yellow('\u25cb ' + (totalAll - doneAll))}`);
249
+ // Status indicator
250
+ console.log('');
251
+ if (status.running) {
252
+ console.log(pc.green(' \u25cf Loop is running'));
253
+ }
254
+ else {
255
+ console.log(pc.yellow(' \u25cb Loop is not running'));
256
+ }
257
+ console.log('');
258
+ console.log(pc.dim(` Refreshing every ${interval}s | Press Ctrl+C to exit`));
259
+ }
260
+ /**
261
+ * Launch the monitoring dashboard for a feature
262
+ */
263
+ export async function monitorCommand(feature, options = {}) {
264
+ const projectRoot = process.cwd();
265
+ // Validate feature name
266
+ if (!feature || typeof feature !== 'string') {
267
+ logger.error('Feature name is required');
268
+ process.exit(1);
269
+ }
270
+ // Sanitize feature name (allow alphanumeric, hyphens, underscores)
271
+ if (!/^[a-zA-Z0-9_-]+$/.test(feature)) {
272
+ logger.error('Feature name must contain only letters, numbers, hyphens, and underscores');
273
+ process.exit(1);
274
+ }
275
+ // Validate interval
276
+ if (options.interval !== undefined && (options.interval < 1 || options.interval > 60)) {
277
+ logger.warn('Interval should be between 1 and 60 seconds. Using default (5).');
278
+ options.interval = 5;
279
+ }
280
+ logger.info(`Monitoring feature: ${pc.bold(feature)}`);
281
+ console.log('');
282
+ // Check for bash monitor option
283
+ if (options.bash) {
284
+ const monitorScript = findMonitorScript(projectRoot);
285
+ if (!monitorScript) {
286
+ logger.error('ralph-monitor.sh script not found');
287
+ logger.info('The script should be in .ralph/scripts/ or the ralph/ directory');
288
+ process.exit(1);
289
+ }
290
+ logger.info(`Using bash monitor: ${monitorScript}`);
291
+ console.log('');
292
+ const child = spawn('bash', [monitorScript, feature], {
293
+ cwd: dirname(monitorScript),
294
+ stdio: 'inherit',
295
+ });
296
+ return new Promise((resolve, reject) => {
297
+ child.on('error', reject);
298
+ child.on('close', () => resolve());
299
+ });
300
+ }
301
+ // Python TUI option
302
+ if (options.python) {
303
+ logger.warn('Python TUI monitor not yet implemented');
304
+ logger.info('Using built-in monitor instead');
305
+ }
306
+ // Built-in monitor
307
+ const intervalSeconds = options.interval || 5;
308
+ const intervalMs = intervalSeconds * 1000;
309
+ // Initial display
310
+ try {
311
+ await displayDashboard(feature, projectRoot, intervalSeconds);
312
+ }
313
+ catch (error) {
314
+ logger.error(`Failed to display dashboard: ${error instanceof Error ? error.message : String(error)}`);
315
+ if (process.env.DEBUG && error instanceof Error) {
316
+ console.error(error.stack);
317
+ }
318
+ process.exit(1);
319
+ }
320
+ // Refresh loop
321
+ const refreshTimer = setInterval(async () => {
322
+ try {
323
+ await displayDashboard(feature, projectRoot, intervalSeconds);
324
+ }
325
+ catch (error) {
326
+ // Log error but continue monitoring
327
+ logger.debug(`Dashboard refresh error: ${error instanceof Error ? error.message : String(error)}`);
328
+ }
329
+ }, intervalMs);
330
+ // Return a Promise that resolves on SIGINT
331
+ return new Promise((resolve) => {
332
+ const cleanup = () => {
333
+ clearInterval(refreshTimer);
334
+ console.log('');
335
+ logger.info('Monitor stopped');
336
+ resolve();
337
+ };
338
+ process.on('SIGINT', cleanup);
339
+ process.on('SIGTERM', cleanup);
340
+ });
341
+ }
342
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * New Command
3
+ * Create a new feature specification from template
4
+ */
5
+ export interface NewOptions {
6
+ /** Open in editor after creation */
7
+ edit?: boolean;
8
+ /** Editor to use (defaults to $EDITOR or 'code') */
9
+ editor?: string;
10
+ /** Skip confirmation */
11
+ yes?: boolean;
12
+ /** Force overwrite if file exists */
13
+ force?: boolean;
14
+ }
15
+ /**
16
+ * Create a new feature specification
17
+ */
18
+ export declare function newCommand(feature: string, options?: NewOptions): Promise<void>;
19
+ //# sourceMappingURL=new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA8ID;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+IzF"}