@afroze9/terrastudio-cli 0.41.0

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.
@@ -0,0 +1,133 @@
1
+ import { Command } from 'commander';
2
+ import { storage, toLoadedProject } from '../platform/node-io.js';
3
+ import { Project } from '@terrastudio/project';
4
+ /** Keys that should have their values redacted in output. */
5
+ function isSensitiveKey(key) {
6
+ const lower = key.toLowerCase();
7
+ return (lower.includes('secret') ||
8
+ lower.includes('password') ||
9
+ lower.includes('token') ||
10
+ lower.includes('key'));
11
+ }
12
+ /** Recursively redact sensitive values in an object. */
13
+ function redactSensitive(obj) {
14
+ if (typeof obj !== 'object' || obj === null)
15
+ return obj;
16
+ if (Array.isArray(obj))
17
+ return obj.map(redactSensitive);
18
+ const result = {};
19
+ for (const [k, v] of Object.entries(obj)) {
20
+ result[k] = isSensitiveKey(k) && typeof v === 'string' ? '***' : redactSensitive(v);
21
+ }
22
+ return result;
23
+ }
24
+ export function makeProjectCommand() {
25
+ const cmd = new Command('project').description('Project information and configuration');
26
+ cmd
27
+ .command('create <parentPath> <name>')
28
+ .description('Create a new TerraStudio project directory')
29
+ .option('--providers <providers...>', 'Active providers (default: azurerm)')
30
+ .option('--location <location>', 'Default Azure location (default: eastus)')
31
+ .option('--rg <resourceGroupName>', 'Default resource group name')
32
+ .action(async (parentPath, name, options) => {
33
+ const stored = await storage.createProject(name, parentPath);
34
+ // Apply any option overrides to the saved config
35
+ if (options.providers || options.location || options.rg) {
36
+ const config = stored.metadata.projectConfig;
37
+ if (options.providers)
38
+ config['activeProviders'] = options.providers;
39
+ if (options.location)
40
+ config['location'] = options.location;
41
+ if (options.rg)
42
+ config['resourceGroupName'] = options.rg;
43
+ await storage.saveProjectConfig(stored.path, config);
44
+ }
45
+ console.log(`Created project "${name}" at: ${stored.path}`);
46
+ const providers = (options.providers ?? ['azurerm']).join(', ');
47
+ console.log(`Providers: ${providers}`);
48
+ });
49
+ cmd
50
+ .command('info <path>')
51
+ .description('Show project metadata')
52
+ .action(async (projectPath) => {
53
+ const stored = await storage.loadProject(projectPath);
54
+ const project = Project.fromLoaded(toLoadedProject(stored));
55
+ console.log(`Name: ${project.name}`);
56
+ console.log(`Version: ${project.version}`);
57
+ console.log(`Path: ${project.path}`);
58
+ const providers = project.projectConfig.activeProviders?.join(', ') ?? 'azurerm';
59
+ console.log(`Providers: ${providers}`);
60
+ console.log(`Nodes: ${project.nodes.length}`);
61
+ console.log(`Edges: ${project.edges.length}`);
62
+ });
63
+ cmd
64
+ .command('config <path>')
65
+ .description('Print project config as JSON (sensitive values redacted)')
66
+ .action(async (projectPath) => {
67
+ const stored = await storage.loadProject(projectPath);
68
+ const project = Project.fromLoaded(toLoadedProject(stored));
69
+ const redacted = redactSensitive(project.projectConfig);
70
+ console.log(JSON.stringify(redacted, null, 2));
71
+ });
72
+ cmd
73
+ .command('config-set <path>')
74
+ .description('Update project config fields')
75
+ .option('--naming-convention <value>', 'Naming convention as a JSON string (e.g. \'{"enabled":true,"template":"{type}-{env}-{name}","env":"dev"}\')')
76
+ .option('--layout-algorithm <value>', 'Layout algorithm (dagre or hybrid)')
77
+ .option('--providers <providers...>', 'Active providers (space-separated)')
78
+ .option('--variable <key=value>', 'Set a variable value (e.g. --variable location=eastus). Repeat for multiple variables.', (val, acc) => [...acc, val], [])
79
+ .action(async (projectPath, options) => {
80
+ const stored = await storage.loadProject(projectPath);
81
+ const project = Project.fromLoaded(toLoadedProject(stored));
82
+ if (options.namingConvention !== undefined) {
83
+ let parsed;
84
+ try {
85
+ parsed = JSON.parse(options.namingConvention);
86
+ }
87
+ catch {
88
+ console.error('--naming-convention must be a valid JSON string');
89
+ process.exit(1);
90
+ }
91
+ project.projectConfig = {
92
+ ...project.projectConfig,
93
+ namingConvention: parsed,
94
+ };
95
+ }
96
+ if (options.layoutAlgorithm !== undefined) {
97
+ const algo = options.layoutAlgorithm;
98
+ project.projectConfig = {
99
+ ...project.projectConfig,
100
+ layoutAlgorithm: algo,
101
+ };
102
+ }
103
+ if (options.providers !== undefined) {
104
+ project.projectConfig = {
105
+ ...project.projectConfig,
106
+ activeProviders: options.providers,
107
+ };
108
+ }
109
+ if (options.variable.length > 0) {
110
+ const variableValues = {
111
+ ...(project.projectConfig.variableValues ?? {}),
112
+ };
113
+ for (const entry of options.variable) {
114
+ const eq = entry.indexOf('=');
115
+ if (eq === -1) {
116
+ console.error(`Invalid --variable format (expected key=value): ${entry}`);
117
+ process.exit(1);
118
+ }
119
+ const key = entry.slice(0, eq);
120
+ const value = entry.slice(eq + 1);
121
+ variableValues[key] = value;
122
+ }
123
+ project.projectConfig = {
124
+ ...project.projectConfig,
125
+ variableValues,
126
+ };
127
+ }
128
+ await storage.saveProjectConfig(projectPath, project.projectConfig);
129
+ console.log('Project config updated.');
130
+ });
131
+ return cmd;
132
+ }
133
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function makeResourceCommand(): Command;
3
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../src/commands/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,mBAAmB,IAAI,OAAO,CA2b7C"}
@@ -0,0 +1,353 @@
1
+ import { Command } from 'commander';
2
+ import { storage, loadValidator, toLoadedProject } from '../platform/node-io.js';
3
+ import { Project } from '@terrastudio/project';
4
+ import { generateNodeId, generateUniqueTerraformName } from '@terrastudio/core';
5
+ function printWarnings(warnings) {
6
+ for (const w of warnings) {
7
+ console.warn(` ⚠ ${w}`);
8
+ }
9
+ }
10
+ export function makeResourceCommand() {
11
+ const cmd = new Command('resource').description('Manage diagram resources');
12
+ cmd
13
+ .command('list <path>')
14
+ .description('List all resources in the project diagram')
15
+ .option('-t, --type <typeId>', 'Filter by resource type ID')
16
+ .action(async (projectPath, options) => {
17
+ const stored = await storage.loadProject(projectPath);
18
+ const project = Project.fromLoaded(toLoadedProject(stored));
19
+ let nodes = project.nodes.filter((n) => n.type && !n.type.startsWith('_') && n.data.typeId);
20
+ if (options.type) {
21
+ nodes = nodes.filter((n) => n.data.typeId === options.type);
22
+ }
23
+ if (nodes.length === 0) {
24
+ console.log('No resources found.');
25
+ return;
26
+ }
27
+ const colId = 'ID'.padEnd(36);
28
+ const colType = 'Type'.padEnd(40);
29
+ const colName = 'Terraform Name';
30
+ console.log(`${colId} ${colType} ${colName}`);
31
+ console.log(`${'-'.repeat(36)} ${'-'.repeat(40)} ${'-'.repeat(30)}`);
32
+ for (const node of nodes) {
33
+ const id = node.id.padEnd(36);
34
+ const type = (node.data.typeId ?? node.type ?? '').padEnd(40);
35
+ const name = node.data.terraformName ?? node.data.label ?? '(unnamed)';
36
+ console.log(`${id} ${type} ${name}`);
37
+ }
38
+ });
39
+ cmd
40
+ .command('add <path> <typeId> <terraformName>')
41
+ .description('Add a new resource to the diagram')
42
+ .option('-p, --parent <parentId>', 'Parent node ID (for contained resources)')
43
+ .action(async (projectPath, typeId, terraformName, options) => {
44
+ const stored = await storage.loadProject(projectPath);
45
+ const project = Project.fromLoaded(toLoadedProject(stored));
46
+ if (options.parent && !project.getNode(options.parent)) {
47
+ console.error(`Parent node not found: ${options.parent}`);
48
+ process.exit(1);
49
+ }
50
+ const providers = (project.projectConfig.activeProviders ?? ['azurerm']);
51
+ project.validator = await loadValidator(providers);
52
+ const resolvedTypeId = typeId;
53
+ const id = generateNodeId(resolvedTypeId);
54
+ const node = {
55
+ id,
56
+ type: typeId,
57
+ position: { x: 100, y: 100 },
58
+ data: {
59
+ typeId: resolvedTypeId,
60
+ label: terraformName,
61
+ terraformName,
62
+ properties: {},
63
+ references: {},
64
+ validationErrors: [],
65
+ enabledOutputs: [],
66
+ },
67
+ ...(options.parent ? { parentId: options.parent } : {}),
68
+ };
69
+ const { warnings } = project.addNode(node);
70
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
71
+ console.log(`Added ${typeId} "${terraformName}" (${id})`);
72
+ printWarnings(warnings);
73
+ });
74
+ cmd
75
+ .command('update <path> <nodeId>')
76
+ .description('Update a resource property, label, or terraform name')
77
+ .option('-k, --key <key>', 'Property key to update (in data.properties)')
78
+ .option('-v, --value <value>', 'New property value')
79
+ .option('--label <label>', 'Update the display label')
80
+ .option('--terraform-name <name>', 'Update the Terraform resource name')
81
+ .action(async (projectPath, nodeId, options) => {
82
+ if (options.key !== undefined && options.value === undefined) {
83
+ console.error('--value is required when --key is specified');
84
+ process.exit(1);
85
+ }
86
+ if (options.value !== undefined && options.key === undefined) {
87
+ console.error('--key is required when --value is specified');
88
+ process.exit(1);
89
+ }
90
+ if (!options.key && !options.label && !options.terraformName) {
91
+ console.error('Specify at least one of: --key/--value, --label, --terraform-name');
92
+ process.exit(1);
93
+ }
94
+ const stored = await storage.loadProject(projectPath);
95
+ const project = Project.fromLoaded(toLoadedProject(stored));
96
+ const node = project.getNode(nodeId);
97
+ if (!node) {
98
+ console.error(`Node not found: ${nodeId}`);
99
+ process.exit(1);
100
+ }
101
+ const dataUpdate = { ...node.data };
102
+ if (options.key && options.value !== undefined) {
103
+ dataUpdate.properties = { ...node.data.properties, [options.key]: options.value };
104
+ }
105
+ if (options.label !== undefined)
106
+ dataUpdate.label = options.label;
107
+ if (options.terraformName !== undefined)
108
+ dataUpdate.terraformName = options.terraformName;
109
+ project.updateNode(nodeId, { data: dataUpdate });
110
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
111
+ const changes = [];
112
+ if (options.key)
113
+ changes.push(`${options.key} = ${options.value}`);
114
+ if (options.label)
115
+ changes.push(`label = "${options.label}"`);
116
+ if (options.terraformName)
117
+ changes.push(`terraformName = "${options.terraformName}"`);
118
+ console.log(`Updated ${nodeId}: ${changes.join(', ')}`);
119
+ });
120
+ cmd
121
+ .command('rename <path> <nodeId> <terraformName>')
122
+ .description('Rename a resource (updates both label and terraform name)')
123
+ .option('--label <label>', 'Override the display label (defaults to terraformName)')
124
+ .action(async (projectPath, nodeId, terraformName, options) => {
125
+ const stored = await storage.loadProject(projectPath);
126
+ const project = Project.fromLoaded(toLoadedProject(stored));
127
+ const node = project.getNode(nodeId);
128
+ if (!node) {
129
+ console.error(`Node not found: ${nodeId}`);
130
+ process.exit(1);
131
+ }
132
+ const label = options.label ?? terraformName;
133
+ project.updateNode(nodeId, {
134
+ data: { ...node.data, terraformName, label },
135
+ });
136
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
137
+ console.log(`Renamed ${nodeId}: "${node.data.terraformName}" → "${terraformName}"`);
138
+ });
139
+ cmd
140
+ .command('duplicate <path> <nodeId>')
141
+ .description('Duplicate a resource (new ID, unique terraform name, offset position)')
142
+ .option('--terraform-name <name>', 'Override the terraform name of the duplicate')
143
+ .action(async (projectPath, nodeId, options) => {
144
+ const stored = await storage.loadProject(projectPath);
145
+ const project = Project.fromLoaded(toLoadedProject(stored));
146
+ const node = project.getNode(nodeId);
147
+ if (!node) {
148
+ console.error(`Node not found: ${nodeId}`);
149
+ process.exit(1);
150
+ }
151
+ const providers = (project.projectConfig.activeProviders ?? ['azurerm']);
152
+ project.validator = await loadValidator(providers);
153
+ // Generate unique terraform name
154
+ const existingNames = new Set(project.nodes.map((n) => n.data.terraformName).filter(Boolean));
155
+ const baseName = options.terraformName ?? (node.data.terraformName ?? 'resource');
156
+ const newTerraformName = generateUniqueTerraformName(baseName, existingNames);
157
+ const newId = generateNodeId((node.type ?? 'resource'));
158
+ const duplicate = {
159
+ ...node,
160
+ id: newId,
161
+ position: { x: node.position.x + 40, y: node.position.y + 40 },
162
+ data: {
163
+ ...node.data,
164
+ terraformName: newTerraformName,
165
+ label: newTerraformName,
166
+ validationErrors: [],
167
+ },
168
+ };
169
+ const { warnings } = project.addNode(duplicate);
170
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
171
+ console.log(`Duplicated ${nodeId} → ${newId} ("${newTerraformName}")`);
172
+ printWarnings(warnings);
173
+ });
174
+ cmd
175
+ .command('remove <path> <nodeId>')
176
+ .description('Remove a resource from the diagram')
177
+ .action(async (projectPath, nodeId) => {
178
+ const stored = await storage.loadProject(projectPath);
179
+ const project = Project.fromLoaded(toLoadedProject(stored));
180
+ const node = project.getNode(nodeId);
181
+ if (!node) {
182
+ console.error(`Node not found: ${nodeId}`);
183
+ process.exit(1);
184
+ }
185
+ const children = project.getChildren(nodeId);
186
+ if (children.length > 0) {
187
+ console.error(`Cannot remove: node has ${children.length} child resource(s). Remove them first.`);
188
+ process.exit(1);
189
+ }
190
+ const name = node.data.terraformName ?? node.data.label ?? nodeId;
191
+ project.removeNode(nodeId);
192
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
193
+ console.log(`Removed resource: ${name} (${nodeId})`);
194
+ });
195
+ cmd
196
+ .command('connect <path> <sourceId> <targetId>')
197
+ .description('Add an edge between two nodes')
198
+ .option('--source-handle <handle>', 'Source handle ID')
199
+ .option('--target-handle <handle>', 'Target handle ID')
200
+ .option('--label <label>', 'Edge label')
201
+ .action(async (projectPath, sourceId, targetId, options) => {
202
+ const stored = await storage.loadProject(projectPath);
203
+ const project = Project.fromLoaded(toLoadedProject(stored));
204
+ if (!project.getNode(sourceId)) {
205
+ console.error(`Source node not found: ${sourceId}`);
206
+ process.exit(1);
207
+ }
208
+ if (!project.getNode(targetId)) {
209
+ console.error(`Target node not found: ${targetId}`);
210
+ process.exit(1);
211
+ }
212
+ const providers = (project.projectConfig.activeProviders ?? ['azurerm']);
213
+ project.validator = await loadValidator(providers);
214
+ const sourceHandle = options.sourceHandle ?? 'default';
215
+ const targetHandle = options.targetHandle ?? 'default';
216
+ const edgeId = `e-${sourceId}-${sourceHandle}-${targetId}-${targetHandle}`;
217
+ const edge = {
218
+ id: edgeId,
219
+ source: sourceId,
220
+ target: targetId,
221
+ ...(options.sourceHandle ? { sourceHandle: options.sourceHandle } : {}),
222
+ ...(options.targetHandle ? { targetHandle: options.targetHandle } : {}),
223
+ data: {
224
+ category: 'structural',
225
+ ...(options.label ? { label: options.label } : {}),
226
+ },
227
+ };
228
+ const { warnings } = project.addEdge(edge);
229
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
230
+ console.log(`Connected ${sourceId} -> ${targetId} (${edgeId})`);
231
+ printWarnings(warnings);
232
+ });
233
+ cmd
234
+ .command('disconnect <path> <edgeId>')
235
+ .description('Remove an edge by ID')
236
+ .action(async (projectPath, edgeId) => {
237
+ const stored = await storage.loadProject(projectPath);
238
+ const project = Project.fromLoaded(toLoadedProject(stored));
239
+ const edge = project.edges.find((e) => e.id === edgeId);
240
+ if (!edge) {
241
+ console.error(`Edge not found: ${edgeId}`);
242
+ process.exit(1);
243
+ }
244
+ project.removeEdge(edgeId);
245
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
246
+ console.log(`Removed edge: ${edgeId}`);
247
+ });
248
+ cmd
249
+ .command('move <path> <nodeId>')
250
+ .description('Move a node to a new position')
251
+ .option('--x <x>', 'X coordinate')
252
+ .option('--y <y>', 'Y coordinate')
253
+ .option('--parent <parentId>', 'New parent node ID (use empty string to unparent)')
254
+ .action(async (projectPath, nodeId, options) => {
255
+ const stored = await storage.loadProject(projectPath);
256
+ const project = Project.fromLoaded(toLoadedProject(stored));
257
+ const node = project.getNode(nodeId);
258
+ if (!node) {
259
+ console.error(`Node not found: ${nodeId}`);
260
+ process.exit(1);
261
+ }
262
+ const x = options.x !== undefined ? Number(options.x) : node.position.x;
263
+ const y = options.y !== undefined ? Number(options.y) : node.position.y;
264
+ // parent option: undefined = don't change, '' = unparent, otherwise set to value
265
+ let parentArg = undefined;
266
+ if (options.parent !== undefined) {
267
+ parentArg = options.parent === '' ? null : options.parent;
268
+ }
269
+ if (parentArg !== undefined && parentArg !== null && !project.getNode(parentArg)) {
270
+ console.error(`Parent node not found: ${parentArg}`);
271
+ process.exit(1);
272
+ }
273
+ const providers = (project.projectConfig.activeProviders ?? ['azurerm']);
274
+ project.validator = await loadValidator(providers);
275
+ const { warnings } = project.moveNode(nodeId, { x, y }, parentArg);
276
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
277
+ console.log(`Moved node ${nodeId} to (${x}, ${y})`);
278
+ printWarnings(warnings);
279
+ });
280
+ cmd
281
+ .command('resize <path> <nodeId>')
282
+ .description('Resize a node')
283
+ .requiredOption('--width <width>', 'New width')
284
+ .requiredOption('--height <height>', 'New height')
285
+ .action(async (projectPath, nodeId, options) => {
286
+ const stored = await storage.loadProject(projectPath);
287
+ const project = Project.fromLoaded(toLoadedProject(stored));
288
+ if (!project.getNode(nodeId)) {
289
+ console.error(`Node not found: ${nodeId}`);
290
+ process.exit(1);
291
+ }
292
+ const width = Number(options.width);
293
+ const height = Number(options.height);
294
+ project.resizeNode(nodeId, width, height);
295
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
296
+ console.log(`Resized node ${nodeId} to ${width}x${height}`);
297
+ });
298
+ cmd
299
+ .command('outputs <path> <nodeId>')
300
+ .description('Enable specific output keys on a node')
301
+ .option('--enable <keys...>', 'Output keys to enable (space-separated)')
302
+ .action(async (projectPath, nodeId, options) => {
303
+ const stored = await storage.loadProject(projectPath);
304
+ const project = Project.fromLoaded(toLoadedProject(stored));
305
+ const node = project.getNode(nodeId);
306
+ if (!node) {
307
+ console.error(`Node not found: ${nodeId}`);
308
+ process.exit(1);
309
+ }
310
+ const enabledOutputs = options.enable ?? [];
311
+ project.updateNode(nodeId, {
312
+ data: {
313
+ ...node.data,
314
+ enabledOutputs,
315
+ },
316
+ });
317
+ await storage.saveDiagram(projectPath, project.toDiagramSnapshot());
318
+ console.log(`Set enabled outputs for ${nodeId}: [${enabledOutputs.join(', ')}]`);
319
+ });
320
+ cmd
321
+ .command('edges <path>')
322
+ .description('List edges in the diagram')
323
+ .option('--node <nodeId>', 'Filter edges connected to a specific node')
324
+ .action(async (projectPath, options) => {
325
+ const stored = await storage.loadProject(projectPath);
326
+ const project = Project.fromLoaded(toLoadedProject(stored));
327
+ let edges = project.edges;
328
+ if (options.node) {
329
+ edges = edges.filter((e) => e.source === options.node || e.target === options.node);
330
+ }
331
+ if (edges.length === 0) {
332
+ console.log('No edges found.');
333
+ return;
334
+ }
335
+ const colId = 'ID'.padEnd(50);
336
+ const colSource = 'Source'.padEnd(36);
337
+ const colTarget = 'Target'.padEnd(36);
338
+ const colCat = 'Category'.padEnd(12);
339
+ const colLabel = 'Label';
340
+ console.log(`${colId} ${colSource} ${colTarget} ${colCat} ${colLabel}`);
341
+ console.log(`${'-'.repeat(50)} ${'-'.repeat(36)} ${'-'.repeat(36)} ${'-'.repeat(12)} ${'-'.repeat(20)}`);
342
+ for (const edge of edges) {
343
+ const id = edge.id.padEnd(50);
344
+ const source = edge.source.padEnd(36);
345
+ const target = edge.target.padEnd(36);
346
+ const category = (edge.data?.category ?? '').padEnd(12);
347
+ const label = edge.data?.label ?? '';
348
+ console.log(`${id} ${source} ${target} ${category} ${label}`);
349
+ }
350
+ });
351
+ return cmd;
352
+ }
353
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/commands/resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function makeTerraformCommand(): Command;
3
+ //# sourceMappingURL=terraform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../../src/commands/terraform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgDpC,wBAAgB,oBAAoB,IAAI,OAAO,CA4J9C"}