@memoarchitect/architect 0.6.6 → 0.8.26
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 +26 -4
- package/dist/assets/AiWorkspace-Z3BbnmaP.js +7 -0
- package/dist/assets/AnalysisWorkspace-DjaUOo7U.js +39 -0
- package/dist/assets/{ComplianceWizard-k98NZ2ec.js → ComplianceWizard-DKxZ1z25.js} +1 -1
- package/dist/assets/DSMView-DJhmrXYm.js +5 -0
- package/dist/assets/Dashboard-CYT7KjqU.js +1 -0
- package/dist/assets/DhfDashboard-DacdOtkU.js +1 -0
- package/dist/assets/DhfWorkbench-CIhopT8J.js +69 -0
- package/dist/assets/DiagramCanvas-CLE_nv7Y.js +4 -0
- package/dist/assets/DiagramEditor-puQuE8gB.js +4 -0
- package/dist/assets/DiagramToolbarControls-XMGLx08e.js +1 -0
- package/dist/assets/ElementDetailView-D5XvAL_i.js +2 -0
- package/dist/assets/ExplorerTreeRow-DUmcEsqf.js +3 -0
- package/dist/assets/{ImportView-CyMm-tSP.js → ImportView-9y1nhQS4.js} +1 -1
- package/dist/assets/{LayerGrid-DNPZYTsD.js → LayerGrid-bhFpOIbe.js} +1 -1
- package/dist/assets/{LayerTable-DhOq1DHo.js → LayerTable-RuswZVUI.js} +2 -2
- package/dist/assets/{MaxGraphCanvas-DqKU1PTY.js → MaxGraphCanvas-D3BXQK2y.js} +6 -6
- package/dist/assets/{ModelDiff-BbqIoesG.js → ModelDiff-Cl2dhlk3.js} +1 -1
- package/dist/assets/OntologyDecompositionDiagram-aONGngg4.js +1 -0
- package/dist/assets/{OntologyViewer-BIpJC66j.js → OntologyViewer-VOrKTRuQ.js} +2 -2
- package/dist/assets/{RelationshipOverlay-B9bqt4zl.js → RelationshipOverlay-B3AN-bM-.js} +1 -1
- package/dist/assets/{RelationshipsSection-DttMvF2i.js → RelationshipsSection-DggeGBKP.js} +1 -1
- package/dist/assets/{ReviewDashboard-DKoExM8K.js → ReviewDashboard--LMXZ3F4.js} +1 -1
- package/dist/assets/ScenarioEditor-bB4iBbgO.js +3 -0
- package/dist/assets/{StatisticsDashboard-B8BduIDz.js → StatisticsDashboard-iXimfU20.js} +1 -1
- package/dist/assets/{SysmlCodeEditor-Die2RUsz.js → SysmlCodeEditor-i0BHj3of.js} +117 -117
- package/dist/assets/TabularView-DnIfq-TB.js +1 -0
- package/dist/assets/TraceabilityMatrix-eilGn6Sr.js +3 -0
- package/dist/assets/UiScreensWorkspace-Cs1ivqzc.js +1 -0
- package/dist/assets/{WorkflowWizard-7--f9OH2.js → WorkflowWizard-C7jI6C59.js} +1 -1
- package/dist/assets/html2canvas.esm-QH1iLAAe.js +22 -0
- package/dist/assets/index-CG-gfw-s.js +4067 -0
- package/dist/assets/index-DXB4CKwW.css +1 -0
- package/dist/assets/index.es-DABt8CUc.js +18 -0
- package/dist/assets/jspdf.es.min-G-Vwo9yG.js +170 -0
- package/dist/assets/{layout-providers-Dr743WlP.js → layout-providers-BSDYNZu0.js} +1 -1
- package/dist/assets/notation-scene-DLZms6VR.js +1 -0
- package/dist/assets/purify.es-DP5U8-sc.js +3 -0
- package/dist/assets/{reactflow-CsCqNKB-.js → reactflow-C9OlmOYw.js} +5 -5
- package/dist/assets/xlsx-CkFp8p6R.js +105 -0
- package/dist/index.html +3 -3
- package/dist-standalone/index.html +5504 -0
- package/lib/__tests__/compiler-bundling.test.d.ts +2 -0
- package/lib/__tests__/compiler-bundling.test.d.ts.map +1 -0
- package/lib/__tests__/compiler-bundling.test.js +32 -0
- package/lib/__tests__/compiler-bundling.test.js.map +1 -0
- package/lib/__tests__/standalone-distribution.test.d.ts +2 -0
- package/lib/__tests__/standalone-distribution.test.d.ts.map +1 -0
- package/lib/__tests__/standalone-distribution.test.js +51 -0
- package/lib/__tests__/standalone-distribution.test.js.map +1 -0
- package/lib/__tests__/standard-sysml-diagrams-smoke.test.d.ts +2 -0
- package/lib/__tests__/standard-sysml-diagrams-smoke.test.d.ts.map +1 -0
- package/lib/__tests__/standard-sysml-diagrams-smoke.test.js +22 -0
- package/lib/__tests__/standard-sysml-diagrams-smoke.test.js.map +1 -0
- package/lib/__tests__/supervised-child-args.test.d.ts +2 -0
- package/lib/__tests__/supervised-child-args.test.d.ts.map +1 -0
- package/lib/__tests__/supervised-child-args.test.js +55 -0
- package/lib/__tests__/supervised-child-args.test.js.map +1 -0
- package/lib/bin/memo-architect.js +30 -4
- package/lib/bin/memo-architect.js.map +1 -1
- package/lib/commands/build.d.ts.map +1 -1
- package/lib/commands/build.js +15 -18
- package/lib/commands/build.js.map +1 -1
- package/lib/commands/dev.d.ts +32 -2
- package/lib/commands/dev.d.ts.map +1 -1
- package/lib/commands/dev.js +95 -8
- package/lib/commands/dev.js.map +1 -1
- package/lib/commands/example.d.ts +1 -0
- package/lib/commands/example.d.ts.map +1 -1
- package/lib/commands/example.js +2 -0
- package/lib/commands/example.js.map +1 -1
- package/lib/feature-grants.d.ts.map +1 -1
- package/lib/feature-grants.js +3 -1
- package/lib/feature-grants.js.map +1 -1
- package/package.json +16 -6
- package/dist/assets/AiWorkspace-DS79vBOT.js +0 -3
- package/dist/assets/AnalysisWorkspace-D_u4shRY.js +0 -39
- package/dist/assets/DSMView-DGheBwZ0.js +0 -1
- package/dist/assets/Dashboard-BRUQvUFK.js +0 -1
- package/dist/assets/DhfDashboard-B9V_n7kg.js +0 -1
- package/dist/assets/DhfSettingsPanel-B8aLsWn6.js +0 -1
- package/dist/assets/DhfWorkbench-TOnZkdUU.js +0 -69
- package/dist/assets/DiagramCanvas-B9d4aLKt.js +0 -1
- package/dist/assets/DiagramEditor-CJ7OG2IC.js +0 -4
- package/dist/assets/ElementDetailView-CDcm1rvf.js +0 -2
- package/dist/assets/OntologyDecompositionDiagram-DkxTe2C_.js +0 -1
- package/dist/assets/ScenarioEditor-JQ3huCnz.js +0 -3
- package/dist/assets/TabularView-BXfFSluC.js +0 -1
- package/dist/assets/TraceabilityMatrix-CHZHFucA.js +0 -1
- package/dist/assets/editor.worker-DyuDvpVp.js +0 -26
- package/dist/assets/index-CVW92JY7.js +0 -3280
- package/dist/assets/index-Y1UZTZg-.css +0 -1
- package/dist/assets/layout-selection-ClQ295Xc.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler-bundling.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/compiler-bundling.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
// ─── Architect delegates compiler selection to tools ─────────────────────────
|
|
6
|
+
//
|
|
7
|
+
// "The user is responsible for PATH" governs third-party validators. It has
|
|
8
|
+
// never governed MEMO's own compiler: a default install has to compile and draw
|
|
9
|
+
// with nothing installed and nothing configured. Architect therefore *bundles*
|
|
10
|
+
// its bundled `memo-sysmlc` default, SysIDE, or another configured provider.
|
|
11
|
+
//
|
|
12
|
+
// Resolving and spawning it stays in MEMO Tools (§1.2.2 rule 4). Architect's
|
|
13
|
+
// whole part in this is the tools dependency; that is what this test pins.
|
|
14
|
+
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
15
|
+
const manifest = JSON.parse(readFileSync(resolve(ROOT, 'package.json'), 'utf8'));
|
|
16
|
+
describe('Architect delegates compiler selection to tools', () => {
|
|
17
|
+
it('declares tools, not a fixed compiler, as its runtime dependency', () => {
|
|
18
|
+
expect(Object.keys(manifest.dependencies)).toContain('@memoarchitect/tools');
|
|
19
|
+
expect(Object.keys(manifest.dependencies)).not.toContain('@memoarchitect/sysmlc');
|
|
20
|
+
});
|
|
21
|
+
it('does not declare a second compiler package', () => {
|
|
22
|
+
expect(manifest.dependencies['@memoarchitect/sysmlc']).toBeUndefined();
|
|
23
|
+
});
|
|
24
|
+
it('does not reach for the compiler itself', () => {
|
|
25
|
+
// Architect calls MEMO Tools; MEMO Tools spawns the compiler. An
|
|
26
|
+
// Architect that knew how to start `memo-sysmlc` would be a second
|
|
27
|
+
// implementation of an operation that already has one.
|
|
28
|
+
const dev = readFileSync(resolve(ROOT, 'src/commands/dev.ts'), 'utf8');
|
|
29
|
+
expect(dev).not.toMatch(/memo-sysmlc/);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=compiler-bundling.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler-bundling.test.js","sourceRoot":"","sources":["../../src/__tests__/compiler-bundling.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,gFAAgF;AAChF,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAE3E,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjF,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,iEAAiE;QACjE,mEAAmE;QACnE,uDAAuD;QACvD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-distribution.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/standalone-distribution.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
// ─── The standalone distribution is one file with nothing to fetch ───────────
|
|
6
|
+
//
|
|
7
|
+
// `memo-architect build --standalone` exists so a viewer can be opened off
|
|
8
|
+
// disk. Two things make that possible and neither is visible in the source: the
|
|
9
|
+
// build must leave no reference to a second file, and it must not reach the
|
|
10
|
+
// network. Both were broken before — the flag inlined the entry script but left
|
|
11
|
+
// its chunk imports pointing at `/assets/…`, so the page 404'd when served and
|
|
12
|
+
// died on CORS when opened, and it did that silently, as a blank screen.
|
|
13
|
+
//
|
|
14
|
+
// These assertions are on the built artefact rather than on the config, because
|
|
15
|
+
// the config is not what the user opens.
|
|
16
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
18
|
+
const INDEX = resolve(ROOT, 'dist-standalone/index.html');
|
|
19
|
+
const built = existsSync(INDEX);
|
|
20
|
+
const html = built ? readFileSync(INDEX, 'utf8') : '';
|
|
21
|
+
// The distribution is a build output, so a source checkout may not have one.
|
|
22
|
+
// Skipping keeps `pnpm test` honest without pretending the file was checked.
|
|
23
|
+
const describeBuilt = built ? describe : describe.skip;
|
|
24
|
+
describeBuilt('standalone distribution', () => {
|
|
25
|
+
it('is a single file', () => {
|
|
26
|
+
expect(statSync(INDEX).isFile()).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
it('references no sibling asset', () => {
|
|
29
|
+
// Only fetchable paths count. The inlined bundle contains plenty of
|
|
30
|
+
// attribute-shaped text — `href="${url}"`, `href="$2"` — which is
|
|
31
|
+
// library code writing markup at runtime, not a reference this file has.
|
|
32
|
+
const refs = [...html.matchAll(/(?:src|href)="([^"]+)"/g)]
|
|
33
|
+
.map(match => match[1])
|
|
34
|
+
.filter(url => /^(?:\/|\.\.?\/)/.test(url) || /\.(?:js|mjs|css|png|svg|woff2?)$/.test(url))
|
|
35
|
+
.filter(url => !url.includes('$'));
|
|
36
|
+
expect(refs).toEqual([]);
|
|
37
|
+
});
|
|
38
|
+
it('loads nothing over the network', () => {
|
|
39
|
+
expect(html).not.toMatch(/(?:src|href)="https?:\/\//);
|
|
40
|
+
expect(html).not.toContain('fonts.googleapis.com');
|
|
41
|
+
});
|
|
42
|
+
it('carries no unresolved Vite preload marker', () => {
|
|
43
|
+
// A bare `__VITE_PRELOAD__` is a ReferenceError on load: the token is
|
|
44
|
+
// substituted in a hook that runs after the one that inlines the chunk.
|
|
45
|
+
expect(html).not.toContain('__VITE_PRELOAD__');
|
|
46
|
+
});
|
|
47
|
+
it('emits no ELK layout worker beside it', () => {
|
|
48
|
+
expect(existsSync(resolve(ROOT, 'dist-standalone/elk-worker.min.js'))).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=standalone-distribution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-distribution.test.js","sourceRoot":"","sources":["../../src/__tests__/standalone-distribution.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,gFAAgF;AAChF,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,EAAE;AACF,gFAAgF;AAChF,yCAAyC;AACzC,gFAAgF;AAEhF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;AAE1D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAEtD,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEvD,aAAa,CAAC,yBAAyB,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,oEAAoE;QACpE,kEAAkE;QAClE,yEAAyE;QACzE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;aACrD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACtB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,kCAAkC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC1F,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACjD,sEAAsE;QACtE,wEAAwE;QACxE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-sysml-diagrams-smoke.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/standard-sysml-diagrams-smoke.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { listArchitectExamples } from '../commands/example.js';
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
describe('memo-architect --example standard-sysml-diagrams', () => {
|
|
8
|
+
it('ships the runnable action-flow model with its source identities', () => {
|
|
9
|
+
expect(listArchitectExamples()).toContain('standard-sysml-diagrams');
|
|
10
|
+
const ontologyRoot = dirname(require.resolve('@memoarchitect/ontology/package.json'));
|
|
11
|
+
const source = readFileSync(join(ontologyRoot, 'examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml'), 'utf8');
|
|
12
|
+
expect(source).toContain('FulfillOrder');
|
|
13
|
+
expect(source).toContain('receiveOrder');
|
|
14
|
+
expect(source).toContain('routeOrder');
|
|
15
|
+
expect(source).toContain('readyToNotify');
|
|
16
|
+
expect(source).toContain('CustomerProcess');
|
|
17
|
+
expect(source).toContain('validUserDecision');
|
|
18
|
+
expect(source).toContain('shoppingDecision');
|
|
19
|
+
expect(source).toContain('creditDecision');
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=standard-sysml-diagrams-smoke.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-sysml-diagrams-smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/standard-sysml-diagrams-smoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,sEAAsE,CAAC,EAAE,MAAM,CAAC,CAAC;QAChI,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervised-child-args.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/supervised-child-args.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { runningArchitectsForProject, supervisedChildArgs } from '../commands/dev.js';
|
|
3
|
+
// ─── Supervised child argv ──────────────────────────────────────────────────
|
|
4
|
+
//
|
|
5
|
+
// The supervisor rebuilds argv rather than forwarding it, so every flag the
|
|
6
|
+
// session was started with has to be restated. A dropped flag is invisible:
|
|
7
|
+
// the server starts, serves, and simply behaves as though the user never
|
|
8
|
+
// passed it — which is how `--experimental dev` came to serve a client with
|
|
9
|
+
// no Traceability, Ontology, Import or AI surfaces.
|
|
10
|
+
const ENTRY = '/usr/local/bin/memo-architect.js';
|
|
11
|
+
describe('supervisedChildArgs', () => {
|
|
12
|
+
it('carries the experimental grant to the child that serves the client', () => {
|
|
13
|
+
const args = supervisedChildArgs(ENTRY, { featureGrants: { experimental: true } }, true);
|
|
14
|
+
expect(args).toContain('--experimental');
|
|
15
|
+
});
|
|
16
|
+
it('does not invent a grant the session was started without', () => {
|
|
17
|
+
expect(supervisedChildArgs(ENTRY, { featureGrants: { experimental: false } }, true))
|
|
18
|
+
.not.toContain('--experimental');
|
|
19
|
+
expect(supervisedChildArgs(ENTRY, {}, true)).not.toContain('--experimental');
|
|
20
|
+
});
|
|
21
|
+
it('keeps the toolchain selection across a relaunch', () => {
|
|
22
|
+
const args = supervisedChildArgs(ENTRY, { toolchainArgv: ['--toolchain.validator=syside'] }, false);
|
|
23
|
+
expect(args).toContain('--toolchain.validator=syside');
|
|
24
|
+
});
|
|
25
|
+
it('opens a browser once, and never again on a relaunch', () => {
|
|
26
|
+
expect(supervisedChildArgs(ENTRY, { open: true }, true)).not.toContain('--no-open');
|
|
27
|
+
expect(supervisedChildArgs(ENTRY, { open: true }, false)).toContain('--no-open');
|
|
28
|
+
expect(supervisedChildArgs(ENTRY, { open: false }, true)).toContain('--no-open');
|
|
29
|
+
});
|
|
30
|
+
it('passes the resolved port, defaulting to 3000', () => {
|
|
31
|
+
expect(supervisedChildArgs(ENTRY, { port: 4100 }, true)).toEqual([ENTRY, 'dev', '--port', '4100']);
|
|
32
|
+
expect(supervisedChildArgs(ENTRY, {}, true)).toContain('3000');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('runningArchitectsForProject', () => {
|
|
36
|
+
it('reports only Architect servers whose cwd is the requested project', async () => {
|
|
37
|
+
const run = async (file, args) => {
|
|
38
|
+
if (file === 'ps') {
|
|
39
|
+
return {
|
|
40
|
+
stdout: [
|
|
41
|
+
'100 node /workspace/pump/node_modules/.bin/memo-architect dev --port 3111',
|
|
42
|
+
'200 node /workspace/other/node_modules/.bin/memo-architect dev --port 3112',
|
|
43
|
+
].join('\n'),
|
|
44
|
+
stderr: '',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
expect(file).toBe('lsof');
|
|
48
|
+
return { stdout: args[2] === '100' ? 'pcwd\nn/workspace/pump\n' : 'pcwd\nn/workspace/other\n', stderr: '' };
|
|
49
|
+
};
|
|
50
|
+
await expect(runningArchitectsForProject('/workspace/pump', run)).resolves.toEqual([
|
|
51
|
+
{ pid: 100, command: 'node /workspace/pump/node_modules/.bin/memo-architect dev --port 3111' },
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=supervised-child-args.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervised-child-args.test.js","sourceRoot":"","sources":["../../src/__tests__/supervised-child-args.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,15 +4,36 @@ import { architectBuildCommand } from '../commands/build.js';
|
|
|
4
4
|
import { architectDevCommand } from '../commands/dev.js';
|
|
5
5
|
import { architectExampleCommand, listArchitectExamples, listArchitectTemplates, } from '../commands/example.js';
|
|
6
6
|
import { EXPERIMENTAL_FLAG_DESCRIPTION, resolveFeatureGrants } from '../feature-grants.js';
|
|
7
|
+
import { applyToolchainCliOptions, defaultRegistry, toolchainOptionName } from '@memoarchitect/tools';
|
|
7
8
|
const program = new Command();
|
|
9
|
+
/**
|
|
10
|
+
* Toolchain flags, generated by MEMO Tools from its provider registry.
|
|
11
|
+
*
|
|
12
|
+
* Architect declares none of them itself and reads none of their values: it
|
|
13
|
+
* forwards them to the operation that owns the toolchain. That is the whole of
|
|
14
|
+
* §1.2.2 here — anything you can do in the UI you can script, without Architect
|
|
15
|
+
* learning a provider's name or a tool's output format.
|
|
16
|
+
*/
|
|
17
|
+
const TOOLCHAIN_OPTION_NAMES = defaultRegistry.schema().map(toolchainOptionName);
|
|
18
|
+
function toolchainOptionsFrom(options) {
|
|
19
|
+
return Object.fromEntries(TOOLCHAIN_OPTION_NAMES
|
|
20
|
+
.filter(name => options[name] !== undefined)
|
|
21
|
+
.map(name => [name, options[name]]));
|
|
22
|
+
}
|
|
23
|
+
/** Re-emit the toolchain flags so the supervised child runs the same toolchain. */
|
|
24
|
+
function toolchainArgv(options) {
|
|
25
|
+
return Object.entries(toolchainOptionsFrom(options))
|
|
26
|
+
.flatMap(([name, value]) => [`--${name}`, String(value)]);
|
|
27
|
+
}
|
|
8
28
|
program
|
|
9
29
|
.name('memo-architect')
|
|
10
30
|
.description('MEMO Architect — interactive and distributable model workbench')
|
|
11
|
-
.version('0.6.
|
|
31
|
+
.version('0.6.6')
|
|
12
32
|
.option('--example <name>', 'Open a bundled example project (e.g. gpca, standard-sysml-diagrams). A local checkout is opened in place; an installed package is opened read-only in a disposable copy')
|
|
13
33
|
.option('--read-only', 'Always open the example in a disposable copy, even from a local checkout')
|
|
14
34
|
.option('-p, --port <port>', 'Server port', '3000')
|
|
15
35
|
.option('--no-open', 'Do not open a browser')
|
|
36
|
+
.option('--keep-alive', 'Keep running after the last browser disconnects')
|
|
16
37
|
.option('--experimental', EXPERIMENTAL_FLAG_DESCRIPTION)
|
|
17
38
|
.action(async (options) => {
|
|
18
39
|
if (options.example) {
|
|
@@ -22,6 +43,7 @@ program
|
|
|
22
43
|
open: options.open,
|
|
23
44
|
readOnly: options.readOnly,
|
|
24
45
|
featureGrants: resolveFeatureGrants(options),
|
|
46
|
+
keepAlive: options.keepAlive,
|
|
25
47
|
});
|
|
26
48
|
return;
|
|
27
49
|
}
|
|
@@ -44,20 +66,24 @@ function resolveOption(command, name, local) {
|
|
|
44
66
|
return parent.opts()[name];
|
|
45
67
|
return local;
|
|
46
68
|
}
|
|
47
|
-
program
|
|
69
|
+
applyToolchainCliOptions(program
|
|
48
70
|
.command('dev')
|
|
49
71
|
.description('Start Architect with live model reload')
|
|
50
72
|
.option('-p, --port <port>', 'Server port', '3000')
|
|
51
73
|
.option('--no-open', 'Do not open a browser')
|
|
52
|
-
.option('--
|
|
53
|
-
.action(async function (options) {
|
|
74
|
+
.option('--keep-alive', 'Keep running after the last browser disconnects')
|
|
75
|
+
.option('--experimental', EXPERIMENTAL_FLAG_DESCRIPTION), defaultRegistry).action(async function (options) {
|
|
54
76
|
const port = resolveOption(this, 'port', options.port);
|
|
55
77
|
const open = resolveOption(this, 'open', options.open);
|
|
56
78
|
const experimental = resolveOption(this, 'experimental', options.experimental);
|
|
79
|
+
const keepAlive = resolveOption(this, 'keepAlive', options.keepAlive);
|
|
57
80
|
await architectDevCommand({
|
|
58
81
|
port: Number.parseInt(String(port), 10),
|
|
59
82
|
open,
|
|
60
83
|
featureGrants: resolveFeatureGrants({ experimental }),
|
|
84
|
+
keepAlive: keepAlive === true,
|
|
85
|
+
toolchainOptions: toolchainOptionsFrom(options),
|
|
86
|
+
toolchainArgv: toolchainArgv(options),
|
|
61
87
|
});
|
|
62
88
|
});
|
|
63
89
|
program
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memo-architect.js","sourceRoot":"","sources":["../../src/bin/memo-architect.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EACH,uBAAuB,EAAE,qBAAqB,EAAE,sBAAsB,GACzE,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"memo-architect.js","sourceRoot":"","sources":["../../src/bin/memo-architect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAWA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAWA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM/E,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wFAAwF;IACxF,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChB"}
|
package/lib/commands/build.js
CHANGED
|
@@ -6,22 +6,15 @@ import { injectFeatureGrants } from '../feature-grants.js';
|
|
|
6
6
|
function architectPackageRoot() {
|
|
7
7
|
return resolve(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
8
8
|
}
|
|
9
|
-
function inlineEntryAssets(html, outputDir) {
|
|
10
|
-
html = html.replace(/<link[^>]+rel="stylesheet"[^>]+href="([^"]+)"[^>]*\/?>/g, (match, href) => {
|
|
11
|
-
const path = resolve(outputDir, href.replace(/^\//, ''));
|
|
12
|
-
return existsSync(path) ? `<style>${readFileSync(path, 'utf-8')}</style>` : match;
|
|
13
|
-
});
|
|
14
|
-
html = html.replace(/<script[^>]+src="([^"]+)"[^>]*><\/script>/g, (match, src) => {
|
|
15
|
-
const path = resolve(outputDir, src.replace(/^\//, ''));
|
|
16
|
-
return existsSync(path) ? `<script type="module">${readFileSync(path, 'utf-8')}</script>` : match;
|
|
17
|
-
});
|
|
18
|
-
return html;
|
|
19
|
-
}
|
|
20
9
|
export async function architectBuildCommand(options) {
|
|
21
10
|
const snapshot = await buildProjectSnapshot();
|
|
22
|
-
|
|
11
|
+
// Two distributions, because one file and many files are different builds,
|
|
12
|
+
// not the same build post-processed: see packages/web/vite.standalone.config.ts.
|
|
13
|
+
const sourceDist = resolve(architectPackageRoot(), options.standalone ? 'dist-standalone' : 'dist');
|
|
23
14
|
if (!existsSync(resolve(sourceDist, 'index.html'))) {
|
|
24
|
-
throw new Error(
|
|
15
|
+
throw new Error(options.standalone
|
|
16
|
+
? 'Standalone Architect distribution is missing. Reinstall @memoarchitect/architect or run `pnpm run build:client:standalone`.'
|
|
17
|
+
: 'Architect distribution is missing. Reinstall @memoarchitect/architect or run its build.');
|
|
25
18
|
}
|
|
26
19
|
const outputDir = resolve(snapshot.projectRoot, options.output || 'dist');
|
|
27
20
|
if (outputDir === sourceDist) {
|
|
@@ -29,19 +22,23 @@ export async function architectBuildCommand(options) {
|
|
|
29
22
|
}
|
|
30
23
|
rmSync(outputDir, { recursive: true, force: true });
|
|
31
24
|
mkdirSync(outputDir, { recursive: true });
|
|
32
|
-
|
|
25
|
+
// The standalone distribution is the single HTML file and nothing beside
|
|
26
|
+
// it; copying the directory would be copying that one file.
|
|
27
|
+
if (!options.standalone)
|
|
28
|
+
cpSync(sourceDist, outputDir, { recursive: true });
|
|
33
29
|
const indexPath = resolve(outputDir, 'index.html');
|
|
34
|
-
let html = readFileSync(
|
|
30
|
+
let html = readFileSync(resolve(sourceDist, 'index.html'), 'utf-8');
|
|
35
31
|
const payload = serializeForInlineScript({
|
|
36
32
|
model: snapshot.model,
|
|
37
33
|
validation: snapshot.validation,
|
|
38
34
|
completeness: snapshot.completeness,
|
|
39
35
|
});
|
|
40
|
-
|
|
36
|
+
// Replacer function, not a replacement string: model text containing `$&`
|
|
37
|
+
// or ``$` `` would otherwise be read as a substitution pattern and splice
|
|
38
|
+
// the document into the payload.
|
|
39
|
+
html = html.replace('</head>', () => `<script>window.__MEMO_DATA__=${payload};</script>\n</head>`);
|
|
41
40
|
if (options.featureGrants)
|
|
42
41
|
html = injectFeatureGrants(html, options.featureGrants);
|
|
43
|
-
if (options.standalone)
|
|
44
|
-
html = inlineEntryAssets(html, outputDir);
|
|
45
42
|
writeFileSync(indexPath, html);
|
|
46
43
|
process.stdout.write(`Architect viewer built at ${indexPath}\n`);
|
|
47
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,UAAU,EACV,SAAS,EACT,YAAY,EACZ,MAAM,EACN,aAAa,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAE/E,SAAS,oBAAoB;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,UAAU,EACV,SAAS,EACT,YAAY,EACZ,MAAM,EACN,aAAa,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAE/E,SAAS,oBAAoB;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAK3C;IACG,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC9C,2EAA2E;IAC3E,iFAAiF;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,oBAAoB,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU;YAC9B,CAAC,CAAC,6HAA6H;YAC/H,CAAC,CAAC,yFAAyF,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;IAC1E,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,yEAAyE;IACzE,4DAA4D;IAC5D,IAAI,CAAC,OAAO,CAAC,UAAU;QAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACrC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;KACtC,CAAC,CAAC;IACH,0EAA0E;IAC1E,0EAA0E;IAC1E,iCAAiC;IACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,gCAAgC,OAAO,qBAAqB,CAAC,CAAC;IACnG,IAAI,OAAO,CAAC,aAAa;QAAE,IAAI,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACnF,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,SAAS,IAAI,CAAC,CAAC;AACrE,CAAC"}
|
package/lib/commands/dev.d.ts
CHANGED
|
@@ -1,7 +1,37 @@
|
|
|
1
1
|
import { type FeatureGrants } from '../feature-grants.js';
|
|
2
|
-
|
|
2
|
+
type ProjectProcessRunner = (file: string, args: string[]) => Promise<{
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
}>;
|
|
6
|
+
export interface RunningArchitect {
|
|
7
|
+
pid: number;
|
|
8
|
+
command: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Best-effort duplicate detection. A dev server has a supervisor and a runtime
|
|
12
|
+
* child, so callers treat this as an advisory rather than a process count.
|
|
13
|
+
*/
|
|
14
|
+
export declare function runningArchitectsForProject(projectDir: string, run?: ProjectProcessRunner): Promise<RunningArchitect[]>;
|
|
15
|
+
export interface ArchitectDevOptions {
|
|
3
16
|
port?: number;
|
|
4
17
|
open?: boolean;
|
|
5
18
|
featureGrants?: FeatureGrants;
|
|
6
|
-
|
|
19
|
+
keepAlive?: boolean;
|
|
20
|
+
/** Parsed `--toolchain.*` options, passed straight through to MEMO Tools. */
|
|
21
|
+
toolchainOptions?: Record<string, unknown>;
|
|
22
|
+
/** The same flags as argv, so the supervised child runs the same toolchain. */
|
|
23
|
+
toolchainArgv?: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The argv the supervised child is launched with.
|
|
27
|
+
*
|
|
28
|
+
* The child, not this process, serves the client shell and holds the model
|
|
29
|
+
* runtime — so anything the session was started with has to be restated here
|
|
30
|
+
* or it is silently lost. That has bitten grants (the browser lost every
|
|
31
|
+
* experimental surface) and would bite the toolchain the same way, which is
|
|
32
|
+
* why this is one reviewable function rather than a line in a loop.
|
|
33
|
+
*/
|
|
34
|
+
export declare function supervisedChildArgs(entry: string, options: ArchitectDevOptions, firstStart: boolean): string[];
|
|
35
|
+
export declare function architectDevCommand(options: ArchitectDevOptions): Promise<void>;
|
|
36
|
+
export {};
|
|
7
37
|
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI/E,KAAK,oBAAoB,GAAG,CACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAIjD,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC7C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,oBAAwC,GAC9C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuB7B;AAYD,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAClF,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,OAAO,GACpB,MAAM,EAAE,CAOV;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDrF"}
|
package/lib/commands/dev.js
CHANGED
|
@@ -1,8 +1,43 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { dirname, resolve } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { execFile, spawn } from 'node:child_process';
|
|
5
|
+
import { once } from 'node:events';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
4
7
|
import { startProjectServer } from '@memoarchitect/tools';
|
|
5
8
|
import { injectFeatureGrants } from '../feature-grants.js';
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
const runProjectProcess = (file, args) => execFileAsync(file, args);
|
|
11
|
+
/**
|
|
12
|
+
* Best-effort duplicate detection. A dev server has a supervisor and a runtime
|
|
13
|
+
* child, so callers treat this as an advisory rather than a process count.
|
|
14
|
+
*/
|
|
15
|
+
export async function runningArchitectsForProject(projectDir, run = runProjectProcess) {
|
|
16
|
+
try {
|
|
17
|
+
const { stdout } = await run('ps', ['-axo', 'pid=,command=']);
|
|
18
|
+
const candidates = stdout.split('\n').flatMap(line => {
|
|
19
|
+
const match = line.trim().match(/^(\d+)\s+(.+)$/);
|
|
20
|
+
return match && /(?:^|\/)memo-architect(?:\.js)?\s+dev\b/.test(match[2])
|
|
21
|
+
&& Number(match[1]) !== process.pid
|
|
22
|
+
? [{ pid: Number(match[1]), command: match[2] }]
|
|
23
|
+
: [];
|
|
24
|
+
});
|
|
25
|
+
const matching = await Promise.all(candidates.map(async (candidate) => {
|
|
26
|
+
try {
|
|
27
|
+
const { stdout } = await run('lsof', ['-a', '-p', String(candidate.pid), '-d', 'cwd', '-Fn']);
|
|
28
|
+
const cwd = stdout.split('\n').find(line => line.startsWith('n'))?.slice(1);
|
|
29
|
+
return cwd === projectDir ? candidate : undefined;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
}));
|
|
35
|
+
return matching.filter((candidate) => candidate !== undefined);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
6
41
|
function architectPackageRoot() {
|
|
7
42
|
return resolve(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
8
43
|
}
|
|
@@ -11,20 +46,72 @@ function clientRoot() {
|
|
|
11
46
|
const sourceRoot = resolve(root, 'packages', 'web');
|
|
12
47
|
return existsSync(resolve(sourceRoot, 'index.html')) ? sourceRoot : root;
|
|
13
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* The argv the supervised child is launched with.
|
|
51
|
+
*
|
|
52
|
+
* The child, not this process, serves the client shell and holds the model
|
|
53
|
+
* runtime — so anything the session was started with has to be restated here
|
|
54
|
+
* or it is silently lost. That has bitten grants (the browser lost every
|
|
55
|
+
* experimental surface) and would bite the toolchain the same way, which is
|
|
56
|
+
* why this is one reviewable function rather than a line in a loop.
|
|
57
|
+
*/
|
|
58
|
+
export function supervisedChildArgs(entry, options, firstStart) {
|
|
59
|
+
const args = [entry, 'dev', '--port', String(options.port ?? 3000)];
|
|
60
|
+
if (!firstStart || options.open === false)
|
|
61
|
+
args.push('--no-open');
|
|
62
|
+
if (options.keepAlive)
|
|
63
|
+
args.push('--keep-alive');
|
|
64
|
+
if (options.featureGrants?.experimental === true)
|
|
65
|
+
args.push('--experimental');
|
|
66
|
+
args.push(...(options.toolchainArgv ?? []));
|
|
67
|
+
return args;
|
|
68
|
+
}
|
|
14
69
|
export async function architectDevCommand(options) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
70
|
+
if (process.env.MEMO_ARCHITECT_RUNTIME_CHILD !== '1') {
|
|
71
|
+
const port = options.port ?? 3000;
|
|
72
|
+
const existing = await runningArchitectsForProject(process.cwd());
|
|
73
|
+
if (existing.length > 0) {
|
|
74
|
+
const pids = existing.map(({ pid }) => pid).join(', ');
|
|
75
|
+
process.stderr.write(`⚠ MEMO Architect is already running for this project (PID${existing.length === 1 ? '' : 's'} ${pids}). `
|
|
76
|
+
+ `Starting another server on http://127.0.0.1:${port}.\n`);
|
|
77
|
+
}
|
|
78
|
+
let stopping = false;
|
|
79
|
+
let firstStart = true;
|
|
80
|
+
let restartStartedAt;
|
|
81
|
+
let child;
|
|
82
|
+
const stop = () => { stopping = true; child?.kill('SIGTERM'); };
|
|
83
|
+
process.once('SIGINT', stop);
|
|
84
|
+
process.once('SIGTERM', stop);
|
|
85
|
+
while (!stopping) {
|
|
86
|
+
const args = supervisedChildArgs(process.argv[1], { ...options, port }, firstStart);
|
|
87
|
+
child = spawn(process.execPath, args, {
|
|
88
|
+
cwd: process.cwd(), stdio: 'inherit',
|
|
89
|
+
env: {
|
|
90
|
+
...process.env,
|
|
91
|
+
MEMO_ARCHITECT_RUNTIME_CHILD: '1',
|
|
92
|
+
...(restartStartedAt ? { MEMO_RUNTIME_RESTART_STARTED_AT: String(restartStartedAt) } : {}),
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
firstStart = false;
|
|
96
|
+
const [code] = await once(child, 'exit');
|
|
97
|
+
child = undefined;
|
|
98
|
+
if (stopping || code !== 75) {
|
|
99
|
+
if (code && code !== 0)
|
|
100
|
+
process.exitCode = code;
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
restartStartedAt = Date.now();
|
|
104
|
+
process.stderr.write(' Reusable semantics changed; relaunching model runtime...\n');
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
23
107
|
}
|
|
24
108
|
await startProjectServer({
|
|
25
109
|
port: options.port,
|
|
26
110
|
open: options.open,
|
|
27
111
|
clientRoot: clientRoot(),
|
|
112
|
+
exitWhenIdle: !options.keepAlive,
|
|
113
|
+
supervisedRuntime: true,
|
|
114
|
+
toolchainOptions: options.toolchainOptions,
|
|
28
115
|
// Tools serves the shell; Architect decides what goes into it.
|
|
29
116
|
transformClientHtml: options.featureGrants
|
|
30
117
|
? html => injectFeatureGrants(html, options.featureGrants)
|
package/lib/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAE/E,SAAS,oBAAoB;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,UAAU;IACf,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,5 +18,6 @@ export declare function architectExampleCommand(options: {
|
|
|
18
18
|
/** Force the disposable copy even for a local checkout. */
|
|
19
19
|
readOnly?: boolean;
|
|
20
20
|
featureGrants?: FeatureGrants;
|
|
21
|
+
keepAlive?: boolean;
|
|
21
22
|
}): Promise<void>;
|
|
22
23
|
//# sourceMappingURL=example.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../src/commands/example.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgE1D,kDAAkD;AAClD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AA2BD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../src/commands/example.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgE1D,kDAAkD;AAClD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AA2BD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChB"}
|
package/lib/commands/example.js
CHANGED
|
@@ -128,6 +128,7 @@ export async function architectExampleCommand(options) {
|
|
|
128
128
|
process.chdir(target);
|
|
129
129
|
await architectDevCommand({
|
|
130
130
|
port: options.port, open: options.open, featureGrants: options.featureGrants,
|
|
131
|
+
keepAlive: options.keepAlive,
|
|
131
132
|
});
|
|
132
133
|
return;
|
|
133
134
|
}
|
|
@@ -149,6 +150,7 @@ export async function architectExampleCommand(options) {
|
|
|
149
150
|
process.chdir(tempRoot);
|
|
150
151
|
await architectDevCommand({
|
|
151
152
|
port: options.port, open: options.open, featureGrants: options.featureGrants,
|
|
153
|
+
keepAlive: options.keepAlive,
|
|
152
154
|
});
|
|
153
155
|
}
|
|
154
156
|
//# sourceMappingURL=example.js.map
|