@intentset/cli 0.1.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 (116) hide show
  1. package/dist/commands/architecture.d.ts +6 -0
  2. package/dist/commands/architecture.d.ts.map +1 -0
  3. package/dist/commands/architecture.js +65 -0
  4. package/dist/commands/architecture.js.map +1 -0
  5. package/dist/commands/context.d.ts +4 -0
  6. package/dist/commands/context.d.ts.map +1 -0
  7. package/dist/commands/context.js +124 -0
  8. package/dist/commands/context.js.map +1 -0
  9. package/dist/commands/evidence.d.ts +29 -0
  10. package/dist/commands/evidence.d.ts.map +1 -0
  11. package/dist/commands/evidence.js +157 -0
  12. package/dist/commands/evidence.js.map +1 -0
  13. package/dist/commands/graph.d.ts +18 -0
  14. package/dist/commands/graph.d.ts.map +1 -0
  15. package/dist/commands/graph.js +77 -0
  16. package/dist/commands/graph.js.map +1 -0
  17. package/dist/commands/impact.d.ts +20 -0
  18. package/dist/commands/impact.d.ts.map +1 -0
  19. package/dist/commands/impact.js +92 -0
  20. package/dist/commands/impact.js.map +1 -0
  21. package/dist/commands/init.d.ts +18 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +122 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/mcp.d.ts +24 -0
  26. package/dist/commands/mcp.d.ts.map +1 -0
  27. package/dist/commands/mcp.js +122 -0
  28. package/dist/commands/mcp.js.map +1 -0
  29. package/dist/commands/publish.d.ts +19 -0
  30. package/dist/commands/publish.d.ts.map +1 -0
  31. package/dist/commands/publish.js +98 -0
  32. package/dist/commands/publish.js.map +1 -0
  33. package/dist/commands/review.d.ts +29 -0
  34. package/dist/commands/review.d.ts.map +1 -0
  35. package/dist/commands/review.js +147 -0
  36. package/dist/commands/review.js.map +1 -0
  37. package/dist/commands/serve.d.ts +14 -0
  38. package/dist/commands/serve.d.ts.map +1 -0
  39. package/dist/commands/serve.js +246 -0
  40. package/dist/commands/serve.js.map +1 -0
  41. package/dist/commands/shared.d.ts +19 -0
  42. package/dist/commands/shared.d.ts.map +1 -0
  43. package/dist/commands/shared.js +43 -0
  44. package/dist/commands/shared.js.map +1 -0
  45. package/dist/commands/validate.d.ts +11 -0
  46. package/dist/commands/validate.d.ts.map +1 -0
  47. package/dist/commands/validate.js +38 -0
  48. package/dist/commands/validate.js.map +1 -0
  49. package/dist/git.d.ts +25 -0
  50. package/dist/git.d.ts.map +1 -0
  51. package/dist/git.js +63 -0
  52. package/dist/git.js.map +1 -0
  53. package/dist/glob.d.ts +16 -0
  54. package/dist/glob.d.ts.map +1 -0
  55. package/dist/glob.js +60 -0
  56. package/dist/glob.js.map +1 -0
  57. package/dist/index.d.ts +9 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +8 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/intentset.d.ts +3 -0
  62. package/dist/intentset.d.ts.map +1 -0
  63. package/dist/intentset.js +15 -0
  64. package/dist/intentset.js.map +1 -0
  65. package/dist/main.d.ts +5 -0
  66. package/dist/main.d.ts.map +1 -0
  67. package/dist/main.js +406 -0
  68. package/dist/main.js.map +1 -0
  69. package/dist/output.d.ts +38 -0
  70. package/dist/output.d.ts.map +1 -0
  71. package/dist/output.js +53 -0
  72. package/dist/output.js.map +1 -0
  73. package/dist/outputs.d.ts +17 -0
  74. package/dist/outputs.d.ts.map +1 -0
  75. package/dist/outputs.js +70 -0
  76. package/dist/outputs.js.map +1 -0
  77. package/dist/reports.d.ts +16 -0
  78. package/dist/reports.d.ts.map +1 -0
  79. package/dist/reports.js +89 -0
  80. package/dist/reports.js.map +1 -0
  81. package/dist/repository.d.ts +56 -0
  82. package/dist/repository.d.ts.map +1 -0
  83. package/dist/repository.js +191 -0
  84. package/dist/repository.js.map +1 -0
  85. package/dist/session.d.ts +61 -0
  86. package/dist/session.d.ts.map +1 -0
  87. package/dist/session.js +202 -0
  88. package/dist/session.js.map +1 -0
  89. package/dist/tree.d.ts +15 -0
  90. package/dist/tree.d.ts.map +1 -0
  91. package/dist/tree.js +56 -0
  92. package/dist/tree.js.map +1 -0
  93. package/package.json +46 -0
  94. package/src/commands/architecture.ts +77 -0
  95. package/src/commands/context.ts +142 -0
  96. package/src/commands/evidence.ts +180 -0
  97. package/src/commands/graph.ts +89 -0
  98. package/src/commands/impact.ts +97 -0
  99. package/src/commands/init.ts +138 -0
  100. package/src/commands/mcp.ts +143 -0
  101. package/src/commands/publish.ts +119 -0
  102. package/src/commands/review.ts +155 -0
  103. package/src/commands/serve.ts +261 -0
  104. package/src/commands/shared.ts +46 -0
  105. package/src/commands/validate.ts +39 -0
  106. package/src/git.ts +81 -0
  107. package/src/glob.ts +58 -0
  108. package/src/index.ts +8 -0
  109. package/src/intentset.ts +15 -0
  110. package/src/main.ts +408 -0
  111. package/src/output.ts +78 -0
  112. package/src/outputs.ts +65 -0
  113. package/src/reports.ts +103 -0
  114. package/src/repository.ts +220 -0
  115. package/src/session.ts +276 -0
  116. package/src/tree.ts +64 -0
