@isaacriehm/cairn-core 0.19.0 → 0.19.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/dist/.tsbuildinfo +1 -1
- package/dist/components/audit.d.ts +13 -2
- package/dist/components/audit.js +111 -14
- package/dist/components/audit.js.map +1 -1
- package/package.json +2 -2
|
@@ -5,12 +5,23 @@
|
|
|
5
5
|
* 1. Probable inline rebuilds — `className` lists in non-component code
|
|
6
6
|
* whose Tailwind utility ROOTS closely match an indexed component's
|
|
7
7
|
* (max-w-2xl ≈ max-w-4xl, so value-tweaked copies still match).
|
|
8
|
+
* Similarity is IDF-weighted over the component corpus: a utility root
|
|
9
|
+
* that nearly every component uses (`flex`, `gap`, `mx`, `px`) carries
|
|
10
|
+
* almost no weight, so a page sharing only generic layout scaffolding
|
|
11
|
+
* does NOT match — only overlap on DISTINCTIVE class roots counts. This
|
|
12
|
+
* is self-tuning to the project's own CSS; no hardcoded utility list.
|
|
8
13
|
* 2. Name collisions — `@cairn` names colliding with a type/interface name.
|
|
14
|
+
* 3. Unregistered components — a component-shaped file (PascalCase
|
|
15
|
+
* basename, real exports, JSX markup) sitting OUTSIDE the declared
|
|
16
|
+
* component dirs. These are co-located components the registry can't
|
|
17
|
+
* see; route entry files (page.tsx/layout.tsx — lowercase) are
|
|
18
|
+
* naturally excluded, so no framework convention list is hardcoded.
|
|
19
|
+
* Surfaced as an offer to relocate or register the dir — never moved.
|
|
9
20
|
*
|
|
10
21
|
* Findings are triage input surfaced to the attention queue with EXTEND /
|
|
11
|
-
* rename recommendations; never auto-fixed.
|
|
22
|
+
* rename / register recommendations; never auto-fixed.
|
|
12
23
|
*/
|
|
13
|
-
export type ComponentAuditKind = "inline-rebuild" | "name-collision";
|
|
24
|
+
export type ComponentAuditKind = "inline-rebuild" | "name-collision" | "unregistered-component";
|
|
14
25
|
export interface ComponentAuditFinding {
|
|
15
26
|
kind: ComponentAuditKind;
|
|
16
27
|
/** Where the probable violation lives (repo-relative POSIX). */
|
package/dist/components/audit.js
CHANGED
|
@@ -5,18 +5,34 @@
|
|
|
5
5
|
* 1. Probable inline rebuilds — `className` lists in non-component code
|
|
6
6
|
* whose Tailwind utility ROOTS closely match an indexed component's
|
|
7
7
|
* (max-w-2xl ≈ max-w-4xl, so value-tweaked copies still match).
|
|
8
|
+
* Similarity is IDF-weighted over the component corpus: a utility root
|
|
9
|
+
* that nearly every component uses (`flex`, `gap`, `mx`, `px`) carries
|
|
10
|
+
* almost no weight, so a page sharing only generic layout scaffolding
|
|
11
|
+
* does NOT match — only overlap on DISTINCTIVE class roots counts. This
|
|
12
|
+
* is self-tuning to the project's own CSS; no hardcoded utility list.
|
|
8
13
|
* 2. Name collisions — `@cairn` names colliding with a type/interface name.
|
|
14
|
+
* 3. Unregistered components — a component-shaped file (PascalCase
|
|
15
|
+
* basename, real exports, JSX markup) sitting OUTSIDE the declared
|
|
16
|
+
* component dirs. These are co-located components the registry can't
|
|
17
|
+
* see; route entry files (page.tsx/layout.tsx — lowercase) are
|
|
18
|
+
* naturally excluded, so no framework convention list is hardcoded.
|
|
19
|
+
* Surfaced as an offer to relocate or register the dir — never moved.
|
|
9
20
|
*
|
|
10
21
|
* Findings are triage input surfaced to the attention queue with EXTEND /
|
|
11
|
-
* rename recommendations; never auto-fixed.
|
|
22
|
+
* rename / register recommendations; never auto-fixed.
|
|
12
23
|
*/
|
|
13
24
|
import { readFileSync } from "node:fs";
|
|
14
25
|
import { join } from "node:path";
|
|
15
|
-
import { collectComponents, hasComponentConfig, loadComponentsConfig, walkFs, } from "@isaacriehm/cairn-state";
|
|
16
|
-
import { jaccard } from "../text/jaccard.js";
|
|
26
|
+
import { collectComponents, extractExportName, extractExportNames, hasComponentConfig, loadComponentsConfig, walkFs, } from "@isaacriehm/cairn-state";
|
|
17
27
|
const SIMILARITY_THRESHOLD = 0.7;
|
|
18
28
|
const MIN_SHARED_ROOTS = 3;
|
|
19
29
|
const MIN_CLASSES = 3;
|
|
30
|
+
/**
|
|
31
|
+
* A shared root only counts toward MIN_SHARED_ROOTS if it is distinctive —
|
|
32
|
+
* idf ≥ ln(2), i.e. the root appears in fewer than ~half of all components.
|
|
33
|
+
* Ubiquitous layout utilities fall below this and never satisfy the gate.
|
|
34
|
+
*/
|
|
35
|
+
const IDF_DISTINCTIVE_FLOOR = Math.log(2);
|
|
20
36
|
const CLASS_ATTR_RE = /className\s*=\s*(?:"([^"]+)"|'([^']+)'|\{`([^`]+)`\})/g;
|
|
21
37
|
const VALUE_SUFFIX = /-(?:\d[^-]*|xs|sm|md|lg|xl|\dxl|auto|full|none|screen|px)$/;
|
|
22
38
|
const SKIP_DIRS = new Set([".git", ".cairn", "node_modules", "dist", ".next", "build", "coverage"]);
|
|
@@ -43,18 +59,38 @@ function classLists(source) {
|
|
|
43
59
|
}
|
|
44
60
|
return lists;
|
|
45
61
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
let shared = 0;
|
|
50
|
-
for (const r of ra)
|
|
51
|
-
if (rb.has(r))
|
|
52
|
-
shared += 1;
|
|
53
|
-
return { score: jaccard(ra, rb), shared };
|
|
62
|
+
/** Distinct utility roots of a class list. */
|
|
63
|
+
function rootSet(classes) {
|
|
64
|
+
return new Set(classes.map(utilityRoot));
|
|
54
65
|
}
|
|
55
66
|
function inComponentDirs(rel, config) {
|
|
56
67
|
return config.workspaces.some((ws) => ws.componentDirs.some((d) => rel === d || rel.startsWith(`${d}/`)));
|
|
57
68
|
}
|
|
69
|
+
/** JSX markup signal — a tag or a className attribute. */
|
|
70
|
+
const JSX_RE = /<[A-Za-z][^>]*\/?>|className\s*=/;
|
|
71
|
+
/**
|
|
72
|
+
* If a file outside the component dirs looks like a misplaced COMPONENT
|
|
73
|
+
* (rather than a hook/context/util, or markup duplicated inside
|
|
74
|
+
* non-component code), return its exported names; otherwise null. Three
|
|
75
|
+
* convention-based signals, no framework list:
|
|
76
|
+
* 1. PascalCase basename — named component files are `FeaturedShell.tsx`;
|
|
77
|
+
* framework route entry files are lowercase (`page.tsx`, `layout.tsx`).
|
|
78
|
+
* 2. Exports a PascalCase symbol — a component-like export exists (a file
|
|
79
|
+
* exporting only `useThing` / consts is a hook/util, not a component).
|
|
80
|
+
* 3. Renders JSX — excludes type-only / pure-logic files.
|
|
81
|
+
*/
|
|
82
|
+
function misplacedComponentExports(rel, source) {
|
|
83
|
+
const base = rel.slice(rel.lastIndexOf("/") + 1);
|
|
84
|
+
const stem = base.includes(".") ? base.slice(0, base.indexOf(".")) : base;
|
|
85
|
+
if (!/^[A-Z][a-z]/.test(stem))
|
|
86
|
+
return null;
|
|
87
|
+
const names = extractExportNames(source);
|
|
88
|
+
if (!names.some((n) => /^[A-Z][a-z]/.test(n)))
|
|
89
|
+
return null;
|
|
90
|
+
if (!JSX_RE.test(source))
|
|
91
|
+
return null;
|
|
92
|
+
return names;
|
|
93
|
+
}
|
|
58
94
|
export function runComponentAudit(repoRoot) {
|
|
59
95
|
const config = loadComponentsConfig(repoRoot);
|
|
60
96
|
if (!hasComponentConfig(config))
|
|
@@ -66,6 +102,7 @@ export function runComponentAudit(repoRoot) {
|
|
|
66
102
|
const findings = [];
|
|
67
103
|
let scanned = 0;
|
|
68
104
|
// ── 1. Inline-rebuild scan ────────────────────────────────────────────
|
|
105
|
+
// Each component's className lists, with utility roots precomputed.
|
|
69
106
|
const signatures = components
|
|
70
107
|
.map((c) => {
|
|
71
108
|
let src = "";
|
|
@@ -75,9 +112,48 @@ export function runComponentAudit(repoRoot) {
|
|
|
75
112
|
catch {
|
|
76
113
|
/* skip unreadable */
|
|
77
114
|
}
|
|
78
|
-
|
|
115
|
+
const lists = classLists(src).map((l) => ({
|
|
116
|
+
line: l.line,
|
|
117
|
+
roots: rootSet(l.classes),
|
|
118
|
+
}));
|
|
119
|
+
return { name: c.tags.cairn ?? "?", file: c.file, lists };
|
|
79
120
|
})
|
|
80
121
|
.filter((c) => c.lists.length > 0);
|
|
122
|
+
// Corpus IDF: how distinctive each utility root is. A root present in many
|
|
123
|
+
// components (df → N) gets idf → 0; a rare root gets a high weight. Document
|
|
124
|
+
// = one component (union of its lists' roots), so repetition within a file
|
|
125
|
+
// doesn't inflate frequency.
|
|
126
|
+
const corpusN = signatures.length;
|
|
127
|
+
const docFreq = new Map();
|
|
128
|
+
for (const c of signatures) {
|
|
129
|
+
const compRoots = new Set();
|
|
130
|
+
for (const l of c.lists)
|
|
131
|
+
for (const r of l.roots)
|
|
132
|
+
compRoots.add(r);
|
|
133
|
+
for (const r of compRoots)
|
|
134
|
+
docFreq.set(r, (docFreq.get(r) ?? 0) + 1);
|
|
135
|
+
}
|
|
136
|
+
const idf = (root) => Math.log((corpusN + 1) / ((docFreq.get(root) ?? 0) + 1));
|
|
137
|
+
// IDF-weighted Jaccard between two root sets, plus the count of shared
|
|
138
|
+
// DISTINCTIVE roots (ubiquitous roots don't count toward the gate).
|
|
139
|
+
const weightedSimilarity = (target, comp) => {
|
|
140
|
+
let inter = 0;
|
|
141
|
+
let union = 0;
|
|
142
|
+
let shared = 0;
|
|
143
|
+
for (const r of target) {
|
|
144
|
+
const w = idf(r);
|
|
145
|
+
union += w;
|
|
146
|
+
if (comp.has(r)) {
|
|
147
|
+
inter += w;
|
|
148
|
+
if (w >= IDF_DISTINCTIVE_FLOOR)
|
|
149
|
+
shared += 1;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
for (const r of comp)
|
|
153
|
+
if (!target.has(r))
|
|
154
|
+
union += idf(r);
|
|
155
|
+
return { score: union > 0 ? inter / union : 0, shared };
|
|
156
|
+
};
|
|
81
157
|
// ── 2. Name-collision prep ────────────────────────────────────────────
|
|
82
158
|
const nameToComponent = new Map();
|
|
83
159
|
for (const c of components)
|
|
@@ -105,14 +181,35 @@ export function runComponentAudit(repoRoot) {
|
|
|
105
181
|
scanned += 1;
|
|
106
182
|
// Inline rebuild — only in non-component code with a UI extension.
|
|
107
183
|
if (extensions.has(ext) && !inComponentDirs(rel, config)) {
|
|
184
|
+
// A component-shaped file outside the component dirs is not a
|
|
185
|
+
// rebuild — it is a co-located component the registry can't see.
|
|
186
|
+
// Surface it (with its export names + file) as an offer to
|
|
187
|
+
// relocate/register; skip the rebuild scan for it.
|
|
188
|
+
const exports = misplacedComponentExports(rel, source);
|
|
189
|
+
if (exports !== null) {
|
|
190
|
+
const primary = extractExportName(source) ?? exports[0];
|
|
191
|
+
const others = exports.filter((n) => n !== primary);
|
|
192
|
+
const dirs = config.workspaces.flatMap((w) => w.componentDirs).join(", ");
|
|
193
|
+
findings.push({
|
|
194
|
+
kind: "unregistered-component",
|
|
195
|
+
file: rel,
|
|
196
|
+
component: primary,
|
|
197
|
+
componentFile: rel,
|
|
198
|
+
message: `${primary} (${rel})${others.length > 0 ? ` — also exports ${others.join(", ")}` : ""} ` +
|
|
199
|
+
`looks like a component but lives outside the declared component dir(s) (${dirs}); the registry can't see it`,
|
|
200
|
+
recommendation: `move ${rel} into a component dir, or add its directory to the workspace's componentDirs — then header + index ${primary}`,
|
|
201
|
+
});
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
108
204
|
for (const target of classLists(source)) {
|
|
205
|
+
const troots = rootSet(target.classes);
|
|
109
206
|
let best = null;
|
|
110
207
|
for (const comp of signatures) {
|
|
111
208
|
for (const list of comp.lists) {
|
|
112
|
-
const { score, shared } =
|
|
209
|
+
const { score, shared } = weightedSimilarity(troots, list.roots);
|
|
113
210
|
if (score >= SIMILARITY_THRESHOLD && shared >= MIN_SHARED_ROOTS) {
|
|
114
211
|
if (best === null || score > best.score) {
|
|
115
|
-
best = { name: comp.name, file: comp.file,
|
|
212
|
+
best = { name: comp.name, file: comp.file, score };
|
|
116
213
|
}
|
|
117
214
|
}
|
|
118
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/components/audit.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/components/audit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@isaacriehm/cairn-core",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.1",
|
|
4
4
|
"description": "Cairn core — state + context layer. Curated `.cairn/ground/` (decisions, §INV invariants, canonical-map, brand, quality-grades), MCP server, init wizard, hook runners, sensors, GC drift sweep.",
|
|
5
5
|
"author": "Isaac Riehm",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"simple-git": "^3.36.0",
|
|
40
40
|
"yaml": "^2.9.0",
|
|
41
41
|
"zod": "^4.4.3",
|
|
42
|
-
"@isaacriehm/cairn-state": "0.19.
|
|
42
|
+
"@isaacriehm/cairn-state": "0.19.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/cli-progress": "^3.11.6",
|