@descent-vtt/spec-guard 0.6.0 → 0.8.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.
Files changed (48) hide show
  1. package/CHANGELOG.md +132 -8
  2. package/README.md +191 -9
  3. package/dist/cli.d.ts +17 -2
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +127 -7
  6. package/dist/cli.js.map +1 -1
  7. package/dist/glob.d.ts +25 -2
  8. package/dist/glob.d.ts.map +1 -1
  9. package/dist/glob.js +26 -9
  10. package/dist/glob.js.map +1 -1
  11. package/dist/index.d.ts +17 -7
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +8 -3
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp.d.ts +117 -0
  16. package/dist/mcp.d.ts.map +1 -0
  17. package/dist/mcp.js +545 -0
  18. package/dist/mcp.js.map +1 -0
  19. package/dist/parser.d.ts +25 -0
  20. package/dist/parser.d.ts.map +1 -1
  21. package/dist/parser.js +71 -15
  22. package/dist/parser.js.map +1 -1
  23. package/dist/query.d.ts +108 -0
  24. package/dist/query.d.ts.map +1 -0
  25. package/dist/query.js +211 -0
  26. package/dist/query.js.map +1 -0
  27. package/dist/reporter.d.ts.map +1 -1
  28. package/dist/reporter.js +13 -4
  29. package/dist/reporter.js.map +1 -1
  30. package/dist/rules.d.ts +119 -0
  31. package/dist/rules.d.ts.map +1 -0
  32. package/dist/rules.js +197 -0
  33. package/dist/rules.js.map +1 -0
  34. package/dist/runner.d.ts +19 -0
  35. package/dist/runner.d.ts.map +1 -1
  36. package/dist/runner.js +289 -97
  37. package/dist/runner.js.map +1 -1
  38. package/dist/specs.d.ts +44 -0
  39. package/dist/specs.d.ts.map +1 -0
  40. package/dist/specs.js +62 -0
  41. package/dist/specs.js.map +1 -0
  42. package/dist/structure.d.ts +104 -0
  43. package/dist/structure.d.ts.map +1 -0
  44. package/dist/structure.js +253 -0
  45. package/dist/structure.js.map +1 -0
  46. package/dist/types.d.ts +33 -3
  47. package/dist/types.d.ts.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,253 @@
