@tdk-landscape/tdk-cli-core 1.3.49 → 1.3.50

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 (309) hide show
  1. package/.claude/skills/layer-autoresearch/SKILL.md +48 -0
  2. package/.claude/skills/tdk-troubleshoot/SKILL.md +222 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +40 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.yml +18 -0
  6. package/.github/dependabot.yml +33 -0
  7. package/.github/pull_request_template.md +5 -0
  8. package/.github/workflows/ci.yml +187 -0
  9. package/.github/workflows/release-binaries.yml +19 -9
  10. package/.github/zizmor.yml +9 -0
  11. package/CODE_OF_CONDUCT.md +9 -0
  12. package/CONTRIBUTING.md +42 -0
  13. package/LICENSE +21 -0
  14. package/README.md +149 -0
  15. package/SECURITY.md +17 -0
  16. package/benchmarks/results/container-scale-2026-09-25T20-54-49-736Z.json +45 -0
  17. package/benchmarks/results/container-scale-2026-09-25T21-01-20-540Z.json +150 -0
  18. package/benchmarks/results/container-scale-2026-09-25T21-15-01-441Z.json +73 -0
  19. package/benchmarks/results/container-scale-2026-09-25T22-09-01-630Z.json +77 -0
  20. package/benchmarks/results/container-scale-2026-09-25T22-18-28-371Z.json +202 -0
  21. package/cli/README.md +25 -0
  22. package/cli/biome.json +1 -1
  23. package/cli/dist/cli.d.ts +3 -0
  24. package/cli/dist/cli.d.ts.map +1 -0
  25. package/cli/dist/cli.js +64 -0
  26. package/cli/dist/cli.js.map +1 -0
  27. package/cli/dist/commands/completion.d.ts +3 -0
  28. package/cli/dist/commands/completion.d.ts.map +1 -0
  29. package/cli/dist/commands/completion.js +294 -0
  30. package/cli/dist/commands/completion.js.map +1 -0
  31. package/cli/dist/commands/config.d.ts +3 -0
  32. package/cli/dist/commands/config.d.ts.map +1 -0
  33. package/cli/dist/commands/config.js +231 -0
  34. package/cli/dist/commands/config.js.map +1 -0
  35. package/cli/dist/commands/doctor.d.ts +19 -0
  36. package/cli/dist/commands/doctor.d.ts.map +1 -0
  37. package/cli/dist/commands/doctor.js +745 -0
  38. package/cli/dist/commands/doctor.js.map +1 -0
  39. package/cli/dist/commands/down.d.ts +3 -0
  40. package/cli/dist/commands/down.d.ts.map +1 -0
  41. package/cli/dist/commands/down.js +32 -0
  42. package/cli/dist/commands/down.js.map +1 -0
  43. package/cli/dist/commands/help.d.ts +2 -0
  44. package/cli/dist/commands/help.d.ts.map +1 -0
  45. package/cli/dist/commands/help.js +138 -0
  46. package/cli/dist/commands/help.js.map +1 -0
  47. package/cli/dist/commands/networks.d.ts +3 -0
  48. package/cli/dist/commands/networks.d.ts.map +1 -0
  49. package/cli/dist/commands/networks.js +260 -0
  50. package/cli/dist/commands/networks.js.map +1 -0
  51. package/cli/dist/commands/project.d.ts +3 -0
  52. package/cli/dist/commands/project.d.ts.map +1 -0
  53. package/cli/dist/commands/project.js +370 -0
  54. package/cli/dist/commands/project.js.map +1 -0
  55. package/cli/dist/commands/projects.d.ts +3 -0
  56. package/cli/dist/commands/projects.d.ts.map +1 -0
  57. package/cli/dist/commands/projects.js +71 -0
  58. package/cli/dist/commands/projects.js.map +1 -0
  59. package/cli/dist/commands/resource.d.ts +69 -0
  60. package/cli/dist/commands/resource.d.ts.map +1 -0
  61. package/cli/dist/commands/resource.js +579 -0
  62. package/cli/dist/commands/resource.js.map +1 -0
  63. package/cli/dist/commands/resources.d.ts +3 -0
  64. package/cli/dist/commands/resources.d.ts.map +1 -0
  65. package/cli/dist/commands/resources.js +73 -0
  66. package/cli/dist/commands/resources.js.map +1 -0
  67. package/cli/dist/commands/stack.d.ts +3 -0
  68. package/cli/dist/commands/stack.d.ts.map +1 -0
  69. package/cli/dist/commands/stack.js +97 -0
  70. package/cli/dist/commands/stack.js.map +1 -0
  71. package/cli/dist/commands/stacks.d.ts +3 -0
  72. package/cli/dist/commands/stacks.d.ts.map +1 -0
  73. package/cli/dist/commands/stacks.js +43 -0
  74. package/cli/dist/commands/stacks.js.map +1 -0
  75. package/cli/dist/commands/status.d.ts +3 -0
  76. package/cli/dist/commands/status.d.ts.map +1 -0
  77. package/cli/dist/commands/status.js +71 -0
  78. package/cli/dist/commands/status.js.map +1 -0
  79. package/cli/dist/commands/ui.d.ts +3 -0
  80. package/cli/dist/commands/ui.d.ts.map +1 -0
  81. package/cli/dist/commands/ui.js +445 -0
  82. package/cli/dist/commands/ui.js.map +1 -0
  83. package/cli/dist/commands/up.d.ts +3 -0
  84. package/cli/dist/commands/up.d.ts.map +1 -0
  85. package/cli/dist/commands/up.js +124 -0
  86. package/cli/dist/commands/up.js.map +1 -0
  87. package/cli/dist/commands/upgrade.d.ts +11 -0
  88. package/cli/dist/commands/upgrade.d.ts.map +1 -0
  89. package/cli/dist/commands/upgrade.js +496 -0
  90. package/cli/dist/commands/upgrade.js.map +1 -0
  91. package/cli/dist/commands/version.d.ts +3 -0
  92. package/cli/dist/commands/version.d.ts.map +1 -0
  93. package/cli/dist/commands/version.js +9 -0
  94. package/cli/dist/commands/version.js.map +1 -0
  95. package/cli/dist/components/Accessible.d.ts +8 -0
  96. package/cli/dist/components/Accessible.d.ts.map +1 -0
  97. package/cli/dist/components/Accessible.js +10 -0
  98. package/cli/dist/components/Accessible.js.map +1 -0
  99. package/cli/dist/components/BaseTooltip.d.ts +4 -0
  100. package/cli/dist/components/BaseTooltip.d.ts.map +1 -0
  101. package/cli/dist/components/BaseTooltip.js +28 -0
  102. package/cli/dist/components/BaseTooltip.js.map +1 -0
  103. package/cli/dist/components/DetailPanel.d.ts +4 -0
  104. package/cli/dist/components/DetailPanel.d.ts.map +1 -0
  105. package/cli/dist/components/DetailPanel.js +18 -0
  106. package/cli/dist/components/DetailPanel.js.map +1 -0
  107. package/cli/dist/components/FileTree.d.ts +4 -0
  108. package/cli/dist/components/FileTree.d.ts.map +1 -0
  109. package/cli/dist/components/FileTree.js +47 -0
  110. package/cli/dist/components/FileTree.js.map +1 -0
  111. package/cli/dist/components/ResourceSelectInput.d.ts +4 -0
  112. package/cli/dist/components/ResourceSelectInput.d.ts.map +1 -0
  113. package/cli/dist/components/ResourceSelectInput.js +7 -0
  114. package/cli/dist/components/ResourceSelectInput.js.map +1 -0
  115. package/cli/dist/components/ResourceTable.d.ts +4 -0
  116. package/cli/dist/components/ResourceTable.d.ts.map +1 -0
  117. package/cli/dist/components/ResourceTable.js +18 -0
  118. package/cli/dist/components/ResourceTable.js.map +1 -0
  119. package/cli/dist/components/TabBar.d.ts +4 -0
  120. package/cli/dist/components/TabBar.d.ts.map +1 -0
  121. package/cli/dist/components/TabBar.js +17 -0
  122. package/cli/dist/components/TabBar.js.map +1 -0
  123. package/cli/dist/components/Tooltip.d.ts +12 -0
  124. package/cli/dist/components/Tooltip.d.ts.map +1 -0
  125. package/cli/dist/components/Tooltip.js +12 -0
  126. package/cli/dist/components/Tooltip.js.map +1 -0
  127. package/cli/dist/components/index.d.ts +8 -0
  128. package/cli/dist/components/index.d.ts.map +1 -0
  129. package/cli/dist/components/index.js +8 -0
  130. package/cli/dist/components/index.js.map +1 -0
  131. package/cli/dist/config/platform-standards.d.ts +159 -0
  132. package/cli/dist/config/platform-standards.d.ts.map +1 -0
  133. package/cli/dist/config/platform-standards.js +181 -0
  134. package/cli/dist/config/platform-standards.js.map +1 -0
  135. package/cli/dist/generator/extension-fetch.d.ts +25 -0
  136. package/cli/dist/generator/extension-fetch.d.ts.map +1 -0
  137. package/cli/dist/generator/extension-fetch.js +259 -0
  138. package/cli/dist/generator/extension-fetch.js.map +1 -0
  139. package/cli/dist/generator/template-engine.d.ts +62 -0
  140. package/cli/dist/generator/template-engine.d.ts.map +1 -0
  141. package/cli/dist/generator/template-engine.js +623 -0
  142. package/cli/dist/generator/template-engine.js.map +1 -0
  143. package/cli/dist/index.d.ts +11 -0
  144. package/cli/dist/index.d.ts.map +1 -0
  145. package/cli/dist/index.js +11 -0
  146. package/cli/dist/index.js.map +1 -0
  147. package/cli/dist/types/index.d.ts +257 -0
  148. package/cli/dist/types/index.d.ts.map +1 -0
  149. package/cli/dist/types/index.js +17 -0
  150. package/cli/dist/types/index.js.map +1 -0
  151. package/cli/dist/utils/cache.d.ts +19 -0
  152. package/cli/dist/utils/cache.d.ts.map +1 -0
  153. package/cli/dist/utils/cache.js +64 -0
  154. package/cli/dist/utils/cache.js.map +1 -0
  155. package/cli/dist/utils/command-helpers.d.ts +17 -0
  156. package/cli/dist/utils/command-helpers.d.ts.map +1 -0
  157. package/cli/dist/utils/command-helpers.js +41 -0
  158. package/cli/dist/utils/command-helpers.js.map +1 -0
  159. package/cli/dist/utils/constants.d.ts +53 -0
  160. package/cli/dist/utils/constants.d.ts.map +1 -0
  161. package/cli/dist/utils/constants.js +115 -0
  162. package/cli/dist/utils/constants.js.map +1 -0
  163. package/cli/dist/utils/discovery-context.d.ts +4 -0
  164. package/cli/dist/utils/discovery-context.d.ts.map +1 -0
  165. package/cli/dist/utils/discovery-context.js +39 -0
  166. package/cli/dist/utils/discovery-context.js.map +1 -0
  167. package/cli/dist/utils/docker.d.ts +4 -0
  168. package/cli/dist/utils/docker.d.ts.map +1 -0
  169. package/cli/dist/utils/docker.js +19 -0
  170. package/cli/dist/utils/docker.js.map +1 -0
  171. package/cli/dist/utils/doctor-runtime.d.ts +81 -0
  172. package/cli/dist/utils/doctor-runtime.d.ts.map +1 -0
  173. package/cli/dist/utils/doctor-runtime.js +498 -0
  174. package/cli/dist/utils/doctor-runtime.js.map +1 -0
  175. package/cli/dist/utils/env-validator.d.ts +15 -0
  176. package/cli/dist/utils/env-validator.d.ts.map +1 -0
  177. package/cli/dist/utils/env-validator.js +109 -0
  178. package/cli/dist/utils/env-validator.js.map +1 -0
  179. package/cli/dist/utils/errors.d.ts +31 -0
  180. package/cli/dist/utils/errors.d.ts.map +1 -0
  181. package/cli/dist/utils/errors.js +140 -0
  182. package/cli/dist/utils/errors.js.map +1 -0
  183. package/cli/dist/utils/file-helpers.d.ts +14 -0
  184. package/cli/dist/utils/file-helpers.d.ts.map +1 -0
  185. package/cli/dist/utils/file-helpers.js +45 -0
  186. package/cli/dist/utils/file-helpers.js.map +1 -0
  187. package/cli/dist/utils/formatting.d.ts +30 -0
  188. package/cli/dist/utils/formatting.d.ts.map +1 -0
  189. package/cli/dist/utils/formatting.js +164 -0
  190. package/cli/dist/utils/formatting.js.map +1 -0
  191. package/cli/dist/utils/paths.d.ts +3 -0
  192. package/cli/dist/utils/paths.d.ts.map +1 -0
  193. package/cli/dist/utils/paths.js +41 -0
  194. package/cli/dist/utils/paths.js.map +1 -0
  195. package/cli/dist/utils/port-assignment.d.ts +6 -0
  196. package/cli/dist/utils/port-assignment.d.ts.map +1 -0
  197. package/cli/dist/utils/port-assignment.js +81 -0
  198. package/cli/dist/utils/port-assignment.js.map +1 -0
  199. package/cli/dist/utils/project-features.d.ts +23 -0
  200. package/cli/dist/utils/project-features.d.ts.map +1 -0
  201. package/cli/dist/utils/project-features.js +98 -0
  202. package/cli/dist/utils/project-features.js.map +1 -0
  203. package/cli/dist/utils/project-templates.d.ts +7 -0
  204. package/cli/dist/utils/project-templates.d.ts.map +1 -0
  205. package/cli/dist/utils/project-templates.js +24 -0
  206. package/cli/dist/utils/project-templates.js.map +1 -0
  207. package/cli/dist/utils/prompt.d.ts +28 -0
  208. package/cli/dist/utils/prompt.d.ts.map +1 -0
  209. package/cli/dist/utils/prompt.js +79 -0
  210. package/cli/dist/utils/prompt.js.map +1 -0
  211. package/cli/dist/utils/resource-features.d.ts +29 -0
  212. package/cli/dist/utils/resource-features.d.ts.map +1 -0
  213. package/cli/dist/utils/resource-features.js +175 -0
  214. package/cli/dist/utils/resource-features.js.map +1 -0
  215. package/cli/dist/utils/service-urls.d.ts +30 -0
  216. package/cli/dist/utils/service-urls.d.ts.map +1 -0
  217. package/cli/dist/utils/service-urls.js +93 -0
  218. package/cli/dist/utils/service-urls.js.map +1 -0
  219. package/cli/dist/utils/services.d.ts +18 -0
  220. package/cli/dist/utils/services.d.ts.map +1 -0
  221. package/cli/dist/utils/services.js +292 -0
  222. package/cli/dist/utils/services.js.map +1 -0
  223. package/cli/dist/utils/stack-features.d.ts +22 -0
  224. package/cli/dist/utils/stack-features.d.ts.map +1 -0
  225. package/cli/dist/utils/stack-features.js +13 -0
  226. package/cli/dist/utils/stack-features.js.map +1 -0
  227. package/cli/dist/utils/tar.d.ts +7 -0
  228. package/cli/dist/utils/tar.d.ts.map +1 -0
  229. package/cli/dist/utils/tar.js +21 -0
  230. package/cli/dist/utils/tar.js.map +1 -0
  231. package/cli/dist/utils/tilt.d.ts +20 -0
  232. package/cli/dist/utils/tilt.d.ts.map +1 -0
  233. package/cli/dist/utils/tilt.js +95 -0
  234. package/cli/dist/utils/tilt.js.map +1 -0
  235. package/cli/dist/utils/validation.d.ts +16 -0
  236. package/cli/dist/utils/validation.d.ts.map +1 -0
  237. package/cli/dist/utils/validation.js +58 -0
  238. package/cli/dist/utils/validation.js.map +1 -0
  239. package/cli/package.json +11 -12
  240. package/cli/src/commands/__tests__/always-enabled-infra.test.ts +2 -8
  241. package/cli/src/commands/__tests__/doctor.test.ts +181 -8
  242. package/cli/src/commands/__tests__/phases-model.test.ts +2 -4
  243. package/cli/src/commands/__tests__/project-resource-features-e2e.test.ts +4 -24
  244. package/cli/src/commands/__tests__/saas-starter-integration.test.ts +8 -10
  245. package/cli/src/commands/__tests__/stack-features-e2e.test.ts +10 -4
  246. package/cli/src/commands/__tests__/upgrade.test.ts +23 -13
  247. package/cli/src/commands/doctor.ts +136 -0
  248. package/cli/src/commands/help.ts +13 -3
  249. package/cli/src/commands/project.ts +11 -14
  250. package/cli/src/commands/projects.ts +2 -2
  251. package/cli/src/commands/up.ts +13 -4
  252. package/cli/src/commands/upgrade.ts +11 -4
  253. package/cli/src/config/platform-standards.test.ts +6 -6
  254. package/cli/src/generator/__tests__/extension-fetch.test.ts +36 -14
  255. package/cli/src/generator/extension-fetch.ts +12 -5
  256. package/cli/src/generator/template-engine.ts +19 -21
  257. package/cli/src/types/index.ts +2 -0
  258. package/cli/src/utils/__tests__/tilt.test.ts +29 -0
  259. package/cli/src/utils/constants.ts +4 -0
  260. package/cli/src/utils/doctor-runtime.ts +67 -27
  261. package/cli/src/utils/env-validator.ts +2 -2
  262. package/cli/src/utils/project-templates.ts +2 -1
  263. package/cli/src/utils/prompt.ts +2 -4
  264. package/cli/src/utils/resource-features.ts +10 -4
  265. package/cli/src/utils/services.ts +2 -1
  266. package/cli/src/utils/tilt.ts +20 -0
  267. package/engine/assets/docker/wake-gateway/Dockerfile +26 -0
  268. package/engine/assets/docker/wake-gateway/decide.test.ts +87 -0
  269. package/engine/assets/docker/wake-gateway/decide.ts +75 -0
  270. package/engine/assets/docker/wake-gateway/server.ts +220 -0
  271. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +13 -23
  272. package/engine/topologies/platform/docker/compose/compose.star +7 -14
  273. package/engine/topologies/platform/docker/compose/compose_helpers.star +1 -1
  274. package/engine/topologies/platform/docker/compose/traefik_standalone.star +44 -6
  275. package/engine/topologies/platform/docker/config/healthcheck.star +56 -0
  276. package/engine/topologies/platform/docker/constants.star +10 -0
  277. package/engine/topologies/platform/docker/layers/l1_base_layers.star +1 -1
  278. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +55 -20
  279. package/engine/topologies/platform/docker/networking/traefik_static_routes.star +107 -0
  280. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +2 -2
  281. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +1 -1
  282. package/engine/topologies/tilt/manifest/schema.star +6 -0
  283. package/engine/topologies/tilt/manifest/validator.star +16 -0
  284. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +107 -8
  285. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +12 -6
  286. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +2 -1
  287. package/knip.json +1 -1
  288. package/openspec/changes/optimize-runtime-docker-layers/.openspec.yaml +3 -0
  289. package/openspec/changes/optimize-runtime-docker-layers/design.md +81 -0
  290. package/openspec/changes/optimize-runtime-docker-layers/proposal.md +44 -0
  291. package/openspec/changes/optimize-runtime-docker-layers/specs/runtime-container-footprint/spec.md +79 -0
  292. package/openspec/changes/optimize-runtime-docker-layers/tasks.md +36 -0
  293. package/openspec/changes/prioritized-cold-start/.openspec.yaml +4 -0
  294. package/openspec/changes/prioritized-cold-start/design.md +113 -0
  295. package/openspec/changes/prioritized-cold-start/proposal.md +40 -0
  296. package/openspec/changes/prioritized-cold-start/specs/on-demand-resource-startup/spec.md +92 -0
  297. package/openspec/changes/prioritized-cold-start/tasks.md +46 -0
  298. package/openspec/config.yaml +1 -0
  299. package/package.json +35 -5
  300. package/scripts/autoresearch/layer-eval.sh +65 -0
  301. package/scripts/benchmark/README.md +25 -0
  302. package/scripts/benchmark/container-scale.ts +503 -0
  303. package/scripts/benchmark/pre-release-gate.sh +9 -0
  304. package/scripts/measure-idle-footprint.sh +58 -0
  305. package/tests/tilt-engine/test_runtime_container_footprint.py +162 -0
  306. package/tests/tilt-engine/test_sablier_defer_start.py +196 -0
  307. package/tests/tilt-engine/test_standalone_traefik.py +38 -0
  308. package/tests/tilt-engine/test_traefik_static_wake_route.py +119 -0
  309. package/bun.lock +0 -538
