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

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