1
+ /**
2
+ * `@assert-structure`: what files are called, what directories hold, and which
3
+ * files come in pairs. ADR-0013.
4
+ *
5
+ * Names only. Nothing here reads a file's contents, and nothing asks the
6
+ * filesystem whether a path exists: a path exists when its name is in its
7
+ * parent's listing, compared exactly. A lookup of `README.md` finds `Readme.md`
8
+ * on Windows and macOS and does not on Linux, and a rule about names that
9
+ * answers one way on a laptop and the other in CI is not a rule about names.
10
+ */
11
+ import path from 'node:path';
12
+ import { comparePaths } from './engine.js';
13
+ import { createExcludeMatcher, createGlobMatcher, defaultDirectoryReader, globToRegExp, isGlob, toPosix, walkPaths, } from './glob.js';
14
+ import { LedgerBuilder, UNCERTAIN_REASONS } from './scope.js';
15
+ export function createTreeIndex(root, readDirectory = defaultDirectoryReader) {
16
+ // Each directory's read, by its path from the root, kept twice over: as the
17
+ // reader returned it, for the walk - which needs a failed read to fail, and
18
+ // sorts in place a list that is then already sorted - and as a lookup by
19
+ // name, built once. Keyed by the relative path rather than the absolute one
20
+ // because a lookup names every directory on its way, and joining an absolute
21
+ // path per segment was most of what a partner rule cost over ten thousand
22
+ // files.
23
+ const reads = new Map();
24
+ const walks = new Map();
25
+ const read = (relativeDirectory) => {
26
+ let cached = reads.get(relativeDirectory);
27
+ if (!cached) {
28
+ const entries = readDirectory(path.join(root, relativeDirectory));
29
+ const listing = entries.then((found) => new Map(found.map((entry) => [entry.name, entry])), () => null);
30
+ cached = { entries, listing };
31
+ reads.set(relativeDirectory, cached);
32
+ }
33
+ return cached;
34
+ };
35
+ const listing = async (relativeDirectory) => {
36
+ let current = await read('.').listing;
37
+ if (relativeDirectory === '.')
38
+ return current;
39
+ const names = relativeDirectory.split('/');
40
+ for (const [depth, name] of names.entries()) {
41
+ if (current?.get(name)?.isDirectory() !== true)
42
+ return null;
43
+ current = await read(names.slice(0, depth + 1).join('/')).listing;
44
+ }
45
+ return current;
46
+ };
47
+ const walk = (target, scope) => {
48
+ const key = JSON.stringify([target, [...scope.skippedDirectories.keys()]]);
49
+ let pending = walks.get(key);
50
+ if (!pending) {
51
+ pending = (async () => {
52
+ const tree = { files: [], directories: [], gaps: [] };
53
+ const fromRoot = (relativePath) => path.posix.join(target, relativePath);
54
+ const walked = walkPaths(path.join(root, target), {
55
+ scope,
56
+ readDirectory: (directory) => read(toPosix(path.relative(root, directory)) || '.').entries,
57
+ onDirectory: (relativePath) => tree.directories.push(fromRoot(relativePath)),
58
+ // Only the gaps. `.git` and `node_modules` are the run's policy, and
59
+ // are no more news here than they are to a search.
60
+ onSkip: (relativePath, reason) => {
61
+ if (UNCERTAIN_REASONS.has(reason))
62
+ tree.gaps.push(fromRoot(relativePath));
63
+ },
64
+ });
65
+ for await (const file of walked)
66
+ tree.files.push(fromRoot(file.relativePath));
67
+ return tree;
68
+ })();
69
+ walks.set(key, pending);
70
+ }
71
+ return pending;
72
+ };
73
+ return { listing, walk };
74
+ }
75
+ /** What a root-relative path is, by name - or null, which a link is too. */
76
+ async function kindOf(index, relativePath) {
77
+ if (relativePath === '.')
78
+ return 'directory';
79
+ const entry = (await index.listing(path.posix.dirname(relativePath)))?.get(path.posix.basename(relativePath));
80
+ return entry?.isDirectory() ? 'directory' : entry?.isFile() ? 'file' : null;
81
+ }
82
+ /**
83
+ * Whether a directory holds a required entry: a file, or a directory when it
84
+ * ends in `/` - which `basename` and `dirname` both already ignore.
85
+ */
86
+ async function holds(index, directory, entry) {
87
+ const wantsDirectory = entry.endsWith('/');
88
+ const named = globToRegExp(path.posix.basename(entry));
89
+ const listing = await index.listing(path.posix.join(directory, path.posix.dirname(entry)));
90
+ return [...(listing?.values() ?? [])].some((item) => named.test(item.name) && (wantsDirectory ? item.isDirectory() : item.isFile()));
91
+ }
92
+ /* -------------------------------------------------------------- the grammar */
93
+ const PLACEHOLDER = /\[(name|ext|dir)\]/g;
94
+ /**
95
+ * The path a partner template names for a file.
96
+ *
97
+ * `[name]` is the base name up to its last dot and `[ext]` is what follows it;
98
+ * a name whose only dot leads it, like `.env`, is all name. `[dir]` is the
99
+ * file's directory below the target it was found from - empty for a file at the
100
+ * top, or for a target that is the file itself - and a segment left empty leaves
101
+ * no separator behind. A template without a `/` names a sibling; a template
102
+ * with one names a path from the root.
103
+ *
104
+ * That is the whole grammar, and it is small on purpose: a reader can expand a
105
+ * template by eye, which is the property a substitution engine gives up.
106
+ */
107
+ export function expandPartner(template, file, target) {
108
+ const directory = path.posix.dirname(file);
109
+ const base = path.posix.basename(file);
110
+ const dot = base.lastIndexOf('.');
111
+ const values = {
112
+ name: dot > 0 ? base.slice(0, dot) : base,
113
+ ext: dot > 0 ? base.slice(dot + 1) : '',
114
+ dir: path.posix.relative(file === target ? directory : target, directory),
115
+ };
116
+ const filled = template
117
+ .split('/')
118
+ .map((segment) => segment.replace(PLACEHOLDER, (_, key) => values[key]))
119
+ .filter((segment) => segment.length > 0)
120
+ .join('/');
121
+ return template.includes('/') ? filled : path.posix.join(directory, filled);
122
+ }
123
+ /** Why a partner template cannot be used, or null when it can. */
124
+ export function partnerTemplateIssue(template) {
125
+ const literal = template.replace(PLACEHOLDER, '');
126
+ const unknown = /\[[^\]]*\]/.exec(literal);
127
+ if (unknown) {
128
+ return `Partner template "${template}" uses ${unknown[0]}; the placeholders are [name], [ext] and [dir].`;
129
+ }
130
+ if (isGlob(literal)) {
131
+ return `Partner template "${template}" is a name, not a glob, so it cannot hold *, ?, [, ], { or }.`;
132
+ }
133
+ if (template.split('/').some((segment) => segment === '' || segment === '.' || segment === '..')) {
134
+ return `Partner template "${template}" must be a path inside the root, with no empty, "." or ".." segment.`;
135
+ }
136
+ return null;
137
+ }
138
+ /** Why a required entry cannot be used, or null when it can. */
139
+ export function requiredEntryIssue(entry) {
140
+ const segments = entry.replace(/\/$/, '').split('/');
141
+ if (segments.some((segment) => segment === '' || segment === '.' || segment === '..')) {
142
+ return `Required entry "${entry}" must be a path inside the directory, with no empty, "." or ".." segment.`;
143
+ }
144
+ if (segments.slice(0, -1).some(isGlob)) {
145
+ return `Required entry "${entry}" can use a glob only in its last segment.`;
146
+ }
147
+ return null;
148
+ }
149
+ /**
150
+ * Holds every file or directory in scope to the claim.
151
+ *
152
+ * A subject is counted once, with the first target that reaches it - which is
153
+ * the target `[dir]` is measured from when two targets overlap.
154
+ */
155
+ export async function checkStructure(query, request, index) {
156
+ const excluded = createExcludeMatcher(request.excludeGlobs);
157
+ const included = createGlobMatcher(request.globs);
158
+ const required = query.claim === 'required';
159
+ const selects = query.dirs === undefined ? null : globToRegExp(query.dirs);
160
+ const missing = [];
161
+ const notDirectories = [];
162
+ const gaps = new Set();
163
+ const subjects = new Map();
164
+ const add = (subject, target) => {
165
+ if (!subjects.has(subject))
166
+ subjects.set(subject, target);
167
+ };
168
+ for (const target of request.targets) {
169
+ const kind = await kindOf(index, target);
170
+ if (kind === 'file') {
171
+ if (required)
172
+ notDirectories.push(target);
173
+ else if (included(target) && !excluded(target))
174
+ add(target, target);
175
+ }
176
+ else if (kind !== 'directory') {
177
+ missing.push(target);
178
+ }
179
+ else if (required && selects === null) {
180
+ if (!excluded(target))
181
+ add(target, target);
182
+ }
183
+ else {
184
+ const tree = await index.walk(target, request.scope);
185
+ for (const gap of tree.gaps)
186
+ gaps.add(gap);
187
+ if (selects !== null) {
188
+ for (const directory of tree.directories) {
189
+ if (!excluded(directory) && selects.test(path.posix.relative(target, directory)))
190
+ add(directory, target);
191
+ }
192
+ }
193
+ else {
194
+ for (const file of tree.files)
195
+ if (included(file) && !excluded(file))
196
+ add(file, target);
197
+ }
198
+ }
199
+ }
200
+ const ledger = new LedgerBuilder();
201
+ for (const gap of gaps)
202
+ ledger.add(gap, 'unreadable');
203
+ const ordered = [...subjects].sort(([a], [b]) => comparePaths(a, b));
204
+ const check = {
205
+ missing,
206
+ notDirectories,
207
+ inspected: ordered.length,
208
+ violations: [],
209
+ scope: ledger.build(),
210
+ };
211
+ if (query.claim === 'pattern') {
212
+ const named = createGlobMatcher(query.values);
213
+ for (const [file] of ordered) {
214
+ if (!named(file))
215
+ check.violations.push({ path: file, text: `matches none of ${query.values.join(', ')}` });
216
+ }
217
+ return check;
218
+ }
219
+ if (required) {
220
+ const found = await Promise.all(ordered.map(([directory]) => Promise.all(query.values.map((entry) => holds(index, directory, entry)))));
221
+ ordered.forEach(([directory], at) => {
222
+ const lacking = query.values.filter((_, position) => !found[at][position]);
223
+ if (lacking.length > 0)
224
+ check.violations.push({ path: directory, text: `missing ${lacking.join(', ')}` });
225
+ });
226
+ return check;
227
+ }
228
+ // Partners. Expanded before anything is looked up, so a template naming the
229
+ // file itself is refused rather than satisfied by every file.
230
+ const partners = ordered.map(([file, target]) => query.values.map((template) => expandPartner(template, file, target)));
231
+ const expectedBy = new Map();
232
+ for (const [at, [file]] of ordered.entries()) {
233
+ const names = partners[at];
234
+ const own = names.indexOf(file);
235
+ if (own !== -1)
236
+ return { ...check, selfPartner: { file, template: query.values[own] } };
237
+ for (const name of names)
238
+ if (!expectedBy.has(name))
239
+ expectedBy.set(name, file);
240
+ }
241
+ const found = await Promise.all(partners.map((names) => Promise.all(names.map(async (name) => (await index.listing(path.posix.dirname(name)))?.get(path.posix.basename(name))?.isFile() === true))));
242
+ ordered.forEach(([file], at) => {
243
+ if (found[at].includes(true))
244
+ return;
245
+ // The likeliest reason a file has no partner is that it is one, and the
246
+ // directive forgot to exclude the partners.
247
+ const owner = expectedBy.get(file);
248
+ const hint = owner === undefined ? '' : ` (it is the partner of ${owner} - exclude it?)`;
249
+ check.violations.push({ path: file, text: `has no partner ${partners[at].join(' or ')}${hint}` });
250
+ });
251
+ return check;
252
+ }
253
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../src/structure.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -6,7 +6,24 @@ import type { ScopeLedger, ScopePolicy } from './scope.js';
6
6
  * parser -> Directive[] -> runner (+ engine) -> AssertionResult[] -> reporter
