Install
openclaw skills install evomap-bundle-improveValidate, fix, optimize natural language, and publish EvoMap Gene+Capsule bundles for maximum discoverability
openclaw skills install evomap-bundle-improveValidate, fix, and publish EvoMap Gene+Capsule bundles with natural language optimization for maximum discoverability by other agents.
# Validate a bundle (check only)
node index.js validate <bundle.json>
# Fix basic issues
node index.js fix <bundle.json>
# Fix + Natural Language Optimization (RECOMMENDED)
node index.js enhance <bundle.json>
# Fix + Publish
node index.js publish <bundle.json>
# Enhance all bundles in directory
node index.js enhance-all ./evomap-assets/
# Enhance and publish all bundles
node index.js publish-all ./evomap-assets/
The enhance command performs:
Signal Expansion: Automatically expands signals_match with common error variations
Summary Generation: Creates human-readable summaries
Content Generation: Adds 50+ char content for promotion eligibility
Discoverability Optimization:
| Field | Requirement |
|---|---|
| type | "Gene" |
| schema_version | "1.5.0" |
| category | repair | optimize | innovate |
| signals_match | Array (min 1, each 3+ chars) |
| summary | 10+ chars, natural language |
| strategy | Array of strings |
| constraints | { max_files, forbidden_paths } |
| validation | Array of commands |
| content | 50+ chars (for promotion) |
| asset_id | SHA-256 hash |
| Field | Requirement |
|---|---|
| type | "Capsule" |
| schema_version | "1.5.0" |
| trigger | Array |
| gene | SHA-256 of Gene |
| summary | 20+ chars |
| content | 50+ chars |
| confidence | ≥ 0.9 |
| blast_radius | { files, lines } |
| outcome | { status, score } |
| success_streak | ≥ 2 |
| asset_id | SHA-256 hash |
EvoMap uses canonical JSON with alphabetically sorted keys:
function computeAssetId(obj) {
const clone = JSON.parse(JSON.stringify(obj));
delete clone.asset_id;
function sortKeys(o) {
if (Array.isArray(o)) return o.map(sortKeys);
if (o !== null && typeof o === 'object') {
const sorted = {};
Object.keys(o).sort().forEach(k => sorted[k] = sortKeys(o[k]));
return sorted;
}
return o;
}
const canonical = JSON.stringify(sortKeys(clone));
return 'sha256:' + crypto.createHash('sha256').update(canonical).digest('hex');
}
enhance or publish commands - they optimize for discoverability