@pulumix/cli 0.1.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.
Files changed (101) hide show
  1. package/dist/commands/dev.d.ts +6 -0
  2. package/dist/commands/dev.d.ts.map +1 -0
  3. package/dist/commands/dev.js +124 -0
  4. package/dist/commands/dev.js.map +1 -0
  5. package/dist/commands/graph.d.ts +6 -0
  6. package/dist/commands/graph.d.ts.map +1 -0
  7. package/dist/commands/graph.js +118 -0
  8. package/dist/commands/graph.js.map +1 -0
  9. package/dist/commands/inspect.d.ts +6 -0
  10. package/dist/commands/inspect.d.ts.map +1 -0
  11. package/dist/commands/inspect.js +173 -0
  12. package/dist/commands/inspect.js.map +1 -0
  13. package/dist/commands/list.d.ts +7 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +108 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/validate.d.ts +6 -0
  18. package/dist/commands/validate.d.ts.map +1 -0
  19. package/dist/commands/validate.js +118 -0
  20. package/dist/commands/validate.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +247 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/ui/components/grouped-output.d.ts +33 -0
  26. package/dist/ui/components/grouped-output.d.ts.map +1 -0
  27. package/dist/ui/components/grouped-output.js +130 -0
  28. package/dist/ui/components/grouped-output.js.map +1 -0
  29. package/dist/ui/components/progress-bar.d.ts +21 -0
  30. package/dist/ui/components/progress-bar.d.ts.map +1 -0
  31. package/dist/ui/components/progress-bar.js +65 -0
  32. package/dist/ui/components/progress-bar.js.map +1 -0
  33. package/dist/ui/formatters/config-formatter.d.ts +3 -0
  34. package/dist/ui/formatters/config-formatter.d.ts.map +1 -0
  35. package/dist/ui/formatters/config-formatter.js +11 -0
  36. package/dist/ui/formatters/config-formatter.js.map +1 -0
  37. package/dist/ui/formatters/index.d.ts +4 -0
  38. package/dist/ui/formatters/index.d.ts.map +1 -0
  39. package/dist/ui/formatters/index.js +20 -0
  40. package/dist/ui/formatters/index.js.map +1 -0
  41. package/dist/ui/formatters/resource-formatter.d.ts +7 -0
  42. package/dist/ui/formatters/resource-formatter.d.ts.map +1 -0
  43. package/dist/ui/formatters/resource-formatter.js +65 -0
  44. package/dist/ui/formatters/resource-formatter.js.map +1 -0
  45. package/dist/ui/formatters/summary-formatter.d.ts +3 -0
  46. package/dist/ui/formatters/summary-formatter.d.ts.map +1 -0
  47. package/dist/ui/formatters/summary-formatter.js +90 -0
  48. package/dist/ui/formatters/summary-formatter.js.map +1 -0
  49. package/dist/ui/formatters/types.d.ts +26 -0
  50. package/dist/ui/formatters/types.d.ts.map +1 -0
  51. package/dist/ui/formatters/types.js +3 -0
  52. package/dist/ui/formatters/types.js.map +1 -0
  53. package/dist/ui/index.d.ts +4 -0
  54. package/dist/ui/index.d.ts.map +1 -0
  55. package/dist/ui/index.js +20 -0
  56. package/dist/ui/index.js.map +1 -0
  57. package/dist/ui/logger/index.d.ts +2 -0
  58. package/dist/ui/logger/index.d.ts.map +1 -0
  59. package/dist/ui/logger/index.js +34 -0
  60. package/dist/ui/logger/index.js.map +1 -0
  61. package/dist/ui/logger/line-formatter.d.ts +14 -0
  62. package/dist/ui/logger/line-formatter.d.ts.map +1 -0
  63. package/dist/ui/logger/line-formatter.js +218 -0
  64. package/dist/ui/logger/line-formatter.js.map +1 -0
  65. package/dist/ui/logger/name-formatter.d.ts +3 -0
  66. package/dist/ui/logger/name-formatter.d.ts.map +1 -0
  67. package/dist/ui/logger/name-formatter.js +20 -0
  68. package/dist/ui/logger/name-formatter.js.map +1 -0
  69. package/dist/ui/logger/simple-line-formatter.d.ts +14 -0
  70. package/dist/ui/logger/simple-line-formatter.d.ts.map +1 -0
  71. package/dist/ui/logger/simple-line-formatter.js +210 -0
  72. package/dist/ui/logger/simple-line-formatter.js.map +1 -0
  73. package/dist/ui/logger/simple-logger.d.ts +3 -0
  74. package/dist/ui/logger/simple-logger.d.ts.map +1 -0
  75. package/dist/ui/logger/simple-logger.js +39 -0
  76. package/dist/ui/logger/simple-logger.js.map +1 -0
  77. package/dist/ui/logger/simple-task-formatter.d.ts +47 -0
  78. package/dist/ui/logger/simple-task-formatter.d.ts.map +1 -0
  79. package/dist/ui/logger/simple-task-formatter.js +187 -0
  80. package/dist/ui/logger/simple-task-formatter.js.map +1 -0
  81. package/dist/ui/logger/task-formatter.d.ts +47 -0
  82. package/dist/ui/logger/task-formatter.d.ts.map +1 -0
  83. package/dist/ui/logger/task-formatter.js +187 -0
  84. package/dist/ui/logger/task-formatter.js.map +1 -0
  85. package/dist/ui/shell-listr2.d.ts +36 -0
  86. package/dist/ui/shell-listr2.d.ts.map +1 -0
  87. package/dist/ui/shell-listr2.js +200 -0
  88. package/dist/ui/shell-listr2.js.map +1 -0
  89. package/dist/ui/shell-ora.d.ts +39 -0
  90. package/dist/ui/shell-ora.d.ts.map +1 -0
  91. package/dist/ui/shell-ora.js +295 -0
  92. package/dist/ui/shell-ora.js.map +1 -0
  93. package/dist/ui/shell.d.ts +42 -0
  94. package/dist/ui/shell.d.ts.map +1 -0
  95. package/dist/ui/shell.js +312 -0
  96. package/dist/ui/shell.js.map +1 -0
  97. package/dist/ui/streams/event-bus.d.ts +36 -0
  98. package/dist/ui/streams/event-bus.d.ts.map +1 -0
  99. package/dist/ui/streams/event-bus.js +78 -0
  100. package/dist/ui/streams/event-bus.js.map +1 -0
  101. package/package.json +37 -0