@@ -0,0 +1,147 @@
1
+ /**
2
+ * `intentset review` (Core §10): the local review report. Validation at the
3
+ * highest level the inputs allow (L2 always; L4 when run records are given
4
+ * or found, since L3's evidence is the only input L4 needs beyond it), the
5
+ * architecture summary, coverage, and the impact of the change: every file
6
+ * changed since the base, committed or not, mapped to the artifacts it
7
+ * touches, a changed record to its own artifact and a changed source file
8
+ * through the claiming slice to that slice's behaviors, each start's direct
9
+ * dependents shown apart from its candidates. Markdown by default. Read-only.
10
+ */
11
+ import { impact, compareStrings } from "@intentset/core";
12
+ import { changedFiles, chooseBase } from "../git.js";
13
+ import { matchGlob } from "../glob.js";
14
+ import { count, formatDiagnostic, json, snapshotLine, TOOL } from "../output.js";
15
+ import { levelJson, levelSections } from "../reports.js";
16
+ import { pathText, REACHABILITY_NOTE } from "./impact.js";
17
+ /** Map changed files to impact starts. A path that is a record names its artifact; a claimed source file names the claiming slices' behaviors. */
18
+ export function attribute(graph, changed) {
19
+ const byPath = new Map();
20
+ for (const [id, artifact] of graph.artifacts)
21
+ byPath.set(artifact.path, id);
22
+ const slices = [...graph.artifacts.values()]
23
+ .filter((a) => a.meta.type === "slice" && a.meta.status !== "retired" && a.meta.slice !== undefined)
24
+ .sort((a, b) => compareStrings(a.meta.id, b.meta.id));
25
+ const starts = new Map();
26
+ const add = (id, reason) => {
27
+ const set = starts.get(id) ?? new Set();
28
+ set.add(reason);
29
+ starts.set(id, set);
30
+ };
31
+ const unattributed = [];
32
+ for (const path of changed) {
33
+ const id = byPath.get(path);
34
+ if (id !== undefined) {
35
+ add(id, `${path} is its record`);
36
+ continue;
37
+ }
38
+ const owners = slices.filter((slice) => slice.meta.slice?.claims.some((claim) => matchGlob(claim.path, path)));
39
+ let attributed = false;
40
+ for (const slice of owners) {
41
+ for (const behavior of slice.meta.links.implements ?? []) {
42
+ if (!graph.artifacts.has(behavior))
43
+ continue;
44
+ add(behavior, `${path} is claimed by ${slice.meta.id}, which implements it`);
45
+ attributed = true;
46
+ }
47
+ }
48
+ if (!attributed)
49
+ unattributed.push(path);
50
+ }
51
+ return {
52
+ starts: [...starts.keys()]
53
+ .sort(compareStrings)
54
+ .map((start) => ({ start, because: [...starts.get(start)].sort(compareStrings) })),
55
+ unattributed,
56
+ };
57
+ }
58
+ export function reviewCommand(session, options, asJson, io) {
59
+ const { repo, result, snapshot } = session;
60
+ const graph = result.graph;
61
+ const chosen = chooseBase(repo.root, options.base);
62
+ if (chosen === null) {
63
+ io.stderr(`intentset review: --base ${options.base} names no commit.\n`);
64
+ return 2;
65
+ }
66
+ const base = "unavailable" in chosen ? null : chosen;
67
+ const changes = { base, ...changedFiles(repo.root, base) };
68
+ if ("unavailable" in chosen)
69
+ changes.baseUnavailable = chosen.unavailable;
70
+ const changed = [...new Set([...changes.committed, ...changes.uncommitted])].sort(compareStrings);
71
+ const { starts, unattributed } = attribute(graph, changed);
72
+ const impacts = starts.map(({ start, because }) => {
73
+ const artifact = graph.artifacts.get(start);
74
+ const report = impact(graph, start);
75
+ return {
76
+ start,
77
+ type: artifact?.meta.type,
78
+ title: artifact?.meta.title,
79
+ because,
80
+ direct: report.direct,
81
+ candidates: report.candidates,
82
+ };
83
+ });
84
+ if (asJson) {
85
+ io.stdout(json({
86
+ tool: TOOL,
87
+ snapshot,
88
+ level: session.level,
89
+ levelReason: options.levelReason,
90
+ changes,
91
+ validation: {
92
+ summary: { artifacts: graph.artifacts.size, errors: session.errors, warnings: session.warnings },
93
+ diagnostics: session.diagnostics,
94
+ },
95
+ ...levelJson(session),
96
+ note: REACHABILITY_NOTE,
97
+ impact: impacts,
98
+ unattributed,
99
+ }));
100
+ return session.errors > 0 ? 1 : 0;
101
+ }
102
+ const baseLine = base === null
103
+ ? `- Base: none (${changes.baseUnavailable}); only uncommitted changes are considered`
104
+ : `- Base: ${base.ref}, ${base.commit}`;
105
+ const out = [
106
+ "# Review",
107
+ "",
108
+ `- ${snapshotLine(snapshot)}`,
109
+ baseLine,
110
+ `- Changed: ${count(changed.length, "file")} (${changes.committed.length} committed since the base, ${changes.uncommitted.length} uncommitted)`,
111
+ `- Level: ${session.level}, ${options.levelReason}`,
112
+ "",
113
+ "## Validation",
114
+ "",
115
+ `${count(graph.artifacts.size, "artifact")}, ${count(session.errors, "error")}, ${count(session.warnings, "warning")} (level ${session.level}, scope: ${repo.config.scope.join(", ")})`,
116
+ ];
117
+ if (session.diagnostics.length > 0) {
118
+ out.push("", "```text", ...session.diagnostics.map((d) => formatDiagnostic(d).trimEnd()), "```");
119
+ }
120
+ const sections = levelSections(session);
121
+ if (sections.length > 0)
122
+ out.push("", "## Checks above L1", "", "```text", ...sections.slice(1), "```");
123
+ out.push("", "## Impact of the change", "", REACHABILITY_NOTE);
124
+ if (impacts.length === 0)
125
+ out.push("", "No changed file is a record or is claimed by a slice, so nothing was traversed.");
126
+ for (const item of impacts) {
127
+ out.push("", `### ${item.start}: ${item.title}`, "", ...item.because.map((reason) => `- Changed: ${reason}`), "");
128
+ out.push(`Direct (${item.direct.length}), one link away:`);
129
+ if (item.direct.length === 0)
130
+ out.push("- none");
131
+ for (const hit of item.direct)
132
+ out.push(`- ${hit.id} (${hit.type}): \`${pathText(item.start, hit)}\``);
133
+ out.push("", `Candidates (${item.candidates.length}), reachable beyond, for review:`);
134
+ if (item.candidates.length === 0)
135
+ out.push("- none");
136
+ for (const hit of item.candidates)
137
+ out.push(`- ${hit.id} (${hit.type}): \`${pathText(item.start, hit)}\``);
138
+ }
139
+ out.push("", `## Changed files no artifact accounts for (${unattributed.length})`, "");
140
+ if (unattributed.length === 0)
141
+ out.push("None.");
142
+ else
143
+ out.push(...unattributed.map((path) => `- ${path}`));
144
+ io.stdout(`${out.join("\n")}\n`);
145
+ return session.errors > 0 ? 1 : 0;
146
+ }
147
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type Io } from "../output.ts";
2
+ import { type Session, type SessionOptions } from "../session.ts";
3
+ export declare const NOT_FOR_PUBLICATION = "The Atlas shows internal and restricted records: it is a review surface and is not for publication.";
4
+ export interface ServeOptions {
5
+ port: number;
6
+ host: string;
7
+ out?: string;
8
+ }
9
+ /** The Atlas built from a session. */
10
+ export declare function atlasOf(session: Session): Map<string, string>;
11
+ /** The atlas path a request names, or null when it names none. Nothing here touches the file system. */
12
+ export declare function requestPath(url: string | undefined): string | null;
13
+ export declare function serveCommand(options: ServeOptions, sessionOptions: SessionOptions, io: Io): Promise<number>;
14
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAS,KAAK,EAAE,EAAgB,MAAM,cAAc,CAAC;AAG5D,OAAO,EAA4C,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAG5G,eAAO,MAAM,mBAAmB,wGACuE,CAAC;AAExG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAOD,sCAAsC;AACtC,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAuB7D;AA2CD,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CASlE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsGjH"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * `intentset serve` (Core §10): the Atlas over HTTP on this machine. The
3
+ * level pipeline runs as validate's does, at the highest level the inputs
4
+ * allow, and the Atlas is built from what it found. Requests are answered
5
+ * from that in-memory build and nothing else: GET only, the Atlas's own
6
+ * paths and atlas.css, 404 for any other path, so there is no file system
7
+ * behind the server to traverse. Before answering, any file the build read
8
+ * that has changed since is noticed and the Atlas rebuilt, so an edited
9
+ * record shows on reload.
10
+ *
11
+ * `--out <dir>` writes the same files to a new or empty directory outside
12
+ * the documents' scope and exits. The Atlas carries internal and restricted
13
+ * records, and says so: it is a review surface, never a publication.
14
+ */
15
+ import { mkdirSync, readdirSync, statSync, writeFileSync } from "node:fs";
16
+ import { createServer } from "node:http";
17
+ import { dirname, join, resolve } from "node:path";
18
+ import { ARCHITECTURE_CONFIG_PATH } from "@intentset/architecture";
19
+ import { buildAtlas } from "@intentset/atlas";
20
+ import { count, snapshotLine } from "../output.js";
21
+ import { outputDirProblem, outputProblem } from "../outputs.js";
22
+ import { CONFIG_PATH } from "../repository.js";
23
+ import { EVIDENCE_DIR, evidenceFiles, openSession } from "../session.js";
24
+ import { TEXT_EXTENSIONS } from "../tree.js";
25
+ export const NOT_FOR_PUBLICATION = "The Atlas shows internal and restricted records: it is a review surface and is not for publication.";
26
+ const TYPES = {
27
+ ".html": "text/html; charset=utf-8",
28
+ ".css": "text/css; charset=utf-8",
29
+ };
30
+ /** The Atlas built from a session. */
31
+ export function atlasOf(session) {
32
+ return buildAtlas({
33
+ graph: session.result.graph,
34
+ registries: session.repo.registries,
35
+ diagnostics: session.diagnostics,
36
+ snapshot: {
37
+ commit: session.snapshot.commit,
38
+ graphHash: session.snapshot.graphHash,
39
+ scope: session.repo.config.scope,
40
+ level: session.level,
41
+ },
42
+ evidence: session.evidence === undefined
43
+ ? null
44
+ : { classification: session.evidence.check.classification, coverage: session.evidence.check.coverage },
45
+ architecture: session.architecture === undefined
46
+ ? null
47
+ : {
48
+ diagnostics: session.architecture.diagnostics,
49
+ summary: session.architecture.summary,
50
+ },
51
+ });
52
+ }
53
+ /**
54
+ * Every file a build read as text, and the directories holding them, absolute:
55
+ * a newer modification time on any of them means rebuild. A directory's time
56
+ * changes when a file is added to it or removed, which is how a new record is
57
+ * noticed.
58
+ */
59
+ function watched(session, evidence) {
60
+ const { repo } = session;
61
+ const files = new Set([
62
+ join(repo.root, CONFIG_PATH),
63
+ join(repo.root, ARCHITECTURE_CONFIG_PATH),
64
+ join(repo.root, EVIDENCE_DIR),
65
+ ...evidence,
66
+ ...repo.inputs.map((input) => join(repo.root, input.path)),
67
+ // Only what a check reads as text: a log or an image beside the sources cannot change the Atlas.
68
+ ...[...(session.tree?.paths ?? [])]
69
+ .filter((path) => TEXT_EXTENSIONS.some((extension) => path.endsWith(extension)))
70
+ .map((path) => join(repo.root, path)),
71
+ ]);
72
+ if (repo.config.registries !== null)
73
+ files.add(join(repo.root, repo.config.registries));
74
+ // A file added to or removed from a directory changes the directory's time.
75
+ for (const file of [...files]) {
76
+ for (let dir = dirname(file); dir.startsWith(repo.root); dir = dirname(dir)) {
77
+ files.add(dir);
78
+ if (dir === repo.root)
79
+ break;
80
+ }
81
+ }
82
+ return [...files];
83
+ }
84
+ function changedSince(paths, since) {
85
+ for (const path of paths) {
86
+ try {
87
+ if (statSync(path).mtimeMs > since)
88
+ return path;
89
+ }
90
+ catch {
91
+ // Absent now: a file the build read was removed, or an optional file never existed.
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+ /** The atlas path a request names, or null when it names none. Nothing here touches the file system. */
97
+ export function requestPath(url) {
98
+ let pathname;
99
+ try {
100
+ pathname = decodeURIComponent(new URL(url ?? "/", "http://localhost").pathname);
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ const path = pathname.replace(/^\/+/, "");
106
+ return path === "" || path.endsWith("/") ? `${path}index.html` : path;
107
+ }
108
+ export async function serveCommand(options, sessionOptions, io) {
109
+ const given = sessionOptions.evidence;
110
+ let builtAt = Date.now();
111
+ const first = openSession("serve", sessionOptions, io);
112
+ if (typeof first === "number")
113
+ return first;
114
+ let session = first;
115
+ let atlas;
116
+ try {
117
+ atlas = atlasOf(session);
118
+ }
119
+ catch (error) {
120
+ io.stderr(`intentset serve: the Atlas could not be built: ${error.message}\n`);
121
+ return 2;
122
+ }
123
+ const evidence = () => evidenceFiles(session.repo.root, io.cwd, given);
124
+ let paths = watched(session, evidence());
125
+ const levelLine = `${count(session.result.graph.artifacts.size, "artifact")}, ${count(session.errors, "error")}, ${count(session.warnings, "warning")} at ${session.level}${session.evidence === undefined
126
+ ? `; no run records were given or found in ${EVIDENCE_DIR}/, so L3 was not checked`
127
+ : ""}`;
128
+ if (options.out !== undefined)
129
+ return writeAtlas(session, atlas, options.out, levelLine, io);
130
+ /** Rebuild when a file the last build read has changed; keep serving the last good build if a rebuild fails. */
131
+ const refresh = () => {
132
+ const changed = changedSince(paths, builtAt);
133
+ if (changed === null)
134
+ return null;
135
+ const started = Date.now();
136
+ const next = openSession("serve", sessionOptions, io);
137
+ if (typeof next === "number")
138
+ return "the repository could not be read; the terminal says why";
139
+ try {
140
+ atlas = atlasOf(next);
141
+ }
142
+ catch (error) {
143
+ return `the Atlas could not be built: ${error.message}`;
144
+ }
145
+ session = next;
146
+ builtAt = started;
147
+ paths = watched(session, evidence());
148
+ io.stdout(`rebuilt: ${changed.slice(session.repo.root.length + 1) || "."} changed. ${snapshotLine(session.snapshot)}\n`);
149
+ return null;
150
+ };
151
+ const handle = (request, response) => {
152
+ const headers = {
153
+ "Cache-Control": "no-store",
154
+ "X-Content-Type-Options": "nosniff",
155
+ "Content-Security-Policy": "default-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; base-uri 'none'; form-action 'none'",
156
+ };
157
+ if (request.method !== "GET") {
158
+ response.writeHead(405, { ...headers, Allow: "GET", "Content-Type": "text/plain; charset=utf-8" });
159
+ response.end("Only GET is served.\n");
160
+ return;
161
+ }
162
+ const failure = refresh();
163
+ if (failure !== null) {
164
+ response.writeHead(500, { ...headers, "Content-Type": "text/plain; charset=utf-8" });
165
+ response.end(`The Atlas was not rebuilt: ${failure}.\n`);
166
+ return;
167
+ }
168
+ const path = requestPath(request.url);
169
+ const body = path === null ? undefined : atlas.get(path);
170
+ if (path === null || body === undefined) {
171
+ response.writeHead(404, { ...headers, "Content-Type": "text/plain; charset=utf-8" });
172
+ response.end("Not an Atlas page.\n");
173
+ return;
174
+ }
175
+ const type = TYPES[path.slice(path.lastIndexOf("."))] ?? "application/octet-stream";
176
+ response.writeHead(200, { ...headers, "Content-Type": type });
177
+ response.end(body);
178
+ };
179
+ const server = createServer(handle);
180
+ return new Promise((done) => {
181
+ server.once("error", (error) => {
182
+ io.stderr(`intentset serve: could not listen on ${options.host}:${options.port}: ${error.message}\n`);
183
+ done(2);
184
+ });
185
+ server.listen(options.port, options.host, () => {
186
+ const address = server.address();
187
+ const port = typeof address === "object" && address !== null ? address.port : options.port;
188
+ const host = options.host.includes(":") ? `[${options.host}]` : options.host;
189
+ io.stdout([
190
+ `Intentset Atlas for ${session.repo.config.repository} at http://${host}:${port}/`,
191
+ snapshotLine(session.snapshot),
192
+ levelLine,
193
+ NOT_FOR_PUBLICATION,
194
+ "Pages are rebuilt when a file they were built from changes: edit a record and reload. Interrupt to stop.",
195
+ "",
196
+ ].join("\n"));
197
+ const stop = () => {
198
+ server.close(() => done(0));
199
+ server.closeIdleConnections();
200
+ };
201
+ if (io.signal?.aborted)
202
+ stop();
203
+ else
204
+ io.signal?.addEventListener("abort", stop, { once: true });
205
+ });
206
+ });
207
+ }
208
+ function writeAtlas(session, atlas, out, levelLine, io) {
209
+ const dir = resolve(io.cwd, out);
210
+ let entries = [];
211
+ try {
212
+ entries = readdirSync(dir);
213
+ }
214
+ catch {
215
+ // Absent: it will be created.
216
+ }
217
+ if (entries.length > 0) {
218
+ io.stderr(`intentset serve: --out ${out} is not empty; write the Atlas into a new or empty directory.\n`);
219
+ return 2;
220
+ }
221
+ const where = outputDirProblem(session.repo, dir);
222
+ if (where !== null) {
223
+ io.stderr(`intentset serve: --out ${out} ${where}.\n`);
224
+ return 2;
225
+ }
226
+ for (const path of atlas.keys()) {
227
+ const problem = outputProblem(session.repo, join(dir, path));
228
+ if (problem !== null) {
229
+ io.stderr(`intentset serve: --out ${out}: ${path} ${problem}; nothing was written.\n`);
230
+ return 2;
231
+ }
232
+ }
233
+ for (const [path, text] of atlas) {
234
+ mkdirSync(dirname(join(dir, path)), { recursive: true });
235
+ writeFileSync(join(dir, path), text, { flag: "wx" });
236
+ }
237
+ io.stdout([
238
+ `Wrote the Atlas, ${count(atlas.size, "file")}, to ${out}`,
239
+ snapshotLine(session.snapshot),
240
+ levelLine,
241
+ NOT_FOR_PUBLICATION,
242
+ "",
243
+ ].join("\n"));
244
+ return session.errors > 0 ? 1 : 0;
245
+ }
246
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * What impact and context say before their answer: which snapshot, whether
3
+ * the graph validated, and the CORE003-style refusal for an ID the graph does
4
+ * not hold.
5
+ */
6
+ import { type Diagnostic } from "@intentset/core";
7
+ import type { Session } from "../session.ts";
8
+ /** The validation state a query ran over, so a reader knows whether the graph was whole. */
9
+ export declare function validationSummary(session: Session, level: string): {
10
+ level: string;
11
+ status: "fail" | "pass";
12
+ artifacts: number;
13
+ errors: number;
14
+ warnings: number;
15
+ };
16
+ export declare function validationLine(session: Session, level: string): string;
17
+ /** Core §5 and §11: an ID that resolves to nothing, reported as CORE003 would report an unresolved link. */
18
+ export declare function unresolved(id: string, session: Session): Diagnostic;
19
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,UAAU,EAAc,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;;;;;;EAQhE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,4GAA4G;AAC5G,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAgBnE"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * What impact and context say before their answer: which snapshot, whether
3
+ * the graph validated, and the CORE003-style refusal for an ID the graph does
4
+ * not hold.
5
+ */
6
+ import { ID_PATTERN } from "@intentset/core";
7
+ import { count } from "../output.js";
8
+ /** The validation state a query ran over, so a reader knows whether the graph was whole. */
9
+ export function validationSummary(session, level) {
10
+ return {
11
+ level,
12
+ status: session.result.ok ? "pass" : "fail",
13
+ artifacts: session.result.graph.artifacts.size,
14
+ errors: session.errors,
15
+ warnings: session.warnings,
16
+ };
17
+ }
18
+ export function validationLine(session, level) {
19
+ const v = validationSummary(session, level);
20
+ const line = `Validation: ${v.status} at ${level}, ${count(v.artifacts, "artifact")}, ${count(v.errors, "error")}, ${count(v.warnings, "warning")}`;
21
+ return v.status === "pass"
22
+ ? line
23
+ : `${line}. The graph may be incomplete; run \`intentset validate\` and fix the errors first.`;
24
+ }
25
+ /** Core §5 and §11: an ID that resolves to nothing, reported as CORE003 would report an unresolved link. */
26
+ export function unresolved(id, session) {
27
+ const scope = session.repo.config.scope.join(", ");
28
+ const malformed = !ID_PATTERN.test(id);
29
+ return {
30
+ code: "CORE003",
31
+ severity: "error",
32
+ origin: "graph",
33
+ artifact: null,
34
+ path: null,
35
+ message: malformed
36
+ ? `${id} is not an artifact ID; IDs are upper case, such as BEH-ASMT-SCHEDULE (Core §4).`
37
+ : `${id} does not resolve to an artifact in this graph (${count(session.result.graph.artifacts.size, "artifact")}, scope: ${scope}).`,
38
+ remediation: malformed
39
+ ? "Give the ID as written in the record's frontmatter; IDs are case-sensitive."
40
+ : "Check the spelling and case, and that the record's file is inside the configured scope.",
41
+ };
42
+ }
43
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAmB,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,4FAA4F;AAC5F,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,KAAa;IAC/D,OAAO;QACL,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAE,MAAgB,CAAC,CAAC,CAAE,MAAgB;QACjE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI;QAC9C,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,KAAa;IAC5D,MAAM,CAAC,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,MAAM,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;IACpJ,OAAO,CAAC,CAAC,MAAM,KAAK,MAAM;QACxB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,IAAI,qFAAqF,CAAC;AACnG,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,OAAgB;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,OAAO;QACL,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,SAAS;YAChB,CAAC,CAAC,GAAG,EAAE,kFAAkF;YACzF,CAAC,CAAC,GAAG,EAAE,mDAAmD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,KAAK,IAAI;QACvI,WAAW,EAAE,SAAS;YACpB,CAAC,CAAC,6EAA6E;YAC/E,CAAC,CAAC,yFAAyF;KAC9F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `intentset validate` (Core §11): the documents in scope through every check
3
+ * the requested level asks for. Diagnostics in `compareDiagnostics` order,
4
+ * then a summary naming the denominator, the level and the scope, then what
5
+ * each level above L1 adds: the architecture summary, coverage, publication
6
+ * readiness. Warnings never fail; errors exit 1. Never writes.
7
+ */
8
+ import { type Io } from "../output.ts";
9
+ import type { Session } from "../session.ts";
10
+ export declare function validateCommand(session: Session, asJson: boolean, io: Io): number;
11
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAA2B,KAAK,EAAE,EAAc,MAAM,cAAc,CAAC;AAE5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,CA2BjF"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `intentset validate` (Core §11): the documents in scope through every check
3
+ * the requested level asks for. Diagnostics in `compareDiagnostics` order,
4
+ * then a summary naming the denominator, the level and the scope, then what
5
+ * each level above L1 adds: the architecture summary, coverage, publication
6
+ * readiness. Warnings never fail; errors exit 1. Never writes.
7
+ */
8
+ import { count, formatDiagnostic, json, TOOL } from "../output.js";
9
+ import { levelJson, levelSections } from "../reports.js";
10
+ export function validateCommand(session, asJson, io) {
11
+ const { repo, diagnostics, errors, warnings, snapshot, level } = session;
12
+ const artifacts = session.result.graph.artifacts.size;
13
+ if (asJson) {
14
+ io.stdout(json({
15
+ tool: TOOL,
16
+ level,
17
+ scope: repo.config.scope,
18
+ commit: snapshot.commit,
19
+ ...(snapshot.commitUnavailable === undefined ? {} : { commitUnavailable: snapshot.commitUnavailable }),
20
+ graphHash: snapshot.graphHash,
21
+ summary: { documents: repo.inputs.length, artifacts, errors, warnings },
22
+ diagnostics,
23
+ ...levelJson(session),
24
+ }));
25
+ }
26
+ else {
27
+ for (const d of diagnostics)
28
+ io.stdout(formatDiagnostic(d));
29
+ const lines = [
30
+ `${count(artifacts, "artifact")}, ${count(errors, "error")}, ${count(warnings, "warning")} ` +
31
+ `(level ${level}, scope: ${repo.config.scope.join(", ")})`,
32
+ ...levelSections(session),
33
+ ];
34
+ io.stdout(`${lines.join("\n")}\n`);
35
+ }
36
+ return errors > 0 ? 1 : 0;
37
+ }
38
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAW,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGzD,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,MAAe,EAAE,EAAM;IACvE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;IACtD,IAAI,MAAM,EAAE,CAAC;QACX,EAAE,CAAC,MAAM,CACP,IAAI,CAAC;YACH,IAAI,EAAE,IAAI;YACV,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACtG,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;YACvE,WAAW;YACX,GAAG,SAAS,CAAC,OAAO,CAAC;SACtB,CAAC,CACH,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,WAAW;YAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG;YACZ,GAAG,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG;gBAC1F,UAAU,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC5D,GAAG,aAAa,CAAC,OAAO,CAAC;SAC1B,CAAC;QACF,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ export interface Base {
2
+ /** How the base was chosen, for the report: the ref given, "merge-base with main", or "HEAD~1". */
3
+ ref: string;
4
+ commit: string;
5
+ }
6
+ export interface Changes {
7
+ base: Base | null;
8
+ /** Why there is no base, when there is none. */
9
+ baseUnavailable?: string;
10
+ /** Changed between the base and HEAD, sorted. */
11
+ committed: string[];
12
+ /** Changed in the working tree or index against HEAD, and untracked files .gitignore does not exclude, sorted. */
13
+ uncommitted: string[];
14
+ }
15
+ /** The commit a ref names, or null. */
16
+ export declare function resolveCommit(root: string, ref: string): string | null;
17
+ /**
18
+ * The base: `given` when there is one (null when it names no commit), else
19
+ * the merge-base with main when that is not HEAD itself, else HEAD~1.
20
+ */
21
+ export declare function chooseBase(root: string, given: string | undefined): Base | null | {
22
+ unavailable: string;
23
+ };
24
+ export declare function changedFiles(root: string, base: Base | null): Omit<Changes, "base" | "baseUnavailable">;
25
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,IAAI;IACnB,mGAAmG;IACnG,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kHAAkH;IAClH,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAczG;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAWvG"}