monty-autonomous-fullstack-dev-multillm 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +81 -0
  2. package/README.md +608 -0
  3. package/bin/cli.js +448 -0
  4. package/dist/agents/coding.d.ts +15 -0
  5. package/dist/agents/coding.d.ts.map +1 -0
  6. package/dist/agents/coding.js +189 -0
  7. package/dist/agents/coding.js.map +1 -0
  8. package/dist/agents/initializer.d.ts +15 -0
  9. package/dist/agents/initializer.d.ts.map +1 -0
  10. package/dist/agents/initializer.js +87 -0
  11. package/dist/agents/initializer.js.map +1 -0
  12. package/dist/agents/prompts/arbitrator.md +143 -0
  13. package/dist/agents/prompts/coding.md +247 -0
  14. package/dist/agents/prompts/initializer.md +98 -0
  15. package/dist/config/agent-config.d.ts +103 -0
  16. package/dist/config/agent-config.d.ts.map +1 -0
  17. package/dist/config/agent-config.js +138 -0
  18. package/dist/config/agent-config.js.map +1 -0
  19. package/dist/config/auth-config.d.ts +152 -0
  20. package/dist/config/auth-config.d.ts.map +1 -0
  21. package/dist/config/auth-config.js +139 -0
  22. package/dist/config/auth-config.js.map +1 -0
  23. package/dist/config/mcp-config.d.ts +109 -0
  24. package/dist/config/mcp-config.d.ts.map +1 -0
  25. package/dist/config/mcp-config.js +234 -0
  26. package/dist/config/mcp-config.js.map +1 -0
  27. package/dist/config/provider-config.d.ts +139 -0
  28. package/dist/config/provider-config.d.ts.map +1 -0
  29. package/dist/config/provider-config.js +344 -0
  30. package/dist/config/provider-config.js.map +1 -0
  31. package/dist/config/subagents-config.d.ts +85 -0
  32. package/dist/config/subagents-config.d.ts.map +1 -0
  33. package/dist/config/subagents-config.js +430 -0
  34. package/dist/config/subagents-config.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +385 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/orchestrator/arbitrator.d.ts +93 -0
  40. package/dist/orchestrator/arbitrator.d.ts.map +1 -0
  41. package/dist/orchestrator/arbitrator.js +330 -0
  42. package/dist/orchestrator/arbitrator.js.map +1 -0
  43. package/dist/orchestrator/index.d.ts +113 -0
  44. package/dist/orchestrator/index.d.ts.map +1 -0
  45. package/dist/orchestrator/index.js +217 -0
  46. package/dist/orchestrator/index.js.map +1 -0
  47. package/dist/orchestrator/review-coordinator.d.ts +143 -0
  48. package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
  49. package/dist/orchestrator/review-coordinator.js +401 -0
  50. package/dist/orchestrator/review-coordinator.js.map +1 -0
  51. package/dist/orchestrator/task-classifier.d.ts +87 -0
  52. package/dist/orchestrator/task-classifier.d.ts.map +1 -0
  53. package/dist/orchestrator/task-classifier.js +250 -0
  54. package/dist/orchestrator/task-classifier.js.map +1 -0
  55. package/dist/providers/anthropic-provider.d.ts +64 -0
  56. package/dist/providers/anthropic-provider.d.ts.map +1 -0
  57. package/dist/providers/anthropic-provider.js +264 -0
  58. package/dist/providers/anthropic-provider.js.map +1 -0
  59. package/dist/providers/base-provider.d.ts +219 -0
  60. package/dist/providers/base-provider.d.ts.map +1 -0
  61. package/dist/providers/base-provider.js +143 -0
  62. package/dist/providers/base-provider.js.map +1 -0
  63. package/dist/providers/cursor-provider.d.ts +82 -0
  64. package/dist/providers/cursor-provider.d.ts.map +1 -0
  65. package/dist/providers/cursor-provider.js +321 -0
  66. package/dist/providers/cursor-provider.js.map +1 -0
  67. package/dist/providers/google-provider.d.ts +75 -0
  68. package/dist/providers/google-provider.d.ts.map +1 -0
  69. package/dist/providers/google-provider.js +274 -0
  70. package/dist/providers/google-provider.js.map +1 -0
  71. package/dist/providers/index.d.ts +92 -0
  72. package/dist/providers/index.d.ts.map +1 -0
  73. package/dist/providers/index.js +233 -0
  74. package/dist/providers/index.js.map +1 -0
  75. package/dist/providers/openai-provider.d.ts +83 -0
  76. package/dist/providers/openai-provider.d.ts.map +1 -0
  77. package/dist/providers/openai-provider.js +295 -0
  78. package/dist/providers/openai-provider.js.map +1 -0
  79. package/dist/templates/feature_list.template.json +66 -0
  80. package/dist/templates/progress.template.txt +51 -0
  81. package/dist/utils/auth-manager.d.ts +121 -0
  82. package/dist/utils/auth-manager.d.ts.map +1 -0
  83. package/dist/utils/auth-manager.js +560 -0
  84. package/dist/utils/auth-manager.js.map +1 -0
  85. package/dist/utils/budget-enforcer.d.ts +181 -0
  86. package/dist/utils/budget-enforcer.d.ts.map +1 -0
  87. package/dist/utils/budget-enforcer.js +386 -0
  88. package/dist/utils/budget-enforcer.js.map +1 -0
  89. package/dist/utils/chatgpt-detector.d.ts +51 -0
  90. package/dist/utils/chatgpt-detector.d.ts.map +1 -0
  91. package/dist/utils/chatgpt-detector.js +274 -0
  92. package/dist/utils/chatgpt-detector.js.map +1 -0
  93. package/dist/utils/claude-code-detector.d.ts +39 -0
  94. package/dist/utils/claude-code-detector.d.ts.map +1 -0
  95. package/dist/utils/claude-code-detector.js +153 -0
  96. package/dist/utils/claude-code-detector.js.map +1 -0
  97. package/dist/utils/code-quality.d.ts +58 -0
  98. package/dist/utils/code-quality.d.ts.map +1 -0
  99. package/dist/utils/code-quality.js +258 -0
  100. package/dist/utils/code-quality.js.map +1 -0
  101. package/dist/utils/context-primer.d.ts +50 -0
  102. package/dist/utils/context-primer.d.ts.map +1 -0
  103. package/dist/utils/context-primer.js +429 -0
  104. package/dist/utils/context-primer.js.map +1 -0
  105. package/dist/utils/dependency-management.d.ts +40 -0
  106. package/dist/utils/dependency-management.d.ts.map +1 -0
  107. package/dist/utils/dependency-management.js +123 -0
  108. package/dist/utils/dependency-management.js.map +1 -0
  109. package/dist/utils/environment-validation.d.ts +33 -0
  110. package/dist/utils/environment-validation.d.ts.map +1 -0
  111. package/dist/utils/environment-validation.js +136 -0
  112. package/dist/utils/environment-validation.js.map +1 -0
  113. package/dist/utils/error-recovery.d.ts +60 -0
  114. package/dist/utils/error-recovery.d.ts.map +1 -0
  115. package/dist/utils/error-recovery.js +183 -0
  116. package/dist/utils/error-recovery.js.map +1 -0
  117. package/dist/utils/feature-list.d.ts +102 -0
  118. package/dist/utils/feature-list.d.ts.map +1 -0
  119. package/dist/utils/feature-list.js +191 -0
  120. package/dist/utils/feature-list.js.map +1 -0
  121. package/dist/utils/gemini-detector.d.ts +65 -0
  122. package/dist/utils/gemini-detector.d.ts.map +1 -0
  123. package/dist/utils/gemini-detector.js +340 -0
  124. package/dist/utils/gemini-detector.js.map +1 -0
  125. package/dist/utils/git-utils.d.ts +48 -0
  126. package/dist/utils/git-utils.d.ts.map +1 -0
  127. package/dist/utils/git-utils.js +110 -0
  128. package/dist/utils/git-utils.js.map +1 -0
  129. package/dist/utils/health-check.d.ts +32 -0
  130. package/dist/utils/health-check.d.ts.map +1 -0
  131. package/dist/utils/health-check.js +152 -0
  132. package/dist/utils/health-check.js.map +1 -0
  133. package/dist/utils/hooks-manager.d.ts +154 -0
  134. package/dist/utils/hooks-manager.d.ts.map +1 -0
  135. package/dist/utils/hooks-manager.js +359 -0
  136. package/dist/utils/hooks-manager.js.map +1 -0
  137. package/dist/utils/multi-auth-manager.d.ts +144 -0
  138. package/dist/utils/multi-auth-manager.d.ts.map +1 -0
  139. package/dist/utils/multi-auth-manager.js +588 -0
  140. package/dist/utils/multi-auth-manager.js.map +1 -0
  141. package/dist/utils/progress.d.ts +49 -0
  142. package/dist/utils/progress.d.ts.map +1 -0
  143. package/dist/utils/progress.js +209 -0
  144. package/dist/utils/progress.js.map +1 -0
  145. package/dist/utils/project-detection.d.ts +40 -0
  146. package/dist/utils/project-detection.d.ts.map +1 -0
  147. package/dist/utils/project-detection.js +230 -0
  148. package/dist/utils/project-detection.js.map +1 -0
  149. package/dist/utils/session-manager.d.ts +119 -0
  150. package/dist/utils/session-manager.d.ts.map +1 -0
  151. package/dist/utils/session-manager.js +389 -0
  152. package/dist/utils/session-manager.js.map +1 -0
  153. package/dist/utils/skills-manager.d.ts +113 -0
  154. package/dist/utils/skills-manager.d.ts.map +1 -0
  155. package/dist/utils/skills-manager.js +332 -0
  156. package/dist/utils/skills-manager.js.map +1 -0
  157. package/dist/utils/structured-output.d.ts +117 -0
  158. package/dist/utils/structured-output.d.ts.map +1 -0
  159. package/dist/utils/structured-output.js +191 -0
  160. package/dist/utils/structured-output.js.map +1 -0
  161. package/dist/utils/subagent-manager.d.ts +143 -0
  162. package/dist/utils/subagent-manager.d.ts.map +1 -0
  163. package/dist/utils/subagent-manager.js +326 -0
  164. package/dist/utils/subagent-manager.js.map +1 -0
  165. package/dist/utils/supabase-setup.d.ts +50 -0
  166. package/dist/utils/supabase-setup.d.ts.map +1 -0
  167. package/dist/utils/supabase-setup.js +151 -0
  168. package/dist/utils/supabase-setup.js.map +1 -0
  169. package/dist/utils/token-refresh.d.ts +21 -0
  170. package/dist/utils/token-refresh.d.ts.map +1 -0
  171. package/dist/utils/token-refresh.js +77 -0
  172. package/dist/utils/token-refresh.js.map +1 -0
  173. package/dist/utils/tos-warning.d.ts +115 -0
  174. package/dist/utils/tos-warning.d.ts.map +1 -0
  175. package/dist/utils/tos-warning.js +304 -0
  176. package/dist/utils/tos-warning.js.map +1 -0
  177. package/dist/utils/usage-monitor.d.ts +156 -0
  178. package/dist/utils/usage-monitor.d.ts.map +1 -0
  179. package/dist/utils/usage-monitor.js +296 -0
  180. package/dist/utils/usage-monitor.js.map +1 -0
  181. package/package.json +105 -0
  182. package/scripts/init.ps1 +73 -0
  183. package/scripts/init.sh +86 -0
  184. package/scripts/test-auth.sh +90 -0
  185. package/templates/feature_list.template.json +66 -0
  186. package/templates/progress.template.txt +51 -0
