@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,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* orgloop validate — Validate configuration files.
|
|
3
|
+
*
|
|
4
|
+
* Checks YAML syntax, schema conformance, reference integrity,
|
|
5
|
+
* transform script existence/permissions, and prompt file existence.
|
|
6
|
+
*/
|
|
7
|
+
import { constants } from 'node:fs';
|
|
8
|
+
import { access, readFile, stat } from 'node:fs/promises';
|
|
9
|
+
import { dirname, isAbsolute, resolve } from 'node:path';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import yaml from 'js-yaml';
|
|
12
|
+
import { resolveConfigPath } from '../config.js';
|
|
13
|
+
import { resolveModules } from '../module-resolver.js';
|
|
14
|
+
import * as output from '../output.js';
|
|
15
|
+
import { scanEnvVars } from './env.js';
|
|
16
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
17
|
+
async function fileExists(path) {
|
|
18
|
+
try {
|
|
19
|
+
await access(path);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function isExecutable(path) {
|
|
27
|
+
try {
|
|
28
|
+
await access(path, constants.X_OK);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function loadYaml(path) {
|
|
36
|
+
const content = await readFile(path, 'utf-8');
|
|
37
|
+
return yaml.load(content);
|
|
38
|
+
}
|
|
39
|
+
// ─── Validators ──────────────────────────────────────────────────────────────
|
|
40
|
+
async function validateYamlSyntax(filePath) {
|
|
41
|
+
const relPath = filePath;
|
|
42
|
+
try {
|
|
43
|
+
await loadYaml(filePath);
|
|
44
|
+
return { file: relPath, valid: true, description: 'valid YAML syntax', errors: [] };
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
return {
|
|
48
|
+
file: relPath,
|
|
49
|
+
valid: false,
|
|
50
|
+
description: 'YAML syntax error',
|
|
51
|
+
errors: [err instanceof Error ? err.message : String(err)],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function validateProjectSchema(data, filePath) {
|
|
56
|
+
const errors = [];
|
|
57
|
+
const project = data;
|
|
58
|
+
if (!project.apiVersion)
|
|
59
|
+
errors.push('Missing required field: apiVersion');
|
|
60
|
+
if (project.kind !== 'Project')
|
|
61
|
+
errors.push(`Expected kind "Project", got "${project.kind}"`);
|
|
62
|
+
if (!project.metadata) {
|
|
63
|
+
errors.push('Missing required field: metadata');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const meta = project.metadata;
|
|
67
|
+
if (!meta.name)
|
|
68
|
+
errors.push('Missing required field: metadata.name');
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
file: filePath,
|
|
72
|
+
valid: errors.length === 0,
|
|
73
|
+
description: errors.length === 0 ? 'valid project manifest' : 'invalid project manifest',
|
|
74
|
+
errors,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async function validateReferences(basePath, routesDir, project, sources, actors, transforms, routes) {
|
|
78
|
+
const results = [];
|
|
79
|
+
for (const route of routes) {
|
|
80
|
+
const errors = [];
|
|
81
|
+
// Check source reference
|
|
82
|
+
if (!sources.has(route.when.source)) {
|
|
83
|
+
const available = [...sources.keys()];
|
|
84
|
+
const suggestion = findClosestMatch(route.when.source, available);
|
|
85
|
+
const msg = `Source "${route.when.source}" not found`;
|
|
86
|
+
errors.push(suggestion ? `${msg}. Did you mean "${suggestion}"?` : msg);
|
|
87
|
+
}
|
|
88
|
+
// Check actor reference
|
|
89
|
+
if (!actors.has(route.then.actor)) {
|
|
90
|
+
const available = [...actors.keys()];
|
|
91
|
+
const suggestion = findClosestMatch(route.then.actor, available);
|
|
92
|
+
const msg = `Actor "${route.then.actor}" not found`;
|
|
93
|
+
errors.push(suggestion ? `${msg}. Did you mean "${suggestion}"?` : msg);
|
|
94
|
+
}
|
|
95
|
+
// Check transform references
|
|
96
|
+
if (route.transforms) {
|
|
97
|
+
for (const tRef of route.transforms) {
|
|
98
|
+
if (!transforms.has(tRef.ref)) {
|
|
99
|
+
const available = [...transforms.keys()];
|
|
100
|
+
const suggestion = findClosestMatch(tRef.ref, available);
|
|
101
|
+
const msg = `Transform "${tRef.ref}" not found`;
|
|
102
|
+
errors.push(suggestion ? `${msg}. Did you mean "${suggestion}"?` : msg);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Check prompt file existence
|
|
107
|
+
if (route.with?.prompt_file) {
|
|
108
|
+
const promptPath = isAbsolute(route.with.prompt_file)
|
|
109
|
+
? route.with.prompt_file
|
|
110
|
+
: resolve(routesDir, route.with.prompt_file);
|
|
111
|
+
if (!(await fileExists(promptPath))) {
|
|
112
|
+
errors.push(`Prompt file not found: ${route.with.prompt_file}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
results.push({
|
|
116
|
+
file: `route: ${route.name}`,
|
|
117
|
+
valid: errors.length === 0,
|
|
118
|
+
description: errors.length === 0 ? 'valid route definition' : `error in route "${route.name}"`,
|
|
119
|
+
errors,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return results;
|
|
123
|
+
}
|
|
124
|
+
async function validateTransformScripts(transformDirs, defaultBasePath, transforms) {
|
|
125
|
+
const results = [];
|
|
126
|
+
for (const t of transforms) {
|
|
127
|
+
if (t.type === 'script' && t.script) {
|
|
128
|
+
const base = transformDirs.get(t.name) ?? defaultBasePath;
|
|
129
|
+
const scriptPath = isAbsolute(t.script) ? t.script : resolve(base, t.script);
|
|
130
|
+
const errors = [];
|
|
131
|
+
if (!(await fileExists(scriptPath))) {
|
|
132
|
+
errors.push(`Script not found: ${t.script}`);
|
|
133
|
+
}
|
|
134
|
+
else if (!(await isExecutable(scriptPath))) {
|
|
135
|
+
errors.push(`Script not executable: ${t.script} (run: chmod +x ${t.script})`);
|
|
136
|
+
}
|
|
137
|
+
results.push({
|
|
138
|
+
file: `transform: ${t.name}`,
|
|
139
|
+
valid: errors.length === 0,
|
|
140
|
+
description: errors.length === 0 ? `valid ${t.type} transform` : `invalid transform "${t.name}"`,
|
|
141
|
+
errors,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return results;
|
|
146
|
+
}
|
|
147
|
+
function findClosestMatch(target, candidates) {
|
|
148
|
+
if (candidates.length === 0)
|
|
149
|
+
return null;
|
|
150
|
+
let bestMatch = null;
|
|
151
|
+
let bestScore = Number.POSITIVE_INFINITY;
|
|
152
|
+
for (const candidate of candidates) {
|
|
153
|
+
const score = levenshtein(target, candidate);
|
|
154
|
+
if (score < bestScore && score <= Math.max(target.length, candidate.length) * 0.5) {
|
|
155
|
+
bestScore = score;
|
|
156
|
+
bestMatch = candidate;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return bestMatch;
|
|
160
|
+
}
|
|
161
|
+
function levenshtein(a, b) {
|
|
162
|
+
const m = a.length;
|
|
163
|
+
const n = b.length;
|
|
164
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
165
|
+
for (let i = 0; i <= m; i++)
|
|
166
|
+
dp[i][0] = i;
|
|
167
|
+
for (let j = 0; j <= n; j++)
|
|
168
|
+
dp[0][j] = j;
|
|
169
|
+
for (let i = 1; i <= m; i++) {
|
|
170
|
+
for (let j = 1; j <= n; j++) {
|
|
171
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
172
|
+
dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return dp[m][n];
|
|
176
|
+
}
|
|
177
|
+
export function validateRouteGraph(sources, actors, transforms, routes) {
|
|
178
|
+
const warnings = [];
|
|
179
|
+
// Collect IDs referenced by routes
|
|
180
|
+
const referencedSources = new Set();
|
|
181
|
+
const referencedActors = new Set();
|
|
182
|
+
const referencedTransforms = new Set();
|
|
183
|
+
for (const route of routes) {
|
|
184
|
+
referencedSources.add(route.when.source);
|
|
185
|
+
referencedActors.add(route.then.actor);
|
|
186
|
+
if (route.transforms) {
|
|
187
|
+
for (const t of route.transforms) {
|
|
188
|
+
referencedTransforms.add(t.ref);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Dead sources — defined but not referenced by any route
|
|
193
|
+
for (const id of sources.keys()) {
|
|
194
|
+
if (!referencedSources.has(id)) {
|
|
195
|
+
warnings.push({
|
|
196
|
+
kind: 'dead-source',
|
|
197
|
+
id,
|
|
198
|
+
message: `Source "${id}" is defined but not referenced by any route`,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Unreachable actors — defined but not referenced by any route
|
|
203
|
+
for (const id of actors.keys()) {
|
|
204
|
+
if (!referencedActors.has(id)) {
|
|
205
|
+
warnings.push({
|
|
206
|
+
kind: 'unreachable-actor',
|
|
207
|
+
id,
|
|
208
|
+
message: `Actor "${id}" is defined but not referenced by any route`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Orphan transforms — defined but not referenced by any route
|
|
213
|
+
for (const name of transforms.keys()) {
|
|
214
|
+
if (!referencedTransforms.has(name)) {
|
|
215
|
+
warnings.push({
|
|
216
|
+
kind: 'orphan-transform',
|
|
217
|
+
id: name,
|
|
218
|
+
message: `Transform "${name}" is defined but not referenced by any route`,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Event type coverage — routes referencing event types not in source's emits list
|
|
223
|
+
for (const route of routes) {
|
|
224
|
+
const source = sources.get(route.when.source);
|
|
225
|
+
if (!source?.emits || source.emits.length === 0)
|
|
226
|
+
continue;
|
|
227
|
+
for (const eventType of route.when.events) {
|
|
228
|
+
if (!source.emits.includes(eventType)) {
|
|
229
|
+
warnings.push({
|
|
230
|
+
kind: 'event-type-mismatch',
|
|
231
|
+
id: route.name,
|
|
232
|
+
message: `Route "${route.name}" listens for "${eventType}" but source "${route.when.source}" only emits [${source.emits.join(', ')}]`,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return warnings;
|
|
238
|
+
}
|
|
239
|
+
export async function runValidation(configPath) {
|
|
240
|
+
const results = [];
|
|
241
|
+
const basePath = dirname(resolve(configPath));
|
|
242
|
+
// 1. Validate orgloop.yaml syntax + schema
|
|
243
|
+
const syntaxResult = await validateYamlSyntax(configPath);
|
|
244
|
+
if (!syntaxResult.valid) {
|
|
245
|
+
results.push(syntaxResult);
|
|
246
|
+
return { results, errorCount: 1, warnCount: 0, graphWarnings: [], envWarnings: [] };
|
|
247
|
+
}
|
|
248
|
+
const projectData = await loadYaml(configPath);
|
|
249
|
+
const schemaResult = validateProjectSchema(projectData, configPath);
|
|
250
|
+
results.push(schemaResult);
|
|
251
|
+
if (!schemaResult.valid) {
|
|
252
|
+
return { results, errorCount: 1, warnCount: 0, graphWarnings: [], envWarnings: [] };
|
|
253
|
+
}
|
|
254
|
+
const project = projectData;
|
|
255
|
+
// 2. Load and validate connector files
|
|
256
|
+
const sources = new Map();
|
|
257
|
+
const actors = new Map();
|
|
258
|
+
for (const file of project.connectors ?? []) {
|
|
259
|
+
const filePath = isAbsolute(file) ? file : resolve(basePath, file);
|
|
260
|
+
const syntaxRes = await validateYamlSyntax(filePath);
|
|
261
|
+
if (!syntaxRes.valid) {
|
|
262
|
+
results.push(syntaxRes);
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
try {
|
|
266
|
+
const data = (await loadYaml(filePath));
|
|
267
|
+
if (data?.sources) {
|
|
268
|
+
for (const s of data.sources)
|
|
269
|
+
sources.set(s.id, s);
|
|
270
|
+
}
|
|
271
|
+
if (data?.actors) {
|
|
272
|
+
for (const a of data.actors)
|
|
273
|
+
actors.set(a.id, a);
|
|
274
|
+
}
|
|
275
|
+
results.push({
|
|
276
|
+
file: file,
|
|
277
|
+
valid: true,
|
|
278
|
+
description: data?.sources ? 'valid source definition' : 'valid actor definition',
|
|
279
|
+
errors: [],
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
results.push({
|
|
284
|
+
file: file,
|
|
285
|
+
valid: false,
|
|
286
|
+
description: 'failed to load connector file',
|
|
287
|
+
errors: [err instanceof Error ? err.message : String(err)],
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// 3. Load and validate transform files
|
|
292
|
+
const transforms = new Map();
|
|
293
|
+
const transformDirs = new Map();
|
|
294
|
+
for (const file of project.transforms ?? []) {
|
|
295
|
+
const filePath = isAbsolute(file) ? file : resolve(basePath, file);
|
|
296
|
+
const fileDir = dirname(filePath);
|
|
297
|
+
const syntaxRes = await validateYamlSyntax(filePath);
|
|
298
|
+
if (!syntaxRes.valid) {
|
|
299
|
+
results.push(syntaxRes);
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
try {
|
|
303
|
+
const data = (await loadYaml(filePath));
|
|
304
|
+
if (data?.transforms) {
|
|
305
|
+
for (const t of data.transforms) {
|
|
306
|
+
transforms.set(t.name, t);
|
|
307
|
+
transformDirs.set(t.name, fileDir);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
results.push({ file: file, valid: true, description: 'valid transform group', errors: [] });
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
results.push({
|
|
314
|
+
file: file,
|
|
315
|
+
valid: false,
|
|
316
|
+
description: 'failed to load transform file',
|
|
317
|
+
errors: [err instanceof Error ? err.message : String(err)],
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// 4. Validate transform scripts
|
|
322
|
+
const scriptResults = await validateTransformScripts(transformDirs, basePath, [
|
|
323
|
+
...transforms.values(),
|
|
324
|
+
]);
|
|
325
|
+
results.push(...scriptResults);
|
|
326
|
+
// 5. Load and validate logger files
|
|
327
|
+
for (const file of project.loggers ?? []) {
|
|
328
|
+
const filePath = isAbsolute(file) ? file : resolve(basePath, file);
|
|
329
|
+
const syntaxRes = await validateYamlSyntax(filePath);
|
|
330
|
+
if (!syntaxRes.valid) {
|
|
331
|
+
results.push(syntaxRes);
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
try {
|
|
335
|
+
const data = (await loadYaml(filePath));
|
|
336
|
+
results.push({ file: file, valid: true, description: 'valid logger group', errors: [] });
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
results.push({
|
|
340
|
+
file: file,
|
|
341
|
+
valid: false,
|
|
342
|
+
description: 'failed to load logger file',
|
|
343
|
+
errors: [err instanceof Error ? err.message : String(err)],
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// 6. Load and validate route files
|
|
348
|
+
const allRoutes = [];
|
|
349
|
+
const routesDir = resolve(basePath, 'routes');
|
|
350
|
+
if (await fileExists(routesDir)) {
|
|
351
|
+
const { readdir } = await import('node:fs/promises');
|
|
352
|
+
const files = await readdir(routesDir);
|
|
353
|
+
for (const file of files.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'))) {
|
|
354
|
+
const filePath = resolve(routesDir, file);
|
|
355
|
+
const syntaxRes = await validateYamlSyntax(filePath);
|
|
356
|
+
if (!syntaxRes.valid) {
|
|
357
|
+
results.push(syntaxRes);
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
try {
|
|
361
|
+
const data = (await loadYaml(filePath));
|
|
362
|
+
if (data?.routes)
|
|
363
|
+
allRoutes.push(...data.routes);
|
|
364
|
+
results.push({
|
|
365
|
+
file: `routes/${file}`,
|
|
366
|
+
valid: true,
|
|
367
|
+
description: 'valid route group',
|
|
368
|
+
errors: [],
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
catch (err) {
|
|
372
|
+
results.push({
|
|
373
|
+
file: `routes/${file}`,
|
|
374
|
+
valid: false,
|
|
375
|
+
description: 'failed to load route file',
|
|
376
|
+
errors: [err instanceof Error ? err.message : String(err)],
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// 6b. Load module routes
|
|
382
|
+
if (project.modules?.length) {
|
|
383
|
+
try {
|
|
384
|
+
const moduleResult = await resolveModules(project.modules, basePath);
|
|
385
|
+
allRoutes.push(...moduleResult.routes);
|
|
386
|
+
for (const mod of moduleResult.resolved) {
|
|
387
|
+
results.push({
|
|
388
|
+
file: `module:${mod.manifest.metadata.name}`,
|
|
389
|
+
valid: true,
|
|
390
|
+
description: `valid module (${mod.routes.length} routes)`,
|
|
391
|
+
errors: [],
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
catch (err) {
|
|
396
|
+
results.push({
|
|
397
|
+
file: 'modules',
|
|
398
|
+
valid: false,
|
|
399
|
+
description: 'failed to resolve modules',
|
|
400
|
+
errors: [err instanceof Error ? err.message : String(err)],
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// 7. Validate reference integrity
|
|
405
|
+
const refResults = await validateReferences(basePath, routesDir, project, sources, actors, transforms, allRoutes);
|
|
406
|
+
results.push(...refResults);
|
|
407
|
+
// 8. Validate route graph (warnings only)
|
|
408
|
+
const graphWarnings = validateRouteGraph(sources, actors, transforms, allRoutes);
|
|
409
|
+
// 9. Scan for missing environment variables (warnings only)
|
|
410
|
+
const envWarnings = [];
|
|
411
|
+
try {
|
|
412
|
+
const envVars = await scanEnvVars(configPath);
|
|
413
|
+
for (const [name, source] of envVars) {
|
|
414
|
+
if (process.env[name] === undefined) {
|
|
415
|
+
envWarnings.push({ name, source });
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
// env var scanning is best-effort — don't fail validation
|
|
421
|
+
}
|
|
422
|
+
const errorCount = results.filter((r) => !r.valid).length;
|
|
423
|
+
return {
|
|
424
|
+
results,
|
|
425
|
+
errorCount,
|
|
426
|
+
warnCount: graphWarnings.length + envWarnings.length,
|
|
427
|
+
graphWarnings,
|
|
428
|
+
envWarnings,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
// ─── Command registration ────────────────────────────────────────────────────
|
|
432
|
+
export function registerValidateCommand(program) {
|
|
433
|
+
program
|
|
434
|
+
.command('validate')
|
|
435
|
+
.description('Validate configuration files')
|
|
436
|
+
.action(async (opts, cmd) => {
|
|
437
|
+
try {
|
|
438
|
+
const globalOpts = cmd.parent?.opts() ?? {};
|
|
439
|
+
const configPath = resolveConfigPath(globalOpts.config);
|
|
440
|
+
if (!(await fileExists(configPath))) {
|
|
441
|
+
output.error(`Configuration file not found: ${configPath}`);
|
|
442
|
+
process.exitCode = 1;
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
const { results, errorCount, warnCount, graphWarnings, envWarnings } = await runValidation(configPath);
|
|
446
|
+
if (output.isJsonMode()) {
|
|
447
|
+
output.json({
|
|
448
|
+
results,
|
|
449
|
+
errors: errorCount,
|
|
450
|
+
warnings: warnCount,
|
|
451
|
+
graphWarnings,
|
|
452
|
+
envWarnings,
|
|
453
|
+
});
|
|
454
|
+
if (errorCount > 0)
|
|
455
|
+
process.exitCode = 2;
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
output.blank();
|
|
459
|
+
for (const r of results) {
|
|
460
|
+
if (r.valid) {
|
|
461
|
+
output.validPass(r.file, r.description);
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
output.validFail(r.file, r.description);
|
|
465
|
+
for (const err of r.errors) {
|
|
466
|
+
output.info(` ${err}`);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
// Display route graph warnings
|
|
471
|
+
if (graphWarnings.length > 0) {
|
|
472
|
+
output.blank();
|
|
473
|
+
for (const w of graphWarnings) {
|
|
474
|
+
output.validWarn(w.id, w.message);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
// Display missing env var warnings
|
|
478
|
+
if (envWarnings.length > 0) {
|
|
479
|
+
output.blank();
|
|
480
|
+
for (const ew of envWarnings) {
|
|
481
|
+
output.warn(`${ew.name} \u2014 not set ${chalk.dim(`(${ew.source})`)}`);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
output.blank();
|
|
485
|
+
if (errorCount === 0) {
|
|
486
|
+
output.info(`0 errors, ${warnCount} warnings \u2713`);
|
|
487
|
+
output.info(chalk.dim('Next: run `orgloop doctor` for a full health check.'));
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
output.info(`${errorCount} error${errorCount > 1 ? 's' : ''}, ${warnCount} warning${warnCount > 1 ? 's' : ''}`);
|
|
491
|
+
output.info(chalk.dim('Fix the errors above, then re-run `orgloop validate`.'));
|
|
492
|
+
process.exitCode = 2;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
catch (err) {
|
|
496
|
+
output.error(`Validation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
497
|
+
process.exitCode = 1;
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB7D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* orgloop version — Print version info.
|
|
3
|
+
*
|
|
4
|
+
* Shows orgloop version, node version, platform.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from 'node:fs/promises';
|
|
7
|
+
import { dirname, resolve } from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import * as output from '../output.js';
|
|
10
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
async function getVersion() {
|
|
12
|
+
try {
|
|
13
|
+
// Walk up from commands/ to find package.json
|
|
14
|
+
const pkgPath = resolve(__dirname, '..', '..', 'package.json');
|
|
15
|
+
const content = await readFile(pkgPath, 'utf-8');
|
|
16
|
+
const pkg = JSON.parse(content);
|
|
17
|
+
return pkg.version;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return 'unknown';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function registerVersionCommand(program) {
|
|
24
|
+
program
|
|
25
|
+
.command('version')
|
|
26
|
+
.description('Print version info')
|
|
27
|
+
.action(async () => {
|
|
28
|
+
const version = await getVersion();
|
|
29
|
+
if (output.isJsonMode()) {
|
|
30
|
+
output.json({
|
|
31
|
+
orgloop: version,
|
|
32
|
+
node: process.version,
|
|
33
|
+
platform: `${process.platform} ${process.arch}`,
|
|
34
|
+
});
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
output.info(`orgloop ${version}`);
|
|
38
|
+
output.info(`node ${process.version}`);
|
|
39
|
+
output.info(`platform ${process.platform} ${process.arch}`);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,KAAK,UAAU,UAAU;IACxB,IAAI,CAAC;QACJ,8CAA8C;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACtD,OAAO;SACL,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;QAEnC,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,OAAO,CAAC,OAAO;gBACrB,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE;aAC/C,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loading for the CLI.
|
|
3
|
+
*
|
|
4
|
+
* Loads orgloop.yaml from --config flag or current directory,
|
|
5
|
+
* resolves environment variables, merges with user defaults.
|
|
6
|
+
*/
|
|
7
|
+
import type { OrgLoopConfig, ProjectConfig } from '@orgloop/sdk';
|
|
8
|
+
export interface CliConfigOptions {
|
|
9
|
+
/** Path to orgloop.yaml (from --config flag) */
|
|
10
|
+
configPath?: string;
|
|
11
|
+
/** Workspace name */
|
|
12
|
+
workspace?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the config file path.
|
|
16
|
+
* Priority: --config flag > ./orgloop.yaml > error.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveConfigPath(configPath?: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Load and resolve the full OrgLoop configuration from YAML files.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadCliConfig(options?: CliConfigOptions): Promise<OrgLoopConfig>;
|
|
23
|
+
/**
|
|
24
|
+
* Load the raw ProjectConfig (for validation/display without full resolution).
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadProjectConfig(configPath?: string): Promise<ProjectConfig>;
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA2EjE,MAAM,WAAW,gBAAgB;IAChC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqG1F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAMnF"}
|