@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,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"])