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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/cli/dist/generator/extension-fetch.js +16 -9
  3. package/cli/package.json +1 -1
  4. package/package.json +16 -1
  5. package/.claude/skills/layer-autoresearch/SKILL.md +0 -48
  6. package/.claude/skills/tdk-troubleshoot/SKILL.md +0 -222
  7. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -40
  8. package/.github/ISSUE_TEMPLATE/config.yml +0 -11
  9. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -18
  10. package/.github/ISSUE_TEMPLATE/premium_license.yml +0 -43
  11. package/.github/dependabot.yml +0 -33
  12. package/.github/pull_request_template.md +0 -5
  13. package/.github/workflows/ci.yml +0 -200
  14. package/.github/workflows/release-binaries.yml +0 -139
  15. package/.github/zizmor.yml +0 -9
  16. package/.pre-commit-config.yaml +0 -57
  17. package/CODE_OF_CONDUCT.md +0 -9
  18. package/CONTRIBUTING.md +0 -42
  19. package/Makefile +0 -92
  20. package/SECURITY.md +0 -17
  21. package/benchmarks/results/container-scale-2026-09-25T20-54-49-736Z.json +0 -45
  22. package/benchmarks/results/container-scale-2026-09-25T21-01-20-540Z.json +0 -150
  23. package/benchmarks/results/container-scale-2026-09-25T21-15-01-441Z.json +0 -73
  24. package/benchmarks/results/container-scale-2026-09-25T22-09-01-630Z.json +0 -77
  25. package/benchmarks/results/container-scale-2026-09-25T22-18-28-371Z.json +0 -202
  26. package/cli/AGENTS.md +0 -390
  27. package/cli/DESIGN.md +0 -735
  28. package/cli/README.md +0 -292
  29. package/cli/biome.json +0 -40
  30. package/cli/dependency-graph.svg +0 -1135
  31. package/cli/dist/cli.d.ts +0 -3
  32. package/cli/dist/cli.d.ts.map +0 -1
  33. package/cli/dist/cli.js.map +0 -1
  34. package/cli/dist/commands/completion.d.ts +0 -3
  35. package/cli/dist/commands/completion.d.ts.map +0 -1
  36. package/cli/dist/commands/completion.js.map +0 -1
  37. package/cli/dist/commands/config.d.ts +0 -3
  38. package/cli/dist/commands/config.d.ts.map +0 -1
  39. package/cli/dist/commands/config.js.map +0 -1
  40. package/cli/dist/commands/doctor.d.ts +0 -19
  41. package/cli/dist/commands/doctor.d.ts.map +0 -1
  42. package/cli/dist/commands/doctor.js.map +0 -1
  43. package/cli/dist/commands/down.d.ts +0 -3
  44. package/cli/dist/commands/down.d.ts.map +0 -1
  45. package/cli/dist/commands/down.js.map +0 -1
  46. package/cli/dist/commands/help.d.ts +0 -2
  47. package/cli/dist/commands/help.d.ts.map +0 -1
  48. package/cli/dist/commands/help.js.map +0 -1
  49. package/cli/dist/commands/networks.d.ts +0 -3
  50. package/cli/dist/commands/networks.d.ts.map +0 -1
  51. package/cli/dist/commands/networks.js.map +0 -1
  52. package/cli/dist/commands/project.d.ts +0 -9
  53. package/cli/dist/commands/project.d.ts.map +0 -1
  54. package/cli/dist/commands/project.js.map +0 -1
  55. package/cli/dist/commands/projects.d.ts +0 -3
  56. package/cli/dist/commands/projects.d.ts.map +0 -1
  57. package/cli/dist/commands/projects.js.map +0 -1
  58. package/cli/dist/commands/resource.d.ts +0 -69
  59. package/cli/dist/commands/resource.d.ts.map +0 -1
  60. package/cli/dist/commands/resource.js.map +0 -1
  61. package/cli/dist/commands/resources.d.ts +0 -3
  62. package/cli/dist/commands/resources.d.ts.map +0 -1
  63. package/cli/dist/commands/resources.js.map +0 -1
  64. package/cli/dist/commands/stack.d.ts +0 -3
  65. package/cli/dist/commands/stack.d.ts.map +0 -1
  66. package/cli/dist/commands/stack.js.map +0 -1
  67. package/cli/dist/commands/stacks.d.ts +0 -3
  68. package/cli/dist/commands/stacks.d.ts.map +0 -1
  69. package/cli/dist/commands/stacks.js.map +0 -1
  70. package/cli/dist/commands/status.d.ts +0 -3
  71. package/cli/dist/commands/status.d.ts.map +0 -1
  72. package/cli/dist/commands/status.js.map +0 -1
  73. package/cli/dist/commands/ui.d.ts +0 -3
  74. package/cli/dist/commands/ui.d.ts.map +0 -1
  75. package/cli/dist/commands/ui.js.map +0 -1
  76. package/cli/dist/commands/up.d.ts +0 -3
  77. package/cli/dist/commands/up.d.ts.map +0 -1
  78. package/cli/dist/commands/up.js.map +0 -1
  79. package/cli/dist/commands/upgrade.d.ts +0 -14
  80. package/cli/dist/commands/upgrade.d.ts.map +0 -1
  81. package/cli/dist/commands/upgrade.js.map +0 -1
  82. package/cli/dist/commands/version.d.ts +0 -3
  83. package/cli/dist/commands/version.d.ts.map +0 -1
  84. package/cli/dist/commands/version.js.map +0 -1
  85. package/cli/dist/components/Accessible.d.ts +0 -8
  86. package/cli/dist/components/Accessible.d.ts.map +0 -1
  87. package/cli/dist/components/Accessible.js.map +0 -1
  88. package/cli/dist/components/BaseTooltip.d.ts +0 -4
  89. package/cli/dist/components/BaseTooltip.d.ts.map +0 -1
  90. package/cli/dist/components/BaseTooltip.js.map +0 -1
  91. package/cli/dist/components/DetailPanel.d.ts +0 -4
  92. package/cli/dist/components/DetailPanel.d.ts.map +0 -1
  93. package/cli/dist/components/DetailPanel.js.map +0 -1
  94. package/cli/dist/components/FileTree.d.ts +0 -4
  95. package/cli/dist/components/FileTree.d.ts.map +0 -1
  96. package/cli/dist/components/FileTree.js.map +0 -1
  97. package/cli/dist/components/ResourceSelectInput.d.ts +0 -4
  98. package/cli/dist/components/ResourceSelectInput.d.ts.map +0 -1
  99. package/cli/dist/components/ResourceSelectInput.js.map +0 -1
  100. package/cli/dist/components/ResourceTable.d.ts +0 -4
  101. package/cli/dist/components/ResourceTable.d.ts.map +0 -1
  102. package/cli/dist/components/ResourceTable.js.map +0 -1
  103. package/cli/dist/components/TabBar.d.ts +0 -4
  104. package/cli/dist/components/TabBar.d.ts.map +0 -1
  105. package/cli/dist/components/TabBar.js.map +0 -1
  106. package/cli/dist/components/Tooltip.d.ts +0 -12
  107. package/cli/dist/components/Tooltip.d.ts.map +0 -1
  108. package/cli/dist/components/Tooltip.js.map +0 -1
  109. package/cli/dist/components/index.d.ts +0 -8
  110. package/cli/dist/components/index.d.ts.map +0 -1
  111. package/cli/dist/components/index.js.map +0 -1
  112. package/cli/dist/config/platform-standards.d.ts +0 -159
  113. package/cli/dist/config/platform-standards.d.ts.map +0 -1
  114. package/cli/dist/config/platform-standards.js.map +0 -1
  115. package/cli/dist/generator/extension-fetch.d.ts +0 -25
  116. package/cli/dist/generator/extension-fetch.d.ts.map +0 -1
  117. package/cli/dist/generator/extension-fetch.js.map +0 -1
  118. package/cli/dist/generator/template-engine.d.ts +0 -62
  119. package/cli/dist/generator/template-engine.d.ts.map +0 -1
  120. package/cli/dist/generator/template-engine.js.map +0 -1
  121. package/cli/dist/index.d.ts +0 -11
  122. package/cli/dist/index.d.ts.map +0 -1
  123. package/cli/dist/index.js.map +0 -1
  124. package/cli/dist/types/index.d.ts +0 -257
  125. package/cli/dist/types/index.d.ts.map +0 -1
  126. package/cli/dist/types/index.js.map +0 -1
  127. package/cli/dist/utils/cache.d.ts +0 -19
  128. package/cli/dist/utils/cache.d.ts.map +0 -1
  129. package/cli/dist/utils/cache.js.map +0 -1
  130. package/cli/dist/utils/command-helpers.d.ts +0 -17
  131. package/cli/dist/utils/command-helpers.d.ts.map +0 -1
  132. package/cli/dist/utils/command-helpers.js.map +0 -1
  133. package/cli/dist/utils/constants.d.ts +0 -53
  134. package/cli/dist/utils/constants.d.ts.map +0 -1
  135. package/cli/dist/utils/constants.js.map +0 -1
  136. package/cli/dist/utils/discovery-context.d.ts +0 -4
  137. package/cli/dist/utils/discovery-context.d.ts.map +0 -1
  138. package/cli/dist/utils/discovery-context.js.map +0 -1
  139. package/cli/dist/utils/docker.d.ts +0 -4
  140. package/cli/dist/utils/docker.d.ts.map +0 -1
  141. package/cli/dist/utils/docker.js.map +0 -1
  142. package/cli/dist/utils/doctor-runtime.d.ts +0 -81
  143. package/cli/dist/utils/doctor-runtime.d.ts.map +0 -1
  144. package/cli/dist/utils/doctor-runtime.js.map +0 -1
  145. package/cli/dist/utils/env-validator.d.ts +0 -15
  146. package/cli/dist/utils/env-validator.d.ts.map +0 -1
  147. package/cli/dist/utils/env-validator.js.map +0 -1
  148. package/cli/dist/utils/errors.d.ts +0 -31
  149. package/cli/dist/utils/errors.d.ts.map +0 -1
  150. package/cli/dist/utils/errors.js.map +0 -1
  151. package/cli/dist/utils/file-helpers.d.ts +0 -14
  152. package/cli/dist/utils/file-helpers.d.ts.map +0 -1
  153. package/cli/dist/utils/file-helpers.js.map +0 -1
  154. package/cli/dist/utils/formatting.d.ts +0 -30
  155. package/cli/dist/utils/formatting.d.ts.map +0 -1
  156. package/cli/dist/utils/formatting.js.map +0 -1
  157. package/cli/dist/utils/paths.d.ts +0 -3
  158. package/cli/dist/utils/paths.d.ts.map +0 -1
  159. package/cli/dist/utils/paths.js.map +0 -1
  160. package/cli/dist/utils/port-assignment.d.ts +0 -6
  161. package/cli/dist/utils/port-assignment.d.ts.map +0 -1
  162. package/cli/dist/utils/port-assignment.js.map +0 -1
  163. package/cli/dist/utils/project-features.d.ts +0 -23
  164. package/cli/dist/utils/project-features.d.ts.map +0 -1
  165. package/cli/dist/utils/project-features.js.map +0 -1
  166. package/cli/dist/utils/project-templates.d.ts +0 -7
  167. package/cli/dist/utils/project-templates.d.ts.map +0 -1
  168. package/cli/dist/utils/project-templates.js.map +0 -1
  169. package/cli/dist/utils/prompt.d.ts +0 -28
  170. package/cli/dist/utils/prompt.d.ts.map +0 -1
  171. package/cli/dist/utils/prompt.js.map +0 -1
  172. package/cli/dist/utils/resource-features.d.ts +0 -29
  173. package/cli/dist/utils/resource-features.d.ts.map +0 -1
  174. package/cli/dist/utils/resource-features.js.map +0 -1
  175. package/cli/dist/utils/service-urls.d.ts +0 -30
  176. package/cli/dist/utils/service-urls.d.ts.map +0 -1
  177. package/cli/dist/utils/service-urls.js.map +0 -1
  178. package/cli/dist/utils/services.d.ts +0 -18
  179. package/cli/dist/utils/services.d.ts.map +0 -1
  180. package/cli/dist/utils/services.js.map +0 -1
  181. package/cli/dist/utils/stack-features.d.ts +0 -22
  182. package/cli/dist/utils/stack-features.d.ts.map +0 -1
  183. package/cli/dist/utils/stack-features.js.map +0 -1
  184. package/cli/dist/utils/tar.d.ts +0 -7
  185. package/cli/dist/utils/tar.d.ts.map +0 -1
  186. package/cli/dist/utils/tar.js.map +0 -1
  187. package/cli/dist/utils/tilt.d.ts +0 -20
  188. package/cli/dist/utils/tilt.d.ts.map +0 -1
  189. package/cli/dist/utils/tilt.js.map +0 -1
  190. package/cli/dist/utils/validation.d.ts +0 -16
  191. package/cli/dist/utils/validation.d.ts.map +0 -1
  192. package/cli/dist/utils/validation.js.map +0 -1
  193. package/cli/knip.json +0 -6
  194. package/cli/pnpm-lock.yaml +0 -2305
  195. package/cli/pnpm-workspace.yaml +0 -2
  196. package/cli/src/cli.ts +0 -72
  197. package/cli/src/commands/__tests__/always-enabled-infra.test.ts +0 -109
  198. package/cli/src/commands/__tests__/config.test.ts +0 -146
  199. package/cli/src/commands/__tests__/doctor.test.ts +0 -730
  200. package/cli/src/commands/__tests__/error-handling.test.ts +0 -78
  201. package/cli/src/commands/__tests__/phases-model.test.ts +0 -161
  202. package/cli/src/commands/__tests__/project-resource-features-e2e.test.ts +0 -187
  203. package/cli/src/commands/__tests__/project.test.ts +0 -68
  204. package/cli/src/commands/__tests__/resource.test.ts +0 -226
  205. package/cli/src/commands/__tests__/saas-starter-integration.test.ts +0 -194
  206. package/cli/src/commands/__tests__/stack-features-e2e.test.ts +0 -135
  207. package/cli/src/commands/__tests__/upgrade.test.ts +0 -198
  208. package/cli/src/commands/completion.ts +0 -300
  209. package/cli/src/commands/config.ts +0 -299
  210. package/cli/src/commands/doctor.ts +0 -926
  211. package/cli/src/commands/down.ts +0 -37
  212. package/cli/src/commands/help.ts +0 -143
  213. package/cli/src/commands/networks-design.md +0 -80
  214. package/cli/src/commands/networks.ts +0 -332
  215. package/cli/src/commands/project.ts +0 -456
  216. package/cli/src/commands/projects.ts +0 -82
  217. package/cli/src/commands/resource.ts +0 -652
  218. package/cli/src/commands/resources.ts +0 -95
  219. package/cli/src/commands/stack.ts +0 -128
  220. package/cli/src/commands/stacks.ts +0 -52
  221. package/cli/src/commands/status.ts +0 -88
  222. package/cli/src/commands/ui.tsx +0 -843
  223. package/cli/src/commands/up.ts +0 -169
  224. package/cli/src/commands/upgrade.ts +0 -628
  225. package/cli/src/commands/version.ts +0 -9
  226. package/cli/src/components/Accessible.tsx +0 -21
  227. package/cli/src/components/BaseTooltip.tsx +0 -66
  228. package/cli/src/components/DetailPanel.tsx +0 -146
  229. package/cli/src/components/FileTree.tsx +0 -89
  230. package/cli/src/components/ResourceSelectInput.tsx +0 -30
  231. package/cli/src/components/ResourceTable.tsx +0 -78
  232. package/cli/src/components/TabBar.tsx +0 -53
  233. package/cli/src/components/Tooltip.tsx +0 -11
  234. package/cli/src/components/index.ts +0 -7
  235. package/cli/src/config/platform-standards.test.ts +0 -11
  236. package/cli/src/config/platform-standards.ts +0 -196
  237. package/cli/src/generator/__tests__/extension-fetch.test.ts +0 -242
  238. package/cli/src/generator/__tests__/template-engine.test.ts +0 -70
  239. package/cli/src/generator/extension-fetch.ts +0 -286
  240. package/cli/src/generator/template-engine.ts +0 -752
  241. package/cli/src/index.ts +0 -86
  242. package/cli/src/templates.d.ts +0 -4
  243. package/cli/src/types/index.ts +0 -353
  244. package/cli/src/utils/__tests__/cache.test.ts +0 -98
  245. package/cli/src/utils/__tests__/formatting.test.ts +0 -170
  246. package/cli/src/utils/__tests__/paths.test.ts +0 -180
  247. package/cli/src/utils/__tests__/port-assignment.test.ts +0 -121
  248. package/cli/src/utils/__tests__/service-urls.test.ts +0 -174
  249. package/cli/src/utils/__tests__/services.test.ts +0 -531
  250. package/cli/src/utils/__tests__/tilt.test.ts +0 -172
  251. package/cli/src/utils/__tests__/validation.test.ts +0 -148
  252. package/cli/src/utils/cache.ts +0 -76
  253. package/cli/src/utils/command-helpers.ts +0 -54
  254. package/cli/src/utils/constants.ts +0 -130
  255. package/cli/src/utils/discovery-context.ts +0 -49
  256. package/cli/src/utils/docker.ts +0 -20
  257. package/cli/src/utils/doctor-runtime.ts +0 -644
  258. package/cli/src/utils/env-validator.ts +0 -139
  259. package/cli/src/utils/errors.ts +0 -168
  260. package/cli/src/utils/file-helpers.ts +0 -62
  261. package/cli/src/utils/formatting.ts +0 -215
  262. package/cli/src/utils/paths.ts +0 -53
  263. package/cli/src/utils/port-assignment.ts +0 -106
  264. package/cli/src/utils/project-features.ts +0 -118
  265. package/cli/src/utils/project-templates.ts +0 -29
  266. package/cli/src/utils/prompt.ts +0 -128
  267. package/cli/src/utils/resource-features.ts +0 -215
  268. package/cli/src/utils/service-urls.ts +0 -124
  269. package/cli/src/utils/services.ts +0 -364
  270. package/cli/src/utils/stack-features.ts +0 -30
  271. package/cli/src/utils/tar.ts +0 -24
  272. package/cli/src/utils/tilt.ts +0 -133
  273. package/cli/src/utils/validation.ts +0 -67
  274. package/cli/tsconfig.json +0 -25
  275. package/cli/tsconfig.typecheck.json +0 -8
  276. package/docs/FEATURES.md +0 -281
  277. package/docs/demo.svg +0 -217
  278. package/engine/docs/AUTODISCOVERY_TEST.md +0 -182
  279. package/engine/docs/C4-ARCHITECTURE-operations.md +0 -396
  280. package/engine/docs/C4-ARCHITECTURE-overview.md +0 -284
  281. package/engine/docs/C4-ARCHITECTURE.md +0 -17
  282. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +0 -349
  283. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +0 -357
  284. package/engine/docs/README.md +0 -284
  285. package/install.sh +0 -19
  286. package/knip.json +0 -10
  287. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/.openspec.yaml +0 -2
  288. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/design.md +0 -102
  289. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/proposal.md +0 -31
  290. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-notifications/spec.md +0 -48
  291. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-orchestration/spec.md +0 -63
  292. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-troubleshooting/spec.md +0 -56
  293. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/tasks.md +0 -61
  294. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/.openspec.yaml +0 -2
  295. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/design.md +0 -114
  296. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/proposal.md +0 -32
  297. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/manifest-field-migration/spec.md +0 -20
  298. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/resource-terminology-standard/spec.md +0 -20
  299. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/stack-terminology-standard/spec.md +0 -20
  300. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/tasks.md +0 -194
  301. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/.openspec.yaml +0 -2
  302. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/design.md +0 -111
  303. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/proposal.md +0 -33
  304. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/function-naming-alignment/spec.md +0 -12
  305. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/optional-parameter-patterns/spec.md +0 -18
  306. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-documentation/spec.md +0 -16
  307. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-naming-consistency/spec.md +0 -12
  308. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-ordering-standard/spec.md +0 -12
  309. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/tasks.md +0 -194
  310. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/.openspec.yaml +0 -2
  311. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/design.md +0 -84
  312. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/proposal.md +0 -31
  313. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/codebase-audit/spec.md +0 -27
  314. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/dead-code-cleanup/spec.md +0 -27
  315. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/test-gap-fill/spec.md +0 -23
  316. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/todo-resolution/spec.md +0 -27
  317. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/tasks.md +0 -39
  318. package/openspec/changes/archive/2026-06-25-landscape-consolidation/.openspec.yaml +0 -2
  319. package/openspec/changes/archive/2026-06-25-landscape-consolidation/design.md +0 -80
  320. package/openspec/changes/archive/2026-06-25-landscape-consolidation/proposal.md +0 -40
  321. package/openspec/changes/archive/2026-06-25-landscape-consolidation/spec.md +0 -52
  322. package/openspec/changes/archive/2026-06-25-landscape-consolidation/tasks.md +0 -51
  323. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/.openspec.yaml +0 -2
  324. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/design.md +0 -43
  325. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/proposal.md +0 -29
  326. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/specs/self-contained-generated-projects/spec.md +0 -67
  327. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/tasks.md +0 -27
  328. package/openspec/changes/optimize-runtime-docker-layers/.openspec.yaml +0 -3
  329. package/openspec/changes/optimize-runtime-docker-layers/design.md +0 -81
  330. package/openspec/changes/optimize-runtime-docker-layers/proposal.md +0 -44
  331. package/openspec/changes/optimize-runtime-docker-layers/specs/runtime-container-footprint/spec.md +0 -79
  332. package/openspec/changes/optimize-runtime-docker-layers/tasks.md +0 -36
  333. package/openspec/changes/prioritized-cold-start/.openspec.yaml +0 -4
  334. package/openspec/changes/prioritized-cold-start/design.md +0 -137
  335. package/openspec/changes/prioritized-cold-start/proposal.md +0 -41
  336. package/openspec/changes/prioritized-cold-start/specs/on-demand-resource-startup/spec.md +0 -98
  337. package/openspec/changes/prioritized-cold-start/tasks.md +0 -69
  338. package/openspec/config.yaml +0 -1
  339. package/openspec/specs/manifest-field-migration/spec.md +0 -24
  340. package/openspec/specs/resource-terminology-standard/spec.md +0 -24
  341. package/openspec/specs/self-contained-generated-projects/spec.md +0 -67
  342. package/openspec/specs/stack-terminology-standard/spec.md +0 -24
  343. package/platform/services/platform/proxy/service.yaml +0 -14
  344. package/scripts/audit-codebase.sh +0 -213
  345. package/scripts/autoresearch/layer-eval.sh +0 -65
  346. package/scripts/benchmark/README.md +0 -25
  347. package/scripts/benchmark/container-scale.ts +0 -503
  348. package/scripts/benchmark/pre-release-gate.sh +0 -9
  349. package/scripts/install-git-hooks.sh +0 -14
  350. package/scripts/measure-idle-footprint.sh +0 -58
  351. package/scripts/record-demo.sh +0 -43
  352. package/scripts/release-binaries.sh +0 -97
  353. package/scripts/setup-pre-commit.sh +0 -33
  354. package/scripts/stage-npm-engine.sh +0 -36
  355. package/tests/tilt-engine/__init__.py +0 -5
  356. package/tests/tilt-engine/conftest.py +0 -182
  357. package/tests/tilt-engine/fixtures/appointment-frontend-service.json +0 -11
  358. package/tests/tilt-engine/fixtures/identity-backend-service.json +0 -12
  359. package/tests/tilt-engine/fixtures/invalid-service.json +0 -4
  360. package/tests/tilt-engine/test_agents_md_generator.py +0 -341
  361. package/tests/tilt-engine/test_agents_md_integration.py +0 -378
  362. package/tests/tilt-engine/test_cache_operations.py +0 -181
  363. package/tests/tilt-engine/test_cache_persistence.py +0 -142
  364. package/tests/tilt-engine/test_code_executor.py +0 -152
  365. package/tests/tilt-engine/test_code_viewer.py +0 -127
  366. package/tests/tilt-engine/test_compose_port_anchors.py +0 -310
  367. package/tests/tilt-engine/test_config_inspector.py +0 -162
  368. package/tests/tilt-engine/test_daemon_focus_mode.py +0 -89
  369. package/tests/tilt-engine/test_daemon_polling.py +0 -122
  370. package/tests/tilt-engine/test_daemon_registration.py +0 -115
  371. package/tests/tilt-engine/test_daemon_validation.py +0 -107
  372. package/tests/tilt-engine/test_docker_generator_bugs.py +0 -493
  373. package/tests/tilt-engine/test_docker_prune.py +0 -119
  374. package/tests/tilt-engine/test_dockerignore_path_bug.py +0 -82
  375. package/tests/tilt-engine/test_file_browser.py +0 -193
  376. package/tests/tilt-engine/test_frontend_basepath_manifest.py +0 -27
  377. package/tests/tilt-engine/test_health_dependencies.py +0 -130
  378. package/tests/tilt-engine/test_health_endpoints.py +0 -118
  379. package/tests/tilt-engine/test_health_tilt_ui.py +0 -85
  380. package/tests/tilt-engine/test_runtime_container_footprint.py +0 -162
  381. package/tests/tilt-engine/test_sablier_defer_start.py +0 -237
  382. package/tests/tilt-engine/test_safety_aliases.py +0 -84
  383. package/tests/tilt-engine/test_snapshot_diff.py +0 -136
  384. package/tests/tilt-engine/test_snapshot_persistence.py +0 -163
  385. package/tests/tilt-engine/test_snapshot_scanning.py +0 -123
  386. package/tests/tilt-engine/test_standalone_project_boot.py +0 -61
  387. package/tests/tilt-engine/test_standalone_traefik.py +0 -160
  388. package/tests/tilt-engine/test_traefik_static_wake_route.py +0 -187
