container-superposition 0.1.3 → 0.1.4

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 (62) hide show
  1. package/README.md +365 -9
  2. package/dist/scripts/init.js +220 -94
  3. package/dist/scripts/init.js.map +1 -1
  4. package/dist/tool/commands/doctor.js +2 -2
  5. package/dist/tool/commands/explain.d.ts.map +1 -1
  6. package/dist/tool/commands/explain.js +88 -0
  7. package/dist/tool/commands/explain.js.map +1 -1
  8. package/dist/tool/commands/plan.d.ts +51 -0
  9. package/dist/tool/commands/plan.d.ts.map +1 -1
  10. package/dist/tool/commands/plan.js +523 -1
  11. package/dist/tool/commands/plan.js.map +1 -1
  12. package/dist/tool/questionnaire/composer.d.ts +12 -3
  13. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  14. package/dist/tool/questionnaire/composer.js +133 -20
  15. package/dist/tool/questionnaire/composer.js.map +1 -1
  16. package/dist/tool/schema/types.d.ts +18 -0
  17. package/dist/tool/schema/types.d.ts.map +1 -1
  18. package/dist/tool/utils/gitignore.d.ts +15 -0
  19. package/dist/tool/utils/gitignore.d.ts.map +1 -0
  20. package/dist/tool/utils/gitignore.js +41 -0
  21. package/dist/tool/utils/gitignore.js.map +1 -0
  22. package/dist/tool/utils/services-export.d.ts +14 -0
  23. package/dist/tool/utils/services-export.d.ts.map +1 -0
  24. package/dist/tool/utils/services-export.js +478 -0
  25. package/dist/tool/utils/services-export.js.map +1 -0
  26. package/dist/tool/utils/summary.d.ts +69 -0
  27. package/dist/tool/utils/summary.d.ts.map +1 -0
  28. package/dist/tool/utils/summary.js +260 -0
  29. package/dist/tool/utils/summary.js.map +1 -0
  30. package/docs/overlays.md +48 -5
  31. package/overlays/.presets/microservice.yml +32 -6
  32. package/overlays/.presets/web-api.yml +76 -56
  33. package/overlays/cloudflared/README.md +190 -0
  34. package/overlays/cloudflared/devcontainer.patch.json +3 -0
  35. package/overlays/cloudflared/overlay.yml +15 -0
  36. package/overlays/cloudflared/setup.sh +49 -0
  37. package/overlays/cloudflared/verify.sh +21 -0
  38. package/overlays/direnv/README.md +6 -4
  39. package/overlays/direnv/setup.sh +0 -12
  40. package/overlays/grpc-tools/README.md +242 -0
  41. package/overlays/grpc-tools/devcontainer.patch.json +14 -0
  42. package/overlays/grpc-tools/overlay.yml +14 -0
  43. package/overlays/grpc-tools/setup.sh +57 -0
  44. package/overlays/grpc-tools/verify.sh +47 -0
  45. package/overlays/keycloak/.env.example +5 -0
  46. package/overlays/keycloak/README.md +238 -0
  47. package/overlays/keycloak/devcontainer.patch.json +17 -0
  48. package/overlays/keycloak/docker-compose.yml +32 -0
  49. package/overlays/keycloak/overlay.yml +23 -0
  50. package/overlays/keycloak/verify.sh +54 -0
  51. package/overlays/mailpit/.env.example +4 -0
  52. package/overlays/mailpit/README.md +191 -0
  53. package/overlays/mailpit/devcontainer.patch.json +20 -0
  54. package/overlays/mailpit/docker-compose.yml +17 -0
  55. package/overlays/mailpit/overlay.yml +26 -0
  56. package/overlays/mailpit/verify.sh +52 -0
  57. package/overlays/ngrok/overlay.yml +2 -1
  58. package/overlays/python/README.md +51 -35
  59. package/overlays/python/devcontainer.patch.json +7 -4
  60. package/overlays/python/setup.sh +50 -23
  61. package/overlays/python/verify.sh +29 -1
  62. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../../tool/utils/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CAClC,aAAqB,EACrB,WAAmB,EACnB,QAAkB;IAElB,MAAM,eAAe,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAChD,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC;QACzC,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC5B,eAAe;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CACzD,CAAC;IAEF,wEAAwE;IACxE,MAAM,QAAQ,GAAG,QAAQ;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,KAAK,GAAG,KAAK,WAAW,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAE3D,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,sBAAsB,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzD,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,sBAAsB,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACJ,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Export utilities for generating service reference documentation
