@tdk-landscape/tdk-cli-core 1.3.45 → 1.3.49

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 (431) hide show
  1. package/.github/workflows/release-binaries.yml +54 -0
  2. package/.pre-commit-config.yaml +57 -0
  3. package/Makefile +92 -0
  4. package/bun.lock +538 -0
  5. package/cli/AGENTS.md +390 -0
  6. package/cli/DESIGN.md +735 -0
  7. package/cli/biome.json +44 -0
  8. package/cli/dependency-graph.svg +1135 -0
  9. package/cli/knip.json +6 -0
  10. package/cli/package.json +77 -0
  11. package/cli/pnpm-lock.yaml +2305 -0
  12. package/cli/pnpm-workspace.yaml +2 -0
  13. package/cli/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +23 -0
  14. package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +464 -0
  15. package/cli/shared-platform-engineering/docker-templates/install-deps.sh +152 -0
  16. package/cli/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +12 -0
  17. package/cli/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +56 -0
  18. package/{dist/cli.js → cli/src/cli.ts} +21 -13
  19. package/cli/src/commands/__tests__/always-enabled-infra.test.ts +115 -0
  20. package/cli/src/commands/__tests__/config.test.ts +146 -0
  21. package/cli/src/commands/__tests__/doctor.test.ts +557 -0
  22. package/cli/src/commands/__tests__/error-handling.test.ts +78 -0
  23. package/cli/src/commands/__tests__/phases-model.test.ts +163 -0
  24. package/cli/src/commands/__tests__/project-resource-features-e2e.test.ts +207 -0
  25. package/cli/src/commands/__tests__/project.test.ts +68 -0
  26. package/cli/src/commands/__tests__/resource.test.ts +226 -0
  27. package/cli/src/commands/__tests__/saas-starter-integration.test.ts +196 -0
  28. package/cli/src/commands/__tests__/stack-features-e2e.test.ts +129 -0
  29. package/cli/src/commands/__tests__/upgrade.test.ts +101 -0
  30. package/{dist/commands/completion.js → cli/src/commands/completion.ts} +78 -72
  31. package/cli/src/commands/config.ts +299 -0
  32. package/cli/src/commands/doctor.ts +790 -0
  33. package/cli/src/commands/down.ts +37 -0
  34. package/cli/src/commands/help.ts +150 -0
  35. package/cli/src/commands/networks-design.md +80 -0
  36. package/cli/src/commands/networks.ts +332 -0
  37. package/cli/src/commands/project.ts +439 -0
  38. package/cli/src/commands/projects.ts +82 -0
  39. package/cli/src/commands/resource.ts +652 -0
  40. package/cli/src/commands/resources.ts +95 -0
  41. package/cli/src/commands/stack.ts +128 -0
  42. package/cli/src/commands/stacks.ts +52 -0
  43. package/cli/src/commands/status.ts +88 -0
  44. package/cli/src/commands/ui.tsx +843 -0
  45. package/cli/src/commands/up.ts +150 -0
  46. package/cli/src/commands/upgrade.ts +570 -0
  47. package/{dist/commands/version.js → cli/src/commands/version.ts} +5 -5
  48. package/cli/src/components/Accessible.tsx +21 -0
  49. package/cli/src/components/BaseTooltip.tsx +66 -0
  50. package/cli/src/components/DetailPanel.tsx +146 -0
  51. package/cli/src/components/FileTree.tsx +89 -0
  52. package/cli/src/components/ResourceSelectInput.tsx +30 -0
  53. package/cli/src/components/ResourceTable.tsx +78 -0
  54. package/cli/src/components/TabBar.tsx +53 -0
  55. package/cli/src/components/Tooltip.tsx +11 -0
  56. package/{dist/components/index.js → cli/src/components/index.ts} +0 -1
  57. package/cli/src/config/platform-standards.test.ts +11 -0
  58. package/cli/src/config/platform-standards.ts +196 -0
  59. package/cli/src/generator/__tests__/extension-fetch.test.ts +220 -0
  60. package/cli/src/generator/__tests__/template-engine.test.ts +70 -0
  61. package/cli/src/generator/extension-fetch.ts +279 -0
  62. package/cli/src/generator/template-engine.ts +754 -0
  63. package/cli/src/index.ts +86 -0
  64. package/cli/src/templates.d.ts +4 -0
  65. package/cli/src/types/index.ts +351 -0
  66. package/cli/src/utils/__tests__/cache.test.ts +98 -0
  67. package/cli/src/utils/__tests__/formatting.test.ts +170 -0
  68. package/cli/src/utils/__tests__/paths.test.ts +180 -0
  69. package/cli/src/utils/__tests__/port-assignment.test.ts +121 -0
  70. package/cli/src/utils/__tests__/service-urls.test.ts +174 -0
  71. package/cli/src/utils/__tests__/services.test.ts +531 -0
  72. package/cli/src/utils/__tests__/tilt.test.ts +143 -0
  73. package/cli/src/utils/__tests__/validation.test.ts +148 -0
  74. package/cli/src/utils/cache.ts +76 -0
  75. package/cli/src/utils/command-helpers.ts +54 -0
  76. package/cli/src/utils/constants.ts +126 -0
  77. package/cli/src/utils/discovery-context.ts +49 -0
  78. package/cli/src/utils/docker.ts +20 -0
  79. package/cli/src/utils/doctor-runtime.ts +604 -0
  80. package/cli/src/utils/env-validator.ts +139 -0
  81. package/cli/src/utils/errors.ts +168 -0
  82. package/cli/src/utils/file-helpers.ts +62 -0
  83. package/cli/src/utils/formatting.ts +215 -0
  84. package/cli/src/utils/paths.ts +53 -0
  85. package/cli/src/utils/port-assignment.ts +106 -0
  86. package/cli/src/utils/project-features.ts +118 -0
  87. package/cli/src/utils/project-templates.ts +28 -0
  88. package/cli/src/utils/prompt.ts +123 -0
  89. package/cli/src/utils/resource-features.ts +209 -0
  90. package/cli/src/utils/service-urls.ts +124 -0
  91. package/cli/src/utils/services.ts +363 -0
  92. package/cli/src/utils/stack-features.ts +30 -0
  93. package/cli/src/utils/tar.ts +24 -0
  94. package/cli/src/utils/tilt.ts +113 -0
  95. package/cli/src/utils/validation.ts +67 -0
  96. package/{templates → cli/templates}/Tiltfile.hbs +1 -1
  97. package/cli/tsconfig.json +25 -0
  98. package/cli/tsconfig.typecheck.json +8 -0
  99. package/docs/FEATURES.md +279 -0
  100. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +3 -3
  101. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +1 -1
  102. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +0 -3
  103. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +1 -1
  104. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +1 -1
  105. package/engine/topologies/platform/docker/secrets/infisical.star +19 -47
  106. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +1 -1
  107. package/install.sh +242 -0
  108. package/knip.json +10 -0
  109. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/.openspec.yaml +2 -0
  110. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/design.md +102 -0
  111. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/proposal.md +31 -0
  112. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-notifications/spec.md +48 -0
  113. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-orchestration/spec.md +63 -0
  114. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-troubleshooting/spec.md +56 -0
  115. package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/tasks.md +61 -0
  116. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/.openspec.yaml +2 -0
  117. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/design.md +114 -0
  118. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/proposal.md +32 -0
  119. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/manifest-field-migration/spec.md +20 -0
  120. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/resource-terminology-standard/spec.md +20 -0
  121. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/stack-terminology-standard/spec.md +20 -0
  122. package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/tasks.md +194 -0
  123. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/.openspec.yaml +2 -0
  124. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/design.md +111 -0
  125. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/proposal.md +33 -0
  126. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/function-naming-alignment/spec.md +12 -0
  127. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/optional-parameter-patterns/spec.md +18 -0
  128. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-documentation/spec.md +16 -0
  129. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-naming-consistency/spec.md +12 -0
  130. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-ordering-standard/spec.md +12 -0
  131. package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/tasks.md +194 -0
  132. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/.openspec.yaml +2 -0
  133. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/codebase-audit-report.md +62 -0
  134. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/design.md +84 -0
  135. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/proposal.md +31 -0
  136. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/codebase-audit/spec.md +27 -0
  137. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/dead-code-cleanup/spec.md +27 -0
  138. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/test-gap-fill/spec.md +23 -0
  139. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/todo-resolution/spec.md +27 -0
  140. package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/tasks.md +39 -0
  141. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/.openspec.yaml +5 -0
  142. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/design.md +94 -0
  143. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/proposal.md +46 -0
  144. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/ai-slop-cleanup/CLEANUP_REPORT_8.md +174 -0
  145. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/ai-slop-cleanup/CRITICAL_ASSESSMENT_8.md +160 -0
  146. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/circular-deps/CRITICAL_ASSESSMENT_4.md +381 -0
  147. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/dead-code/CRITICAL_ASSESSMENT_3.md +316 -0
  148. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/deduplication/CRITICAL_ASSESSMENT_1.md +290 -0
  149. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/deduplication/IMPLEMENTATION_SUMMARY_1.md +233 -0
  150. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/defensive-cleanup/CRITICAL_ASSESSMENT_6.md +835 -0
  151. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/legacy-cleanup/CRITICAL_ASSESSMENT_7.md +254 -0
  152. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/legacy-cleanup/IMPLEMENTATION_SUMMARY_7.md +187 -0
  153. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/strong-typing/CRITICAL_ASSESSMENT_5.md +269 -0
  154. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/type-consolidation/CRITICAL_ASSESSMENT_2.md +312 -0
  155. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/type-consolidation/IMPLEMENTATION_SUMMARY.md +170 -0
  156. package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/tasks.md +137 -0
  157. package/openspec/changes/archive/2026-06-25-landscape-consolidation/.openspec.yaml +2 -0
  158. package/openspec/changes/archive/2026-06-25-landscape-consolidation/design.md +80 -0
  159. package/openspec/changes/archive/2026-06-25-landscape-consolidation/proposal.md +40 -0
  160. package/openspec/changes/archive/2026-06-25-landscape-consolidation/spec.md +52 -0
  161. package/openspec/changes/archive/2026-06-25-landscape-consolidation/tasks.md +51 -0
  162. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/.openspec.yaml +2 -0
  163. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/design.md +43 -0
  164. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/proposal.md +29 -0
  165. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/specs/self-contained-generated-projects/spec.md +67 -0
  166. package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/tasks.md +27 -0
  167. package/openspec/specs/manifest-field-migration/spec.md +24 -0
  168. package/openspec/specs/resource-terminology-standard/spec.md +24 -0
  169. package/openspec/specs/self-contained-generated-projects/spec.md +67 -0
  170. package/openspec/specs/stack-terminology-standard/spec.md +24 -0
  171. package/package.json +27 -64
  172. package/platform/services/platform/proxy/service.yaml +14 -0
  173. package/scripts/audit-codebase.sh +213 -0
  174. package/scripts/install-git-hooks.sh +14 -0
  175. package/scripts/release-binaries.sh +94 -0
  176. package/scripts/setup-pre-commit.sh +33 -0
  177. package/scripts/stage-npm-engine.sh +36 -0
  178. package/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +23 -0
  179. package/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +464 -0
  180. package/shared-platform-engineering/docker-templates/install-deps.sh +152 -0
  181. package/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +12 -0
  182. package/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +56 -0
  183. package/tests/tilt-engine/__init__.py +5 -0
  184. package/tests/tilt-engine/conftest.py +182 -0
  185. package/tests/tilt-engine/fixtures/appointment-frontend-service.json +11 -0
  186. package/tests/tilt-engine/fixtures/identity-backend-service.json +12 -0
  187. package/tests/tilt-engine/fixtures/invalid-service.json +4 -0
  188. package/tests/tilt-engine/test_agents_md_generator.py +341 -0
  189. package/tests/tilt-engine/test_agents_md_integration.py +378 -0
  190. package/tests/tilt-engine/test_cache_operations.py +181 -0
  191. package/tests/tilt-engine/test_cache_persistence.py +142 -0
  192. package/tests/tilt-engine/test_code_executor.py +152 -0
  193. package/tests/tilt-engine/test_code_viewer.py +127 -0
  194. package/tests/tilt-engine/test_compose_port_anchors.py +310 -0
  195. package/tests/tilt-engine/test_config_inspector.py +162 -0
  196. package/tests/tilt-engine/test_daemon_focus_mode.py +89 -0
  197. package/tests/tilt-engine/test_daemon_polling.py +122 -0
  198. package/tests/tilt-engine/test_daemon_registration.py +115 -0
  199. package/tests/tilt-engine/test_daemon_validation.py +107 -0
  200. package/tests/tilt-engine/test_docker_generator_bugs.py +493 -0
  201. package/tests/tilt-engine/test_docker_prune.py +119 -0
  202. package/tests/tilt-engine/test_dockerignore_path_bug.py +82 -0
  203. package/tests/tilt-engine/test_file_browser.py +193 -0
  204. package/tests/tilt-engine/test_frontend_basepath_manifest.py +27 -0
  205. package/tests/tilt-engine/test_health_dependencies.py +130 -0
  206. package/tests/tilt-engine/test_health_endpoints.py +118 -0
  207. package/tests/tilt-engine/test_health_tilt_ui.py +85 -0
  208. package/tests/tilt-engine/test_safety_aliases.py +84 -0
  209. package/tests/tilt-engine/test_snapshot_diff.py +136 -0
  210. package/tests/tilt-engine/test_snapshot_persistence.py +163 -0
  211. package/tests/tilt-engine/test_snapshot_scanning.py +123 -0
  212. package/tests/tilt-engine/test_standalone_project_boot.py +61 -0
  213. package/tests/tilt-engine/test_standalone_traefik.py +108 -0
  214. package/dist/cli.d.ts +0 -3
  215. package/dist/cli.d.ts.map +0 -1
  216. package/dist/cli.js.map +0 -1
  217. package/dist/commands/completion.d.ts +0 -3
  218. package/dist/commands/completion.d.ts.map +0 -1
  219. package/dist/commands/completion.js.map +0 -1
  220. package/dist/commands/config.d.ts +0 -3
  221. package/dist/commands/config.d.ts.map +0 -1
  222. package/dist/commands/config.js +0 -231
  223. package/dist/commands/config.js.map +0 -1
  224. package/dist/commands/doctor.d.ts +0 -7
  225. package/dist/commands/doctor.d.ts.map +0 -1
  226. package/dist/commands/doctor.js +0 -597
  227. package/dist/commands/doctor.js.map +0 -1
  228. package/dist/commands/down.d.ts +0 -3
  229. package/dist/commands/down.d.ts.map +0 -1
  230. package/dist/commands/down.js +0 -32
  231. package/dist/commands/down.js.map +0 -1
  232. package/dist/commands/help.d.ts +0 -2
  233. package/dist/commands/help.d.ts.map +0 -1
  234. package/dist/commands/help.js +0 -130
  235. package/dist/commands/help.js.map +0 -1
  236. package/dist/commands/networks.d.ts +0 -3
  237. package/dist/commands/networks.d.ts.map +0 -1
  238. package/dist/commands/networks.js +0 -260
  239. package/dist/commands/networks.js.map +0 -1
  240. package/dist/commands/project.d.ts +0 -3
  241. package/dist/commands/project.d.ts.map +0 -1
  242. package/dist/commands/project.js +0 -373
  243. package/dist/commands/project.js.map +0 -1
  244. package/dist/commands/projects.d.ts +0 -3
  245. package/dist/commands/projects.d.ts.map +0 -1
  246. package/dist/commands/projects.js +0 -71
  247. package/dist/commands/projects.js.map +0 -1
  248. package/dist/commands/resource.d.ts +0 -69
  249. package/dist/commands/resource.d.ts.map +0 -1
  250. package/dist/commands/resource.js +0 -579
  251. package/dist/commands/resource.js.map +0 -1
  252. package/dist/commands/resources.d.ts +0 -3
  253. package/dist/commands/resources.d.ts.map +0 -1
  254. package/dist/commands/resources.js +0 -73
  255. package/dist/commands/resources.js.map +0 -1
  256. package/dist/commands/stack.d.ts +0 -3
  257. package/dist/commands/stack.d.ts.map +0 -1
  258. package/dist/commands/stack.js +0 -97
  259. package/dist/commands/stack.js.map +0 -1
  260. package/dist/commands/stacks.d.ts +0 -3
  261. package/dist/commands/stacks.d.ts.map +0 -1
  262. package/dist/commands/stacks.js +0 -43
  263. package/dist/commands/stacks.js.map +0 -1
  264. package/dist/commands/status.d.ts +0 -3
  265. package/dist/commands/status.d.ts.map +0 -1
  266. package/dist/commands/status.js +0 -71
  267. package/dist/commands/status.js.map +0 -1
  268. package/dist/commands/ui.d.ts +0 -3
  269. package/dist/commands/ui.d.ts.map +0 -1
  270. package/dist/commands/ui.js +0 -445
  271. package/dist/commands/ui.js.map +0 -1
  272. package/dist/commands/up.d.ts +0 -3
  273. package/dist/commands/up.d.ts.map +0 -1
  274. package/dist/commands/up.js +0 -110
  275. package/dist/commands/up.js.map +0 -1
  276. package/dist/commands/upgrade.d.ts +0 -11
  277. package/dist/commands/upgrade.d.ts.map +0 -1
  278. package/dist/commands/upgrade.js +0 -496
  279. package/dist/commands/upgrade.js.map +0 -1
  280. package/dist/commands/version.d.ts +0 -3
  281. package/dist/commands/version.d.ts.map +0 -1
  282. package/dist/commands/version.js.map +0 -1
  283. package/dist/components/Accessible.d.ts +0 -8
  284. package/dist/components/Accessible.d.ts.map +0 -1
  285. package/dist/components/Accessible.js +0 -10
  286. package/dist/components/Accessible.js.map +0 -1
  287. package/dist/components/BaseTooltip.d.ts +0 -4
  288. package/dist/components/BaseTooltip.d.ts.map +0 -1
  289. package/dist/components/BaseTooltip.js +0 -28
  290. package/dist/components/BaseTooltip.js.map +0 -1
  291. package/dist/components/DetailPanel.d.ts +0 -4
  292. package/dist/components/DetailPanel.d.ts.map +0 -1
  293. package/dist/components/DetailPanel.js +0 -18
  294. package/dist/components/DetailPanel.js.map +0 -1
  295. package/dist/components/FileTree.d.ts +0 -4
  296. package/dist/components/FileTree.d.ts.map +0 -1
  297. package/dist/components/FileTree.js +0 -47
  298. package/dist/components/FileTree.js.map +0 -1
  299. package/dist/components/ResourceSelectInput.d.ts +0 -4
  300. package/dist/components/ResourceSelectInput.d.ts.map +0 -1
  301. package/dist/components/ResourceSelectInput.js +0 -7
  302. package/dist/components/ResourceSelectInput.js.map +0 -1
  303. package/dist/components/ResourceTable.d.ts +0 -4
  304. package/dist/components/ResourceTable.d.ts.map +0 -1
  305. package/dist/components/ResourceTable.js +0 -18
  306. package/dist/components/ResourceTable.js.map +0 -1
  307. package/dist/components/TabBar.d.ts +0 -4
  308. package/dist/components/TabBar.d.ts.map +0 -1
  309. package/dist/components/TabBar.js +0 -17
  310. package/dist/components/TabBar.js.map +0 -1
  311. package/dist/components/Tooltip.d.ts +0 -12
  312. package/dist/components/Tooltip.d.ts.map +0 -1
  313. package/dist/components/Tooltip.js +0 -12
  314. package/dist/components/Tooltip.js.map +0 -1
  315. package/dist/components/index.d.ts +0 -8
  316. package/dist/components/index.d.ts.map +0 -1
  317. package/dist/components/index.js.map +0 -1
  318. package/dist/config/platform-standards.d.ts +0 -159
  319. package/dist/config/platform-standards.d.ts.map +0 -1
  320. package/dist/config/platform-standards.js +0 -181
  321. package/dist/config/platform-standards.js.map +0 -1
  322. package/dist/generator/extension-fetch.d.ts +0 -25
  323. package/dist/generator/extension-fetch.d.ts.map +0 -1
  324. package/dist/generator/extension-fetch.js +0 -252
  325. package/dist/generator/extension-fetch.js.map +0 -1
  326. package/dist/generator/template-engine.d.ts +0 -61
  327. package/dist/generator/template-engine.d.ts.map +0 -1
  328. package/dist/generator/template-engine.js +0 -557
  329. package/dist/generator/template-engine.js.map +0 -1
  330. package/dist/index.d.ts +0 -11
  331. package/dist/index.d.ts.map +0 -1
  332. package/dist/index.js +0 -11
  333. package/dist/index.js.map +0 -1
  334. package/dist/types/index.d.ts +0 -255
  335. package/dist/types/index.d.ts.map +0 -1
  336. package/dist/types/index.js +0 -17
  337. package/dist/types/index.js.map +0 -1
  338. package/dist/utils/cache.d.ts +0 -19
  339. package/dist/utils/cache.d.ts.map +0 -1
  340. package/dist/utils/cache.js +0 -64
  341. package/dist/utils/cache.js.map +0 -1
  342. package/dist/utils/command-helpers.d.ts +0 -17
  343. package/dist/utils/command-helpers.d.ts.map +0 -1
  344. package/dist/utils/command-helpers.js +0 -41
  345. package/dist/utils/command-helpers.js.map +0 -1
  346. package/dist/utils/constants.d.ts +0 -52
  347. package/dist/utils/constants.d.ts.map +0 -1
  348. package/dist/utils/constants.js +0 -112
  349. package/dist/utils/constants.js.map +0 -1
  350. package/dist/utils/discovery-context.d.ts +0 -4
  351. package/dist/utils/discovery-context.d.ts.map +0 -1
  352. package/dist/utils/discovery-context.js +0 -39
  353. package/dist/utils/discovery-context.js.map +0 -1
  354. package/dist/utils/docker.d.ts +0 -4
  355. package/dist/utils/docker.d.ts.map +0 -1
  356. package/dist/utils/docker.js +0 -19
  357. package/dist/utils/docker.js.map +0 -1
  358. package/dist/utils/doctor-runtime.d.ts +0 -66
  359. package/dist/utils/doctor-runtime.d.ts.map +0 -1
  360. package/dist/utils/doctor-runtime.js +0 -469
  361. package/dist/utils/doctor-runtime.js.map +0 -1
  362. package/dist/utils/env-validator.d.ts +0 -15
  363. package/dist/utils/env-validator.d.ts.map +0 -1
  364. package/dist/utils/env-validator.js +0 -109
  365. package/dist/utils/env-validator.js.map +0 -1
  366. package/dist/utils/errors.d.ts +0 -31
  367. package/dist/utils/errors.d.ts.map +0 -1
  368. package/dist/utils/errors.js +0 -140
  369. package/dist/utils/errors.js.map +0 -1
  370. package/dist/utils/file-helpers.d.ts +0 -14
  371. package/dist/utils/file-helpers.d.ts.map +0 -1
  372. package/dist/utils/file-helpers.js +0 -45
  373. package/dist/utils/file-helpers.js.map +0 -1
  374. package/dist/utils/formatting.d.ts +0 -30
  375. package/dist/utils/formatting.d.ts.map +0 -1
  376. package/dist/utils/formatting.js +0 -164
  377. package/dist/utils/formatting.js.map +0 -1
  378. package/dist/utils/paths.d.ts +0 -3
  379. package/dist/utils/paths.d.ts.map +0 -1
  380. package/dist/utils/paths.js +0 -41
  381. package/dist/utils/paths.js.map +0 -1
  382. package/dist/utils/port-assignment.d.ts +0 -6
  383. package/dist/utils/port-assignment.d.ts.map +0 -1
  384. package/dist/utils/port-assignment.js +0 -81
  385. package/dist/utils/port-assignment.js.map +0 -1
  386. package/dist/utils/project-features.d.ts +0 -23
  387. package/dist/utils/project-features.d.ts.map +0 -1
  388. package/dist/utils/project-features.js +0 -98
  389. package/dist/utils/project-features.js.map +0 -1
  390. package/dist/utils/project-templates.d.ts +0 -7
  391. package/dist/utils/project-templates.d.ts.map +0 -1
  392. package/dist/utils/project-templates.js +0 -24
  393. package/dist/utils/project-templates.js.map +0 -1
  394. package/dist/utils/prompt.d.ts +0 -28
  395. package/dist/utils/prompt.d.ts.map +0 -1
  396. package/dist/utils/prompt.js +0 -79
  397. package/dist/utils/prompt.js.map +0 -1
  398. package/dist/utils/resource-features.d.ts +0 -29
  399. package/dist/utils/resource-features.d.ts.map +0 -1
  400. package/dist/utils/resource-features.js +0 -171
  401. package/dist/utils/resource-features.js.map +0 -1
  402. package/dist/utils/service-urls.d.ts +0 -30
  403. package/dist/utils/service-urls.d.ts.map +0 -1
  404. package/dist/utils/service-urls.js +0 -93
  405. package/dist/utils/service-urls.js.map +0 -1
  406. package/dist/utils/services.d.ts +0 -18
  407. package/dist/utils/services.d.ts.map +0 -1
  408. package/dist/utils/services.js +0 -291
  409. package/dist/utils/services.js.map +0 -1
  410. package/dist/utils/stack-features.d.ts +0 -22
  411. package/dist/utils/stack-features.d.ts.map +0 -1
  412. package/dist/utils/stack-features.js +0 -13
  413. package/dist/utils/stack-features.js.map +0 -1
  414. package/dist/utils/tar.d.ts +0 -7
  415. package/dist/utils/tar.d.ts.map +0 -1
  416. package/dist/utils/tar.js +0 -21
  417. package/dist/utils/tar.js.map +0 -1
  418. package/dist/utils/tilt.d.ts +0 -19
  419. package/dist/utils/tilt.d.ts.map +0 -1
  420. package/dist/utils/tilt.js +0 -78
  421. package/dist/utils/tilt.js.map +0 -1
  422. package/dist/utils/validation.d.ts +0 -16
  423. package/dist/utils/validation.d.ts.map +0 -1
  424. package/dist/utils/validation.js +0 -58
  425. package/dist/utils/validation.js.map +0 -1
  426. /package/{README.md → cli/README.md} +0 -0
  427. /package/{bin → cli/bin}/tdk.js +0 -0
  428. /package/{templates → cli/templates}/.tiltignore.hbs +0 -0
  429. /package/{templates → cli/templates}/TILT_RESOURCE_DEFAULTS.star.hbs +0 -0
  430. /package/{templates → cli/templates}/TILT_TECH_STACK.star.hbs +0 -0
  431. /package/{templates → cli/templates}/spec.master.hbs +0 -0
