@tdk-landscape/tdk-cli-core 1.3.53 → 1.3.54

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 (388) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/cli/dist/generator/extension-fetch.js +16 -9
  3. package/cli/package.json +1 -1
  4. package/package.json +16 -1
  5. package/.claude/skills/layer-autoresearch/SKILL.md +0 -48
  6. package/.claude/skills/tdk-troubleshoot/SKILL.md +0 -222
  7. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -40
  8. package/.github/ISSUE_TEMPLATE/config.yml +0 -11
  9. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -18
  10. package/.github/ISSUE_TEMPLATE/premium_license.yml +0 -43
  11. package/.github/dependabot.yml +0 -33
  12. package/.github/pull_request_template.md +0 -5
  13. package/.github/workflows/ci.yml +0 -200
  14. package/.github/workflows/release-binaries.yml +0 -139
  15. package/.github/zizmor.yml +0 -9
  16. package/.pre-commit-config.yaml +0 -57
  17. package/CODE_OF_CONDUCT.md +0 -9
  18. package/CONTRIBUTING.md +0 -42
  19. package/Makefile +0 -92
  20. package/SECURITY.md +0 -17
  21. package/benchmarks/results/container-scale-2026-09-25T20-54-49-736Z.json +0 -45
  22. package/benchmarks/results/container-scale-2026-09-25T21-01-20-540Z.json +0 -150
  23. package/benchmarks/results/container-scale-2026-09-25T21-15-01-441Z.json +0 -73
  24. package/benchmarks/results/container-scale-2026-09-25T22-09-01-630Z.json +0 -77
  25. package/benchmarks/results/container-scale-2026-09-25T22-18-28-371Z.json +0 -202
  26. package/cli/AGENTS.md +0 -390
  27. package/cli/DESIGN.md +0 -735
  28. package/cli/README.md +0 -292
  29. package/cli/biome.json +0 -40
  30. package/cli/dependency-graph.svg +0 -1135
  31. package/cli/dist/cli.d.ts +0 -3
  32. package/cli/dist/cli.d.ts.map +0 -1
  33. package/cli/dist/cli.js.map +0 -1
  34. package/cli/dist/commands/completion.d.ts +0 -3
  35. package/cli/dist/commands/completion.d.ts.map +0 -1
  36. package/cli/dist/commands/completion.js.map +0 -1
  37. package/cli/dist/commands/config.d.ts +0 -3
  38. package/cli/dist/commands/config.d.ts.map +0 -1
  39. package/cli/dist/commands/config.js.map +0 -1
  40. package/cli/dist/commands/doctor.d.ts +0 -19
  41. package/cli/dist/commands/doctor.d.ts.map +0 -1
  42. package/cli/dist/commands/doctor.js.map +0 -1
  43. package/cli/dist/commands/down.d.ts +0 -3
  44. package/cli/dist/commands/down.d.ts.map +0 -1
  45. package/cli/dist/commands/down.js.map +0 -1
  46. package/cli/dist/commands/help.d.ts +0 -2
  47. package/cli/dist/commands/help.d.ts.map +0 -1
  48. package/cli/dist/commands/help.js.map +0 -1
  49. package/cli/dist/commands/networks.d.ts +0 -3
  50. package/cli/dist/commands/networks.d.ts.map +0 -1
  51. package/cli/dist/commands/networks.js.map +0 -1
  52. package/cli/dist/commands/project.d.ts +0 -9
  53. package/cli/dist/commands/project.d.ts.map +0 -1
  54. package/cli/dist/commands/project.js.map +0 -1
  55. package/cli/dist/commands/projects.d.ts +0 -3
  56. package/cli/dist/commands/projects.d.ts.map +0 -1
  57. package/cli/dist/commands/projects.js.map +0 -1
  58. package/cli/dist/commands/resource.d.ts +0 -69
  59. package/cli/dist/commands/resource.d.ts.map +0 -1
  60. package/cli/dist/commands/resource.js.map +0 -1
  61. package/cli/dist/commands/resources.d.ts +0 -3
  62. package/cli/dist/commands/resources.d.ts.map +0 -1
  63. package/cli/dist/commands/resources.js.map +0 -1
  64. package/cli/dist/commands/stack.d.ts +0 -3
  65. package/cli/dist/commands/stack.d.ts.map +0 -1
  66. package/cli/dist/commands/stack.js.map +0 -1
  67. package/cli/dist/commands/stacks.d.ts +0 -3
  68. package/cli/dist/commands/stacks.d.ts.map +0 -1
  69. package/cli/dist/commands/stacks.js.map +0 -1
  70. package/cli/dist/commands/status.d.ts +0 -3
  71. package/cli/dist/commands/status.d.ts.map +0 -1
  72. package/cli/dist/commands/status.js.map +0 -1
  73. package/cli/dist/commands/ui.d.ts +0 -3
  74. package/cli/dist/commands/ui.d.ts.map +0 -1
  75. package/cli/dist/commands/ui.js.map +0 -1
  76. package/cli/dist/commands/up.d.ts +0 -3
  77. package/cli/dist/commands/up.d.ts.map +0 -1
  78. package/cli/dist/commands/up.js.map +0 -1
  79. package/cli/dist/commands/upgrade.d.ts +0 -14
  80. package/cli/dist/commands/upgrade.d.ts.map +0 -1
  81. package/cli/dist/commands/upgrade.js.map +0 -1
  82. package/cli/dist/commands/version.d.ts +0 -3
  83. package/cli/dist/commands/version.d.ts.map +0 -1
  84. package/cli/dist/commands/version.js.map +0 -1
  85. package/cli/dist/components/Accessible.d.ts +0 -8
  86. package/cli/dist/components/Accessible.d.ts.map +0 -1
  87. package/cli/dist/components/Accessible.js.map +0 -1
  88. package/cli/dist/components/BaseTooltip.d.ts +0 -4
  89. package/cli/dist/components/BaseTooltip.d.ts.map +0 -1
  90. package/cli/dist/components/BaseTooltip.js.map +0 -1
  91. package/cli/dist/components/DetailPanel.d.ts +0 -4
  92. package/cli/dist/components/DetailPanel.d.ts.map +0 -1
  93. package/cli/dist/components/DetailPanel.js.map +0 -1
  94. package/cli/dist/components/FileTree.d.ts +0 -4
  95. package/cli/dist/components/FileTree.d.ts.map +0 -1
  96. package/cli/dist/components/FileTree.js.map +0 -1
  97. package/cli/dist/components/ResourceSelectInput.d.ts +0 -4
  98. package/cli/dist/components/ResourceSelectInput.d.ts.map +0 -1
  99. package/cli/dist/components/ResourceSelectInput.js.map +0 -1
  100. package/cli/dist/components/ResourceTable.d.ts +0 -4
  101. package/cli/dist/components/ResourceTable.d.ts.map +0 -1
  102. package/cli/dist/components/ResourceTable.js.map +0 -1
  103. package/cli/dist/components/TabBar.d.ts +0 -4
  104. package/cli/dist/components/TabBar.d.ts.map +0 -1
  105. package/cli/dist/components/TabBar.js.map +0 -1
  106. package/cli/dist/components/Tooltip.d.ts +0 -12
  107. package/cli/dist/components/Tooltip.d.ts.map +0 -1
  108. package/cli/dist/components/Tooltip.js.map +0 -1
  109. package/cli/dist/components/index.d.ts +0 -8
  110. package/cli/dist/components/index.d.ts.map +0 -1
  111. package/cli/dist/components/index.js.map +0 -1
  112. package/cli/dist/config/platform-standards.d.ts +0 -159
  113. package/cli/dist/config/platform-standards.d.ts.map +0 -1
  114. package/cli/dist/config/platform-standards.js.map +0 -1
  115. package/cli/dist/generator/extension-fetch.d.ts +0 -25
  116. package/cli/dist/generator/extension-fetch.d.ts.map +0 -1
  117. package/cli/dist/generator/extension-fetch.js.map +0 -1
  118. package/cli/dist/generator/template-engine.d.ts +0 -62
  119. package/cli/dist/generator/template-engine.d.ts.map +0 -1
  120. package/cli/dist/generator/template-engine.js.map +0 -1
  121. package/cli/dist/index.d.ts +0 -11
  122. package/cli/dist/index.d.ts.map +0 -1
  123. package/cli/dist/index.js.map +0 -1
  124. package/cli/dist/types/index.d.ts +0 -257
  125. package/cli/dist/types/index.d.ts.map +0 -1
  126. package/cli/dist/types/index.js.map +0 -1
  127. package/cli/dist/utils/cache.d.ts +0 -19
  128. package/cli/dist/utils/cache.d.ts.map +0 -1
  129. package/cli/dist/utils/cache.js.map +0 -1
  130. package/cli/dist/utils/command-helpers.d.ts +0 -17
  131. package/cli/dist/utils/command-helpers.d.ts.map +0 -1
  132. package/cli/dist/utils/command-helpers.js.map +0 -1
  133. package/cli/dist/utils/constants.d.ts +0 -53
  134. package/cli/dist/utils/constants.d.ts.map +0 -1
  135. package/cli/dist/utils/constants.js.map +0 -1
  136. package/cli/dist/utils/discovery-context.d.ts +0 -4
  137. package/cli/dist/utils/discovery-context.d.ts.map +0 -1
  138. package/cli/dist/utils/discovery-context.js.map +0 -1
  139. package/cli/dist/utils/docker.d.ts +0 -4
  140. package/cli/dist/utils/docker.d.ts.map +0 -1
  141. package/cli/dist/utils/docker.js.map +0 -1
  142. package/cli/dist/utils/doctor-runtime.d.ts +0 -81
  143. package/cli/dist/utils/doctor-runtime.d.ts.map +0 -1
  144. package/cli/dist/utils/doctor-runtime.js.map +0 -1
  145. package/cli/dist/utils/env-validator.d.ts +0 -15
  146. package/cli/dist/utils/env-validator.d.ts.map +0 -1
  147. package/cli/dist/utils/env-validator.js.map +0 -1
  148. package/cli/dist/utils/errors.d.ts +0 -31
  149. package/cli/dist/utils/errors.d.ts.map +0 -1
  150. package/cli/dist/utils/errors.js.map +0 -1
  151. package/cli/dist/utils/file-helpers.d.ts +0 -14
  152. package/cli/dist/utils/file-helpers.d.ts.map +0 -1
  153. package/cli/dist/utils/file-helpers.js.map +0 -1
  154. package/cli/dist/utils/formatting.d.ts +0 -30
  155. package/cli/dist/utils/formatting.d.ts.map +0 -1
  156. package/cli/dist/utils/formatting.js.map +0 -1
  157. package/cli/dist/utils/paths.d.ts +0 -3
  158. package/cli/dist/utils/paths.d.ts.map +0 -1
  159. package/cli/dist/utils/paths.js.map +0 -1
  160. package/cli/dist/utils/port-assignment.d.ts +0 -6
  161. package/cli/dist/utils/port-assignment.d.ts.map +0 -1
  162. package/cli/dist/utils/port-assignment.js.map +0 -1
  163. package/cli/dist/utils/project-features.d.ts +0 -23
  164. package/cli/dist/utils/project-features.d.ts.map +0 -1
  165. package/cli/dist/utils/project-features.js.map +0 -1
  166. package/cli/dist/utils/project-templates.d.ts +0 -7
  167. package/cli/dist/utils/project-templates.d.ts.map +0 -1
  168. package/cli/dist/utils/project-templates.js.map +0 -1
  169. package/cli/dist/utils/prompt.d.ts +0 -28
  170. package/cli/dist/utils/prompt.d.ts.map +0 -1
  171. package/cli/dist/utils/prompt.js.map +0 -1
  172. package/cli/dist/utils/resource-features.d.ts +0 -29
  173. package/cli/dist/utils/resource-features.d.ts.map +0 -1
  174. package/cli/dist/utils/resource-features.js.map +0 -1
  175. package/cli/dist/utils/service-urls.d.ts +0 -30
  176. package/cli/dist/utils/service-urls.d.ts.map +0 -1
  177. package/cli/dist/utils/service-urls.js.map +0 -1
  178. package/cli/dist/utils/services.d.ts +0 -18
  179. package/cli/dist/utils/services.d.ts.map +0 -1
  180. package/cli/dist/utils/services.js.map +0 -1
  181. package/cli/dist/utils/stack-features.d.ts +0 -22
  182. package/cli/dist/utils/stack-features.d.ts.map +0 -1
  183. package/cli/dist/utils/stack-features.js.map +0 -1
  184. package/cli/dist/utils/tar.d.ts +0 -7
  185. package/cli/dist/utils/tar.d.ts.map +0 -1
  186. package/cli/dist/utils/tar.js.map +0 -1
  187. package/cli/dist/utils/tilt.d.ts +0 -20
  188. package/cli/dist/utils/tilt.d.ts.map +0 -1
  189. package/cli/dist/utils/tilt.js.map +0 -1
  190. package/cli/dist/utils/validation.d.ts +0 -16
  191. package/cli/dist/utils/validation.d.ts.map +0 -1
  192. package/cli/dist/utils/validation.js.map +0 -1
  193. package/cli/knip.json +0 -6
  194. package/cli/pnpm-lock.yaml +0 -2305
  195. package/cli/pnpm-workspace.yaml +0 -2
  196. package/cli/src/cli.ts +0 -72
  197. package/cli/src/commands/__tests__/always-enabled-infra.test.ts +0 -109
  198. package/cli/src/commands/__tests__/config.test.ts +0 -146
  199. package/cli/src/commands/__tests__/doctor.test.ts +0 -730
  200. package/cli/src/commands/__tests__/error-handling.test.ts +0 -78
  201. package/cli/src/commands/__tests__/phases-model.test.ts +0 -161
  202. package/cli/src/commands/__tests__/project-resource-features-e2e.test.ts +0 -187
  203. package/cli/src/commands/__tests__/project.test.ts +0 -68
  204. package/cli/src/commands/__tests__/resource.test.ts +0 -226
  205. package/cli/src/commands/__tests__/saas-starter-integration.test.ts +0 -194
  206. package/cli/src/commands/__tests__/stack-features-e2e.test.ts +0 -135
  207. package/cli/src/commands/__tests__/upgrade.test.ts +0 -198
  208. package/cli/src/commands/completion.ts +0 -300
  209. package/cli/src/commands/config.ts +0 -299
  210. package/cli/src/commands/doctor.ts +0 -926
  211. package/cli/src/commands/down.ts +0 -37
  212. package/cli/src/commands/help.ts +0 -143
  213. package/cli/src/commands/networks-design.md +0 -80
  214. package/cli/src/commands/networks.ts +0 -332
  215. package/cli/src/commands/project.ts +0 -456
  216. package/cli/src/commands/projects.ts +0 -82
  217. package/cli/src/commands/resource.ts +0 -652
  218. package/cli/src/commands/resources.ts +0 -95
  219. package/cli/src/commands/stack.ts +0 -128
  220. package/cli/src/commands/stacks.ts +0 -52
  221. package/cli/src/commands/status.ts +0 -88
  222. package/cli/src/commands/ui.tsx +0 -843
  223. package/cli/src/commands/up.ts +0 -169
  224. package/cli/src/commands/upgrade.ts +0 -628
  225. package/cli/src/commands/version.ts +0 -9
  226. package/cli/src/components/Accessible.tsx +0 -21
  227. package/cli/src/components/BaseTooltip.tsx +0 -66
  228. package/cli/src/components/DetailPanel.tsx +0 -146
  229. package/cli/src/components/FileTree.tsx +0 -89
  230. package/cli/src/components/ResourceSelectInput.tsx +0 -30
  231. package/cli/src/components/ResourceTable.tsx +0 -78
  232. package/cli/src/components/TabBar.tsx +0 -53
  233. package/cli/src/components/Tooltip.tsx +0 -11
  234. package/cli/src/components/index.ts +0 -7
  235. package/cli/src/config/platform-standards.test.ts +0 -11
  236. package/cli/src/config/platform-standards.ts +0 -196
  237. package/cli/src/generator/__tests__/extension-fetch.test.ts +0 -242
  238. package/cli/src/generator/__tests__/template-engine.test.ts +0 -70
  239. package/cli/src/generator/extension-fetch.ts +0 -286
  240. package/cli/src/generator/template-engine.ts +0 -752
  241. package/cli/src/index.ts +0 -86
  242. package/cli/src/templates.d.ts +0 -4
  243. package/cli/src/types/index.ts +0 -353
  244. package/cli/src/utils/__tests__/cache.test.ts +0 -98
  245. package/cli/src/utils/__tests__/formatting.test.ts +0 -170
  246. package/cli/src/utils/__tests__/paths.test.ts +0 -180
  247. package/cli/src/utils/__tests__/port-assignment.test.ts +0 -121
  248. package/cli/src/utils/__tests__/service-urls.test.ts +0 -174
  249. package/cli/src/utils/__tests__/services.test.ts +0 -531
  250. package/cli/src/utils/__tests__/tilt.test.ts +0 -172
  251. package/cli/src/utils/__tests__/validation.test.ts +0 -148
  252. package/cli/src/utils/cache.ts +0 -76
  253. package/cli/src/utils/command-helpers.ts +0 -54
  254. package/cli/src/utils/constants.ts +0 -130
  255. package/cli/src/utils/discovery-context.ts +0 -49
  256. package/cli/src/utils/docker.ts +0 -20
  257. package/cli/src/utils/doctor-runtime.ts +0 -644
  258. package/cli/src/utils/env-validator.ts +0 -139
  259. package/cli/src/utils/errors.ts +0 -168
  260. package/cli/src/utils/file-helpers.ts +0 -62
  261. package/cli/src/utils/formatting.ts +0 -215
  262. package/cli/src/utils/paths.ts +0 -53
  263. package/cli/src/utils/port-assignment.ts +0 -106
  264. package/cli/src/utils/project-features.ts +0 -118
  265. package/cli/src/utils/project-templates.ts +0 -29
  266. package/cli/src/utils/prompt.ts +0 -128
  267. package/cli/src/utils/resource-features.ts +0 -215
  268. package/cli/src/utils/service-urls.ts +0 -124
  269. package/cli/src/utils/services.ts +0 -364
  270. package/cli/src/utils/stack-features.ts +0 -30
  271. package/cli/src/utils/tar.ts +0 -24
  272. package/cli/src/utils/tilt.ts +0 -133
  273. package/cli/src/utils/validation.ts +0 -67
  274. package/cli/tsconfig.json +0 -25
  275. package/cli/tsconfig.typecheck.json +0 -8
  276. package/docs/FEATURES.md +0 -281
  277. package/docs/demo.svg +0 -217
  278. package/engine/docs/AUTODISCOVERY_TEST.md +0 -182
  279. package/engine/docs/C4-ARCHITECTURE-operations.md +0 -396
  280. package/engine/docs/C4-ARCHITECTURE-overview.md +0 -284
  281. package/engine/docs/C4-ARCHITECTURE.md +0 -17
  282. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +0 -349
  283. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +0 -357
  284. package/engine/docs/README.md +0 -284
  285. package/install.sh +0 -19
  286. package/knip.json +0 -10
  287. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/.openspec.yaml +0 -2
  288. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/design.md +0 -102
  289. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/proposal.md +0 -31
  290. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-notifications/spec.md +0 -48
  291. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-orchestration/spec.md +0 -63
  292. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-troubleshooting/spec.md +0 -56
  293. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/tasks.md +0 -61
  294. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/.openspec.yaml +0 -2
  295. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/design.md +0 -114
  296. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/proposal.md +0 -32
  297. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/manifest-field-migration/spec.md +0 -20
  298. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/resource-terminology-standard/spec.md +0 -20
  299. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/stack-terminology-standard/spec.md +0 -20
  300. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/tasks.md +0 -194
  301. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/.openspec.yaml +0 -2
  302. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/design.md +0 -111
  303. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/proposal.md +0 -33
  304. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/function-naming-alignment/spec.md +0 -12
  305. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/optional-parameter-patterns/spec.md +0 -18
  306. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-documentation/spec.md +0 -16
  307. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-naming-consistency/spec.md +0 -12
  308. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-ordering-standard/spec.md +0 -12
  309. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/tasks.md +0 -194
  310. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/.openspec.yaml +0 -2
  311. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/design.md +0 -84
  312. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/proposal.md +0 -31
  313. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/codebase-audit/spec.md +0 -27
  314. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/dead-code-cleanup/spec.md +0 -27
  315. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/test-gap-fill/spec.md +0 -23
  316. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/todo-resolution/spec.md +0 -27
  317. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/tasks.md +0 -39
  318. package/openspec/changes/archive/2026-06-25-landscape-consolidation/.openspec.yaml +0 -2
  319. package/openspec/changes/archive/2026-06-25-landscape-consolidation/design.md +0 -80
  320. package/openspec/changes/archive/2026-06-25-landscape-consolidation/proposal.md +0 -40
  321. package/openspec/changes/archive/2026-06-25-landscape-consolidation/spec.md +0 -52
  322. package/openspec/changes/archive/2026-06-25-landscape-consolidation/tasks.md +0 -51
  323. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/.openspec.yaml +0 -2
  324. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/design.md +0 -43
  325. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/proposal.md +0 -29
  326. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/specs/self-contained-generated-projects/spec.md +0 -67
  327. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/tasks.md +0 -27
  328. package/openspec/changes/optimize-runtime-docker-layers/.openspec.yaml +0 -3
  329. package/openspec/changes/optimize-runtime-docker-layers/design.md +0 -81
  330. package/openspec/changes/optimize-runtime-docker-layers/proposal.md +0 -44
  331. package/openspec/changes/optimize-runtime-docker-layers/specs/runtime-container-footprint/spec.md +0 -79
  332. package/openspec/changes/optimize-runtime-docker-layers/tasks.md +0 -36
  333. package/openspec/changes/prioritized-cold-start/.openspec.yaml +0 -4
  334. package/openspec/changes/prioritized-cold-start/design.md +0 -137
  335. package/openspec/changes/prioritized-cold-start/proposal.md +0 -41
  336. package/openspec/changes/prioritized-cold-start/specs/on-demand-resource-startup/spec.md +0 -98
  337. package/openspec/changes/prioritized-cold-start/tasks.md +0 -69
  338. package/openspec/config.yaml +0 -1
  339. package/openspec/specs/manifest-field-migration/spec.md +0 -24
  340. package/openspec/specs/resource-terminology-standard/spec.md +0 -24
  341. package/openspec/specs/self-contained-generated-projects/spec.md +0 -67
  342. package/openspec/specs/stack-terminology-standard/spec.md +0 -24
  343. package/platform/services/platform/proxy/service.yaml +0 -14
  344. package/scripts/audit-codebase.sh +0 -213
  345. package/scripts/autoresearch/layer-eval.sh +0 -65
  346. package/scripts/benchmark/README.md +0 -25
  347. package/scripts/benchmark/container-scale.ts +0 -503
  348. package/scripts/benchmark/pre-release-gate.sh +0 -9
  349. package/scripts/install-git-hooks.sh +0 -14
  350. package/scripts/measure-idle-footprint.sh +0 -58
  351. package/scripts/record-demo.sh +0 -43
  352. package/scripts/release-binaries.sh +0 -97
  353. package/scripts/setup-pre-commit.sh +0 -33
  354. package/scripts/stage-npm-engine.sh +0 -36
  355. package/tests/tilt-engine/__init__.py +0 -5
  356. package/tests/tilt-engine/conftest.py +0 -182
  357. package/tests/tilt-engine/fixtures/appointment-frontend-service.json +0 -11
  358. package/tests/tilt-engine/fixtures/identity-backend-service.json +0 -12
  359. package/tests/tilt-engine/fixtures/invalid-service.json +0 -4
  360. package/tests/tilt-engine/test_agents_md_generator.py +0 -341
  361. package/tests/tilt-engine/test_agents_md_integration.py +0 -378
  362. package/tests/tilt-engine/test_cache_operations.py +0 -181
  363. package/tests/tilt-engine/test_cache_persistence.py +0 -142
  364. package/tests/tilt-engine/test_code_executor.py +0 -152
  365. package/tests/tilt-engine/test_code_viewer.py +0 -127
  366. package/tests/tilt-engine/test_compose_port_anchors.py +0 -310
  367. package/tests/tilt-engine/test_config_inspector.py +0 -162
  368. package/tests/tilt-engine/test_daemon_focus_mode.py +0 -89
  369. package/tests/tilt-engine/test_daemon_polling.py +0 -122
  370. package/tests/tilt-engine/test_daemon_registration.py +0 -115
  371. package/tests/tilt-engine/test_daemon_validation.py +0 -107
  372. package/tests/tilt-engine/test_docker_generator_bugs.py +0 -493
  373. package/tests/tilt-engine/test_docker_prune.py +0 -119
  374. package/tests/tilt-engine/test_dockerignore_path_bug.py +0 -82
  375. package/tests/tilt-engine/test_file_browser.py +0 -193
  376. package/tests/tilt-engine/test_frontend_basepath_manifest.py +0 -27
  377. package/tests/tilt-engine/test_health_dependencies.py +0 -130
  378. package/tests/tilt-engine/test_health_endpoints.py +0 -118
  379. package/tests/tilt-engine/test_health_tilt_ui.py +0 -85
  380. package/tests/tilt-engine/test_runtime_container_footprint.py +0 -162
  381. package/tests/tilt-engine/test_sablier_defer_start.py +0 -237
  382. package/tests/tilt-engine/test_safety_aliases.py +0 -84
  383. package/tests/tilt-engine/test_snapshot_diff.py +0 -136
  384. package/tests/tilt-engine/test_snapshot_persistence.py +0 -163
  385. package/tests/tilt-engine/test_snapshot_scanning.py +0 -123
  386. package/tests/tilt-engine/test_standalone_project_boot.py +0 -61
  387. package/tests/tilt-engine/test_standalone_traefik.py +0 -160
  388. package/tests/tilt-engine/test_traefik_static_wake_route.py +0 -187
