container-superposition 0.1.8 → 0.1.10

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 (184) hide show
  1. package/README.md +3 -0
  2. package/dist/tool/cli/args.d.ts.map +1 -1
  3. package/dist/tool/cli/args.js +1 -1
  4. package/dist/tool/cli/args.js.map +1 -1
  5. package/dist/tool/commands/adopt.d.ts.map +1 -1
  6. package/dist/tool/commands/adopt.js +15 -21
  7. package/dist/tool/commands/adopt.js.map +1 -1
  8. package/dist/tool/commands/doctor.d.ts +1 -0
  9. package/dist/tool/commands/doctor.d.ts.map +1 -1
  10. package/dist/tool/commands/doctor.js +1370 -73
  11. package/dist/tool/commands/doctor.js.map +1 -1
  12. package/dist/tool/questionnaire/composer.d.ts +3 -1
  13. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  14. package/dist/tool/questionnaire/composer.js +273 -20
  15. package/dist/tool/questionnaire/composer.js.map +1 -1
  16. package/dist/tool/questionnaire/presets.d.ts.map +1 -1
  17. package/dist/tool/questionnaire/presets.js +1 -0
  18. package/dist/tool/questionnaire/presets.js.map +1 -1
  19. package/dist/tool/questionnaire/questionnaire.d.ts.map +1 -1
  20. package/dist/tool/questionnaire/questionnaire.js +3 -1
  21. package/dist/tool/questionnaire/questionnaire.js.map +1 -1
  22. package/dist/tool/schema/project-config.d.ts.map +1 -1
  23. package/dist/tool/schema/project-config.js +174 -1
  24. package/dist/tool/schema/project-config.js.map +1 -1
  25. package/dist/tool/schema/types.d.ts +53 -2
  26. package/dist/tool/schema/types.d.ts.map +1 -1
  27. package/docs/README.md +1 -0
  28. package/docs/overlays.md +188 -147
  29. package/docs/specs/001-verbose-plan-graph/spec.md +5 -12
  30. package/docs/specs/002-superposition-config-file/spec.md +5 -12
  31. package/docs/specs/003-mkdocs2-overlay/spec.md +2 -9
  32. package/docs/specs/004-doctor-fix/spec.md +1 -8
  33. package/docs/specs/005-cuda-overlay/spec.md +2 -9
  34. package/docs/specs/006-rocm-overlay/spec.md +3 -10
  35. package/docs/specs/007-target-aware-generation/spec.md +4 -11
  36. package/docs/specs/008-project-file-canonical/spec.md +7 -8
  37. package/docs/specs/009-project-env/spec.md +3 -10
  38. package/docs/specs/010-compose-env-materialization/spec.md +3 -10
  39. package/docs/specs/011-overlay-parameters/spec.md +2 -9
  40. package/docs/specs/012-ollama-cli-overlay/spec.md +47 -0
  41. package/docs/specs/013-doctor-dependency-check/spec.md +250 -0
  42. package/docs/specs/014-doctor-compose-port-cross-validation/spec.md +276 -0
  43. package/docs/specs/015-doctor-env-example-drift/spec.md +248 -0
  44. package/docs/specs/016-doctor-reproducibility-check/spec.md +276 -0
  45. package/docs/specs/017-doctor-dry-run/spec.md +276 -0
  46. package/docs/specs/{007-init-project-file → 018-init-project-file}/spec.md +2 -9
  47. package/docs/specs/019-project-mounts/spec.md +176 -0
  48. package/docs/specs/taxonomy.md +186 -0
  49. package/docs/superposition-yml.md +467 -0
  50. package/overlays/.presets/full-observability.yml +113 -0
  51. package/overlays/.presets/k8s-dev.yml +174 -0
  52. package/overlays/.presets/local-llm.yml +105 -0
  53. package/overlays/.presets/vector-ai.yml +150 -0
  54. package/overlays/.shared/vscode/js-ts-settings.json +19 -0
  55. package/overlays/.shared/vscode/markdown-extensions.json +8 -0
  56. package/overlays/alertmanager/devcontainer.patch.json +0 -1
  57. package/overlays/alertmanager/docker-compose.yml +8 -0
  58. package/overlays/alertmanager/overlay.yml +1 -0
  59. package/overlays/amp/devcontainer.patch.json +4 -1
  60. package/overlays/ansible/README.md +163 -0
  61. package/overlays/ansible/devcontainer.patch.json +14 -0
  62. package/overlays/ansible/overlay.yml +18 -0
  63. package/overlays/argocd/README.md +158 -0
  64. package/overlays/argocd/devcontainer.patch.json +9 -0
  65. package/overlays/argocd/overlay.yml +17 -0
  66. package/overlays/argocd/setup.sh +29 -0
  67. package/overlays/argocd/verify.sh +14 -0
  68. package/overlays/bun/devcontainer.patch.json +1 -10
  69. package/overlays/bun/overlay.yml +8 -1
  70. package/overlays/claude-code/devcontainer.patch.json +6 -1
  71. package/overlays/codex/devcontainer.patch.json +5 -0
  72. package/overlays/comfyui/docker-compose.yml +1 -0
  73. package/overlays/comfyui/overlay.yml +4 -0
  74. package/overlays/commitlint/devcontainer.patch.json +1 -6
  75. package/overlays/docker-sock/overlay.yml +1 -0
  76. package/overlays/dotnet/overlay.yml +4 -1
  77. package/overlays/fuseki/.env.example +5 -0
  78. package/overlays/fuseki/README.md +173 -0
  79. package/overlays/fuseki/devcontainer.patch.json +18 -0
  80. package/overlays/fuseki/docker-compose.yml +29 -0
  81. package/overlays/fuseki/overlay.yml +42 -0
  82. package/overlays/fuseki/verify.sh +58 -0
  83. package/overlays/gemini-cli/devcontainer.patch.json +4 -1
  84. package/overlays/go/overlay.yml +6 -1
  85. package/overlays/grafana/devcontainer.patch.json +0 -1
  86. package/overlays/grafana/docker-compose.yml +8 -2
  87. package/overlays/grafana/overlay.yml +6 -1
  88. package/overlays/jaeger/.env.example +11 -0
  89. package/overlays/jaeger/README.md +33 -4
  90. package/overlays/jaeger/devcontainer.patch.json +9 -1
  91. package/overlays/jaeger/docker-compose.yml +17 -0
  92. package/overlays/jaeger/overlay.yml +1 -12
  93. package/overlays/java/overlay.yml +6 -1
  94. package/overlays/jupyter/docker-compose.yml +1 -0
  95. package/overlays/jupyter/overlay.yml +1 -0
  96. package/overlays/keycloak/devcontainer.patch.json +0 -1
  97. package/overlays/keycloak/docker-compose.yml +1 -0
  98. package/overlays/keycloak/overlay.yml +15 -0
  99. package/overlays/localstack/docker-compose.yml +1 -0
  100. package/overlays/localstack/overlay.yml +19 -1
  101. package/overlays/loki/devcontainer.patch.json +0 -1
  102. package/overlays/loki/docker-compose.yml +8 -0
  103. package/overlays/loki/overlay.yml +1 -0
  104. package/overlays/mailpit/docker-compose.yml +1 -0
  105. package/overlays/mailpit/overlay.yml +1 -0
  106. package/overlays/minio/devcontainer.patch.json +1 -1
  107. package/overlays/minio/docker-compose.yml +1 -0
  108. package/overlays/minio/overlay.yml +23 -2
  109. package/overlays/mkdocs/devcontainer.patch.json +1 -5
  110. package/overlays/mkdocs/overlay.yml +3 -1
  111. package/overlays/mkdocs2/devcontainer.patch.json +1 -5
  112. package/overlays/mkdocs2/overlay.yml +2 -0
  113. package/overlays/mongodb/docker-compose.yml +2 -0
  114. package/overlays/mongodb/overlay.yml +26 -2
  115. package/overlays/mysql/docker-compose.yml +2 -0
  116. package/overlays/mysql/overlay.yml +36 -2
  117. package/overlays/nats/docker-compose.yml +1 -0
  118. package/overlays/nats/overlay.yml +18 -2
  119. package/overlays/nodejs/devcontainer.patch.json +1 -12
  120. package/overlays/nodejs/overlay.yml +8 -1
  121. package/overlays/ollama/README.md +4 -3
  122. package/overlays/ollama/docker-compose.yml +1 -0
  123. package/overlays/ollama/overlay.yml +6 -1
  124. package/overlays/ollama/verify.sh +5 -28
  125. package/overlays/ollama-cli/README.md +90 -0
  126. package/overlays/ollama-cli/devcontainer.patch.json +3 -0
  127. package/overlays/ollama-cli/overlay.yml +19 -0
  128. package/overlays/{ollama → ollama-cli}/setup.sh +7 -10
  129. package/overlays/ollama-cli/verify.sh +49 -0
  130. package/overlays/open-webui/docker-compose.yml +1 -0
  131. package/overlays/open-webui/overlay.yml +8 -1
  132. package/overlays/opencode/devcontainer.patch.json +4 -1
  133. package/overlays/otel-collector/README.md +4 -0
  134. package/overlays/otel-collector/devcontainer.patch.json +4 -1
  135. package/overlays/otel-collector/docker-compose.yml +8 -4
  136. package/overlays/otel-collector/overlay.yml +1 -0
  137. package/overlays/otel-demo-nodejs/devcontainer.patch.json +0 -1
  138. package/overlays/otel-demo-nodejs/docker-compose.yml +1 -0
  139. package/overlays/otel-demo-nodejs/overlay.yml +9 -1
  140. package/overlays/otel-demo-python/devcontainer.patch.json +0 -1
  141. package/overlays/otel-demo-python/docker-compose.yml +1 -0
  142. package/overlays/otel-demo-python/overlay.yml +6 -1
  143. package/overlays/pandoc/README.md +10 -0
  144. package/overlays/pandoc/devcontainer.patch.json +0 -5
  145. package/overlays/pandoc/overlay.yml +2 -0
  146. package/overlays/pandoc/setup.sh +10 -0
  147. package/overlays/pgvector/devcontainer.patch.json +11 -5
  148. package/overlays/pgvector/docker-compose.yml +1 -0
  149. package/overlays/pgvector/overlay.yml +3 -0
  150. package/overlays/playwright/devcontainer.patch.json +0 -5
  151. package/overlays/playwright/overlay.yml +2 -1
  152. package/overlays/postgres/docker-compose.yml +1 -0
  153. package/overlays/postgres/overlay.yml +4 -1
  154. package/overlays/pre-commit/devcontainer.patch.json +1 -7
  155. package/overlays/prometheus/devcontainer.patch.json +0 -1
  156. package/overlays/prometheus/docker-compose.yml +8 -0
  157. package/overlays/prometheus/overlay.yml +1 -0
  158. package/overlays/promtail/devcontainer.patch.json +1 -2
  159. package/overlays/promtail/docker-compose.yml +8 -0
  160. package/overlays/promtail/overlay.yml +1 -0
  161. package/overlays/qdrant/docker-compose.yml +1 -0
  162. package/overlays/qdrant/overlay.yml +5 -1
  163. package/overlays/rabbitmq/docker-compose.yml +1 -0
  164. package/overlays/rabbitmq/overlay.yml +25 -2
  165. package/overlays/redis/docker-compose.yml +7 -0
  166. package/overlays/redis/overlay.yml +15 -1
  167. package/overlays/redpanda/docker-compose.yml +1 -0
  168. package/overlays/redpanda/overlay.yml +15 -3
  169. package/overlays/rocm/overlay.yml +2 -1
  170. package/overlays/rust/overlay.yml +3 -1
  171. package/overlays/sqlserver/docker-compose.yml +1 -0
  172. package/overlays/sqlserver/overlay.yml +17 -0
  173. package/overlays/task/README.md +47 -0
  174. package/overlays/task/devcontainer.patch.json +9 -0
  175. package/overlays/task/overlay.yml +16 -0
  176. package/overlays/task/setup.sh +29 -0
  177. package/overlays/task/verify.sh +14 -0
  178. package/overlays/tempo/devcontainer.patch.json +0 -1
  179. package/overlays/tempo/docker-compose.yml +8 -0
  180. package/overlays/tempo/overlay.yml +1 -0
  181. package/overlays/windsurf-cli/devcontainer.patch.json +4 -1
  182. package/package.json +1 -1
  183. package/tool/schema/config.schema.json +74 -1
  184. package/overlays/.shared/otel/otel-base-config.yaml +0 -30
