@generacy-ai/generacy 0.0.0-preview-20260304013206

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 (244) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +207 -0
  3. package/bin/generacy.js +11 -0
  4. package/dist/agency/index.d.ts +68 -0
  5. package/dist/agency/index.d.ts.map +1 -0
  6. package/dist/agency/index.js +28 -0
  7. package/dist/agency/index.js.map +1 -0
  8. package/dist/agency/network.d.ts +41 -0
  9. package/dist/agency/network.d.ts.map +1 -0
  10. package/dist/agency/network.js +133 -0
  11. package/dist/agency/network.js.map +1 -0
  12. package/dist/agency/subprocess.d.ts +58 -0
  13. package/dist/agency/subprocess.d.ts.map +1 -0
  14. package/dist/agency/subprocess.js +216 -0
  15. package/dist/agency/subprocess.js.map +1 -0
  16. package/dist/cli/commands/agent.d.ts +10 -0
  17. package/dist/cli/commands/agent.d.ts.map +1 -0
  18. package/dist/cli/commands/agent.js +216 -0
  19. package/dist/cli/commands/agent.js.map +1 -0
  20. package/dist/cli/commands/doctor/checks/agency-mcp.d.ts +3 -0
  21. package/dist/cli/commands/doctor/checks/agency-mcp.d.ts.map +1 -0
  22. package/dist/cli/commands/doctor/checks/agency-mcp.js +51 -0
  23. package/dist/cli/commands/doctor/checks/agency-mcp.js.map +1 -0
  24. package/dist/cli/commands/doctor/checks/anthropic-key.d.ts +3 -0
  25. package/dist/cli/commands/doctor/checks/anthropic-key.d.ts.map +1 -0
  26. package/dist/cli/commands/doctor/checks/anthropic-key.js +68 -0
  27. package/dist/cli/commands/doctor/checks/anthropic-key.js.map +1 -0
  28. package/dist/cli/commands/doctor/checks/config.d.ts +3 -0
  29. package/dist/cli/commands/doctor/checks/config.d.ts.map +1 -0
  30. package/dist/cli/commands/doctor/checks/config.js +81 -0
  31. package/dist/cli/commands/doctor/checks/config.js.map +1 -0
  32. package/dist/cli/commands/doctor/checks/devcontainer.d.ts +3 -0
  33. package/dist/cli/commands/doctor/checks/devcontainer.d.ts.map +1 -0
  34. package/dist/cli/commands/doctor/checks/devcontainer.js +58 -0
  35. package/dist/cli/commands/doctor/checks/devcontainer.js.map +1 -0
  36. package/dist/cli/commands/doctor/checks/docker.d.ts +3 -0
  37. package/dist/cli/commands/doctor/checks/docker.d.ts.map +1 -0
  38. package/dist/cli/commands/doctor/checks/docker.js +71 -0
  39. package/dist/cli/commands/doctor/checks/docker.js.map +1 -0
  40. package/dist/cli/commands/doctor/checks/env-file.d.ts +3 -0
  41. package/dist/cli/commands/doctor/checks/env-file.d.ts.map +1 -0
  42. package/dist/cli/commands/doctor/checks/env-file.js +56 -0
  43. package/dist/cli/commands/doctor/checks/env-file.js.map +1 -0
  44. package/dist/cli/commands/doctor/checks/github-token.d.ts +3 -0
  45. package/dist/cli/commands/doctor/checks/github-token.d.ts.map +1 -0
  46. package/dist/cli/commands/doctor/checks/github-token.js +99 -0
  47. package/dist/cli/commands/doctor/checks/github-token.js.map +1 -0
  48. package/dist/cli/commands/doctor/checks/npm-packages.d.ts +3 -0
  49. package/dist/cli/commands/doctor/checks/npm-packages.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor/checks/npm-packages.js +117 -0
  51. package/dist/cli/commands/doctor/checks/npm-packages.js.map +1 -0
  52. package/dist/cli/commands/doctor/formatter.d.ts +27 -0
  53. package/dist/cli/commands/doctor/formatter.d.ts.map +1 -0
  54. package/dist/cli/commands/doctor/formatter.js +162 -0
  55. package/dist/cli/commands/doctor/formatter.js.map +1 -0
  56. package/dist/cli/commands/doctor/index.d.ts +5 -0
  57. package/dist/cli/commands/doctor/index.d.ts.map +1 -0
  58. package/dist/cli/commands/doctor/index.js +8 -0
  59. package/dist/cli/commands/doctor/index.js.map +1 -0
  60. package/dist/cli/commands/doctor/registry.d.ts +48 -0
  61. package/dist/cli/commands/doctor/registry.d.ts.map +1 -0
  62. package/dist/cli/commands/doctor/registry.js +166 -0
  63. package/dist/cli/commands/doctor/registry.js.map +1 -0
  64. package/dist/cli/commands/doctor/runner.d.ts +14 -0
  65. package/dist/cli/commands/doctor/runner.d.ts.map +1 -0
  66. package/dist/cli/commands/doctor/runner.js +257 -0
  67. package/dist/cli/commands/doctor/runner.js.map +1 -0
  68. package/dist/cli/commands/doctor/types.d.ts +87 -0
  69. package/dist/cli/commands/doctor/types.d.ts.map +1 -0
  70. package/dist/cli/commands/doctor/types.js +2 -0
  71. package/dist/cli/commands/doctor/types.js.map +1 -0
  72. package/dist/cli/commands/doctor.d.ts +12 -0
  73. package/dist/cli/commands/doctor.d.ts.map +1 -0
  74. package/dist/cli/commands/doctor.js +97 -0
  75. package/dist/cli/commands/doctor.js.map +1 -0
  76. package/dist/cli/commands/init/conflicts.d.ts +36 -0
  77. package/dist/cli/commands/init/conflicts.d.ts.map +1 -0
  78. package/dist/cli/commands/init/conflicts.js +165 -0
  79. package/dist/cli/commands/init/conflicts.js.map +1 -0
  80. package/dist/cli/commands/init/github.d.ts +32 -0
  81. package/dist/cli/commands/init/github.d.ts.map +1 -0
  82. package/dist/cli/commands/init/github.js +161 -0
  83. package/dist/cli/commands/init/github.js.map +1 -0
  84. package/dist/cli/commands/init/index.d.ts +21 -0
  85. package/dist/cli/commands/init/index.d.ts.map +1 -0
  86. package/dist/cli/commands/init/index.js +175 -0
  87. package/dist/cli/commands/init/index.js.map +1 -0
  88. package/dist/cli/commands/init/prompts.d.ts +15 -0
  89. package/dist/cli/commands/init/prompts.d.ts.map +1 -0
  90. package/dist/cli/commands/init/prompts.js +281 -0
  91. package/dist/cli/commands/init/prompts.js.map +1 -0
  92. package/dist/cli/commands/init/repo-utils.d.ts +32 -0
  93. package/dist/cli/commands/init/repo-utils.d.ts.map +1 -0
  94. package/dist/cli/commands/init/repo-utils.js +112 -0
  95. package/dist/cli/commands/init/repo-utils.js.map +1 -0
  96. package/dist/cli/commands/init/resolver.d.ts +20 -0
  97. package/dist/cli/commands/init/resolver.d.ts.map +1 -0
  98. package/dist/cli/commands/init/resolver.js +273 -0
  99. package/dist/cli/commands/init/resolver.js.map +1 -0
  100. package/dist/cli/commands/init/summary.d.ts +21 -0
  101. package/dist/cli/commands/init/summary.d.ts.map +1 -0
  102. package/dist/cli/commands/init/summary.js +100 -0
  103. package/dist/cli/commands/init/summary.js.map +1 -0
  104. package/dist/cli/commands/init/types.d.ts +53 -0
  105. package/dist/cli/commands/init/types.d.ts.map +1 -0
  106. package/dist/cli/commands/init/types.js +2 -0
  107. package/dist/cli/commands/init/types.js.map +1 -0
  108. package/dist/cli/commands/init/writer.d.ts +22 -0
  109. package/dist/cli/commands/init/writer.d.ts.map +1 -0
  110. package/dist/cli/commands/init/writer.js +96 -0
  111. package/dist/cli/commands/init/writer.js.map +1 -0
  112. package/dist/cli/commands/orchestrator.d.ts +11 -0
  113. package/dist/cli/commands/orchestrator.d.ts.map +1 -0
  114. package/dist/cli/commands/orchestrator.js +291 -0
  115. package/dist/cli/commands/orchestrator.js.map +1 -0
  116. package/dist/cli/commands/run.d.ts +10 -0
  117. package/dist/cli/commands/run.d.ts.map +1 -0
  118. package/dist/cli/commands/run.js +167 -0
  119. package/dist/cli/commands/run.js.map +1 -0
  120. package/dist/cli/commands/setup/auth.d.ts +11 -0
  121. package/dist/cli/commands/setup/auth.d.ts.map +1 -0
  122. package/dist/cli/commands/setup/auth.js +108 -0
  123. package/dist/cli/commands/setup/auth.js.map +1 -0
  124. package/dist/cli/commands/setup/build.d.ts +11 -0
  125. package/dist/cli/commands/setup/build.d.ts.map +1 -0
  126. package/dist/cli/commands/setup/build.js +212 -0
  127. package/dist/cli/commands/setup/build.js.map +1 -0
  128. package/dist/cli/commands/setup/services.d.ts +11 -0
  129. package/dist/cli/commands/setup/services.d.ts.map +1 -0
  130. package/dist/cli/commands/setup/services.js +294 -0
  131. package/dist/cli/commands/setup/services.js.map +1 -0
  132. package/dist/cli/commands/setup/workspace.d.ts +11 -0
  133. package/dist/cli/commands/setup/workspace.d.ts.map +1 -0
  134. package/dist/cli/commands/setup/workspace.js +215 -0
  135. package/dist/cli/commands/setup/workspace.js.map +1 -0
  136. package/dist/cli/commands/setup.d.ts +7 -0
  137. package/dist/cli/commands/setup.d.ts.map +1 -0
  138. package/dist/cli/commands/setup.js +19 -0
  139. package/dist/cli/commands/setup.js.map +1 -0
  140. package/dist/cli/commands/validate.d.ts +10 -0
  141. package/dist/cli/commands/validate.d.ts.map +1 -0
  142. package/dist/cli/commands/validate.js +164 -0
  143. package/dist/cli/commands/validate.js.map +1 -0
  144. package/dist/cli/commands/worker.d.ts +10 -0
  145. package/dist/cli/commands/worker.d.ts.map +1 -0
  146. package/dist/cli/commands/worker.js +224 -0
  147. package/dist/cli/commands/worker.js.map +1 -0
  148. package/dist/cli/index.d.ts +14 -0
  149. package/dist/cli/index.d.ts.map +1 -0
  150. package/dist/cli/index.js +68 -0
  151. package/dist/cli/index.js.map +1 -0
  152. package/dist/cli/utils/config.d.ts +49 -0
  153. package/dist/cli/utils/config.d.ts.map +1 -0
  154. package/dist/cli/utils/config.js +110 -0
  155. package/dist/cli/utils/config.js.map +1 -0
  156. package/dist/cli/utils/exec.d.ts +39 -0
  157. package/dist/cli/utils/exec.d.ts.map +1 -0
  158. package/dist/cli/utils/exec.js +68 -0
  159. package/dist/cli/utils/exec.js.map +1 -0
  160. package/dist/cli/utils/logger.d.ts +47 -0
  161. package/dist/cli/utils/logger.d.ts.map +1 -0
  162. package/dist/cli/utils/logger.js +97 -0
  163. package/dist/cli/utils/logger.js.map +1 -0
  164. package/dist/config/index.d.ts +10 -0
  165. package/dist/config/index.d.ts.map +1 -0
  166. package/dist/config/index.js +13 -0
  167. package/dist/config/index.js.map +1 -0
  168. package/dist/config/loader.d.ts +104 -0
  169. package/dist/config/loader.d.ts.map +1 -0
  170. package/dist/config/loader.js +266 -0
  171. package/dist/config/loader.js.map +1 -0
  172. package/dist/config/schema.d.ts +304 -0
  173. package/dist/config/schema.d.ts.map +1 -0
  174. package/dist/config/schema.js +160 -0
  175. package/dist/config/schema.js.map +1 -0
  176. package/dist/config/validator.d.ts +60 -0
  177. package/dist/config/validator.d.ts.map +1 -0
  178. package/dist/config/validator.js +112 -0
  179. package/dist/config/validator.js.map +1 -0
  180. package/dist/health/server.d.ts +47 -0
  181. package/dist/health/server.d.ts.map +1 -0
  182. package/dist/health/server.js +92 -0
  183. package/dist/health/server.js.map +1 -0
  184. package/dist/index.d.ts +21 -0
  185. package/dist/index.d.ts.map +1 -0
  186. package/dist/index.js +22 -0
  187. package/dist/index.js.map +1 -0
  188. package/dist/orchestrator/async-event-queue.d.ts +28 -0
  189. package/dist/orchestrator/async-event-queue.d.ts.map +1 -0
  190. package/dist/orchestrator/async-event-queue.js +57 -0
  191. package/dist/orchestrator/async-event-queue.js.map +1 -0
  192. package/dist/orchestrator/client.d.ts +110 -0
  193. package/dist/orchestrator/client.d.ts.map +1 -0
  194. package/dist/orchestrator/client.js +288 -0
  195. package/dist/orchestrator/client.js.map +1 -0
  196. package/dist/orchestrator/event-bus.d.ts +195 -0
  197. package/dist/orchestrator/event-bus.d.ts.map +1 -0
  198. package/dist/orchestrator/event-bus.js +557 -0
  199. package/dist/orchestrator/event-bus.js.map +1 -0
  200. package/dist/orchestrator/heartbeat.d.ts +71 -0
  201. package/dist/orchestrator/heartbeat.d.ts.map +1 -0
  202. package/dist/orchestrator/heartbeat.js +116 -0
  203. package/dist/orchestrator/heartbeat.js.map +1 -0
  204. package/dist/orchestrator/index.d.ts +25 -0
  205. package/dist/orchestrator/index.d.ts.map +1 -0
  206. package/dist/orchestrator/index.js +15 -0
  207. package/dist/orchestrator/index.js.map +1 -0
  208. package/dist/orchestrator/job-handler.d.ts +109 -0
  209. package/dist/orchestrator/job-handler.d.ts.map +1 -0
  210. package/dist/orchestrator/job-handler.js +612 -0
  211. package/dist/orchestrator/job-handler.js.map +1 -0
  212. package/dist/orchestrator/job-queue.d.ts +81 -0
  213. package/dist/orchestrator/job-queue.d.ts.map +1 -0
  214. package/dist/orchestrator/job-queue.js +206 -0
  215. package/dist/orchestrator/job-queue.js.map +1 -0
  216. package/dist/orchestrator/label-monitor-bridge.d.ts +25 -0
  217. package/dist/orchestrator/label-monitor-bridge.d.ts.map +1 -0
  218. package/dist/orchestrator/label-monitor-bridge.js +57 -0
  219. package/dist/orchestrator/label-monitor-bridge.js.map +1 -0
  220. package/dist/orchestrator/log-buffer.d.ts +74 -0
  221. package/dist/orchestrator/log-buffer.d.ts.map +1 -0
  222. package/dist/orchestrator/log-buffer.js +104 -0
  223. package/dist/orchestrator/log-buffer.js.map +1 -0
  224. package/dist/orchestrator/redis-job-queue.d.ts +44 -0
  225. package/dist/orchestrator/redis-job-queue.d.ts.map +1 -0
  226. package/dist/orchestrator/redis-job-queue.js +300 -0
  227. package/dist/orchestrator/redis-job-queue.js.map +1 -0
  228. package/dist/orchestrator/router.d.ts +125 -0
  229. package/dist/orchestrator/router.d.ts.map +1 -0
  230. package/dist/orchestrator/router.js +143 -0
  231. package/dist/orchestrator/router.js.map +1 -0
  232. package/dist/orchestrator/server.d.ts +62 -0
  233. package/dist/orchestrator/server.d.ts.map +1 -0
  234. package/dist/orchestrator/server.js +711 -0
  235. package/dist/orchestrator/server.js.map +1 -0
  236. package/dist/orchestrator/types.d.ts +184 -0
  237. package/dist/orchestrator/types.d.ts.map +1 -0
  238. package/dist/orchestrator/types.js +6 -0
  239. package/dist/orchestrator/types.js.map +1 -0
  240. package/dist/orchestrator/worker-registry.d.ts +110 -0
  241. package/dist/orchestrator/worker-registry.d.ts.map +1 -0
  242. package/dist/orchestrator/worker-registry.js +191 -0
  243. package/dist/orchestrator/worker-registry.js.map +1 -0
  244. package/package.json +80 -0
