@tdk-landscape/tdk-cli-core 1.3.26 → 1.3.29

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 (43) hide show
  1. package/discovery/TILT_DISCOVERY.star +3 -0
  2. package/discovery/config.star +5 -0
  3. package/dist/commands/project.d.ts.map +1 -1
  4. package/dist/commands/project.js +67 -78
  5. package/dist/commands/project.js.map +1 -1
  6. package/dist/commands/resource.d.ts +1 -1
  7. package/dist/commands/resource.d.ts.map +1 -1
  8. package/dist/commands/resource.js +30 -19
  9. package/dist/commands/resource.js.map +1 -1
  10. package/dist/commands/stack.d.ts.map +1 -1
  11. package/dist/commands/stack.js +3 -7
  12. package/dist/commands/stack.js.map +1 -1
  13. package/dist/commands/upgrade.d.ts.map +1 -1
  14. package/dist/commands/upgrade.js +3 -4
  15. package/dist/commands/upgrade.js.map +1 -1
  16. package/dist/generator/extension-fetch.d.ts +7 -17
  17. package/dist/generator/extension-fetch.d.ts.map +1 -1
  18. package/dist/generator/extension-fetch.js +38 -24
  19. package/dist/generator/extension-fetch.js.map +1 -1
  20. package/dist/generator/template-engine.d.ts.map +1 -1
  21. package/dist/generator/template-engine.js +16 -1
  22. package/dist/generator/template-engine.js.map +1 -1
  23. package/dist/utils/command-helpers.d.ts.map +1 -1
  24. package/dist/utils/command-helpers.js +2 -7
  25. package/dist/utils/command-helpers.js.map +1 -1
  26. package/dist/utils/env-validator.d.ts.map +1 -1
  27. package/dist/utils/env-validator.js +15 -1
  28. package/dist/utils/env-validator.js.map +1 -1
  29. package/dist/utils/prompt.d.ts +28 -0
  30. package/dist/utils/prompt.d.ts.map +1 -0
  31. package/dist/utils/prompt.js +79 -0
  32. package/dist/utils/prompt.js.map +1 -0
  33. package/dist/utils/resource-features.d.ts +1 -0
  34. package/dist/utils/resource-features.d.ts.map +1 -1
  35. package/dist/utils/resource-features.js +11 -0
  36. package/dist/utils/resource-features.js.map +1 -1
  37. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +5 -1
  38. package/engine/topologies/tilt/generators/npmrc.star +26 -4
  39. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +18 -7
  40. package/engine/topologies/tilt/generators/vite/helpers.star +23 -13
  41. package/engine/topologies/tilt/resources/infra-loader.star +34 -1
  42. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +18 -8
  43. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"resource-features.d.ts","sourceRoot":"","sources":["../../src/utils/resource-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAkI7D,CAAC;AAEF;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAejF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,EAAE,CAErF"}
1
+ {"version":3,"file":"resource-features.d.ts","sourceRoot":"","sources":["../../src/utils/resource-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAgJ7D,CAAC;AAEF;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAejF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,EAAE,CAErF"}
@@ -123,6 +123,17 @@ export const RESOURCE_FEATURES = {
123
123
  generator_file: "engine/topologies/tilt/generators/agents_md.star",
124
124
  output_file: ".autogenerated/AGENTS.md",
125
125
  },
126
+ ddd: {
127
+ name: "ddd",
128
+ description: "Domain-driven design folder structure (domain/application/infrastructure/presentation) " +
129
+ "and matching @domain/@application/@infrastructure/@presentation/@test path aliases " +
130
+ "(Premium - requires TDK_LICENSE_KEY; see hasDddLicense() in extension-fetch.ts)",
131
+ applies_to: ["backend", "worker", "migrator"],
132
+ enabled_by_default: false,
133
+ category: "premium",
134
+ generator_file: "engine/topologies/tilt/generators/vite/helpers.star, engine/topologies/tilt/generators/typescript/backend_tsconfig.star",
135
+ output_file: ".autogenerated/vite.config.*.ts, .autogenerated/tsconfig.*.json",
136
+ },
126
137
  };
