@codeyam/codeyam-cli 0.1.0-staging.ea73141 → 0.1.0-staging.f3b710d

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 (137) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +2 -2
  4. package/analyzer-template/packages/aws/package.json +5 -5
  5. package/analyzer-template/packages/database/package.json +1 -1
  6. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +39 -3
  7. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
  8. package/codeyam-cli/src/commands/editor.js +365 -5
  9. package/codeyam-cli/src/commands/editor.js.map +1 -1
  10. package/codeyam-cli/src/commands/init.js +20 -0
  11. package/codeyam-cli/src/commands/init.js.map +1 -1
  12. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +93 -1
  13. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -1
  14. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +136 -0
  15. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
  16. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +98 -1
  17. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -1
  18. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js +1108 -0
  19. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js.map +1 -0
  20. package/codeyam-cli/src/utils/__tests__/envFile.test.js +125 -0
  21. package/codeyam-cli/src/utils/__tests__/envFile.test.js.map +1 -0
  22. package/codeyam-cli/src/utils/__tests__/handoffContext.test.js +500 -0
  23. package/codeyam-cli/src/utils/__tests__/handoffContext.test.js.map +1 -0
  24. package/codeyam-cli/src/utils/designSystemShowcase.js +810 -0
  25. package/codeyam-cli/src/utils/designSystemShowcase.js.map +1 -0
  26. package/codeyam-cli/src/utils/devServerState.js +32 -0
  27. package/codeyam-cli/src/utils/devServerState.js.map +1 -1
  28. package/codeyam-cli/src/utils/editorAudit.js +6 -1
  29. package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
  30. package/codeyam-cli/src/utils/editorRoadmap.js +574 -0
  31. package/codeyam-cli/src/utils/editorRoadmap.js.map +1 -0
  32. package/codeyam-cli/src/utils/editorScenarios.js +10 -0
  33. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
  34. package/codeyam-cli/src/utils/envFile.js +90 -0
  35. package/codeyam-cli/src/utils/envFile.js.map +1 -0
  36. package/codeyam-cli/src/utils/handoffContext.js +257 -0
  37. package/codeyam-cli/src/utils/handoffContext.js.map +1 -0
  38. package/codeyam-cli/src/utils/install-skills.js +36 -6
  39. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  40. package/codeyam-cli/src/utils/techStackConfig.js +38 -0
  41. package/codeyam-cli/src/utils/techStackConfig.js.map +1 -0
  42. package/codeyam-cli/src/utils/techStackConfig.test.js +85 -0
  43. package/codeyam-cli/src/utils/techStackConfig.test.js.map +1 -0
  44. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +1 -0
  45. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -1
  46. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +119 -1
  47. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -1
  48. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +354 -1
  49. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -1
  50. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  51. package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CLe80MMu.js → CopyButton-DTBZZfSk.js} +1 -1
  52. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-Crt_KN_U.js → EntityItem-BxclONWq.js} +1 -1
  53. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CD7lGABo.js → EntityTypeIcon-BsnEOJZ_.js} +1 -1
  54. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CgTNOhnu.js → InlineSpinner-ByaELMbv.js} +1 -1
  55. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-DtYTSPL2.js → InteractivePreview-6WjVfhxX.js} +2 -2
  56. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-D3s1MFkb.js → LibraryFunctionPreview-ChX-Hp7W.js} +1 -1
  57. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CM5zg40N.js → LogViewer-C-9zQdXg.js} +1 -1
  58. package/codeyam-cli/src/webserver/build/client/assets/{MiniClaudeChat-CQENLSrF.js → MiniClaudeChat-Bs2_Oua4.js} +2 -2
  59. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-C2PLkej3.js → ReportIssueModal-DQsceHVv.js} +1 -1
  60. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DanvyBPb.js → SafeScreenshot-DThcm_9M.js} +1 -1
  61. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CefgqbCr.js → ScenarioViewer-Cl4oOA3A.js} +1 -1
  62. package/codeyam-cli/src/webserver/build/client/assets/{Spinner-Bc8BG-Lw.js → Spinner-CIil5-gb.js} +1 -1
  63. package/codeyam-cli/src/webserver/build/client/assets/{ViewportInspectBar-BA_Ry-rs.js → ViewportInspectBar-BqkA9zyZ.js} +1 -1
  64. package/codeyam-cli/src/webserver/build/client/assets/{_index-C1YkzTAV.js → _index-DnOgyseQ.js} +1 -1
  65. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-yH46LLUz.js → activity.(_tab)-DqM9hbNE.js} +1 -1
  66. package/codeyam-cli/src/webserver/build/client/assets/{addon-web-links-CHx25PAe.js → addon-web-links-C58dYPwR.js} +1 -1
  67. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-Bg3e7q4S.js → agent-transcripts-B8NCeOrm.js} +1 -1
  68. package/codeyam-cli/src/webserver/build/client/assets/api.editor-database-verify-l0sNRNKZ.js +1 -0
  69. package/codeyam-cli/src/webserver/build/client/assets/api.editor-github-verify-l0sNRNKZ.js +1 -0
  70. package/codeyam-cli/src/webserver/build/client/assets/api.editor-handoff-l0sNRNKZ.js +1 -0
  71. package/codeyam-cli/src/webserver/build/client/assets/api.editor-hosting-verify-l0sNRNKZ.js +1 -0
  72. package/codeyam-cli/src/webserver/build/client/assets/api.editor-roadmap-l0sNRNKZ.js +1 -0
  73. package/codeyam-cli/src/webserver/build/client/assets/{book-open-CL-lMgHh.js → book-open-BFSIqZgO.js} +1 -1
  74. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-GmAjGS9-.js → chevron-down-B9fDzFVh.js} +1 -1
  75. package/codeyam-cli/src/webserver/build/client/assets/chunk-UVKPFVEO-Bmq2apuh.js +43 -0
  76. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DFcQkN5j.js → circle-check-DLPObLUx.js} +1 -1
  77. package/codeyam-cli/src/webserver/build/client/assets/{copy-C6iF61Xs.js → copy-DXEmO0TD.js} +1 -1
  78. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-4ImjHTVC.js → createLucideIcon-BwyFiRot.js} +1 -1
  79. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-CRepiabR.js → dev.empty-iRhRIFlp.js} +1 -1
  80. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-BZPBzV73.js +1 -0
  81. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DhtVC4aI.js +161 -0
  82. package/codeyam-cli/src/webserver/build/client/assets/{editorPreview-CluPkvXJ.js → editorPreview-C6fEYHrh.js} +6 -6
  83. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-DYJRGiDI.js → entity._sha._-pc-vc6wO.js} +1 -1
  84. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-wdiwx5-Z.js → entity._sha.scenarios._scenarioId.dev-C8AyYgYT.js} +1 -1
  85. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-BrkN-40Y.js → entity._sha.scenarios._scenarioId.fullscreen-DziaVQX1.js} +1 -1
  86. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-DxfhekTZ.js → entity._sha_.create-scenario-BTcpgIpC.js} +1 -1
  87. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CRXJWmpB.js → entity._sha_.edit._scenarioId-D_O_ajfZ.js} +1 -1
  88. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-SuW9syRS.js → entry.client-j1Vi0bco.js} +6 -6
  89. package/codeyam-cli/src/webserver/build/client/assets/{files-D-xGrg29.js → files-kuny2Q_s.js} +1 -1
  90. package/codeyam-cli/src/webserver/build/client/assets/{git-Bq_fbXP5.js → git-DgCZPMie.js} +1 -1
  91. package/codeyam-cli/src/webserver/build/client/assets/globals-L-aUIeux.css +1 -0
  92. package/codeyam-cli/src/webserver/build/client/assets/{index-Bp1l4hSv.js → index-BliGSSpl.js} +1 -1
  93. package/codeyam-cli/src/webserver/build/client/assets/{index-DE3jI_dv.js → index-SqjQKTdH.js} +1 -1
  94. package/codeyam-cli/src/webserver/build/client/assets/{index-CWV9XZiG.js → index-vyrZD2g4.js} +1 -1
  95. package/codeyam-cli/src/webserver/build/client/assets/{labs-B_IX45ih.js → labs-c3yLxSEp.js} +1 -1
  96. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-De-7qQ2u.js → loader-circle-D-q28GLF.js} +1 -1
  97. package/codeyam-cli/src/webserver/build/client/assets/manifest-79d0d81a.js +1 -0
  98. package/codeyam-cli/src/webserver/build/client/assets/{memory-Cx2xEx7s.js → memory-CEWIUC4t.js} +1 -1
  99. package/codeyam-cli/src/webserver/build/client/assets/{pause-CFxEKL1u.js → pause-BP6fitdh.js} +1 -1
  100. package/codeyam-cli/src/webserver/build/client/assets/{root-dKFRTYcy.js → root-L2V0jea7.js} +6 -6
  101. package/codeyam-cli/src/webserver/build/client/assets/{search-BdBb5aqc.js → search-BooqacKS.js} +1 -1
  102. package/codeyam-cli/src/webserver/build/client/assets/{settings-DdE-Untf.js → settings-BM0nbryO.js} +1 -1
  103. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DSCdE99u.js → simulations-ovy6FjRY.js} +1 -1
  104. package/codeyam-cli/src/webserver/build/client/assets/{terminal-CrplD4b1.js → terminal-DHemCJIs.js} +1 -1
  105. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DqJ0j69l.js → triangle-alert-D87ekDl8.js} +1 -1
  106. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-DhXHbEjP.js → useCustomSizes-Dk0Tciqg.js} +1 -1
  107. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-D9QZKaLJ.js → useLastLogLine-C8QvIe05.js} +1 -1
  108. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-Cy5Qg_UR.js → useReportContext-jkCytuYz.js} +1 -1
  109. package/codeyam-cli/src/webserver/build/client/assets/{useToast-5HR2j9ZE.js → useToast-BgqkixU9.js} +1 -1
  110. package/codeyam-cli/src/webserver/build/server/assets/{analysisRunner-OLsM110H.js → analysisRunner-QgInFGdU.js} +1 -1
  111. package/codeyam-cli/src/webserver/build/server/assets/{index-WHdB6WTN.js → index-zblh9auj.js} +1 -1
  112. package/codeyam-cli/src/webserver/build/server/assets/init-DaE0CBjk.js +14 -0
  113. package/codeyam-cli/src/webserver/build/server/assets/server-build-CNvgz1cC.js +853 -0
  114. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  115. package/codeyam-cli/src/webserver/build-info.json +5 -5
  116. package/codeyam-cli/src/webserver/editorProxy.js +255 -20
  117. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
  118. package/codeyam-cli/src/webserver/server.js +67 -0
  119. package/codeyam-cli/src/webserver/server.js.map +1 -1
  120. package/codeyam-cli/src/webserver/terminalServer.js +102 -11
  121. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  122. package/codeyam-cli/templates/codeyam-editor-codex.md +61 -0
  123. package/codeyam-cli/templates/codeyam-editor-gemini.md +59 -0
  124. package/codeyam-cli/templates/editor-step-hook.py +4 -4
  125. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +36 -1
  126. package/codeyam-cli/templates/expo-react-native/app.json +11 -0
  127. package/codeyam-cli/templates/expo-react-native/package.json +1 -0
  128. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +1 -0
  129. package/codeyam-cli/templates/seed-adapters/supabase.ts +185 -84
  130. package/package.json +1 -1
  131. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-BAdwhyCx.js +0 -43
  132. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-Gbk_i5Js.js +0 -1
  133. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-CRxPi2BB.js +0 -96
  134. package/codeyam-cli/src/webserver/build/client/assets/globals-BsGHu8WX.css +0 -1
  135. package/codeyam-cli/src/webserver/build/client/assets/manifest-9032538f.js +0 -1
  136. package/codeyam-cli/src/webserver/build/server/assets/init-DbSiZoE6.js +0 -10
  137. package/codeyam-cli/src/webserver/build/server/assets/server-build-DZbLY6O_.js +0 -690
