container-superposition 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +843 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +1190 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/migrate-to-manifests.d.ts +12 -0
- package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
- package/dist/scripts/migrate-to-manifests.js +230 -0
- package/dist/scripts/migrate-to-manifests.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -0
- package/dist/tool/questionnaire/composer.d.ts.map +1 -0
- package/dist/tool/questionnaire/composer.js +1232 -0
- package/dist/tool/questionnaire/composer.js.map +1 -0
- package/dist/tool/readme/markdown-parser.d.ts +30 -0
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
- package/dist/tool/readme/markdown-parser.js +139 -0
- package/dist/tool/readme/markdown-parser.js.map +1 -0
- package/dist/tool/readme/readme-generator.d.ts +9 -0
- package/dist/tool/readme/readme-generator.d.ts.map +1 -0
- package/dist/tool/readme/readme-generator.js +422 -0
- package/dist/tool/readme/readme-generator.js.map +1 -0
- package/dist/tool/schema/custom-loader.d.ts +17 -0
- package/dist/tool/schema/custom-loader.d.ts.map +1 -0
- package/dist/tool/schema/custom-loader.js +149 -0
- package/dist/tool/schema/custom-loader.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +47 -0
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
- package/dist/tool/schema/overlay-loader.js +252 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -0
- package/dist/tool/schema/types.d.ts +212 -0
- package/dist/tool/schema/types.d.ts.map +1 -0
- package/dist/tool/schema/types.js +5 -0
- package/dist/tool/schema/types.js.map +1 -0
- package/docs/README.md +308 -0
- package/docs/architecture.md +233 -0
- package/docs/creating-overlays.md +549 -0
- package/docs/custom-patches.md +540 -0
- package/docs/dependencies.md +279 -0
- package/docs/examples/custom-patches-example.md +85 -0
- package/docs/examples.md +576 -0
- package/docs/messaging-comparison.md +265 -0
- package/docs/messaging-quick-start.md +385 -0
- package/docs/observability-workflow.md +537 -0
- package/docs/overlay-manifest-refactoring.md +214 -0
- package/docs/overlay-metadata-archive.md +54 -0
- package/docs/overlays.md +523 -0
- package/docs/presets-architecture.md +498 -0
- package/docs/presets.md +366 -0
- package/docs/publishing.md +476 -0
- package/docs/quick-reference.md +326 -0
- package/docs/ux.md +170 -0
- package/features/README.md +85 -0
- package/features/cross-distro-packages/README.md +146 -0
- package/features/cross-distro-packages/devcontainer-feature.json +20 -0
- package/features/cross-distro-packages/install.sh +58 -0
- package/features/local-secrets-manager/devcontainer-feature.json +18 -0
- package/features/local-secrets-manager/install.sh +127 -0
- package/features/project-scaffolder/devcontainer-feature.json +24 -0
- package/features/project-scaffolder/install.sh +100 -0
- package/features/team-conventions/devcontainer-feature.json +24 -0
- package/features/team-conventions/install.sh +93 -0
- package/overlays/.registry/README.md +14 -0
- package/overlays/.registry/base-images.yml +26 -0
- package/overlays/.registry/base-templates.yml +7 -0
- package/overlays/README.md +155 -0
- package/overlays/alertmanager/.env.example +5 -0
- package/overlays/alertmanager/README.md +465 -0
- package/overlays/alertmanager/alert-rules.yml +56 -0
- package/overlays/alertmanager/alertmanager.yml +42 -0
- package/overlays/alertmanager/devcontainer.patch.json +12 -0
- package/overlays/alertmanager/docker-compose.yml +20 -0
- package/overlays/alertmanager/overlay.yml +17 -0
- package/overlays/alertmanager/setup.sh +53 -0
- package/overlays/alertmanager/verify.sh +31 -0
- package/overlays/aws-cli/README.md +473 -0
- package/overlays/aws-cli/devcontainer.patch.json +13 -0
- package/overlays/aws-cli/overlay.yml +13 -0
- package/overlays/azure-cli/README.md +551 -0
- package/overlays/azure-cli/devcontainer.patch.json +8 -0
- package/overlays/azure-cli/overlay.yml +13 -0
- package/overlays/bun/README.md +312 -0
- package/overlays/bun/devcontainer.patch.json +41 -0
- package/overlays/bun/overlay.yml +16 -0
- package/overlays/bun/setup.sh +79 -0
- package/overlays/bun/verify.sh +30 -0
- package/overlays/codex/README.md +128 -0
- package/overlays/codex/devcontainer.patch.json +3 -0
- package/overlays/codex/overlay.yml +14 -0
- package/overlays/codex/setup.sh +24 -0
- package/overlays/codex/verify.sh +30 -0
- package/overlays/commitlint/README.md +333 -0
- package/overlays/commitlint/devcontainer.patch.json +8 -0
- package/overlays/commitlint/overlay.yml +16 -0
- package/overlays/commitlint/setup.sh +234 -0
- package/overlays/direnv/README.md +504 -0
- package/overlays/direnv/devcontainer.patch.json +6 -0
- package/overlays/direnv/overlay.yml +13 -0
- package/overlays/direnv/setup.sh +139 -0
- package/overlays/docker-in-docker/README.md +534 -0
- package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
- package/overlays/docker-in-docker/overlay.yml +13 -0
- package/overlays/docker-sock/README.md +256 -0
- package/overlays/docker-sock/devcontainer.patch.json +9 -0
- package/overlays/docker-sock/docker-compose.yml +8 -0
- package/overlays/docker-sock/overlay.yml +13 -0
- package/overlays/dotnet/README.md +147 -0
- package/overlays/dotnet/devcontainer.patch.json +51 -0
- package/overlays/dotnet/global-tools.txt +24 -0
- package/overlays/dotnet/overlay.yml +13 -0
- package/overlays/dotnet/setup.sh +51 -0
- package/overlays/dotnet/verify.sh +26 -0
- package/overlays/gcloud/README.md +269 -0
- package/overlays/gcloud/devcontainer.patch.json +14 -0
- package/overlays/gcloud/overlay.yml +14 -0
- package/overlays/gcloud/verify.sh +52 -0
- package/overlays/git-helpers/README.md +168 -0
- package/overlays/git-helpers/devcontainer.patch.json +33 -0
- package/overlays/git-helpers/overlay.yml +15 -0
- package/overlays/git-helpers/setup.sh +91 -0
- package/overlays/go/README.md +293 -0
- package/overlays/go/devcontainer.patch.json +43 -0
- package/overlays/go/overlay.yml +15 -0
- package/overlays/go/setup.sh +33 -0
- package/overlays/go/verify.sh +40 -0
- package/overlays/grafana/.env.example +9 -0
- package/overlays/grafana/README.md +462 -0
- package/overlays/grafana/dashboard-provider.yml +11 -0
- package/overlays/grafana/dashboards/observability-overview.json +263 -0
- package/overlays/grafana/devcontainer.patch.json +12 -0
- package/overlays/grafana/docker-compose.yml +27 -0
- package/overlays/grafana/grafana-datasources.yml +57 -0
- package/overlays/grafana/overlay.yml +21 -0
- package/overlays/grafana/verify.sh +34 -0
- package/overlays/jaeger/.env.example +7 -0
- package/overlays/jaeger/README.md +867 -0
- package/overlays/jaeger/devcontainer.patch.json +12 -0
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +19 -0
- package/overlays/java/README.md +267 -0
- package/overlays/java/devcontainer.patch.json +44 -0
- package/overlays/java/overlay.yml +16 -0
- package/overlays/java/setup.sh +41 -0
- package/overlays/java/verify.sh +42 -0
- package/overlays/just/README.md +443 -0
- package/overlays/just/devcontainer.patch.json +3 -0
- package/overlays/just/overlay.yml +13 -0
- package/overlays/just/setup.sh +182 -0
- package/overlays/kubectl-helm/README.md +660 -0
- package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
- package/overlays/kubectl-helm/overlay.yml +13 -0
- package/overlays/loki/.env.example +5 -0
- package/overlays/loki/README.md +1156 -0
- package/overlays/loki/devcontainer.patch.json +12 -0
- package/overlays/loki/docker-compose.yml +18 -0
- package/overlays/loki/loki-config.yaml +45 -0
- package/overlays/loki/overlay.yml +17 -0
- package/overlays/minio/.env.example +9 -0
- package/overlays/minio/README.md +639 -0
- package/overlays/minio/devcontainer.patch.json +30 -0
- package/overlays/minio/docker-compose.yml +28 -0
- package/overlays/minio/overlay.yml +18 -0
- package/overlays/minio/setup.sh +61 -0
- package/overlays/minio/verify.sh +64 -0
- package/overlays/mkdocs/README.md +309 -0
- package/overlays/mkdocs/devcontainer.patch.json +24 -0
- package/overlays/mkdocs/overlay.yml +15 -0
- package/overlays/modern-cli-tools/README.md +556 -0
- package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
- package/overlays/modern-cli-tools/overlay.yml +13 -0
- package/overlays/modern-cli-tools/setup.sh +153 -0
- package/overlays/mongodb/.env.example +9 -0
- package/overlays/mongodb/README.md +481 -0
- package/overlays/mongodb/devcontainer.patch.json +32 -0
- package/overlays/mongodb/docker-compose.yml +44 -0
- package/overlays/mongodb/overlay.yml +17 -0
- package/overlays/mongodb/verify.sh +48 -0
- package/overlays/mysql/.env.example +11 -0
- package/overlays/mysql/README.md +542 -0
- package/overlays/mysql/devcontainer.patch.json +34 -0
- package/overlays/mysql/docker-compose.yml +55 -0
- package/overlays/mysql/overlay.yml +16 -0
- package/overlays/mysql/verify.sh +48 -0
- package/overlays/nats/.env.example +5 -0
- package/overlays/nats/README.md +762 -0
- package/overlays/nats/devcontainer.patch.json +24 -0
- package/overlays/nats/docker-compose.yml +31 -0
- package/overlays/nats/overlay.yml +18 -0
- package/overlays/nats/verify.sh +50 -0
- package/overlays/ngrok/README.md +503 -0
- package/overlays/ngrok/devcontainer.patch.json +3 -0
- package/overlays/ngrok/overlay.yml +14 -0
- package/overlays/ngrok/setup.sh +125 -0
- package/overlays/nodejs/README.md +192 -0
- package/overlays/nodejs/devcontainer.patch.json +49 -0
- package/overlays/nodejs/global-packages.txt +16 -0
- package/overlays/nodejs/overlay.yml +14 -0
- package/overlays/nodejs/setup.sh +46 -0
- package/overlays/nodejs/verify.sh +32 -0
- package/overlays/otel-collector/.env.example +9 -0
- package/overlays/otel-collector/README.md +1257 -0
- package/overlays/otel-collector/devcontainer.patch.json +28 -0
- package/overlays/otel-collector/docker-compose.yml +22 -0
- package/overlays/otel-collector/otel-collector-config.yaml +68 -0
- package/overlays/otel-collector/overlay.yml +21 -0
- package/overlays/otel-collector/setup.sh +49 -0
- package/overlays/otel-demo-nodejs/.env.example +2 -0
- package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
- package/overlays/otel-demo-nodejs/README.md +409 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
- package/overlays/otel-demo-nodejs/overlay.yml +23 -0
- package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
- package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
- package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
- package/overlays/otel-demo-nodejs/verify.sh +31 -0
- package/overlays/otel-demo-python/.env.example +2 -0
- package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
- package/overlays/otel-demo-python/README.md +82 -0
- package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
- package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-python/docker-compose.yml +19 -0
- package/overlays/otel-demo-python/overlay.yml +23 -0
- package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
- package/overlays/otel-demo-python/verify.sh +31 -0
- package/overlays/playwright/README.md +629 -0
- package/overlays/playwright/devcontainer.patch.json +9 -0
- package/overlays/playwright/overlay.yml +13 -0
- package/overlays/postgres/.env.example +6 -0
- package/overlays/postgres/README.md +602 -0
- package/overlays/postgres/devcontainer.patch.json +21 -0
- package/overlays/postgres/docker-compose.yml +22 -0
- package/overlays/postgres/overlay.yml +15 -0
- package/overlays/postgres/verify.sh +45 -0
- package/overlays/powershell/README.md +314 -0
- package/overlays/powershell/devcontainer.patch.json +22 -0
- package/overlays/powershell/overlay.yml +13 -0
- package/overlays/powershell/setup.sh +29 -0
- package/overlays/powershell/verify.sh +38 -0
- package/overlays/pre-commit/README.md +263 -0
- package/overlays/pre-commit/devcontainer.patch.json +9 -0
- package/overlays/pre-commit/overlay.yml +16 -0
- package/overlays/pre-commit/setup.sh +129 -0
- package/overlays/presets/docs-site.yml +118 -0
- package/overlays/presets/fullstack.yml +181 -0
- package/overlays/presets/microservice.yml +118 -0
- package/overlays/presets/web-api.yml +109 -0
- package/overlays/prometheus/.env.example +5 -0
- package/overlays/prometheus/README.md +1246 -0
- package/overlays/prometheus/devcontainer.patch.json +12 -0
- package/overlays/prometheus/docker-compose.yml +22 -0
- package/overlays/prometheus/overlay.yml +17 -0
- package/overlays/prometheus/prometheus.yml +12 -0
- package/overlays/prometheus/verify.sh +34 -0
- package/overlays/promtail/.env.example +2 -0
- package/overlays/promtail/README.md +357 -0
- package/overlays/promtail/devcontainer.patch.json +5 -0
- package/overlays/promtail/docker-compose.yml +16 -0
- package/overlays/promtail/overlay.yml +17 -0
- package/overlays/promtail/promtail-config.yaml +60 -0
- package/overlays/promtail/verify.sh +31 -0
- package/overlays/pulumi/README.md +472 -0
- package/overlays/pulumi/devcontainer.patch.json +13 -0
- package/overlays/pulumi/overlay.yml +14 -0
- package/overlays/pulumi/verify.sh +31 -0
- package/overlays/python/README.md +919 -0
- package/overlays/python/devcontainer.patch.json +41 -0
- package/overlays/python/overlay.yml +12 -0
- package/overlays/python/requirements-overlay.txt +13 -0
- package/overlays/python/setup.sh +47 -0
- package/overlays/python/verify.sh +32 -0
- package/overlays/rabbitmq/.env.example +7 -0
- package/overlays/rabbitmq/README.md +680 -0
- package/overlays/rabbitmq/devcontainer.patch.json +28 -0
- package/overlays/rabbitmq/docker-compose.yml +30 -0
- package/overlays/rabbitmq/overlay.yml +18 -0
- package/overlays/rabbitmq/verify.sh +41 -0
- package/overlays/redis/.env.example +4 -0
- package/overlays/redis/README.md +776 -0
- package/overlays/redis/devcontainer.patch.json +21 -0
- package/overlays/redis/docker-compose.yml +21 -0
- package/overlays/redis/overlay.yml +15 -0
- package/overlays/redis/verify.sh +41 -0
- package/overlays/redpanda/.env.example +10 -0
- package/overlays/redpanda/README.md +703 -0
- package/overlays/redpanda/devcontainer.patch.json +37 -0
- package/overlays/redpanda/docker-compose.yml +67 -0
- package/overlays/redpanda/overlay.yml +21 -0
- package/overlays/redpanda/verify.sh +48 -0
- package/overlays/rust/README.md +299 -0
- package/overlays/rust/devcontainer.patch.json +39 -0
- package/overlays/rust/overlay.yml +15 -0
- package/overlays/rust/setup.sh +36 -0
- package/overlays/rust/verify.sh +51 -0
- package/overlays/sqlite/README.md +584 -0
- package/overlays/sqlite/devcontainer.patch.json +14 -0
- package/overlays/sqlite/overlay.yml +15 -0
- package/overlays/sqlite/setup.sh +27 -0
- package/overlays/sqlite/verify.sh +43 -0
- package/overlays/sqlserver/.env.example +6 -0
- package/overlays/sqlserver/README.md +592 -0
- package/overlays/sqlserver/devcontainer.patch.json +22 -0
- package/overlays/sqlserver/docker-compose.yml +32 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/sqlserver/verify.sh +30 -0
- package/overlays/tempo/.env.example +5 -0
- package/overlays/tempo/README.md +273 -0
- package/overlays/tempo/devcontainer.patch.json +12 -0
- package/overlays/tempo/docker-compose.yml +20 -0
- package/overlays/tempo/overlay.yml +20 -0
- package/overlays/tempo/tempo-config.yaml +32 -0
- package/overlays/tempo/verify.sh +31 -0
- package/overlays/terraform/README.md +389 -0
- package/overlays/terraform/devcontainer.patch.json +15 -0
- package/overlays/terraform/overlay.yml +14 -0
- package/overlays/terraform/verify.sh +63 -0
- package/package.json +74 -0
- package/templates/README.md +285 -0
- package/templates/compose/.devcontainer/devcontainer.json +46 -0
- package/templates/compose/.devcontainer/docker-compose.yml +12 -0
- package/templates/compose/README.md +20 -0
- package/templates/plain/.devcontainer/devcontainer.json +35 -0
- package/templates/plain/README.md +21 -0
- package/tool/README.md +281 -0
- package/tool/schema/base-images.schema.json +43 -0
- package/tool/schema/base-templates.schema.json +34 -0
- package/tool/schema/config.schema.json +71 -0
- package/tool/schema/overlay-manifest.schema.json +86 -0
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
# Presets Architecture
|
|
2
|
+
|
|
3
|
+
This document describes the design and architecture of the presets system (meta-overlays) in Container Superposition.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Presets are **meta-overlays** that represent pre-configured combinations of overlays for common development scenarios. They provide:
|
|
8
|
+
|
|
9
|
+
- **Faster onboarding** - Complete stacks ready in seconds
|
|
10
|
+
- **Best practices** - Sensible defaults and proper service integration
|
|
11
|
+
- **Flexibility** - Full customization after preset selection
|
|
12
|
+
- **Education** - Learn from working examples
|
|
13
|
+
|
|
14
|
+
## Architecture
|
|
15
|
+
|
|
16
|
+
### Core Concepts
|
|
17
|
+
|
|
18
|
+
1. **Meta-Overlay**: A special type of overlay that selects other overlays rather than adding features directly
|
|
19
|
+
2. **User Choices**: Interactive prompts within a preset for customization (e.g., language selection)
|
|
20
|
+
3. **Glue Configuration**: Environment variables and configuration that wire services together
|
|
21
|
+
4. **Preset Expansion**: The process of converting a preset selection into concrete overlay selections
|
|
22
|
+
|
|
23
|
+
### Type System
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
interface MetaOverlay {
|
|
27
|
+
// Basic metadata (inherited from Overlay)
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
type: 'meta';
|
|
32
|
+
category: 'preset';
|
|
33
|
+
|
|
34
|
+
// Preset-specific configuration
|
|
35
|
+
selects: {
|
|
36
|
+
// Always-included overlays
|
|
37
|
+
required: string[];
|
|
38
|
+
|
|
39
|
+
// Interactive user choices
|
|
40
|
+
userChoice?: Record<string, PresetUserChoice>;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Service integration configuration
|
|
44
|
+
glueConfig?: PresetGlueConfig;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface PresetUserChoice {
|
|
48
|
+
id: string;
|
|
49
|
+
prompt: string;
|
|
50
|
+
options: string[];
|
|
51
|
+
defaultOption?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
interface PresetGlueConfig {
|
|
55
|
+
// Environment variables for service integration
|
|
56
|
+
environment?: Record<string, string>;
|
|
57
|
+
|
|
58
|
+
// Suggested port mappings
|
|
59
|
+
portMappings?: Record<string, number>;
|
|
60
|
+
|
|
61
|
+
// Usage guide for generated environment
|
|
62
|
+
readme?: string;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Preset File Structure
|
|
67
|
+
|
|
68
|
+
Presets are defined in `overlays/presets/` with YAML files:
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
# overlays/presets/web-api.yml
|
|
72
|
+
id: web-api
|
|
73
|
+
name: Web API Stack
|
|
74
|
+
description: Full-stack web API with database, cache, and observability
|
|
75
|
+
type: meta
|
|
76
|
+
category: preset
|
|
77
|
+
supports: [compose]
|
|
78
|
+
tags: [preset, web, api, database]
|
|
79
|
+
|
|
80
|
+
selects:
|
|
81
|
+
# Always included
|
|
82
|
+
required:
|
|
83
|
+
- postgres
|
|
84
|
+
- redis
|
|
85
|
+
- otel-collector
|
|
86
|
+
- prometheus
|
|
87
|
+
- grafana
|
|
88
|
+
- loki
|
|
89
|
+
|
|
90
|
+
# User chooses language
|
|
91
|
+
userChoice:
|
|
92
|
+
language:
|
|
93
|
+
id: language
|
|
94
|
+
prompt: 'Select your backend language'
|
|
95
|
+
options: [dotnet, nodejs, python, go, java]
|
|
96
|
+
defaultOption: nodejs
|
|
97
|
+
|
|
98
|
+
glueConfig:
|
|
99
|
+
environment:
|
|
100
|
+
DATABASE_URL: 'postgresql://postgres:postgres@postgres:5432/app'
|
|
101
|
+
REDIS_URL: 'redis://redis:6379'
|
|
102
|
+
OTEL_EXPORTER_OTLP_ENDPOINT: 'http://otel-collector:4318'
|
|
103
|
+
|
|
104
|
+
portMappings:
|
|
105
|
+
api: 8000
|
|
106
|
+
grafana: 3000
|
|
107
|
+
|
|
108
|
+
readme: |
|
|
109
|
+
# Web API Stack
|
|
110
|
+
|
|
111
|
+
Your API service should expose port 8000.
|
|
112
|
+
|
|
113
|
+
## Services
|
|
114
|
+
- Grafana: http://localhost:3000 (admin/admin)
|
|
115
|
+
- PostgreSQL: localhost:5432
|
|
116
|
+
- Redis: localhost:6379
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Composition Flow
|
|
120
|
+
|
|
121
|
+
The preset system integrates into the existing composition pipeline:
|
|
122
|
+
|
|
123
|
+
```txt
|
|
124
|
+
1. User selects preset (or chooses custom)
|
|
125
|
+
↓
|
|
126
|
+
2. Preset presents user choices (if any)
|
|
127
|
+
↓
|
|
128
|
+
3. Preset expands to overlay list
|
|
129
|
+
↓
|
|
130
|
+
4. Optional: User can customize overlay selection
|
|
131
|
+
↓
|
|
132
|
+
5. Dependency resolution runs
|
|
133
|
+
↓
|
|
134
|
+
6. Conflict detection runs
|
|
135
|
+
↓
|
|
136
|
+
7. Normal overlay composition
|
|
137
|
+
↓
|
|
138
|
+
8. Glue configuration applied
|
|
139
|
+
↓
|
|
140
|
+
9. Preset README generated
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Integration Points
|
|
144
|
+
|
|
145
|
+
#### 1. Questionnaire (scripts/init.ts)
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// 1. Preset selection
|
|
149
|
+
const mode = await select({
|
|
150
|
+
message: 'How would you like to start?',
|
|
151
|
+
choices: [
|
|
152
|
+
{ value: 'preset', name: 'Start from preset' },
|
|
153
|
+
{ value: 'custom', name: 'Custom configuration' },
|
|
154
|
+
],
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
if (mode === 'preset') {
|
|
158
|
+
// 2. Load preset
|
|
159
|
+
const preset = await loadPreset(presetId);
|
|
160
|
+
|
|
161
|
+
// 3. Handle user choices
|
|
162
|
+
for (const [key, choice] of Object.entries(preset.selects.userChoice)) {
|
|
163
|
+
const answer = await select({
|
|
164
|
+
message: choice.prompt,
|
|
165
|
+
choices: choice.options,
|
|
166
|
+
default: choice.defaultOption,
|
|
167
|
+
});
|
|
168
|
+
answers.presetChoices[key] = answer;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// 4. Expand preset to overlays
|
|
172
|
+
const selectedOverlays = [...preset.selects.required, ...Object.values(answers.presetChoices)];
|
|
173
|
+
|
|
174
|
+
// 5. Optional customization
|
|
175
|
+
const customize = await confirm({
|
|
176
|
+
message: 'Customize overlay selection?',
|
|
177
|
+
default: false,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
#### 2. Composer (tool/questionnaire/composer.ts)
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// Apply glue configuration after all overlays
|
|
186
|
+
async function applyGlueConfig(glueConfig: PresetGlueConfig, envPath: string, outputPath: string) {
|
|
187
|
+
// 1. Inject environment variables
|
|
188
|
+
if (glueConfig.environment) {
|
|
189
|
+
const envContent = [];
|
|
190
|
+
envContent.push('# Preset Configuration');
|
|
191
|
+
for (const [key, value] of Object.entries(glueConfig.environment)) {
|
|
192
|
+
envContent.push(`${key}=${value}`);
|
|
193
|
+
}
|
|
194
|
+
await fs.promises.appendFile(envPath, envContent.join('\n'));
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 2. Log port mappings
|
|
198
|
+
if (glueConfig.portMappings) {
|
|
199
|
+
console.log('Suggested port mappings:');
|
|
200
|
+
for (const [service, port] of Object.entries(glueConfig.portMappings)) {
|
|
201
|
+
console.log(` ${service}: ${port}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// 3. Generate preset README
|
|
206
|
+
if (glueConfig.readme) {
|
|
207
|
+
await fs.promises.writeFile(path.join(outputPath, 'PRESET-README.md'), glueConfig.readme);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
#### 3. Manifest (superposition.json)
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"version": "0.1.0",
|
|
217
|
+
"generatedAt": "2026-02-08T10:00:00Z",
|
|
218
|
+
"baseTemplate": "compose",
|
|
219
|
+
|
|
220
|
+
"preset": "web-api",
|
|
221
|
+
"presetChoices": {
|
|
222
|
+
"language": "nodejs"
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
"overlays": ["nodejs", "postgres", "redis", "otel-collector", "prometheus", "grafana", "loki"]
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Preset Design Patterns
|
|
230
|
+
|
|
231
|
+
### 1. Full-Stack Preset
|
|
232
|
+
|
|
233
|
+
Includes frontend, backend, data, and observability layers:
|
|
234
|
+
|
|
235
|
+
```yaml
|
|
236
|
+
selects:
|
|
237
|
+
required:
|
|
238
|
+
- nodejs # Frontend
|
|
239
|
+
- postgres # Database
|
|
240
|
+
- redis # Cache
|
|
241
|
+
- minio # Object storage
|
|
242
|
+
- otel-collector # Observability
|
|
243
|
+
- prometheus
|
|
244
|
+
- grafana
|
|
245
|
+
- loki
|
|
246
|
+
|
|
247
|
+
userChoice:
|
|
248
|
+
backend:
|
|
249
|
+
prompt: 'Select backend language'
|
|
250
|
+
options: [dotnet, python, go, java]
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### 2. Microservices Preset
|
|
254
|
+
|
|
255
|
+
Focuses on service-to-service communication:
|
|
256
|
+
|
|
257
|
+
```yaml
|
|
258
|
+
selects:
|
|
259
|
+
required:
|
|
260
|
+
- otel-collector
|
|
261
|
+
- jaeger
|
|
262
|
+
- prometheus
|
|
263
|
+
- grafana
|
|
264
|
+
|
|
265
|
+
userChoice:
|
|
266
|
+
language:
|
|
267
|
+
options: [dotnet, nodejs, python, go, java]
|
|
268
|
+
messaging:
|
|
269
|
+
prompt: 'Select message broker'
|
|
270
|
+
options: [rabbitmq, redpanda, nats]
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### 3. Documentation Preset
|
|
274
|
+
|
|
275
|
+
Single-purpose, no user choices:
|
|
276
|
+
|
|
277
|
+
```yaml
|
|
278
|
+
selects:
|
|
279
|
+
required:
|
|
280
|
+
- mkdocs
|
|
281
|
+
- pre-commit
|
|
282
|
+
- modern-cli-tools
|
|
283
|
+
|
|
284
|
+
# No user choices - fully pre-configured
|
|
285
|
+
|
|
286
|
+
glueConfig:
|
|
287
|
+
readme: |
|
|
288
|
+
# Documentation Site
|
|
289
|
+
|
|
290
|
+
Run: mkdocs serve
|
|
291
|
+
Build: mkdocs build
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Glue Configuration Design
|
|
295
|
+
|
|
296
|
+
### Purpose
|
|
297
|
+
|
|
298
|
+
Glue configuration solves the "integration gap" where users must:
|
|
299
|
+
|
|
300
|
+
1. Know service hostnames (e.g., `postgres` not `localhost`)
|
|
301
|
+
2. Configure connection strings
|
|
302
|
+
3. Set up environment variables
|
|
303
|
+
4. Understand port mappings
|
|
304
|
+
|
|
305
|
+
### Environment Variables
|
|
306
|
+
|
|
307
|
+
**Pattern**: Pre-configured connection strings using service names
|
|
308
|
+
|
|
309
|
+
```yaml
|
|
310
|
+
glueConfig:
|
|
311
|
+
environment:
|
|
312
|
+
# Database
|
|
313
|
+
DATABASE_URL: 'postgresql://postgres:postgres@postgres:5432/app'
|
|
314
|
+
POSTGRES_HOST: 'postgres'
|
|
315
|
+
POSTGRES_PORT: '5432'
|
|
316
|
+
|
|
317
|
+
# Cache
|
|
318
|
+
REDIS_URL: 'redis://redis:6379'
|
|
319
|
+
|
|
320
|
+
# Messaging
|
|
321
|
+
RABBITMQ_URL: 'amqp://guest:guest@rabbitmq:5672'
|
|
322
|
+
|
|
323
|
+
# Observability
|
|
324
|
+
OTEL_EXPORTER_OTLP_ENDPOINT: 'http://otel-collector:4318'
|
|
325
|
+
JAEGER_AGENT_HOST: 'jaeger'
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Implementation**: Appended to `.env.example` with clear section marker:
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
# Preset Configuration
|
|
332
|
+
DATABASE_URL=postgresql://postgres:postgres@postgres:5432/app
|
|
333
|
+
REDIS_URL=redis://redis:6379
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Port Mappings
|
|
337
|
+
|
|
338
|
+
**Pattern**: Informational suggestions for service exposure
|
|
339
|
+
|
|
340
|
+
```yaml
|
|
341
|
+
glueConfig:
|
|
342
|
+
portMappings:
|
|
343
|
+
api: 8000
|
|
344
|
+
grafana: 3000
|
|
345
|
+
jaeger: 16686
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**Purpose**: Help users understand:
|
|
349
|
+
|
|
350
|
+
- Which ports their application should use
|
|
351
|
+
- Where to access web UIs
|
|
352
|
+
- How services are exposed to the host
|
|
353
|
+
|
|
354
|
+
### README Generation
|
|
355
|
+
|
|
356
|
+
**Pattern**: Quick-start guide for the generated environment
|
|
357
|
+
|
|
358
|
+
```yaml
|
|
359
|
+
glueConfig:
|
|
360
|
+
readme: |
|
|
361
|
+
# [Preset Name]
|
|
362
|
+
|
|
363
|
+
## Services
|
|
364
|
+
- [Service 1]: [URL] ([credentials])
|
|
365
|
+
- [Service 2]: [URL]
|
|
366
|
+
|
|
367
|
+
## Connection Strings
|
|
368
|
+
See .env.example for pre-configured values.
|
|
369
|
+
|
|
370
|
+
## Quick Start
|
|
371
|
+
1. [Step 1]
|
|
372
|
+
2. [Step 2]
|
|
373
|
+
|
|
374
|
+
## Next Steps
|
|
375
|
+
- [Suggestion 1]
|
|
376
|
+
- [Suggestion 2]
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
**Output**: `PRESET-README.md` in project root alongside `superposition.json`
|
|
380
|
+
|
|
381
|
+
## Dependency Resolution
|
|
382
|
+
|
|
383
|
+
Presets participate in normal dependency resolution:
|
|
384
|
+
|
|
385
|
+
1. **Preset overlays expand** before dependency resolution
|
|
386
|
+
2. **Dependencies auto-added** for all preset overlays
|
|
387
|
+
3. **Conflicts detected** across all selected overlays
|
|
388
|
+
4. **User resolves conflicts** same as custom configuration
|
|
389
|
+
|
|
390
|
+
**Example:**
|
|
391
|
+
|
|
392
|
+
```yaml
|
|
393
|
+
# Preset selects grafana
|
|
394
|
+
selects:
|
|
395
|
+
required:
|
|
396
|
+
- grafana
|
|
397
|
+
|
|
398
|
+
# Grafana requires prometheus
|
|
399
|
+
# overlays/index.yml
|
|
400
|
+
- id: grafana
|
|
401
|
+
requires: [prometheus]
|
|
402
|
+
|
|
403
|
+
# Result: Both grafana AND prometheus included
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## Extensibility
|
|
407
|
+
|
|
408
|
+
### Adding New Presets
|
|
409
|
+
|
|
410
|
+
1. **Create YAML file** in `overlays/presets/`
|
|
411
|
+
2. **Register in** `overlays/index.yml`
|
|
412
|
+
3. **No code changes needed** (declarative system)
|
|
413
|
+
|
|
414
|
+
**Validation**:
|
|
415
|
+
|
|
416
|
+
- Schema defined in `tool/schema/types.ts`
|
|
417
|
+
- Tests in `tool/__tests__/presets.test.ts`
|
|
418
|
+
|
|
419
|
+
### Custom User Choices
|
|
420
|
+
|
|
421
|
+
User choices can select from any overlay in the same category:
|
|
422
|
+
|
|
423
|
+
```yaml
|
|
424
|
+
userChoice:
|
|
425
|
+
language:
|
|
426
|
+
prompt: 'Select language'
|
|
427
|
+
options: [dotnet, nodejs, python, go, java, rust]
|
|
428
|
+
|
|
429
|
+
database:
|
|
430
|
+
prompt: 'Select database'
|
|
431
|
+
options: [postgres, mysql, mongodb, sqlserver]
|
|
432
|
+
|
|
433
|
+
messaging:
|
|
434
|
+
prompt: 'Select message broker'
|
|
435
|
+
options: [rabbitmq, redpanda, nats]
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
## Benefits
|
|
439
|
+
|
|
440
|
+
### For New Users
|
|
441
|
+
|
|
442
|
+
- **Lower barrier to entry** - Don't need to know all overlays
|
|
443
|
+
- **Proven configurations** - Working examples to learn from
|
|
444
|
+
- **Faster success** - Complete stack in seconds
|
|
445
|
+
|
|
446
|
+
### For Power Users
|
|
447
|
+
|
|
448
|
+
- **Starting points** - Customize presets rather than start from scratch
|
|
449
|
+
- **Consistency** - Team-wide standard configurations
|
|
450
|
+
- **Time savings** - Common patterns codified
|
|
451
|
+
|
|
452
|
+
### For Maintainers
|
|
453
|
+
|
|
454
|
+
- **Best practices** - Demonstrate proper overlay combinations
|
|
455
|
+
- **Reduced support** - Fewer "how do I configure X?" questions
|
|
456
|
+
- **Showcase features** - Highlight observability, glue config, etc.
|
|
457
|
+
|
|
458
|
+
## Limitations and Trade-offs
|
|
459
|
+
|
|
460
|
+
### Current Limitations
|
|
461
|
+
|
|
462
|
+
1. **CLI mode**: Presets not directly accessible via `--preset` flag (planned)
|
|
463
|
+
2. **Interactive only**: Requires TTY for user choices
|
|
464
|
+
3. **No validation**: Preset YAML files not schema-validated (yet)
|
|
465
|
+
|
|
466
|
+
### Design Trade-offs
|
|
467
|
+
|
|
468
|
+
1. **Flexibility vs Simplicity**: Presets add complexity but solve real onboarding problems
|
|
469
|
+
2. **Opinionated vs Flexible**: Presets are opinionated but remain fully customizable
|
|
470
|
+
3. **Maintenance burden**: More presets = more to maintain (balanced by declarative YAML)
|
|
471
|
+
|
|
472
|
+
## Future Enhancements
|
|
473
|
+
|
|
474
|
+
### CLI Preset Support
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
container-superposition --preset web-api --preset-choice language=nodejs
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### More Presets
|
|
481
|
+
|
|
482
|
+
- **data-science**: Python, Jupyter, visualization
|
|
483
|
+
- **mobile-backend**: Auth, storage, push notifications
|
|
484
|
+
- **iot**: MQTT, time-series database, edge computing
|
|
485
|
+
- **ml-training**: GPU support, frameworks, experiment tracking
|
|
486
|
+
|
|
487
|
+
### Preset Marketplace
|
|
488
|
+
|
|
489
|
+
- Community-contributed presets
|
|
490
|
+
- Preset discovery and search
|
|
491
|
+
- Rating and versioning
|
|
492
|
+
|
|
493
|
+
## See Also
|
|
494
|
+
|
|
495
|
+
- [Presets User Guide](presets.md) - User-facing documentation
|
|
496
|
+
- [Overlay Index](../overlays/index.yml) - Preset registrations
|
|
497
|
+
- [Creating Overlays](creating-overlays.md) - How to create presets
|
|
498
|
+
- [Dependencies](dependencies.md) - Dependency resolution system
|