@auto-engineer/component-implementor-react 1.98.0 → 1.100.0

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 (233) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +6 -6
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +92 -0
  5. package/dist/src/commands/implement-component.d.ts +19 -0
  6. package/dist/src/commands/implement-component.d.ts.map +1 -1
  7. package/dist/src/commands/implement-component.js +109 -30
  8. package/dist/src/commands/implement-component.js.map +1 -1
  9. package/dist/src/commands/implement-component.test.js +259 -69
  10. package/dist/src/commands/implement-component.test.js.map +1 -1
  11. package/dist/src/extract-exports.d.ts +6 -0
  12. package/dist/src/extract-exports.d.ts.map +1 -0
  13. package/dist/src/extract-exports.js +46 -0
  14. package/dist/src/extract-exports.js.map +1 -0
  15. package/dist/src/generate-story-deterministic.d.ts +30 -0
  16. package/dist/src/generate-story-deterministic.d.ts.map +1 -0
  17. package/dist/src/generate-story-deterministic.js +229 -0
  18. package/dist/src/generate-story-deterministic.js.map +1 -0
  19. package/dist/src/index.d.ts +4 -0
  20. package/dist/src/index.d.ts.map +1 -1
  21. package/dist/src/index.js +3 -0
  22. package/dist/src/index.js.map +1 -1
  23. package/dist/src/pipeline/run-pipeline.d.ts +69 -0
  24. package/dist/src/pipeline/run-pipeline.d.ts.map +1 -0
  25. package/dist/src/pipeline/run-pipeline.js +78 -0
  26. package/dist/src/pipeline/run-pipeline.js.map +1 -0
  27. package/dist/src/pipeline/run-pipeline.test.d.ts +2 -0
  28. package/dist/src/pipeline/run-pipeline.test.d.ts.map +1 -0
  29. package/dist/src/pipeline/run-pipeline.test.js +247 -0
  30. package/dist/src/pipeline/run-pipeline.test.js.map +1 -0
  31. package/dist/src/pipeline/steps/generate-component.d.ts +4 -0
  32. package/dist/src/pipeline/steps/generate-component.d.ts.map +1 -0
  33. package/dist/src/pipeline/steps/generate-component.js +50 -0
  34. package/dist/src/pipeline/steps/generate-component.js.map +1 -0
  35. package/dist/src/pipeline/steps/generate-component.test.d.ts.map +1 -0
  36. package/dist/src/pipeline/steps/generate-component.test.js +106 -0
  37. package/dist/src/pipeline/steps/generate-component.test.js.map +1 -0
  38. package/dist/src/pipeline/steps/generate-story.d.ts +3 -0
  39. package/dist/src/pipeline/steps/generate-story.d.ts.map +1 -0
  40. package/dist/src/pipeline/steps/generate-story.js +14 -0
  41. package/dist/src/pipeline/steps/generate-story.js.map +1 -0
  42. package/dist/src/pipeline/steps/generate-story.test.d.ts.map +1 -0
  43. package/dist/src/pipeline/steps/generate-story.test.js +41 -0
  44. package/dist/src/pipeline/steps/generate-story.test.js.map +1 -0
  45. package/dist/src/pipeline/steps/generate-test.d.ts +4 -0
  46. package/dist/src/pipeline/steps/generate-test.d.ts.map +1 -0
  47. package/dist/src/pipeline/steps/generate-test.js +19 -0
  48. package/dist/src/pipeline/steps/generate-test.js.map +1 -0
  49. package/dist/src/pipeline/steps/generate-test.test.d.ts.map +1 -0
  50. package/dist/src/pipeline/steps/generate-test.test.js +60 -0
  51. package/dist/src/pipeline/steps/generate-test.test.js.map +1 -0
  52. package/dist/src/pipeline/steps/lint-fix-loop.d.ts +4 -0
  53. package/dist/src/pipeline/steps/lint-fix-loop.d.ts.map +1 -0
  54. package/dist/src/pipeline/steps/lint-fix-loop.js +45 -0
  55. package/dist/src/pipeline/steps/lint-fix-loop.js.map +1 -0
  56. package/dist/src/pipeline/steps/lint-fix-loop.test.d.ts +2 -0
  57. package/dist/src/pipeline/steps/lint-fix-loop.test.d.ts.map +1 -0
  58. package/dist/src/pipeline/steps/lint-fix-loop.test.js +119 -0
  59. package/dist/src/pipeline/steps/lint-fix-loop.test.js.map +1 -0
  60. package/dist/src/pipeline/steps/story-fix-loop.d.ts +4 -0
  61. package/dist/src/pipeline/steps/story-fix-loop.d.ts.map +1 -0
  62. package/dist/src/pipeline/steps/story-fix-loop.js +34 -0
  63. package/dist/src/pipeline/steps/story-fix-loop.js.map +1 -0
  64. package/dist/src/pipeline/steps/story-fix-loop.test.d.ts +2 -0
  65. package/dist/src/pipeline/steps/story-fix-loop.test.d.ts.map +1 -0
  66. package/dist/src/pipeline/steps/story-fix-loop.test.js +94 -0
  67. package/dist/src/pipeline/steps/story-fix-loop.test.js.map +1 -0
  68. package/dist/src/pipeline/steps/storybook-test.d.ts +3 -0
  69. package/dist/src/pipeline/steps/storybook-test.d.ts.map +1 -0
  70. package/dist/src/pipeline/steps/storybook-test.js +22 -0
  71. package/dist/src/pipeline/steps/storybook-test.js.map +1 -0
  72. package/dist/src/pipeline/steps/storybook-test.test.d.ts +2 -0
  73. package/dist/src/pipeline/steps/storybook-test.test.d.ts.map +1 -0
  74. package/dist/src/pipeline/steps/storybook-test.test.js +66 -0
  75. package/dist/src/pipeline/steps/storybook-test.test.js.map +1 -0
  76. package/dist/src/pipeline/steps/test-fix-loop.d.ts +4 -0
  77. package/dist/src/pipeline/steps/test-fix-loop.d.ts.map +1 -0
  78. package/dist/src/pipeline/steps/test-fix-loop.js +44 -0
  79. package/dist/src/pipeline/steps/test-fix-loop.js.map +1 -0
  80. package/dist/src/pipeline/steps/test-fix-loop.test.d.ts +2 -0
  81. package/dist/src/pipeline/steps/test-fix-loop.test.d.ts.map +1 -0
  82. package/dist/src/pipeline/steps/test-fix-loop.test.js +168 -0
  83. package/dist/src/pipeline/steps/test-fix-loop.test.js.map +1 -0
  84. package/dist/src/pipeline/steps/type-fix-loop.d.ts +4 -0
  85. package/dist/src/pipeline/steps/type-fix-loop.d.ts.map +1 -0
  86. package/dist/src/pipeline/steps/type-fix-loop.js +43 -0
  87. package/dist/src/pipeline/steps/type-fix-loop.js.map +1 -0
  88. package/dist/src/pipeline/steps/type-fix-loop.test.d.ts +2 -0
  89. package/dist/src/pipeline/steps/type-fix-loop.test.d.ts.map +1 -0
  90. package/dist/src/pipeline/steps/type-fix-loop.test.js +112 -0
  91. package/dist/src/pipeline/steps/type-fix-loop.test.js.map +1 -0
  92. package/dist/src/pipeline/steps/visual-test.d.ts +3 -0
  93. package/dist/src/pipeline/steps/visual-test.d.ts.map +1 -0
  94. package/dist/src/pipeline/steps/visual-test.js +4 -0
  95. package/dist/src/pipeline/steps/visual-test.js.map +1 -0
  96. package/dist/src/pipeline/steps/visual-test.test.d.ts +2 -0
  97. package/dist/src/pipeline/steps/visual-test.test.d.ts.map +1 -0
  98. package/dist/src/pipeline/steps/visual-test.test.js +9 -0
  99. package/dist/src/pipeline/steps/visual-test.test.js.map +1 -0
  100. package/dist/src/project-context.d.ts +10 -0
  101. package/dist/src/project-context.d.ts.map +1 -0
  102. package/dist/src/project-context.js +178 -0
  103. package/dist/src/project-context.js.map +1 -0
  104. package/dist/src/prompt.d.ts +39 -7
  105. package/dist/src/prompt.d.ts.map +1 -1
  106. package/dist/src/prompt.js +233 -23
  107. package/dist/src/prompt.js.map +1 -1
  108. package/dist/src/prompt.test.js +154 -9
  109. package/dist/src/prompt.test.js.map +1 -1
  110. package/dist/src/scaffold.d.ts +49 -0
  111. package/dist/src/scaffold.d.ts.map +1 -0
  112. package/dist/src/scaffold.js +208 -0
  113. package/dist/src/scaffold.js.map +1 -0
  114. package/dist/src/tools/lint-runner.d.ts +7 -0
  115. package/dist/src/tools/lint-runner.d.ts.map +1 -0
  116. package/dist/src/tools/lint-runner.js +48 -0
  117. package/dist/src/tools/lint-runner.js.map +1 -0
  118. package/dist/src/tools/lint-runner.test.d.ts +2 -0
  119. package/dist/src/tools/lint-runner.test.d.ts.map +1 -0
  120. package/dist/src/tools/lint-runner.test.js +90 -0
  121. package/dist/src/tools/lint-runner.test.js.map +1 -0
  122. package/dist/src/tools/storybook-runner.d.ts +6 -0
  123. package/dist/src/tools/storybook-runner.d.ts.map +1 -0
  124. package/dist/src/tools/storybook-runner.js +25 -0
  125. package/dist/src/tools/storybook-runner.js.map +1 -0
  126. package/dist/src/tools/storybook-runner.test.d.ts +2 -0
  127. package/dist/src/tools/storybook-runner.test.d.ts.map +1 -0
  128. package/dist/src/tools/storybook-runner.test.js +43 -0
  129. package/dist/src/tools/storybook-runner.test.js.map +1 -0
  130. package/dist/src/tools/test-runner.d.ts +9 -0
  131. package/dist/src/tools/test-runner.d.ts.map +1 -0
  132. package/dist/src/tools/test-runner.js +74 -0
  133. package/dist/src/tools/test-runner.js.map +1 -0
  134. package/dist/src/tools/test-runner.test.d.ts +2 -0
  135. package/dist/src/tools/test-runner.test.d.ts.map +1 -0
  136. package/dist/src/tools/test-runner.test.js +177 -0
  137. package/dist/src/tools/test-runner.test.js.map +1 -0
  138. package/dist/src/tools/type-checker.d.ts +6 -0
  139. package/dist/src/tools/type-checker.d.ts.map +1 -0
  140. package/dist/src/tools/type-checker.js +36 -0
  141. package/dist/src/tools/type-checker.js.map +1 -0
  142. package/dist/src/tools/type-checker.test.d.ts +2 -0
  143. package/dist/src/tools/type-checker.test.d.ts.map +1 -0
  144. package/dist/src/tools/type-checker.test.js +96 -0
  145. package/dist/src/tools/type-checker.test.js.map +1 -0
  146. package/dist/tsconfig.tsbuildinfo +1 -1
  147. package/inputs/model-a/spec-deltas.json +1460 -0
  148. package/inputs/model-b/spec-deltas.json +1424 -0
  149. package/inputs/model-c/spec-deltas.json +1432 -0
  150. package/inputs/model-d/spec-deltas.json +967 -0
  151. package/inputs/model-e/spec-deltas.json +2292 -0
  152. package/ketchup-plan.md +43 -8
  153. package/package.json +3 -3
  154. package/scoring-heuristic.md +138 -0
  155. package/scripts/improve.ts +23 -18
  156. package/src/commands/implement-component.test.ts +309 -76
  157. package/src/commands/implement-component.ts +155 -31
  158. package/src/extract-exports.ts +53 -0
  159. package/src/generate-story-deterministic.ts +267 -0
  160. package/src/index.ts +12 -0
  161. package/src/pipeline/run-pipeline.test.ts +292 -0
  162. package/src/pipeline/run-pipeline.ts +160 -0
  163. package/src/pipeline/steps/generate-component.test.ts +130 -0
  164. package/src/pipeline/steps/generate-component.ts +60 -0
  165. package/src/pipeline/steps/generate-story.test.ts +54 -0
  166. package/src/pipeline/steps/generate-story.ts +17 -0
  167. package/src/pipeline/steps/generate-test.test.ts +75 -0
  168. package/src/pipeline/steps/generate-test.ts +25 -0
  169. package/src/pipeline/steps/lint-fix-loop.test.ts +155 -0
  170. package/src/pipeline/steps/lint-fix-loop.ts +59 -0
  171. package/src/pipeline/steps/story-fix-loop.test.ts +123 -0
  172. package/src/pipeline/steps/story-fix-loop.ts +47 -0
  173. package/src/pipeline/steps/storybook-test.test.ts +82 -0
  174. package/src/pipeline/steps/storybook-test.ts +27 -0
  175. package/src/pipeline/steps/test-fix-loop.test.ts +201 -0
  176. package/src/pipeline/steps/test-fix-loop.ts +56 -0
  177. package/src/pipeline/steps/type-fix-loop.test.ts +145 -0
  178. package/src/pipeline/steps/type-fix-loop.ts +55 -0
  179. package/src/pipeline/steps/visual-test.test.ts +10 -0
  180. package/src/pipeline/steps/visual-test.ts +5 -0
  181. package/src/project-context.ts +205 -0
  182. package/src/prompt.test.ts +174 -8
  183. package/src/prompt.ts +301 -23
  184. package/src/scaffold.ts +281 -0
  185. package/src/tools/lint-runner.test.ts +112 -0
  186. package/src/tools/lint-runner.ts +52 -0
  187. package/src/tools/storybook-runner.test.ts +53 -0
  188. package/src/tools/storybook-runner.ts +29 -0
  189. package/src/tools/test-runner.test.ts +213 -0
  190. package/src/tools/test-runner.ts +84 -0
  191. package/src/tools/type-checker.test.ts +120 -0
  192. package/src/tools/type-checker.ts +42 -0
  193. package/vitest.config.ts +9 -1
  194. package/dist/src/generate-component.d.ts +0 -4
  195. package/dist/src/generate-component.d.ts.map +0 -1
  196. package/dist/src/generate-component.js +0 -14
  197. package/dist/src/generate-component.js.map +0 -1
  198. package/dist/src/generate-component.test.d.ts.map +0 -1
  199. package/dist/src/generate-component.test.js +0 -73
  200. package/dist/src/generate-component.test.js.map +0 -1
  201. package/dist/src/generate-story.d.ts +0 -4
  202. package/dist/src/generate-story.d.ts.map +0 -1
  203. package/dist/src/generate-story.js +0 -14
  204. package/dist/src/generate-story.js.map +0 -1
  205. package/dist/src/generate-story.test.d.ts.map +0 -1
  206. package/dist/src/generate-story.test.js +0 -58
  207. package/dist/src/generate-story.test.js.map +0 -1
  208. package/dist/src/generate-test.d.ts +0 -4
  209. package/dist/src/generate-test.d.ts.map +0 -1
  210. package/dist/src/generate-test.js +0 -14
  211. package/dist/src/generate-test.js.map +0 -1
  212. package/dist/src/generate-test.test.d.ts.map +0 -1
  213. package/dist/src/generate-test.test.js +0 -77
  214. package/dist/src/generate-test.test.js.map +0 -1
  215. package/dist/src/reconcile.d.ts +0 -8
  216. package/dist/src/reconcile.d.ts.map +0 -1
  217. package/dist/src/reconcile.js +0 -18
  218. package/dist/src/reconcile.js.map +0 -1
  219. package/dist/src/reconcile.test.d.ts +0 -2
  220. package/dist/src/reconcile.test.d.ts.map +0 -1
  221. package/dist/src/reconcile.test.js +0 -108
  222. package/dist/src/reconcile.test.js.map +0 -1
  223. package/src/generate-component.test.ts +0 -89
  224. package/src/generate-component.ts +0 -16
  225. package/src/generate-story.test.ts +0 -71
  226. package/src/generate-story.ts +0 -16
  227. package/src/generate-test.test.ts +0 -93
  228. package/src/generate-test.ts +0 -16
  229. package/src/reconcile.test.ts +0 -127
  230. package/src/reconcile.ts +0 -27
  231. /package/dist/src/{generate-component.test.d.ts → pipeline/steps/generate-component.test.d.ts} +0 -0
  232. /package/dist/src/{generate-story.test.d.ts → pipeline/steps/generate-story.test.d.ts} +0 -0
  233. /package/dist/src/{generate-test.test.d.ts → pipeline/steps/generate-test.test.d.ts} +0 -0