@@ -0,0 +1,257 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Constants
3
+ // ---------------------------------------------------------------------------
4
+ /** Default timeout for checks that involve network calls (ms). */
5
+ const CHECK_TIMEOUT_MS = 5_000;
6
+ /** Categories that involve network calls and should be subject to timeout. */
7
+ const NETWORK_CATEGORIES = new Set(['credentials', 'services']);
8
+ // ---------------------------------------------------------------------------
9
+ // runChecks — main entry point
10
+ // ---------------------------------------------------------------------------
11
+ /**
12
+ * Execute an ordered list of checks, running independent checks concurrently
13
+ * within each dependency tier.
14
+ *
15
+ * The `checks` array **must** be in topological (dependency) order — as
16
+ * returned by `CheckRegistry.resolve()`. The runner groups them into tiers
17
+ * where all items in a tier have their dependencies satisfied by earlier tiers,
18
+ * then runs each tier concurrently via `Promise.all`.
19
+ *
20
+ * @returns A `DoctorReport` containing per-check results and a summary.
21
+ */
22
+ export async function runChecks(checks, options) {
23
+ // Shared mutable context populated progressively by checks
24
+ const context = {
25
+ configPath: null,
26
+ config: null,
27
+ envVars: null,
28
+ inDevContainer: !!process.env.REMOTE_CONTAINERS,
29
+ verbose: options.verbose ?? false,
30
+ projectRoot: null,
31
+ };
32
+ // Outcomes keyed by check ID
33
+ const outcomes = new Map();
34
+ // Build execution tiers
35
+ const tiers = buildTiers(checks);
36
+ for (const tier of tiers) {
37
+ await Promise.all(tier.map(async (check) => {
38
+ const outcome = await executeCheck(check, context, outcomes);
39
+ outcomes.set(check.id, outcome);
40
+ }));
41
+ }
42
+ // Assemble report
43
+ const entries = checks.map((check) => {
44
+ const outcome = outcomes.get(check.id);
45
+ const entry = {
46
+ id: check.id,
47
+ label: check.label,
48
+ category: check.category,
49
+ status: outcome.result.status,
50
+ message: outcome.result.message,
51
+ duration_ms: outcome.duration_ms,
52
+ };
53
+ if (outcome.result.suggestion)
54
+ entry.suggestion = outcome.result.suggestion;
55
+ if (outcome.result.detail)
56
+ entry.detail = outcome.result.detail;
57
+ return entry;
58
+ });
59
+ const summary = computeSummary(entries);
60
+ const exitCode = computeExitCode(entries);
61
+ return {
62
+ version: 1,
63
+ timestamp: new Date().toISOString(),
64
+ summary,
65
+ checks: entries,
66
+ exitCode,
67
+ };
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Tier building
71
+ // ---------------------------------------------------------------------------
72
+ /**
73
+ * Group checks into execution tiers. Each tier contains checks whose
74
+ * dependencies all appear in earlier tiers (or have no dependencies).
75
+ *
76
+ * Assumes `checks` is already in topological order.
77
+ */
78
+ function buildTiers(checks) {
79
+ const tiers = [];
80
+ // Track which tier each check is assigned to
81
+ const tierIndex = new Map();
82
+ for (const check of checks) {
83
+ // The earliest tier this check can run in is one past the highest tier
84
+ // of any of its dependencies.
85
+ let maxDepTier = -1;
86
+ for (const dep of check.dependencies) {
87
+ const depTier = tierIndex.get(dep);
88
+ if (depTier !== undefined && depTier > maxDepTier) {
89
+ maxDepTier = depTier;
90
+ }
91
+ }
92
+ const myTier = maxDepTier + 1;
93
+ tierIndex.set(check.id, myTier);
94
+ while (tiers.length <= myTier) {
95
+ tiers.push([]);
96
+ }
97
+ tiers[myTier].push(check);
98
+ }
99
+ return tiers;
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // Single check execution
103
+ // ---------------------------------------------------------------------------
104
+ /**
105
+ * Execute a single check, handling:
106
+ * - Dependency skip propagation
107
+ * - Timeout wrapping for network checks
108
+ * - Context merging from result data
109
+ * - Duration tracking
110
+ */
111
+ async function executeCheck(check, context, outcomes) {
112
+ // Check if any dependency failed or was skipped due to a failure
113
+ const failedDep = findFailedDependency(check, outcomes);
114
+ if (failedDep) {
115
+ return {
116
+ result: {
117
+ status: 'skip',
118
+ message: `Skipped — dependency '${failedDep}' failed`,
119
+ },
120
+ duration_ms: 0,
121
+ };
122
+ }
123
+ const start = performance.now();
124
+ try {
125
+ let result;
126
+ if (NETWORK_CATEGORIES.has(check.category)) {
127
+ result = await withTimeout(check.run(context), CHECK_TIMEOUT_MS, check.id);
128
+ }
129
+ else {
130
+ result = await check.run(context);
131
+ }
132
+ // Merge any data the check wants to share into the context
133
+ if (result.data) {
134
+ mergeContextData(context, result.data);
135
+ }
136
+ const duration_ms = Math.round(performance.now() - start);
137
+ return { result, duration_ms };
138
+ }
139
+ catch (error) {
140
+ const duration_ms = Math.round(performance.now() - start);
141
+ return {
142
+ result: {
143
+ status: 'fail',
144
+ message: `Internal error: ${error instanceof Error ? error.message : String(error)}`,
145
+ detail: error instanceof Error ? error.stack : undefined,
146
+ },
147
+ duration_ms,
148
+ };
149
+ }
150
+ }
151
+ // ---------------------------------------------------------------------------
152
+ // Dependency failure detection
153
+ // ---------------------------------------------------------------------------
154
+ /**
155
+ * Returns the ID of the first dependency that failed (status `'fail'`) or
156
+ * was itself skipped due to a dependency failure. Returns `undefined` if
157
+ * all dependencies passed or warned.
158
+ */
159
+ function findFailedDependency(check, outcomes) {
160
+ for (const depId of check.dependencies) {
161
+ const depOutcome = outcomes.get(depId);
162
+ if (!depOutcome)
163
+ continue; // not yet run — shouldn't happen in tier model
164
+ if (depOutcome.result.status === 'fail' || depOutcome.result.status === 'skip') {
165
+ return depId;
166
+ }
167
+ }
168
+ return undefined;
169
+ }
170
+ // ---------------------------------------------------------------------------
171
+ // Timeout wrapper
172
+ // ---------------------------------------------------------------------------
173
+ /**
174
+ * Wrap a check promise with a timeout. If the check doesn't resolve within
175
+ * `ms` milliseconds, return a `fail` result.
176
+ */
177
+ async function withTimeout(promise, ms, checkId) {
178
+ let timeoutId;
179
+ const timeoutPromise = new Promise((resolve) => {
180
+ timeoutId = setTimeout(() => {
181
+ resolve({
182
+ status: 'fail',
183
+ message: `Check timed out after ${ms / 1000}s`,
184
+ suggestion: `The '${checkId}' check did not respond within ${ms / 1000} seconds. Check your network connection.`,
185
+ });
186
+ }, ms);
187
+ });
188
+ try {
189
+ return await Promise.race([promise, timeoutPromise]);
190
+ }
191
+ finally {
192
+ if (timeoutId !== undefined) {
193
+ clearTimeout(timeoutId);
194
+ }
195
+ }
196
+ }
197
+ // ---------------------------------------------------------------------------
198
+ // Context merging
199
+ // ---------------------------------------------------------------------------
200
+ /**
201
+ * Merge data from a check result into the shared context. Only known
202
+ * context keys are merged.
203
+ */
204
+ function mergeContextData(context, data) {
205
+ if ('configPath' in data && typeof data.configPath === 'string') {
206
+ context.configPath = data.configPath;
207
+ }
208
+ if ('config' in data && data.config !== undefined) {
209
+ context.config = data.config;
210
+ }
211
+ if ('envVars' in data && data.envVars !== undefined) {
212
+ context.envVars = data.envVars;
213
+ }
214
+ if ('projectRoot' in data && typeof data.projectRoot === 'string') {
215
+ context.projectRoot = data.projectRoot;
216
+ }
217
+ }
218
+ // ---------------------------------------------------------------------------
219
+ // Summary & exit code
220
+ // ---------------------------------------------------------------------------
221
+ function computeSummary(entries) {
222
+ let passed = 0;
223
+ let failed = 0;
224
+ let warnings = 0;
225
+ let skipped = 0;
226
+ for (const entry of entries) {
227
+ switch (entry.status) {
228
+ case 'pass':
229
+ passed++;
230
+ break;
231
+ case 'fail':
232
+ failed++;
233
+ break;
234
+ case 'warn':
235
+ warnings++;
236
+ break;
237
+ case 'skip':
238
+ skipped++;
239
+ break;
240
+ }
241
+ }
242
+ return { passed, failed, warnings, skipped, total: entries.length };
243
+ }
244
+ function computeExitCode(entries) {
245
+ for (const entry of entries) {
246
+ if (entry.message.startsWith('Internal error:')) {
247
+ return 2;
248
+ }
249
+ }
250
+ for (const entry of entries) {
251
+ if (entry.status === 'fail') {
252
+ return 1;
253
+ }
254
+ }
255
+ return 0;
256
+ }
257
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import type { GeneracyConfig } from '../../../config/index.js';
2
+ export type CheckCategory = 'system' | 'config' | 'credentials' | 'packages' | 'services';
3
+ export interface CheckDefinition {
4
+ /** Unique identifier, e.g. 'docker', 'config', 'github-token'. */
5
+ id: string;
6
+ /** Human-readable label shown in output. */
7
+ label: string;
8
+ /** Category for grouping: system, config, credentials, packages, services. */
9
+ category: CheckCategory;
10
+ /** IDs of checks that must pass before this one runs. */
11
+ dependencies: string[];
12
+ /** Priority: P1 checks always run; P2 can be skipped. */
13
+ priority: 'P1' | 'P2';
14
+ /** The check function. */
15
+ run: (context: CheckContext) => Promise<CheckResult>;
16
+ /** Optional auto-fix function (reserved for future use). */
17
+ fix?: (context: CheckContext) => Promise<FixResult>;
18
+ }
19
+ export interface CheckContext {
20
+ /** Resolved config file path (null if not yet found). */
21
+ configPath: string | null;
22
+ /** Parsed config (null if config check failed or hasn't run). */
23
+ config: GeneracyConfig | null;
24
+ /** Parsed env vars from .generacy/generacy.env. */
25
+ envVars: Record<string, string> | null;
26
+ /** Whether running inside a dev container. */
27
+ inDevContainer: boolean;
28
+ /** Whether --verbose was passed. */
29
+ verbose: boolean;
30
+ /** Project root directory (null if not yet resolved). */
31
+ projectRoot: string | null;
32
+ }
33
+ export interface CheckResult {
34
+ /** Outcome of the check. */
35
+ status: 'pass' | 'fail' | 'warn' | 'skip';
36
+ /** Short description of the result. */
37
+ message: string;
38
+ /** Actionable fix suggestion (shown on fail/warn). */
39
+ suggestion?: string;
40
+ /** Additional detail shown in --verbose mode. */
41
+ detail?: string;
42
+ /** Data to merge into CheckContext for dependent checks. */
43
+ data?: Record<string, unknown>;
44
+ }
45
+ export interface DoctorOptions {
46
+ /** Run only these checks (and their transitive dependencies). */
47
+ check?: string[];
48
+ /** Skip these checks. */
49
+ skip?: string[];
50
+ /** Output results as JSON. */
51
+ json?: boolean;
52
+ /** Show detailed diagnostic information. */
53
+ verbose?: boolean;
54
+ /** Attempt to auto-fix detected issues (reserved for future use). */
55
+ fix?: boolean;
56
+ }
57
+ export interface DoctorReportCheckEntry {
58
+ id: string;
59
+ label: string;
60
+ category: CheckCategory;
61
+ status: 'pass' | 'fail' | 'warn' | 'skip';
62
+ message: string;
63
+ suggestion?: string;
64
+ detail?: string;
65
+ duration_ms?: number;
66
+ }
67
+ export interface DoctorReportSummary {
68
+ passed: number;
69
+ failed: number;
70
+ warnings: number;
71
+ skipped: number;
72
+ total: number;
73
+ }
74
+ export interface DoctorReport {
75
+ version: number;
76
+ timestamp: string;
77
+ summary: DoctorReportSummary;
78
+ checks: DoctorReportCheckEntry[];
79
+ exitCode: 0 | 1 | 2;
80
+ }
81
+ export interface FixResult {
82
+ /** Whether the fix was applied successfully. */
83
+ success: boolean;
84
+ /** Description of what was done (or why it failed). */
85
+ message: string;
86
+ }
87
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Doctor command definition.
3
+ * Validates the full development environment setup by running a series of
4
+ * categorized health checks with color-coded pass/fail/warning output and
5
+ * actionable fix suggestions.
6
+ */
7
+ import { Command } from 'commander';
8
+ /**
9
+ * Create the doctor command.
10
+ */
11
+ export declare function doctorCommand(): Command;
12
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCpC;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAoEvC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Doctor command definition.
3
+ * Validates the full development environment setup by running a series of
4
+ * categorized health checks with color-coded pass/fail/warning output and
5
+ * actionable fix suggestions.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { CheckRegistry, runChecks, formatText, formatJson } from './doctor/index.js';
9
+ // Individual checks
10
+ import { dockerCheck } from './doctor/checks/docker.js';
11
+ import { configCheck } from './doctor/checks/config.js';
12
+ import { envFileCheck } from './doctor/checks/env-file.js';
13
+ import { devcontainerCheck } from './doctor/checks/devcontainer.js';
14
+ import { githubTokenCheck } from './doctor/checks/github-token.js';
15
+ import { anthropicKeyCheck } from './doctor/checks/anthropic-key.js';
16
+ import { npmPackagesCheck } from './doctor/checks/npm-packages.js';
17
+ import { agencyMcpCheck } from './doctor/checks/agency-mcp.js';
18
+ /**
19
+ * Create and configure a registry with all built-in checks.
20
+ */
21
+ function createDefaultRegistry() {
22
+ const registry = new CheckRegistry();
23
+ // System checks
24
+ registry.register(dockerCheck);
25
+ registry.register(devcontainerCheck);
26
+ // Config checks
27
+ registry.register(configCheck);
28
+ registry.register(envFileCheck);
29
+ // Credential checks
30
+ registry.register(githubTokenCheck);
31
+ registry.register(anthropicKeyCheck);
32
+ // Package checks
33
+ registry.register(npmPackagesCheck);
34
+ // Service checks
35
+ registry.register(agencyMcpCheck);
36
+ return registry;
37
+ }
38
+ /**
39
+ * Create the doctor command.
40
+ */
41
+ export function doctorCommand() {
42
+ const command = new Command('doctor');
43
+ command
44
+ .description('Validate the full development environment setup')
45
+ .option('--check <name...>', 'Run only specific checks (and their dependencies)')
46
+ .option('--skip <name...>', 'Skip specific checks')
47
+ .option('-j, --json', 'Output results as JSON')
48
+ .option('-v, --verbose', 'Show detailed diagnostic information')
49
+ .option('-f, --fix', 'Attempt to fix detected issues (where possible)')
50
+ .action(async (options) => {
51
+ const doctorOptions = {
52
+ check: options.check,
53
+ skip: options.skip,
54
+ json: options.json,
55
+ verbose: options.verbose,
56
+ fix: options.fix,
57
+ };
58
+ try {
59
+ // Build registry and resolve checks
60
+ const registry = createDefaultRegistry();
61
+ const checks = registry.resolve({
62
+ check: doctorOptions.check,
63
+ skip: doctorOptions.skip,
64
+ });
65
+ if (doctorOptions.fix) {
66
+ console.error('Note: Auto-fix is not yet implemented. Running checks only.');
67
+ }
68
+ // Execute checks
69
+ const report = await runChecks(checks, doctorOptions);
70
+ // Format and output
71
+ if (doctorOptions.json) {
72
+ console.log(formatJson(report));
73
+ }
74
+ else {
75
+ console.log(formatText(report, checks, doctorOptions.verbose ?? false));
76
+ }
77
+ process.exit(report.exitCode);
78
+ }
79
+ catch (error) {
80
+ // Internal errors (e.g., invalid --check/--skip names, circular deps)
81
+ if (doctorOptions.json) {
82
+ console.log(JSON.stringify({
83
+ version: 1,
84
+ timestamp: new Date().toISOString(),
85
+ error: error instanceof Error ? error.message : String(error),
86
+ exitCode: 2,
87
+ }, null, 2));
88
+ }
89
+ else {
90
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
91
+ }
92
+ process.exit(2);
93
+ }
94
+ });
95
+ return command;
96
+ }
97
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { FileAction, InitOptions } from './types.js';
2
+ /**
3
+ * Check which rendered files already exist on disk.
4
+ *
5
+ * @param files - Map of relative path → generated content (from `renderProject`).
6
+ * @param gitRoot - Absolute path to the git repository root.
7
+ * @returns Map of conflicting relative paths → existing file content.
8
+ */
9
+ export declare function checkConflicts(files: Map<string, string>, gitRoot: string): Map<string, string>;
10
+ /**
11
+ * Print a unified diff between the existing and generated file content.
12
+ *
13
+ * Uses the `diff` package's `createTwoFilesPatch()` to produce a standard
14
+ * unified diff with `--- existing` / `+++ generated` headers.
15
+ *
16
+ * @param path - Relative file path (used in the diff header).
17
+ * @param existing - Current file content on disk.
18
+ * @param generated - New content that would be written.
19
+ */
20
+ export declare function showDiff(path: string, existing: string, generated: string): void;
21
+ /**
22
+ * Resolve per-file actions for all rendered files, handling conflicts.
23
+ *
24
+ * - Non-conflicting files → `'overwrite'` (create new).
25
+ * - `--force` flag → all conflicts → `'overwrite'`.
26
+ * - Files in `MERGE_FILES` → `'merge'` (smart merge handled by `renderProject`'s
27
+ * `existingFiles` parameter upstream).
28
+ * - Otherwise → interactive per-file prompt: Overwrite / Skip / Show diff.
29
+ *
30
+ * @param files - Map of relative path → generated content.
31
+ * @param conflicts - Map of conflicting relative paths → existing content.
32
+ * @param options - Resolved init options (uses `force` and `yes` flags).
33
+ * @returns Map of relative path → resolved `FileAction`.
34
+ */
35
+ export declare function resolveConflicts(files: Map<string, string>, conflicts: Map<string, string>, options: InitOptions): Promise<Map<string, FileAction>>;
36
+ //# sourceMappingURL=conflicts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/conflicts.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM1D;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,OAAO,EAAE,MAAM,GACd,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBrB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAYN;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAqDlC"}