@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.
Files changed (94) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/commands/add.d.ts +8 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +363 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/apply.d.ts +9 -0
  7. package/dist/commands/apply.d.ts.map +1 -0
  8. package/dist/commands/apply.js +289 -0
  9. package/dist/commands/apply.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +45 -0
  11. package/dist/commands/doctor.d.ts.map +1 -0
  12. package/dist/commands/doctor.js +346 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/commands/env.d.ts +23 -0
  15. package/dist/commands/env.d.ts.map +1 -0
  16. package/dist/commands/env.js +230 -0
  17. package/dist/commands/env.js.map +1 -0
  18. package/dist/commands/hook.d.ts +16 -0
  19. package/dist/commands/hook.d.ts.map +1 -0
  20. package/dist/commands/hook.js +80 -0
  21. package/dist/commands/hook.js.map +1 -0
  22. package/dist/commands/init.d.ts +42 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +532 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/inspect.d.ts +8 -0
  27. package/dist/commands/inspect.d.ts.map +1 -0
  28. package/dist/commands/inspect.js +177 -0
  29. package/dist/commands/inspect.js.map +1 -0
  30. package/dist/commands/install-service.d.ts +8 -0
  31. package/dist/commands/install-service.d.ts.map +1 -0
  32. package/dist/commands/install-service.js +182 -0
  33. package/dist/commands/install-service.js.map +1 -0
  34. package/dist/commands/logs.d.ts +8 -0
  35. package/dist/commands/logs.d.ts.map +1 -0
  36. package/dist/commands/logs.js +197 -0
  37. package/dist/commands/logs.js.map +1 -0
  38. package/dist/commands/plan.d.ts +9 -0
  39. package/dist/commands/plan.d.ts.map +1 -0
  40. package/dist/commands/plan.js +200 -0
  41. package/dist/commands/plan.js.map +1 -0
  42. package/dist/commands/routes.d.ts +37 -0
  43. package/dist/commands/routes.d.ts.map +1 -0
  44. package/dist/commands/routes.js +167 -0
  45. package/dist/commands/routes.js.map +1 -0
  46. package/dist/commands/service.d.ts +9 -0
  47. package/dist/commands/service.d.ts.map +1 -0
  48. package/dist/commands/service.js +178 -0
  49. package/dist/commands/service.js.map +1 -0
  50. package/dist/commands/status.d.ts +8 -0
  51. package/dist/commands/status.d.ts.map +1 -0
  52. package/dist/commands/status.js +176 -0
  53. package/dist/commands/status.js.map +1 -0
  54. package/dist/commands/stop.d.ts +8 -0
  55. package/dist/commands/stop.d.ts.map +1 -0
  56. package/dist/commands/stop.js +102 -0
  57. package/dist/commands/stop.js.map +1 -0
  58. package/dist/commands/test.d.ts +8 -0
  59. package/dist/commands/test.d.ts.map +1 -0
  60. package/dist/commands/test.js +236 -0
  61. package/dist/commands/test.js.map +1 -0
  62. package/dist/commands/validate.d.ts +33 -0
  63. package/dist/commands/validate.d.ts.map +1 -0
  64. package/dist/commands/validate.js +501 -0
  65. package/dist/commands/validate.js.map +1 -0
  66. package/dist/commands/version.d.ts +8 -0
  67. package/dist/commands/version.d.ts.map +1 -0
  68. package/dist/commands/version.js +42 -0
  69. package/dist/commands/version.js.map +1 -0
  70. package/dist/config.d.ts +27 -0
  71. package/dist/config.d.ts.map +1 -0
  72. package/dist/config.js +169 -0
  73. package/dist/config.js.map +1 -0
  74. package/dist/env-metadata.d.ts +12 -0
  75. package/dist/env-metadata.d.ts.map +1 -0
  76. package/dist/env-metadata.js +39 -0
  77. package/dist/env-metadata.js.map +1 -0
  78. package/dist/index.d.ts +8 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +86 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/module-resolver.d.ts +42 -0
  83. package/dist/module-resolver.d.ts.map +1 -0
  84. package/dist/module-resolver.js +134 -0
  85. package/dist/module-resolver.js.map +1 -0
  86. package/dist/output.d.ts +36 -0
  87. package/dist/output.d.ts.map +1 -0
  88. package/dist/output.js +142 -0
  89. package/dist/output.js.map +1 -0
  90. package/dist/resolve-connectors.d.ts +27 -0
  91. package/dist/resolve-connectors.d.ts.map +1 -0
  92. package/dist/resolve-connectors.js +94 -0
  93. package/dist/resolve-connectors.js.map +1 -0
  94. 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"}