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
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Feature List Utilities
3
+ * Manages feature list operations with Poka-yoke error prevention.
4
+ * Implements safeguards to prevent accidental modification of test criteria.
5
+ */
6
+ import { readFileSync, writeFileSync, existsSync } from "fs";
7
+ import { agentConfig } from "../config/agent-config.js";
8
+ /**
9
+ * Load the feature list from disk
10
+ */
11
+ export function loadFeatureList() {
12
+ const path = agentConfig.paths.featureList;
13
+ if (!existsSync(path)) {
14
+ return null;
15
+ }
16
+ try {
17
+ const content = readFileSync(path, "utf-8");
18
+ return JSON.parse(content);
19
+ }
20
+ catch (error) {
21
+ console.error("Error loading feature list:", error);
22
+ return null;
23
+ }
24
+ }
25
+ /**
26
+ * Save the feature list to disk
27
+ */
28
+ export function saveFeatureList(featureList) {
29
+ const path = agentConfig.paths.featureList;
30
+ try {
31
+ // Update metadata before saving
32
+ featureList.metadata.total_features = featureList.features.length;
33
+ featureList.metadata.passing_features = featureList.features.filter(f => f.passes).length;
34
+ featureList.metadata.last_updated = new Date().toISOString();
35
+ const content = JSON.stringify(featureList, null, 2);
36
+ writeFileSync(path, content, "utf-8");
37
+ return true;
38
+ }
39
+ catch (error) {
40
+ console.error("Error saving feature list:", error);
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * Poka-yoke validation: Ensure feature list updates don't violate constraints
46
+ *
47
+ * CONSTRAINTS:
48
+ * - Cannot delete features
49
+ * - Cannot modify feature steps (test criteria)
50
+ * - Cannot modify feature descriptions
51
+ * - Can only update: passes, last_tested, notes
52
+ */
53
+ export function validateFeatureListUpdate(original, updated) {
54
+ const warnings = [];
55
+ // Rule 1: Cannot delete features
56
+ if (updated.features.length < original.features.length) {
57
+ return {
58
+ valid: false,
59
+ error: `Cannot delete features. Original: ${original.features.length}, Updated: ${updated.features.length}`,
60
+ };
61
+ }
62
+ // Rule 2: Cannot modify existing features' steps or descriptions
63
+ for (const originalFeat of original.features) {
64
+ const updatedFeat = updated.features.find(f => f.id === originalFeat.id);
65
+ if (!updatedFeat) {
66
+ return {
67
+ valid: false,
68
+ error: `Feature ${originalFeat.id} was removed. This is not allowed.`,
69
+ };
70
+ }
71
+ // Check if steps were modified
72
+ if (JSON.stringify(originalFeat.steps) !== JSON.stringify(updatedFeat.steps)) {
73
+ return {
74
+ valid: false,
75
+ error: `Cannot modify test steps for feature ${originalFeat.id}. Steps are immutable.`,
76
+ };
77
+ }
78
+ // Check if description was modified
79
+ if (originalFeat.description !== updatedFeat.description) {
80
+ return {
81
+ valid: false,
82
+ error: `Cannot modify description for feature ${originalFeat.id}. Descriptions are immutable.`,
83
+ };
84
+ }
85
+ // Check if category was modified
86
+ if (originalFeat.category !== updatedFeat.category) {
87
+ return {
88
+ valid: false,
89
+ error: `Cannot modify category for feature ${originalFeat.id}. Categories are immutable.`,
90
+ };
91
+ }
92
+ // Warn if passes changed from true to false (regression)
93
+ if (originalFeat.passes && !updatedFeat.passes) {
94
+ warnings.push(`Feature ${originalFeat.id} regressed from passing to failing.`);
95
+ }
96
+ }
97
+ return {
98
+ valid: true,
99
+ warnings: warnings.length > 0 ? warnings : undefined,
100
+ };
101
+ }
102
+ /**
103
+ * Get the next feature to work on (highest priority failing feature)
104
+ */
105
+ export function getNextFeature(featureList) {
106
+ const failingFeatures = featureList.features
107
+ .filter(f => !f.passes)
108
+ .sort((a, b) => a.priority - b.priority);
109
+ return failingFeatures[0] || null;
110
+ }
111
+ /**
112
+ * Mark a feature as passing
113
+ */
114
+ export function markFeaturePassing(featureList, featureId, notes) {
115
+ const feature = featureList.features.find(f => f.id === featureId);
116
+ if (feature) {
117
+ feature.passes = true;
118
+ feature.last_tested = new Date().toISOString();
119
+ if (notes) {
120
+ feature.notes = notes;
121
+ }
122
+ }
123
+ return featureList;
124
+ }
125
+ /**
126
+ * Get progress statistics
127
+ */
128
+ export function getProgressStats(featureList) {
129
+ const total = featureList.features.length;
130
+ const passing = featureList.features.filter(f => f.passes).length;
131
+ const failing = total - passing;
132
+ const byCategory = {};
133
+ for (const feature of featureList.features) {
134
+ if (!byCategory[feature.category]) {
135
+ byCategory[feature.category] = { passing: 0, total: 0 };
136
+ }
137
+ const categoryStats = byCategory[feature.category];
138
+ if (categoryStats) {
139
+ categoryStats.total++;
140
+ if (feature.passes) {
141
+ categoryStats.passing++;
142
+ }
143
+ }
144
+ }
145
+ return {
146
+ total,
147
+ passing,
148
+ failing,
149
+ percentage: total > 0 ? Math.round((passing / total) * 100) : 0,
150
+ byCategory,
151
+ };
152
+ }
153
+ /**
154
+ * Generate a progress report string
155
+ */
156
+ export function generateProgressReport(featureList) {
157
+ const stats = getProgressStats(featureList);
158
+ let report = `
159
+ ═══════════════════════════════════════════════════════
160
+ PROGRESS REPORT
161
+ ═══════════════════════════════════════════════════════
162
+
163
+ Project: ${featureList.project.name}
164
+ Last Updated: ${featureList.metadata.last_updated}
165
+
166
+ OVERALL PROGRESS: ${stats.passing}/${stats.total} (${stats.percentage}%)
167
+ ${"█".repeat(Math.floor(stats.percentage / 5))}${"░".repeat(20 - Math.floor(stats.percentage / 5))}
168
+
169
+ BY CATEGORY:
170
+ `;
171
+ for (const [category, catStats] of Object.entries(stats.byCategory)) {
172
+ const catPercent = catStats.total > 0
173
+ ? Math.round((catStats.passing / catStats.total) * 100)
174
+ : 0;
175
+ report += ` ${category.padEnd(15)} ${catStats.passing}/${catStats.total} (${catPercent}%)\n`;
176
+ }
177
+ report += `
178
+ ═══════════════════════════════════════════════════════
179
+ `;
180
+ return report;
181
+ }
182
+ export default {
183
+ loadFeatureList,
184
+ saveFeatureList,
185
+ validateFeatureListUpdate,
186
+ getNextFeature,
187
+ markFeaturePassing,
188
+ getProgressStats,
189
+ generateProgressReport,
190
+ };
191
+ //# sourceMappingURL=feature-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-list.js","sourceRoot":"","sources":["../../src/utils/feature-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Gemini Code Assist Detector
3
+ * Detects Gemini Code Assist subscription credentials and quota status.
4
+ * Supports both API key and Google Cloud auth flows.
5
+ *
6
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
7
+ * Licensed under CC BY-NC 4.0
8
+ */
9
+ /**
10
+ * Gemini credential structure
11
+ */
12
+ export interface GeminiCredentials {
13
+ apiKey?: string;
14
+ accessToken?: string;
15
+ refreshToken?: string;
16
+ expiresAt?: number;
17
+ projectId?: string;
18
+ quotaProjectId?: string;
19
+ email?: string;
20
+ tier?: 'free' | 'code_assist' | 'enterprise';
21
+ authMethod: 'api_key' | 'gcloud' | 'service_account';
22
+ }
23
+ /**
24
+ * Gemini quota information
25
+ */
26
+ export interface GeminiQuota {
27
+ requestsPerMinute: number;
28
+ requestsPerDay: number;
29
+ tokensPerMinute: number;
30
+ currentUsage?: {
31
+ requestsToday: number;
32
+ tokensToday: number;
33
+ lastReset: string;
34
+ };
35
+ }
36
+ /**
37
+ * Possible paths where Gemini credentials might be stored
38
+ */
39
+ export declare function getGeminiPaths(): string[];
40
+ /**
41
+ * Check if access token is expired
42
+ */
43
+ export declare function isTokenExpired(credentials: GeminiCredentials): boolean;
44
+ /**
45
+ * Refresh gcloud access token
46
+ */
47
+ export declare function refreshGCloudToken(): Promise<GeminiCredentials | null>;
48
+ /**
49
+ * Get quota information from the API
50
+ */
51
+ export declare function getQuotaInfo(credentials: GeminiCredentials): Promise<GeminiQuota | null>;
52
+ /**
53
+ * Validate Gemini credentials
54
+ */
55
+ export declare function validateGeminiCredentials(credentials: GeminiCredentials): Promise<boolean>;
56
+ /**
57
+ * Main detection function
58
+ */
59
+ export declare function detectGeminiCredentials(): Promise<GeminiCredentials | null>;
60
+ /**
61
+ * Get credential status string
62
+ */
63
+ export declare function getCredentialStatus(credentials: GeminiCredentials): string;
64
+ export default detectGeminiCredentials;
65
+ //# sourceMappingURL=gemini-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-detector.d.ts","sourceRoot":"","sources":["../../src/utils/gemini-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,CAAC;IAC7C,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,iBAAiB,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAwBzC;AAuJD;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAiBtE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAoB5E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA6B9F;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0CjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,GAAG,MAAM,CA6B1E;AAED,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Gemini Code Assist Detector
3
+ * Detects Gemini Code Assist subscription credentials and quota status.
4
+ * Supports both API key and Google Cloud auth flows.
5
+ *
6
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
7
+ * Licensed under CC BY-NC 4.0
8
+ */
9
+ import { existsSync, readFileSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { homedir } from 'os';
12
+ import { exec } from 'child_process';
13
+ import { promisify } from 'util';
14
+ const execAsync = promisify(exec);
15
+ /**
16
+ * Possible paths where Gemini credentials might be stored
17
+ */
18
+ export function getGeminiPaths() {
19
+ const home = homedir();
20
+ return [
21
+ // Gemini CLI paths
22
+ join(home, '.gemini', 'credentials.json'),
23
+ join(home, '.gemini', 'auth.json'),
24
+ join(home, '.config', 'gemini', 'credentials.json'),
25
+ // Google Cloud SDK paths
26
+ join(home, '.config', 'gcloud', 'application_default_credentials.json'),
27
+ join(home, '.config', 'gcloud', 'credentials.db'),
28
+ // Service account paths
29
+ join(home, '.config', 'gcloud', 'service_account.json'),
30
+ // Google AI Studio paths
31
+ join(home, '.google-ai', 'credentials.json'),
32
+ join(home, '.config', 'google-ai', 'credentials.json'),
33
+ // Windows-specific paths
34
+ join(process.env.APPDATA || '', 'gcloud', 'application_default_credentials.json'),
35
+ join(process.env.LOCALAPPDATA || '', 'Google', 'Cloud SDK', 'credentials.json'),
36
+ ].filter(p => p && !p.startsWith(join('')));
37
+ }
38
+ /**
39
+ * Try to detect credentials using gcloud CLI
40
+ */
41
+ async function detectFromGCloudCLI() {
42
+ try {
43
+ // Check if gcloud is available and authenticated
44
+ const { stdout: authList } = await execAsync('gcloud auth list --format=json', {
45
+ timeout: 5000,
46
+ });
47
+ const accounts = JSON.parse(authList);
48
+ const activeAccount = accounts.find((a) => a.status === 'ACTIVE');
49
+ if (!activeAccount) {
50
+ return null;
51
+ }
52
+ // Get access token
53
+ const { stdout: tokenOutput } = await execAsync('gcloud auth print-access-token', {
54
+ timeout: 5000,
55
+ });
56
+ const accessToken = tokenOutput.trim();
57
+ if (!accessToken) {
58
+ return null;
59
+ }
60
+ // Get project info
61
+ let projectId;
62
+ try {
63
+ const { stdout: projectOutput } = await execAsync('gcloud config get-value project', {
64
+ timeout: 5000,
65
+ });
66
+ projectId = projectOutput.trim() || undefined;
67
+ }
68
+ catch {
69
+ // Project not set
70
+ }
71
+ return {
72
+ accessToken,
73
+ email: activeAccount.account,
74
+ projectId,
75
+ authMethod: 'gcloud',
76
+ tier: 'code_assist', // gcloud auth typically indicates Code Assist
77
+ };
78
+ }
79
+ catch {
80
+ // gcloud CLI not available
81
+ return null;
82
+ }
83
+ }
84
+ /**
85
+ * Try to detect credentials using gemini CLI
86
+ */
87
+ async function detectFromGeminiCLI() {
88
+ try {
89
+ // Try using gemini CLI to get auth info
90
+ const { stdout } = await execAsync('gemini auth show --format json', {
91
+ timeout: 5000,
92
+ });
93
+ const config = JSON.parse(stdout);
94
+ if (config.apiKey || config.api_key) {
95
+ return {
96
+ apiKey: config.apiKey || config.api_key,
97
+ projectId: config.projectId || config.project_id,
98
+ email: config.email,
99
+ authMethod: 'api_key',
100
+ tier: config.tier || 'free',
101
+ };
102
+ }
103
+ if (config.accessToken || config.access_token) {
104
+ return {
105
+ accessToken: config.accessToken || config.access_token,
106
+ refreshToken: config.refreshToken || config.refresh_token,
107
+ expiresAt: config.expiresAt || config.expires_at,
108
+ projectId: config.projectId || config.project_id,
109
+ email: config.email,
110
+ authMethod: 'gcloud',
111
+ tier: config.tier || 'code_assist',
112
+ };
113
+ }
114
+ return null;
115
+ }
116
+ catch {
117
+ // CLI not available
118
+ return null;
119
+ }
120
+ }
121
+ /**
122
+ * Try to detect credentials from file system
123
+ */
124
+ async function detectFromFiles() {
125
+ const paths = getGeminiPaths();
126
+ for (const path of paths) {
127
+ try {
128
+ if (!existsSync(path)) {
129
+ continue;
130
+ }
131
+ const content = readFileSync(path, 'utf-8');
132
+ const data = JSON.parse(content);
133
+ // Check for API key
134
+ if (data.api_key || data.apiKey) {
135
+ return {
136
+ apiKey: data.api_key || data.apiKey,
137
+ projectId: data.project_id || data.projectId,
138
+ quotaProjectId: data.quota_project_id || data.quotaProjectId,
139
+ email: data.email || data.client_email,
140
+ authMethod: 'api_key',
141
+ tier: 'free',
142
+ };
143
+ }
144
+ // Check for OAuth credentials (application_default_credentials.json)
145
+ if (data.type === 'authorized_user') {
146
+ return {
147
+ accessToken: data.access_token,
148
+ refreshToken: data.refresh_token,
149
+ email: data.client_email,
150
+ authMethod: 'gcloud',
151
+ tier: 'code_assist',
152
+ };
153
+ }
154
+ // Check for service account
155
+ if (data.type === 'service_account') {
156
+ return {
157
+ email: data.client_email,
158
+ projectId: data.project_id,
159
+ authMethod: 'service_account',
160
+ tier: 'enterprise',
161
+ };
162
+ }
163
+ }
164
+ catch {
165
+ // Failed to read or parse
166
+ continue;
167
+ }
168
+ }
169
+ return null;
170
+ }
171
+ /**
172
+ * Check if access token is expired
173
+ */
174
+ export function isTokenExpired(credentials) {
175
+ // API keys don't expire
176
+ if (credentials.authMethod === 'api_key' && credentials.apiKey) {
177
+ return false;
178
+ }
179
+ if (!credentials.expiresAt) {
180
+ return false;
181
+ }
182
+ let expiresAt = credentials.expiresAt;
183
+ if (expiresAt < 1e12) {
184
+ expiresAt *= 1000;
185
+ }
186
+ const graceMs = 5 * 60 * 1000;
187
+ return expiresAt - graceMs < Date.now();
188
+ }
189
+ /**
190
+ * Refresh gcloud access token
191
+ */
192
+ export async function refreshGCloudToken() {
193
+ try {
194
+ const { stdout } = await execAsync('gcloud auth print-access-token', {
195
+ timeout: 10000,
196
+ });
197
+ const accessToken = stdout.trim();
198
+ if (accessToken) {
199
+ return {
200
+ accessToken,
201
+ authMethod: 'gcloud',
202
+ // Token expires in 1 hour typically
203
+ expiresAt: Date.now() + 60 * 60 * 1000,
204
+ };
205
+ }
206
+ return null;
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ }
212
+ /**
213
+ * Get quota information from the API
214
+ */
215
+ export async function getQuotaInfo(credentials) {
216
+ try {
217
+ const key = credentials.apiKey || credentials.accessToken;
218
+ if (!key)
219
+ return null;
220
+ // Default quotas based on tier
221
+ const quotas = {
222
+ free: {
223
+ requestsPerMinute: 60,
224
+ requestsPerDay: 1500,
225
+ tokensPerMinute: 32000,
226
+ },
227
+ code_assist: {
228
+ requestsPerMinute: 1000,
229
+ requestsPerDay: 50000,
230
+ tokensPerMinute: 120000,
231
+ },
232
+ enterprise: {
233
+ requestsPerMinute: 10000,
234
+ requestsPerDay: 500000,
235
+ tokensPerMinute: 1000000,
236
+ },
237
+ };
238
+ const quota = quotas[credentials.tier || 'free'];
239
+ return quota || null;
240
+ }
241
+ catch {
242
+ return null;
243
+ }
244
+ }
245
+ /**
246
+ * Validate Gemini credentials
247
+ */
248
+ export async function validateGeminiCredentials(credentials) {
249
+ try {
250
+ const key = credentials.apiKey || credentials.accessToken;
251
+ if (!key)
252
+ return false;
253
+ const url = credentials.apiKey
254
+ ? `https://generativelanguage.googleapis.com/v1beta/models?key=${key}`
255
+ : 'https://generativelanguage.googleapis.com/v1beta/models';
256
+ const headers = {};
257
+ if (credentials.accessToken) {
258
+ headers['Authorization'] = `Bearer ${credentials.accessToken}`;
259
+ }
260
+ const response = await fetch(url, { method: 'GET', headers });
261
+ return response.status === 200;
262
+ }
263
+ catch {
264
+ return true; // Assume valid on network error
265
+ }
266
+ }
267
+ /**
268
+ * Main detection function
269
+ */
270
+ export async function detectGeminiCredentials() {
271
+ // Check environment variable first
272
+ const envApiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;
273
+ if (envApiKey) {
274
+ return {
275
+ apiKey: envApiKey,
276
+ authMethod: 'api_key',
277
+ tier: 'free',
278
+ };
279
+ }
280
+ // Try Gemini CLI
281
+ const geminiCreds = await detectFromGeminiCLI();
282
+ if (geminiCreds) {
283
+ if (!isTokenExpired(geminiCreds)) {
284
+ return geminiCreds;
285
+ }
286
+ }
287
+ // Try gcloud CLI
288
+ const gcloudCreds = await detectFromGCloudCLI();
289
+ if (gcloudCreds) {
290
+ return gcloudCreds;
291
+ }
292
+ // Try file detection
293
+ const fileCreds = await detectFromFiles();
294
+ if (fileCreds) {
295
+ if (!isTokenExpired(fileCreds)) {
296
+ return fileCreds;
297
+ }
298
+ // Try refresh for gcloud auth
299
+ if (fileCreds.authMethod === 'gcloud') {
300
+ const refreshed = await refreshGCloudToken();
301
+ if (refreshed) {
302
+ return { ...fileCreds, ...refreshed };
303
+ }
304
+ }
305
+ }
306
+ return null;
307
+ }
308
+ /**
309
+ * Get credential status string
310
+ */
311
+ export function getCredentialStatus(credentials) {
312
+ const parts = [];
313
+ parts.push(`Method: ${credentials.authMethod}`);
314
+ parts.push(`Tier: ${credentials.tier || 'unknown'}`);
315
+ if (credentials.email) {
316
+ parts.push(`Email: ${credentials.email}`);
317
+ }
318
+ if (credentials.projectId) {
319
+ parts.push(`Project: ${credentials.projectId}`);
320
+ }
321
+ if (credentials.authMethod === 'api_key') {
322
+ parts.push('Status: Valid (API key)');
323
+ }
324
+ else if (credentials.expiresAt) {
325
+ const msUntil = credentials.expiresAt - Date.now();
326
+ if (msUntil <= 0) {
327
+ parts.push('Status: Expired');
328
+ }
329
+ else {
330
+ const minsUntil = Math.ceil(msUntil / (60 * 1000));
331
+ parts.push(`Expires in: ${minsUntil} minutes`);
332
+ }
333
+ }
334
+ else {
335
+ parts.push('Status: Valid');
336
+ }
337
+ return parts.join(' | ');
338
+ }
339
+ export default detectGeminiCredentials;
340
+ //# sourceMappingURL=gemini-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-detector.js","sourceRoot":"","sources":["../../src/utils/gemini-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Enhanced Git Utilities
3
+ * Provides git operations, conflict detection, branch management, and change tracking.
4
+ */
5
+ /**
6
+ * Git status information
7
+ */
8
+ export interface GitStatus {
9
+ hasChanges: boolean;
10
+ hasUncommittedChanges: boolean;
11
+ hasUntrackedFiles: boolean;
12
+ hasConflicts: boolean;
13
+ currentBranch: string | null;
14
+ aheadOfRemote: number;
15
+ behindRemote: number;
16
+ lastCommit: string | null;
17
+ lastCommitMessage: string | null;
18
+ }
19
+ /**
20
+ * Check if git is initialized
21
+ */
22
+ export declare function isGitInitialized(): boolean;
23
+ /**
24
+ * Get git status summary
25
+ * Note: This provides hints - actual status requires running git commands
26
+ */
27
+ export declare function getGitStatus(): GitStatus;
28
+ /**
29
+ * Check for merge conflicts
30
+ */
31
+ export declare function hasMergeConflicts(): boolean;
32
+ /**
33
+ * Generate git status summary for agent prompts
34
+ */
35
+ export declare function generateGitSummary(): string;
36
+ /**
37
+ * Get recommended git workflow
38
+ */
39
+ export declare function getGitWorkflow(): string[];
40
+ declare const _default: {
41
+ isGitInitialized: typeof isGitInitialized;
42
+ getGitStatus: typeof getGitStatus;
43
+ hasMergeConflicts: typeof hasMergeConflicts;
44
+ generateGitSummary: typeof generateGitSummary;
45
+ getGitWorkflow: typeof getGitWorkflow;
46
+ };
47
+ export default _default;
48
+ //# sourceMappingURL=git-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,SAAS,CA+BxC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAgB3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA2B3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAQzC;;;;;;;;AAED,wBAME"}