@@ -1,152 +0,0 @@
1
- """
2
- Tests for code executor component.
3
- Tests the terminal interface and command safety features.
4
- """
5
-
6
- import pytest
7
- import asyncio
8
- from pathlib import Path
9
- from typing import List, Tuple
10
-
11
-
12
- @pytest.mark.ide
13
- class TestCodeExecutor:
14
- """Tests for code executor functionality."""
15
-
16
- def test_allowed_command_execution(self, safe_commands):
17
- """
18
- Scenario: Allowed command execution
19
- WHEN a user submits `bun test` via the terminal interface
20
- THEN it SHALL execute the command
21
- AND it SHALL stream output to the browser in real-time
22
- """
23
- for cmd in safe_commands:
24
- is_allowed = self._is_command_allowed(cmd)
25
- assert is_allowed, f"Command should be allowed: {cmd}"
26
-
27
- def test_dangerous_command_blocked(self, dangerous_commands):
28
- """
29
- Scenario: Dangerous command blocked
30
- WHEN a user submits `rm -rf /` via the terminal interface
31
- THEN it SHALL return `403 Forbidden`
32
- AND it SHALL NOT execute the command
33
- AND it SHALL log the blocked attempt
34
- """
35
- for cmd in dangerous_commands:
36
- is_allowed = self._is_command_allowed(cmd)
37
- assert not is_allowed, f"Dangerous command should be blocked: {cmd}"
38
-
39
- @pytest.mark.asyncio
40
- async def test_timeout_enforcement(self):
41
- """
42
- Scenario: Timeout enforcement
43
- WHEN a user submits a command that runs longer than 60 seconds
44
- THEN it SHALL terminate the process after 60 seconds
45
- AND it SHALL return partial output with a timeout message
46
- """
47
- # Simulate long-running command
48
- timeout_seconds = 60
49
-
50
- async def long_command():
51
- await asyncio.sleep(100) # Would run for 100s
52
- return "complete"
53
-
54
- # Wrap with timeout
55
- try:
56
- result = await asyncio.wait_for(long_command(), timeout=timeout_seconds)
57
- assert False, "Should have timed out"
58
- except asyncio.TimeoutError:
59
- pass # Expected
60
-
61
- # Verify timeout occurred
62
- assert True, "Timeout was correctly enforced"
63
-
64
- def test_command_history_navigation(self):
65
- """
66
- Scenario: Command history
67
- WHEN a user presses the Up arrow in the terminal
68
- THEN it SHALL display the previously executed command
69
- AND Down arrow SHALL navigate forward in history
70
- """
71
- # Simulate command history
72
- history: List[str] = [
73
- "bun test",
74
- "ls -la",
75
- "git status"
76
- ]
77
-
78
- current_index = len(history) # Start at end (empty line)
79
-
80
- # Press Up - should go to last command
81
- current_index -= 1
82
- assert current_index == 2
83
- assert history[current_index] == "git status"
84
-
85
- # Press Up again
86
- current_index -= 1
87
- assert history[current_index] == "ls -la"
88
-
89
- # Press Down - should go forward
90
- current_index += 1
91
- assert history[current_index] == "git status"
92
-
93
- def test_command_output_streaming(self):
94
- """Test that command output streams in real-time."""
95
- output_lines = [
96
- "Running tests...",
97
- "Test 1 passed",
98
- "Test 2 passed",
99
- "All tests passed!"
100
- ]
101
-
102
- # Simulate streaming
103
- received_lines = []
104
- for line in output_lines:
105
- received_lines.append(line)
106
-
107
- assert len(received_lines) == len(output_lines)
108
- assert received_lines == output_lines
109
-
110
- def test_blocked_command_logging(self, dangerous_commands):
111
- """Test that blocked commands are logged."""
112
- blocked_commands: List[str] = []
113
-
114
- for cmd in dangerous_commands:
115
- if not self._is_command_allowed(cmd):
116
- blocked_commands.append(cmd)
117
-
118
- assert len(blocked_commands) == len(dangerous_commands)
119
-
120
- def _is_command_allowed(self, command: str) -> bool:
121
- """Check if command is allowed."""
122
- dangerous_patterns = [
123
- "rm -rf /",
124
- "sudo",
125
- "su -",
126
- "passwd",
127
- "mkfs",
128
- "dd if=/dev/zero",
129
- "> /dev/sda",
130
- "chmod 777 /",
131
- ":(){ :|:& };:", # Fork bomb
132
- ]
133
-
134
- cmd_lower = command.lower()
135
-
136
- for pattern in dangerous_patterns:
137
- if pattern in cmd_lower:
138
- return False
139
-
140
- # Allow common safe commands
141
- safe_prefixes = [
142
- "bun ",
143
- "npm ",
144
- "git ",
145
- "ls",
146
- "cat ",
147
- "echo ",
148
- "pwd",
149
- "cd ",
150
- ]
151
-
152
- return any(command.startswith(prefix) for prefix in safe_prefixes)
@@ -1,127 +0,0 @@
1
- """
2
- Tests for code viewer component.
3
- Tests the syntax highlighting and file rendering features.
4
- """
5
-
6
- import pytest
7
- from pathlib import Path
8
-
9
-
10
- @pytest.mark.ide
11
- class TestCodeViewer:
12
- """Tests for code viewer functionality."""
13
-
14
- def test_typescript_file_syntax_highlighting(self, temp_dir):
15
- """
16
- Scenario: TypeScript file rendering
17
- WHEN a user requests to view a `.ts` file in the code viewer
18
- THEN it SHALL return HTML with syntax-highlighted TypeScript
19
- AND it SHALL include line numbers
20
- """
21
- # Create TypeScript file
22
- ts_file = temp_dir / "example.ts"
23
- ts_file.write_text("""interface User {
24
- id: number;
25
- name: string;
26
- }
27
-
28
- const user: User = { id: 1, name: "Test" };""")
29
-
30
- # Simulate code viewer response
31
- content = ts_file.read_text()
32
- html = self._generate_code_html(content, "typescript")
33
-
34
- # Verify HTML structure
35
- assert "<pre>" in html or "<code>" in html, "Should contain code block"
36
- assert "line-number" in html or "data-line" in html, "Should include line numbers"
37
- assert "interface" in html, "Should preserve TypeScript keywords"
38
-
39
- def test_read_only_indicator_display(self, temp_dir):
40
- """
41
- Scenario: File read-only indicator
42
- WHEN viewing any file in the code viewer
43
- THEN the page SHALL display a "👁️ READ-ONLY" indicator
44
- AND the content SHALL NOT be editable
45
- """
46
- html = self._generate_viewer_html("test.ts", "content", editable=False)
47
-
48
- # Verify read-only indicator
49
- assert "👁️" in html or "READ-ONLY" in html, "Should show read-only indicator"
50
- assert 'contenteditable="false"' in html or "readonly" in html.lower(), "Content should not be editable"
51
-
52
- def test_unsupported_file_type_handling(self, temp_dir):
53
- """
54
- Scenario: Unsupported file type
55
- WHEN a user requests a binary file (e.g., `.png`, `.exe`)
56
- THEN it SHALL return `415 Unsupported Media Type`
57
- AND it SHALL suggest downloading the file instead
58
- """
59
- # Create binary file
60
- binary_file = temp_dir / "test.png"
61
- binary_file.write_bytes(b"\x89PNG\r\n\x1a\n") # PNG magic bytes
62
-
63
- # Check if file is binary
64
- is_binary = self._is_binary_file(binary_file)
65
- assert is_binary, "Should detect binary file"
66
-
67
- # Binary files should not be displayed as text
68
- should_display = not is_binary
69
- assert not should_display, "Binary files should not be displayed in code viewer"
70
-
71
- def _generate_code_html(self, content: str, language: str) -> str:
72
- """Helper to generate syntax-highlighted HTML."""
73
- lines = content.split("\n")
74
-
75
- html_lines = ['<div class="code-viewer read-only">']
76
- html_lines.append('<div class="read-only-indicator">👁️ READ-ONLY</div>')
77
- html_lines.append(f'<pre class="language-{language}"><code>')
78
-
79
- for i, line in enumerate(lines, 1):
80
- html_lines.append(f'<span class="line" data-line="{i}"><span class="line-number">{i}</span>{self._escape_html(line)}</span>')
81
-
82
- html_lines.append('</code></pre>')
83
- html_lines.append('</div>')
84
-
85
- return "\n".join(html_lines)
86
-
87
- def _generate_viewer_html(self, filename: str, content: str, editable: bool = False) -> str:
88
- """Helper to generate viewer HTML."""
89
- return f"""<!DOCTYPE html>
90
- <html>
91
- <head><title>{filename}</title></head>
92
- <body>
93
- <div class="code-viewer {'' if editable else 'read-only'}">
94
- <div class="header">
95
- <span>👁️ READ-ONLY</span>
96
- <span>{filename}</span>
97
- </div>
98
- <pre><code contenteditable="{'true' if editable else 'false'}">{self._escape_html(content)}</code></pre>
99
- </div>
100
- </body>
101
- </html>"""
102
-
103
- def _escape_html(self, text: str) -> str:
104
- """Escape HTML special characters."""
105
- return (text
106
- .replace("&", "&amp;")
107
- .replace("<", "&lt;")
108
- .replace(">", "&gt;")
109
- .replace('"', "&quot;"))
110
-
111
- def _is_binary_file(self, path: Path) -> bool:
112
- """Check if file is binary."""
113
- try:
114
- with open(path, "rb") as f:
115
- chunk = f.read(1024)
116
- return b"\x00" in chunk or not self._is_text_content(chunk)
117
- except Exception:
118
- return True
119
-
120
- def _is_text_content(self, content: bytes) -> bool:
121
- """Check if content is likely text."""
122
- # Try to decode as UTF-8
123
- try:
124
- content.decode("utf-8")
125
- return True
126
- except UnicodeDecodeError:
127
- return False
@@ -1,310 +0,0 @@
1
- """
2
- Test the compose port anchor replacement logic.
3
-
4
- This directly tests the _replace_ports_with_anchors function behavior
5
- to ensure backend services get *backend-port and frontends get *frontend-port.
6
- """
7
-
8
- import pytest
9
- import re
10
-
11
- pytestmark = [pytest.mark.fast, pytest.mark.generator]
12
-
13
-
14
- class TestReplacePortsWithAnchors:
15
- """Test the port anchor replacement logic that caused the Traefik bug."""
16
-
17
- @pytest.fixture
18
- def backend_resource_entry(self) -> str:
19
- """Backend service entry - should get *backend-port."""
20
- return ''' identity-backend:
21
- image: identity_identity-backend:dev
22
- labels:
23
- - "traefik.enable=true"
24
- - "traefik.http.services.identity-backend.loadbalancer.server.port=4004"
25
- - "traefik.http.services.identity-backend.loadbalancer.healthcheck.path=/api/v1/health"
26
- healthcheck:
27
- test: ["CMD", "curl", "-f", "http://localhost:4004/api/v1/health"]
28
- deploy:
29
- resources:
30
- limits:
31
- memory: 512M
32
- '''
33
-
34
- @pytest.fixture
35
- def frontend_resource_entry(self) -> str:
36
- """Frontend service entry - should get *frontend-port."""
37
- return ''' identity-frontend:
38
- image: identity_identity-frontend:dev
39
- <<: *frontend-memory-limit
40
- labels:
41
- - "traefik.enable=true"
42
- - "traefik.http.services.identity-frontend.loadbalancer.server.port=3000"
43
- healthcheck:
44
- test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:3000"]
45
- '''
46
-
47
- @pytest.fixture
48
- def sdk_resource_entry(self) -> str:
49
- """SDK service entry - should get *sdk-port."""
50
- return ''' identity-sdk:
51
- image: identity_identity-sdk:dev
52
- labels:
53
- - "traefik.enable=true"
54
- - "traefik.http.services.identity-sdk.loadbalancer.server.port=5175"
55
- '''
56
-
57
- def simulate_replace_ports_with_anchors(
58
- self,
59
- entry: str,
60
- has_sdk: bool = False,
61
- has_frontend: bool = False,
62
- has_backend: bool = False
63
- ) -> str:
64
- """
65
- Simulate the fixed _replace_ports_with_anchors function.
66
-
67
- This mirrors the logic in compose.star after the fix:
68
- - Detects entry type by checking entry content
69
- - Uses entry type, not just global flags
70
- """
71
- # Detect entry type from content (same logic as _is_backend_entry, _is_sdk_entry)
72
- is_sdk = "-sdk:" in entry or entry.strip().startswith("identity-sdk:")
73
- is_frontend = "<<: *frontend-memory-limit" in entry
74
- is_backend = "healthcheck:" in entry and "curl" in entry and not is_frontend and not is_sdk
75
-
76
- result = []
77
- for line in entry.split('\n'):
78
- new_line = line
79
-
80
- # Replace Traefik loadbalancer port
81
- if "loadbalancer.server.port=" in line and "traefik.http.services." in line:
82
- # Extract port value
83
- port_match = re.search(r'loadbalancer\.server\.port=(\d+)', line)
84
- if port_match:
85
- port_val = int(port_match.group(1))
86
-
87
- if port_val == 3000:
88
- # Port 3000 always uses backend-port
89
- new_line = line.replace(
90
- f"loadbalancer.server.port={port_val}",
91
- "loadbalancer.server.port=*backend-port"
92
- )
93
- else:
94
- # Non-3000 ports: use correct anchor based on entry type
95
- if is_sdk and has_sdk:
96
- new_line = line.replace(
97
- f"loadbalancer.server.port={port_val}",
98
- "loadbalancer.server.port=*sdk-port"
99
- )
100
- elif is_backend and has_backend:
101
- # CRITICAL FIX: Use backend-port for backends
102
- new_line = line.replace(
103
- f"loadbalancer.server.port={port_val}",
104
- "loadbalancer.server.port=*backend-port"
105
- )
106
- elif is_frontend and has_frontend:
107
- # Frontend uses frontend-port
108
- new_line = line.replace(
109
- f"loadbalancer.server.port={port_val}",
110
- "loadbalancer.server.port=*frontend-port"
111
- )
112
-
113
- result.append(new_line)
114
-
115
- return '\n'.join(result)
116
-
117
- def test_backend_gets_backend_port_anchor(self, backend_resource_entry: str):
118
- """Backend with port 4004 must get *backend-port anchor."""
119
- result = self.simulate_replace_ports_with_anchors(
120
- backend_resource_entry,
121
- has_sdk=False,
122
- has_frontend=True, # Simulate identity stack which has frontend
123
- has_backend=True
124
- )
125
-
126
- # Should have backend-port, NOT frontend-port
127
- assert "*backend-port" in result, "Backend must use *backend-port anchor"
128
- assert "*frontend-port" not in result, "Backend must NOT use *frontend-port anchor"
129
- assert "*sdk-port" not in result, "Backend must NOT use *sdk-port anchor"
130
-
131
- def test_frontend_gets_frontend_port_anchor(self, frontend_resource_entry: str):
132
- """Frontend with port 3000 (or other) must get *frontend-port anchor."""
133
- result = self.simulate_replace_ports_with_anchors(
134
- frontend_resource_entry,
135
- has_sdk=False,
136
- has_frontend=True,
137
- has_backend=False
138
- )
139
-
140
- # Port 3000 gets converted to backend-port (by design for 3000)
141
- # But if it were 4000, it would get frontend-port
142
- assert "*frontend-port" in result or "*backend-port" in result
143
-
144
- def test_frontend_non_3000_port_gets_frontend_anchor(self):
145
- """Frontend with port 4000 must get *frontend-port (not *backend-port)."""
146
- frontend_with_4000 = ''' custom-frontend:
147
- image: test:test
148
- <<: *frontend-memory-limit
149
- labels:
150
- - "traefik.http.services.custom-frontend.loadbalancer.server.port=4000"
151
- '''
152
- result = self.simulate_replace_ports_with_anchors(
153
- frontend_with_4000,
154
- has_sdk=False,
155
- has_frontend=True,
156
- has_backend=True # Even with has_backend=True
157
- )
158
-
159
- # Frontend should get frontend-port even with port 4000
160
- assert "*frontend-port" in result, "Frontend must use *frontend-port"
161
- assert "*backend-port" not in result, "Frontend must NOT use *backend-port"
162
-
163
- def test_sdk_gets_sdk_port_anchor(self, sdk_resource_entry: str):
164
- """SDK with port 5175 must get *sdk-port anchor."""
165
- result = self.simulate_replace_ports_with_anchors(
166
- sdk_resource_entry,
167
- has_sdk=True,
168
- has_frontend=True,
169
- has_backend=True
170
- )
171
-
172
- assert "*sdk-port" in result, "SDK must use *sdk-port anchor"
173
- assert "*backend-port" not in result, "SDK must NOT use *backend-port"
174
- assert "*frontend-port" not in result, "SDK must NOT use *frontend-port"
175
-
176
- def test_port_3000_always_backend_port(self):
177
- """Port 3000 always maps to *backend-port regardless of service type."""
178
- resource_with_3000 = ''' some-service:
179
- labels:
180
- - "traefik.http.services.some-service.loadbalancer.server.port=3000"
181
- '''
182
- result = self.simulate_replace_ports_with_anchors(
183
- resource_with_3000,
184
- has_sdk=False,
185
- has_frontend=True,
186
- has_backend=True
187
- )
188
-
189
- # Port 3000 always becomes *backend-port
190
- assert "*backend-port" in result
191
- assert "*frontend-port" not in result
192
-
193
- def test_original_bug_scenario(self):
194
- """
195
- Reproduce the original bug: identity-backend got *frontend-port.
196
-
197
- The bug occurred because:
198
- 1. has_frontend=True (because identity stack has a frontend)
199
- 2. Port 4004 != 3000
200
- 3. Old code checked has_frontend first, ignoring entry type
201
- 4. Result: backend got *frontend-port instead of *backend-port
202
- """
203
- identity_backend = ''' identity-management-backend:
204
- image: identity_identity-management-backend:dev
205
- labels:
206
- - "traefik.enable=true"
207
- - "traefik.http.services.identity-management-backend.loadbalancer.server.port=4004"
208
- - "traefik.http.services.identity-management-backend.loadbalancer.healthcheck.path=/api/v1/health"
209
- healthcheck:
210
- test: ["CMD", "curl", "-f", "http://localhost:4004/api/v1/health"]
211
- '''
212
-
213
- # Simulate old buggy logic (BEFORE fix)
214
- def old_buggy_replace(entry: str, has_frontend: bool = False) -> str:
215
- """The buggy version - only checks has_frontend flag."""
216
- result = []
217
- for line in entry.split('\n'):
218
- if "loadbalancer.server.port=" in line:
219
- port_match = re.search(r'loadbalancer\.server\.port=(\d+)', line)
220
- if port_match:
221
- port_val = int(port_match.group(1))
222
- if port_val != 3000:
223
- # BUG: Only checks has_frontend, ignores entry type!
224
- if has_frontend:
225
- line = line.replace(
226
- f"loadbalancer.server.port={port_val}",
227
- "loadbalancer.server.port=*frontend-port" # WRONG!
228
- )
229
- result.append(line)
230
- return '\n'.join(result)
231
-
232
- # Buggy result (what was happening before)
233
- buggy_result = old_buggy_replace(identity_backend, has_frontend=True)
234
- assert "*frontend-port" in buggy_result, "Bug: backend got frontend-port"
235
-
236
- # Fixed result (after our fix)
237
- fixed_result = self.simulate_replace_ports_with_anchors(
238
- identity_backend,
239
- has_sdk=False,
240
- has_frontend=True,
241
- has_backend=True
242
- )
243
- assert "*backend-port" in fixed_result, "Fix: backend now gets backend-port"
244
- assert "*frontend-port" not in fixed_result
245
-
246
- def test_mixed_stack_all_services_correct_anchors(self):
247
- """Test full identity stack with backend + frontend + SDK."""
248
- entries = [
249
- (''' identity-management-backend:
250
- image: identity_identity-management-backend:dev
251
- labels:
252
- - "traefik.http.services.identity-management-backend.loadbalancer.server.port=4004"
253
- healthcheck:
254
- test: ["CMD", "curl", "-f", "http://localhost:4004/api/v1/health"]
255
- ''', "*backend-port"),
256
- (''' identity-management-frontend:
257
- <<: *frontend-memory-limit
258
- labels:
259
- - "traefik.http.services.identity-management-frontend.loadbalancer.server.port=4000"
260
- ''', "*frontend-port"),
261
- (''' identity-sdk:
262
- labels:
263
- - "traefik.http.services.identity-sdk.loadbalancer.server.port=5175"
264
- ''', "*sdk-port"),
265
- ]
266
-
267
- for entry, expected_anchor in entries:
268
- result = self.simulate_replace_ports_with_anchors(
269
- entry,
270
- has_sdk=True,
271
- has_frontend=True,
272
- has_backend=True
273
- )
274
- assert expected_anchor in result, f"Entry should use {expected_anchor}"
275
-
276
-
277
- class TestPortAnchorExtraction:
278
- """Test that port anchors are correctly extracted from service entries."""
279
-
280
- def test_extract_backend_port_from_entry(self):
281
- """Extract backend port (4004) from service entry."""
282
- entry = ''' backend:
283
- labels:
284
- - "traefik.http.services.backend.loadbalancer.server.port=4004"
285
- '''
286
- match = re.search(r'loadbalancer\.server\.port=(\d+)', entry)
287
- assert match
288
- assert match.group(1) == "4004"
289
-
290
- def test_extract_frontend_port_from_entry(self):
291
- """Extract frontend port (3000) from service entry."""
292
- entry = ''' frontend:
293
- labels:
294
- - "traefik.http.services.frontend.loadbalancer.server.port=3000"
295
- '''
296
- match = re.search(r'loadbalancer\.server\.port=(\d+)', entry)
297
- assert match
298
- assert match.group(1) == "3000"
299
-
300
- def test_no_port_returns_none(self):
301
- """Entry without loadbalancer port should return None."""
302
- entry = ''' some-service:
303
- image: test:test
304
- '''
305
- match = re.search(r'loadbalancer\.server\.port=(\d+)', entry)
306
- assert match is None
307
-
308
-
309
- if __name__ == "__main__":
310
- pytest.main([__file__, "-v"])