@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,140 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Syntax highlighting utilities using Pygments
4
+ """
5
+
6
+ import sys
7
+ from pathlib import Path
8
+
9
+ # Try to import pygments
10
+ try:
11
+ from pygments import highlight
12
+ from pygments.lexers import get_lexer_by_name, guess_lexer_for_filename, TextLexer
13
+ from pygments.formatters import HtmlFormatter
14
+ PYGMENTS_AVAILABLE = True
15
+ except ImportError:
16
+ PYGMENTS_AVAILABLE = False
17
+
18
+
19
+ class SyntaxHighlighter:
20
+ """Syntax highlighting using Pygments (if available) or fallback"""
21
+
22
+ @staticmethod
23
+ def highlight_code(code: str, language: str = None, filename: str = None) -> str:
24
+ """
25
+ Highlight code and return HTML
26
+
27
+ Args:
28
+ code: Source code to highlight
29
+ language: Language name (optional)
30
+ filename: Filename for guessing language (optional)
31
+
32
+ Returns:
33
+ HTML string with highlighted code
34
+ """
35
+ if not PYGMENTS_AVAILABLE:
36
+ return SyntaxHighlighter._fallback_highlight(code)
37
+
38
+ try:
39
+ # Try to get lexer by language name
40
+ if language:
41
+ try:
42
+ lexer = get_lexer_by_name(language)
43
+ except (ValueError, TypeError):
44
+ lexer = None
45
+ else:
46
+ lexer = None
47
+
48
+ # Try to guess from filename
49
+ if not lexer and filename:
50
+ try:
51
+ lexer = guess_lexer_for_filename(filename, code)
52
+ except (ValueError, TypeError):
53
+ lexer = None
54
+
55
+ # Default to text lexer
56
+ if not lexer:
57
+ lexer = TextLexer()
58
+
59
+ # Create formatter with custom CSS class
60
+ formatter = HtmlFormatter(
61
+ cssclass='syntax-highlighted',
62
+ style='monokai',
63
+ linenos=False,
64
+ wrapcode=True
65
+ )
66
+
67
+ return highlight(code, lexer, formatter)
68
+
69
+ except Exception as e:
70
+ return SyntaxHighlighter._fallback_highlight(code)
71
+
72
+ @staticmethod
73
+ def _fallback_highlight(code: str) -> str:
74
+ """Simple fallback when Pygments is not available"""
75
+ import html
76
+
77
+ # Escape HTML
78
+ escaped = html.escape(code)
79
+
80
+ # Wrap in pre/code
81
+ return f'<pre class="syntax-highlighted"><code>{escaped}</code></pre>'
82
+
83
+ @staticmethod
84
+ def get_styles() -> str:
85
+ """Get CSS styles for syntax highlighting"""
86
+ if not PYGMENTS_AVAILABLE:
87
+ return ''
88
+
89
+ try:
90
+ from pygments.formatters import HtmlFormatter
91
+ formatter = HtmlFormatter(style='monokai')
92
+ return formatter.get_style_defs('.syntax-highlighted')
93
+ except (ImportError, AttributeError):
94
+ return ''
95
+
96
+ @staticmethod
97
+ def get_language_from_ext(ext: str) -> str:
98
+ """Map file extension to Pygments language name"""
99
+ mapping = {
100
+ '.py': 'python',
101
+ '.js': 'javascript',
102
+ '.ts': 'typescript',
103
+ '.tsx': 'typescript',
104
+ '.jsx': 'javascript',
105
+ '.json': 'json',
106
+ '.yaml': 'yaml',
107
+ '.yml': 'yaml',
108
+ '.md': 'markdown',
109
+ '.sh': 'bash',
110
+ '.bash': 'bash',
111
+ '.star': 'python', # Starlark is Python-like
112
+ '.go': 'go',
113
+ '.rs': 'rust',
114
+ '.java': 'java',
115
+ '.sql': 'sql',
116
+ '.css': 'css',
117
+ '.scss': 'scss',
118
+ '.html': 'html',
119
+ '.xml': 'xml',
120
+ '.dockerfile': 'docker',
121
+ '.prisma': 'sql', # Close enough
122
+ }
123
+
124
+ return mapping.get(ext.lower(), 'text')
125
+
126
+
127
+ if __name__ == '__main__':
128
+ print(f"Pygments available: {PYGMENTS_AVAILABLE}")
129
+
130
+ # Test
131
+ test_code = '''
132
+ def hello_world():
133
+ """Say hello"""
134
+ print("Hello, World!")
135
+ return True
136
+ '''
137
+
138
+ result = SyntaxHighlighter.highlight_code(test_code, language='python')
139
+ print("\nHighlighted code:")
140
+ print(result[:500])
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Simple template engine for IDE components
4
+ """
5
+
6
+ import re
7
+ from pathlib import Path
8
+
9
+
10
+ class TemplateEngine:
11
+ """Simple template engine with variable substitution"""
12
+
13
+ @staticmethod
14
+ def render(template: str, **kwargs) -> str:
15
+ """
16
+ Render a template with variable substitution
17
+
18
+ Args:
19
+ template: Template string with {variable} placeholders
20
+ **kwargs: Variables to substitute
21
+
22
+ Returns:
23
+ Rendered string
24
+ """
25
+ result = template
26
+ for key, value in kwargs.items():
27
+ placeholder = '{' + key + '}'
28
+ result = result.replace(placeholder, str(value))
29
+ return result
30
+
31
+ @staticmethod
32
+ def render_file(template_path: Path, **kwargs) -> str:
33
+ """
34
+ Load template from file and render
35
+
36
+ Args:
37
+ template_path: Path to template file
38
+ **kwargs: Variables to substitute
39
+
40
+ Returns:
41
+ Rendered string
42
+ """
43
+ try:
44
+ with open(template_path, 'r', encoding='utf-8') as f:
45
+ template = f.read()
46
+ return TemplateEngine.render(template, **kwargs)
47
+ except Exception as e:
48
+ return f"<!-- Template error: {e} -->"
49
+
50
+ @staticmethod
51
+ def render_conditional(template: str, conditions: dict) -> str:
52
+ """
53
+ Render template with conditional blocks
54
+
55
+ Syntax:
56
+ {{if condition}}content{{endif}}
57
+
58
+ Args:
59
+ template: Template with conditionals
60
+ conditions: Dict of condition names to boolean values
61
+
62
+ Returns:
63
+ Rendered string with conditionals evaluated
64
+ """
65
+ result = template
66
+
67
+ # Process each condition
68
+ for condition_name, condition_value in conditions.items():
69
+ pattern = rf'{{{{if {condition_name}}}}(.*?){{{{endif}}}}'
70
+
71
+ if condition_value:
72
+ # Keep content, remove tags
73
+ result = re.sub(pattern, r'\1', result, flags=re.DOTALL)
74
+ else:
75
+ # Remove entire block
76
+ result = re.sub(pattern, '', result, flags=re.DOTALL)
77
+
78
+ return result
79
+
80
+ @staticmethod
81
+ def render_loop(template: str, items: list, item_template: str) -> str:
82
+ """
83
+ Render template with a loop
84
+
85
+ Args:
86
+ template: Main template with {items} placeholder
87
+ items: List of dicts with item data
88
+ item_template: Template for each item
89
+
90
+ Returns:
91
+ Rendered string
92
+ """
93
+ rendered_items = []
94
+ for item in items:
95
+ rendered = TemplateEngine.render(item_template, **item)
96
+ rendered_items.append(rendered)
97
+
98
+ return template.replace('{items}', ''.join(rendered_items))
99
+
100
+
101
+ if __name__ == '__main__':
102
+ # Test basic rendering
103
+ template = "Hello, {name}! Welcome to {place}."
104
+ result = TemplateEngine.render(template, name="World", place="Tilt IDE")
105
+ print(f"Basic: {result}")
106
+
107
+ # Test conditionals
108
+ conditional_template = "{{if show_greeting}}Hello!{{endif}} {{if show_name}}{name}{{endif}}"
109
+ result = TemplateEngine.render_conditional(
110
+ conditional_template,
111
+ {'show_greeting': True, 'show_name': False}
112
+ )
113
+ print(f"Conditional: {result}")
114
+
115
+ # Test loop
116
+ loop_template = "<ul>{items}</ul>"
117
+ item_template = "<li>{name}: {value}</li>"
118
+ items = [
119
+ {'name': 'File Browser', 'value': 'Port 9765'},
120
+ {'name': 'Code Viewer', 'value': 'Port 9766'},
121
+ ]
122
+ result = TemplateEngine.render_loop(loop_template, items, item_template)
123
+ print(f"Loop: {result}")
@@ -0,0 +1,121 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{title} - TDK Tilt IDE</title>
7
+ <link rel="stylesheet" href="/static/styles.css">
8
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>{favicon}</text></svg>">
9
+ <script>
10
+ // Theme initialization - runs before page renders to prevent flash
11
+ (function() {{
12
+ const savedTheme = localStorage.getItem('tilt-ide-theme');
13
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
14
+ const theme = savedTheme || (prefersDark ? 'dark' : 'light');
15
+ if (theme === 'light') {{
16
+ document.documentElement.setAttribute('data-theme', 'light');
17
+ }}
18
+ }})();
19
+
20
+ // Handle unavailable IDE services
21
+ document.addEventListener('DOMContentLoaded', function() {
22
+ const links = [
23
+ { id: 'filesLink', name: 'File Browser', port: 9765 },
24
+ { id: 'viewerLink', name: 'Code Viewer', port: 9766 },
25
+ { id: 'terminalLink', name: 'Terminal', port: 9768 }
26
+ ];
27
+
28
+ links.forEach(function(link) {
29
+ const el = document.getElementById(link.id);
30
+ if (!el) return;
31
+
32
+ const isAvailable = el.getAttribute('data-available') === 'true';
33
+
34
+ if (!isAvailable) {
35
+ el.style.opacity = '0.5';
36
+ el.style.cursor = 'not-allowed';
37
+ el.title = link.name + ' not running (port ' + link.port + ')';
38
+
39
+ el.addEventListener('click', function(e) {
40
+ e.preventDefault();
41
+ showServiceUnavailable(link.name, link.port);
42
+ });
43
+ }
44
+ });
45
+ });
46
+
47
+ function showServiceUnavailable(name, port) {
48
+ const existing = document.querySelector('.notification-toast');
49
+ if (existing) existing.remove();
50
+
51
+ const toast = document.createElement('div');
52
+ toast.className = 'notification-toast warning';
53
+ toast.innerHTML = '<strong>' + name + ' not running</strong><br>Start it with: <code>tilt up ' + name.toLowerCase().replace(' ', '-') + '</code> (port ' + port + ')';
54
+ document.body.appendChild(toast);
55
+
56
+ setTimeout(() => toast.classList.add('show'), 10);
57
+ setTimeout(() => {
58
+ toast.classList.remove('show');
59
+ setTimeout(() => toast.remove(), 300);
60
+ }, 4000);
61
+ }
62
+ </script>
63
+ </head>
64
+ <body>
65
+ <header class="header">
66
+ <button class="mobile-menu-toggle" id="mobileMenuToggle" aria-label="Toggle menu">
67
+
68
+ </button>
69
+ <h1>
70
+ <span class="header-icon">{icon}</span>
71
+ {title}
72
+ </h1>
73
+ <nav class="nav">
74
+ <a href="http://localhost:9765" class="{active_browser}" id="filesLink" data-available="{files_available}">📁 Files</a>
75
+ <a href="http://localhost:9766" class="{active_viewer}" id="viewerLink" data-available="{viewer_available}">👁️ Code</a>
76
+ <a href="http://localhost:9767" class="{active_inspector}">⚙️ Configs</a>
77
+ <a href="http://localhost:9768" class="{active_terminal}" id="terminalLink" data-available="{terminal_available}">💻 Terminal</a>
78
+ </nav>
79
+ <button class="theme-toggle" id="themeToggle" title="Toggle theme">
80
+ 🌓
81
+ </button>
82
+ {controls}
83
+ </header>
84
+
85
+ <div class="container" id="mainContainer">
86
+ {sidebar}
87
+ <main class="content">
88
+ {content}
89
+ </main>
90
+ </div>
91
+
92
+ <script>
93
+ // Theme toggle functionality
94
+ (function() {{
95
+ const themeToggle = document.getElementById('themeToggle');
96
+ if (themeToggle) {{
97
+ themeToggle.addEventListener('click', function() {{
98
+ const currentTheme = document.documentElement.getAttribute('data-theme');
99
+ const newTheme = currentTheme === 'light' ? 'dark' : 'light';
100
+ if (newTheme === 'light') {{
101
+ document.documentElement.setAttribute('data-theme', 'light');
102
+ }} else {{
103
+ document.documentElement.removeAttribute('data-theme');
104
+ }}
105
+ localStorage.setItem('tilt-ide-theme', newTheme);
106
+ }});
107
+ }}
108
+
109
+ // Mobile menu toggle
110
+ const mobileMenuToggle = document.getElementById('mobileMenuToggle');
111
+ const container = document.getElementById('mainContainer');
112
+ if (mobileMenuToggle && container) {{
113
+ mobileMenuToggle.addEventListener('click', function() {{
114
+ container.classList.toggle('sidebar-open');
115
+ }});
116
+ }}
117
+ }})();
118
+ </script>
119
+ {scripts}
120
+ </body>
121
+ </html>