package/bin/cli.js ADDED
@@ -0,0 +1,448 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Monty Full-Stack Agent CLI
5
+ *
6
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
7
+ * Licensed under CC BY-NC 4.0 - Non-commercial use only
8
+ * https://creativecommons.org/licenses/by-nc/4.0/
9
+ *
10
+ * A Claude Agent SDK framework for autonomous full-stack development.
11
+ * Takes projects from idea to production deployment.
12
+ *
13
+ * Usage:
14
+ * monty - Auto-detect mode (init or continue coding)
15
+ * monty init - Initialize a new project
16
+ * monty code - Continue coding session
17
+ * monty --spec="..." - Start with a project specification
18
+ * monty --help - Show help
19
+ *
20
+ * Install globally:
21
+ * npm install -g monty-autonomous-fullstack-dev-multillm
22
+ *
23
+ * Or run directly:
24
+ * npx monty-autonomous-fullstack-dev-multillm
25
+ */
26
+
27
+ import { fileURLToPath } from 'url';
28
+ import { dirname, join, resolve } from 'path';
29
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, copyFileSync, unlinkSync } from 'fs';
30
+ import { spawn } from 'child_process';
31
+ import { homedir } from 'os';
32
+
33
+ // Import auth manager from the compiled JS if available, or try importing the TS version
34
+ // This handles both development (ts-node) and production (node) environments
35
+ let authManager;
36
+ try {
37
+ // Try importing from the same directory structure (relative to cli.js)
38
+ // For production build: ../utils/auth-manager.js
39
+ const authManagerPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'src', 'utils', 'auth-manager.ts');
40
+
41
+ // We need to use the actual file location based on where we are running
42
+ // If running via tsx/ts-node, we can import .ts files
43
+ // If running via node (production), we need the .js files in dist/
44
+
45
+ // For now, in this CLI wrapper, we'll replicate the core logic needed for bootstrapping
46
+ // but delegate actual authentication handling to the main application logic where possible
47
+ // OR we can dynamically import the auth manager.
48
+ } catch (e) {
49
+ // Fallback
50
+ }
51
+
52
+ const __filename = fileURLToPath(import.meta.url);
53
+ const __dirname = dirname(__filename);
54
+
55
+ // Colors for terminal output
56
+ const colors = {
57
+ reset: '\x1b[0m',
58
+ bright: '\x1b[1m',
59
+ dim: '\x1b[2m',
60
+ red: '\x1b[31m',
61
+ green: '\x1b[32m',
62
+ yellow: '\x1b[33m',
63
+ blue: '\x1b[34m',
64
+ magenta: '\x1b[35m',
65
+ cyan: '\x1b[36m',
66
+ white: '\x1b[37m',
67
+ };
68
+
69
+ // Auth configuration (Duplicate minimal config needed for CLI bootstrap)
70
+ const AUTH_CONFIG = {
71
+ configDir: join(homedir(), '.monty'),
72
+ get credentialsPath() { return join(this.configDir, 'credentials.json'); },
73
+ envVars: {
74
+ API_KEY: 'ANTHROPIC_API_KEY',
75
+ SUBSCRIPTION_KEY: 'ANTHROPIC_SUBSCRIPTION_KEY',
76
+ },
77
+ };
78
+
79
+ function log(message, color = colors.reset) {
80
+ console.log(`${color}${message}${colors.reset}`);
81
+ }
82
+
83
+ // ============================================================
84
+ // CLI Functions
85
+ // ============================================================
86
+
87
+ function showBanner() {
88
+ console.log(`
89
+ ${colors.cyan}${colors.bright}
90
+ ╔══════════════════════════════════════════════════════════════════════════════╗
91
+ ā•‘ ā•‘
92
+ ā•‘ ā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā•—ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•—ā–ˆā–ˆā•— ā–ˆā–ˆā•— ā•‘
93
+ ā•‘ ā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā•‘ā–ˆā–ˆā•”ā•ā•ā•ā–ˆā–ˆā•—ā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā•‘ā•šā•ā•ā–ˆā–ˆā•”ā•ā•ā•ā•šā–ˆā–ˆā•— ā–ˆā–ˆā•”ā• ā•‘
94
+ ā•‘ ā–ˆā–ˆā•”ā–ˆā–ˆā–ˆā–ˆā•”ā–ˆā–ˆā•‘ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ā–ˆā–ˆā•”ā–ˆā–ˆā•— ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ ā•šā–ˆā–ˆā–ˆā–ˆā•”ā• ā•‘
95
+ ā•‘ ā–ˆā–ˆā•‘ā•šā–ˆā–ˆā•”ā•ā–ˆā–ˆā•‘ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ā–ˆā–ˆā•‘ā•šā–ˆā–ˆā•—ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ ā•šā–ˆā–ˆā•”ā• ā•‘
96
+ ā•‘ ā–ˆā–ˆā•‘ ā•šā•ā• ā–ˆā–ˆā•‘ā•šā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā•ā–ˆā–ˆā•‘ ā•šā–ˆā–ˆā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ ā•‘
97
+ ā•‘ ā•šā•ā• ā•šā•ā• ā•šā•ā•ā•ā•ā•ā• ā•šā•ā• ā•šā•ā•ā•ā• ā•šā•ā• ā•šā•ā• ā•‘
98
+ ā•‘ ā•‘
99
+ ā•‘ ${colors.white}FULL-STACK AUTONOMOUS DEVELOPMENT AGENT${colors.cyan} ā•‘
100
+ ā•‘ ${colors.dim}Powered by Claude Agent SDK${colors.cyan}${colors.bright} ā•‘
101
+ ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•
102
+ ${colors.reset}`);
103
+ }
104
+
105
+ function showHelp() {
106
+ showBanner();
107
+ console.log(`
108
+ ${colors.bright}USAGE:${colors.reset}
109
+ ${colors.cyan}monty${colors.reset} Auto-detect mode
110
+ ${colors.cyan}monty init${colors.reset} Initialize new project
111
+ ${colors.cyan}monty code${colors.reset} Continue coding session
112
+ ${colors.cyan}monty setup${colors.reset} Set up monty in current directory
113
+ ${colors.cyan}monty status${colors.reset} Show project progress
114
+
115
+ ${colors.bright}AUTHENTICATION:${colors.reset}
116
+ ${colors.cyan}monty login${colors.reset} Sign in (Auto-detect / OAuth / API Key)
117
+ ${colors.cyan}monty logout${colors.reset} Sign out and clear credentials
118
+ ${colors.cyan}monty whoami${colors.reset} Show current authentication status
119
+
120
+ ${colors.bright}OPTIONS:${colors.reset}
121
+ ${colors.yellow}--spec="..."${colors.reset} Project specification
122
+ ${colors.yellow}--context="..."${colors.reset} Additional context for coding
123
+ ${colors.yellow}--help, -h${colors.reset} Show this help message
124
+ ${colors.yellow}--version, -v${colors.reset} Show version
125
+
126
+ ${colors.bright}QUICK START:${colors.reset}
127
+ ${colors.dim}# Create a new project${colors.reset}
128
+ ${colors.green}mkdir my-app && cd my-app${colors.reset}
129
+ ${colors.green}monty init --spec="Build a todo app with React and Supabase"${colors.reset}
130
+
131
+ ${colors.dim}# Continue development${colors.reset}
132
+ ${colors.green}monty code${colors.reset}
133
+
134
+ ${colors.dim}# Or use npx directly${colors.reset}
135
+ ${colors.green}npx monty-autonomous-fullstack-dev-multillm init --spec="Your project idea..."${colors.reset}
136
+
137
+ ${colors.bright}WORKFLOW:${colors.reset}
138
+ 1. ${colors.cyan}monty init${colors.reset} - Analyzes your spec and creates feature list
139
+ 2. ${colors.cyan}monty code${colors.reset} - Implements features incrementally with testing
140
+ 3. Repeat ${colors.cyan}monty code${colors.reset} until all features pass
141
+
142
+ ${colors.bright}FILES CREATED:${colors.reset}
143
+ ${colors.dim}.agent/feature_list.json${colors.reset} Feature tracking
144
+ ${colors.dim}.agent/claude-progress.txt${colors.reset} Progress between sessions
145
+
146
+ ${colors.bright}ENVIRONMENT:${colors.reset}
147
+ ${colors.yellow}ANTHROPIC_API_KEY${colors.reset} Anthropic API key (or use "monty login")
148
+ ${colors.yellow}ANTHROPIC_SUBSCRIPTION_KEY${colors.reset} Claude Code subscription key
149
+
150
+ ${colors.bright}DOCUMENTATION:${colors.reset}
151
+ https://github.com/dobeutech/monty-ai-fullstackdev-coder
152
+ `);
153
+ }
154
+
155
+ function showVersion() {
156
+ const packagePath = join(__dirname, '..', 'package.json');
157
+ try {
158
+ const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
159
+ console.log(`monty-autonomous-fullstack-dev-multillm v${pkg.version}`);
160
+ } catch {
161
+ console.log('monty-autonomous-fullstack-dev-multillm v1.0.0');
162
+ }
163
+ }
164
+
165
+ function showStatus() {
166
+ const cwd = process.cwd();
167
+ const agentDir = join(cwd, '.agent');
168
+ const featureListPath = join(agentDir, 'feature_list.json');
169
+ const progressPath = join(agentDir, 'claude-progress.txt');
170
+
171
+ showBanner();
172
+
173
+ if (!existsSync(agentDir)) {
174
+ log('\nāš ļø No .agent directory found. Project not initialized.', colors.yellow);
175
+ log(' Run: monty init --spec="Your project idea..."', colors.dim);
176
+ return;
177
+ }
178
+
179
+ if (!existsSync(featureListPath)) {
180
+ log('\nāš ļø Feature list not found. Run: monty init', colors.yellow);
181
+ return;
182
+ }
183
+
184
+ try {
185
+ const features = JSON.parse(readFileSync(featureListPath, 'utf-8'));
186
+ const total = features.features?.length || 0;
187
+ const passing = features.features?.filter(f => f.passes).length || 0;
188
+ const percentage = total > 0 ? Math.round((passing / total) * 100) : 0;
189
+
190
+ log('\nšŸ“Š PROJECT STATUS', colors.bright);
191
+ log('─'.repeat(50), colors.dim);
192
+ log(` Project: ${features.project?.name || 'Unknown'}`, colors.white);
193
+ log(` Total Features: ${total}`, colors.white);
194
+ log(` Passing: ${passing}`, colors.green);
195
+ log(` Remaining: ${total - passing}`, colors.yellow);
196
+ log(` Progress: ${percentage}%`, percentage === 100 ? colors.green : colors.cyan);
197
+
198
+ // Progress bar
199
+ const barWidth = 30;
200
+ const filled = Math.round((percentage / 100) * barWidth);
201
+ const empty = barWidth - filled;
202
+ const bar = 'ā–ˆ'.repeat(filled) + 'ā–‘'.repeat(empty);
203
+ log(`\n [${bar}] ${percentage}%`, percentage === 100 ? colors.green : colors.cyan);
204
+
205
+ // Show categories
206
+ if (features.features?.length > 0) {
207
+ const categories = {};
208
+ features.features.forEach(f => {
209
+ if (!categories[f.category]) {
210
+ categories[f.category] = { total: 0, passing: 0 };
211
+ }
212
+ categories[f.category].total++;
213
+ if (f.passes) categories[f.category].passing++;
214
+ });
215
+
216
+ log('\n By Category:', colors.bright);
217
+ Object.entries(categories).forEach(([cat, data]) => {
218
+ const catPct = Math.round((data.passing / data.total) * 100);
219
+ const color = catPct === 100 ? colors.green : catPct > 50 ? colors.yellow : colors.red;
220
+ log(` ${cat}: ${data.passing}/${data.total} (${catPct}%)`, color);
221
+ });
222
+ }
223
+
224
+ log('\n' + '─'.repeat(50), colors.dim);
225
+ log(' Run "monty code" to continue development', colors.dim);
226
+ } catch (err) {
227
+ log(`\nāŒ Error reading feature list: ${err.message}`, colors.red);
228
+ }
229
+ }
230
+
231
+ async function setupInDirectory() {
232
+ const cwd = process.cwd();
233
+ showBanner();
234
+
235
+ log('\nšŸ“ Setting up Monty in current directory...', colors.cyan);
236
+ log(` Directory: ${cwd}`, colors.dim);
237
+
238
+ // Check if already initialized
239
+ if (existsSync(join(cwd, '.agent'))) {
240
+ log('\nāœ… Project already initialized!', colors.green);
241
+ log(' Run "monty code" to continue development.', colors.dim);
242
+ return;
243
+ }
244
+
245
+ // Check for package.json
246
+ if (!existsSync(join(cwd, 'package.json'))) {
247
+ log('\nāš ļø No package.json found.', colors.yellow);
248
+ log(' This appears to be a new project.', colors.dim);
249
+ log(' Run: monty init --spec="Your project idea..."', colors.dim);
250
+ return;
251
+ }
252
+
253
+ log('\nāœ… Ready to initialize!', colors.green);
254
+ log(' Run: monty init --spec="Your project specification..."', colors.dim);
255
+ }
256
+
257
+ // To avoid duplicating logic in CLI and potentially having sync issues,
258
+ // we will delegate auth commands to a script that uses the full AuthManager
259
+ async function runAuthCommand(command) {
260
+ const distPath = join(__dirname, '..', 'dist', 'index.js');
261
+ const srcPath = join(__dirname, '..', 'src', 'index.ts');
262
+
263
+ let entryPoint;
264
+ let runner;
265
+ let runnerArgs;
266
+
267
+ if (existsSync(distPath)) {
268
+ entryPoint = distPath;
269
+ runner = 'node';
270
+ runnerArgs = [entryPoint];
271
+ } else if (existsSync(srcPath)) {
272
+ entryPoint = srcPath;
273
+ runner = 'npx';
274
+ runnerArgs = ['tsx', entryPoint];
275
+ } else {
276
+ log('āŒ Error: Could not find entry point.', colors.red);
277
+ process.exit(1);
278
+ }
279
+
280
+ // We use the main entry point with specific flags to trigger auth manager logic
281
+ // This ensures we use the robust AuthManager implementation we just wrote
282
+ const child = spawn(runner, [...runnerArgs, `--${command}`], {
283
+ stdio: 'inherit',
284
+ cwd: process.cwd(),
285
+ env: process.env,
286
+ });
287
+
288
+ return new Promise((resolve) => {
289
+ child.on('close', (code) => {
290
+ resolve(code);
291
+ });
292
+ });
293
+ }
294
+
295
+ // Check auth status by reading file directly (fast check for CLI)
296
+ function checkAuthStatus() {
297
+ if (process.env[AUTH_CONFIG.envVars.API_KEY] || process.env[AUTH_CONFIG.envVars.SUBSCRIPTION_KEY]) {
298
+ return true;
299
+ }
300
+
301
+ try {
302
+ if (existsSync(AUTH_CONFIG.credentialsPath)) {
303
+ const data = readFileSync(AUTH_CONFIG.credentialsPath, 'utf-8');
304
+ const creds = JSON.parse(data);
305
+ return !!(creds.apiKey || creds.subscriptionKey);
306
+ }
307
+ } catch (e) {
308
+ // Ignore
309
+ }
310
+ return false;
311
+ }
312
+
313
+ // Get API key for environment injection
314
+ function getApiKey() {
315
+ if (process.env[AUTH_CONFIG.envVars.SUBSCRIPTION_KEY]) return process.env[AUTH_CONFIG.envVars.SUBSCRIPTION_KEY];
316
+ if (process.env[AUTH_CONFIG.envVars.API_KEY]) return process.env[AUTH_CONFIG.envVars.API_KEY];
317
+
318
+ try {
319
+ if (existsSync(AUTH_CONFIG.credentialsPath)) {
320
+ const data = readFileSync(AUTH_CONFIG.credentialsPath, 'utf-8');
321
+ const creds = JSON.parse(data);
322
+ return creds.subscriptionKey || creds.apiKey;
323
+ }
324
+ } catch (e) {}
325
+ return null;
326
+ }
327
+
328
+ function getAuthEnv() {
329
+ const env = { ...process.env };
330
+ const apiKey = getApiKey();
331
+ if (apiKey && !env[AUTH_CONFIG.envVars.API_KEY]) {
332
+ env[AUTH_CONFIG.envVars.API_KEY] = apiKey;
333
+ }
334
+ return env;
335
+ }
336
+
337
+ async function main() {
338
+ const args = process.argv.slice(2);
339
+
340
+ // Handle help
341
+ if (args.includes('--help') || args.includes('-h') || (args.length === 0 && !existsSync(join(process.cwd(), '.agent')))) {
342
+ showHelp();
343
+ return;
344
+ }
345
+
346
+ // Handle version
347
+ if (args.includes('--version') || args.includes('-v')) {
348
+ showVersion();
349
+ return;
350
+ }
351
+
352
+ // Handle status
353
+ if (args.includes('status')) {
354
+ showStatus();
355
+ return;
356
+ }
357
+
358
+ // Handle setup
359
+ if (args.includes('setup')) {
360
+ await setupInDirectory();
361
+ return;
362
+ }
363
+
364
+ // Handle auth commands by delegating to the main app
365
+ // This ensures we use the full AuthManager logic
366
+ if (args.includes('login')) {
367
+ await runAuthCommand('login');
368
+ return;
369
+ }
370
+
371
+ if (args.includes('logout')) {
372
+ await runAuthCommand('logout');
373
+ return;
374
+ }
375
+
376
+ if (args.includes('whoami')) {
377
+ await runAuthCommand('whoami');
378
+ return;
379
+ }
380
+
381
+ // Check authentication before running agent commands
382
+ if (!checkAuthStatus()) {
383
+ log('\n' + '─'.repeat(50), colors.dim);
384
+ log('Authentication required', colors.yellow);
385
+ log('─'.repeat(50), colors.dim);
386
+ log('\nYou need to authenticate before running the agent.', colors.white);
387
+ log('\nOptions:', colors.white);
388
+ log(' 1. Run "monty login" to sign in interactively', colors.cyan);
389
+ log(` 2. Set ${AUTH_CONFIG.envVars.API_KEY} environment variable`, colors.cyan);
390
+ log(` 3. Set ${AUTH_CONFIG.envVars.SUBSCRIPTION_KEY} environment variable\n`, colors.cyan);
391
+ process.exit(1);
392
+ }
393
+
394
+ // Determine the main entry point
395
+ const distPath = join(__dirname, '..', 'dist', 'index.js');
396
+ const srcPath = join(__dirname, '..', 'src', 'index.ts');
397
+
398
+ let entryPoint;
399
+ let runner;
400
+ let runnerArgs;
401
+
402
+ if (existsSync(distPath)) {
403
+ entryPoint = distPath;
404
+ runner = 'node';
405
+ runnerArgs = [entryPoint, ...args];
406
+ } else if (existsSync(srcPath)) {
407
+ // Development mode - use tsx
408
+ entryPoint = srcPath;
409
+ runner = 'npx';
410
+ runnerArgs = ['tsx', entryPoint, ...args];
411
+ } else {
412
+ log('āŒ Error: Could not find entry point.', colors.red);
413
+ log(' Please run "npm run build" first.', colors.dim);
414
+ process.exit(1);
415
+ }
416
+
417
+ // Map subcommands to flags
418
+ const commandMap = {
419
+ 'init': '--init',
420
+ 'code': '--code',
421
+ };
422
+
423
+ // Transform args if needed
424
+ const transformedArgs = args.map(arg => commandMap[arg] || arg);
425
+
426
+ showBanner();
427
+
428
+ // Run the main agent with authenticated environment
429
+ const child = spawn(runner, [...runnerArgs.slice(0, 1), ...transformedArgs.filter(a => !['init', 'code', 'status', 'setup', 'login', 'logout', 'whoami'].includes(a))], {
430
+ stdio: 'inherit',
431
+ cwd: process.cwd(),
432
+ env: getAuthEnv(),
433
+ });
434
+
435
+ child.on('error', (err) => {
436
+ log(`āŒ Error: ${err.message}`, colors.red);
437
+ process.exit(1);
438
+ });
439
+
440
+ child.on('close', (code) => {
441
+ process.exit(code || 0);
442
+ });
443
+ }
444
+
445
+ main().catch((err) => {
446
+ console.error('Fatal error:', err);
447
+ process.exit(1);
448
+ });
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Coding Agent
3
+ * Runs on every session after initialization to make incremental progress.
4
+ * Based on Anthropic's best practices for long-running agents.
5
+ */
6
+ /**
7
+ * Build the complete prompt for the coding agent
8
+ */
9
+ export declare function buildCodingPrompt(additionalContext?: string): string;
10
+ /**
11
+ * Run the coding agent
12
+ */
13
+ export declare function runCodingAgent(additionalContext?: string): Promise<void>;
14
+ export default runCodingAgent;
15
+ //# sourceMappingURL=coding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coding.d.ts","sourceRoot":"","sources":["../../src/agents/coding.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsEH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CA4EpE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC9E;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Coding Agent
3
+ * Runs on every session after initialization to make incremental progress.
4
+ * Based on Anthropic's best practices for long-running agents.
5
+ */
6
+ import { query } from "@anthropic-ai/claude-agent-sdk";
7
+ import { readFileSync, existsSync } from "fs";
8
+ import { join, dirname } from "path";
9
+ import { fileURLToPath } from "url";
10
+ import { agentConfig } from "../config/agent-config.js";
11
+ import { getBrowserInstructions } from "../config/mcp-config.js";
12
+ import { getSetupSummary } from "../utils/supabase-setup.js";
13
+ import { generateProjectSummary } from "../utils/project-detection.js";
14
+ import { generateQualitySummary } from "../utils/code-quality.js";
15
+ import { generateDependencySummary } from "../utils/dependency-management.js";
16
+ import { generateGitSummary } from "../utils/git-utils.js";
17
+ import { generateErrorRecoverySummary } from "../utils/error-recovery.js";
18
+ import { generateEnvironmentSummary } from "../utils/environment-validation.js";
19
+ import { generateHealthSummary } from "../utils/health-check.js";
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = dirname(__filename);
22
+ /**
23
+ * Load the coding agent system prompt from markdown file
24
+ */
25
+ function loadCodingPrompt() {
26
+ const promptPath = join(__dirname, "prompts", "coding.md");
27
+ return readFileSync(promptPath, "utf-8");
28
+ }
29
+ /**
30
+ * Get current progress summary from progress file
31
+ */
32
+ function getProgressSummary() {
33
+ const progressPath = agentConfig.paths.progressFile;
34
+ if (!existsSync(progressPath)) {
35
+ return "No progress file found. This may indicate an incomplete initialization.";
36
+ }
37
+ try {
38
+ const content = readFileSync(progressPath, "utf-8");
39
+ // Return first 50 lines as a summary
40
+ const lines = content.split("\n").slice(0, 50);
41
+ return lines.join("\n");
42
+ }
43
+ catch {
44
+ return "Error reading progress file.";
45
+ }
46
+ }
47
+ /**
48
+ * Get feature list summary
49
+ */
50
+ function getFeatureSummary() {
51
+ const featurePath = agentConfig.paths.featureList;
52
+ if (!existsSync(featurePath)) {
53
+ return "No feature list found. Run initialization first.";
54
+ }
55
+ try {
56
+ const content = readFileSync(featurePath, "utf-8");
57
+ const data = JSON.parse(content);
58
+ const total = data.features?.length ?? 0;
59
+ const passing = data.features?.filter((f) => f.passes).length ?? 0;
60
+ return `Features: ${passing}/${total} passing`;
61
+ }
62
+ catch {
63
+ return "Error reading feature list.";
64
+ }
65
+ }
66
+ /**
67
+ * Build the complete prompt for the coding agent
68
+ */
69
+ export function buildCodingPrompt(additionalContext) {
70
+ const systemPrompt = loadCodingPrompt();
71
+ const browserInstructions = getBrowserInstructions();
72
+ const progressSummary = getProgressSummary();
73
+ const featureSummary = getFeatureSummary();
74
+ // Get all status summaries
75
+ const supabaseSummary = getSetupSummary();
76
+ const projectSummary = generateProjectSummary();
77
+ const qualitySummary = generateQualitySummary();
78
+ const dependencySummary = generateDependencySummary();
79
+ const gitSummary = generateGitSummary();
80
+ const errorRecoverySummary = generateErrorRecoverySummary();
81
+ const environmentSummary = generateEnvironmentSummary();
82
+ const healthSummary = generateHealthSummary();
83
+ let prompt = `${systemPrompt}
84
+
85
+ ---
86
+
87
+ ${browserInstructions}
88
+
89
+ ---
90
+
91
+ ## WORKING DIRECTORY
92
+
93
+ You are working in: ${agentConfig.paths.projectRoot}
94
+ All file paths should be relative to this directory.
95
+
96
+ CRITICAL SESSION RULES:
97
+ - Do NOT use KillShell or attempt to terminate background processes
98
+ - Do NOT use TaskOutput for shell management
99
+ - Let the harness handle cleanup automatically
100
+ - End your session naturally after providing a summary
101
+
102
+ ---
103
+
104
+ ## CURRENT PROJECT STATE
105
+
106
+ **Progress Summary:**
107
+ ${progressSummary}
108
+
109
+ **Feature Status:** ${featureSummary}
110
+ ${supabaseSummary}
111
+ ${projectSummary}
112
+ ${qualitySummary}
113
+ ${dependencySummary}
114
+ ${gitSummary}
115
+ ${errorRecoverySummary}
116
+ ${environmentSummary}
117
+ ${healthSummary}
118
+
119
+ ## PATHS
120
+
121
+ - Feature list: ${agentConfig.paths.featureList}
122
+ - Progress file: ${agentConfig.paths.progressFile}
123
+ - Init script (Windows): scripts/init.ps1
124
+ - Init script (Unix): scripts/init.sh
125
+ `;
126
+ if (additionalContext) {
127
+ prompt += `
128
+ ---
129
+
130
+ ## ADDITIONAL CONTEXT FROM USER
131
+
132
+ ${additionalContext}
133
+ `;
134
+ }
135
+ prompt += `
136
+ ---
137
+
138
+ Begin the development session now. Follow the startup sequence.`;
139
+ return prompt;
140
+ }
141
+ /**
142
+ * Run the coding agent
143
+ */
144
+ export async function runCodingAgent(additionalContext) {
145
+ const prompt = buildCodingPrompt(additionalContext);
146
+ console.log("šŸ”Ø Starting Coding Agent Session...");
147
+ console.log("━".repeat(50));
148
+ console.log(getFeatureSummary());
149
+ console.log("━".repeat(50));
150
+ for await (const message of query({
151
+ prompt,
152
+ options: {
153
+ allowedTools: agentConfig.tools.coding,
154
+ permissionMode: agentConfig.permissionMode,
155
+ // Explicitly pass credentials to SDK subprocess
156
+ env: {
157
+ ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY || undefined,
158
+ },
159
+ },
160
+ })) {
161
+ if (message.type === "assistant" && message.message?.content) {
162
+ for (const block of message.message.content) {
163
+ if ("text" in block) {
164
+ console.log(block.text);
165
+ }
166
+ else if ("name" in block) {
167
+ console.log(`\nšŸ”§ Tool: ${block.name}\n`);
168
+ }
169
+ }
170
+ }
171
+ else if (message.type === "result") {
172
+ console.log("\n" + "━".repeat(50));
173
+ if (message.subtype === "success") {
174
+ console.log("āœ… Session completed successfully");
175
+ }
176
+ else if (message.subtype === "error_during_execution") {
177
+ console.log("āš ļø Session ended with errors - check logs above");
178
+ console.log(" Note: This may be due to background process cleanup.");
179
+ console.log(" If features were verified, the work was still saved.");
180
+ }
181
+ else {
182
+ console.log(`ā„¹ļø Session ended: ${message.subtype}`);
183
+ }
184
+ console.log(getFeatureSummary());
185
+ }
186
+ }
187
+ }
188
+ export default runCodingAgent;
189
+ //# sourceMappingURL=coding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coding.js","sourceRoot":"","sources":["../../src/agents/coding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Initializer Agent
3
+ * Runs on first execution to set up the project environment.
4
+ * Based on Anthropic's best practices for long-running agents.
5
+ */
6
+ /**
7
+ * Build the complete prompt for the initializer agent
8
+ */
9
+ export declare function buildInitializerPrompt(userSpec: string): string;
10
+ /**
11
+ * Run the initializer agent
12
+ */
13
+ export declare function runInitializerAgent(userSpec: string): Promise<void>;
14
+ export default runInitializerAgent;
15
+ //# sourceMappingURL=initializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initializer.d.ts","sourceRoot":"","sources":["../../src/agents/initializer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6B/D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BzE;AAED,eAAe,mBAAmB,CAAC"}