container-superposition 0.1.1 → 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.
- package/README.md +569 -8
- package/dist/scripts/init.js +436 -254
- package/dist/scripts/init.js.map +1 -1
- package/dist/tool/commands/doctor.d.ts +15 -0
- package/dist/tool/commands/doctor.d.ts.map +1 -0
- package/dist/tool/commands/doctor.js +862 -0
- package/dist/tool/commands/doctor.js.map +1 -0
- package/dist/tool/commands/explain.d.ts +13 -0
- package/dist/tool/commands/explain.d.ts.map +1 -0
- package/dist/tool/commands/explain.js +299 -0
- package/dist/tool/commands/explain.js.map +1 -0
- package/dist/tool/commands/list.d.ts +16 -0
- package/dist/tool/commands/list.d.ts.map +1 -0
- package/dist/tool/commands/list.js +121 -0
- package/dist/tool/commands/list.js.map +1 -0
- package/dist/tool/commands/plan.d.ts +67 -0
- package/dist/tool/commands/plan.d.ts.map +1 -0
- package/dist/tool/commands/plan.js +851 -0
- package/dist/tool/commands/plan.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +16 -2
- package/dist/tool/questionnaire/composer.d.ts.map +1 -1
- package/dist/tool/questionnaire/composer.js +411 -200
- package/dist/tool/questionnaire/composer.js.map +1 -1
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -1
- package/dist/tool/readme/markdown-parser.js.map +1 -1
- package/dist/tool/readme/readme-generator.d.ts.map +1 -1
- package/dist/tool/readme/readme-generator.js +11 -6
- package/dist/tool/readme/readme-generator.js.map +1 -1
- package/dist/tool/schema/deployment-targets.d.ts +77 -0
- package/dist/tool/schema/deployment-targets.d.ts.map +1 -0
- package/dist/tool/schema/deployment-targets.js +91 -0
- package/dist/tool/schema/deployment-targets.js.map +1 -0
- package/dist/tool/schema/manifest-migrations.d.ts +51 -0
- package/dist/tool/schema/manifest-migrations.d.ts.map +1 -0
- package/dist/tool/schema/manifest-migrations.js +159 -0
- package/dist/tool/schema/manifest-migrations.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +1 -1
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
- package/dist/tool/schema/overlay-loader.js +42 -14
- package/dist/tool/schema/overlay-loader.js.map +1 -1
- package/dist/tool/schema/types.d.ts +62 -2
- package/dist/tool/schema/types.d.ts.map +1 -1
- package/dist/tool/utils/gitignore.d.ts +15 -0
- package/dist/tool/utils/gitignore.d.ts.map +1 -0
- package/dist/tool/utils/gitignore.js +41 -0
- package/dist/tool/utils/gitignore.js.map +1 -0
- package/dist/tool/utils/merge.d.ts +134 -0
- package/dist/tool/utils/merge.d.ts.map +1 -0
- package/dist/tool/utils/merge.js +277 -0
- package/dist/tool/utils/merge.js.map +1 -0
- package/dist/tool/utils/port-utils.d.ts +29 -0
- package/dist/tool/utils/port-utils.d.ts.map +1 -0
- package/dist/tool/utils/port-utils.js +128 -0
- package/dist/tool/utils/port-utils.js.map +1 -0
- package/dist/tool/utils/services-export.d.ts +14 -0
- package/dist/tool/utils/services-export.d.ts.map +1 -0
- package/dist/tool/utils/services-export.js +478 -0
- package/dist/tool/utils/services-export.js.map +1 -0
- package/dist/tool/utils/summary.d.ts +69 -0
- package/dist/tool/utils/summary.d.ts.map +1 -0
- package/dist/tool/utils/summary.js +260 -0
- package/dist/tool/utils/summary.js.map +1 -0
- package/dist/tool/utils/version.d.ts +9 -0
- package/dist/tool/utils/version.d.ts.map +1 -0
- package/dist/tool/utils/version.js +32 -0
- package/dist/tool/utils/version.js.map +1 -0
- package/docs/architecture.md +25 -21
- package/docs/deployment-targets.md +150 -0
- package/docs/discovery-commands.md +442 -0
- package/docs/merge-strategy.md +700 -0
- package/docs/minimal-and-editor.md +265 -0
- package/docs/overlay-imports.md +209 -0
- package/docs/overlay-manifest-refactoring.md +2 -2
- package/docs/overlay-metadata-archive.md +1 -1
- package/docs/overlays.md +139 -28
- package/docs/presets-architecture.md +3 -3
- package/docs/presets.md +1 -1
- package/docs/publishing.md +36 -35
- package/docs/team-workflow.md +540 -0
- package/overlays/.presets/data-engineering.yml +392 -0
- package/overlays/.presets/event-sourced-service.yml +262 -0
- package/overlays/.presets/frontend.yml +287 -0
- package/overlays/.presets/k8s-operator-dev.yml +462 -0
- package/overlays/{presets → .presets}/microservice.yml +32 -6
- package/overlays/.presets/web-api.yml +129 -0
- package/overlays/.registry/README.md +1 -1
- package/overlays/.registry/deployment-targets.yml +54 -0
- package/overlays/.shared/README.md +43 -0
- package/overlays/.shared/compose/common-healthchecks.yml +38 -0
- package/overlays/.shared/otel/instrumentation.env +20 -0
- package/overlays/.shared/otel/otel-base-config.yaml +30 -0
- package/overlays/.shared/vscode/recommended-extensions.json +14 -0
- package/overlays/README.md +1 -1
- package/overlays/cloudflared/README.md +190 -0
- package/overlays/cloudflared/devcontainer.patch.json +3 -0
- package/overlays/cloudflared/overlay.yml +15 -0
- package/overlays/cloudflared/setup.sh +49 -0
- package/overlays/cloudflared/verify.sh +21 -0
- package/overlays/codex/overlay.yml +1 -0
- package/overlays/direnv/README.md +6 -4
- package/overlays/direnv/setup.sh +0 -12
- package/overlays/duckdb/README.md +274 -0
- package/overlays/duckdb/devcontainer.patch.json +10 -0
- package/overlays/duckdb/overlay.yml +17 -0
- package/overlays/duckdb/setup.sh +45 -0
- package/overlays/duckdb/verify.sh +32 -0
- package/overlays/git-helpers/overlay.yml +1 -0
- package/overlays/grafana/README.md +5 -5
- package/overlays/grafana/dashboard-provider.yml +1 -1
- package/overlays/grafana/docker-compose.yml +2 -2
- package/overlays/grafana/overlay.yml +6 -1
- package/overlays/grpc-tools/README.md +242 -0
- package/overlays/grpc-tools/devcontainer.patch.json +14 -0
- package/overlays/grpc-tools/overlay.yml +14 -0
- package/overlays/grpc-tools/setup.sh +57 -0
- package/overlays/grpc-tools/verify.sh +47 -0
- package/overlays/jaeger/overlay.yml +16 -3
- package/overlays/jupyter/.env.example +6 -0
- package/overlays/jupyter/README.md +210 -0
- package/overlays/jupyter/devcontainer.patch.json +14 -0
- package/overlays/jupyter/docker-compose.yml +23 -0
- package/overlays/jupyter/overlay.yml +18 -0
- package/overlays/jupyter/verify.sh +35 -0
- package/overlays/keycloak/.env.example +5 -0
- package/overlays/keycloak/README.md +238 -0
- package/overlays/keycloak/devcontainer.patch.json +17 -0
- package/overlays/keycloak/docker-compose.yml +32 -0
- package/overlays/keycloak/overlay.yml +23 -0
- package/overlays/keycloak/verify.sh +54 -0
- package/overlays/kind/README.md +221 -0
- package/overlays/kind/devcontainer.patch.json +10 -0
- package/overlays/kind/overlay.yml +18 -0
- package/overlays/kind/setup.sh +43 -0
- package/overlays/kind/verify.sh +40 -0
- package/overlays/localstack/.env.example +6 -0
- package/overlays/localstack/README.md +188 -0
- package/overlays/localstack/devcontainer.patch.json +21 -0
- package/overlays/localstack/docker-compose.yml +25 -0
- package/overlays/localstack/overlay.yml +18 -0
- package/overlays/localstack/verify.sh +47 -0
- package/overlays/loki/overlay.yml +6 -1
- package/overlays/mailpit/.env.example +4 -0
- package/overlays/mailpit/README.md +191 -0
- package/overlays/mailpit/devcontainer.patch.json +20 -0
- package/overlays/mailpit/docker-compose.yml +17 -0
- package/overlays/mailpit/overlay.yml +26 -0
- package/overlays/mailpit/verify.sh +52 -0
- package/overlays/modern-cli-tools/overlay.yml +1 -0
- package/overlays/mongodb/overlay.yml +12 -2
- package/overlays/mysql/overlay.yml +12 -2
- package/overlays/nats/overlay.yml +12 -2
- package/overlays/ngrok/overlay.yml +2 -1
- package/overlays/openapi-tools/README.md +243 -0
- package/overlays/openapi-tools/devcontainer.patch.json +10 -0
- package/overlays/openapi-tools/overlay.yml +16 -0
- package/overlays/openapi-tools/setup.sh +45 -0
- package/overlays/openapi-tools/verify.sh +51 -0
- package/overlays/otel-collector/overlay.yml.example +26 -0
- package/overlays/postgres/overlay.yml +6 -1
- package/overlays/prometheus/overlay.yml +6 -1
- package/overlays/python/README.md +51 -35
- package/overlays/python/devcontainer.patch.json +7 -4
- package/overlays/python/setup.sh +50 -23
- package/overlays/python/verify.sh +29 -1
- package/overlays/rabbitmq/overlay.yml +12 -2
- package/overlays/redis/overlay.yml +6 -1
- package/overlays/tilt/README.md +259 -0
- package/overlays/tilt/devcontainer.patch.json +17 -0
- package/overlays/tilt/overlay.yml +19 -0
- package/overlays/tilt/setup.sh +25 -0
- package/overlays/tilt/verify.sh +24 -0
- package/package.json +8 -6
- package/tool/README.md +12 -16
- package/tool/schema/overlay-manifest.schema.json +64 -4
- package/tool/schema/superposition-manifest.schema.json +104 -0
- package/overlays/presets/web-api.yml +0 -109
- /package/overlays/{presets → .presets}/docs-site.yml +0 -0
- /package/overlays/{presets → .presets}/fullstack.yml +0 -0
|
@@ -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"}
|