clawsouls 0.2.0 → 0.2.2
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 +13 -9
- package/dist/bin/clawsouls.js +7 -0
- package/dist/bin/clawsouls.js.map +1 -1
- package/dist/commands/publish.js +8 -2
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.js +143 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/utils/validate.d.ts +136 -3
- package/dist/utils/validate.js +36 -4
- package/dist/utils/validate.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 🧠 ClawSouls CLI
|
|
1
|
+
# 🧠 ClawSouls CLI v0.2.0
|
|
2
2
|
|
|
3
3
|
**Give your AI a soul.** Install, manage, and switch AI agent personas for [OpenClaw](https://github.com/openclaw/openclaw).
|
|
4
4
|
|
|
@@ -14,8 +14,8 @@ Browse available souls at [clawsouls.ai](https://clawsouls.ai).
|
|
|
14
14
|
## Quick Start
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
# Install a soul
|
|
18
|
-
npx clawsouls install brad
|
|
17
|
+
# Install a soul (owner/name format)
|
|
18
|
+
npx clawsouls install clawsouls/brad
|
|
19
19
|
|
|
20
20
|
# Activate it (backs up your current workspace)
|
|
21
21
|
npx clawsouls use brad
|
|
@@ -47,14 +47,16 @@ clawsouls init my-soul
|
|
|
47
47
|
|
|
48
48
|
Creates a directory with `clawsoul.json`, `SOUL.md`, `IDENTITY.md`, `AGENTS.md`, `HEARTBEAT.md`, and `README.md` — ready for customization and publishing.
|
|
49
49
|
|
|
50
|
-
### `clawsouls install <name>`
|
|
50
|
+
### `clawsouls install <owner/name>`
|
|
51
51
|
|
|
52
|
-
Download and install a soul from the registry.
|
|
52
|
+
Download and install a soul from the registry. Uses `owner/name` format (e.g., `clawsouls/brad`).
|
|
53
|
+
|
|
54
|
+
The install command tries the API first (`/api/v1/souls/:owner/:name?files=true`), falls back to CDN if unavailable, and auto-generates `clawsoul.json` if missing from the response.
|
|
53
55
|
|
|
54
56
|
```bash
|
|
55
|
-
clawsouls install minimalist
|
|
56
|
-
clawsouls install devops-veteran
|
|
57
|
-
clawsouls install brad --force # overwrite existing
|
|
57
|
+
clawsouls install clawsouls/minimalist
|
|
58
|
+
clawsouls install clawsouls/devops-veteran
|
|
59
|
+
clawsouls install clawsouls/brad --force # overwrite existing
|
|
58
60
|
```
|
|
59
61
|
|
|
60
62
|
### `clawsouls use <name>`
|
|
@@ -95,7 +97,9 @@ export CLAWSOULS_TOKEN=<your-token>
|
|
|
95
97
|
clawsouls publish ./my-soul/
|
|
96
98
|
```
|
|
97
99
|
|
|
98
|
-
The directory must contain a valid `clawsoul.json`. All files in the directory are uploaded. A security scan runs automatically before publishing.
|
|
100
|
+
The directory must contain a valid `clawsoul.json`. All files in the directory are uploaded. A security scan runs automatically before publishing (blocks on dangerous patterns with 400 error).
|
|
101
|
+
|
|
102
|
+
**v0.2.0**: The `publish` command auto-prefixes the soul name with your username (e.g., publishing `my-soul` as user `TomLeeLive` creates `TomLeeLive/my-soul`).
|
|
99
103
|
|
|
100
104
|
### `clawsouls login`
|
|
101
105
|
|
package/dist/bin/clawsouls.js
CHANGED
|
@@ -7,6 +7,7 @@ import { restoreCommand } from '../commands/restore.js';
|
|
|
7
7
|
import { listCommand } from '../commands/list.js';
|
|
8
8
|
import { publishCommand, loginCommand } from '../commands/publish.js';
|
|
9
9
|
import { initCommand } from '../commands/init.js';
|
|
10
|
+
import { validateCommand } from '../commands/validate.js';
|
|
10
11
|
const require = createRequire(import.meta.url);
|
|
11
12
|
const { version } = require('../../package.json');
|
|
12
13
|
const program = new Command();
|
|
@@ -44,5 +45,11 @@ program
|
|
|
44
45
|
.command('init [name]')
|
|
45
46
|
.description('Scaffold a new soul directory')
|
|
46
47
|
.action((name) => initCommand(name));
|
|
48
|
+
program
|
|
49
|
+
.command('validate [dir]')
|
|
50
|
+
.alias('check')
|
|
51
|
+
.description('Validate a soul package against the spec')
|
|
52
|
+
.option('-s, --spec <version>', 'Spec version to validate against (e.g., 0.1, 0.2). Default: latest')
|
|
53
|
+
.action((dir, options) => validateCommand(dir, options));
|
|
47
54
|
program.parse();
|
|
48
55
|
//# sourceMappingURL=clawsouls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clawsouls.js","sourceRoot":"","sources":["../../src/bin/clawsouls.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"clawsouls.js","sourceRoot":"","sources":["../../src/bin/clawsouls.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,uCAAuC,CAAC;KACpD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC;KACvD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAEhD,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,KAAK,CAAC,OAAO,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,sBAAsB,EAAE,oEAAoE,CAAC;KACpG,MAAM,CAAC,CAAC,GAAY,EAAE,OAA2B,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAExF,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/commands/publish.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
+
import { ClawSoulSchema } from '../utils/validate.js';
|
|
3
4
|
const API_BASE = 'https://clawsouls.ai/api/v1';
|
|
4
5
|
function getToken() {
|
|
5
6
|
if (process.env.CLAWSOULS_TOKEN)
|
|
@@ -42,8 +43,13 @@ export async function publishCommand(dir) {
|
|
|
42
43
|
console.error('Error: Invalid clawsoul.json');
|
|
43
44
|
process.exit(1);
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
// Validate against spec
|
|
47
|
+
const validation = ClawSoulSchema.safeParse(manifest);
|
|
48
|
+
if (!validation.success) {
|
|
49
|
+
console.error('Error: clawsoul.json validation failed:');
|
|
50
|
+
for (const issue of validation.error.issues) {
|
|
51
|
+
console.error(` - ${issue.path.join('.')}: ${issue.message}`);
|
|
52
|
+
}
|
|
47
53
|
process.exit(1);
|
|
48
54
|
}
|
|
49
55
|
const token = getToken();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { getSchema, LATEST_SPEC, SPEC_VERSIONS } from '../utils/validate.js';
|
|
5
|
+
export async function validateCommand(dir, options) {
|
|
6
|
+
const soulDir = dir || '.';
|
|
7
|
+
const manifestPath = join(soulDir, 'clawsoul.json');
|
|
8
|
+
const specVersion = options?.spec || LATEST_SPEC;
|
|
9
|
+
console.log(chalk.bold(`Validating soul in ${soulDir}/`) + chalk.dim(` (spec v${specVersion})\n`));
|
|
10
|
+
let hasError = false;
|
|
11
|
+
const pass = (msg) => console.log(chalk.green(' ✓ ') + msg);
|
|
12
|
+
const fail = (msg) => { console.log(chalk.red(' ✗ ') + msg); hasError = true; };
|
|
13
|
+
const warn = (msg) => console.log(chalk.yellow(' ⚠ ') + msg);
|
|
14
|
+
// 1. Check clawsoul.json exists
|
|
15
|
+
if (!existsSync(manifestPath)) {
|
|
16
|
+
fail('clawsoul.json not found');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
pass('clawsoul.json exists');
|
|
20
|
+
// 2. Parse JSON
|
|
21
|
+
let raw;
|
|
22
|
+
try {
|
|
23
|
+
raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
24
|
+
pass('clawsoul.json is valid JSON');
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
fail(`clawsoul.json parse error: ${err.message}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
// 3. Validate against schema
|
|
31
|
+
let schema;
|
|
32
|
+
try {
|
|
33
|
+
schema = getSchema(specVersion);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
fail(err.message);
|
|
37
|
+
const available = Object.keys(SPEC_VERSIONS).join(', ');
|
|
38
|
+
console.log(chalk.dim(` Available versions: ${available}`));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const result = schema.safeParse(raw);
|
|
42
|
+
if (result.success) {
|
|
43
|
+
pass(`Schema validation passed (spec v${specVersion})`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
for (const issue of result.error.issues) {
|
|
47
|
+
fail(`${issue.path.join('.')}: ${issue.message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 4. Check required files exist
|
|
51
|
+
const files = raw.files || {};
|
|
52
|
+
const requiredFiles = [
|
|
53
|
+
['soul', 'SOUL.md'],
|
|
54
|
+
];
|
|
55
|
+
const optionalFiles = [
|
|
56
|
+
['identity', 'IDENTITY.md'],
|
|
57
|
+
['agents', 'AGENTS.md'],
|
|
58
|
+
['heartbeat', 'HEARTBEAT.md'],
|
|
59
|
+
['style', 'STYLE.md'],
|
|
60
|
+
];
|
|
61
|
+
for (const [key, defaultName] of requiredFiles) {
|
|
62
|
+
const filename = files[key] || defaultName;
|
|
63
|
+
if (existsSync(join(soulDir, filename))) {
|
|
64
|
+
pass(`${filename} exists`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
fail(`${filename} missing (required)`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for (const [key, defaultName] of optionalFiles) {
|
|
71
|
+
const filename = files[key] || defaultName;
|
|
72
|
+
if (existsSync(join(soulDir, filename))) {
|
|
73
|
+
pass(`${filename} exists`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
warn(`${filename} not found (optional)`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 5. Check README.md
|
|
80
|
+
if (existsSync(join(soulDir, 'README.md'))) {
|
|
81
|
+
pass('README.md exists');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
warn('README.md not found (recommended)');
|
|
85
|
+
}
|
|
86
|
+
// 6. Content checks
|
|
87
|
+
if (files.soul) {
|
|
88
|
+
const soulContent = readFileSync(join(soulDir, files.soul), 'utf-8');
|
|
89
|
+
if (soulContent.length < 10) {
|
|
90
|
+
warn('SOUL.md is very short (< 10 chars)');
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
pass(`SOUL.md has content (${soulContent.length} chars)`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// 7. Security scan
|
|
97
|
+
const allFiles = readdirSync(soulDir, { recursive: true });
|
|
98
|
+
const dangerousExts = ['.exe', '.dll', '.so', '.dylib', '.sh', '.bat', '.cmd'];
|
|
99
|
+
const dangerousPatterns = ['eval(', 'exec(', 'Function(', 'require(', 'import('];
|
|
100
|
+
for (const file of allFiles) {
|
|
101
|
+
const filePath = String(file);
|
|
102
|
+
const ext = filePath.substring(filePath.lastIndexOf('.'));
|
|
103
|
+
if (dangerousExts.includes(ext)) {
|
|
104
|
+
fail(`Dangerous file extension: ${filePath}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Check text files for dangerous patterns
|
|
108
|
+
for (const file of allFiles) {
|
|
109
|
+
const filePath = join(soulDir, String(file));
|
|
110
|
+
try {
|
|
111
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
112
|
+
for (const pattern of dangerousPatterns) {
|
|
113
|
+
if (content.includes(pattern)) {
|
|
114
|
+
fail(`Dangerous pattern "${pattern}" in ${file}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Binary file, skip
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 8. Field-specific warnings
|
|
123
|
+
if (raw.name) {
|
|
124
|
+
if (raw.name.length > 40)
|
|
125
|
+
warn('Name is very long (> 40 chars)');
|
|
126
|
+
}
|
|
127
|
+
if (raw.description) {
|
|
128
|
+
if (raw.description.length < 10)
|
|
129
|
+
warn('Description is very short');
|
|
130
|
+
}
|
|
131
|
+
if (raw.tags && raw.tags.length === 0)
|
|
132
|
+
warn('No tags defined');
|
|
133
|
+
// Summary
|
|
134
|
+
console.log('');
|
|
135
|
+
if (hasError) {
|
|
136
|
+
console.log(chalk.red.bold('✗ Validation failed — fix errors above before publishing.'));
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log(chalk.green.bold('✓ Soul is valid and ready to publish!'));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/validate.d.ts
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const ClawSoulSchemaV01: z.ZodObject<{
|
|
3
|
+
name: z.ZodString;
|
|
4
|
+
displayName: z.ZodString;
|
|
5
|
+
version: z.ZodString;
|
|
6
|
+
description: z.ZodString;
|
|
7
|
+
author: z.ZodObject<{
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
github: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
license: z.ZodString;
|
|
12
|
+
tags: z.ZodArray<z.ZodString>;
|
|
13
|
+
category: z.ZodString;
|
|
14
|
+
compatibility: z.ZodOptional<z.ZodObject<{
|
|
15
|
+
openclaw: z.ZodOptional<z.ZodString>;
|
|
16
|
+
models: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
17
|
+
}, z.core.$strip>>;
|
|
18
|
+
files: z.ZodObject<{
|
|
19
|
+
soul: z.ZodString;
|
|
20
|
+
identity: z.ZodOptional<z.ZodString>;
|
|
21
|
+
agents: z.ZodOptional<z.ZodString>;
|
|
22
|
+
heartbeat: z.ZodOptional<z.ZodString>;
|
|
23
|
+
userTemplate: z.ZodOptional<z.ZodString>;
|
|
24
|
+
avatar: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
repository: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export declare const ClawSoulSchemaV02: z.ZodObject<{
|
|
3
29
|
name: z.ZodString;
|
|
4
30
|
displayName: z.ZodString;
|
|
5
31
|
version: z.ZodString;
|
|
@@ -15,6 +41,7 @@ export declare const ClawSoulSchema: z.ZodObject<{
|
|
|
15
41
|
openclaw: z.ZodOptional<z.ZodString>;
|
|
16
42
|
models: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
17
43
|
}, z.core.$strip>>;
|
|
44
|
+
repository: z.ZodOptional<z.ZodString>;
|
|
18
45
|
files: z.ZodObject<{
|
|
19
46
|
soul: z.ZodString;
|
|
20
47
|
identity: z.ZodOptional<z.ZodString>;
|
|
@@ -35,7 +62,113 @@ export declare const ClawSoulSchema: z.ZodObject<{
|
|
|
35
62
|
strict: "strict";
|
|
36
63
|
}>>;
|
|
37
64
|
skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
65
|
+
}, z.core.$strip>;
|
|
66
|
+
export declare const SPEC_VERSIONS: {
|
|
67
|
+
readonly '0.1': z.ZodObject<{
|
|
68
|
+
name: z.ZodString;
|
|
69
|
+
displayName: z.ZodString;
|
|
70
|
+
version: z.ZodString;
|
|
71
|
+
description: z.ZodString;
|
|
72
|
+
author: z.ZodObject<{
|
|
73
|
+
name: z.ZodString;
|
|
74
|
+
github: z.ZodOptional<z.ZodString>;
|
|
75
|
+
}, z.core.$strip>;
|
|
76
|
+
license: z.ZodString;
|
|
77
|
+
tags: z.ZodArray<z.ZodString>;
|
|
78
|
+
category: z.ZodString;
|
|
79
|
+
compatibility: z.ZodOptional<z.ZodObject<{
|
|
80
|
+
openclaw: z.ZodOptional<z.ZodString>;
|
|
81
|
+
models: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
82
|
+
}, z.core.$strip>>;
|
|
83
|
+
files: z.ZodObject<{
|
|
84
|
+
soul: z.ZodString;
|
|
85
|
+
identity: z.ZodOptional<z.ZodString>;
|
|
86
|
+
agents: z.ZodOptional<z.ZodString>;
|
|
87
|
+
heartbeat: z.ZodOptional<z.ZodString>;
|
|
88
|
+
userTemplate: z.ZodOptional<z.ZodString>;
|
|
89
|
+
avatar: z.ZodOptional<z.ZodString>;
|
|
90
|
+
}, z.core.$strip>;
|
|
91
|
+
repository: z.ZodOptional<z.ZodString>;
|
|
92
|
+
}, z.core.$strip>;
|
|
93
|
+
readonly '0.2': z.ZodObject<{
|
|
94
|
+
name: z.ZodString;
|
|
95
|
+
displayName: z.ZodString;
|
|
96
|
+
version: z.ZodString;
|
|
97
|
+
description: z.ZodString;
|
|
98
|
+
author: z.ZodObject<{
|
|
99
|
+
name: z.ZodString;
|
|
100
|
+
github: z.ZodOptional<z.ZodString>;
|
|
101
|
+
}, z.core.$strip>;
|
|
102
|
+
license: z.ZodString;
|
|
103
|
+
tags: z.ZodArray<z.ZodString>;
|
|
104
|
+
category: z.ZodString;
|
|
105
|
+
compatibility: z.ZodOptional<z.ZodObject<{
|
|
106
|
+
openclaw: z.ZodOptional<z.ZodString>;
|
|
107
|
+
models: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
108
|
+
}, z.core.$strip>>;
|
|
109
|
+
repository: z.ZodOptional<z.ZodString>;
|
|
110
|
+
files: z.ZodObject<{
|
|
111
|
+
soul: z.ZodString;
|
|
112
|
+
identity: z.ZodOptional<z.ZodString>;
|
|
113
|
+
agents: z.ZodOptional<z.ZodString>;
|
|
114
|
+
heartbeat: z.ZodOptional<z.ZodString>;
|
|
115
|
+
style: z.ZodOptional<z.ZodString>;
|
|
116
|
+
userTemplate: z.ZodOptional<z.ZodString>;
|
|
117
|
+
avatar: z.ZodOptional<z.ZodString>;
|
|
118
|
+
}, z.core.$strip>;
|
|
119
|
+
examples: z.ZodOptional<z.ZodObject<{
|
|
120
|
+
good: z.ZodOptional<z.ZodString>;
|
|
121
|
+
bad: z.ZodOptional<z.ZodString>;
|
|
122
|
+
}, z.core.$strip>>;
|
|
123
|
+
modes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
124
|
+
interpolation: z.ZodOptional<z.ZodEnum<{
|
|
125
|
+
bold: "bold";
|
|
126
|
+
cautious: "cautious";
|
|
127
|
+
strict: "strict";
|
|
128
|
+
}>>;
|
|
129
|
+
skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
130
|
+
}, z.core.$strip>;
|
|
131
|
+
};
|
|
132
|
+
export type SpecVersion = keyof typeof SPEC_VERSIONS;
|
|
133
|
+
export declare const LATEST_SPEC: SpecVersion;
|
|
134
|
+
export declare const ClawSoulSchema: z.ZodObject<{
|
|
135
|
+
name: z.ZodString;
|
|
136
|
+
displayName: z.ZodString;
|
|
137
|
+
version: z.ZodString;
|
|
138
|
+
description: z.ZodString;
|
|
139
|
+
author: z.ZodObject<{
|
|
140
|
+
name: z.ZodString;
|
|
141
|
+
github: z.ZodOptional<z.ZodString>;
|
|
142
|
+
}, z.core.$strip>;
|
|
143
|
+
license: z.ZodString;
|
|
144
|
+
tags: z.ZodArray<z.ZodString>;
|
|
145
|
+
category: z.ZodString;
|
|
146
|
+
compatibility: z.ZodOptional<z.ZodObject<{
|
|
147
|
+
openclaw: z.ZodOptional<z.ZodString>;
|
|
148
|
+
models: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
149
|
+
}, z.core.$strip>>;
|
|
38
150
|
repository: z.ZodOptional<z.ZodString>;
|
|
151
|
+
files: z.ZodObject<{
|
|
152
|
+
soul: z.ZodString;
|
|
153
|
+
identity: z.ZodOptional<z.ZodString>;
|
|
154
|
+
agents: z.ZodOptional<z.ZodString>;
|
|
155
|
+
heartbeat: z.ZodOptional<z.ZodString>;
|
|
156
|
+
style: z.ZodOptional<z.ZodString>;
|
|
157
|
+
userTemplate: z.ZodOptional<z.ZodString>;
|
|
158
|
+
avatar: z.ZodOptional<z.ZodString>;
|
|
159
|
+
}, z.core.$strip>;
|
|
160
|
+
examples: z.ZodOptional<z.ZodObject<{
|
|
161
|
+
good: z.ZodOptional<z.ZodString>;
|
|
162
|
+
bad: z.ZodOptional<z.ZodString>;
|
|
163
|
+
}, z.core.$strip>>;
|
|
164
|
+
modes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
165
|
+
interpolation: z.ZodOptional<z.ZodEnum<{
|
|
166
|
+
bold: "bold";
|
|
167
|
+
cautious: "cautious";
|
|
168
|
+
strict: "strict";
|
|
169
|
+
}>>;
|
|
170
|
+
skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
39
171
|
}, z.core.$strip>;
|
|
40
|
-
export type ClawSoul = z.infer<typeof
|
|
41
|
-
export declare function
|
|
172
|
+
export type ClawSoul = z.infer<typeof ClawSoulSchemaV02>;
|
|
173
|
+
export declare function getSchema(version?: string): z.ZodType;
|
|
174
|
+
export declare function validateClawSoul(data: unknown, version?: string): ClawSoul;
|
package/dist/utils/validate.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
|
|
2
|
+
// ─── v0.1 Schema ───────────────────────────────────────────
|
|
3
|
+
export const ClawSoulSchemaV01 = z.object({
|
|
3
4
|
name: z.string().regex(/^[a-z0-9-]+$/, 'Must be kebab-case'),
|
|
4
5
|
displayName: z.string().min(1),
|
|
5
6
|
version: z.string().regex(/^\d+\.\d+\.\d+$/, 'Must be semver'),
|
|
@@ -15,6 +16,18 @@ export const ClawSoulSchema = z.object({
|
|
|
15
16
|
openclaw: z.string().optional(),
|
|
16
17
|
models: z.array(z.string()).optional(),
|
|
17
18
|
}).optional(),
|
|
19
|
+
files: z.object({
|
|
20
|
+
soul: z.string(),
|
|
21
|
+
identity: z.string().optional(),
|
|
22
|
+
agents: z.string().optional(),
|
|
23
|
+
heartbeat: z.string().optional(),
|
|
24
|
+
userTemplate: z.string().optional(),
|
|
25
|
+
avatar: z.string().optional(),
|
|
26
|
+
}),
|
|
27
|
+
repository: z.string().url().optional(),
|
|
28
|
+
});
|
|
29
|
+
// ─── v0.2 Schema (extends v0.1 with STYLE.md, modes, interpolation, examples, skills) ───
|
|
30
|
+
export const ClawSoulSchemaV02 = ClawSoulSchemaV01.extend({
|
|
18
31
|
files: z.object({
|
|
19
32
|
soul: z.string(),
|
|
20
33
|
identity: z.string().optional(),
|
|
@@ -31,9 +44,28 @@ export const ClawSoulSchema = z.object({
|
|
|
31
44
|
modes: z.array(z.string()).optional(),
|
|
32
45
|
interpolation: z.enum(['bold', 'cautious', 'strict']).optional(),
|
|
33
46
|
skills: z.array(z.string()).optional(),
|
|
34
|
-
repository: z.string().url().optional(),
|
|
35
47
|
});
|
|
36
|
-
|
|
37
|
-
|
|
48
|
+
// ─── Version Registry ──────────────────────────────────────
|
|
49
|
+
export const SPEC_VERSIONS = {
|
|
50
|
+
'0.1': ClawSoulSchemaV01,
|
|
51
|
+
'0.2': ClawSoulSchemaV02,
|
|
52
|
+
};
|
|
53
|
+
export const LATEST_SPEC = '0.2';
|
|
54
|
+
// Default export = latest
|
|
55
|
+
export const ClawSoulSchema = SPEC_VERSIONS[LATEST_SPEC];
|
|
56
|
+
export function getSchema(version) {
|
|
57
|
+
if (!version)
|
|
58
|
+
return ClawSoulSchema;
|
|
59
|
+
const v = version.replace(/^v/, '');
|
|
60
|
+
const schema = SPEC_VERSIONS[v];
|
|
61
|
+
if (!schema) {
|
|
62
|
+
const available = Object.keys(SPEC_VERSIONS).join(', ');
|
|
63
|
+
throw new Error(`Unknown spec version "${version}". Available: ${available}`);
|
|
64
|
+
}
|
|
65
|
+
return schema;
|
|
66
|
+
}
|
|
67
|
+
export function validateClawSoul(data, version) {
|
|
68
|
+
const schema = getSchema(version);
|
|
69
|
+
return schema.parse(data);
|
|
38
70
|
}
|
|
39
71
|
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"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"}
|