127
138
  /**
128
139
  * Get default features for a resource type
@@ -1 +1 @@
1
- {"version":3,"file":"resource-features.js","sourceRoot":"","sources":["../../src/utils/resource-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,MAAM,CAAC,MAAM,iBAAiB,GAAoC;IAChE,+EAA+E;IAC/E,sBAAsB;IACtB,+EAA+E;IAC/E,YAAY,EAAE;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,+EAA+E;QAC5F,UAAU,EAAE,CAAC,UAAU,CAAC;QACxB,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,wEAAwE;QACxF,WAAW,EAAE,8BAA8B;KAC5C;IAED,YAAY,EAAE;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,yDAAyD;QACtE,UAAU,EAAE,CAAC,UAAU,CAAC;QACxB,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,wEAAwE;QACxF,WAAW,EAAE,uBAAuB;KACrC;IAED,WAAW,EAAE;QACX,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,4CAA4C;QACzD,UAAU,EAAE,CAAC,UAAU,CAAC;QACxB,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,wEAAwE;QACxF,WAAW,EAAE,6BAA6B;KAC3C;IAED,+EAA+E;IAC/E,qBAAqB;IACrB,+EAA+E;IAC/E,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wEAAwE;QACrF,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC7C,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,iEAAiE;QACjF,WAAW,EAAE,+CAA+C;KAC7D;IAED,+EAA+E;IAC/E,0EAA0E;IAC1E,+EAA+E;IAC/E,mFAAmF;IACnF,kCAAkC;IAElC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC;QAC1C,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,oDAAoD;QACpE,WAAW,EAAE,iCAAiC;KAC/C;IAED,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,sDAAsD;QACnE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,+CAA+C;QAC/D,WAAW,EAAE,gCAAgC;KAC9C;IAED,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,sDAAsD;QACnE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,iFAAiF;QACjG,WAAW,EAAE,+BAA+B;KAC7C;IAED,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,qDAAqD;QAClE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,8CAA8C;QAC9D,WAAW,EAAE,wBAAwB;KACtC;IAED,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kDAAkD;QAC/D,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,8CAA8C;QAC9D,WAAW,EAAE,6BAA6B;KAC3C;IAED,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,6DAA6D;QAC1E,UAAU,EAAE,CAAC,UAAU,CAAC;QACxB,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,mDAAmD;QACnE,WAAW,EAAE,2BAA2B;KACzC;IAED,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,wCAAwC;QACrD,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC7C,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,mEAAmE;QACnF,WAAW,EAAE,sBAAsB;KACpC;IAED,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,iEAAiE;QAC9E,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;QACnC,kBAAkB,EAAE,KAAK,EAAE,yCAAyC;QACpE,cAAc,EAAE,qEAAqE;QACrF,WAAW,EAAE,qCAAqC;KACnD;IAED,WAAW,EAAE;QACX,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,6IAA6I;QAC/I,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,kDAAkD;QAC5E,cAAc,EAAE,kDAAkD;QAClE,WAAW,EAAE,0BAA0B;KACxC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAAC,OAAqB;IACrE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/D,IACE,OAAO,CAAC,kBAAkB;YAC1B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpC,kEAAkE;YAClE,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EACjE,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAqB;IAChE,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"resource-features.js","sourceRoot":"","sources":["../../src/utils/resource-features.ts"],"names":[],"mappings":"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"}
@@ -197,7 +197,11 @@ def L3_generate_production_purger(res_path, use_golden = True):
197
197
  + "COPY " + res_path_rel + "/package.json ./package.json\n"
198
198
  + "COPY " + res_path_rel + "/" + AUTOGENERATED_CONFIG_PATHS['bunfig_docker'] + " ./bunfig.toml\n"
199
199
  + "COPY " + res_path_rel + "/" + AUTOGENERATED_CONFIG_PATHS['npmrc_docker'] + " ./.npmrc\n"
200
- + "COPY --link --from=l2_deps_manifest /cache/bun /cache/bun\n"
200
+ # NOTE: no COPY --from=l2_deps_manifest /cache/bun here - a cache mount's
201
+ # contents are never committed to a stage's filesystem, so COPY --from can't
202
+ # read them (BuildKit fails with "snapshot ... does not exist" on finalize).
203
+ # The --mount=type=cache below already shares the same warmed /cache/bun
204
+ # cache across stages via its target+sharing=shared, with no COPY needed.
201
205
  # sharing=shared allows parallel builds without lock contention (Bun cache is atomic)
202
206
  + "RUN --mount=type=cache,target=/cache/bun,sharing=shared bun install --production --cache-dir=/cache/bun\n"
203
207
  + "# Option 2: Aggressive node_modules pruning to reduce size\n"
@@ -38,7 +38,7 @@ load("../../../topologies/tilt/manifest/constants.star", "PACKAGE_CONFIG_FILENAM
38
38
  # 📝 NPMRC GENERATORS
39
39
  # =============================================================================
40
40
 
41
- def generate_npmrc(resource_path, registry_url, is_docker, write_fn):
41
+ def generate_npmrc(resource_path, registry_url, is_docker, write_fn, verdaccio_enabled=True):
42
42
  """
43
43
  Generate .npmrc for NPM registry configuration.
44
44
 
@@ -47,13 +47,16 @@ def generate_npmrc(resource_path, registry_url, is_docker, write_fn):
47
47
  registry_url: Verdaccio registry URL
48
48
  is_docker: If True, generates .npmrc.docker.autogenerated, else .npmrc
49
49
  write_fn: File writer function
50
+ verdaccio_enabled: If False, scoped packages fall back to public npm (default True)
50
51
  """
51
52
  registry_host = registry_url.replace("http://", "").replace("https://", "").rstrip("/")
52
53
 
53
54
  target_dir = resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER
54
55
  generated_filename = PACKAGE_CONFIG_FILENAMES['npmrc_docker_autogenerated'] if is_docker else PACKAGE_CONFIG_FILENAMES['npmrc']
55
56
  header = Utils.get_template_header("npmrc", target_dir + "/" + generated_filename)
56
- content = """{header}
57
+
58
+ if verdaccio_enabled:
59
+ content = """{header}
57
60
  registry=https://registry.npmjs.org/
58
61
  @{npm_scope}:registry={registry_url}/
59
62
  @tdk-landscape:registry={registry_url}/
@@ -62,6 +65,13 @@ registry=https://registry.npmjs.org/
62
65
  //{registry_host}/:_password=YWRtaW4=
63
66
  //{registry_host}/:email=admin@example.com
64
67
  //{registry_host}/:always-auth=true""".format(header=header, registry_url=registry_url, registry_host=registry_host, npm_scope=_NPM_SCOPE)
68
+ else:
69
+ # Verdaccio not enabled (no license key) — all scopes use public npm
70
+ content = """{header}
71
+ registry=https://registry.npmjs.org/
72
+ @{npm_scope}:registry=https://registry.npmjs.org/
73
+ @tdk-landscape:registry=https://registry.npmjs.org/
74
+ @identity:registry=https://registry.npmjs.org/""".format(header=header, npm_scope=_NPM_SCOPE)
65
75
 
66
76
  filename = generated_filename
67
77
  write_fn(target_dir + '/' + filename, content)
@@ -71,7 +81,7 @@ registry=https://registry.npmjs.org/
71
81
  # 📝 BUNFIG GENERATORS
72
82
  # =============================================================================
73
83
 
74
- def generate_bunfig(resource_path, registry_url, is_docker, write_fn):
84
+ def generate_bunfig(resource_path, registry_url, is_docker, write_fn, verdaccio_enabled=True):
75
85
  """
76
86
  Generate bunfig.toml for Bun package manager configuration.
77
87
 
@@ -80,11 +90,14 @@ def generate_bunfig(resource_path, registry_url, is_docker, write_fn):
80
90
  registry_url: Verdaccio registry URL
81
91
  is_docker: If True, generates bunfig.docker.autogenerated.toml, else bunfig.toml
82
92
  write_fn: File writer function
93
+ verdaccio_enabled: If False, scoped packages fall back to public npm (default True)
83
94
  """
84
95
  target_dir = resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER
85
96
  generated_filename = PACKAGE_CONFIG_FILENAMES['bunfig_docker_autogenerated'] if is_docker else PACKAGE_CONFIG_FILENAMES['bunfig']
86
97
  header = Utils.get_template_header("bunfig", target_dir + "/" + generated_filename)
87
- content = """{header}
98
+
99
+ if verdaccio_enabled:
100
+ content = """{header}
88
101
  [install]
89
102
  linker = "isolated"
90
103
  linkWorkspacePackages = true
@@ -96,6 +109,15 @@ registry = "https://registry.npmjs.org"
96
109
  "@identity" = {{ url = "{registry_url}/" }}
97
110
 
98
111
  """.format(header=header, registry_url=registry_url, npm_scope=_NPM_SCOPE)
112
+ else:
113
+ # Verdaccio not enabled (no license key) — all scopes use public npm
114
+ content = """{header}
115
+ [install]
116
+ linker = "isolated"
117
+ linkWorkspacePackages = true
118
+ registry = "https://registry.npmjs.org"
119
+
120
+ """.format(header=header)
99
121
 
100
122
  filename = generated_filename
101
123
  write_fn(target_dir + '/' + filename, content)
@@ -11,7 +11,7 @@ load("../../../../topologies/tilt/manifest/constants.star", "GENERATED_CONFIG_FI
11
11
  # Backend TSConfig Generator
12
12
  # =============================================================================
13
13
 
14
- def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_deps=None, is_docker=True):
14
+ def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_deps=None, is_docker=True, features=None):
15
15
  """
16
16
  Generate tsconfig for backend services.
17
17
 
@@ -21,16 +21,21 @@ def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_dep
21
21
  write_fn: Write function for file output
22
22
  internal_deps: Optional internal dependencies map
23
23
  is_docker: Whether generating for Docker context
24
+ features: Resource's service.json features: [] array (for the premium
25
+ "ddd" feature - see generate_backend_path_aliases() in vite/helpers.star)
24
26
  """
25
27
  # When tsconfig is in .autogenerated/ folder, paths are relative to parent
26
28
  paths = {
27
29
  "@/*": ["../src/*"],
28
- "@application/*": ["../src/application/*"],
29
- "@domain/*": ["../src/domain/*"],
30
- "@infrastructure/*": ["../src/infrastructure/*"],
31
- "@presentation/*": ["../src/presentation/*"],
32
30
  "@prisma/client": [prisma_path]
33
31
  }
32
+ # DDD is premium - same gate as generate_backend_path_aliases() in vite/helpers.star.
33
+ ddd_enabled = features and 'ddd' in features and os.environ.get('TDK_LICENSE_KEY', '') != ''
34
+ if ddd_enabled:
35
+ paths["@application/*"] = ["../src/application/*"]
36
+ paths["@domain/*"] = ["../src/domain/*"]
37
+ paths["@infrastructure/*"] = ["../src/infrastructure/*"]
38
+ paths["@presentation/*"] = ["../src/presentation/*"]
34
39
  root_dir = "../src"
35
40
  if internal_deps and not is_docker:
36
41
  sorted_deps = sorted(internal_deps.items())
@@ -54,7 +59,12 @@ def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_dep
54
59
  "allowSyntheticDefaultImports": True,
55
60
  "outDir": "../dist",
56
61
  "rootDir": root_dir,
57
- "types": ["node"],
62
+ # "bun" (not "node"): @types/bun is a direct devDependency so it's always
63
+ # linked at the top level under any linker mode (including Docker's
64
+ # isolated linker), while @types/node is only a transitive dependency of
65
+ # bun-types and isn't hoisted to the top level under the isolated linker -
66
+ # "types": ["node"] fails to resolve there even though it works locally.
67
+ "types": ["bun"],
58
68
  }
59
69
  content = {
60
70
  "compilerOptions": compiler_options,
@@ -103,7 +113,8 @@ def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_dep
103
113
  "allowSyntheticDefaultImports": True,
104
114
  "outDir": "./dist",
105
115
  "rootDir": docker_root_dir,
106
- "types": ["node"],
116
+ # See note above: "bun" resolves under the isolated linker, "node" doesn't.
117
+ "types": ["bun"],
107
118
  }
108
119
  docker_content = {
109
120
  "compilerOptions": docker_compiler_options,
@@ -154,20 +154,30 @@ def generate_proxy_block(api_base_path, backend_port, additional_routes, stack='
154
154
 
155
155
 
156
156
  def generate_backend_path_aliases(resource_path, manifest):
157
- """Generate TypeScript path aliases for DDD architecture."""
157
+ """Generate TypeScript path aliases for DDD architecture (Premium - requires TDK_LICENSE_KEY)."""
158
158
  lines = []
159
-
160
- ddd_aliases = [
161
- ('@application', './src/application'),
162
- ('@domain', './src/domain'),
163
- ('@infrastructure', './src/infrastructure'),
164
- ('@presentation', './src/presentation'),
165
- ('@test', './src/tests'),
166
- ]
167
-
168
- for alias, rel_path in ddd_aliases:
169
- lines.append(" '" + alias + "': path.resolve(__dirname, '" + rel_path + "'),")
170
-
159
+
160
+ # DDD is a premium feature: requires both "ddd" in the resource's service.json
161
+ # features: [] AND a configured license key. The key presence check here is a
162
+ # cheap belt-and-suspenders guard (mirrors _load_verdaccio in infra-loader.star) -
163
+ # it can't verify the key actually grants "ddd" (Starlark has no fetch), so a
164
+ # hand-edited features: ["ddd"] with no key at all is still blocked, but real
165
+ # entitlement is checked client-side by hasDddLicense() in extension-fetch.ts
166
+ # before the CLI ever writes "ddd" into a resource's features array.
167
+ ddd_enabled = 'ddd' in manifest.get('features', []) and os.environ.get('TDK_LICENSE_KEY', '') != ''
168
+
169
+ if ddd_enabled:
170
+ ddd_aliases = [
171
+ ('@application', './src/application'),
172
+ ('@domain', './src/domain'),
173
+ ('@infrastructure', './src/infrastructure'),
174
+ ('@presentation', './src/presentation'),
175
+ ('@test', './src/tests'),
176
+ ]
177
+
178
+ for alias, rel_path in ddd_aliases:
179
+ lines.append(" '" + alias + "': path.resolve(__dirname, '" + rel_path + "'),")
180
+
171
181
  resource_parts = []
172
182
  for p in resource_path.split('/'):
173
183
  if p:
@@ -131,7 +131,11 @@ def _load_database_management(should_enable, root_prefix="", env_file=None, writ
131
131
  # =============================================================================
132
132
 
133
133
  def _load_verdaccio(should_enable, root_prefix="", env_file=None):
134
- """Load Verdaccio private npm registry."""
134
+ """Load Verdaccio private npm registry (premium feature — requires TDK_LICENSE_KEY)."""
135
+ # Verdaccio is a premium feature. Skip entirely when no license key is set.
136
+ if not os.environ.get("TDK_LICENSE_KEY", ""):
137
+ print("ℹ️ Verdaccio skipped — TDK_LICENSE_KEY not set (premium feature)")
138
+ return
135
139
  if not should_enable(PlatformDockerConstants.VERDACCIO_RESOURCE_NAME):
136
140
  print("DEBUG INFRA: Verdaccio not enabled")
137
141
  return
@@ -184,8 +188,37 @@ def _load_infisical(should_enable, root_prefix="", env_file=None):
184
188
  # 🌐 PROXY (Traefik)
185
189
  # =============================================================================
186
190
 
191
+ def _stop_conflicting_traefik():
192
+ """Auto-stop another TDK project's standalone Traefik if it already holds
193
+ host port 80/8080, so `tdk up` on a new project always wins over a stale
194
+ Traefik left running from a previous one.
195
+
196
+ Each standalone project gets its own container name and Docker network
197
+ (see PlatformDockerConstants.PROJECT_NAME), but the host ports are hardcoded
198
+ to 80/8080 so `api.{project}.localhost` works without a port suffix. That
199
+ means only one standalone project's Traefik can run at a time. Without this,
200
+ starting a second project while another's Traefik is still running fails
201
+ deep inside `docker compose up` with a cryptic "port is already allocated"
202
+ networking error instead of just taking over the port.
203
+ """
204
+ own_container = PlatformDockerConstants.PROJECT_NAME + "_traefik"
205
+ result = str(local(
206
+ "docker ps --filter 'publish=80' --filter 'publish=8080' --format '{{.Names}}' 2>/dev/null || true",
207
+ quiet=True, echo_off=True,
208
+ )).strip()
209
+ for container in result.split("\n"):
210
+ container = container.strip()
211
+ if container and container != own_container:
212
+ print("🛑 Stopping Traefik from another TDK project ('{}') — it was holding host port 80/8080".format(container))
213
+ local(
214
+ "docker stop '{}' >/dev/null 2>&1 || true".format(container),
215
+ quiet=True, echo_off=True,
216
+ )
217
+
218
+
187
219
  def _load_standalone_traefik(root_prefix, env_file, write_fn):
188
220
  """Generate and load a self-contained Traefik compose for standalone projects."""
221
+ _stop_conflicting_traefik()
189
222
  compose_rel = ".tdk/.tdk-out/docker-compose.traefik.yml"
190
223
  content = generate_standalone_traefik_compose()
191
224
  if write_fn:
@@ -151,7 +151,7 @@ def _build_generated_file_list(resource_config, resource_path, manifest):
151
151
  files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['dockerfile_app'])
152
152
  dockerfile_rel_path = resource_config.get('dockerfile', '')
153
153
  if dockerfile_rel_path:
154
- dockerfile_path = resource_path.rsplit('/', 1)[0] + "/" + dockerfile_rel_path
154
+ dockerfile_path = resource_path + "/" + dockerfile_rel_path
155
155
  files.append(dockerfile_path + '.dockerignore')
156
156
 
157
157
  # TS config(s)
@@ -372,7 +372,15 @@ def _generate_all_configs_for_resource(
372
372
  if dockerfile_rel_path:
373
373
  resource_type = 'frontend' if is_frontend else ('migrator' if 'migrator' in resource_config['name'] else 'backend')
374
374
  dockerignore_content = Docker.generate_dockerignore(resource_path, resource_type)
375
- dockerfile_path = resource_path.rsplit('/', 1)[0] + "/" + dockerfile_rel_path
375
+ # dockerfile_rel_path (e.g. ".autogenerated/Dockerfile.app.autogenerated") is relative
376
+ # to this resource's OWN directory - same convention _register_docker_build uses in
377
+ # apply_compose_resource_registration.star. Stripping a path segment here (previously
378
+ # resource_path.rsplit('/', 1)[0]) pointed at the parent STACK directory instead, so
379
+ # every sibling service in a stack (e.g. dashboard-api and dashboard-app under
380
+ # services/app) collided on one shared dockerignore file, each overwriting it with a
381
+ # different (backend vs frontend) ruleset on every Tiltfile load - a real diff every
382
+ # single run, which Tilt saw as a file change and used to trigger an infinite reload loop.
383
+ dockerfile_path = resource_path + "/" + dockerfile_rel_path
376
384
  dockerignore_path = dockerfile_path + ".dockerignore"
377
385
  write_file(dockerignore_path, dockerignore_content)
378
386
 
@@ -396,8 +404,9 @@ def _generate_all_configs_for_resource(
396
404
  TSConfig.frontend(resource_path, write_file, internal_deps=internal_deps_map, is_docker=False)
397
405
  else:
398
406
  prisma_path = resource_config.get('prisma_client_path', './node_modules/.prisma/client')
399
- TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=True)
400
- TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=False)
407
+ resource_features = manifest.get('features', [])
408
+ TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=True, features=resource_features)
409
+ TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=False, features=resource_features)
401
410
 
402
411
  # Prisma config
403
412
  db_name = _get_db_name_for_resource(resource_name, resource_config['name'])
@@ -407,10 +416,11 @@ def _generate_all_configs_for_resource(
407
416
  # ==========================================================================
408
417
  # 8. PACKAGE CONFIGS (npmrc, bunfig)
409
418
  # ==========================================================================
410
- PackageConfig.npmrc(resource_path=resource_path, registry_url=global_config['verdaccio_url_docker'], is_docker=True, write_fn=write_file)
411
- PackageConfig.bunfig(resource_path=resource_path, registry_url=global_config['verdaccio_url_docker'], is_docker=True, write_fn=write_file)
412
- PackageConfig.npmrc(resource_path=resource_path, registry_url=global_config['verdaccio_url_local'], is_docker=False, write_fn=write_file)
413
- PackageConfig.bunfig(resource_path=resource_path, registry_url=global_config['verdaccio_url_local'], is_docker=False, write_fn=write_file)
419
+ verdaccio_enabled = global_config.get('verdaccio_enabled', True)
420
+ PackageConfig.npmrc(resource_path=resource_path, registry_url=global_config['verdaccio_url_docker'], is_docker=True, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
421
+ PackageConfig.bunfig(resource_path=resource_path, registry_url=global_config['verdaccio_url_docker'], is_docker=True, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
422
+ PackageConfig.npmrc(resource_path=resource_path, registry_url=global_config['verdaccio_url_local'], is_docker=False, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
423
+ PackageConfig.bunfig(resource_path=resource_path, registry_url=global_config['verdaccio_url_local'], is_docker=False, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
414
424
 
415
425
  # ==========================================================================
416
426
  # 9. YAML MANIFEST (for verification)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tdk-landscape/tdk-cli-core",
3
- "version": "1.3.26",
3
+ "version": "1.3.29",
4
4
  "description": "TDK CLI - Tilt Development Kit command line interface",
5
5
  "keywords": [
6
6
  "tdk",
@@ -58,7 +58,6 @@
58
58
  "ink": "^7.0.1",
59
59
  "ink-select-input": "^6.2.0",
60
60
  "ora": "^8.0.0",
61
- "prompts": "^2.4.2",
62
61
  "react": "^19.2.5"
63
62
  },
64
63
  "devDependencies": {
@@ -66,6 +65,7 @@
66
65
  "@types/inquirer": "^9.0.0",
67
66
  "@types/node": "^20.0.0",
68
67
  "knip": "^6.35.1",
68
+ "react-devtools-core": "^6.1.1",
69
69
  "typescript": "^7.0.2",
70
70
  "vite": "^6.0.0",
71
71
  "vitest": "^5.0.0"