@codeyam/codeyam-cli 0.1.27 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/analyzer-template/.build-info.json +6 -6
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +1 -1
  4. package/analyzer-template/packages/aws/package.json +5 -5
  5. package/codeyam-cli/src/commands/editor.js +232 -5
  6. package/codeyam-cli/src/commands/editor.js.map +1 -1
  7. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +136 -0
  8. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
  9. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js +398 -0
  10. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js.map +1 -0
  11. package/codeyam-cli/src/utils/designSystemShowcase.js +810 -0
  12. package/codeyam-cli/src/utils/designSystemShowcase.js.map +1 -0
  13. package/codeyam-cli/src/utils/editorAudit.js +6 -1
  14. package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
  15. package/codeyam-cli/src/utils/editorRoadmap.js +301 -0
  16. package/codeyam-cli/src/utils/editorRoadmap.js.map +1 -0
  17. package/codeyam-cli/src/utils/editorScenarios.js +10 -0
  18. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
  19. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +1 -0
  20. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -1
  21. package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CLe80MMu.js → CopyButton-DTBZZfSk.js} +1 -1
  22. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-Crt_KN_U.js → EntityItem-BxclONWq.js} +1 -1
  23. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CD7lGABo.js → EntityTypeIcon-BsnEOJZ_.js} +1 -1
  24. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CgTNOhnu.js → InlineSpinner-ByaELMbv.js} +1 -1
  25. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-DtYTSPL2.js → InteractivePreview-6WjVfhxX.js} +2 -2
  26. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-D3s1MFkb.js → LibraryFunctionPreview-ChX-Hp7W.js} +1 -1
  27. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CM5zg40N.js → LogViewer-C-9zQdXg.js} +1 -1
  28. package/codeyam-cli/src/webserver/build/client/assets/{MiniClaudeChat-CQENLSrF.js → MiniClaudeChat-BusrvT2F.js} +1 -1
  29. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-C2PLkej3.js → ReportIssueModal-DQsceHVv.js} +1 -1
  30. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DanvyBPb.js → SafeScreenshot-DThcm_9M.js} +1 -1
  31. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CefgqbCr.js → ScenarioViewer-Cl4oOA3A.js} +1 -1
  32. package/codeyam-cli/src/webserver/build/client/assets/{Spinner-Bc8BG-Lw.js → Spinner-CIil5-gb.js} +1 -1
  33. package/codeyam-cli/src/webserver/build/client/assets/{ViewportInspectBar-BA_Ry-rs.js → ViewportInspectBar-BqkA9zyZ.js} +1 -1
  34. package/codeyam-cli/src/webserver/build/client/assets/{_index-C1YkzTAV.js → _index-DnOgyseQ.js} +1 -1
  35. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-yH46LLUz.js → activity.(_tab)-DqM9hbNE.js} +1 -1
  36. package/codeyam-cli/src/webserver/build/client/assets/{addon-web-links-CHx25PAe.js → addon-web-links-C58dYPwR.js} +1 -1
  37. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-Bg3e7q4S.js → agent-transcripts-B8NCeOrm.js} +1 -1
  38. package/codeyam-cli/src/webserver/build/client/assets/api.editor-roadmap-l0sNRNKZ.js +1 -0
  39. package/codeyam-cli/src/webserver/build/client/assets/{book-open-CL-lMgHh.js → book-open-BFSIqZgO.js} +1 -1
  40. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-GmAjGS9-.js → chevron-down-B9fDzFVh.js} +1 -1
  41. package/codeyam-cli/src/webserver/build/client/assets/chunk-UVKPFVEO-Bmq2apuh.js +43 -0
  42. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DFcQkN5j.js → circle-check-DLPObLUx.js} +1 -1
  43. package/codeyam-cli/src/webserver/build/client/assets/{copy-C6iF61Xs.js → copy-DXEmO0TD.js} +1 -1
  44. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-4ImjHTVC.js → createLucideIcon-BwyFiRot.js} +1 -1
  45. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-CRepiabR.js → dev.empty-iRhRIFlp.js} +1 -1
  46. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-BZPBzV73.js +1 -0
  47. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-785deXbZ.js +147 -0
  48. package/codeyam-cli/src/webserver/build/client/assets/{editorPreview-CluPkvXJ.js → editorPreview-C6fEYHrh.js} +6 -6
  49. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-DYJRGiDI.js → entity._sha._-Ce1s4OQ1.js} +1 -1
  50. 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
  51. 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
  52. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-DxfhekTZ.js → entity._sha_.create-scenario-BTcpgIpC.js} +1 -1
  53. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CRXJWmpB.js → entity._sha_.edit._scenarioId-D_O_ajfZ.js} +1 -1
  54. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-SuW9syRS.js → entry.client-j1Vi0bco.js} +6 -6
  55. package/codeyam-cli/src/webserver/build/client/assets/{files-D-xGrg29.js → files-kuny2Q_s.js} +1 -1
  56. package/codeyam-cli/src/webserver/build/client/assets/{git-Bq_fbXP5.js → git-DgCZPMie.js} +1 -1
  57. package/codeyam-cli/src/webserver/build/client/assets/globals-Bt7TsgQz.css +1 -0
  58. package/codeyam-cli/src/webserver/build/client/assets/{index-Bp1l4hSv.js → index-BliGSSpl.js} +1 -1
  59. package/codeyam-cli/src/webserver/build/client/assets/{index-DE3jI_dv.js → index-SqjQKTdH.js} +1 -1
  60. package/codeyam-cli/src/webserver/build/client/assets/{index-CWV9XZiG.js → index-vyrZD2g4.js} +1 -1
  61. package/codeyam-cli/src/webserver/build/client/assets/{labs-B_IX45ih.js → labs-c3yLxSEp.js} +1 -1
  62. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-De-7qQ2u.js → loader-circle-D-q28GLF.js} +1 -1
  63. package/codeyam-cli/src/webserver/build/client/assets/manifest-3d8cde80.js +1 -0
  64. package/codeyam-cli/src/webserver/build/client/assets/{memory-Cx2xEx7s.js → memory-CEWIUC4t.js} +1 -1
  65. package/codeyam-cli/src/webserver/build/client/assets/{pause-CFxEKL1u.js → pause-BP6fitdh.js} +1 -1
  66. package/codeyam-cli/src/webserver/build/client/assets/{root-dKFRTYcy.js → root-CVjDQwjJ.js} +6 -6
  67. package/codeyam-cli/src/webserver/build/client/assets/{search-BdBb5aqc.js → search-BooqacKS.js} +1 -1
  68. package/codeyam-cli/src/webserver/build/client/assets/{settings-DdE-Untf.js → settings-BM0nbryO.js} +1 -1
  69. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DSCdE99u.js → simulations-ovy6FjRY.js} +1 -1
  70. package/codeyam-cli/src/webserver/build/client/assets/{terminal-CrplD4b1.js → terminal-DHemCJIs.js} +1 -1
  71. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DqJ0j69l.js → triangle-alert-D87ekDl8.js} +1 -1
  72. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-DhXHbEjP.js → useCustomSizes-Dk0Tciqg.js} +1 -1
  73. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-D9QZKaLJ.js → useLastLogLine-C8QvIe05.js} +1 -1
  74. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-Cy5Qg_UR.js → useReportContext-jkCytuYz.js} +1 -1
  75. package/codeyam-cli/src/webserver/build/client/assets/{useToast-5HR2j9ZE.js → useToast-BgqkixU9.js} +1 -1
  76. package/codeyam-cli/src/webserver/build/server/assets/{analysisRunner-OLsM110H.js → analysisRunner-CTJYMVFP.js} +1 -1
  77. package/codeyam-cli/src/webserver/build/server/assets/{index-WHdB6WTN.js → index-CCth4Hgw.js} +1 -1
  78. package/codeyam-cli/src/webserver/build/server/assets/{init-DbSiZoE6.js → init-UXl-3vVp.js} +1 -1
  79. package/codeyam-cli/src/webserver/build/server/assets/{server-build-DZbLY6O_.js → server-build-DSW2mE30.js} +198 -147
  80. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  81. package/codeyam-cli/src/webserver/build-info.json +5 -5
  82. package/codeyam-cli/src/webserver/server.js +67 -0
  83. package/codeyam-cli/src/webserver/server.js.map +1 -1
  84. package/codeyam-cli/src/webserver/terminalServer.js +21 -0
  85. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  86. package/codeyam-cli/templates/editor-step-hook.py +4 -4
  87. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +36 -1
  88. package/codeyam-cli/templates/expo-react-native/app.json +11 -0
  89. package/codeyam-cli/templates/expo-react-native/package.json +1 -0
  90. package/package.json +1 -1
  91. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-BAdwhyCx.js +0 -43
  92. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-Gbk_i5Js.js +0 -1
  93. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-CRxPi2BB.js +0 -96
  94. package/codeyam-cli/src/webserver/build/client/assets/globals-BsGHu8WX.css +0 -1
  95. package/codeyam-cli/src/webserver/build/client/assets/manifest-9032538f.js +0 -1
