Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
975d2b8
feat(vscode): add CalmHub connection, CURIE resolution, and Hub palet…
byrash Sep 1, 2026
41a3a3b
Merge remote-tracking branch 'origin/main' into feat/vscode-hub-integ…
byrash Sep 1, 2026
21ee975
feat(vscode plugin): Fix race conditions
byrash Sep 10, 2026
3764de2
feat(vscode plugin): Patterns in vs code plugin
byrash Sep 10, 2026
e6ba286
Merge remote-tracking branch 'origin/main' into feat/vscode-hub-integ…
byrash Sep 10, 2026
249b2f1
feat(vscode): import SVG to calm json file
byrash Sep 10, 2026
9ec2c9f
refactor(vscode): rename extensions/ to packs/ for clarity
byrash Sep 11, 2026
e5f5af9
chore(vscode): merge feat/import-svg-to-calm branch
byrash Sep 11, 2026
615e35f
Merge remote-tracking branch 'origin/main' into feat/vscode-hub-integ…
byrash Sep 14, 2026
6d4c200
Merge branch 'main' into feat/import-svg-to-calm
byrash Sep 14, 2026
d49e1c4
feat(vscode plugin): Address Rveview Comments
byrash Sep 14, 2026
046364b
Merge branch 'feat/import-svg-to-calm' into feat/vscode-hub-integration
byrash Sep 14, 2026
f2bd68a
feat(vscode): controls picker, CURIE refs, and slim control entries
byrash Sep 15, 2026
8025efd
feat(vscode): export canvas architecture as pattern and fix control r…
byrash Sep 15, 2026
6b18fdb
feat(vscode): fix node resize handles and add copy-paste support
byrash Sep 16, 2026
6546893
feat(vscode): fix Hub control resolution and improve control UX
byrash Sep 17, 2026
2ca7d0b
Merge branch 'main' into feat/vscode-hub-integration
byrash Sep 17, 2026
2a0f864
refactor(vscode): remove standards and guidelines support
byrash Sep 17, 2026
d2fb12a
Merge branch 'main' into feat/import-svg-to-calm
byrash Sep 18, 2026
e9e1257
fix(vscode): address PR #3003 review feedback for SVG import
byrash Sep 18, 2026
b1fac36
Merge branch 'main' into feat/vscode-hub-integration
byrash Sep 18, 2026
34440f9
Merge branch 'feat/import-svg-to-calm' into feat/vscode-hub-integration
byrash Sep 18, 2026
71ae705
fix(vscode): address PR #3003 review feedback for SVG import
byrash Sep 18, 2026
c65ebd3
fix(vscode): resolve merge conflict in drawio-parser lenient decode
byrash Sep 18, 2026
92996fb
Merge branch 'feat/import-svg-to-calm' into feat/vscode-hub-integration
byrash Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion calm-models/src/model/moment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class CalmMoment extends CalmNode implements CalmAdaptable<CalmMomentSche
public adrs?: string[],
public additionalProperties?: Record<string, unknown>
) {
super(originalJson, uniqueId, 'moment', name, description, details, undefined, controls, metadata, additionalProperties);
super(originalJson, uniqueId, 'moment', name, description, undefined, details, undefined, controls, metadata, additionalProperties);
this.validFrom = validFrom;
this.adrs = adrs;
}
Expand Down
65 changes: 64 additions & 1 deletion calm-models/src/model/node.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { CalmNode, CalmNodeDetails } from './node.js';
import { CalmNodeSchema, CalmNodeDetailsSchema } from '../types/core-types.js';
import { ResolvableAndAdaptable } from './resolvable';
import { Resolvable, ResolvableAndAdaptable } from './resolvable';
import { CalmCore } from './core';

