@principal-ai/subsystems-core 0.37.0 → 0.39.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/types/subsystem-model.d.ts +18 -5
- package/dist/types/subsystem-model.d.ts.map +1 -1
- package/dist/types/subsystem-model.js +4 -0
- package/dist/types/subsystem-model.js.map +1 -1
- package/package.json +1 -1
- package/schemas/subsystem-model.schema.json +14 -19
- package/src/types/subsystem-model.test.ts +54 -0
- package/src/types/subsystem-model.ts +20 -5
- package/src/validation.test.ts +2 -2
|
@@ -47,7 +47,7 @@ export type SubsystemStereotype = string;
|
|
|
47
47
|
* Topology relation type — structural / module / type claims between
|
|
48
48
|
* components. Belongs on `relations[]`, not on walkthrough hops.
|
|
49
49
|
*/
|
|
50
|
-
export type SubsystemRelationType = '
|
|
50
|
+
export type SubsystemRelationType = 'extends' | 'inherits' | 'implements' | 'mixes_in' | 'method' | 'references';
|
|
51
51
|
/**
|
|
52
52
|
* Walkthrough hop mechanism — runtime seams with a `file:line` site.
|
|
53
53
|
* Belongs on walkthrough steps; graph edges for these are derived.
|
|
@@ -73,10 +73,6 @@ export interface SubsystemDeclarationRef {
|
|
|
73
73
|
lineHash: string;
|
|
74
74
|
graphifyNodeId?: string;
|
|
75
75
|
capturedAt: string;
|
|
76
|
-
revision?: {
|
|
77
|
-
headSha: string;
|
|
78
|
-
dirtyHash?: string | null;
|
|
79
|
-
};
|
|
80
76
|
}
|
|
81
77
|
export interface SubsystemParamInfo {
|
|
82
78
|
name?: string;
|
|
@@ -329,6 +325,12 @@ export interface SubsystemWalkthrough {
|
|
|
329
325
|
* No host paths, provenance, document-level repo, store ids, or verification.
|
|
330
326
|
* Repo identity lives on each component's `purl`.
|
|
331
327
|
*/
|
|
328
|
+
/**
|
|
329
|
+
* A pinned commit for one referenced repo. Keyed by `purlRepoKey` (the purl
|
|
330
|
+
* with its fragment stripped). Commit-only — a dirty tree has no reproducible
|
|
331
|
+
* name and is never recorded as a coordinate.
|
|
332
|
+
*/
|
|
333
|
+
export type PurlCommit = string;
|
|
332
334
|
export interface SubsystemModelDocument {
|
|
333
335
|
/**
|
|
334
336
|
* Optional pointer to the JSON Schema that describes this file. Lets editors
|
|
@@ -342,6 +344,17 @@ export interface SubsystemModelDocument {
|
|
|
342
344
|
relations: SubsystemRelation[];
|
|
343
345
|
/** Runtime walkthroughs (ordered hops with sites). */
|
|
344
346
|
walkthroughs?: SubsystemWalkthrough[];
|
|
347
|
+
/**
|
|
348
|
+
* The commit each referenced repo was at when the model was created. The
|
|
349
|
+
* coordinate system for every `file:line` in the document: without it, a
|
|
350
|
+
* line pointer is ambiguous across commits. Immutable after create.
|
|
351
|
+
*/
|
|
352
|
+
createdAtCommits?: Record<string, PurlCommit>;
|
|
353
|
+
/**
|
|
354
|
+
* The commit each referenced repo was at when a full audit last passed
|
|
355
|
+
* against a clean referenced state. Absent until an audit earns it.
|
|
356
|
+
*/
|
|
357
|
+
verifiedAtCommits?: Record<string, PurlCommit>;
|
|
345
358
|
}
|
|
346
359
|
/**
|
|
347
360
|
* Hydrated model: portable document + store metadata.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subsystem-model.d.ts","sourceRoot":"","sources":["../../src/types/subsystem-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;0CAE0C;AAC1C,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,UAAU,GACV,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,MAAM,GACN,OAAO,GACP,UAAU,GACV,eAAe,CAAC;AAEpB,oEAAoE;AACpE,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzD;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEzC;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEzC;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,
|
|
1
|
+
{"version":3,"file":"subsystem-model.d.ts","sourceRoot":"","sources":["../../src/types/subsystem-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,10 @@ function toPortableDocument(doc) {
|
|
|
53
53
|
out.description = doc.description;
|
|
54
54
|
if (doc.walkthroughs)
|
|
55
55
|
out.walkthroughs = doc.walkthroughs;
|
|
56
|
+
if (doc.createdAtCommits)
|
|
57
|
+
out.createdAtCommits = doc.createdAtCommits;
|
|
58
|
+
if (doc.verifiedAtCommits)
|
|
59
|
+
out.verifiedAtCommits = doc.verifiedAtCommits;
|
|
56
60
|
return out;
|
|
57
61
|
}
|
|
58
62
|
exports.toPortableDocument = toPortableDocument;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subsystem-model.js","sourceRoot":"","sources":["../../src/types/subsystem-model.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;
|
|
1
|
+
{"version":3,"file":"subsystem-model.js","sourceRoot":"","sources":["../../src/types/subsystem-model.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -44,6 +44,20 @@
|
|
|
44
44
|
"items": {
|
|
45
45
|
"$ref": "#/$defs/walkthrough"
|
|
46
46
|
}
|
|
47
|
+
},
|
|
48
|
+
"createdAtCommits": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"description": "The commit each referenced repo was at when the model was created — the coordinate system for every file:line. Keyed by purl repo key (purl with fragment stripped), value a commit sha. Immutable after create.",
|
|
51
|
+
"additionalProperties": {
|
|
52
|
+
"type": "string"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"verifiedAtCommits": {
|
|
56
|
+
"type": "object",
|
|
57
|
+
"description": "The commit each referenced repo was at when a full audit last passed against a clean referenced state. Same keying as createdAtCommits. Absent until an audit earns it.",
|
|
58
|
+
"additionalProperties": {
|
|
59
|
+
"type": "string"
|
|
60
|
+
}
|
|
47
61
|
}
|
|
48
62
|
},
|
|
49
63
|
"$defs": {
|
|
@@ -96,7 +110,6 @@
|
|
|
96
110
|
"type": "string",
|
|
97
111
|
"description": "Topology relation type — structural / module / type claim between components.",
|
|
98
112
|
"enum": [
|
|
99
|
-
"imports",
|
|
100
113
|
"extends",
|
|
101
114
|
"inherits",
|
|
102
115
|
"implements",
|
|
@@ -390,24 +403,6 @@
|
|
|
390
403
|
"capturedAt": {
|
|
391
404
|
"type": "string",
|
|
392
405
|
"description": "ISO timestamp when this ref was recorded."
|
|
393
|
-
},
|
|
394
|
-
"revision": {
|
|
395
|
-
"type": "object",
|
|
396
|
-
"required": [
|
|
397
|
-
"headSha"
|
|
398
|
-
],
|
|
399
|
-
"additionalProperties": false,
|
|
400
|
-
"properties": {
|
|
401
|
-
"headSha": {
|
|
402
|
-
"type": "string"
|
|
403
|
-
},
|
|
404
|
-
"dirtyHash": {
|
|
405
|
-
"type": [
|
|
406
|
-
"string",
|
|
407
|
-
"null"
|
|
408
|
-
]
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
406
|
}
|
|
412
407
|
}
|
|
413
408
|
},
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { toPortableDocument } from "./subsystem-model";
|
|
5
|
+
|
|
6
|
+
const schema = JSON.parse(
|
|
7
|
+
readFileSync(
|
|
8
|
+
resolve(import.meta.dir, "../../schemas/subsystem-model.schema.json"),
|
|
9
|
+
"utf8",
|
|
10
|
+
),
|
|
11
|
+
) as {
|
|
12
|
+
properties: Record<string, unknown>;
|
|
13
|
+
$defs: Record<string, { properties?: Record<string, unknown> }>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
describe("toPortableDocument", () => {
|
|
17
|
+
test("keeps per-purl commit provenance (the coordinate for file:line)", () => {
|
|
18
|
+
const portable = toPortableDocument({
|
|
19
|
+
title: "t",
|
|
20
|
+
components: [],
|
|
21
|
+
relations: [],
|
|
22
|
+
createdAtCommits: { "pkg:github/a/b": "abc" },
|
|
23
|
+
verifiedAtCommits: { "pkg:github/a/b": "def" },
|
|
24
|
+
} as unknown as Parameters<typeof toPortableDocument>[0]);
|
|
25
|
+
expect(portable.createdAtCommits).toEqual({ "pkg:github/a/b": "abc" });
|
|
26
|
+
expect(portable.verifiedAtCommits).toEqual({ "pkg:github/a/b": "def" });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("still drops store metadata", () => {
|
|
30
|
+
const portable = toPortableDocument({
|
|
31
|
+
title: "t",
|
|
32
|
+
components: [],
|
|
33
|
+
relations: [],
|
|
34
|
+
id: "sg-1",
|
|
35
|
+
createdAt: "now",
|
|
36
|
+
verification: {},
|
|
37
|
+
lastOpenedAt: "now",
|
|
38
|
+
} as unknown as Parameters<typeof toPortableDocument>[0]);
|
|
39
|
+
expect("id" in portable).toBe(false);
|
|
40
|
+
expect("verification" in portable).toBe(false);
|
|
41
|
+
expect("lastOpenedAt" in portable).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe("subsystem-model schema", () => {
|
|
46
|
+
test("declares the per-purl commit maps", () => {
|
|
47
|
+
expect(schema.properties.createdAtCommits).toBeDefined();
|
|
48
|
+
expect(schema.properties.verifiedAtCommits).toBeDefined();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("no longer carries per-declaration revision (superseded by the model-level pin)", () => {
|
|
52
|
+
expect(schema.$defs.declarationRef?.properties?.revision).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -63,7 +63,6 @@ export type SubsystemStereotype = string;
|
|
|
63
63
|
* components. Belongs on `relations[]`, not on walkthrough hops.
|
|
64
64
|
*/
|
|
65
65
|
export type SubsystemRelationType =
|
|
66
|
-
| 'imports'
|
|
67
66
|
| 'extends'
|
|
68
67
|
| 'inherits'
|
|
69
68
|
| 'implements'
|
|
@@ -118,10 +117,6 @@ export interface SubsystemDeclarationRef {
|
|
|
118
117
|
lineHash: string;
|
|
119
118
|
graphifyNodeId?: string;
|
|
120
119
|
capturedAt: string;
|
|
121
|
-
revision?: {
|
|
122
|
-
headSha: string;
|
|
123
|
-
dirtyHash?: string | null;
|
|
124
|
-
};
|
|
125
120
|
}
|
|
126
121
|
|
|
127
122
|
export interface SubsystemParamInfo {
|
|
@@ -404,6 +399,13 @@ export interface SubsystemWalkthrough {
|
|
|
404
399
|
* No host paths, provenance, document-level repo, store ids, or verification.
|
|
405
400
|
* Repo identity lives on each component's `purl`.
|
|
406
401
|
*/
|
|
402
|
+
/**
|
|
403
|
+
* A pinned commit for one referenced repo. Keyed by `purlRepoKey` (the purl
|
|
404
|
+
* with its fragment stripped). Commit-only — a dirty tree has no reproducible
|
|
405
|
+
* name and is never recorded as a coordinate.
|
|
406
|
+
*/
|
|
407
|
+
export type PurlCommit = string;
|
|
408
|
+
|
|
407
409
|
export interface SubsystemModelDocument {
|
|
408
410
|
/**
|
|
409
411
|
* Optional pointer to the JSON Schema that describes this file. Lets editors
|
|
@@ -418,6 +420,17 @@ export interface SubsystemModelDocument {
|
|
|
418
420
|
relations: SubsystemRelation[];
|
|
419
421
|
/** Runtime walkthroughs (ordered hops with sites). */
|
|
420
422
|
walkthroughs?: SubsystemWalkthrough[];
|
|
423
|
+
/**
|
|
424
|
+
* The commit each referenced repo was at when the model was created. The
|
|
425
|
+
* coordinate system for every `file:line` in the document: without it, a
|
|
426
|
+
* line pointer is ambiguous across commits. Immutable after create.
|
|
427
|
+
*/
|
|
428
|
+
createdAtCommits?: Record<string, PurlCommit>;
|
|
429
|
+
/**
|
|
430
|
+
* The commit each referenced repo was at when a full audit last passed
|
|
431
|
+
* against a clean referenced state. Absent until an audit earns it.
|
|
432
|
+
*/
|
|
433
|
+
verifiedAtCommits?: Record<string, PurlCommit>;
|
|
421
434
|
}
|
|
422
435
|
|
|
423
436
|
/**
|
|
@@ -470,6 +483,8 @@ export function toPortableDocument(
|
|
|
470
483
|
if (doc.$schema) out.$schema = doc.$schema;
|
|
471
484
|
if (doc.description) out.description = doc.description;
|
|
472
485
|
if (doc.walkthroughs) out.walkthroughs = doc.walkthroughs;
|
|
486
|
+
if (doc.createdAtCommits) out.createdAtCommits = doc.createdAtCommits;
|
|
487
|
+
if (doc.verifiedAtCommits) out.verifiedAtCommits = doc.verifiedAtCommits;
|
|
473
488
|
return out;
|
|
474
489
|
}
|
|
475
490
|
|
package/src/validation.test.ts
CHANGED
|
@@ -29,7 +29,7 @@ describe('validateSubsystemModelCrossField', () => {
|
|
|
29
29
|
test('accepts a consistent document', () => {
|
|
30
30
|
const d = doc({
|
|
31
31
|
components: [comp('a'), comp('b')],
|
|
32
|
-
relations: [{ id: 'r1', from: 'a', to: 'b', relationType: '
|
|
32
|
+
relations: [{ id: 'r1', from: 'a', to: 'b', relationType: 'references' }],
|
|
33
33
|
walkthroughs: [
|
|
34
34
|
{
|
|
35
35
|
id: 'w1',
|
|
@@ -53,7 +53,7 @@ describe('validateSubsystemModelCrossField', () => {
|
|
|
53
53
|
const problems = validateSubsystemModelCrossField(
|
|
54
54
|
doc({
|
|
55
55
|
components: [comp('a')],
|
|
56
|
-
relations: [{ id: 'r1', from: 'a', to: 'ghost', relationType: '
|
|
56
|
+
relations: [{ id: 'r1', from: 'a', to: 'ghost', relationType: 'references' }],
|
|
57
57
|
}),
|
|
58
58
|
);
|
|
59
59
|
expect(problems).toHaveLength(1);
|