@@ -1,22 +1,28 @@
1
1
  import { afterEach, describe, expect, it, vi } from 'vitest';
2
- vi.mock('ai', () => ({
3
- generateText: vi.fn(),
4
- }));
5
2
  vi.mock('@auto-engineer/model-factory', () => ({
6
3
  createModelFromEnv: vi.fn(() => 'mock-model'),
7
4
  }));
8
5
  vi.mock('node:fs/promises', () => ({
9
6
  readFile: vi.fn(),
10
- writeFile: vi.fn(),
11
7
  mkdir: vi.fn(),
12
8
  }));
13
9
  vi.mock('node:fs', () => ({
14
10
  existsSync: vi.fn(),
15
11
  }));
12
+ vi.mock('../project-context', () => ({
13
+ buildFullProjectSection: vi.fn().mockResolvedValue(''),
14
+ }));
15
+ vi.mock('../pipeline/run-pipeline', () => ({
16
+ buildPipelineSteps: vi.fn(() => []),
17
+ runPipeline: vi.fn(),
18
+ }));
16
19
  import { existsSync } from 'node:fs';
17
- import { readFile, writeFile } from 'node:fs/promises';
18
- import { generateText } from 'ai';
20
+ import { readFile } from 'node:fs/promises';
21
+ import { runPipeline } from '../pipeline/run-pipeline.js';
19
22
  import { commandHandler, handleImplementComponent } from './implement-component.js';
