@fragments-sdk/cli 0.15.10 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +896 -787
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-6SQPP47U.js → chunk-77AAP6R6.js} +532 -31
- package/dist/chunk-77AAP6R6.js.map +1 -0
- package/dist/{chunk-5JF26E55.js → chunk-ACFVKMVZ.js} +11 -11
- package/dist/{chunk-BJE3425I.js → chunk-ACX7YWZW.js} +2 -2
- package/dist/{chunk-ONUP6Z4W.js → chunk-G6UVWMFU.js} +8 -8
- package/dist/{chunk-2WXKALIG.js → chunk-OZZ4SVZX.js} +2 -2
- package/dist/{chunk-32LIWN2P.js → chunk-SJFSG7QF.js} +582 -261
- package/dist/chunk-SJFSG7QF.js.map +1 -0
- package/dist/{chunk-HQ6A6DTV.js → chunk-XRADMHMV.js} +315 -1089
- package/dist/chunk-XRADMHMV.js.map +1 -0
- package/dist/core/index.js +53 -1
- package/dist/{create-EXURTBKK.js → create-3ZFYQB3T.js} +2 -2
- package/dist/{doctor-BDPMYYE6.js → doctor-4IDUM7HI.js} +2 -2
- package/dist/{generate-PVOLUAAC.js → generate-VNUUWVWQ.js} +4 -4
- package/dist/{govern-scan-DW4QUAYD.js → govern-scan-HTACKYPF.js} +158 -120
- package/dist/govern-scan-HTACKYPF.js.map +1 -0
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/{init-SSGUSP7Z.js → init-PXFRAQ64.js} +5 -5
- package/dist/mcp-bin.js +2 -2
- package/dist/{scan-PKSYSTRR.js → scan-L4GWGEZX.js} +5 -6
- package/dist/{scan-generate-VY27PIOX.js → scan-generate-74EYSAGH.js} +4 -4
- package/dist/{service-QJGWUIVL.js → service-VELQHEWV.js} +12 -14
- package/dist/{snapshot-WIJMEIFT.js → snapshot-DT4B6DPR.js} +2 -2
- package/dist/{static-viewer-7QIBQZRC.js → static-viewer-E4OJWFDJ.js} +3 -3
- package/dist/{test-64Z5BKBA.js → test-QJY2QO4X.js} +3 -3
- package/dist/{token-normalizer-TEPOVBPV.js → token-normalizer-56H4242J.js} +2 -2
- package/dist/{tokens-NZWFQIAB.js → tokens-K6URXFPK.js} +7 -8
- package/dist/{tokens-NZWFQIAB.js.map → tokens-K6URXFPK.js.map} +1 -1
- package/dist/{tokens-generate-5JQSJ27E.js → tokens-generate-EL6IN536.js} +2 -2
- package/package.json +7 -6
- package/src/bin.ts +49 -88
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/label.contract.json +1 -1
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/primitive.contract.json +1 -1
- package/src/commands/__tests__/context-cloud.test.ts +291 -0
- package/src/commands/__tests__/govern-scan.test.ts +185 -0
- package/src/commands/__tests__/govern.test.ts +1 -0
- package/src/commands/context-cloud.ts +355 -0
- package/src/commands/govern-scan-report.ts +170 -0
- package/src/commands/govern-scan.ts +42 -147
- package/src/commands/govern.ts +0 -157
- package/dist/chunk-32LIWN2P.js.map +0 -1
- package/dist/chunk-6SQPP47U.js.map +0 -1
- package/dist/chunk-HQ6A6DTV.js.map +0 -1
- package/dist/chunk-MHIBEEW4.js +0 -511
- package/dist/chunk-MHIBEEW4.js.map +0 -1
- package/dist/govern-scan-DW4QUAYD.js.map +0 -1
- package/dist/init-cloud-3DNKPWFB.js +0 -304
- package/dist/init-cloud-3DNKPWFB.js.map +0 -1
- package/dist/node-37AUE74M.js +0 -65
- package/dist/push-contracts-WY32TFP6.js +0 -84
- package/dist/push-contracts-WY32TFP6.js.map +0 -1
- package/dist/static-viewer-7QIBQZRC.js.map +0 -1
- package/dist/token-parser-32KOIOFN.js +0 -22
- package/dist/token-parser-32KOIOFN.js.map +0 -1
- package/dist/tokens-push-HY3KO36V.js +0 -148
- package/dist/tokens-push-HY3KO36V.js.map +0 -1
- package/src/commands/init-cloud.ts +0 -382
- package/src/commands/push-contracts.ts +0 -112
- package/src/commands/tokens-push.ts +0 -199
- /package/dist/{chunk-5JF26E55.js.map → chunk-ACFVKMVZ.js.map} +0 -0
- /package/dist/{chunk-BJE3425I.js.map → chunk-ACX7YWZW.js.map} +0 -0
- /package/dist/{chunk-ONUP6Z4W.js.map → chunk-G6UVWMFU.js.map} +0 -0
- /package/dist/{chunk-2WXKALIG.js.map → chunk-OZZ4SVZX.js.map} +0 -0
- /package/dist/{create-EXURTBKK.js.map → create-3ZFYQB3T.js.map} +0 -0
- /package/dist/{doctor-BDPMYYE6.js.map → doctor-4IDUM7HI.js.map} +0 -0
- /package/dist/{generate-PVOLUAAC.js.map → generate-VNUUWVWQ.js.map} +0 -0
- /package/dist/{init-SSGUSP7Z.js.map → init-PXFRAQ64.js.map} +0 -0
- /package/dist/{node-37AUE74M.js.map → scan-L4GWGEZX.js.map} +0 -0
- /package/dist/{scan-generate-VY27PIOX.js.map → scan-generate-74EYSAGH.js.map} +0 -0
- /package/dist/{scan-PKSYSTRR.js.map → service-VELQHEWV.js.map} +0 -0
- /package/dist/{snapshot-WIJMEIFT.js.map → snapshot-DT4B6DPR.js.map} +0 -0
- /package/dist/{service-QJGWUIVL.js.map → static-viewer-E4OJWFDJ.js.map} +0 -0
- /package/dist/{test-64Z5BKBA.js.map → test-QJY2QO4X.js.map} +0 -0
- /package/dist/{token-normalizer-TEPOVBPV.js.map → token-normalizer-56H4242J.js.map} +0 -0
- /package/dist/{tokens-generate-5JQSJ27E.js.map → tokens-generate-EL6IN536.js.map} +0 -0
|
@@ -2,12 +2,127 @@ import { createRequire as __banner_createRequire } from 'module'; const require
|
|
|
2
2
|
import "./chunk-D2CDBRNU.js";
|
|
3
3
|
import {
|
|
4
4
|
BRAND
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-SJFSG7QF.js";
|
|
6
6
|
|
|
7
7
|
// src/commands/govern-scan.ts
|
|
8
8
|
import pc from "picocolors";
|
|
9
|
-
import { resolve, relative } from "path";
|
|
9
|
+
import { resolve as resolve2, relative as relative2 } from "path";
|
|
10
10
|
import { existsSync } from "fs";
|
|
11
|
+
|
|
12
|
+
// src/commands/govern-scan-report.ts
|
|
13
|
+
import { resolve, dirname, relative } from "path";
|
|
14
|
+
var SEVERITY_RANK = {
|
|
15
|
+
critical: 4,
|
|
16
|
+
serious: 3,
|
|
17
|
+
moderate: 2,
|
|
18
|
+
minor: 1
|
|
19
|
+
};
|
|
20
|
+
function mergeSeverity(a, b) {
|
|
21
|
+
return SEVERITY_RANK[a] >= SEVERITY_RANK[b] ? a : b;
|
|
22
|
+
}
|
|
23
|
+
function aggregateVerdicts(verdicts, computeScore, runner = "cli") {
|
|
24
|
+
if (verdicts.length === 0) {
|
|
25
|
+
return {
|
|
26
|
+
passed: true,
|
|
27
|
+
score: 100,
|
|
28
|
+
results: [],
|
|
29
|
+
metadata: {
|
|
30
|
+
runner,
|
|
31
|
+
duration: 0,
|
|
32
|
+
nodeCount: 0,
|
|
33
|
+
componentTypes: []
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const byValidator = /* @__PURE__ */ new Map();
|
|
38
|
+
let duration = 0;
|
|
39
|
+
let nodeCount = 0;
|
|
40
|
+
const componentTypes = /* @__PURE__ */ new Set();
|
|
41
|
+
for (const verdict of verdicts) {
|
|
42
|
+
duration += verdict.metadata.duration;
|
|
43
|
+
nodeCount += verdict.metadata.nodeCount;
|
|
44
|
+
for (const type of verdict.metadata.componentTypes) {
|
|
45
|
+
componentTypes.add(type);
|
|
46
|
+
}
|
|
47
|
+
for (const result of verdict.results) {
|
|
48
|
+
const existing = byValidator.get(result.validator);
|
|
49
|
+
if (!existing) {
|
|
50
|
+
byValidator.set(result.validator, {
|
|
51
|
+
validator: result.validator,
|
|
52
|
+
severity: result.severity,
|
|
53
|
+
passed: result.passed,
|
|
54
|
+
violations: [...result.violations],
|
|
55
|
+
suggestions: result.suggestions ? [...result.suggestions] : void 0
|
|
56
|
+
});
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
existing.passed = existing.passed && result.passed;
|
|
60
|
+
existing.severity = mergeSeverity(existing.severity, result.severity);
|
|
61
|
+
existing.violations.push(...result.violations);
|
|
62
|
+
if (result.suggestions?.length) {
|
|
63
|
+
const merged = existing.suggestions ?? [];
|
|
64
|
+
merged.push(...result.suggestions);
|
|
65
|
+
existing.suggestions = merged;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const results = [...byValidator.values()].sort(
|
|
70
|
+
(a, b) => a.validator.localeCompare(b.validator)
|
|
71
|
+
);
|
|
72
|
+
const allViolations = results.flatMap((result) => result.violations);
|
|
73
|
+
return {
|
|
74
|
+
passed: verdicts.every((verdict) => verdict.passed),
|
|
75
|
+
score: computeScore(allViolations),
|
|
76
|
+
results,
|
|
77
|
+
metadata: {
|
|
78
|
+
runner,
|
|
79
|
+
duration,
|
|
80
|
+
nodeCount,
|
|
81
|
+
componentTypes: [...componentTypes].sort()
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function flattenComponentUsage(usages, rootDir) {
|
|
86
|
+
const counts = /* @__PURE__ */ new Map();
|
|
87
|
+
for (const usage of usages) {
|
|
88
|
+
const relPath = relative(rootDir, usage.filePath);
|
|
89
|
+
const key = `${relPath}\0${usage.componentName}`;
|
|
90
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
91
|
+
}
|
|
92
|
+
return [...counts.entries()].map(([key, occurrences]) => {
|
|
93
|
+
const separatorIndex = key.indexOf("\0");
|
|
94
|
+
const file = key.slice(0, separatorIndex);
|
|
95
|
+
const component = key.slice(separatorIndex + 1);
|
|
96
|
+
return { component, file, occurrences };
|
|
97
|
+
}).sort(
|
|
98
|
+
(a, b) => a.file === b.file ? a.component.localeCompare(b.component) : a.file.localeCompare(b.file)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
function buildComplianceSummary(health) {
|
|
102
|
+
const usageTotals = Object.values(health.components).reduce(
|
|
103
|
+
(acc, component) => {
|
|
104
|
+
acc.passingUsages += component.passed;
|
|
105
|
+
acc.totalUsages += component.total;
|
|
106
|
+
return acc;
|
|
107
|
+
},
|
|
108
|
+
{ passingUsages: 0, totalUsages: 0 }
|
|
109
|
+
);
|
|
110
|
+
return {
|
|
111
|
+
complianceRate: health.overallCompliance,
|
|
112
|
+
passingUsages: usageTotals.passingUsages,
|
|
113
|
+
totalUsages: usageTotals.totalUsages,
|
|
114
|
+
contractedCount: health.contractedComponents,
|
|
115
|
+
detectedCount: health.totalComponents
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
async function writeGovernScanReport(path, report) {
|
|
119
|
+
const { mkdir, writeFile } = await import("fs/promises");
|
|
120
|
+
const absPath = resolve(path);
|
|
121
|
+
await mkdir(dirname(absPath), { recursive: true });
|
|
122
|
+
await writeFile(absPath, JSON.stringify(report, null, 2), "utf-8");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/commands/govern-scan.ts
|
|
11
126
|
var SCAN_DEFAULT_RULES = {
|
|
12
127
|
"safety/block-event-handlers": true,
|
|
13
128
|
"safety/block-dangerous-props": true,
|
|
@@ -19,7 +134,7 @@ var SCAN_DEFAULT_RULES = {
|
|
|
19
134
|
function detectRootDir(cwd) {
|
|
20
135
|
const candidates = ["src", "app", "pages", "components"];
|
|
21
136
|
for (const dir of candidates) {
|
|
22
|
-
if (existsSync(
|
|
137
|
+
if (existsSync(resolve2(cwd, dir))) {
|
|
23
138
|
return cwd;
|
|
24
139
|
}
|
|
25
140
|
}
|
|
@@ -42,9 +157,9 @@ async function governScan(options = {}) {
|
|
|
42
157
|
loadPolicy,
|
|
43
158
|
createEngine,
|
|
44
159
|
buildAdaptersFromConfig,
|
|
45
|
-
createCloudAdapter,
|
|
46
160
|
formatVerdict,
|
|
47
|
-
computeComponentHealth
|
|
161
|
+
computeComponentHealth,
|
|
162
|
+
computeScore
|
|
48
163
|
} = await import("@fragments-sdk/govern");
|
|
49
164
|
const { scanCodebase } = await import("./codebase-scanner-MQHUZC2G.js");
|
|
50
165
|
const { usagesToSpec } = await import("./converter-7XM3Y6NJ.js");
|
|
@@ -55,7 +170,7 @@ async function governScan(options = {}) {
|
|
|
55
170
|
${BRAND.name} Governance Scan
|
|
56
171
|
`));
|
|
57
172
|
}
|
|
58
|
-
const rootDir =
|
|
173
|
+
const rootDir = resolve2(options.dir ?? detectRootDir(process.cwd()));
|
|
59
174
|
if (!quiet) {
|
|
60
175
|
console.log(pc.dim(` Root: ${rootDir}
|
|
61
176
|
`));
|
|
@@ -68,33 +183,29 @@ ${BRAND.name} Governance Scan
|
|
|
68
183
|
console.log(pc.dim(" No config found \u2014 using scan defaults (safety + tokens)\n"));
|
|
69
184
|
}
|
|
70
185
|
}
|
|
71
|
-
let codeTokens;
|
|
72
|
-
if (process.env.FRAGMENTS_API_KEY) {
|
|
73
|
-
codeTokens = await extractCodeTokens(rootDir, options.config, quiet);
|
|
74
|
-
}
|
|
75
|
-
let contractRegistry;
|
|
76
186
|
let registryMap;
|
|
187
|
+
let hasRegistry = false;
|
|
77
188
|
{
|
|
78
189
|
const { readFileSync, existsSync: existsSync2 } = await import("fs");
|
|
79
|
-
const fragmentsJsonPath =
|
|
190
|
+
const fragmentsJsonPath = resolve2(rootDir, "fragments.json");
|
|
80
191
|
if (existsSync2(fragmentsJsonPath)) {
|
|
81
192
|
try {
|
|
82
193
|
const raw = readFileSync(fragmentsJsonPath, "utf-8");
|
|
83
194
|
const parsed = JSON.parse(raw);
|
|
84
195
|
if (parsed.fragments && Array.isArray(parsed.fragments)) {
|
|
85
196
|
const map = {};
|
|
86
|
-
for (const
|
|
87
|
-
if (
|
|
88
|
-
map[
|
|
197
|
+
for (const fragment of parsed.fragments) {
|
|
198
|
+
if (fragment.meta?.name) {
|
|
199
|
+
map[fragment.meta.name] = fragment;
|
|
89
200
|
}
|
|
90
201
|
}
|
|
91
202
|
registryMap = map;
|
|
92
|
-
|
|
93
|
-
contractRegistry = JSON.stringify({ fragments: parsed.fragments });
|
|
94
|
-
}
|
|
203
|
+
hasRegistry = true;
|
|
95
204
|
if (!quiet) {
|
|
96
|
-
console.log(
|
|
97
|
-
`)
|
|
205
|
+
console.log(
|
|
206
|
+
pc.dim(` Contract registry loaded (${parsed.fragments.length} components)
|
|
207
|
+
`)
|
|
208
|
+
);
|
|
98
209
|
}
|
|
99
210
|
}
|
|
100
211
|
} catch {
|
|
@@ -102,13 +213,6 @@ ${BRAND.name} Governance Scan
|
|
|
102
213
|
}
|
|
103
214
|
}
|
|
104
215
|
const adapters = buildAdaptersFromConfig(policy.audit);
|
|
105
|
-
const hasCloudAdapter = adapters.length > 0 && policy.audit?.cloud;
|
|
106
|
-
if (!hasCloudAdapter && process.env.FRAGMENTS_API_KEY) {
|
|
107
|
-
adapters.push(createCloudAdapter({ codeTokens, contractRegistry }));
|
|
108
|
-
if (!quiet) {
|
|
109
|
-
console.log(pc.dim(" Cloud audit enabled (FRAGMENTS_API_KEY detected)\n"));
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
216
|
const engine = createEngine(
|
|
113
217
|
policy,
|
|
114
218
|
adapters,
|
|
@@ -123,7 +227,7 @@ ${BRAND.name} Governance Scan
|
|
|
123
227
|
onProgress: quiet ? void 0 : (progress) => {
|
|
124
228
|
if (progress.phase === "scanning") {
|
|
125
229
|
process.stdout.write(
|
|
126
|
-
`\r ${pc.dim(`[${progress.current}/${progress.total}]`)} ${pc.dim(
|
|
230
|
+
`\r ${pc.dim(`[${progress.current}/${progress.total}]`)} ${pc.dim(relative2(rootDir, progress.currentFile))}`
|
|
127
231
|
);
|
|
128
232
|
}
|
|
129
233
|
}
|
|
@@ -143,6 +247,17 @@ ${BRAND.name} Governance Scan
|
|
|
143
247
|
if (!quiet) {
|
|
144
248
|
console.log(pc.yellow(" No component usages found.\n"));
|
|
145
249
|
}
|
|
250
|
+
if (options.report) {
|
|
251
|
+
const report = {
|
|
252
|
+
verdict: aggregateVerdicts([], computeScore, "ci"),
|
|
253
|
+
componentUsage: []
|
|
254
|
+
};
|
|
255
|
+
await writeGovernScanReport(options.report, report);
|
|
256
|
+
if (!quiet) {
|
|
257
|
+
console.log(pc.dim(` Wrote governance report: ${resolve2(options.report)}
|
|
258
|
+
`));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
146
261
|
return { exitCode: 0 };
|
|
147
262
|
}
|
|
148
263
|
const grouped = groupByFile(allUsages);
|
|
@@ -151,26 +266,14 @@ ${BRAND.name} Governance Scan
|
|
|
151
266
|
let totalViolations = 0;
|
|
152
267
|
const violationCounts = /* @__PURE__ */ new Map();
|
|
153
268
|
const allVerdicts = [];
|
|
154
|
-
const usageSnapshot = [];
|
|
155
269
|
for (const [filePath, usages] of grouped) {
|
|
156
270
|
const spec = usagesToSpec(usages, filePath, rootDir);
|
|
157
|
-
const relPath =
|
|
271
|
+
const relPath = relative2(rootDir, filePath);
|
|
158
272
|
const verdict = await engine.check(spec, {
|
|
159
273
|
runner: "cli",
|
|
160
274
|
input: relPath
|
|
161
275
|
});
|
|
162
276
|
allVerdicts.push(verdict);
|
|
163
|
-
usageSnapshot.push({
|
|
164
|
-
file: relPath,
|
|
165
|
-
components: usages.map((u) => ({
|
|
166
|
-
name: u.componentName,
|
|
167
|
-
line: u.line,
|
|
168
|
-
props: {
|
|
169
|
-
static: u.props.static,
|
|
170
|
-
dynamic: u.props.dynamic
|
|
171
|
-
}
|
|
172
|
-
}))
|
|
173
|
-
});
|
|
174
277
|
totalFiles++;
|
|
175
278
|
if (verdict.passed) {
|
|
176
279
|
passedFiles++;
|
|
@@ -232,89 +335,27 @@ ${BRAND.name} Governance Scan
|
|
|
232
335
|
);
|
|
233
336
|
}
|
|
234
337
|
}
|
|
235
|
-
if (
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
"Content-Type": "application/json",
|
|
243
|
-
Authorization: `Bearer ${apiKey}`
|
|
244
|
-
},
|
|
245
|
-
body: JSON.stringify({
|
|
246
|
-
componentUsage: JSON.stringify(usageSnapshot),
|
|
247
|
-
componentHealth: JSON.stringify(health)
|
|
248
|
-
})
|
|
249
|
-
});
|
|
250
|
-
} catch {
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
return { exitCode: passedFiles === totalFiles ? 0 : 1 };
|
|
254
|
-
}
|
|
255
|
-
async function extractCodeTokens(rootDir, configPath, quiet) {
|
|
256
|
-
try {
|
|
257
|
-
try {
|
|
258
|
-
const { loadConfig } = await import("./node-37AUE74M.js");
|
|
259
|
-
const { parseTokenFiles } = await import("./service-QJGWUIVL.js");
|
|
260
|
-
const { config, configDir } = await loadConfig(configPath);
|
|
261
|
-
if (config.tokens?.include?.length) {
|
|
262
|
-
const result = await parseTokenFiles(config.tokens, configDir);
|
|
263
|
-
if (result.tokens.length > 0) {
|
|
264
|
-
const flat = {};
|
|
265
|
-
for (const token of result.tokens) {
|
|
266
|
-
flat[token.name] = token.resolvedValue;
|
|
267
|
-
}
|
|
268
|
-
if (!quiet) {
|
|
269
|
-
console.log(
|
|
270
|
-
pc.dim(` Extracted ${result.tokens.length} code tokens from config
|
|
271
|
-
`)
|
|
272
|
-
);
|
|
273
|
-
}
|
|
274
|
-
return JSON.stringify(flat);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
} catch {
|
|
278
|
-
}
|
|
279
|
-
const {
|
|
280
|
-
findTailwindConfig,
|
|
281
|
-
loadTailwindConfig
|
|
282
|
-
} = await import("./token-normalizer-TEPOVBPV.js");
|
|
283
|
-
const tailwindPath = findTailwindConfig(rootDir);
|
|
284
|
-
if (tailwindPath) {
|
|
285
|
-
const tokens = await loadTailwindConfig(tailwindPath);
|
|
286
|
-
if (tokens.length > 0) {
|
|
287
|
-
const flat = {};
|
|
288
|
-
for (const token of tokens) {
|
|
289
|
-
flat[token.name] = token.value;
|
|
290
|
-
}
|
|
291
|
-
if (!quiet) {
|
|
292
|
-
console.log(
|
|
293
|
-
pc.dim(` Extracted ${tokens.length} tokens from Tailwind config
|
|
294
|
-
`)
|
|
295
|
-
);
|
|
296
|
-
}
|
|
297
|
-
return JSON.stringify(flat);
|
|
298
|
-
}
|
|
338
|
+
if (options.report) {
|
|
339
|
+
const report = {
|
|
340
|
+
verdict: aggregateVerdicts(allVerdicts, computeScore, "ci"),
|
|
341
|
+
componentUsage: flattenComponentUsage(allUsages, rootDir)
|
|
342
|
+
};
|
|
343
|
+
if (hasRegistry) {
|
|
344
|
+
report.complianceSummary = buildComplianceSummary(health);
|
|
299
345
|
}
|
|
300
|
-
|
|
346
|
+
await writeGovernScanReport(options.report, report);
|
|
301
347
|
if (!quiet) {
|
|
302
|
-
console.log(
|
|
303
|
-
|
|
304
|
-
` Token extraction skipped: ${error instanceof Error ? error.message : "unknown error"}
|
|
305
|
-
`
|
|
306
|
-
)
|
|
307
|
-
);
|
|
348
|
+
console.log(pc.dim(` Wrote governance report: ${resolve2(options.report)}
|
|
349
|
+
`));
|
|
308
350
|
}
|
|
309
351
|
}
|
|
310
|
-
return
|
|
352
|
+
return { exitCode: passedFiles === totalFiles ? 0 : 1 };
|
|
311
353
|
}
|
|
312
354
|
async function governWatch(options = {}) {
|
|
313
355
|
const {
|
|
314
356
|
loadPolicy,
|
|
315
357
|
createEngine,
|
|
316
358
|
buildAdaptersFromConfig,
|
|
317
|
-
createCloudAdapter,
|
|
318
359
|
formatVerdict
|
|
319
360
|
} = await import("@fragments-sdk/govern");
|
|
320
361
|
const { scanFile } = await import("./scanner-4KZNOXAK.js");
|
|
@@ -332,15 +373,12 @@ ${BRAND.name} Governance Watch
|
|
|
332
373
|
`)
|
|
333
374
|
);
|
|
334
375
|
}
|
|
335
|
-
const rootDir =
|
|
376
|
+
const rootDir = resolve2(options.dir ?? detectRootDir(process.cwd()));
|
|
336
377
|
let policy = await loadPolicy(options.config);
|
|
337
378
|
if (Object.keys(policy.rules).length === 0) {
|
|
338
379
|
policy = { ...policy, rules: SCAN_DEFAULT_RULES };
|
|
339
380
|
}
|
|
340
381
|
const adapters = buildAdaptersFromConfig(policy.audit);
|
|
341
|
-
if (!adapters.some(() => policy.audit?.cloud) && process.env.FRAGMENTS_API_KEY) {
|
|
342
|
-
adapters.push(createCloudAdapter());
|
|
343
|
-
}
|
|
344
382
|
const engine = createEngine(policy, adapters);
|
|
345
383
|
console.log(pc.dim(" Watching for changes... (Ctrl+C to stop)\n"));
|
|
346
384
|
const chokidar = await import("chokidar");
|
|
@@ -362,7 +400,7 @@ ${BRAND.name} Governance Watch
|
|
|
362
400
|
}
|
|
363
401
|
);
|
|
364
402
|
const handleChange = async (changedRelPath) => {
|
|
365
|
-
const absolutePath =
|
|
403
|
+
const absolutePath = resolve2(rootDir, changedRelPath);
|
|
366
404
|
try {
|
|
367
405
|
const { usages } = await scanFile(absolutePath);
|
|
368
406
|
if (usages.length === 0) {
|
|
@@ -411,4 +449,4 @@ export {
|
|
|
411
449
|
governScan,
|
|
412
450
|
governWatch
|
|
413
451
|
};
|
|
414
|
-
//# sourceMappingURL=govern-scan-
|
|
452
|
+
//# sourceMappingURL=govern-scan-HTACKYPF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/govern-scan.ts","../src/commands/govern-scan-report.ts"],"sourcesContent":["/**\n * govern scan / govern watch — Zero-config governance scanning\n *\n * Parses real JSX/TSX files via the existing codebase scanner, converts\n * component usages to UISpec, and runs governance checks per file.\n */\n\nimport pc from 'picocolors';\nimport { resolve, relative } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { BRAND } from '../core/index.js';\nimport type { ComponentUsage } from '../service/enhance/types.js';\nimport {\n aggregateVerdicts,\n flattenComponentUsage,\n buildComplianceSummary,\n writeGovernScanReport,\n type GovernScanReport,\n} from './govern-scan-report.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface GovernScanOptions {\n /** Root directory to scan (default: auto-detect) */\n dir?: string;\n /** Path to govern.config.ts */\n config?: string;\n /** Output format */\n format?: 'summary' | 'json' | 'sarif';\n /** Write an aggregated machine-readable JSON report */\n report?: string;\n /** Suppress non-error output */\n quiet?: boolean;\n}\n\nexport interface GovernWatchOptions extends GovernScanOptions {\n /** Debounce interval in ms (default: 300) */\n debounce?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Scan defaults — applied when no config file exists\n// ---------------------------------------------------------------------------\n\nconst SCAN_DEFAULT_RULES: Record<string, boolean | object> = {\n 'safety/block-event-handlers': true,\n 'safety/block-dangerous-props': true,\n 'safety/block-controlled-props': true,\n 'safety/block-function-props': true,\n 'safety/sanitize-hrefs': true,\n 'tokens/require-design-tokens': true,\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Auto-detect root directory by looking for common React project dirs\n */\nfunction detectRootDir(cwd: string): string {\n const candidates = ['src', 'app', 'pages', 'components'];\n for (const dir of candidates) {\n if (existsSync(resolve(cwd, dir))) {\n return cwd;\n }\n }\n return cwd;\n}\n\n/**\n * Group component usages by their source file\n */\nfunction groupByFile(usages: ComponentUsage[]): Map<string, ComponentUsage[]> {\n const grouped = new Map<string, ComponentUsage[]>();\n for (const usage of usages) {\n const existing = grouped.get(usage.filePath);\n if (existing) {\n existing.push(usage);\n } else {\n grouped.set(usage.filePath, [usage]);\n }\n }\n return grouped;\n}\n\n\n// ---------------------------------------------------------------------------\n// governScan\n// ---------------------------------------------------------------------------\n\nexport async function governScan(\n options: GovernScanOptions = {},\n): Promise<{ exitCode: number }> {\n const {\n loadPolicy,\n createEngine,\n buildAdaptersFromConfig,\n formatVerdict,\n computeComponentHealth,\n computeScore,\n } = await import('@fragments-sdk/govern');\n\n const { scanCodebase } = await import(\n '../service/enhance/codebase-scanner.js'\n );\n const { usagesToSpec } = await import(\n '../service/enhance/converter.js'\n );\n\n const format = options.format ?? 'summary';\n const quiet = options.quiet ?? false;\n\n if (!quiet) {\n console.log(pc.cyan(`\\n${BRAND.name} Governance Scan\\n`));\n }\n\n // 1. Resolve root directory\n const rootDir = resolve(options.dir ?? detectRootDir(process.cwd()));\n if (!quiet) {\n console.log(pc.dim(` Root: ${rootDir}\\n`));\n }\n\n // 2. Load policy — use scan defaults if no config exists\n let policy = await loadPolicy(options.config);\n const hasRules = Object.keys(policy.rules).length > 0;\n\n if (!hasRules) {\n policy = { ...policy, rules: SCAN_DEFAULT_RULES };\n if (!quiet) {\n console.log(pc.dim(' No config found — using scan defaults (safety + tokens)\\n'));\n }\n }\n\n // 3. Load contract registry for contract-aware scoring (if fragments.json exists)\n let registryMap: Record<string, unknown> | undefined;\n let hasRegistry = false;\n {\n const { readFileSync, existsSync } = await import('node:fs');\n const fragmentsJsonPath = resolve(rootDir, 'fragments.json');\n if (existsSync(fragmentsJsonPath)) {\n try {\n const raw = readFileSync(fragmentsJsonPath, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed.fragments && Array.isArray(parsed.fragments)) {\n const map: Record<string, unknown> = {};\n for (const fragment of parsed.fragments) {\n if (fragment.meta?.name) {\n map[fragment.meta.name] = fragment;\n }\n }\n registryMap = map;\n hasRegistry = true;\n if (!quiet) {\n console.log(\n pc.dim(` Contract registry loaded (${parsed.fragments.length} components)\\n`),\n );\n }\n }\n } catch {\n // Invalid fragments.json — skip registry-aware summary\n }\n }\n }\n\n // 4. Build adapters from policy config\n const adapters = buildAdaptersFromConfig(policy.audit);\n\n // 5. Create engine (with registry for contract-aware validators)\n const engine = createEngine(\n policy,\n adapters,\n registryMap\n ? { registry: { fragments: registryMap as Record<string, Record<string, unknown>> } }\n : undefined,\n );\n\n // 6. Scan codebase\n if (!quiet) {\n console.log(pc.dim(' Scanning files...\\n'));\n }\n\n const analysis = await scanCodebase({\n rootDir,\n useCache: true,\n onProgress: quiet\n ? undefined\n : (progress) => {\n if (progress.phase === 'scanning') {\n process.stdout.write(\n `\\r ${pc.dim(`[${progress.current}/${progress.total}]`)} ${pc.dim(relative(rootDir, progress.currentFile))}`,\n );\n }\n },\n });\n\n if (!quiet) {\n // Clear progress line\n process.stdout.write('\\r' + ' '.repeat(80) + '\\r');\n console.log(\n pc.dim(` Scanned ${analysis.totalFiles} files, found ${analysis.totalComponents} component types\\n`),\n );\n }\n\n // 7. Collect all usages across components\n const allUsages: ComponentUsage[] = [];\n for (const comp of Object.values(analysis.components)) {\n allUsages.push(...comp.usages);\n }\n\n if (allUsages.length === 0) {\n if (!quiet) {\n console.log(pc.yellow(' No component usages found.\\n'));\n }\n if (options.report) {\n const report: GovernScanReport = {\n verdict: aggregateVerdicts([], computeScore, 'ci'),\n componentUsage: [],\n };\n await writeGovernScanReport(options.report, report);\n if (!quiet) {\n console.log(pc.dim(` Wrote governance report: ${resolve(options.report)}\\n`));\n }\n }\n return { exitCode: 0 };\n }\n\n // 8. Group by file and run checks\n const grouped = groupByFile(allUsages);\n let totalFiles = 0;\n let passedFiles = 0;\n let totalViolations = 0;\n const violationCounts = new Map<string, number>();\n const allVerdicts: Awaited<ReturnType<typeof engine.check>>[] = [];\n\n for (const [filePath, usages] of grouped) {\n const spec = usagesToSpec(usages, filePath, rootDir);\n const relPath = relative(rootDir, filePath);\n\n const verdict = await engine.check(spec, {\n runner: 'cli',\n input: relPath,\n });\n allVerdicts.push(verdict);\n\n totalFiles++;\n\n if (verdict.passed) {\n passedFiles++;\n } else {\n if (!quiet) {\n console.log(pc.red(` ✗ ${relPath}`));\n if (format === 'summary') {\n for (const result of verdict.results) {\n for (const v of result.violations) {\n const count = violationCounts.get(v.rule) ?? 0;\n violationCounts.set(v.rule, count + 1);\n totalViolations++;\n console.log(\n pc.dim(` ${v.severity} `) +\n pc.yellow(v.rule) +\n pc.dim(` — ${v.message}`),\n );\n if (v.nodeId) {\n console.log(pc.dim(` at ${v.nodeId}`));\n }\n }\n }\n }\n }\n }\n\n if (verdict.passed && !quiet && format === 'summary') {\n console.log(pc.green(` ✓ ${relPath}`) + pc.dim(` (${usages.length} components, score: ${verdict.score}/100)`));\n }\n\n // JSON/SARIF: print per-file\n if (format === 'json' || format === 'sarif') {\n const output = formatVerdict(verdict, format);\n console.log(output);\n }\n }\n\n // 8b. Compute component health\n const health = computeComponentHealth(allVerdicts, registryMap ?? {});\n\n // 9. Summary\n if (!quiet && format === 'summary') {\n console.log(pc.dim('\\n ─────────────────────────────────────\\n'));\n console.log(` Files checked: ${totalFiles}`);\n console.log(` Passed: ${passedFiles}/${totalFiles}`);\n console.log(` Violations: ${totalViolations}`);\n\n if (violationCounts.size > 0) {\n console.log(pc.dim('\\n Top violations:'));\n const sorted = [...violationCounts.entries()].sort((a, b) => b[1] - a[1]);\n for (const [rule, count] of sorted.slice(0, 5)) {\n console.log(pc.dim(` ${count}× `) + pc.yellow(rule));\n }\n }\n\n // Component health\n console.log(pc.dim('\\n Component Health:'));\n console.log(` Contract coverage: ${health.contractCoverage}% (${health.contractedComponents}/${health.totalComponents})`);\n console.log(` Compliance rate: ${health.overallCompliance}%`);\n\n if (health.uncontracted.length > 0) {\n console.log(pc.dim(` Uncontracted: ${health.uncontracted.slice(0, 5).join(', ')}${health.uncontracted.length > 5 ? ` (+${health.uncontracted.length - 5} more)` : ''}`));\n }\n\n console.log();\n\n if (passedFiles === totalFiles) {\n console.log(pc.green(` ✓ All files passed governance checks\\n`));\n } else {\n console.log(\n pc.red(` ✗ ${totalFiles - passedFiles} file(s) failed governance checks\\n`),\n );\n }\n }\n\n if (options.report) {\n const report: GovernScanReport = {\n verdict: aggregateVerdicts(allVerdicts, computeScore, 'ci'),\n componentUsage: flattenComponentUsage(allUsages, rootDir),\n };\n if (hasRegistry) {\n report.complianceSummary = buildComplianceSummary(health);\n }\n await writeGovernScanReport(options.report, report);\n if (!quiet) {\n console.log(pc.dim(` Wrote governance report: ${resolve(options.report)}\\n`));\n }\n }\n\n return { exitCode: passedFiles === totalFiles ? 0 : 1 };\n}\n\n// ---------------------------------------------------------------------------\n// governWatch\n// ---------------------------------------------------------------------------\n\nexport async function governWatch(\n options: GovernWatchOptions = {},\n): Promise<void> {\n const {\n loadPolicy,\n createEngine,\n buildAdaptersFromConfig,\n formatVerdict,\n } = await import('@fragments-sdk/govern');\n\n const { scanFile } = await import('../service/enhance/scanner.js');\n const { usagesToSpec } = await import(\n '../service/enhance/converter.js'\n );\n\n const quiet = options.quiet ?? false;\n const debounceMs = options.debounce ?? 300;\n const format = options.format ?? 'summary';\n\n // 1. Run initial scan\n console.log(pc.cyan(`\\n${BRAND.name} Governance Watch\\n`));\n\n const { exitCode } = await governScan(options);\n if (!quiet) {\n console.log(\n pc.dim(` Initial scan ${exitCode === 0 ? 'passed' : 'completed with violations'}\\n`),\n );\n }\n\n // 2. Set up engine for incremental checks\n const rootDir = resolve(options.dir ?? detectRootDir(process.cwd()));\n let policy = await loadPolicy(options.config);\n if (Object.keys(policy.rules).length === 0) {\n policy = { ...policy, rules: SCAN_DEFAULT_RULES };\n }\n const adapters = buildAdaptersFromConfig(policy.audit);\n const engine = createEngine(policy, adapters);\n\n // 3. Watch for changes\n console.log(pc.dim(' Watching for changes... (Ctrl+C to stop)\\n'));\n\n const chokidar = await import('chokidar');\n\n const watcher = chokidar.watch(\n ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n {\n cwd: rootDir,\n ignoreInitial: true,\n ignored: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.next/**',\n '**/*.test.*',\n '**/*.spec.*',\n '**/*.stories.*',\n ],\n awaitWriteFinish: { stabilityThreshold: debounceMs },\n },\n );\n\n const handleChange = async (changedRelPath: string) => {\n const absolutePath = resolve(rootDir, changedRelPath);\n\n try {\n const { usages } = await scanFile(absolutePath);\n\n if (usages.length === 0) {\n if (!quiet) {\n console.log(pc.dim(` ○ ${changedRelPath} — no component usages`));\n }\n return;\n }\n\n const spec = usagesToSpec(usages, absolutePath, rootDir);\n const verdict = await engine.check(spec, {\n runner: 'cli',\n input: changedRelPath,\n });\n\n if (verdict.passed) {\n console.log(\n pc.green(` ✓ ${changedRelPath}`) +\n pc.dim(` (${usages.length} components, score: ${verdict.score}/100)`),\n );\n } else {\n console.log(pc.red(` ✗ ${changedRelPath}`));\n if (format === 'summary') {\n for (const result of verdict.results) {\n for (const v of result.violations) {\n console.log(\n pc.dim(` ${v.severity} `) +\n pc.yellow(v.rule) +\n pc.dim(` — ${v.message}`),\n );\n }\n }\n } else {\n console.log(formatVerdict(verdict, format));\n }\n }\n } catch (error) {\n if (!quiet) {\n console.log(\n pc.dim(` ⚠ ${changedRelPath} — `) +\n pc.yellow(error instanceof Error ? error.message : 'parse error'),\n );\n }\n }\n };\n\n watcher.on('change', handleChange);\n watcher.on('add', handleChange);\n\n // Keep process alive\n await new Promise(() => {});\n}\n","import { resolve, dirname, relative } from 'node:path';\nimport type {\n GovernanceVerdict,\n Severity,\n ComponentHealthSummary,\n Violation,\n} from '@fragments-sdk/govern';\nimport type { ComponentUsage } from '../service/enhance/types.js';\n\nexport interface FlatUsageEntry {\n component: string;\n file: string;\n occurrences: number;\n}\n\nexport interface ComplianceSummary {\n complianceRate: number;\n passingUsages: number;\n totalUsages: number;\n contractedCount: number;\n detectedCount: number;\n}\n\nexport interface GovernScanReport {\n verdict: GovernanceVerdict;\n componentUsage: FlatUsageEntry[];\n complianceSummary?: ComplianceSummary;\n}\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n critical: 4,\n serious: 3,\n moderate: 2,\n minor: 1,\n};\n\nfunction mergeSeverity(a: Severity, b: Severity): Severity {\n return SEVERITY_RANK[a] >= SEVERITY_RANK[b] ? a : b;\n}\n\nexport function aggregateVerdicts(\n verdicts: GovernanceVerdict[],\n computeScore: (violations: Violation[]) => number,\n runner: string = 'cli',\n): GovernanceVerdict {\n if (verdicts.length === 0) {\n return {\n passed: true,\n score: 100,\n results: [],\n metadata: {\n runner,\n duration: 0,\n nodeCount: 0,\n componentTypes: [],\n },\n };\n }\n\n const byValidator = new Map<string, GovernanceVerdict['results'][number]>();\n let duration = 0;\n let nodeCount = 0;\n const componentTypes = new Set<string>();\n\n for (const verdict of verdicts) {\n duration += verdict.metadata.duration;\n nodeCount += verdict.metadata.nodeCount;\n for (const type of verdict.metadata.componentTypes) {\n componentTypes.add(type);\n }\n\n for (const result of verdict.results) {\n const existing = byValidator.get(result.validator);\n if (!existing) {\n byValidator.set(result.validator, {\n validator: result.validator,\n severity: result.severity,\n passed: result.passed,\n violations: [...result.violations],\n suggestions: result.suggestions ? [...result.suggestions] : undefined,\n });\n continue;\n }\n\n existing.passed = existing.passed && result.passed;\n existing.severity = mergeSeverity(existing.severity, result.severity);\n existing.violations.push(...result.violations);\n\n if (result.suggestions?.length) {\n const merged = existing.suggestions ?? [];\n merged.push(...result.suggestions);\n existing.suggestions = merged;\n }\n }\n }\n\n const results = [...byValidator.values()].sort((a, b) =>\n a.validator.localeCompare(b.validator),\n );\n const allViolations = results.flatMap((result) => result.violations);\n\n return {\n passed: verdicts.every((verdict) => verdict.passed),\n score: computeScore(allViolations),\n results,\n metadata: {\n runner,\n duration,\n nodeCount,\n componentTypes: [...componentTypes].sort(),\n },\n };\n}\n\nexport function flattenComponentUsage(\n usages: ComponentUsage[],\n rootDir: string,\n): FlatUsageEntry[] {\n const counts = new Map<string, number>();\n\n for (const usage of usages) {\n const relPath = relative(rootDir, usage.filePath);\n const key = `${relPath}\\u0000${usage.componentName}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n\n return [...counts.entries()]\n .map(([key, occurrences]) => {\n const separatorIndex = key.indexOf('\\u0000');\n const file = key.slice(0, separatorIndex);\n const component = key.slice(separatorIndex + 1);\n return { component, file, occurrences };\n })\n .sort((a, b) =>\n a.file === b.file\n ? a.component.localeCompare(b.component)\n : a.file.localeCompare(b.file),\n );\n}\n\nexport function buildComplianceSummary(\n health: ComponentHealthSummary,\n): ComplianceSummary {\n const usageTotals = Object.values(health.components).reduce(\n (acc, component) => {\n acc.passingUsages += component.passed;\n acc.totalUsages += component.total;\n return acc;\n },\n { passingUsages: 0, totalUsages: 0 },\n );\n\n return {\n complianceRate: health.overallCompliance,\n passingUsages: usageTotals.passingUsages,\n totalUsages: usageTotals.totalUsages,\n contractedCount: health.contractedComponents,\n detectedCount: health.totalComponents,\n };\n}\n\nexport async function writeGovernScanReport(\n path: string,\n report: GovernScanReport,\n): Promise<void> {\n const { mkdir, writeFile } = await import('node:fs/promises');\n const absPath = resolve(path);\n await mkdir(dirname(absPath), { recursive: true });\n await writeFile(absPath, JSON.stringify(report, null, 2), 'utf-8');\n}\n"],"mappings":"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","names":["resolve","relative","resolve","existsSync","relative"]}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createRequire as __banner_createRequire } from 'module'; const require
|
|
|
2
2
|
import {
|
|
3
3
|
generateStaticViewer,
|
|
4
4
|
generateViewerFromJson
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-OZZ4SVZX.js";
|
|
6
6
|
import {
|
|
7
7
|
runAnalyzeCommand,
|
|
8
8
|
runDiffCommand,
|
|
@@ -11,21 +11,20 @@ import {
|
|
|
11
11
|
validateCoverage,
|
|
12
12
|
validateSchema,
|
|
13
13
|
validateSnippets
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-6SQPP47U.js";
|
|
16
|
-
import "./chunk-D2CDBRNU.js";
|
|
14
|
+
} from "./chunk-ACFVKMVZ.js";
|
|
17
15
|
import {
|
|
18
16
|
discoverComponentFiles,
|
|
19
17
|
discoverFragmentFiles,
|
|
20
18
|
extractComponentName,
|
|
21
19
|
findConfigFile,
|
|
22
20
|
loadConfig
|
|
23
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-XRADMHMV.js";
|
|
22
|
+
import "./chunk-77AAP6R6.js";
|
|
23
|
+
import "./chunk-D2CDBRNU.js";
|
|
24
24
|
import {
|
|
25
25
|
defineBlock,
|
|
26
26
|
defineFragment
|
|
27
|
-
} from "./chunk-
|
|
28
|
-
import "./chunk-MHIBEEW4.js";
|
|
27
|
+
} from "./chunk-SJFSG7QF.js";
|
|
29
28
|
import "./chunk-QCN35LJU.js";
|
|
30
29
|
import "./chunk-7DZC4YEV.js";
|
|
31
30
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/cli-commands.ts"],"sourcesContent":["// Re-export from core/node (Node.js-only APIs)\nexport {\n loadConfig,\n findConfigFile,\n discoverFragmentFiles,\n discoverComponentFiles,\n extractComponentName,\n} from \"./core/node.js\";\nexport type { DiscoveredFile } from \"./core/node.js\";\n\n// Validators\nexport { validateSchema, validateCoverage, validateAll, validateSnippets } from \"./validators.js\";\nexport type {\n ValidationResult,\n ValidationError,\n ValidationWarning,\n ValidationRunOptions,\n} from \"./validators.js\";\n\n// Build (delegated to @fragments-sdk/compiler)\nexport { buildFragments } from '@fragments-sdk/compiler';\nexport type { BuildResult } from '@fragments-sdk/compiler';\n\n// Screenshot\nexport { runScreenshotCommand } from \"./screenshot.js\";\nexport type {\n ScreenshotCommandOptions,\n ScreenshotResult,\n} from \"./screenshot.js\";\n\n// Diff\nexport { runDiffCommand } from \"./diff.js\";\nexport type {\n DiffCommandOptions,\n DiffCommandResult,\n VariantDiffResult,\n} from \"./diff.js\";\n\n// Analyze\nexport { runAnalyzeCommand } from \"./analyze.js\";\nexport type { AnalyzeOptions, AnalyzeResult } from \"./analyze.js\";\n\n// Static Viewer\nexport { generateStaticViewer, generateViewerFromJson } from \"./static-viewer.js\";\n\n// Config type (used by generated fragments.config.ts)\nexport type { FragmentsConfig } from \"./core/index.js\";\n\n// Fragment definition API (used by generated .fragment.tsx files)\nexport { defineFragment, defineBlock } from \"./core/index.js\";\n\n// CLI Command metadata (for docs)\nexport { CLI_COMMANDS, CLI_COMMAND_CATEGORIES } from \"./cli-commands.js\";\nexport type { CliCommandDef, CliOptionDef, CliCommandCategory, CliCategoryInfo } from \"./cli-commands.js\";\n","/**\n * CLI command metadata — re-exported from @fragments-sdk/context for convenience.\n *\n * The source of truth lives in @fragments-sdk/context/cli-commands so that\n * browser-safe consumers (like the docs site) can import without pulling in\n * Node.js dependencies from the CLI package.\n */\nexport {\n CLI_COMMANDS,\n CLI_COMMAND_CATEGORIES,\n} from '@fragments-sdk/context/cli-commands';\n\nexport type {\n CliCommandDef,\n CliOptionDef,\n CliCommandCategory,\n CliCategoryInfo,\n} from '@fragments-sdk/context/cli-commands';\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/cli-commands.ts"],"sourcesContent":["// Re-export from core/node (Node.js-only APIs)\nexport {\n loadConfig,\n findConfigFile,\n discoverFragmentFiles,\n discoverComponentFiles,\n extractComponentName,\n} from \"./core/node.js\";\nexport type { DiscoveredFile } from \"./core/node.js\";\n\n// Validators\nexport { validateSchema, validateCoverage, validateAll, validateSnippets } from \"./validators.js\";\nexport type {\n ValidationResult,\n ValidationError,\n ValidationWarning,\n ValidationRunOptions,\n} from \"./validators.js\";\n\n// Build (delegated to @fragments-sdk/compiler)\nexport { buildFragments } from '@fragments-sdk/compiler';\nexport type { BuildResult } from '@fragments-sdk/compiler';\n\n// Screenshot\nexport { runScreenshotCommand } from \"./screenshot.js\";\nexport type {\n ScreenshotCommandOptions,\n ScreenshotResult,\n} from \"./screenshot.js\";\n\n// Diff\nexport { runDiffCommand } from \"./diff.js\";\nexport type {\n DiffCommandOptions,\n DiffCommandResult,\n VariantDiffResult,\n} from \"./diff.js\";\n\n// Analyze\nexport { runAnalyzeCommand } from \"./analyze.js\";\nexport type { AnalyzeOptions, AnalyzeResult } from \"./analyze.js\";\n\n// Static Viewer\nexport { generateStaticViewer, generateViewerFromJson } from \"./static-viewer.js\";\n\n// Config type (used by generated fragments.config.ts)\nexport type { FragmentsConfig } from \"./core/index.js\";\n\n// Fragment definition API (used by generated .fragment.tsx files)\nexport { defineFragment, defineBlock } from \"./core/index.js\";\n\n// CLI Command metadata (for docs)\nexport { CLI_COMMANDS, CLI_COMMAND_CATEGORIES } from \"./cli-commands.js\";\nexport type { CliCommandDef, CliOptionDef, CliCommandCategory, CliCategoryInfo } from \"./cli-commands.js\";\n","/**\n * CLI command metadata — re-exported from @fragments-sdk/context for convenience.\n *\n * The source of truth lives in @fragments-sdk/context/cli-commands so that\n * browser-safe consumers (like the docs site) can import without pulling in\n * Node.js dependencies from the CLI package.\n */\nexport {\n CLI_COMMANDS,\n CLI_COMMAND_CATEGORIES,\n} from '@fragments-sdk/context/cli-commands';\n\nexport type {\n CliCommandDef,\n CliOptionDef,\n CliCommandCategory,\n CliCategoryInfo,\n} from '@fragments-sdk/context/cli-commands';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,SAAS,sBAAsB;;;ACb/B;AAAA,EACE;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
addTranspilePackages,
|
|
6
6
|
detectSetupFramework,
|
|
7
7
|
findEntryFile
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ACX7YWZW.js";
|
|
9
9
|
import "./chunk-D2CDBRNU.js";
|
|
10
10
|
import {
|
|
11
11
|
BRAND
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-SJFSG7QF.js";
|
|
13
13
|
|
|
14
14
|
// src/commands/init.ts
|
|
15
15
|
import { readFile, writeFile, mkdir, access } from "fs/promises";
|
|
@@ -370,7 +370,7 @@ Scan path not found: ${scanPath}
|
|
|
370
370
|
errors: [`Scan path not found: ${scanPath}`]
|
|
371
371
|
};
|
|
372
372
|
}
|
|
373
|
-
const { scanGenerate } = await import("./scan-generate-
|
|
373
|
+
const { scanGenerate } = await import("./scan-generate-74EYSAGH.js");
|
|
374
374
|
const scanResult = await scanGenerate({
|
|
375
375
|
scanPath,
|
|
376
376
|
force: options.force,
|
|
@@ -578,7 +578,7 @@ ${BRAND.name} init
|
|
|
578
578
|
}
|
|
579
579
|
if (scenario === "components" || scenario === "stories") {
|
|
580
580
|
try {
|
|
581
|
-
const { scan } = await import("./scan-
|
|
581
|
+
const { scan } = await import("./scan-L4GWGEZX.js");
|
|
582
582
|
const scanResult = await scan({
|
|
583
583
|
config: configPath,
|
|
584
584
|
verbose: false,
|
|
@@ -635,4 +635,4 @@ ${BRAND.name} init
|
|
|
635
635
|
export {
|
|
636
636
|
init
|
|
637
637
|
};
|
|
638
|
-
//# sourceMappingURL=init-
|
|
638
|
+
//# sourceMappingURL=init-PXFRAQ64.js.map
|
package/dist/mcp-bin.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
BRAND,
|
|
9
9
|
DEFAULTS,
|
|
10
10
|
generateContext
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-SJFSG7QF.js";
|
|
12
12
|
|
|
13
13
|
// src/mcp/server.ts
|
|
14
14
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -42,7 +42,7 @@ var _service = null;
|
|
|
42
42
|
async function getService() {
|
|
43
43
|
if (!_service) {
|
|
44
44
|
try {
|
|
45
|
-
_service = await import("./service-
|
|
45
|
+
_service = await import("./service-VELQHEWV.js");
|
|
46
46
|
} catch {
|
|
47
47
|
throw new Error(
|
|
48
48
|
"Visual tools require playwright. Install it with: npm install playwright"
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
scan
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-G6UVWMFU.js";
|
|
5
|
+
import "./chunk-XRADMHMV.js";
|
|
6
|
+
import "./chunk-77AAP6R6.js";
|
|
6
7
|
import "./chunk-D2CDBRNU.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-32LIWN2P.js";
|
|
9
|
-
import "./chunk-MHIBEEW4.js";
|
|
8
|
+
import "./chunk-SJFSG7QF.js";
|
|
10
9
|
import "./chunk-QCN35LJU.js";
|
|
11
10
|
import "./chunk-7DZC4YEV.js";
|
|
12
11
|
export {
|
|
13
12
|
scan
|
|
14
13
|
};
|
|
15
|
-
//# sourceMappingURL=scan-
|
|
14
|
+
//# sourceMappingURL=scan-L4GWGEZX.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
|
-
import "./chunk-D2CDBRNU.js";
|
|
3
2
|
import {
|
|
4
3
|
discoverAllComponents
|
|
5
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-XRADMHMV.js";
|
|
5
|
+
import "./chunk-D2CDBRNU.js";
|
|
6
6
|
import {
|
|
7
7
|
BRAND
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-SJFSG7QF.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/scan-generate.ts
|
|
11
11
|
import { readFile, writeFile, access, mkdir } from "fs/promises";
|
|
@@ -1400,4 +1400,4 @@ export {
|
|
|
1400
1400
|
resolveCoreInstallCommand,
|
|
1401
1401
|
scanGenerate
|
|
1402
1402
|
};
|
|
1403
|
-
//# sourceMappingURL=scan-generate-
|
|
1403
|
+
//# sourceMappingURL=scan-generate-74EYSAGH.js.map
|