@oml/cli 0.19.3 → 0.20.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.
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) 2026 Modelware. All rights reserved.
2
- import { checkConsistency } from '@oml/reasoner';
2
+ import { checkConsistency, checkConsistencyBatch } from '@oml/reasoner';
3
3
  import chalk from 'chalk';
4
4
  import * as fs from 'node:fs/promises';
5
5
  import * as os from 'node:os';
@@ -9,14 +9,7 @@ import { failCli } from '../cli-error.js';
9
9
  import { formatDuration } from '../util.js';
10
10
  import { printLintDiagnostics } from './lint.js';
11
11
  import { restPost } from './server/rest.js';
12
- const OWL_IMPORTS_IRI = '<http://www.w3.org/2002/07/owl#imports>';
13
- function normalizeRdfFormat(value) {
14
- const normalized = String(value ?? 'ttl').trim().toLowerCase();
15
- if (normalized === 'trig' || normalized === 'nt' || normalized === 'nq' || normalized === 'n3') {
16
- return normalized;
17
- }
18
- return 'ttl';
19
- }
12
+ /** Add a blank line between top-level statements for ttl/trig readability. */
20
13
  function prettyPrintRdf(serialized, format) {
21
14
  if (format !== 'ttl' && format !== 'trig') {
22
15
  return serialized;
@@ -24,9 +17,8 @@ function prettyPrintRdf(serialized, format) {
24
17
  const lines = serialized.split('\n');
25
18
  const out = [];
26
19
  for (let i = 0; i < lines.length; i += 1) {
27
- const line = lines[i];
28
- out.push(line);
29
- if (line.trim().endsWith('.')) {
20
+ out.push(lines[i]);
21
+ if (lines[i].trim().endsWith('.')) {
30
22
  const next = lines[i + 1];
31
23
  if (next !== undefined && next.trim().length > 0) {
32
24
  out.push('');
@@ -35,210 +27,233 @@ function prettyPrintRdf(serialized, format) {
35
27
  }
36
28
  return out.join('\n');
37
29
  }
38
- function extractImports(serialized) {
39
- const imports = new Set();
40
- const statementPattern = /(?:<http:\/\/www\.w3\.org\/2002\/07\/owl#imports>|owl:imports)\s+([^;.]*)[;.]/gms;
41
- let statementMatch;
42
- while ((statementMatch = statementPattern.exec(serialized)) !== null) {
43
- const tail = statementMatch[1] ?? '';
44
- const iriPattern = /<([^>]+)>/g;
45
- let iriMatch;
46
- while ((iriMatch = iriPattern.exec(tail)) !== null) {
47
- const iri = iriMatch[1]?.trim();
48
- if (iri) {
49
- imports.add(iri);
50
- }
51
- }
52
- }
53
- // Handle compact single-line N-Triples cases defensively.
54
- if (imports.size === 0 && serialized.includes(OWL_IMPORTS_IRI)) {
55
- const linePattern = /<http:\/\/www\.w3\.org\/2002\/07\/owl#imports>\s+<([^>]+)>/g;
56
- let lineMatch;
57
- while ((lineMatch = linePattern.exec(serialized)) !== null) {
58
- const iri = lineMatch[1]?.trim();
59
- if (iri) {
60
- imports.add(iri);
61
- }
62
- }
63
- }
64
- return Array.from(imports);
30
+ function resolveEntailmentsPath(uri) {
31
+ const trimmed = uri.trim();
32
+ return trimmed.startsWith('file://') ? fileURLToPath(trimmed) : trimmed;
65
33
  }
66
34
  function sortFilesLeafToRoot(files) {
67
- const filesByOntologyIri = new Map();
68
- for (const file of files) {
69
- filesByOntologyIri.set(file.ontologyIri, file);
70
- }
71
- const importsByOntologyIri = new Map();
72
- for (const file of files) {
73
- importsByOntologyIri.set(file.ontologyIri, extractImports(file.content));
74
- }
35
+ const byPath = new Map(files.map(f => [f.path, f]));
75
36
  const sorted = [];
76
37
  const state = new Map();
77
- const sortedRoots = [...filesByOntologyIri.keys()].sort((a, b) => a.localeCompare(b));
78
- const visit = (ontologyIri) => {
79
- const current = state.get(ontologyIri) ?? 0;
80
- if (current === 2) {
81
- return;
82
- }
83
- if (current === 1) {
38
+ const visit = (p) => {
39
+ if ((state.get(p) ?? 0) !== 0)
84
40
  return;
41
+ state.set(p, 1);
42
+ for (const imp of byPath.get(p)?.imports ?? []) {
43
+ visit(imp);
85
44
  }
86
- state.set(ontologyIri, 1);
87
- for (const importedIri of importsByOntologyIri.get(ontologyIri) ?? []) {
88
- if (filesByOntologyIri.has(importedIri)) {
89
- visit(importedIri);
90
- }
91
- }
92
- state.set(ontologyIri, 2);
93
- const file = filesByOntologyIri.get(ontologyIri);
94
- if (file) {
95
- sorted.push(file);
96
- }
45
+ state.set(p, 2);
46
+ const f = byPath.get(p);
47
+ if (f)
48
+ sorted.push(f);
97
49
  };
98
- for (const ontologyIri of sortedRoots) {
99
- visit(ontologyIri);
100
- }
50
+ for (const p of [...byPath.keys()].sort())
51
+ visit(p);
101
52
  return sorted;
102
53
  }
103
- function resolveEntailmentsPath(uri) {
104
- const trimmed = uri.trim();
105
- if (trimmed.startsWith('file://')) {
106
- return fileURLToPath(trimmed);
54
+ function collectClosure(start, byPath, into) {
55
+ const stack = [start];
56
+ while (stack.length > 0) {
57
+ const p = stack.pop();
58
+ if (into.has(p))
59
+ continue;
60
+ into.add(p);
61
+ for (const imp of byPath.get(p)?.imports ?? [])
62
+ stack.push(imp);
107
63
  }
108
- return trimmed;
109
64
  }
110
- function ontologyIriToTempPath(ontologyIri, format) {
111
- try {
112
- const iri = new URL(ontologyIri);
113
- const rawPath = iri.pathname.replace(/\/+$/, '');
114
- const segments = rawPath.split('/').filter(Boolean);
115
- const stem = segments.at(-1) || 'index';
116
- const dirSegs = iri.host ? [iri.host, ...segments.slice(0, -1)] : segments.slice(0, -1);
117
- return dirSegs.length > 0 ? path.join(...dirSegs, `${stem}.${format}`) : `${stem}.${format}`;
65
+ function closureFiles(start, byPath) {
66
+ const seen = new Set();
67
+ collectClosure(start, byPath, seen);
68
+ const result = [];
69
+ for (const p of seen) {
70
+ const f = byPath.get(p);
71
+ if (f)
72
+ result.push(f);
118
73
  }
119
- catch {
120
- return ontologyIri.replace(/[^a-zA-Z0-9_/-]/g, '_') + '.' + format;
74
+ return result;
75
+ }
76
+ /**
77
+ * Files imported by no other file (maximal nodes of the import graph).
78
+ * Checking only these establishes consistency of every file: OWL-DL
79
+ * consistency is monotonic, so a consistent import closure proves every
80
+ * imported (subset) ontology is consistent too. The roots' closures cover
81
+ * every file, so this is sufficient — and far cheaper than reasoning each
82
+ * file's closure independently.
83
+ */
84
+ function computeConsistencyRoots(files) {
85
+ const byPath = new Map(files.map(f => [f.path, f]));
86
+ const imported = new Set();
87
+ for (const f of files) {
88
+ for (const imp of f.imports)
89
+ imported.add(imp);
121
90
  }
91
+ const roots = files.filter(f => !imported.has(f.path));
92
+ // Guard against import cycles whose component is imported by nobody outside
93
+ // it: make sure every file is in some root's closure, else add it directly.
94
+ const covered = new Set();
95
+ for (const root of roots)
96
+ collectClosure(root.path, byPath, covered);
97
+ const uncovered = files.filter(f => !covered.has(f.path));
98
+ return sortFilesLeafToRoot([...roots, ...uncovered]);
122
99
  }
123
- function modelUriToRelativePath(modelUri) {
124
- const trimmed = (modelUri ?? '').trim();
125
- if (trimmed.startsWith('file://')) {
126
- const absolute = fileURLToPath(trimmed);
127
- const relative = path.relative(process.cwd(), absolute);
128
- return relative.length > 0 ? relative : path.basename(absolute);
100
+ function resolveTimeout(opts) {
101
+ return typeof opts.timeout === 'number' && Number.isFinite(opts.timeout) && opts.timeout > 0
102
+ ? Math.floor(opts.timeout)
103
+ : 120000;
104
+ }
105
+ /**
106
+ * A root's import closure is inconsistent. Reason its closure file-by-file,
107
+ * leaf-to-root, to find the first file whose own closure is inconsistent —
108
+ * the precise point where the inconsistency is introduced.
109
+ */
110
+ async function localizeInconsistency(root, byPath, workDir, opts) {
111
+ const closure = sortFilesLeafToRoot(closureFiles(root.path, byPath));
112
+ for (const file of closure) {
113
+ const result = await checkConsistency({
114
+ input: path.join(workDir, file.path),
115
+ inputRoot: workDir,
116
+ explanations: opts.explanation === true,
117
+ uniqueNamesAssumption: opts.uniqueNamesAssumption !== false,
118
+ checkOnly: true,
119
+ profile: false,
120
+ timeout: resolveTimeout(opts),
121
+ });
122
+ if (!result.consistent) {
123
+ return { file, result: result };
124
+ }
129
125
  }
130
- return trimmed;
126
+ return undefined;
131
127
  }
132
128
  export const reasonAction = async (opts) => {
133
129
  const startedAt = Date.now();
134
- const outputFormat = normalizeRdfFormat(opts.format);
130
+ const persistDir = typeof opts.owl === 'string' && opts.owl.trim().length > 0
131
+ ? path.resolve(opts.owl.trim())
132
+ : undefined;
133
+ const format = opts.format ?? 'ttl';
135
134
  const pretty = opts.pretty === true;
136
- const assertions = await restPost('/v0/assertions', { format: outputFormat, pretty }, opts.authToken);
137
- if (!assertions.success) {
135
+ // Always reason inside a private temp dir and only promote it to the user's
136
+ // output directory on full success, so a failed/inconsistent run never leaves
137
+ // partial or internally-inconsistent artifacts behind in persistDir.
138
+ const workDir = await fs.mkdtemp(path.join(os.tmpdir(), 'oml-reason-'));
139
+ const exported = await restPost('/v0/export', { owl: workDir, format, pretty }, opts.authToken);
140
+ if (!exported.success) {
141
+ await fs.rm(workDir, { recursive: true, force: true });
138
142
  printLintDiagnostics({
139
143
  success: false,
140
- filesChecked: Number(assertions.filesChecked ?? 0),
141
- errors: Number(assertions.errors ?? 0),
142
- warnings: Number(assertions.warnings ?? 0),
143
- problems: assertions.problems,
144
+ filesChecked: Number(exported.filesChecked ?? 0),
145
+ errors: Number(exported.errors ?? 0),
146
+ warnings: Number(exported.warnings ?? 0),
147
+ problems: exported.problems,
144
148
  });
145
- const summary = assertions.error?.trim() || 'reason failed.';
146
- failCli(chalk.red(summary));
149
+ failCli(chalk.red(exported.error?.trim() || 'reason failed.'));
147
150
  }
148
151
  printLintDiagnostics({
149
152
  success: true,
150
- filesChecked: Number(assertions.filesChecked ?? 0),
151
- errors: Number(assertions.errors ?? 0),
152
- warnings: Number(assertions.warnings ?? 0),
153
- problems: assertions.problems,
153
+ filesChecked: Number(exported.filesChecked ?? 0),
154
+ errors: Number(exported.errors ?? 0),
155
+ warnings: Number(exported.warnings ?? 0),
156
+ problems: exported.problems,
154
157
  });
155
- if (assertions.files.length === 0) {
158
+ if (exported.files.length === 0) {
159
+ await fs.rm(workDir, { recursive: true, force: true });
156
160
  console.log(chalk.yellow(`No .oml files found under ${path.resolve('.')}.`));
157
161
  return;
158
162
  }
159
- const outputDir = typeof opts.owl === 'string' && opts.owl.trim().length > 0
160
- ? path.resolve(opts.owl.trim())
161
- : undefined;
162
- const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'oml-reason-cli-'));
163
- if (outputDir) {
164
- await fs.rm(outputDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
165
- }
166
- const orderedFiles = sortFilesLeafToRoot(assertions.files);
163
+ const byPath = new Map(exported.files.map(f => [f.path, f]));
164
+ // Check-only runs reason just the import-graph roots (consistency is
165
+ // monotonic, so the roots' closures prove every file consistent). Persisting
166
+ // entailments needs per-file output, so it still reasons every file.
167
+ const checkOnly = persistDir === undefined;
168
+ const targets = checkOnly
169
+ ? computeConsistencyRoots(exported.files)
170
+ : sortFilesLeafToRoot(exported.files);
167
171
  let firstInconsistent;
168
172
  let firstFailure;
169
173
  let entailmentsProduced = 0;
170
174
  try {
171
- for (const file of orderedFiles) {
172
- const target = path.join(tempRoot, ontologyIriToTempPath(file.ontologyIri, outputFormat));
173
- await fs.mkdir(path.dirname(target), { recursive: true });
174
- await fs.writeFile(target, prettyPrintRdf(file.content, outputFormat), 'utf-8');
175
- }
176
- for (const file of orderedFiles) {
177
- const target = path.join(tempRoot, ontologyIriToTempPath(file.ontologyIri, outputFormat));
178
- try {
179
- const result = await checkConsistency({
180
- input: target,
181
- inputRoot: tempRoot,
182
- explanations: opts.explanation === true,
183
- uniqueNamesAssumption: opts.uniqueNamesAssumption !== false,
184
- checkOnly: outputDir === undefined,
185
- profile: opts.profile === true,
186
- timeout: typeof opts.timeout === 'number' && Number.isFinite(opts.timeout) && opts.timeout > 0
187
- ? Math.floor(opts.timeout)
188
- : 120000,
189
- });
190
- if (!result.consistent) {
191
- firstInconsistent = {
192
- file,
193
- result: result,
194
- };
175
+ // Reason all targets in a single reasoner process: one JVM and one shared
176
+ // parse cache for the whole batch, instead of spawning a process and
177
+ // re-parsing every import closure per file.
178
+ const batchResults = await checkConsistencyBatch({
179
+ inputs: targets.map(f => path.join(workDir, f.path)),
180
+ inputRoot: workDir,
181
+ // Skip tracing on the batch scan; explanations are produced during
182
+ // localization on the culprit file instead.
183
+ explanations: false,
184
+ uniqueNamesAssumption: opts.uniqueNamesAssumption !== false,
185
+ checkOnly,
186
+ // Hoist shared entailments when persisting; targets are already
187
+ // ordered leaf-to-root, which hoisting requires. Ignored for
188
+ // check-only runs (no entailments are materialized).
189
+ hoist: opts.hoist === true && !checkOnly,
190
+ profile: opts.profile === true,
191
+ timeout: Math.max(opts.timeout ?? 0, 1800000),
192
+ });
193
+ const resultByInput = new Map(batchResults.map(r => [r.input, r]));
194
+ // Walk targets in leaf-to-root order so the first problem reported is the
195
+ // earliest (most-imported) point of failure or inconsistency.
196
+ for (const file of targets) {
197
+ const input = path.join(workDir, file.path);
198
+ const result = resultByInput.get(input);
199
+ if (!result) {
200
+ firstFailure = { path: file.path, error: 'Reasoner produced no result for this file.' };
201
+ break;
202
+ }
203
+ if (typeof result.error === 'string' && result.error.length > 0) {
204
+ firstFailure = { path: file.path, error: result.error };
205
+ break;
206
+ }
207
+ if (!result.consistent) {
208
+ firstInconsistent = checkOnly
209
+ ? (await localizeInconsistency(file, byPath, workDir, opts))
210
+ ?? { file, result: result }
211
+ : { file, result: result };
212
+ break;
213
+ }
214
+ if (persistDir) {
215
+ if (typeof result.entailmentsUri !== 'string' || result.entailmentsUri.trim().length === 0) {
216
+ firstFailure = { path: file.path, error: 'Reasoner returned a consistent result but did not provide entailments URI.' };
195
217
  break;
196
218
  }
197
- if (outputDir) {
198
- if (typeof result.entailmentsUri !== 'string' || result.entailmentsUri.trim().length === 0) {
199
- throw new Error('Reasoner returned a consistent result but did not provide entailments URI.');
200
- }
201
- if (pretty) {
202
- const entailmentsPath = resolveEntailmentsPath(result.entailmentsUri);
203
- const entailmentsContent = await fs.readFile(entailmentsPath, 'utf-8');
204
- await fs.writeFile(entailmentsPath, prettyPrintRdf(entailmentsContent, outputFormat), 'utf-8');
205
- }
206
- entailmentsProduced += 1;
219
+ if (pretty) {
220
+ const entailmentsPath = resolveEntailmentsPath(result.entailmentsUri);
221
+ const entailmentsContent = await fs.readFile(entailmentsPath, 'utf-8');
222
+ await fs.writeFile(entailmentsPath, prettyPrintRdf(entailmentsContent, format), 'utf-8');
207
223
  }
224
+ entailmentsProduced += 1;
208
225
  }
209
- catch (error) {
210
- firstFailure = {
211
- modelUri: file.modelUri,
212
- error: error instanceof Error ? error.message : String(error),
213
- };
214
- break;
215
- }
226
+ }
227
+ // Promote temp output to the user's directory only on a fully successful run.
228
+ if (persistDir && !firstFailure && !firstInconsistent) {
229
+ await fs.rm(persistDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
230
+ await fs.mkdir(persistDir, { recursive: true });
231
+ await fs.cp(workDir, persistDir, { recursive: true, force: true });
216
232
  }
217
233
  }
234
+ catch (error) {
235
+ firstFailure = firstFailure ?? {
236
+ path: '(batch)',
237
+ error: error instanceof Error ? error.message : String(error),
238
+ };
239
+ }
218
240
  finally {
219
- if (outputDir && !firstFailure && !firstInconsistent) {
220
- await fs.mkdir(outputDir, { recursive: true });
221
- await fs.cp(tempRoot, outputDir, { recursive: true, force: true });
222
- }
223
- await fs.rm(tempRoot, { recursive: true, force: true });
241
+ await fs.rm(workDir, { recursive: true, force: true });
224
242
  }
225
243
  if (firstFailure) {
226
- const modelUri = String(firstFailure.modelUri ?? '').trim() || '<workspace>';
227
- failCli(chalk.red(`reason failed: ${modelUri}: ${firstFailure.error}`));
244
+ failCli(chalk.red(`reason failed: ${firstFailure.path}: ${firstFailure.error}`));
228
245
  }
229
246
  if (firstInconsistent) {
230
- const where = modelUriToRelativePath(firstInconsistent.file.modelUri)
231
- || firstInconsistent.file.ontologyIri.trim()
232
- || '<unknown>';
247
+ const where = firstInconsistent.file.path;
233
248
  if (opts.explanation === true) {
234
249
  failCli(chalk.red(`Inconsistency found in: ${where}\n${JSON.stringify(firstInconsistent.result, null, 2)}`));
235
250
  }
236
251
  failCli(chalk.red(`Inconsistency found in: ${where}`));
237
252
  }
238
- if (outputDir) {
239
- console.log(chalk.green(`reason: ${assertions.files.length} ontology file(s) reasoned in ${path.relative(process.cwd(), outputDir) || outputDir} (${entailmentsProduced} entailment artifact file(s) written) [${formatDuration(Date.now() - startedAt)}]`));
253
+ if (persistDir) {
254
+ console.log(chalk.green(`reason: ${exported.files.length} ontology file(s) reasoned in ${path.relative(process.cwd(), persistDir) || persistDir} (${entailmentsProduced} entailment artifact file(s) written) [${formatDuration(Date.now() - startedAt)}]`));
240
255
  return;
241
256
  }
242
- console.log(chalk.green(`reason: ${assertions.files.length} ontology file(s) checked [${formatDuration(Date.now() - startedAt)}]`));
257
+ console.log(chalk.green(`reason: ${exported.files.length} ontology file(s) checked via ${targets.length} import root(s) [${formatDuration(Date.now() - startedAt)}]`));
243
258
  };
244
259
  //# sourceMappingURL=reason.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reason.js","sourceRoot":"","sources":["../../src/commands/reason.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reason.js","sourceRoot":"","sources":["../../src/commands/reason.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oml/cli",
3
3
  "description": "The cli specific package",
4
- "version": "0.19.3",
4
+ "version": "0.20.0",
5
5
  "type": "module",
6
6
  "engines": {
7
7
  "node": ">=20.10.0",
@@ -22,8 +22,8 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@oml/platform": "^0.8.0",
25
- "@oml/reasoner": "^0.3.0",
26
- "@oml/server": "0.19.3",
25
+ "@oml/reasoner": "^0.4.0",
26
+ "@oml/server": "0.20.0",
27
27
  "chalk": "~5.3.0",
28
28
  "chevrotain": "11.1.2",
29
29
  "commander": "~11.1.0",
package/src/cli.ts CHANGED
@@ -168,16 +168,15 @@ export async function runCli(argv: string[] = process.argv): Promise<void> {
168
168
  try {
169
169
  const authToken = resolveServerRequestToken();
170
170
  const cliOpts = args[0] as Record<string, unknown> | undefined ?? {};
171
- const wsSettings = await readWorkspaceSettings(process.cwd());
172
- const md = cliOpts['md'] ?? wsSettings.defaults?.render?.md;
173
- const web = cliOpts['web'] ?? wsSettings.defaults?.render?.web;
171
+ const md = cliOpts['md'];
172
+ const web = cliOpts['web'];
174
173
  if (!md) {
175
- throw new CliExitError('Missing required option: -m, --md <input-folder>. Provide it on the command line or set defaults.render.md in .oml/settings.yml.');
174
+ throw new CliExitError('Missing required option: -m, --md <input-folder>. Provide it on the command line or set defaults.render in .oml/settings.yml.');
176
175
  }
177
176
  if (!web) {
178
- throw new CliExitError('Missing required option: -b, --web <output-folder>. Provide it on the command line or set defaults.render.web in .oml/settings.yml.');
177
+ throw new CliExitError('Missing required option: -b, --web <output-folder>. Provide it on the command line or set defaults.render in .oml/settings.yml.');
179
178
  }
180
- const context = cliOpts['context'] ?? wsSettings.defaults?.render?.context;
179
+ const context = cliOpts['context'];
181
180
  await renderAction({ md, web, context, authToken } as Parameters<typeof renderAction>[0]);
182
181
  done();
183
182
  } catch (err) {
@@ -197,10 +196,9 @@ export async function runCli(argv: string[] = process.argv): Promise<void> {
197
196
  try {
198
197
  const authToken = resolveServerRequestToken();
199
198
  const cliOpts = args[0] as Record<string, unknown> | undefined ?? {};
200
- const wsSettings = await readWorkspaceSettings(process.cwd());
201
- const owl = cliOpts['owl'] ?? wsSettings.defaults?.build?.owl;
199
+ const owl = cliOpts['owl'];
202
200
  if (!owl) {
203
- throw new CliExitError('Missing required option: -o, --owl <dir>. Provide it on the command line or set defaults.build.owl in .oml/settings.yml.');
201
+ throw new CliExitError('Missing required option: -o, --owl <dir>. Provide it on the command line or set defaults.export in .oml/settings.yml.');
204
202
  }
205
203
  await exportAction({
206
204
  ...cliOpts,
@@ -236,22 +234,28 @@ export async function runCli(argv: string[] = process.argv): Promise<void> {
236
234
 
237
235
  program
238
236
  .command('reason')
239
- .option('-o, --owl <dir>', 'persist assertions/entailments to folder (default: check-only with no persistence)')
237
+ .option('-o, --owl [dir]', 'persist assertions/entailments to folder; pass -o without a value to use build/owl (omit entirely for a fast check-only run)')
240
238
  .option('-f, --format <ext>', 'RDF format extension: ttl, trig, nt, nq, or n3', 'ttl')
241
239
  .option('--pretty', 'pretty-print Turtle/TriG output with blank lines between top-level blocks (only when --owl is provided)')
242
240
  .option('-u, --unique-names-assumption [value]', 'enable or disable the unique names assumption', parseBooleanOption, true)
243
241
  .option('-e, --explanation [value]', 'enable or disable inconsistency explanations', parseBooleanOption, false)
244
- .description('run workspace consistency checks (or persist entailments with --owl)')
242
+ .option('-t, --hoist', 'store each entailment once in the lowest importing graph (entailment graphs import their imports\' entailment graphs); shrinks output but each file requires its import closure to be loaded (only with --owl)')
243
+ .description('run workspace consistency checks (fast check-only by default; persist entailments with --owl)')
245
244
  .action(async (opts) => {
246
245
  const done = trackCommand('oml-reason');
247
246
  try {
248
247
  const { reasonAction } = await import('./commands/reason.js');
249
248
  const authToken = resolveServerRequestToken();
250
249
  const cliOpts = opts as Record<string, unknown>;
251
- const wsSettings = await readWorkspaceSettings(process.cwd());
252
- const owl = cliOpts['owl'] ?? wsSettings.defaults?.build?.owl;
253
- if (!owl) {
254
- throw new CliExitError('Missing required option: -o, --owl <dir>. Provide it on the command line or set defaults.build.owl in .oml/settings.yml.');
250
+ const owlOpt = cliOpts['owl'];
251
+ // No -o flag => fast check-only (reasons only import-graph roots).
252
+ // -o without a value => persist to build/owl.
253
+ // -o <dir> => persist to <dir>.
254
+ let owl: string | undefined;
255
+ if (owlOpt === true) {
256
+ owl = 'build/owl';
257
+ } else if (typeof owlOpt === 'string' && owlOpt.trim().length > 0) {
258
+ owl = owlOpt;
255
259
  }
256
260
  await reasonAction({ ...cliOpts, owl, authToken } as Parameters<typeof reasonAction>[0]);
257
261
  done();
@@ -297,10 +301,47 @@ export async function runCli(argv: string[] = process.argv): Promise<void> {
297
301
  await assertServerRunning();
298
302
  });
299
303
 
300
- await program.parseAsync(argv);
304
+ await program.parseAsync(await applyWorkspaceDefaults(argv));
301
305
  await updateCheck;
302
306
  }
303
307
 
308
+ /** Commands whose `defaults.<command>` param line is applied before command-line arguments. */
309
+ const DEFAULTABLE_COMMANDS = new Set(['lint', 'render', 'export', 'codegen', 'reason', 'validate']);
310
+
311
+ /**
312
+ * Inject `defaults.<command>` from .oml/settings.yml as argv tokens placed right after the
313
+ * subcommand name (before the user's arguments). Commander resolves a repeated option to its
314
+ * last occurrence, so any option the user passes on the command line overrides the same option
315
+ * from the defaults line while the remaining defaults still apply.
316
+ */
317
+ async function applyWorkspaceDefaults(argv: string[]): Promise<string[]> {
318
+ const commandIndex = argv.findIndex((token, i) => i >= 2 && DEFAULTABLE_COMMANDS.has(token));
319
+ if (commandIndex === -1) {
320
+ return argv;
321
+ }
322
+ const settings = await readWorkspaceSettings(process.cwd());
323
+ const line = settings.defaults?.[argv[commandIndex]];
324
+ if (typeof line !== 'string' || line.trim().length === 0) {
325
+ return argv;
326
+ }
327
+ const tokens = tokenizeParams(line);
328
+ if (tokens.length === 0) {
329
+ return argv;
330
+ }
331
+ return [...argv.slice(0, commandIndex + 1), ...tokens, ...argv.slice(commandIndex + 1)];
332
+ }
333
+
334
+ /** Split a default param line into argv tokens, honoring single/double quotes around values. */
335
+ function tokenizeParams(line: string): string[] {
336
+ const tokens: string[] = [];
337
+ const pattern = /"([^"]*)"|'([^']*)'|(\S+)/g;
338
+ let match: RegExpExecArray | null;
339
+ while ((match = pattern.exec(line)) !== null) {
340
+ tokens.push(match[1] ?? match[2] ?? match[3]);
341
+ }
342
+ return tokens;
343
+ }
344
+
304
345
  function assertNoMalformedShortFlags(argv: string[]): void {
305
346
  // Enforce explicit short-flag syntax (`-m value`) and long flags (`--md`).
306
347
  // This prevents accidental typos like `-md`, which Commander interprets as `-m d`.