@@ -0,0 +1,118 @@
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.validateCommand = validateCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const core_1 = require("@pulumix/core");
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs"));
44
+ const yaml = __importStar(require("yaml"));
45
+ async function validateCommand(options) {
46
+ const rootPath = path.resolve(options.path || process.cwd());
47
+ console.log('');
48
+ console.log(chalk_1.default.bold('pulumix validate'));
49
+ console.log(chalk_1.default.dim(rootPath));
50
+ console.log('');
51
+ const rootConfigPath = path.join(rootPath, 'pulumix.yaml');
52
+ let allowlist = [];
53
+ let hasErrors = false;
54
+ console.log(chalk_1.default.bold('Root Configuration'));
55
+ if (!fs.existsSync(rootConfigPath)) {
56
+ console.log(` ${chalk_1.default.red('✗')} pulumix.yaml not found`);
57
+ hasErrors = true;
58
+ }
59
+ else {
60
+ try {
61
+ const rootConfig = yaml.parse(fs.readFileSync(rootConfigPath, 'utf-8'));
62
+ allowlist = rootConfig?.services?.allowed ?? [];
63
+ console.log(` ${chalk_1.default.green('✓')} pulumix.yaml is valid`);
64
+ }
65
+ catch (err) {
66
+ console.log(` ${chalk_1.default.red('✗')} pulumix.yaml has errors`);
67
+ console.log(` ${chalk_1.default.dim(err.message)}`);
68
+ hasErrors = true;
69
+ }
70
+ }
71
+ console.log('');
72
+ const localResult = await (0, core_1.discoverServices)(rootPath);
73
+ const publishedResult = await (0, core_1.discoverPublishedServices)(rootPath, allowlist);
74
+ if (localResult.isLeft() || publishedResult.isLeft()) {
75
+ console.error(chalk_1.default.red('Failed to discover services'));
76
+ process.exit(1);
77
+ }
78
+ const localServices = localResult.unsafeCoerce();
79
+ const publishedServices = publishedResult.unsafeCoerce();
80
+ const allServices = [...localServices, ...publishedServices];
81
+ console.log(chalk_1.default.bold('Service Configurations'));
82
+ for (const service of allServices) {
83
+ const manifest = yaml.parse(fs.readFileSync(service.configPath, 'utf-8'));
84
+ const result = (0, core_1.validateServiceManifest)(manifest, service.configPath);
85
+ if (result.isLeft()) {
86
+ const error = result.extract();
87
+ console.log(` ${chalk_1.default.red('✗')} ${service.name}`);
88
+ if (options.verbose) {
89
+ console.log(chalk_1.default.dim((0, core_1.formatError)(error)));
90
+ }
91
+ else {
92
+ console.log(` ${chalk_1.default.dim(error.message.split('\n')[0])}`);
93
+ }
94
+ hasErrors = true;
95
+ }
96
+ else {
97
+ console.log(` ${chalk_1.default.green('✓')} ${service.name}`);
98
+ if (!service.hasDockerfile && service.metadata.version) {
99
+ console.log(` ${chalk_1.default.yellow('⚠')} ${chalk_1.default.dim('No Dockerfile found')}`);
100
+ }
101
+ const packageJsonPath = path.join(service.path, 'package.json');
102
+ if (!fs.existsSync(packageJsonPath)) {
103
+ console.log(` ${chalk_1.default.yellow('⚠')} ${chalk_1.default.dim('No package.json found')}`);
104
+ }
105
+ }
106
+ }
107
+ console.log('');
108
+ if (hasErrors) {
109
+ console.log(chalk_1.default.red('✗ Validation failed'));
110
+ console.log('');
111
+ process.exit(1);
112
+ }
113
+ else {
114
+ console.log(chalk_1.default.green('✓ All configurations are valid'));
115
+ console.log('');
116
+ }
117
+ }
118
+ //# 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
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,247 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const commander_1 = require("commander");
41
+ const path = __importStar(require("path"));
42
+ const core_1 = require("@pulumix/core");
43
+ const ui_1 = require("./ui");
44
+ const logger_1 = require("./ui/logger");
45
+ const list_1 = require("./commands/list");
46
+ const validate_1 = require("./commands/validate");
47
+ const inspect_1 = require("./commands/inspect");
48
+ const graph_1 = require("./commands/graph");
49
+ const dev_1 = require("./commands/dev");
50
+ const chalk_1 = __importDefault(require("chalk"));
51
+ async function deployCommand(stackName, options) {
52
+ const rootPath = path.resolve(options.path || process.cwd());
53
+ const orchestratorEvents = (0, core_1.createEventEmitter)();
54
+ const uiEventBus = (0, ui_1.createEventBus)();
55
+ const ui = (0, ui_1.createUIShell)(uiEventBus, {
56
+ verbose: options.verbose,
57
+ interactive: process.stdout.isTTY
58
+ });
59
+ orchestratorEvents.on((event) => {
60
+ uiEventBus.emit(event);
61
+ });
62
+ try {
63
+ console.log('');
64
+ console.log(chalk_1.default.bold(`pulumix deploy ${chalk_1.default.cyan(stackName)}`));
65
+ console.log(chalk_1.default.dim(rootPath));
66
+ const config = {
67
+ stackName,
68
+ services: [],
69
+ rootPath
70
+ };
71
+ ui.setDeploymentConfig(config);
72
+ const orchestrator = new core_1.Orchestrator(orchestratorEvents);
73
+ const servicesToDeploy = options.services
74
+ ? options.services.split(',').map(s => s.trim())
75
+ : undefined;
76
+ if (servicesToDeploy) {
77
+ ui.info(`Deploying services: ${chalk_1.default.cyan(servicesToDeploy.join(', '))}`);
78
+ }
79
+ const result = await orchestrator
80
+ .deploy({
81
+ rootPath,
82
+ stackName,
83
+ servicesToDeploy,
84
+ onOutput: logger_1.pulumiLogger
85
+ })
86
+ .run();
87
+ if (result.isLeft()) {
88
+ const error = result.extract();
89
+ const formatted = (0, core_1.formatError)(error);
90
+ console.error('');
91
+ console.error(chalk_1.default.red(formatted));
92
+ if (options.verbose && error.cause) {
93
+ console.error('');
94
+ console.error(chalk_1.default.dim('Caused by:'));
95
+ console.error(chalk_1.default.dim(error.cause.stack || error.cause.message));
96
+ }
97
+ process.exit(1);
98
+ }
99
+ const deployResult = result.unsafeCoerce();
100
+ ui.printFinalSummary({
101
+ success: deployResult.success,
102
+ stack: deployResult.stack,
103
+ servicesDeployed: deployResult.servicesDeployed,
104
+ duration: deployResult.duration
105
+ });
106
+ if (!deployResult.success) {
107
+ process.exit(1);
108
+ }
109
+ }
110
+ catch (err) {
111
+ ui.error(`Unexpected error: ${err.message}`);
112
+ if (options.verbose) {
113
+ console.error(err);
114
+ }
115
+ process.exit(1);
116
+ }
117
+ finally {
118
+ ui.cleanup();
119
+ uiEventBus.close();
120
+ }
121
+ }
122
+ async function destroyCommand(stackName, options) {
123
+ const rootPath = path.resolve(options.path || process.cwd());
124
+ const orchestratorEvents = (0, core_1.createEventEmitter)();
125
+ const uiEventBus = (0, ui_1.createEventBus)();
126
+ const ui = (0, ui_1.createUIShell)(uiEventBus, {
127
+ verbose: options.verbose,
128
+ interactive: process.stdout.isTTY
129
+ });
130
+ orchestratorEvents.on((event) => {
131
+ uiEventBus.emit(event);
132
+ });
133
+ try {
134
+ console.log('');
135
+ console.log(chalk_1.default.bold(`pulumix destroy ${chalk_1.default.red(stackName)}`));
136
+ console.log(chalk_1.default.dim(rootPath));
137
+ if (!options.yes) {
138
+ ui.warn('This will destroy all resources in the stack!');
139
+ ui.warn('Use --yes to confirm destruction');
140
+ process.exit(1);
141
+ }
142
+ const orchestrator = new core_1.Orchestrator(orchestratorEvents);
143
+ const result = await orchestrator
144
+ .destroy({
145
+ rootPath,
146
+ stackName,
147
+ onOutput: logger_1.pulumiLogger
148
+ })
149
+ .run();
150
+ if (result.isLeft()) {
151
+ const error = result.extract();
152
+ const formatted = (0, core_1.formatError)(error);
153
+ console.error('');
154
+ console.error(chalk_1.default.red(formatted));
155
+ if (options.verbose && error.cause) {
156
+ console.error('');
157
+ console.error(chalk_1.default.dim('Caused by:'));
158
+ console.error(chalk_1.default.dim(error.cause.stack || error.cause.message));
159
+ }
160
+ process.exit(1);
161
+ }
162
+ const destroyResult = result.unsafeCoerce();
163
+ if (destroyResult.success) {
164
+ console.log('');
165
+ console.log(chalk_1.default.bold('Summary'));
166
+ console.log(` ${chalk_1.default.green('✓')} Stack destroyed`);
167
+ console.log(` ${chalk_1.default.dim('•')} Stack: ${chalk_1.default.cyan(destroyResult.stack)}`);
168
+ console.log(` ${chalk_1.default.dim('•')} Duration: ${(destroyResult.duration / 1000).toFixed(1)}s`);
169
+ console.log('');
170
+ }
171
+ else {
172
+ ui.error('Destroy completed with errors');
173
+ process.exit(1);
174
+ }
175
+ }
176
+ catch (err) {
177
+ ui.error(`Unexpected error: ${err.message}`);
178
+ if (options.verbose) {
179
+ console.error(err);
180
+ }
181
+ process.exit(1);
182
+ }
183
+ finally {
184
+ ui.cleanup();
185
+ uiEventBus.close();
186
+ }
187
+ }
188
+ function main() {
189
+ const program = new commander_1.Command();
190
+ program
191
+ .name('pulumix')
192
+ .description('Simple service-based deployment orchestration')
193
+ .version('0.0.0');
194
+ program
195
+ .command('deploy')
196
+ .description('Deploy services')
197
+ .argument('<stack>', 'Stack name to deploy (local, staging, production)')
198
+ .option('-p, --path <path>', 'Root path for deployment files', process.cwd())
199
+ .option('-s, --services <services>', 'Comma-separated list of services to deploy')
200
+ .option('-v, --verbose', 'Enable verbose logging', false)
201
+ .action(deployCommand);
202
+ program
203
+ .command('destroy')
204
+ .description('Destroy a deployed stack')
205
+ .argument('<stack>', 'Stack name to destroy')
206
+ .option('-p, --path <path>', 'Root path for deployment files', process.cwd())
207
+ .option('-y, --yes', 'Skip confirmation prompt', false)
208
+ .option('-v, --verbose', 'Enable verbose logging', false)
209
+ .action(destroyCommand);
210
+ program
211
+ .command('dev')
212
+ .description('Run services locally with HMR (hot module replacement)')
213
+ .argument('<stack>', 'Stack name (e.g., local)')
214
+ .argument('<services>', 'Services to run locally (comma-separated)')
215
+ .option('-p, --path <path>', 'Root path for deployment files', process.cwd())
216
+ .option('-v, --verbose', 'Enable verbose logging', false)
217
+ .action(dev_1.devCommand);
218
+ program
219
+ .command('list')
220
+ .description('List all discovered services')
221
+ .option('-p, --path <path>', 'Root path for deployment files', process.cwd())
222
+ .option('-v, --verbose', 'Show detailed information', false)
223
+ .option('--json', 'Output as JSON', false)
224
+ .action(list_1.listCommand);
225
+ program
226
+ .command('validate')
227
+ .description('Validate service configurations')
228
+ .option('-p, --path <path>', 'Root path for deployment files', process.cwd())
229
+ .option('-v, --verbose', 'Show detailed errors', false)
230
+ .action(validate_1.validateCommand);
231
+ program
232
+ .command('inspect')
233
+ .description('Show detailed information about a service')
234
+ .argument('<service>', 'Service name to inspect')
235
+ .option('-p, --path <path>', 'Root path for deployment files', process.cwd())
236
+ .option('--json', 'Output as JSON', false)
237
+ .action(inspect_1.inspectCommand);
238
+ program
239
+ .command('graph')
240
+ .description('Visualize service dependency graph')
241
+ .option('-p, --path <path>', 'Root path for deployment files', process.cwd())
242
+ .option('-f, --format <format>', 'Output format: tree, dot, mermaid', 'tree')
243
+ .action(graph_1.graphCommand);
244
+ program.parse();
245
+ }
246
+ main();
247
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,yCAAmC;AACnC,2CAA4B;AAC5B,wCAA6E;AAC7E,6BAAsE;AACtE,wCAA0C;AAC1C,0CAA6C;AAC7C,kDAAqD;AACrD,gDAAmD;AACnD,4CAA+C;AAC/C,wCAA2C;AAC3C,kDAAyB;AAKzB,KAAK,UAAU,aAAa,CAC1B,SAAiB,EACjB,OAIC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAG5D,MAAM,kBAAkB,GAAG,IAAA,yBAAkB,GAAE,CAAA;IAG/C,MAAM,UAAU,GAAG,IAAA,mBAAc,GAAE,CAAA;IACnC,MAAM,EAAE,GAAG,IAAA,kBAAa,EAAC,UAAU,EAAE;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;KAClC,CAAC,CAAA;IAGF,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QAGhC,MAAM,MAAM,GAAqB;YAC/B,SAAS;YACT,QAAQ,EAAE,EAAE;YACZ,QAAQ;SACT,CAAA;QACD,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;QAG9B,MAAM,YAAY,GAAG,IAAI,mBAAY,CAAC,kBAAkB,CAAC,CAAA;QAGzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ;YACvC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,CAAC,CAAC,SAAS,CAAA;QAEb,IAAI,gBAAgB,EAAE,CAAC;YACrB,EAAE,CAAC,IAAI,CAAC,uBAAuB,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;QAC3E,CAAC;QAGD,MAAM,MAAM,GAAG,MAAM,YAAY;aAC9B,MAAM,CAAC;YACN,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,QAAQ,EAAE,qBAAY;SACvB,CAAC;aACD,GAAG,EAAE,CAAA;QAER,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;YAC9B,MAAM,SAAS,GAAG,IAAA,kBAAW,EAAC,KAAK,CAAC,CAAA;YACpC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACjB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;YAEnC,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACjB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;gBACtC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;YACpE,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;QAG1C,EAAE,CAAC,iBAAiB,CAAC;YACnB,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;YAC/C,QAAQ,EAAE,YAAY,CAAC,QAAQ;SAChC,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,EAAE,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,OAAO,EAAE,CAAA;QACZ,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;AACH,CAAC;AAKD,KAAK,UAAU,cAAc,CAC3B,SAAiB,EACjB,OAIC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAG5D,MAAM,kBAAkB,GAAG,IAAA,yBAAkB,GAAE,CAAA;IAG/C,MAAM,UAAU,GAAG,IAAA,mBAAc,GAAE,CAAA;IACnC,MAAM,EAAE,GAAG,IAAA,kBAAa,EAAC,UAAU,EAAE;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;KAClC,CAAC,CAAA;IAGF,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mBAAmB,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QAEhC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,EAAE,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAA;YACxD,EAAE,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAGD,MAAM,YAAY,GAAG,IAAI,mBAAY,CAAC,kBAAkB,CAAC,CAAA;QAGzD,MAAM,MAAM,GAAG,MAAM,YAAY;aAC9B,OAAO,CAAC;YACP,QAAQ;YACR,SAAS;YACT,QAAQ,EAAE,qBAAY;SACvB,CAAC;aACD,GAAG,EAAE,CAAA;QAER,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;YAC9B,MAAM,SAAS,GAAG,IAAA,kBAAW,EAAC,KAAK,CAAC,CAAA;YACpC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACjB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;YAEnC,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACjB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;gBACtC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;YACpE,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;QAE3C,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAC3F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,EAAE,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,OAAO,EAAE,CAAA;QACZ,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;AACH,CAAC;AAKD,SAAS,IAAI;IACX,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,+CAA+C,CAAC;SAC5D,OAAO,CAAC,OAAO,CAAC,CAAA;IAGnB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iBAAiB,CAAC;SAC9B,QAAQ,CAAC,SAAS,EAAE,mDAAmD,CAAC;SACxE,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5E,MAAM,CAAC,2BAA2B,EAAE,4CAA4C,CAAC;SACjF,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,aAAa,CAAC,CAAA;IAGxB,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;SAC5C,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5E,MAAM,CAAC,WAAW,EAAE,0BAA0B,EAAE,KAAK,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,cAAc,CAAC,CAAA;IAGzB,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,wDAAwD,CAAC;SACrE,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAC;SAC/C,QAAQ,CAAC,YAAY,EAAE,2CAA2C,CAAC;SACnE,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5E,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,gBAAU,CAAC,CAAA;IAGrB,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5E,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,KAAK,CAAC;SAC3D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,kBAAW,CAAC,CAAA;IAGtB,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5E,MAAM,CAAC,eAAe,EAAE,sBAAsB,EAAE,KAAK,CAAC;SACtD,MAAM,CAAC,0BAAe,CAAC,CAAA;IAG1B,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2CAA2C,CAAC;SACxD,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,wBAAc,CAAC,CAAA;IAGzB,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5E,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,oBAAY,CAAC,CAAA;IAGvB,OAAO,CAAC,KAAK,EAAE,CAAA;AACjB,CAAC;AAGD,IAAI,EAAE,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { PhaseName, Status } from '@pulumix/core';
2
+ export interface PhaseGroup {
3
+ readonly phaseNumber: number;
4
+ readonly phase: PhaseName;
5
+ readonly status: Status;
6
+ readonly startTime: number;
7
+ readonly endTime?: number;
8
+ readonly expanded: boolean;
9
+ readonly messages: string[];
10
+ readonly progress?: {
11
+ readonly current: number;
12
+ readonly total: number;
13
+ readonly label?: string;
14
+ };
15
+ }
16
+ export declare class GroupedOutput {
17
+ private phases;
18
+ private phaseOrder;
19
+ startPhase(phaseNumber: number, phase: PhaseName): void;
20
+ completePhase(phase: PhaseName, status: Exclude<Status, 'pending' | 'running'>, duration?: number): void;
21
+ updateProgress(phase: PhaseName, current: number, total: number, label?: string): void;
22
+ addMessage(phase: PhaseName, message: string): void;
23
+ togglePhase(phase: PhaseName): void;
24
+ render(): string[];
25
+ private renderPhaseHeader;
26
+ private getStatusIcon;
27
+ private renderProgressBar;
28
+ getPhaseCount(): number;
29
+ getCompletedCount(): number;
30
+ isComplete(): boolean;
31
+ }
32
+ export declare const createGroupedOutput: () => GroupedOutput;
33
+ //# sourceMappingURL=grouped-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped-output.d.ts","sourceRoot":"","sources":["../../../src/ui/components/grouped-output.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAKjD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KACxB,CAAA;CACF;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,UAAU,CAAkB;IAKpC,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAkBvD,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAexG,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAatF,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAanD,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAanC,MAAM,IAAI,MAAM,EAAE;IA+BlB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,iBAAiB;IAczB,aAAa,IAAI,MAAM;IAOvB,iBAAiB,IAAI,MAAM;IAS3B,UAAU,IAAI,OAAO;CAKtB;AAKD,eAAO,MAAM,mBAAmB,QAAO,aAEtC,CAAA"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createGroupedOutput = exports.GroupedOutput = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ class GroupedOutput {
9
+ phases = new Map();
10
+ phaseOrder = [];
11
+ startPhase(phaseNumber, phase) {
12
+ this.phases.set(phase, {
13
+ phaseNumber,
14
+ phase,
15
+ status: 'running',
16
+ startTime: Date.now(),
17
+ expanded: true,
18
+ messages: []
19
+ });
20
+ if (!this.phaseOrder.includes(phase)) {
21
+ this.phaseOrder.push(phase);
22
+ }
23
+ }
24
+ completePhase(phase, status, duration) {
25
+ const existing = this.phases.get(phase);
26
+ if (!existing)
27
+ return;
28
+ this.phases.set(phase, {
29
+ ...existing,
30
+ status,
31
+ endTime: existing.startTime + (duration || 0),
32
+ expanded: status === 'error'
33
+ });
34
+ }
35
+ updateProgress(phase, current, total, label) {
36
+ const existing = this.phases.get(phase);
37
+ if (!existing)
38
+ return;
39
+ this.phases.set(phase, {
40
+ ...existing,
41
+ progress: { current, total, label }
42
+ });
43
+ }
44
+ addMessage(phase, message) {
45
+ const existing = this.phases.get(phase);
46
+ if (!existing)
47
+ return;
48
+ this.phases.set(phase, {
49
+ ...existing,
50
+ messages: [...existing.messages, message]
51
+ });
52
+ }
53
+ togglePhase(phase) {
54
+ const existing = this.phases.get(phase);
55
+ if (!existing)
56
+ return;
57
+ this.phases.set(phase, {
58
+ ...existing,
59
+ expanded: !existing.expanded
60
+ });
61
+ }
62
+ render() {
63
+ const lines = [];
64
+ for (const phase of this.phaseOrder) {
65
+ const group = this.phases.get(phase);
66
+ if (!group)
67
+ continue;
68
+ lines.push(this.renderPhaseHeader(group));
69
+ if (group.expanded) {
70
+ if (group.progress && group.status === 'running') {
71
+ const percentage = Math.round((group.progress.current / group.progress.total) * 100);
72
+ const progressBar = this.renderProgressBar(percentage);
73
+ const label = group.progress.label ? ` ${chalk_1.default.dim(group.progress.label)}` : '';
74
+ lines.push(` ${progressBar} ${percentage}%${label}`);
75
+ }
76
+ for (const message of group.messages) {
77
+ lines.push(` ${chalk_1.default.dim('│')} ${message}`);
78
+ }
79
+ }
80
+ }
81
+ return lines;
82
+ }
83
+ renderPhaseHeader(group) {
84
+ const icon = this.getStatusIcon(group.status);
85
+ const phaseName = chalk_1.default.bold(group.phase);
86
+ const duration = group.endTime
87
+ ? chalk_1.default.dim(` (${Math.round((group.endTime - group.startTime) / 1000)}s)`)
88
+ : '';
89
+ const expandIcon = group.expanded ? chalk_1.default.dim('▼') : chalk_1.default.dim('▶');
90
+ return `${expandIcon} ${icon} ${phaseName}${duration}`;
91
+ }
92
+ getStatusIcon(status) {
93
+ switch (status) {
94
+ case 'pending':
95
+ return chalk_1.default.gray('○');
96
+ case 'running':
97
+ return chalk_1.default.blue('◐');
98
+ case 'success':
99
+ return chalk_1.default.green('✓');
100
+ case 'error':
101
+ return chalk_1.default.red('✗');
102
+ case 'warning':
103
+ return chalk_1.default.yellow('⚠');
104
+ default:
105
+ return chalk_1.default.gray('○');
106
+ }
107
+ }
108
+ renderProgressBar(percentage) {
109
+ const width = 20;
110
+ const completed = Math.floor((percentage / 100) * width);
111
+ const remaining = width - completed;
112
+ return (chalk_1.default.green('█'.repeat(completed)) +
113
+ chalk_1.default.gray('░'.repeat(remaining)));
114
+ }
115
+ getPhaseCount() {
116
+ return this.phases.size;
117
+ }
118
+ getCompletedCount() {
119
+ return Array.from(this.phases.values()).filter(p => p.status === 'success' || p.status === 'error' || p.status === 'warning').length;
120
+ }
121
+ isComplete() {
122
+ return Array.from(this.phases.values()).every(p => p.status !== 'pending' && p.status !== 'running');
123
+ }
124
+ }
125
+ exports.GroupedOutput = GroupedOutput;
126
+ const createGroupedOutput = () => {
127
+ return new GroupedOutput();
128
+ };
129
+ exports.createGroupedOutput = createGroupedOutput;
130
+ //# sourceMappingURL=grouped-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped-output.js","sourceRoot":"","sources":["../../../src/ui/components/grouped-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface ProgressBarConfig {
2
+ readonly width?: number;
3
+ readonly completeChar?: string;
4
+ readonly incompleteChar?: string;
5
+ readonly showPercentage?: boolean;
6
+ }
7
+ export declare class ProgressBar {
8
+ private config;
9
+ private current;
10
+ private total;
11
+ private label;
12
+ constructor(config?: ProgressBarConfig);
13
+ update(current: number, total: number, label?: string): void;
14
+ render(): string;
15
+ renderComplete(message?: string): string;
16
+ renderError(message?: string): string;
17
+ getPercentage(): number;
18
+ isComplete(): boolean;
19
+ }
20
+ export declare const createProgressBar: (config?: ProgressBarConfig) => ProgressBar;
21
+ //# sourceMappingURL=progress-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-bar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/progress-bar.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAClC;AAeD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAa;gBAEd,MAAM,CAAC,EAAE,iBAAiB;IAOtC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAW5D,MAAM,IAAI,MAAM;IAsBhB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAUxC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IASrC,aAAa,IAAI,MAAM;IAOvB,UAAU,IAAI,OAAO;CAGtB;AAKD,eAAO,MAAM,iBAAiB,GAAI,SAAS,iBAAiB,KAAG,WAE9D,CAAA"}