@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,117 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const PACKAGE_NAME = '@generacy-ai/generacy';
|
|
5
|
+
/**
|
|
6
|
+
* Read the expected version from our own package.json.
|
|
7
|
+
*/
|
|
8
|
+
function getExpectedVersion() {
|
|
9
|
+
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
// checks/ → doctor/ → commands/ → cli/ → src/ → packages/generacy/
|
|
11
|
+
const pkgPath = join(thisDir, '..', '..', '..', '..', '..', 'package.json');
|
|
12
|
+
const raw = readFileSync(pkgPath, 'utf-8');
|
|
13
|
+
const pkg = JSON.parse(raw);
|
|
14
|
+
return pkg.version;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compare two semver version strings (major.minor.patch).
|
|
18
|
+
* Returns true if `installed` >= `expected`.
|
|
19
|
+
*/
|
|
20
|
+
function isVersionSatisfied(installed, expected) {
|
|
21
|
+
const parse = (v) => v
|
|
22
|
+
.replace(/^v/, '')
|
|
23
|
+
.split('.')
|
|
24
|
+
.map((n) => parseInt(n, 10) || 0);
|
|
25
|
+
const inst = parse(installed);
|
|
26
|
+
const exp = parse(expected);
|
|
27
|
+
for (let i = 0; i < Math.max(inst.length, exp.length); i++) {
|
|
28
|
+
const a = inst[i] ?? 0;
|
|
29
|
+
const b = exp[i] ?? 0;
|
|
30
|
+
if (a > b)
|
|
31
|
+
return true;
|
|
32
|
+
if (a < b)
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return true; // equal
|
|
36
|
+
}
|
|
37
|
+
export const npmPackagesCheck = {
|
|
38
|
+
id: 'npm-packages',
|
|
39
|
+
label: 'NPM Packages',
|
|
40
|
+
category: 'packages',
|
|
41
|
+
dependencies: [],
|
|
42
|
+
priority: 'P2',
|
|
43
|
+
async run(context) {
|
|
44
|
+
const root = context.projectRoot ?? process.cwd();
|
|
45
|
+
const installedPkgPath = join(root, 'node_modules', PACKAGE_NAME, 'package.json');
|
|
46
|
+
// Check if node_modules exists at all
|
|
47
|
+
if (!existsSync(join(root, 'node_modules'))) {
|
|
48
|
+
return {
|
|
49
|
+
status: 'fail',
|
|
50
|
+
message: 'Packages not installed',
|
|
51
|
+
suggestion: 'Run `pnpm install`',
|
|
52
|
+
detail: `Expected node_modules at ${join(root, 'node_modules')}`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Check if our package is installed
|
|
56
|
+
if (!existsSync(installedPkgPath)) {
|
|
57
|
+
return {
|
|
58
|
+
status: 'fail',
|
|
59
|
+
message: `${PACKAGE_NAME} is not installed`,
|
|
60
|
+
suggestion: 'Run `pnpm install`',
|
|
61
|
+
detail: `Expected at ${installedPkgPath}`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Read installed version
|
|
65
|
+
let installedVersion;
|
|
66
|
+
try {
|
|
67
|
+
const raw = readFileSync(installedPkgPath, 'utf-8');
|
|
68
|
+
const pkg = JSON.parse(raw);
|
|
69
|
+
if (!pkg.version) {
|
|
70
|
+
return {
|
|
71
|
+
status: 'warn',
|
|
72
|
+
message: `${PACKAGE_NAME} has no version field`,
|
|
73
|
+
suggestion: 'Run `pnpm install` to reinstall packages',
|
|
74
|
+
detail: `File: ${installedPkgPath}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
installedVersion = pkg.version;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const message = error instanceof Error ? error.message : 'Unknown read error';
|
|
81
|
+
return {
|
|
82
|
+
status: 'fail',
|
|
83
|
+
message: `Failed to read ${PACKAGE_NAME} package info`,
|
|
84
|
+
suggestion: 'Run `pnpm install` to reinstall packages',
|
|
85
|
+
detail: message,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Get expected version from our own package.json
|
|
89
|
+
let expectedVersion;
|
|
90
|
+
try {
|
|
91
|
+
expectedVersion = getExpectedVersion();
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// If we can't read our own version, just report the installed one as pass
|
|
95
|
+
return {
|
|
96
|
+
status: 'pass',
|
|
97
|
+
message: `${PACKAGE_NAME} v${installedVersion} installed`,
|
|
98
|
+
detail: `Could not determine expected version for comparison`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Compare versions
|
|
102
|
+
if (!isVersionSatisfied(installedVersion, expectedVersion)) {
|
|
103
|
+
return {
|
|
104
|
+
status: 'warn',
|
|
105
|
+
message: `Version mismatch: installed v${installedVersion}, expected ≥ ${expectedVersion}`,
|
|
106
|
+
suggestion: `Update ${PACKAGE_NAME} to v${expectedVersion} or newer`,
|
|
107
|
+
detail: `Installed: ${installedVersion}, Expected: ≥ ${expectedVersion}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
status: 'pass',
|
|
112
|
+
message: `${PACKAGE_NAME} v${installedVersion} (expected ≥ ${expectedVersion})`,
|
|
113
|
+
detail: `File: ${installedPkgPath}`,
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=npm-packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-packages.js","sourceRoot":"","sources":["../../../../../src/cli/commands/doctor/checks/npm-packages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CheckDefinition, DoctorReport } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Format a doctor report as color-coded text output grouped by category.
|
|
4
|
+
*
|
|
5
|
+
* Example output:
|
|
6
|
+
* ```
|
|
7
|
+
* Generacy Doctor
|
|
8
|
+
* ===============
|
|
9
|
+
*
|
|
10
|
+
* System
|
|
11
|
+
* ✓ Docker Docker daemon is running (v27.0.3)
|
|
12
|
+
* ✓ Dev Container .devcontainer/devcontainer.json present
|
|
13
|
+
*
|
|
14
|
+
* Configuration
|
|
15
|
+
* ✓ Config File .generacy/config.yaml is valid
|
|
16
|
+
* ✗ Env File .generacy/generacy.env not found
|
|
17
|
+
* → Run `generacy init` to generate the env file
|
|
18
|
+
*
|
|
19
|
+
* Result: 2 passed, 1 failed, 0 warnings, 0 skipped
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatText(report: DoctorReport, checks: CheckDefinition[], verbose: boolean): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format a doctor report as pretty-printed JSON.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatJson(report: DoctorReport): string;
|
|
27
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EACf,YAAY,EAEb,MAAM,YAAY,CAAC;AA4EpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,EAAE,OAAO,GACf,MAAM,CA6DR;AAMD;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// ANSI escape helpers
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
const ANSI = {
|
|
5
|
+
reset: '\x1b[0m',
|
|
6
|
+
bold: '\x1b[1m',
|
|
7
|
+
dim: '\x1b[2m',
|
|
8
|
+
green: '\x1b[32m',
|
|
9
|
+
red: '\x1b[31m',
|
|
10
|
+
yellow: '\x1b[33m',
|
|
11
|
+
};
|
|
12
|
+
/** Whether color output is disabled via `NO_COLOR` env var. */
|
|
13
|
+
function isColorDisabled() {
|
|
14
|
+
return 'NO_COLOR' in process.env;
|
|
15
|
+
}
|
|
16
|
+
function color(code, text) {
|
|
17
|
+
if (isColorDisabled())
|
|
18
|
+
return text;
|
|
19
|
+
return `${code}${text}${ANSI.reset}`;
|
|
20
|
+
}
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Status symbols and styling
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
const CATEGORY_LABELS = {
|
|
25
|
+
system: 'System',
|
|
26
|
+
config: 'Configuration',
|
|
27
|
+
credentials: 'Credentials',
|
|
28
|
+
packages: 'Packages',
|
|
29
|
+
services: 'Services',
|
|
30
|
+
};
|
|
31
|
+
/** Ordered list of categories for consistent output. */
|
|
32
|
+
const CATEGORY_ORDER = [
|
|
33
|
+
'system',
|
|
34
|
+
'config',
|
|
35
|
+
'credentials',
|
|
36
|
+
'packages',
|
|
37
|
+
'services',
|
|
38
|
+
];
|
|
39
|
+
function statusSymbol(status) {
|
|
40
|
+
switch (status) {
|
|
41
|
+
case 'pass':
|
|
42
|
+
return color(ANSI.green, '✓');
|
|
43
|
+
case 'fail':
|
|
44
|
+
return color(ANSI.red, '✗');
|
|
45
|
+
case 'warn':
|
|
46
|
+
return color(ANSI.yellow, '!');
|
|
47
|
+
case 'skip':
|
|
48
|
+
return color(ANSI.dim, '-');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function statusColor(status, text) {
|
|
52
|
+
switch (status) {
|
|
53
|
+
case 'pass':
|
|
54
|
+
return color(ANSI.green, text);
|
|
55
|
+
case 'fail':
|
|
56
|
+
return color(ANSI.red, text);
|
|
57
|
+
case 'warn':
|
|
58
|
+
return color(ANSI.yellow, text);
|
|
59
|
+
case 'skip':
|
|
60
|
+
return color(ANSI.dim, text);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Text formatter
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
/**
|
|
67
|
+
* Format a doctor report as color-coded text output grouped by category.
|
|
68
|
+
*
|
|
69
|
+
* Example output:
|
|
70
|
+
* ```
|
|
71
|
+
* Generacy Doctor
|
|
72
|
+
* ===============
|
|
73
|
+
*
|
|
74
|
+
* System
|
|
75
|
+
* ✓ Docker Docker daemon is running (v27.0.3)
|
|
76
|
+
* ✓ Dev Container .devcontainer/devcontainer.json present
|
|
77
|
+
*
|
|
78
|
+
* Configuration
|
|
79
|
+
* ✓ Config File .generacy/config.yaml is valid
|
|
80
|
+
* ✗ Env File .generacy/generacy.env not found
|
|
81
|
+
* → Run `generacy init` to generate the env file
|
|
82
|
+
*
|
|
83
|
+
* Result: 2 passed, 1 failed, 0 warnings, 0 skipped
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export function formatText(report, checks, verbose) {
|
|
87
|
+
const lines = [];
|
|
88
|
+
// Header
|
|
89
|
+
lines.push(color(ANSI.bold, 'Generacy Doctor'));
|
|
90
|
+
lines.push('===============');
|
|
91
|
+
lines.push('');
|
|
92
|
+
// Build a lookup from check ID → definition for label padding
|
|
93
|
+
const checkDefs = new Map(checks.map((c) => [c.id, c]));
|
|
94
|
+
// Group entries by category (preserving order within each category)
|
|
95
|
+
const grouped = groupByCategory(report.checks);
|
|
96
|
+
for (const category of CATEGORY_ORDER) {
|
|
97
|
+
const entries = grouped.get(category);
|
|
98
|
+
if (!entries || entries.length === 0)
|
|
99
|
+
continue;
|
|
100
|
+
lines.push(color(ANSI.bold, CATEGORY_LABELS[category]));
|
|
101
|
+
// Compute label padding for alignment within this category
|
|
102
|
+
const maxLabelLen = Math.max(...entries.map((e) => {
|
|
103
|
+
const def = checkDefs.get(e.id);
|
|
104
|
+
return (def?.label ?? e.label).length;
|
|
105
|
+
}));
|
|
106
|
+
for (const entry of entries) {
|
|
107
|
+
const def = checkDefs.get(entry.id);
|
|
108
|
+
const label = def?.label ?? entry.label;
|
|
109
|
+
const paddedLabel = label.padEnd(maxLabelLen);
|
|
110
|
+
const symbol = statusSymbol(entry.status);
|
|
111
|
+
lines.push(` ${symbol} ${paddedLabel} ${entry.message}`);
|
|
112
|
+
// Suggestion line (fail/warn)
|
|
113
|
+
if (entry.suggestion && (entry.status === 'fail' || entry.status === 'warn')) {
|
|
114
|
+
lines.push(statusColor(entry.status, ` → ${entry.suggestion}`));
|
|
115
|
+
}
|
|
116
|
+
// Detail line (verbose only)
|
|
117
|
+
if (verbose && entry.detail) {
|
|
118
|
+
lines.push(color(ANSI.dim, ` ${entry.detail}`));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
lines.push('');
|
|
122
|
+
}
|
|
123
|
+
// Summary line
|
|
124
|
+
const { passed, failed, warnings, skipped } = report.summary;
|
|
125
|
+
const parts = [
|
|
126
|
+
color(ANSI.green, `${passed} passed`),
|
|
127
|
+
color(ANSI.red, `${failed} failed`),
|
|
128
|
+
color(ANSI.yellow, `${warnings} warnings`),
|
|
129
|
+
color(ANSI.dim, `${skipped} skipped`),
|
|
130
|
+
];
|
|
131
|
+
lines.push(`Result: ${parts.join(', ')}`);
|
|
132
|
+
return lines.join('\n');
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// JSON formatter
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
/**
|
|
138
|
+
* Format a doctor report as pretty-printed JSON.
|
|
139
|
+
*/
|
|
140
|
+
export function formatJson(report) {
|
|
141
|
+
return JSON.stringify(report, null, 2);
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// Helpers
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
/**
|
|
147
|
+
* Group check entries by their category, preserving insertion order within
|
|
148
|
+
* each group.
|
|
149
|
+
*/
|
|
150
|
+
function groupByCategory(entries) {
|
|
151
|
+
const map = new Map();
|
|
152
|
+
for (const entry of entries) {
|
|
153
|
+
let group = map.get(entry.category);
|
|
154
|
+
if (!group) {
|
|
155
|
+
group = [];
|
|
156
|
+
map.set(entry.category, group);
|
|
157
|
+
}
|
|
158
|
+
group.push(entry);
|
|
159
|
+
}
|
|
160
|
+
return map;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { CheckCategory, CheckContext, CheckDefinition, CheckResult, DoctorOptions, DoctorReport, DoctorReportCheckEntry, DoctorReportSummary, FixResult, } from './types.js';
|
|
2
|
+
export { CheckRegistry } from './registry.js';
|
|
3
|
+
export { runChecks } from './runner.js';
|
|
4
|
+
export { formatJson, formatText } from './formatter.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,aAAa,EACb,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Barrel re-exports for the doctor module.
|
|
2
|
+
// Registry
|
|
3
|
+
export { CheckRegistry } from './registry.js';
|
|
4
|
+
// Runner
|
|
5
|
+
export { runChecks } from './runner.js';
|
|
6
|
+
// Formatter
|
|
7
|
+
export { formatJson, formatText } from './formatter.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAe3C,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,YAAY;AACZ,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CheckDefinition } from './types.js';
|
|
2
|
+
export declare class CheckRegistry {
|
|
3
|
+
private checks;
|
|
4
|
+
/**
|
|
5
|
+
* Register a health check. Throws if a check with the same ID is already
|
|
6
|
+
* registered.
|
|
7
|
+
*/
|
|
8
|
+
register(check: CheckDefinition): void;
|
|
9
|
+
/** Return all registered checks (insertion order). */
|
|
10
|
+
getChecks(): CheckDefinition[];
|
|
11
|
+
/** Return a registered check by ID, or `undefined` if not found. */
|
|
12
|
+
getCheck(id: string): CheckDefinition | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve which checks to run and return them in dependency (topological)
|
|
15
|
+
* order.
|
|
16
|
+
*
|
|
17
|
+
* - When `check` is specified, only those checks (and their transitive
|
|
18
|
+
* dependencies) are included.
|
|
19
|
+
* - When `skip` is specified, those checks are excluded from the result.
|
|
20
|
+
* - Throws on unknown check names in either list.
|
|
21
|
+
* - Throws on circular dependencies.
|
|
22
|
+
*/
|
|
23
|
+
resolve(options?: {
|
|
24
|
+
check?: string[];
|
|
25
|
+
skip?: string[];
|
|
26
|
+
}): CheckDefinition[];
|
|
27
|
+
/** Throw if any IDs in the list are not registered. */
|
|
28
|
+
private validateIds;
|
|
29
|
+
/**
|
|
30
|
+
* Starting from a set of check IDs, expand to include all transitive
|
|
31
|
+
* dependencies.
|
|
32
|
+
*/
|
|
33
|
+
private expandDependencies;
|
|
34
|
+
/**
|
|
35
|
+
* Validate that every dependency referenced by candidates exists within the
|
|
36
|
+
* candidate set. This catches the case where a skipped check is a
|
|
37
|
+
* dependency of an included check.
|
|
38
|
+
*/
|
|
39
|
+
private validateDependencies;
|
|
40
|
+
/**
|
|
41
|
+
* Kahn's algorithm for topological sort. Detects cycles and throws if one
|
|
42
|
+
* is found.
|
|
43
|
+
*
|
|
44
|
+
* Only considers checks within the `candidates` set.
|
|
45
|
+
*/
|
|
46
|
+
private topologicalSort;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMlD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsC;IAEpD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAOtC,sDAAsD;IACtD,SAAS,IAAI,eAAe,EAAE;IAI9B,oEAAoE;IACpE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIjD;;;;;;;;;OASG;IACH,OAAO,CAAC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAO,GAAG,eAAe,EAAE;IAmC/E,uDAAuD;IACvD,OAAO,CAAC,WAAW;IAWnB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;CA8DxB"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// CheckRegistry — manages check registration and dependency resolution
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
export class CheckRegistry {
|
|
5
|
+
checks = new Map();
|
|
6
|
+
/**
|
|
7
|
+
* Register a health check. Throws if a check with the same ID is already
|
|
8
|
+
* registered.
|
|
9
|
+
*/
|
|
10
|
+
register(check) {
|
|
11
|
+
if (this.checks.has(check.id)) {
|
|
12
|
+
throw new Error(`Duplicate check ID: '${check.id}'`);
|
|
13
|
+
}
|
|
14
|
+
this.checks.set(check.id, check);
|
|
15
|
+
}
|
|
16
|
+
/** Return all registered checks (insertion order). */
|
|
17
|
+
getChecks() {
|
|
18
|
+
return [...this.checks.values()];
|
|
19
|
+
}
|
|
20
|
+
/** Return a registered check by ID, or `undefined` if not found. */
|
|
21
|
+
getCheck(id) {
|
|
22
|
+
return this.checks.get(id);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve which checks to run and return them in dependency (topological)
|
|
26
|
+
* order.
|
|
27
|
+
*
|
|
28
|
+
* - When `check` is specified, only those checks (and their transitive
|
|
29
|
+
* dependencies) are included.
|
|
30
|
+
* - When `skip` is specified, those checks are excluded from the result.
|
|
31
|
+
* - Throws on unknown check names in either list.
|
|
32
|
+
* - Throws on circular dependencies.
|
|
33
|
+
*/
|
|
34
|
+
resolve(options = {}) {
|
|
35
|
+
const { check: includeIds, skip: skipIds } = options;
|
|
36
|
+
// Validate that all referenced IDs exist
|
|
37
|
+
this.validateIds(includeIds, '--check');
|
|
38
|
+
this.validateIds(skipIds, '--skip');
|
|
39
|
+
// Determine the candidate set of checks
|
|
40
|
+
let candidates;
|
|
41
|
+
if (includeIds && includeIds.length > 0) {
|
|
42
|
+
// Start with requested checks, then expand to include all transitive deps
|
|
43
|
+
candidates = this.expandDependencies(includeIds);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
candidates = new Set(this.checks.keys());
|
|
47
|
+
}
|
|
48
|
+
// Remove skipped checks
|
|
49
|
+
if (skipIds) {
|
|
50
|
+
for (const id of skipIds) {
|
|
51
|
+
candidates.delete(id);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Validate that all dependencies within candidates are satisfied
|
|
55
|
+
this.validateDependencies(candidates);
|
|
56
|
+
// Topological sort the candidates
|
|
57
|
+
return this.topologicalSort(candidates);
|
|
58
|
+
}
|
|
59
|
+
// -------------------------------------------------------------------------
|
|
60
|
+
// Private helpers
|
|
61
|
+
// -------------------------------------------------------------------------
|
|
62
|
+
/** Throw if any IDs in the list are not registered. */
|
|
63
|
+
validateIds(ids, flag) {
|
|
64
|
+
if (!ids)
|
|
65
|
+
return;
|
|
66
|
+
const unknown = ids.filter((id) => !this.checks.has(id));
|
|
67
|
+
if (unknown.length > 0) {
|
|
68
|
+
throw new Error(`Unknown check${unknown.length > 1 ? 's' : ''} passed to ${flag}: ${unknown.map((id) => `'${id}'`).join(', ')}. ` +
|
|
69
|
+
`Available checks: ${[...this.checks.keys()].join(', ')}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Starting from a set of check IDs, expand to include all transitive
|
|
74
|
+
* dependencies.
|
|
75
|
+
*/
|
|
76
|
+
expandDependencies(ids) {
|
|
77
|
+
const result = new Set();
|
|
78
|
+
const stack = [...ids];
|
|
79
|
+
while (stack.length > 0) {
|
|
80
|
+
const id = stack.pop();
|
|
81
|
+
if (result.has(id))
|
|
82
|
+
continue;
|
|
83
|
+
result.add(id);
|
|
84
|
+
const check = this.checks.get(id);
|
|
85
|
+
if (check) {
|
|
86
|
+
for (const dep of check.dependencies) {
|
|
87
|
+
if (!result.has(dep)) {
|
|
88
|
+
stack.push(dep);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validate that every dependency referenced by candidates exists within the
|
|
97
|
+
* candidate set. This catches the case where a skipped check is a
|
|
98
|
+
* dependency of an included check.
|
|
99
|
+
*/
|
|
100
|
+
validateDependencies(candidates) {
|
|
101
|
+
for (const id of candidates) {
|
|
102
|
+
const check = this.checks.get(id);
|
|
103
|
+
for (const dep of check.dependencies) {
|
|
104
|
+
if (!this.checks.has(dep)) {
|
|
105
|
+
throw new Error(`Check '${id}' depends on '${dep}', which is not registered`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Kahn's algorithm for topological sort. Detects cycles and throws if one
|
|
112
|
+
* is found.
|
|
113
|
+
*
|
|
114
|
+
* Only considers checks within the `candidates` set.
|
|
115
|
+
*/
|
|
116
|
+
topologicalSort(candidates) {
|
|
117
|
+
// Build in-degree map and adjacency list (within candidates only)
|
|
118
|
+
const inDegree = new Map();
|
|
119
|
+
const dependents = new Map();
|
|
120
|
+
for (const id of candidates) {
|
|
121
|
+
inDegree.set(id, 0);
|
|
122
|
+
dependents.set(id, []);
|
|
123
|
+
}
|
|
124
|
+
for (const id of candidates) {
|
|
125
|
+
const check = this.checks.get(id);
|
|
126
|
+
for (const dep of check.dependencies) {
|
|
127
|
+
if (candidates.has(dep)) {
|
|
128
|
+
inDegree.set(id, (inDegree.get(id) ?? 0) + 1);
|
|
129
|
+
dependents.get(dep).push(id);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Seed the queue with all nodes that have zero in-degree
|
|
134
|
+
const queue = [];
|
|
135
|
+
for (const [id, degree] of inDegree) {
|
|
136
|
+
if (degree === 0) {
|
|
137
|
+
queue.push(id);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Sort the initial queue for deterministic output (alphabetical)
|
|
141
|
+
queue.sort();
|
|
142
|
+
const sorted = [];
|
|
143
|
+
while (queue.length > 0) {
|
|
144
|
+
const id = queue.shift();
|
|
145
|
+
sorted.push(this.checks.get(id));
|
|
146
|
+
// Collect newly freed dependents, then sort for determinism
|
|
147
|
+
const freed = [];
|
|
148
|
+
for (const dependent of dependents.get(id)) {
|
|
149
|
+
const newDegree = inDegree.get(dependent) - 1;
|
|
150
|
+
inDegree.set(dependent, newDegree);
|
|
151
|
+
if (newDegree === 0) {
|
|
152
|
+
freed.push(dependent);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
freed.sort();
|
|
156
|
+
queue.push(...freed);
|
|
157
|
+
}
|
|
158
|
+
// If we didn't process every candidate, there's a cycle
|
|
159
|
+
if (sorted.length !== candidates.size) {
|
|
160
|
+
const remaining = [...candidates].filter((id) => !sorted.some((c) => c.id === id));
|
|
161
|
+
throw new Error(`Circular dependency detected among checks: ${remaining.join(', ')}`);
|
|
162
|
+
}
|
|
163
|
+
return sorted;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/registry.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,uEAAuE;AACvE,8EAA8E;AAE9E,MAAM,OAAO,aAAa;IAChB,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEpD;;;OAGG;IACH,QAAQ,CAAC,KAAsB;QAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,sDAAsD;IACtD,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,oEAAoE;IACpE,QAAQ,CAAC,EAAU;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,UAAiD,EAAE;QACzD,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAErD,yCAAyC;QACzC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEpC,wCAAwC;QACxC,IAAI,UAAuB,CAAC;QAE5B,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,0EAA0E;YAC1E,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAEtC,kCAAkC;QAClC,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,4EAA4E;IAC5E,kBAAkB;IAClB,4EAA4E;IAE5E,uDAAuD;IAC/C,WAAW,CAAC,GAAyB,EAAE,IAAY;QACzD,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,gBAAgB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAC/G,qBAAqB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,GAAa;QACtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAEvB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;YACxB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEf,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;oBACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,oBAAoB,CAAC,UAAuB;QAClD,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CACb,UAAU,EAAE,iBAAiB,GAAG,4BAA4B,CAC7D,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,eAAe,CAAC,UAAuB;QAC7C,kEAAkE;QAClE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;QAE/C,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpB,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC;QAED,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACrC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC9C,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACpC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,KAAK,CAAC,IAAI,EAAE,CAAC;QAEb,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC;YAElC,4DAA4D;YAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAE,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,GAAG,CAAC,CAAC;gBAC/C,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACnC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBACpB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,wDAAwD;QACxD,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CACtC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CACzC,CAAC;YACF,MAAM,IAAI,KAAK,CACb,8CAA8C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CheckDefinition, DoctorOptions, DoctorReport } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Execute an ordered list of checks, running independent checks concurrently
|
|
4
|
+
* within each dependency tier.
|
|
5
|
+
*
|
|
6
|
+
* The `checks` array **must** be in topological (dependency) order — as
|
|
7
|
+
* returned by `CheckRegistry.resolve()`. The runner groups them into tiers
|
|
8
|
+
* where all items in a tier have their dependencies satisfied by earlier tiers,
|
|
9
|
+
* then runs each tier concurrently via `Promise.all`.
|
|
10
|
+
*
|
|
11
|
+
* @returns A `DoctorReport` containing per-check results and a summary.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runChecks(checks: CheckDefinition[], options: DoctorOptions): Promise<DoctorReport>;
|
|
14
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/doctor/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEf,aAAa,EACb,YAAY,EAGb,MAAM,YAAY,CAAC;AAyBpB;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAoDvB"}
|