@@ -1,124 +0,0 @@
1
- import { readFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import type { DiscoveredResource } from "../types/index.js";
4
- import { findProjectRoot } from "./paths.js";
5
-
6
- export interface HealthTarget {
7
- name: string;
8
- appType: "frontend" | "backend";
9
- url: string;
10
- }
11
-
12
- export interface HealthProbe extends HealthTarget {
13
- ok: boolean;
14
- /** HTTP status code, or undefined when the request never completed. */
15
- status?: number;
16
- /** Failure reason when the request never completed (DNS, refused, timeout). */
17
- error?: string;
18
- }
19
-
20
- export function getProjectName(): string {
21
- const root = findProjectRoot();
22
- if (root) {
23
- try {
24
- const content = readFileSync(join(root, ".tdk", "project.json"), "utf-8");
25
- const parsed = JSON.parse(content);
26
- if (parsed?.project?.name) {
27
- return parsed.project.name;
28
- }
29
- } catch {}
30
- }
31
- return "tdk-project";
32
- }
33
-
34
- export function resolveSubdomainBases(): { appBase: string; apiBase: string } {
35
- const projectName = getProjectName();
36
- const raw = process.env.TDK_SERVICE_BASE_URL ?? `http://${projectName}.localhost`;
37
- try {
38
- const u = new URL(raw.includes("://") ? raw : `http://${raw}`);
39
- const host = u.hostname;
40
- if (host === "localhost" || /^\d+\.\d+\.\d+\.\d+$/.test(host)) {
41
- return {
42
- appBase: `${u.protocol}//${host}${u.port ? `:${u.port}` : ""}`,
43
- apiBase: `${u.protocol}//${host}${u.port ? `:${u.port}` : ""}`,
44
- };
45
- }
46
- const bare = host.replace(/^(app|api)\./, "");
47
- return {
48
- appBase: `${u.protocol}//app.${bare}${u.port ? `:${u.port}` : ""}`,
49
- apiBase: `${u.protocol}//api.${bare}${u.port ? `:${u.port}` : ""}`,
50
- };
51
- } catch {
52
- return {
53
- appBase: `http://app.${projectName}.localhost`,
54
- apiBase: `http://api.${projectName}.localhost`,
55
- };
56
- }
57
- }
58
-
59
- export function appendHealthPath(path: string): string {
60
- return `${path.replace(/\/+$/, "")}/health`;
61
- }
62
-
63
- /** The route `tdk up` advertises for a service, without the /health suffix. */
64
- export function resolveServicePath(resource: DiscoveredResource): string {
65
- if (resource.config?.appType === "backend") {
66
- const servicePathName = resource.name.replace(/-api$/, "");
67
- return resource.config?.apiPath ?? `/api/${servicePathName}`;
68
- }
69
- return resource.config?.basePath ?? `/${resource.name}`;
70
- }
71
-
72
- /**
73
- * Health URLs for every routable service, matching what `tdk up` prints.
74
- * Workers, libraries, SDKs and migrators have no Traefik route, so they are
75
- * skipped rather than reported as unreachable.
76
- */
77
- export function buildHealthTargets(resources: DiscoveredResource[]): HealthTarget[] {
78
- const { appBase, apiBase } = resolveSubdomainBases();
79
-
80
- return resources
81
- .filter(
82
- (
83
- resource,
84
- ): resource is DiscoveredResource & { config: { appType: "frontend" | "backend" } } =>
85
- resource.config?.appType === "frontend" || resource.config?.appType === "backend",
86
- )
87
- .map((resource) => {
88
- const base = resource.config.appType === "backend" ? apiBase : appBase;
89
- return {
90
- name: resource.name,
91
- appType: resource.config.appType,
92
- url: `${base}${appendHealthPath(resolveServicePath(resource))}`,
93
- };
94
- });
95
- }
96
-
97
- export async function pingHealthTarget(
98
- target: HealthTarget,
99
- timeoutMs: number,
100
- ): Promise<HealthProbe> {
101
- try {
102
- const response = await fetch(target.url, {
103
- method: "GET",
104
- redirect: "manual",
105
- signal: AbortSignal.timeout(timeoutMs),
106
- });
107
- return { ...target, ok: response.ok, status: response.status };
108
- } catch (err: unknown) {
109
- const error =
110
- err instanceof Error && err.name === "TimeoutError"
111
- ? `no response within ${timeoutMs}ms`
112
- : err instanceof Error
113
- ? err.message
114
- : String(err);
115
- return { ...target, ok: false, error };
116
- }
117
- }
118
-
119
- export async function pingHealthTargets(
120
- targets: HealthTarget[],
121
- timeoutMs: number,
122
- ): Promise<HealthProbe[]> {
123
- return Promise.all(targets.map((target) => pingHealthTarget(target, timeoutMs)));
124
- }
@@ -1,364 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
- import type {
4
- AutogeneratedFile,
5
- DiscoveredResource,
6
- DiscoveredStack,
7
- FileType,
8
- ResourceConfig,
9
- ResourceMetadata,
10
- ResourceType,
11
- StackMetadata,
12
- } from "../types/index.js";
13
- import { Cache, createCacheValidator } from "./cache.js";
14
- import { AUTOGENERATED_FILE_PATTERNS, SKIP_DIRECTORIES } from "./constants.js";
15
- import { formatCount } from "./formatting.js";
16
- import { findProjectRoot } from "./paths.js";
17
- import { includes } from "./validation.js";
18
-
19
- const RESOURCE_JSON_FILENAME = "service.json";
20
-
21
- function findServiceJsonFiles(
22
- dir: string,
23
- maxDepth: number = 5,
24
- currentDepth: number = 0,
25
- ): string[] {
26
- const results: string[] = [];
27
-
28
- if (currentDepth > maxDepth) {
29
- return results;
30
- }
31
-
32
- const entries = readdirSync(dir, { withFileTypes: true });
33
-
34
- for (const entry of entries) {
35
- const fullPath = join(dir, entry.name);
36
-
37
- if (entry.isDirectory()) {
38
- if (shouldSkipDirectory(entry.name)) continue;
39
- results.push(...findServiceJsonFiles(fullPath, maxDepth, currentDepth + 1));
40
- } else if (entry.isFile() && entry.name === RESOURCE_JSON_FILENAME) {
41
- results.push(fullPath);
42
- }
43
- }
44
-
45
- return results;
46
- }
47
-
48
- function shouldSkipDirectory(name: string): boolean {
49
- return includes(SKIP_DIRECTORIES, name) || name.startsWith(".");
50
- }
51
-
52
- function isValidResourceConfig(value: unknown): value is ResourceConfig {
53
- if (!value || typeof value !== "object") return false;
54
- const config = value as Record<string, unknown>;
55
- // Accept runtime, appType, or type (for backward compatibility with existing service.json files)
56
- const hasRuntimeOrAppType =
57
- typeof config.runtime === "string" ||
58
- typeof config.appType === "string" ||
59
- typeof config.type === "string";
60
- return typeof config.appName === "string" && hasRuntimeOrAppType;
61
- }
62
-
63
- function parseResource(serviceJsonPath: string): DiscoveredResource {
64
- const content = readFileSync(serviceJsonPath, "utf-8");
65
- const parsed: unknown = JSON.parse(content);
66
-
67
- if (!isValidResourceConfig(parsed)) {
68
- throw new Error(
69
- `Invalid service.json at ${serviceJsonPath}: missing required fields (appName, runtime or appType)`,
70
- );
71
- }
72
-
73
- const parsedConfig = parsed as unknown as ResourceConfig;
74
- const config: ResourceConfig = {
75
- ...parsedConfig,
76
- appType: (parsedConfig.appType ||
77
- (parsedConfig as unknown as { type?: string }).type) as ResourceConfig["appType"],
78
- };
79
- const resourceDir = dirname(serviceJsonPath);
80
-
81
- return {
82
- name: config.appName,
83
- path: resourceDir,
84
- configPath: serviceJsonPath,
85
- config,
86
- stack: config.stack,
87
- };
88
- }
89
-
90
- export function discoverResourcesFromRoot(projectRoot: string): DiscoveredResource[] {
91
- const serviceJsonPaths = findServiceJsonFiles(projectRoot);
92
- const resources: DiscoveredResource[] = [];
93
-
94
- for (const path of serviceJsonPaths) {
95
- resources.push(parseResource(path));
96
- }
97
-
98
- return resources;
99
- }
100
-
101
- export function discoverResources(): DiscoveredResource[] {
102
- const projectRoot = findProjectRoot();
103
-
104
- if (!projectRoot) {
105
- throw new Error(
106
- "Could not find project root (no Tiltfile found). Make sure you're in a root project.",
107
- );
108
- }
109
-
110
- return discoverResourcesFromRoot(projectRoot);
111
- }
112
-
113
- /**
114
- * Unique, sorted `stack` values across discovered service.json files under `projectRoot`.
115
- * Tilt's discovery groups services by this same field (see tdk-cli-extensions
116
- * discovery_orchestrator.star), so these are the names that must appear in a
117
- * stack's `services` list in .tdk/project.json for that group to be enabled.
118
- */
119
- export function discoverStackNames(projectRoot: string): string[] {
120
- const resources = discoverResourcesFromRoot(projectRoot);
121
- const stacks = new Set<string>();
122
-
123
- for (const resource of resources) {
124
- if (resource.stack) {
125
- stacks.add(resource.stack);
126
- }
127
- }
128
-
129
- return Array.from(stacks).sort();
130
- }
131
-
132
- export function getAllStacks(resources?: DiscoveredResource[]): string[] {
133
- const resourcesToScan = resources || discoverResources();
134
- const stacks = new Set<string>();
135
-
136
- for (const resource of resourcesToScan) {
137
- if (resource.stack) {
138
- stacks.add(resource.stack);
139
- }
140
- }
141
-
142
- return Array.from(stacks).sort();
143
- }
144
-
145
- export function discoverStacks(): DiscoveredStack[] {
146
- const resources = discoverResources();
147
- const stackMap = new Map<string, DiscoveredResource[]>();
148
-
149
- for (const resource of resources) {
150
- if (resource.stack) {
151
- const stackResources = stackMap.get(resource.stack);
152
- if (stackResources) {
153
- stackResources.push(resource);
154
- } else {
155
- stackMap.set(resource.stack, [resource]);
156
- }
157
- }
158
- }
159
-
160
- const stacks: DiscoveredStack[] = [];
161
- for (const [name, stackResources] of stackMap) {
162
- stacks.push({
163
- name,
164
- description: formatCount(stackResources.length, "resource"),
165
- resources: stackResources,
166
- resourceCount: stackResources.length,
167
- });
168
- }
169
-
170
- return stacks.sort((a, b) => a.name.localeCompare(b.name));
171
- }
172
-
173
- export function getResourcesForStack(stackName: string): DiscoveredResource[] {
174
- const allResources = discoverResources();
175
- return allResources.filter((r) => r.stack === stackName);
176
- }
177
-
178
- export function stackExists(stackName: string): boolean {
179
- const resources = getResourcesForStack(stackName);
180
- return resources.length > 0;
181
- }
182
-
183
- /**
184
- * Cache TTL in milliseconds
185
- */
186
- const CACHE_TTL_MS = 5000;
187
-
188
- const resourcesCache = new Cache<ResourceMetadata>({ ttlMs: CACHE_TTL_MS });
189
- const stacksCache = new Cache<StackMetadata>({ ttlMs: CACHE_TTL_MS });
190
- const cacheValidator = createCacheValidator(CACHE_TTL_MS);
191
-
192
- export function clearMetadataCache(): void {
193
- resourcesCache.clear();
194
- stacksCache.clear();
195
- cacheValidator.reset();
196
- }
197
-
198
- function detectFileType(filename: string, content?: string): FileType {
199
- if (filename === "Dockerfile" || filename.startsWith("docker-compose")) {
200
- return "docker";
201
- }
202
- if (filename === "Tiltfile" || filename.endsWith(".star")) {
203
- return "tilt";
204
- }
205
- if (
206
- filename === "vite.config.ts" ||
207
- filename === "tsconfig.json" ||
208
- filename === "package.json"
209
- ) {
210
- return "config";
211
- }
212
- if (filename === "schema.prisma" || filename.includes("migration")) {
213
- return "prisma";
214
- }
215
- if (content) {
216
- const firstLines = content.split("\n").slice(0, 10).join("\n");
217
- if (firstLines.includes("GENERATED BY TDK") || firstLines.includes("AUTOGENERATED")) {
218
- return "generated";
219
- }
220
- }
221
- return "unknown";
222
- }
223
-
224
- export function getResourceMetadata(resource: DiscoveredResource): ResourceMetadata {
225
- const cacheKey = resource.configPath;
226
-
227
- if (cacheValidator.isValid()) {
228
- const cached = resourcesCache.get(cacheKey);
229
- if (cached) {
230
- return cached;
231
- }
232
- }
233
-
234
- const resourceDir = resource.path;
235
-
236
- const stats = statSync(resource.configPath);
237
- const createdAt = stats.mtime.toISOString();
238
- const lastModified = stats.mtime.toISOString();
239
-
240
- const autogeneratedFiles = discoverAutogeneratedFiles(resourceDir);
241
- const hasDockerfile = existsSync(join(resourceDir, "Dockerfile"));
242
- const hasTiltfile = existsSync(join(resourceDir, "Tiltfile"));
243
- const hasDockerCompose =
244
- existsSync(join(resourceDir, "docker-compose.yml")) ||
245
- existsSync(join(resourceDir, "docker-compose.yaml"));
246
-
247
- const configType = resource.config?.appType;
248
- let type: ResourceType = configType || "backend";
249
- if (!configType) {
250
- if (resource.name.includes("frontend")) {
251
- type = "frontend";
252
- } else if (
253
- resource.name.includes("sdk") ||
254
- resource.name.includes("lib") ||
255
- resource.name.includes("infra")
256
- ) {
257
- type = "library";
258
- }
259
- }
260
-
261
- const metadata: ResourceMetadata = {
262
- name: resource.name,
263
- stack: resource.stack,
264
- type,
265
- port: resource.config?.port,
266
- createdAt,
267
- lastModified,
268
- dependencies: resource.config?.dependsOn ?? [],
269
- hasDockerfile,
270
- hasTiltfile,
271
- hasDockerCompose,
272
- autogeneratedFiles,
273
- status: "unknown",
274
- };
275
-
276
- resourcesCache.set(cacheKey, metadata);
277
- cacheValidator.markUpdated();
278
-
279
- return metadata;
280
- }
281
-
282
- function discoverAutogeneratedFiles(resourceDir: string): AutogeneratedFile[] {
283
- const files: AutogeneratedFile[] = [];
284
-
285
- for (const pattern of AUTOGENERATED_FILE_PATTERNS) {
286
- const filePath = join(resourceDir, pattern);
287
- if (existsSync(filePath)) {
288
- const stats = statSync(filePath);
289
- const content = readFileSync(filePath, "utf-8");
290
-
291
- files.push({
292
- name: pattern,
293
- path: filePath,
294
- type: detectFileType(pattern, content),
295
- size: stats.size,
296
- lastModified: stats.mtime.toISOString(),
297
- });
298
- }
299
- }
300
-
301
- const prismaDir = join(resourceDir, "prisma");
302
- if (existsSync(prismaDir)) {
303
- const entries = readdirSync(prismaDir);
304
- for (const entry of entries) {
305
- if (entry === "schema.prisma" || entry.includes("migration")) {
306
- const filePath = join(prismaDir, entry);
307
- const stats = statSync(filePath);
308
- files.push({
309
- name: `prisma/${entry}`,
310
- path: filePath,
311
- type: "prisma",
312
- size: stats.size,
313
- lastModified: stats.mtime.toISOString(),
314
- });
315
- }
316
- }
317
- }
318
-
319
- return files.sort((a, b) => a.name.localeCompare(b.name));
320
- }
321
-
322
- export function getStackMetadata(stack: DiscoveredStack): StackMetadata {
323
- const cacheKey = stack.name;
324
-
325
- if (cacheValidator.isValid()) {
326
- const cached = stacksCache.get(cacheKey);
327
- if (cached) {
328
- return cached;
329
- }
330
- }
331
-
332
- const resourcesMetadata = stack.resources.map((r) => getResourceMetadata(r));
333
- const timestamps = resourcesMetadata.map((r) => new Date(r.createdAt).getTime());
334
- const earliestTimestamp = Math.min(...timestamps);
335
- const latestTimestamp = Math.max(...timestamps);
336
- const totalResources = resourcesMetadata.length;
337
-
338
- let overallStatus: StackMetadata["overallStatus"] = "unknown";
339
- if (totalResources > 0) {
340
- const readyCount = resourcesMetadata.filter((r) => r.status === "ready").length;
341
- const ratio = readyCount / totalResources;
342
- if (ratio > 0.9) {
343
- overallStatus = "healthy";
344
- } else if (ratio > 0.5) {
345
- overallStatus = "degraded";
346
- } else {
347
- overallStatus = "error";
348
- }
349
- }
350
-
351
- const metadata: StackMetadata = {
352
- name: stack.name,
353
- resourceCount: resourcesMetadata.length,
354
- createdAt: new Date(earliestTimestamp).toISOString(),
355
- lastModified: new Date(latestTimestamp).toISOString(),
356
- resources: resourcesMetadata,
357
- overallStatus,
358
- };
359
-
360
- stacksCache.set(cacheKey, metadata);
361
- cacheValidator.markUpdated();
362
-
363
- return metadata;
364
- }
@@ -1,30 +0,0 @@
1
- export interface StackFeature {
2
- name: string;
3
- description: string;
4
- generatedFiles: string[];
5
- }
6
-
7
- export const STACK_FEATURES: Record<string, StackFeature> = {
8
- "database-management": {
9
- name: "database-management",
10
- description: "Generate and load the stack-level PostgreSQL docker-compose file",
11
- generatedFiles: ["services/platform/database-management/docker-compose.yml"],
12
- },
13
- };
14
-
15
- export interface StackFeaturePhaseConfig {
16
- pre_alpha?: { enabledStacks?: string[] };
17
- alpha?: { enabledStacks?: string[] };
18
- beta?: { enabledStacks?: string[] };
19
- out_of_scope?: { enabledStacks?: string[] };
20
- }
21
-
22
- export function isStackFeatureEnabledInStacks(
23
- stacks: StackFeaturePhaseConfig,
24
- featureName: string,
25
- ): boolean {
26
- if (!STACK_FEATURES[featureName]) return false;
27
- return ["pre_alpha", "alpha", "beta"].some((phase) =>
28
- stacks[phase as keyof StackFeaturePhaseConfig]?.enabledStacks?.includes(featureName),
29
- );
30
- }
@@ -1,24 +0,0 @@
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
- /**
7
- * Extracts a gzipped tarball (as an in-memory buffer) into destDir.
8
- * Shells out to the system `tar` binary rather than pulling in a JS tar
9
- * implementation - available by default on macOS and Linux.
10
- */
11
- export function extractTarball(data: Buffer, destDir: string): void {
12
- const tmpFile = join(mkdtempSync(join(tmpdir(), "tdk-ext-")), "bundle.tar.gz");
13
- writeFileSync(tmpFile, data);
14
-
15
- const result = spawnSync("tar", ["xzf", tmpFile, "-C", destDir, "--strip-components=1"], {
16
- stdio: "pipe",
17
- });
18
-
19
- rmSync(join(tmpFile, ".."), { recursive: true, force: true });
20
-
21
- if (result.status !== 0) {
22
- throw new Error(`tar extraction failed: ${result.stderr?.toString() || "unknown error"}`);
23
- }
24
- }
@@ -1,133 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import { join } from "node:path";
3
- import type { TiltCommandResult } from "../types/index.js";
4
- import { findProjectRoot } from "./paths.js";
5
-
6
- export function runTilt(
7
- command: string,
8
- args: string[] = [],
9
- options: {
10
- verbose?: boolean;
11
- quiet?: boolean;
12
- inheritStdio?: boolean;
13
- timeoutMs?: number;
14
- } = {},
15
- ): Promise<TiltCommandResult> {
16
- return new Promise((resolve, reject) => {
17
- const tiltArgs = [command, ...args];
18
-
19
- if (options.verbose) {
20
- console.log(`Executing: tilt ${tiltArgs.join(" ")}`);
21
- }
22
-
23
- const child = spawn("tilt", tiltArgs, {
24
- stdio: options.inheritStdio ? "inherit" : "pipe",
25
- shell: false,
26
- timeout: options.timeoutMs,
27
- });
28
-
29
- let stdout = "";
30
- let stderr = "";
31
-
32
- if (!options.inheritStdio) {
33
- child.stdout?.on("data", (data: Buffer) => {
34
- stdout += data.toString();
35
- });
36
-
37
- child.stderr?.on("data", (data: Buffer) => {
38
- stderr += data.toString();
39
- });
40
- }
41
-
42
- child.on("close", (code) => {
43
- resolve({
44
- exitCode: code ?? 1,
45
- stdout,
46
- stderr,
47
- });
48
- });
49
-
50
- child.on("error", (err) => {
51
- reject(new Error(`Failed to spawn tilt: ${err.message}`));
52
- });
53
- });
54
- }
55
-
56
- export async function isTiltAvailable(): Promise<boolean> {
57
- try {
58
- const result = await runTilt("version", [], { inheritStdio: false, timeoutMs: 10_000 });
59
- return result.exitCode === 0;
60
- } catch {
61
- // tilt binary not found (or not spawnable) - treat as unavailable
62
- return false;
63
- }
64
- }
65
-
66
- export function getTiltfilePath(): string {
67
- const projectRoot = findProjectRoot();
68
- if (!projectRoot) {
69
- throw new Error("Not in a TDK project (no .tdk/project.json found)");
70
- }
71
-
72
- return join(projectRoot, ".tdk", ".tdk-out", "Tiltfile");
73
- }
74
-
75
- function addTiltfilePath(args: string[]): void {
76
- const tiltfilePath = getTiltfilePath();
77
- args.push("-f", tiltfilePath);
78
- }
79
-
80
- export function buildTiltUpArgs(
81
- serviceNames: string[],
82
- options: {
83
- verbose?: boolean;
84
- quiet?: boolean;
85
- force?: boolean;
86
- watch?: boolean;
87
- focusTargets?: string[];
88
- } = {},
89
- ): string[] {
90
- const args: string[] = [];
91
- addTiltfilePath(args);
92
-
93
- // Bare positional resource names only scope what this `tilt up` invocation waits
94
- // on - they do NOT limit which resources the generated Tiltfile enables. Its focus
95
- // filter (Config.apply_focus / apply_focus_filter) only reads the `--focus` flag;
96
- // the positional-args catch-all it also defines (`cfg['args']`) is never read. So
97
- // without `--focus`, every `tdk up <stack>` silently fell back to Tilt's default
98
- // "pre-alpha" phase and built every stack in that phase, not just the one asked
99
- // for. Passing the stack name via `--focus` reuses the Tiltfile's own (already
100
- // dependency-aware) domain expansion instead of re-deriving it here.
101
- //
102
- // `--focus=...` needs a `--` before it: Tilt's own `tilt up` only accepts its own
103
- // fixed flag set directly (see `tilt up --help`) and rejects anything else with
104
- // "unknown flag" - `--` is what routes a token through to the Tiltfile's own
105
- // config.parse(). Bare words like a service name aren't flag-shaped, so they don't
106
- // need `--` to reach the Tiltfile's positional `args` catch-all.
107
- if (options.focusTargets && options.focusTargets.length > 0) {
108
- args.push("--", `--focus=${options.focusTargets.join(",")}`);
109
- }
110
-
111
- args.push(...serviceNames);
112
-
113
- if (options.verbose && !options.quiet) {
114
- args.push("--verbose");
115
- }
116
-
117
- if (options.watch) {
118
- args.push("--watch");
119
- }
120
-
121
- return args;
122
- }
123
-
124
- export function buildTiltDownArgs(options: { force?: boolean } = {}): string[] {
125
- const args: string[] = [];
126
- addTiltfilePath(args);
127
-
128
- if (options.force) {
129
- args.push("--force");
130
- }
131
-
132
- return args;
133
- }