@refrakt-md/cli 0.35.0 → 0.37.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 +420 -21
- package/dist/bin.js.map +1 -1
- package/dist/commands/config.d.ts +3 -2
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +110 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/migrate-snippets.d.ts +65 -0
- package/dist/commands/migrate-snippets.d.ts.map +1 -0
- package/dist/commands/migrate-snippets.js +218 -0
- package/dist/commands/migrate-snippets.js.map +1 -0
- package/dist/commands/snippet-review.d.ts +66 -0
- package/dist/commands/snippet-review.d.ts.map +1 -0
- package/dist/commands/snippet-review.js +271 -0
- package/dist/commands/snippet-review.js.map +1 -0
- package/dist/commands/stale.d.ts +32 -0
- package/dist/commands/stale.d.ts.map +1 -0
- package/dist/commands/stale.js +130 -0
- package/dist/commands/stale.js.map +1 -0
- package/dist/commands/theme-validate.d.ts +23 -0
- package/dist/commands/theme-validate.d.ts.map +1 -0
- package/dist/commands/theme-validate.js +73 -0
- package/dist/commands/theme-validate.js.map +1 -0
- package/dist/commands/theme.d.ts +1 -2
- package/dist/commands/theme.d.ts.map +1 -1
- package/dist/commands/theme.js.map +1 -1
- package/dist/commands/validate-config.d.ts +35 -0
- package/dist/commands/validate-config.d.ts.map +1 -0
- package/dist/commands/validate-config.js +123 -0
- package/dist/commands/validate-config.js.map +1 -0
- package/dist/commands/validate-core.d.ts +51 -0
- package/dist/commands/validate-core.d.ts.map +1 -0
- package/dist/commands/validate-core.js +113 -0
- package/dist/commands/validate-core.js.map +1 -0
- package/dist/commands/validate.d.ts +12 -2
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +62 -60
- package/dist/commands/validate.js.map +1 -1
- package/package.json +11 -6
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `refrakt stale` — staleness ranking for documentation references (SPEC-136,
|
|
3
|
+
* WORK-594).
|
|
4
|
+
*
|
|
5
|
+
* ```
|
|
6
|
+
* staleness = commits touching the target since the referrer last changed
|
|
7
|
+
* ```
|
|
8
|
+
*
|
|
9
|
+
* **This ranks. It never fails (D1).** No exit code on findings, no build
|
|
10
|
+
* failure, no required check, not even an opt-in flag to make it failing. The
|
|
11
|
+
* failure mode of getting that wrong is specific and fatal: the cheapest way to
|
|
12
|
+
* turn any edge green is to edit the referring page, so a gate would train
|
|
13
|
+
* people to make trivial documentation edits to clear it — actively destroying
|
|
14
|
+
* the signal it measures. The measure only survives if nothing depends on it
|
|
15
|
+
* being zero.
|
|
16
|
+
*
|
|
17
|
+
* **A refusal is a different event, and does exit non-zero.** D1 is about
|
|
18
|
+
* findings. Being unable to run at all — a shallow clone, a non-git tree —
|
|
19
|
+
* produced no answer, and a CI step that silently succeeds while measuring
|
|
20
|
+
* nothing is exactly the silent-wrong this feature exists to avoid.
|
|
21
|
+
*/
|
|
22
|
+
import { GitScanRefusal, runStale, StaleConfigRefusal, } from '@refrakt-md/content/edges';
|
|
23
|
+
function formatDate(seconds) {
|
|
24
|
+
if (seconds === undefined)
|
|
25
|
+
return 'untracked';
|
|
26
|
+
return new Date(seconds * 1000).toISOString().slice(0, 10);
|
|
27
|
+
}
|
|
28
|
+
/** The commit subjects are the report's whole value (D9). "11 commits" is a
|
|
29
|
+
* number; "generate breadcrumb and timeline positions from a declared index"
|
|
30
|
+
* is a person recognising that the page they wrote is out of date. */
|
|
31
|
+
function renderEntry(entry, out) {
|
|
32
|
+
const score = String(entry.score).padStart(3, ' ');
|
|
33
|
+
out.push(`${score} ${entry.edge.referrer} → ${entry.edge.target}`);
|
|
34
|
+
out.push(` last changed ${formatDate(entry.referrerChanged)} · target ${formatDate(entry.targetChanged)}`);
|
|
35
|
+
const shown = entry.commits.slice(0, 3);
|
|
36
|
+
for (const commit of shown) {
|
|
37
|
+
out.push(` ${commit.sha} ${commit.subject}`);
|
|
38
|
+
}
|
|
39
|
+
const remaining = entry.commits.length - shown.length;
|
|
40
|
+
if (remaining > 0)
|
|
41
|
+
out.push(` … ${remaining} more`);
|
|
42
|
+
out.push('');
|
|
43
|
+
}
|
|
44
|
+
export async function staleCommand(opts) {
|
|
45
|
+
const repoRoot = opts.repoRoot ?? process.cwd();
|
|
46
|
+
const top = opts.top ?? 10;
|
|
47
|
+
let result;
|
|
48
|
+
try {
|
|
49
|
+
// Content roots and both exclusion lists come from
|
|
50
|
+
// `refrakt.config.json`. Nothing about this repository's folder names is
|
|
51
|
+
// compiled in — every project's structure is its own.
|
|
52
|
+
result = runStale({
|
|
53
|
+
repoRoot,
|
|
54
|
+
contentDirs: opts.contentDirs,
|
|
55
|
+
edgeClass: opts.class,
|
|
56
|
+
min: opts.min,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (err instanceof GitScanRefusal || err instanceof StaleConfigRefusal) {
|
|
61
|
+
// Could not measure. Distinct from "measured, nothing wrong".
|
|
62
|
+
if (opts.format === 'json') {
|
|
63
|
+
process.stdout.write(`${JSON.stringify({ error: err.message, ranked: [] }, null, 2)}\n`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.stderr.write(`refrakt stale: ${err.message}\n`);
|
|
67
|
+
}
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
const shown = result.ranked.slice(0, top);
|
|
73
|
+
if (opts.format === 'json') {
|
|
74
|
+
process.stdout.write(`${JSON.stringify({
|
|
75
|
+
ranked: shown.map((e) => ({
|
|
76
|
+
referrer: e.edge.referrer,
|
|
77
|
+
line: e.edge.line,
|
|
78
|
+
target: e.edge.target,
|
|
79
|
+
class: e.edge.class,
|
|
80
|
+
score: e.score,
|
|
81
|
+
referrerChanged: e.referrerChanged,
|
|
82
|
+
targetChanged: e.targetChanged,
|
|
83
|
+
commits: e.commits,
|
|
84
|
+
})),
|
|
85
|
+
totalNonZero: result.totalNonZero,
|
|
86
|
+
baseRates: result.baseRates,
|
|
87
|
+
scanned: result.index.edges.length,
|
|
88
|
+
excluded: result.index.excluded,
|
|
89
|
+
}, null, 2)}\n`);
|
|
90
|
+
// Always zero. Findings are never a failure.
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
const out = [];
|
|
94
|
+
if (shown.length === 0) {
|
|
95
|
+
out.push('No stale edges found.');
|
|
96
|
+
out.push('');
|
|
97
|
+
out.push('A zero score is the absence of evidence of staleness, not evidence of freshness: the');
|
|
98
|
+
out.push('referrer side resets on any edit to the page, including one that changed nothing');
|
|
99
|
+
out.push('about what it claims.');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
out.push('Most likely stale, by commits to the target since the page last changed:');
|
|
103
|
+
out.push('');
|
|
104
|
+
for (const entry of shown)
|
|
105
|
+
renderEntry(entry, out);
|
|
106
|
+
if (result.totalNonZero > shown.length) {
|
|
107
|
+
out.push(`… ${result.totalNonZero - shown.length} more non-zero edges (--top ${top}).`);
|
|
108
|
+
out.push('');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// The footer states each class's base rate, so degradation in an
|
|
112
|
+
// extraction rule is visible rather than inferred.
|
|
113
|
+
const rates = result.baseRates.map((r) => `${r.class} ${r.nonZero}/${r.scanned}`).join(', ');
|
|
114
|
+
out.push(`Base rate — ${rates || 'no edges scanned'}.`);
|
|
115
|
+
// What the project's config removed, stated every run. An exclusion list
|
|
116
|
+
// that hides its own effect is how a report converges on empty without
|
|
117
|
+
// anyone deciding that it should.
|
|
118
|
+
const { archivalPages, generatedTargets } = result.index.excluded;
|
|
119
|
+
if (archivalPages > 0 || generatedTargets > 0) {
|
|
120
|
+
const parts = [];
|
|
121
|
+
if (archivalPages > 0)
|
|
122
|
+
parts.push(`${archivalPages} archival page(s) skipped`);
|
|
123
|
+
if (generatedTargets > 0)
|
|
124
|
+
parts.push(`${generatedTargets} edge(s) to generated targets`);
|
|
125
|
+
out.push(`Excluded by config — ${parts.join(', ')}.`);
|
|
126
|
+
}
|
|
127
|
+
process.stdout.write(`${out.join('\n')}\n`);
|
|
128
|
+
process.exit(0);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=stale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/commands/stale.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `refrakt theme validate` — the theme-authoring checks (SPEC-135 D12 /
|
|
3
|
+
* WORK-579).
|
|
4
|
+
*
|
|
5
|
+
* These moved off the bare `refrakt validate`, which now belongs to site
|
|
6
|
+
* authors. Three artifacts share the word "config" and only one of them is the
|
|
7
|
+
* site author's:
|
|
8
|
+
*
|
|
9
|
+
* | Artifact | Who writes it | Checked by |
|
|
10
|
+
* |---|---|---|
|
|
11
|
+
* | `refrakt.config.json` | site author | the published JSON Schema, and `refrakt config validate` |
|
|
12
|
+
* | `ThemeConfig` (`prefix`, rune configs) | theme author | `validateThemeConfig` — here |
|
|
13
|
+
* | Theme manifest | theme author | `validateManifest` — here |
|
|
14
|
+
*
|
|
15
|
+
* The `theme` group already holds `install`, `info` and `list`, so this slots
|
|
16
|
+
* in beside them rather than inventing a noun.
|
|
17
|
+
*/
|
|
18
|
+
export interface ThemeValidateOptions {
|
|
19
|
+
configPath?: string;
|
|
20
|
+
manifestPath?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function themeValidateCommand(opts: ThemeValidateOptions): void;
|
|
23
|
+
//# sourceMappingURL=theme-validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-validate.d.ts","sourceRoot":"","sources":["../../src/commands/theme-validate.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAmDrE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { validateThemeConfig, validateManifest, } from '@refrakt-md/transform';
|
|
4
|
+
export function themeValidateCommand(opts) {
|
|
5
|
+
let hasErrors = false;
|
|
6
|
+
// A validation command must never report success on nothing (SPEC-135 D2).
|
|
7
|
+
// The old behaviour here was the defect that rule was written for: handed no
|
|
8
|
+
// arguments, it validated refrakt's own `baseConfig` and printed a
|
|
9
|
+
// checkmark — a self-test of the library, reported as though it were a check
|
|
10
|
+
// of the user's work.
|
|
11
|
+
if (!opts.configPath && !opts.manifestPath) {
|
|
12
|
+
console.error('Nothing to validate.');
|
|
13
|
+
console.error('');
|
|
14
|
+
console.error(' refrakt theme validate --config <path> a ThemeConfig JSON file');
|
|
15
|
+
console.error(' refrakt theme validate --manifest <path> a theme manifest');
|
|
16
|
+
console.error('');
|
|
17
|
+
console.error('To validate a site’s content and config, use `refrakt validate`.');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
if (opts.configPath) {
|
|
21
|
+
const absPath = resolve(opts.configPath);
|
|
22
|
+
if (!existsSync(absPath)) {
|
|
23
|
+
console.error(`Error: Config file not found: ${absPath}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
// For now, only JSON configs are supported via CLI.
|
|
27
|
+
// TypeScript configs require dynamic import which needs the module to be built.
|
|
28
|
+
const raw = JSON.parse(readFileSync(absPath, 'utf-8'));
|
|
29
|
+
console.log('Validating theme config...');
|
|
30
|
+
const result = validateThemeConfig(raw);
|
|
31
|
+
printResult('Theme config', result);
|
|
32
|
+
if (!result.valid)
|
|
33
|
+
hasErrors = true;
|
|
34
|
+
}
|
|
35
|
+
if (opts.manifestPath) {
|
|
36
|
+
const absPath = resolve(opts.manifestPath);
|
|
37
|
+
if (!existsSync(absPath)) {
|
|
38
|
+
console.error(`Error: Manifest file not found: ${absPath}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const raw = JSON.parse(readFileSync(absPath, 'utf-8'));
|
|
42
|
+
console.log(`${opts.configPath ? '\n' : ''}Validating manifest...`);
|
|
43
|
+
const result = validateManifest(raw);
|
|
44
|
+
printResult('Manifest', result);
|
|
45
|
+
if (!result.valid)
|
|
46
|
+
hasErrors = true;
|
|
47
|
+
}
|
|
48
|
+
if (hasErrors) {
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function printResult(label, result) {
|
|
53
|
+
if (result.valid && result.warnings.length === 0) {
|
|
54
|
+
console.log(` ${label}: OK`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (result.errors.length > 0) {
|
|
58
|
+
console.log(` ${label}: FAIL (${result.errors.length} error${result.errors.length === 1 ? '' : 's'})`);
|
|
59
|
+
for (const err of result.errors) {
|
|
60
|
+
console.log(` ERROR ${err.path}: ${err.message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(` ${label}: OK`);
|
|
65
|
+
}
|
|
66
|
+
if (result.warnings.length > 0) {
|
|
67
|
+
console.log(` ${result.warnings.length} warning${result.warnings.length === 1 ? '' : 's'}:`);
|
|
68
|
+
for (const warn of result.warnings) {
|
|
69
|
+
console.log(` WARN ${warn.path}: ${warn.message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=theme-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-validate.js","sourceRoot":"","sources":["../../src/commands/theme-validate.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/theme.d.ts
CHANGED
|
@@ -8,8 +8,7 @@ export interface ThemeInstallOptions {
|
|
|
8
8
|
export interface ThemeInfoOptions {
|
|
9
9
|
site?: string;
|
|
10
10
|
}
|
|
11
|
-
export
|
|
12
|
-
}
|
|
11
|
+
export type ThemeListOptions = {};
|
|
13
12
|
/** Install a theme package and point a site's `theme` field at it. */
|
|
14
13
|
export declare function themeInstallCommand(options: ThemeInstallOptions): Promise<void>;
|
|
15
14
|
/** Show info about the currently configured theme. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/commands/theme.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/commands/theme.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAkBlC,sEAAsE;AACtE,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFrF;AAED,sDAAsD;AACtD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC/E;AAED;qBACqB;AACrB,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyChF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/commands/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,GACZ,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/commands/theme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { SiteConfig } from '@refrakt-md/types';
|
|
2
|
+
/**
|
|
3
|
+
* The config layer of `refrakt validate` (SPEC-135 D1 / WORK-578).
|
|
4
|
+
*
|
|
5
|
+
* **Checks resolution, not shape.** Shape-checking `refrakt.config.json` is the
|
|
6
|
+
* published JSON Schema's job and editors already do it. What nothing covered
|
|
7
|
+
* is whether the config's *names resolve*: does `theme.package` exist, does
|
|
8
|
+
* every entry in `plugins[]` load, do `routeRules` layout names exist, do
|
|
9
|
+
* `entityRoutes` types match a registered type. None of that is expressible in
|
|
10
|
+
* JSON Schema.
|
|
11
|
+
*
|
|
12
|
+
* It is not optional garnish. `packages/sveltekit/src/plugin.ts:166` catches a
|
|
13
|
+
* failed package load, warns to console, and continues with that plugin's runes
|
|
14
|
+
* **absent** — so post-SPEC-132 every use of them becomes a `tag-undefined`
|
|
15
|
+
* finding. Dozens of errors against content that is perfectly correct, cause:
|
|
16
|
+
* one line of config. Running this first, and letting it explain the findings it
|
|
17
|
+
* would cause, is what stops the symptom drowning the cause.
|
|
18
|
+
*/
|
|
19
|
+
export interface ConfigFinding {
|
|
20
|
+
severity: 'error' | 'warning' | 'info';
|
|
21
|
+
/** Dotted config path, e.g. `sites.main.plugins[2]`. */
|
|
22
|
+
path: string;
|
|
23
|
+
message: string;
|
|
24
|
+
/** Set when this failure is known to *cause* content findings — the CLI
|
|
25
|
+
* uses it to explain `tag-undefined` rather than reporting both as peers. */
|
|
26
|
+
causesMissingRunes?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface ValidateConfigOptions {
|
|
29
|
+
/** Directory to resolve `theme.package` and `plugins[]` from. */
|
|
30
|
+
configDir: string;
|
|
31
|
+
/** Site name, used only to path findings. */
|
|
32
|
+
siteName: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function validateSiteConfig(site: SiteConfig, opts: ValidateConfigOptions): ConfigFinding[];
|
|
35
|
+
//# sourceMappingURL=validate-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../src/commands/validate-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB;kFAC8E;IAC9E,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACrC,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;CACjB;AA6BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,qBAAqB,GAAG,aAAa,EAAE,CAwEjG"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { resolve, isAbsolute } from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { getThemePackage } from '@refrakt-md/types';
|
|
5
|
+
/** Can this specifier be resolved from `configDir`? */
|
|
6
|
+
function canResolve(specifier, configDir) {
|
|
7
|
+
// A relative or absolute path is a file, not a package.
|
|
8
|
+
if (specifier.startsWith('.') || isAbsolute(specifier)) {
|
|
9
|
+
return existsSync(resolve(configDir, specifier));
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
// `createRequire` resolves the way Node would from this directory,
|
|
13
|
+
// including workspace symlinks — which is what the adapters do at build
|
|
14
|
+
// time, so a package that resolves here resolves there.
|
|
15
|
+
const req = createRequire(resolve(configDir, 'package.json'));
|
|
16
|
+
req.resolve(specifier);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// A package can be importable without a resolvable main entry (exports
|
|
21
|
+
// maps without a "." key). Fall back to asking whether the directory is
|
|
22
|
+
// there at all before calling it missing.
|
|
23
|
+
try {
|
|
24
|
+
const req = createRequire(resolve(configDir, 'package.json'));
|
|
25
|
+
req.resolve(`${specifier}/package.json`);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function validateSiteConfig(site, opts) {
|
|
34
|
+
const findings = [];
|
|
35
|
+
const base = `sites.${opts.siteName}`;
|
|
36
|
+
// theme.package — the theme supplies every rune config and the layouts, so
|
|
37
|
+
// an unresolvable one is not a partial failure.
|
|
38
|
+
if (site.theme !== undefined) {
|
|
39
|
+
const themePackage = getThemePackage(site.theme);
|
|
40
|
+
if (themePackage && !canResolve(themePackage, opts.configDir)) {
|
|
41
|
+
findings.push({
|
|
42
|
+
severity: 'error',
|
|
43
|
+
path: `${base}.theme`,
|
|
44
|
+
message: `theme package "${themePackage}" cannot be resolved from ${opts.configDir}`,
|
|
45
|
+
causesMissingRunes: true,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// plugins[] — the load-bearing one. A failed plugin load is swallowed at
|
|
50
|
+
// build time, and every rune it would have contributed becomes tag-undefined.
|
|
51
|
+
for (const [i, name] of (site.plugins ?? []).entries()) {
|
|
52
|
+
if (typeof name !== 'string' || !name) {
|
|
53
|
+
findings.push({
|
|
54
|
+
severity: 'error',
|
|
55
|
+
path: `${base}.plugins[${i}]`,
|
|
56
|
+
message: 'plugin entry must be a non-empty string',
|
|
57
|
+
});
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (!canResolve(name, opts.configDir)) {
|
|
61
|
+
findings.push({
|
|
62
|
+
severity: 'error',
|
|
63
|
+
path: `${base}.plugins[${i}]`,
|
|
64
|
+
message: `plugin "${name}" cannot be resolved from ${opts.configDir} — every rune it contributes will be reported as an undefined tag`,
|
|
65
|
+
causesMissingRunes: true,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// routeRules[].layout — a layout name that matches nothing falls back
|
|
70
|
+
// silently, so a typo costs the page its intended layout with no signal.
|
|
71
|
+
const declaredLayouts = collectDeclaredLayouts(site);
|
|
72
|
+
for (const [i, rule] of (site.routeRules ?? []).entries()) {
|
|
73
|
+
const layout = rule.layout;
|
|
74
|
+
if (typeof layout !== 'string' || !layout)
|
|
75
|
+
continue;
|
|
76
|
+
// Only judge when we actually know the layout set. An unresolvable theme
|
|
77
|
+
// means we cannot enumerate layouts, and guessing would produce a second
|
|
78
|
+
// wave of errors whose real cause is already reported above.
|
|
79
|
+
if (declaredLayouts === undefined)
|
|
80
|
+
continue;
|
|
81
|
+
if (!declaredLayouts.has(layout)) {
|
|
82
|
+
findings.push({
|
|
83
|
+
severity: 'error',
|
|
84
|
+
path: `${base}.routeRules[${i}].layout`,
|
|
85
|
+
message: `layout "${layout}" is not declared by the theme (known: ${[...declaredLayouts].sort().join(', ') || 'none'})`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// entityRoutes[].type — a type nothing registers produces no pages at all,
|
|
90
|
+
// silently: the rule simply never matches.
|
|
91
|
+
for (const [i, rule] of (readEntityRoutes(site) ?? []).entries()) {
|
|
92
|
+
const type = rule.type;
|
|
93
|
+
if (typeof type !== 'string' || !type) {
|
|
94
|
+
findings.push({
|
|
95
|
+
severity: 'error',
|
|
96
|
+
path: `${base}.entityRoutes[${i}].type`,
|
|
97
|
+
message: 'entityRoutes rule must declare a non-empty `type`',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return findings;
|
|
102
|
+
}
|
|
103
|
+
/** Layout names the site's theme declares, or `undefined` when the theme could
|
|
104
|
+
* not be read — in which case the caller must not judge layout references. */
|
|
105
|
+
function collectDeclaredLayouts(site) {
|
|
106
|
+
const theme = site.theme;
|
|
107
|
+
if (typeof theme === 'object' && theme !== null) {
|
|
108
|
+
const layouts = theme.layouts;
|
|
109
|
+
if (layouts && typeof layouts === 'object')
|
|
110
|
+
return new Set(Object.keys(layouts));
|
|
111
|
+
}
|
|
112
|
+
// The theme's layout set lives in its manifest / layout config, which
|
|
113
|
+
// resolving here would mean importing the theme package. Deliberately not
|
|
114
|
+
// done: it is the expensive half, and a wrong `layout` name is caught by the
|
|
115
|
+
// layout cascade at build time anyway. Returning undefined suppresses the
|
|
116
|
+
// check rather than guessing.
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
function readEntityRoutes(site) {
|
|
120
|
+
const raw = site.entityRoutes;
|
|
121
|
+
return Array.isArray(raw) ? raw : undefined;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=validate-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-config.js","sourceRoot":"","sources":["../../src/commands/validate-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The validation run itself — shared by `refrakt validate` and the
|
|
3
|
+
* `refrakt.validate` MCP tool (SPEC-135 D6 / WORK-581).
|
|
4
|
+
*
|
|
5
|
+
* Returns data. It never prints and never calls `process.exit`, so the CLI can
|
|
6
|
+
* format and gate while MCP returns structured findings from the same code.
|
|
7
|
+
* The alternative — an MCP tool that shells out to the CLI and parses its
|
|
8
|
+
* output — would be a worse CLI, and would put a second copy of the layering
|
|
9
|
+
* rules somewhere they could drift.
|
|
10
|
+
*/
|
|
11
|
+
import { type ConfigFinding } from './validate-config.js';
|
|
12
|
+
export interface ValidateRunOptions {
|
|
13
|
+
/** Restrict to one site. Omitted means every site in the config. */
|
|
14
|
+
site?: string;
|
|
15
|
+
/** Narrow to one layer. Both run when omitted. */
|
|
16
|
+
only?: 'content' | 'config';
|
|
17
|
+
/** Run the cross-page tier — a full pipeline run (SPEC-135 D3). */
|
|
18
|
+
deep?: boolean;
|
|
19
|
+
/** Path to `refrakt.config.json`. Default: `<cwd>/refrakt.config.json`. */
|
|
20
|
+
configPath?: string;
|
|
21
|
+
/** Directory to resolve a relative `configPath` against. Default: `cwd`. */
|
|
22
|
+
cwd?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ContentFindingOut {
|
|
25
|
+
file: string;
|
|
26
|
+
url: string;
|
|
27
|
+
line?: number;
|
|
28
|
+
severity: 'error' | 'warning' | 'info';
|
|
29
|
+
id?: string;
|
|
30
|
+
message: string;
|
|
31
|
+
}
|
|
32
|
+
export interface SiteResult {
|
|
33
|
+
site: string;
|
|
34
|
+
config: ConfigFinding[];
|
|
35
|
+
content: ContentFindingOut[];
|
|
36
|
+
/** Set when the config layer found a failure that makes content findings
|
|
37
|
+
* untrustworthy, so a report can say so rather than listing both as peers. */
|
|
38
|
+
contentSuppressed?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ValidateRunResult {
|
|
41
|
+
/** Whole-run failure — no config, unparseable config, unknown site. When
|
|
42
|
+
* set, `sites` is empty and the run validated nothing (D2). */
|
|
43
|
+
error?: string;
|
|
44
|
+
sites: SiteResult[];
|
|
45
|
+
/** Path the run resolved its config from, for a caller that wants to say so. */
|
|
46
|
+
configPath: string;
|
|
47
|
+
}
|
|
48
|
+
/** True when anything in the run is at error severity. The gate (D4). */
|
|
49
|
+
export declare function hasErrors(result: ValidateRunResult): boolean;
|
|
50
|
+
export declare function runValidation(opts?: ValidateRunOptions): Promise<ValidateRunResult>;
|
|
51
|
+
//# sourceMappingURL=validate-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-core.d.ts","sourceRoot":"","sources":["../../src/commands/validate-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IAClC,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,mEAAmE;IACnE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B;mFAC+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IACjC;oEACgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAM5D;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqG7F"}
|