@@ -0,0 +1,398 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { readRoadmap, writeRoadmap, getDefaultRoadmap, sanitizeRoadmapData, checkAutoDetections, countJournalEntries, getRecentJournalEntries, } from "../editorRoadmap.js";
5
+ let tmpDir;
6
+ beforeEach(() => {
7
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'roadmap-test-'));
8
+ fs.mkdirSync(path.join(tmpDir, '.codeyam'), { recursive: true });
9
+ });
10
+ afterEach(() => {
11
+ fs.rmSync(tmpDir, { recursive: true, force: true });
12
+ });
13
+ // ── getDefaultRoadmap ───────────────────────────────────────────────────
14
+ describe('getDefaultRoadmap', () => {
15
+ it('returns plan and deploy arrays with predefined tasks', () => {
16
+ const defaults = getDefaultRoadmap();
17
+ expect(defaults.plan.length).toBeGreaterThanOrEqual(5);
18
+ expect(defaults.deploy.length).toBeGreaterThanOrEqual(5);
19
+ expect(defaults.plan.every((t) => !t.completed)).toBe(true);
20
+ expect(defaults.deploy.every((t) => !t.completed)).toBe(true);
21
+ });
22
+ it('returns fresh copies on each call', () => {
23
+ const a = getDefaultRoadmap();
24
+ const b = getDefaultRoadmap();
25
+ a.plan[0].completed = true;
26
+ expect(b.plan[0].completed).toBe(false);
27
+ });
28
+ });
29
+ // ── readRoadmap / writeRoadmap ──────────────────────────────────────────
30
+ describe('readRoadmap', () => {
31
+ it('returns defaults when file does not exist', () => {
32
+ const data = readRoadmap(tmpDir);
33
+ expect(data.plan.length).toBeGreaterThan(0);
34
+ expect(data.deploy.length).toBeGreaterThan(0);
35
+ });
36
+ it('reads back written data', () => {
37
+ const custom = getDefaultRoadmap();
38
+ custom.plan[0].completed = true;
39
+ custom.plan[0].completedAt = '2026-03-30T00:00:00Z';
40
+ writeRoadmap(tmpDir, custom);
41
+ const read = readRoadmap(tmpDir);
42
+ expect(read.plan[0].completed).toBe(true);
43
+ expect(read.plan[0].completedAt).toBe('2026-03-30T00:00:00Z');
44
+ });
45
+ it('returns defaults for malformed JSON', () => {
46
+ fs.writeFileSync(path.join(tmpDir, '.codeyam', 'roadmap.json'), 'not json');
47
+ const data = readRoadmap(tmpDir);
48
+ expect(data.plan.length).toBeGreaterThan(0);
49
+ });
50
+ });
51
+ describe('writeRoadmap', () => {
52
+ it('creates .codeyam directory if missing', () => {
53
+ const freshDir = fs.mkdtempSync(path.join(os.tmpdir(), 'roadmap-fresh-'));
54
+ fs.mkdirSync(path.join(freshDir, '.codeyam'), { recursive: true });
55
+ writeRoadmap(freshDir, getDefaultRoadmap());
56
+ expect(fs.existsSync(path.join(freshDir, '.codeyam', 'roadmap.json'))).toBe(true);
57
+ fs.rmSync(freshDir, { recursive: true, force: true });
58
+ });
59
+ });
60
+ // ── sanitizeRoadmapData ─────────────────────────────────────────────────
61
+ describe('sanitizeRoadmapData', () => {
62
+ it('returns defaults for null input', () => {
63
+ const result = sanitizeRoadmapData(null);
64
+ expect(result.plan.length).toBeGreaterThan(0);
65
+ });
66
+ it('returns defaults for non-object input', () => {
67
+ const result = sanitizeRoadmapData('hello');
68
+ expect(result.plan.length).toBeGreaterThan(0);
69
+ });
70
+ it('drops invalid entries from arrays', () => {
71
+ const result = sanitizeRoadmapData({
72
+ plan: [
73
+ { id: 'valid', label: 'Valid task', completed: false },
74
+ { noId: true },
75
+ null,
76
+ 42,
77
+ ],
78
+ deploy: [],
79
+ });
80
+ // The custom valid entry is preserved; default tasks are merged in
81
+ expect(result.plan.find((t) => t.id === 'valid')).toBeDefined();
82
+ expect(result.plan.find((t) => t.id === 'valid').label).toBe('Valid task');
83
+ });
84
+ it('defaults completed to false when missing', () => {
85
+ const result = sanitizeRoadmapData({
86
+ plan: [{ id: 'a', label: 'A' }],
87
+ deploy: [],
88
+ });
89
+ expect(result.plan[0].completed).toBe(false);
90
+ });
91
+ it('preserves optional fields when valid', () => {
92
+ const result = sanitizeRoadmapData({
93
+ plan: [
94
+ {
95
+ id: 'a',
96
+ label: 'A',
97
+ completed: true,
98
+ completedAt: '2026-01-01',
99
+ autoDetect: 'test-key',
100
+ userCreated: true,
101
+ },
102
+ ],
103
+ deploy: [],
104
+ });
105
+ const task = result.plan.find((t) => t.id === 'a');
106
+ expect(task.completedAt).toBe('2026-01-01');
107
+ expect(task.autoDetect).toBe('test-key');
108
+ expect(task.userCreated).toBe(true);
109
+ });
110
+ it('uses defaults when plan/deploy are not arrays', () => {
111
+ const result = sanitizeRoadmapData({ plan: 'not array', deploy: 123 });
112
+ expect(result.plan.length).toBeGreaterThan(0);
113
+ expect(result.deploy.length).toBeGreaterThan(0);
114
+ });
115
+ });
116
+ // ── checkAutoDetections ─────────────────────────────────────────────────
117
+ describe('checkAutoDetections', () => {
118
+ it('marks project-title-exists when config has projectTitle', () => {
119
+ fs.writeFileSync(path.join(tmpDir, '.codeyam', 'config.json'), JSON.stringify({ projectTitle: 'My App' }));
120
+ const todos = [
121
+ {
122
+ id: 'plan-project-name',
123
+ label: 'Define project name',
124
+ completed: false,
125
+ autoDetect: 'project-title-exists',
126
+ },
127
+ ];
128
+ const result = checkAutoDetections(tmpDir, todos);
129
+ expect(result[0].completed).toBe(true);
130
+ expect(result[0].completedAt).toBeDefined();
131
+ });
132
+ it('marks design-system-exists when file present', () => {
133
+ fs.writeFileSync(path.join(tmpDir, '.codeyam', 'design-system.md'), '# Design');
134
+ const todos = [
135
+ {
136
+ id: 'plan-design-system',
137
+ label: 'Create design system',
138
+ completed: false,
139
+ autoDetect: 'design-system-exists',
140
+ },
141
+ ];
142
+ const result = checkAutoDetections(tmpDir, todos);
143
+ expect(result[0].completed).toBe(true);
144
+ });
145
+ it('does not mark design-system-exists when file missing', () => {
146
+ const todos = [
147
+ {
148
+ id: 'plan-design-system',
149
+ label: 'Create design system',
150
+ completed: false,
151
+ autoDetect: 'design-system-exists',
152
+ },
153
+ ];
154
+ const result = checkAutoDetections(tmpDir, todos);
155
+ expect(result[0].completed).toBe(false);
156
+ });
157
+ it('marks screen-sizes-configured when config has screen sizes', () => {
158
+ fs.writeFileSync(path.join(tmpDir, '.codeyam', 'config.json'), JSON.stringify({
159
+ screenSizes: { Desktop: { width: 1280, height: 720 } },
160
+ }));
161
+ const todos = [
162
+ {
163
+ id: 'plan-screen-sizes',
164
+ label: 'Configure screen sizes',
165
+ completed: false,
166
+ autoDetect: 'screen-sizes-configured',
167
+ },
168
+ ];
169
+ const result = checkAutoDetections(tmpDir, todos);
170
+ expect(result[0].completed).toBe(true);
171
+ });
172
+ it('marks scenarios-exist when editor-scenarios has JSON files', () => {
173
+ const scenariosDir = path.join(tmpDir, '.codeyam', 'editor-scenarios');
174
+ fs.mkdirSync(scenariosDir, { recursive: true });
175
+ fs.writeFileSync(path.join(scenariosDir, 'test.json'), '{}');
176
+ const todos = [
177
+ {
178
+ id: 'plan-initial-scenarios',
179
+ label: 'Create initial scenarios',
180
+ completed: false,
181
+ autoDetect: 'scenarios-exist',
182
+ },
183
+ ];
184
+ const result = checkAutoDetections(tmpDir, todos);
185
+ expect(result[0].completed).toBe(true);
186
+ });
187
+ it('leaves tasks without autoDetect unchanged', () => {
188
+ const todos = [
189
+ {
190
+ id: 'manual',
191
+ label: 'Manual task',
192
+ completed: false,
193
+ },
194
+ ];
195
+ const result = checkAutoDetections(tmpDir, todos);
196
+ expect(result[0].completed).toBe(false);
197
+ });
198
+ it('un-completes auto-detect tasks when condition no longer met', () => {
199
+ const todos = [
200
+ {
201
+ id: 'plan-design-system',
202
+ label: 'Create design system',
203
+ completed: true,
204
+ completedAt: '2026-01-01',
205
+ autoDetect: 'design-system-exists',
206
+ },
207
+ ];
208
+ // No design-system.md file
209
+ const result = checkAutoDetections(tmpDir, todos);
210
+ expect(result[0].completed).toBe(false);
211
+ expect(result[0].completedAt).toBeUndefined();
212
+ });
213
+ it('handles unknown autoDetect keys gracefully', () => {
214
+ const todos = [
215
+ {
216
+ id: 'custom',
217
+ label: 'Custom',
218
+ completed: false,
219
+ autoDetect: 'unknown-checker',
220
+ },
221
+ ];
222
+ const result = checkAutoDetections(tmpDir, todos);
223
+ expect(result[0].completed).toBe(false);
224
+ });
225
+ it('marks tech-stack-configured when techStack has populated categories', () => {
226
+ fs.writeFileSync(path.join(tmpDir, '.codeyam', 'config.json'), JSON.stringify({
227
+ techStack: {
228
+ languages: [{ name: 'TypeScript', version: '5' }],
229
+ frameworks: [{ name: 'Next.js', version: '15' }],
230
+ },
231
+ }));
232
+ const todos = [
233
+ {
234
+ id: 'plan-tech-stack',
235
+ label: 'Review tech stack',
236
+ completed: false,
237
+ autoDetect: 'tech-stack-configured',
238
+ },
239
+ ];
240
+ const result = checkAutoDetections(tmpDir, todos);
241
+ expect(result[0].completed).toBe(true);
242
+ });
243
+ it('marks tech-stack-configured via webapps fallback', () => {
244
+ fs.writeFileSync(path.join(tmpDir, '.codeyam', 'config.json'), JSON.stringify({
245
+ webapps: [{ path: '.', framework: 'Next' }],
246
+ }));
247
+ const todos = [
248
+ {
249
+ id: 'plan-tech-stack',
250
+ label: 'Review tech stack',
251
+ completed: false,
252
+ autoDetect: 'tech-stack-configured',
253
+ },
254
+ ];
255
+ const result = checkAutoDetections(tmpDir, todos);
256
+ expect(result[0].completed).toBe(true);
257
+ });
258
+ it('does not mark tech-stack-configured when neither techStack nor webapps exist', () => {
259
+ fs.writeFileSync(path.join(tmpDir, '.codeyam', 'config.json'), JSON.stringify({}));
260
+ const todos = [
261
+ {
262
+ id: 'plan-tech-stack',
263
+ label: 'Review tech stack',
264
+ completed: false,
265
+ autoDetect: 'tech-stack-configured',
266
+ },
267
+ ];
268
+ const result = checkAutoDetections(tmpDir, todos);
269
+ expect(result[0].completed).toBe(false);
270
+ });
271
+ it('does not mark tech-stack-configured for empty categories', () => {
272
+ fs.writeFileSync(path.join(tmpDir, '.codeyam', 'config.json'), JSON.stringify({
273
+ techStack: { languages: [], frameworks: [] },
274
+ }));
275
+ const todos = [
276
+ {
277
+ id: 'plan-tech-stack',
278
+ label: 'Review tech stack',
279
+ completed: false,
280
+ autoDetect: 'tech-stack-configured',
281
+ },
282
+ ];
283
+ const result = checkAutoDetections(tmpDir, todos);
284
+ expect(result[0].completed).toBe(false);
285
+ });
286
+ });
287
+ // ── countJournalEntries ─────────────────────────────────────────────────
288
+ describe('countJournalEntries', () => {
289
+ it('returns 0 when journal does not exist', () => {
290
+ expect(countJournalEntries(tmpDir)).toBe(0);
291
+ });
292
+ it('counts entries from journal index', () => {
293
+ const journalDir = path.join(tmpDir, '.codeyam', 'journal');
294
+ fs.mkdirSync(journalDir, { recursive: true });
295
+ fs.writeFileSync(path.join(journalDir, 'index.json'), JSON.stringify({
296
+ entries: [
297
+ { date: '2026-03-29', time: '10:00', title: 'Entry 1' },
298
+ { date: '2026-03-30', time: '11:00', title: 'Entry 2' },
299
+ { date: '2026-03-30', time: '12:00', title: 'Entry 3' },
300
+ ],
301
+ }));
302
+ expect(countJournalEntries(tmpDir)).toBe(3);
303
+ });
304
+ it('returns 0 for malformed journal', () => {
305
+ const journalDir = path.join(tmpDir, '.codeyam', 'journal');
306
+ fs.mkdirSync(journalDir, { recursive: true });
307
+ fs.writeFileSync(path.join(journalDir, 'index.json'), 'not json');
308
+ expect(countJournalEntries(tmpDir)).toBe(0);
309
+ });
310
+ });
311
+ // ── getRecentJournalEntries ─────────────────────────────────────────────
312
+ describe('getRecentJournalEntries', () => {
313
+ it('returns empty array when journal does not exist', () => {
314
+ expect(getRecentJournalEntries(tmpDir)).toEqual([]);
315
+ });
316
+ it('returns the 3 most recent entries (newest first)', () => {
317
+ const journalDir = path.join(tmpDir, '.codeyam', 'journal');
318
+ fs.mkdirSync(journalDir, { recursive: true });
319
+ fs.writeFileSync(path.join(journalDir, 'index.json'), JSON.stringify({
320
+ entries: [
321
+ { date: '2026-03-28', time: '2026-03-28T09:00:00Z', title: 'First' },
322
+ { date: '2026-03-29', time: '2026-03-29T10:00:00Z', title: 'Second' },
323
+ { date: '2026-03-29', time: '2026-03-29T14:00:00Z', title: 'Third' },
324
+ { date: '2026-03-30', time: '2026-03-30T11:00:00Z', title: 'Fourth' },
325
+ { date: '2026-03-30', time: '2026-03-30T15:00:00Z', title: 'Fifth' },
326
+ ],
327
+ }));
328
+ const result = getRecentJournalEntries(tmpDir, 3);
329
+ expect(result).toHaveLength(3);
330
+ // Newest first
331
+ expect(result[0].title).toBe('Fifth');
332
+ expect(result[1].title).toBe('Fourth');
333
+ expect(result[2].title).toBe('Third');
334
+ });
335
+ it('returns all entries when fewer than limit', () => {
336
+ const journalDir = path.join(tmpDir, '.codeyam', 'journal');
337
+ fs.mkdirSync(journalDir, { recursive: true });
338
+ fs.writeFileSync(path.join(journalDir, 'index.json'), JSON.stringify({
339
+ entries: [
340
+ {
341
+ date: '2026-03-30',
342
+ time: '2026-03-30T10:00:00Z',
343
+ title: 'Only one',
344
+ },
345
+ ],
346
+ }));
347
+ const result = getRecentJournalEntries(tmpDir, 3);
348
+ expect(result).toHaveLength(1);
349
+ expect(result[0].title).toBe('Only one');
350
+ });
351
+ it('returns empty array for malformed journal', () => {
352
+ const journalDir = path.join(tmpDir, '.codeyam', 'journal');
353
+ fs.mkdirSync(journalDir, { recursive: true });
354
+ fs.writeFileSync(path.join(journalDir, 'index.json'), 'not json');
355
+ expect(getRecentJournalEntries(tmpDir)).toEqual([]);
356
+ });
357
+ it('includes title, time, and type fields in returned entries', () => {
358
+ const journalDir = path.join(tmpDir, '.codeyam', 'journal');
359
+ fs.mkdirSync(journalDir, { recursive: true });
360
+ fs.writeFileSync(path.join(journalDir, 'index.json'), JSON.stringify({
361
+ entries: [
362
+ {
363
+ date: '2026-03-30',
364
+ time: '2026-03-30T10:00:00Z',
365
+ title: 'Add checkout page',
366
+ type: 'feature',
367
+ description: 'Built the checkout flow',
368
+ scenarios: [],
369
+ screenshot: null,
370
+ commitSha: 'abc123',
371
+ commitMessage: 'Add checkout page',
372
+ },
373
+ ],
374
+ }));
375
+ const result = getRecentJournalEntries(tmpDir, 3);
376
+ expect(result[0]).toEqual({
377
+ title: 'Add checkout page',
378
+ time: '2026-03-30T10:00:00Z',
379
+ type: 'feature',
380
+ });
381
+ });
382
+ it('defaults limit to 3', () => {
383
+ const journalDir = path.join(tmpDir, '.codeyam', 'journal');
384
+ fs.mkdirSync(journalDir, { recursive: true });
385
+ fs.writeFileSync(path.join(journalDir, 'index.json'), JSON.stringify({
386
+ entries: [
387
+ { date: '2026-03-28', time: '2026-03-28T09:00:00Z', title: 'A' },
388
+ { date: '2026-03-29', time: '2026-03-29T10:00:00Z', title: 'B' },
389
+ { date: '2026-03-29', time: '2026-03-29T14:00:00Z', title: 'C' },
390
+ { date: '2026-03-30', time: '2026-03-30T11:00:00Z', title: 'D' },
391
+ { date: '2026-03-30', time: '2026-03-30T15:00:00Z', title: 'E' },
392
+ ],
393
+ }));
394
+ const result = getRecentJournalEntries(tmpDir);
395
+ expect(result).toHaveLength(3);
396
+ });
397
+ });
398
+ //# sourceMappingURL=editorRoadmap.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorRoadmap.test.js","sourceRoot":"","sources":["../../../../../src/utils/__tests__/editorRoadmap.test.ts"],"names":[],"mappings":"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"}