describe('CalmNodeDetails', () => {
Expand Down Expand Up @@ -296,4 +296,67 @@ describe('CalmNode', () => {
expect(node.additionalProperties).toEqual({ foo: 'bar', bar: 42 });
expect(node.toCanonicalSchema().additionalProperties).toEqual({ foo: 'bar', bar: 42 });
});

describe('definition-id', () => {
it('should create a Resolvable from definition-id when present', () => {
const schema: CalmNodeSchema = {
'unique-id': 'node-def-1',
'node-type': 'service',
name: 'Def Node',
description: 'A node with definition-id',
'definition-id': 'fae-calm:building-blocks:my-block@a1b2c3d'
};
const node = CalmNode.fromSchema(schema);
expect(node.definitionId).toBeInstanceOf(Resolvable);
expect(node.definitionId?.reference).toBe('fae-calm:building-blocks:my-block@a1b2c3d');
});

it('should leave definitionId undefined when definition-id is absent', () => {
const schema: CalmNodeSchema = {
'unique-id': 'node-def-2',
'node-type': 'service',
name: 'No Def Node',
description: 'A node without definition-id'
};
const node = CalmNode.fromSchema(schema);
expect(node.definitionId).toBeUndefined();
});

it('should include definition-id in toCanonicalSchema() when present', () => {
const schema: CalmNodeSchema = {
'unique-id': 'node-def-3',
'node-type': 'service',
name: 'Canonical Def Node',
description: 'Node with definition-id for canonical',
'definition-id': 'fae-calm:building-blocks:my-block@a1b2c3d'
};
const node = CalmNode.fromSchema(schema);
const canonical = node.toCanonicalSchema();
expect(canonical['definition-id']).toBe('fae-calm:building-blocks:my-block@a1b2c3d');
});

it('should not include definition-id in toCanonicalSchema() when absent', () => {
const schema: CalmNodeSchema = {
'unique-id': 'node-def-4',
'node-type': 'service',
name: 'No Def Canonical Node',
description: 'Node without definition-id for canonical'
};
const node = CalmNode.fromSchema(schema);
const canonical = node.toCanonicalSchema();
expect('definition-id' in canonical).toBe(false);
});

it('should not leak definition-id into additionalProperties', () => {
const schema: CalmNodeSchema = {
'unique-id': 'node-def-5',
'node-type': 'service',
name: 'No Leak Node',
description: 'definition-id should not appear in additional',
'definition-id': 'fae-calm:building-blocks:test@abc123'
};
const node = CalmNode.fromSchema(schema);
expect(node.additionalProperties).toBeUndefined();
});
});
});
6 changes: 5 additions & 1 deletion calm-models/src/model/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { CalmInterface } from './interface.js';
import { CalmControls } from './control.js';
import { CalmMetadata } from './metadata.js';
import { CalmCore } from './core.js';
import { ResolvableAndAdaptable } from './resolvable.js';
import { Resolvable, ResolvableAndAdaptable } from './resolvable.js';
import {
CalmCoreSchema,
CalmNodeDetailsSchema,
Expand Down Expand Up @@ -54,6 +54,7 @@ export class CalmNode implements CalmAdaptable<CalmNodeSchema, CalmNodeCanonical
public nodeType: CalmNodeType,
public name: string,
public description: string,
public definitionId?: Resolvable<Record<string, unknown>>,
public details?: CalmNodeDetails,
public interfaces?: CalmInterface[],
public controls?: CalmControls,
Expand All @@ -71,6 +72,7 @@ export class CalmNode implements CalmAdaptable<CalmNodeSchema, CalmNodeCanonical
'node-type': this.nodeType,
name: this.name,
description: this.description,
...(this.definitionId ? { 'definition-id': this.definitionId.reference } : {}),
details: details,
interfaces: this.interfaces ? this.interfaces.map(i => i.toCanonicalSchema()) : undefined,
controls: this.controls ? this.controls.toCanonicalSchema() : undefined,
Expand All @@ -85,6 +87,7 @@ export class CalmNode implements CalmAdaptable<CalmNodeSchema, CalmNodeCanonical
'node-type': nodeType,
name,
description,
'definition-id': definitionIdRef,
details,
interfaces,
controls,
Expand All @@ -98,6 +101,7 @@ export class CalmNode implements CalmAdaptable<CalmNodeSchema, CalmNodeCanonical
nodeType,
name,
description,
definitionIdRef ? new Resolvable<Record<string, unknown>>(definitionIdRef) : undefined,
details ? CalmNodeDetails.fromSchema(details) : undefined,
interfaces? interfaces.map(CalmInterface.fromSchema) : undefined,
controls? CalmControls.fromSchema(controls): undefined,
Expand Down
1 change: 1 addition & 0 deletions calm-models/src/types/core-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export type CalmNodeSchema = {
'node-type': CalmNodeTypeSchema;
name: string;
description: string;
'definition-id'?: string;
details?: CalmNodeDetailsSchema;
interfaces?: CalmInterfaceSchema[];
controls?: CalmControlsSchema;
Expand Down
40 changes: 40 additions & 0 deletions calm-plugins/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,23 @@
"light": "media/calm-canvas.svg",
"dark": "media/calm-canvas.svg"
}
},
{
"command": "calm.connectToHub",
"title": "CALM: Connect to Hub"
},
{
"command": "calm.disconnectFromHub",
"title": "CALM: Disconnect from Hub"
},
{
"command": "calm.refreshFromHub",
"title": "CALM: Refresh from Hub"
},
{
"command": "calm.importSvg",
"title": "Import SVG as CALM Architecture",
"category": "CALM"
}
],
"keybindings": [
Expand Down Expand Up @@ -67,6 +84,11 @@
"command": "calm.openCanvas",
"when": "resourceFilename =~ /\\.(calm|architecture|template|solution|standard|guideline)\\.json$/",
"group": "navigation"
},
{
"command": "calm.importSvg",
"when": "resourceExtname == .svg",
"group": "navigation"
}
]
},
Expand All @@ -93,6 +115,21 @@
},
"default": [],
"markdownDescription": "List of node type IDs to hide from the palette (e.g. `[\"core:ldap\", \"aws:s3\"]`). Use the `packId:nodeType` format."
},
"calm.hub.url": {
"type": "string",
"default": "",
"description": "CalmHub endpoint URL (e.g. https://calmhub.example.com)"
},
"calm.hub.autoConnect": {
"type": "boolean",
"default": true,
"description": "Automatically connect to CalmHub on startup when URL is configured"
},
"calm.hub.selectedNamespaces": {
"type": "array",
"items": { "type": "string" },
"description": "Selected Hub namespaces to show in the palette (not set = show all)"
}
}
}
Expand All @@ -109,6 +146,8 @@
},
"dependencies": {
"@finos/calm-models": "file:../../calm-models",
"svg-parser": "^2.0.4",
"xml2js": "^0.5.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"reactflow": "^11.11.4",
Expand All @@ -130,6 +169,7 @@
"@types/vscode": "^1.88.0",
"@types/react": "^19.1.0",
"@types/react-dom": "^19.1.0",
"@types/xml2js": "^0.4.14",
"typescript": "^5.8.0",
"vitest": "^4.1.0",
"@vscode/vsce": "^3.0.0"
Expand Down
Loading
Loading