@memoarchitect/tools 0.7.2 → 0.8.7
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/README.md +1 -1
- package/corpus/README.md +63 -0
- package/corpus/sysml-v2-release/bnf/SysML-graphical-bnf.kgbnf +2264 -0
- package/package.json +4 -3
- package/packages/tools/lib/analysis/dsm.d.ts +1 -1
- package/packages/tools/lib/analysis/dsm.d.ts.map +1 -1
- package/packages/tools/lib/analysis/dsm.js +1 -1
- package/packages/tools/lib/analysis/dsm.js.map +1 -1
- package/packages/tools/lib/bin/memo.js +25 -0
- package/packages/tools/lib/bin/memo.js.map +1 -1
- package/packages/tools/lib/browser/index.d.ts +2 -0
- package/packages/tools/lib/browser/index.d.ts.map +1 -1
- package/packages/tools/lib/browser/index.js +1 -0
- package/packages/tools/lib/browser/index.js.map +1 -1
- package/packages/tools/lib/commands/dev.d.ts.map +1 -1
- package/packages/tools/lib/commands/dev.js +37 -15
- package/packages/tools/lib/commands/dev.js.map +1 -1
- package/packages/tools/lib/commands/dhf-lint.d.ts +10 -0
- package/packages/tools/lib/commands/dhf-lint.d.ts.map +1 -0
- package/packages/tools/lib/commands/dhf-lint.js +72 -0
- package/packages/tools/lib/commands/dhf-lint.js.map +1 -0
- package/packages/tools/lib/commands/dhf.d.ts.map +1 -1
- package/packages/tools/lib/commands/dhf.js +7 -1
- package/packages/tools/lib/commands/dhf.js.map +1 -1
- package/packages/tools/lib/commands/standards.d.ts +28 -0
- package/packages/tools/lib/commands/standards.d.ts.map +1 -0
- package/packages/tools/lib/commands/standards.js +203 -0
- package/packages/tools/lib/commands/standards.js.map +1 -0
- package/packages/tools/lib/commands/validate.d.ts.map +1 -1
- package/packages/tools/lib/commands/validate.js +13 -2
- package/packages/tools/lib/commands/validate.js.map +1 -1
- package/packages/tools/lib/dhf/document-compiler.d.ts.map +1 -1
- package/packages/tools/lib/dhf/document-compiler.js +13 -8
- package/packages/tools/lib/dhf/document-compiler.js.map +1 -1
- package/packages/tools/lib/dhf/document-registry.d.ts +16 -2
- package/packages/tools/lib/dhf/document-registry.d.ts.map +1 -1
- package/packages/tools/lib/dhf/document-registry.js +74 -23
- package/packages/tools/lib/dhf/document-registry.js.map +1 -1
- package/packages/tools/lib/dhf/index.d.ts +3 -0
- package/packages/tools/lib/dhf/index.d.ts.map +1 -1
- package/packages/tools/lib/dhf/index.js +4 -0
- package/packages/tools/lib/dhf/index.js.map +1 -1
- package/packages/tools/lib/dhf/query-engine.d.ts +12 -1
- package/packages/tools/lib/dhf/query-engine.d.ts.map +1 -1
- package/packages/tools/lib/dhf/query-engine.js +2 -1
- package/packages/tools/lib/dhf/query-engine.js.map +1 -1
- package/packages/tools/lib/dhf/query-executor.d.ts +72 -5
- package/packages/tools/lib/dhf/query-executor.d.ts.map +1 -1
- package/packages/tools/lib/dhf/query-executor.js +471 -81
- package/packages/tools/lib/dhf/query-executor.js.map +1 -1
- package/packages/tools/lib/dhf/script-runner.js +6 -6
- package/packages/tools/lib/dhf/script-runner.js.map +1 -1
- package/packages/tools/lib/dhf/standards-block.d.ts +40 -0
- package/packages/tools/lib/dhf/standards-block.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-block.js +223 -0
- package/packages/tools/lib/dhf/standards-block.js.map +1 -0
- package/packages/tools/lib/dhf/standards-library.d.ts +123 -0
- package/packages/tools/lib/dhf/standards-library.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-library.js +295 -0
- package/packages/tools/lib/dhf/standards-library.js.map +1 -0
- package/packages/tools/lib/dhf/standards-report.d.ts +189 -0
- package/packages/tools/lib/dhf/standards-report.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-report.js +384 -0
- package/packages/tools/lib/dhf/standards-report.js.map +1 -0
- package/packages/tools/lib/dhf/template-lint.d.ts +42 -0
- package/packages/tools/lib/dhf/template-lint.d.ts.map +1 -0
- package/packages/tools/lib/dhf/template-lint.js +421 -0
- package/packages/tools/lib/dhf/template-lint.js.map +1 -0
- package/packages/tools/lib/dhf/template-resolver.d.ts.map +1 -1
- package/packages/tools/lib/dhf/template-resolver.js +17 -5
- package/packages/tools/lib/dhf/template-resolver.js.map +1 -1
- package/packages/tools/lib/importer/cameo-importer.js +2 -2
- package/packages/tools/lib/importer/cameo-importer.js.map +1 -1
- package/packages/tools/lib/importer/ea-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/ea-importer.js +4 -3
- package/packages/tools/lib/importer/ea-importer.js.map +1 -1
- package/packages/tools/lib/importer/owl-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/owl-importer.js +2 -3
- package/packages/tools/lib/importer/owl-importer.js.map +1 -1
- package/packages/tools/lib/language/generated/ast.d.ts +1155 -55
- package/packages/tools/lib/language/generated/ast.d.ts.map +1 -1
- package/packages/tools/lib/language/generated/ast.js +922 -9
- package/packages/tools/lib/language/generated/ast.js.map +1 -1
- package/packages/tools/lib/language/generated/grammar.d.ts.map +1 -1
- package/packages/tools/lib/language/generated/grammar.js +3643 -427
- package/packages/tools/lib/language/generated/grammar.js.map +1 -1
- package/packages/tools/lib/model/builder.d.ts.map +1 -1
- package/packages/tools/lib/model/builder.js +725 -43
- package/packages/tools/lib/model/builder.js.map +1 -1
- package/packages/tools/lib/model/kind-registry.d.ts +20 -0
- package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/kind-registry.js +38 -0
- package/packages/tools/lib/model/kind-registry.js.map +1 -1
- package/packages/tools/lib/model/manifest.d.ts +8 -0
- package/packages/tools/lib/model/manifest.d.ts.map +1 -1
- package/packages/tools/lib/model/manifest.js +3 -0
- package/packages/tools/lib/model/manifest.js.map +1 -1
- package/packages/tools/lib/model/naming.d.ts +57 -0
- package/packages/tools/lib/model/naming.d.ts.map +1 -0
- package/packages/tools/lib/model/naming.js +69 -0
- package/packages/tools/lib/model/naming.js.map +1 -0
- package/packages/tools/lib/model/native-project.d.ts.map +1 -1
- package/packages/tools/lib/model/native-project.js +10 -0
- package/packages/tools/lib/model/native-project.js.map +1 -1
- package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
- package/packages/tools/lib/model/ontology-loader.js +3 -0
- package/packages/tools/lib/model/ontology-loader.js.map +1 -1
- package/packages/tools/lib/model/relationship-legality.d.ts +17 -0
- package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -1
- package/packages/tools/lib/model/relationship-legality.js.map +1 -1
- package/packages/tools/lib/model/relationship-registry.d.ts +77 -0
- package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/relationship-registry.js +217 -2
- package/packages/tools/lib/model/relationship-registry.js.map +1 -1
- package/packages/tools/lib/model/semantic.d.ts +46 -0
- package/packages/tools/lib/model/semantic.d.ts.map +1 -1
- package/packages/tools/lib/model/semantic.js +3 -0
- package/packages/tools/lib/model/semantic.js.map +1 -1
- package/packages/tools/lib/model/short-id.d.ts.map +1 -1
- package/packages/tools/lib/model/short-id.js +1 -3
- package/packages/tools/lib/model/short-id.js.map +1 -1
- package/packages/tools/lib/model/view-deriver.d.ts +10 -1
- package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
- package/packages/tools/lib/model/view-deriver.js +103 -5
- package/packages/tools/lib/model/view-deriver.js.map +1 -1
- package/packages/tools/lib/protocol/messages.d.ts +85 -3
- package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
- package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
- package/packages/tools/lib/server/dev-server.js +158 -5
- package/packages/tools/lib/server/dev-server.js.map +1 -1
- package/packages/tools/lib/server/package-source.d.ts +26 -0
- package/packages/tools/lib/server/package-source.d.ts.map +1 -0
- package/packages/tools/lib/server/package-source.js +81 -0
- package/packages/tools/lib/server/package-source.js.map +1 -0
- package/packages/tools/lib/server/package-writer.d.ts +94 -0
- package/packages/tools/lib/server/package-writer.d.ts.map +1 -0
- package/packages/tools/lib/server/package-writer.js +317 -0
- package/packages/tools/lib/server/package-writer.js.map +1 -0
- package/packages/tools/lib/server/persistor.d.ts +20 -0
- package/packages/tools/lib/server/persistor.d.ts.map +1 -1
- package/packages/tools/lib/server/persistor.js +29 -8
- package/packages/tools/lib/server/persistor.js.map +1 -1
- package/packages/tools/lib/server/relationship-writer.d.ts +13 -1
- package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
- package/packages/tools/lib/server/relationship-writer.js +59 -0
- package/packages/tools/lib/server/relationship-writer.js.map +1 -1
- package/packages/tools/lib/server/sysml-notation.d.ts +1 -1
- package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -1
- package/packages/tools/lib/server/sysml-notation.js +17 -0
- package/packages/tools/lib/server/sysml-notation.js.map +1 -1
- package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
- package/packages/tools/lib/server/view-layout-store.js +1 -0
- package/packages/tools/lib/server/view-layout-store.js.map +1 -1
- package/packages/tools/lib/validator/behavior-validator.d.ts +1 -1
- package/packages/tools/lib/validator/behavior-validator.js +1 -1
- package/packages/tools/lib/validator/constraint-eval.d.ts +16 -0
- package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
- package/packages/tools/lib/validator/constraint-eval.js +102 -0
- package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
- package/packages/tools/src/grammar/memo-sysml.langium +415 -25
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
// ─── Standards Conformance Report ─────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// One computation, three outputs. `memo standards check`, the shipped
|
|
4
|
+
// standards-checklist.md template, and the Architect's gap badges all call
|
|
5
|
+
// `computeStandardsReport` and render the same numbers. There is deliberately
|
|
6
|
+
// no second place that decides what a gap is.
|
|
7
|
+
//
|
|
8
|
+
// required(project) clauses of every standard whose appliesToRegime
|
|
9
|
+
// intersects the regimes the project declares
|
|
10
|
+
// claimed(project) clauses targeted by a ConformsTo, or cited in the
|
|
11
|
+
// frontmatter of a document that exists in the project
|
|
12
|
+
// evidenced(project) claimed, where the claim also reaches verification,
|
|
13
|
+
// risk-control or approval evidence
|
|
14
|
+
//
|
|
15
|
+
// ─── Where this must NOT live ────────────────────────────────────────────────
|
|
16
|
+
//
|
|
17
|
+
// Not in a consistency rule. `memo_rules_coverage` is a deliberately empty
|
|
18
|
+
// package whose header states the reason: regulatory coverage is
|
|
19
|
+
// project-profile dependent, and a universal per-element constraint would
|
|
20
|
+
// force every project to implement every standard pack. Coverage is a REPORT.
|
|
21
|
+
// A red rule says "this model is wrong"; a gap says "this project has not
|
|
22
|
+
// claimed that clause yet", which is the normal state of a project in flight.
|
|
23
|
+
//
|
|
24
|
+
// ─── Why the library, not the element index ──────────────────────────────────
|
|
25
|
+
//
|
|
26
|
+
// The clause instances are ontology content. A consuming project resolves the
|
|
27
|
+
// ontology as a library root and its own model therefore holds the clause
|
|
28
|
+
// *definitions* through the registries but not the clause *instances* as
|
|
29
|
+
// elements — so `required()` is computed from the standards library reader,
|
|
30
|
+
// which reads the packs off disk in both the ontology repo and a consumer.
|
|
31
|
+
// `claimed()` comes from the project's own ConformsTo edges, whose endpoints
|
|
32
|
+
// name clauses by usage name or `id`; both are indexed here so an edge
|
|
33
|
+
// resolves whether or not the clause is in the element map.
|
|
34
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
35
|
+
import { resolveClause } from './standards-library.js';
|
|
36
|
+
import { loadTemplate, parseFrontmatter } from './template-resolver.js';
|
|
37
|
+
// ─── Evidence ─────────────────────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* The three evidence categories, anchored on ontology TYPE names rather than
|
|
40
|
+
* on relationship names.
|
|
41
|
+
*
|
|
42
|
+
* A claim is evidenced when the claiming element is linked — by any relation,
|
|
43
|
+
* in either direction — to an element of one of these types. Anchoring on the
|
|
44
|
+
* type means a new relation that reaches a verification case counts without a
|
|
45
|
+
* change here, and every subtype counts too, because membership is resolved
|
|
46
|
+
* through the kind registry's supertype closure rather than by name equality.
|
|
47
|
+
*
|
|
48
|
+
* These three names are the one thing this file states about the ontology.
|
|
49
|
+
* They are the plan's own definition of `evidenced` — "verification /
|
|
50
|
+
* risk-control / approval evidence" — and MEMO has no evidence-category
|
|
51
|
+
* concept to read them from. If one is ever added, this map is what it
|
|
52
|
+
* replaces.
|
|
53
|
+
*/
|
|
54
|
+
const EVIDENCE_ANCHORS = {
|
|
55
|
+
verification: ['MemoVerificationCase', 'MemoEvidence'],
|
|
56
|
+
'risk-control': ['RiskControlMeasure'],
|
|
57
|
+
approval: ['ControlledArtifact'],
|
|
58
|
+
};
|
|
59
|
+
// ─── Supertype closure ────────────────────────────────────────────────────────
|
|
60
|
+
/** Every kind that is, or specializes, one of `anchors`. */
|
|
61
|
+
function closureOf(anchors, registry) {
|
|
62
|
+
const out = new Set(anchors);
|
|
63
|
+
if (!registry)
|
|
64
|
+
return out;
|
|
65
|
+
const stack = [...anchors];
|
|
66
|
+
while (stack.length > 0) {
|
|
67
|
+
const name = stack.pop();
|
|
68
|
+
for (const derived of registry.getKind(name)?.derivedBy ?? []) {
|
|
69
|
+
if (out.has(derived))
|
|
70
|
+
continue;
|
|
71
|
+
out.add(derived);
|
|
72
|
+
stack.push(derived);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
// ─── The computation ──────────────────────────────────────────────────────────
|
|
78
|
+
export function computeStandardsReport(input) {
|
|
79
|
+
const { library, model, kindRegistry, documentClauses = [] } = input;
|
|
80
|
+
const regimes = input.regimes ?? [];
|
|
81
|
+
const regimeSource = input.regimeSource ?? (regimes.length > 0 ? 'flag' : 'none');
|
|
82
|
+
// ── Index every clause by both names an edge can address it with ────────
|
|
83
|
+
const clauseByRef = new Map();
|
|
84
|
+
for (const std of library.standards.values()) {
|
|
85
|
+
for (const clause of std.clauses.values()) {
|
|
86
|
+
clauseByRef.set(clause.name, { std, clause });
|
|
87
|
+
if (clause.id)
|
|
88
|
+
clauseByRef.set(clause.id, { std, clause });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// ── claimed(): ConformsTo edges ─────────────────────────────────────────
|
|
92
|
+
/** clause usage name → claiming elements */
|
|
93
|
+
const claimants = new Map();
|
|
94
|
+
for (const rel of model?.relationshipsByType.get('conformsTo') ?? []) {
|
|
95
|
+
const hit = clauseByRef.get(rel.targetId);
|
|
96
|
+
if (!hit)
|
|
97
|
+
continue;
|
|
98
|
+
const el = model?.elements.get(rel.sourceId);
|
|
99
|
+
const list = claimants.get(hit.clause.name) ?? [];
|
|
100
|
+
list.push({
|
|
101
|
+
elementId: rel.sourceId,
|
|
102
|
+
name: el?.name ?? rel.sourceId,
|
|
103
|
+
kind: el?.kind ?? 'unknown',
|
|
104
|
+
});
|
|
105
|
+
claimants.set(hit.clause.name, list);
|
|
106
|
+
}
|
|
107
|
+
// ── claimed(): document frontmatter ─────────────────────────────────────
|
|
108
|
+
const docsByClause = new Map();
|
|
109
|
+
for (const cite of documentClauses) {
|
|
110
|
+
const std = library.standards.get(cite.designation);
|
|
111
|
+
const clause = std?.clauses.get(cite.clauseNumber);
|
|
112
|
+
if (!clause)
|
|
113
|
+
continue;
|
|
114
|
+
const list = docsByClause.get(clause.name) ?? [];
|
|
115
|
+
if (!list.some(d => d.documentId === cite.documentId)) {
|
|
116
|
+
list.push({ documentId: cite.documentId, documentTitle: cite.documentTitle });
|
|
117
|
+
}
|
|
118
|
+
docsByClause.set(clause.name, list);
|
|
119
|
+
}
|
|
120
|
+
// ── evidenced(): what each element reaches ──────────────────────────────
|
|
121
|
+
const anchorSets = new Map();
|
|
122
|
+
for (const [category, anchors] of Object.entries(EVIDENCE_ANCHORS)) {
|
|
123
|
+
anchorSets.set(category, closureOf(anchors, kindRegistry));
|
|
124
|
+
}
|
|
125
|
+
const evidenceCache = new Map();
|
|
126
|
+
const evidenceFor = (elementId) => {
|
|
127
|
+
const cached = evidenceCache.get(elementId);
|
|
128
|
+
if (cached)
|
|
129
|
+
return cached;
|
|
130
|
+
const found = [];
|
|
131
|
+
if (model) {
|
|
132
|
+
const links = [
|
|
133
|
+
...(model.outgoing.get(elementId) ?? []).map(r => ({ rel: r, otherId: r.targetId })),
|
|
134
|
+
...(model.incoming.get(elementId) ?? []).map(r => ({ rel: r, otherId: r.sourceId })),
|
|
135
|
+
];
|
|
136
|
+
for (const { rel, otherId } of links) {
|
|
137
|
+
const other = model.elements.get(otherId);
|
|
138
|
+
if (!other)
|
|
139
|
+
continue;
|
|
140
|
+
for (const [category, kinds] of anchorSets) {
|
|
141
|
+
if (!kinds.has(other.kind))
|
|
142
|
+
continue;
|
|
143
|
+
// An unapproved controlled artifact is a document, not an
|
|
144
|
+
// approval. Evidence that has not been approved is exactly
|
|
145
|
+
// the thing an auditor is looking for the absence of.
|
|
146
|
+
if (category === 'approval' && !isApproved(other))
|
|
147
|
+
continue;
|
|
148
|
+
found.push({
|
|
149
|
+
category,
|
|
150
|
+
elementId: otherId,
|
|
151
|
+
elementName: other.name,
|
|
152
|
+
elementKind: other.kind,
|
|
153
|
+
via: rel.type,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
evidenceCache.set(elementId, found);
|
|
159
|
+
return found;
|
|
160
|
+
};
|
|
161
|
+
// ── Roll up per standard ────────────────────────────────────────────────
|
|
162
|
+
const required = [];
|
|
163
|
+
const unrequired = [];
|
|
164
|
+
for (const std of [...library.standards.values()].sort((a, b) => a.designation.localeCompare(b.designation))) {
|
|
165
|
+
const isRequired = regimes.length === 0
|
|
166
|
+
? std.regimes.length > 0
|
|
167
|
+
: std.regimes.some(r => regimes.includes(r));
|
|
168
|
+
const clauses = [];
|
|
169
|
+
for (const clause of [...std.clauses.values()].sort(byClauseNumber)) {
|
|
170
|
+
const claimedBy = claimants.get(clause.name) ?? [];
|
|
171
|
+
const documents = docsByClause.get(clause.name) ?? [];
|
|
172
|
+
// Evidence attaches to the claiming element, and also to the
|
|
173
|
+
// clause itself: gpca authors TracesToDocument from the clause to
|
|
174
|
+
// the approved document, which is where a reviewer looks first.
|
|
175
|
+
const evidence = [
|
|
176
|
+
...evidenceFor(clause.name),
|
|
177
|
+
...(clause.id ? evidenceFor(clause.id) : []),
|
|
178
|
+
...claimedBy.flatMap(c => evidenceFor(c.elementId)),
|
|
179
|
+
];
|
|
180
|
+
const isClaimed = claimedBy.length > 0 || documents.length > 0;
|
|
181
|
+
clauses.push({
|
|
182
|
+
name: clause.name,
|
|
183
|
+
id: clause.id,
|
|
184
|
+
clauseNumber: clause.clauseNumber,
|
|
185
|
+
title: clause.title,
|
|
186
|
+
normativeStrength: clause.normativeStrength,
|
|
187
|
+
status: !isClaimed ? 'gap' : evidence.length > 0 ? 'evidenced' : 'claimed',
|
|
188
|
+
claimants: claimedBy,
|
|
189
|
+
documents,
|
|
190
|
+
evidence: dedupeEvidence(evidence),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
const row = {
|
|
194
|
+
designation: std.designation,
|
|
195
|
+
edition: std.edition,
|
|
196
|
+
issuer: std.issuer,
|
|
197
|
+
regimes: std.regimes,
|
|
198
|
+
required: isRequired,
|
|
199
|
+
clauses,
|
|
200
|
+
totals: totalsOf(clauses),
|
|
201
|
+
};
|
|
202
|
+
(isRequired ? required : unrequired).push(row);
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
regimes,
|
|
206
|
+
regimeSource,
|
|
207
|
+
regimeVocabulary: library.regimeVocabulary,
|
|
208
|
+
standards: required,
|
|
209
|
+
unrequired,
|
|
210
|
+
totals: required.reduce((acc, s) => ({
|
|
211
|
+
clauses: acc.clauses + s.totals.clauses,
|
|
212
|
+
claimed: acc.claimed + s.totals.claimed,
|
|
213
|
+
evidenced: acc.evidenced + s.totals.evidenced,
|
|
214
|
+
gaps: acc.gaps + s.totals.gaps,
|
|
215
|
+
}), { clauses: 0, claimed: 0, evidenced: 0, gaps: 0 }),
|
|
216
|
+
unknownRegimes: library.unknownRegimes,
|
|
217
|
+
orphanClauses: library.orphanClauses,
|
|
218
|
+
libraryMissing: library.sourceDir === null,
|
|
219
|
+
// True when the kind registry was available and the evidence closure
|
|
220
|
+
// could widen anchors to their subtypes. False means we under-state
|
|
221
|
+
// evidence — the safer direction, but still wrong, so we say so.
|
|
222
|
+
evidenceResolvable: !!kindRegistry,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Resolve the clauses cited by documents that EXIST in the project.
|
|
227
|
+
*
|
|
228
|
+
* Existence is the point. The clause list a template carries says what a
|
|
229
|
+
* document of that type would claim; only a document actually present in
|
|
230
|
+
* `dhf/documents/` claims it. A checklist built from the template set would
|
|
231
|
+
* report full coverage for a project that has written nothing.
|
|
232
|
+
*
|
|
233
|
+
* A document's own frontmatter wins over its template's, because the workbench
|
|
234
|
+
* merges hand edits back into the file and a document that has narrowed or
|
|
235
|
+
* extended its claim has said so there.
|
|
236
|
+
*/
|
|
237
|
+
export function collectDocumentClauses(docs, library, customTemplateDir) {
|
|
238
|
+
const out = [];
|
|
239
|
+
for (const doc of docs) {
|
|
240
|
+
let standard;
|
|
241
|
+
let clauses;
|
|
242
|
+
if (doc.content) {
|
|
243
|
+
const own = parseFrontmatter(doc.content).frontmatter;
|
|
244
|
+
if (typeof own.standard === 'string')
|
|
245
|
+
standard = own.standard;
|
|
246
|
+
if (Array.isArray(own.clauses))
|
|
247
|
+
clauses = own.clauses.map(String);
|
|
248
|
+
}
|
|
249
|
+
if (!clauses && doc.templateId) {
|
|
250
|
+
const tpl = loadTemplate(doc.templateId, customTemplateDir);
|
|
251
|
+
if (tpl) {
|
|
252
|
+
standard = standard ?? tpl.frontmatter.standard;
|
|
253
|
+
clauses = Array.isArray(tpl.frontmatter.clauses)
|
|
254
|
+
? tpl.frontmatter.clauses.map(String) : undefined;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
for (const entry of clauses ?? []) {
|
|
258
|
+
const resolution = resolveClause(library, entry, standard);
|
|
259
|
+
if (!resolution.ok)
|
|
260
|
+
continue;
|
|
261
|
+
out.push({
|
|
262
|
+
documentId: doc.id,
|
|
263
|
+
documentTitle: doc.title,
|
|
264
|
+
designation: resolution.clause.designation,
|
|
265
|
+
clauseNumber: resolution.clause.clauseNumber,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
// ─── Reading the project's declared regimes ───────────────────────────────────
|
|
272
|
+
/**
|
|
273
|
+
* The regimes a project declares on its `ProjectMethodBinding`.
|
|
274
|
+
*
|
|
275
|
+
* Not application settings: `MEMOConfig` carries how a command runs, never what
|
|
276
|
+
* the model means, and `settings-boundary.ts` rejects semantic fields outright.
|
|
277
|
+
* A submission target selects which clauses a project is answerable for, which
|
|
278
|
+
* is squarely semantic, so it is declared in `model/catalog/project.sysml` like
|
|
279
|
+
* the methodology selection beside it.
|
|
280
|
+
*
|
|
281
|
+
* The attribute arrives from the builder as the qualified members joined by
|
|
282
|
+
* commas — `"RegulatoryRegimeKind::CE, RegulatoryRegimeKind::MDR"`. One
|
|
283
|
+
* spelling only: an unqualified member is not a synonym, it is skipped and
|
|
284
|
+
* reported, the same rule the enum carries everywhere else in MEMO.
|
|
285
|
+
*/
|
|
286
|
+
export function readDeclaredRegimes(model) {
|
|
287
|
+
const regimes = [];
|
|
288
|
+
const rejected = [];
|
|
289
|
+
for (const el of model?.elementsByKind.get('ProjectMethodBinding') ?? []) {
|
|
290
|
+
const raw = el.attributes?.regulatoryRegime;
|
|
291
|
+
if (!raw)
|
|
292
|
+
continue;
|
|
293
|
+
for (const entry of raw.split(',').map(s => s.trim()).filter(Boolean)) {
|
|
294
|
+
const parts = entry.split('::');
|
|
295
|
+
if (parts.length === 2 && parts[0] === 'RegulatoryRegimeKind') {
|
|
296
|
+
if (!regimes.includes(parts[1]))
|
|
297
|
+
regimes.push(parts[1]);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
rejected.push(entry);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return { regimes, rejected };
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Narrow a computed report. Filtering is separate from computing so the totals
|
|
308
|
+
* a filtered view shows are the totals of what it shows — a `--gaps-only`
|
|
309
|
+
* table whose "Clauses" column still counted the claimed ones would be a
|
|
310
|
+
* different kind of lie than the one this whole area exists to remove.
|
|
311
|
+
*/
|
|
312
|
+
export function filterStandardsReport(report, filter) {
|
|
313
|
+
const matches = (row) => !filter.standard || row.designation.toLowerCase().includes(filter.standard.toLowerCase());
|
|
314
|
+
const narrow = (rows) => rows
|
|
315
|
+
.filter(matches)
|
|
316
|
+
.map(row => {
|
|
317
|
+
if (!filter.gapsOnly)
|
|
318
|
+
return row;
|
|
319
|
+
const clauses = row.clauses.filter(c => c.status === 'gap');
|
|
320
|
+
return { ...row, clauses, totals: totalsOf(clauses) };
|
|
321
|
+
})
|
|
322
|
+
.filter(row => !filter.gapsOnly || row.clauses.length > 0);
|
|
323
|
+
const standards = narrow(report.standards);
|
|
324
|
+
return {
|
|
325
|
+
...report,
|
|
326
|
+
standards,
|
|
327
|
+
unrequired: narrow(report.unrequired),
|
|
328
|
+
totals: standards.reduce((acc, s) => ({
|
|
329
|
+
clauses: acc.clauses + s.totals.clauses,
|
|
330
|
+
claimed: acc.claimed + s.totals.claimed,
|
|
331
|
+
evidenced: acc.evidenced + s.totals.evidenced,
|
|
332
|
+
gaps: acc.gaps + s.totals.gaps,
|
|
333
|
+
}), { clauses: 0, claimed: 0, evidenced: 0, gaps: 0 }),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
337
|
+
function isApproved(el) {
|
|
338
|
+
return (el.attributes?.approvalStatus ?? '').toLowerCase() === 'approved';
|
|
339
|
+
}
|
|
340
|
+
function totalsOf(clauses) {
|
|
341
|
+
const evidenced = clauses.filter(c => c.status === 'evidenced').length;
|
|
342
|
+
const claimed = evidenced + clauses.filter(c => c.status === 'claimed').length;
|
|
343
|
+
return { clauses: clauses.length, claimed, evidenced, gaps: clauses.length - claimed };
|
|
344
|
+
}
|
|
345
|
+
function dedupeEvidence(evidence) {
|
|
346
|
+
const seen = new Set();
|
|
347
|
+
return evidence.filter(e => {
|
|
348
|
+
const key = `${e.category}|${e.elementId}|${e.via}`;
|
|
349
|
+
if (seen.has(key))
|
|
350
|
+
return false;
|
|
351
|
+
seen.add(key);
|
|
352
|
+
return true;
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Clause numbers sort numerically segment by segment, so §8 precedes §14.
|
|
357
|
+
* `localeCompare` put IEC 60601-1 clause 14 above clause 8 in the Phase 3.0
|
|
358
|
+
* conformance matrix; a compliance table ordered 10, 11, 14, 8, 9 reads as
|
|
359
|
+
* broken long before a reader works out why. Non-numeric segments — 820.30(c),
|
|
360
|
+
* V.A — fall back to a string compare within the segment.
|
|
361
|
+
*/
|
|
362
|
+
export function byClauseNumber(a, b) {
|
|
363
|
+
const as = a.clauseNumber.split('.');
|
|
364
|
+
const bs = b.clauseNumber.split('.');
|
|
365
|
+
for (let i = 0; i < Math.max(as.length, bs.length); i++) {
|
|
366
|
+
const x = as[i], y = bs[i];
|
|
367
|
+
if (x === undefined)
|
|
368
|
+
return -1;
|
|
369
|
+
if (y === undefined)
|
|
370
|
+
return 1;
|
|
371
|
+
const nx = Number.parseInt(x, 10), ny = Number.parseInt(y, 10);
|
|
372
|
+
if (Number.isNaN(nx) || Number.isNaN(ny)) {
|
|
373
|
+
if (x !== y)
|
|
374
|
+
return x.localeCompare(y);
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
if (nx !== ny)
|
|
378
|
+
return nx - ny;
|
|
379
|
+
if (x !== y)
|
|
380
|
+
return x.localeCompare(y);
|
|
381
|
+
}
|
|
382
|
+
return 0;
|
|
383
|
+
}
|
|
384
|
+
//# sourceMappingURL=standards-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standards-report.js","sourceRoot":"","sources":["../../src/dhf/standards-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { KindRegistry } from '../model/kind-registry.js';
|
|
2
|
+
import type { RelationshipRegistry } from '../model/relationship-registry.js';
|
|
3
|
+
export type LintSeverity = 'error' | 'warning';
|
|
4
|
+
export interface LintFinding {
|
|
5
|
+
severity: LintSeverity;
|
|
6
|
+
/** Template id, e.g. "iso-14971/fmea" */
|
|
7
|
+
template: string;
|
|
8
|
+
/** Source file path */
|
|
9
|
+
file: string;
|
|
10
|
+
/** 1-based query block index within the template, when the finding is in one */
|
|
11
|
+
block?: number;
|
|
12
|
+
/** Short machine-readable rule id */
|
|
13
|
+
rule: string;
|
|
14
|
+
message: string;
|
|
15
|
+
}
|
|
16
|
+
export interface LintOptions {
|
|
17
|
+
/** Resolved ontology kinds. Omit to run structural checks only. */
|
|
18
|
+
kindRegistry?: KindRegistry;
|
|
19
|
+
/**
|
|
20
|
+
* Resolved ontology relationship types. Omit to skip the checks that only
|
|
21
|
+
* apply to `select: relationships` blocks.
|
|
22
|
+
*/
|
|
23
|
+
relationshipRegistry?: RelationshipRegistry;
|
|
24
|
+
/** Layer ids the ontology actually defines. Omit to skip layer checks. */
|
|
25
|
+
knownLayers?: Set<string>;
|
|
26
|
+
/** Restrict to templates whose id starts with this prefix. */
|
|
27
|
+
filter?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface LintReport {
|
|
30
|
+
findings: LintFinding[];
|
|
31
|
+
templatesChecked: number;
|
|
32
|
+
ontologyAware: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Lint one template's raw content.
|
|
36
|
+
*
|
|
37
|
+
* Separate from `lintTemplates` so the rules can be exercised against fixture
|
|
38
|
+
* strings rather than only against whatever happens to be on disk.
|
|
39
|
+
*/
|
|
40
|
+
export declare function lintTemplateContent(templateId: string, file: string, raw: string, options?: LintOptions, templatesDir?: string): LintFinding[];
|
|
41
|
+
export declare function lintTemplates(options?: LintOptions): LintReport;
|
|
42
|
+
//# sourceMappingURL=template-lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-lint.d.ts","sourceRoot":"","sources":["../../src/dhf/template-lint.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,mEAAmE;IACnE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,0EAA0E;IAC1E,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;CAC1B;AA4VD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,EACzB,YAAY,CAAC,EAAE,MAAM,GACtB,WAAW,EAAE,CA8Df;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU,CAqCnE"}
|