erne-universal 0.6.1 → 0.6.3
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 +19 -6
- package/dashboard/activity-history.json +222 -0
- package/dashboard/server.js +12 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,13 +8,15 @@
|
|
|
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
|
---
|
|
15
15
|
|
|
16
16
|
## ⚡ Quick Start
|
|
17
17
|
|
|
18
|
+
> **Prerequisite:** [Claude Code](https://claude.ai/claude-code) is required for the full experience (11 agents, pipeline orchestration, dashboard, hooks). Other IDEs receive adaptive rules and configuration — see [IDE Support](#%EF%B8%8F-ide--editor-support).
|
|
19
|
+
|
|
18
20
|
```bash
|
|
19
21
|
npx erne-universal init
|
|
20
22
|
```
|
|
@@ -157,19 +159,30 @@ Change profile: set `ERNE_PROFILE` env var, add `<!-- Hook Profile: standard -->
|
|
|
157
159
|
|
|
158
160
|
## 🖥️ IDE & Editor Support
|
|
159
161
|
|
|
160
|
-
ERNE
|
|
162
|
+
ERNE generates adaptive config files for multiple IDEs, but the **full agent experience requires Claude Code**:
|
|
163
|
+
|
|
164
|
+
| Feature | Claude Code | Cursor / Windsurf / Copilot / Codex |
|
|
165
|
+
|---------|:-----------:|:------------------------------------:|
|
|
166
|
+
| Adaptive rules & config | ✅ | ✅ |
|
|
167
|
+
| Stack detection (15 dimensions) | ✅ | ✅ |
|
|
168
|
+
| 19 slash commands | ✅ | ❌ |
|
|
169
|
+
| 11 specialized agents | ✅ | ❌ |
|
|
170
|
+
| Pipeline orchestration | ✅ | ❌ |
|
|
171
|
+
| Hook profiles | ✅ | ❌ |
|
|
172
|
+
| Agent dashboard | ✅ | ❌ |
|
|
173
|
+
| Cross-session memory | ✅ | ❌ |
|
|
174
|
+
|
|
175
|
+
**Generated config files:**
|
|
161
176
|
|
|
162
177
|
| File | IDE / Tool |
|
|
163
178
|
|------|-----------|
|
|
164
|
-
| `CLAUDE.md` | Claude Code |
|
|
179
|
+
| `CLAUDE.md` | Claude Code (full experience) |
|
|
165
180
|
| `AGENTS.md` | Codex, Windsurf, Cursor, GitHub Copilot |
|
|
166
|
-
| `GEMINI.md` |
|
|
181
|
+
| `GEMINI.md` | Gemini CLI |
|
|
167
182
|
| `.cursorrules` | Cursor |
|
|
168
183
|
| `.windsurfrules` | Windsurf |
|
|
169
184
|
| `.github/copilot-instructions.md` | GitHub Copilot |
|
|
170
185
|
|
|
171
|
-
All config files are generated adaptively based on your project's detected stack.
|
|
172
|
-
|
|
173
186
|
---
|
|
174
187
|
|
|
175
188
|
## 🏗️ Architecture
|
|
@@ -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
|
});
|