@sallmarta/eye-hate-agent 1.0.6 → 1.0.7
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 -0
- package/bin/eha.js +53 -22
- package/docs/templates/reusable-prompts/00-eha-help.md +56 -0
- package/package.json +1 -1
- package/src/engine/workflow-registry.js +6 -0
package/README.md
CHANGED
|
@@ -35,6 +35,7 @@ Once initialized, EHA projects a series of interactive workflows directly into y
|
|
|
35
35
|
| **`/eha-refresh`** | The main workhorse for repos with **any existing documentation**. Updates active SDD docs, migrates legacy docs, converts non-SDD docs, and creates missing SDD files — all by cross-referencing the actual codebase alongside existing material. Auto-detects the appropriate Taxonomy Tier for migration scenarios. Prompts the user to resolve any drift between codebase and docs. |
|
|
36
36
|
| **`/sdd-discuss`** | Collaborative brainstorming. Interviews you about edge cases, API shapes, data models, and constraints, then drafts spec snippets ready for injection into project docs. No code output. |
|
|
37
37
|
| **`/sdd-execute`** | Spec-Driven code generation via strict TDD. Reads specs → generates tests → generates code → validates against architecture. Refuses to code features not in the spec. |
|
|
38
|
+
| **`/eha-help`** | **EHA Help & Tutorial.** Interactive guide providing descriptions of EHA's 4-layer taxonomy, active workflows, and specialist skills. |
|
|
38
39
|
|
|
39
40
|
> **Looking for parity audits?** Use the `parity-audit` skill directly:
|
|
40
41
|
> `@agent use parity-audit on this repository`
|
package/bin/eha.js
CHANGED
|
@@ -25,33 +25,34 @@ async function promptAgentChoice(currentAgent) {
|
|
|
25
25
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
26
26
|
try {
|
|
27
27
|
const runtimes = listSupportedRuntimes();
|
|
28
|
-
const defaultIndex =
|
|
29
|
-
? runtimes.findIndex(r => r.id === currentAgent) + 1
|
|
30
|
-
: 1;
|
|
28
|
+
const defaultIndex = 1;
|
|
31
29
|
|
|
32
30
|
console.log('');
|
|
33
31
|
console.log('Which agent?');
|
|
34
32
|
for (let i = 0; i < runtimes.length; i++) {
|
|
35
33
|
console.log(` ${i + 1}. ${runtimes[i].name}`);
|
|
36
34
|
}
|
|
35
|
+
console.log(` ${runtimes.length + 1}. All Agents`);
|
|
37
36
|
|
|
37
|
+
const maxChoice = runtimes.length + 1;
|
|
38
38
|
const answer = await rl.question(
|
|
39
|
-
`Choose [1-${
|
|
39
|
+
`Choose [1-${maxChoice}] (default: ${defaultIndex}): `,
|
|
40
40
|
);
|
|
41
41
|
const trimmed = answer.trim();
|
|
42
42
|
|
|
43
|
-
// Accept number or name
|
|
44
43
|
if (!trimmed) return runtimes[defaultIndex - 1].id;
|
|
45
44
|
|
|
46
45
|
const num = parseInt(trimmed, 10);
|
|
47
46
|
if (num >= 1 && num <= runtimes.length) return runtimes[num - 1].id;
|
|
47
|
+
if (num === maxChoice) return 'all';
|
|
48
48
|
|
|
49
|
-
// Fallback: try to match by name (backward compat)
|
|
50
49
|
const normalized = trimmed.toLowerCase();
|
|
50
|
+
if (normalized === 'all') return 'all';
|
|
51
|
+
|
|
51
52
|
const match = runtimes.find(r => r.id === normalized);
|
|
52
53
|
if (match) return match.id;
|
|
53
54
|
|
|
54
|
-
return trimmed.toLowerCase();
|
|
55
|
+
return trimmed.toLowerCase();
|
|
55
56
|
} finally {
|
|
56
57
|
rl.close();
|
|
57
58
|
}
|
|
@@ -76,11 +77,11 @@ function resolveRootDir() {
|
|
|
76
77
|
} catch {
|
|
77
78
|
console.error(
|
|
78
79
|
chalk.red('No project root found.') +
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
' Run ' +
|
|
81
|
+
chalk.cyan('npm init -y') +
|
|
82
|
+
' or ' +
|
|
83
|
+
chalk.cyan('git init') +
|
|
84
|
+
' first.',
|
|
84
85
|
);
|
|
85
86
|
process.exit(1);
|
|
86
87
|
}
|
|
@@ -96,15 +97,13 @@ function printInitSummary(result) {
|
|
|
96
97
|
}
|
|
97
98
|
console.log('');
|
|
98
99
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
);
|
|
107
|
-
}
|
|
100
|
+
const agentNames = {
|
|
101
|
+
claude: 'Claude',
|
|
102
|
+
copilot: 'GitHub Copilot',
|
|
103
|
+
antigravity: 'Antigravity',
|
|
104
|
+
};
|
|
105
|
+
const name = agentNames[result.agentId] || result.agentId;
|
|
106
|
+
console.log(`Open ${name} in this project and run ${chalk.cyan('/eha-help')} to get started!`);
|
|
108
107
|
console.log('');
|
|
109
108
|
}
|
|
110
109
|
|
|
@@ -158,12 +157,44 @@ async function runInitWizard(agentIdArg) {
|
|
|
158
157
|
}
|
|
159
158
|
|
|
160
159
|
const normalized = String(agentId).trim().toLowerCase();
|
|
160
|
+
|
|
161
|
+
if (normalized === 'all') {
|
|
162
|
+
const installedAgents = config.agents || (config.agent ? [config.agent] : []);
|
|
163
|
+
if (isInteractive && installedAgents.length > 0) {
|
|
164
|
+
const listStr = installedAgents.map(a => chalk.cyan(a)).join(', ');
|
|
165
|
+
const confirm = await promptConfirm(
|
|
166
|
+
`EHA is set up for: ${listStr}. Overwrite / setup all agents?`,
|
|
167
|
+
true,
|
|
168
|
+
);
|
|
169
|
+
if (!confirm) {
|
|
170
|
+
console.log('Skipped.');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
console.log(chalk.blue('\nInitializing EHA for all agents...'));
|
|
176
|
+
let fileCount = 0;
|
|
177
|
+
for (const id of SUPPORTED_AGENT_IDS) {
|
|
178
|
+
const result = initProject({ rootDir, agentId: id });
|
|
179
|
+
fileCount += result.fileCount;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
console.log('');
|
|
183
|
+
console.log(chalk.green('✓ EHA is ready for all agents.'));
|
|
184
|
+
console.log(` Agents : ${SUPPORTED_AGENT_IDS.map(a => chalk.cyan(a)).join(', ')}`);
|
|
185
|
+
console.log(` Files : ${fileCount} file(s) generated`);
|
|
186
|
+
console.log('');
|
|
187
|
+
console.log('Open Agents in this project and run ' + chalk.cyan('/eha-help') + ' to get started or run ' + chalk.cyan('eha doctor') + ' to see all files.');
|
|
188
|
+
console.log('');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
|
|
161
192
|
if (!SUPPORTED_AGENT_IDS.includes(normalized)) {
|
|
162
193
|
const runtimes = listSupportedRuntimes();
|
|
163
194
|
const list = runtimes.map((r, i) => `${i + 1}. ${r.name}`).join(', ');
|
|
164
195
|
console.error(
|
|
165
196
|
chalk.red(`Unsupported agent: ${agentIdArg || agentId}.`) +
|
|
166
|
-
|
|
197
|
+
` Choose one of: ${list}, or ${runtimes.length + 1}. All Agents.`,
|
|
167
198
|
);
|
|
168
199
|
process.exit(1);
|
|
169
200
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "EHA workflow - help"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# EHA Help & Tutorial
|
|
6
|
+
|
|
7
|
+
This is your interactive guide to using Eye Hate Agent (EHA).
|
|
8
|
+
|
|
9
|
+
## 1. Overview
|
|
10
|
+
Eye Hate Agent (EHA) standardizes human-agent collaboration through a unified Spec-Driven Development (SDD) contract, structured workflows, and specialist skills.
|
|
11
|
+
|
|
12
|
+
## 2. The 4-Layer Taxonomy
|
|
13
|
+
All project documentation is structured under a predictable 4-layer taxonomy:
|
|
14
|
+
- `docs/project-docs/foundation/` — PRD, Phases, Status, Changelog
|
|
15
|
+
- `docs/project-docs/operations/` — CI/CD, Deployment, Runbooks
|
|
16
|
+
- `docs/project-docs/development/` — Testing, Database, Architecture, API-Contract, UI-UX
|
|
17
|
+
- `docs/project-docs/technical-guidelines/` — Stable project/language/linting guidelines
|
|
18
|
+
|
|
19
|
+
## 3. Interactive Workflow Commands
|
|
20
|
+
Trigger these commands inside your chat window to coordinate development:
|
|
21
|
+
|
|
22
|
+
| Trigger Command | Purpose | When to Use |
|
|
23
|
+
| :--- | :--- | :--- |
|
|
24
|
+
| `/eha-bootstrap` | Initializes a brand-new documentation set | Run only in **empty repositories** with zero docs. |
|
|
25
|
+
| `/eha-refresh` | Synchronizes and migrates project documentation | Run in **active projects** to sync code with docs. |
|
|
26
|
+
| `/sdd-discuss` | Brainstorm specifications and API contracts | Run **before coding** to align specs. |
|
|
27
|
+
| `/sdd-execute` | Spec-driven code generation via TDD | Run **during implementation** to write tests/code. |
|
|
28
|
+
|
|
29
|
+
## 4. Specialist Skills
|
|
30
|
+
Invoke skills directly in your prompts (e.g. `use eha-api-design`):
|
|
31
|
+
- `eha-system-analysis` — Inspect architecture and codebase logic
|
|
32
|
+
- `eha-api-design` — Plan or refactor REST/GraphQL/gRPC APIs
|
|
33
|
+
- `eha-db-schema-design` — Design schemas and migrations
|
|
34
|
+
- `eha-ui-ux-design` / `eha-wireframing` — UI/UX wireframes and styling systems
|
|
35
|
+
- `eha-code-audit` — Multi-layered verification and codebase scanning
|
|
36
|
+
- `eha-parity-audit` — Automated drift analysis
|
|
37
|
+
- `eha-security-audit` — Dependency scanning and threat modeling
|
|
38
|
+
- `eha-system-tester` — Rigorous testing plans and case design
|
|
39
|
+
- `eha-devops-ci-cd` — Build pipeline configurations
|
|
40
|
+
- `eha-observability` — Logs, metrics, trace instrumentation, and error handling
|
|
41
|
+
- `eha-refactor` — Technical debt cleanup and optimization
|
|
42
|
+
|
|
43
|
+
## 5. Quick Start Instructions
|
|
44
|
+
If starting a new feature:
|
|
45
|
+
1. Run `/sdd-discuss` to brainstorm specs.
|
|
46
|
+
2. Update project docs to reflect the spec.
|
|
47
|
+
3. Run `/sdd-execute` to execute code via TDD.
|
|
48
|
+
4. Maintain `changelog.md` and `status.md`.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 6. Strict Output Contract (Token Economy)
|
|
53
|
+
When the user triggers this command, you **MUST** adhere to the following rules to conserve maximum tokens:
|
|
54
|
+
1. **Ultra-Concision:** Respond immediately with extremely short, direct answers. Do not write introductory filler (no "Sure, let's look at...", "Here is...", or greetings).
|
|
55
|
+
2. **Minimal Text:** Keep all explanations under 5 words per item. Rely strictly on the tables and bullet lists above.
|
|
56
|
+
3. **Redirection:** Conclude the output in exactly one short question: "Which workflow would you like to run next?"
|
package/package.json
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
2
|
|
|
3
3
|
const WORKFLOW_DEFINITIONS = {
|
|
4
|
+
help: {
|
|
5
|
+
id: 'help',
|
|
6
|
+
commandName: 'help',
|
|
7
|
+
description: 'Get help and tutorial on EHA workflows and philosophy',
|
|
8
|
+
repoRelativePath: path.join('docs', 'templates', 'reusable-prompts', '00-eha-help.md'),
|
|
9
|
+
},
|
|
4
10
|
bootstrap: {
|
|
5
11
|
id: 'bootstrap',
|
|
6
12
|
commandName: 'bootstrap',
|