3
+ */
4
+ import type { OverlayMetadata } from '../schema/types.js';
5
+ /**
6
+ * Generate the services.md reference document
7
+ */
8
+ export declare function generateServicesMarkdown(overlays: OverlayMetadata[], portOffset: number, envVars: Record<string, string>, generatedAt?: string): string;
9
+ /**
10
+ * Generate env.local.example - a commented-out local override template
11
+ * derived from each overlay's .env.example
12
+ */
13
+ export declare function generateEnvLocalExample(overlays: OverlayMetadata[], overlaysDir: string, portOffset: number): string;
14
+ //# sourceMappingURL=services-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services-export.d.ts","sourceRoot":"","sources":["../../../tool/utils/services-export.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,oBAAoB,CAAC;AAwM1E;;GAEG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,eAAe,EAAE,EAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,GAAE,MAAiC,GAC/C,MAAM,CAoQR;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACnC,QAAQ,EAAE,eAAe,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACnB,MAAM,CA0DR"}
@@ -0,0 +1,478 @@
1
+ /**
2
+ * Export utilities for generating service reference documentation
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import { normalizePort, generateConnectionString, getDefaultConnectionStringTemplate, generateUrl, } from './port-utils.js';
7
+ import { applyPortOffsetToEnv } from './merge.js';
8
+ /**
9
+ * Code connection examples per service type
10
+ * Keys correspond to the service field in port metadata / overlay id
11
+ */
12
+ const SERVICE_CODE_EXAMPLES = {
13
+ postgres: {
14
+ nodejs: `const { Client } = require('pg');
15
+ const client = new Client({
16
+ host: 'postgres',
17
+ port: parseInt(process.env.POSTGRES_PORT || '5432'),
18
+ database: process.env.POSTGRES_DB,
19
+ user: process.env.POSTGRES_USER,
20
+ password: process.env.POSTGRES_PASSWORD,
21
+ });`,
22
+ python: `import os
23
+ import psycopg2
24
+ conn = psycopg2.connect(
25
+ host="postgres",
26
+ port=int(os.getenv("POSTGRES_PORT", "5432")),
27
+ database=os.getenv("POSTGRES_DB"),
28
+ user=os.getenv("POSTGRES_USER"),
29
+ password=os.getenv("POSTGRES_PASSWORD")
30
+ )`,
31
+ },
32
+ redis: {
33
+ nodejs: `const redis = require('redis');
34
+ const client = redis.createClient({
35
+ url: \`redis://redis:\${process.env.REDIS_PORT || 6379}\`
36
+ });`,
37
+ python: `import os
38
+ import redis
39
+ r = redis.Redis(
40
+ host='redis',
41
+ port=int(os.getenv("REDIS_PORT", "6379"))
42
+ )`,
43
+ },
44
+ mongodb: {
45
+ nodejs: `const { MongoClient } = require('mongodb');
46
+ const client = new MongoClient(
47
+ \`mongodb://\${process.env.MONGO_USER}:\${process.env.MONGO_PASSWORD}@mongodb:\${process.env.MONGO_PORT || 27017}/\${process.env.MONGO_DB}\`
48
+ );`,
49
+ python: `import os
50
+ from pymongo import MongoClient
51
+ client = MongoClient(
52
+ host='mongodb',
53
+ port=int(os.getenv("MONGO_PORT", "27017"))
54
+ )`,
55
+ },
56
+ mysql: {
57
+ nodejs: `const mysql = require('mysql2');
58
+ const conn = mysql.createConnection({
59
+ host: 'mysql',
60
+ user: process.env.MYSQL_USER,
61
+ password: process.env.MYSQL_PASSWORD,
62
+ database: process.env.MYSQL_DATABASE,
63
+ });`,
64
+ python: `import os
65
+ import mysql.connector
66
+ conn = mysql.connector.connect(
67
+ host="mysql",
68
+ user=os.getenv("MYSQL_USER"),
69
+ password=os.getenv("MYSQL_PASSWORD"),
70
+ database=os.getenv("MYSQL_DATABASE")
71
+ )`,
72
+ },
73
+ rabbitmq: {
74
+ nodejs: `(async () => {
75
+ const amqp = require('amqplib');
76
+ const conn = await amqp.connect('amqp://rabbitmq:5672');
77
+ // use conn here
78
+ })();`,
79
+ python: `import pika
80
+ connection = pika.BlockingConnection(
81
+ pika.ConnectionParameters('rabbitmq')
82
+ )`,
83
+ },
84
+ nats: {
85
+ nodejs: `(async () => {
86
+ const { connect } = require('nats');
87
+ const nc = await connect({ servers: 'nats://nats:4222' });
88
+ // use nc here
89
+ })();`,
90
+ python: `import asyncio
91
+ import nats
92
+
93
+ async def main():
94
+ nc = await nats.connect("nats://nats:4222")
95
+
96
+ asyncio.run(main())`,
97
+ },
98
+ };
99
+ /**
100
+ * Common CLI commands per service type
101
+ */
102
+ const SERVICE_COMMANDS = {
103
+ postgres: [
104
+ {
105
+ name: 'Connect with psql',
106
+ command: 'psql -h postgres -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-devdb}',
107
+ },
108
+ {
109
+ name: 'List databases',
110
+ command: "psql -h postgres -U ${POSTGRES_USER:-postgres} -c '\\l'",
111
+ },
112
+ {
113
+ name: 'Dump database',
114
+ command: 'pg_dump -h postgres -U ${POSTGRES_USER:-postgres} ${POSTGRES_DB:-devdb} > backup.sql',
115
+ },
116
+ {
117
+ name: 'Test connection',
118
+ command: "psql -h postgres -U ${POSTGRES_USER:-postgres} -c 'SELECT version();'",
119
+ },
120
+ ],
121
+ redis: [
122
+ { name: 'Connect with redis-cli', command: 'redis-cli -h redis' },
123
+ { name: 'Test connection', command: 'redis-cli -h redis ping' },
124
+ { name: 'Monitor commands', command: 'redis-cli -h redis monitor' },
125
+ { name: 'List all keys', command: 'redis-cli -h redis keys "*"' },
126
+ ],
127
+ mongodb: [
128
+ {
129
+ name: 'Connect with mongosh',
130
+ command: 'mongosh mongodb://mongodb:${MONGO_PORT:-27017}/${MONGO_DB:-devdb}',
131
+ },
132
+ { name: 'List databases', command: 'mongosh --eval "show dbs"' },
133
+ ],
134
+ mysql: [
135
+ {
136
+ name: 'Connect with mysql client',
137
+ command: 'mysql -h mysql -u ${MYSQL_USER:-root} -p',
138
+ },
139
+ {
140
+ name: 'List databases',
141
+ command: 'mysql -h mysql -u ${MYSQL_USER:-root} -p -e "SHOW DATABASES;"',
142
+ },
143
+ ],
144
+ grafana: [
145
+ {
146
+ name: 'Check health',
147
+ command: 'curl http://localhost:${GRAFANA_PORT:-3000}/api/health',
148
+ },
149
+ {
150
+ name: 'List datasources (API)',
151
+ command: 'curl -u admin:admin http://localhost:${GRAFANA_PORT:-3000}/api/datasources',
152
+ },
153
+ ],
154
+ prometheus: [
155
+ {
156
+ name: 'Check targets',
157
+ command: 'curl http://localhost:${PROMETHEUS_PORT:-9090}/api/v1/targets',
158
+ },
159
+ {
160
+ name: 'Query metrics',
161
+ command: 'curl "http://localhost:${PROMETHEUS_PORT:-9090}/api/v1/query?query=up"',
162
+ },
163
+ ],
164
+ jaeger: [
165
+ {
166
+ name: 'Check health',
167
+ command: 'curl http://localhost:${JAEGER_UI_PORT:-16686}/api/services',
168
+ },
169
+ ],
170
+ rabbitmq: [
171
+ {
172
+ name: 'List queues',
173
+ command: 'rabbitmqctl list_queues',
174
+ },
175
+ {
176
+ name: 'Open management UI',
177
+ command: 'open http://localhost:${RABBITMQ_MANAGEMENT_PORT:-15672}',
178
+ },
179
+ ],
180
+ };
181
+ /**
182
+ * Credentials info per service (for Quick Links table)
183
+ */
184
+ const SERVICE_CREDENTIALS = {
185
+ grafana: '${GRAFANA_ADMIN_USER:-admin} / ${GRAFANA_ADMIN_PASSWORD:-admin}',
186
+ prometheus: '(no auth)',
187
+ jaeger: '(no auth)',
188
+ postgres: '${POSTGRES_USER:-postgres} / ${POSTGRES_PASSWORD:-postgres}',
189
+ redis: '(no auth by default)',
190
+ mongodb: '${MONGO_USER} / ${MONGO_PASSWORD}',
191
+ mysql: '${MYSQL_USER} / ${MYSQL_PASSWORD}',
192
+ rabbitmq: '${RABBITMQ_DEFAULT_USER:-guest} / ${RABBITMQ_DEFAULT_PASS:-guest}',
193
+ minio: '${MINIO_ROOT_USER:-minioadmin} / ${MINIO_ROOT_PASSWORD:-minioadmin}',
194
+ };
195
+ /**
196
+ * Generate the services.md reference document
197
+ */
198
+ export function generateServicesMarkdown(overlays, portOffset, envVars, generatedAt = new Date().toISOString()) {
199
+ const serviceOverlays = overlays.filter((o) => o.ports && o.ports.length > 0);
200
+ if (serviceOverlays.length === 0) {
201
+ return '';
202
+ }
203
+ const lines = [];
204
+ lines.push('# Services Reference');
205
+ lines.push('');
206
+ lines.push('> Auto-generated by Container Superposition');
207
+ lines.push('');
208
+ // Build normalized port map
209
+ const overlayPorts = [];
210
+ for (const overlay of serviceOverlays) {
211
+ const normalizedPorts = (overlay.ports || []).map((p) => normalizePort(p, portOffset, overlay.id));
212
+ overlayPorts.push({ overlay, ports: normalizedPorts });
213
+ }
214
+ // ─── Quick Links Table ───────────────────────────────────────────
215
+ lines.push('## Quick Links');
216
+ lines.push('');
217
+ lines.push('| Service | URL / Connection | Credentials |');
218
+ lines.push('|---------|-----------------|-------------|');
219
+ for (const { overlay, ports } of overlayPorts) {
220
+ for (const port of ports) {
221
+ const url = generateUrl(port);
222
+ const service = port.service || overlay.id;
223
+ const template = typeof (overlay.ports || [])[0] === 'object' &&
224
+ overlay.ports[0].connectionStringTemplate
225
+ ? overlay.ports[0].connectionStringTemplate
226
+ : getDefaultConnectionStringTemplate(service, port.protocol);
227
+ let connDisplay = url || '';
228
+ if (!connDisplay && template) {
229
+ connDisplay = generateConnectionString(template, port, envVars);
230
+ }
231
+ if (!connDisplay) {
232
+ connDisplay = `${service}:${port.actualPort}`;
233
+ }
234
+ const creds = SERVICE_CREDENTIALS[service] || '(see .env.example)';
235
+ const label = overlay.name;
236
+ lines.push(`| ${label} | \`${connDisplay}\` | ${creds} |`);
237
+ }
238
+ }
239
+ lines.push('');
240
+ // ─── Per-Service Details ─────────────────────────────────────────
241
+ lines.push('## Service Details');
242
+ lines.push('');
243
+ for (const { overlay, ports } of overlayPorts) {
244
+ lines.push(`### ${overlay.name}`);
245
+ lines.push('');
246
+ const primaryPort = ports[0];
247
+ const service = primaryPort.service || overlay.id;
248
+ const url = generateUrl(primaryPort);
249
+ if (url) {
250
+ // HTTP service
251
+ lines.push('**Access:**');
252
+ lines.push(`- UI: ${url}`);
253
+ const creds = SERVICE_CREDENTIALS[service];
254
+ if (creds) {
255
+ lines.push(`- Credentials: \`${creds}\``);
256
+ }
257
+ }
258
+ else {
259
+ // TCP/database service
260
+ lines.push('**Connection Information:**');
261
+ lines.push(`- Host (from container): \`${service}\``);
262
+ lines.push(`- Host (from host): \`localhost\``);
263
+ lines.push(`- Port: \`${primaryPort.actualPort}\``);
264
+ if (primaryPort.description) {
265
+ lines.push(`- ${primaryPort.description}`);
266
+ }
267
+ }
268
+ lines.push('');
269
+ // Connection strings — emit both container (service name) and host (localhost) variants
270
+ const connectionStrings = [];
271
+ for (const port of ports) {
272
+ const portService = port.service || overlay.id;
273
+ const tmpl = typeof (overlay.ports || [])[ports.indexOf(port)] === 'object' &&
274
+ overlay.ports[ports.indexOf(port)].connectionStringTemplate
275
+ ? overlay.ports[ports.indexOf(port)].connectionStringTemplate
276
+ : getDefaultConnectionStringTemplate(portService, port.protocol);
277
+ const portUrl = generateUrl(port);
278
+ if (portUrl) {
279
+ connectionStrings.push(portUrl);
280
+ }
281
+ else if (tmpl) {
282
+ // From dev container: use the service name as host
283
+ const containerStr = generateConnectionString(tmpl, port, {
284
+ ...envVars,
285
+ host: portService,
286
+ });
287
+ // From host machine: use localhost
288
+ const hostStr = generateConnectionString(tmpl, port, {
289
+ ...envVars,
290
+ host: 'localhost',
291
+ });
292
+ if (containerStr) {
293
+ connectionStrings.push(`# From dev container\n${containerStr}`);
294
+ }
295
+ if (hostStr && hostStr !== containerStr) {
296
+ connectionStrings.push(`# From host machine\n${hostStr}`);
297
+ }
298
+ }
299
+ }
300
+ if (connectionStrings.length > 0) {
301
+ lines.push('**Connection Strings:**');
302
+ lines.push('');
303
+ lines.push('```bash');
304
+ for (const cs of connectionStrings) {
305
+ lines.push(cs);
306
+ }
307
+ lines.push('```');
308
+ lines.push('');
309
+ }
310
+ // Code examples
311
+ const examples = SERVICE_CODE_EXAMPLES[service] || SERVICE_CODE_EXAMPLES[overlay.id];
312
+ if (examples) {
313
+ lines.push('**Code Examples:**');
314
+ lines.push('');
315
+ if (examples.nodejs) {
316
+ lines.push('*Node.js:*');
317
+ lines.push('```javascript');
318
+ lines.push(examples.nodejs);
319
+ lines.push('```');
320
+ lines.push('');
321
+ }
322
+ if (examples.python) {
323
+ lines.push('*Python:*');
324
+ lines.push('```python');
325
+ lines.push(examples.python);
326
+ lines.push('```');
327
+ lines.push('');
328
+ }
329
+ }
330
+ // Common commands
331
+ const commands = SERVICE_COMMANDS[service] || SERVICE_COMMANDS[overlay.id];
332
+ if (commands) {
333
+ lines.push('**Common Commands:**');
334
+ lines.push('');
335
+ lines.push('```bash');
336
+ for (const cmd of commands) {
337
+ lines.push(`# ${cmd.name}`);
338
+ lines.push(cmd.command);
339
+ }
340
+ lines.push('```');
341
+ lines.push('');
342
+ }
343
+ // Health check
344
+ lines.push('**Health Check:**');
345
+ lines.push('');
346
+ lines.push('```bash');
347
+ lines.push(`# Verify service is running`);
348
+ lines.push(`docker-compose ps ${service}`);
349
+ lines.push('');
350
+ lines.push(`# View service logs`);
351
+ lines.push(`docker-compose logs ${service}`);
352
+ lines.push('```');
353
+ lines.push('');
354
+ }
355
+ // ─── Environment Variables ────────────────────────────────────────
356
+ lines.push('## Environment Variables');
357
+ lines.push('');
358
+ lines.push('See `.env.example` for all configuration options.');
359
+ lines.push('');
360
+ lines.push('Copy to `.env` and customize:');
361
+ lines.push('```bash');
362
+ lines.push('cp .devcontainer/.env.example .devcontainer/.env');
363
+ lines.push('```');
364
+ lines.push('');
365
+ // ─── Port Offset ──────────────────────────────────────────────────
366
+ lines.push('## Port Offset');
367
+ lines.push('');
368
+ lines.push(`**Current offset:** ${portOffset}`);
369
+ lines.push('');
370
+ if (portOffset > 0) {
371
+ lines.push(`A port offset of **${portOffset}** is currently applied to avoid conflicts with other projects.`);
372
+ }
373
+ else {
374
+ lines.push('To avoid conflicts when running multiple projects simultaneously:');
375
+ lines.push('```bash');
376
+ lines.push('npx container-superposition regen --port-offset 100');
377
+ lines.push('```');
378
+ lines.push('');
379
+ // Show what would change
380
+ if (serviceOverlays.length > 0) {
381
+ lines.push('This would change:');
382
+ for (const { overlay, ports } of overlayPorts) {
383
+ for (const port of ports) {
384
+ lines.push(`- ${overlay.name}: ${port.port} → ${port.port + 100}`);
385
+ }
386
+ }
387
+ }
388
+ }
389
+ lines.push('');
390
+ // ─── Troubleshooting ──────────────────────────────────────────────
391
+ lines.push('## Troubleshooting');
392
+ lines.push('');
393
+ lines.push("### Service won't start");
394
+ lines.push('');
395
+ lines.push('```bash');
396
+ lines.push('# Check container status');
397
+ lines.push('docker-compose ps');
398
+ lines.push('');
399
+ lines.push('# View logs');
400
+ lines.push('docker-compose logs <service-name>');
401
+ lines.push('');
402
+ lines.push('# Restart service');
403
+ lines.push('docker-compose restart <service-name>');
404
+ lines.push('```');
405
+ lines.push('');
406
+ lines.push('### Connection refused');
407
+ lines.push('');
408
+ lines.push('1. Verify service is running with `docker-compose ps`');
409
+ lines.push('2. Use service name from container (e.g., `postgres` not `localhost`)');
410
+ lines.push('3. Use `localhost` when connecting from the host machine');
411
+ lines.push('4. Check for port conflicts');
412
+ lines.push('');
413
+ lines.push('### Port already in use');
414
+ lines.push('');
415
+ lines.push('```bash');
416
+ lines.push('npx container-superposition regen --port-offset 100');
417
+ lines.push('```');
418
+ lines.push('');
419
+ // Footer
420
+ lines.push('---');
421
+ lines.push('');
422
+ lines.push(`Generated from overlays on ${generatedAt}`);
423
+ lines.push('');
424
+ return lines.join('\n');
425
+ }
426
+ /**
427
+ * Generate env.local.example - a commented-out local override template
428
+ * derived from each overlay's .env.example
429
+ */
430
+ export function generateEnvLocalExample(overlays, overlaysDir, portOffset) {
431
+ const sections = [];
432
+ for (const overlay of overlays) {
433
+ const envPath = path.join(overlaysDir, overlay.id, '.env.example');
434
+ if (!fs.existsSync(envPath)) {
435
+ continue;
436
+ }
437
+ const rawContent = fs.readFileSync(envPath, 'utf-8').trim();
438
+ if (!rawContent) {
439
+ continue;
440
+ }
441
+ // Apply port offset to the env content so suggested values match .env.example
442
+ const content = portOffset > 0 ? applyPortOffsetToEnv(rawContent, portOffset) : rawContent;
443
+ // Build commented-out version of this overlay's env vars
444
+ const commentedLines = content.split('\n').map((line) => {
445
+ const trimmed = line.trim();
446
+ // Keep blank lines and already-commented lines as-is
447
+ if (trimmed === '' || trimmed.startsWith('#')) {
448
+ return line;
449
+ }
450
+ // Comment out the variable assignment
451
+ return `# ${line}`;
452
+ });
453
+ const section = `# ============================================\n` +
454
+ `# ${overlay.name}\n` +
455
+ `# ============================================\n` +
456
+ commentedLines.join('\n');
457
+ sections.push(section);
458
+ }
459
+ if (sections.length === 0) {
460
+ return '';
461
+ }
462
+ let header = `# Local Environment Configuration
463
+ # Copy this file to .devcontainer/.env and customize for your machine
464
+ #
465
+ # This file shows OPTIONAL overrides. The defaults in .devcontainer/.env.example
466
+ # work out of the box for local development.
467
+ #
468
+ # Generated by container-superposition
469
+ `;
470
+ if (portOffset > 0) {
471
+ header += `#
472
+ # NOTE: A port offset of ${portOffset} is applied.
473
+ # Ports have been shifted by ${portOffset} in .env.example.
474
+ `;
475
+ }
476
+ return header + '\n' + sections.join('\n\n') + '\n';
477
+ }
478
+ //# sourceMappingURL=services-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services-export.js","sourceRoot":"","sources":["../../../tool/utils/services-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Summary utilities for post-generation output
3
+ */
4
+ import type { QuestionnaireAnswers, OverlayMetadata, NormalizedPort, DeploymentTarget } from '../schema/types.js';
5
+ /**
6
+ * Service information for summary
7
+ */
8
+ export interface ServiceInfo {
9
+ name: string;
10
+ category: string;
11
+ version?: string;
12
+ }
13
+ /**
14
+ * Port information for summary
15
+ */
16
+ export interface PortInfo {
17
+ service: string;
18
+ port: number;
19
+ actualPort: number;
20
+ url?: string;
21
+ connectionString?: string;
22
+ }
23
+ /**
24
+ * Summary of what was generated
25
+ */
26
+ export interface GenerationSummary {
27
+ files: string[];
28
+ services: ServiceInfo[];
29
+ ports: PortInfo[];
30
+ warnings: string[];
31
+ tips: string[];
32
+ nextSteps: string[];
33
+ portOffset: number;
34
+ target: DeploymentTarget;
35
+ isManifestOnly: boolean;
36
+ manifestPath?: string;
37
+ backupPath?: string;
38
+ }
39
+ /**
40
+ * Detect warnings based on selected overlays and configuration
41
+ */
42
+ export declare function detectWarnings(overlays: OverlayMetadata[], answers: QuestionnaireAnswers): string[];
43
+ /**
44
+ * Generate helpful tips based on configuration
45
+ */
46
+ export declare function generateTips(overlays: OverlayMetadata[], answers: QuestionnaireAnswers): string[];
47
+ /**
48
+ * Generate next steps based on mode
49
+ */
50
+ export declare function generateNextSteps(isManifestOnly: boolean, isRegen: boolean): string[];
51
+ /**
52
+ * Convert overlay metadata to service info
53
+ */
54
+ export declare function overlaysToServices(overlays: OverlayMetadata[]): ServiceInfo[];
55
+ /**
56
+ * Convert normalized ports to port info with URLs
57
+ */
58
+ export declare function portsToPortInfo(ports: NormalizedPort[], connectionStrings: Record<string, string>): PortInfo[];
59
+ /**
60
+ * Format and print generation summary.
61
+ *
62
+ * @param summary The generation summary to render.
63
+ * @param quiet When true, suppresses all console output. This parameter is
64
+ * reserved for callers (for example, CLI commands or tests)
65
+ * that need to generate a summary object but handle user
66
+ * messaging themselves.
67
+ */
68
+ export declare function printSummary(summary: GenerationSummary, quiet?: boolean): void;
69
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../../tool/utils/summary.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACR,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,gBAAgB,EACnB,MAAM,oBAAoB,CAAC;AAG5B;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC1B,QAAQ,EAAE,eAAe,EAAE,EAC3B,OAAO,EAAE,oBAAoB,GAC9B,MAAM,EAAE,CA2CV;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAkBjG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAuBrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,WAAW,EAAE,CAY7E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAE,cAAc,EAAE,EACvB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1C,QAAQ,EAAE,CAqBZ;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,GAAE,OAAe,GAAG,IAAI,CAuJrF"}