@descent-vtt/spec-guard 0.5.1 → 0.7.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/CHANGELOG.md +444 -283
- package/README.md +1094 -868
- package/dist/cli.d.ts +18 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +136 -7
- package/dist/cli.js.map +1 -1
- package/dist/glob.d.ts +17 -2
- package/dist/glob.d.ts.map +1 -1
- package/dist/glob.js +25 -9
- package/dist/glob.js.map +1 -1
- package/dist/graph.d.ts +124 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +241 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +19 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/layers.d.ts +72 -0
- package/dist/layers.d.ts.map +1 -0
- package/dist/layers.js +102 -0
- package/dist/layers.js.map +1 -0
- package/dist/mcp.d.ts +117 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +544 -0
- package/dist/mcp.js.map +1 -0
- package/dist/parser.d.ts +50 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +232 -16
- package/dist/parser.js.map +1 -1
- package/dist/query.d.ts +108 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +206 -0
- package/dist/query.js.map +1 -0
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +62 -5
- package/dist/reporter.js.map +1 -1
- package/dist/rules.d.ts +108 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +153 -0
- package/dist/rules.js.map +1 -0
- package/dist/runner.d.ts +24 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +335 -117
- package/dist/runner.js.map +1 -1
- package/dist/specs.d.ts +44 -0
- package/dist/specs.d.ts.map +1 -0
- package/dist/specs.js +62 -0
- package/dist/specs.js.map +1 -0
- package/dist/types.d.ts +60 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +73 -73
package/dist/layers.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The layering rule behind `@assert-layers`.
|
|
3
|
+
*
|
|
4
|
+
* Pure, and built on almost nothing new. A layer is a pattern in the language
|
|
5
|
+
* `module=` and `exclude` already speak; a file belongs to a layer when its path
|
|
6
|
+
* matches, and a reference points into one when any name it can denote does -
|
|
7
|
+
* see `referenceForms`. That is why layering needs no resolver and works in
|
|
8
|
+
* every language spec-guard reads: it never asks which file a reference *is*,
|
|
9
|
+
* only which areas it could be about.
|
|
10
|
+
*
|
|
11
|
+
* Cycles are the opposite case, and live in `graph.ts` - see ADR-0011.
|
|
12
|
+
*/
|
|
13
|
+
import { createExcludeMatcher } from './glob.js';
|
|
14
|
+
import { candidates, isGraphFile } from './graph.js';
|
|
15
|
+
import { resolveModule } from './imports.js';
|
|
16
|
+
import { languageFor } from './polyglot.js';
|
|
17
|
+
/**
|
|
18
|
+
* Every name a reference can be matched under.
|
|
19
|
+
*
|
|
20
|
+
* The specifier as written and the module it resolves to, as `module=` tries -
|
|
21
|
+
* and, for the two languages whose modules are files, the files that module can
|
|
22
|
+
* denote. Without the last, a layer that names a file could never be reached:
|
|
23
|
+
* `src/runner.ts` is where the file is, `./runner.js` is what imports it, and
|
|
24
|
+
* the first rule this project wrote with file-sized layers passed while its
|
|
25
|
+
* order was reversed, because no reference matched any layer at all.
|
|
26
|
+
*
|
|
27
|
+
* Names only. Nothing here asks whether a candidate exists, which is why a layer
|
|
28
|
+
* outside the assertion's target still works: `../infrastructure/db.js` reaches
|
|
29
|
+
* `src/infrastructure/db.ts` whether or not the walk ever went there.
|
|
30
|
+
*/
|
|
31
|
+
export function referenceForms(specifier, importingFile) {
|
|
32
|
+
const module = resolveModule(specifier, importingFile);
|
|
33
|
+
if (isGraphFile(importingFile))
|
|
34
|
+
return [specifier, ...candidates(module)];
|
|
35
|
+
if (languageFor(importingFile) === 'python')
|
|
36
|
+
return [specifier, module, `${module}.py`, `${module}/__init__.py`];
|
|
37
|
+
return [specifier, module];
|
|
38
|
+
}
|
|
39
|
+
/** A function from a path to the indices of every layer that matches it. */
|
|
40
|
+
export function layerMatcher(order) {
|
|
41
|
+
const matchers = order.map((pattern) => createExcludeMatcher([pattern]));
|
|
42
|
+
return (relativePath) => matchers.flatMap((matches, layer) => (matches(relativePath) ? [layer] : []));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Checks each file's references against the order.
|
|
46
|
+
*
|
|
47
|
+
* A file may import from its own layer and from layers listed before it. The
|
|
48
|
+
* unit of violation is the file, as it is for every import assertion: one
|
|
49
|
+
* import statement split into two is not twice the problem.
|
|
50
|
+
*
|
|
51
|
+
* A file two layers claim is not checked for violations - which layer's rule
|
|
52
|
+
* applies is exactly the thing that is unknown - and is reported instead. So is
|
|
53
|
+
* every file no layer claims, because a shared utility and a directory someone
|
|
54
|
+
* forgot to assign look identical from here and only the author can say which a
|
|
55
|
+
* count describes.
|
|
56
|
+
*/
|
|
57
|
+
export function checkLayers(inputs, order, includeTypes) {
|
|
58
|
+
const layersOf = layerMatcher(order);
|
|
59
|
+
// Every file in a directory imports the same few modules, and each reference
|
|
60
|
+
// is matched under some twenty names, so the same name is matched against the
|
|
61
|
+
// same patterns thousands of times on a large tree. The answer depends on the
|
|
62
|
+
// name alone. Measured on 6,977 files of node_modules: see ADR-0011.
|
|
63
|
+
const seen = new Map();
|
|
64
|
+
const reachedBy = (name) => {
|
|
65
|
+
let layers = seen.get(name);
|
|
66
|
+
if (layers === undefined) {
|
|
67
|
+
layers = layersOf(name);
|
|
68
|
+
seen.set(name, layers);
|
|
69
|
+
}
|
|
70
|
+
return layers;
|
|
71
|
+
};
|
|
72
|
+
const members = order.map(() => 0);
|
|
73
|
+
const unassigned = [];
|
|
74
|
+
const ambiguous = [];
|
|
75
|
+
const violations = [];
|
|
76
|
+
for (const { file, references } of inputs) {
|
|
77
|
+
const own = layersOf(file);
|
|
78
|
+
for (const layer of own)
|
|
79
|
+
members[layer] = members[layer] + 1;
|
|
80
|
+
if (own.length === 0) {
|
|
81
|
+
unassigned.push(file);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (own.length > 1) {
|
|
85
|
+
ambiguous.push({ file, layers: own });
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const from = own[0];
|
|
89
|
+
for (const reference of references) {
|
|
90
|
+
if (reference.typeOnly && !includeTypes)
|
|
91
|
+
continue;
|
|
92
|
+
const reached = referenceForms(reference.specifier, file).flatMap(reachedBy);
|
|
93
|
+
const to = Math.max(from, ...reached);
|
|
94
|
+
if (to > from) {
|
|
95
|
+
violations.push({ file, from, to, reference });
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { members, unassigned, ambiguous, violations };
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=layers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layers.js","sourceRoot":"","sources":["../src/layers.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `spec-guard mcp`: the rules, served to an agent over the Model Context
|
|
3
|
+
* Protocol on stdio.
|
|
4
|
+
*
|
|
5
|
+
* No SDK. MCP over stdio is JSON-RPC 2.0, one message per line, and what a
|
|
6
|
+
* server has to get right fits in this file: framing, the two eras of the
|
|
7
|
+
* protocol, and four methods' worth of results. The official SDK brings a
|
|
8
|
+
* schema library and a dependency tree to do the same, and spec-guard's first
|
|
9
|
+
* invariant is that it has no runtime dependencies at all. ADR-0012 has the
|
|
10
|
+
* rest, including what this file deliberately does not implement.
|
|
11
|
+
*
|
|
12
|
+
* Two eras, served side by side. Revisions up to 2025-11-25 open with an
|
|
13
|
+
* `initialize` handshake; 2026-07-28 has none, and every request carries its
|
|
14
|
+
* protocol version in `_meta`. Clients of both are in use, so each request is
|
|
15
|
+
* classified on its own - by the rule the TypeScript SDK's server applies, not
|
|
16
|
+
* by one invented here: a request that claims a version in `_meta` is modern
|
|
17
|
+
* and its claim is validated; anything else, `initialize` included, is legacy.
|
|
18
|
+
*/
|
|
19
|
+
import type { Readable } from 'node:stream';
|
|
20
|
+
import { type RunOptions } from './runner.js';
|
|
21
|
+
/** Revisions that carry their version on every request. Newest first. */
|
|
22
|
+
export declare const MODERN_PROTOCOL_VERSIONS: readonly string[];
|
|
23
|
+
/** Revisions negotiated by `initialize`, newest first - the SDK's own list. */
|
|
24
|
+
export declare const LEGACY_PROTOCOL_VERSIONS: readonly string[];
|
|
25
|
+
export declare const PROTOCOL_VERSION_KEY = "io.modelcontextprotocol/protocolVersion";
|
|
26
|
+
export declare const CLIENT_CAPABILITIES_KEY = "io.modelcontextprotocol/clientCapabilities";
|
|
27
|
+
export declare const CLIENT_INFO_KEY = "io.modelcontextprotocol/clientInfo";
|
|
28
|
+
export declare const SERVER_INFO_KEY = "io.modelcontextprotocol/serverInfo";
|
|
29
|
+
export declare const PARSE_ERROR = -32700;
|
|
30
|
+
export declare const INVALID_REQUEST = -32600;
|
|
31
|
+
export declare const METHOD_NOT_FOUND = -32601;
|
|
32
|
+
export declare const INVALID_PARAMS = -32602;
|
|
33
|
+
export declare const INTERNAL_ERROR = -32603;
|
|
34
|
+
/** Resource not found before 2026-07-28, which forbids it in favour of -32602. */
|
|
35
|
+
export declare const LEGACY_RESOURCE_NOT_FOUND = -32002;
|
|
36
|
+
export declare const UNSUPPORTED_PROTOCOL_VERSION = -32022;
|
|
37
|
+
export type RequestId = string | number;
|
|
38
|
+
export type Era = 'legacy' | 'modern';
|
|
39
|
+
export interface ErrorObject {
|
|
40
|
+
code: number;
|
|
41
|
+
message: string;
|
|
42
|
+
data?: unknown;
|
|
43
|
+
}
|
|
44
|
+
/** Everything this server ever writes. It never sends a request. */
|
|
45
|
+
export type OutgoingMessage = {
|
|
46
|
+
jsonrpc: '2.0';
|
|
47
|
+
id: RequestId;
|
|
48
|
+
result: Record<string, unknown>;
|
|
49
|
+
} | {
|
|
50
|
+
jsonrpc: '2.0';
|
|
51
|
+
id?: RequestId;
|
|
52
|
+
error: ErrorObject;
|
|
53
|
+
};
|
|
54
|
+
type JsonObject = Record<string, unknown>;
|
|
55
|
+
/**
|
|
56
|
+
* What is wrong with a request's `_meta`, once it claims a protocol version.
|
|
57
|
+
*
|
|
58
|
+
* Only what the server depends on or the revision requires: a version that is a
|
|
59
|
+
* string, capabilities that are an object, and client info shaped as client info
|
|
60
|
+
* when it is sent. A claim is never silently ignored - a malformed one is an
|
|
61
|
+
* error, not a reason to fall back to legacy handling.
|
|
62
|
+
*/
|
|
63
|
+
export declare function envelopeIssue(meta: JsonObject): string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* The era a request belongs to, or the error that answers it instead.
|
|
66
|
+
*
|
|
67
|
+
* `initialize` is the legacy handshake unless it carries a valid modern claim.
|
|
68
|
+
* Any other request is modern exactly when `_meta` holds the version key - its
|
|
69
|
+
* presence is the claim, whatever its value - and legacy otherwise.
|
|
70
|
+
*/
|
|
71
|
+
export declare function classifyRequest(method: string, params: JsonObject | undefined): Era;
|
|
72
|
+
/** The version `initialize` settles on: the one asked for, or the newest legacy one. */
|
|
73
|
+
export declare function negotiateLegacyVersion(requested: unknown): string;
|
|
74
|
+
export declare const SERVER_NAME = "spec-guard";
|
|
75
|
+
export declare const INSTRUCTIONS: string;
|
|
76
|
+
export declare const TOOLS: readonly JsonObject[];
|
|
77
|
+
export declare const RULES_URI = "spec://rules";
|
|
78
|
+
export declare const DOCUMENT_URI_PREFIX = "spec://doc/";
|
|
79
|
+
export declare const RESOURCE_TEMPLATES: readonly JsonObject[];
|
|
80
|
+
export declare function documentUri(relativeFile: string): string;
|
|
81
|
+
/** The spec path a document URI names, or null for anything else. */
|
|
82
|
+
export declare function documentPath(uri: string): string | null;
|
|
83
|
+
export interface McpServerOptions {
|
|
84
|
+
/** Absolute project root. */
|
|
85
|
+
root: string;
|
|
86
|
+
/** Spec globs, as on the command line. */
|
|
87
|
+
patterns: readonly string[];
|
|
88
|
+
/** Reported as the server's version. */
|
|
89
|
+
version: string;
|
|
90
|
+
/**
|
|
91
|
+
* Run settings, as the CLI flags set them. `ignoreStatus` also makes
|
|
92
|
+
* `get_architectural_rules` list rules from documents not in force by default.
|
|
93
|
+
*/
|
|
94
|
+
run?: Omit<RunOptions, 'patterns' | 'root' | 'select'>;
|
|
95
|
+
/** Reads a spec document. Injected so an unreadable one can be tested. */
|
|
96
|
+
readFile?: (file: string) => Promise<string>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Builds the function that answers one parsed JSON-RPC message.
|
|
100
|
+
*
|
|
101
|
+
* Returns the message to send back, or null when nothing is owed: a
|
|
102
|
+
* notification, or a response the client should not have sent.
|
|
103
|
+
*/
|
|
104
|
+
export declare function createMcpHandler(options: McpServerOptions): (message: unknown) => Promise<OutgoingMessage | null>;
|
|
105
|
+
/**
|
|
106
|
+
* Serves a handler over newline-delimited JSON-RPC until the input ends.
|
|
107
|
+
*
|
|
108
|
+
* The whole stdio binding. Messages are split on `\n` with a trailing `\r`
|
|
109
|
+
* dropped, blank lines are skipped, and every response is written as a single
|
|
110
|
+
* line - `JSON.stringify` never emits a raw newline, which is what the binding
|
|
111
|
+
* requires. Requests are answered concurrently and in whatever order they
|
|
112
|
+
* finish. A request the client cancels gets no response at all. When the input
|
|
113
|
+
* closes, requests still running are allowed to finish and then this resolves.
|
|
114
|
+
*/
|
|
115
|
+
export declare function serveStdio(input: Readable, write: (line: string) => void, handle: (message: unknown) => Promise<OutgoingMessage | null>): Promise<void>;
|
|
116
|
+
export {};
|
|
117
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|