feat: add Hermes and OpenClaw harness install targets (#2433)

* feat: add Hermes and OpenClaw harness install targets

- Add scripts/lib/install-targets/hermes-home.js and openclaw-home.js
- Register new adapters in registry.js and helpers.js
- Add hermes/openclaw to SUPPORTED_INSTALL_TARGETS, schema enum, and install help text
- Add .hermes/ and .openclaw/ platform source directories with READMEs
- Update install-modules.json so rules/agents/commands/platform-configs cover the new targets

Verification:
- npx ecc doctor reports all 13 targets OK (including hermes-home and openclaw-home)
- install-targets regression guard passes for new targets
- Catalog check passes

* fix(install): register hermes/openclaw in install-modules schema enum + npm files allowlist

---------

Co-authored-by: Lxcardoza993 <265670745+Lxcardoza993@users.noreply.github.com>
Co-authored-by: Affaan Mustafa <me@affaanmustafa.com>
This commit is contained in:
Lx
2026-07-03 22:20:17 -07:00
committed by GitHub
co-authored by Lxcardoza993 Affaan Mustafa
parent 2d40baacbd
commit c837139e6c
12 changed files with 111 additions and 9 deletions
+21
View File
@@ -0,0 +1,21 @@
# ECC for Hermes
This directory contains the ECC (Everything Claude Code) configuration for the Hermes harness.
## What is installed
- `rules/ecc/` — shared coding rules and guidelines
- `skills/ecc/` — reusable skills
- `commands/` — slash commands
- `AGENTS.md` — agent instructions
## Manual install
```bash
bash ./install.sh --target hermes --profile minimal
```
## Notes
- Hermes config files (`config.yaml`, `.env`, etc.) are **not** touched by ECC install.
- Use `npx ecc doctor --target hermes` to check install health.
+21
View File
@@ -0,0 +1,21 @@
# ECC for OpenClaw
This directory contains the ECC (Everything Claude Code) configuration for the OpenClaw harness.
## What is installed
- `rules/ecc/` — shared coding rules and guidelines
- `skills/ecc/` — reusable skills
- `commands/` — slash commands
- `AGENTS.md` — agent instructions
## Manual install
```bash
bash ./install.sh --target openclaw --profile minimal
```
## Notes
- OpenClaw config files (`openclaw.json`, `config.toml`, `.env`, etc.) are **not** touched by ECC install.
- Use `npx ecc doctor --target openclaw` to check install health.
+18 -6
View File
@@ -16,7 +16,9 @@
"codebuddy", "codebuddy",
"joycode", "joycode",
"qwen", "qwen",
"zed" "zed",
"hermes",
"openclaw"
], ],
"dependencies": [], "dependencies": [],
"defaultInstall": true, "defaultInstall": true,
@@ -41,7 +43,9 @@
"codebuddy", "codebuddy",
"joycode", "joycode",
"qwen", "qwen",
"zed" "zed",
"hermes",
"openclaw"
], ],
"dependencies": [], "dependencies": [],
"defaultInstall": true, "defaultInstall": true,
@@ -66,7 +70,9 @@
"codebuddy", "codebuddy",
"joycode", "joycode",
"qwen", "qwen",
"zed" "zed",
"hermes",
"openclaw"
], ],
"dependencies": [], "dependencies": [],
"defaultInstall": true, "defaultInstall": true,
@@ -108,7 +114,9 @@
".zed", ".zed",
"mcp-configs", "mcp-configs",
"scripts/auto-update.js", "scripts/auto-update.js",
"scripts/setup-package-manager.js" "scripts/setup-package-manager.js",
".hermes",
".openclaw"
], ],
"targets": [ "targets": [
"claude", "claude",
@@ -121,7 +129,9 @@
"codebuddy", "codebuddy",
"joycode", "joycode",
"qwen", "qwen",
"zed" "zed",
"hermes",
"openclaw"
], ],
"dependencies": [], "dependencies": [],
"defaultInstall": true, "defaultInstall": true,
@@ -276,7 +286,9 @@
"codebuddy", "codebuddy",
"joycode", "joycode",
"qwen", "qwen",
"zed" "zed",
"hermes",
"openclaw"
], ],
"dependencies": [ "dependencies": [
"platform-configs" "platform-configs"
+2
View File
@@ -46,7 +46,9 @@
".codex-plugin/", ".codex-plugin/",
".cursor/", ".cursor/",
".gemini/", ".gemini/",
".hermes/",
".opencode/", ".opencode/",
".openclaw/",
".qwen/", ".qwen/",
".zed/", ".zed/",
".mcp.json", ".mcp.json",
+3 -1
View File
@@ -28,7 +28,9 @@
"codebuddy", "codebuddy",
"joycode", "joycode",
"qwen", "qwen",
"zed" "zed",
"hermes",
"openclaw"
] ]
}, },
"profile": { "profile": {
+3 -1
View File
@@ -58,7 +58,9 @@
"codebuddy", "codebuddy",
"joycode", "joycode",
"qwen", "qwen",
"zed" "zed",
"hermes",
"openclaw"
] ]
} }
}, },
+2
View File
@@ -42,6 +42,8 @@ Targets:
joycode - Install commands, agents, skills, and flattened rules into ./.joycode/ joycode - Install commands, agents, skills, and flattened rules into ./.joycode/
qwen - Install commands, agents, skills, rules, and Qwen config into ~/.qwen/ qwen - Install commands, agents, skills, rules, and Qwen config into ~/.qwen/
zed - Install project settings, commands, agents, skills, and flattened rules into ./.zed/ zed - Install project settings, commands, agents, skills, and flattened rules into ./.zed/
hermes - Install shared rules/skills/commands into ~/.hermes/
openclaw - Install shared rules/skills/commands into ~/.openclaw/
Options: Options:
--profile <name> Resolve and install a manifest profile --profile <name> Resolve and install a manifest profile
+15 -1
View File
@@ -4,7 +4,7 @@ const path = require('path');
const { getInstallTargetAdapter, planInstallTargetScaffold } = require('./install-targets/registry'); const { getInstallTargetAdapter, planInstallTargetScaffold } = require('./install-targets/registry');
const DEFAULT_REPO_ROOT = path.join(__dirname, '../..'); const DEFAULT_REPO_ROOT = path.join(__dirname, '../..');
const SUPPORTED_INSTALL_TARGETS = ['claude', 'claude-project', 'cursor', 'antigravity', 'codex', 'gemini', 'opencode', 'codebuddy', 'joycode', 'qwen', 'zed']; const SUPPORTED_INSTALL_TARGETS = ['claude', 'claude-project', 'cursor', 'antigravity', 'codex', 'gemini', 'opencode', 'codebuddy', 'joycode', 'qwen', 'zed', 'hermes', 'openclaw'];
const COMPONENT_FAMILY_PREFIXES = { const COMPONENT_FAMILY_PREFIXES = {
baseline: 'baseline:', baseline: 'baseline:',
language: 'lang:', language: 'lang:',
@@ -73,6 +73,20 @@ const LEGACY_COMPAT_BASE_MODULE_IDS_BY_TARGET = Object.freeze({
'platform-configs', 'platform-configs',
'workflow-quality', 'workflow-quality',
], ],
hermes: [
'rules-core',
'agents-core',
'commands-core',
'platform-configs',
'workflow-quality',
],
openclaw: [
'rules-core',
'agents-core',
'commands-core',
'platform-configs',
'workflow-quality',
],
}); });
const LEGACY_LANGUAGE_ALIAS_TO_CANONICAL = Object.freeze({ const LEGACY_LANGUAGE_ALIAS_TO_CANONICAL = Object.freeze({
c: 'c', c: 'c',
+2
View File
@@ -7,8 +7,10 @@ const PLATFORM_SOURCE_PATH_OWNERS = Object.freeze({
'.codex': 'codex', '.codex': 'codex',
'.cursor': 'cursor', '.cursor': 'cursor',
'.gemini': 'gemini', '.gemini': 'gemini',
'.hermes': 'hermes',
'.joycode': 'joycode', '.joycode': 'joycode',
'.opencode': 'opencode', '.opencode': 'opencode',
'.openclaw': 'openclaw',
'.codebuddy': 'codebuddy', '.codebuddy': 'codebuddy',
'.qwen': 'qwen', '.qwen': 'qwen',
'.zed': 'zed', '.zed': 'zed',
@@ -0,0 +1,10 @@
const { createInstallTargetAdapter } = require('./helpers');
module.exports = createInstallTargetAdapter({
id: 'hermes-home',
target: 'hermes',
kind: 'home',
rootSegments: ['.hermes'],
installStatePathSegments: ['ecc-install-state.json'],
nativeRootRelativePath: '.hermes',
});
@@ -0,0 +1,10 @@
const { createInstallTargetAdapter } = require('./helpers');
module.exports = createInstallTargetAdapter({
id: 'openclaw-home',
target: 'openclaw',
kind: 'home',
rootSegments: ['.openclaw'],
installStatePathSegments: ['ecc-install-state.json'],
nativeRootRelativePath: '.openclaw',
});
+4
View File
@@ -5,7 +5,9 @@ const codebuddyProject = require('./codebuddy-project');
const codexHome = require('./codex-home'); const codexHome = require('./codex-home');
const cursorProject = require('./cursor-project'); const cursorProject = require('./cursor-project');
const geminiProject = require('./gemini-project'); const geminiProject = require('./gemini-project');
const hermesHome = require('./hermes-home');
const joycodeProject = require('./joycode-project'); const joycodeProject = require('./joycode-project');
const openclawHome = require('./openclaw-home');
const opencodeHome = require('./opencode-home'); const opencodeHome = require('./opencode-home');
const qwenHome = require('./qwen-home'); const qwenHome = require('./qwen-home');
const zedProject = require('./zed-project'); const zedProject = require('./zed-project');
@@ -17,7 +19,9 @@ const ADAPTERS = Object.freeze([
antigravityProject, antigravityProject,
codexHome, codexHome,
geminiProject, geminiProject,
hermesHome,
opencodeHome, opencodeHome,
openclawHome,
codebuddyProject, codebuddyProject,
joycodeProject, joycodeProject,
qwenHome, qwenHome,