clawpowers 2.2.5 → 2.2.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/CHANGELOG.md +186 -160
- package/COMPATIBILITY.md +48 -13
- package/KNOWN_LIMITATIONS.md +20 -19
- package/LICENSE +44 -44
- package/LICENSING.md +10 -10
- package/README.md +486 -462
- package/SECURITY.md +52 -52
- package/dist/index.d.ts +17 -5
- package/dist/index.js +187 -92
- package/dist/index.js.map +1 -1
- package/native/Cargo.lock +4927 -4927
- package/native/Cargo.toml +73 -73
- package/native/crates/canonical/Cargo.toml +24 -24
- package/native/crates/canonical/src/lib.rs +677 -673
- package/native/crates/compression/Cargo.toml +20 -20
- package/native/crates/compression/benches/compression_bench.rs +42 -42
- package/native/crates/compression/src/lib.rs +393 -393
- package/native/crates/evm-eth/Cargo.toml +13 -13
- package/native/crates/evm-eth/src/lib.rs +105 -105
- package/native/crates/fee/Cargo.toml +15 -15
- package/native/crates/fee/src/lib.rs +281 -281
- package/native/crates/index/Cargo.toml +16 -16
- package/native/crates/index/src/lib.rs +277 -277
- package/native/crates/policy/Cargo.toml +17 -17
- package/native/crates/policy/src/lib.rs +614 -614
- package/native/crates/security/Cargo.toml +22 -22
- package/native/crates/security/src/lib.rs +478 -478
- package/native/crates/tokens/Cargo.toml +13 -13
- package/native/crates/tokens/src/lib.rs +534 -534
- package/native/crates/verification/Cargo.toml +23 -23
- package/native/crates/verification/src/lib.rs +333 -333
- package/native/crates/wallet/Cargo.toml +20 -20
- package/native/crates/wallet/src/lib.rs +261 -261
- package/native/crates/x402/Cargo.toml +30 -30
- package/native/crates/x402/src/lib.rs +423 -423
- package/native/ffi/Cargo.toml +34 -34
- package/native/ffi/build.rs +4 -4
- package/native/ffi/src/lib.rs +352 -352
- package/native/ffi/tests/integration.rs +354 -354
- package/native/pyo3/Cargo.toml +26 -26
- package/native/pyo3/pyproject.toml +16 -16
- package/native/pyo3/src/lib.rs +407 -407
- package/native/pyo3/tests/test_smoke.py +180 -180
- package/native/wasm/Cargo.toml +47 -44
- package/native/wasm/pkg/.gitignore +6 -6
- package/native/wasm/pkg/clawpowers_wasm.d.ts +208 -208
- package/native/wasm/pkg/clawpowers_wasm.js +872 -872
- package/native/wasm/pkg/clawpowers_wasm_bg.wasm.d.ts +40 -40
- package/native/wasm/pkg/package.json +16 -16
- package/native/wasm/pkg-node/clawpowers_wasm.d.ts +143 -143
- package/native/wasm/pkg-node/clawpowers_wasm.js +798 -798
- package/native/wasm/pkg-node/clawpowers_wasm_bg.wasm.d.ts +40 -40
- package/native/wasm/pkg-node/package.json +12 -12
- package/native/wasm/src/lib.rs +433 -433
- package/package.json +13 -8
- package/scripts/build-wasm.mjs +59 -0
- package/scripts/generate_hermes_wrappers.py +211 -0
- package/scripts/hermes_wrapper_overrides.json +184 -0
- package/scripts/run-python-script.mjs +48 -0
- package/scripts/verify-consumer-install.mjs +109 -0
- package/scripts/verify-wasm-artifacts.mjs +26 -3
- package/scripts/verify_hermes_wrappers.py +154 -0
- package/skill.json +20 -0
- package/skills/1password/SKILL.md +34 -0
- package/skills/README.md +44 -0
- package/skills/agent-nexus-2/SKILL.md +34 -0
- package/skills/apple-notes/SKILL.md +34 -0
- package/skills/apple-reminders/SKILL.md +34 -0
- package/skills/autoresearch/SKILL.md +43 -0
- package/skills/bear-notes/SKILL.md +34 -0
- package/skills/blogwatcher/SKILL.md +34 -0
- package/skills/blucli/SKILL.md +34 -0
- package/skills/bluebubbles/SKILL.md +34 -0
- package/skills/business-strategy/SKILL.md +41 -0
- package/skills/camsnap/SKILL.md +34 -0
- package/skills/canvas/SKILL.md +34 -0
- package/skills/clawhub/SKILL.md +34 -0
- package/skills/coding-agent/SKILL.md +34 -0
- package/skills/coding-discipline.skill/SKILL.md +34 -0
- package/skills/content-writer/SKILL.md +41 -0
- package/skills/discord/SKILL.md +34 -0
- package/skills/eightctl/SKILL.md +34 -0
- package/skills/execution-validation.skill/SKILL.md +34 -0
- package/skills/gemini/SKILL.md +34 -0
- package/skills/gh-issues/SKILL.md +34 -0
- package/skills/gifgrep/SKILL.md +34 -0
- package/skills/github/SKILL.md +41 -0
- package/skills/gog/SKILL.md +34 -0
- package/skills/goplaces/SKILL.md +34 -0
- package/skills/healthcheck/SKILL.md +34 -0
- package/skills/himalaya/SKILL.md +34 -0
- package/skills/humanize/SKILL.md +41 -0
- package/skills/imsg/SKILL.md +34 -0
- package/skills/itp/SKILL.md +112 -0
- package/skills/mcporter/SKILL.md +34 -0
- package/skills/model-usage/SKILL.md +34 -0
- package/skills/nano-pdf/SKILL.md +34 -0
- package/skills/node-connect/SKILL.md +34 -0
- package/skills/notion/SKILL.md +34 -0
- package/skills/obsidian/SKILL.md +34 -0
- package/skills/openai-whisper/SKILL.md +34 -0
- package/skills/openai-whisper-api/SKILL.md +34 -0
- package/skills/openhue/SKILL.md +34 -0
- package/skills/oracle/SKILL.md +34 -0
- package/skills/ordercli/SKILL.md +34 -0
- package/skills/peekaboo/SKILL.md +34 -0
- package/skills/polyclaw/SKILL.md +34 -0
- package/skills/prospector/SKILL.md +41 -0
- package/skills/rsi.skill/SKILL.md +34 -0
- package/skills/sag/SKILL.md +34 -0
- package/skills/security/SKILL.md +41 -0
- package/skills/session-logs/SKILL.md +34 -0
- package/skills/sherpa-onnx-tts/SKILL.md +34 -0
- package/skills/skill-creator/SKILL.md +34 -0
- package/skills/slack/SKILL.md +34 -0
- package/skills/songsee/SKILL.md +34 -0
- package/skills/sonoscli/SKILL.md +34 -0
- package/skills/spotify-player/SKILL.md +34 -0
- package/skills/strykr-prism/SKILL.md +41 -0
- package/skills/summarize/SKILL.md +34 -0
- package/skills/taskbridge/SKILL.md +34 -0
- package/skills/things-mac/SKILL.md +34 -0
- package/skills/tmux/SKILL.md +34 -0
- package/skills/trello/SKILL.md +34 -0
- package/skills/validator-agent/SKILL.md +41 -0
- package/skills/video-frames/SKILL.md +34 -0
- package/skills/voice-call/SKILL.md +34 -0
- package/skills/wacli/SKILL.md +34 -0
- package/skills/weather/SKILL.md +34 -0
- package/skills/webmcp-payments/SKILL.md +41 -0
- package/skills/xurl/SKILL.md +34 -0
- package/src/skills/catalog.ts +435 -435
- package/src/skills/executor.ts +56 -56
- package/src/skills/index.ts +3 -3
- package/src/skills/itp/SKILL.md +112 -112
- package/src/skills/loader.ts +262 -193
- package/native/ffi/index.node +0 -0
- package/native/wasm/pkg-node/.gitignore +0 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clawpowers",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.7",
|
|
4
4
|
"description": "Skills library for AI agents — payments, memory, RSI, wallet. Drop-in capability layer for any agent framework.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"files": [
|
|
16
16
|
"dist",
|
|
17
|
+
"skills",
|
|
17
18
|
"src/skills",
|
|
18
19
|
"native/Cargo.toml",
|
|
19
20
|
"native/Cargo.lock",
|
|
@@ -28,22 +29,26 @@
|
|
|
28
29
|
"CHANGELOG.md",
|
|
29
30
|
"SECURITY.md",
|
|
30
31
|
"COMPATIBILITY.md",
|
|
32
|
+
"skill.json",
|
|
31
33
|
"KNOWN_LIMITATIONS.md",
|
|
32
34
|
"LICENSING.md",
|
|
33
35
|
"scripts/"
|
|
34
36
|
],
|
|
35
37
|
"scripts": {
|
|
36
38
|
"build:native": "cd native && cargo build --release --workspace || echo 'Rust not installed - using WASM/TS fallback'",
|
|
37
|
-
"build:wasm": "
|
|
39
|
+
"build:wasm": "node scripts/build-wasm.mjs",
|
|
38
40
|
"build": "tsup",
|
|
39
41
|
"test": "vitest run",
|
|
40
42
|
"test:watch": "vitest",
|
|
41
43
|
"typecheck": "tsc --noEmit",
|
|
42
44
|
"lint": "eslint src tests benchmarks",
|
|
43
45
|
"verify:pack": "npm pack --dry-run",
|
|
44
|
-
"
|
|
46
|
+
"verify:pack:surface": "npm pack --dry-run --ignore-scripts",
|
|
47
|
+
"verify:hermes": "node scripts/run-python-script.mjs scripts/verify_hermes_wrappers.py",
|
|
48
|
+
"clean": "node -e \"fs.rmSync('dist',{recursive:true,force:true})\"",
|
|
45
49
|
"prepublishOnly": "npm run build",
|
|
46
|
-
"prepack": "npm run build"
|
|
50
|
+
"prepack": "npm run build:wasm && npm run build",
|
|
51
|
+
"verify:consumer-install": "node scripts/verify-consumer-install.mjs"
|
|
47
52
|
},
|
|
48
53
|
"keywords": [
|
|
49
54
|
"ai-agent",
|
|
@@ -69,19 +74,19 @@
|
|
|
69
74
|
},
|
|
70
75
|
"homepage": "https://clawpowers.ai",
|
|
71
76
|
"engines": {
|
|
72
|
-
"node": ">=
|
|
77
|
+
"node": ">=22.0.0"
|
|
73
78
|
},
|
|
74
79
|
"dependencies": {
|
|
75
|
-
"zod": "^
|
|
80
|
+
"zod": "^4.4.3"
|
|
76
81
|
},
|
|
77
82
|
"devDependencies": {
|
|
78
83
|
"@types/node": "^25.5.0",
|
|
79
84
|
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
80
85
|
"@typescript-eslint/parser": "^8.0.0",
|
|
81
|
-
"eslint": "^
|
|
86
|
+
"eslint": "^10.3.0",
|
|
82
87
|
"globals": "^17.4.0",
|
|
83
88
|
"tsup": "^8.0.0",
|
|
84
89
|
"typescript": "^5.5.0",
|
|
85
|
-
"vitest": "^
|
|
90
|
+
"vitest": "^4.1.5"
|
|
86
91
|
}
|
|
87
92
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Build the Node-targeted WASM fallback when wasm-pack is available.
|
|
4
|
+
*
|
|
5
|
+
* Release/source checkouts may already contain committed pkg-node artifacts. In
|
|
6
|
+
* that case, do not fail prepack on machines that lack Rust/wasm-pack; verify
|
|
7
|
+
* the required artifacts are present and let the TypeScript fallback package.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, rmSync } from 'node:fs';
|
|
10
|
+
import { dirname, resolve } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { spawnSync } from 'node:child_process';
|
|
13
|
+
|
|
14
|
+
const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
15
|
+
const wasmDir = resolve(root, 'native/wasm');
|
|
16
|
+
const outDir = resolve(wasmDir, 'pkg-node');
|
|
17
|
+
const requiredArtifacts = [
|
|
18
|
+
resolve(outDir, 'clawpowers_wasm.js'),
|
|
19
|
+
resolve(outDir, 'clawpowers_wasm_bg.wasm'),
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
function haveRequiredArtifacts() {
|
|
23
|
+
return requiredArtifacts.every(path => existsSync(path));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function run(command, args, options = {}) {
|
|
27
|
+
return spawnSync(command, args, {
|
|
28
|
+
stdio: 'inherit',
|
|
29
|
+
shell: process.platform === 'win32',
|
|
30
|
+
...options,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const version = run('wasm-pack', ['--version'], { stdio: 'ignore' });
|
|
35
|
+
|
|
36
|
+
if (version.status !== 0) {
|
|
37
|
+
if (haveRequiredArtifacts()) {
|
|
38
|
+
console.warn('[clawpowers] wasm-pack not found; using existing native/wasm/pkg-node artifacts.');
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
console.error('[clawpowers] wasm-pack is required because native/wasm/pkg-node artifacts are missing.');
|
|
43
|
+
process.exit(version.status ?? 1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const build = run('wasm-pack', ['build', '--target', 'nodejs', '--out-dir', 'pkg-node'], {
|
|
47
|
+
cwd: wasmDir,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
if (build.status !== 0) {
|
|
51
|
+
process.exit(build.status ?? 1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
rmSync(resolve(outDir, '.gitignore'), { force: true });
|
|
55
|
+
|
|
56
|
+
if (!haveRequiredArtifacts()) {
|
|
57
|
+
console.error('[clawpowers] wasm-pack completed but required pkg-node artifacts are missing.');
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import re
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
repo = Path(__file__).resolve().parents[1]
|
|
8
|
+
catalog_path = repo / 'src/skills/catalog.ts'
|
|
9
|
+
overrides_path = repo / 'scripts/hermes_wrapper_overrides.json'
|
|
10
|
+
text = catalog_path.read_text()
|
|
11
|
+
overrides = json.loads(overrides_path.read_text()) if overrides_path.exists() else {}
|
|
12
|
+
|
|
13
|
+
pattern = re.compile(
|
|
14
|
+
r"\{\s*name:\s*'(?P<name>[^']+)'\s*,\s*description:\s*'(?P<desc>(?:[^'\\]|\\.)*)'\s*,\s*source:\s*'(?P<source>[^']+)'\s*,\s*category:\s*'(?P<category>[^']+)'\s*,\s*\}",
|
|
15
|
+
re.S,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def bullet_block(title: str, items: list[str]) -> str:
|
|
20
|
+
if not items:
|
|
21
|
+
return ''
|
|
22
|
+
lines = [f'## {title}', '']
|
|
23
|
+
lines.extend(f'- {item}' for item in items)
|
|
24
|
+
lines.append('')
|
|
25
|
+
return '\n'.join(lines)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
entries = []
|
|
29
|
+
for m in pattern.finditer(text):
|
|
30
|
+
name = m.group('name')
|
|
31
|
+
desc = m.group('desc').replace("\\'", "'")
|
|
32
|
+
entries.append(
|
|
33
|
+
{
|
|
34
|
+
'name': name,
|
|
35
|
+
'description': desc,
|
|
36
|
+
'source': m.group('source'),
|
|
37
|
+
'category': m.group('category'),
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
skills_root = repo / 'skills'
|
|
42
|
+
skills_root.mkdir(exist_ok=True)
|
|
43
|
+
manual_skills = {'itp'}
|
|
44
|
+
generated_count = 0
|
|
45
|
+
rich_count = 0
|
|
46
|
+
|
|
47
|
+
for entry in entries:
|
|
48
|
+
name = entry['name']
|
|
49
|
+
if name in manual_skills:
|
|
50
|
+
continue
|
|
51
|
+
|
|
52
|
+
skill_dir = skills_root / name
|
|
53
|
+
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
54
|
+
|
|
55
|
+
desc = entry['description']
|
|
56
|
+
category = entry['category']
|
|
57
|
+
source = entry['source']
|
|
58
|
+
escaped = desc.replace('"', '\\"')
|
|
59
|
+
override = overrides.get(name, {})
|
|
60
|
+
|
|
61
|
+
title = override.get('title', name)
|
|
62
|
+
summary = override.get(
|
|
63
|
+
'summary',
|
|
64
|
+
f'This Hermes-compatible skill wrapper exports the ClawPowers catalog entry for `{name}`.',
|
|
65
|
+
)
|
|
66
|
+
when_to_use = override.get('when_to_use', ['use this skill when the task matches the capability described above'])
|
|
67
|
+
quickstart = override.get('quickstart', [])
|
|
68
|
+
notes = override.get(
|
|
69
|
+
'notes',
|
|
70
|
+
[
|
|
71
|
+
'This wrapper makes the skill discoverable and loadable by Hermes as a standard `SKILL.md` bundle.',
|
|
72
|
+
'It does not, by itself, claim that every underlying runtime, CLI, API integration, or library dependency behind the broader ClawPowers ecosystem is fully configured in Hermes.',
|
|
73
|
+
],
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
content = (
|
|
77
|
+
f"---\n"
|
|
78
|
+
f"name: {name}\n"
|
|
79
|
+
f"description: \"{escaped}\"\n"
|
|
80
|
+
f"metadata:\n"
|
|
81
|
+
f" hermes:\n"
|
|
82
|
+
f" tags: [{category}, clawpowers-catalog, hermes-compatible]\n"
|
|
83
|
+
f"---\n\n"
|
|
84
|
+
f"<!-- generated-by: scripts/generate_hermes_wrappers.py -->\n\n"
|
|
85
|
+
f"# {title}\n\n"
|
|
86
|
+
f"{summary}\n\n"
|
|
87
|
+
f"## Purpose\n\n"
|
|
88
|
+
f"{desc}\n\n"
|
|
89
|
+
f"{bullet_block('When to use', when_to_use)}"
|
|
90
|
+
f"{bullet_block('Quickstart', quickstart)}"
|
|
91
|
+
f"## Source of truth\n\n"
|
|
92
|
+
f"- Catalog source: `src/skills/catalog.ts`\n"
|
|
93
|
+
f"- Catalog entry source class: `{source}`\n"
|
|
94
|
+
f"- Category: `{category}`\n\n"
|
|
95
|
+
f"{bullet_block('Notes', notes)}"
|
|
96
|
+
f"## Compatibility boundary\n\n"
|
|
97
|
+
f"This file is part of the Hermes-compatible top-level `skills/` surface for this branch. It should be read as a discoverable skill bundle, not as a blanket claim that the wider `clawpowers` library/runtime surface is fully configured inside Hermes.\n"
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
(skill_dir / 'SKILL.md').write_text(content)
|
|
101
|
+
generated_count += 1
|
|
102
|
+
if override:
|
|
103
|
+
rich_count += 1
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
total_exported = generated_count + len(manual_skills)
|
|
107
|
+
|
|
108
|
+
(repo / 'skills' / 'README.md').write_text(
|
|
109
|
+
f'''# ClawPowers skills for Hermes
|
|
110
|
+
|
|
111
|
+
This directory is the **Hermes-supported surface** for this branch.
|
|
112
|
+
|
|
113
|
+
Only skills placed here are in scope for the branch's Hermes compatibility claim.
|
|
114
|
+
|
|
115
|
+
## Current exported skills
|
|
116
|
+
|
|
117
|
+
- Total exported skills: {total_exported}
|
|
118
|
+
- Hand-authored validated wedge: `itp`
|
|
119
|
+
- Catalog-derived wrappers: {generated_count}
|
|
120
|
+
- Richer generated wrappers with override guidance: {rich_count}
|
|
121
|
+
|
|
122
|
+
## Install shape
|
|
123
|
+
|
|
124
|
+
Hermes expects skills like:
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
~/.hermes/skills/<skill-name>/SKILL.md
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Example:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
mkdir -p ~/.hermes/skills/itp
|
|
134
|
+
cp skills/itp/SKILL.md ~/.hermes/skills/itp/SKILL.md
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Fast verification
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
python3 scripts/verify_hermes_wrappers.py
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Then validate with Hermes' own skill tooling.
|
|
144
|
+
|
|
145
|
+
## Important boundary
|
|
146
|
+
|
|
147
|
+
This branch now exports the full ClawPowers catalog as Hermes-loadable skill bundles, but that does **not** automatically mean every broader `clawpowers` runtime/library module is a native Hermes package surface.
|
|
148
|
+
|
|
149
|
+
This branch separates:
|
|
150
|
+
|
|
151
|
+
- **Hermes-compatible skill bundles** under `skills/`
|
|
152
|
+
- **non-Hermes-native library/runtime surfaces** elsewhere in the repo
|
|
153
|
+
'''
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
(repo / 'HERMES_COMPATIBILITY.md').write_text(
|
|
157
|
+
f'''# Hermes compatibility
|
|
158
|
+
|
|
159
|
+
This branch exists to expose the **Hermes-compatible** ClawPowers surface only.
|
|
160
|
+
|
|
161
|
+
## Support contract on this branch
|
|
162
|
+
|
|
163
|
+
The Hermes-supported surface is the top-level `skills/` directory.
|
|
164
|
+
|
|
165
|
+
Current exported Hermes-loadable skill bundles:
|
|
166
|
+
|
|
167
|
+
- total exported skills: {total_exported}
|
|
168
|
+
- richer validated proof bundle: `skills/itp/SKILL.md`
|
|
169
|
+
- catalog-derived wrappers: {generated_count}
|
|
170
|
+
- richer generated wrappers with extra operator guidance: {rich_count}
|
|
171
|
+
|
|
172
|
+
## What this branch claims
|
|
173
|
+
|
|
174
|
+
This branch claims that the top-level `skills/` directory is Hermes-loadable as standard `SKILL.md` bundles.
|
|
175
|
+
|
|
176
|
+
## What is not part of the Hermes-native runtime claim
|
|
177
|
+
|
|
178
|
+
The following may still be useful in other environments, but they are **not** currently claimed here as native Hermes runtime/package surfaces just because the skill bundles load:
|
|
179
|
+
|
|
180
|
+
- the broader `clawpowers` npm capability library
|
|
181
|
+
- wallet APIs as a native Hermes package feature
|
|
182
|
+
- payments / x402 runtime flows as a native Hermes package feature
|
|
183
|
+
- RSI, memory, swarm, and other library modules as native Hermes package features unless separately validated in that form
|
|
184
|
+
|
|
185
|
+
## Validation rule
|
|
186
|
+
|
|
187
|
+
A ClawPowers skill is treated as Hermes-compatible on this branch when it:
|
|
188
|
+
|
|
189
|
+
1. is exported as a standard `SKILL.md` bundle under `skills/`
|
|
190
|
+
2. can be discovered by Hermes from `~/.hermes/skills/`
|
|
191
|
+
3. loads cleanly through Hermes' own skill tooling
|
|
192
|
+
4. passes requirement checks without hidden patches
|
|
193
|
+
|
|
194
|
+
## Fast verification
|
|
195
|
+
|
|
196
|
+
Run:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
python3 scripts/verify_hermes_wrappers.py
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Current status
|
|
203
|
+
|
|
204
|
+
The branch exports the full catalog as Hermes-loadable bundles. The `itp` skill remains the deepest manually validated wedge. A small set of high-value skills now also gets richer generated guidance from curated overrides while preserving the same Hermes compatibility boundary.
|
|
205
|
+
'''
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
print('generated_wrappers', generated_count)
|
|
209
|
+
print('manual_wrappers', len(manual_skills))
|
|
210
|
+
print('rich_wrappers', rich_count)
|
|
211
|
+
print('total_exported_skills', total_exported)
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
{
|
|
2
|
+
"autoresearch": {
|
|
3
|
+
"title": "Autoresearch — Autonomous Code Quality & RSI Loop",
|
|
4
|
+
"summary": "Autonomous code quality and harness-improvement loop for audits, baselines, and keep-or-revert mutation experiments.",
|
|
5
|
+
"when_to_use": [
|
|
6
|
+
"when you need a code audit or quality scan",
|
|
7
|
+
"when you want a baseline before making changes",
|
|
8
|
+
"when running a small keep-or-revert improvement loop",
|
|
9
|
+
"when evaluating prompt or harness mutations"
|
|
10
|
+
],
|
|
11
|
+
"quickstart": [
|
|
12
|
+
"python3 tools/autoresearch-mlx/autoresearch_agent.py audit <path>",
|
|
13
|
+
"python3 tools/autoresearch-mlx/autoresearch_agent.py baseline <path>",
|
|
14
|
+
"python3 tools/autoresearch-mlx/autoresearch_agent.py scan <path>"
|
|
15
|
+
],
|
|
16
|
+
"notes": [
|
|
17
|
+
"Use one mutation per experiment and keep it reversible.",
|
|
18
|
+
"If quality regresses, revert immediately.",
|
|
19
|
+
"This wrapper summarizes the real workspace skill without claiming the full local toolchain ships inside this repo."
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"content-writer": {
|
|
23
|
+
"title": "Content Writer",
|
|
24
|
+
"summary": "Platform-aware writing skill for articles, posts, emails, and other outward-facing copy.",
|
|
25
|
+
"when_to_use": [
|
|
26
|
+
"when writing an article, social post, email, or announcement",
|
|
27
|
+
"when adapting the same idea to multiple platforms",
|
|
28
|
+
"when you need concise platform-specific formatting rules"
|
|
29
|
+
],
|
|
30
|
+
"quickstart": [
|
|
31
|
+
"Use plain punctuation, straight quotes, and simple bullets.",
|
|
32
|
+
"Avoid AI-slop phrasing and repetitive listicle structure.",
|
|
33
|
+
"Match the output to the target platform instead of writing one generic draft."
|
|
34
|
+
],
|
|
35
|
+
"notes": [
|
|
36
|
+
"The source skill is stricter than this wrapper and includes extensive formatting and tone rules.",
|
|
37
|
+
"This branch exports a Hermes-loadable version of the skill surface, not the entire external content pipeline."
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"humanize": {
|
|
41
|
+
"title": "Humanize",
|
|
42
|
+
"summary": "Rewrite protocol for making drafts sound like a specific human rather than generic AI copy.",
|
|
43
|
+
"when_to_use": [
|
|
44
|
+
"after a first draft exists",
|
|
45
|
+
"before publishing external content",
|
|
46
|
+
"when the copy sounds too polished, flat, or corporate"
|
|
47
|
+
],
|
|
48
|
+
"quickstart": [
|
|
49
|
+
"add specifics such as dates, versions, names, and concrete numbers",
|
|
50
|
+
"vary sentence length on purpose",
|
|
51
|
+
"state a real opinion instead of hedging every claim"
|
|
52
|
+
],
|
|
53
|
+
"notes": [
|
|
54
|
+
"The source skill includes a fuller rewrite framework, self-check protocol, and companion files.",
|
|
55
|
+
"This wrapper exposes the discoverable Hermes skill surface only."
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
"prospector": {
|
|
59
|
+
"title": "Prospector",
|
|
60
|
+
"summary": "Lead-generation workflow for finding companies and enriching contacts against an ICP.",
|
|
61
|
+
"when_to_use": [
|
|
62
|
+
"when the user asks to find leads or prospects",
|
|
63
|
+
"when building a contact list that matches an ICP",
|
|
64
|
+
"when exporting prospect results to CSV or syncing to CRM"
|
|
65
|
+
],
|
|
66
|
+
"quickstart": [
|
|
67
|
+
"configure Exa and Apollo API keys first",
|
|
68
|
+
"collect ICP inputs such as industry, company size, geography, and contact count",
|
|
69
|
+
"run the search and export results to CSV"
|
|
70
|
+
],
|
|
71
|
+
"notes": [
|
|
72
|
+
"The source skill expects Exa and Apollo, with optional Attio sync.",
|
|
73
|
+
"This wrapper does not claim those third-party credentials or integrations are preconfigured in Hermes."
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
"strykr-prism": {
|
|
77
|
+
"title": "Strykr PRISM",
|
|
78
|
+
"summary": "Unified financial data API skill for crypto, stocks, forex, ETFs, and market analysis workflows.",
|
|
79
|
+
"when_to_use": [
|
|
80
|
+
"when the user needs live market data or symbol resolution",
|
|
81
|
+
"when checking trending assets, sentiment, or market overview",
|
|
82
|
+
"when pulling token-risk or venue data for an agent workflow"
|
|
83
|
+
],
|
|
84
|
+
"quickstart": [
|
|
85
|
+
"export PRISM_API_KEY before use",
|
|
86
|
+
"resolve an asset first when the symbol is ambiguous",
|
|
87
|
+
"use the market overview and price endpoints for fast analyst workflows"
|
|
88
|
+
],
|
|
89
|
+
"notes": [
|
|
90
|
+
"The source skill contains a much larger endpoint catalog and examples.",
|
|
91
|
+
"This wrapper does not imply the external PRISM service is bundled with this repo."
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
"validator-agent": {
|
|
95
|
+
"title": "Validator Agent",
|
|
96
|
+
"summary": "Multi-round validation gate for TypeScript and Solidity projects before merge or publish.",
|
|
97
|
+
"when_to_use": [
|
|
98
|
+
"before merging a PR",
|
|
99
|
+
"before npm publish or release",
|
|
100
|
+
"after dependency or build-system changes"
|
|
101
|
+
],
|
|
102
|
+
"quickstart": [
|
|
103
|
+
"run compile or typecheck first",
|
|
104
|
+
"then run tests, security checks, and docs/changelog verification",
|
|
105
|
+
"treat any blocking issue as a stop signal until fixed"
|
|
106
|
+
],
|
|
107
|
+
"notes": [
|
|
108
|
+
"The source skill is read-only and produces a verdict rather than modifying code.",
|
|
109
|
+
"This wrapper summarizes the validation lane without claiming the full project-specific toolchain is present in Hermes."
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
"github": {
|
|
113
|
+
"title": "GitHub",
|
|
114
|
+
"summary": "GitHub workflow wrapper for PRs, issues, CI runs, diffs, and API queries through the usual gh-driven lane.",
|
|
115
|
+
"when_to_use": [
|
|
116
|
+
"when checking PR or CI status",
|
|
117
|
+
"when creating or commenting on issues and pull requests",
|
|
118
|
+
"when reviewing diffs or querying GitHub state quickly"
|
|
119
|
+
],
|
|
120
|
+
"quickstart": [
|
|
121
|
+
"confirm the repo and target issue or PR first",
|
|
122
|
+
"use the gh-driven lane for status, comments, diffs, and workflow inspection",
|
|
123
|
+
"treat auth and repo context as prerequisites before acting"
|
|
124
|
+
],
|
|
125
|
+
"notes": [
|
|
126
|
+
"The catalog explicitly scopes this skill to issues, PRs, CI, review, and API queries.",
|
|
127
|
+
"This Hermes wrapper does not guarantee gh auth or GitHub credentials are already configured in the current environment."
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
"security": {
|
|
131
|
+
"title": "Security",
|
|
132
|
+
"summary": "Security workflow wrapper for threat detection, vulnerability management, and audit-oriented checks across the workspace.",
|
|
133
|
+
"when_to_use": [
|
|
134
|
+
"when investigating vulnerabilities or suspicious behavior",
|
|
135
|
+
"when auditing a project before release or after changes",
|
|
136
|
+
"when tracking remediation work for security findings"
|
|
137
|
+
],
|
|
138
|
+
"quickstart": [
|
|
139
|
+
"start with the concrete finding, alert, or attack surface",
|
|
140
|
+
"separate severity assessment from remediation steps",
|
|
141
|
+
"prefer verification and containment before claiming a fix"
|
|
142
|
+
],
|
|
143
|
+
"notes": [
|
|
144
|
+
"The catalog positions this as an infrastructure and vulnerability workflow, not a generic coding skill.",
|
|
145
|
+
"This wrapper does not claim bundled scanners, credentials, or external security services are preconfigured in Hermes."
|
|
146
|
+
]
|
|
147
|
+
},
|
|
148
|
+
"business-strategy": {
|
|
149
|
+
"title": "Business Strategy",
|
|
150
|
+
"summary": "Strategy wrapper for PMF validation, beachhead selection, ROI calls, and kill-or-invest decisions for the AI Agent Economy.",
|
|
151
|
+
"when_to_use": [
|
|
152
|
+
"when deciding what to invest in or cut",
|
|
153
|
+
"when evaluating PMF, beachheads, or strategic focus",
|
|
154
|
+
"when comparing activity ROI or prioritizing execution lanes"
|
|
155
|
+
],
|
|
156
|
+
"quickstart": [
|
|
157
|
+
"define the decision and success metric first",
|
|
158
|
+
"compare options using expected ROI and strategic fit",
|
|
159
|
+
"end with a clear continue, kill, or reallocate recommendation"
|
|
160
|
+
],
|
|
161
|
+
"notes": [
|
|
162
|
+
"The catalog frames this as a decision-making and prioritization surface, not a generic brainstorming tool.",
|
|
163
|
+
"This wrapper exposes the Hermes-loadable skill surface only and does not replace deeper strategy artifacts elsewhere in the workspace."
|
|
164
|
+
]
|
|
165
|
+
},
|
|
166
|
+
"webmcp-payments": {
|
|
167
|
+
"title": "WebMCP Payments",
|
|
168
|
+
"summary": "Payments workflow wrapper for handling HTTP 402 Payment Required responses through agentpay-mcp within approved spending limits.",
|
|
169
|
+
"when_to_use": [
|
|
170
|
+
"when a workflow hits an HTTP 402 payment-required response",
|
|
171
|
+
"when an agent needs to decide whether a micropayment is allowed",
|
|
172
|
+
"when connecting payment-required APIs to a policy-controlled execution path"
|
|
173
|
+
],
|
|
174
|
+
"quickstart": [
|
|
175
|
+
"detect the 402 and capture the payment metadata first",
|
|
176
|
+
"check the spending policy before attempting execution",
|
|
177
|
+
"route execution through the AgentPay MCP lane instead of treating payment as an unguarded side effect"
|
|
178
|
+
],
|
|
179
|
+
"notes": [
|
|
180
|
+
"Current product naming in the broader workspace is AgentPay MCP, while this catalog entry remains webmcp-payments.",
|
|
181
|
+
"This wrapper does not imply payment credentials, wallets, or spending policies are already configured inside Hermes."
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
|
|
4
|
+
const [, , scriptPath, ...scriptArgs] = process.argv;
|
|
5
|
+
|
|
6
|
+
if (!scriptPath) {
|
|
7
|
+
console.error('Usage: node scripts/run-python-script.mjs <script.py> [...args]');
|
|
8
|
+
process.exit(2);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const candidates = process.platform === 'win32'
|
|
12
|
+
? [
|
|
13
|
+
['python', []],
|
|
14
|
+
['py', ['-3']],
|
|
15
|
+
['python3', []],
|
|
16
|
+
]
|
|
17
|
+
: [
|
|
18
|
+
['python3', []],
|
|
19
|
+
['python', []],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
const failures = [];
|
|
23
|
+
for (const [command, prefixArgs] of candidates) {
|
|
24
|
+
const probe = spawnSync(command, [...prefixArgs, '--version'], {
|
|
25
|
+
encoding: 'utf8',
|
|
26
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
27
|
+
});
|
|
28
|
+
const versionOutput = `${probe.stdout ?? ''}${probe.stderr ?? ''}`;
|
|
29
|
+
if (probe.status !== 0 || /Microsoft Store/i.test(versionOutput)) {
|
|
30
|
+
failures.push(`${command} ${prefixArgs.join(' ')} -> ${versionOutput.trim() || probe.error?.message || `exit ${probe.status}`}`);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const run = spawnSync(command, [...prefixArgs, scriptPath, ...scriptArgs], {
|
|
35
|
+
stdio: 'inherit',
|
|
36
|
+
});
|
|
37
|
+
if (run.error) {
|
|
38
|
+
failures.push(`${command} ${prefixArgs.join(' ')} -> ${run.error.message}`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
process.exit(run.status ?? 1);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
console.error('Unable to find a working Python interpreter for', scriptPath);
|
|
45
|
+
for (const failure of failures) {
|
|
46
|
+
console.error('-', failure);
|
|
47
|
+
}
|
|
48
|
+
process.exit(1);
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Clean consumer install smoke for the packed npm tarball.
|
|
4
|
+
*
|
|
5
|
+
* This catches release-only failures that local tests miss: missing dist files,
|
|
6
|
+
* missing packaged skills/WASM artifacts, bad exports, and install-time metadata
|
|
7
|
+
* drift between package.json and the tarball npm consumers receive.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdtempSync, rmSync, existsSync, readFileSync } from 'node:fs';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join, resolve } from 'node:path';
|
|
12
|
+
import { spawnSync } from 'node:child_process';
|
|
13
|
+
|
|
14
|
+
const repoRoot = process.cwd();
|
|
15
|
+
const pkg = JSON.parse(readFileSync(join(repoRoot, 'package.json'), 'utf8'));
|
|
16
|
+
|
|
17
|
+
function commandSpec(command, args) {
|
|
18
|
+
if (command === 'npm' && process.env.npm_execpath) {
|
|
19
|
+
return { command: process.execPath, args: [process.env.npm_execpath, ...args] };
|
|
20
|
+
}
|
|
21
|
+
return { command, args };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function run(command, args, options = {}) {
|
|
25
|
+
const spec = commandSpec(command, args);
|
|
26
|
+
const result = spawnSync(spec.command, spec.args, {
|
|
27
|
+
cwd: options.cwd ?? repoRoot,
|
|
28
|
+
env: { ...process.env, ...(options.env ?? {}) },
|
|
29
|
+
encoding: 'utf8',
|
|
30
|
+
stdio: options.capture ? ['ignore', 'pipe', 'pipe'] : 'inherit',
|
|
31
|
+
shell: false,
|
|
32
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
33
|
+
});
|
|
34
|
+
if (result.status !== 0) {
|
|
35
|
+
if (options.capture) {
|
|
36
|
+
process.stderr.write(result.stdout ?? '');
|
|
37
|
+
process.stderr.write(result.stderr ?? '');
|
|
38
|
+
}
|
|
39
|
+
if (result.error) process.stderr.write(`${result.error.stack ?? result.error}\n`);
|
|
40
|
+
throw new Error(`${command} ${args.join(' ')} failed with exit ${result.status}`);
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function parsePackJson(stdout) {
|
|
46
|
+
let pos = stdout.lastIndexOf('[');
|
|
47
|
+
while (pos >= 0) {
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse(stdout.slice(pos));
|
|
50
|
+
} catch {
|
|
51
|
+
pos = stdout.lastIndexOf('[', pos - 1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Could not parse npm pack JSON output:\n${stdout.slice(0, 800)}`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const pack = run('npm', ['pack', '--json'], { capture: true });
|
|
58
|
+
const packed = parsePackJson(pack.stdout ?? '');
|
|
59
|
+
const filename = packed[0]?.filename;
|
|
60
|
+
if (!filename) throw new Error('npm pack did not report a tarball filename');
|
|
61
|
+
const tarball = resolve(repoRoot, filename);
|
|
62
|
+
|
|
63
|
+
const temp = mkdtempSync(join(tmpdir(), 'clawpowers-consumer-'));
|
|
64
|
+
try {
|
|
65
|
+
run('npm', ['init', '-y'], { cwd: temp, capture: true });
|
|
66
|
+
run('npm', ['install', tarball, '--save-exact', '--ignore-scripts'], { cwd: temp });
|
|
67
|
+
|
|
68
|
+
const smoke = `
|
|
69
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
70
|
+
import { join } from 'node:path';
|
|
71
|
+
import {
|
|
72
|
+
VERSION,
|
|
73
|
+
PACKAGE_NAME,
|
|
74
|
+
initConfig,
|
|
75
|
+
discoverSkills,
|
|
76
|
+
deriveEthereumAddress,
|
|
77
|
+
getCapabilitySummary,
|
|
78
|
+
} from 'clawpowers';
|
|
79
|
+
|
|
80
|
+
if (PACKAGE_NAME !== 'clawpowers') throw new Error('Unexpected package name: ' + PACKAGE_NAME);
|
|
81
|
+
if (VERSION !== '${pkg.version}') throw new Error('Unexpected VERSION export: ' + VERSION);
|
|
82
|
+
|
|
83
|
+
const config = initConfig();
|
|
84
|
+
if (config.version !== '${pkg.version}') throw new Error('Config version drift: ' + config.version);
|
|
85
|
+
|
|
86
|
+
const packageRoot = join(process.cwd(), 'node_modules', 'clawpowers');
|
|
87
|
+
const skillsDir = join(packageRoot, 'skills');
|
|
88
|
+
if (!existsSync(skillsDir)) throw new Error('Packaged skills directory missing');
|
|
89
|
+
const skillCount = discoverSkills(skillsDir).length;
|
|
90
|
+
if (skillCount < 20) throw new Error('Expected at least 20 packaged skills, saw ' + skillCount);
|
|
91
|
+
|
|
92
|
+
const wasmPath = join(packageRoot, 'native', 'wasm', 'pkg-node', 'clawpowers_wasm_bg.wasm');
|
|
93
|
+
if (!existsSync(wasmPath)) throw new Error('Packaged WASM fallback missing');
|
|
94
|
+
|
|
95
|
+
const hardhat0 = Buffer.from('ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', 'hex');
|
|
96
|
+
const address = deriveEthereumAddress(hardhat0);
|
|
97
|
+
if (address !== '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266') {
|
|
98
|
+
throw new Error('Ethereum derivation smoke failed: ' + address);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const summary = getCapabilitySummary();
|
|
102
|
+
if (!summary || typeof summary !== 'object') throw new Error('Capability summary unavailable');
|
|
103
|
+
console.log('consumer smoke OK: clawpowers ${pkg.version}, skills=' + skillCount);
|
|
104
|
+
`;
|
|
105
|
+
run('node', ['--input-type=module', '--eval', smoke], { cwd: temp });
|
|
106
|
+
} finally {
|
|
107
|
+
rmSync(temp, { recursive: true, force: true });
|
|
108
|
+
if (existsSync(tarball)) rmSync(tarball, { force: true });
|
|
109
|
+
}
|