@intentset/cli 0.2.0 → 0.3.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/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +38 -16
- package/dist/commands/serve.js.map +1 -1
- package/package.json +9 -9
- package/src/commands/serve.ts +34 -14
|
@@ -1 +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;
|
|
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;AA4DD,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,CAyGjH"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -52,9 +52,9 @@ export function atlasOf(session) {
|
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
54
|
* Every file a build read as text, and the directories holding them, absolute:
|
|
55
|
-
* a
|
|
56
|
-
* changes when a file is added to it or removed, which is how
|
|
57
|
-
* noticed.
|
|
55
|
+
* a different modification time or size on any of them means rebuild. A
|
|
56
|
+
* directory's time changes when a file is added to it or removed, which is how
|
|
57
|
+
* a new record is noticed.
|
|
58
58
|
*/
|
|
59
59
|
function watched(session, evidence) {
|
|
60
60
|
const { repo } = session;
|
|
@@ -81,16 +81,33 @@ function watched(session, evidence) {
|
|
|
81
81
|
}
|
|
82
82
|
return [...files];
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
84
|
+
/**
|
|
85
|
+
* Each path's modification time and size, or "absent". Compared with itself
|
|
86
|
+
* later rather than with a clock: a wall-clock start time in whole milliseconds
|
|
87
|
+
* is earlier than a file written in the same millisecond, and a file system's
|
|
88
|
+
* clock is coarser than the process's, so comparing the two calls a file
|
|
89
|
+
* written before the build "changed" (the 0.3.0 release run did, on Linux).
|
|
90
|
+
*/
|
|
91
|
+
function stamps(paths) {
|
|
92
|
+
const out = new Map();
|
|
93
|
+
for (const path of paths)
|
|
94
|
+
out.set(path, stamp(path));
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
function stamp(path) {
|
|
98
|
+
try {
|
|
99
|
+
const stat = statSync(path);
|
|
100
|
+
return `${stat.mtimeMs}:${stat.size}`;
|
|
93
101
|
}
|
|
102
|
+
catch {
|
|
103
|
+
// Absent: a file the build read was removed, or an optional file never existed.
|
|
104
|
+
return "absent";
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function changedSince(recorded) {
|
|
108
|
+
for (const [path, before] of recorded)
|
|
109
|
+
if (stamp(path) !== before)
|
|
110
|
+
return path;
|
|
94
111
|
return null;
|
|
95
112
|
}
|
|
96
113
|
/** The atlas path a request names, or null when it names none. Nothing here touches the file system. */
|
|
@@ -107,7 +124,6 @@ export function requestPath(url) {
|
|
|
107
124
|
}
|
|
108
125
|
export async function serveCommand(options, sessionOptions, io) {
|
|
109
126
|
const given = sessionOptions.evidence;
|
|
110
|
-
let builtAt = Date.now();
|
|
111
127
|
const first = openSession("serve", sessionOptions, io);
|
|
112
128
|
if (typeof first === "number")
|
|
113
129
|
return first;
|
|
@@ -122,6 +138,7 @@ export async function serveCommand(options, sessionOptions, io) {
|
|
|
122
138
|
}
|
|
123
139
|
const evidence = () => evidenceFiles(session.repo.root, io.cwd, given);
|
|
124
140
|
let paths = watched(session, evidence());
|
|
141
|
+
let recorded = stamps(paths);
|
|
125
142
|
const levelLine = `${count(session.result.graph.artifacts.size, "artifact")}, ${count(session.errors, "error")}, ${count(session.warnings, "warning")} at ${session.level}${session.evidence === undefined
|
|
126
143
|
? `; no run records were given or found in ${EVIDENCE_DIR}/, so L3 was not checked`
|
|
127
144
|
: ""}`;
|
|
@@ -129,10 +146,11 @@ export async function serveCommand(options, sessionOptions, io) {
|
|
|
129
146
|
return writeAtlas(session, atlas, options.out, levelLine, io);
|
|
130
147
|
/** Rebuild when a file the last build read has changed; keep serving the last good build if a rebuild fails. */
|
|
131
148
|
const refresh = () => {
|
|
132
|
-
const changed = changedSince(
|
|
149
|
+
const changed = changedSince(recorded);
|
|
133
150
|
if (changed === null)
|
|
134
151
|
return null;
|
|
135
|
-
|
|
152
|
+
// Stamped before the build reads anything, so an edit made while it runs shows as a change next time.
|
|
153
|
+
const before = stamps(paths);
|
|
136
154
|
const next = openSession("serve", sessionOptions, io);
|
|
137
155
|
if (typeof next === "number")
|
|
138
156
|
return "the repository could not be read; the terminal says why";
|
|
@@ -143,8 +161,12 @@ export async function serveCommand(options, sessionOptions, io) {
|
|
|
143
161
|
return `the Atlas could not be built: ${error.message}`;
|
|
144
162
|
}
|
|
145
163
|
session = next;
|
|
146
|
-
builtAt = started;
|
|
147
164
|
paths = watched(session, evidence());
|
|
165
|
+
const after = stamps(paths);
|
|
166
|
+
for (const [path, value] of before)
|
|
167
|
+
if (after.has(path))
|
|
168
|
+
after.set(path, value);
|
|
169
|
+
recorded = after;
|
|
148
170
|
io.stdout(`rebuilt: ${changed.slice(session.repo.root.length + 1) || "."} changed. ${snapshotLine(session.snapshot)}\n`);
|
|
149
171
|
return null;
|
|
150
172
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intentset/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "The intentset command: validate, graph, architecture check, evidence, impact, review, publish, serve, context, mcp.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
"intentset": "./dist/intentset.js"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@intentset/core": "^0.
|
|
35
|
-
"@intentset/markset-adapter": "^0.
|
|
36
|
-
"@intentset/architecture": "^0.
|
|
37
|
-
"@intentset/verification": "^0.
|
|
38
|
-
"@intentset/publisher": "^0.
|
|
39
|
-
"@intentset/atlas": "^0.
|
|
40
|
-
"@intentset/mcp": "^0.
|
|
41
|
-
"@intentset/conformance-suite": "^0.
|
|
34
|
+
"@intentset/core": "^0.3.0",
|
|
35
|
+
"@intentset/markset-adapter": "^0.3.0",
|
|
36
|
+
"@intentset/architecture": "^0.3.0",
|
|
37
|
+
"@intentset/verification": "^0.3.0",
|
|
38
|
+
"@intentset/publisher": "^0.3.0",
|
|
39
|
+
"@intentset/atlas": "^0.3.0",
|
|
40
|
+
"@intentset/mcp": "^0.3.0",
|
|
41
|
+
"@intentset/conformance-suite": "^0.3.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.32.0"
|
package/src/commands/serve.ts
CHANGED
|
@@ -65,9 +65,9 @@ export function atlasOf(session: Session): Map<string, string> {
|
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
67
|
* Every file a build read as text, and the directories holding them, absolute:
|
|
68
|
-
* a
|
|
69
|
-
* changes when a file is added to it or removed, which is how
|
|
70
|
-
* noticed.
|
|
68
|
+
* a different modification time or size on any of them means rebuild. A
|
|
69
|
+
* directory's time changes when a file is added to it or removed, which is how
|
|
70
|
+
* a new record is noticed.
|
|
71
71
|
*/
|
|
72
72
|
function watched(session: Session, evidence: readonly string[]): string[] {
|
|
73
73
|
const { repo } = session;
|
|
@@ -93,14 +93,31 @@ function watched(session: Session, evidence: readonly string[]): string[] {
|
|
|
93
93
|
return [...files];
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Each path's modification time and size, or "absent". Compared with itself
|
|
98
|
+
* later rather than with a clock: a wall-clock start time in whole milliseconds
|
|
99
|
+
* is earlier than a file written in the same millisecond, and a file system's
|
|
100
|
+
* clock is coarser than the process's, so comparing the two calls a file
|
|
101
|
+
* written before the build "changed" (the 0.3.0 release run did, on Linux).
|
|
102
|
+
*/
|
|
103
|
+
function stamps(paths: readonly string[]): Map<string, string> {
|
|
104
|
+
const out = new Map<string, string>();
|
|
105
|
+
for (const path of paths) out.set(path, stamp(path));
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function stamp(path: string): string {
|
|
110
|
+
try {
|
|
111
|
+
const stat = statSync(path);
|
|
112
|
+
return `${stat.mtimeMs}:${stat.size}`;
|
|
113
|
+
} catch {
|
|
114
|
+
// Absent: a file the build read was removed, or an optional file never existed.
|
|
115
|
+
return "absent";
|
|
103
116
|
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function changedSince(recorded: ReadonlyMap<string, string>): string | null {
|
|
120
|
+
for (const [path, before] of recorded) if (stamp(path) !== before) return path;
|
|
104
121
|
return null;
|
|
105
122
|
}
|
|
106
123
|
|
|
@@ -118,7 +135,6 @@ export function requestPath(url: string | undefined): string | null {
|
|
|
118
135
|
|
|
119
136
|
export async function serveCommand(options: ServeOptions, sessionOptions: SessionOptions, io: Io): Promise<number> {
|
|
120
137
|
const given = sessionOptions.evidence;
|
|
121
|
-
let builtAt = Date.now();
|
|
122
138
|
const first = openSession("serve", sessionOptions, io);
|
|
123
139
|
if (typeof first === "number") return first;
|
|
124
140
|
let session: Session = first;
|
|
@@ -131,6 +147,7 @@ export async function serveCommand(options: ServeOptions, sessionOptions: Sessio
|
|
|
131
147
|
}
|
|
132
148
|
const evidence = () => evidenceFiles(session.repo.root, io.cwd, given);
|
|
133
149
|
let paths = watched(session, evidence());
|
|
150
|
+
let recorded = stamps(paths);
|
|
134
151
|
const levelLine = `${count(session.result.graph.artifacts.size, "artifact")}, ${count(session.errors, "error")}, ${count(session.warnings, "warning")} at ${session.level}${
|
|
135
152
|
session.evidence === undefined
|
|
136
153
|
? `; no run records were given or found in ${EVIDENCE_DIR}/, so L3 was not checked`
|
|
@@ -141,9 +158,10 @@ export async function serveCommand(options: ServeOptions, sessionOptions: Sessio
|
|
|
141
158
|
|
|
142
159
|
/** Rebuild when a file the last build read has changed; keep serving the last good build if a rebuild fails. */
|
|
143
160
|
const refresh = (): string | null => {
|
|
144
|
-
const changed = changedSince(
|
|
161
|
+
const changed = changedSince(recorded);
|
|
145
162
|
if (changed === null) return null;
|
|
146
|
-
|
|
163
|
+
// Stamped before the build reads anything, so an edit made while it runs shows as a change next time.
|
|
164
|
+
const before = stamps(paths);
|
|
147
165
|
const next = openSession("serve", sessionOptions, io);
|
|
148
166
|
if (typeof next === "number") return "the repository could not be read; the terminal says why";
|
|
149
167
|
try {
|
|
@@ -152,8 +170,10 @@ export async function serveCommand(options: ServeOptions, sessionOptions: Sessio
|
|
|
152
170
|
return `the Atlas could not be built: ${(error as Error).message}`;
|
|
153
171
|
}
|
|
154
172
|
session = next;
|
|
155
|
-
builtAt = started;
|
|
156
173
|
paths = watched(session, evidence());
|
|
174
|
+
const after = stamps(paths);
|
|
175
|
+
for (const [path, value] of before) if (after.has(path)) after.set(path, value);
|
|
176
|
+
recorded = after;
|
|
157
177
|
io.stdout(
|
|
158
178
|
`rebuilt: ${changed.slice(session.repo.root.length + 1) || "."} changed. ${snapshotLine(session.snapshot)}\n`,
|
|
159
179
|
);
|