@tdk-landscape/tdk-cli-core 1.3.15 → 1.3.22

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 (274) hide show
  1. package/Tiltfile +144 -0
  2. package/discovery/AGENTS.md +362 -0
  3. package/discovery/TILT_DISCOVERY.star +424 -0
  4. package/discovery/Tiltfile +58 -0
  5. package/discovery/config.star +258 -0
  6. package/discovery/constants.star +127 -0
  7. package/discovery/deterministic.star +211 -0
  8. package/discovery/discovery_daemon.star +191 -0
  9. package/discovery/discovery_orchestrator.star +460 -0
  10. package/discovery/filtering.star +5 -0
  11. package/discovery/identity-management-backend/service.yaml +26 -0
  12. package/discovery/identity-management-frontend/service.yaml +29 -0
  13. package/discovery/identity-sdk/service.yaml +9 -0
  14. package/discovery/incremental_discovery.star +213 -0
  15. package/discovery/indexing.star +7 -0
  16. package/discovery/json_manifest_scanner.star +51 -0
  17. package/discovery/libraries.star +46 -0
  18. package/discovery/loading.star +23 -0
  19. package/discovery/manifest/constants.star +104 -0
  20. package/discovery/manifest/loading.star +386 -0
  21. package/discovery/manifest/normalize.star +281 -0
  22. package/discovery/manifest/validation.star +108 -0
  23. package/discovery/normalization.star +11 -0
  24. package/discovery/registry.star +544 -0
  25. package/discovery/resource_snapshot.py +382 -0
  26. package/discovery/resource_snapshot.star +143 -0
  27. package/discovery/schemas.star +1 -0
  28. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  29. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  30. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  31. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  32. package/discovery/test_resource_snapshot.py +251 -0
  33. package/discovery/validation.star +78 -0
  34. package/discovery/versioning.star +1 -0
  35. package/dist/commands/config.d.ts.map +1 -1
  36. package/dist/commands/config.js +11 -0
  37. package/dist/commands/config.js.map +1 -1
  38. package/dist/commands/doctor.d.ts.map +1 -1
  39. package/dist/commands/doctor.js +1 -2
  40. package/dist/commands/doctor.js.map +1 -1
  41. package/dist/commands/project.d.ts.map +1 -1
  42. package/dist/commands/project.js +36 -41
  43. package/dist/commands/project.js.map +1 -1
  44. package/dist/commands/resource.d.ts.map +1 -1
  45. package/dist/commands/resource.js +51 -55
  46. package/dist/commands/resource.js.map +1 -1
  47. package/dist/commands/stack.d.ts.map +1 -1
  48. package/dist/commands/stack.js +22 -24
  49. package/dist/commands/stack.js.map +1 -1
  50. package/dist/commands/ui.d.ts.map +1 -1
  51. package/dist/commands/ui.js +1 -2
  52. package/dist/commands/ui.js.map +1 -1
  53. package/dist/commands/up.d.ts.map +1 -1
  54. package/dist/commands/up.js +1 -2
  55. package/dist/commands/up.js.map +1 -1
  56. package/dist/commands/upgrade.d.ts +8 -0
  57. package/dist/commands/upgrade.d.ts.map +1 -1
  58. package/dist/commands/upgrade.js +59 -18
  59. package/dist/commands/upgrade.js.map +1 -1
  60. package/dist/generator/extension-fetch.d.ts +19 -0
  61. package/dist/generator/extension-fetch.d.ts.map +1 -1
  62. package/dist/generator/extension-fetch.js +71 -5
  63. package/dist/generator/extension-fetch.js.map +1 -1
  64. package/dist/generator/template-engine.d.ts +1 -0
  65. package/dist/generator/template-engine.d.ts.map +1 -1
  66. package/dist/generator/template-engine.js +50 -6
  67. package/dist/generator/template-engine.js.map +1 -1
  68. package/dist/utils/command-helpers.d.ts.map +1 -1
  69. package/dist/utils/command-helpers.js +7 -9
  70. package/dist/utils/command-helpers.js.map +1 -1
  71. package/dist/utils/constants.d.ts +1 -0
  72. package/dist/utils/constants.d.ts.map +1 -1
  73. package/dist/utils/constants.js +1 -0
  74. package/dist/utils/constants.js.map +1 -1
  75. package/dist/utils/errors.d.ts +2 -0
  76. package/dist/utils/errors.d.ts.map +1 -1
  77. package/dist/utils/errors.js +6 -1
  78. package/dist/utils/errors.js.map +1 -1
  79. package/dist/utils/project-features.d.ts.map +1 -1
  80. package/dist/utils/project-features.js +1 -1
  81. package/dist/utils/project-features.js.map +1 -1
  82. package/dist/utils/resource-features.d.ts.map +1 -1
  83. package/dist/utils/resource-features.js +2 -2
  84. package/dist/utils/resource-features.js.map +1 -1
  85. package/dist/utils/tar.js +4 -4
  86. package/dist/utils/tar.js.map +1 -1
  87. package/dist/utils/validation.d.ts +7 -0
  88. package/dist/utils/validation.d.ts.map +1 -1
  89. package/dist/utils/validation.js +9 -0
  90. package/dist/utils/validation.js.map +1 -1
  91. package/engine/AGENTS.md +705 -0
  92. package/engine/README.md +29 -0
  93. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  94. package/engine/Tiltfile +80 -0
  95. package/engine/assets/docker/golden-layers.Dockerfile +221 -0
  96. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
  97. package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
  98. package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
  99. package/engine/config.star +3 -0
  100. package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
  101. package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
  102. package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
  103. package/engine/docs/C4-ARCHITECTURE.md +17 -0
  104. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
  105. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
  106. package/engine/docs/README.md +284 -0
  107. package/engine/entrypoint.star +97 -0
  108. package/engine/lifecycle/orchestrator.star +260 -0
  109. package/engine/paths.star +717 -0
  110. package/engine/schemas/manifest-schema.json +301 -0
  111. package/engine/schemas/service-schema.json +301 -0
  112. package/engine/scripts/README.md +89 -0
  113. package/engine/scripts/build-and-publish-lib.sh +205 -0
  114. package/engine/scripts/check-lib-publish.sh +85 -0
  115. package/engine/scripts/debug-container.sh +258 -0
  116. package/engine/scripts/generate-manifest.sh +197 -0
  117. package/engine/spec.master +702 -0
  118. package/engine/spec.master.example +341 -0
  119. package/engine/topologies/README.md +34 -0
  120. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  121. package/engine/topologies/platform/docker/auth/auth.star +167 -0
  122. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  123. package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
  124. package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
  125. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
  126. package/engine/topologies/platform/docker/compose/compose.star +636 -0
  127. package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
  128. package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
  129. package/engine/topologies/platform/docker/config/bunignore.star +142 -0
  130. package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
  131. package/engine/topologies/platform/docker/constants.star +170 -0
  132. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
  133. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
  134. package/engine/topologies/platform/docker/index.star +27 -0
  135. package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
  136. package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
  137. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
  138. package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
  139. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
  140. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
  141. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
  142. package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
  143. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
  144. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
  145. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
  146. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
  147. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
  148. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
  149. package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
  150. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
  151. package/engine/topologies/platform/docker/networking/traefik.star +232 -0
  152. package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
  153. package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
  154. package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
  155. package/engine/topologies/platform/net/proxy.star +4 -0
  156. package/engine/topologies/platform/registries/local.star +4 -0
  157. package/engine/topologies/platform/security/secrets.star +239 -0
  158. package/engine/topologies/platform/state/relational.star +4 -0
  159. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  160. package/engine/topologies/tilt/common/utils.star +364 -0
  161. package/engine/topologies/tilt/common/utils_debug.star +69 -0
  162. package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
  163. package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
  164. package/engine/topologies/tilt/common/utils_env.star +43 -0
  165. package/engine/topologies/tilt/common/utils_output.star +97 -0
  166. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  167. package/engine/topologies/tilt/config/defaults.star +3 -0
  168. package/engine/topologies/tilt/config/feature_flags.star +10 -0
  169. package/engine/topologies/tilt/config/global.star +55 -0
  170. package/engine/topologies/tilt/config/profiles.star +382 -0
  171. package/engine/topologies/tilt/generators/agents_md.star +62 -0
  172. package/engine/topologies/tilt/generators/api_gateway.star +145 -0
  173. package/engine/topologies/tilt/generators/index.star +124 -0
  174. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  175. package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
  176. package/engine/topologies/tilt/generators/infisical/index.star +57 -0
  177. package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
  178. package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
  179. package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
  180. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
  181. package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
  182. package/engine/topologies/tilt/generators/npmrc.star +111 -0
  183. package/engine/topologies/tilt/generators/tsconfig.star +23 -0
  184. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
  185. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
  186. package/engine/topologies/tilt/generators/typescript/common.star +7 -0
  187. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
  188. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
  189. package/engine/topologies/tilt/generators/typescript/include.star +23 -0
  190. package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
  191. package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
  192. package/engine/topologies/tilt/generators/validators.star +853 -0
  193. package/engine/topologies/tilt/generators/vite/backend.star +78 -0
  194. package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
  195. package/engine/topologies/tilt/generators/vite/generators.star +43 -0
  196. package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
  197. package/engine/topologies/tilt/generators/vite/library.star +65 -0
  198. package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
  199. package/engine/topologies/tilt/generators/vite/templates.star +737 -0
  200. package/engine/topologies/tilt/generators/vite_config.star +22 -0
  201. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  202. package/engine/topologies/tilt/manifest/README.md +693 -0
  203. package/engine/topologies/tilt/manifest/__init__.star +218 -0
  204. package/engine/topologies/tilt/manifest/constants.star +252 -0
  205. package/engine/topologies/tilt/manifest/errors.star +266 -0
  206. package/engine/topologies/tilt/manifest/integration.star +339 -0
  207. package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
  208. package/engine/topologies/tilt/manifest/loader.star +214 -0
  209. package/engine/topologies/tilt/manifest/mapper.star +227 -0
  210. package/engine/topologies/tilt/manifest/parser.star +400 -0
  211. package/engine/topologies/tilt/manifest/schema.star +462 -0
  212. package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
  213. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
  214. package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
  215. package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
  216. package/engine/topologies/tilt/manifest/validator.star +717 -0
  217. package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
  218. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  219. package/engine/topologies/tilt/resources/conditions.star +3 -0
  220. package/engine/topologies/tilt/resources/databases.star +244 -0
  221. package/engine/topologies/tilt/resources/declaration.star +3 -0
  222. package/engine/topologies/tilt/resources/deps.star +3 -0
  223. package/engine/topologies/tilt/resources/infra-loader.star +437 -0
  224. package/engine/topologies/tilt/resources/libs.star +30 -0
  225. package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
  226. package/engine/topologies/tilt/resources/libs_paths.star +79 -0
  227. package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
  228. package/engine/topologies/tilt/resources/libs_setup.star +164 -0
  229. package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
  230. package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
  231. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
  232. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
  233. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
  234. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
  235. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
  236. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
  237. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  238. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
  239. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
  240. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
  241. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
  242. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
  243. package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
  244. package/engine/topologies/tilt/resources/orchestrator.star +54 -0
  245. package/engine/topologies/tilt/resources/ordering.star +3 -0
  246. package/engine/topologies/tilt/resources/triggers.star +3 -0
  247. package/engine/topologies/tilt/resources/watchers.star +299 -0
  248. package/engine/where-things-live.star +717 -0
  249. package/ext/Tiltfile +66 -0
  250. package/ext/ide-components/README.md +219 -0
  251. package/ext/ide-components/code_executor/server.py +268 -0
  252. package/ext/ide-components/code_viewer/server.py +206 -0
  253. package/ext/ide-components/config_inspector/server.py +1050 -0
  254. package/ext/ide-components/file_browser/server.py +285 -0
  255. package/ext/ide-components/shared/config_service.py +469 -0
  256. package/ext/ide-components/shared/file_utils.py +298 -0
  257. package/ext/ide-components/shared/http_utils.py +232 -0
  258. package/ext/ide-components/shared/static/styles.css +1334 -0
  259. package/ext/ide-components/shared/syntax_highlighter.py +140 -0
  260. package/ext/ide-components/shared/template_engine.py +123 -0
  261. package/ext/ide-components/shared/templates/base.html +121 -0
  262. package/ext/ide-components/shared/test_config_service.py +326 -0
  263. package/ext/ide-components/shared/tilt_integration.py +158 -0
  264. package/ext/ui-enhancements/cron-status-server.sh +49 -0
  265. package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
  266. package/ext/ui-enhancements/extension.yaml +36 -0
  267. package/ext/ui-enhancements/tiltfile.py +99 -0
  268. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  269. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  270. package/ext/ui-enhancements/ui/icons.css +125 -0
  271. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  272. package/package.json +13 -9
  273. package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
  274. package/specs/specs/TILT_TECH_STACK.star +159 -0
