erne-universal 0.6.0 → 0.6.1
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/docs/getting-started.md +28 -2
- package/lib/doctor.js +36 -0
- package/lib/generate.js +2 -2
- package/package.json +6 -2
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.1",
|
|
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
|
},
|