@tdk-landscape/tdk-cli-core 1.3.52 → 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 (390) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +1 -1
  3. package/cli/dist/commands/config.js +1 -1
  4. package/cli/dist/commands/resource.js +1 -1
  5. package/cli/dist/generator/extension-fetch.js +16 -9
  6. package/cli/package.json +1 -1
  7. package/package.json +16 -1
  8. package/.claude/skills/layer-autoresearch/SKILL.md +0 -48
  9. package/.claude/skills/tdk-troubleshoot/SKILL.md +0 -222
  10. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -40
  11. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  12. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -18
  13. package/.github/dependabot.yml +0 -33
  14. package/.github/pull_request_template.md +0 -5
  15. package/.github/workflows/ci.yml +0 -200
  16. package/.github/workflows/release-binaries.yml +0 -139
  17. package/.github/zizmor.yml +0 -9
  18. package/.pre-commit-config.yaml +0 -57
  19. package/CODE_OF_CONDUCT.md +0 -9
  20. package/CONTRIBUTING.md +0 -42
  21. package/Makefile +0 -92
  22. package/SECURITY.md +0 -17
  23. package/benchmarks/results/container-scale-2026-09-25T20-54-49-736Z.json +0 -45
  24. package/benchmarks/results/container-scale-2026-09-25T21-01-20-540Z.json +0 -150
  25. package/benchmarks/results/container-scale-2026-09-25T21-15-01-441Z.json +0 -73
  26. package/benchmarks/results/container-scale-2026-09-25T22-09-01-630Z.json +0 -77
  27. package/benchmarks/results/container-scale-2026-09-25T22-18-28-371Z.json +0 -202
  28. package/cli/AGENTS.md +0 -390
  29. package/cli/DESIGN.md +0 -735
  30. package/cli/README.md +0 -292
  31. package/cli/biome.json +0 -40
  32. package/cli/dependency-graph.svg +0 -1135
  33. package/cli/dist/cli.d.ts +0 -3
  34. package/cli/dist/cli.d.ts.map +0 -1
  35. package/cli/dist/cli.js.map +0 -1
  36. package/cli/dist/commands/completion.d.ts +0 -3
  37. package/cli/dist/commands/completion.d.ts.map +0 -1
  38. package/cli/dist/commands/completion.js.map +0 -1
  39. package/cli/dist/commands/config.d.ts +0 -3
  40. package/cli/dist/commands/config.d.ts.map +0 -1
  41. package/cli/dist/commands/config.js.map +0 -1
  42. package/cli/dist/commands/doctor.d.ts +0 -19
  43. package/cli/dist/commands/doctor.d.ts.map +0 -1
  44. package/cli/dist/commands/doctor.js.map +0 -1
  45. package/cli/dist/commands/down.d.ts +0 -3
  46. package/cli/dist/commands/down.d.ts.map +0 -1
  47. package/cli/dist/commands/down.js.map +0 -1
  48. package/cli/dist/commands/help.d.ts +0 -2
  49. package/cli/dist/commands/help.d.ts.map +0 -1
  50. package/cli/dist/commands/help.js.map +0 -1
  51. package/cli/dist/commands/networks.d.ts +0 -3
  52. package/cli/dist/commands/networks.d.ts.map +0 -1
  53. package/cli/dist/commands/networks.js.map +0 -1
  54. package/cli/dist/commands/project.d.ts +0 -9
  55. package/cli/dist/commands/project.d.ts.map +0 -1
  56. package/cli/dist/commands/project.js.map +0 -1
  57. package/cli/dist/commands/projects.d.ts +0 -3
  58. package/cli/dist/commands/projects.d.ts.map +0 -1
  59. package/cli/dist/commands/projects.js.map +0 -1
  60. package/cli/dist/commands/resource.d.ts +0 -69
  61. package/cli/dist/commands/resource.d.ts.map +0 -1
  62. package/cli/dist/commands/resource.js.map +0 -1
  63. package/cli/dist/commands/resources.d.ts +0 -3
  64. package/cli/dist/commands/resources.d.ts.map +0 -1
  65. package/cli/dist/commands/resources.js.map +0 -1
  66. package/cli/dist/commands/stack.d.ts +0 -3
  67. package/cli/dist/commands/stack.d.ts.map +0 -1
  68. package/cli/dist/commands/stack.js.map +0 -1
  69. package/cli/dist/commands/stacks.d.ts +0 -3
  70. package/cli/dist/commands/stacks.d.ts.map +0 -1
  71. package/cli/dist/commands/stacks.js.map +0 -1
  72. package/cli/dist/commands/status.d.ts +0 -3
  73. package/cli/dist/commands/status.d.ts.map +0 -1
  74. package/cli/dist/commands/status.js.map +0 -1
  75. package/cli/dist/commands/ui.d.ts +0 -3
  76. package/cli/dist/commands/ui.d.ts.map +0 -1
  77. package/cli/dist/commands/ui.js.map +0 -1
  78. package/cli/dist/commands/up.d.ts +0 -3
  79. package/cli/dist/commands/up.d.ts.map +0 -1
  80. package/cli/dist/commands/up.js.map +0 -1
  81. package/cli/dist/commands/upgrade.d.ts +0 -14
  82. package/cli/dist/commands/upgrade.d.ts.map +0 -1
  83. package/cli/dist/commands/upgrade.js.map +0 -1
  84. package/cli/dist/commands/version.d.ts +0 -3
  85. package/cli/dist/commands/version.d.ts.map +0 -1
  86. package/cli/dist/commands/version.js.map +0 -1
  87. package/cli/dist/components/Accessible.d.ts +0 -8
  88. package/cli/dist/components/Accessible.d.ts.map +0 -1
  89. package/cli/dist/components/Accessible.js.map +0 -1
  90. package/cli/dist/components/BaseTooltip.d.ts +0 -4
  91. package/cli/dist/components/BaseTooltip.d.ts.map +0 -1
  92. package/cli/dist/components/BaseTooltip.js.map +0 -1
  93. package/cli/dist/components/DetailPanel.d.ts +0 -4
  94. package/cli/dist/components/DetailPanel.d.ts.map +0 -1
  95. package/cli/dist/components/DetailPanel.js.map +0 -1
  96. package/cli/dist/components/FileTree.d.ts +0 -4
  97. package/cli/dist/components/FileTree.d.ts.map +0 -1
  98. package/cli/dist/components/FileTree.js.map +0 -1
  99. package/cli/dist/components/ResourceSelectInput.d.ts +0 -4
  100. package/cli/dist/components/ResourceSelectInput.d.ts.map +0 -1
  101. package/cli/dist/components/ResourceSelectInput.js.map +0 -1
  102. package/cli/dist/components/ResourceTable.d.ts +0 -4
  103. package/cli/dist/components/ResourceTable.d.ts.map +0 -1
  104. package/cli/dist/components/ResourceTable.js.map +0 -1
  105. package/cli/dist/components/TabBar.d.ts +0 -4
  106. package/cli/dist/components/TabBar.d.ts.map +0 -1
  107. package/cli/dist/components/TabBar.js.map +0 -1
  108. package/cli/dist/components/Tooltip.d.ts +0 -12
  109. package/cli/dist/components/Tooltip.d.ts.map +0 -1
  110. package/cli/dist/components/Tooltip.js.map +0 -1
  111. package/cli/dist/components/index.d.ts +0 -8
  112. package/cli/dist/components/index.d.ts.map +0 -1
  113. package/cli/dist/components/index.js.map +0 -1
  114. package/cli/dist/config/platform-standards.d.ts +0 -159
  115. package/cli/dist/config/platform-standards.d.ts.map +0 -1
  116. package/cli/dist/config/platform-standards.js.map +0 -1
  117. package/cli/dist/generator/extension-fetch.d.ts +0 -25
  118. package/cli/dist/generator/extension-fetch.d.ts.map +0 -1
  119. package/cli/dist/generator/extension-fetch.js.map +0 -1
  120. package/cli/dist/generator/template-engine.d.ts +0 -62
  121. package/cli/dist/generator/template-engine.d.ts.map +0 -1
  122. package/cli/dist/generator/template-engine.js.map +0 -1
  123. package/cli/dist/index.d.ts +0 -11
  124. package/cli/dist/index.d.ts.map +0 -1
  125. package/cli/dist/index.js.map +0 -1
  126. package/cli/dist/types/index.d.ts +0 -257
  127. package/cli/dist/types/index.d.ts.map +0 -1
  128. package/cli/dist/types/index.js.map +0 -1
  129. package/cli/dist/utils/cache.d.ts +0 -19
  130. package/cli/dist/utils/cache.d.ts.map +0 -1
  131. package/cli/dist/utils/cache.js.map +0 -1
  132. package/cli/dist/utils/command-helpers.d.ts +0 -17
  133. package/cli/dist/utils/command-helpers.d.ts.map +0 -1
  134. package/cli/dist/utils/command-helpers.js.map +0 -1
  135. package/cli/dist/utils/constants.d.ts +0 -53
  136. package/cli/dist/utils/constants.d.ts.map +0 -1
  137. package/cli/dist/utils/constants.js.map +0 -1
  138. package/cli/dist/utils/discovery-context.d.ts +0 -4
  139. package/cli/dist/utils/discovery-context.d.ts.map +0 -1
  140. package/cli/dist/utils/discovery-context.js.map +0 -1
  141. package/cli/dist/utils/docker.d.ts +0 -4
  142. package/cli/dist/utils/docker.d.ts.map +0 -1
  143. package/cli/dist/utils/docker.js.map +0 -1
  144. package/cli/dist/utils/doctor-runtime.d.ts +0 -81
  145. package/cli/dist/utils/doctor-runtime.d.ts.map +0 -1
  146. package/cli/dist/utils/doctor-runtime.js.map +0 -1
  147. package/cli/dist/utils/env-validator.d.ts +0 -15
  148. package/cli/dist/utils/env-validator.d.ts.map +0 -1
  149. package/cli/dist/utils/env-validator.js.map +0 -1
  150. package/cli/dist/utils/errors.d.ts +0 -31
  151. package/cli/dist/utils/errors.d.ts.map +0 -1
  152. package/cli/dist/utils/errors.js.map +0 -1
  153. package/cli/dist/utils/file-helpers.d.ts +0 -14
  154. package/cli/dist/utils/file-helpers.d.ts.map +0 -1
  155. package/cli/dist/utils/file-helpers.js.map +0 -1
  156. package/cli/dist/utils/formatting.d.ts +0 -30
  157. package/cli/dist/utils/formatting.d.ts.map +0 -1
  158. package/cli/dist/utils/formatting.js.map +0 -1
  159. package/cli/dist/utils/paths.d.ts +0 -3
  160. package/cli/dist/utils/paths.d.ts.map +0 -1
  161. package/cli/dist/utils/paths.js.map +0 -1
  162. package/cli/dist/utils/port-assignment.d.ts +0 -6
  163. package/cli/dist/utils/port-assignment.d.ts.map +0 -1
  164. package/cli/dist/utils/port-assignment.js.map +0 -1
  165. package/cli/dist/utils/project-features.d.ts +0 -23
  166. package/cli/dist/utils/project-features.d.ts.map +0 -1
  167. package/cli/dist/utils/project-features.js.map +0 -1
  168. package/cli/dist/utils/project-templates.d.ts +0 -7
  169. package/cli/dist/utils/project-templates.d.ts.map +0 -1
  170. package/cli/dist/utils/project-templates.js.map +0 -1
  171. package/cli/dist/utils/prompt.d.ts +0 -28
  172. package/cli/dist/utils/prompt.d.ts.map +0 -1
  173. package/cli/dist/utils/prompt.js.map +0 -1
  174. package/cli/dist/utils/resource-features.d.ts +0 -29
  175. package/cli/dist/utils/resource-features.d.ts.map +0 -1
  176. package/cli/dist/utils/resource-features.js.map +0 -1
  177. package/cli/dist/utils/service-urls.d.ts +0 -30
  178. package/cli/dist/utils/service-urls.d.ts.map +0 -1
  179. package/cli/dist/utils/service-urls.js.map +0 -1
  180. package/cli/dist/utils/services.d.ts +0 -18
  181. package/cli/dist/utils/services.d.ts.map +0 -1
  182. package/cli/dist/utils/services.js.map +0 -1
  183. package/cli/dist/utils/stack-features.d.ts +0 -22
  184. package/cli/dist/utils/stack-features.d.ts.map +0 -1
  185. package/cli/dist/utils/stack-features.js.map +0 -1
  186. package/cli/dist/utils/tar.d.ts +0 -7
  187. package/cli/dist/utils/tar.d.ts.map +0 -1
  188. package/cli/dist/utils/tar.js.map +0 -1
  189. package/cli/dist/utils/tilt.d.ts +0 -20
  190. package/cli/dist/utils/tilt.d.ts.map +0 -1
  191. package/cli/dist/utils/tilt.js.map +0 -1
  192. package/cli/dist/utils/validation.d.ts +0 -16
  193. package/cli/dist/utils/validation.d.ts.map +0 -1
  194. package/cli/dist/utils/validation.js.map +0 -1
  195. package/cli/knip.json +0 -6
  196. package/cli/pnpm-lock.yaml +0 -2305
  197. package/cli/pnpm-workspace.yaml +0 -2
  198. package/cli/src/cli.ts +0 -72
  199. package/cli/src/commands/__tests__/always-enabled-infra.test.ts +0 -109
  200. package/cli/src/commands/__tests__/config.test.ts +0 -146
  201. package/cli/src/commands/__tests__/doctor.test.ts +0 -730
  202. package/cli/src/commands/__tests__/error-handling.test.ts +0 -78
  203. package/cli/src/commands/__tests__/phases-model.test.ts +0 -161
  204. package/cli/src/commands/__tests__/project-resource-features-e2e.test.ts +0 -187
  205. package/cli/src/commands/__tests__/project.test.ts +0 -68
  206. package/cli/src/commands/__tests__/resource.test.ts +0 -226
  207. package/cli/src/commands/__tests__/saas-starter-integration.test.ts +0 -194
  208. package/cli/src/commands/__tests__/stack-features-e2e.test.ts +0 -135
  209. package/cli/src/commands/__tests__/upgrade.test.ts +0 -198
  210. package/cli/src/commands/completion.ts +0 -300
  211. package/cli/src/commands/config.ts +0 -299
  212. package/cli/src/commands/doctor.ts +0 -926
  213. package/cli/src/commands/down.ts +0 -37
  214. package/cli/src/commands/help.ts +0 -143
  215. package/cli/src/commands/networks-design.md +0 -80
  216. package/cli/src/commands/networks.ts +0 -332
  217. package/cli/src/commands/project.ts +0 -456
  218. package/cli/src/commands/projects.ts +0 -82
  219. package/cli/src/commands/resource.ts +0 -652
  220. package/cli/src/commands/resources.ts +0 -95
  221. package/cli/src/commands/stack.ts +0 -128
  222. package/cli/src/commands/stacks.ts +0 -52
  223. package/cli/src/commands/status.ts +0 -88
  224. package/cli/src/commands/ui.tsx +0 -843
  225. package/cli/src/commands/up.ts +0 -169
  226. package/cli/src/commands/upgrade.ts +0 -628
  227. package/cli/src/commands/version.ts +0 -9
  228. package/cli/src/components/Accessible.tsx +0 -21
  229. package/cli/src/components/BaseTooltip.tsx +0 -66
  230. package/cli/src/components/DetailPanel.tsx +0 -146
  231. package/cli/src/components/FileTree.tsx +0 -89
  232. package/cli/src/components/ResourceSelectInput.tsx +0 -30
  233. package/cli/src/components/ResourceTable.tsx +0 -78
  234. package/cli/src/components/TabBar.tsx +0 -53
  235. package/cli/src/components/Tooltip.tsx +0 -11
  236. package/cli/src/components/index.ts +0 -7
  237. package/cli/src/config/platform-standards.test.ts +0 -11
  238. package/cli/src/config/platform-standards.ts +0 -196
  239. package/cli/src/generator/__tests__/extension-fetch.test.ts +0 -242
  240. package/cli/src/generator/__tests__/template-engine.test.ts +0 -70
  241. package/cli/src/generator/extension-fetch.ts +0 -286
  242. package/cli/src/generator/template-engine.ts +0 -752
  243. package/cli/src/index.ts +0 -86
  244. package/cli/src/templates.d.ts +0 -4
  245. package/cli/src/types/index.ts +0 -353
  246. package/cli/src/utils/__tests__/cache.test.ts +0 -98
  247. package/cli/src/utils/__tests__/formatting.test.ts +0 -170
  248. package/cli/src/utils/__tests__/paths.test.ts +0 -180
  249. package/cli/src/utils/__tests__/port-assignment.test.ts +0 -121
  250. package/cli/src/utils/__tests__/service-urls.test.ts +0 -174
  251. package/cli/src/utils/__tests__/services.test.ts +0 -531
  252. package/cli/src/utils/__tests__/tilt.test.ts +0 -172
  253. package/cli/src/utils/__tests__/validation.test.ts +0 -148
  254. package/cli/src/utils/cache.ts +0 -76
  255. package/cli/src/utils/command-helpers.ts +0 -54
  256. package/cli/src/utils/constants.ts +0 -130
  257. package/cli/src/utils/discovery-context.ts +0 -49
  258. package/cli/src/utils/docker.ts +0 -20
  259. package/cli/src/utils/doctor-runtime.ts +0 -644
  260. package/cli/src/utils/env-validator.ts +0 -139
  261. package/cli/src/utils/errors.ts +0 -168
  262. package/cli/src/utils/file-helpers.ts +0 -62
  263. package/cli/src/utils/formatting.ts +0 -215
  264. package/cli/src/utils/paths.ts +0 -53
  265. package/cli/src/utils/port-assignment.ts +0 -106
  266. package/cli/src/utils/project-features.ts +0 -118
  267. package/cli/src/utils/project-templates.ts +0 -29
  268. package/cli/src/utils/prompt.ts +0 -128
  269. package/cli/src/utils/resource-features.ts +0 -215
  270. package/cli/src/utils/service-urls.ts +0 -124
  271. package/cli/src/utils/services.ts +0 -364
  272. package/cli/src/utils/stack-features.ts +0 -30
  273. package/cli/src/utils/tar.ts +0 -24
  274. package/cli/src/utils/tilt.ts +0 -133
  275. package/cli/src/utils/validation.ts +0 -67
  276. package/cli/tsconfig.json +0 -25
  277. package/cli/tsconfig.typecheck.json +0 -8
  278. package/docs/FEATURES.md +0 -279
  279. package/docs/demo.svg +0 -217
  280. package/engine/docs/AUTODISCOVERY_TEST.md +0 -182
  281. package/engine/docs/C4-ARCHITECTURE-operations.md +0 -396
  282. package/engine/docs/C4-ARCHITECTURE-overview.md +0 -284
  283. package/engine/docs/C4-ARCHITECTURE.md +0 -17
  284. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +0 -349
  285. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +0 -357
  286. package/engine/docs/README.md +0 -284
  287. package/install.sh +0 -19
  288. package/knip.json +0 -10
  289. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/.openspec.yaml +0 -2
  290. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/design.md +0 -102
  291. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/proposal.md +0 -31
  292. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-notifications/spec.md +0 -48
  293. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-orchestration/spec.md +0 -63
  294. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-troubleshooting/spec.md +0 -56
  295. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/tasks.md +0 -61
  296. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/.openspec.yaml +0 -2
  297. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/design.md +0 -114
  298. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/proposal.md +0 -32
  299. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/manifest-field-migration/spec.md +0 -20
  300. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/resource-terminology-standard/spec.md +0 -20
  301. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/stack-terminology-standard/spec.md +0 -20
  302. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/tasks.md +0 -194
  303. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/.openspec.yaml +0 -2
  304. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/design.md +0 -111
  305. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/proposal.md +0 -33
  306. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/function-naming-alignment/spec.md +0 -12
  307. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/optional-parameter-patterns/spec.md +0 -18
  308. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-documentation/spec.md +0 -16
  309. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-naming-consistency/spec.md +0 -12
  310. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-ordering-standard/spec.md +0 -12
  311. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/tasks.md +0 -194
  312. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/.openspec.yaml +0 -2
  313. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/design.md +0 -84
  314. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/proposal.md +0 -31
  315. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/codebase-audit/spec.md +0 -27
  316. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/dead-code-cleanup/spec.md +0 -27
  317. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/test-gap-fill/spec.md +0 -23
  318. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/todo-resolution/spec.md +0 -27
  319. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/tasks.md +0 -39
  320. package/openspec/changes/archive/2026-06-25-landscape-consolidation/.openspec.yaml +0 -2
  321. package/openspec/changes/archive/2026-06-25-landscape-consolidation/design.md +0 -80
  322. package/openspec/changes/archive/2026-06-25-landscape-consolidation/proposal.md +0 -40
  323. package/openspec/changes/archive/2026-06-25-landscape-consolidation/spec.md +0 -52
  324. package/openspec/changes/archive/2026-06-25-landscape-consolidation/tasks.md +0 -51
  325. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/.openspec.yaml +0 -2
  326. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/design.md +0 -43
  327. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/proposal.md +0 -29
  328. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/specs/self-contained-generated-projects/spec.md +0 -67
  329. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/tasks.md +0 -27
  330. package/openspec/changes/optimize-runtime-docker-layers/.openspec.yaml +0 -3
  331. package/openspec/changes/optimize-runtime-docker-layers/design.md +0 -81
  332. package/openspec/changes/optimize-runtime-docker-layers/proposal.md +0 -44
  333. package/openspec/changes/optimize-runtime-docker-layers/specs/runtime-container-footprint/spec.md +0 -79
  334. package/openspec/changes/optimize-runtime-docker-layers/tasks.md +0 -36
  335. package/openspec/changes/prioritized-cold-start/.openspec.yaml +0 -4
  336. package/openspec/changes/prioritized-cold-start/design.md +0 -137
  337. package/openspec/changes/prioritized-cold-start/proposal.md +0 -41
  338. package/openspec/changes/prioritized-cold-start/specs/on-demand-resource-startup/spec.md +0 -98
  339. package/openspec/changes/prioritized-cold-start/tasks.md +0 -69
  340. package/openspec/config.yaml +0 -1
  341. package/openspec/specs/manifest-field-migration/spec.md +0 -24
  342. package/openspec/specs/resource-terminology-standard/spec.md +0 -24
  343. package/openspec/specs/self-contained-generated-projects/spec.md +0 -67
  344. package/openspec/specs/stack-terminology-standard/spec.md +0 -24
  345. package/platform/services/platform/proxy/service.yaml +0 -14
  346. package/scripts/audit-codebase.sh +0 -213
  347. package/scripts/autoresearch/layer-eval.sh +0 -65
  348. package/scripts/benchmark/README.md +0 -25
  349. package/scripts/benchmark/container-scale.ts +0 -503
  350. package/scripts/benchmark/pre-release-gate.sh +0 -9
  351. package/scripts/install-git-hooks.sh +0 -14
  352. package/scripts/measure-idle-footprint.sh +0 -58
  353. package/scripts/record-demo.sh +0 -43
  354. package/scripts/release-binaries.sh +0 -97
  355. package/scripts/setup-pre-commit.sh +0 -33
  356. package/scripts/stage-npm-engine.sh +0 -36
  357. package/tests/tilt-engine/__init__.py +0 -5
  358. package/tests/tilt-engine/conftest.py +0 -182
  359. package/tests/tilt-engine/fixtures/appointment-frontend-service.json +0 -11
  360. package/tests/tilt-engine/fixtures/identity-backend-service.json +0 -12
  361. package/tests/tilt-engine/fixtures/invalid-service.json +0 -4
  362. package/tests/tilt-engine/test_agents_md_generator.py +0 -341
  363. package/tests/tilt-engine/test_agents_md_integration.py +0 -378
  364. package/tests/tilt-engine/test_cache_operations.py +0 -181
  365. package/tests/tilt-engine/test_cache_persistence.py +0 -142
  366. package/tests/tilt-engine/test_code_executor.py +0 -152
  367. package/tests/tilt-engine/test_code_viewer.py +0 -127
  368. package/tests/tilt-engine/test_compose_port_anchors.py +0 -310
  369. package/tests/tilt-engine/test_config_inspector.py +0 -162
  370. package/tests/tilt-engine/test_daemon_focus_mode.py +0 -89
  371. package/tests/tilt-engine/test_daemon_polling.py +0 -122
  372. package/tests/tilt-engine/test_daemon_registration.py +0 -115
  373. package/tests/tilt-engine/test_daemon_validation.py +0 -107
  374. package/tests/tilt-engine/test_docker_generator_bugs.py +0 -493
  375. package/tests/tilt-engine/test_docker_prune.py +0 -119
  376. package/tests/tilt-engine/test_dockerignore_path_bug.py +0 -82
  377. package/tests/tilt-engine/test_file_browser.py +0 -193
  378. package/tests/tilt-engine/test_frontend_basepath_manifest.py +0 -27
  379. package/tests/tilt-engine/test_health_dependencies.py +0 -130
  380. package/tests/tilt-engine/test_health_endpoints.py +0 -118
  381. package/tests/tilt-engine/test_health_tilt_ui.py +0 -85
  382. package/tests/tilt-engine/test_runtime_container_footprint.py +0 -162
  383. package/tests/tilt-engine/test_sablier_defer_start.py +0 -237
  384. package/tests/tilt-engine/test_safety_aliases.py +0 -84
  385. package/tests/tilt-engine/test_snapshot_diff.py +0 -136
  386. package/tests/tilt-engine/test_snapshot_persistence.py +0 -163
  387. package/tests/tilt-engine/test_snapshot_scanning.py +0 -123
  388. package/tests/tilt-engine/test_standalone_project_boot.py +0 -61
  389. package/tests/tilt-engine/test_standalone_traefik.py +0 -160
  390. 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
- }