@@ -0,0 +1,534 @@
1
+ # =============================================================================
2
+ # 🏢 INFISICAL ORGANIZATION MANAGER
3
+ # =============================================================================
4
+ # Manages Infisical organization configuration and setup
5
+ # Replaces: Manual UI organization creation
6
+ # =============================================================================
7
+ #
8
+ # This module provides:
9
+ # - Organization structure definitions
10
+ # - Project configuration templates
11
+ # - Environment setup (dev, staging, prod)
12
+ # - Role and permission templates
13
+ #
14
+ # Usage:
15
+ # load("./infisical/organization.star", "Organization")
16
+ # config = Organization.generate_config("my-project", ["dev", "staging", "prod"])
17
+ # =============================================================================
18
+
19
+ # Load project name for dynamic defaults
20
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
21
+ def _load_project_names():
22
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
23
+ project_json_path = '.tdk/project.json'
24
+ if project_root:
25
+ project_json_path = project_root + '/' + project_json_path
26
+
27
+ if os.path.exists(project_json_path):
28
+ _project_json = read_json(project_json_path)
29
+ _PROJECT_NAME = _project_json.get('project', {}).get('name', 'tdk-project')
30
+ _PROJECT_NAME_DISPLAY = _PROJECT_NAME.replace('-', ' ').title()
31
+ return _PROJECT_NAME, _PROJECT_NAME_DISPLAY
32
+ return 'tdk-project', 'Tdk Project'
33
+
34
+ _PROJECT_NAME, _PROJECT_NAME_DISPLAY = _load_project_names()
35
+
36
+ def _get_timestamp():
37
+ """Get current timestamp string"""
38
+ return str(local("date +%Y-%m-%dT%H:%M:%S", quiet=True)).strip()
39
+
40
+ # =============================================================================
41
+ # Organization Structure
42
+ # =============================================================================
43
+
44
+ DEFAULT_ORGANIZATION = {
45
+ "name": _PROJECT_NAME,
46
+ "display_name": _PROJECT_NAME_DISPLAY,
47
+ "slug": _PROJECT_NAME,
48
+ "description": _PROJECT_NAME_DISPLAY + " Platform - Multi-tenant SaaS",
49
+ }
50
+
51
+ DEFAULT_PROJECT = {
52
+ "name": _PROJECT_NAME + "-secrets",
53
+ "display_name": _PROJECT_NAME_DISPLAY + " Secrets",
54
+ "slug": _PROJECT_NAME + "-secrets",
55
+ "description": "Secrets management for " + _PROJECT_NAME_DISPLAY + " platform services",
56
+ }
57
+
58
+ # =============================================================================
59
+ # Environment Configuration
60
+ # =============================================================================
61
+
62
+ ENVIRONMENTS = {
63
+ "dev": {
64
+ "name": "dev",
65
+ "display_name": "Development",
66
+ "slug": "dev",
67
+ "description": "Local development environment",
68
+ "color": "#22c55e", # Green
69
+ "position": 1,
70
+ "auto_sync": True,
71
+ },
72
+ "staging": {
73
+ "name": "staging",
74
+ "display_name": "Staging",
75
+ "slug": "staging",
76
+ "description": "Pre-production testing environment",
77
+ "color": "#f59e0b", # Amber
78
+ "position": 2,
79
+ "auto_sync": True,
80
+ },
81
+ "prod": {
82
+ "name": "prod",
83
+ "display_name": "Production",
84
+ "slug": "prod",
85
+ "description": "Production environment",
86
+ "color": "#ef4444", # Red
87
+ "position": 3,
88
+ "auto_sync": False, # Manual sync for safety
89
+ "requires_approval": True,
90
+ },
91
+ }
92
+
93
+ def _generate_environment_config(env_name):
94
+ """Generate configuration for a specific environment."""
95
+ if env_name in ENVIRONMENTS:
96
+ return ENVIRONMENTS[env_name]
97
+
98
+ return {
99
+ "name": env_name,
100
+ "display_name": env_name.capitalize(),
101
+ "slug": env_name.lower(),
102
+ "description": "Custom environment",
103
+ "color": "#6b7280", # Gray
104
+ "position": 99,
105
+ "auto_sync": False,
106
+ }
107
+
108
+ def _generate_all_environments(env_names=None):
109
+ """Generate configurations for multiple environments."""
110
+ if not env_names:
111
+ env_names = ["dev", "staging", "prod"]
112
+
113
+ return {name: _generate_environment_config(name) for name in env_names}
114
+
115
+ # =============================================================================
116
+ # Role and Permission Templates
117
+ # =============================================================================
118
+
119
+ ROLES = {
120
+ "admin": {
121
+ "name": "admin",
122
+ "display_name": "Administrator",
123
+ "description": "Full access to all secrets and settings",
124
+ "permissions": [
125
+ "secrets:read",
126
+ "secrets:write",
127
+ "secrets:delete",
128
+ "folders:read",
129
+ "folders:write",
130
+ "folders:delete",
131
+ "identities:read",
132
+ "identities:write",
133
+ "identities:delete",
134
+ "projects:read",
135
+ "projects:write",
136
+ "environments:read",
137
+ "environments:write",
138
+ ],
139
+ },
140
+ "developer": {
141
+ "name": "developer",
142
+ "display_name": "Developer",
143
+ "description": "Read/write access to service secrets",
144
+ "permissions": [
145
+ "secrets:read",
146
+ "secrets:write",
147
+ "folders:read",
148
+ "folders:write",
149
+ "identities:read",
150
+ ],
151
+ },
152
+ "readonly": {
153
+ "name": "readonly",
154
+ "display_name": "Read Only",
155
+ "description": "Read-only access to secrets",
156
+ "permissions": [
157
+ "secrets:read",
158
+ "folders:read",
159
+ ],
160
+ },
161
+ "service": {
162
+ "name": "service",
163
+ "display_name": "Service Account",
164
+ "description": "Machine identity role for services",
165
+ "permissions": [
166
+ "secrets:read",
167
+ "folders:read",
168
+ ],
169
+ "machine_identity_only": True,
170
+ },
171
+ "ci": {
172
+ "name": "ci",
173
+ "display_name": "CI/CD",
174
+ "description": "Continuous integration role",
175
+ "permissions": [
176
+ "secrets:read",
177
+ "secrets:write:dev",
178
+ "folders:read",
179
+ ],
180
+ "machine_identity_only": True,
181
+ },
182
+ }
183
+
184
+ def _generate_role_config(role_name):
185
+ """Generate configuration for a role."""
186
+ if role_name in ROLES:
187
+ return ROLES[role_name]
188
+
189
+ return {
190
+ "name": role_name,
191
+ "display_name": role_name.capitalize(),
192
+ "description": "Custom role",
193
+ "permissions": ["secrets:read"],
194
+ }
195
+
196
+ # =============================================================================
197
+ # Folder Structure Templates
198
+ # =============================================================================
199
+
200
+ FOLDER_TEMPLATES = {
201
+ "services": {
202
+ "name": "services",
203
+ "description": "Application service secrets",
204
+ "children": [], # Populated dynamically
205
+ },
206
+ "platform": {
207
+ "name": "platform",
208
+ "description": "Platform infrastructure secrets",
209
+ "children": [
210
+ {"name": "api-gateway", "description": "API Gateway configuration"},
211
+ {"name": "database", "description": "Database credentials"},
212
+ {"name": "messaging", "description": "NATS and message broker secrets"},
213
+ {"name": "observability", "description": "Monitoring and logging"},
214
+ {"name": "security", "description": "Security service secrets"},
215
+ ],
216
+ },
217
+ "shared": {
218
+ "name": "shared",
219
+ "description": "Shared secrets across services",
220
+ "children": [
221
+ {"name": "database-credentials", "description": "Shared database credentials"},
222
+ {"name": "api-tokens", "description": "Shared API tokens"},
223
+ {"name": "encryption-keys", "description": "Encryption and signing keys"},
224
+ {"name": "certificates", "description": "TLS certificates"},
225
+ ],
226
+ },
227
+ "infrastructure": {
228
+ "name": "infrastructure",
229
+ "description": "Infrastructure component secrets",
230
+ "children": [
231
+ {"name": "postgres", "description": "PostgreSQL cluster secrets"},
232
+ {"name": "redis", "description": "Redis cluster secrets"},
233
+ {"name": "nats", "description": "NATS server secrets"},
234
+ {"name": "infisical", "description": "Infisical self-secrets"},
235
+ {"name": "traefik", "description": "Traefik proxy secrets"},
236
+ ],
237
+ },
238
+ }
239
+
240
+ def _generate_folder_structure(resource_names=None):
241
+ """
242
+ Generate complete folder structure for organization.
243
+
244
+ Args:
245
+ resource_names: List of service names to create under /services
246
+
247
+ Returns:
248
+ Dict with complete folder structure
249
+ """
250
+ structure = {}
251
+
252
+ for template_name, template in FOLDER_TEMPLATES.items():
253
+ folder = dict(template) # Copy
254
+
255
+ # Add service folders under /services
256
+ if template_name == "services" and resource_names:
257
+ for resource_name in resource_names:
258
+ folder["children"].append({
259
+ "name": resource_name,
260
+ "description": "{} service secrets".format(resource_name),
261
+ })
262
+
263
+ structure[template_name] = folder
264
+
265
+ return structure
266
+
267
+ # =============================================================================
268
+ # Secret Templates
269
+ # =============================================================================
270
+
271
+ SECRET_TEMPLATES = {
272
+ "database": {
273
+ "DATABASE_URL": {
274
+ "type": "string",
275
+ "description": "PostgreSQL connection string",
276
+ "example": "postgresql://user:pass@localhost:5432/dbname",
277
+ },
278
+ "DB_HOST": {
279
+ "type": "string",
280
+ "description": "Database hostname",
281
+ "example": "postgres",
282
+ },
283
+ "DB_PORT": {
284
+ "type": "number",
285
+ "description": "Database port",
286
+ "example": "5432",
287
+ },
288
+ "DB_NAME": {
289
+ "type": "string",
290
+ "description": "Database name",
291
+ "example": _PROJECT_NAME + "_service",
292
+ },
293
+ "DB_USER": {
294
+ "type": "string",
295
+ "description": "Database user",
296
+ "example": "postgres",
297
+ },
298
+ "DB_PASSWORD": {
299
+ "type": "string",
300
+ "description": "Database password",
301
+ "sensitive": True,
302
+ },
303
+ },
304
+ "jwt": {
305
+ "JWT_SECRET": {
306
+ "type": "string",
307
+ "description": "JWT signing secret",
308
+ "sensitive": True,
309
+ },
310
+ "JWT_EXPIRATION": {
311
+ "type": "string",
312
+ "description": "JWT expiration time",
313
+ "example": "24h",
314
+ },
315
+ "JWT_ISSUER": {
316
+ "type": "string",
317
+ "description": "JWT issuer",
318
+ "example": _PROJECT_NAME,
319
+ },
320
+ },
321
+ "api": {
322
+ "RESOURCE_API_KEY": {
323
+ "type": "string",
324
+ "description": "Service API key for inter-service communication",
325
+ "sensitive": True,
326
+ },
327
+ "API_GATEWAY_TOKEN": {
328
+ "type": "string",
329
+ "description": "API Gateway authentication token",
330
+ "sensitive": True,
331
+ },
332
+ },
333
+ "redis": {
334
+ "REDIS_URL": {
335
+ "type": "string",
336
+ "description": "Redis connection string",
337
+ "example": "redis://localhost:6379",
338
+ },
339
+ "REDIS_HOST": {
340
+ "type": "string",
341
+ "description": "Redis hostname",
342
+ "example": "redis",
343
+ },
344
+ "REDIS_PORT": {
345
+ "type": "number",
346
+ "description": "Redis port",
347
+ "example": "6379",
348
+ },
349
+ },
350
+ "nats": {
351
+ "NATS_URL": {
352
+ "type": "string",
353
+ "description": "NATS server URL",
354
+ "example": "nats://localhost:4222",
355
+ },
356
+ "NATS_HOST": {
357
+ "type": "string",
358
+ "description": "NATS hostname",
359
+ "example": "nats",
360
+ },
361
+ "NATS_PORT": {
362
+ "type": "number",
363
+ "description": "NATS port",
364
+ "example": "4222",
365
+ },
366
+ },
367
+ "payment": {
368
+ "STRIPE_SECRET_KEY": {
369
+ "type": "string",
370
+ "description": "Stripe API secret key",
371
+ "sensitive": True,
372
+ },
373
+ "STRIPE_WEBHOOK_SECRET": {
374
+ "type": "string",
375
+ "description": "Stripe webhook endpoint secret",
376
+ "sensitive": True,
377
+ },
378
+ "STRIPE_PUBLISHABLE_KEY": {
379
+ "type": "string",
380
+ "description": "Stripe publishable key",
381
+ },
382
+ },
383
+ "email": {
384
+ "SMTP_HOST": {
385
+ "type": "string",
386
+ "description": "SMTP server hostname",
387
+ },
388
+ "SMTP_PORT": {
389
+ "type": "number",
390
+ "description": "SMTP server port",
391
+ },
392
+ "SMTP_USER": {
393
+ "type": "string",
394
+ "description": "SMTP username",
395
+ },
396
+ "SMTP_PASSWORD": {
397
+ "type": "string",
398
+ "description": "SMTP password",
399
+ "sensitive": True,
400
+ },
401
+ "SENDGRID_API_KEY": {
402
+ "type": "string",
403
+ "description": "SendGrid API key",
404
+ "sensitive": True,
405
+ },
406
+ },
407
+ }
408
+
409
+ def _generate_secrets_for_service(resource_type="backend"):
410
+ """
411
+ Generate secret templates for a service type.
412
+
413
+ Args:
414
+ resource_type: Type of service (backend, frontend, payment, etc.)
415
+
416
+ Returns:
417
+ Dict with secret templates
418
+ """
419
+ secrets = {}
420
+
421
+ # All services get these
422
+ secrets.update(SECRET_TEMPLATES["database"])
423
+ secrets.update(SECRET_TEMPLATES["jwt"])
424
+ secrets.update(SECRET_TEMPLATES["api"])
425
+
426
+ # Type-specific secrets
427
+ if resource_type in ["backend", "api-gateway"]:
428
+ secrets.update(SECRET_TEMPLATES["redis"])
429
+ secrets.update(SECRET_TEMPLATES["nats"])
430
+
431
+ if resource_type == "payment":
432
+ secrets.update(SECRET_TEMPLATES["payment"])
433
+
434
+ if resource_type == "notification":
435
+ secrets.update(SECRET_TEMPLATES["email"])
436
+
437
+ return secrets
438
+
439
+ # =============================================================================
440
+ # Complete Organization Configuration
441
+ # =============================================================================
442
+
443
+ def _generate_organization_config(org_name=None, project_name=None, env_names=None, resource_names=None):
444
+ """
445
+ Generate complete organization configuration.
446
+
447
+ Args:
448
+ org_name: Organization name (default: from project.json or 'tdk-project')
449
+ project_name: Project name (default: {org_name}-secrets)
450
+ env_names: List of environments (default: [dev, staging, prod])
451
+ resource_names: List of services to create folders for
452
+
453
+ Returns:
454
+ Dict with complete organization configuration
455
+ """
456
+ org = DEFAULT_ORGANIZATION.copy()
457
+ if org_name:
458
+ org["name"] = org_name
459
+ org["slug"] = org_name.lower().replace(" ", "-")
460
+ org["display_name"] = org_name.replace("-", " ").title()
461
+
462
+ project = DEFAULT_PROJECT.copy()
463
+ if project_name:
464
+ project["name"] = project_name
465
+ project["slug"] = project_name.lower().replace(" ", "-")
466
+ project["display_name"] = project_name.replace("-", " ").title()
467
+
468
+ if not env_names:
469
+ env_names = ["dev", "staging", "prod"]
470
+
471
+ return {
472
+ "organization": org,
473
+ "project": project,
474
+ "environments": _generate_all_environments(env_names),
475
+ "roles": ROLES,
476
+ "folder_structure": _generate_folder_structure(resource_names),
477
+ "secret_templates": SECRET_TEMPLATES,
478
+ "generated_at": _get_timestamp(),
479
+ }
480
+
481
+ # =============================================================================
482
+ # Validation
483
+ # =============================================================================
484
+
485
+ def _validate_organization_config(config):
486
+ """Validate organization configuration."""
487
+ errors = []
488
+ warnings = []
489
+
490
+ # Check required fields
491
+ if not config.get("organization", {}).get("name"):
492
+ errors.append("Missing organization name")
493
+
494
+ if not config.get("project", {}).get("name"):
495
+ errors.append("Missing project name")
496
+
497
+ # Check environments
498
+ envs = config.get("environments", {})
499
+ if not envs:
500
+ warnings.append("No environments configured")
501
+
502
+ # Check for prod
503
+ if "prod" not in envs:
504
+ warnings.append("No production environment configured")
505
+
506
+ return {
507
+ "valid": len(errors) == 0,
508
+ "errors": errors,
509
+ "warnings": warnings,
510
+ }
511
+
512
+ # =============================================================================
513
+ # Main API
514
+ # =============================================================================
515
+
516
+ Organization = struct(
517
+ # Configuration generators
518
+ generate_config=_generate_organization_config,
519
+ generate_environment=_generate_environment_config,
520
+ generate_role=_generate_role_config,
521
+ generate_folder_structure=_generate_folder_structure,
522
+ generate_secrets_for_service=_generate_secrets_for_service,
523
+
524
+ # Validation
525
+ validate_config=_validate_organization_config,
526
+
527
+ # Templates
528
+ DEFAULT_ORGANIZATION=DEFAULT_ORGANIZATION,
529
+ DEFAULT_PROJECT=DEFAULT_PROJECT,
530
+ ENVIRONMENTS=ENVIRONMENTS,
531
+ ROLES=ROLES,
532
+ FOLDER_TEMPLATES=FOLDER_TEMPLATES,
533
+ SECRET_TEMPLATES=SECRET_TEMPLATES,
534
+ )