@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,295 @@
|
|
|
1
|
+
// ─── Standards Library Reader ─────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Reads the concrete RegulatoryStandard / StandardClause instances the ontology
|
|
4
|
+
// ships under `src/artifacts/standards/`, one file per standard.
|
|
5
|
+
//
|
|
6
|
+
// This is a reader, not a registry. Nothing about any particular standard is
|
|
7
|
+
// written down here: adding ISO 13485 is one SysML file in the ontology and no
|
|
8
|
+
// change to this file, which is the whole point of the standards axis. The
|
|
9
|
+
// three places that used to hold their own copy of "which clause does this
|
|
10
|
+
// document claim" — DHF_DOCUMENT_TYPES[].standards, the Architect's DHF_GROUPS,
|
|
11
|
+
// and the template resolver's directory list — now derive from template
|
|
12
|
+
// frontmatter checked against this library.
|
|
13
|
+
//
|
|
14
|
+
// Why parse the source rather than build a model: the same reason
|
|
15
|
+
// template-lint reads attribute declarations out of the registry's
|
|
16
|
+
// `sourceFile`. The clause packs are library content, not project content, so
|
|
17
|
+
// they are not in any project's element graph; a regex over declarations MEMO
|
|
18
|
+
// itself authors is both cheaper and honest about what it can see.
|
|
19
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
20
|
+
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
21
|
+
import { resolve, join, dirname } from 'node:path';
|
|
22
|
+
import { resolveContentPackageRoot, VENDOR_ONTOLOGY_DIR } from '../model/paths.js';
|
|
23
|
+
/** Relative path (from a legacy tools checkout) to the shipped standards packs. */
|
|
24
|
+
export const VENDOR_STANDARDS_DIR = `${VENDOR_ONTOLOGY_DIR}/src/artifacts/standards`;
|
|
25
|
+
// ─── Locating the packs ───────────────────────────────────────────────────────
|
|
26
|
+
let cachedDir;
|
|
27
|
+
/** Locate the ontology's standards directory. Cached after first hit. */
|
|
28
|
+
export function findVendorStandardsDir(startDir = process.cwd()) {
|
|
29
|
+
if (cachedDir !== undefined)
|
|
30
|
+
return cachedDir;
|
|
31
|
+
try {
|
|
32
|
+
const installed = join(resolveContentPackageRoot(), 'src/artifacts/standards');
|
|
33
|
+
if (existsSync(installed)) {
|
|
34
|
+
cachedDir = installed;
|
|
35
|
+
return installed;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Fall through for dependency-free legacy source checkouts.
|
|
40
|
+
}
|
|
41
|
+
let dir = resolve(startDir);
|
|
42
|
+
while (true) {
|
|
43
|
+
const candidate = join(dir, VENDOR_STANDARDS_DIR);
|
|
44
|
+
if (existsSync(candidate)) {
|
|
45
|
+
cachedDir = candidate;
|
|
46
|
+
return candidate;
|
|
47
|
+
}
|
|
48
|
+
const parent = dirname(dir);
|
|
49
|
+
if (parent === dir)
|
|
50
|
+
break;
|
|
51
|
+
dir = parent;
|
|
52
|
+
}
|
|
53
|
+
cachedDir = null;
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
/** Test hook: reset the cached standards directory. */
|
|
57
|
+
export function resetStandardsDirCache() {
|
|
58
|
+
cachedDir = undefined;
|
|
59
|
+
cachedRegimeVocabulary = undefined;
|
|
60
|
+
}
|
|
61
|
+
// ─── The regime vocabulary ────────────────────────────────────────────────────
|
|
62
|
+
const ENUM_DEF_RE = (name) => new RegExp(`enum\\s+def\\s+${name}\\s*\\{([\\s\\S]*?)\\}`, 'm');
|
|
63
|
+
let cachedRegimeVocabulary;
|
|
64
|
+
/**
|
|
65
|
+
* Read the members of an ontology `enum def` out of the ontology source.
|
|
66
|
+
*
|
|
67
|
+
* The packs are at `<ontology>/src/artifacts/standards`, so the ontology's
|
|
68
|
+
* `src/` root is two levels up; the enum is found by walking it rather than by
|
|
69
|
+
* naming the file that happens to hold it today. What is hardcoded here is a
|
|
70
|
+
* locator, never a value: the members themselves come from the ontology, which
|
|
71
|
+
* is the whole reason a regime is an enum and not a string convention.
|
|
72
|
+
*/
|
|
73
|
+
export function readEnumMembers(standardsDir, enumName) {
|
|
74
|
+
const srcRoot = resolve(standardsDir, '..', '..');
|
|
75
|
+
const stack = [srcRoot];
|
|
76
|
+
while (stack.length > 0) {
|
|
77
|
+
const dir = stack.pop();
|
|
78
|
+
let entries;
|
|
79
|
+
try {
|
|
80
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
for (const entry of entries) {
|
|
86
|
+
const path = join(dir, entry.name);
|
|
87
|
+
if (entry.isDirectory()) {
|
|
88
|
+
stack.push(path);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (!entry.name.endsWith('.sysml'))
|
|
92
|
+
continue;
|
|
93
|
+
let source;
|
|
94
|
+
try {
|
|
95
|
+
source = readFileSync(path, 'utf-8');
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const body = source.match(ENUM_DEF_RE(enumName))?.[1];
|
|
101
|
+
if (!body)
|
|
102
|
+
continue;
|
|
103
|
+
return [...body.matchAll(/^\s*enum\s+(\w+)\s*;/gm)].map(m => m[1]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
// ─── Parsing ──────────────────────────────────────────────────────────────────
|
|
109
|
+
// `item <name> : <Def> {` … matching braces. Instances are flat data — one
|
|
110
|
+
// level of braces — so a non-greedy match to the first closing brace at the
|
|
111
|
+
// declaration's own indentation is enough, and a nested brace would show up as
|
|
112
|
+
// a missing attribute rather than as silently wrong data.
|
|
113
|
+
const INSTANCE_RE = /^\s*item\s+(\w+)\s*:\s*(RegulatoryStandard|StandardClause)\s*\{([\s\S]*?)^\s*\}/gm;
|
|
114
|
+
const COMPOSES_RE = /^\s*connection\s+\w+\s*:\s*Composes\s+connect\s+parent\s*::>\s*(\w+)\s+to\s+child\s*::>\s*(\w+)\s*;/gm;
|
|
115
|
+
function attr(body, name) {
|
|
116
|
+
const m = body.match(new RegExp(`attribute\\s+:>>\\s+${name}\\s*=\\s*"([^"]*)"`));
|
|
117
|
+
return m?.[1];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Read an enum-valued attribute, single or set-literal:
|
|
121
|
+
*
|
|
122
|
+
* attribute :>> appliesToRegime = RegulatoryRegimeKind::CE;
|
|
123
|
+
* attribute :>> appliesToRegime = (RegulatoryRegimeKind::CE, RegulatoryRegimeKind::MDR);
|
|
124
|
+
*
|
|
125
|
+
* Entries are returned verbatim so the caller can report an unqualified or
|
|
126
|
+
* misspelled one. The bare member name is not accepted anywhere in MEMO —
|
|
127
|
+
* one spelling, the qualified one — so it is returned and rejected rather
|
|
128
|
+
* than quietly matched.
|
|
129
|
+
*/
|
|
130
|
+
function attrEnumEntries(body, name) {
|
|
131
|
+
const m = body.match(new RegExp(`attribute\\s+:>>\\s+${name}\\s*=\\s*([^;]+);`));
|
|
132
|
+
if (!m)
|
|
133
|
+
return [];
|
|
134
|
+
return m[1].replace(/^\s*\(|\)\s*$/g, '').split(',').map(s => s.trim()).filter(Boolean);
|
|
135
|
+
}
|
|
136
|
+
function attrAll(body, name) {
|
|
137
|
+
const values = [];
|
|
138
|
+
for (const m of body.matchAll(new RegExp(`attribute\\s+:>>\\s+${name}\\s*=\\s*"([^"]*)"`, 'g'))) {
|
|
139
|
+
values.push(m[1]);
|
|
140
|
+
}
|
|
141
|
+
return values;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Read every standards pack under the ontology's `src/artifacts/standards/`.
|
|
145
|
+
*
|
|
146
|
+
* Clause-to-standard membership comes from the `Composes` links the packs
|
|
147
|
+
* declare, walked transitively, rather than from "one file, one standard" —
|
|
148
|
+
* containment is a modelled fact and reading it back is what keeps the pack
|
|
149
|
+
* and the library agreeing.
|
|
150
|
+
*/
|
|
151
|
+
export function loadStandardsLibrary(startDir) {
|
|
152
|
+
const dir = findVendorStandardsDir(startDir);
|
|
153
|
+
if (!dir) {
|
|
154
|
+
return {
|
|
155
|
+
standards: new Map(), orphanClauses: [],
|
|
156
|
+
regimeVocabulary: [], unknownRegimes: [], sourceDir: null,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (cachedRegimeVocabulary === undefined) {
|
|
160
|
+
cachedRegimeVocabulary = readEnumMembers(dir, 'RegulatoryRegimeKind');
|
|
161
|
+
}
|
|
162
|
+
const regimeVocabulary = cachedRegimeVocabulary;
|
|
163
|
+
const unknownRegimes = [];
|
|
164
|
+
const standardsByUsage = new Map();
|
|
165
|
+
const clausesByUsage = new Map();
|
|
166
|
+
/** child usage name → parent usage name */
|
|
167
|
+
const parentOf = new Map();
|
|
168
|
+
let files;
|
|
169
|
+
try {
|
|
170
|
+
files = readdirSync(dir).filter(f => f.endsWith('.sysml')).sort();
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return { standards: new Map(), orphanClauses: [], regimeVocabulary, unknownRegimes, sourceDir: dir };
|
|
174
|
+
}
|
|
175
|
+
for (const file of files) {
|
|
176
|
+
const path = join(dir, file);
|
|
177
|
+
let source;
|
|
178
|
+
try {
|
|
179
|
+
source = readFileSync(path, 'utf-8');
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
for (const m of source.matchAll(INSTANCE_RE)) {
|
|
185
|
+
const [, name, def, body] = m;
|
|
186
|
+
if (def === 'RegulatoryStandard') {
|
|
187
|
+
const designation = attr(body, 'designation');
|
|
188
|
+
if (!designation)
|
|
189
|
+
continue;
|
|
190
|
+
const regimes = [];
|
|
191
|
+
for (const entry of attrEnumEntries(body, 'appliesToRegime')) {
|
|
192
|
+
const parts = entry.split('::');
|
|
193
|
+
if (parts.length !== 2 || parts[0] !== 'RegulatoryRegimeKind') {
|
|
194
|
+
unknownRegimes.push({ designation, raw: entry, reason: 'unqualified' });
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (!regimeVocabulary.includes(parts[1])) {
|
|
198
|
+
unknownRegimes.push({ designation, raw: entry, reason: 'unknown-member' });
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
regimes.push(parts[1]);
|
|
202
|
+
}
|
|
203
|
+
standardsByUsage.set(name, {
|
|
204
|
+
name,
|
|
205
|
+
designation,
|
|
206
|
+
edition: attr(body, 'edition'),
|
|
207
|
+
issuer: attr(body, 'issuer'),
|
|
208
|
+
amendments: attrAll(body, 'amendments'),
|
|
209
|
+
regimes,
|
|
210
|
+
sourceFile: path,
|
|
211
|
+
clauses: new Map(),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
const clauseNumber = attr(body, 'clauseNumber');
|
|
216
|
+
if (!clauseNumber)
|
|
217
|
+
continue;
|
|
218
|
+
clausesByUsage.set(name, {
|
|
219
|
+
name,
|
|
220
|
+
id: attr(body, 'id'),
|
|
221
|
+
clauseNumber,
|
|
222
|
+
title: attr(body, 'title'),
|
|
223
|
+
normativeStrength: attr(body, 'normativeStrength'),
|
|
224
|
+
designation: '',
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
for (const m of source.matchAll(COMPOSES_RE))
|
|
229
|
+
parentOf.set(m[2], m[1]);
|
|
230
|
+
}
|
|
231
|
+
const orphanClauses = [];
|
|
232
|
+
for (const clause of clausesByUsage.values()) {
|
|
233
|
+
// Walk up the containment chain to the standard the clause belongs to.
|
|
234
|
+
// The visited set keeps a mis-authored cycle from hanging the reader.
|
|
235
|
+
const visited = new Set([clause.name]);
|
|
236
|
+
let cursor = parentOf.get(clause.name);
|
|
237
|
+
let owner;
|
|
238
|
+
while (cursor && !visited.has(cursor)) {
|
|
239
|
+
visited.add(cursor);
|
|
240
|
+
owner = standardsByUsage.get(cursor);
|
|
241
|
+
if (owner)
|
|
242
|
+
break;
|
|
243
|
+
cursor = parentOf.get(cursor);
|
|
244
|
+
}
|
|
245
|
+
if (!owner) {
|
|
246
|
+
orphanClauses.push(clause);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
clause.designation = owner.designation;
|
|
250
|
+
owner.clauses.set(clause.clauseNumber, clause);
|
|
251
|
+
}
|
|
252
|
+
const standards = new Map();
|
|
253
|
+
for (const std of standardsByUsage.values())
|
|
254
|
+
standards.set(std.designation, std);
|
|
255
|
+
return { standards, orphanClauses, regimeVocabulary, unknownRegimes, sourceDir: dir };
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Parse one `clauses:` frontmatter entry.
|
|
259
|
+
*
|
|
260
|
+
* "5.4" → relative: the document's own `standard:`
|
|
261
|
+
* "ISO 14971:2019 §7" → qualified: designation before §, clause after
|
|
262
|
+
*
|
|
263
|
+
* An entry containing "§" is qualified and nothing else is. That is the whole
|
|
264
|
+
* grammar, and it is written into the ontology's package header too — the two
|
|
265
|
+
* shapes were both already in use before Phase 2, one of them undocumented.
|
|
266
|
+
*/
|
|
267
|
+
export function parseClauseReference(entry, documentStandard) {
|
|
268
|
+
const raw = String(entry).trim();
|
|
269
|
+
const sign = raw.indexOf('§');
|
|
270
|
+
if (sign >= 0) {
|
|
271
|
+
return {
|
|
272
|
+
designation: raw.slice(0, sign).trim(),
|
|
273
|
+
clauseNumber: raw.slice(sign + 1).trim(),
|
|
274
|
+
raw,
|
|
275
|
+
qualified: true,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return { designation: (documentStandard ?? '').trim(), clauseNumber: raw, raw, qualified: false };
|
|
279
|
+
}
|
|
280
|
+
/** Render a clause reference the way document metadata cites it. */
|
|
281
|
+
export function formatClauseReference(ref) {
|
|
282
|
+
return `${ref.designation} §${ref.clauseNumber}`;
|
|
283
|
+
}
|
|
284
|
+
/** Resolve one citation against the library. */
|
|
285
|
+
export function resolveClause(library, entry, documentStandard) {
|
|
286
|
+
const ref = parseClauseReference(entry, documentStandard);
|
|
287
|
+
const std = library.standards.get(ref.designation);
|
|
288
|
+
if (!std)
|
|
289
|
+
return { ok: false, ref, reason: 'unknown-standard' };
|
|
290
|
+
const clause = std.clauses.get(ref.clauseNumber);
|
|
291
|
+
if (!clause)
|
|
292
|
+
return { ok: false, ref, reason: 'unknown-clause' };
|
|
293
|
+
return { ok: true, ref, clause };
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=standards-library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standards-library.js","sourceRoot":"","sources":["../../src/dhf/standards-library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type { MemoModel } from '../model/semantic.js';
|
|
2
|
+
import type { KindRegistry } from '../model/kind-registry.js';
|
|
3
|
+
import type { StandardsLibrary, StandardClauseInfo, UnknownRegimeCitation } from './standards-library.js';
|
|
4
|
+
export type EvidenceCategory = 'verification' | 'risk-control' | 'approval';
|
|
5
|
+
export interface EvidenceRef {
|
|
6
|
+
category: EvidenceCategory;
|
|
7
|
+
/** Element the evidence link reaches. */
|
|
8
|
+
elementId: string;
|
|
9
|
+
elementName: string;
|
|
10
|
+
elementKind: string;
|
|
11
|
+
/** Relationship type the link was made with, e.g. "verifiedBy". */
|
|
12
|
+
via: string;
|
|
13
|
+
}
|
|
14
|
+
/** One `clauses:` citation from a document that exists in the project. */
|
|
15
|
+
export interface DocumentClauseCitation {
|
|
16
|
+
/** Document id as the project knows it, e.g. "DOC-RMP-001". */
|
|
17
|
+
documentId: string;
|
|
18
|
+
documentTitle: string;
|
|
19
|
+
/** Resolved standard designation. */
|
|
20
|
+
designation: string;
|
|
21
|
+
clauseNumber: string;
|
|
22
|
+
}
|
|
23
|
+
export interface StandardsReportInput {
|
|
24
|
+
library: StandardsLibrary;
|
|
25
|
+
/** The project's model. Absent means nothing is claimed — every clause is a gap. */
|
|
26
|
+
model?: MemoModel;
|
|
27
|
+
/** Resolves supertypes so an evidence anchor matches its subtypes. */
|
|
28
|
+
kindRegistry?: KindRegistry;
|
|
29
|
+
/**
|
|
30
|
+
* Regimes to scope `required()` to. Empty or absent means the project
|
|
31
|
+
* declared none, and every standard the library carries is reported —
|
|
32
|
+
* stated as such rather than silently assuming a market.
|
|
33
|
+
*/
|
|
34
|
+
regimes?: string[];
|
|
35
|
+
/** Where `regimes` came from, for the report header. */
|
|
36
|
+
regimeSource?: RegimeSource;
|
|
37
|
+
/** Clause citations from documents that exist in the project. */
|
|
38
|
+
documentClauses?: DocumentClauseCitation[];
|
|
39
|
+
}
|
|
40
|
+
export type RegimeSource = 'project' | 'flag' | 'none';
|
|
41
|
+
export type ClauseStatus = 'evidenced' | 'claimed' | 'gap';
|
|
42
|
+
export interface ClaimantRef {
|
|
43
|
+
elementId: string;
|
|
44
|
+
name: string;
|
|
45
|
+
kind: string;
|
|
46
|
+
}
|
|
47
|
+
export interface ClauseRow {
|
|
48
|
+
/** SysML usage name of the clause instance. */
|
|
49
|
+
name: string;
|
|
50
|
+
/** The `id` attribute, e.g. "STD-IEC-62304-5-2-2". */
|
|
51
|
+
id?: string;
|
|
52
|
+
clauseNumber: string;
|
|
53
|
+
/** MEMO-authored scope phrase; absent where MEMO has no verified reading. */
|
|
54
|
+
title?: string;
|
|
55
|
+
normativeStrength?: string;
|
|
56
|
+
status: ClauseStatus;
|
|
57
|
+
/** Elements whose ConformsTo edge targets this clause. */
|
|
58
|
+
claimants: ClaimantRef[];
|
|
59
|
+
/** Documents whose frontmatter cites this clause. */
|
|
60
|
+
documents: Array<{
|
|
61
|
+
documentId: string;
|
|
62
|
+
documentTitle: string;
|
|
63
|
+
}>;
|
|
64
|
+
evidence: EvidenceRef[];
|
|
65
|
+
}
|
|
66
|
+
export interface StandardTotals {
|
|
67
|
+
clauses: number;
|
|
68
|
+
claimed: number;
|
|
69
|
+
evidenced: number;
|
|
70
|
+
gaps: number;
|
|
71
|
+
}
|
|
72
|
+
export interface StandardRow {
|
|
73
|
+
designation: string;
|
|
74
|
+
edition?: string;
|
|
75
|
+
issuer?: string;
|
|
76
|
+
/** Regimes this standard has standing in. Empty = no regime mandates it. */
|
|
77
|
+
regimes: string[];
|
|
78
|
+
/**
|
|
79
|
+
* True when a declared regime pulls this standard into `required()`.
|
|
80
|
+
* False for a standard the project's regimes do not reach, and for a
|
|
81
|
+
* method/reference standard no regime mandates — both are still reported,
|
|
82
|
+
* because a project may legitimately claim clauses of either.
|
|
83
|
+
*/
|
|
84
|
+
required: boolean;
|
|
85
|
+
clauses: ClauseRow[];
|
|
86
|
+
totals: StandardTotals;
|
|
87
|
+
}
|
|
88
|
+
export interface StandardsReport {
|
|
89
|
+
/** Regimes the report was scoped to. */
|
|
90
|
+
regimes: string[];
|
|
91
|
+
regimeSource: RegimeSource;
|
|
92
|
+
/** Every `RegulatoryRegimeKind` member, for a "did you mean" on a bad flag. */
|
|
93
|
+
regimeVocabulary: string[];
|
|
94
|
+
/** Standards a declared regime requires. */
|
|
95
|
+
standards: StandardRow[];
|
|
96
|
+
/**
|
|
97
|
+
* Standards no declared regime requires: method and reference standards,
|
|
98
|
+
* and packs outside the declared regimes. Reported separately rather than
|
|
99
|
+
* dropped — a clause claimed here is still traceability, and a pack that
|
|
100
|
+
* vanished from the output would look like a pack that does not exist.
|
|
101
|
+
*/
|
|
102
|
+
unrequired: StandardRow[];
|
|
103
|
+
/** Totals over `standards` only — the required set is what "gaps" means. */
|
|
104
|
+
totals: StandardTotals;
|
|
105
|
+
/** Defects in the packs themselves, surfaced rather than swallowed. */
|
|
106
|
+
unknownRegimes: UnknownRegimeCitation[];
|
|
107
|
+
orphanClauses: StandardClauseInfo[];
|
|
108
|
+
/** True when the library could not be located at all. */
|
|
109
|
+
libraryMissing: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* False when no kind registry was available, so the evidence anchors could
|
|
112
|
+
* not be widened to their subtypes.
|
|
113
|
+
*
|
|
114
|
+
* Without it a `MarkdownDocumentSource` is not recognised as a
|
|
115
|
+
* `ControlledArtifact` and its approval does not count — the report
|
|
116
|
+
* UNDER-states evidence. That is the safer direction to fail in, but it is
|
|
117
|
+
* still a wrong number, so it is stated rather than left to be inferred
|
|
118
|
+
* from a suspiciously low column.
|
|
119
|
+
*/
|
|
120
|
+
evidenceResolvable: boolean;
|
|
121
|
+
}
|
|
122
|
+
export declare function computeStandardsReport(input: StandardsReportInput): StandardsReport;
|
|
123
|
+
/** A document that exists in the project, as the workbench store hands it over. */
|
|
124
|
+
export interface ProjectDocument {
|
|
125
|
+
id: string;
|
|
126
|
+
title: string;
|
|
127
|
+
/** Template the document was created from, e.g. "iso-14971/rmp". */
|
|
128
|
+
templateId?: string;
|
|
129
|
+
/** Raw markdown including frontmatter, when the document has its own. */
|
|
130
|
+
content?: string;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolve the clauses cited by documents that EXIST in the project.
|
|
134
|
+
*
|
|
135
|
+
* Existence is the point. The clause list a template carries says what a
|
|
136
|
+
* document of that type would claim; only a document actually present in
|
|
137
|
+
* `dhf/documents/` claims it. A checklist built from the template set would
|
|
138
|
+
* report full coverage for a project that has written nothing.
|
|
139
|
+
*
|
|
140
|
+
* A document's own frontmatter wins over its template's, because the workbench
|
|
141
|
+
* merges hand edits back into the file and a document that has narrowed or
|
|
142
|
+
* extended its claim has said so there.
|
|
143
|
+
*/
|
|
144
|
+
export declare function collectDocumentClauses(docs: ProjectDocument[], library: StandardsLibrary, customTemplateDir?: string): DocumentClauseCitation[];
|
|
145
|
+
/**
|
|
146
|
+
* The regimes a project declares on its `ProjectMethodBinding`.
|
|
147
|
+
*
|
|
148
|
+
* Not application settings: `MEMOConfig` carries how a command runs, never what
|
|
149
|
+
* the model means, and `settings-boundary.ts` rejects semantic fields outright.
|
|
150
|
+
* A submission target selects which clauses a project is answerable for, which
|
|
151
|
+
* is squarely semantic, so it is declared in `model/catalog/project.sysml` like
|
|
152
|
+
* the methodology selection beside it.
|
|
153
|
+
*
|
|
154
|
+
* The attribute arrives from the builder as the qualified members joined by
|
|
155
|
+
* commas — `"RegulatoryRegimeKind::CE, RegulatoryRegimeKind::MDR"`. One
|
|
156
|
+
* spelling only: an unqualified member is not a synonym, it is skipped and
|
|
157
|
+
* reported, the same rule the enum carries everywhere else in MEMO.
|
|
158
|
+
*/
|
|
159
|
+
export declare function readDeclaredRegimes(model: MemoModel | undefined): {
|
|
160
|
+
regimes: string[];
|
|
161
|
+
/** Entries that were not qualified members, verbatim. */
|
|
162
|
+
rejected: string[];
|
|
163
|
+
};
|
|
164
|
+
export interface StandardsReportFilter {
|
|
165
|
+
/** Substring of a designation, case-insensitive. */
|
|
166
|
+
standard?: string;
|
|
167
|
+
/** Keep only gap clauses (and only standards that have some). */
|
|
168
|
+
gapsOnly?: boolean;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Narrow a computed report. Filtering is separate from computing so the totals
|
|
172
|
+
* a filtered view shows are the totals of what it shows — a `--gaps-only`
|
|
173
|
+
* table whose "Clauses" column still counted the claimed ones would be a
|
|
174
|
+
* different kind of lie than the one this whole area exists to remove.
|
|
175
|
+
*/
|
|
176
|
+
export declare function filterStandardsReport(report: StandardsReport, filter: StandardsReportFilter): StandardsReport;
|
|
177
|
+
/**
|
|
178
|
+
* Clause numbers sort numerically segment by segment, so §8 precedes §14.
|
|
179
|
+
* `localeCompare` put IEC 60601-1 clause 14 above clause 8 in the Phase 3.0
|
|
180
|
+
* conformance matrix; a compliance table ordered 10, 11, 14, 8, 9 reads as
|
|
181
|
+
* broken long before a reader works out why. Non-numeric segments — 820.30(c),
|
|
182
|
+
* V.A — fall back to a string compare within the segment.
|
|
183
|
+
*/
|
|
184
|
+
export declare function byClauseNumber(a: {
|
|
185
|
+
clauseNumber: string;
|
|
186
|
+
}, b: {
|
|
187
|
+
clauseNumber: string;
|
|
188
|
+
}): number;
|
|
189
|
+
//# sourceMappingURL=standards-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standards-report.d.ts","sourceRoot":"","sources":["../../src/dhf/standards-report.ts"],"names":[],"mappings":"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"}
|