@@ -0,0 +1,574 @@
1
+ /**
2
+ * Roadmap data utilities for the CodeYam editor.
3
+ *
4
+ * Manages `.codeyam/roadmap.json` — a hybrid checklist of predefined and
5
+ * user-created tasks across Plan, Build, and Deploy phases.
6
+ */
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import { execSync } from 'child_process';
10
+ // ── Default Predefined Tasks ────────────────────────────────────────────
11
+ const DEFAULT_PLAN_TASKS = [
12
+ {
13
+ id: 'plan-project-name',
14
+ label: 'Define project name and description',
15
+ completed: false,
16
+ autoDetect: 'project-title-exists',
17
+ },
18
+ {
19
+ id: 'plan-tech-stack',
20
+ label: 'Review tech stack',
21
+ completed: false,
22
+ autoDetect: 'tech-stack-configured',
23
+ },
24
+ {
25
+ id: 'plan-design-system',
26
+ label: 'Create design system',
27
+ completed: false,
28
+ autoDetect: 'design-system-exists',
29
+ },
30
+ {
31
+ id: 'plan-screen-sizes',
32
+ label: 'Configure screen sizes',
33
+ completed: false,
34
+ autoDetect: 'screen-sizes-configured',
35
+ },
36
+ {
37
+ id: 'plan-github',
38
+ label: 'Setup GitHub repository',
39
+ completed: false,
40
+ autoDetect: 'github-configured',
41
+ },
42
+ ];
43
+ const DEFAULT_DEPLOY_TASKS = [
44
+ {
45
+ id: 'deploy-hosting',
46
+ label: 'Set up hosting provider',
47
+ completed: false,
48
+ autoDetect: 'hosting-configured',
49
+ },
50
+ {
51
+ id: 'deploy-database',
52
+ label: 'Set up hosted database',
53
+ completed: false,
54
+ autoDetect: 'database-configured',
55
+ },
56
+ {
57
+ id: 'deploy-env-vars',
58
+ label: 'Configure environment variables',
59
+ completed: false,
60
+ autoDetect: 'env-vars-configured',
61
+ },
62
+ {
63
+ id: 'deploy-cicd',
64
+ label: 'Set up CI/CD pipeline',
65
+ completed: false,
66
+ },
67
+ {
68
+ id: 'deploy-domain',
69
+ label: 'Configure custom domain',
70
+ completed: false,
71
+ },
72
+ {
73
+ id: 'deploy-production',
74
+ label: 'Deploy to production',
75
+ completed: false,
76
+ },
77
+ ];
78
+ export function getDefaultRoadmap() {
79
+ return {
80
+ plan: DEFAULT_PLAN_TASKS.map((t) => ({ ...t })),
81
+ deploy: DEFAULT_DEPLOY_TASKS.map((t) => ({ ...t })),
82
+ };
83
+ }
84
+ // ── Dynamic Service Tasks ──────────────────────────────────────────────
85
+ const DEPLOY_RELEVANT_CATEGORIES = [
86
+ 'databases',
87
+ 'services',
88
+ 'infrastructure',
89
+ ];
90
+ function slugify(name) {
91
+ return name
92
+ .toLowerCase()
93
+ .replace(/[^a-z0-9]+/g, '-')
94
+ .replace(/^-|-$/g, '');
95
+ }
96
+ /**
97
+ * Generate deploy tasks from tech stack items that have envKeys.
98
+ * These tasks appear dynamically based on what services the project uses.
99
+ */
100
+ export function generateServiceDeployTasks(projectRoot) {
101
+ try {
102
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
103
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
104
+ const techStack = config.techStack;
105
+ if (!techStack || typeof techStack !== 'object')
106
+ return [];
107
+ // Services with dedicated predefined deploy tasks are excluded from dynamic generation
108
+ const DEDICATED_TASK_SERVICES = new Set(['supabase']);
109
+ const tasks = [];
110
+ for (const category of DEPLOY_RELEVANT_CATEGORIES) {
111
+ const items = techStack[category];
112
+ if (!Array.isArray(items))
113
+ continue;
114
+ for (const item of items) {
115
+ if (!item.envKeys ||
116
+ !Array.isArray(item.envKeys) ||
117
+ item.envKeys.length === 0)
118
+ continue;
119
+ const slug = slugify(item.name);
120
+ if (DEDICATED_TASK_SERVICES.has(slug))
121
+ continue;
122
+ tasks.push({
123
+ id: `deploy-svc-${slug}`,
124
+ label: `Set up ${item.name}`,
125
+ completed: false,
126
+ autoDetect: `svc-envkeys-${slug}`,
127
+ serviceRef: { name: item.name, category },
128
+ });
129
+ }
130
+ }
131
+ return tasks;
132
+ }
133
+ catch {
134
+ return [];
135
+ }
136
+ }
137
+ // ── Read / Write ────────────────────────────────────────────────────────
138
+ function roadmapPath(projectRoot) {
139
+ return path.join(projectRoot, '.codeyam', 'roadmap.json');
140
+ }
141
+ /**
142
+ * Read roadmap data from `.codeyam/roadmap.json`.
143
+ * Returns default tasks if the file is missing or invalid.
144
+ * Merges dynamic service tasks from the tech stack into the deploy list.
145
+ */
146
+ export function readRoadmap(projectRoot) {
147
+ let data;
148
+ try {
149
+ const raw = fs.readFileSync(roadmapPath(projectRoot), 'utf8');
150
+ data = sanitizeRoadmapData(JSON.parse(raw));
151
+ }
152
+ catch {
153
+ data = getDefaultRoadmap();
154
+ }
155
+ // Merge dynamic service tasks from tech stack
156
+ const serviceTasks = generateServiceDeployTasks(projectRoot);
157
+ if (serviceTasks.length > 0) {
158
+ data.deploy = mergeServiceTasks(data.deploy, serviceTasks);
159
+ }
160
+ return data;
161
+ }
162
+ /**
163
+ * Merge dynamic service tasks into the deploy list.
164
+ * Inserts new tasks after deploy-hosting and before deploy-env-vars.
165
+ * Preserves existing tasks (and their completion status) by ID.
166
+ * Removes stale service tasks no longer generated from tech stack.
167
+ */
168
+ function mergeServiceTasks(existing, serviceTasks) {
169
+ const serviceIds = new Set(serviceTasks.map((t) => t.id));
170
+ const existingIds = new Set(existing.map((t) => t.id));
171
+ // Remove stale service tasks (deploy-svc-* IDs no longer in tech stack)
172
+ const filtered = existing.filter((t) => !t.id.startsWith('deploy-svc-') || serviceIds.has(t.id));
173
+ // Find insertion point: after deploy-database (or deploy-hosting as fallback)
174
+ const dbIdx = filtered.findIndex((t) => t.id === 'deploy-database');
175
+ const hostingIdx = filtered.findIndex((t) => t.id === 'deploy-hosting');
176
+ const insertAt = dbIdx >= 0 ? dbIdx + 1 : hostingIdx >= 0 ? hostingIdx + 1 : 0;
177
+ // Add only new service tasks (preserve existing ones with their status)
178
+ const newTasks = serviceTasks.filter((t) => !existingIds.has(t.id));
179
+ if (newTasks.length > 0) {
180
+ filtered.splice(insertAt, 0, ...newTasks);
181
+ }
182
+ // Patch serviceRef onto existing service tasks that may lack it (from old roadmap.json)
183
+ const serviceMap = new Map(serviceTasks.map((t) => [t.id, t]));
184
+ return filtered.map((t) => {
185
+ const svc = serviceMap.get(t.id);
186
+ if (svc && !t.serviceRef) {
187
+ return { ...t, serviceRef: svc.serviceRef, autoDetect: svc.autoDetect };
188
+ }
189
+ return t;
190
+ });
191
+ }
192
+ /**
193
+ * Write roadmap data to `.codeyam/roadmap.json`.
194
+ */
195
+ export function writeRoadmap(projectRoot, data) {
196
+ const filePath = roadmapPath(projectRoot);
197
+ const dir = path.dirname(filePath);
198
+ if (!fs.existsSync(dir)) {
199
+ fs.mkdirSync(dir, { recursive: true });
200
+ }
201
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
202
+ }
203
+ // ── Sanitization ────────────────────────────────────────────────────────
204
+ function sanitizeTodo(raw) {
205
+ if (typeof raw !== 'object' || raw === null)
206
+ return null;
207
+ const obj = raw;
208
+ if (typeof obj.id !== 'string' || typeof obj.label !== 'string')
209
+ return null;
210
+ return {
211
+ id: obj.id,
212
+ label: obj.label,
213
+ completed: obj.completed === true,
214
+ ...(typeof obj.completedAt === 'string'
215
+ ? { completedAt: obj.completedAt }
216
+ : {}),
217
+ ...(typeof obj.autoDetect === 'string'
218
+ ? { autoDetect: obj.autoDetect }
219
+ : {}),
220
+ ...(obj.userCreated === true ? { userCreated: true } : {}),
221
+ ...(obj.serviceRef &&
222
+ typeof obj.serviceRef === 'object' &&
223
+ typeof obj.serviceRef.name === 'string' &&
224
+ typeof obj.serviceRef.category === 'string'
225
+ ? {
226
+ serviceRef: {
227
+ name: obj.serviceRef.name,
228
+ category: obj.serviceRef
229
+ .category,
230
+ },
231
+ }
232
+ : {}),
233
+ };
234
+ }
235
+ /**
236
+ * Merge missing default tasks into an existing list.
237
+ * New defaults are inserted at the position they appear in the defaults list,
238
+ * preserving the user's existing order and any user-created tasks.
239
+ */
240
+ function mergeDefaults(existing, defaults) {
241
+ const existingIds = new Set(existing.map((t) => t.id));
242
+ const missing = defaults.filter((d) => !existingIds.has(d.id));
243
+ if (missing.length === 0)
244
+ return existing;
245
+ const merged = [...existing];
246
+ for (const task of missing) {
247
+ // Insert after the previous default task's position (or at start)
248
+ const defaultIdx = defaults.indexOf(task);
249
+ const prevDefault = defaults[defaultIdx - 1];
250
+ if (prevDefault) {
251
+ const insertAfter = merged.findIndex((t) => t.id === prevDefault.id);
252
+ merged.splice(insertAfter + 1, 0, { ...task });
253
+ }
254
+ else {
255
+ merged.unshift({ ...task });
256
+ }
257
+ }
258
+ return merged;
259
+ }
260
+ /**
261
+ * Copy autoDetect keys from defaults onto existing tasks that match by ID
262
+ * but are missing the key. Handles migration when autoDetect is added to
263
+ * a previously keyless default task.
264
+ */
265
+ function patchAutoDetectKeys(existing, defaults) {
266
+ const defaultMap = new Map(defaults.map((d) => [d.id, d]));
267
+ return existing.map((task) => {
268
+ const def = defaultMap.get(task.id);
269
+ if (def?.autoDetect && !task.autoDetect) {
270
+ return { ...task, autoDetect: def.autoDetect };
271
+ }
272
+ return task;
273
+ });
274
+ }
275
+ /**
276
+ * Defensively parse raw JSON into RoadmapData.
277
+ * Invalid entries are dropped; missing sections get defaults.
278
+ * New default tasks added in code updates are merged into existing data.
279
+ */
280
+ export function sanitizeRoadmapData(raw) {
281
+ const defaults = getDefaultRoadmap();
282
+ if (typeof raw !== 'object' || raw === null)
283
+ return defaults;
284
+ const obj = raw;
285
+ const plan = patchAutoDetectKeys(Array.isArray(obj.plan)
286
+ ? mergeDefaults(obj.plan.map(sanitizeTodo).filter(Boolean), defaults.plan)
287
+ : defaults.plan, defaults.plan);
288
+ const deploy = patchAutoDetectKeys(Array.isArray(obj.deploy)
289
+ ? mergeDefaults(obj.deploy.map(sanitizeTodo).filter(Boolean), defaults.deploy)
290
+ : defaults.deploy, defaults.deploy);
291
+ return { plan, deploy };
292
+ }
293
+ const AUTO_DETECT_CHECKERS = {
294
+ 'project-title-exists': (projectRoot) => {
295
+ try {
296
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
297
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
298
+ return !!config.projectTitle;
299
+ }
300
+ catch {
301
+ return false;
302
+ }
303
+ },
304
+ 'tech-stack-configured': (projectRoot) => {
305
+ try {
306
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
307
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
308
+ // Check if techStack has any populated categories
309
+ if (config.techStack && typeof config.techStack === 'object') {
310
+ const hasItems = Object.values(config.techStack).some((cat) => Array.isArray(cat) && cat.length > 0);
311
+ if (hasItems)
312
+ return true;
313
+ }
314
+ // Fallback: webapps configured still counts
315
+ return Array.isArray(config.webapps) && config.webapps.length > 0;
316
+ }
317
+ catch {
318
+ return false;
319
+ }
320
+ },
321
+ // Keep old checker for backward compat with existing roadmap.json files
322
+ 'webapps-configured': (projectRoot) => {
323
+ try {
324
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
325
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
326
+ return Array.isArray(config.webapps) && config.webapps.length > 0;
327
+ }
328
+ catch {
329
+ return false;
330
+ }
331
+ },
332
+ 'design-system-exists': (projectRoot) => {
333
+ return fs.existsSync(path.join(projectRoot, '.codeyam', 'design-system.md'));
334
+ },
335
+ 'screen-sizes-configured': (projectRoot) => {
336
+ try {
337
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
338
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
339
+ return (config.screenSizes != null && Object.keys(config.screenSizes).length > 0);
340
+ }
341
+ catch {
342
+ return false;
343
+ }
344
+ },
345
+ 'github-configured': (projectRoot) => {
346
+ try {
347
+ if (!fs.existsSync(path.join(projectRoot, '.git')))
348
+ return false;
349
+ const remote = execSync('git remote get-url origin', {
350
+ cwd: projectRoot,
351
+ encoding: 'utf8',
352
+ stdio: ['pipe', 'pipe', 'pipe'],
353
+ }).trim();
354
+ return remote.includes('github.com');
355
+ }
356
+ catch {
357
+ return false;
358
+ }
359
+ },
360
+ 'database-configured': (projectRoot) => {
361
+ try {
362
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
363
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
364
+ if (!config.database?.provider)
365
+ return false;
366
+ if (config.database.provider === 'supabase') {
367
+ if (!config.database.supabaseProjectRef)
368
+ return false;
369
+ const envVars = config.environmentVariables || [];
370
+ const configured = new Set();
371
+ for (const v of envVars) {
372
+ const k = v.key || v.name;
373
+ if (k && v.value)
374
+ configured.add(k);
375
+ }
376
+ return (configured.has('NEXT_PUBLIC_SUPABASE_URL') &&
377
+ configured.has('NEXT_PUBLIC_SUPABASE_ANON_KEY') &&
378
+ configured.has('DATABASE_URL'));
379
+ }
380
+ return true;
381
+ }
382
+ catch {
383
+ return false;
384
+ }
385
+ },
386
+ 'hosting-configured': (projectRoot) => {
387
+ try {
388
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
389
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
390
+ if (!config.hosting?.provider)
391
+ return false;
392
+ // For Vercel: also require a linked project
393
+ if (config.hosting.provider === 'vercel') {
394
+ return !!config.hosting.vercelProjectId;
395
+ }
396
+ return true;
397
+ }
398
+ catch {
399
+ return false;
400
+ }
401
+ },
402
+ 'scenarios-exist': (projectRoot) => {
403
+ const scenariosDir = path.join(projectRoot, '.codeyam', 'editor-scenarios');
404
+ try {
405
+ const files = fs.readdirSync(scenariosDir);
406
+ return files.some((f) => f.endsWith('.json'));
407
+ }
408
+ catch {
409
+ return false;
410
+ }
411
+ },
412
+ 'env-vars-configured': (projectRoot) => {
413
+ try {
414
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
415
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
416
+ const allEnvKeys = collectAllEnvKeys(config.techStack);
417
+ if (allEnvKeys.length === 0)
418
+ return true; // No env vars needed
419
+ const configured = getConfiguredEnvKeys(config.environmentVariables);
420
+ return allEnvKeys.every((key) => configured.has(key));
421
+ }
422
+ catch {
423
+ return false;
424
+ }
425
+ },
426
+ };
427
+ /** Collect all envKeys from deploy-relevant tech stack categories. */
428
+ function collectAllEnvKeys(techStack) {
429
+ if (!techStack || typeof techStack !== 'object')
430
+ return [];
431
+ const keys = [];
432
+ for (const cat of DEPLOY_RELEVANT_CATEGORIES) {
433
+ const items = techStack[cat];
434
+ if (!Array.isArray(items))
435
+ continue;
436
+ for (const item of items) {
437
+ if (item.envKeys && Array.isArray(item.envKeys)) {
438
+ keys.push(...item.envKeys);
439
+ }
440
+ }
441
+ }
442
+ return keys;
443
+ }
444
+ /** Get set of configured env var keys (supports both "key" and "name" fields). */
445
+ function getConfiguredEnvKeys(envVars) {
446
+ const configured = new Set();
447
+ if (!Array.isArray(envVars))
448
+ return configured;
449
+ for (const v of envVars) {
450
+ const k = v.key || v.name;
451
+ if (k && v.value)
452
+ configured.add(k);
453
+ }
454
+ return configured;
455
+ }
456
+ /**
457
+ * Dynamic checker for `svc-envkeys-{slug}` auto-detect keys.
458
+ * Finds the matching tech stack item and checks whether all its envKeys
459
+ * have corresponding values in environmentVariables.
460
+ */
461
+ function checkServiceEnvKeys(projectRoot, autoDetectKey) {
462
+ try {
463
+ const slug = autoDetectKey.replace('svc-envkeys-', '');
464
+ const configPath = path.join(projectRoot, '.codeyam', 'config.json');
465
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
466
+ const techStack = config.techStack;
467
+ if (!techStack)
468
+ return false;
469
+ // Find the matching service item by slug
470
+ for (const cat of DEPLOY_RELEVANT_CATEGORIES) {
471
+ const items = techStack[cat];
472
+ if (!Array.isArray(items))
473
+ continue;
474
+ for (const item of items) {
475
+ if (slugify(item.name) === slug) {
476
+ if (!item.envKeys ||
477
+ !Array.isArray(item.envKeys) ||
478
+ item.envKeys.length === 0)
479
+ return false;
480
+ const configured = getConfiguredEnvKeys(config.environmentVariables);
481
+ return item.envKeys.every((k) => configured.has(k));
482
+ }
483
+ }
484
+ }
485
+ return false;
486
+ }
487
+ catch {
488
+ return false;
489
+ }
490
+ }
491
+ /**
492
+ * Evaluate auto-detect conditions for a list of todos.
493
+ * Returns a new array with updated completion status for auto-detect tasks.
494
+ * Manually completed tasks (no autoDetect key) are left unchanged.
495
+ * Supports dynamic `svc-envkeys-*` keys for service credential checking.
496
+ */
497
+ export function checkAutoDetections(projectRoot, todos) {
498
+ return todos.map((todo) => {
499
+ if (!todo.autoDetect)
500
+ return todo;
501
+ // Try static checker first, then dynamic svc-envkeys-* checker
502
+ let detected;
503
+ const checker = AUTO_DETECT_CHECKERS[todo.autoDetect];
504
+ if (checker) {
505
+ detected = checker(projectRoot);
506
+ }
507
+ else if (todo.autoDetect.startsWith('svc-envkeys-')) {
508
+ detected = checkServiceEnvKeys(projectRoot, todo.autoDetect);
509
+ }
510
+ else {
511
+ return todo;
512
+ }
513
+ if (detected && !todo.completed) {
514
+ return {
515
+ ...todo,
516
+ completed: true,
517
+ completedAt: new Date().toISOString(),
518
+ };
519
+ }
520
+ if (!detected && todo.completed && !todo.userCreated) {
521
+ // Auto-detected task was uncompleted (e.g. design system file deleted)
522
+ const { completedAt, ...rest } = todo;
523
+ return { ...rest, completed: false };
524
+ }
525
+ return todo;
526
+ });
527
+ }
528
+ /**
529
+ * Count journal entries from the journal index file.
530
+ */
531
+ export function countJournalEntries(projectRoot) {
532
+ try {
533
+ const indexPath = path.join(projectRoot, '.codeyam', 'journal', 'index.json');
534
+ const raw = fs.readFileSync(indexPath, 'utf8');
535
+ const index = JSON.parse(raw);
536
+ return Array.isArray(index.entries) ? index.entries.length : 0;
537
+ }
538
+ catch {
539
+ return 0;
540
+ }
541
+ }
542
+ /**
543
+ * Return the most recent journal entries (newest first).
544
+ * Includes full details for expandable roadmap display.
545
+ */
546
+ export function getRecentJournalEntries(projectRoot, limit = 3) {
547
+ try {
548
+ const indexPath = path.join(projectRoot, '.codeyam', 'journal', 'index.json');
549
+ const raw = fs.readFileSync(indexPath, 'utf8');
550
+ const index = JSON.parse(raw);
551
+ if (!Array.isArray(index.entries))
552
+ return [];
553
+ return index.entries
554
+ .slice()
555
+ .reverse()
556
+ .slice(0, limit)
557
+ .map((e) => ({
558
+ title: e.title,
559
+ time: e.time,
560
+ type: e.type || 'feature',
561
+ description: e.description || undefined,
562
+ userPrompt: e.userPrompt || undefined,
563
+ scenarioScreenshots: e.scenarioScreenshots || undefined,
564
+ modifiedFiles: e.modifiedFiles || undefined,
565
+ entityChangeStatus: e.entityChangeStatus || undefined,
566
+ commitSha: e.commitSha || null,
567
+ commitMessage: e.commitMessage || null,
568
+ }));
569
+ }
570
+ catch {
571
+ return [];
572
+ }
573
+ }
574
+ //# sourceMappingURL=editorRoadmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorRoadmap.js","sourceRoot":"","sources":["../../../../src/utils/editorRoadmap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAsBzC,2EAA2E;AAE3E,MAAM,kBAAkB,GAAkB;IACxC;QACE,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,qCAAqC;QAC5C,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,sBAAsB;KACnC;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,mBAAmB;QAC1B,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,uBAAuB;KACpC;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,sBAAsB;KACnC;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,wBAAwB;QAC/B,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,yBAAyB;KACtC;IACD;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,yBAAyB;QAChC,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,mBAAmB;KAChC;CACF,CAAC;AAEF,MAAM,oBAAoB,GAAkB;IAC1C;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,yBAAyB;QAChC,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,oBAAoB;KACjC;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,wBAAwB;QAC/B,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,qBAAqB;KAClC;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,iCAAiC;QACxC,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,qBAAqB;KAClC;IACD;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,uBAAuB;QAC9B,SAAS,EAAE,KAAK;KACjB;IACD;QACE,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,yBAAyB;QAChC,SAAS,EAAE,KAAK;KACjB;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,0EAA0E;AAE1E,MAAM,0BAA0B,GAAG;IACjC,WAAW;IACX,UAAU;IACV,gBAAgB;CACR,CAAC;AAEX,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAE3D,uFAAuF;QACvF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAEtD,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,MAAM,QAAQ,IAAI,0BAA0B,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IACE,CAAC,IAAI,CAAC,OAAO;oBACb,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;oBAEzB,SAAS;gBACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAChD,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,cAAc,IAAI,EAAE;oBACxB,KAAK,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE;oBAC5B,SAAS,EAAE,KAAK;oBAChB,UAAU,EAAE,eAAe,IAAI,EAAE;oBACjC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,WAAW,CAAC,WAAmB;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,IAAI,IAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,8CAA8C;IAC9C,MAAM,YAAY,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IAC7D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,QAAuB,EACvB,YAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvD,wEAAwE;IACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC/D,CAAC;IAEF,8EAA8E;IAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,CAAC;IACxE,MAAM,QAAQ,GACZ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhE,wEAAwE;IACxE,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,wFAAwF;IACxF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;YACzB,OAAO,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,IAAiB;IACjE,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,2EAA2E;AAE3E,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE7E,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,SAAS,KAAK,IAAI;QACjC,GAAG,CAAC,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;YACrC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;YAClC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;YACpC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE;YAChC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,GAAG,CAAC,UAAU;YAClB,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;YAClC,OAAQ,GAAG,CAAC,UAAsC,CAAC,IAAI,KAAK,QAAQ;YACpE,OAAQ,GAAG,CAAC,UAAsC,CAAC,QAAQ,KAAK,QAAQ;YACtE,CAAC,CAAC;gBACE,UAAU,EAAE;oBACV,IAAI,EAAG,GAAG,CAAC,UAAsC,CAAC,IAAc;oBAChE,QAAQ,EAAG,GAAG,CAAC,UAAsC;yBAClD,QAAkB;iBACtB;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CACpB,QAAuB,EACvB,QAAuB;IAEvB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE1C,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,kEAAkE;QAClE,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAC1B,QAAuB,EACvB,QAAuB;IAEvB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,GAAG,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IAE7D,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,MAAM,IAAI,GAAG,mBAAmB,CAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB,CAAC,CAAC,aAAa,CACX,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAkB,EAC3D,QAAQ,CAAC,IAAI,CACd;QACH,CAAC,CAAC,QAAQ,CAAC,IAAI,EACjB,QAAQ,CAAC,IAAI,CACd,CAAC;IAEF,MAAM,MAAM,GAAG,mBAAmB,CAChC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QACvB,CAAC,CAAC,aAAa,CACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAkB,EAC7D,QAAQ,CAAC,MAAM,CAChB;QACH,CAAC,CAAC,QAAQ,CAAC,MAAM,EACnB,QAAQ,CAAC,MAAM,CAChB,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAMD,MAAM,oBAAoB,GAAsC;IAC9D,sBAAsB,EAAE,CAAC,WAAW,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,uBAAuB,EAAE,CAAC,WAAW,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAE/D,kDAAkD;YAClD,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CACnD,CAAC,GAAY,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CACvD,CAAC;gBACF,IAAI,QAAQ;oBAAE,OAAO,IAAI,CAAC;YAC5B,CAAC;YAED,4CAA4C;YAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,oBAAoB,EAAE,CAAC,WAAW,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/D,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,sBAAsB,EAAE,CAAC,WAAW,EAAE,EAAE;QACtC,OAAO,EAAE,CAAC,UAAU,CAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,kBAAkB,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,yBAAyB,EAAE,CAAC,WAAW,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/D,OAAO,CACL,MAAM,CAAC,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CACzE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,mBAAmB,EAAE,CAAC,WAAW,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,2BAA2B,EAAE;gBACnD,GAAG,EAAE,WAAW;gBAChB,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,qBAAqB,EAAE,CAAC,WAAW,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAE7C,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB;oBAAE,OAAO,KAAK,CAAC;gBACtD,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;gBAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;gBACrC,KAAK,MAAM,CAAC,IAAI,OAId,EAAE,CAAC;oBACH,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC;oBAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK;wBAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACtC,CAAC;gBACD,OAAO,CACL,UAAU,CAAC,GAAG,CAAC,0BAA0B,CAAC;oBAC1C,UAAU,CAAC,GAAG,CAAC,+BAA+B,CAAC;oBAC/C,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAC/B,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,oBAAoB,EAAE,CAAC,WAAW,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAE5C,4CAA4C;YAC5C,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACzC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;YAC1C,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,iBAAiB,EAAE,CAAC,WAAW,EAAE,EAAE;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,qBAAqB,EAAE,CAAC,WAAW,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,qBAAqB;YAC/D,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACrE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC;AAEF,sEAAsE;AACtE,SAAS,iBAAiB,CACxB,SAA8C;IAE9C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAI,SAAqC,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,SAAS,oBAAoB,CAC3B,OAA2E;IAE3E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,UAAU,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAC1B,WAAmB,EACnB,aAAqB;IAErB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAE7B,yCAAyC;QACzC,KAAK,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBAChC,IACE,CAAC,IAAI,CAAC,OAAO;wBACb,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;wBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;wBAEzB,OAAO,KAAK,CAAC;oBACf,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;oBACrE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,KAAoB;IAEpB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAElC,+DAA+D;QAC/D,IAAI,QAAiB,CAAC;QACtB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACtD,QAAQ,GAAG,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO;gBACL,GAAG,IAAI;gBACP,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrD,uEAAuE;YACvE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YACtC,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,WAAW,EACX,UAAU,EACV,SAAS,EACT,YAAY,CACb,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAqBD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,QAAgB,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,WAAW,EACX,UAAU,EACV,SAAS,EACT,YAAY,CACb,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAE7C,OAAO,KAAK,CAAC,OAAO;aACjB,KAAK,EAAE;aACP,OAAO,EAAE;aACT,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CACF,CAAC,CAWA,EAAE,EAAE,CAAC,CAAC;YACL,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS;YACzB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;YACvC,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,SAAS;YACrC,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,IAAI,SAAS;YACvD,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,SAAS;YAC3C,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,IAAI,SAAS;YACrD,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;YAC9B,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI;SACvC,CAAC,CACH,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -217,6 +217,16 @@ export function readDefaultScreenSize(codeyamRoot) {
217
217
  try {
218
218
  const configPath = path.join(codeyamRoot, '.codeyam', 'config.json');
219
219
  const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
220
+ // New format: screenSizes entry with `default: true`
221
+ if (config.screenSizes && typeof config.screenSizes === 'object') {
222
+ for (const entry of Object.values(config.screenSizes)) {
223
+ const s = entry;
224
+ if (s.default && s.width && s.height) {
225
+ return { width: s.width, height: s.height };
226
+ }
227
+ }
228
+ }
229
+ // Old format: explicit defaultScreenSize field
220
230
  if (config.defaultScreenSize?.width && config.defaultScreenSize?.height) {
221
231
  return {
222
232
  width: config.defaultScreenSize.width,