icaruspcb-cli 1.0.1

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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/api/client.d.ts +66 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +94 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/commands/generate.d.ts +3 -0
  8. package/dist/commands/generate.d.ts.map +1 -0
  9. package/dist/commands/generate.js +154 -0
  10. package/dist/commands/generate.js.map +1 -0
  11. package/dist/commands/init.d.ts +3 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +107 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/list.d.ts +3 -0
  16. package/dist/commands/list.d.ts.map +1 -0
  17. package/dist/commands/list.js +64 -0
  18. package/dist/commands/list.js.map +1 -0
  19. package/dist/commands/login.d.ts +3 -0
  20. package/dist/commands/login.d.ts.map +1 -0
  21. package/dist/commands/login.js +196 -0
  22. package/dist/commands/login.js.map +1 -0
  23. package/dist/commands/logout.d.ts +3 -0
  24. package/dist/commands/logout.d.ts.map +1 -0
  25. package/dist/commands/logout.js +15 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/simulate.d.ts +3 -0
  28. package/dist/commands/simulate.d.ts.map +1 -0
  29. package/dist/commands/simulate.js +139 -0
  30. package/dist/commands/simulate.js.map +1 -0
  31. package/dist/commands/status.d.ts +3 -0
  32. package/dist/commands/status.d.ts.map +1 -0
  33. package/dist/commands/status.js +40 -0
  34. package/dist/commands/status.js.map +1 -0
  35. package/dist/commands/validate.d.ts +3 -0
  36. package/dist/commands/validate.d.ts.map +1 -0
  37. package/dist/commands/validate.js +175 -0
  38. package/dist/commands/validate.js.map +1 -0
  39. package/dist/commands/whoami.d.ts +3 -0
  40. package/dist/commands/whoami.d.ts.map +1 -0
  41. package/dist/commands/whoami.js +45 -0
  42. package/dist/commands/whoami.js.map +1 -0
  43. package/dist/config/store.d.ts +23 -0
  44. package/dist/config/store.d.ts.map +1 -0
  45. package/dist/config/store.js +98 -0
  46. package/dist/config/store.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +29 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/utils/detect.d.ts +9 -0
  52. package/dist/utils/detect.d.ts.map +1 -0
  53. package/dist/utils/detect.js +152 -0
  54. package/dist/utils/detect.js.map +1 -0
  55. package/dist/utils/output.d.ts +8 -0
  56. package/dist/utils/output.d.ts.map +1 -0
  57. package/dist/utils/output.js +41 -0
  58. package/dist/utils/output.js.map +1 -0
  59. package/dist/utils/spinner.d.ts +4 -0
  60. package/dist/utils/spinner.d.ts.map +1 -0
  61. package/dist/utils/spinner.js +24 -0
  62. package/dist/utils/spinner.js.map +1 -0
  63. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwFpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmF3D"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerLoginCommand = registerLoginCommand;
