@auto-engineer/component-implementor-react 1.95.0 → 1.97.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.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +6 -6
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +90 -0
- package/dist/src/commands/implement-component.d.ts.map +1 -1
- package/dist/src/commands/implement-component.js +13 -16
- package/dist/src/commands/implement-component.js.map +1 -1
- package/dist/src/commands/implement-component.test.js +14 -5
- package/dist/src/commands/implement-component.test.js.map +1 -1
- package/dist/src/extract-code-block.d.ts +1 -0
- package/dist/src/extract-code-block.d.ts.map +1 -1
- package/dist/src/extract-code-block.js +12 -0
- package/dist/src/extract-code-block.js.map +1 -1
- package/dist/src/extract-code-block.test.js +28 -1
- package/dist/src/extract-code-block.test.js.map +1 -1
- package/dist/src/generate-component.d.ts +2 -13
- package/dist/src/generate-component.d.ts.map +1 -1
- package/dist/src/generate-component.js +4 -29
- package/dist/src/generate-component.js.map +1 -1
- package/dist/src/generate-component.test.js +18 -22
- package/dist/src/generate-component.test.js.map +1 -1
- package/dist/src/generate-story.d.ts +2 -12
- package/dist/src/generate-story.d.ts.map +1 -1
- package/dist/src/generate-story.js +4 -25
- package/dist/src/generate-story.js.map +1 -1
- package/dist/src/generate-story.test.js +17 -21
- package/dist/src/generate-story.test.js.map +1 -1
- package/dist/src/generate-test.d.ts +2 -12
- package/dist/src/generate-test.d.ts.map +1 -1
- package/dist/src/generate-test.js +4 -28
- package/dist/src/generate-test.js.map +1 -1
- package/dist/src/generate-test.test.js +17 -6
- package/dist/src/generate-test.test.js.map +1 -1
- package/dist/src/prompt.d.ts +64 -0
- package/dist/src/prompt.d.ts.map +1 -0
- package/dist/src/prompt.js +481 -0
- package/dist/src/prompt.js.map +1 -0
- package/dist/src/prompt.test.d.ts +2 -0
- package/dist/src/prompt.test.d.ts.map +1 -0
- package/dist/src/prompt.test.js +136 -0
- package/dist/src/prompt.test.js.map +1 -0
- package/dist/src/reconcile.d.ts +8 -0
- package/dist/src/reconcile.d.ts.map +1 -0
- package/dist/src/reconcile.js +18 -0
- package/dist/src/reconcile.js.map +1 -0
- package/dist/src/reconcile.test.d.ts +2 -0
- package/dist/src/reconcile.test.d.ts.map +1 -0
- package/dist/src/reconcile.test.js +108 -0
- package/dist/src/reconcile.test.js.map +1 -0
- package/dist/src/run.d.ts +2 -0
- package/dist/src/run.d.ts.map +1 -0
- package/dist/src/run.js +86 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/spec-contract.d.ts +9 -0
- package/dist/src/spec-contract.d.ts.map +1 -0
- package/dist/src/spec-contract.js +16 -0
- package/dist/src/spec-contract.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/improvement-prompt.md +208 -0
- package/inputs/action-button/spec.json +50 -0
- package/inputs/command-palette/spec.json +62 -0
- package/inputs/data-card/spec.json +59 -0
- package/inputs/editable-data-table/spec.json +70 -0
- package/inputs/multi-step-form/spec.json +66 -0
- package/inputs/notification-center/spec.json +67 -0
- package/inputs/search-input/spec.json +62 -0
- package/inputs/status-badge/spec.json +46 -0
- package/package.json +4 -3
- package/scripts/improve.ts +592 -0
- package/src/commands/implement-component.test.ts +14 -5
- package/src/commands/implement-component.ts +13 -17
- package/src/extract-code-block.test.ts +33 -1
- package/src/extract-code-block.ts +13 -0
- package/src/generate-component.test.ts +22 -26
- package/src/generate-component.ts +5 -46
- package/src/generate-story.test.ts +17 -21
- package/src/generate-story.ts +5 -40
- package/src/generate-test.test.ts +22 -7
- package/src/generate-test.ts +5 -44
- package/src/prompt.test.ts +163 -0
- package/src/prompt.ts +581 -0
- package/src/reconcile.test.ts +127 -0
- package/src/reconcile.ts +27 -0
- package/src/run.ts +106 -0
- package/src/spec-contract.ts +22 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @auto-engineer/component-implementor-react@1.
|
|
2
|
+
> @auto-engineer/component-implementor-react@1.97.0 build /home/runner/work/auto-engineer/auto-engineer/packages/component-implementor-react
|
|
3
3
|
> tsc && tsx ../../scripts/fix-esm-imports.ts
|
|
4
4
|
|
|
5
5
|
Fixed ESM imports in dist/
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
|
|
2
|
-
> @auto-engineer/component-implementor-react@1.
|
|
2
|
+
> @auto-engineer/component-implementor-react@1.96.0 test /home/runner/work/auto-engineer/auto-engineer/packages/component-implementor-react
|
|
3
3
|
> vitest run --reporter=dot
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
[1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/auto-engineer/auto-engineer/packages/component-implementor-react[39m
|
|
7
7
|
|
|
8
|
-
[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m
|
|
8
|
+
[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m[33m[39m[32m·[39m
|
|
9
9
|
|
|
10
|
-
[2m Test Files [22m [1m[
|
|
11
|
-
[2m Tests [22m [1m[
|
|
12
|
-
[2m Start at [22m
|
|
13
|
-
[2m Duration [22m
|
|
10
|
+
[2m Test Files [22m [1m[32m7 passed[39m[22m[90m (7)[39m
|
|
11
|
+
[2m Tests [22m [1m[32m48 passed[39m[22m[90m (48)[39m
|
|
12
|
+
[2m Start at [22m 00:19:35
|
|
13
|
+
[2m Duration [22m 5.95s[2m (transform 1.72s, setup 0ms, collect 3.69s, tests 397ms, environment 2ms, prepare 4.10s)[22m
|
|
14
14
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @auto-engineer/component-implementor-react@1.
|
|
2
|
+
> @auto-engineer/component-implementor-react@1.96.0 type-check /home/runner/work/auto-engineer/auto-engineer/packages/component-implementor-react
|
|
3
3
|
> tsc --noEmit
|
|
4
4
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,95 @@
|
|
|
1
1
|
# @auto-engineer/component-implementor-react
|
|
2
2
|
|
|
3
|
+
## 1.97.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`08c9b8f`](https://github.com/BeOnAuto/auto-engineer/commit/08c9b8fb11ebd82b7b08f96bd2911bc202c19c44) Thanks [@github-actions[bot]](https://github.com/github-actions%5Bbot%5D)! - - **typical**: pass preWarmed flag from DEPS_PRE_WARMED env var and remove --ignore-workspace
|
|
8
|
+
- **server-generator-apollo-emmett**: remove --ignore-workspace from install command
|
|
9
|
+
- **dev-server**: add preWarmed flag to install server dependencies
|
|
10
|
+
- **dev-server**: add preWarmed flag to install client dependencies
|
|
11
|
+
- **packages/pipeline**: add GET /run-stats endpoint with pipeline status
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [`d9944e3`](https://github.com/BeOnAuto/auto-engineer/commit/d9944e391c42ff8a0abec38eed04b70dc056818e) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **global**: extract only first version block from CHANGELOG for release notes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [[`d9944e3`](https://github.com/BeOnAuto/auto-engineer/commit/d9944e391c42ff8a0abec38eed04b70dc056818e), [`08c9b8f`](https://github.com/BeOnAuto/auto-engineer/commit/08c9b8fb11ebd82b7b08f96bd2911bc202c19c44)]:
|
|
18
|
+
- @auto-engineer/message-bus@1.97.0
|
|
19
|
+
- @auto-engineer/model-factory@1.97.0
|
|
20
|
+
|
|
21
|
+
## 1.96.0
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- [`81f38b5`](https://github.com/BeOnAuto/auto-engineer/commit/81f38b57044f9556a9f90dca2cd5fc945c9cd34c) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **packages/pipeline**: add getRunStats method to PipelineReadModel
|
|
26
|
+
|
|
27
|
+
- [`26e7f3e`](https://github.com/BeOnAuto/auto-engineer/commit/26e7f3e445149e3eef2e4872686aff841ff25a70) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **narrative**: add scene field to NarrativeSchema
|
|
28
|
+
|
|
29
|
+
- [`4a24c5a`](https://github.com/BeOnAuto/auto-engineer/commit/4a24c5a1e62a943760e7d855434e5e2b9a9d9a22) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **dev-server**: add preWarmed flag to install client dependencies
|
|
30
|
+
|
|
31
|
+
- [`b227607`](https://github.com/BeOnAuto/auto-engineer/commit/b227607fb4cc5e23b4ee12073d48058d6d6031e1) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **server-generator-apollo-emmett**: remove --ignore-workspace from install command
|
|
32
|
+
|
|
33
|
+
- [`f42888d`](https://github.com/BeOnAuto/auto-engineer/commit/f42888de73e6167e92316b657da7834869e6cf39) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **narrative**: add JourneyPlanningSchema progressive disclosure variant
|
|
34
|
+
|
|
35
|
+
- [`2709e66`](https://github.com/BeOnAuto/auto-engineer/commit/2709e6650ae277a7abacc4c4b4cbfd5fdc1cbc86) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **narrative**: export Journey, SceneClassification, SceneRoute, JourneyPlanning types
|
|
36
|
+
|
|
37
|
+
- [`b1a635a`](https://github.com/BeOnAuto/auto-engineer/commit/b1a635aa5845d270086e354685d8277106e9d633) Thanks [@osamanar](https://github.com/osamanar)! - Based on the diff analysis, here's the changelog:
|
|
38
|
+
- Upgraded AI prompt system with detailed, role-based prompts for component, test, story, and reconciler generation
|
|
39
|
+
- Added a reconciliation step that harmonizes generated component code with its Storybook story
|
|
40
|
+
- Introduced an automated improvement loop that evaluates output quality across multiple spec scenarios and iteratively refines prompts
|
|
41
|
+
- Consolidated shared types and spec-building logic into reusable modules, reducing duplication across generators
|
|
42
|
+
- Added sample component specs (action button, data card, search input, and more) for benchmarking prompt quality
|
|
43
|
+
|
|
44
|
+
- [`032349d`](https://github.com/BeOnAuto/auto-engineer/commit/032349d475dd3cea19fe440bf4f903bd473dec60) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **typical**: pass preWarmed flag from DEPS_PRE_WARMED env var and remove --ignore-workspace
|
|
45
|
+
|
|
46
|
+
- [`a177d2a`](https://github.com/BeOnAuto/auto-engineer/commit/a177d2a07e71e7c6f98146ce8f6287a4d2829c37) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **narrative**: add SceneRouteSchema and SceneClassificationSchema
|
|
47
|
+
|
|
48
|
+
- [`42d7111`](https://github.com/BeOnAuto/auto-engineer/commit/42d711159577d6844e74955a10361d57b154ca44) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **packages/pipeline**: add getAllItemStatuses and getAllNodeStatuses to PipelineReadModel
|
|
49
|
+
|
|
50
|
+
- [`19d3375`](https://github.com/BeOnAuto/auto-engineer/commit/19d33751bc6912c1e2745e0f06b860f16bd2056e) Thanks [@github-actions[bot]](https://github.com/github-actions%5Bbot%5D)! - - **server-generator-apollo-emmett**: add null-document guidance to projection template
|
|
51
|
+
- **server-generator-apollo-emmett**: add discriminated union guidance to evolve template
|
|
52
|
+
- **server-generator-apollo-emmett**: fill missing inline object fields with type defaults
|
|
53
|
+
- **server-implementer**: add discriminated union narrowing guidance to prompts
|
|
54
|
+
- **server-implementer**: load full shared directory into implementer context
|
|
55
|
+
|
|
56
|
+
- [`981285d`](https://github.com/BeOnAuto/auto-engineer/commit/981285d9d5fa747a9d924d9388e111750453e0be) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **dev-server**: add preWarmed flag to install server dependencies
|
|
57
|
+
|
|
58
|
+
- [`267cb9f`](https://github.com/BeOnAuto/auto-engineer/commit/267cb9fd83c90bd4a7e3a9b38c2577b3d744ad61) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **narrative**: add journeys to modelSchema and JourneyPlanningSchema
|
|
59
|
+
|
|
60
|
+
- [`056ef79`](https://github.com/BeOnAuto/auto-engineer/commit/056ef797bd70346b47f0f0ad2a48a2c567204d46) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **packages/pipeline**: add GET /run-stats endpoint with pipeline status
|
|
61
|
+
|
|
62
|
+
- [`a6cb7ec`](https://github.com/BeOnAuto/auto-engineer/commit/a6cb7ec9460bc4412e5ce022473815e668774f44) Thanks [@osamanar](https://github.com/osamanar)! - - Improved the starter template for generated React clients
|
|
63
|
+
- Added a run script for easier project execution
|
|
64
|
+
|
|
65
|
+
- [`2e7404e`](https://github.com/BeOnAuto/auto-engineer/commit/2e7404e5ce5f222d0931e63d8adb2f8acbeec494) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **narrative**: add JourneySchema
|
|
66
|
+
|
|
67
|
+
### Patch Changes
|
|
68
|
+
|
|
69
|
+
- [`6dfd6cc`](https://github.com/BeOnAuto/auto-engineer/commit/6dfd6ccac984f3f85cfdfd8de9c0771083e1be8d) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **typical**: add server deps to root for workspace pre-warming
|
|
70
|
+
|
|
71
|
+
- [`991cb70`](https://github.com/BeOnAuto/auto-engineer/commit/991cb70914a145e20f174698418a16e81782221c) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **typical**: convert typical example to pnpm workspace
|
|
72
|
+
|
|
73
|
+
- [`cf8c874`](https://github.com/BeOnAuto/auto-engineer/commit/cf8c874347eff977663c5f958c9fcba06a65921e) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **narrative**: add ketchup plan for journey-narrative consolidation RFC
|
|
74
|
+
|
|
75
|
+
- [`f02782d`](https://github.com/BeOnAuto/auto-engineer/commit/f02782d419431234046b0f0bd91ead278f9a1b07) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **packages/pipeline**: add correlationId query param and use runStats for hasActivity in /run-stats
|
|
76
|
+
|
|
77
|
+
- [`02bf378`](https://github.com/BeOnAuto/auto-engineer/commit/02bf378c5f26061efef1636abdffa472600b8103) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **pipeline**: sort exports to fix biome organizeImports error
|
|
78
|
+
|
|
79
|
+
- [`b1d6595`](https://github.com/BeOnAuto/auto-engineer/commit/b1d6595116b32332e38ee7b34a2b274ada8d173e) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - Updated esbuild build tool dependencies to latest versions
|
|
80
|
+
|
|
81
|
+
- [`c756f3f`](https://github.com/BeOnAuto/auto-engineer/commit/c756f3fed9c48547b2709128c76ab81262ce25c6) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **narrative**: update ketchup-plan and apply linter fixes
|
|
82
|
+
|
|
83
|
+
- [`06efd83`](https://github.com/BeOnAuto/auto-engineer/commit/06efd83cb0c813fc5e869ac9f3ff7811a3857940) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **cli**: increase server test timeouts for CI reliability
|
|
84
|
+
|
|
85
|
+
- [`a5cb16c`](https://github.com/BeOnAuto/auto-engineer/commit/a5cb16ccf7b3758e39b8bf2d96ce164b7e3d2bc6) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **typical**: update lockfile for server deps
|
|
86
|
+
|
|
87
|
+
- [`784c650`](https://github.com/BeOnAuto/auto-engineer/commit/784c6504222da8bd8557cfde80252866fc2b69ef) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **pipeline**: export RunStats type from package index
|
|
88
|
+
|
|
89
|
+
- Updated dependencies [[`81f38b5`](https://github.com/BeOnAuto/auto-engineer/commit/81f38b57044f9556a9f90dca2cd5fc945c9cd34c), [`26e7f3e`](https://github.com/BeOnAuto/auto-engineer/commit/26e7f3e445149e3eef2e4872686aff841ff25a70), [`4a24c5a`](https://github.com/BeOnAuto/auto-engineer/commit/4a24c5a1e62a943760e7d855434e5e2b9a9d9a22), [`6dfd6cc`](https://github.com/BeOnAuto/auto-engineer/commit/6dfd6ccac984f3f85cfdfd8de9c0771083e1be8d), [`b227607`](https://github.com/BeOnAuto/auto-engineer/commit/b227607fb4cc5e23b4ee12073d48058d6d6031e1), [`f42888d`](https://github.com/BeOnAuto/auto-engineer/commit/f42888de73e6167e92316b657da7834869e6cf39), [`991cb70`](https://github.com/BeOnAuto/auto-engineer/commit/991cb70914a145e20f174698418a16e81782221c), [`2709e66`](https://github.com/BeOnAuto/auto-engineer/commit/2709e6650ae277a7abacc4c4b4cbfd5fdc1cbc86), [`b1a635a`](https://github.com/BeOnAuto/auto-engineer/commit/b1a635aa5845d270086e354685d8277106e9d633), [`032349d`](https://github.com/BeOnAuto/auto-engineer/commit/032349d475dd3cea19fe440bf4f903bd473dec60), [`cf8c874`](https://github.com/BeOnAuto/auto-engineer/commit/cf8c874347eff977663c5f958c9fcba06a65921e), [`a177d2a`](https://github.com/BeOnAuto/auto-engineer/commit/a177d2a07e71e7c6f98146ce8f6287a4d2829c37), [`f02782d`](https://github.com/BeOnAuto/auto-engineer/commit/f02782d419431234046b0f0bd91ead278f9a1b07), [`02bf378`](https://github.com/BeOnAuto/auto-engineer/commit/02bf378c5f26061efef1636abdffa472600b8103), [`42d7111`](https://github.com/BeOnAuto/auto-engineer/commit/42d711159577d6844e74955a10361d57b154ca44), [`19d3375`](https://github.com/BeOnAuto/auto-engineer/commit/19d33751bc6912c1e2745e0f06b860f16bd2056e), [`b1d6595`](https://github.com/BeOnAuto/auto-engineer/commit/b1d6595116b32332e38ee7b34a2b274ada8d173e), [`981285d`](https://github.com/BeOnAuto/auto-engineer/commit/981285d9d5fa747a9d924d9388e111750453e0be), [`c756f3f`](https://github.com/BeOnAuto/auto-engineer/commit/c756f3fed9c48547b2709128c76ab81262ce25c6), [`267cb9f`](https://github.com/BeOnAuto/auto-engineer/commit/267cb9fd83c90bd4a7e3a9b38c2577b3d744ad61), [`056ef79`](https://github.com/BeOnAuto/auto-engineer/commit/056ef797bd70346b47f0f0ad2a48a2c567204d46), [`06efd83`](https://github.com/BeOnAuto/auto-engineer/commit/06efd83cb0c813fc5e869ac9f3ff7811a3857940), [`a5cb16c`](https://github.com/BeOnAuto/auto-engineer/commit/a5cb16ccf7b3758e39b8bf2d96ce164b7e3d2bc6), [`784c650`](https://github.com/BeOnAuto/auto-engineer/commit/784c6504222da8bd8557cfde80252866fc2b69ef), [`a6cb7ec`](https://github.com/BeOnAuto/auto-engineer/commit/a6cb7ec9460bc4412e5ce022473815e668774f44), [`2e7404e`](https://github.com/BeOnAuto/auto-engineer/commit/2e7404e5ce5f222d0931e63d8adb2f8acbeec494)]:
|
|
90
|
+
- @auto-engineer/message-bus@1.96.0
|
|
91
|
+
- @auto-engineer/model-factory@1.96.0
|
|
92
|
+
|
|
3
93
|
## 1.95.0
|
|
4
94
|
|
|
5
95
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implement-component.d.ts","sourceRoot":"","sources":["../../../src/commands/implement-component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAwB,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"implement-component.d.ts","sourceRoot":"","sources":["../../../src/commands/implement-component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAwB,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAS5F,KAAK,mBAAmB,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACjD,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAC7C,oBAAoB,EACpB;IACE,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,YAAY,CAAC;CACnB,CACF,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,KAAK,CAC3C,sBAAsB,EACtB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CACF,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG,KAAK,CACpD,+BAA+B,EAC/B;IACE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CACF,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,yBAAyB,GAAG,kCAAkC,CAAC;AAuBtG,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,yBAAyB,GAAG,kCAAkC,CAAC,CAyEzE;AAED,eAAO,MAAM,cAAc;;;;;;GA2BzB,CAAC;AAEH,eAAe,cAAc,CAAC"}
|
|
@@ -6,6 +6,7 @@ import createDebug from 'debug';
|
|
|
6
6
|
import { generateComponentFile } from '../generate-component.js';
|
|
7
7
|
import { generateStoryFile } from '../generate-story.js';
|
|
8
8
|
import { generateTestFile } from '../generate-test.js';
|
|
9
|
+
import { reconcile } from '../reconcile.js';
|
|
9
10
|
const debug = createDebug('auto:component-implementor-react:command');
|
|
10
11
|
function pascalCase(id) {
|
|
11
12
|
return id
|
|
@@ -40,30 +41,26 @@ export async function handleImplementComponent(command) {
|
|
|
40
41
|
interaction: payload.interaction,
|
|
41
42
|
styling: payload.styling,
|
|
42
43
|
};
|
|
43
|
-
debug('
|
|
44
|
-
const testCode = await
|
|
45
|
-
componentName,
|
|
46
|
-
specDeltas,
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
debug('
|
|
50
|
-
const
|
|
44
|
+
debug('Running Frontend, Tester, and Story agents in parallel...');
|
|
45
|
+
const [componentCode, testCode, storyCode] = await Promise.all([
|
|
46
|
+
generateComponentFile({ componentName, specDeltas, existingComponent }),
|
|
47
|
+
generateTestFile({ componentName, specDeltas, existingComponent }),
|
|
48
|
+
generateStoryFile({ componentName, specDeltas }),
|
|
49
|
+
]);
|
|
50
|
+
debug('Reconciling component and story against tests...');
|
|
51
|
+
const reconciled = await reconcile({
|
|
51
52
|
componentName,
|
|
52
53
|
specDeltas,
|
|
54
|
+
componentCode,
|
|
53
55
|
testCode,
|
|
56
|
+
storyCode,
|
|
54
57
|
existingComponent,
|
|
55
58
|
});
|
|
56
|
-
debug('Generating story file...');
|
|
57
|
-
const storyCode = await generateStoryFile({
|
|
58
|
-
componentName,
|
|
59
|
-
specDeltas,
|
|
60
|
-
componentCode,
|
|
61
|
-
});
|
|
62
59
|
await mkdir(path.dirname(testPath), { recursive: true });
|
|
63
60
|
await Promise.all([
|
|
64
61
|
writeFile(testPath, testCode, 'utf-8'),
|
|
65
|
-
writeFile(componentPath, componentCode, 'utf-8'),
|
|
66
|
-
writeFile(storyPath, storyCode, 'utf-8'),
|
|
62
|
+
writeFile(componentPath, reconciled.componentCode, 'utf-8'),
|
|
63
|
+
writeFile(storyPath, reconciled.storyCode, 'utf-8'),
|
|
67
64
|
]);
|
|
68
65
|
debug('Wrote 3 files for %s', componentName);
|
|
69
66
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implement-component.js","sourceRoot":"","sources":["../../../src/commands/implement-component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAgB,oBAAoB,EAAc,MAAM,4BAA4B,CAAC;AAC5F,OAAO,WAAW,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"implement-component.js","sourceRoot":"","sources":["../../../src/commands/implement-component.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,12 +47,17 @@ describe('implement-component', () => {
|
|
|
47
47
|
vi.clearAllMocks();
|
|
48
48
|
});
|
|
49
49
|
describe('handleImplementComponent', () => {
|
|
50
|
-
it('generates 3 files and returns ComponentImplemented
|
|
50
|
+
it('generates 3 files via parallel agents + reconciliation and returns ComponentImplemented', async () => {
|
|
51
51
|
const mockGenerateText = vi.mocked(generateText);
|
|
52
|
+
// Phase 1: 3 parallel calls (component, test, story)
|
|
52
53
|
mockGenerateText
|
|
53
|
-
.mockResolvedValueOnce({ text: 'test file code' })
|
|
54
54
|
.mockResolvedValueOnce({ text: 'component file code' })
|
|
55
|
-
.mockResolvedValueOnce({ text: '
|
|
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
|
+
});
|
|
56
61
|
vi.mocked(existsSync).mockReturnValue(false);
|
|
57
62
|
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
58
63
|
const result = await handleImplementComponent(makeCommand());
|
|
@@ -73,14 +78,18 @@ describe('implement-component', () => {
|
|
|
73
78
|
requestId: 'req-1',
|
|
74
79
|
correlationId: 'cor-1',
|
|
75
80
|
});
|
|
81
|
+
expect(mockGenerateText).toHaveBeenCalledTimes(4);
|
|
76
82
|
expect(writeFile).toHaveBeenCalledTimes(3);
|
|
77
83
|
});
|
|
78
84
|
it('reads existing component when modifying', async () => {
|
|
79
85
|
const mockGenerateText = vi.mocked(generateText);
|
|
80
86
|
mockGenerateText
|
|
81
|
-
.mockResolvedValueOnce({ text: 'test code' })
|
|
82
87
|
.mockResolvedValueOnce({ text: 'component code' })
|
|
83
|
-
.mockResolvedValueOnce({ text: '
|
|
88
|
+
.mockResolvedValueOnce({ text: 'test code' })
|
|
89
|
+
.mockResolvedValueOnce({ text: 'story code' })
|
|
90
|
+
.mockResolvedValueOnce({
|
|
91
|
+
text: '```tsx\nrc\n```\n```tsx\nrs\n```',
|
|
92
|
+
});
|
|
84
93
|
vi.mocked(existsSync).mockReturnValue(true);
|
|
85
94
|
vi.mocked(readFile).mockResolvedValue('existing component code');
|
|
86
95
|
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implement-component.test.js","sourceRoot":"","sources":["../../../src/commands/implement-component.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;CAC9C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;IAClB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,SAAS,WAAW,CAAC,YAAqC,EAAE;IAC1D,OAAO;QACL,IAAI,EAAE,oBAA6B;QACnC,IAAI,EAAE;YACJ,SAAS,EAAE,iBAAiB;YAC5B,GAAG,EAAE;gBACH,EAAE,EAAE,OAAO;gBACX,SAAS,EAAE,EAAE;gBACb,MAAM,EAAE,oBAA6B;gBACrC,OAAO,EAAE;oBACP,WAAW,EAAE,WAAW;oBACxB,SAAS,EAAE,CAAC,0BAA0B,CAAC;oBACvC,SAAS,EAAE,CAAC,4BAA4B,CAAC;oBACzC,WAAW,EAAE,CAAC,uBAAuB,CAAC;oBACtC,OAAO,EAAE,CAAC,oBAAoB,CAAC;oBAC/B,aAAa,EAAE,wCAAwC;oBACvD,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,gCAAgC,CAAC,EAAE;iBACtD;aACF;YACD,GAAG,SAAS;SACb;QACD,SAAS,EAAE,OAAO;QAClB,aAAa,EAAE,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC
|
|
1
|
+
{"version":3,"file":"implement-component.test.js","sourceRoot":"","sources":["../../../src/commands/implement-component.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-code-block.d.ts","sourceRoot":"","sources":["../../src/extract-code-block.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD"}
|
|
1
|
+
{"version":3,"file":"extract-code-block.d.ts","sourceRoot":"","sources":["../../src/extract-code-block.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAWxD"}
|
|
@@ -4,4 +4,16 @@ export function extractCodeBlock(text) {
|
|
|
4
4
|
.replace(/```/g, '')
|
|
5
5
|
.trim();
|
|
6
6
|
}
|
|
7
|
+
export function extractCodeBlocks(text) {
|
|
8
|
+
const blocks = [];
|
|
9
|
+
const regex = /```(?:tsx?|typescript)?\n([\s\S]*?)```/g;
|
|
10
|
+
let match;
|
|
11
|
+
while ((match = regex.exec(text)) !== null) {
|
|
12
|
+
blocks.push(match[1].trim());
|
|
13
|
+
}
|
|
14
|
+
if (blocks.length === 0) {
|
|
15
|
+
blocks.push(text.trim());
|
|
16
|
+
}
|
|
17
|
+
return blocks;
|
|
18
|
+
}
|
|
7
19
|
//# sourceMappingURL=extract-code-block.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-code-block.js","sourceRoot":"","sources":["../../src/extract-code-block.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI;SACR,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;SACvC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE,CAAC;AACZ,CAAC"}
|
|
1
|
+
{"version":3,"file":"extract-code-block.js","sourceRoot":"","sources":["../../src/extract-code-block.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI;SACR,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;SACvC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,yCAAyC,CAAC;IACxD,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { extractCodeBlock } from './extract-code-block.js';
|
|
2
|
+
import { extractCodeBlock, extractCodeBlocks } from './extract-code-block.js';
|
|
3
3
|
describe('extractCodeBlock', () => {
|
|
4
4
|
it('returns plain text unchanged', () => {
|
|
5
5
|
expect(extractCodeBlock('const x = 1;')).toBe('const x = 1;');
|
|
@@ -25,4 +25,31 @@ describe('extractCodeBlock', () => {
|
|
|
25
25
|
expect(extractCodeBlock(input)).toBe('const x = 1;');
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
|
+
describe('extractCodeBlocks', () => {
|
|
29
|
+
it('extracts multiple code blocks', () => {
|
|
30
|
+
const input = '```tsx\ncomponent code\n```\n\nsome text\n\n```tsx\nstory code\n```';
|
|
31
|
+
const blocks = extractCodeBlocks(input);
|
|
32
|
+
expect(blocks).toEqual(['component code', 'story code']);
|
|
33
|
+
});
|
|
34
|
+
it('extracts blocks with different language tags', () => {
|
|
35
|
+
const input = '```tsx\nfirst block\n```\n```ts\nsecond block\n```';
|
|
36
|
+
const blocks = extractCodeBlocks(input);
|
|
37
|
+
expect(blocks).toEqual(['first block', 'second block']);
|
|
38
|
+
});
|
|
39
|
+
it('extracts bare code blocks', () => {
|
|
40
|
+
const input = '```\nbare block\n```';
|
|
41
|
+
const blocks = extractCodeBlocks(input);
|
|
42
|
+
expect(blocks).toEqual(['bare block']);
|
|
43
|
+
});
|
|
44
|
+
it('falls back to full text when no code blocks found', () => {
|
|
45
|
+
const input = 'plain text content';
|
|
46
|
+
const blocks = extractCodeBlocks(input);
|
|
47
|
+
expect(blocks).toEqual(['plain text content']);
|
|
48
|
+
});
|
|
49
|
+
it('trims content within each block', () => {
|
|
50
|
+
const input = '```tsx\n spaced content \n```';
|
|
51
|
+
const blocks = extractCodeBlocks(input);
|
|
52
|
+
expect(blocks).toEqual(['spaced content']);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
28
55
|
//# sourceMappingURL=extract-code-block.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-code-block.test.js","sourceRoot":"","sources":["../../src/extract-code-block.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"extract-code-block.test.js","sourceRoot":"","sources":["../../src/extract-code-block.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
type
|
|
2
|
-
|
|
3
|
-
rendering: string[];
|
|
4
|
-
interaction: string[];
|
|
5
|
-
styling: string[];
|
|
6
|
-
};
|
|
7
|
-
type GenerateComponentInput = {
|
|
8
|
-
componentName: string;
|
|
9
|
-
specDeltas: SpecDeltas;
|
|
10
|
-
testCode: string;
|
|
11
|
-
existingComponent?: string;
|
|
12
|
-
};
|
|
1
|
+
import { type ComponentPromptInput } from './prompt';
|
|
2
|
+
export type GenerateComponentInput = ComponentPromptInput;
|
|
13
3
|
export declare function generateComponentFile(input: GenerateComponentInput): Promise<string>;
|
|
14
|
-
export {};
|
|
15
4
|
//# sourceMappingURL=generate-component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-component.d.ts","sourceRoot":"","sources":["../../src/generate-component.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-component.d.ts","sourceRoot":"","sources":["../../src/generate-component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE3E,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE1D,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ1F"}
|
|
@@ -1,38 +1,13 @@
|
|
|
1
1
|
import { createModelFromEnv } from '@auto-engineer/model-factory';
|
|
2
2
|
import { generateText } from 'ai';
|
|
3
3
|
import { extractCodeBlock } from './extract-code-block.js';
|
|
4
|
-
|
|
5
|
-
if (items.length === 0)
|
|
6
|
-
return '';
|
|
7
|
-
return `## ${heading}\n${items.map((i) => `- ${i}`).join('\n')}`;
|
|
8
|
-
}
|
|
9
|
-
function buildPrompt(input) {
|
|
10
|
-
const sections = [
|
|
11
|
-
buildSpecSection('Structure', input.specDeltas.structure),
|
|
12
|
-
buildSpecSection('Rendering', input.specDeltas.rendering),
|
|
13
|
-
buildSpecSection('Interaction', input.specDeltas.interaction),
|
|
14
|
-
buildSpecSection('Styling', input.specDeltas.styling),
|
|
15
|
-
]
|
|
16
|
-
.filter(Boolean)
|
|
17
|
-
.join('\n\n');
|
|
18
|
-
const existingContext = input.existingComponent
|
|
19
|
-
? `\n\n## Existing Component\n\`\`\`tsx\n${input.existingComponent}\n\`\`\``
|
|
20
|
-
: '';
|
|
21
|
-
return `Component: ${input.componentName}\n\n${sections}${existingContext}\n\n## Test File\n\`\`\`tsx\n${input.testCode}\n\`\`\``;
|
|
22
|
-
}
|
|
23
|
-
const SYSTEM_PROMPT = `You are a React component expert. Write a React component (.tsx) that satisfies the spec and passes the provided test.
|
|
24
|
-
|
|
25
|
-
Rules:
|
|
26
|
-
- Use functional components with TypeScript
|
|
27
|
-
- Export the component as a named export
|
|
28
|
-
- Use Tailwind CSS classes for styling
|
|
29
|
-
- The component must pass the provided test
|
|
30
|
-
- Return ONLY the component file code, no commentary`;
|
|
4
|
+
import { buildComponentPrompt } from './prompt.js';
|
|
31
5
|
export async function generateComponentFile(input) {
|
|
6
|
+
const { system, prompt } = buildComponentPrompt(input);
|
|
32
7
|
const { text } = await generateText({
|
|
33
8
|
model: createModelFromEnv(),
|
|
34
|
-
system
|
|
35
|
-
prompt
|
|
9
|
+
system,
|
|
10
|
+
prompt,
|
|
36
11
|
});
|
|
37
12
|
return extractCodeBlock(text);
|
|
38
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/generate-component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/generate-component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAA6B,MAAM,UAAU,CAAC;AAI3E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAA6B;IACvE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,kBAAkB,EAAE;QAC3B,MAAM;QACN,MAAM;KACP,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -25,25 +25,35 @@ describe('generateComponentFile', () => {
|
|
|
25
25
|
const result = await generateComponentFile({
|
|
26
26
|
componentName: 'Button',
|
|
27
27
|
specDeltas,
|
|
28
|
-
testCode: 'import { render } from "@testing-library/react";',
|
|
29
28
|
});
|
|
30
29
|
expect(result).toBe('export function Button() { return <button />; }');
|
|
31
30
|
});
|
|
32
|
-
it('
|
|
31
|
+
it('passes system prompt with methodology, rules, and checklist', async () => {
|
|
33
32
|
const mockGenerateText = vi.mocked(generateText);
|
|
34
33
|
mockGenerateText.mockResolvedValue({
|
|
35
34
|
text: 'component code',
|
|
36
35
|
});
|
|
37
|
-
await generateComponentFile({
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
await generateComponentFile({ componentName: 'Button', specDeltas });
|
|
37
|
+
const system = mockGenerateText.mock.calls[0][0].system;
|
|
38
|
+
expect(system).toContain('staff-level frontend engineer');
|
|
39
|
+
expect(system).toContain('METHODOLOGY');
|
|
40
|
+
expect(system).toContain('RULES');
|
|
41
|
+
expect(system).toContain('QUALITY CHECKLIST');
|
|
42
|
+
expect(system).toContain('Named exports');
|
|
43
|
+
expect(system).toContain('Tailwind CSS');
|
|
44
|
+
expect(system).toContain('ARIA roles');
|
|
45
|
+
});
|
|
46
|
+
it('includes spec deltas in the user prompt', async () => {
|
|
47
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
48
|
+
mockGenerateText.mockResolvedValue({
|
|
49
|
+
text: 'component code',
|
|
41
50
|
});
|
|
51
|
+
await generateComponentFile({ componentName: 'Button', specDeltas });
|
|
42
52
|
const prompt = mockGenerateText.mock.calls[0][0].prompt;
|
|
53
|
+
expect(prompt).toContain('## Spec Deltas');
|
|
43
54
|
expect(prompt).toContain('## Structure');
|
|
44
55
|
expect(prompt).toContain('renders a Button element');
|
|
45
|
-
expect(prompt).toContain('
|
|
46
|
-
expect(prompt).toContain('describe("Button", () => {})');
|
|
56
|
+
expect(prompt).toContain('**Button**');
|
|
47
57
|
});
|
|
48
58
|
it('includes existing component code when provided', async () => {
|
|
49
59
|
const mockGenerateText = vi.mocked(generateText);
|
|
@@ -53,25 +63,11 @@ describe('generateComponentFile', () => {
|
|
|
53
63
|
await generateComponentFile({
|
|
54
64
|
componentName: 'Button',
|
|
55
65
|
specDeltas,
|
|
56
|
-
testCode: 'test code',
|
|
57
66
|
existingComponent: 'export function Button() {}',
|
|
58
67
|
});
|
|
59
68
|
const prompt = mockGenerateText.mock.calls[0][0].prompt;
|
|
60
69
|
expect(prompt).toContain('## Existing Component');
|
|
61
70
|
expect(prompt).toContain('export function Button() {}');
|
|
62
71
|
});
|
|
63
|
-
it('uses system prompt referencing React component generation', async () => {
|
|
64
|
-
const mockGenerateText = vi.mocked(generateText);
|
|
65
|
-
mockGenerateText.mockResolvedValue({
|
|
66
|
-
text: 'code',
|
|
67
|
-
});
|
|
68
|
-
await generateComponentFile({
|
|
69
|
-
componentName: 'Button',
|
|
70
|
-
specDeltas,
|
|
71
|
-
testCode: 'test',
|
|
72
|
-
});
|
|
73
|
-
const system = mockGenerateText.mock.calls[0][0].system;
|
|
74
|
-
expect(system).toContain('React');
|
|
75
|
-
});
|
|
76
72
|
});
|
|
77
73
|
//# sourceMappingURL=generate-component.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-component.test.js","sourceRoot":"","sources":["../../src/generate-component.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;CAC9C,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,MAAM,UAAU,GAAG;IACjB,SAAS,EAAE,CAAC,0BAA0B,CAAC;IACvC,SAAS,EAAE,CAAC,yCAAyC,CAAC;IACtD,WAAW,EAAE,CAAC,4BAA4B,CAAC;IAC3C,OAAO,EAAE,CAAC,oCAAoC,CAAC;CAChD,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,gBAAgB,CAAC,iBAAiB,CAAC;YACjC,IAAI,EAAE,8DAA8D;SACzB,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;YACzC,aAAa,EAAE,QAAQ;YACvB,UAAU;
|
|
1
|
+
{"version":3,"file":"generate-component.test.js","sourceRoot":"","sources":["../../src/generate-component.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
type
|
|
2
|
-
|
|
3
|
-
rendering: string[];
|
|
4
|
-
interaction: string[];
|
|
5
|
-
styling: string[];
|
|
6
|
-
};
|
|
7
|
-
type GenerateStoryInput = {
|
|
8
|
-
componentName: string;
|
|
9
|
-
specDeltas: SpecDeltas;
|
|
10
|
-
componentCode: string;
|
|
11
|
-
};
|
|
1
|
+
import { type StoryPromptInput } from './prompt';
|
|
2
|
+
export type GenerateStoryInput = StoryPromptInput;
|
|
12
3
|
export declare function generateStoryFile(input: GenerateStoryInput): Promise<string>;
|
|
13
|
-
export {};
|
|
14
4
|
//# sourceMappingURL=generate-story.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-story.d.ts","sourceRoot":"","sources":["../../src/generate-story.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-story.d.ts","sourceRoot":"","sources":["../../src/generate-story.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAElD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlF"}
|
|
@@ -1,34 +1,13 @@
|
|
|
1
1
|
import { createModelFromEnv } from '@auto-engineer/model-factory';
|
|
2
2
|
import { generateText } from 'ai';
|
|
3
3
|
import { extractCodeBlock } from './extract-code-block.js';
|
|
4
|
-
|
|
5
|
-
if (items.length === 0)
|
|
6
|
-
return '';
|
|
7
|
-
return `## ${heading}\n${items.map((i) => `- ${i}`).join('\n')}`;
|
|
8
|
-
}
|
|
9
|
-
function buildPrompt(input) {
|
|
10
|
-
const sections = [
|
|
11
|
-
buildSpecSection('Structure', input.specDeltas.structure),
|
|
12
|
-
buildSpecSection('Rendering', input.specDeltas.rendering),
|
|
13
|
-
buildSpecSection('Interaction', input.specDeltas.interaction),
|
|
14
|
-
buildSpecSection('Styling', input.specDeltas.styling),
|
|
15
|
-
]
|
|
16
|
-
.filter(Boolean)
|
|
17
|
-
.join('\n\n');
|
|
18
|
-
return `Component: ${input.componentName}\n\n${sections}\n\n## Component Code\n\`\`\`tsx\n${input.componentCode}\n\`\`\``;
|
|
19
|
-
}
|
|
20
|
-
const SYSTEM_PROMPT = `You are a Storybook expert. Write a Storybook story file (.stories.tsx) for the described React component.
|
|
21
|
-
|
|
22
|
-
Rules:
|
|
23
|
-
- Use CSF3 format (export default meta, named story exports)
|
|
24
|
-
- Import Meta and StoryObj from @storybook/react
|
|
25
|
-
- Create stories that showcase different states from the spec
|
|
26
|
-
- Return ONLY the story file code, no commentary`;
|
|
4
|
+
import { buildStoryPrompt } from './prompt.js';
|
|
27
5
|
export async function generateStoryFile(input) {
|
|
6
|
+
const { system, prompt } = buildStoryPrompt(input);
|
|
28
7
|
const { text } = await generateText({
|
|
29
8
|
model: createModelFromEnv(),
|
|
30
|
-
system
|
|
31
|
-
prompt
|
|
9
|
+
system,
|
|
10
|
+
prompt,
|
|
32
11
|
});
|
|
33
12
|
return extractCodeBlock(text);
|
|
34
13
|
}
|