@memoarchitect/tools 0.6.1 → 0.6.2
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/package.json +2 -1
- package/packages/tools/lib/bin/memo.js +1 -1
- package/packages/tools/lib/commands/archetype-loader.d.ts +0 -15
- package/packages/tools/lib/commands/archetype-loader.d.ts.map +0 -1
- package/packages/tools/lib/commands/archetype-loader.js +0 -31
- package/packages/tools/lib/commands/archetype-loader.js.map +0 -1
- package/packages/tools/lib/commands/init-wizard.d.ts +0 -10
- package/packages/tools/lib/commands/init-wizard.d.ts.map +0 -1
- package/packages/tools/lib/commands/init-wizard.js +0 -69
- package/packages/tools/lib/commands/init-wizard.js.map +0 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<code>memo-tools 0.6.
|
|
12
|
+
<code>memo-tools 0.6.2</code> · MIT · SysML v2 · ISO 14971 · IEC 62304 · ISO/IEC/IEEE 42010
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
15
|
---
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memoarchitect/tools",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "MEMO tools — SysML v2 parser, semantic model, validation, project operations, and CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./packages/tools/lib/index.js",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "cd packages/tools && langium generate && tsc",
|
|
31
|
+
"prepack": "pnpm clean && pnpm build",
|
|
31
32
|
"dev": "tsc -p packages/tools/tsconfig.json --watch",
|
|
32
33
|
"test": "cd packages/tools && vitest run",
|
|
33
34
|
"test:coverage": "cd packages/tools && vitest run --coverage",
|
|
@@ -41,7 +41,7 @@ const program = new Command();
|
|
|
41
41
|
program
|
|
42
42
|
.name('memo')
|
|
43
43
|
.description('MEMO — Model-Based Systems Engineering for Medical Devices')
|
|
44
|
-
.version('0.6.
|
|
44
|
+
.version('0.6.2');
|
|
45
45
|
program
|
|
46
46
|
.command('validate')
|
|
47
47
|
.description('Validate the model against closure rules and show completeness')
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { type LoadedMemoManifest } from '@memoarchitect/tools';
|
|
2
|
-
export interface ArchetypeInfo {
|
|
3
|
-
id: string;
|
|
4
|
-
label: string;
|
|
5
|
-
description: string;
|
|
6
|
-
category: string;
|
|
7
|
-
templateDir: string;
|
|
8
|
-
includedLayers: string[];
|
|
9
|
-
includedStandards: string[];
|
|
10
|
-
}
|
|
11
|
-
export declare function loadArchetypes(fromDir: string, selected?: LoadedMemoManifest): Promise<ArchetypeInfo[]>;
|
|
12
|
-
export declare function findArchetype(archetypes: ArchetypeInfo[], id: string): ArchetypeInfo | undefined;
|
|
13
|
-
export declare function deviceClassArchetypes(archetypes: ArchetypeInfo[]): ArchetypeInfo[];
|
|
14
|
-
export declare function profileArchetypes(archetypes: ArchetypeInfo[]): ArchetypeInfo[];
|
|
15
|
-
//# sourceMappingURL=archetype-loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archetype-loader.d.ts","sourceRoot":"","sources":["../../src/commands/archetype-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0C,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEvG,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAe7G;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEhG;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAElF;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAE9E"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { parse as parseYaml } from 'yaml';
|
|
3
|
-
import { findMemoManifests, resolveManifestPath } from '@memoarchitect/tools';
|
|
4
|
-
export async function loadArchetypes(fromDir, selected) {
|
|
5
|
-
const loaded = selected ?? findMemoManifests(fromDir)[0];
|
|
6
|
-
if (!loaded)
|
|
7
|
-
return [];
|
|
8
|
-
const path = resolveManifestPath(loaded, loaded.manifest.init.archetypes);
|
|
9
|
-
const parsed = parseYaml(readFileSync(path, 'utf-8'));
|
|
10
|
-
if (!Array.isArray(parsed?.archetypes))
|
|
11
|
-
throw new Error(`Invalid archetype catalog: ${path}`);
|
|
12
|
-
return parsed.archetypes.map((entry) => ({
|
|
13
|
-
id: String(entry.id ?? ''),
|
|
14
|
-
label: String(entry.label ?? entry.id ?? ''),
|
|
15
|
-
description: String(entry.description ?? ''),
|
|
16
|
-
category: String(entry.category ?? 'device-class'),
|
|
17
|
-
templateDir: String(entry.templateDir ?? ''),
|
|
18
|
-
includedLayers: Array.isArray(entry.includedLayers) ? entry.includedLayers.map(String) : [],
|
|
19
|
-
includedStandards: Array.isArray(entry.includedStandards) ? entry.includedStandards.map(String) : [],
|
|
20
|
-
})).filter((entry) => entry.id !== '');
|
|
21
|
-
}
|
|
22
|
-
export function findArchetype(archetypes, id) {
|
|
23
|
-
return archetypes.find(archetype => archetype.id === id);
|
|
24
|
-
}
|
|
25
|
-
export function deviceClassArchetypes(archetypes) {
|
|
26
|
-
return archetypes.filter(archetype => archetype.category === 'device-class');
|
|
27
|
-
}
|
|
28
|
-
export function profileArchetypes(archetypes) {
|
|
29
|
-
return archetypes.filter(archetype => archetype.category === 'profile');
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=archetype-loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archetype-loader.js","sourceRoot":"","sources":["../../src/commands/archetype-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAA2B,MAAM,sBAAsB,CAAC;AAYvG,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,QAA6B;IAC/E,MAAM,MAAM,GAAG,QAAQ,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;IAC9F,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAA6B,EAAE,EAAE,CAAC,CAAC;QAC7D,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5C,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QAC5C,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC;QAClD,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QAC5C,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3F,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;KACvG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAA2B,EAAE,EAAU;IACjE,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAA2B;IAC7D,OAAO,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAA2B;IACzD,OAAO,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ArchetypeInfo } from './archetype-loader.js';
|
|
2
|
-
type RegulatoryClass = 'class-i' | 'class-ii' | 'class-iii-iib';
|
|
3
|
-
export interface WizardResult {
|
|
4
|
-
archetypeId: string;
|
|
5
|
-
regulatoryClass: RegulatoryClass;
|
|
6
|
-
}
|
|
7
|
-
export declare function runWizard(archetypes: ArchetypeInfo[]): Promise<WizardResult>;
|
|
8
|
-
export declare function regulatoryComment(regulatoryClass: RegulatoryClass, archetypeLabel: string): string;
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=init-wizard.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-wizard.d.ts","sourceRoot":"","sources":["../../src/commands/init-wizard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,KAAK,eAAe,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,CAAC;AAchE,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,eAAe,CAAC;CACpC;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAmDlF;AAED,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAYlG"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { createInterface } from 'node:readline/promises';
|
|
2
|
-
import { stdin as input, stdout as output } from 'node:process';
|
|
3
|
-
import chalk from 'chalk';
|
|
4
|
-
const REGULATORY_CLASSES = [
|
|
5
|
-
{ id: 'class-i', label: 'Class I / Low Risk', standards: 'ISO 14971 (risk), IEC 62366 (usability)' },
|
|
6
|
-
{ id: 'class-ii', label: 'Class II / Moderate Risk', standards: '+ IEC 62304 (software lifecycle), 21 CFR 820' },
|
|
7
|
-
{ id: 'class-iii-iib', label: 'Class III / High Risk (EU IIb+)', standards: '+ full DHF, clinical evaluation, PMA/EU MDR' },
|
|
8
|
-
];
|
|
9
|
-
export async function runWizard(archetypes) {
|
|
10
|
-
const rl = createInterface({ input, output });
|
|
11
|
-
const choices = archetypes.filter(a => a.id !== 'blank');
|
|
12
|
-
console.log(chalk.bold('\n🧙 MEMO Startup Wizard\n'));
|
|
13
|
-
console.log(chalk.gray(' Answer a few questions and we\'ll scaffold the right starter model.\n'));
|
|
14
|
-
console.log(chalk.bold(' What type of medical device are you building?\n'));
|
|
15
|
-
choices.forEach((a, i) => {
|
|
16
|
-
console.log(` ${chalk.cyan(`${i + 1}.`)} ${chalk.white(a.label)}`);
|
|
17
|
-
console.log(` ${chalk.gray(a.description)}`);
|
|
18
|
-
});
|
|
19
|
-
let archetypeIndex = -1;
|
|
20
|
-
while (archetypeIndex < 0 || archetypeIndex >= choices.length) {
|
|
21
|
-
const raw = await rl.question(chalk.gray(`\n Select [1-${choices.length}]: `));
|
|
22
|
-
const parsed = parseInt(raw.trim(), 10);
|
|
23
|
-
if (!isNaN(parsed) && parsed >= 1 && parsed <= choices.length) {
|
|
24
|
-
archetypeIndex = parsed - 1;
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
console.log(chalk.yellow(` Please enter a number between 1 and ${choices.length}.`));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
const archetype = choices[archetypeIndex];
|
|
31
|
-
console.log(chalk.green(` ✓ ${archetype.label}\n`));
|
|
32
|
-
console.log(chalk.bold(' What is your expected regulatory classification?\n'));
|
|
33
|
-
REGULATORY_CLASSES.forEach((rc, i) => {
|
|
34
|
-
console.log(` ${chalk.cyan(`${i + 1}.`)} ${chalk.white(rc.label)}`);
|
|
35
|
-
console.log(` ${chalk.gray(rc.standards)}`);
|
|
36
|
-
});
|
|
37
|
-
let regIndex = -1;
|
|
38
|
-
while (regIndex < 0 || regIndex >= REGULATORY_CLASSES.length) {
|
|
39
|
-
const raw = await rl.question(chalk.gray(`\n Select [1-${REGULATORY_CLASSES.length}]: `));
|
|
40
|
-
const parsed = parseInt(raw.trim(), 10);
|
|
41
|
-
if (!isNaN(parsed) && parsed >= 1 && parsed <= REGULATORY_CLASSES.length) {
|
|
42
|
-
regIndex = parsed - 1;
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
console.log(chalk.yellow(` Please enter a number between 1 and ${REGULATORY_CLASSES.length}.`));
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const regulatoryClass = REGULATORY_CLASSES[regIndex];
|
|
49
|
-
console.log(chalk.green(` ✓ ${regulatoryClass.label}\n`));
|
|
50
|
-
rl.close();
|
|
51
|
-
return {
|
|
52
|
-
archetypeId: archetype.id,
|
|
53
|
-
regulatoryClass: regulatoryClass.id,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
export function regulatoryComment(regulatoryClass, archetypeLabel) {
|
|
57
|
-
const standards = {
|
|
58
|
-
'class-i': ['ISO 14971 (risk management)', 'IEC 62366 (usability engineering)'],
|
|
59
|
-
'class-ii': ['ISO 14971', 'IEC 62366', 'IEC 62304 (software lifecycle)', '21 CFR 820 / ISO 13485'],
|
|
60
|
-
'class-iii-iib': ['ISO 14971', 'IEC 62366', 'IEC 62304', '21 CFR 820 / ISO 13485', 'Clinical evaluation (EU MDR Annex XIV)'],
|
|
61
|
-
};
|
|
62
|
-
const lines = standards[regulatoryClass].map(s => `// • ${s}`).join('\n');
|
|
63
|
-
return `// Regulatory classification: ${REGULATORY_CLASSES.find(r => r.id === regulatoryClass)?.label}
|
|
64
|
-
// Applicable standards for this project:
|
|
65
|
-
${lines}
|
|
66
|
-
//
|
|
67
|
-
// Generated by memo init — update intended use statement before sharing.`;
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=init-wizard.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-wizard.js","sourceRoot":"","sources":["../../src/commands/init-wizard.ts"],"names":[],"mappings":"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"}
|