40
+ const inquirer_1 = __importDefault(require("inquirer"));
41
+ const http = __importStar(require("http"));
42
+ const crypto = __importStar(require("crypto"));
43
+ const child_process_1 = require("child_process");
44
+ const util_1 = require("util");
45
+ const store_1 = require("../config/store");
46
+ const output_1 = require("../utils/output");
47
+ const spinner_1 = require("../utils/spinner");
48
+ const client_1 = require("../api/client");
49
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
50
+ function openBrowser(url) {
51
+ const cmd = process.platform === 'darwin' ? 'open' :
52
+ process.platform === 'win32' ? 'start' : 'xdg-open';
53
+ (0, child_process_1.exec)(`${cmd} "${url}"`);
54
+ }
55
+ function startCallbackServer(state) {
56
+ return new Promise((resolve, reject) => {
57
+ const server = http.createServer((req, res) => {
58
+ const url = new URL(req.url || '/', `http://localhost`);
59
+ if (url.pathname !== '/callback') {
60
+ res.writeHead(404);
61
+ res.end();
62
+ return;
63
+ }
64
+ const returnedState = url.searchParams.get('state');
65
+ const error = url.searchParams.get('error');
66
+ const apiKey = url.searchParams.get('key');
67
+ if (error) {
68
+ res.writeHead(200, { 'Content-Type': 'text/html' });
69
+ res.end('<html><body><h2>Authentication denied.</h2><p>You can close this window.</p></body></html>');
70
+ server.close();
71
+ reject(new Error(`Authentication denied: ${error}`));
72
+ return;
73
+ }
74
+ if (returnedState !== state) {
75
+ res.writeHead(400, { 'Content-Type': 'text/html' });
76
+ res.end('<html><body><h2>Invalid state parameter.</h2></body></html>');
77
+ server.close();
78
+ reject(new Error('Invalid state parameter — possible CSRF attack'));
79
+ return;
80
+ }
81
+ if (!apiKey) {
82
+ res.writeHead(400, { 'Content-Type': 'text/html' });
83
+ res.end('<html><body><h2>No API key received.</h2></body></html>');
84
+ server.close();
85
+ reject(new Error('No API key received from server'));
86
+ return;
87
+ }
88
+ res.writeHead(200, { 'Content-Type': 'text/html' });
89
+ res.end('<html><body><h2>✅ Logged in to IcarusPCB!</h2><p>You can close this window and return to the terminal.</p></body></html>');
90
+ server.close();
91
+ resolve({
92
+ apiKey,
93
+ userId: url.searchParams.get('userId') || undefined,
94
+ email: url.searchParams.get('email') || undefined,
95
+ name: url.searchParams.get('name') || undefined,
96
+ });
97
+ });
98
+ // Listen on random port
99
+ server.listen(0, '127.0.0.1', () => {
100
+ const addr = server.address();
101
+ const port = addr.port;
102
+ const serverUrl = (0, store_1.getServerUrl)();
103
+ const loginUrl = `${serverUrl}/cli-auth?port=${port}&state=${state}`;
104
+ (0, output_1.printInfo)(`Opening browser to authenticate...`);
105
+ (0, output_1.printInfo)(`If the browser doesn't open, visit: ${loginUrl}`);
106
+ openBrowser(loginUrl);
107
+ });
108
+ // Timeout after 5 minutes
109
+ setTimeout(() => {
110
+ server.close();
111
+ reject(new Error('Authentication timed out (5 minutes). Please try again.'));
112
+ }, 5 * 60 * 1000);
113
+ });
114
+ }
115
+ function registerLoginCommand(program) {
116
+ program
117
+ .command('login')
118
+ .description('Authenticate with IcarusPCB via browser or API key')
119
+ .option('--api-key <key>', 'API key (for non-interactive / CI usage)')
120
+ .option('--server-url <url>', 'Override server URL')
121
+ .action(async (opts) => {
122
+ try {
123
+ let apiKey;
124
+ let userId;
125
+ let email;
126
+ let name;
127
+ let serverUrl = opts.serverUrl || (0, store_1.getServerUrl)();
128
+ if (opts.apiKey) {
129
+ apiKey = opts.apiKey;
130
+ }
131
+ else {
132
+ const answers = await inquirer_1.default.prompt([
133
+ {
134
+ type: 'list',
135
+ name: 'method',
136
+ message: 'How would you like to authenticate?',
137
+ choices: [
138
+ { name: 'Open browser to login (recommended)', value: 'browser' },
139
+ { name: 'Enter API key manually', value: 'manual' },
140
+ ],
141
+ },
142
+ ]);
143
+ if (answers.method === 'browser') {
144
+ const state = crypto.randomBytes(16).toString('hex');
145
+ const result = await startCallbackServer(state);
146
+ apiKey = result.apiKey;
147
+ userId = result.userId;
148
+ email = result.email;
149
+ name = result.name;
150
+ }
151
+ else {
152
+ const keyAnswer = await inquirer_1.default.prompt([
153
+ {
154
+ type: 'password',
155
+ name: 'apiKey',
156
+ message: 'Enter your IcarusPCB API key:',
157
+ mask: '*',
158
+ validate: (v) => v.trim().length > 0 || 'API key is required',
159
+ },
160
+ ]);
161
+ apiKey = keyAnswer.apiKey.trim();
162
+ }
163
+ }
164
+ // Validate the key
165
+ process.env.ICARUSPCB_API_KEY = apiKey;
166
+ if (opts.serverUrl) {
167
+ process.env.ICARUSPCB_SERVER_URL = serverUrl;
168
+ }
169
+ const validationResult = await (0, spinner_1.withSpinner)('Validating API key...', async () => {
170
+ const client = new client_1.ApiClient();
171
+ const result = await client.validateKey();
172
+ if (!result.valid)
173
+ throw new Error('Invalid API key');
174
+ return result;
175
+ });
176
+ const config = (0, store_1.readConfig)();
177
+ config.apiKey = apiKey;
178
+ config.userId = userId;
179
+ config.email = email || validationResult?.email;
180
+ config.name = name;
181
+ config.lastLogin = new Date().toISOString();
182
+ if (opts.serverUrl) {
183
+ config.serverUrl = serverUrl;
184
+ }
185
+ (0, store_1.writeConfig)(config);
186
+ delete process.env.ICARUSPCB_API_KEY;
187
+ delete process.env.ICARUSPCB_SERVER_URL;
188
+ (0, output_1.printSuccess)(`Logged in${config.email ? ` as ${config.email}` : ''}. API key saved to ~/.icaruspcb/config.json`);
189
+ }
190
+ catch (err) {
191
+ (0, output_1.printError)(err.message || 'Login failed');
192
+ process.exit(1);
193
+ }
194
+ });
195
+ }
196
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerLogoutCommand(program: Command): void;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ5D"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerLogoutCommand = registerLogoutCommand;
4
+ const store_1 = require("../config/store");
5
+ const output_1 = require("../utils/output");
6
+ function registerLogoutCommand(program) {
7
+ program
8
+ .command('logout')
9
+ .description('Clear stored credentials')
10
+ .action(() => {
11
+ (0, store_1.clearConfig)();
12
+ (0, output_1.printSuccess)('Logged out. Credentials cleared from ' + (0, store_1.getConfigPath)());
13
+ });
14
+ }
15
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":";;AAIA,sDAQC;AAXD,2CAA6D;AAC7D,4CAA0D;AAE1D,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,GAAG,EAAE;QACX,IAAA,mBAAW,GAAE,CAAC;QACd,IAAA,qBAAY,EAAC,uCAAuC,GAAG,IAAA,qBAAa,GAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSimulateCommand(program: Command): void;
3
+ //# sourceMappingURL=simulate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../src/commands/simulate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+E9D"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerSimulateCommand = registerSimulateCommand;
37
+ const client_1 = require("../api/client");
38
+ const store_1 = require("../config/store");
39
+ const detect_1 = require("../utils/detect");
40
+ const fs = __importStar(require("fs"));
41
+ const output_1 = require("../utils/output");
42
+ const spinner_1 = require("../utils/spinner");
43
+ function sleep(ms) {
44
+ return new Promise(resolve => setTimeout(resolve, ms));
45
+ }
46
+ function registerSimulateCommand(program) {
47
+ program
48
+ .command('simulate')
49
+ .description('Submit a simulation to the IcarusPCB API')
50
+ .option('--mcu <mcu>', 'MCU identifier')
51
+ .option('--firmware <path>', 'Path to firmware .elf file')
52
+ .option('--sensors <list>', 'Comma-separated sensor list')
53
+ .option('--timeout <seconds>', 'Max wait time in seconds', '300')
54
+ .option('--json', 'Output as JSON')
55
+ .action(async (opts) => {
56
+ try {
57
+ const project = (0, store_1.readProjectConfig)();
58
+ const detected = (0, detect_1.detectMcu)();
59
+ const mcu = opts.mcu || project?.mcu || detected.mcu;
60
+ if (!mcu) {
61
+ const msg = 'No MCU specified. Use --mcu, create .icaruspcb.json, or run in a project directory.';
62
+ if (opts.json) {
63
+ (0, output_1.printJsonError)(msg);
64
+ }
65
+ else {
66
+ (0, output_1.printError)(msg);
67
+ }
68
+ process.exit(1);
69
+ }
70
+ const firmware = opts.firmware || project?.firmware;
71
+ if (firmware && !fs.existsSync(firmware)) {
72
+ const msg = `Firmware file not found: ${firmware}`;
73
+ if (opts.json) {
74
+ (0, output_1.printJsonError)(msg);
75
+ }
76
+ else {
77
+ (0, output_1.printError)(msg);
78
+ }
79
+ process.exit(1);
80
+ }
81
+ const sensors = opts.sensors?.split(',') || project?.sensors || [];
82
+ const client = (0, client_1.createClient)();
83
+ (0, output_1.printInfo)(`MCU: ${mcu}`);
84
+ if (firmware)
85
+ (0, output_1.printInfo)(`Firmware: ${firmware}`);
86
+ if (sensors.length)
87
+ (0, output_1.printInfo)(`Sensors: ${sensors.join(', ')}`);
88
+ const spinner = (0, spinner_1.createSpinner)('Submitting simulation...').start();
89
+ const job = await client.submitSimulation({ mcu, firmware, sensors });
90
+ spinner.succeed(`Job submitted: ${job.jobId}`);
91
+ const pollSpinner = (0, spinner_1.createSpinner)('Waiting for results...').start();
92
+ const timeout = parseInt(opts.timeout, 10) * 1000;
93
+ const start = Date.now();
94
+ while (Date.now() - start < timeout) {
95
+ const status = await client.getSimulationStatus(job.jobId);
96
+ if (status.status === 'completed') {
97
+ pollSpinner.succeed('Simulation completed');
98
+ if (opts.json) {
99
+ (0, output_1.printJson)(status.result);
100
+ }
101
+ else {
102
+ console.log();
103
+ (0, output_1.printSuccess)('Simulation Results:');
104
+ console.log(JSON.stringify(status.result, null, 2));
105
+ }
106
+ return;
107
+ }
108
+ if (status.status === 'failed') {
109
+ pollSpinner.fail('Simulation failed');
110
+ const msg = status.error || 'Unknown error';
111
+ if (opts.json) {
112
+ (0, output_1.printJsonError)(msg);
113
+ }
114
+ else {
115
+ (0, output_1.printError)(msg);
116
+ }
117
+ process.exit(1);
118
+ }
119
+ pollSpinner.text = `Status: ${status.status}...`;
120
+ await sleep(3000);
121
+ }
122
+ pollSpinner.fail('Simulation timed out');
123
+ if (opts.json) {
124
+ (0, output_1.printJsonError)('Simulation timed out');
125
+ }
126
+ process.exit(1);
127
+ }
128
+ catch (err) {
129
+ if (opts.json) {
130
+ (0, output_1.printJsonError)(err.message);
131
+ }
132
+ else {
133
+ (0, output_1.printError)(err.message);
134
+ }
135
+ process.exit(1);
136
+ }
137
+ });
138
+ }
139
+ //# sourceMappingURL=simulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../src/commands/simulate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC5D"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerStatusCommand = registerStatusCommand;
4
+ const client_1 = require("../api/client");
5
+ const output_1 = require("../utils/output");
6
+ const spinner_1 = require("../utils/spinner");
7
+ function registerStatusCommand(program) {
8
+ program
9
+ .command('status')
10
+ .description('Check API health and usage')
11
+ .option('--json', 'Output as JSON')
12
+ .action(async (opts) => {
13
+ try {
14
+ const client = (0, client_1.createClient)();
15
+ const [health, usage] = await (0, spinner_1.withSpinner)('Checking API status...', () => Promise.all([client.healthCheck(), client.getUsage()]));
16
+ if (opts.json) {
17
+ (0, output_1.printJson)({ health, usage });
18
+ return;
19
+ }
20
+ (0, output_1.printSuccess)(`API Status: ${health.status}${health.version ? ` (v${health.version})` : ''}`);
21
+ console.log();
22
+ (0, output_1.printTable)(['Metric', 'Value'], [
23
+ ['Simulations Used', `${usage.simulations}`],
24
+ ['Simulation Limit', `${usage.limit}`],
25
+ ['Billing Period', usage.billingPeriod],
26
+ ['Remaining', `${usage.limit - usage.simulations}`],
27
+ ]);
28
+ }
29
+ catch (err) {
30
+ if (opts.json) {
31
+ (0, output_1.printJsonError)(err.message);
32
+ }
33
+ else {
34
+ (0, output_1.printError)(err.message);
35
+ }
36
+ process.exit(1);
37
+ }
38
+ });
39
+ }
40
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";;AAKA,sDAkCC;AAtCD,0CAA6C;AAC7C,4CAAkG;AAClG,8CAA+C;AAE/C,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;YAE9B,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAA,qBAAW,EAAC,wBAAwB,EAAE,GAAG,EAAE,CACvE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CACvD,CAAC;YAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAA,kBAAS,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,IAAA,qBAAY,EAAC,eAAe,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7F,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAA,mBAAU,EACR,CAAC,QAAQ,EAAE,OAAO,CAAC,EACnB;gBACE,CAAC,kBAAkB,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBAC5C,CAAC,kBAAkB,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBACtC,CAAC,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC;gBACvC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;aACpD,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAA,uBAAc,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;iBAAM,CAAC;gBAAC,IAAA,mBAAU,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerValidateCommand(program: Command): void;
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuD9D"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerValidateCommand = registerValidateCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const output_1 = require("../utils/output");
40
+ const KNOWN_PERIPHERALS = [
41
+ 'UART', 'SPI', 'I2C', 'GPIO', 'Timer', 'ADC', 'DAC', 'DMA', 'RTC',
42
+ 'PWM', 'CAN', 'USB', 'Ethernet', 'SDIO', 'QSPI', 'SAI', 'LTDC',
43
+ 'NVIC', 'EXTI', 'SYSCFG', 'Flash', 'SRAM', 'WWDG', 'IWDG',
44
+ 'CPU', 'Memory', 'Bus', 'IRQController', 'MappedMemory',
45
+ ];
46
+ const REPL_SECTION_RE = /^(\w[\w.]*)\s*:\s*(\w[\w.]*)/;
47
+ const RESC_COMMAND_RE = /^(mach|machine|using|include|sysbus|logLevel|start|pause|set|showAnalyzer|emulation)/;
48
+ function validateRepl(content) {
49
+ const issues = [];
50
+ const lines = content.split('\n');
51
+ for (let i = 0; i < lines.length; i++) {
52
+ const line = lines[i].trim();
53
+ if (!line || line.startsWith('//') || line.startsWith('#'))
54
+ continue;
55
+ const sectionMatch = line.match(REPL_SECTION_RE);
56
+ if (sectionMatch) {
57
+ const typeName = sectionMatch[2];
58
+ const baseType = typeName.split('.').pop();
59
+ const isKnown = KNOWN_PERIPHERALS.some(p => baseType.toLowerCase().includes(p.toLowerCase()));
60
+ if (!isKnown && !typeName.includes('.')) {
61
+ issues.push({
62
+ line: i + 1,
63
+ severity: 'warning',
64
+ message: `Unknown peripheral type: ${typeName}`,
65
+ });
66
+ }
67
+ }
68
+ // Check for unmatched braces on the same line
69
+ const openBraces = (line.match(/{/g) || []).length;
70
+ const closeBraces = (line.match(/}/g) || []).length;
71
+ if (openBraces > closeBraces + 1) {
72
+ issues.push({
73
+ line: i + 1,
74
+ severity: 'warning',
75
+ message: 'Multiple opening braces on one line',
76
+ });
77
+ }
78
+ }
79
+ // Check brace balance
80
+ const allOpen = (content.match(/{/g) || []).length;
81
+ const allClose = (content.match(/}/g) || []).length;
82
+ if (allOpen !== allClose) {
83
+ issues.push({
84
+ line: lines.length,
85
+ severity: 'error',
86
+ message: `Unbalanced braces: ${allOpen} opening vs ${allClose} closing`,
87
+ });
88
+ }
89
+ return issues;
90
+ }
91
+ function validateResc(content) {
92
+ const issues = [];
93
+ const lines = content.split('\n');
94
+ for (let i = 0; i < lines.length; i++) {
95
+ const line = lines[i].trim();
96
+ if (!line || line.startsWith('//') || line.startsWith('#') || line.startsWith(':'))
97
+ continue;
98
+ if (line.startsWith('$') && !line.includes('=')) {
99
+ issues.push({
100
+ line: i + 1,
101
+ severity: 'warning',
102
+ message: `Variable reference without assignment: ${line.split(' ')[0]}`,
103
+ });
104
+ }
105
+ }
106
+ return issues;
107
+ }
108
+ function registerValidateCommand(program) {
109
+ program
110
+ .command('validate <file>')
111
+ .description('Validate a .repl or .resc file offline')
112
+ .option('--json', 'Output as JSON')
113
+ .action(async (file, opts) => {
114
+ try {
115
+ if (!fs.existsSync(file)) {
116
+ const msg = `File not found: ${file}`;
117
+ if (opts.json) {
118
+ (0, output_1.printJsonError)(msg);
119
+ }
120
+ else {
121
+ (0, output_1.printError)(msg);
122
+ }
123
+ process.exit(1);
124
+ }
125
+ const content = fs.readFileSync(file, 'utf-8');
126
+ const ext = path.extname(file).toLowerCase();
127
+ let issues;
128
+ if (ext === '.repl') {
129
+ issues = validateRepl(content);
130
+ }
131
+ else if (ext === '.resc') {
132
+ issues = validateResc(content);
133
+ }
134
+ else {
135
+ const msg = `Unsupported file type: ${ext} (expected .repl or .resc)`;
136
+ if (opts.json) {
137
+ (0, output_1.printJsonError)(msg);
138
+ }
139
+ else {
140
+ (0, output_1.printError)(msg);
141
+ }
142
+ process.exit(1);
143
+ return;
144
+ }
145
+ if (opts.json) {
146
+ (0, output_1.printJson)({ file, issues, valid: !issues.some(i => i.severity === 'error') });
147
+ return;
148
+ }
149
+ if (issues.length === 0) {
150
+ (0, output_1.printSuccess)(`${file}: No issues found`);
151
+ return;
152
+ }
153
+ const errors = issues.filter(i => i.severity === 'error');
154
+ const warnings = issues.filter(i => i.severity === 'warning');
155
+ (0, output_1.printInfo)(`${file}: ${errors.length} error(s), ${warnings.length} warning(s)`);
156
+ console.log();
157
+ for (const issue of issues) {
158
+ const fn = issue.severity === 'error' ? output_1.printError : output_1.printWarning;
159
+ fn(`Line ${issue.line}: ${issue.message}`);
160
+ }
161
+ if (errors.length > 0)
162
+ process.exit(1);
163
+ }
164
+ catch (err) {
165
+ if (opts.json) {
166
+ (0, output_1.printJsonError)(err.message);
167
+ }
168
+ else {
169
+ (0, output_1.printError)(err.message);
170
+ }
171
+ process.exit(1);
172
+ }
173
+ });
174
+ }
175
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerWhoamiCommand(program: Command): void;
3
+ //# sourceMappingURL=whoami.d.ts.map