23
+ afterEach(() => {
24
+ vi.clearAllMocks();
25
+ });
20
26
  function makeCommand(overrides = {}) {
21
27
  return {
22
28
  type: 'ImplementComponent',
@@ -34,6 +40,7 @@ function makeCommand(overrides = {}) {
34
40
  styling: ['uses primary class'],
35
41
  storybookPath: 'src/components/ui/MyButton.stories.tsx',
36
42
  files: { create: ['src/components/ui/MyButton.tsx'] },
43
+ composes: [],
37
44
  },
38
45
  },
39
46
  ...overrides,
@@ -47,19 +54,13 @@ describe('implement-component', () => {
47
54
  vi.clearAllMocks();
48
55
  });
49
56
  describe('handleImplementComponent', () => {
50
- it('generates 3 files via parallel agents + reconciliation and returns ComponentImplemented', async () => {
51
- const mockGenerateText = vi.mocked(generateText);
52
- // Phase 1: 3 parallel calls (component, test, story)
53
- mockGenerateText
54
- .mockResolvedValueOnce({ text: 'component file code' })
55
- .mockResolvedValueOnce({ text: 'test file code' })
56
- .mockResolvedValueOnce({ text: 'story file code' })
57
- // Phase 2: reconciliation
58
- .mockResolvedValueOnce({
59
- text: '```tsx\nreconciled component\n```\n\n```tsx\nreconciled story\n```',
60
- });
57
+ it('runs pipeline and returns ComponentImplemented on success', async () => {
61
58
  vi.mocked(existsSync).mockReturnValue(false);
62
- vi.mocked(writeFile).mockResolvedValue(undefined);
59
+ vi.mocked(runPipeline).mockResolvedValue({
60
+ success: true,
61
+ llmCalls: 4,
62
+ fixIterations: 1,
63
+ });
63
64
  const result = await handleImplementComponent(makeCommand());
64
65
  expect(result).toEqual({
65
66
  type: 'ComponentImplemented',
@@ -78,21 +79,36 @@ describe('implement-component', () => {
78
79
  requestId: 'req-1',
79
80
  correlationId: 'cor-1',
80
81
  });
81
- expect(mockGenerateText).toHaveBeenCalledTimes(4);
82
- expect(writeFile).toHaveBeenCalledTimes(3);
82
+ expect(runPipeline).toHaveBeenCalledTimes(1);
83
83
  });
84
- it('reads existing component when modifying', async () => {
85
- const mockGenerateText = vi.mocked(generateText);
86
- mockGenerateText
87
- .mockResolvedValueOnce({ text: 'component code' })
88
- .mockResolvedValueOnce({ text: 'test code' })
89
- .mockResolvedValueOnce({ text: 'story code' })
90
- .mockResolvedValueOnce({
91
- text: '```tsx\nrc\n```\n```tsx\nrs\n```',
84
+ it('returns ComponentImplementationFailed when pipeline fails', async () => {
85
+ vi.mocked(existsSync).mockReturnValue(false);
86
+ vi.mocked(runPipeline).mockResolvedValue({
87
+ success: false,
88
+ error: 'Step "Type Fix Loop" failed: errors remain',
89
+ llmCalls: 5,
90
+ fixIterations: 3,
91
+ });
92
+ const result = await handleImplementComponent(makeCommand());
93
+ expect(result).toEqual({
94
+ type: 'ComponentImplementationFailed',
95
+ data: {
96
+ error: 'Step "Type Fix Loop" failed: errors remain',
97
+ name: 'MyButton',
98
+ },
99
+ timestamp: expect.any(Date),
100
+ requestId: 'req-1',
101
+ correlationId: 'cor-1',
92
102
  });
103
+ });
104
+ it('reads existing component when modifying', async () => {
93
105
  vi.mocked(existsSync).mockReturnValue(true);
94
106
  vi.mocked(readFile).mockResolvedValue('existing component code');
95
- vi.mocked(writeFile).mockResolvedValue(undefined);
107
+ vi.mocked(runPipeline).mockResolvedValue({
108
+ success: true,
109
+ llmCalls: 3,
110
+ fixIterations: 0,
111
+ });
96
112
  const command = makeCommand({
97
113
  job: {
98
114
  id: 'job_2',
@@ -106,21 +122,25 @@ describe('implement-component', () => {
106
122
  styling: [],
107
123
  storybookPath: 'src/components/ui/MyButton.stories.tsx',
108
124
  files: { modify: ['src/components/ui/MyButton.tsx'] },
125
+ composes: [],
109
126
  },
110
127
  },
111
128
  });
112
129
  await handleImplementComponent(command);
113
130
  expect(readFile).toHaveBeenCalledWith('/project/client/src/components/ui/MyButton.tsx', 'utf-8');
131
+ expect(runPipeline).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
132
+ existingComponent: 'existing component code',
133
+ isModify: true,
134
+ }));
114
135
  });
115
- it('returns ComponentImplementationFailed on error', async () => {
116
- const mockGenerateText = vi.mocked(generateText);
117
- mockGenerateText.mockRejectedValue(new Error('AI service down'));
136
+ it('returns ComponentImplementationFailed on unexpected error', async () => {
118
137
  vi.mocked(existsSync).mockReturnValue(false);
138
+ vi.mocked(runPipeline).mockRejectedValue(new Error('Unexpected crash'));
119
139
  const result = await handleImplementComponent(makeCommand());
120
140
  expect(result).toEqual({
121
141
  type: 'ComponentImplementationFailed',
122
142
  data: {
123
- error: 'AI service down',
143
+ error: 'Unexpected crash',
124
144
  name: 'MyButton',
125
145
  },
126
146
  timestamp: expect.any(Date),
@@ -129,20 +149,12 @@ describe('implement-component', () => {
129
149
  });
130
150
  });
131
151
  it('handles payload with undefined spec delta fields without crashing', async () => {
132
- const mockGenerateText = vi.mocked(generateText);
133
- mockGenerateText
134
- .mockResolvedValueOnce({ text: 'component file code' })
135
- .mockResolvedValueOnce({ text: 'test file code' })
136
- .mockResolvedValueOnce({ text: 'story file code' })
137
- .mockResolvedValueOnce({
138
- text: '```tsx\nreconciled component\n```\n\n```tsx\nreconciled story\n```',
139
- });
140
152
  vi.mocked(existsSync).mockReturnValue(false);
141
- vi.mocked(writeFile).mockResolvedValue(undefined);
142
- // Simulate production payload where the pipeline omits spec delta fields
143
- // (e.g. "Resource-preview", "Plant-fields-page" components).
144
- // At runtime JSON deserialization can produce undefined for these fields,
145
- // bypassing TypeScript's compile-time guarantees.
153
+ vi.mocked(runPipeline).mockResolvedValue({
154
+ success: true,
155
+ llmCalls: 4,
156
+ fixIterations: 1,
157
+ });
146
158
  const command = {
147
159
  type: 'ImplementComponent',
148
160
  data: {
@@ -165,25 +177,16 @@ describe('implement-component', () => {
165
177
  requestId: 'req-1',
166
178
  correlationId: 'cor-1',
167
179
  };
168
- // Cast through unknown to bypass TypeScript — this is what happens at runtime
169
- // when the pipeline sends a payload with missing fields
170
180
  const result = await handleImplementComponent(command);
171
- // Should succeed, not crash. Undefined spec delta fields should be treated as empty arrays.
172
- // Currently fails: buildSpecSection() throws "Cannot read properties of undefined (reading 'map')"
173
- // which gets caught by try/catch and returns ComponentImplementationFailed instead.
174
181
  expect(result.type).toBe('ComponentImplemented');
175
182
  });
176
183
  it('defaults targetDir to ./client when not provided', async () => {
177
- const mockGenerateText = vi.mocked(generateText);
178
- mockGenerateText
179
- .mockResolvedValueOnce({ text: 'component code' })
180
- .mockResolvedValueOnce({ text: 'test code' })
181
- .mockResolvedValueOnce({ text: 'story code' })
182
- .mockResolvedValueOnce({
183
- text: '```tsx\nrc\n```\n```tsx\nrs\n```',
184
- });
185
184
  vi.mocked(existsSync).mockReturnValue(false);
186
- vi.mocked(writeFile).mockResolvedValue(undefined);
185
+ vi.mocked(runPipeline).mockResolvedValue({
186
+ success: true,
187
+ llmCalls: 2,
188
+ fixIterations: 0,
189
+ });
187
190
  const command = {
188
191
  type: 'ImplementComponent',
189
192
  data: {
@@ -212,16 +215,12 @@ describe('implement-component', () => {
212
215
  }));
213
216
  });
214
217
  it('derives component path from componentId when files.create is empty string', async () => {
215
- const mockGenerateText = vi.mocked(generateText);
216
- mockGenerateText
217
- .mockResolvedValueOnce({ text: 'component code' })
218
- .mockResolvedValueOnce({ text: 'test code' })
219
- .mockResolvedValueOnce({ text: 'story code' })
220
- .mockResolvedValueOnce({
221
- text: '```tsx\nrc\n```\n```tsx\nrs\n```',
222
- });
223
218
  vi.mocked(existsSync).mockReturnValue(false);
224
- vi.mocked(writeFile).mockResolvedValue(undefined);
219
+ vi.mocked(runPipeline).mockResolvedValue({
220
+ success: true,
221
+ llmCalls: 4,
222
+ fixIterations: 0,
223
+ });
225
224
  const command = makeCommand({
226
225
  job: {
227
226
  id: 'job_1',
@@ -257,12 +256,203 @@ describe('implement-component', () => {
257
256
  correlationId: 'cor-1',
258
257
  });
259
258
  });
259
+ it('passes correct context to pipeline', async () => {
260
+ vi.mocked(existsSync).mockReturnValue(false);
261
+ vi.mocked(runPipeline).mockResolvedValue({
262
+ success: true,
263
+ llmCalls: 2,
264
+ fixIterations: 0,
265
+ });
266
+ await handleImplementComponent(makeCommand());
267
+ expect(runPipeline).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
268
+ componentName: 'MyButton',
269
+ componentPath: '/project/client/src/components/ui/MyButton.tsx',
270
+ testPath: '/project/client/src/components/ui/MyButton.test.tsx',
271
+ storyPath: '/project/client/src/components/ui/MyButton.stories.tsx',
272
+ componentImportPath: '@/components/ui/MyButton',
273
+ specDeltas: {
274
+ structure: ['renders a button element'],
275
+ rendering: ['shows spinner when loading'],
276
+ interaction: ['calls onClick handler'],
277
+ styling: ['uses primary class'],
278
+ },
279
+ isModify: false,
280
+ llmCalls: 0,
281
+ fixIterations: 0,
282
+ }));
283
+ });
260
284
  });
261
285
  describe('commandHandler', () => {
262
286
  it('has correct metadata', () => {
263
287
  expect(commandHandler.name).toBe('ImplementComponent');
264
288
  expect(commandHandler.alias).toBe('implement:component');
265
289
  });
290
+ it('handle delegates to handleImplementComponent', async () => {
291
+ vi.mocked(existsSync).mockReturnValue(false);
292
+ vi.mocked(runPipeline).mockResolvedValue({
293
+ success: true,
294
+ llmCalls: 0,
295
+ fixIterations: 0,
296
+ });
297
+ const result = await commandHandler.handle(makeCommand());
298
+ expect(result).toEqual(expect.objectContaining({ type: 'ComponentImplemented' }));
299
+ });
300
+ });
301
+ describe('filePathToImportAlias edge cases', () => {
302
+ it('handles paths starting with ./', async () => {
303
+ vi.mocked(existsSync).mockReturnValue(false);
304
+ vi.mocked(runPipeline).mockResolvedValue({
305
+ success: true,
306
+ llmCalls: 0,
307
+ fixIterations: 0,
308
+ });
309
+ const command = makeCommand({
310
+ job: {
311
+ id: 'job_1',
312
+ dependsOn: [],
313
+ target: 'ImplementComponent',
314
+ payload: {
315
+ componentId: 'my-button',
316
+ structure: [],
317
+ rendering: [],
318
+ interaction: [],
319
+ styling: [],
320
+ storybookPath: 'src/components/ui/MyButton.stories.tsx',
321
+ files: { create: ['./src/components/ui/MyButton.tsx'] },
322
+ composes: [],
323
+ },
324
+ },
325
+ });
326
+ await handleImplementComponent(command);
327
+ expect(runPipeline).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
328
+ componentImportPath: '@/components/ui/MyButton',
329
+ }));
330
+ });
331
+ });
332
+ describe('edge cases', () => {
333
+ it('reads existing test when modifying and test file exists', async () => {
334
+ vi.mocked(existsSync).mockReturnValue(true);
335
+ vi.mocked(readFile).mockResolvedValue('existing code');
336
+ vi.mocked(runPipeline).mockResolvedValue({
337
+ success: true,
338
+ llmCalls: 1,
339
+ fixIterations: 0,
340
+ });
341
+ const command = makeCommand({
342
+ job: {
343
+ id: 'job_2',
344
+ dependsOn: [],
345
+ target: 'ImplementComponent',
346
+ payload: {
347
+ componentId: 'my-button',
348
+ structure: [],
349
+ rendering: [],
350
+ interaction: [],
351
+ styling: [],
352
+ storybookPath: 'src/components/ui/MyButton.stories.tsx',
353
+ files: { modify: ['src/components/ui/MyButton.tsx'] },
354
+ composes: [],
355
+ },
356
+ },
357
+ });
358
+ await handleImplementComponent(command);
359
+ expect(runPipeline).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
360
+ existingComponent: 'existing code',
361
+ existingTest: 'existing code',
362
+ }));
363
+ });
364
+ it('sets existingTest to undefined when test file does not exist in modify mode', async () => {
365
+ vi.mocked(existsSync).mockReturnValueOnce(true).mockReturnValueOnce(false);
366
+ vi.mocked(readFile).mockResolvedValue('existing component');
367
+ vi.mocked(runPipeline).mockResolvedValue({
368
+ success: true,
369
+ llmCalls: 1,
370
+ fixIterations: 0,
371
+ });
372
+ const command = makeCommand({
373
+ job: {
374
+ id: 'job_2',
375
+ dependsOn: [],
376
+ target: 'ImplementComponent',
377
+ payload: {
378
+ componentId: 'my-button',
379
+ structure: [],
380
+ rendering: [],
381
+ interaction: [],
382
+ styling: [],
383
+ storybookPath: 'src/components/ui/MyButton.stories.tsx',
384
+ files: { modify: ['src/components/ui/MyButton.tsx'] },
385
+ composes: [],
386
+ },
387
+ },
388
+ });
389
+ await handleImplementComponent(command);
390
+ expect(runPipeline).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
391
+ existingComponent: 'existing component',
392
+ existingTest: undefined,
393
+ }));
394
+ });
395
+ it('uses fallback error message when pipeline result has no error string', async () => {
396
+ vi.mocked(existsSync).mockReturnValue(false);
397
+ vi.mocked(runPipeline).mockResolvedValue({
398
+ success: false,
399
+ llmCalls: 0,
400
+ fixIterations: 0,
401
+ });
402
+ const result = await handleImplementComponent(makeCommand());
403
+ expect(result).toEqual({
404
+ type: 'ComponentImplementationFailed',
405
+ data: {
406
+ error: 'Pipeline failed',
407
+ name: 'MyButton',
408
+ },
409
+ timestamp: expect.any(Date),
410
+ requestId: 'req-1',
411
+ correlationId: 'cor-1',
412
+ });
413
+ });
414
+ it('handles non-Error thrown from pipeline', async () => {
415
+ vi.mocked(existsSync).mockReturnValue(false);
416
+ vi.mocked(runPipeline).mockRejectedValue('string error');
417
+ const result = await handleImplementComponent(makeCommand());
418
+ expect(result).toEqual({
419
+ type: 'ComponentImplementationFailed',
420
+ data: {
421
+ error: 'string error',
422
+ name: 'MyButton',
423
+ },
424
+ timestamp: expect.any(Date),
425
+ requestId: 'req-1',
426
+ correlationId: 'cor-1',
427
+ });
428
+ });
429
+ it('handles empty files payload gracefully', async () => {
430
+ vi.mocked(existsSync).mockReturnValue(false);
431
+ vi.mocked(runPipeline).mockResolvedValue({
432
+ success: true,
433
+ llmCalls: 0,
434
+ fixIterations: 0,
435
+ });
436
+ const command = makeCommand({
437
+ job: {
438
+ id: 'job_1',
439
+ dependsOn: [],
440
+ target: 'ImplementComponent',
441
+ payload: {
442
+ componentId: 'my-button',
443
+ structure: [],
444
+ rendering: [],
445
+ interaction: [],
446
+ styling: [],
447
+ storybookPath: 'src/components/ui/MyButton.stories.tsx',
448
+ files: {},
449
+ composes: [],
450
+ },
451
+ },
452
+ });
453
+ const result = await handleImplementComponent(command);
454
+ expect(result).toEqual(expect.objectContaining({ type: 'ComponentImplemented' }));
455
+ });
266
456
  });
267
457
  });
268
458
  //# sourceMappingURL=implement-component.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"implement-component.test.js","sourceRoot":"","sources":["../../../src/commands/implement-component.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"implement-component.test.js","sourceRoot":"","sources":["../../../src/commands/implement-component.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parse a TypeScript/TSX source string and return all exported value names
3
+ * (functions, constants, classes) — excludes type-only exports.
4
+ */
5
+ export declare function extractExportedNames(content: string): string[];
6
+ //# sourceMappingURL=extract-exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-exports.d.ts","sourceRoot":"","sources":["../../src/extract-exports.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA0C9D"}
@@ -0,0 +1,46 @@
1
+ // ═══════════════════════════════════════════════════════════════════
2
+ // Extract exported names from a TypeScript/TSX file using the TS AST
3
+ // ═══════════════════════════════════════════════════════════════════
4
+ import ts from 'typescript';
5
+ /**
6
+ * Parse a TypeScript/TSX source string and return all exported value names
7
+ * (functions, constants, classes) — excludes type-only exports.
8
+ */
9
+ export function extractExportedNames(content) {
10
+ const sourceFile = ts.createSourceFile('temp.tsx', content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
11
+ const names = [];
12
+ ts.forEachChild(sourceFile, (node) => {
13
+ const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;
14
+ const isExported = modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
15
+ // export function Foo() { ... }
16
+ if (ts.isFunctionDeclaration(node) && isExported && node.name) {
17
+ names.push(node.name.text);
18
+ }
19
+ // export const Foo = ...
20
+ if (ts.isVariableStatement(node) && isExported) {
21
+ for (const decl of node.declarationList.declarations) {
22
+ if (ts.isIdentifier(decl.name)) {
23
+ names.push(decl.name.text);
24
+ }
25
+ }
26
+ }
27
+ // export class Foo { ... }
28
+ if (ts.isClassDeclaration(node) && isExported && node.name) {
29
+ names.push(node.name.text);
30
+ }
31
+ // export { Foo, Bar, Baz }
32
+ if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {
33
+ // Skip type-only re-exports: export type { Foo }
34
+ if (node.isTypeOnly)
35
+ return;
36
+ for (const spec of node.exportClause.elements) {
37
+ // Skip individual type-only exports: export { type Foo, Bar }
38
+ if (spec.isTypeOnly)
39
+ continue;
40
+ names.push(spec.name.text);
41
+ }
42
+ }
43
+ });
44
+ return names;
45
+ }
46
+ //# sourceMappingURL=extract-exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-exports.js","sourceRoot":"","sources":["../../src/extract-exports.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,qEAAqE;AACrE,sEAAsE;AAEtE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE7G,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,SAAS,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,MAAM,UAAU,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAElF,gCAAgC;QAChC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,yBAAyB;QACzB,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;gBACrD,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,2BAA2B;QAC3B,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9F,iDAAiD;YACjD,IAAI,IAAI,CAAC,UAAU;gBAAE,OAAO;YAE5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAC9C,8DAA8D;gBAC9D,IAAI,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface DeterministicStoryProp {
2
+ name: string;
3
+ type: string;
4
+ required: boolean;
5
+ default?: string;
6
+ description: string;
7
+ category: 'data' | 'callback' | 'slot' | 'visual' | 'state' | 'config';
8
+ }
9
+ export interface StoryVariant {
10
+ name: string;
11
+ description: string;
12
+ args: Record<string, unknown>;
13
+ needsPlayFunction?: boolean;
14
+ playDescription?: string;
15
+ }
16
+ export interface DeterministicStoryInput {
17
+ componentName: string;
18
+ componentImportPath: string;
19
+ props?: DeterministicStoryProp[];
20
+ storyVariants?: StoryVariant[];
21
+ }
22
+ /**
23
+ * Generates a Storybook CSF3 story file deterministically (no LLM call).
24
+ *
25
+ * Uses structured prop data and optional story variants to emit a complete
26
+ * `.stories.tsx` file string. When no variants are provided, a Default
27
+ * story is synthesized from the props with sensible placeholder values.
28
+ */
29
+ export declare function generateStoryDeterministic(input: DeterministicStoryInput): string;
30
+ //# sourceMappingURL=generate-story-deterministic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-story-deterministic.d.ts","sourceRoot":"","sources":["../../src/generate-story-deterministic.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;CACxE;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAkDjF"}