@logixjs/cli 1.0.1
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 +201 -0
- package/dist/Commands.d.ts +61 -0
- package/dist/Commands.js +16 -0
- package/dist/Commands.js.map +1 -0
- package/dist/anchorAutofill-V6CAXQHT.js +128 -0
- package/dist/anchorAutofill-V6CAXQHT.js.map +1 -0
- package/dist/anchorIndex-IEFARUZM.js +15 -0
- package/dist/anchorIndex-IEFARUZM.js.map +1 -0
- package/dist/bin/logix-devserver.d.ts +1 -0
- package/dist/bin/logix-devserver.js +32 -0
- package/dist/bin/logix-devserver.js.map +1 -0
- package/dist/bin/logix.d.ts +1 -0
- package/dist/bin/logix.js +37 -0
- package/dist/bin/logix.js.map +1 -0
- package/dist/chunk-6DZEO5HP.js +102 -0
- package/dist/chunk-6DZEO5HP.js.map +1 -0
- package/dist/chunk-HGHTOYNL.js +27 -0
- package/dist/chunk-HGHTOYNL.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-RF7XSP3P.js +22 -0
- package/dist/chunk-RF7XSP3P.js.map +1 -0
- package/dist/chunk-TDQVD2IA.js +1193 -0
- package/dist/chunk-TDQVD2IA.js.map +1 -0
- package/dist/chunk-VRPSB3SV.js +143 -0
- package/dist/chunk-VRPSB3SV.js.map +1 -0
- package/dist/contractSuiteRun-5Y7LVI72.js +15 -0
- package/dist/contractSuiteRun-5Y7LVI72.js.map +1 -0
- package/dist/describe-5MFSLD7R.js +218 -0
- package/dist/describe-5MFSLD7R.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/irDiff-WYXZEVA7.js +351 -0
- package/dist/irDiff-WYXZEVA7.js.map +1 -0
- package/dist/irExport-EI2VYIMT.js +87 -0
- package/dist/irExport-EI2VYIMT.js.map +1 -0
- package/dist/irValidate-JEQGVRL5.js +229 -0
- package/dist/irValidate-JEQGVRL5.js.map +1 -0
- package/dist/spyEvidence-JTJDS2WN.js +15 -0
- package/dist/spyEvidence-JTJDS2WN.js.map +1 -0
- package/dist/transformModule-D6YE3U5W.js +15 -0
- package/dist/transformModule-D6YE3U5W.js.map +1 -0
- package/dist/trialRun-SWVYG67P.js +15 -0
- package/dist/trialRun-SWVYG67P.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import {
|
|
2
|
+
makeArtifactOutput,
|
|
3
|
+
readJsonFile
|
|
4
|
+
} from "./chunk-VRPSB3SV.js";
|
|
5
|
+
import {
|
|
6
|
+
sha256DigestOfJson
|
|
7
|
+
} from "./chunk-RF7XSP3P.js";
|
|
8
|
+
import {
|
|
9
|
+
asSerializableErrorSummary,
|
|
10
|
+
makeCliError,
|
|
11
|
+
makeCommandResult
|
|
12
|
+
} from "./chunk-6DZEO5HP.js";
|
|
13
|
+
import "./chunk-PZ5AY32C.js";
|
|
14
|
+
|
|
15
|
+
// src/internal/commands/irValidate.ts
|
|
16
|
+
import { Effect } from "effect";
|
|
17
|
+
import fs from "fs/promises";
|
|
18
|
+
import path from "path";
|
|
19
|
+
var toBytes = (text) => new TextEncoder().encode(text).length;
|
|
20
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21
|
+
var isNonGatingFile = (fileName) => fileName === "trace.slim.json" || fileName === "trialrun.report.json";
|
|
22
|
+
var extractSemanticDigest = (fileName, value) => {
|
|
23
|
+
if (isNonGatingFile(fileName)) return { digest: void 0, digestKind: "nonGating" };
|
|
24
|
+
if (fileName === "control-surface.manifest.json") {
|
|
25
|
+
const digest = isRecord(value) && typeof value.digest === "string" ? value.digest : void 0;
|
|
26
|
+
return { digest: digest ?? sha256DigestOfJson(value), digestKind: "semantic" };
|
|
27
|
+
}
|
|
28
|
+
if (fileName === "workflow.surface.json") {
|
|
29
|
+
const digestPairs = Array.isArray(value) ? value.map((x) => {
|
|
30
|
+
const moduleId = isRecord(x) && typeof x.moduleId === "string" ? x.moduleId : void 0;
|
|
31
|
+
const surface = isRecord(x) ? x.surface : void 0;
|
|
32
|
+
const digest = isRecord(surface) && typeof surface.digest === "string" ? surface.digest : void 0;
|
|
33
|
+
return moduleId && digest ? { moduleId, digest } : void 0;
|
|
34
|
+
}).filter((x) => Boolean(x)).sort((a, b) => a.moduleId < b.moduleId ? -1 : a.moduleId > b.moduleId ? 1 : 0) : [];
|
|
35
|
+
return { digest: sha256DigestOfJson(digestPairs), digestKind: "semantic" };
|
|
36
|
+
}
|
|
37
|
+
return { digest: sha256DigestOfJson(value), digestKind: "content" };
|
|
38
|
+
};
|
|
39
|
+
var minimalValidateKnownFile = (fileName, value) => {
|
|
40
|
+
if (!value || typeof value !== "object") return [`INVALID_SHAPE:${fileName}`];
|
|
41
|
+
if (fileName === "control-surface.manifest.json") {
|
|
42
|
+
const version = value.version;
|
|
43
|
+
if (version !== 1) return [`MANIFEST_VERSION_MISMATCH:${String(version)}`];
|
|
44
|
+
const digest = value.digest;
|
|
45
|
+
if (typeof digest !== "string" || digest.length === 0) return ["MANIFEST_MISSING_DIGEST"];
|
|
46
|
+
const modules = value.modules;
|
|
47
|
+
if (!Array.isArray(modules)) return ["MANIFEST_MISSING_MODULES_ARRAY"];
|
|
48
|
+
}
|
|
49
|
+
if (fileName === "workflow.surface.json") {
|
|
50
|
+
if (!Array.isArray(value)) return ["WORKFLOW_SURFACE_NOT_ARRAY"];
|
|
51
|
+
for (const [i, item] of value.entries()) {
|
|
52
|
+
if (!isRecord(item)) return [`WORKFLOW_SURFACE_ITEM_NOT_OBJECT:${i}`];
|
|
53
|
+
if (typeof item.moduleId !== "string" || item.moduleId.length === 0) return [`WORKFLOW_SURFACE_ITEM_MISSING_MODULE_ID:${i}`];
|
|
54
|
+
const surface = item.surface;
|
|
55
|
+
if (!isRecord(surface)) return [`WORKFLOW_SURFACE_ITEM_MISSING_SURFACE:${i}`];
|
|
56
|
+
if (typeof surface.digest !== "string" || surface.digest.length === 0) return [`WORKFLOW_SURFACE_ITEM_MISSING_SURFACE_DIGEST:${i}`];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (fileName === "trialrun.report.json") {
|
|
60
|
+
const ok = value.ok;
|
|
61
|
+
if (typeof ok !== "boolean") return ["TRIALRUN_MISSING_OK_BOOLEAN"];
|
|
62
|
+
}
|
|
63
|
+
return [];
|
|
64
|
+
};
|
|
65
|
+
var readDirJsonFileNames = (dirAbs) => Effect.tryPromise({
|
|
66
|
+
try: () => fs.readdir(dirAbs, { withFileTypes: true }),
|
|
67
|
+
catch: (cause) => makeCliError({
|
|
68
|
+
code: "CLI_IO_ERROR",
|
|
69
|
+
message: `[Logix][CLI] \u65E0\u6CD5\u8BFB\u53D6\u76EE\u5F55\uFF1A${dirAbs}`,
|
|
70
|
+
cause
|
|
71
|
+
})
|
|
72
|
+
}).pipe(
|
|
73
|
+
Effect.map(
|
|
74
|
+
(entries) => entries.filter((e) => e.isFile() && e.name.endsWith(".json")).map((e) => e.name).sort((a, b) => a < b ? -1 : a > b ? 1 : 0)
|
|
75
|
+
)
|
|
76
|
+
);
|
|
77
|
+
var checkJsonFile = (fileAbs, fileName) => Effect.tryPromise({
|
|
78
|
+
try: () => fs.readFile(fileAbs, "utf8"),
|
|
79
|
+
catch: (cause) => makeCliError({
|
|
80
|
+
code: "CLI_IO_ERROR",
|
|
81
|
+
message: `[Logix][CLI] \u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6\uFF1A${fileName}`,
|
|
82
|
+
cause
|
|
83
|
+
})
|
|
84
|
+
}).pipe(
|
|
85
|
+
Effect.flatMap(
|
|
86
|
+
(raw) => Effect.try({
|
|
87
|
+
try: () => JSON.parse(raw),
|
|
88
|
+
catch: (cause) => makeCliError({
|
|
89
|
+
code: "CLI_INVALID_INPUT",
|
|
90
|
+
message: `[Logix][CLI] \u65E0\u6CD5\u89E3\u6790 JSON\uFF1A${fileName}`,
|
|
91
|
+
cause
|
|
92
|
+
})
|
|
93
|
+
}).pipe(
|
|
94
|
+
Effect.map((parsed) => {
|
|
95
|
+
const digestInfo = extractSemanticDigest(fileName, parsed);
|
|
96
|
+
const reasonCodes = minimalValidateKnownFile(fileName, parsed);
|
|
97
|
+
return {
|
|
98
|
+
fileName,
|
|
99
|
+
ok: reasonCodes.length === 0,
|
|
100
|
+
digest: digestInfo.digest,
|
|
101
|
+
digestKind: digestInfo.digestKind,
|
|
102
|
+
bytes: toBytes(raw),
|
|
103
|
+
...reasonCodes.length > 0 ? { reasonCodes } : null
|
|
104
|
+
};
|
|
105
|
+
})
|
|
106
|
+
)
|
|
107
|
+
),
|
|
108
|
+
Effect.catch((cause) => Effect.succeed({
|
|
109
|
+
fileName,
|
|
110
|
+
ok: false,
|
|
111
|
+
error: asSerializableErrorSummary(cause)
|
|
112
|
+
}))
|
|
113
|
+
);
|
|
114
|
+
var runIrValidate = (inv) => {
|
|
115
|
+
const runId = inv.global.runId;
|
|
116
|
+
return Effect.gen(function* () {
|
|
117
|
+
const input = inv.input;
|
|
118
|
+
const requiredFiles = ["control-surface.manifest.json"];
|
|
119
|
+
const files = input.kind === "dir" ? yield* readDirJsonFileNames(path.resolve(process.cwd(), input.dir)) : [path.basename(path.resolve(process.cwd(), input.file))];
|
|
120
|
+
const checks = input.kind === "dir" ? yield* Effect.forEach(
|
|
121
|
+
files,
|
|
122
|
+
(name) => checkJsonFile(path.join(path.resolve(process.cwd(), input.dir), name), name)
|
|
123
|
+
) : yield* Effect.forEach(files, (name) => checkJsonFile(path.resolve(process.cwd(), input.file), name));
|
|
124
|
+
const missingRequiredFiles = input.kind === "dir" ? requiredFiles.filter((f) => !files.includes(f)) : [];
|
|
125
|
+
const manifestCheck = checks.find((c) => c.fileName === "control-surface.manifest.json");
|
|
126
|
+
const workflowSurfaceCheck = checks.find((c) => c.fileName === "workflow.surface.json");
|
|
127
|
+
const workflowSurfaceReasons = [];
|
|
128
|
+
if (input.kind === "dir" && manifestCheck?.ok) {
|
|
129
|
+
const manifestFileAbs = path.join(path.resolve(process.cwd(), input.dir), "control-surface.manifest.json");
|
|
130
|
+
const manifestValue = yield* readJsonFile(manifestFileAbs).pipe(Effect.catch(() => Effect.succeed(void 0)));
|
|
131
|
+
const workflowRefs = isRecord(manifestValue) && Array.isArray(manifestValue.modules) ? manifestValue.modules.map((m) => m && typeof m.moduleId === "string" && m.workflowSurface && typeof m.workflowSurface.digest === "string" ? { moduleId: String(m.moduleId), digest: String(m.workflowSurface.digest) } : void 0).filter((x) => Boolean(x)) : [];
|
|
132
|
+
if (workflowRefs.length > 0) {
|
|
133
|
+
if (!files.includes("workflow.surface.json")) {
|
|
134
|
+
workflowSurfaceReasons.push("MISSING_WORKFLOW_SURFACE_FILE");
|
|
135
|
+
} else if (!workflowSurfaceCheck?.ok) {
|
|
136
|
+
workflowSurfaceReasons.push("WORKFLOW_SURFACE_FILE_INVALID");
|
|
137
|
+
} else {
|
|
138
|
+
const wfAbs = path.join(path.resolve(process.cwd(), input.dir), "workflow.surface.json");
|
|
139
|
+
const wfValue = yield* readJsonFile(wfAbs).pipe(Effect.catch(() => Effect.succeed(void 0)));
|
|
140
|
+
const wfMap = Array.isArray(wfValue) ? new Map(
|
|
141
|
+
wfValue.map((x) => {
|
|
142
|
+
const moduleId = isRecord(x) && typeof x.moduleId === "string" ? x.moduleId : void 0;
|
|
143
|
+
const surface = isRecord(x) ? x.surface : void 0;
|
|
144
|
+
const digest = isRecord(surface) && typeof surface.digest === "string" ? surface.digest : void 0;
|
|
145
|
+
return moduleId && digest ? [moduleId, digest] : void 0;
|
|
146
|
+
}).filter((x) => Boolean(x))
|
|
147
|
+
) : /* @__PURE__ */ new Map();
|
|
148
|
+
for (const ref of workflowRefs) {
|
|
149
|
+
const got = wfMap.get(ref.moduleId);
|
|
150
|
+
if (!got) workflowSurfaceReasons.push(`WORKFLOW_SURFACE_MISSING_MODULE:${ref.moduleId}`);
|
|
151
|
+
else if (got !== ref.digest) workflowSurfaceReasons.push(`WORKFLOW_SURFACE_DIGEST_MISMATCH:${ref.moduleId}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const hasParseErrors = checks.some((c) => c.ok === false && c.error);
|
|
157
|
+
const hasViolations = missingRequiredFiles.length > 0 || checks.some((c) => c.ok === false && (c.reasonCodes?.length ?? 0) > 0) || workflowSurfaceReasons.length > 0;
|
|
158
|
+
const status = hasParseErrors ? "error" : hasViolations ? "violation" : "pass";
|
|
159
|
+
const report = {
|
|
160
|
+
schemaVersion: 1,
|
|
161
|
+
kind: "IrValidateReport",
|
|
162
|
+
input,
|
|
163
|
+
status,
|
|
164
|
+
requiredFiles,
|
|
165
|
+
missingRequiredFiles,
|
|
166
|
+
files: checks,
|
|
167
|
+
summary: {
|
|
168
|
+
checkedFiles: checks.length,
|
|
169
|
+
okFiles: checks.filter((c) => c.ok).length,
|
|
170
|
+
failedFiles: checks.filter((c) => !c.ok).length
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
const reportWithWorkflow = workflowSurfaceReasons.length > 0 ? { ...report, workflowSurface: { reasonCodes: workflowSurfaceReasons } } : report;
|
|
174
|
+
const artifactReasonCodes = Array.from(
|
|
175
|
+
/* @__PURE__ */ new Set([
|
|
176
|
+
...missingRequiredFiles.map((fileName) => `MISSING_REQUIRED_FILE:${fileName}`),
|
|
177
|
+
...checks.flatMap((check) => check.reasonCodes ?? []),
|
|
178
|
+
...workflowSurfaceReasons,
|
|
179
|
+
...checks.filter((check) => check.error?.code).map((check) => `PARSE_ERROR:${String(check.error?.code ?? "UNKNOWN")}`)
|
|
180
|
+
])
|
|
181
|
+
).sort();
|
|
182
|
+
const artifacts = [
|
|
183
|
+
yield* makeArtifactOutput({
|
|
184
|
+
outDir: inv.global.outDir,
|
|
185
|
+
budgetBytes: inv.global.budgetBytes,
|
|
186
|
+
fileName: "ir.validate.report.json",
|
|
187
|
+
outputKey: "irValidateReport",
|
|
188
|
+
kind: "IrValidateReport",
|
|
189
|
+
value: reportWithWorkflow,
|
|
190
|
+
...artifactReasonCodes.length > 0 ? { reasonCodes: artifactReasonCodes } : null
|
|
191
|
+
})
|
|
192
|
+
];
|
|
193
|
+
if (status === "pass") {
|
|
194
|
+
return makeCommandResult({ runId, command: "ir.validate", ok: true, artifacts });
|
|
195
|
+
}
|
|
196
|
+
const topError = status === "violation" ? asSerializableErrorSummary(
|
|
197
|
+
makeCliError({
|
|
198
|
+
code: "CLI_VIOLATION_IR_VALIDATE",
|
|
199
|
+
message: "[Logix][CLI] ir validate: \u95E8\u7981\u672A\u901A\u8FC7"
|
|
200
|
+
})
|
|
201
|
+
) : asSerializableErrorSummary(
|
|
202
|
+
makeCliError({
|
|
203
|
+
code: "CLI_INVALID_INPUT",
|
|
204
|
+
message: "[Logix][CLI] ir validate: \u8F93\u5165\u4E0D\u53EF\u89E3\u6790"
|
|
205
|
+
})
|
|
206
|
+
);
|
|
207
|
+
return makeCommandResult({
|
|
208
|
+
runId,
|
|
209
|
+
command: "ir.validate",
|
|
210
|
+
ok: false,
|
|
211
|
+
artifacts,
|
|
212
|
+
error: topError
|
|
213
|
+
});
|
|
214
|
+
}).pipe(
|
|
215
|
+
Effect.catch((cause) => Effect.succeed(
|
|
216
|
+
makeCommandResult({
|
|
217
|
+
runId,
|
|
218
|
+
command: "ir.validate",
|
|
219
|
+
ok: false,
|
|
220
|
+
artifacts: [],
|
|
221
|
+
error: asSerializableErrorSummary(cause)
|
|
222
|
+
})
|
|
223
|
+
))
|
|
224
|
+
);
|
|
225
|
+
};
|
|
226
|
+
export {
|
|
227
|
+
runIrValidate
|
|
228
|
+
};
|
|
229
|
+
//# sourceMappingURL=irValidate-JEQGVRL5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/commands/irValidate.ts"],"sourcesContent":["import { Effect } from 'effect'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { makeArtifactOutput } from '../artifacts.js'\nimport type { CliInvocation, IrValidateInput } from '../args.js'\nimport { asSerializableErrorSummary, makeCliError } from '../errors.js'\nimport { readJsonFile } from '../output.js'\nimport type { ArtifactOutput, CommandResult } from '../result.js'\nimport { makeCommandResult } from '../result.js'\nimport { sha256DigestOfJson } from '../stableJson.js'\n\ntype IrValidateFileCheck = {\n readonly fileName: string\n readonly ok: boolean\n readonly digest?: string\n readonly digestKind?: 'semantic' | 'content' | 'nonGating'\n readonly bytes?: number\n readonly reasonCodes?: ReadonlyArray<string>\n readonly error?: ReturnType<typeof asSerializableErrorSummary>\n}\n\ntype IrValidateReportV1 = {\n readonly schemaVersion: 1\n readonly kind: 'IrValidateReport'\n readonly input: IrValidateInput\n readonly status: 'pass' | 'violation' | 'error'\n readonly requiredFiles: ReadonlyArray<string>\n readonly missingRequiredFiles: ReadonlyArray<string>\n readonly files: ReadonlyArray<IrValidateFileCheck>\n readonly summary: {\n readonly checkedFiles: number\n readonly okFiles: number\n readonly failedFiles: number\n }\n}\n\nconst toBytes = (text: string): number => new TextEncoder().encode(text).length\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isNonGatingFile = (fileName: string): boolean => fileName === 'trace.slim.json' || fileName === 'trialrun.report.json'\n\nconst extractSemanticDigest = (fileName: string, value: unknown): { readonly digest?: string; readonly digestKind: IrValidateFileCheck['digestKind'] } => {\n if (isNonGatingFile(fileName)) return { digest: undefined, digestKind: 'nonGating' }\n\n if (fileName === 'control-surface.manifest.json') {\n const digest = isRecord(value) && typeof value.digest === 'string' ? value.digest : undefined\n return { digest: digest ?? sha256DigestOfJson(value), digestKind: 'semantic' }\n }\n\n if (fileName === 'workflow.surface.json') {\n const digestPairs = Array.isArray(value)\n ? value\n .map((x) => {\n const moduleId = isRecord(x) && typeof x.moduleId === 'string' ? x.moduleId : undefined\n const surface = isRecord(x) ? x.surface : undefined\n const digest = isRecord(surface) && typeof surface.digest === 'string' ? surface.digest : undefined\n return moduleId && digest ? { moduleId, digest } : undefined\n })\n .filter((x): x is { moduleId: string; digest: string } => Boolean(x))\n .sort((a, b) => (a.moduleId < b.moduleId ? -1 : a.moduleId > b.moduleId ? 1 : 0))\n : []\n return { digest: sha256DigestOfJson(digestPairs), digestKind: 'semantic' }\n }\n\n return { digest: sha256DigestOfJson(value), digestKind: 'content' }\n}\n\nconst minimalValidateKnownFile = (fileName: string, value: unknown): ReadonlyArray<string> => {\n if (!value || typeof value !== 'object') return [`INVALID_SHAPE:${fileName}`]\n\n if (fileName === 'control-surface.manifest.json') {\n const version = (value as any).version\n if (version !== 1) return [`MANIFEST_VERSION_MISMATCH:${String(version)}`]\n const digest = (value as any).digest\n if (typeof digest !== 'string' || digest.length === 0) return ['MANIFEST_MISSING_DIGEST']\n const modules = (value as any).modules\n if (!Array.isArray(modules)) return ['MANIFEST_MISSING_MODULES_ARRAY']\n }\n\n if (fileName === 'workflow.surface.json') {\n if (!Array.isArray(value)) return ['WORKFLOW_SURFACE_NOT_ARRAY']\n for (const [i, item] of value.entries()) {\n if (!isRecord(item)) return [`WORKFLOW_SURFACE_ITEM_NOT_OBJECT:${i}`]\n if (typeof item.moduleId !== 'string' || item.moduleId.length === 0) return [`WORKFLOW_SURFACE_ITEM_MISSING_MODULE_ID:${i}`]\n const surface = item.surface\n if (!isRecord(surface)) return [`WORKFLOW_SURFACE_ITEM_MISSING_SURFACE:${i}`]\n if (typeof surface.digest !== 'string' || surface.digest.length === 0) return [`WORKFLOW_SURFACE_ITEM_MISSING_SURFACE_DIGEST:${i}`]\n }\n }\n\n if (fileName === 'trialrun.report.json') {\n const ok = (value as any).ok\n if (typeof ok !== 'boolean') return ['TRIALRUN_MISSING_OK_BOOLEAN']\n }\n\n return []\n}\n\nconst readDirJsonFileNames = (dirAbs: string): Effect.Effect<ReadonlyArray<string>, unknown> =>\n Effect.tryPromise({\n try: () => fs.readdir(dirAbs, { withFileTypes: true }),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_IO_ERROR',\n message: `[Logix][CLI] 无法读取目录:${dirAbs}`,\n cause,\n }),\n }).pipe(\n Effect.map((entries) =>\n entries\n .filter((e) => e.isFile() && e.name.endsWith('.json'))\n .map((e) => e.name)\n .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)),\n ),\n )\n\nconst checkJsonFile = (fileAbs: string, fileName: string): Effect.Effect<IrValidateFileCheck, never> =>\n Effect.tryPromise({\n try: () => fs.readFile(fileAbs, 'utf8'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_IO_ERROR',\n message: `[Logix][CLI] 无法读取文件:${fileName}`,\n cause,\n }),\n }).pipe(\n Effect.flatMap((raw) =>\n Effect.try({\n try: () => JSON.parse(raw) as unknown,\n catch: (cause) =>\n makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] 无法解析 JSON:${fileName}`,\n cause,\n }),\n }).pipe(\n Effect.map((parsed) => {\n const digestInfo = extractSemanticDigest(fileName, parsed)\n const reasonCodes = minimalValidateKnownFile(fileName, parsed)\n return {\n fileName,\n ok: reasonCodes.length === 0,\n digest: digestInfo.digest,\n digestKind: digestInfo.digestKind,\n bytes: toBytes(raw),\n ...(reasonCodes.length > 0 ? { reasonCodes } : null),\n } satisfies IrValidateFileCheck\n }),\n ),\n ),\n Effect.catch((cause) =>\n Effect.succeed({\n fileName,\n ok: false,\n error: asSerializableErrorSummary(cause),\n })),\n )\n\ntype IrValidateInvocation = Extract<CliInvocation, { readonly command: 'ir.validate' }>\n\nexport const runIrValidate = (inv: IrValidateInvocation): Effect.Effect<CommandResult, never> => {\n const runId = inv.global.runId\n\n return Effect.gen(function* () {\n const input = inv.input\n\n const requiredFiles = ['control-surface.manifest.json']\n\n const files =\n input.kind === 'dir'\n ? yield* readDirJsonFileNames(path.resolve(process.cwd(), input.dir))\n : [path.basename(path.resolve(process.cwd(), input.file))]\n\n const checks =\n input.kind === 'dir'\n ? yield* Effect.forEach(files, (name) =>\n checkJsonFile(path.join(path.resolve(process.cwd(), input.dir), name), name),\n )\n : yield* Effect.forEach(files, (name) => checkJsonFile(path.resolve(process.cwd(), input.file), name))\n\n const missingRequiredFiles =\n input.kind === 'dir' ? requiredFiles.filter((f) => !files.includes(f)) : ([] as ReadonlyArray<string>)\n\n const manifestCheck = checks.find((c) => c.fileName === 'control-surface.manifest.json')\n const workflowSurfaceCheck = checks.find((c) => c.fileName === 'workflow.surface.json')\n\n const workflowSurfaceReasons: string[] = []\n if (input.kind === 'dir' && manifestCheck?.ok) {\n const manifestFileAbs = path.join(path.resolve(process.cwd(), input.dir), 'control-surface.manifest.json')\n const manifestValue = yield* readJsonFile(manifestFileAbs).pipe(Effect.catch(() => Effect.succeed(undefined)))\n\n const workflowRefs =\n isRecord(manifestValue) && Array.isArray((manifestValue as any).modules)\n ? (manifestValue as any).modules\n .map((m: any) => (m && typeof m.moduleId === 'string' && m.workflowSurface && typeof m.workflowSurface.digest === 'string'\n ? { moduleId: String(m.moduleId), digest: String(m.workflowSurface.digest) }\n : undefined))\n .filter((x: any) => Boolean(x))\n : []\n\n if (workflowRefs.length > 0) {\n if (!files.includes('workflow.surface.json')) {\n workflowSurfaceReasons.push('MISSING_WORKFLOW_SURFACE_FILE')\n } else if (!workflowSurfaceCheck?.ok) {\n workflowSurfaceReasons.push('WORKFLOW_SURFACE_FILE_INVALID')\n } else {\n const wfAbs = path.join(path.resolve(process.cwd(), input.dir), 'workflow.surface.json')\n const wfValue = yield* readJsonFile(wfAbs).pipe(Effect.catch(() => Effect.succeed(undefined)))\n const wfMap =\n Array.isArray(wfValue)\n ? new Map(\n wfValue\n .map((x: any) => {\n const moduleId = isRecord(x) && typeof x.moduleId === 'string' ? x.moduleId : undefined\n const surface = isRecord(x) ? x.surface : undefined\n const digest = isRecord(surface) && typeof surface.digest === 'string' ? surface.digest : undefined\n return moduleId && digest ? [moduleId, digest] : undefined\n })\n .filter((x: any): x is [string, string] => Boolean(x)),\n )\n : new Map<string, string>()\n\n for (const ref of workflowRefs) {\n const got = wfMap.get(ref.moduleId)\n if (!got) workflowSurfaceReasons.push(`WORKFLOW_SURFACE_MISSING_MODULE:${ref.moduleId}`)\n else if (got !== ref.digest) workflowSurfaceReasons.push(`WORKFLOW_SURFACE_DIGEST_MISMATCH:${ref.moduleId}`)\n }\n }\n }\n }\n\n const hasParseErrors = checks.some((c) => c.ok === false && c.error)\n const hasViolations =\n missingRequiredFiles.length > 0 ||\n checks.some((c) => c.ok === false && (c.reasonCodes?.length ?? 0) > 0) ||\n workflowSurfaceReasons.length > 0\n\n const status: IrValidateReportV1['status'] = hasParseErrors ? 'error' : hasViolations ? 'violation' : 'pass'\n\n const report: IrValidateReportV1 = {\n schemaVersion: 1,\n kind: 'IrValidateReport',\n input,\n status,\n requiredFiles,\n missingRequiredFiles,\n files: checks,\n summary: {\n checkedFiles: checks.length,\n okFiles: checks.filter((c) => c.ok).length,\n failedFiles: checks.filter((c) => !c.ok).length,\n },\n }\n\n const reportWithWorkflow: IrValidateReportV1 & { readonly workflowSurface?: { readonly reasonCodes: ReadonlyArray<string> } } =\n workflowSurfaceReasons.length > 0 ? { ...report, workflowSurface: { reasonCodes: workflowSurfaceReasons } } : report\n\n const artifactReasonCodes = Array.from(\n new Set([\n ...missingRequiredFiles.map((fileName) => `MISSING_REQUIRED_FILE:${fileName}`),\n ...checks.flatMap((check) => check.reasonCodes ?? []),\n ...workflowSurfaceReasons,\n ...checks\n .filter((check) => check.error?.code)\n .map((check) => `PARSE_ERROR:${String(check.error?.code ?? 'UNKNOWN')}`),\n ]),\n ).sort()\n\n const artifacts: ArtifactOutput[] = [\n yield* makeArtifactOutput({\n outDir: inv.global.outDir,\n budgetBytes: inv.global.budgetBytes,\n fileName: 'ir.validate.report.json',\n outputKey: 'irValidateReport',\n kind: 'IrValidateReport',\n value: reportWithWorkflow,\n ...(artifactReasonCodes.length > 0 ? { reasonCodes: artifactReasonCodes } : null),\n }),\n ]\n\n if (status === 'pass') {\n return makeCommandResult({ runId, command: 'ir.validate', ok: true, artifacts })\n }\n\n const topError =\n status === 'violation'\n ? asSerializableErrorSummary(\n makeCliError({\n code: 'CLI_VIOLATION_IR_VALIDATE',\n message: '[Logix][CLI] ir validate: 门禁未通过',\n }),\n )\n : asSerializableErrorSummary(\n makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: '[Logix][CLI] ir validate: 输入不可解析',\n }),\n )\n\n return makeCommandResult({\n runId,\n command: 'ir.validate',\n ok: false,\n artifacts,\n error: topError,\n })\n }).pipe(\n Effect.catch((cause) =>\n Effect.succeed(\n makeCommandResult({\n runId,\n command: 'ir.validate',\n ok: false,\n artifacts: [],\n error: asSerializableErrorSummary(cause),\n }),\n )),\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,OAAO,QAAQ;AACf,OAAO,UAAU;AAmCjB,IAAM,UAAU,CAAC,SAAyB,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE;AAEzE,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAM,kBAAkB,CAAC,aAA8B,aAAa,qBAAqB,aAAa;AAEtG,IAAM,wBAAwB,CAAC,UAAkB,UAAyG;AACxJ,MAAI,gBAAgB,QAAQ,EAAG,QAAO,EAAE,QAAQ,QAAW,YAAY,YAAY;AAEnF,MAAI,aAAa,iCAAiC;AAChD,UAAM,SAAS,SAAS,KAAK,KAAK,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACpF,WAAO,EAAE,QAAQ,UAAU,mBAAmB,KAAK,GAAG,YAAY,WAAW;AAAA,EAC/E;AAEA,MAAI,aAAa,yBAAyB;AACxC,UAAM,cAAc,MAAM,QAAQ,KAAK,IACnC,MACG,IAAI,CAAC,MAAM;AACV,YAAM,WAAW,SAAS,CAAC,KAAK,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAC9E,YAAM,UAAU,SAAS,CAAC,IAAI,EAAE,UAAU;AAC1C,YAAM,SAAS,SAAS,OAAO,KAAK,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AAC1F,aAAO,YAAY,SAAS,EAAE,UAAU,OAAO,IAAI;AAAA,IACrD,CAAC,EACA,OAAO,CAAC,MAAiD,QAAQ,CAAC,CAAC,EACnE,KAAK,CAAC,GAAG,MAAO,EAAE,WAAW,EAAE,WAAW,KAAK,EAAE,WAAW,EAAE,WAAW,IAAI,CAAE,IAClF,CAAC;AACL,WAAO,EAAE,QAAQ,mBAAmB,WAAW,GAAG,YAAY,WAAW;AAAA,EAC3E;AAEA,SAAO,EAAE,QAAQ,mBAAmB,KAAK,GAAG,YAAY,UAAU;AACpE;AAEA,IAAM,2BAA2B,CAAC,UAAkB,UAA0C;AAC5F,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC,iBAAiB,QAAQ,EAAE;AAE5E,MAAI,aAAa,iCAAiC;AAChD,UAAM,UAAW,MAAc;AAC/B,QAAI,YAAY,EAAG,QAAO,CAAC,6BAA6B,OAAO,OAAO,CAAC,EAAE;AACzE,UAAM,SAAU,MAAc;AAC9B,QAAI,OAAO,WAAW,YAAY,OAAO,WAAW,EAAG,QAAO,CAAC,yBAAyB;AACxF,UAAM,UAAW,MAAc;AAC/B,QAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO,CAAC,gCAAgC;AAAA,EACvE;AAEA,MAAI,aAAa,yBAAyB;AACxC,QAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC,4BAA4B;AAC/D,eAAW,CAAC,GAAG,IAAI,KAAK,MAAM,QAAQ,GAAG;AACvC,UAAI,CAAC,SAAS,IAAI,EAAG,QAAO,CAAC,oCAAoC,CAAC,EAAE;AACpE,UAAI,OAAO,KAAK,aAAa,YAAY,KAAK,SAAS,WAAW,EAAG,QAAO,CAAC,2CAA2C,CAAC,EAAE;AAC3H,YAAM,UAAU,KAAK;AACrB,UAAI,CAAC,SAAS,OAAO,EAAG,QAAO,CAAC,yCAAyC,CAAC,EAAE;AAC5E,UAAI,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,WAAW,EAAG,QAAO,CAAC,gDAAgD,CAAC,EAAE;AAAA,IACpI;AAAA,EACF;AAEA,MAAI,aAAa,wBAAwB;AACvC,UAAM,KAAM,MAAc;AAC1B,QAAI,OAAO,OAAO,UAAW,QAAO,CAAC,6BAA6B;AAAA,EACpE;AAEA,SAAO,CAAC;AACV;AAEA,IAAM,uBAAuB,CAAC,WAC5B,OAAO,WAAW;AAAA,EAChB,KAAK,MAAM,GAAG,QAAQ,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,EACrD,OAAO,CAAC,UACN,aAAa;AAAA,IACX,MAAM;AAAA,IACN,SAAS,0DAAuB,MAAM;AAAA,IACtC;AAAA,EACF,CAAC;AACL,CAAC,EAAE;AAAA,EACD,OAAO;AAAA,IAAI,CAAC,YACV,QACG,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,KAAK,SAAS,OAAO,CAAC,EACpD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,CAAC,GAAG,MAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAE;AAAA,EAChD;AACF;AAEF,IAAM,gBAAgB,CAAC,SAAiB,aACtC,OAAO,WAAW;AAAA,EAChB,KAAK,MAAM,GAAG,SAAS,SAAS,MAAM;AAAA,EACtC,OAAO,CAAC,UACN,aAAa;AAAA,IACX,MAAM;AAAA,IACN,SAAS,0DAAuB,QAAQ;AAAA,IACxC;AAAA,EACF,CAAC;AACL,CAAC,EAAE;AAAA,EACD,OAAO;AAAA,IAAQ,CAAC,QACd,OAAO,IAAI;AAAA,MACT,KAAK,MAAM,KAAK,MAAM,GAAG;AAAA,MACzB,OAAO,CAAC,UACN,aAAa;AAAA,QACX,MAAM;AAAA,QACN,SAAS,mDAA0B,QAAQ;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACL,CAAC,EAAE;AAAA,MACD,OAAO,IAAI,CAAC,WAAW;AACrB,cAAM,aAAa,sBAAsB,UAAU,MAAM;AACzD,cAAM,cAAc,yBAAyB,UAAU,MAAM;AAC7D,eAAO;AAAA,UACL;AAAA,UACA,IAAI,YAAY,WAAW;AAAA,UAC3B,QAAQ,WAAW;AAAA,UACnB,YAAY,WAAW;AAAA,UACvB,OAAO,QAAQ,GAAG;AAAA,UAClB,GAAI,YAAY,SAAS,IAAI,EAAE,YAAY,IAAI;AAAA,QACjD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO,MAAM,CAAC,UACZ,OAAO,QAAQ;AAAA,IACb;AAAA,IACA,IAAI;AAAA,IACJ,OAAO,2BAA2B,KAAK;AAAA,EACzC,CAAC,CAAC;AACN;AAIK,IAAM,gBAAgB,CAAC,QAAmE;AAC/F,QAAM,QAAQ,IAAI,OAAO;AAEzB,SAAO,OAAO,IAAI,aAAa;AAC7B,UAAM,QAAQ,IAAI;AAElB,UAAM,gBAAgB,CAAC,+BAA+B;AAEtD,UAAM,QACJ,MAAM,SAAS,QACX,OAAO,qBAAqB,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM,GAAG,CAAC,IAClE,CAAC,KAAK,SAAS,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC;AAE7D,UAAM,SACJ,MAAM,SAAS,QACX,OAAO,OAAO;AAAA,MAAQ;AAAA,MAAO,CAAC,SAC5B,cAAc,KAAK,KAAK,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI;AAAA,IAC7E,IACA,OAAO,OAAO,QAAQ,OAAO,CAAC,SAAS,cAAc,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAEzG,UAAM,uBACJ,MAAM,SAAS,QAAQ,cAAc,OAAO,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC,IAAK,CAAC;AAE7E,UAAM,gBAAgB,OAAO,KAAK,CAAC,MAAM,EAAE,aAAa,+BAA+B;AACvF,UAAM,uBAAuB,OAAO,KAAK,CAAC,MAAM,EAAE,aAAa,uBAAuB;AAEtF,UAAM,yBAAmC,CAAC;AAC1C,QAAI,MAAM,SAAS,SAAS,eAAe,IAAI;AAC7C,YAAM,kBAAkB,KAAK,KAAK,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM,GAAG,GAAG,+BAA+B;AACzG,YAAM,gBAAgB,OAAO,aAAa,eAAe,EAAE,KAAK,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAS,CAAC,CAAC;AAE7G,YAAM,eACJ,SAAS,aAAa,KAAK,MAAM,QAAS,cAAsB,OAAO,IAClE,cAAsB,QACpB,IAAI,CAAC,MAAY,KAAK,OAAO,EAAE,aAAa,YAAY,EAAE,mBAAmB,OAAO,EAAE,gBAAgB,WAAW,WAC9G,EAAE,UAAU,OAAO,EAAE,QAAQ,GAAG,QAAQ,OAAO,EAAE,gBAAgB,MAAM,EAAE,IACzE,MAAU,EACb,OAAO,CAAC,MAAW,QAAQ,CAAC,CAAC,IAChC,CAAC;AAEP,UAAI,aAAa,SAAS,GAAG;AAC3B,YAAI,CAAC,MAAM,SAAS,uBAAuB,GAAG;AAC5C,iCAAuB,KAAK,+BAA+B;AAAA,QAC7D,WAAW,CAAC,sBAAsB,IAAI;AACpC,iCAAuB,KAAK,+BAA+B;AAAA,QAC7D,OAAO;AACL,gBAAM,QAAQ,KAAK,KAAK,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM,GAAG,GAAG,uBAAuB;AACvF,gBAAM,UAAU,OAAO,aAAa,KAAK,EAAE,KAAK,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAS,CAAC,CAAC;AAC7F,gBAAM,QACJ,MAAM,QAAQ,OAAO,IACjB,IAAI;AAAA,YACF,QACG,IAAI,CAAC,MAAW;AACf,oBAAM,WAAW,SAAS,CAAC,KAAK,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAC9E,oBAAM,UAAU,SAAS,CAAC,IAAI,EAAE,UAAU;AAC1C,oBAAM,SAAS,SAAS,OAAO,KAAK,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AAC1F,qBAAO,YAAY,SAAS,CAAC,UAAU,MAAM,IAAI;AAAA,YACnD,CAAC,EACA,OAAO,CAAC,MAAkC,QAAQ,CAAC,CAAC;AAAA,UACzD,IACA,oBAAI,IAAoB;AAE9B,qBAAW,OAAO,cAAc;AAC9B,kBAAM,MAAM,MAAM,IAAI,IAAI,QAAQ;AAClC,gBAAI,CAAC,IAAK,wBAAuB,KAAK,mCAAmC,IAAI,QAAQ,EAAE;AAAA,qBAC9E,QAAQ,IAAI,OAAQ,wBAAuB,KAAK,oCAAoC,IAAI,QAAQ,EAAE;AAAA,UAC7G;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,EAAE,KAAK;AACnE,UAAM,gBACJ,qBAAqB,SAAS,KAC9B,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU,EAAE,aAAa,UAAU,KAAK,CAAC,KACrE,uBAAuB,SAAS;AAElC,UAAM,SAAuC,iBAAiB,UAAU,gBAAgB,cAAc;AAEtG,UAAM,SAA6B;AAAA,MACjC,eAAe;AAAA,MACf,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,QACP,cAAc,OAAO;AAAA,QACrB,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE;AAAA,QACpC,aAAa,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,qBACJ,uBAAuB,SAAS,IAAI,EAAE,GAAG,QAAQ,iBAAiB,EAAE,aAAa,uBAAuB,EAAE,IAAI;AAEhH,UAAM,sBAAsB,MAAM;AAAA,MAChC,oBAAI,IAAI;AAAA,QACN,GAAG,qBAAqB,IAAI,CAAC,aAAa,yBAAyB,QAAQ,EAAE;AAAA,QAC7E,GAAG,OAAO,QAAQ,CAAC,UAAU,MAAM,eAAe,CAAC,CAAC;AAAA,QACpD,GAAG;AAAA,QACH,GAAG,OACA,OAAO,CAAC,UAAU,MAAM,OAAO,IAAI,EACnC,IAAI,CAAC,UAAU,eAAe,OAAO,MAAM,OAAO,QAAQ,SAAS,CAAC,EAAE;AAAA,MAC3E,CAAC;AAAA,IACH,EAAE,KAAK;AAEP,UAAM,YAA8B;AAAA,MAClC,OAAO,mBAAmB;AAAA,QACxB,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAa,IAAI,OAAO;AAAA,QACxB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,QACP,GAAI,oBAAoB,SAAS,IAAI,EAAE,aAAa,oBAAoB,IAAI;AAAA,MAC9E,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,QAAQ;AACrB,aAAO,kBAAkB,EAAE,OAAO,SAAS,eAAe,IAAI,MAAM,UAAU,CAAC;AAAA,IACjF;AAEA,UAAM,WACJ,WAAW,cACP;AAAA,MACE,aAAa;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH,IACA;AAAA,MACE,aAAa;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEN,WAAO,kBAAkB;AAAA,MACvB;AAAA,MACA,SAAS;AAAA,MACT,IAAI;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC,EAAE;AAAA,IACD,OAAO,MAAM,CAAC,UACZ,OAAO;AAAA,MACL,kBAAkB;AAAA,QAChB;AAAA,QACA,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,WAAW,CAAC;AAAA,QACZ,OAAO,2BAA2B,KAAK;AAAA,MACzC,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AACF;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runUnsupportedCommand
|
|
3
|
+
} from "./chunk-HGHTOYNL.js";
|
|
4
|
+
import "./chunk-6DZEO5HP.js";
|
|
5
|
+
import "./chunk-PZ5AY32C.js";
|
|
6
|
+
|
|
7
|
+
// src/internal/commands/spyEvidence.ts
|
|
8
|
+
var runSpyEvidence = (inv) => runUnsupportedCommand({
|
|
9
|
+
runId: inv.global.runId,
|
|
10
|
+
command: "spy.evidence"
|
|
11
|
+
});
|
|
12
|
+
export {
|
|
13
|
+
runSpyEvidence
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=spyEvidence-JTJDS2WN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/commands/spyEvidence.ts"],"sourcesContent":["import { Effect } from 'effect'\n\nimport type { CliInvocation } from '../args.js'\nimport type { CommandResult } from '../result.js'\nimport { runUnsupportedCommand } from './unsupported.js'\n\ntype SpyEvidenceInvocation = Extract<CliInvocation, { readonly command: 'spy.evidence' }>\n\nexport const runSpyEvidence = (inv: SpyEvidenceInvocation): Effect.Effect<CommandResult, never> =>\n runUnsupportedCommand({\n runId: inv.global.runId,\n command: 'spy.evidence',\n })\n"],"mappings":";;;;;;;AAQO,IAAM,iBAAiB,CAAC,QAC7B,sBAAsB;AAAA,EACpB,OAAO,IAAI,OAAO;AAAA,EAClB,SAAS;AACX,CAAC;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runUnsupportedCommand
|
|
3
|
+
} from "./chunk-HGHTOYNL.js";
|
|
4
|
+
import "./chunk-6DZEO5HP.js";
|
|
5
|
+
import "./chunk-PZ5AY32C.js";
|
|
6
|
+
|
|
7
|
+
// src/internal/commands/transformModule.ts
|
|
8
|
+
var runTransformModule = (inv) => runUnsupportedCommand({
|
|
9
|
+
runId: inv.global.runId,
|
|
10
|
+
command: "transform.module"
|
|
11
|
+
});
|
|
12
|
+
export {
|
|
13
|
+
runTransformModule
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=transformModule-D6YE3U5W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/commands/transformModule.ts"],"sourcesContent":["import { Effect } from 'effect'\n\nimport type { CliInvocation } from '../args.js'\nimport type { CommandResult } from '../result.js'\nimport { runUnsupportedCommand } from './unsupported.js'\n\ntype TransformModuleInvocation = Extract<CliInvocation, { readonly command: 'transform.module' }>\n\nexport const runTransformModule = (inv: TransformModuleInvocation): Effect.Effect<CommandResult, never> =>\n runUnsupportedCommand({\n runId: inv.global.runId,\n command: 'transform.module',\n })\n"],"mappings":";;;;;;;AAQO,IAAM,qBAAqB,CAAC,QACjC,sBAAsB;AAAA,EACpB,OAAO,IAAI,OAAO;AAAA,EAClB,SAAS;AACX,CAAC;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runUnsupportedCommand
|
|
3
|
+
} from "./chunk-HGHTOYNL.js";
|
|
4
|
+
import "./chunk-6DZEO5HP.js";
|
|
5
|
+
import "./chunk-PZ5AY32C.js";
|
|
6
|
+
|
|
7
|
+
// src/internal/commands/trialRun.ts
|
|
8
|
+
var runTrialRun = (inv) => runUnsupportedCommand({
|
|
9
|
+
runId: inv.global.runId,
|
|
10
|
+
command: "trialrun"
|
|
11
|
+
});
|
|
12
|
+
export {
|
|
13
|
+
runTrialRun
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=trialRun-SWVYG67P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/commands/trialRun.ts"],"sourcesContent":["import { Effect } from 'effect'\n\nimport type { CliInvocation } from '../args.js'\nimport type { CommandResult } from '../result.js'\nimport { runUnsupportedCommand } from './unsupported.js'\n\ntype TrialRunInvocation = Extract<CliInvocation, { readonly command: 'trialrun' }>\n\nexport const runTrialRun = (inv: TrialRunInvocation): Effect.Effect<CommandResult, never> =>\n runUnsupportedCommand({\n runId: inv.global.runId,\n command: 'trialrun',\n })\n"],"mappings":";;;;;;;AAQO,IAAM,cAAc,CAAC,QAC1B,sBAAsB;AAAA,EACpB,OAAO,IAAI,OAAO;AAAA,EAClB,SAAS;AACX,CAAC;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@logixjs/cli",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/yoyooyooo/logix",
|
|
7
|
+
"directory": "packages/logix-cli"
|
|
8
|
+
},
|
|
9
|
+
"license": "Apache-2.0",
|
|
10
|
+
"description": "Node-only Logix CLI toolbox (IR export / trialrun / gates)",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"bin": {
|
|
13
|
+
"logix": "dist/bin/logix.js",
|
|
14
|
+
"logix-devserver": "dist/bin/logix-devserver.js"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/**"
|
|
18
|
+
],
|
|
19
|
+
"exports": {
|
|
20
|
+
"./package.json": "./package.json",
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.js",
|
|
24
|
+
"require": "./dist/index.cjs"
|
|
25
|
+
},
|
|
26
|
+
"./Commands": {
|
|
27
|
+
"types": "./dist/Commands.d.ts",
|
|
28
|
+
"import": "./dist/Commands.js",
|
|
29
|
+
"require": "./dist/Commands.cjs"
|
|
30
|
+
},
|
|
31
|
+
"./internal/*": null
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@effect/platform-node": "4.0.0-beta.28",
|
|
38
|
+
"effect": "4.0.0-beta.28",
|
|
39
|
+
"happy-dom": "^20.0.11",
|
|
40
|
+
"ts-morph": "^25.0.0",
|
|
41
|
+
"tsx": "^4.20.6",
|
|
42
|
+
"ws": "^8.0.0",
|
|
43
|
+
"@logixjs/core": "1.0.1"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^22.19.1",
|
|
47
|
+
"@types/ws": "^8.5.0",
|
|
48
|
+
"tsup": "^8.5.1",
|
|
49
|
+
"typescript": "5.8.2",
|
|
50
|
+
"vitest": "^4.0.15"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"effect": "4.0.0-beta.28",
|
|
54
|
+
"@logixjs/core": "1.0.1"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "tsup",
|
|
58
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
59
|
+
"typecheck:test": "tsc -p tsconfig.test.json --noEmit",
|
|
60
|
+
"test": "vitest run",
|
|
61
|
+
"test:changed": "vitest run --changed",
|
|
62
|
+
"test:cache": "vitest run --cache",
|
|
63
|
+
"measure:startup": "node ./scripts/measure-startup.mjs --samples 9 --warmup 1 --thresholdMs 500",
|
|
64
|
+
"measure:startup:ci": "node ./scripts/measure-startup.mjs --samples 11 --warmup 2 --thresholdMs 500 --jsonOut ./perf/startup.report.json"
|
|
65
|
+
},
|
|
66
|
+
"main": "./dist/index.cjs",
|
|
67
|
+
"module": "./dist/index.js",
|
|
68
|
+
"types": "./dist/index.d.ts"
|
|
69
|
+
}
|