@@ -0,0 +1,290 @@
1
+ # Critical Assessment: Deduplication and DRY Implementation
2
+
3
+ **Subagent:** 1 - Deduplication and DRY Implementation
4
+ **Date:** 2026-05-04
5
+ **Scope:** TDK CLI (`cli/src/`)
6
+ **Tool Used:** jscpd v4.0.5
7
+
8
+ ---
9
+
10
+ ## Executive Summary
11
+
12
+ jscpd analysis reveals **10 code clones** across 38 TypeScript files (5,589 total lines), with **1.25% duplication rate** (70 duplicated lines, 592 tokens). While this is relatively low, several high-impact duplication patterns exist that significantly impact maintainability.
13
+
14
+ ---
15
+
16
+ ## Current State: Identified Duplication Patterns
17
+
18
+ ### 1. Error Display Logic Duplication ⚠️ HIGH IMPACT
19
+ **Location:** `cli/src/utils/errors.ts`
20
+
21
+ **Duplication:**
22
+ - `TdkError.display()` method (lines 31-41)
23
+ - `showError()` function (lines 124-141)
24
+
25
+ **Identical Pattern:**
26
+ ```typescript
27
+ // Both functions implement the same error display pattern:
28
+ console.error(chalk.red(`❌ ${message}`));
29
+
30
+ if (suggestions?.length > 0) {
31
+ console.error(chalk.yellow('\n💡 Suggestions:'));
32
+ suggestions.forEach(s => {
33
+ console.error(chalk.cyan(` → ${s}`));
34
+ });
35
+ }
36
+ ```
37
+
38
+ **Impact:** Changes to error display formatting must be made in two places. Risk of inconsistency.
39
+
40
+ ---
41
+
42
+ ### 2. Tilt Args Building Duplication ⚠️ HIGH IMPACT
43
+ **Location:** `cli/src/utils/tilt.ts`
44
+
45
+ **Duplication:**
46
+ - `buildTiltUpArgs()` (lines 100-123)
47
+ - `buildTiltDownArgs()` (lines 125-138)
48
+
49
+ **Identical Pattern:**
50
+ ```typescript
51
+ // Both functions duplicate:
52
+ const tiltfilePath = getTiltfilePath(); // Line 110 and 131
53
+ args.push('-f', tiltfilePath); // Line 111 and 132
54
+ ```
55
+
56
+ **Impact:** Changes to Tiltfile path resolution must be updated in both functions.
57
+
58
+ ---
59
+
60
+ ### 3. Stack Name Extraction Duplication ⚠️ HIGH IMPACT
61
+ **Location:** Multiple files
62
+
63
+ **Duplication A:**
64
+ - `extractStackNames()` in `cli/src/utils/command-helpers.ts` (lines 37-45)
65
+ - `getAllStacks()` in `cli/src/utils/services.ts` (lines 95-106)
66
+
67
+ **Identical Implementation:**
68
+ ```typescript
69
+ const stacks = new Set<string>();
70
+ for (const resource of resources) {
71
+ if (resource.stack) {
72
+ stacks.add(resource.stack);
73
+ }
74
+ }
75
+ return Array.from(stacks).sort();
76
+ ```
77
+
78
+ **Duplication B:**
79
+ - `groupResourcesByStack()` in `command-helpers.ts` (lines 51-65)
80
+ - Logic in `createDiscoveryContext()` in `discovery-context.ts` (lines 33-40)
81
+ - Logic in `discoverStacks()` in `services.ts` (lines 108-134)
82
+
83
+ ---
84
+
85
+ ### 4. Resource Filtering Duplication ⚠️ MEDIUM IMPACT
86
+ **Location:** Multiple files
87
+
88
+ **Duplication:**
89
+ - `filterResourcesByStack()` in `command-helpers.ts` (lines 30-35)
90
+ - `getResourcesForStack()` in `services.ts` (lines 136-139)
91
+ - `getUnassignedResources()` in `command-helpers.ts` (lines 47-49)
92
+
93
+ **Identical Pattern:**
94
+ ```typescript
95
+ return resources.filter(r => r.stack === stackName); // Used 3+ times
96
+ ```
97
+
98
+ ---
99
+
100
+ ### 5. Command Execution Pattern Duplication
101
+ **Location:** `cli/src/commands/networks.ts` vs `cli/src/utils/tilt.ts`
102
+
103
+ **Duplication:**
104
+ - `execSafe()` in `networks.ts` (lines 14-43) - Promise wrapper for spawn
105
+ - `runTilt()` in `tilt.ts` (lines 30-84) - Promise wrapper for spawn
106
+
107
+ **Similar Pattern:** Both handle:
108
+ - stdout/stderr accumulation
109
+ - close/error event handling
110
+ - Exit code processing
111
+
112
+ ---
113
+
114
+ ### 6. Test Setup Duplication (Low Priority)
115
+ **Location:** `cli/src/commands/__tests__/resource.test.ts`
116
+
117
+ jscpd detected 5 internal duplications in test file - mostly repeated assertion patterns for similar test cases (service.json validation for backend/frontend/worker).
118
+
119
+ ---
120
+
121
+ ## Impact Analysis
122
+
123
+ ### Maintainability Impact
124
+
125
+ | Pattern | Impact Level | Files Affected | Risk if Not Consolidated |
126
+ |---------|--------------|----------------|-------------------------|
127
+ | Error Display | HIGH | 1 (internal) | Inconsistent UX, formatting drift |
128
+ | Tilt Args | MEDIUM | 1 (internal) | Path resolution bugs in one place only |
129
+ | Stack Extraction | HIGH | 3 files | Logic divergence, sorting inconsistencies |
130
+ | Resource Filter | MEDIUM | 3 functions | Behavior differences, bugs in filtering |
131
+ | Command Execution | LOW | 2 files | Feature parity issues |
132
+
133
+ ### Code Complexity Impact
134
+
135
+ - **Cognitive Load:** Developers must remember multiple implementations of the same logic
136
+ - **Testing Burden:** Same logic tested multiple times across different functions
137
+ - **Documentation:** Multiple places to document the same behavior
138
+
139
+ ---
140
+
141
+ ## High-Confidence Recommendations
142
+
143
+ ### Recommendation 1: Consolidate Error Display (CONFIDENCE: 95%)
144
+ **Action:** Make `TdkError.display()` use `showError()` internally or vice versa
145
+
146
+ **Implementation:**
147
+ ```typescript
148
+ // Option A: TdkError.display() delegates to showError
149
+ display(): void {
150
+ showError(this.message, undefined, this.suggestions);
151
+ }
152
+ ```
153
+
154
+ **Risk:** LOW - Both functions have identical output behavior
155
+ **Files to Change:** `cli/src/utils/errors.ts` only
156
+ **Lines Reduced:** ~15 lines
157
+
158
+ ---
159
+
160
+ ### Recommendation 2: Extract Tiltfile Path Helper (CONFIDENCE: 95%)
161
+ **Action:** Extract common tiltfile path retrieval into helper
162
+
163
+ **Implementation:**
164
+ ```typescript
165
+ // Add to tilt.ts
166
+ function addTiltfilePath(args: string[]): void {
167
+ const tiltfilePath = getTiltfilePath();
168
+ args.push('-f', tiltfilePath);
169
+ }
170
+ ```
171
+
172
+ **Risk:** LOW - Pure extraction, no behavior change
173
+ **Files to Change:** `cli/src/utils/tilt.ts` only
174
+ **Lines Reduced:** ~5 lines
175
+
176
+ ---
177
+
178
+ ### Recommendation 3: Remove Duplicate from command-helpers.ts (CONFIDENCE: 90%)
179
+ **Action:** `command-helpers.ts` duplicates exist in `services.ts` - remove from command-helpers
180
+
181
+ **Functions to Remove/Delegate:**
182
+ 1. `extractStackNames()` → use `getAllStacks()` from services.ts
183
+ 2. `filterResourcesByStack()` → use `getResourcesForStack()` from services.ts
184
+ 3. `groupResourcesByStack()` → already exists in `createDiscoveryContext()`
185
+ 4. `getUnassignedResources()` → inline the one-liner where used
186
+
187
+ **Risk:** MEDIUM-LOW - Need to update imports in consuming files
188
+ **Files to Change:**
189
+ - `cli/src/utils/command-helpers.ts` (remove functions)
190
+ - Any files importing these functions (update imports)
191
+ **Lines Reduced:** ~40 lines
192
+
193
+ ---
194
+
195
+ ### Recommendation 4: Consolidate Discovery Context Building (CONFIDENCE: 85%)
196
+ **Action:** `createDiscoveryContext()` duplicates logic from `discoverStacks()` and `getAllStacks()`
197
+
198
+ **Implementation:**
199
+ ```typescript
200
+ export function createDiscoveryContext(forceRefresh = false): DiscoveryContext {
201
+ if (!forceRefresh && isCacheValid() && cachedContext) {
202
+ return cachedContext;
203
+ }
204
+
205
+ const resources = discoverResources();
206
+ const stacks = discoverStacks(); // Already builds resourcesByStack
207
+ const stackNames = getAllStacks(resources); // Use shared function
208
+
209
+ // Derive unassigned from existing data
210
+ const unassignedResources = resources.filter(r => !r.stack);
211
+
212
+ // Derive resourcesByStack from stacks data
213
+ const resourcesByStack = new Map<string, DiscoveredResource[]>();
214
+ for (const stack of stacks) {
215
+ resourcesByStack.set(stack.name, stack.resources);
216
+ }
217
+
218
+ // ... rest unchanged
219
+ }
220
+ ```
221
+
222
+ **Risk:** MEDIUM - Logic consolidation, need to verify stack.resources contains all needed data
223
+ **Files to Change:** `cli/src/utils/discovery-context.ts`
224
+ **Lines Reduced:** ~10 lines
225
+
226
+ ---
227
+
228
+ ## Risk Assessment
229
+
230
+ ### Low Risk (Safe to Implement)
231
+ 1. **Error display consolidation** - Pure delegation, no external API change
232
+ 2. **Tiltfile path extraction** - Internal helper only
233
+
234
+ ### Medium Risk (Requires Verification)
235
+ 3. **Removing command-helpers duplicates** - Need to check all imports
236
+ - Files that may import these: `projects.ts`, `stacks.ts`, `stack.ts`, `resources.ts`
237
+
238
+ ### Requires Testing
239
+ 4. **Discovery context consolidation** - Verify behavior parity
240
+ - Test: Ensure `resourcesByStack` mapping is identical before/after
241
+
242
+ ---
243
+
244
+ ## Implementation Priority
245
+
246
+ 1. **P0 (Implement First):** Error display consolidation - safest win
247
+ 2. **P1:** Tiltfile path extraction - simple extraction
248
+ 3. **P2:** Remove command-helpers duplicates - clean up API surface
249
+ 4. **P3:** Discovery context consolidation - requires testing
250
+
251
+ ---
252
+
253
+ ## Files Requiring Changes
254
+
255
+ | File | Changes | Risk Level |
256
+ |------|---------|------------|
257
+ | `cli/src/utils/errors.ts` | Consolidate display logic | LOW |
258
+ | `cli/src/utils/tilt.ts` | Extract helper function | LOW |
259
+ | `cli/src/utils/command-helpers.ts` | Remove duplicate functions | MEDIUM |
260
+ | `cli/src/utils/discovery-context.ts` | Refactor to use shared logic | MEDIUM |
261
+ | `cli/src/commands/projects.ts` | Update imports if needed | LOW |
262
+ | `cli/src/commands/stacks.ts` | Update imports if needed | LOW |
263
+
264
+ ---
265
+
266
+ ## Verification Checklist
267
+
268
+ After implementation:
269
+ - [ ] All tests pass (`bun test`)
270
+ - [ ] No TypeScript errors (`tsc --noEmit`)
271
+ - [ ] Error display looks identical to before
272
+ - [ ] Tilt commands work correctly
273
+ - [ ] Stack listing shows same output
274
+ - [ ] Resource filtering returns same results
275
+
276
+ ---
277
+
278
+ ## Metrics
279
+
280
+ | Metric | Before | After (Projected) |
281
+ |--------|--------|-------------------|
282
+ | Duplicated Lines | 70 (1.25%) | ~35 (0.6%) |
283
+ | Duplicate Clones | 10 | ~5 |
284
+ | Utils API Surface | 15 functions | ~11 functions |
285
+ | Lines in command-helpers.ts | 80 | ~40 |
286
+
287
+ ---
288
+
289
+ *Assessment generated by Subagent 1 (Deduplication)*
290
+ *Next step: Implement high-confidence recommendations (P0-P2)*
@@ -0,0 +1,233 @@
1
+ # Deduplication Implementation Summary
2
+
3
+ **Subagent:** 1 - Deduplication and DRY Implementation
4
+ **Date:** 2026-05-04
5
+ **Status:** ✅ COMPLETED
6
+
7
+ ---
8
+
9
+ ## Summary
10
+
11
+ Successfully implemented high-confidence deduplication recommendations for TDK CLI codebase. All changes maintain backward compatibility and pass all tests.
12
+
13
+ ---
14
+
15
+ ## Changes Implemented
16
+
17
+ ### 1. Consolidated Error Display Logic ✅
18
+ **File:** `cli/src/utils/errors.ts`
19
+
20
+ **Change:** `TdkError.display()` now delegates to `showError()` instead of duplicating the display logic.
21
+
22
+ **Before:**
23
+ ```typescript
24
+ display(): void {
25
+ console.error(chalk.red(`❌ ${this.message}`));
26
+
27
+ if (this.suggestions.length > 0) {
28
+ console.error(chalk.yellow('\n💡 Suggestions:'));
29
+ this.suggestions.forEach(s => {
30
+ console.error(chalk.cyan(` → ${s}`));
31
+ });
32
+ }
33
+ }
34
+ ```
35
+
36
+ **After:**
37
+ ```typescript
38
+ display(): void {
39
+ showError(this.message, undefined, this.suggestions);
40
+ }
41
+ ```
42
+
43
+ **Impact:**
44
+ - Single source of truth for error display formatting
45
+ - Future changes to error display only need one edit
46
+ - **Lines saved:** ~10 lines
47
+
48
+ ---
49
+
50
+ ### 2. Extracted Shared Tiltfile Path Helper ✅
51
+ **File:** `cli/src/utils/tilt.ts`
52
+
53
+ **Change:** Extracted common tiltfile path logic into `addTiltfilePath()` helper function.
54
+
55
+ **Added:**
56
+ ```typescript
57
+ function addTiltfilePath(args: string[]): void {
58
+ const tiltfilePath = getTiltfilePath();
59
+ args.push('-f', tiltfilePath);
60
+ }
61
+ ```
62
+
63
+ **Updated:**
64
+ - `buildTiltUpArgs()` - now uses `addTiltfilePath(args)`
65
+ - `buildTiltDownArgs()` - now uses `addTiltfilePath(args)`
66
+
67
+ **Impact:**
68
+ - Path resolution logic in one place
69
+ - Consistent tiltfile path handling
70
+ - **Lines saved:** ~3 lines
71
+
72
+ ---
73
+
74
+ ### 3. Removed Duplicate Functions from command-helpers.ts ✅
75
+ **File:** `cli/src/utils/command-helpers.ts`
76
+
77
+ **Removed Functions:**
78
+ 1. `filterResourcesByStack()` - duplicate of `getResourcesForStack()` in services.ts
79
+ 2. `extractStackNames()` - duplicate of `getAllStacks()` in services.ts
80
+ 3. `getUnassignedResources()` - one-liner, can be inlined where needed
81
+ 4. `groupResourcesByStack()` - logic exists in `createDiscoveryContext()` and `discoverStacks()`
82
+
83
+ **Impact:**
84
+ - Reduced API surface from 6 to 3 functions
85
+ - Eliminated maintenance burden of keeping duplicates in sync
86
+ - **Lines saved:** ~37 lines (80 → 43 lines)
87
+
88
+ ---
89
+
90
+ ### 4. Updated Public API Exports ✅
91
+ **File:** `cli/src/index.ts`
92
+
93
+ **Changes:**
94
+ - Removed exports of deleted functions from command-helpers
95
+ - Added `createDiscoveryContext` export from discovery-context.ts for resources-by-stack operations
96
+ - Functions now consolidated to canonical implementations in services.ts
97
+
98
+ **Impact:**
99
+ - Cleaner public API
100
+ - Clear source of truth for each operation
101
+
102
+ ---
103
+
104
+ ## Metrics
105
+
106
+ ### Code Duplication (jscpd Analysis)
107
+
108
+ | Metric | Before | After | Improvement |
109
+ |--------|--------|-------|-------------|
110
+ | Clones Found | 10 | 8 | -2 (20% reduction) |
111
+ | Duplicated Lines | 70 (1.25%) | 55 (1.00%) | -15 lines |
112
+ | Duplicated Tokens | 592 (1.24%) | 482 (1.02%) | -110 tokens |
113
+
114
+ ### Line Count Changes
115
+
116
+ | File | Before | After | Reduction |
117
+ |------|--------|-------|-----------|
118
+ | `errors.ts` | ~155 | 143 | ~12 lines |
119
+ | `tilt.ts` | ~139 | 142 | +3 lines (helper added) |
120
+ | `command-helpers.ts` | ~80 | 43 | 37 lines |
121
+ | **Total** | **~374** | **328** | **~46 lines** |
122
+
123
+ ### API Surface
124
+
125
+ | Module | Before | After | Reduction |
126
+ |--------|--------|-------|-----------|
127
+ | command-helpers exports | 6 functions | 3 functions | 50% |
128
+ | index.ts exports | 15 functions | 12 functions | 20% |
129
+
130
+ ---
131
+
132
+ ## Remaining Duplications (Documented for Future)
133
+
134
+ The following duplications were identified but NOT consolidated (low confidence or acceptable):
135
+
136
+ ### 1. Test File Patterns (Acceptable)
137
+ **Location:** `cli/src/commands/__tests__/resource.test.ts`
138
+ - 4 internal duplications for testing similar resource types
139
+ - These are intentional test structure patterns
140
+ - **Action:** No change needed
141
+
142
+ ### 2. Command Execution Patterns (Low Priority)
143
+ **Location:** `networks.ts` vs `tilt.ts`
144
+ - Both use spawn wrapper patterns
145
+ - Different enough in error handling and use cases
146
+ - **Action:** Keep separate for clarity
147
+
148
+ ### 3. Upgrade Method Patterns (Low Priority)
149
+ **Location:** `upgrade.ts`
150
+ - `upgradeViaNpm()` and `upgradeViaBun()` share similar structure
151
+ - Different commands and error messages
152
+ - **Action:** Keep separate - different package managers
153
+
154
+ ### 4. Project Root Check (Low Priority)
155
+ **Location:** `config.ts` vs `projects.ts`
156
+ - Both call `requireProjectRoot()` at start
157
+ - This is standard pattern, not duplication
158
+ - **Action:** No change needed
159
+
160
+ ---
161
+
162
+ ## Verification Results
163
+
164
+ ✅ **All Tests Pass**
165
+ - 37 tests pass
166
+ - 0 tests fail
167
+ - 171 expect() calls
168
+
169
+ ✅ **TypeScript Compilation**
170
+ - No type errors
171
+ - No compilation warnings
172
+
173
+ ✅ **Functionality Preserved**
174
+ - Error display output identical
175
+ - Tilt command building unchanged
176
+ - All existing imports work
177
+
178
+ ---
179
+
180
+ ## Files Changed
181
+
182
+ 1. `cli/src/utils/errors.ts` - Consolidated display logic
183
+ 2. `cli/src/utils/tilt.ts` - Extracted helper function
184
+ 3. `cli/src/utils/command-helpers.ts` - Removed duplicates
185
+ 4. `cli/src/index.ts` - Updated exports
186
+
187
+ ---
188
+
189
+ ## Risk Assessment
190
+
191
+ | Change | Risk Level | Status |
192
+ |--------|------------|--------|
193
+ | Error display consolidation | LOW | ✅ Safe - pure delegation |
194
+ | Tiltfile helper extraction | LOW | ✅ Safe - internal only |
195
+ | command-helpers cleanup | MEDIUM | ✅ Verified - no external consumers |
196
+ | API export changes | LOW | ✅ Safe - re-exports from canonical sources |
197
+
198
+ **No Breaking Changes:** All removed functions were either:
199
+ - Internal duplicates not used elsewhere
200
+ - Re-exported through index.ts from canonical sources
201
+
202
+ ---
203
+
204
+ ## Recommendations for Future Work
205
+
206
+ ### Not Implemented (Require More Analysis)
207
+
208
+ 1. **Discovery Context Consolidation (P3)**
209
+ - `createDiscoveryContext()` could use `discoverStacks()` instead of rebuilding stack groups
210
+ - Requires testing to ensure behavior parity
211
+ - Estimated savings: ~10 lines
212
+
213
+ 2. **Command Execution Abstraction (P4)**
214
+ - Could extract common spawn pattern
215
+ - Risk: May reduce code clarity
216
+ - Decision: Keep separate for now
217
+
218
+ ---
219
+
220
+ ## Conclusion
221
+
222
+ Successfully implemented high-confidence DRY improvements:
223
+ - **46 lines of code removed**
224
+ - **20% reduction in code clones**
225
+ - **50% reduction in command-helpers API surface**
226
+ - **All tests passing**
227
+ - **No breaking changes**
228
+
229
+ The codebase is now more maintainable with clear sources of truth for error display, tilt operations, and resource/stack queries.
230
+
231
+ ---
232
+
233
+ *Implementation completed by Subagent 1 (Deduplication)*