@illumiarq/lumis 1.2.9 → 1.2.11
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/dist/bridges/project-bridge.d.ts +2 -0
- package/dist/bridges/project-bridge.d.ts.map +1 -0
- package/dist/bridges/project-bridge.js +174 -0
- package/dist/bridges/project-bridge.js.map +1 -0
- package/dist/cli.d.ts +1 -16
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +538 -170
- package/dist/cli.js.map +1 -1
- package/dist/commands/app/cache-workflows.d.ts +7 -0
- package/dist/commands/app/cache-workflows.d.ts.map +1 -0
- package/dist/commands/app/cache-workflows.js +139 -0
- package/dist/commands/app/cache-workflows.js.map +1 -0
- package/dist/commands/app/command-runtime.d.ts +11 -0
- package/dist/commands/app/command-runtime.d.ts.map +1 -0
- package/dist/commands/app/command-runtime.js +41 -0
- package/dist/commands/app/command-runtime.js.map +1 -0
- package/dist/commands/app/config-cache.d.ts +3 -0
- package/dist/commands/app/config-cache.d.ts.map +1 -0
- package/dist/commands/app/config-cache.js +75 -0
- package/dist/commands/app/config-cache.js.map +1 -0
- package/dist/commands/app/config-publish.d.ts +2 -0
- package/dist/commands/app/config-publish.d.ts.map +1 -0
- package/dist/commands/app/config-publish.js +68 -0
- package/dist/commands/app/config-publish.js.map +1 -0
- package/dist/commands/app/config-stubs.d.ts +3 -0
- package/dist/commands/app/config-stubs.d.ts.map +1 -0
- package/dist/commands/app/config-stubs.js +154 -0
- package/dist/commands/app/config-stubs.js.map +1 -0
- package/dist/commands/app/database.d.ts +3 -0
- package/dist/commands/app/database.d.ts.map +1 -0
- package/dist/commands/app/database.js +221 -0
- package/dist/commands/app/database.js.map +1 -0
- package/dist/commands/app/docs.d.ts +7 -0
- package/dist/commands/app/docs.d.ts.map +1 -0
- package/dist/commands/app/docs.js +61 -0
- package/dist/commands/app/docs.js.map +1 -0
- package/dist/commands/app/routes.d.ts +5 -0
- package/dist/commands/app/routes.d.ts.map +1 -0
- package/dist/commands/app/routes.js +95 -0
- package/dist/commands/app/routes.js.map +1 -0
- package/dist/commands/app/security.d.ts +3 -0
- package/dist/commands/app/security.d.ts.map +1 -0
- package/dist/commands/app/security.js +15 -0
- package/dist/commands/app/security.js.map +1 -0
- package/dist/commands/app/worker-schedule.d.ts +5 -0
- package/dist/commands/app/worker-schedule.d.ts.map +1 -0
- package/dist/commands/app/worker-schedule.js +94 -0
- package/dist/commands/app/worker-schedule.js.map +1 -0
- package/dist/commands/app-commands.d.ts +19 -0
- package/dist/commands/app-commands.d.ts.map +1 -0
- package/dist/commands/app-commands.js +77 -0
- package/dist/commands/app-commands.js.map +1 -0
- package/dist/commands/build-vercel-fn.d.ts +9 -0
- package/dist/commands/build-vercel-fn.d.ts.map +1 -0
- package/dist/commands/build-vercel-fn.js +32 -0
- package/dist/commands/build-vercel-fn.js.map +1 -0
- package/dist/commands/build.d.ts +14 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +24 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/info.d.ts +9 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +41 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +60 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/maintenance.d.ts +9 -0
- package/dist/commands/maintenance.d.ts.map +1 -0
- package/dist/commands/maintenance.js +38 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/module-list.d.ts +2 -0
- package/dist/commands/module-list.d.ts.map +1 -0
- package/dist/commands/module-list.js +27 -0
- package/dist/commands/module-list.js.map +1 -0
- package/dist/commands/preview.d.ts +14 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +49 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/serve.d.ts +16 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +61 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/{output/ansi.d.ts → console.d.ts} +8 -4
- package/dist/console.d.ts.map +1 -0
- package/dist/{output/ansi.js → console.js} +12 -4
- package/dist/console.js.map +1 -0
- package/dist/index.d.ts +15 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +26 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +83 -0
- package/dist/paths.js.map +1 -0
- package/dist/server-wrapper.d.ts +12 -0
- package/dist/server-wrapper.d.ts.map +1 -0
- package/dist/server-wrapper.js +63 -0
- package/dist/server-wrapper.js.map +1 -0
- package/dist/vercel-wrapper.d.ts +6 -0
- package/dist/vercel-wrapper.d.ts.map +1 -0
- package/dist/vercel-wrapper.js +50 -0
- package/dist/vercel-wrapper.js.map +1 -0
- package/package.json +19 -37
- package/README.md +0 -38
- package/dist/adapter-loader.d.ts +0 -67
- package/dist/adapter-loader.d.ts.map +0 -1
- package/dist/adapter-loader.js +0 -273
- package/dist/adapter-loader.js.map +0 -1
- package/dist/commands/commands.command.d.ts +0 -38
- package/dist/commands/commands.command.d.ts.map +0 -1
- package/dist/commands/commands.command.js +0 -176
- package/dist/commands/commands.command.js.map +0 -1
- package/dist/commands/doctor.command.d.ts +0 -9
- package/dist/commands/doctor.command.d.ts.map +0 -1
- package/dist/commands/doctor.command.js +0 -640
- package/dist/commands/doctor.command.js.map +0 -1
- package/dist/commands/init.command.d.ts +0 -9
- package/dist/commands/init.command.d.ts.map +0 -1
- package/dist/commands/init.command.js +0 -121
- package/dist/commands/init.command.js.map +0 -1
- package/dist/commands/intent.command.d.ts +0 -26
- package/dist/commands/intent.command.d.ts.map +0 -1
- package/dist/commands/intent.command.js +0 -211
- package/dist/commands/intent.command.js.map +0 -1
- package/dist/commands/ir-rebuild.command.d.ts +0 -9
- package/dist/commands/ir-rebuild.command.d.ts.map +0 -1
- package/dist/commands/ir-rebuild.command.js +0 -36
- package/dist/commands/ir-rebuild.command.js.map +0 -1
- package/dist/commands/ir-show.command.d.ts +0 -9
- package/dist/commands/ir-show.command.d.ts.map +0 -1
- package/dist/commands/ir-show.command.js +0 -32
- package/dist/commands/ir-show.command.js.map +0 -1
- package/dist/commands/make.command.d.ts +0 -9
- package/dist/commands/make.command.d.ts.map +0 -1
- package/dist/commands/make.command.js +0 -93
- package/dist/commands/make.command.js.map +0 -1
- package/dist/commands/pack.command.d.ts +0 -16
- package/dist/commands/pack.command.d.ts.map +0 -1
- package/dist/commands/pack.command.js +0 -44
- package/dist/commands/pack.command.js.map +0 -1
- package/dist/commands/runtime.command.d.ts +0 -6
- package/dist/commands/runtime.command.d.ts.map +0 -1
- package/dist/commands/runtime.command.js +0 -379
- package/dist/commands/runtime.command.js.map +0 -1
- package/dist/commands/runtime.d.ts +0 -45
- package/dist/commands/runtime.d.ts.map +0 -1
- package/dist/commands/runtime.js +0 -66
- package/dist/commands/runtime.js.map +0 -1
- package/dist/commands/tinker-agent-plan.d.ts +0 -26
- package/dist/commands/tinker-agent-plan.d.ts.map +0 -1
- package/dist/commands/tinker-agent-plan.js +0 -115
- package/dist/commands/tinker-agent-plan.js.map +0 -1
- package/dist/commands/tinker-chat-commands.d.ts +0 -19
- package/dist/commands/tinker-chat-commands.d.ts.map +0 -1
- package/dist/commands/tinker-chat-commands.js +0 -263
- package/dist/commands/tinker-chat-commands.js.map +0 -1
- package/dist/commands/tinker-chat-runtime.d.ts +0 -30
- package/dist/commands/tinker-chat-runtime.d.ts.map +0 -1
- package/dist/commands/tinker-chat-runtime.js +0 -227
- package/dist/commands/tinker-chat-runtime.js.map +0 -1
- package/dist/commands/tinker-classic-mode.d.ts +0 -15
- package/dist/commands/tinker-classic-mode.d.ts.map +0 -1
- package/dist/commands/tinker-classic-mode.js +0 -160
- package/dist/commands/tinker-classic-mode.js.map +0 -1
- package/dist/commands/tinker-eval.command.d.ts +0 -3
- package/dist/commands/tinker-eval.command.d.ts.map +0 -1
- package/dist/commands/tinker-eval.command.js +0 -151
- package/dist/commands/tinker-eval.command.js.map +0 -1
- package/dist/commands/tinker-repl-display.d.ts +0 -15
- package/dist/commands/tinker-repl-display.d.ts.map +0 -1
- package/dist/commands/tinker-repl-display.js +0 -147
- package/dist/commands/tinker-repl-display.js.map +0 -1
- package/dist/commands/tinker-session-runtime.d.ts +0 -27
- package/dist/commands/tinker-session-runtime.d.ts.map +0 -1
- package/dist/commands/tinker-session-runtime.js +0 -196
- package/dist/commands/tinker-session-runtime.js.map +0 -1
- package/dist/commands/tinker.command.d.ts +0 -9
- package/dist/commands/tinker.command.d.ts.map +0 -1
- package/dist/commands/tinker.command.js +0 -142
- package/dist/commands/tinker.command.js.map +0 -1
- package/dist/commands/use.command.d.ts +0 -10
- package/dist/commands/use.command.d.ts.map +0 -1
- package/dist/commands/use.command.js +0 -69
- package/dist/commands/use.command.js.map +0 -1
- package/dist/config-loader.d.ts +0 -68
- package/dist/config-loader.d.ts.map +0 -1
- package/dist/config-loader.js +0 -81
- package/dist/config-loader.js.map +0 -1
- package/dist/launcher.d.ts +0 -16
- package/dist/launcher.d.ts.map +0 -1
- package/dist/launcher.js +0 -301
- package/dist/launcher.js.map +0 -1
- package/dist/lib/file-scanner.d.ts +0 -8
- package/dist/lib/file-scanner.d.ts.map +0 -1
- package/dist/lib/file-scanner.js +0 -70
- package/dist/lib/file-scanner.js.map +0 -1
- package/dist/lib/tinker-memory.d.ts +0 -19
- package/dist/lib/tinker-memory.d.ts.map +0 -1
- package/dist/lib/tinker-memory.js +0 -107
- package/dist/lib/tinker-memory.js.map +0 -1
- package/dist/lib/tinker-observer.d.ts +0 -47
- package/dist/lib/tinker-observer.d.ts.map +0 -1
- package/dist/lib/tinker-observer.js +0 -77
- package/dist/lib/tinker-observer.js.map +0 -1
- package/dist/lib/tinker-policy.d.ts +0 -21
- package/dist/lib/tinker-policy.d.ts.map +0 -1
- package/dist/lib/tinker-policy.js +0 -102
- package/dist/lib/tinker-policy.js.map +0 -1
- package/dist/lib/tinker-replay.d.ts +0 -51
- package/dist/lib/tinker-replay.d.ts.map +0 -1
- package/dist/lib/tinker-replay.js +0 -123
- package/dist/lib/tinker-replay.js.map +0 -1
- package/dist/output/ansi.d.ts.map +0 -1
- package/dist/output/ansi.js.map +0 -1
- package/dist/output/plan-display.d.ts +0 -4
- package/dist/output/plan-display.d.ts.map +0 -1
- package/dist/output/plan-display.js +0 -49
- package/dist/output/plan-display.js.map +0 -1
- package/dist/output/result-display.d.ts +0 -5
- package/dist/output/result-display.d.ts.map +0 -1
- package/dist/output/result-display.js +0 -17
- package/dist/output/result-display.js.map +0 -1
- package/dist/plugins/tinker-plugin.d.ts +0 -86
- package/dist/plugins/tinker-plugin.d.ts.map +0 -1
- package/dist/plugins/tinker-plugin.js +0 -42
- package/dist/plugins/tinker-plugin.js.map +0 -1
- package/dist/router-preferences.d.ts +0 -5
- package/dist/router-preferences.d.ts.map +0 -1
- package/dist/router-preferences.js +0 -22
- package/dist/router-preferences.js.map +0 -1
- package/dist/runtime/executor.d.ts +0 -33
- package/dist/runtime/executor.d.ts.map +0 -1
- package/dist/runtime/executor.js +0 -180
- package/dist/runtime/executor.js.map +0 -1
- package/dist/runtime/orchestration.d.ts +0 -43
- package/dist/runtime/orchestration.d.ts.map +0 -1
- package/dist/runtime/orchestration.js +0 -209
- package/dist/runtime/orchestration.js.map +0 -1
- package/dist/runtime/policy.d.ts +0 -23
- package/dist/runtime/policy.d.ts.map +0 -1
- package/dist/runtime/policy.js +0 -43
- package/dist/runtime/policy.js.map +0 -1
- package/dist/runtime/profiles.d.ts +0 -15
- package/dist/runtime/profiles.d.ts.map +0 -1
- package/dist/runtime/profiles.js +0 -131
- package/dist/runtime/profiles.js.map +0 -1
- package/dist/runtime/transcripts.d.ts +0 -59
- package/dist/runtime/transcripts.d.ts.map +0 -1
- package/dist/runtime/transcripts.js +0 -172
- package/dist/runtime/transcripts.js.map +0 -1
- package/dist/tools/git-diff.d.ts +0 -3
- package/dist/tools/git-diff.d.ts.map +0 -1
- package/dist/tools/git-diff.js +0 -16
- package/dist/tools/git-diff.js.map +0 -1
- package/dist/tools/index.d.ts +0 -24
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -88
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/lint.d.ts +0 -3
- package/dist/tools/lint.d.ts.map +0 -1
- package/dist/tools/lint.js +0 -35
- package/dist/tools/lint.js.map +0 -1
- package/dist/tools/read-file.d.ts +0 -3
- package/dist/tools/read-file.d.ts.map +0 -1
- package/dist/tools/read-file.js +0 -47
- package/dist/tools/read-file.js.map +0 -1
- package/dist/tools/run-command.d.ts +0 -3
- package/dist/tools/run-command.d.ts.map +0 -1
- package/dist/tools/run-command.js +0 -71
- package/dist/tools/run-command.js.map +0 -1
- package/dist/tools/run-tests.d.ts +0 -3
- package/dist/tools/run-tests.d.ts.map +0 -1
- package/dist/tools/run-tests.js +0 -49
- package/dist/tools/run-tests.js.map +0 -1
- package/dist/tools/tool-dispatch.d.ts +0 -32
- package/dist/tools/tool-dispatch.d.ts.map +0 -1
- package/dist/tools/tool-dispatch.js +0 -120
- package/dist/tools/tool-dispatch.js.map +0 -1
- package/dist/tools/typecheck.d.ts +0 -3
- package/dist/tools/typecheck.d.ts.map +0 -1
- package/dist/tools/typecheck.js +0 -48
- package/dist/tools/typecheck.js.map +0 -1
- package/dist/tools/types.d.ts +0 -62
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -7
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/write-file.d.ts +0 -15
- package/dist/tools/write-file.d.ts.map +0 -1
- package/dist/tools/write-file.js +0 -52
- package/dist/tools/write-file.js.map +0 -1
- package/dist/tracing/types.d.ts +0 -10
- package/dist/tracing/types.d.ts.map +0 -1
- package/dist/tracing/types.js +0 -2
- package/dist/tracing/types.js.map +0 -1
|
@@ -1,640 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project diagnostics command.
|
|
3
|
-
*
|
|
4
|
-
* This command verifies core runtime readiness for Lumis by checking config,
|
|
5
|
-
* pack/adapter detection, command inventory availability, and persisted IR state.
|
|
6
|
-
*/
|
|
7
|
-
import fs from 'node:fs';
|
|
8
|
-
import path from 'node:path';
|
|
9
|
-
import { diffIR, loadIR } from '@lumiarq/context';
|
|
10
|
-
import { createPlanWithAdapter } from '@lumiarq/planner';
|
|
11
|
-
import { collectNormalizedCommands } from './commands.command.js';
|
|
12
|
-
import { parseRawIntent } from './intent.command.js';
|
|
13
|
-
import { resolveRuntimePolicy } from '../runtime/policy.js';
|
|
14
|
-
import { validateRuntimeProfileStore } from '../runtime/profiles.js';
|
|
15
|
-
import { loadRuntimeTranscriptIndex, summarizeRuntimeTranscripts } from '../runtime/transcripts.js';
|
|
16
|
-
/**
|
|
17
|
-
* Parse doctor command options.
|
|
18
|
-
*
|
|
19
|
-
* Supported flags:
|
|
20
|
-
* - --intent <raw intent text>
|
|
21
|
-
* - --intent-file <path to file with one intent per line>
|
|
22
|
-
* - --strict-intent-conflicts (fail command when conflicts are found)
|
|
23
|
-
*
|
|
24
|
-
* @param commandArgs - Raw doctor command arguments.
|
|
25
|
-
* @param projectRoot - Project root used to resolve relative intent-file paths.
|
|
26
|
-
* @returns Parsed doctor options.
|
|
27
|
-
*/
|
|
28
|
-
function parseDoctorOptions(commandArgs, projectRoot) {
|
|
29
|
-
const intentTexts = [];
|
|
30
|
-
let strictIntentConflicts = false;
|
|
31
|
-
let index = 0;
|
|
32
|
-
while (index < commandArgs.length) {
|
|
33
|
-
const token = commandArgs[index];
|
|
34
|
-
if (token === '--strict-intent-conflicts') {
|
|
35
|
-
strictIntentConflicts = true;
|
|
36
|
-
index += 1;
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
if (token === '--intent') {
|
|
40
|
-
index += 1;
|
|
41
|
-
const parts = [];
|
|
42
|
-
while (index < commandArgs.length && !commandArgs[index]?.startsWith('--')) {
|
|
43
|
-
const part = commandArgs[index];
|
|
44
|
-
if (part) {
|
|
45
|
-
parts.push(part);
|
|
46
|
-
}
|
|
47
|
-
index += 1;
|
|
48
|
-
}
|
|
49
|
-
const intent = parts.join(' ').trim();
|
|
50
|
-
if (intent) {
|
|
51
|
-
intentTexts.push(intent);
|
|
52
|
-
}
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
if (token === '--intent-file') {
|
|
56
|
-
const rawPath = commandArgs[index + 1];
|
|
57
|
-
if (!rawPath) {
|
|
58
|
-
index += 1;
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
const resolvedPath = path.isAbsolute(rawPath) ? rawPath : path.join(projectRoot, rawPath);
|
|
62
|
-
if (fs.existsSync(resolvedPath)) {
|
|
63
|
-
const fileIntents = fs
|
|
64
|
-
.readFileSync(resolvedPath, 'utf8')
|
|
65
|
-
.split(/\r?\n/g)
|
|
66
|
-
.map((line) => line.trim())
|
|
67
|
-
.filter((line) => line.length > 0 && !line.startsWith('#'));
|
|
68
|
-
intentTexts.push(...fileIntents);
|
|
69
|
-
}
|
|
70
|
-
index += 2;
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
index += 1;
|
|
74
|
-
}
|
|
75
|
-
return { intentTexts, strictIntentConflicts };
|
|
76
|
-
}
|
|
77
|
-
function normalizeTargetFile(targetFile) {
|
|
78
|
-
return path.resolve(targetFile).replaceAll('\\', '/');
|
|
79
|
-
}
|
|
80
|
-
function hasSensitiveInlineEnv(env) {
|
|
81
|
-
if (!env || typeof env !== 'object') {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
for (const [key, value] of Object.entries(env)) {
|
|
85
|
-
if (!/token|secret|password|key/i.test(key)) {
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
if (typeof value === 'string' && value.trim().length > 0) {
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Identify deterministic conflicts across multiple planned intents.
|
|
96
|
-
*
|
|
97
|
-
* @param plannedIntents - Planned intent summaries including write targets.
|
|
98
|
-
* @returns List of target-level conflicts.
|
|
99
|
-
*/
|
|
100
|
-
function detectIntentConflicts(plannedIntents) {
|
|
101
|
-
const byTarget = new Map();
|
|
102
|
-
for (const planned of plannedIntents) {
|
|
103
|
-
for (const step of planned.stepSummaries) {
|
|
104
|
-
const normalizedTarget = normalizeTargetFile(step.targetFile);
|
|
105
|
-
const bucket = byTarget.get(normalizedTarget) ?? [];
|
|
106
|
-
bucket.push({ operation: step.operation, raw: planned.raw });
|
|
107
|
-
byTarget.set(normalizedTarget, bucket);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
const conflicts = [];
|
|
111
|
-
for (const [targetFile, writes] of byTarget.entries()) {
|
|
112
|
-
if (writes.length <= 1) {
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
const operations = Array.from(new Set(writes.map((write) => write.operation))).sort();
|
|
116
|
-
const intents = Array.from(new Set(writes.map((write) => write.raw)));
|
|
117
|
-
const hasDelete = operations.includes('delete');
|
|
118
|
-
const hasCreate = operations.includes('create');
|
|
119
|
-
const mixedOperations = operations.length > 1;
|
|
120
|
-
if (hasDelete && operations.some((operation) => operation !== 'delete')) {
|
|
121
|
-
conflicts.push({
|
|
122
|
-
targetFile,
|
|
123
|
-
operations,
|
|
124
|
-
intents,
|
|
125
|
-
reason: 'delete overlaps with non-delete operations on the same target',
|
|
126
|
-
});
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
if (hasCreate && writes.length > 1) {
|
|
130
|
-
conflicts.push({
|
|
131
|
-
targetFile,
|
|
132
|
-
operations,
|
|
133
|
-
intents,
|
|
134
|
-
reason: 'multiple steps attempt to create the same target',
|
|
135
|
-
});
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
if (mixedOperations) {
|
|
139
|
-
conflicts.push({
|
|
140
|
-
targetFile,
|
|
141
|
-
operations,
|
|
142
|
-
intents,
|
|
143
|
-
reason: 'mixed operations target the same file',
|
|
144
|
-
});
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
if (operations[0] === 'append' || operations[0] === 'update') {
|
|
148
|
-
conflicts.push({
|
|
149
|
-
targetFile,
|
|
150
|
-
operations,
|
|
151
|
-
intents,
|
|
152
|
-
reason: 'multiple write operations target the same file',
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return conflicts;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Render one diagnostic line in a stable format.
|
|
160
|
-
*
|
|
161
|
-
* @param result - Single diagnostic result row.
|
|
162
|
-
* @returns Formatted diagnostic line.
|
|
163
|
-
*/
|
|
164
|
-
function formatCheck(result) {
|
|
165
|
-
return `[${result.status.toUpperCase()}][${result.severity.toUpperCase()}] ${result.name}: ${result.detail}`;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Non-blocking Vercel deploy hygiene checks when vercel.json is present at project root.
|
|
169
|
-
*/
|
|
170
|
-
function appendVercelDeploymentChecks(projectRoot, checks) {
|
|
171
|
-
const vercelPath = path.join(projectRoot, 'vercel.json');
|
|
172
|
-
if (!fs.existsSync(vercelPath)) {
|
|
173
|
-
checks.push({
|
|
174
|
-
name: 'vercel-config',
|
|
175
|
-
status: 'pass',
|
|
176
|
-
severity: 'info',
|
|
177
|
-
detail: 'no vercel.json in project root',
|
|
178
|
-
});
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
let parsed;
|
|
182
|
-
try {
|
|
183
|
-
parsed = JSON.parse(fs.readFileSync(vercelPath, 'utf8'));
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
checks.push({
|
|
187
|
-
name: 'vercel-config',
|
|
188
|
-
status: 'warn',
|
|
189
|
-
severity: 'warning',
|
|
190
|
-
detail: 'vercel.json exists but is not valid JSON',
|
|
191
|
-
suggestion: 'Fix JSON syntax in vercel.json.',
|
|
192
|
-
});
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
if (!parsed || typeof parsed !== 'object') {
|
|
196
|
-
checks.push({
|
|
197
|
-
name: 'vercel-config',
|
|
198
|
-
status: 'warn',
|
|
199
|
-
severity: 'warning',
|
|
200
|
-
detail: 'vercel.json is not a JSON object',
|
|
201
|
-
});
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
const cfg = parsed;
|
|
205
|
-
const routes = cfg.routes;
|
|
206
|
-
const usesFilesystemHandle = Array.isArray(routes) &&
|
|
207
|
-
routes.some((entry) => {
|
|
208
|
-
if (!entry || typeof entry !== 'object') {
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
return entry.handle === 'filesystem';
|
|
212
|
-
});
|
|
213
|
-
const rewrites = cfg.rewrites;
|
|
214
|
-
const hasRewrites = Array.isArray(rewrites) && rewrites.length > 0;
|
|
215
|
-
if (usesFilesystemHandle) {
|
|
216
|
-
checks.push({
|
|
217
|
-
name: 'vercel-routing',
|
|
218
|
-
status: 'warn',
|
|
219
|
-
severity: 'warning',
|
|
220
|
-
detail: 'vercel.json uses deprecated routes with handle: filesystem; prefer rewrites for current Vercel routing',
|
|
221
|
-
suggestion: 'Replace routes with rewrites so static files resolve first and dynamic traffic hits api/index.',
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
else if (hasRewrites) {
|
|
225
|
-
checks.push({
|
|
226
|
-
name: 'vercel-routing',
|
|
227
|
-
status: 'pass',
|
|
228
|
-
severity: 'info',
|
|
229
|
-
detail: 'vercel.json uses rewrites for catch-all routing',
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
checks.push({
|
|
234
|
-
name: 'vercel-routing',
|
|
235
|
-
status: 'pass',
|
|
236
|
-
severity: 'info',
|
|
237
|
-
detail: 'vercel.json has no rewrites array (fine when not using a serverless catch-all)',
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
const installCommand = typeof cfg.installCommand === 'string' && cfg.installCommand.trim().length > 0
|
|
241
|
-
? cfg.installCommand.trim()
|
|
242
|
-
: '';
|
|
243
|
-
checks.push(installCommand
|
|
244
|
-
? {
|
|
245
|
-
name: 'vercel-install-command',
|
|
246
|
-
status: 'pass',
|
|
247
|
-
severity: 'info',
|
|
248
|
-
detail: `installCommand is set (${installCommand})`,
|
|
249
|
-
}
|
|
250
|
-
: {
|
|
251
|
-
name: 'vercel-install-command',
|
|
252
|
-
status: 'warn',
|
|
253
|
-
severity: 'warning',
|
|
254
|
-
detail: 'vercel.json has no installCommand; Vercel may default to npm install',
|
|
255
|
-
suggestion: 'Set installCommand to pnpm install --frozen-lockfile when using pnpm.',
|
|
256
|
-
});
|
|
257
|
-
const pkgPath = path.join(projectRoot, 'package.json');
|
|
258
|
-
let packageManager = '';
|
|
259
|
-
if (fs.existsSync(pkgPath)) {
|
|
260
|
-
try {
|
|
261
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
262
|
-
packageManager = typeof pkg.packageManager === 'string' ? pkg.packageManager : '';
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
// ignore malformed package.json here; other tooling will surface it
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
checks.push(packageManager
|
|
269
|
-
? {
|
|
270
|
-
name: 'package-manager-field',
|
|
271
|
-
status: 'pass',
|
|
272
|
-
severity: 'info',
|
|
273
|
-
detail: `package.json declares packageManager=${packageManager}`,
|
|
274
|
-
}
|
|
275
|
-
: {
|
|
276
|
-
name: 'package-manager-field',
|
|
277
|
-
status: 'warn',
|
|
278
|
-
severity: 'warning',
|
|
279
|
-
detail: 'package.json has no packageManager field; Vercel may pick a different pnpm than local',
|
|
280
|
-
suggestion: 'Add "packageManager": "pnpm@x.y.z" to package.json to pin pnpm via Corepack.',
|
|
281
|
-
});
|
|
282
|
-
const apiBundle = path.join(projectRoot, 'api', 'index.js');
|
|
283
|
-
checks.push(fs.existsSync(apiBundle)
|
|
284
|
-
? {
|
|
285
|
-
name: 'vercel-api-bundle',
|
|
286
|
-
status: 'pass',
|
|
287
|
-
severity: 'info',
|
|
288
|
-
detail: 'api/index.js exists (Vercel serverless entry present)',
|
|
289
|
-
}
|
|
290
|
-
: {
|
|
291
|
-
name: 'vercel-api-bundle',
|
|
292
|
-
status: 'pass',
|
|
293
|
-
severity: 'info',
|
|
294
|
-
detail: 'api/index.js not found yet; run pnpm run build:vercel before deploy to confirm output',
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Run diagnostic checks for host readiness and print a summary.
|
|
299
|
-
*
|
|
300
|
-
* @param context - Shared command runtime context.
|
|
301
|
-
* @returns Exit code 0 when no failing checks exist, otherwise 1.
|
|
302
|
-
*/
|
|
303
|
-
export async function executeDoctorCommand(context) {
|
|
304
|
-
const options = parseDoctorOptions(context.commandArgs, context.projectRoot);
|
|
305
|
-
const isCI = process.env.CI === 'true';
|
|
306
|
-
const checks = [];
|
|
307
|
-
checks.push({
|
|
308
|
-
name: 'config',
|
|
309
|
-
status: 'pass',
|
|
310
|
-
severity: 'info',
|
|
311
|
-
detail: context.config.adapter
|
|
312
|
-
? `configured adapter preference = ${context.config.adapter}`
|
|
313
|
-
: 'no configured adapter preference',
|
|
314
|
-
});
|
|
315
|
-
const pack = await context.resolvePack();
|
|
316
|
-
const packFramework = pack?.manifest.frameworks?.[0] ?? 'unknown';
|
|
317
|
-
checks.push(pack
|
|
318
|
-
? {
|
|
319
|
-
name: 'pack-detection',
|
|
320
|
-
status: 'pass',
|
|
321
|
-
severity: 'info',
|
|
322
|
-
detail: `${pack.manifest.name} (${packFramework})`,
|
|
323
|
-
}
|
|
324
|
-
: {
|
|
325
|
-
name: 'pack-detection',
|
|
326
|
-
status: 'warn',
|
|
327
|
-
severity: 'critical',
|
|
328
|
-
detail: 'no compatible pack detected for this project root (critical in CI)',
|
|
329
|
-
suggestion: 'Install a supported pack dependency (for example @lumiarq/framework or @lumiarq/pack-nextjs), then run "lumis init" to refresh local config.',
|
|
330
|
-
});
|
|
331
|
-
const adapter = await context.resolveAdapter();
|
|
332
|
-
checks.push(adapter
|
|
333
|
-
? {
|
|
334
|
-
name: 'adapter-resolution',
|
|
335
|
-
status: 'pass',
|
|
336
|
-
severity: 'info',
|
|
337
|
-
detail: adapter.name,
|
|
338
|
-
}
|
|
339
|
-
: {
|
|
340
|
-
name: 'adapter-resolution',
|
|
341
|
-
status: 'warn',
|
|
342
|
-
severity: 'critical',
|
|
343
|
-
detail: 'no adapter resolved (critical in CI)',
|
|
344
|
-
suggestion: 'Set "adapter" in .lumis/config.json or add a pack fingerprint dependency, then rerun "lumis doctor".',
|
|
345
|
-
});
|
|
346
|
-
const commands = await collectNormalizedCommands(context);
|
|
347
|
-
checks.push({
|
|
348
|
-
name: 'command-inventory',
|
|
349
|
-
status: commands.length > 0 ? 'pass' : 'warn',
|
|
350
|
-
severity: commands.length > 0 ? 'info' : 'warning',
|
|
351
|
-
detail: `${commands.length} command(s) available from pack/project sources`,
|
|
352
|
-
...(commands.length === 0 && {
|
|
353
|
-
suggestion: 'Define commands in your pack manifest or project command map so Lumis can route intents.',
|
|
354
|
-
}),
|
|
355
|
-
});
|
|
356
|
-
appendVercelDeploymentChecks(context.projectRoot, checks);
|
|
357
|
-
const ir = loadIR(context.projectRoot);
|
|
358
|
-
checks.push(ir
|
|
359
|
-
? {
|
|
360
|
-
name: 'ir-state',
|
|
361
|
-
status: 'pass',
|
|
362
|
-
severity: 'info',
|
|
363
|
-
detail: `framework=${ir.framework}, modules=${ir.modules.length}`,
|
|
364
|
-
}
|
|
365
|
-
: {
|
|
366
|
-
name: 'ir-state',
|
|
367
|
-
status: 'warn',
|
|
368
|
-
severity: 'warning',
|
|
369
|
-
detail: 'no persisted IR found (.lumis/ir.json)',
|
|
370
|
-
suggestion: 'Run "lumis ir rebuild" to create a baseline IR snapshot before generation.',
|
|
371
|
-
});
|
|
372
|
-
const runtimeProfilesPath = path.join(context.projectRoot, '.lumis', 'runtime-profiles.json');
|
|
373
|
-
const runtimePolicy = resolveRuntimePolicy(context.config);
|
|
374
|
-
checks.push({
|
|
375
|
-
name: 'runtime-policy',
|
|
376
|
-
status: 'pass',
|
|
377
|
-
severity: 'info',
|
|
378
|
-
detail: `mode=${runtimePolicy.mode}, requireApprovalForRemote=${runtimePolicy.requireApprovalForRemote}, ` +
|
|
379
|
-
`approvalEnvVar=${runtimePolicy.approvalEnvVar}`,
|
|
380
|
-
});
|
|
381
|
-
if (!fs.existsSync(runtimeProfilesPath)) {
|
|
382
|
-
checks.push({
|
|
383
|
-
name: 'runtime-profiles',
|
|
384
|
-
status: 'pass',
|
|
385
|
-
severity: 'info',
|
|
386
|
-
detail: 'runtime profile store not found; default local profile will be used',
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
else {
|
|
390
|
-
try {
|
|
391
|
-
const rawProfiles = fs.readFileSync(runtimeProfilesPath, 'utf8');
|
|
392
|
-
const parsedProfiles = JSON.parse(rawProfiles);
|
|
393
|
-
const validation = validateRuntimeProfileStore(parsedProfiles);
|
|
394
|
-
if (!validation.ok) {
|
|
395
|
-
checks.push({
|
|
396
|
-
name: 'runtime-profiles',
|
|
397
|
-
status: 'fail',
|
|
398
|
-
severity: 'critical',
|
|
399
|
-
detail: `invalid runtime profile store: ${validation.errors.join('; ')}`,
|
|
400
|
-
suggestion: 'Fix .lumis/runtime-profiles.json to match schema version 1.0 before running runtime orchestration.',
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
checks.push({
|
|
405
|
-
name: 'runtime-profiles',
|
|
406
|
-
status: 'pass',
|
|
407
|
-
severity: 'info',
|
|
408
|
-
detail: `${validation.value.profiles.length} profile(s) configured`,
|
|
409
|
-
});
|
|
410
|
-
const missingDefault = validation.value.defaultProfileId &&
|
|
411
|
-
!validation.value.profiles.some((profile) => profile.id === validation.value.defaultProfileId);
|
|
412
|
-
if (missingDefault) {
|
|
413
|
-
checks.push({
|
|
414
|
-
name: 'runtime-default-profile',
|
|
415
|
-
status: 'fail',
|
|
416
|
-
severity: 'critical',
|
|
417
|
-
detail: `defaultProfileId=${validation.value.defaultProfileId} does not reference an existing profile`,
|
|
418
|
-
suggestion: 'Set defaultProfileId to an existing profile id or remove it to use explicit selection.',
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
checks.push({
|
|
423
|
-
name: 'runtime-default-profile',
|
|
424
|
-
status: 'pass',
|
|
425
|
-
severity: 'info',
|
|
426
|
-
detail: validation.value.defaultProfileId
|
|
427
|
-
? `default profile = ${validation.value.defaultProfileId}`
|
|
428
|
-
: 'no default profile set',
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
const hasInlineSecrets = validation.value.profiles.some((profile) => hasSensitiveInlineEnv(profile.env));
|
|
432
|
-
const hasRemoteProfiles = validation.value.profiles.some((profile) => profile.kind !== 'local');
|
|
433
|
-
if (hasRemoteProfiles && !runtimePolicy.requireApprovalForRemote) {
|
|
434
|
-
checks.push({
|
|
435
|
-
name: 'runtime-policy-approval',
|
|
436
|
-
status: 'warn',
|
|
437
|
-
severity: 'critical',
|
|
438
|
-
detail: 'remote runtime profiles exist but approval gate is disabled',
|
|
439
|
-
suggestion: 'Enable runtime.policy.requireApprovalForRemote or restrict execution to local profile only.',
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
checks.push({
|
|
444
|
-
name: 'runtime-policy-approval',
|
|
445
|
-
status: 'pass',
|
|
446
|
-
severity: 'info',
|
|
447
|
-
detail: hasRemoteProfiles
|
|
448
|
-
? 'remote profile approval gate is enabled'
|
|
449
|
-
: 'no remote profiles configured',
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
checks.push(hasInlineSecrets
|
|
453
|
-
? {
|
|
454
|
-
name: 'runtime-secret-safety',
|
|
455
|
-
status: 'warn',
|
|
456
|
-
severity: 'critical',
|
|
457
|
-
detail: 'runtime profiles contain inline sensitive env values',
|
|
458
|
-
suggestion: 'Move sensitive values to environment variables and reference those variables from secure runtime context only.',
|
|
459
|
-
}
|
|
460
|
-
: {
|
|
461
|
-
name: 'runtime-secret-safety',
|
|
462
|
-
status: 'pass',
|
|
463
|
-
severity: 'info',
|
|
464
|
-
detail: 'no inline sensitive env values detected in runtime profiles',
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
catch (error) {
|
|
469
|
-
checks.push({
|
|
470
|
-
name: 'runtime-profiles',
|
|
471
|
-
status: 'fail',
|
|
472
|
-
severity: 'critical',
|
|
473
|
-
detail: `unable to parse runtime profile store: ${error instanceof Error ? error.message : 'unknown error'}`,
|
|
474
|
-
suggestion: 'Ensure .lumis/runtime-profiles.json is valid JSON.',
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
const runtimeTranscriptsDir = path.join(context.projectRoot, '.lumis', 'transcripts');
|
|
479
|
-
if (!fs.existsSync(runtimeTranscriptsDir)) {
|
|
480
|
-
checks.push({
|
|
481
|
-
name: 'runtime-transcripts-index',
|
|
482
|
-
status: 'pass',
|
|
483
|
-
severity: 'info',
|
|
484
|
-
detail: 'no runtime transcripts recorded yet',
|
|
485
|
-
});
|
|
486
|
-
checks.push({
|
|
487
|
-
name: 'runtime-transcripts-summary',
|
|
488
|
-
status: 'pass',
|
|
489
|
-
severity: 'info',
|
|
490
|
-
detail: 'latest=none, success=0, failed=0, total=0',
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
else {
|
|
494
|
-
const index = loadRuntimeTranscriptIndex(context.projectRoot);
|
|
495
|
-
const summary = summarizeRuntimeTranscripts(index);
|
|
496
|
-
const missingFiles = index.entries.filter((entry) => !fs.existsSync(path.join(context.projectRoot, entry.transcriptFile)));
|
|
497
|
-
checks.push({
|
|
498
|
-
name: 'runtime-transcripts-index',
|
|
499
|
-
status: 'pass',
|
|
500
|
-
severity: 'info',
|
|
501
|
-
detail: `${index.entries.length} runtime transcript entr${index.entries.length === 1 ? 'y' : 'ies'} indexed`,
|
|
502
|
-
});
|
|
503
|
-
checks.push({
|
|
504
|
-
name: 'runtime-transcripts-summary',
|
|
505
|
-
status: 'pass',
|
|
506
|
-
severity: 'info',
|
|
507
|
-
detail: `latest=${summary.latestEntry ? `${summary.latestEntry.label}:${summary.latestEntry.success ? 'ok' : 'fail'}` : 'none'}, ` +
|
|
508
|
-
`success=${summary.successful}, failed=${summary.failed}, total=${summary.total}`,
|
|
509
|
-
});
|
|
510
|
-
if (missingFiles.length > 0) {
|
|
511
|
-
checks.push({
|
|
512
|
-
name: 'runtime-transcripts-integrity',
|
|
513
|
-
status: 'warn',
|
|
514
|
-
severity: 'warning',
|
|
515
|
-
detail: `${missingFiles.length} transcript file(s) referenced by index are missing`,
|
|
516
|
-
suggestion: 'Prune stale transcript index entries or regenerate index by rerunning runtime tasks.',
|
|
517
|
-
});
|
|
518
|
-
}
|
|
519
|
-
else {
|
|
520
|
-
checks.push({
|
|
521
|
-
name: 'runtime-transcripts-integrity',
|
|
522
|
-
status: 'pass',
|
|
523
|
-
severity: 'info',
|
|
524
|
-
detail: 'runtime transcript index matches on-disk transcript files',
|
|
525
|
-
});
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
if (ir && adapter) {
|
|
529
|
-
try {
|
|
530
|
-
const rebuilt = await adapter.buildIR(context.projectRoot);
|
|
531
|
-
const moduleDiff = diffIR(ir, rebuilt);
|
|
532
|
-
const frameworkChanged = ir.framework !== rebuilt.framework;
|
|
533
|
-
const versionChanged = ir.irVersion !== rebuilt.irVersion;
|
|
534
|
-
const hasDrift = frameworkChanged ||
|
|
535
|
-
versionChanged ||
|
|
536
|
-
moduleDiff.addedModules.length > 0 ||
|
|
537
|
-
moduleDiff.removedModules.length > 0 ||
|
|
538
|
-
moduleDiff.changedModules.length > 0;
|
|
539
|
-
checks.push(hasDrift
|
|
540
|
-
? {
|
|
541
|
-
name: 'ir-drift',
|
|
542
|
-
status: 'warn',
|
|
543
|
-
severity: 'warning',
|
|
544
|
-
detail: `persisted IR differs from current project ` +
|
|
545
|
-
`(added=${moduleDiff.addedModules.length}, removed=${moduleDiff.removedModules.length}, ` +
|
|
546
|
-
`changed=${moduleDiff.changedModules.length}, frameworkChanged=${frameworkChanged}, ` +
|
|
547
|
-
`versionChanged=${versionChanged}). Run "lumis ir rebuild".`,
|
|
548
|
-
suggestion: 'Review the drift summary, then run "lumis ir rebuild" and commit the updated .lumis/ir.json file.',
|
|
549
|
-
}
|
|
550
|
-
: {
|
|
551
|
-
name: 'ir-drift',
|
|
552
|
-
status: 'pass',
|
|
553
|
-
severity: 'info',
|
|
554
|
-
detail: 'persisted IR is in sync with current project state',
|
|
555
|
-
});
|
|
556
|
-
}
|
|
557
|
-
catch (error) {
|
|
558
|
-
checks.push({
|
|
559
|
-
name: 'ir-drift',
|
|
560
|
-
status: 'warn',
|
|
561
|
-
severity: 'warning',
|
|
562
|
-
detail: `unable to compare persisted IR with project state: ` +
|
|
563
|
-
(error instanceof Error ? error.message : 'unknown error'),
|
|
564
|
-
suggestion: 'Run "lumis ir rebuild" to refresh IR manually, then rerun "lumis doctor".',
|
|
565
|
-
});
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
if (adapter && options.intentTexts.length > 0) {
|
|
569
|
-
const parsedIntents = options.intentTexts
|
|
570
|
-
.map((raw) => ({ raw, parsed: parseRawIntent(raw) }));
|
|
571
|
-
const invalidIntents = parsedIntents.filter((entry) => !entry.parsed).map((entry) => entry.raw);
|
|
572
|
-
if (invalidIntents.length > 0) {
|
|
573
|
-
checks.push({
|
|
574
|
-
name: 'intent-conflicts',
|
|
575
|
-
status: 'fail',
|
|
576
|
-
severity: 'critical',
|
|
577
|
-
detail: `invalid intent input(s): ${invalidIntents.join(' | ')}`,
|
|
578
|
-
suggestion: 'Use fully formed intents (for example "create action LoginAction in Auth") or move batch intents to --intent-file.',
|
|
579
|
-
});
|
|
580
|
-
}
|
|
581
|
-
else {
|
|
582
|
-
const baseIR = ir ?? await adapter.buildIR(context.projectRoot);
|
|
583
|
-
const plannedIntents = [];
|
|
584
|
-
for (const parsed of parsedIntents) {
|
|
585
|
-
if (!parsed.parsed) {
|
|
586
|
-
continue;
|
|
587
|
-
}
|
|
588
|
-
const plan = await createPlanWithAdapter(parsed.parsed, baseIR, adapter);
|
|
589
|
-
plannedIntents.push({
|
|
590
|
-
raw: parsed.raw,
|
|
591
|
-
stepSummaries: plan.steps.map((step) => ({ targetFile: step.targetFile, operation: step.operation })),
|
|
592
|
-
});
|
|
593
|
-
}
|
|
594
|
-
const conflicts = detectIntentConflicts(plannedIntents);
|
|
595
|
-
if (conflicts.length === 0) {
|
|
596
|
-
checks.push({
|
|
597
|
-
name: 'intent-conflicts',
|
|
598
|
-
status: 'pass',
|
|
599
|
-
severity: 'info',
|
|
600
|
-
detail: `no intent conflicts detected across ${plannedIntents.length} intent(s)`,
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
else {
|
|
604
|
-
const strictMode = options.strictIntentConflicts || isCI;
|
|
605
|
-
const severity = strictMode ? 'fail' : 'warn';
|
|
606
|
-
const preview = conflicts
|
|
607
|
-
.slice(0, 3)
|
|
608
|
-
.map((conflict) => `${conflict.targetFile} [${conflict.operations.join(',')}]`)
|
|
609
|
-
.join('; ');
|
|
610
|
-
checks.push({
|
|
611
|
-
name: 'intent-conflicts',
|
|
612
|
-
status: severity,
|
|
613
|
-
severity: strictMode ? 'critical' : 'warning',
|
|
614
|
-
detail: `${conflicts.length} conflict(s) detected. ` +
|
|
615
|
-
`${strictMode ? `failing (${isCI ? 'CI mode' : 'strict mode'}).` : 'run with --strict-intent-conflicts to fail locally; CI fails critical conflicts by default.'} ` +
|
|
616
|
-
`Examples: ${preview}`,
|
|
617
|
-
suggestion: 'Split or reorder overlapping intents so each target file has one deterministic write path. ' +
|
|
618
|
-
'Run "lumis make --dry-run <intent>" on each intent individually to preview its plan, then rerun "lumis doctor --intent <intent1> --intent <intent2>" to confirm conflicts are resolved.',
|
|
619
|
-
});
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
context.write('Lumis doctor report:\n');
|
|
624
|
-
for (const check of checks) {
|
|
625
|
-
context.write(`${formatCheck(check)}\n`);
|
|
626
|
-
if (check.status !== 'pass' && check.suggestion) {
|
|
627
|
-
context.write(` -> Suggestion: ${check.suggestion}\n`);
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
const failedChecks = checks.filter((check) => check.status === 'fail').length;
|
|
631
|
-
const issueChecks = checks.filter((check) => check.status !== 'pass');
|
|
632
|
-
const criticalChecks = issueChecks.filter((check) => check.severity === 'critical').length;
|
|
633
|
-
const warningChecks = issueChecks.filter((check) => check.severity === 'warning').length;
|
|
634
|
-
const infoChecks = issueChecks.filter((check) => check.severity === 'info').length;
|
|
635
|
-
const ciFailures = isCI ? criticalChecks : 0;
|
|
636
|
-
context.write(`Summary: ${checks.length} checks, ${criticalChecks} critical, ${warningChecks} warning, ` +
|
|
637
|
-
`${infoChecks} info issue(s), ${failedChecks} hard failure(s)\n`);
|
|
638
|
-
return failedChecks > 0 || ciFailures > 0 ? 1 : 0;
|
|
639
|
-
}
|
|
640
|
-
//# sourceMappingURL=doctor.command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.command.js","sourceRoot":"","sources":["../../src/commands/doctor.command.ts"],"names":[],"mappings":"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"}
|