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 CHANGED
@@ -8,7 +8,7 @@
8
8
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://makeapullrequest.com)
9
9
 
10
10
  <p align="center">
11
- <video src="https://github.com/JubaKitiashvili/everything-react-native-expo/raw/main/demo-dashboard.mp4" autoplay loop muted playsinline width="800"></video>
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
  }
@@ -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
  });
@@ -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/ # 25 coding standard rules (layered by platform)
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.0",
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
  },