@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.
- package/LICENSE +191 -0
- package/README.md +207 -0
- package/bin/generacy.js +11 -0
- package/dist/agency/index.d.ts +68 -0
- package/dist/agency/index.d.ts.map +1 -0
- package/dist/agency/index.js +28 -0
- package/dist/agency/index.js.map +1 -0
- package/dist/agency/network.d.ts +41 -0
- package/dist/agency/network.d.ts.map +1 -0
- package/dist/agency/network.js +133 -0
- package/dist/agency/network.js.map +1 -0
- package/dist/agency/subprocess.d.ts +58 -0
- package/dist/agency/subprocess.d.ts.map +1 -0
- package/dist/agency/subprocess.js +216 -0
- package/dist/agency/subprocess.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +10 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +216 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.js +51 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.js.map +1 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.js +68 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.js.map +1 -0
- package/dist/cli/commands/doctor/checks/config.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/config.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/config.js +81 -0
- package/dist/cli/commands/doctor/checks/config.js.map +1 -0
- package/dist/cli/commands/doctor/checks/devcontainer.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/devcontainer.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/devcontainer.js +58 -0
- package/dist/cli/commands/doctor/checks/devcontainer.js.map +1 -0
- package/dist/cli/commands/doctor/checks/docker.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/docker.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/docker.js +71 -0
- package/dist/cli/commands/doctor/checks/docker.js.map +1 -0
- package/dist/cli/commands/doctor/checks/env-file.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/env-file.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/env-file.js +56 -0
- package/dist/cli/commands/doctor/checks/env-file.js.map +1 -0
- package/dist/cli/commands/doctor/checks/github-token.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/github-token.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/github-token.js +99 -0
- package/dist/cli/commands/doctor/checks/github-token.js.map +1 -0
- package/dist/cli/commands/doctor/checks/npm-packages.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/npm-packages.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/npm-packages.js +117 -0
- package/dist/cli/commands/doctor/checks/npm-packages.js.map +1 -0
- package/dist/cli/commands/doctor/formatter.d.ts +27 -0
- package/dist/cli/commands/doctor/formatter.d.ts.map +1 -0
- package/dist/cli/commands/doctor/formatter.js +162 -0
- package/dist/cli/commands/doctor/formatter.js.map +1 -0
- package/dist/cli/commands/doctor/index.d.ts +5 -0
- package/dist/cli/commands/doctor/index.d.ts.map +1 -0
- package/dist/cli/commands/doctor/index.js +8 -0
- package/dist/cli/commands/doctor/index.js.map +1 -0
- package/dist/cli/commands/doctor/registry.d.ts +48 -0
- package/dist/cli/commands/doctor/registry.d.ts.map +1 -0
- package/dist/cli/commands/doctor/registry.js +166 -0
- package/dist/cli/commands/doctor/registry.js.map +1 -0
- package/dist/cli/commands/doctor/runner.d.ts +14 -0
- package/dist/cli/commands/doctor/runner.d.ts.map +1 -0
- package/dist/cli/commands/doctor/runner.js +257 -0
- package/dist/cli/commands/doctor/runner.js.map +1 -0
- package/dist/cli/commands/doctor/types.d.ts +87 -0
- package/dist/cli/commands/doctor/types.d.ts.map +1 -0
- package/dist/cli/commands/doctor/types.js +2 -0
- package/dist/cli/commands/doctor/types.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +12 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +97 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init/conflicts.d.ts +36 -0
- package/dist/cli/commands/init/conflicts.d.ts.map +1 -0
- package/dist/cli/commands/init/conflicts.js +165 -0
- package/dist/cli/commands/init/conflicts.js.map +1 -0
- package/dist/cli/commands/init/github.d.ts +32 -0
- package/dist/cli/commands/init/github.d.ts.map +1 -0
- package/dist/cli/commands/init/github.js +161 -0
- package/dist/cli/commands/init/github.js.map +1 -0
- package/dist/cli/commands/init/index.d.ts +21 -0
- package/dist/cli/commands/init/index.d.ts.map +1 -0
- package/dist/cli/commands/init/index.js +175 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/prompts.d.ts +15 -0
- package/dist/cli/commands/init/prompts.d.ts.map +1 -0
- package/dist/cli/commands/init/prompts.js +281 -0
- package/dist/cli/commands/init/prompts.js.map +1 -0
- package/dist/cli/commands/init/repo-utils.d.ts +32 -0
- package/dist/cli/commands/init/repo-utils.d.ts.map +1 -0
- package/dist/cli/commands/init/repo-utils.js +112 -0
- package/dist/cli/commands/init/repo-utils.js.map +1 -0
- package/dist/cli/commands/init/resolver.d.ts +20 -0
- package/dist/cli/commands/init/resolver.d.ts.map +1 -0
- package/dist/cli/commands/init/resolver.js +273 -0
- package/dist/cli/commands/init/resolver.js.map +1 -0
- package/dist/cli/commands/init/summary.d.ts +21 -0
- package/dist/cli/commands/init/summary.d.ts.map +1 -0
- package/dist/cli/commands/init/summary.js +100 -0
- package/dist/cli/commands/init/summary.js.map +1 -0
- package/dist/cli/commands/init/types.d.ts +53 -0
- package/dist/cli/commands/init/types.d.ts.map +1 -0
- package/dist/cli/commands/init/types.js +2 -0
- package/dist/cli/commands/init/types.js.map +1 -0
- package/dist/cli/commands/init/writer.d.ts +22 -0
- package/dist/cli/commands/init/writer.d.ts.map +1 -0
- package/dist/cli/commands/init/writer.js +96 -0
- package/dist/cli/commands/init/writer.js.map +1 -0
- package/dist/cli/commands/orchestrator.d.ts +11 -0
- package/dist/cli/commands/orchestrator.d.ts.map +1 -0
- package/dist/cli/commands/orchestrator.js +291 -0
- package/dist/cli/commands/orchestrator.js.map +1 -0
- package/dist/cli/commands/run.d.ts +10 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +167 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup/auth.d.ts +11 -0
- package/dist/cli/commands/setup/auth.d.ts.map +1 -0
- package/dist/cli/commands/setup/auth.js +108 -0
- package/dist/cli/commands/setup/auth.js.map +1 -0
- package/dist/cli/commands/setup/build.d.ts +11 -0
- package/dist/cli/commands/setup/build.d.ts.map +1 -0
- package/dist/cli/commands/setup/build.js +212 -0
- package/dist/cli/commands/setup/build.js.map +1 -0
- package/dist/cli/commands/setup/services.d.ts +11 -0
- package/dist/cli/commands/setup/services.d.ts.map +1 -0
- package/dist/cli/commands/setup/services.js +294 -0
- package/dist/cli/commands/setup/services.js.map +1 -0
- package/dist/cli/commands/setup/workspace.d.ts +11 -0
- package/dist/cli/commands/setup/workspace.d.ts.map +1 -0
- package/dist/cli/commands/setup/workspace.js +215 -0
- package/dist/cli/commands/setup/workspace.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +7 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +19 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +10 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +164 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/worker.d.ts +10 -0
- package/dist/cli/commands/worker.d.ts.map +1 -0
- package/dist/cli/commands/worker.js +224 -0
- package/dist/cli/commands/worker.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +68 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/config.d.ts +49 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +110 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/exec.d.ts +39 -0
- package/dist/cli/utils/exec.d.ts.map +1 -0
- package/dist/cli/utils/exec.js +68 -0
- package/dist/cli/utils/exec.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +47 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +97 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +13 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +104 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +266 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +304 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +160 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +60 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +112 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/health/server.d.ts +47 -0
- package/dist/health/server.d.ts.map +1 -0
- package/dist/health/server.js +92 -0
- package/dist/health/server.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/async-event-queue.d.ts +28 -0
- package/dist/orchestrator/async-event-queue.d.ts.map +1 -0
- package/dist/orchestrator/async-event-queue.js +57 -0
- package/dist/orchestrator/async-event-queue.js.map +1 -0
- package/dist/orchestrator/client.d.ts +110 -0
- package/dist/orchestrator/client.d.ts.map +1 -0
- package/dist/orchestrator/client.js +288 -0
- package/dist/orchestrator/client.js.map +1 -0
- package/dist/orchestrator/event-bus.d.ts +195 -0
- package/dist/orchestrator/event-bus.d.ts.map +1 -0
- package/dist/orchestrator/event-bus.js +557 -0
- package/dist/orchestrator/event-bus.js.map +1 -0
- package/dist/orchestrator/heartbeat.d.ts +71 -0
- package/dist/orchestrator/heartbeat.d.ts.map +1 -0
- package/dist/orchestrator/heartbeat.js +116 -0
- package/dist/orchestrator/heartbeat.js.map +1 -0
- package/dist/orchestrator/index.d.ts +25 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +15 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/job-handler.d.ts +109 -0
- package/dist/orchestrator/job-handler.d.ts.map +1 -0
- package/dist/orchestrator/job-handler.js +612 -0
- package/dist/orchestrator/job-handler.js.map +1 -0
- package/dist/orchestrator/job-queue.d.ts +81 -0
- package/dist/orchestrator/job-queue.d.ts.map +1 -0
- package/dist/orchestrator/job-queue.js +206 -0
- package/dist/orchestrator/job-queue.js.map +1 -0
- package/dist/orchestrator/label-monitor-bridge.d.ts +25 -0
- package/dist/orchestrator/label-monitor-bridge.d.ts.map +1 -0
- package/dist/orchestrator/label-monitor-bridge.js +57 -0
- package/dist/orchestrator/label-monitor-bridge.js.map +1 -0
- package/dist/orchestrator/log-buffer.d.ts +74 -0
- package/dist/orchestrator/log-buffer.d.ts.map +1 -0
- package/dist/orchestrator/log-buffer.js +104 -0
- package/dist/orchestrator/log-buffer.js.map +1 -0
- package/dist/orchestrator/redis-job-queue.d.ts +44 -0
- package/dist/orchestrator/redis-job-queue.d.ts.map +1 -0
- package/dist/orchestrator/redis-job-queue.js +300 -0
- package/dist/orchestrator/redis-job-queue.js.map +1 -0
- package/dist/orchestrator/router.d.ts +125 -0
- package/dist/orchestrator/router.d.ts.map +1 -0
- package/dist/orchestrator/router.js +143 -0
- package/dist/orchestrator/router.js.map +1 -0
- package/dist/orchestrator/server.d.ts +62 -0
- package/dist/orchestrator/server.d.ts.map +1 -0
- package/dist/orchestrator/server.js +711 -0
- package/dist/orchestrator/server.js.map +1 -0
- package/dist/orchestrator/types.d.ts +184 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +6 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/orchestrator/worker-registry.d.ts +110 -0
- package/dist/orchestrator/worker-registry.d.ts.map +1 -0
- package/dist/orchestrator/worker-registry.js +191 -0
- package/dist/orchestrator/worker-registry.js.map +1 -0
- 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 @@
|
|
|
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":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGrF,oBAAoB;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D;;GAEG;AACH,SAAS,qBAAqB;IAC5B,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAErC,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAErC,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEhC,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAErC,iBAAiB;IACjB,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAEpC,iBAAiB;IACjB,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAElC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO;SACJ,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,mBAAmB,EAAE,mDAAmD,CAAC;SAChF,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAClD,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;SAC9C,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;SACtE,MAAM,CAAC,KAAK,EAAE,OAMd,EAAE,EAAE;QACH,MAAM,aAAa,GAAkB;YACnC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC;QAEF,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;gBAC9B,KAAK,EAAE,aAAa,CAAC,KAAK;gBAC1B,IAAI,EAAE,aAAa,CAAC,IAAI;aACzB,CAAC,CAAC;YAEH,IAAI,aAAa,CAAC,GAAG,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC/E,CAAC;YAED,iBAAiB;YACjB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAEtD,oBAAoB;YACpB,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sEAAsE;YACtE,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;oBACzB,OAAO,EAAE,CAAC;oBACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,QAAQ,EAAE,CAAC;iBACZ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -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"}
|