erne-universal 0.6.0 → 0.6.2
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/README.md +1 -1
- package/dashboard/activity-history.json +222 -0
- package/dashboard/server.js +12 -0
- package/docs/getting-started.md +28 -2
- package/lib/doctor.js +36 -0
- package/lib/generate.js +2 -2
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[](https://makeapullrequest.com)
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
|
-
<video src="https://github.com/
|
|
11
|
+
<video src="https://github.com/user-attachments/assets/08e578e9-1bbd-49af-bac4-0b18365137af" autoplay loop muted playsinline width="800"></video>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
14
|
---
|
|
@@ -117,6 +117,32 @@
|
|
|
117
117
|
"task": "Design navigation stack with tab bar and modal routes",
|
|
118
118
|
"timestamp": "2026-03-11T15:49:36.120Z",
|
|
119
119
|
"durationMs": 9690
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"type": "planning",
|
|
123
|
+
"task": "Design navigation architecture for profile feature",
|
|
124
|
+
"timestamp": "2026-03-13T07:43:37.547Z"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"type": "complete",
|
|
128
|
+
"task": "Navigation architecture designed",
|
|
129
|
+
"timestamp": "2026-03-13T07:45:24.549Z",
|
|
130
|
+
"durationMs": null
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"type": "planning",
|
|
134
|
+
"task": "Design navigation architecture for profile feature",
|
|
135
|
+
"timestamp": "2026-03-13T07:46:03.674Z"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"type": "planning",
|
|
139
|
+
"task": "Planning authentication flow with biometrics",
|
|
140
|
+
"timestamp": "2026-03-13T07:48:50.155Z"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"type": "planning",
|
|
144
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
145
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
120
146
|
}
|
|
121
147
|
],
|
|
122
148
|
"native-bridge-builder": [
|
|
@@ -167,6 +193,27 @@
|
|
|
167
193
|
"task": "Configure push notification native module",
|
|
168
194
|
"timestamp": "2026-03-11T15:49:44.129Z",
|
|
169
195
|
"durationMs": 16888
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"type": "start",
|
|
199
|
+
"task": "Building camera Turbo Module",
|
|
200
|
+
"timestamp": "2026-03-13T07:43:37.606Z"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"type": "complete",
|
|
204
|
+
"task": "Camera Turbo Module ready",
|
|
205
|
+
"timestamp": "2026-03-13T07:46:46.399Z",
|
|
206
|
+
"durationMs": 188793
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"type": "start",
|
|
210
|
+
"task": "Creating haptic feedback native module",
|
|
211
|
+
"timestamp": "2026-03-13T07:48:50.180Z"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"type": "planning",
|
|
215
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
216
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
170
217
|
}
|
|
171
218
|
],
|
|
172
219
|
"expo-config-resolver": [
|
|
@@ -184,6 +231,32 @@
|
|
|
184
231
|
"type": "planning",
|
|
185
232
|
"task": "Design navigation architecture for the app",
|
|
186
233
|
"timestamp": "2026-03-11T15:49:21.419Z"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"type": "planning",
|
|
237
|
+
"task": "Design navigation architecture for profile feature",
|
|
238
|
+
"timestamp": "2026-03-13T07:43:37.547Z"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"type": "complete",
|
|
242
|
+
"task": "Config resolved for Expo SDK 52",
|
|
243
|
+
"timestamp": "2026-03-13T07:45:24.557Z",
|
|
244
|
+
"durationMs": null
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"type": "planning",
|
|
248
|
+
"task": "Design navigation architecture for profile feature",
|
|
249
|
+
"timestamp": "2026-03-13T07:46:03.674Z"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"type": "planning",
|
|
253
|
+
"task": "Planning authentication flow with biometrics",
|
|
254
|
+
"timestamp": "2026-03-13T07:48:50.155Z"
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"type": "planning",
|
|
258
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
259
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
187
260
|
}
|
|
188
261
|
],
|
|
189
262
|
"ui-designer": [
|
|
@@ -270,6 +343,21 @@
|
|
|
270
343
|
"task": "Create design system tokens and component library",
|
|
271
344
|
"timestamp": "2026-03-11T15:49:40.625Z",
|
|
272
345
|
"durationMs": 13588
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"type": "start",
|
|
349
|
+
"task": "Create responsive card layout with NativeWind",
|
|
350
|
+
"timestamp": "2026-03-13T07:43:37.574Z"
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"type": "start",
|
|
354
|
+
"task": "Design bottom sheet with gesture handler",
|
|
355
|
+
"timestamp": "2026-03-13T07:48:50.188Z"
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
"type": "planning",
|
|
359
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
360
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
273
361
|
}
|
|
274
362
|
],
|
|
275
363
|
"code-reviewer": [
|
|
@@ -336,6 +424,21 @@
|
|
|
336
424
|
"task": "Review PR #42: navigation refactor",
|
|
337
425
|
"timestamp": "2026-03-11T15:49:45.733Z",
|
|
338
426
|
"durationMs": 18087
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
"type": "start",
|
|
430
|
+
"task": "Review authentication module",
|
|
431
|
+
"timestamp": "2026-03-13T07:43:37.591Z"
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
"type": "start",
|
|
435
|
+
"task": "Review payment integration module",
|
|
436
|
+
"timestamp": "2026-03-13T07:48:50.195Z"
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"type": "planning",
|
|
440
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
441
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
339
442
|
}
|
|
340
443
|
],
|
|
341
444
|
"upgrade-assistant": [
|
|
@@ -353,6 +456,21 @@
|
|
|
353
456
|
"type": "planning",
|
|
354
457
|
"task": "Design navigation architecture for the app",
|
|
355
458
|
"timestamp": "2026-03-11T15:49:21.419Z"
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"type": "start",
|
|
462
|
+
"task": "Migrating to Expo SDK 52",
|
|
463
|
+
"timestamp": "2026-03-13T07:43:37.614Z"
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
"type": "start",
|
|
467
|
+
"task": "Migrate from React Navigation 6 to 7",
|
|
468
|
+
"timestamp": "2026-03-13T07:48:50.203Z"
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
"type": "planning",
|
|
472
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
473
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
356
474
|
}
|
|
357
475
|
],
|
|
358
476
|
"tdd-guide": [
|
|
@@ -424,6 +542,21 @@
|
|
|
424
542
|
"task": "Write unit tests for auth service layer",
|
|
425
543
|
"timestamp": "2026-03-11T15:49:44.931Z",
|
|
426
544
|
"durationMs": 17489
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"type": "start",
|
|
548
|
+
"task": "Writing test suite for auth service",
|
|
549
|
+
"timestamp": "2026-03-13T07:43:37.582Z"
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
"type": "start",
|
|
553
|
+
"task": "Writing E2E tests for checkout flow",
|
|
554
|
+
"timestamp": "2026-03-13T07:48:50.210Z"
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"type": "planning",
|
|
558
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
559
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
427
560
|
}
|
|
428
561
|
],
|
|
429
562
|
"performance-profiler": [
|
|
@@ -474,6 +607,21 @@
|
|
|
474
607
|
"task": "Profile app startup time and optimize TTI",
|
|
475
608
|
"timestamp": "2026-03-11T15:49:46.535Z",
|
|
476
609
|
"durationMs": 18686
|
|
610
|
+
},
|
|
611
|
+
{
|
|
612
|
+
"type": "start",
|
|
613
|
+
"task": "Analyze re-renders in feed screen",
|
|
614
|
+
"timestamp": "2026-03-13T07:43:37.598Z"
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
"type": "start",
|
|
618
|
+
"task": "Profiling Hermes bundle size",
|
|
619
|
+
"timestamp": "2026-03-13T07:48:50.218Z"
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
"type": "planning",
|
|
623
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
624
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
477
625
|
}
|
|
478
626
|
],
|
|
479
627
|
"senior-developer": [
|
|
@@ -555,6 +703,43 @@
|
|
|
555
703
|
"task": "Implement authentication flow with biometric login",
|
|
556
704
|
"timestamp": "2026-03-11T15:49:37.623Z",
|
|
557
705
|
"durationMs": 10991
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
"type": "start",
|
|
709
|
+
"task": "Implement ProfileScreen with avatar and stats",
|
|
710
|
+
"timestamp": "2026-03-13T07:43:37.556Z"
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
"type": "complete",
|
|
714
|
+
"task": "ProfileScreen implemented",
|
|
715
|
+
"timestamp": "2026-03-13T07:45:24.565Z",
|
|
716
|
+
"durationMs": 107009
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
"type": "start",
|
|
720
|
+
"task": "Implement ProfileScreen with avatar and stats",
|
|
721
|
+
"timestamp": "2026-03-13T07:46:03.682Z"
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
"type": "complete",
|
|
725
|
+
"task": "ProfileScreen implemented",
|
|
726
|
+
"timestamp": "2026-03-13T07:46:46.383Z",
|
|
727
|
+
"durationMs": 42701
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
"type": "start",
|
|
731
|
+
"task": "Implement settings screen with dark mode toggle",
|
|
732
|
+
"timestamp": "2026-03-13T07:46:46.916Z"
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
"type": "start",
|
|
736
|
+
"task": "Build chat screen with real-time messaging",
|
|
737
|
+
"timestamp": "2026-03-13T07:48:50.163Z"
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
"type": "planning",
|
|
741
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
742
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
558
743
|
}
|
|
559
744
|
],
|
|
560
745
|
"feature-builder": [
|
|
@@ -636,6 +821,43 @@
|
|
|
636
821
|
"task": "Build onboarding carousel with animations",
|
|
637
822
|
"timestamp": "2026-03-11T15:49:39.125Z",
|
|
638
823
|
"durationMs": 12290
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"type": "start",
|
|
827
|
+
"task": "Build user onboarding flow",
|
|
828
|
+
"timestamp": "2026-03-13T07:43:37.566Z"
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
"type": "complete",
|
|
832
|
+
"task": "Onboarding flow complete",
|
|
833
|
+
"timestamp": "2026-03-13T07:45:24.573Z",
|
|
834
|
+
"durationMs": 107007
|
|
835
|
+
},
|
|
836
|
+
{
|
|
837
|
+
"type": "start",
|
|
838
|
+
"task": "Build user onboarding flow",
|
|
839
|
+
"timestamp": "2026-03-13T07:46:03.689Z"
|
|
840
|
+
},
|
|
841
|
+
{
|
|
842
|
+
"type": "complete",
|
|
843
|
+
"task": "Onboarding flow complete",
|
|
844
|
+
"timestamp": "2026-03-13T07:46:46.391Z",
|
|
845
|
+
"durationMs": 42702
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
"type": "start",
|
|
849
|
+
"task": "Add push notification handler",
|
|
850
|
+
"timestamp": "2026-03-13T07:46:46.924Z"
|
|
851
|
+
},
|
|
852
|
+
{
|
|
853
|
+
"type": "start",
|
|
854
|
+
"task": "Implement deep linking for shared content",
|
|
855
|
+
"timestamp": "2026-03-13T07:48:50.171Z"
|
|
856
|
+
},
|
|
857
|
+
{
|
|
858
|
+
"type": "planning",
|
|
859
|
+
"task": "Sprint planning — designing v2.0 architecture",
|
|
860
|
+
"timestamp": "2026-03-13T07:50:26.185Z"
|
|
639
861
|
}
|
|
640
862
|
]
|
|
641
863
|
}
|
package/dashboard/server.js
CHANGED
|
@@ -344,6 +344,9 @@ const server = http.createServer(async (req, res) => {
|
|
|
344
344
|
wss = new WebSocketServer({ server, maxPayload: 65536 });
|
|
345
345
|
|
|
346
346
|
wss.on('connection', (ws) => {
|
|
347
|
+
ws.isAlive = true;
|
|
348
|
+
ws.on('pong', () => { ws.isAlive = true; });
|
|
349
|
+
|
|
347
350
|
ws.send(JSON.stringify({
|
|
348
351
|
type: 'init',
|
|
349
352
|
agents: agentState,
|
|
@@ -366,6 +369,15 @@ wss.on('connection', (ws) => {
|
|
|
366
369
|
});
|
|
367
370
|
});
|
|
368
371
|
|
|
372
|
+
// Heartbeat: ping every 30s, terminate dead connections
|
|
373
|
+
setInterval(() => {
|
|
374
|
+
for (const ws of wss.clients) {
|
|
375
|
+
if (!ws.isAlive) { ws.terminate(); continue; }
|
|
376
|
+
ws.isAlive = false;
|
|
377
|
+
ws.ping();
|
|
378
|
+
}
|
|
379
|
+
}, 30000);
|
|
380
|
+
|
|
369
381
|
server.listen(PORT, () => {
|
|
370
382
|
console.log(`ERNE Dashboard running on http://localhost:${PORT}`);
|
|
371
383
|
});
|
package/docs/getting-started.md
CHANGED
|
@@ -23,7 +23,7 @@ ERNE's `init` command deep-scans your project across 15 stack dimensions — nav
|
|
|
23
23
|
```
|
|
24
24
|
.claude/
|
|
25
25
|
agents/ # 11 specialized AI agents
|
|
26
|
-
rules/ #
|
|
26
|
+
rules/ # 26 coding standard rules (layered by platform)
|
|
27
27
|
commands/ # 19 slash commands
|
|
28
28
|
contexts/ # 3 behavior modes (dev, review, vibe)
|
|
29
29
|
hooks.json # Git-style hooks for quality enforcement
|
|
@@ -56,9 +56,35 @@ Control quality enforcement level:
|
|
|
56
56
|
|
|
57
57
|
Change profile: set `ERNE_PROFILE=minimal|standard|strict` in your environment.
|
|
58
58
|
|
|
59
|
+
## Multi-Agent Orchestration
|
|
60
|
+
|
|
61
|
+
Use `/orchestrate` to coordinate agents through a 5-phase pipeline:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
/orchestrate "build user profile screen"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The pipeline orchestrator decomposes the task, dispatches agents (some in parallel), and validates results. See [Pipeline Documentation](pipeline.md) for details.
|
|
68
|
+
|
|
69
|
+
## Memory Integration
|
|
70
|
+
|
|
71
|
+
ERNE agents build persistent knowledge about your project across sessions. Patterns learned by one agent (e.g., architect discovering a naming convention) are available to all other agents in future sessions. See [Memory Integration](memory-integration.md) for details.
|
|
72
|
+
|
|
73
|
+
## Troubleshooting
|
|
74
|
+
|
|
75
|
+
| Problem | Solution |
|
|
76
|
+
|---------|----------|
|
|
77
|
+
| `init` fails with "No React Native project detected" | Make sure `package.json` has `react-native` or `expo` in dependencies |
|
|
78
|
+
| Hooks not running | Check `ERNE_PROFILE` env var and `.claude/hooks.json` |
|
|
79
|
+
| Wrong variant selected | Re-run `npx erne-universal init` — it's safe to run multiple times |
|
|
80
|
+
| Dashboard won't start | Run `erne doctor` to check setup, ensure port 3333 is free |
|
|
81
|
+
| MCP server errors | Verify required tools are installed (Xcode for agent-device, etc.) |
|
|
82
|
+
|
|
59
83
|
## Learn More
|
|
60
84
|
|
|
61
|
-
- [Agents](agents.md) — How specialized agents work
|
|
85
|
+
- [Agents](agents.md) — How 11 specialized agents work
|
|
62
86
|
- [Commands](commands.md) — All 19 slash commands
|
|
87
|
+
- [Pipeline & Orchestration](pipeline.md) — Multi-agent workflow coordination
|
|
88
|
+
- [Memory Integration](memory-integration.md) — Cross-session learning
|
|
63
89
|
- [Hook Profiles](hooks-profiles.md) — Quality enforcement system
|
|
64
90
|
- [Creating Skills](creating-skills.md) — Extend ERNE with custom knowledge
|
package/lib/doctor.js
CHANGED
|
@@ -38,6 +38,9 @@ async function doctor() {
|
|
|
38
38
|
// 8. Check node_modules
|
|
39
39
|
results.push(checkNodeModules(cwd));
|
|
40
40
|
|
|
41
|
+
// 9. Check variant files were applied
|
|
42
|
+
results.push(checkVariants(cwd));
|
|
43
|
+
|
|
41
44
|
// Print
|
|
42
45
|
console.log('\n ERNE Doctor — Project Health Check\n');
|
|
43
46
|
for (const r of results) {
|
|
@@ -215,4 +218,37 @@ function checkNodeModules(cwd) {
|
|
|
215
218
|
return { pass: false, message: 'node_modules not found (run npm install)' };
|
|
216
219
|
}
|
|
217
220
|
|
|
221
|
+
function checkVariants(cwd) {
|
|
222
|
+
const settingsPath = path.join(cwd, '.claude', 'settings.json');
|
|
223
|
+
if (!fs.existsSync(settingsPath)) {
|
|
224
|
+
return { pass: true, message: 'Variants: cannot check (no settings.json)' };
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
const data = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
228
|
+
const detection = data.detection;
|
|
229
|
+
if (!detection || !detection.stack) {
|
|
230
|
+
return { pass: true, message: 'Variants: no detection data in settings' };
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Check a key variant file — if state-management was detected, the variant should differ from generic
|
|
234
|
+
const stateMgmt = path.join(cwd, '.claude', 'rules', 'common', 'state-management.md');
|
|
235
|
+
if (!fs.existsSync(stateMgmt)) {
|
|
236
|
+
return { pass: true, message: 'Variants: rules not installed (run erne init)' };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const content = fs.readFileSync(stateMgmt, 'utf8');
|
|
240
|
+
const state = detection.stack.state;
|
|
241
|
+
if (state && state !== 'none') {
|
|
242
|
+
const hasVariantHint = content.includes(state) || content.includes('Zustand') || content.includes('Redux') || content.includes('MobX');
|
|
243
|
+
if (hasVariantHint) {
|
|
244
|
+
return { pass: true, message: `Variants: stack-tailored rules applied (${state})` };
|
|
245
|
+
}
|
|
246
|
+
return { pass: false, message: `Variants: state-management.md may be generic (expected ${state} variant). Re-run: npx erne-universal init` };
|
|
247
|
+
}
|
|
248
|
+
return { pass: true, message: 'Variants: no state management detected' };
|
|
249
|
+
} catch {
|
|
250
|
+
return { pass: true, message: 'Variants: could not verify (settings parse error)' };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
218
254
|
module.exports = doctor;
|
package/lib/generate.js
CHANGED
|
@@ -249,7 +249,7 @@ function generateConfig(erneRoot, targetDir, detection, profile, mcpSelections)
|
|
|
249
249
|
if (!targetPath.startsWith('rules/')) continue;
|
|
250
250
|
const variantName = selectVariant(targetPath, detection);
|
|
251
251
|
if (!variantName) continue;
|
|
252
|
-
const variantSrc = path.join(erneRoot, 'variants', variantName);
|
|
252
|
+
const variantSrc = path.join(erneRoot, 'rules', 'variants', variantName);
|
|
253
253
|
if (fs.existsSync(variantSrc)) {
|
|
254
254
|
const destFile = path.join(targetDir, targetPath);
|
|
255
255
|
fs.mkdirSync(path.dirname(destFile), { recursive: true });
|
|
@@ -284,7 +284,7 @@ function generateConfig(erneRoot, targetDir, detection, profile, mcpSelections)
|
|
|
284
284
|
if (!targetPath.startsWith('agents/')) continue;
|
|
285
285
|
const variantName = selectVariant(targetPath, detection);
|
|
286
286
|
if (!variantName) continue;
|
|
287
|
-
const variantSrc = path.join(erneRoot, 'variants', variantName);
|
|
287
|
+
const variantSrc = path.join(erneRoot, 'agents', 'variants', variantName);
|
|
288
288
|
if (fs.existsSync(variantSrc)) {
|
|
289
289
|
const destFile = path.join(targetDir, targetPath);
|
|
290
290
|
fs.mkdirSync(path.dirname(destFile), { recursive: true });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "erne-universal",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Complete AI coding agent harness for React Native and Expo development",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react-native",
|
|
@@ -11,11 +11,15 @@
|
|
|
11
11
|
"coding-assistant"
|
|
12
12
|
],
|
|
13
13
|
"license": "MIT",
|
|
14
|
+
"author": "Juba Kitiashvili",
|
|
14
15
|
"repository": {
|
|
15
16
|
"type": "git",
|
|
16
|
-
"url": "https://github.com/JubaKitiashvili/everything-react-native-expo"
|
|
17
|
+
"url": "git+https://github.com/JubaKitiashvili/everything-react-native-expo.git"
|
|
17
18
|
},
|
|
18
19
|
"homepage": "https://erne.dev",
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/JubaKitiashvili/everything-react-native-expo/issues"
|
|
22
|
+
},
|
|
19
23
|
"bin": {
|
|
20
24
|
"erne": "./bin/cli.js"
|
|
21
25
|
},
|