7
7
  */
8
8
  /** Every assertion kind the parser understands. */
9
- export type DirectiveKind = 'assert-absence' | 'assert-count' | 'assert-present' | 'assert-import-absence' | 'assert-import-count' | 'assert-import-cycle' | 'assert-layers';
9
+ export type DirectiveKind = 'assert-absence' | 'assert-count' | 'assert-present' | 'assert-import-absence' | 'assert-import-count' | 'assert-import-cycle' | 'assert-layers' | 'assert-structure';
10
+ /** What an `@assert-structure` directive claims. Exactly one per directive; see ADR-0013. */
11
+ export type StructureClaim = 'pattern' | 'required' | 'partner';
12
+ /** The claim of an `@assert-structure` directive, resolved. */
13
+ export interface StructureQuery {
14
+ claim: StructureClaim;
15
+ /**
16
+ * The claim's list, as written: the name patterns every file must match, the
17
+ * entries every directory must hold, or the partner templates of which one
18
+ * must exist.
19
+ */
20
+ values: string[];
21
+ /**
22
+ * For `required`, the glob choosing directories below each target. Absent
23
+ * when the rule is about the targets themselves.
24
+ */
25
+ dirs?: string;
26
+ }
10
27
  /** Extra scope carried by the import assertions. */
11
28
  export interface ImportQuery {
12
29
  /** Module patterns, matched with gitignore-style rules. */
@@ -145,9 +162,12 @@ export interface Bounds {
145
162
  export interface MatchLocation {
146
163
  /** Path relative to root, forward slashes. */
147
164
  file: string;
148
- /** 1-based line number. */
165
+ /**
166
+ * 1-based line number, or 0 when the match is the path as a whole - a file
167
+ * with the wrong name, or a directory missing an entry, has no line.
168
+ */
149
169
  line: number;
150
- /** 1-based column of the first match on that line. */
170
+ /** 1-based column of the first match on that line; 0 alongside a line of 0. */
151
171
  column: number;
152
172
  /** Trimmed line content, truncated for display. */
153
173
  text: string;
@@ -200,6 +220,8 @@ export interface Assertion {
200
220
  * on to the layer that may depend on everything. See ADR-0011.
201
221
  */
202
222
  layers?: string[];
223
+ /** Present on `@assert-structure`. */
224
+ structure?: StructureQuery;
203
225
  /**
204
226
  * Known violations that do not count. Empty when the directive declared none.
205
227
  *
@@ -234,6 +256,14 @@ export interface AssertionResult {
234
256
  targets: string[];
235
257
  files: string[];
236
258
  bounds: Bounds;
259
+ /**
260
+ * The claim of an `@assert-structure` result.
261
+ *
262
+ * Carried because it decides what a match is: a file for `pattern` and
263
+ * `partner`, a directory for `required` - and a directory is not something a
264
+ * code-scanning annotation can be placed on.
265
+ */
266
+ claim?: StructureClaim;
237
267
  /** Observed count: matches for searches, existing files for `assert-present`. */
238
268
  actual: number;
239
269
  /** Short "expected X, found Y" style explanation. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descent-vtt/spec-guard",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Executable architecture assertions for Markdown specs & ADRs.",
5
5
  "keywords": [
6
6
  "adr",