@@ -0,0 +1,176 @@
1
+ # Feature Specification: First-Class Mounts Support
2
+
3
+ **Spec ID**: `019-project-mounts`
4
+ **Created**: 2026-05-03
5
+ **Status**: Approved
6
+ **Input**: User request
7
+
8
+ ## Overview
9
+
10
+ Add a top-level `mounts` field to `superposition.yml` that lets users declare filesystem mounts
11
+ once and have the generation pipeline route them to the correct devcontainer artifact based on
12
+ the active stack.
13
+
14
+ This feature is modeled after the existing first-class `env` behavior.
15
+
16
+ ---
17
+
18
+ ## User Scenarios & Testing
19
+
20
+ ### User Story 1 — Declare a mount on a plain stack (Priority: P1)
21
+
22
+ A developer adds a `mounts:` list to `superposition.yml` on a `plain` stack and expects each
23
+ entry to appear in `devcontainer.json → mounts[]` after regeneration.
24
+
25
+ **Why this priority**: Plain-stack users who need bind mounts (e.g. a shared workspace folder)
26
+ currently must write custom `devcontainerPatch` JSON, which is difficult to discover and
27
+ error-prone.
28
+
29
+ **Independent Test**: Create a `superposition.yml` with `stack: plain` and a `mounts:` entry.
30
+ Run `regen` and confirm the raw string appears in `devcontainer.json mounts`.
31
+
32
+ **Acceptance Scenarios**:
33
+
34
+ 1. **Given** `mounts: ["source=${localWorkspaceFolder}/../libs,target=/workspace/libs,type=bind"]`
35
+ with `stack: plain`, **When** generation runs, **Then** the string is present in
36
+ `devcontainer.json mounts[]`.
37
+ 2. **Given** a long-form entry `{value: "...", target: devcontainerMount}` with `stack: plain`,
38
+ **When** generation runs, **Then** the mount value is present in `devcontainer.json mounts[]`.
39
+ 3. **Given** a long-form entry with `target: auto` on `stack: plain`, **When** generation runs,
40
+ **Then** the mount routes to `devcontainer.json mounts[]` (same as default).
41
+
42
+ ---
43
+
44
+ ### User Story 2 — Declare a mount on a compose stack (Priority: P1)
45
+
46
+ A developer adds a `mounts:` list to `superposition.yml` on a `compose` stack and expects each
47
+ entry (with `target: auto` or string shorthand) to appear in `devcontainer.json mounts[]` —
48
+ the same as it would on a plain stack — so the project file is **stack-agnostic**.
49
+
50
+ **Why this priority**: Users should be able to swap `stack: plain` ↔ `stack: compose` without
51
+ needing to touch the `mounts:` block.
52
+
53
+ **Independent Test**: Create a `superposition.yml` with `stack: compose` and a `mounts:` entry.
54
+ Run `regen` and confirm the entry appears in `devcontainer.json mounts[]` (not in compose
55
+ volumes, unless `composeVolume` is explicitly requested).
56
+
57
+ **Acceptance Scenarios**:
58
+
59
+ 1. **Given** `mounts: ["./data:/workspace/data"]` with `stack: compose`, **When** generation runs,
60
+ **Then** `./data:/workspace/data` appears in `devcontainer.json mounts[]`.
61
+ 2. **Given** `target: auto` on `stack: compose`, **When** generation runs, **Then** the mount
62
+ routes to `devcontainer.json mounts[]` (same as plain — stack-agnostic).
63
+
64
+ ---
65
+
66
+ ### User Story 3 — Explicit `composeVolume` target for Docker Compose volumes (Priority: P2)
67
+
68
+ A developer who specifically wants a mount wired as a Docker Compose service volume (e.g. to
69
+ leverage named volumes or compose-specific semantics) sets `target: composeVolume`.
70
+
71
+ **Acceptance Scenarios**:
72
+
73
+ 1. **Given** `{value: "...", target: composeVolume}` on `stack: compose`, **When** generation
74
+ runs, **Then** the value appears in `docker-compose.yml services.devcontainer.volumes[]`.
75
+ 2. **Given** `{value: "...", target: composeVolume}` on `stack: plain`, **When** generation runs,
76
+ **Then** generation errors with a clear message about compose-only targets.
77
+
78
+ ---
79
+
80
+ ### User Story 4 — Mounts coexist with customizations patches (Priority: P1)
81
+
82
+ Mounts declared in the top-level `mounts:` field are applied before
83
+ `customizations.devcontainerPatch` and `customizations.dockerComposePatch`, so patch overrides
84
+ are still respected.
85
+
86
+ **Acceptance Scenarios**:
87
+
88
+ 1. **Given** a `mounts:` entry and a `customizations.devcontainerPatch` that adds an additional
89
+ mount, **When** generation runs, **Then** both mounts appear in `devcontainer.json` (union merge).
90
+ 2. **Given** a compose-stack `mounts:` entry and a `customizations.dockerComposePatch` that adds
91
+ extra volumes, **When** generation runs, **Then** both sets appear in
92
+ `services.devcontainer.volumes`.
93
+
94
+ ---
95
+
96
+ ### User Story 5 — Validation (Priority: P1)
97
+
98
+ The parser rejects clearly invalid mount declarations.
99
+
100
+ **Acceptance Scenarios**:
101
+
102
+ 1. `target: composeVolume` on `stack: plain` → error at compose/devcontainer generation time.
103
+ 2. An entry with an empty `value` string → `ProjectConfigError` at parse time.
104
+ 3. An entry that is neither a string nor an object with `value` → `ProjectConfigError`.
105
+
106
+ ---
107
+
108
+ ## Schema Design
109
+
110
+ ### `superposition.yml`
111
+
112
+ ```yaml
113
+ mounts:
114
+ # string shorthand — raw mount spec
115
+ - 'source=${localWorkspaceFolder}/../libs,target=/workspace/libs,type=bind'
116
+ # long form — explicit target routing
117
+ - value: './data:/workspace/data'
118
+ target: auto # default; always devcontainer.json mounts[] regardless of stack
119
+ - value: 'source=certs,target=/certs,type=volume'
120
+ target: devcontainerMount # always devcontainer.json
121
+ - value: './logs:/workspace/logs'
122
+ target: composeVolume # always docker-compose volumes (compose only)
123
+ ```
124
+
125
+ ### Routing table
126
+
127
+ | `target` | `stack: plain` | `stack: compose` |
128
+ | ------------------- | -------------------------- | -------------------------------------------------- |
129
+ | `auto` (default) | `devcontainer.json mounts` | `devcontainer.json mounts` |
130
+ | `devcontainerMount` | `devcontainer.json mounts` | `devcontainer.json mounts` |
131
+ | `composeVolume` | ❌ Error | `docker-compose.yml services.devcontainer.volumes` |
132
+
133
+ `auto` and `devcontainerMount` are stack-agnostic: they always route to `devcontainer.json
134
+ mounts[]` so that the same `superposition.yml` works without modification when swapping
135
+ `stack: plain` ↔ `stack: compose`.
136
+
137
+ ---
138
+
139
+ ## Implementation Plan
140
+
141
+ ### Types (`tool/schema/types.ts`)
142
+
143
+ - `ProjectMountTarget = 'auto' | 'devcontainerMount' | 'composeVolume'`
144
+ - `ProjectMount = { value: string; target?: ProjectMountTarget }`
145
+ - `QuestionnaireAnswers.projectMounts?: ProjectMount[]`
146
+ - `ProjectConfigSelection.mounts?: Array<string | ProjectMount>`
147
+
148
+ ### Schema (`tool/schema/config.schema.json`)
149
+
150
+ Add `mounts` as an array of `string | {value, target?}` (oneOf), matching the `env` pattern.
151
+
152
+ ### Parser (`tool/schema/project-config.ts`)
153
+
154
+ - `parseMounts(value): ProjectMount[] | undefined` — normalize strings to `{value}` objects
155
+ - Add `'mounts'` to the supported-keys set
156
+ - Thread `mounts` through `loadProjectConfig`, `buildAnswersFromProjectConfig`,
157
+ `buildProjectConfigSelectionFromAnswers`, and `buildProjectConfigDocument`
158
+
159
+ ### Composer (`tool/questionnaire/composer.ts`)
160
+
161
+ - `resolveProjectMountTarget(mount, stack)` — maps `ProjectMountTarget` to resolved destination
162
+ - `applyProjectMountsToDevcontainer(config, mounts, stack)` — deepMerge devcontainerMount entries
163
+ into `config.mounts`
164
+ - Thread compose-volume mounts into `mergeDockerComposeFiles` (analogous to `projectEnv`)
165
+ - Apply before custom patches
166
+
167
+ ### Application order
168
+
169
+ 1. Base template loaded
170
+ 2. Overlays applied
171
+ 3. Port offsets applied
172
+ 4. Project env applied to devcontainer + compose
173
+ 5. **Project mounts applied to devcontainer + compose** ← new
174
+ 6. Custom patches applied (devcontainerPatch, dockerComposePatch)
175
+ 7. Target patches applied
176
+ 8. Files written
@@ -0,0 +1,186 @@
1
+ # Feature Taxonomy
2
+
3
+ This index maps all specs to their feature categories. Maintained by the `tool-pm` agent — update whenever a new spec is added.
4
+
5
+ ## Taxonomy categories
6
+
7
+ ```
8
+ OVERLAY — Adding or modifying individual overlays
9
+ OVERLAY-NEW — New overlay
10
+ OVERLAY-ENRICH — Enriching an existing overlay
11
+ OVERLAY-FIX — Correctness fix to an overlay
12
+
13
+ PRESET — Preset bundles
14
+ PRESET-NEW — New preset
15
+ PRESET-ENRICH — Enriching an existing preset
16
+
17
+ COMPOSER — Core composition pipeline (composer.ts, merge logic, imports)
18
+ COMPOSER-FEAT — New composition behaviour
19
+ COMPOSER-FIX — Bug fix
20
+
21
+ SCHEMA — Overlay manifest schema, types, validation
22
+ SCHEMA-FIELD — New field in overlay.yml or related types
23
+ SCHEMA-VALID — New validation rule
24
+
25
+ CLI — Command-line interface (init, regen, adopt, doctor)
26
+ CLI-COMMAND — New command or subcommand
27
+ CLI-FLAG — New flag on existing command
28
+ CLI-UX — Interactive prompt or output improvement
29
+
30
+ QUESTIONNAIRE — Overlay selection logic
31
+ QUEST-SECTION — New questionnaire section
32
+ QUEST-LOGIC — Selection / dependency resolution logic
33
+
34
+ DOCS — Documentation
35
+ DOCS-SPEC — Spec meta
36
+ DOCS-GUIDE — Developer or user guide
37
+ DOCS-API — Generated reference
38
+
39
+ INFRA — Project infrastructure (tests, CI, tooling)
40
+ INFRA-TEST — Test coverage
41
+ INFRA-LINT — Lint / formatter
42
+ INFRA-BUILD — Build system
43
+ ```
44
+
45
+ ---
46
+
47
+ ## OVERLAY — Individual overlays
48
+
49
+ ### OVERLAY-NEW
50
+
51
+ | Spec | Title | Status |
52
+ | -------------------------------------------------------- | ------------------------------------- | ------ |
53
+ | [003-mkdocs2-overlay](003-mkdocs2-overlay/spec.md) | MkDocs 2.x Overlay | Final |
54
+ | [005-cuda-overlay](005-cuda-overlay/spec.md) | CUDA (NVIDIA GPU) Overlay | Final |
55
+ | [006-rocm-overlay](006-rocm-overlay/spec.md) | ROCm (AMD GPU) Overlay | Final |
56
+ | [012-ollama-cli-overlay](012-ollama-cli-overlay/spec.md) | Split Ollama Service and CLI Overlays | Final |
57
+
58
+ ### OVERLAY-ENRICH
59
+
60
+ _No specs yet._
61
+
62
+ ### OVERLAY-FIX
63
+
64
+ _No specs yet._
65
+
66
+ ---
67
+
68
+ ## PRESET — Preset bundles
69
+
70
+ ### PRESET-NEW
71
+
72
+ _No specs yet._
73
+
74
+ ### PRESET-ENRICH
75
+
76
+ _No specs yet._
77
+
78
+ ---
79
+
80
+ ## COMPOSER — Composition pipeline
81
+
82
+ ### COMPOSER-FEAT
83
+
84
+ | Spec | Title | Status |
85
+ | -------------------------------------------------------------------------- | --------------------------------------------------- | -------- |
86
+ | [010-compose-env-materialization](010-compose-env-materialization/spec.md) | Compose Env Materialization and Env Template Naming | Approved |
87
+
88
+ ### COMPOSER-FIX
89
+
90
+ _No specs yet._
91
+
92
+ ---
93
+
94
+ ## SCHEMA — Overlay manifest schema
95
+
96
+ ### SCHEMA-FIELD
97
+
98
+ | Spec | Title | Status |
99
+ | -------------------------------------------------------- | ----------------------------------------- | ------ |
100
+ | [011-overlay-parameters](011-overlay-parameters/spec.md) | Overlay Parameters with Safe Substitution | Final |
101
+
102
+ ### SCHEMA-VALID
103
+
104
+ _No specs yet._
105
+
106
+ ---
107
+
108
+ ## CLI — Command-line interface
109
+
110
+ ### CLI-COMMAND
111
+
112
+ | Spec | Title | Status |
113
+ | ---------------------------------------- | ---------------------------------------- | ------ |
114
+ | [004-doctor-fix](004-doctor-fix/spec.md) | `doctor --fix` — Interactive Auto-Repair | Final |
115
+
116
+ ### CLI-FLAG
117
+
118
+ | Spec | Title | Status |
119
+ | ------------------------------------------------------------------ | ----------------------------- | ------ |
120
+ | [007-target-aware-generation](007-target-aware-generation/spec.md) | Target-Aware Generation | Final |
121
+ | [017-doctor-dry-run](017-doctor-dry-run/spec.md) | Doctor `--fix --dry-run` Flag | Draft |
122
+
123
+ ### CLI-UX
124
+
125
+ | Spec | Title | Status |
126
+ | -------------------------------------------------------------------------------------------- | ------------------------------------------ | ------ |
127
+ | [001-verbose-plan-graph](001-verbose-plan-graph/spec.md) | Verbose Plan Graph | Final |
128
+ | [013-doctor-dependency-check](013-doctor-dependency-check/spec.md) | Doctor Overlay Dependency Resolution Check | Draft |
129
+ | [014-doctor-compose-port-cross-validation](014-doctor-compose-port-cross-validation/spec.md) | Doctor Compose / Port Cross-Validation | Draft |
130
+ | [015-doctor-env-example-drift](015-doctor-env-example-drift/spec.md) | Doctor `.env.example` Drift Detection | Draft |
131
+ | [016-doctor-reproducibility-check](016-doctor-reproducibility-check/spec.md) | Doctor Reproducibility Check | Draft |
132
+
133
+ ---
134
+
135
+ ## QUESTIONNAIRE — Overlay selection
136
+
137
+ ### QUEST-SECTION
138
+
139
+ _No specs yet._
140
+
141
+ ### QUEST-LOGIC
142
+
143
+ _No specs yet._
144
+
145
+ ---
146
+
147
+ ## DOCS — Documentation
148
+
149
+ ### DOCS-SPEC
150
+
151
+ _No specs yet._
152
+
153
+ ### DOCS-GUIDE
154
+
155
+ _No specs yet._
156
+
157
+ ### DOCS-API
158
+
159
+ _No specs yet._
160
+
161
+ ---
162
+
163
+ ## INFRA — Project infrastructure
164
+
165
+ ### INFRA-TEST
166
+
167
+ _No specs yet._
168
+
169
+ ### INFRA-LINT
170
+
171
+ _No specs yet._
172
+
173
+ ### INFRA-BUILD
174
+
175
+ _No specs yet._
176
+
177
+ ---
178
+
179
+ ## PROJECT — Project-level configuration
180
+
181
+ | Spec | Title | Status |
182
+ | ---------------------------------------------------------------------- | ------------------------------------------- | -------- |
183
+ | [002-superposition-config-file](002-superposition-config-file/spec.md) | Project Configuration File | Final |
184
+ | [008-project-file-canonical](008-project-file-canonical/spec.md) | Project File Canonical Form | Approved |
185
+ | [009-project-env](009-project-env/spec.md) | Unified Project-Level Environment Variables | Approved |
186
+ | [018-init-project-file](018-init-project-file/spec.md) | `init --project-file` | Final |