@orgloop/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/dist/commands/add.d.ts +8 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +363 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/apply.d.ts +9 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +289 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/doctor.d.ts +45 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +346 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/env.d.ts +23 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +230 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/hook.d.ts +16 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +80 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/init.d.ts +42 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +532 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +8 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +177 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/install-service.d.ts +8 -0
- package/dist/commands/install-service.d.ts.map +1 -0
- package/dist/commands/install-service.js +182 -0
- package/dist/commands/install-service.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +197 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/plan.d.ts +9 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +200 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/routes.d.ts +37 -0
- package/dist/commands/routes.d.ts.map +1 -0
- package/dist/commands/routes.js +167 -0
- package/dist/commands/routes.js.map +1 -0
- package/dist/commands/service.d.ts +9 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +178 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +176 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +8 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +102 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/test.d.ts +8 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +236 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/validate.d.ts +33 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +501 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/version.d.ts +8 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +42 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +169 -0
- package/dist/config.js.map +1 -0
- package/dist/env-metadata.d.ts +12 -0
- package/dist/env-metadata.d.ts.map +1 -0
- package/dist/env-metadata.js +39 -0
- package/dist/env-metadata.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/module-resolver.d.ts +42 -0
- package/dist/module-resolver.d.ts.map +1 -0
- package/dist/module-resolver.js +134 -0
- package/dist/module-resolver.js.map +1 -0
- package/dist/output.d.ts +36 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +142 -0
- package/dist/output.js.map +1 -0
- package/dist/resolve-connectors.d.ts +27 -0
- package/dist/resolve-connectors.d.ts.map +1 -0
- package/dist/resolve-connectors.js +94 -0
- package/dist/resolve-connectors.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* orgloop doctor — Pre-flight environment validation.
|
|
3
|
+
*
|
|
4
|
+
* Runs validate internally (config, transforms, route graph), then adds
|
|
5
|
+
* live checks: credential validation, service detection. Uses Stage 2
|
|
6
|
+
* connector maturity (credential validators and service detectors) when
|
|
7
|
+
* connectors provide them.
|
|
8
|
+
*
|
|
9
|
+
* Supports --json for machine-readable output.
|
|
10
|
+
*/
|
|
11
|
+
import { readFile } from 'node:fs/promises';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import yaml from 'js-yaml';
|
|
14
|
+
import { loadCliConfig, resolveConfigPath } from '../config.js';
|
|
15
|
+
import { getEnvVarMeta } from '../env-metadata.js';
|
|
16
|
+
import * as output from '../output.js';
|
|
17
|
+
import { resolveConnectorRegistrations } from '../resolve-connectors.js';
|
|
18
|
+
import { scanEnvVars } from './env.js';
|
|
19
|
+
import { runValidation } from './validate.js';
|
|
20
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
21
|
+
async function loadYaml(path) {
|
|
22
|
+
const content = await readFile(path, 'utf-8');
|
|
23
|
+
return yaml.load(content);
|
|
24
|
+
}
|
|
25
|
+
// ─── Check functions ─────────────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Run validate internally, converting its results to DoctorCheck format.
|
|
28
|
+
* This is the static analysis phase — config, transforms, route graph.
|
|
29
|
+
*/
|
|
30
|
+
export async function checkValidation(configPath) {
|
|
31
|
+
const checks = [];
|
|
32
|
+
try {
|
|
33
|
+
const { results, graphWarnings } = await runValidation(configPath);
|
|
34
|
+
// Convert validation results to doctor checks
|
|
35
|
+
for (const result of results) {
|
|
36
|
+
if (result.valid) {
|
|
37
|
+
checks.push({
|
|
38
|
+
category: 'config',
|
|
39
|
+
name: result.file,
|
|
40
|
+
status: 'ok',
|
|
41
|
+
detail: result.description,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
checks.push({
|
|
46
|
+
category: 'config',
|
|
47
|
+
name: result.file,
|
|
48
|
+
status: 'error',
|
|
49
|
+
detail: result.errors.join('; '),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Convert graph warnings to doctor checks
|
|
54
|
+
for (const warning of graphWarnings) {
|
|
55
|
+
checks.push({
|
|
56
|
+
category: 'route-graph',
|
|
57
|
+
name: warning.id,
|
|
58
|
+
status: 'warning',
|
|
59
|
+
detail: warning.message,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
checks.push({
|
|
65
|
+
category: 'config',
|
|
66
|
+
name: 'orgloop.yaml',
|
|
67
|
+
status: 'error',
|
|
68
|
+
detail: `Validation failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return checks;
|
|
72
|
+
}
|
|
73
|
+
export async function checkCredentials(configPath, validators) {
|
|
74
|
+
const checks = [];
|
|
75
|
+
try {
|
|
76
|
+
const vars = await scanEnvVars(configPath);
|
|
77
|
+
for (const [name, _source] of vars) {
|
|
78
|
+
const isSet = process.env[name] !== undefined;
|
|
79
|
+
const meta = getEnvVarMeta(name);
|
|
80
|
+
if (!isSet) {
|
|
81
|
+
checks.push({
|
|
82
|
+
category: 'credential',
|
|
83
|
+
name,
|
|
84
|
+
status: 'missing',
|
|
85
|
+
...(meta?.description ? { description: meta.description } : {}),
|
|
86
|
+
...(meta?.help_url ? { help_url: meta.help_url } : {}),
|
|
87
|
+
});
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// If a credential validator exists for this env var, use it
|
|
91
|
+
const validator = validators?.get(name);
|
|
92
|
+
if (validator) {
|
|
93
|
+
try {
|
|
94
|
+
const envValue = process.env[name] ?? '';
|
|
95
|
+
const result = await validator.validate(envValue);
|
|
96
|
+
if (result.valid) {
|
|
97
|
+
const detailParts = [];
|
|
98
|
+
if (result.identity)
|
|
99
|
+
detailParts.push(result.identity);
|
|
100
|
+
if (result.scopes && result.scopes.length > 0) {
|
|
101
|
+
detailParts.push(`scopes: ${result.scopes.join(', ')}`);
|
|
102
|
+
}
|
|
103
|
+
if (result.error)
|
|
104
|
+
detailParts.push(result.error);
|
|
105
|
+
checks.push({
|
|
106
|
+
category: 'credential',
|
|
107
|
+
name,
|
|
108
|
+
status: 'ok',
|
|
109
|
+
detail: detailParts.length > 0 ? `valid (${detailParts.join(', ')})` : 'valid',
|
|
110
|
+
identity: result.identity,
|
|
111
|
+
scopes: result.scopes,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
checks.push({
|
|
116
|
+
category: 'credential',
|
|
117
|
+
name,
|
|
118
|
+
status: 'error',
|
|
119
|
+
detail: result.error ?? 'Credential validation failed',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Validator threw — fail-open, treat as ok (presence check only)
|
|
125
|
+
checks.push({ category: 'credential', name, status: 'ok' });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// No validator available — fall back to presence check
|
|
130
|
+
checks.push({ category: 'credential', name, status: 'ok' });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// env var scanning is best-effort
|
|
136
|
+
}
|
|
137
|
+
return checks;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check service availability using service detectors from connector registrations.
|
|
141
|
+
* Connector-agnostic: discovers detectors through the registration, never hardcodes
|
|
142
|
+
* connector-specific logic.
|
|
143
|
+
*/
|
|
144
|
+
export async function checkServices(detectors) {
|
|
145
|
+
const checks = [];
|
|
146
|
+
for (const [connectorId, detector] of detectors) {
|
|
147
|
+
try {
|
|
148
|
+
const result = await detector.detect();
|
|
149
|
+
if (result.running) {
|
|
150
|
+
const detail = result.endpoint ? `running at ${result.endpoint}` : 'running';
|
|
151
|
+
checks.push({
|
|
152
|
+
category: 'service',
|
|
153
|
+
name: connectorId,
|
|
154
|
+
status: 'ok',
|
|
155
|
+
detail,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const detail = result.endpoint ? `not reachable at ${result.endpoint}` : 'not running';
|
|
160
|
+
checks.push({
|
|
161
|
+
category: 'service',
|
|
162
|
+
name: connectorId,
|
|
163
|
+
status: 'warning',
|
|
164
|
+
detail,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Detector threw — treat as warning (fail-open)
|
|
170
|
+
checks.push({
|
|
171
|
+
category: 'service',
|
|
172
|
+
name: connectorId,
|
|
173
|
+
status: 'warning',
|
|
174
|
+
detail: 'Service detection failed',
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return checks;
|
|
179
|
+
}
|
|
180
|
+
// ─── Main doctor logic ───────────────────────────────────────────────────────
|
|
181
|
+
export async function runDoctor(configPath, importFn) {
|
|
182
|
+
const checks = [];
|
|
183
|
+
// Determine project name
|
|
184
|
+
let projectName = 'unknown';
|
|
185
|
+
try {
|
|
186
|
+
const data = (await loadYaml(configPath));
|
|
187
|
+
const meta = data?.metadata;
|
|
188
|
+
if (meta?.name)
|
|
189
|
+
projectName = String(meta.name);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// will be caught by checkValidation
|
|
193
|
+
}
|
|
194
|
+
// Resolve connector registrations to discover validators and detectors.
|
|
195
|
+
// This is best-effort — if config loading fails (e.g., missing env vars),
|
|
196
|
+
// we fall back to the basic presence-check behavior.
|
|
197
|
+
let validators;
|
|
198
|
+
let detectors;
|
|
199
|
+
try {
|
|
200
|
+
const config = await loadCliConfig({ configPath });
|
|
201
|
+
const registrations = await resolveConnectorRegistrations(config, importFn);
|
|
202
|
+
// Collect all credential validators from all connector registrations
|
|
203
|
+
const allValidators = new Map();
|
|
204
|
+
const allDetectors = new Map();
|
|
205
|
+
for (const [_pkg, reg] of registrations) {
|
|
206
|
+
if (reg.credential_validators) {
|
|
207
|
+
for (const [envVar, validator] of Object.entries(reg.credential_validators)) {
|
|
208
|
+
allValidators.set(envVar, validator);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (reg.service_detector) {
|
|
212
|
+
allDetectors.set(reg.id, reg.service_detector);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (allValidators.size > 0)
|
|
216
|
+
validators = allValidators;
|
|
217
|
+
if (allDetectors.size > 0)
|
|
218
|
+
detectors = allDetectors;
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Config loading failed (e.g., missing env vars) — proceed without validators
|
|
222
|
+
}
|
|
223
|
+
// Phase 1: Static analysis (validate)
|
|
224
|
+
// Phase 2: Live checks (credentials, services)
|
|
225
|
+
const [validationChecks, credentialChecks, serviceChecks] = await Promise.all([
|
|
226
|
+
checkValidation(configPath),
|
|
227
|
+
checkCredentials(configPath, validators),
|
|
228
|
+
detectors ? checkServices(detectors) : Promise.resolve([]),
|
|
229
|
+
]);
|
|
230
|
+
checks.push(...credentialChecks, ...validationChecks, ...serviceChecks);
|
|
231
|
+
// Determine overall status
|
|
232
|
+
const hasError = checks.some((c) => c.status === 'error');
|
|
233
|
+
const hasMissing = checks.some((c) => c.status === 'missing');
|
|
234
|
+
const hasWarning = checks.some((c) => c.status === 'warning');
|
|
235
|
+
let status = 'ok';
|
|
236
|
+
if (hasError)
|
|
237
|
+
status = 'error';
|
|
238
|
+
else if (hasMissing || hasWarning)
|
|
239
|
+
status = 'degraded';
|
|
240
|
+
return { status, project: projectName, checks };
|
|
241
|
+
}
|
|
242
|
+
// ─── Display ─────────────────────────────────────────────────────────────────
|
|
243
|
+
function printDoctorResult(result) {
|
|
244
|
+
output.blank();
|
|
245
|
+
output.heading(`OrgLoop Doctor \u2014 ${result.project}`);
|
|
246
|
+
// Group checks by category
|
|
247
|
+
const byCategory = new Map();
|
|
248
|
+
for (const check of result.checks) {
|
|
249
|
+
const existing = byCategory.get(check.category) ?? [];
|
|
250
|
+
existing.push(check);
|
|
251
|
+
byCategory.set(check.category, existing);
|
|
252
|
+
}
|
|
253
|
+
const categoryLabels = {
|
|
254
|
+
credential: 'Credentials',
|
|
255
|
+
config: 'Config',
|
|
256
|
+
transform: 'Transforms',
|
|
257
|
+
'route-graph': 'Route Graph',
|
|
258
|
+
service: 'Services',
|
|
259
|
+
};
|
|
260
|
+
const categoryOrder = ['credential', 'service', 'config', 'route-graph'];
|
|
261
|
+
for (const cat of categoryOrder) {
|
|
262
|
+
const checks = byCategory.get(cat);
|
|
263
|
+
if (!checks || checks.length === 0)
|
|
264
|
+
continue;
|
|
265
|
+
output.subheading(categoryLabels[cat] ?? cat);
|
|
266
|
+
for (const check of checks) {
|
|
267
|
+
if (check.status === 'ok') {
|
|
268
|
+
const detail = check.detail ? ` \u2014 ${check.detail}` : '';
|
|
269
|
+
console.log(` ${chalk.green('\u2713')} ${check.name}${detail}`);
|
|
270
|
+
}
|
|
271
|
+
else if (check.status === 'missing') {
|
|
272
|
+
console.log(` ${chalk.red('\u2717')} ${check.name} \u2014 not set`);
|
|
273
|
+
if (check.description) {
|
|
274
|
+
console.log(` ${chalk.dim('\u2192')} ${chalk.dim(check.description)}`);
|
|
275
|
+
}
|
|
276
|
+
if (check.help_url) {
|
|
277
|
+
console.log(` ${chalk.dim('\u2192')} ${chalk.dim(check.help_url)}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
else if (check.status === 'error') {
|
|
281
|
+
const detail = check.detail ? ` \u2014 ${check.detail}` : '';
|
|
282
|
+
console.log(` ${chalk.red('\u2717')} ${check.name}${detail}`);
|
|
283
|
+
}
|
|
284
|
+
else if (check.status === 'warning') {
|
|
285
|
+
const detail = check.detail ? ` \u2014 ${check.detail}` : '';
|
|
286
|
+
console.log(` ${chalk.yellow('!')} ${check.name}${detail}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Summary
|
|
291
|
+
output.blank();
|
|
292
|
+
const errorCount = result.checks.filter((c) => c.status === 'error').length;
|
|
293
|
+
const missingCount = result.checks.filter((c) => c.status === 'missing').length;
|
|
294
|
+
const warningCount = result.checks.filter((c) => c.status === 'warning').length;
|
|
295
|
+
const parts = [];
|
|
296
|
+
if (errorCount > 0)
|
|
297
|
+
parts.push(`${errorCount} error${errorCount !== 1 ? 's' : ''}`);
|
|
298
|
+
if (missingCount > 0)
|
|
299
|
+
parts.push(`${missingCount} credential${missingCount !== 1 ? 's' : ''} missing`);
|
|
300
|
+
if (warningCount > 0)
|
|
301
|
+
parts.push(`${warningCount} warning${warningCount !== 1 ? 's' : ''}`);
|
|
302
|
+
if (parts.length === 0) {
|
|
303
|
+
output.info(chalk.green('All checks passed.'));
|
|
304
|
+
output.info(chalk.dim('Next: run `orgloop apply` to start.'));
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
output.info(`${parts.join(', ')}.`);
|
|
308
|
+
if (result.status === 'degraded') {
|
|
309
|
+
output.info(chalk.dim('System will run in degraded mode.'));
|
|
310
|
+
}
|
|
311
|
+
else if (result.status === 'error') {
|
|
312
|
+
output.info(chalk.dim('Fix errors above, then re-run `orgloop doctor`.'));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// ─── Command registration ────────────────────────────────────────────────────
|
|
317
|
+
export function registerDoctorCommand(program) {
|
|
318
|
+
program
|
|
319
|
+
.command('doctor')
|
|
320
|
+
.description('Pre-flight environment validation')
|
|
321
|
+
.action(async (_opts, cmd) => {
|
|
322
|
+
try {
|
|
323
|
+
const globalOpts = cmd.parent?.opts() ?? {};
|
|
324
|
+
const configPath = resolveConfigPath(globalOpts.config);
|
|
325
|
+
const result = await runDoctor(configPath);
|
|
326
|
+
if (output.isJsonMode()) {
|
|
327
|
+
output.json(result);
|
|
328
|
+
if (result.status === 'error')
|
|
329
|
+
process.exitCode = 2;
|
|
330
|
+
else if (result.status === 'degraded')
|
|
331
|
+
process.exitCode = 1;
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
printDoctorResult(result);
|
|
335
|
+
if (result.status === 'error')
|
|
336
|
+
process.exitCode = 2;
|
|
337
|
+
else if (result.status === 'degraded')
|
|
338
|
+
process.exitCode = 1;
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
output.error(`Doctor failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
342
|
+
process.exitCode = 1;
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* orgloop env — Check environment variable configuration.
|
|
3
|
+
*
|
|
4
|
+
* Scans project YAML files for ${VAR_NAME} patterns and reports
|
|
5
|
+
* which variables are set and which are missing.
|
|
6
|
+
*/
|
|
7
|
+
import type { Command } from 'commander';
|
|
8
|
+
export interface EnvVarInfo {
|
|
9
|
+
name: string;
|
|
10
|
+
sourceFile: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Scan all YAML files referenced by a project config for env var references.
|
|
14
|
+
* Returns a Map of variable name -> source file path (relative).
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanEnvVars(configPath: string): Promise<Map<string, string>>;
|
|
17
|
+
/**
|
|
18
|
+
* Parse a .env file into key-value pairs.
|
|
19
|
+
* Supports KEY=VALUE lines, # comments, blank lines, and quoted values.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseEnvFile(content: string): Map<string, string>;
|
|
22
|
+
export declare function registerEnvCommand(program: Command): void;
|
|
23
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACnB;AAiCD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAkElF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BjE;AAID,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAczD"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* orgloop env — Check environment variable configuration.
|
|
3
|
+
*
|
|
4
|
+
* Scans project YAML files for ${VAR_NAME} patterns and reports
|
|
5
|
+
* which variables are set and which are missing.
|
|
6
|
+
*/
|
|
7
|
+
import { access, readFile, readdir } from 'node:fs/promises';
|
|
8
|
+
import { dirname, isAbsolute, resolve } from 'node:path';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import yaml from 'js-yaml';
|
|
11
|
+
import { resolveConfigPath } from '../config.js';
|
|
12
|
+
import { getEnvVarMeta } from '../env-metadata.js';
|
|
13
|
+
import * as output from '../output.js';
|
|
14
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
15
|
+
async function fileExists(path) {
|
|
16
|
+
try {
|
|
17
|
+
await access(path);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Scan a YAML string for ${VAR_NAME} patterns and collect variable names.
|
|
26
|
+
*/
|
|
27
|
+
function extractEnvVars(content) {
|
|
28
|
+
const vars = [];
|
|
29
|
+
const matches = content.matchAll(/\$\{([^}]+)\}/g);
|
|
30
|
+
for (const match of matches) {
|
|
31
|
+
vars.push(match[1]);
|
|
32
|
+
}
|
|
33
|
+
return vars;
|
|
34
|
+
}
|
|
35
|
+
// ─── Core logic (exported for testing) ───────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Scan all YAML files referenced by a project config for env var references.
|
|
38
|
+
* Returns a Map of variable name -> source file path (relative).
|
|
39
|
+
*/
|
|
40
|
+
export async function scanEnvVars(configPath) {
|
|
41
|
+
const vars = new Map();
|
|
42
|
+
const absConfigPath = resolve(configPath);
|
|
43
|
+
const basePath = dirname(absConfigPath);
|
|
44
|
+
// Scan the project file itself
|
|
45
|
+
const projectContent = await readFile(absConfigPath, 'utf-8');
|
|
46
|
+
for (const v of extractEnvVars(projectContent)) {
|
|
47
|
+
vars.set(v, 'orgloop.yaml');
|
|
48
|
+
}
|
|
49
|
+
// Parse project to find referenced files
|
|
50
|
+
const project = yaml.load(projectContent);
|
|
51
|
+
if (!project)
|
|
52
|
+
return vars;
|
|
53
|
+
// Scan connector files
|
|
54
|
+
for (const file of project.connectors ?? []) {
|
|
55
|
+
const filePath = isAbsolute(file) ? file : resolve(basePath, file);
|
|
56
|
+
if (await fileExists(filePath)) {
|
|
57
|
+
const content = await readFile(filePath, 'utf-8');
|
|
58
|
+
for (const v of extractEnvVars(content)) {
|
|
59
|
+
vars.set(v, file);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Scan transform files
|
|
64
|
+
for (const file of project.transforms ?? []) {
|
|
65
|
+
const filePath = isAbsolute(file) ? file : resolve(basePath, file);
|
|
66
|
+
if (await fileExists(filePath)) {
|
|
67
|
+
const content = await readFile(filePath, 'utf-8');
|
|
68
|
+
for (const v of extractEnvVars(content)) {
|
|
69
|
+
vars.set(v, file);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Scan logger files
|
|
74
|
+
for (const file of project.loggers ?? []) {
|
|
75
|
+
const filePath = isAbsolute(file) ? file : resolve(basePath, file);
|
|
76
|
+
if (await fileExists(filePath)) {
|
|
77
|
+
const content = await readFile(filePath, 'utf-8');
|
|
78
|
+
for (const v of extractEnvVars(content)) {
|
|
79
|
+
vars.set(v, file);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Scan route files from routes/ directory
|
|
84
|
+
const routesDir = resolve(basePath, 'routes');
|
|
85
|
+
if (await fileExists(routesDir)) {
|
|
86
|
+
try {
|
|
87
|
+
const files = await readdir(routesDir);
|
|
88
|
+
for (const file of files.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'))) {
|
|
89
|
+
const filePath = resolve(routesDir, file);
|
|
90
|
+
const content = await readFile(filePath, 'utf-8');
|
|
91
|
+
for (const v of extractEnvVars(content)) {
|
|
92
|
+
vars.set(v, `routes/${file}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// routes dir not readable, skip
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return vars;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parse a .env file into key-value pairs.
|
|
104
|
+
* Supports KEY=VALUE lines, # comments, blank lines, and quoted values.
|
|
105
|
+
*/
|
|
106
|
+
export function parseEnvFile(content) {
|
|
107
|
+
const vars = new Map();
|
|
108
|
+
for (const rawLine of content.split('\n')) {
|
|
109
|
+
const line = rawLine.trim();
|
|
110
|
+
// Skip empty lines and comments
|
|
111
|
+
if (!line || line.startsWith('#'))
|
|
112
|
+
continue;
|
|
113
|
+
const eqIndex = line.indexOf('=');
|
|
114
|
+
if (eqIndex === -1)
|
|
115
|
+
continue;
|
|
116
|
+
const key = line.slice(0, eqIndex).trim();
|
|
117
|
+
let value = line.slice(eqIndex + 1).trim();
|
|
118
|
+
// Strip surrounding quotes
|
|
119
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
120
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
121
|
+
value = value.slice(1, -1);
|
|
122
|
+
}
|
|
123
|
+
if (key) {
|
|
124
|
+
vars.set(key, value);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return vars;
|
|
128
|
+
}
|
|
129
|
+
// ─── Command registration ────────────────────────────────────────────────────
|
|
130
|
+
export function registerEnvCommand(program) {
|
|
131
|
+
const envCmd = program
|
|
132
|
+
.command('env')
|
|
133
|
+
.description('Check environment variable configuration')
|
|
134
|
+
.action(async (_opts, cmd) => {
|
|
135
|
+
await runEnvCheck(cmd, false);
|
|
136
|
+
});
|
|
137
|
+
envCmd
|
|
138
|
+
.command('check')
|
|
139
|
+
.description('Check env vars and exit with code 1 if any are missing')
|
|
140
|
+
.action(async (_opts, cmd) => {
|
|
141
|
+
await runEnvCheck(cmd, true);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
async function runEnvCheck(cmd, strict) {
|
|
145
|
+
try {
|
|
146
|
+
// Walk up to find the root command's options
|
|
147
|
+
let root = cmd;
|
|
148
|
+
while (root.parent)
|
|
149
|
+
root = root.parent;
|
|
150
|
+
const globalOpts = root.opts();
|
|
151
|
+
const configPath = resolveConfigPath(globalOpts.config);
|
|
152
|
+
if (!(await fileExists(configPath))) {
|
|
153
|
+
output.error(`Configuration file not found: ${configPath}`);
|
|
154
|
+
process.exitCode = 1;
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const vars = await scanEnvVars(configPath);
|
|
158
|
+
if (vars.size === 0) {
|
|
159
|
+
output.info('No environment variables found in configuration.');
|
|
160
|
+
output.info(chalk.dim('Next: run `orgloop validate` to check your config.'));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Check each variable
|
|
164
|
+
let setCount = 0;
|
|
165
|
+
let missingCount = 0;
|
|
166
|
+
// Find max variable name length for alignment
|
|
167
|
+
const maxNameLen = Math.max(...[...vars.keys()].map((k) => k.length));
|
|
168
|
+
if (output.isJsonMode()) {
|
|
169
|
+
const results = {};
|
|
170
|
+
for (const [name, source] of vars) {
|
|
171
|
+
const isSet = process.env[name] !== undefined;
|
|
172
|
+
const meta = getEnvVarMeta(name);
|
|
173
|
+
results[name] = {
|
|
174
|
+
set: isSet,
|
|
175
|
+
source,
|
|
176
|
+
...(meta?.description ? { description: meta.description } : {}),
|
|
177
|
+
...(meta?.help_url ? { help_url: meta.help_url } : {}),
|
|
178
|
+
};
|
|
179
|
+
if (isSet)
|
|
180
|
+
setCount++;
|
|
181
|
+
else
|
|
182
|
+
missingCount++;
|
|
183
|
+
}
|
|
184
|
+
output.json({ variables: results, set: setCount, missing: missingCount });
|
|
185
|
+
if (strict && missingCount > 0)
|
|
186
|
+
process.exitCode = 1;
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
output.blank();
|
|
190
|
+
output.heading('Environment Variables:');
|
|
191
|
+
output.blank();
|
|
192
|
+
for (const [name, source] of vars) {
|
|
193
|
+
const isSet = process.env[name] !== undefined;
|
|
194
|
+
const paddedName = name.padEnd(maxNameLen);
|
|
195
|
+
if (isSet) {
|
|
196
|
+
setCount++;
|
|
197
|
+
console.log(` ${chalk.green('\u2713')} ${paddedName} ${chalk.dim(source)}`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
missingCount++;
|
|
201
|
+
console.log(` ${chalk.red('\u2717')} ${paddedName} ${chalk.dim(source)}`);
|
|
202
|
+
const meta = getEnvVarMeta(name);
|
|
203
|
+
if (meta) {
|
|
204
|
+
console.log(` ${chalk.dim('\u2192')} ${chalk.dim(meta.description)}`);
|
|
205
|
+
if (meta.help_url) {
|
|
206
|
+
console.log(` ${chalk.dim('\u2192')} ${chalk.dim(meta.help_url)}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const total = setCount + missingCount;
|
|
212
|
+
output.blank();
|
|
213
|
+
if (missingCount === 0) {
|
|
214
|
+
output.info(`${setCount} of ${total} variables set.`);
|
|
215
|
+
output.info(chalk.dim('Next: run `orgloop validate` to check your config.'));
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
output.info(`${setCount} of ${total} variables set. ${missingCount} missing.`);
|
|
219
|
+
output.info(chalk.dim('Fix missing variables, then run `orgloop validate`.'));
|
|
220
|
+
}
|
|
221
|
+
if (strict && missingCount > 0) {
|
|
222
|
+
process.exitCode = 1;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
output.error(`Environment check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
227
|
+
process.exitCode = 1;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* orgloop hook — Forward hook events to a running OrgLoop engine.
|
|
3
|
+
*
|
|
4
|
+
* Reads stdin and POSTs the raw JSON body to the engine's webhook endpoint.
|
|
5
|
+
* This is a stdin-to-HTTP bridge — the connector's webhook handler builds
|
|
6
|
+
* the OrgLoopEvent from the raw payload.
|
|
7
|
+
*/
|
|
8
|
+
import type { Command } from 'commander';
|
|
9
|
+
export declare function readStdin(): Promise<string>;
|
|
10
|
+
export declare function postToWebhook(sourceId: string, body: string, port: number): Promise<{
|
|
11
|
+
ok: boolean;
|
|
12
|
+
status: number;
|
|
13
|
+
body: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function registerHookCommand(program: Command): void;
|
|
16
|
+
//# sourceMappingURL=hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzC,wBAAgB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAU3C;AAED,wBAAsB,aAAa,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CASxD;AAID,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC1D"}
|