@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 @@
1
+ {"version":3,"file":"service-urls.js","sourceRoot":"","sources":["../../src/utils/service-urls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { DiscoveredResource, DiscoveredStack, ResourceMetadata, StackMetadata } from "../types/index.js";
2
+ export declare function discoverResourcesFromRoot(projectRoot: string): DiscoveredResource[];
3
+ export declare function discoverResources(): DiscoveredResource[];
4
+ /**
5
+ * Unique, sorted `stack` values across discovered service.json files under `projectRoot`.
6
+ * Tilt's discovery groups services by this same field (see tdk-cli-extensions
7
+ * discovery_orchestrator.star), so these are the names that must appear in a
8
+ * stack's `services` list in .tdk/project.json for that group to be enabled.
9
+ */
10
+ export declare function discoverStackNames(projectRoot: string): string[];
11
+ export declare function getAllStacks(resources?: DiscoveredResource[]): string[];
12
+ export declare function discoverStacks(): DiscoveredStack[];
13
+ export declare function getResourcesForStack(stackName: string): DiscoveredResource[];
14
+ export declare function stackExists(stackName: string): boolean;
15
+ export declare function clearMetadataCache(): void;
16
+ export declare function getResourceMetadata(resource: DiscoveredResource): ResourceMetadata;
17
+ export declare function getStackMetadata(stack: DiscoveredStack): StackMetadata;
18
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/utils/services.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,kBAAkB,EAClB,eAAe,EAGf,gBAAgB,EAEhB,aAAa,EACd,MAAM,mBAAmB,CAAC;AA8E3B,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,EAAE,CASnF;AAED,wBAAgB,iBAAiB,IAAI,kBAAkB,EAAE,CAUxD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhE;AAED,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAWvE;AAED,wBAAgB,cAAc,IAAI,eAAe,EAAE,CA0BlD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAG5E;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGtD;AAWD,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AA4BD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,gBAAgB,CAwDlF;AA0CD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CA0CtE"}
@@ -0,0 +1,292 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { Cache, createCacheValidator } from "./cache.js";
4
+ import { AUTOGENERATED_FILE_PATTERNS, SKIP_DIRECTORIES } from "./constants.js";
5
+ import { formatCount } from "./formatting.js";
6
+ import { findProjectRoot } from "./paths.js";
7
+ import { includes } from "./validation.js";
8
+ const RESOURCE_JSON_FILENAME = "service.json";
9
+ function findServiceJsonFiles(dir, maxDepth = 5, currentDepth = 0) {
10
+ const results = [];
11
+ if (currentDepth > maxDepth) {
12
+ return results;
13
+ }
14
+ const entries = readdirSync(dir, { withFileTypes: true });
15
+ for (const entry of entries) {
16
+ const fullPath = join(dir, entry.name);
17
+ if (entry.isDirectory()) {
18
+ if (shouldSkipDirectory(entry.name))
19
+ continue;
20
+ results.push(...findServiceJsonFiles(fullPath, maxDepth, currentDepth + 1));
21
+ }
22
+ else if (entry.isFile() && entry.name === RESOURCE_JSON_FILENAME) {
23
+ results.push(fullPath);
24
+ }
25
+ }
26
+ return results;
27
+ }
28
+ function shouldSkipDirectory(name) {
29
+ return includes(SKIP_DIRECTORIES, name) || name.startsWith(".");
30
+ }
31
+ function isValidResourceConfig(value) {
32
+ if (!value || typeof value !== "object")
33
+ return false;
34
+ const config = value;
35
+ // Accept runtime, appType, or type (for backward compatibility with existing service.json files)
36
+ const hasRuntimeOrAppType = typeof config.runtime === "string" ||
37
+ typeof config.appType === "string" ||
38
+ typeof config.type === "string";
39
+ return typeof config.appName === "string" && hasRuntimeOrAppType;
40
+ }
41
+ function parseResource(serviceJsonPath) {
42
+ const content = readFileSync(serviceJsonPath, "utf-8");
43
+ const parsed = JSON.parse(content);
44
+ if (!isValidResourceConfig(parsed)) {
45
+ throw new Error(`Invalid service.json at ${serviceJsonPath}: missing required fields (appName, runtime or appType)`);
46
+ }
47
+ const parsedConfig = parsed;
48
+ const config = {
49
+ ...parsedConfig,
50
+ appType: (parsedConfig.appType ||
51
+ parsedConfig.type),
52
+ };
53
+ const resourceDir = dirname(serviceJsonPath);
54
+ return {
55
+ name: config.appName,
56
+ path: resourceDir,
57
+ configPath: serviceJsonPath,
58
+ config,
59
+ stack: config.stack,
60
+ };
61
+ }
62
+ export function discoverResourcesFromRoot(projectRoot) {
63
+ const serviceJsonPaths = findServiceJsonFiles(projectRoot);
64
+ const resources = [];
65
+ for (const path of serviceJsonPaths) {
66
+ resources.push(parseResource(path));
67
+ }
68
+ return resources;
69
+ }
70
+ export function discoverResources() {
71
+ const projectRoot = findProjectRoot();
72
+ if (!projectRoot) {
73
+ throw new Error("Could not find project root (no Tiltfile found). Make sure you're in a root project.");
74
+ }
75
+ return discoverResourcesFromRoot(projectRoot);
76
+ }
77
+ /**
78
+ * Unique, sorted `stack` values across discovered service.json files under `projectRoot`.
79
+ * Tilt's discovery groups services by this same field (see tdk-cli-extensions
80
+ * discovery_orchestrator.star), so these are the names that must appear in a
81
+ * stack's `services` list in .tdk/project.json for that group to be enabled.
82
+ */
83
+ export function discoverStackNames(projectRoot) {
84
+ const resources = discoverResourcesFromRoot(projectRoot);
85
+ const stacks = new Set();
86
+ for (const resource of resources) {
87
+ if (resource.stack) {
88
+ stacks.add(resource.stack);
89
+ }
90
+ }
91
+ return Array.from(stacks).sort();
92
+ }
93
+ export function getAllStacks(resources) {
94
+ const resourcesToScan = resources || discoverResources();
95
+ const stacks = new Set();
96
+ for (const resource of resourcesToScan) {
97
+ if (resource.stack) {
98
+ stacks.add(resource.stack);
99
+ }
100
+ }
101
+ return Array.from(stacks).sort();
102
+ }
103
+ export function discoverStacks() {
104
+ const resources = discoverResources();
105
+ const stackMap = new Map();
106
+ for (const resource of resources) {
107
+ if (resource.stack) {
108
+ const stackResources = stackMap.get(resource.stack);
109
+ if (stackResources) {
110
+ stackResources.push(resource);
111
+ }
112
+ else {
113
+ stackMap.set(resource.stack, [resource]);
114
+ }
115
+ }
116
+ }
117
+ const stacks = [];
118
+ for (const [name, stackResources] of stackMap) {
119
+ stacks.push({
120
+ name,
121
+ description: formatCount(stackResources.length, "resource"),
122
+ resources: stackResources,
123
+ resourceCount: stackResources.length,
124
+ });
125
+ }
126
+ return stacks.sort((a, b) => a.name.localeCompare(b.name));
127
+ }
128
+ export function getResourcesForStack(stackName) {
129
+ const allResources = discoverResources();
130
+ return allResources.filter((r) => r.stack === stackName);
131
+ }
132
+ export function stackExists(stackName) {
133
+ const resources = getResourcesForStack(stackName);
134
+ return resources.length > 0;
135
+ }
136
+ /**
137
+ * Cache TTL in milliseconds
138
+ */
139
+ const CACHE_TTL_MS = 5000;
140
+ const resourcesCache = new Cache({ ttlMs: CACHE_TTL_MS });
141
+ const stacksCache = new Cache({ ttlMs: CACHE_TTL_MS });
142
+ const cacheValidator = createCacheValidator(CACHE_TTL_MS);
143
+ export function clearMetadataCache() {
144
+ resourcesCache.clear();
145
+ stacksCache.clear();
146
+ cacheValidator.reset();
147
+ }
148
+ function detectFileType(filename, content) {
149
+ if (filename === "Dockerfile" || filename.startsWith("docker-compose")) {
150
+ return "docker";
151
+ }
152
+ if (filename === "Tiltfile" || filename.endsWith(".star")) {
153
+ return "tilt";
154
+ }
155
+ if (filename === "vite.config.ts" ||
156
+ filename === "tsconfig.json" ||
157
+ filename === "package.json") {
158
+ return "config";
159
+ }
160
+ if (filename === "schema.prisma" || filename.includes("migration")) {
161
+ return "prisma";
162
+ }
163
+ if (content) {
164
+ const firstLines = content.split("\n").slice(0, 10).join("\n");
165
+ if (firstLines.includes("GENERATED BY TDK") || firstLines.includes("AUTOGENERATED")) {
166
+ return "generated";
167
+ }
168
+ }
169
+ return "unknown";
170
+ }
171
+ export function getResourceMetadata(resource) {
172
+ const cacheKey = resource.configPath;
173
+ if (cacheValidator.isValid()) {
174
+ const cached = resourcesCache.get(cacheKey);
175
+ if (cached) {
176
+ return cached;
177
+ }
178
+ }
179
+ const resourceDir = resource.path;
180
+ const stats = statSync(resource.configPath);
181
+ const createdAt = stats.mtime.toISOString();
182
+ const lastModified = stats.mtime.toISOString();
183
+ const autogeneratedFiles = discoverAutogeneratedFiles(resourceDir);
184
+ const hasDockerfile = existsSync(join(resourceDir, "Dockerfile"));
185
+ const hasTiltfile = existsSync(join(resourceDir, "Tiltfile"));
186
+ const hasDockerCompose = existsSync(join(resourceDir, "docker-compose.yml")) ||
187
+ existsSync(join(resourceDir, "docker-compose.yaml"));
188
+ const configType = resource.config?.appType;
189
+ let type = configType || "backend";
190
+ if (!configType) {
191
+ if (resource.name.includes("frontend")) {
192
+ type = "frontend";
193
+ }
194
+ else if (resource.name.includes("sdk") ||
195
+ resource.name.includes("lib") ||
196
+ resource.name.includes("infra")) {
197
+ type = "library";
198
+ }
199
+ }
200
+ const metadata = {
201
+ name: resource.name,
202
+ stack: resource.stack,
203
+ type,
204
+ port: resource.config?.port,
205
+ createdAt,
206
+ lastModified,
207
+ dependencies: resource.config?.dependsOn ?? [],
208
+ hasDockerfile,
209
+ hasTiltfile,
210
+ hasDockerCompose,
211
+ autogeneratedFiles,
212
+ status: "unknown",
213
+ };
214
+ resourcesCache.set(cacheKey, metadata);
215
+ cacheValidator.markUpdated();
216
+ return metadata;
217
+ }
218
+ function discoverAutogeneratedFiles(resourceDir) {
219
+ const files = [];
220
+ for (const pattern of AUTOGENERATED_FILE_PATTERNS) {
221
+ const filePath = join(resourceDir, pattern);
222
+ if (existsSync(filePath)) {
223
+ const stats = statSync(filePath);
224
+ const content = readFileSync(filePath, "utf-8");
225
+ files.push({
226
+ name: pattern,
227
+ path: filePath,
228
+ type: detectFileType(pattern, content),
229
+ size: stats.size,
230
+ lastModified: stats.mtime.toISOString(),
231
+ });
232
+ }
233
+ }
234
+ const prismaDir = join(resourceDir, "prisma");
235
+ if (existsSync(prismaDir)) {
236
+ const entries = readdirSync(prismaDir);
237
+ for (const entry of entries) {
238
+ if (entry === "schema.prisma" || entry.includes("migration")) {
239
+ const filePath = join(prismaDir, entry);
240
+ const stats = statSync(filePath);
241
+ files.push({
242
+ name: `prisma/${entry}`,
243
+ path: filePath,
244
+ type: "prisma",
245
+ size: stats.size,
246
+ lastModified: stats.mtime.toISOString(),
247
+ });
248
+ }
249
+ }
250
+ }
251
+ return files.sort((a, b) => a.name.localeCompare(b.name));
252
+ }
253
+ export function getStackMetadata(stack) {
254
+ const cacheKey = stack.name;
255
+ if (cacheValidator.isValid()) {
256
+ const cached = stacksCache.get(cacheKey);
257
+ if (cached) {
258
+ return cached;
259
+ }
260
+ }
261
+ const resourcesMetadata = stack.resources.map((r) => getResourceMetadata(r));
262
+ const timestamps = resourcesMetadata.map((r) => new Date(r.createdAt).getTime());
263
+ const earliestTimestamp = Math.min(...timestamps);
264
+ const latestTimestamp = Math.max(...timestamps);
265
+ const totalResources = resourcesMetadata.length;
266
+ let overallStatus = "unknown";
267
+ if (totalResources > 0) {
268
+ const readyCount = resourcesMetadata.filter((r) => r.status === "ready").length;
269
+ const ratio = readyCount / totalResources;
270
+ if (ratio > 0.9) {
271
+ overallStatus = "healthy";
272
+ }
273
+ else if (ratio > 0.5) {
274
+ overallStatus = "degraded";
275
+ }
276
+ else {
277
+ overallStatus = "error";
278
+ }
279
+ }
280
+ const metadata = {
281
+ name: stack.name,
282
+ resourceCount: resourcesMetadata.length,
283
+ createdAt: new Date(earliestTimestamp).toISOString(),
284
+ lastModified: new Date(latestTimestamp).toISOString(),
285
+ resources: resourcesMetadata,
286
+ overallStatus,
287
+ };
288
+ stacksCache.set(cacheKey, metadata);
289
+ cacheValidator.markUpdated();
290
+ return metadata;
291
+ }
292
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/utils/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface StackFeature {
2
+ name: string;
3
+ description: string;
4
+ generatedFiles: string[];
5
+ }
6
+ export declare const STACK_FEATURES: Record<string, StackFeature>;
7
+ export interface StackFeaturePhaseConfig {
8
+ pre_alpha?: {
9
+ enabledStacks?: string[];
10
+ };
11
+ alpha?: {
12
+ enabledStacks?: string[];
13
+ };
14
+ beta?: {
15
+ enabledStacks?: string[];
16
+ };
17
+ out_of_scope?: {
18
+ enabledStacks?: string[];
19
+ };
20
+ }
21
+ export declare function isStackFeatureEnabledInStacks(stacks: StackFeaturePhaseConfig, featureName: string): boolean;
22
+ //# sourceMappingURL=stack-features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-features.d.ts","sourceRoot":"","sources":["../../src/utils/stack-features.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAMvD,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACzC,KAAK,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACrC,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACpC,YAAY,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC7C;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,uBAAuB,EAC/B,WAAW,EAAE,MAAM,GAClB,OAAO,CAKT"}
@@ -0,0 +1,13 @@
1
+ export const STACK_FEATURES = {
2
+ "database-management": {
3
+ name: "database-management",
4
+ description: "Generate and load the stack-level PostgreSQL docker-compose file",
5
+ generatedFiles: ["services/platform/database-management/docker-compose.yml"],
6
+ },
7
+ };
8
+ export function isStackFeatureEnabledInStacks(stacks, featureName) {
9
+ if (!STACK_FEATURES[featureName])
10
+ return false;
11
+ return ["pre_alpha", "alpha", "beta"].some((phase) => stacks[phase]?.enabledStacks?.includes(featureName));
12
+ }
13
+ //# sourceMappingURL=stack-features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-features.js","sourceRoot":"","sources":["../../src/utils/stack-features.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,cAAc,GAAiC;IAC1D,qBAAqB,EAAE;QACrB,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,kEAAkE;QAC/E,cAAc,EAAE,CAAC,0DAA0D,CAAC;KAC7E;CACF,CAAC;AASF,MAAM,UAAU,6BAA6B,CAC3C,MAA+B,EAC/B,WAAmB;IAEnB,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,MAAM,CAAC,KAAsC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CACrF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Extracts a gzipped tarball (as an in-memory buffer) into destDir.
3
+ * Shells out to the system `tar` binary rather than pulling in a JS tar
4
+ * implementation - available by default on macOS and Linux.
5
+ */
6
+ export declare function extractTarball(data: Buffer, destDir: string): void;
7
+ //# sourceMappingURL=tar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["../../src/utils/tar.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAalE"}
@@ -0,0 +1,21 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ /**
6
+ * Extracts a gzipped tarball (as an in-memory buffer) into destDir.
7
+ * Shells out to the system `tar` binary rather than pulling in a JS tar
8
+ * implementation - available by default on macOS and Linux.
9
+ */
10
+ export function extractTarball(data, destDir) {
11
+ const tmpFile = join(mkdtempSync(join(tmpdir(), "tdk-ext-")), "bundle.tar.gz");
12
+ writeFileSync(tmpFile, data);
13
+ const result = spawnSync("tar", ["xzf", tmpFile, "-C", destDir, "--strip-components=1"], {
14
+ stdio: "pipe",
15
+ });
16
+ rmSync(join(tmpFile, ".."), { recursive: true, force: true });
17
+ if (result.status !== 0) {
18
+ throw new Error(`tar extraction failed: ${result.stderr?.toString() || "unknown error"}`);
19
+ }
20
+ }
21
+ //# sourceMappingURL=tar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar.js","sourceRoot":"","sources":["../../src/utils/tar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAC/E,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE7B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,sBAAsB,CAAC,EAAE;QACvF,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { TiltCommandResult } from "../types/index.js";
2
+ export declare function runTilt(command: string, args?: string[], options?: {
3
+ verbose?: boolean;
4
+ quiet?: boolean;
5
+ inheritStdio?: boolean;
6
+ timeoutMs?: number;
7
+ }): Promise<TiltCommandResult>;
8
+ export declare function isTiltAvailable(): Promise<boolean>;
9
+ export declare function getTiltfilePath(): string;
10
+ export declare function buildTiltUpArgs(serviceNames: string[], options?: {
11
+ verbose?: boolean;
12
+ quiet?: boolean;
13
+ force?: boolean;
14
+ watch?: boolean;
15
+ focusTargets?: string[];
16
+ }): string[];
17
+ export declare function buildTiltDownArgs(options?: {
18
+ force?: boolean;
19
+ }): string[];
20
+ //# sourceMappingURL=tilt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tilt.d.ts","sourceRoot":"","sources":["../../src/utils/tilt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,iBAAiB,CAAC,CAuC5B;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAQxD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAOxC;AAOD,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACL,MAAM,EAAE,CAiCV;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,EAAE,CAS7E"}
@@ -0,0 +1,95 @@
1
+ import { spawn } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { findProjectRoot } from "./paths.js";
4
+ export function runTilt(command, args = [], options = {}) {
5
+ return new Promise((resolve, reject) => {
6
+ const tiltArgs = [command, ...args];
7
+ if (options.verbose) {
8
+ console.log(`Executing: tilt ${tiltArgs.join(" ")}`);
9
+ }
10
+ const child = spawn("tilt", tiltArgs, {
11
+ stdio: options.inheritStdio ? "inherit" : "pipe",
12
+ shell: false,
13
+ timeout: options.timeoutMs,
14
+ });
15
+ let stdout = "";
16
+ let stderr = "";
17
+ if (!options.inheritStdio) {
18
+ child.stdout?.on("data", (data) => {
19
+ stdout += data.toString();
20
+ });
21
+ child.stderr?.on("data", (data) => {
22
+ stderr += data.toString();
23
+ });
24
+ }
25
+ child.on("close", (code) => {
26
+ resolve({
27
+ exitCode: code ?? 1,
28
+ stdout,
29
+ stderr,
30
+ });
31
+ });
32
+ child.on("error", (err) => {
33
+ reject(new Error(`Failed to spawn tilt: ${err.message}`));
34
+ });
35
+ });
36
+ }
37
+ export async function isTiltAvailable() {
38
+ try {
39
+ const result = await runTilt("version", [], { inheritStdio: false, timeoutMs: 10_000 });
40
+ return result.exitCode === 0;
41
+ }
42
+ catch {
43
+ // tilt binary not found (or not spawnable) - treat as unavailable
44
+ return false;
45
+ }
46
+ }
47
+ export function getTiltfilePath() {
48
+ const projectRoot = findProjectRoot();
49
+ if (!projectRoot) {
50
+ throw new Error("Not in a TDK project (no .tdk/project.json found)");
51
+ }
52
+ return join(projectRoot, ".tdk", ".tdk-out", "Tiltfile");
53
+ }
54
+ function addTiltfilePath(args) {
55
+ const tiltfilePath = getTiltfilePath();
56
+ args.push("-f", tiltfilePath);
57
+ }
58
+ export function buildTiltUpArgs(serviceNames, options = {}) {
59
+ const args = [];
60
+ addTiltfilePath(args);
61
+ // Bare positional resource names only scope what this `tilt up` invocation waits
62
+ // on - they do NOT limit which resources the generated Tiltfile enables. Its focus
63
+ // filter (Config.apply_focus / apply_focus_filter) only reads the `--focus` flag;
64
+ // the positional-args catch-all it also defines (`cfg['args']`) is never read. So
65
+ // without `--focus`, every `tdk up <stack>` silently fell back to Tilt's default
66
+ // "pre-alpha" phase and built every stack in that phase, not just the one asked
67
+ // for. Passing the stack name via `--focus` reuses the Tiltfile's own (already
68
+ // dependency-aware) domain expansion instead of re-deriving it here.
69
+ //
70
+ // `--focus=...` needs a `--` before it: Tilt's own `tilt up` only accepts its own
71
+ // fixed flag set directly (see `tilt up --help`) and rejects anything else with
72
+ // "unknown flag" - `--` is what routes a token through to the Tiltfile's own
73
+ // config.parse(). Bare words like a service name aren't flag-shaped, so they don't
74
+ // need `--` to reach the Tiltfile's positional `args` catch-all.
75
+ if (options.focusTargets && options.focusTargets.length > 0) {
76
+ args.push("--", `--focus=${options.focusTargets.join(",")}`);
77
+ }
78
+ args.push(...serviceNames);
79
+ if (options.verbose && !options.quiet) {
80
+ args.push("--verbose");
81
+ }
82
+ if (options.watch) {
83
+ args.push("--watch");
84
+ }
85
+ return args;
86
+ }
87
+ export function buildTiltDownArgs(options = {}) {
88
+ const args = [];
89
+ addTiltfilePath(args);
90
+ if (options.force) {
91
+ args.push("--force");
92
+ }
93
+ return args;
94
+ }
95
+ //# sourceMappingURL=tilt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tilt.js","sourceRoot":"","sources":["../../src/utils/tilt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ValidationResult } from "../types/index.js";
2
+ export declare const KEBAB_CASE_REGEX: RegExp;
3
+ export declare function validateResourceName(name: string): ValidationResult;
4
+ export declare function createKebabCaseValidator(context: "resource" | "stack"): (input: string) => true | string;
5
+ export declare function validateOptionalInfraService(service: string): ValidationResult;
6
+ export declare function isValidPort(port: number): boolean;
7
+ /**
8
+ * Check a filesystem path segment for characters that are unsafe to use in a
9
+ * path (null bytes, or characters that are invalid on common filesystems).
10
+ * Does not check for path traversal (`..`) - callers that resolve the path
11
+ * against a base directory should check that separately.
12
+ */
13
+ export declare function isPathSafe(path: string): boolean;
14
+ export declare function sanitizeForShell(value: string, replacement?: string): string;
15
+ export declare function includes<T extends readonly string[]>(array: T, value: string): value is T[number];
16
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,eAAO,MAAM,gBAAgB,QAAiB,CAAC;AAM/C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAWnE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,WACrD,MAAM,KAAG,IAAI,GAAG,MAAM,CAWtC;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAQ9E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,GAAE,MAAY,GAAG,MAAM,CAEjF;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,CAEjG"}
@@ -0,0 +1,58 @@
1
+ import { OPTIONAL_INFRA_SERVICES } from "./constants.js";
2
+ export const KEBAB_CASE_REGEX = /^[a-z0-9-]+$/;
3
+ function isKebabCase(value) {
4
+ return KEBAB_CASE_REGEX.test(value);
5
+ }
6
+ export function validateResourceName(name) {
7
+ if (!name.trim()) {
8
+ return { valid: false, error: "Resource name is required" };
9
+ }
10
+ if (!isKebabCase(name)) {
11
+ return {
12
+ valid: false,
13
+ error: "Use lowercase letters, numbers, and hyphens only",
14
+ };
15
+ }
16
+ return { valid: true };
17
+ }
18
+ export function createKebabCaseValidator(context) {
19
+ return (input) => {
20
+ if (!input.trim()) {
21
+ return context === "resource" ? "Resource name is required" : "Stack name is required";
22
+ }
23
+ if (!isKebabCase(input)) {
24
+ return context === "resource"
25
+ ? "Use lowercase letters, numbers, and hyphens only"
26
+ : "Use kebab-case (lowercase, numbers, hyphens only)";
27
+ }
28
+ return true;
29
+ };
30
+ }
31
+ export function validateOptionalInfraService(service) {
32
+ if (includes(OPTIONAL_INFRA_SERVICES, service)) {
33
+ return { valid: true };
34
+ }
35
+ return {
36
+ valid: false,
37
+ error: `Invalid service. Must be one of: ${OPTIONAL_INFRA_SERVICES.join(", ")}`,
38
+ };
39
+ }
40
+ export function isValidPort(port) {
41
+ return Number.isInteger(port) && port > 0 && port <= 65535;
42
+ }
43
+ /**
44
+ * Check a filesystem path segment for characters that are unsafe to use in a
45
+ * path (null bytes, or characters that are invalid on common filesystems).
46
+ * Does not check for path traversal (`..`) - callers that resolve the path
47
+ * against a base directory should check that separately.
48
+ */
49
+ export function isPathSafe(path) {
50
+ return !path.includes("\0") && !/[<>:"|?*]/.test(path);
51
+ }
52
+ export function sanitizeForShell(value, replacement = "_") {
53
+ return value.replace(/[^a-zA-Z0-9-]/g, replacement).substring(0, 100);
54
+ }
55
+ export function includes(array, value) {
56
+ return array.includes(value);
57
+ }
58
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE/C,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,kDAAkD;SAC1D,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAA6B;IACpE,OAAO,CAAC,KAAa,EAAiB,EAAE;QACtC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,wBAAwB,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,OAAO,KAAK,UAAU;gBAC3B,CAAC,CAAC,kDAAkD;gBACpD,CAAC,CAAC,mDAAmD,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAe;IAC1D,IAAI,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,oCAAoC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,WAAW,GAAW,GAAG;IACvE,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,QAAQ,CAA8B,KAAQ,EAAE,KAAa;IAC3E,OAAQ,KAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC"}