@@ -0,0 +1,623 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import Handlebars from "handlebars";
5
+ import { PLATFORM_STANDARDS } from "../config/platform-standards.js";
6
+ import { writeTextFile } from "../utils/file-helpers.js";
7
+ import { discoverResourcesFromRoot } from "../utils/services.js";
8
+ import { isStackFeatureEnabledInStacks } from "../utils/stack-features.js";
9
+ import { hasSablierLicense, hasVerdaccioLicense } from "./extension-fetch.js";
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ // Helper function to load templates with robust path resolution
13
+ export function loadTemplate(filename) {
14
+ // Try multiple possible template directory locations
15
+ const templateDirs = [
16
+ path.join(__dirname, "..", "..", "templates"), // Standard: dist/generator -> templates (also covers src/generator -> ../../templates in dev/test)
17
+ path.join(__dirname, "..", "templates"), // Installed: dist/generator -> dist/templates
18
+ path.join(__dirname, "..", "..", "..", "templates"), // Development: cli/dist/generator -> cli/templates
19
+ path.join(process.cwd(), "node_modules", "@tdk-landscape", "tdk-cli-core", "templates"), // Monorepo root
20
+ // Compiled single-file binary (bun build --compile): __dirname resolves inside the
21
+ // virtual $bunfs filesystem, not a real path, so fall back to the directory the actual
22
+ // executable lives in. release-binaries.sh bundles cli/templates at tdk-cli/cli/templates
23
+ // next to the platform binaries.
24
+ path.join(path.dirname(process.execPath), "tdk-cli", "cli", "templates"),
25
+ ];
26
+ const triedPaths = [];
27
+ for (const templateDir of templateDirs) {
28
+ const templatePath = path.join(templateDir, filename);
29
+ triedPaths.push(templatePath);
30
+ try {
31
+ return fs.readFileSync(templatePath, "utf-8");
32
+ }
33
+ catch (_error) { }
34
+ }
35
+ throw new Error(`Failed to load template ${filename} from any of these paths: ${triedPaths.join(", ")}`);
36
+ }
37
+ // Templates used to be loaded eagerly here, at module initialization. That
38
+ // meant importing this module at all (e.g. via cli.ts -> config.ts/project.ts)
39
+ // threw immediately whenever the bundled templates folder was missing or
40
+ // stale - bricking every single `tdk` command, including `tdk upgrade`, the
41
+ // one command meant to repair a stale install. Load lazily instead, on first
42
+ // actual use, so commands that don't need templates (upgrade, doctor,
43
+ // version, ...) keep working even when the templates folder is absent, and
44
+ // `tdk upgrade` can run to fix it.
45
+ let embeddedTemplatesCache = null;
46
+ function getEmbeddedTemplates() {
47
+ if (!embeddedTemplatesCache) {
48
+ embeddedTemplatesCache = {
49
+ ".tiltignore": loadTemplate(".tiltignore.hbs"),
50
+ "TILT_RESOURCE_DEFAULTS.star": loadTemplate("TILT_RESOURCE_DEFAULTS.star.hbs"),
51
+ "TILT_TECH_STACK.star": loadTemplate("TILT_TECH_STACK.star.hbs"),
52
+ Tiltfile: loadTemplate("Tiltfile.hbs"),
53
+ "spec.master": loadTemplate("spec.master.hbs"),
54
+ };
55
+ }
56
+ return embeddedTemplatesCache;
57
+ }
58
+ // Generic resource descriptions - no hardcoded service names
59
+ // Users define their own service descriptions in project.json
60
+ const RESOURCE_DESCRIPTIONS = {
61
+ proxy: "Traefik reverse proxy",
62
+ verdaccio: "Private npm registry",
63
+ "database-management": "PostgreSQL database",
64
+ };
65
+ const INFRA_DESCRIPTIONS = {
66
+ monitoring: "Signoz, SkyWalking (RAM intensive)",
67
+ elk: "Elasticsearch/Logstash/Kibana",
68
+ debezium: "CDC with Kafka/Zookeeper",
69
+ golden_image: "Golden image rebuild (one-time)",
70
+ verdaccio: "Premium local npm registry",
71
+ };
72
+ /**
73
+ * List of all files generated by the template engine.
74
+ * Used for iteration and type-safe access to generated content.
75
+ */
76
+ const ALL_GENERATED_FILES = [
77
+ "TILT_TECH_STACK.star",
78
+ "TILT_RESOURCE_DEFAULTS.star",
79
+ "spec.master",
80
+ "Tiltfile",
81
+ ".tiltignore",
82
+ ];
83
+ export class TemplateEngine {
84
+ templatesDir;
85
+ constructor(templatesDir) {
86
+ const currentDir = import.meta.dirname || path.dirname(new URL(import.meta.url).pathname);
87
+ this.templatesDir = templatesDir || path.join(currentDir, "..", "..", "templates");
88
+ this.registerHelpers();
89
+ }
90
+ formatStarlarkValue(val) {
91
+ if (val === null || val === undefined) {
92
+ return "None";
93
+ }
94
+ if (typeof val === "string") {
95
+ return `"${val.replace(/"/g, '\\"')}"`;
96
+ }
97
+ if (typeof val === "boolean") {
98
+ return val ? "True" : "False";
99
+ }
100
+ if (typeof val === "number") {
101
+ return String(val);
102
+ }
103
+ if (Array.isArray(val)) {
104
+ const items = val.map((item) => this.formatStarlarkValue(item));
105
+ return `[${items.join(", ")}]`;
106
+ }
107
+ if (typeof val === "object") {
108
+ const entries = Object.entries(val).map(([key, v]) => {
109
+ return `"${key}": ${this.formatStarlarkValue(v)}`;
110
+ });
111
+ return `{${entries.join(", ")}}`;
112
+ }
113
+ return String(val);
114
+ }
115
+ registerHelpers() {
116
+ Handlebars.registerHelper("starlark", (value) => {
117
+ return new Handlebars.SafeString(this.formatStarlarkValue(value));
118
+ });
119
+ Handlebars.registerHelper("starlarkArray", (value) => {
120
+ if (!Array.isArray(value))
121
+ return new Handlebars.SafeString("[]");
122
+ const items = value.map((item) => this.formatStarlarkValue(item));
123
+ return new Handlebars.SafeString(`[${items.join(", ")}]`);
124
+ });
125
+ Handlebars.registerHelper("json", (value) => {
126
+ return JSON.stringify(value);
127
+ });
128
+ }
129
+ buildContext(projectConfig) {
130
+ return {
131
+ version: PLATFORM_STANDARDS.version,
132
+ timestamp: new Date().toISOString(),
133
+ tech: PLATFORM_STANDARDS.tech,
134
+ ports: PLATFORM_STANDARDS.ports,
135
+ health: PLATFORM_STANDARDS.health,
136
+ naming: PLATFORM_STANDARDS.naming,
137
+ traefik: PLATFORM_STANDARDS.traefik,
138
+ filewatchIgnores: [...PLATFORM_STANDARDS.filewatchIgnores],
139
+ serviceTypes: PLATFORM_STANDARDS.serviceTypes,
140
+ paths: PLATFORM_STANDARDS.paths,
141
+ discovery: {
142
+ scanIntervalSeconds: PLATFORM_STANDARDS.discovery.scanIntervalSeconds,
143
+ maxManifestsPerRoot: PLATFORM_STANDARDS.discovery.maxManifestsPerRoot,
144
+ paths: projectConfig.discovery.paths,
145
+ },
146
+ docker: PLATFORM_STANDARDS.docker,
147
+ runtime: PLATFORM_STANDARDS.runtime,
148
+ project: projectConfig.project,
149
+ phases: dedupePhaseEnabledStacks(projectConfig.phases),
150
+ alwaysEnabledInfra: projectConfig.always_enabled_infra ?? ["database-management", "proxy"],
151
+ optionalInfra: projectConfig.optional_infra,
152
+ serviceDescriptions: RESOURCE_DESCRIPTIONS,
153
+ infraDescriptions: INFRA_DESCRIPTIONS,
154
+ };
155
+ }
156
+ loadTemplate(templateName) {
157
+ const templatePath = path.join(this.templatesDir, `${templateName}.hbs`);
158
+ const templateSource = fs.existsSync(templatePath)
159
+ ? fs.readFileSync(templatePath, "utf-8")
160
+ : getEmbeddedTemplates()[templateName];
161
+ if (!templateSource) {
162
+ throw new Error(`Template not found: ${templatePath}`);
163
+ }
164
+ return Handlebars.compile(templateSource);
165
+ }
166
+ generateTechStack(context) {
167
+ const template = this.loadTemplate("TILT_TECH_STACK.star");
168
+ return template(context);
169
+ }
170
+ generateServiceDefaults(context) {
171
+ const template = this.loadTemplate("TILT_RESOURCE_DEFAULTS.star");
172
+ return template(context);
173
+ }
174
+ generateSpecMaster(context) {
175
+ const template = this.loadTemplate("spec.master");
176
+ return template(context);
177
+ }
178
+ generateTiltfile(context) {
179
+ const template = this.loadTemplate("Tiltfile");
180
+ return template(context);
181
+ }
182
+ generateTiltIgnore(context) {
183
+ const template = this.loadTemplate(".tiltignore");
184
+ return template(context);
185
+ }
186
+ generateAll(projectConfig) {
187
+ const context = this.buildContext(projectConfig);
188
+ return {
189
+ "TILT_TECH_STACK.star": this.generateTechStack(context),
190
+ "TILT_RESOURCE_DEFAULTS.star": this.generateServiceDefaults(context),
191
+ "spec.master": this.generateSpecMaster(context),
192
+ Tiltfile: this.generateTiltfile(context),
193
+ ".tiltignore": this.generateTiltIgnore(context),
194
+ };
195
+ }
196
+ }
197
+ // spec.master.hbs emits one Starlark dict entry per enabledStacks[] item, so a
198
+ // duplicate name in project.json (e.g. from the interactive wizard offering
199
+ // the same service as both a core feature and a discovered stack) becomes a
200
+ // duplicate dict key, which fails Starlark parsing at `tdk up`. Dedupe here
201
+ // so a bad project.json can't break generation.
202
+ function dedupePhaseEnabledStacks(phases) {
203
+ const deduped = { ...phases };
204
+ for (const key of Object.keys(deduped)) {
205
+ deduped[key] = {
206
+ ...deduped[key],
207
+ enabledStacks: Array.from(new Set(deduped[key].enabledStacks)),
208
+ };
209
+ }
210
+ return deduped;
211
+ }
212
+ function toComposeProjectName(projectName) {
213
+ return projectName.replace(/-/g, "_");
214
+ }
215
+ export function generateDatabaseManagementCompose(projectConfig) {
216
+ const name = toComposeProjectName(projectConfig.project.name || "tdk_project");
217
+ return `###############################################################################
218
+ # SYSTEM-GENERATED - DO NOT EDIT
219
+ # Stack feature: database-management
220
+ # Source: .tdk/project.json phases.*.enabledStacks includes "database-management"
221
+ ###############################################################################
222
+
223
+ services:
224
+ postgres:
225
+ image: postgres:16-alpine
226
+ container_name: ${name}_postgres
227
+ restart: unless-stopped
228
+ environment:
229
+ POSTGRES_USER: ${name}
230
+ POSTGRES_PASSWORD: \${DB_PASSWORD}
231
+ POSTGRES_DB: postgres
232
+ ports:
233
+ - "5432:5432"
234
+ volumes:
235
+ - ${name}_postgres_data:/var/lib/postgresql/data
236
+ networks:
237
+ - database
238
+ healthcheck:
239
+ test: ["CMD-SHELL", "pg_isready -U ${name} -d postgres"]
240
+ interval: 5s
241
+ timeout: 5s
242
+ retries: 20
243
+
244
+ networks:
245
+ database:
246
+ name: ${name}_database
247
+ external: true
248
+
249
+ volumes:
250
+ ${name}_postgres_data:
251
+ `;
252
+ }
253
+ /**
254
+ * Type guard to validate if an unknown value is a valid ProjectConfig.
255
+ *
256
+ * NOTE: The `as` assertions below are INTENTIONAL and SAFE:
257
+ * - We've already verified `typeof value === 'object'` and `value !== null`
258
+ * - TypeScript doesn't automatically narrow `{}` to `Record<string, unknown>`
259
+ * - Each assertion is immediately followed by property type checks
260
+ * - This pattern is standard for deep object validation in type guards
261
+ */
262
+ function hasPhaseShape(value, fieldName) {
263
+ if (!value || typeof value !== "object")
264
+ return false;
265
+ const phases = value;
266
+ for (const phaseName of ["pre_alpha", "alpha", "beta", "out_of_scope"]) {
267
+ const phase = phases[phaseName];
268
+ if (!phase || typeof phase !== "object")
269
+ return false;
270
+ if (!Array.isArray(phase[fieldName]))
271
+ return false;
272
+ }
273
+ return true;
274
+ }
275
+ function normalizeProjectConfig(value) {
276
+ if (!value || typeof value !== "object") {
277
+ return null;
278
+ }
279
+ // Safe to assert as Record after null and object type checks
280
+ const config = value;
281
+ if (typeof config.version !== "string") {
282
+ return null;
283
+ }
284
+ if (!config.project || typeof config.project !== "object") {
285
+ return null;
286
+ }
287
+ const project = config.project;
288
+ if (typeof project.name !== "string" || typeof project.version !== "string") {
289
+ return null;
290
+ }
291
+ let phases = null;
292
+ if (hasPhaseShape(config.phases, "enabledStacks")) {
293
+ phases = config.phases;
294
+ }
295
+ else if (hasPhaseShape(config.stacks, "services")) {
296
+ const legacyStacks = config.stacks;
297
+ phases = {
298
+ pre_alpha: {
299
+ name: legacyStacks.pre_alpha.name,
300
+ description: legacyStacks.pre_alpha.description,
301
+ enabledStacks: legacyStacks.pre_alpha.services,
302
+ },
303
+ alpha: {
304
+ name: legacyStacks.alpha.name,
305
+ description: legacyStacks.alpha.description,
306
+ enabledStacks: legacyStacks.alpha.services,
307
+ },
308
+ beta: {
309
+ name: legacyStacks.beta.name,
310
+ description: legacyStacks.beta.description,
311
+ enabledStacks: legacyStacks.beta.services,
312
+ },
313
+ out_of_scope: {
314
+ name: legacyStacks.out_of_scope.name,
315
+ description: legacyStacks.out_of_scope.description,
316
+ enabledStacks: legacyStacks.out_of_scope.services,
317
+ },
318
+ };
319
+ }
320
+ if (!phases) {
321
+ return null;
322
+ }
323
+ if (!config.optional_infra || typeof config.optional_infra !== "object") {
324
+ return null;
325
+ }
326
+ const optionalInfra = config.optional_infra;
327
+ if (typeof optionalInfra.monitoring !== "boolean" ||
328
+ typeof optionalInfra.elk !== "boolean" ||
329
+ typeof optionalInfra.debezium !== "boolean" ||
330
+ typeof optionalInfra.golden_image !== "boolean" ||
331
+ typeof optionalInfra.verdaccio !== "boolean") {
332
+ return null;
333
+ }
334
+ if (!config.discovery || typeof config.discovery !== "object") {
335
+ return null;
336
+ }
337
+ const discovery = config.discovery;
338
+ if (!Array.isArray(discovery.paths)) {
339
+ return null;
340
+ }
341
+ return {
342
+ version: config.version,
343
+ project: config.project,
344
+ phases,
345
+ always_enabled_infra: config.always_enabled_infra,
346
+ optional_infra: config.optional_infra,
347
+ discovery: config.discovery,
348
+ overrides: config.overrides,
349
+ };
350
+ }
351
+ export function readProjectConfig(projectRoot) {
352
+ const projectJsonPath = path.join(projectRoot, ".tdk", "project.json");
353
+ if (!fs.existsSync(projectJsonPath)) {
354
+ throw new Error(`Project config not found: ${projectJsonPath}. Run 'tdk project init' first.`);
355
+ }
356
+ const jsonContent = fs.readFileSync(projectJsonPath, "utf-8");
357
+ const parsed = JSON.parse(jsonContent);
358
+ const projectConfig = normalizeProjectConfig(parsed);
359
+ if (!projectConfig) {
360
+ throw new Error("Invalid project.json: missing or invalid required fields. " +
361
+ "Expected: version (string), project (object with name/version), " +
362
+ "phases (object with pre_alpha/alpha/beta/out_of_scope enabledStacks), " +
363
+ "optional_infra (object with boolean flags), " +
364
+ "discovery (object with paths array)");
365
+ }
366
+ return projectConfig;
367
+ }
368
+ // Sablier ("sablier: {enable: true}" on a resource's own service.json) is
369
+ // Premium, but unlike Verdaccio below, this is NOT the enforcement - it's a
370
+ // friendly heads-up. The real gate is that engine/.../sablier_container_cycle.star
371
+ // in this (public) repo is a free-tier stub that always returns disabled; the
372
+ // working implementation only exists in the private tdk-cli-extensions/premium/
373
+ // bundle, applied by vendorTdkExtension()'s applyPremiumOverlay() below when a
374
+ // license grants it. Forking this repo and deleting a license check (as you
375
+ // could with Verdaccio/DDD) gets you nothing here, because there's no check to
376
+ // delete - the actual code simply isn't present without the overlay. This just
377
+ // tells a confused free-tier user why their `sablier` block silently does
378
+ // nothing, instead of leaving them to guess.
379
+ async function warnIfSablierUnlicensed(projectRoot) {
380
+ const resources = discoverResourcesFromRoot(projectRoot).filter((r) => r.config?.sablier?.enable === true);
381
+ if (resources.length === 0)
382
+ return;
383
+ const granted = await hasSablierLicense(projectRoot);
384
+ if (granted)
385
+ return;
386
+ console.warn(`⚠️ Sablier (on-demand scaling) is a Premium feature - no valid license key found. ` +
387
+ `${resources.length} resource${resources.length === 1 ? " has" : "s have"} a \`sablier\` block, ` +
388
+ "but it will have no effect without a license. Set TDK_LICENSE_KEY to a key that grants it, " +
389
+ "or remove the `sablier` block from the affected service.json file(s) to silence this warning.");
390
+ }
391
+ function ensureRootWorkspaceManifest(projectRoot, projectConfig) {
392
+ const packageJsonPath = path.join(projectRoot, "package.json");
393
+ if (fs.existsSync(packageJsonPath)) {
394
+ return false;
395
+ }
396
+ const manifest = {
397
+ name: projectConfig.project.name || path.basename(projectRoot),
398
+ version: projectConfig.project.version || "1.0.0",
399
+ private: true,
400
+ type: "module",
401
+ workspaces: projectConfig.discovery.paths,
402
+ };
403
+ writeTextFile(packageJsonPath, `${JSON.stringify(manifest, null, 2)}\n`);
404
+ return true;
405
+ }
406
+ export async function generateMasterConfigs(projectRoot) {
407
+ const projectConfig = readProjectConfig(projectRoot);
408
+ await warnIfSablierUnlicensed(projectRoot);
409
+ if (ensureRootWorkspaceManifest(projectRoot, projectConfig)) {
410
+ console.log("✓ Generated: package.json (workspace root)");
411
+ }
412
+ // Verdaccio is Premium, but unlike the old posture here, this is NOT the
413
+ // enforcement - it's a friendly heads-up. The real gate is that
414
+ // engine/topologies/platform/registries/verdaccio_loader.star in this
415
+ // (public) repo is a free-tier stub that always skips; the working loader
416
+ // only exists in the private tdk-cli-extensions/premium/ bundle, applied
417
+ // by vendorTdkExtension()'s applyPremiumOverlay() below when a license
418
+ // grants it. Forking this repo and deleting a license check gets you
419
+ // nothing, because there's no check left to delete - the actual code
420
+ // simply isn't present without the overlay. This just tells a confused
421
+ // free-tier user why enabling Verdaccio silently did nothing, instead of
422
+ // leaving them to guess.
423
+ const verdaccioInPhase = Object.values(projectConfig.phases).some((phase) => phase.enabledStacks.includes("verdaccio"));
424
+ if (projectConfig.optional_infra.verdaccio || verdaccioInPhase) {
425
+ const granted = await hasVerdaccioLicense(projectRoot);
426
+ if (!granted) {
427
+ console.warn("⚠️ Verdaccio is a Premium feature - no valid license key found. It's enabled in " +
428
+ "this project's config, but will have no effect without a license. Set TDK_LICENSE_KEY " +
429
+ "to a key that grants it, or run `tdk config disable-infra verdaccio` to silence this warning.");
430
+ }
431
+ }
432
+ const outputDir = path.join(projectRoot, ".tdk", ".tdk-out");
433
+ if (!fs.existsSync(outputDir)) {
434
+ fs.mkdirSync(outputDir, { recursive: true });
435
+ }
436
+ const engine = new TemplateEngine();
437
+ const files = engine.generateAll(projectConfig);
438
+ for (const filename of ALL_GENERATED_FILES) {
439
+ const content = files[filename];
440
+ const filePath = path.join(outputDir, filename);
441
+ writeTextFile(filePath, content);
442
+ console.log(`✓ Generated: .tdk/.tdk-out/${filename}`);
443
+ }
444
+ if (isStackFeatureEnabledInStacks(projectConfig.phases, "database-management")) {
445
+ const composeDir = path.join(projectRoot, "services", "platform", "database-management");
446
+ fs.mkdirSync(composeDir, { recursive: true });
447
+ const composePath = path.join(composeDir, "docker-compose.yml");
448
+ writeTextFile(composePath, generateDatabaseManagementCompose(projectConfig));
449
+ console.log("✓ Generated: services/platform/database-management/docker-compose.yml");
450
+ }
451
+ // Copy .tiltignore to project root so Tilt uses it
452
+ const tiltignoreSource = path.join(outputDir, ".tiltignore");
453
+ const tiltignoreTarget = path.join(projectRoot, ".tiltignore");
454
+ if (fs.existsSync(tiltignoreSource)) {
455
+ fs.copyFileSync(tiltignoreSource, tiltignoreTarget);
456
+ console.log(`✓ Copied: .tiltignore → project root`);
457
+ }
458
+ const copiedAssets = ensureProjectRuntimeAssets(projectRoot);
459
+ for (const asset of copiedAssets) {
460
+ console.log(`✓ Copied: ${asset} → project root`);
461
+ }
462
+ await vendorTdkExtension(projectRoot);
463
+ console.log("");
464
+ console.log("💡 To start Tilt: tdk up");
465
+ }
466
+ // The generated Tiltfile loads the TDK Tilt extension (engine, discovery,
467
+ // specs, ext starlark modules). The extension repo may stay private, so we
468
+ // vendor a working copy into .tdk/.tdk-out/tdk-cli-ext/ at generation time.
469
+ // This makes `tdk up` work offline and on any machine - no hardcoded paths,
470
+ // no dependency on a private GitHub repo.
471
+ const TDK_EXTENSION_DIRS = ["engine", "discovery", "specs", "ext"];
472
+ const PROJECT_RUNTIME_ASSET_DIRS = [["shared-platform-engineering", "docker-templates"]];
473
+ const REQUIRED_DOCKER_TEMPLATE_FILES = [
474
+ "install-deps.sh",
475
+ "bun-hoisted-symlink-fix.sh",
476
+ "prisma-bun-client-link-fix.sh",
477
+ "prisma-normalize-client.sh",
478
+ ];
479
+ // Walk up from this module's own location looking for a directory that has
480
+ // both Tiltfile and engine/ next to it - true when cli/ and engine/ ship
481
+ // together in the same repo (the public tdk-cli-core layout, where a plain
482
+ // `git clone` + `bun run` needs zero extra config to find the engine).
483
+ function findSelfContainedEngineRoot() {
484
+ let dir = import.meta.dirname || process.cwd();
485
+ for (let i = 0; i < 6; i++) {
486
+ if (fs.existsSync(path.join(dir, "Tiltfile")) && fs.existsSync(path.join(dir, "engine"))) {
487
+ return dir;
488
+ }
489
+ const parent = path.dirname(dir);
490
+ if (parent === dir)
491
+ break;
492
+ dir = parent;
493
+ }
494
+ return null;
495
+ }
496
+ function findCliAssetRoot() {
497
+ let dir = import.meta.dirname || process.cwd();
498
+ for (let i = 0; i < 8; i++) {
499
+ if (fs.existsSync(path.join(dir, "shared-platform-engineering", "docker-templates"))) {
500
+ return dir;
501
+ }
502
+ const parent = path.dirname(dir);
503
+ if (parent === dir)
504
+ break;
505
+ dir = parent;
506
+ }
507
+ const exeDir = path.dirname(process.execPath);
508
+ const candidates = [
509
+ path.join(exeDir, "tdk-cli"),
510
+ path.join(process.cwd(), "node_modules", "@tdk-landscape", "tdk-cli-core"),
511
+ ];
512
+ return (candidates.find((candidate) => fs.existsSync(path.join(candidate, "shared-platform-engineering", "docker-templates"))) ?? null);
513
+ }
514
+ export function ensureProjectRuntimeAssets(projectRoot) {
515
+ const sourceRoot = findCliAssetRoot();
516
+ const copied = [];
517
+ if (!sourceRoot) {
518
+ console.warn("⚠️ TDK runtime assets not found - generated Dockerfiles may fail. " +
519
+ "Reinstall or upgrade TDK, then re-run `tdk project`.");
520
+ return copied;
521
+ }
522
+ for (const parts of PROJECT_RUNTIME_ASSET_DIRS) {
523
+ const source = path.join(sourceRoot, ...parts);
524
+ const target = path.join(projectRoot, ...parts);
525
+ if (!fs.existsSync(source)) {
526
+ continue;
527
+ }
528
+ fs.mkdirSync(path.dirname(target), { recursive: true });
529
+ fs.cpSync(source, target, { recursive: true });
530
+ copied.push(parts.join("/"));
531
+ }
532
+ for (const file of REQUIRED_DOCKER_TEMPLATE_FILES) {
533
+ const filePath = path.join(projectRoot, "shared-platform-engineering", "docker-templates", file);
534
+ if (!fs.existsSync(filePath)) {
535
+ console.warn(`⚠️ Missing runtime asset after copy: ${filePath}`);
536
+ }
537
+ }
538
+ return copied;
539
+ }
540
+ async function vendorTdkExtension(projectRoot) {
541
+ const outputDir = path.join(projectRoot, ".tdk", ".tdk-out");
542
+ const vendoredDir = path.join(outputDir, "tdk-cli-ext");
543
+ // Source resolution order:
544
+ // 1. $TDK_EXTENSION_SOURCE (explicit override)
545
+ // 2. Self-contained repo (engine/ ships next to cli/ - public tdk-cli-core)
546
+ // 3. Executable-adjacent checkout (bundled installs)
547
+ // 4. Relative ../tdk-cli sibling (monorepo maintainer layout)
548
+ const sources = [];
549
+ if (process.env.TDK_EXTENSION_SOURCE) {
550
+ sources.push(process.env.TDK_EXTENSION_SOURCE);
551
+ }
552
+ const selfContainedRoot = findSelfContainedEngineRoot();
553
+ if (selfContainedRoot) {
554
+ sources.push(selfContainedRoot);
555
+ }
556
+ // process.execPath is the compiled binary's own path when running as a
557
+ // standalone executable (what we actually need here). In dev mode it's
558
+ // the bun CLI's own path instead (e.g. ~/.bun/bin/bun) - harmless, that
559
+ // candidate just won't match anything and falls through to the next
560
+ // one. Note: process.executablePath is not a real property on Node or
561
+ // Bun's process object - it was always undefined, silently falling
562
+ // back to cwd() instead of the binary's real location.
563
+ const exeDir = path.dirname(process.execPath);
564
+ sources.push(path.join(exeDir, "tdk-cli"));
565
+ sources.push(path.join(projectRoot, "..", "tdk-cli"));
566
+ let sourceRoot = "";
567
+ for (const candidate of sources) {
568
+ if (candidate &&
569
+ fs.existsSync(path.join(candidate, "Tiltfile")) &&
570
+ fs.existsSync(path.join(candidate, "engine"))) {
571
+ sourceRoot = candidate;
572
+ break;
573
+ }
574
+ }
575
+ if (!sourceRoot) {
576
+ console.warn("⚠️ TDK extension not found - set TDK_EXTENSION_SOURCE to its checkout path " +
577
+ "and re-run `tdk project` (or `tdk config regenerate`) to vendor it before `tdk up`.");
578
+ return;
579
+ }
580
+ if (!fs.existsSync(vendoredDir)) {
581
+ fs.mkdirSync(vendoredDir, { recursive: true });
582
+ }
583
+ fs.copyFileSync(path.join(sourceRoot, "Tiltfile"), path.join(vendoredDir, "Tiltfile"));
584
+ for (const dir of TDK_EXTENSION_DIRS) {
585
+ fs.cpSync(path.join(sourceRoot, dir), path.join(vendoredDir, dir), {
586
+ recursive: true,
587
+ });
588
+ }
589
+ console.log(`✓ Vendored TDK extension → .tdk/.tdk-out/tdk-cli-ext/`);
590
+ // Best-effort: if TDK_LICENSE_KEY is set and grants any paid resource,
591
+ // overlay the premium bundle over the stub files just vendored above.
592
+ // No-ops silently (beyond a warning) if there's no key, the fetch
593
+ // fails, or nothing's granted - the free engine already works fine on
594
+ // its own.
595
+ try {
596
+ const { applyPremiumOverlay } = await import("./extension-fetch.js");
597
+ await applyPremiumOverlay(projectRoot, vendoredDir);
598
+ }
599
+ catch (err) {
600
+ console.warn(`⚠️ Premium overlay skipped: ${err.message}`);
601
+ }
602
+ }
603
+ export function verifyMasterConfigs(projectRoot) {
604
+ const errors = [];
605
+ const projectConfig = readProjectConfig(projectRoot);
606
+ const engine = new TemplateEngine();
607
+ const expectedFiles = engine.generateAll(projectConfig);
608
+ const outputDir = path.join(projectRoot, ".tdk", ".tdk-out");
609
+ for (const filename of ALL_GENERATED_FILES) {
610
+ const expectedContent = expectedFiles[filename];
611
+ const filePath = path.join(outputDir, filename);
612
+ if (!fs.existsSync(filePath)) {
613
+ errors.push(`Missing file: .tdk/.tdk-out/${filename}`);
614
+ continue;
615
+ }
616
+ const actualContent = fs.readFileSync(filePath, "utf-8");
617
+ if (actualContent !== expectedContent) {
618
+ errors.push(`Out of sync: .tdk/.tdk-out/${filename} (run 'tdk config regenerate')`);
619
+ }
620
+ }
621
+ return { valid: errors.length === 0, errors };
622
+ }
623
+ //# sourceMappingURL=template-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../../src/generator/template-engine.ts"],"names":[],"mappings":"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"}