clawsouls 0.2.8 ā 0.3.0
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 +8 -8
- package/dist/bin/clawsouls.js +3 -3
- package/dist/bin/clawsouls.js.map +1 -1
- package/dist/commands/init.js +65 -97
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +19 -42
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/publish.d.ts +3 -1
- package/dist/commands/publish.js +52 -51
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/validate.d.ts +1 -3
- package/dist/commands/validate.js +58 -218
- package/dist/commands/validate.js.map +1 -1
- package/dist/storage/local.d.ts +1 -2
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/manager.js.map +1 -1
- package/dist/utils/validate.d.ts +99 -1
- package/dist/utils/validate.js +46 -2
- package/dist/utils/validate.js.map +1 -1
- package/package.json +2 -4
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# š§ ClawSouls CLI v0.2.
|
|
1
|
+
# š§ ClawSouls CLI v0.2.9
|
|
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
|
|
|
@@ -15,10 +15,10 @@ Browse available souls at [clawsouls.ai](https://clawsouls.ai).
|
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
# Install a soul (owner/name format)
|
|
18
|
-
npx clawsouls install clawsouls/
|
|
18
|
+
npx clawsouls install clawsouls/surgical-coder
|
|
19
19
|
|
|
20
20
|
# Activate it (backs up your current workspace)
|
|
21
|
-
npx clawsouls use
|
|
21
|
+
npx clawsouls use surgical-coder
|
|
22
22
|
|
|
23
23
|
# Restart your OpenClaw session ā done!
|
|
24
24
|
```
|
|
@@ -49,15 +49,15 @@ Creates a directory with `soul.json`, `SOUL.md`, `IDENTITY.md`, `AGENTS.md`, `HE
|
|
|
49
49
|
|
|
50
50
|
### `clawsouls install <owner/name[@version]>`
|
|
51
51
|
|
|
52
|
-
Download and install a soul from the registry. Uses `owner/name` format (e.g., `clawsouls/
|
|
52
|
+
Download and install a soul from the registry. Uses `owner/name` format (e.g., `clawsouls/surgical-coder`). Optionally specify a version with `@version` (e.g., `clawsouls/surgical-coder@0.1.0`). Without a version, installs the latest.
|
|
53
53
|
|
|
54
54
|
The install command tries the API first (`/api/v1/souls/:owner/:name?files=true`), falls back to CDN if unavailable, and auto-generates `soul.json` if missing from the response.
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
57
|
clawsouls install clawsouls/minimalist
|
|
58
58
|
clawsouls install clawsouls/devops-veteran
|
|
59
|
-
clawsouls install clawsouls/
|
|
60
|
-
clawsouls install clawsouls/
|
|
59
|
+
clawsouls install clawsouls/surgical-coder --force # overwrite existing
|
|
60
|
+
clawsouls install clawsouls/surgical-coder@0.1.0 # specific version
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
### `clawsouls use <name>`
|
|
@@ -145,7 +145,7 @@ Popular picks:
|
|
|
145
145
|
|
|
146
146
|
| Soul | Category | Description |
|
|
147
147
|
|------|----------|-------------|
|
|
148
|
-
|
|
|
148
|
+
| š¬ **Surgical Coder** | Engineering | Karpathy-inspired surgical coding precision |
|
|
149
149
|
| š¬ **Surgical Coder** | Engineering | Disciplined coding agent inspired by Karpathy's CLAUDE.md |
|
|
150
150
|
| š§ **DevOps Veteran** | DevOps | Battle-scarred infrastructure engineer |
|
|
151
151
|
| š® **GameDev Mentor** | Game Dev | Experienced game developer and mentor |
|
|
@@ -177,7 +177,7 @@ The spec is open ā see [Soul Spec](https://github.com/clawsouls/clawsouls/blob
|
|
|
177
177
|
```
|
|
178
178
|
āāāāāāāāāāāāāāāāāāāā install āāāāāāāāāāāāāāāā
|
|
179
179
|
ā clawsouls.ai ā āāāāāāāāāāāā ā ~/.openclaw/ ā
|
|
180
|
-
ā (API Registry) ā GET /api/ ā souls/
|
|
180
|
+
ā (API Registry) ā GET /api/ ā souls/surgical-coder/ ā
|
|
181
181
|
āāāāāāāāāāāāāāāāāāāā v1/souls/ āāāāāāāā¬āāāāāāāā
|
|
182
182
|
ā² owner/name ā use
|
|
183
183
|
ā ā¼
|
package/dist/bin/clawsouls.js
CHANGED
|
@@ -37,7 +37,8 @@ program
|
|
|
37
37
|
program
|
|
38
38
|
.command('publish <dir>')
|
|
39
39
|
.description('Publish a soul package to the registry')
|
|
40
|
-
.
|
|
40
|
+
.option('--confirm', 'Skip interactive confirmation prompt')
|
|
41
|
+
.action((dir, opts) => publishCommand(dir, opts));
|
|
41
42
|
program
|
|
42
43
|
.command('login <token>')
|
|
43
44
|
.description('Save API token for registry authentication')
|
|
@@ -58,7 +59,6 @@ program
|
|
|
58
59
|
.command('validate [dir]')
|
|
59
60
|
.alias('check')
|
|
60
61
|
.description('Validate a soul package against the spec')
|
|
61
|
-
.
|
|
62
|
-
.action((dir, options) => validateCommand(dir, options));
|
|
62
|
+
.action((dir) => validateCommand(dir));
|
|
63
63
|
program.parse();
|
|
64
64
|
//# 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,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,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;
|
|
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,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,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,WAAW,EAAE,sCAAsC,CAAC;KAC3D,MAAM,CAAC,CAAC,GAAW,EAAE,IAA2B,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnF,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,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,CAAC,GAAY,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAElD,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,107 +1,75 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import {
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
3
3
|
import { join } from 'path';
|
|
4
|
+
const API_BASE = 'https://clawsouls.ai/api/v1';
|
|
5
|
+
// Minimal fallback template if server is unreachable
|
|
6
|
+
const FALLBACK_FILES = {
|
|
7
|
+
'soul.json': JSON.stringify({
|
|
8
|
+
specVersion: '0.3',
|
|
9
|
+
name: 'my-soul',
|
|
10
|
+
displayName: 'My Soul',
|
|
11
|
+
version: '1.0.0',
|
|
12
|
+
description: 'A custom AI persona',
|
|
13
|
+
author: { name: 'Your Name', github: 'your-github' },
|
|
14
|
+
license: 'Apache-2.0',
|
|
15
|
+
tags: ['custom'],
|
|
16
|
+
category: 'general',
|
|
17
|
+
files: { soul: 'SOUL.md', identity: 'IDENTITY.md', agents: 'AGENTS.md', heartbeat: 'HEARTBEAT.md' },
|
|
18
|
+
}, null, 2),
|
|
19
|
+
'SOUL.md': '# My Soul\n\nDescribe your AI persona here.\n',
|
|
20
|
+
'IDENTITY.md': '# My Soul\n\n- **Name:** My Soul\n- **Emoji:** š¤\n',
|
|
21
|
+
'AGENTS.md': '# Workflow\n\n## Rules\n- Be helpful\n',
|
|
22
|
+
'HEARTBEAT.md': '# Heartbeat\n',
|
|
23
|
+
'README.md': '# My Soul\n\nA custom AI persona for OpenClaw.\n',
|
|
24
|
+
};
|
|
4
25
|
export async function initCommand(name) {
|
|
5
26
|
const soulName = name || 'my-soul';
|
|
6
27
|
const dir = join(process.cwd(), soulName);
|
|
7
28
|
if (existsSync(dir)) {
|
|
8
|
-
console.
|
|
9
|
-
|
|
29
|
+
console.error(chalk.red(`Directory already exists: ${soulName}/`));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
// Fetch template from server
|
|
33
|
+
let files;
|
|
34
|
+
try {
|
|
35
|
+
const res = await fetch(`${API_BASE}/template?spec=0.3`);
|
|
36
|
+
if (res.ok) {
|
|
37
|
+
const data = await res.json();
|
|
38
|
+
files = data.files;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
files = FALLBACK_FILES;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
files = FALLBACK_FILES;
|
|
10
46
|
}
|
|
11
47
|
mkdirSync(dir, { recursive: true });
|
|
12
|
-
//
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
writeFileSync(join(dir, 'SOUL.md'), `# ${meta.displayName}
|
|
39
|
-
|
|
40
|
-
Describe who this AI persona is.
|
|
41
|
-
|
|
42
|
-
## Personality
|
|
43
|
-
|
|
44
|
-
- **Tone**:
|
|
45
|
-
- **Style**:
|
|
46
|
-
- **Philosophy**:
|
|
47
|
-
|
|
48
|
-
## Principles
|
|
49
|
-
|
|
50
|
-
1. ...
|
|
51
|
-
2. ...
|
|
52
|
-
3. ...
|
|
53
|
-
|
|
54
|
-
## Communication
|
|
55
|
-
|
|
56
|
-
- ...
|
|
57
|
-
|
|
58
|
-
## Boundaries
|
|
59
|
-
|
|
60
|
-
- ...
|
|
61
|
-
`);
|
|
62
|
-
// IDENTITY.md
|
|
63
|
-
writeFileSync(join(dir, 'IDENTITY.md'), `# ${meta.displayName}
|
|
64
|
-
|
|
65
|
-
- **Name:**
|
|
66
|
-
- **Creature:**
|
|
67
|
-
- **Vibe:**
|
|
68
|
-
- **Emoji:**
|
|
69
|
-
`);
|
|
70
|
-
// AGENTS.md
|
|
71
|
-
writeFileSync(join(dir, 'AGENTS.md'), `# ${meta.displayName} ā Workflow
|
|
72
|
-
|
|
73
|
-
## Every Session
|
|
74
|
-
1. Read SOUL.md, USER.md, memory files
|
|
75
|
-
2. ...
|
|
76
|
-
|
|
77
|
-
## Work Rules
|
|
78
|
-
- ...
|
|
79
|
-
|
|
80
|
-
## Safety
|
|
81
|
-
- ...
|
|
82
|
-
|
|
83
|
-
## Heartbeats
|
|
84
|
-
- ...
|
|
85
|
-
`);
|
|
86
|
-
// HEARTBEAT.md
|
|
87
|
-
writeFileSync(join(dir, 'HEARTBEAT.md'), '# Heartbeat Checks\n# Add your periodic checks here\n');
|
|
88
|
-
// README.md
|
|
89
|
-
writeFileSync(join(dir, 'README.md'), `# ${meta.displayName}
|
|
90
|
-
|
|
91
|
-
Short description.
|
|
92
|
-
|
|
93
|
-
**Best for:** ...
|
|
94
|
-
|
|
95
|
-
**Personality:** ...
|
|
96
|
-
|
|
97
|
-
**Skills:** ...
|
|
98
|
-
`);
|
|
99
|
-
console.log();
|
|
100
|
-
console.log(chalk.green(`ā
Soul "${soulName}" created!`));
|
|
101
|
-
console.log();
|
|
102
|
-
console.log(` ${chalk.cyan('Edit:')} cd ${soulName} && edit SOUL.md`);
|
|
103
|
-
console.log(` ${chalk.cyan('Test:')} clawsouls use ${soulName} (after install)`);
|
|
104
|
-
console.log(` ${chalk.cyan('Publish:')} clawsouls publish (coming soon)`);
|
|
105
|
-
console.log();
|
|
48
|
+
// Replace placeholder name
|
|
49
|
+
for (const [filename, content] of Object.entries(files)) {
|
|
50
|
+
let processed = content;
|
|
51
|
+
if (filename === 'soul.json') {
|
|
52
|
+
try {
|
|
53
|
+
const manifest = JSON.parse(content);
|
|
54
|
+
manifest.name = soulName;
|
|
55
|
+
manifest.displayName = soulName.split('-').map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
|
|
56
|
+
processed = JSON.stringify(manifest, null, 2);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
processed = content.replace(/"name":\s*"my-soul"/, `"name": "${soulName}"`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
writeFileSync(join(dir, filename), processed, 'utf-8');
|
|
63
|
+
}
|
|
64
|
+
console.log(chalk.green(`\nā Created soul scaffold: ${soulName}/\n`));
|
|
65
|
+
console.log(` Files:`);
|
|
66
|
+
for (const filename of Object.keys(files)) {
|
|
67
|
+
console.log(chalk.dim(` ${filename}`));
|
|
68
|
+
}
|
|
69
|
+
console.log(`\n Next steps:`);
|
|
70
|
+
console.log(chalk.cyan(` cd ${soulName}`));
|
|
71
|
+
console.log(chalk.cyan(` # Edit SOUL.md and other files`));
|
|
72
|
+
console.log(chalk.cyan(` clawsouls validate .`));
|
|
73
|
+
console.log(chalk.cyan(` clawsouls publish .`));
|
|
106
74
|
}
|
|
107
75
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/install.js
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { RegistryClient } from '../registry/client.js';
|
|
4
3
|
import { StorageManager } from '../storage/manager.js';
|
|
5
4
|
import { writeFileSync } from 'fs';
|
|
6
5
|
import { join } from 'path';
|
|
7
6
|
import { ensureDir } from '../utils/config.js';
|
|
8
|
-
|
|
9
|
-
* Parse a soul identifier. Supports:
|
|
10
|
-
* owner/name
|
|
11
|
-
* owner/name@version
|
|
12
|
-
* name (legacy, no owner)
|
|
13
|
-
* name@version (legacy)
|
|
14
|
-
*/
|
|
7
|
+
const API_BASE = 'https://clawsouls.ai/api/v1';
|
|
15
8
|
function parseSoulId(input) {
|
|
16
9
|
const [nameWithOwner, version] = input.split('@');
|
|
17
10
|
if (nameWithOwner.includes('/')) {
|
|
@@ -26,54 +19,38 @@ export async function installCommand(nameWithVersion, options) {
|
|
|
26
19
|
const spinner = ora(`Installing soul "${fullName}"...`).start();
|
|
27
20
|
try {
|
|
28
21
|
const storage = new StorageManager();
|
|
29
|
-
const registry = new RegistryClient();
|
|
30
|
-
// Use owner/name as storage key
|
|
31
22
|
const storageKey = owner ? `${owner}/${name}` : name;
|
|
32
23
|
if (storage.isInstalled(storageKey) && !options.force) {
|
|
33
24
|
spinner.fail(`Soul "${fullName}" is already installed. Use ${chalk.yellow('--force')} to overwrite.`);
|
|
34
25
|
process.exit(1);
|
|
35
26
|
}
|
|
36
|
-
spinner.text = `
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// Skip missing optional files
|
|
27
|
+
spinner.text = `Downloading "${fullName}"${version ? `@${version}` : ''}...`;
|
|
28
|
+
// Use bundle API ā single request for all files
|
|
29
|
+
const bundleOwner = owner || 'clawsouls';
|
|
30
|
+
const vq = version ? `?version=${version}` : '';
|
|
31
|
+
const res = await fetch(`${API_BASE}/bundle/${bundleOwner}/${name}${vq}`);
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
const data = await res.json().catch(() => ({ error: 'Unknown error' }));
|
|
34
|
+
if (res.status === 404) {
|
|
35
|
+
throw new Error(`Soul "${fullName}" not found`);
|
|
48
36
|
}
|
|
37
|
+
throw new Error(data.error || `Server error: ${res.status}`);
|
|
49
38
|
}
|
|
39
|
+
const bundle = await res.json();
|
|
50
40
|
spinner.text = `Saving to local storage...`;
|
|
51
41
|
const soulDir = storage.getSoulDir(storageKey);
|
|
52
42
|
ensureDir(soulDir);
|
|
53
|
-
for (const [filename, content] of files) {
|
|
43
|
+
for (const [filename, content] of Object.entries(bundle.files)) {
|
|
44
|
+
if (typeof content !== 'string')
|
|
45
|
+
continue;
|
|
54
46
|
const filePath = join(soulDir, filename);
|
|
55
47
|
ensureDir(join(filePath, '..'));
|
|
56
48
|
writeFileSync(filePath, content, 'utf-8');
|
|
57
49
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
version: meta.version || '1.0.0',
|
|
63
|
-
description: meta.description || '',
|
|
64
|
-
category: meta.category || '',
|
|
65
|
-
tags: meta.tags || [],
|
|
66
|
-
files: Object.fromEntries([...files.keys()]
|
|
67
|
-
.filter(f => f.endsWith('.md'))
|
|
68
|
-
.map(f => {
|
|
69
|
-
const key = f.replace('.md', '').toLowerCase();
|
|
70
|
-
return [key, f];
|
|
71
|
-
})),
|
|
72
|
-
};
|
|
73
|
-
writeFileSync(join(soulDir, 'soul.json'), JSON.stringify(manifest, null, 2), 'utf-8');
|
|
74
|
-
}
|
|
75
|
-
spinner.succeed(`Installed ${chalk.green(meta.displayName || name)} v${meta.version || '?'}\n` +
|
|
76
|
-
` ${chalk.dim(meta.description || '')}\n` +
|
|
50
|
+
const displayName = bundle.manifest?.displayName || name;
|
|
51
|
+
const ver = bundle.version || bundle.manifest?.version || '?';
|
|
52
|
+
spinner.succeed(`Installed ${chalk.green(displayName)} v${ver}\n` +
|
|
53
|
+
` ${chalk.dim(bundle.manifest?.description || '')}\n` +
|
|
77
54
|
` Run ${chalk.cyan(`clawsouls use ${storageKey}`)} to activate.`);
|
|
78
55
|
}
|
|
79
56
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/publish.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import { createInterface } from 'readline';
|
|
4
4
|
const API_BASE = 'https://clawsouls.ai/api/v1';
|
|
5
5
|
function getToken() {
|
|
6
6
|
if (process.env.CLAWSOULS_TOKEN)
|
|
@@ -23,7 +23,44 @@ async function getUsername(token) {
|
|
|
23
23
|
const data = await res.json();
|
|
24
24
|
return data.user?.username || data.username || data.user?.name || data.name;
|
|
25
25
|
}
|
|
26
|
-
|
|
26
|
+
function askConfirmation(question) {
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
29
|
+
rl.question(question, (answer) => {
|
|
30
|
+
rl.close();
|
|
31
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function collectFiles(soulDir) {
|
|
36
|
+
const files = {};
|
|
37
|
+
const entries = readdirSync(soulDir);
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
const fullPath = join(soulDir, entry);
|
|
40
|
+
if (statSync(fullPath).isFile() && entry !== 'soul.json' && entry !== 'clawsoul.json') {
|
|
41
|
+
try {
|
|
42
|
+
files[entry] = readFileSync(fullPath, 'utf-8');
|
|
43
|
+
}
|
|
44
|
+
catch { }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
const fullPath = join(soulDir, entry);
|
|
49
|
+
if (statSync(fullPath).isDirectory()) {
|
|
50
|
+
for (const sub of readdirSync(fullPath)) {
|
|
51
|
+
const subPath = join(fullPath, sub);
|
|
52
|
+
if (statSync(subPath).isFile()) {
|
|
53
|
+
try {
|
|
54
|
+
files[`${entry}/${sub}`] = readFileSync(subPath, 'utf-8');
|
|
55
|
+
}
|
|
56
|
+
catch { }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return files;
|
|
62
|
+
}
|
|
63
|
+
export async function publishCommand(dir, options) {
|
|
27
64
|
const soulDir = dir.startsWith('/') ? dir : join(process.cwd(), dir);
|
|
28
65
|
if (!existsSync(soulDir) || !statSync(soulDir).isDirectory()) {
|
|
29
66
|
console.error(`Error: "${dir}" is not a directory`);
|
|
@@ -33,8 +70,7 @@ export async function publishCommand(dir) {
|
|
|
33
70
|
const legacyPath = join(soulDir, 'clawsoul.json');
|
|
34
71
|
const manifestPath = existsSync(soulJsonPath) ? soulJsonPath : legacyPath;
|
|
35
72
|
if (!existsSync(manifestPath)) {
|
|
36
|
-
console.error(
|
|
37
|
-
console.error('Run "clawsouls init" to create one, or add it manually.');
|
|
73
|
+
console.error('Error: soul.json not found. Run "clawsouls init" to create one.');
|
|
38
74
|
process.exit(1);
|
|
39
75
|
}
|
|
40
76
|
if (manifestPath === legacyPath) {
|
|
@@ -44,30 +80,18 @@ export async function publishCommand(dir) {
|
|
|
44
80
|
try {
|
|
45
81
|
manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
46
82
|
}
|
|
47
|
-
catch
|
|
83
|
+
catch {
|
|
48
84
|
console.error('Error: Invalid soul.json');
|
|
49
85
|
process.exit(1);
|
|
50
86
|
}
|
|
51
|
-
// Validate against spec
|
|
52
|
-
const validation = ClawSoulSchema.safeParse(manifest);
|
|
53
|
-
if (!validation.success) {
|
|
54
|
-
console.error('Error: soul.json validation failed:');
|
|
55
|
-
for (const issue of validation.error.issues) {
|
|
56
|
-
console.error(` - ${issue.path.join('.')}: ${issue.message}`);
|
|
57
|
-
}
|
|
58
|
-
process.exit(1);
|
|
59
|
-
}
|
|
60
87
|
const token = getToken();
|
|
61
88
|
if (!token) {
|
|
62
|
-
console.error('Error: Authentication required
|
|
63
|
-
console.error('');
|
|
89
|
+
console.error('Error: Authentication required.\n');
|
|
64
90
|
console.error('Log in with your API token:');
|
|
65
|
-
console.error(' clawsouls login <token
|
|
66
|
-
console.error('');
|
|
91
|
+
console.error(' clawsouls login <token>\n');
|
|
67
92
|
console.error('Get a token at: https://clawsouls.ai/dashboard');
|
|
68
93
|
process.exit(1);
|
|
69
94
|
}
|
|
70
|
-
// Get the authenticated user's username for namespacing
|
|
71
95
|
let owner;
|
|
72
96
|
try {
|
|
73
97
|
owner = await getUsername(token);
|
|
@@ -76,36 +100,16 @@ export async function publishCommand(dir) {
|
|
|
76
100
|
console.error(`Error: ${err.message}`);
|
|
77
101
|
process.exit(1);
|
|
78
102
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const entries = readdirSync(soulDir);
|
|
85
|
-
for (const entry of entries) {
|
|
86
|
-
const fullPath = join(soulDir, entry);
|
|
87
|
-
if (statSync(fullPath).isFile() && entry !== 'soul.json' && entry !== 'clawsoul.json') {
|
|
88
|
-
try {
|
|
89
|
-
files[entry] = readFileSync(fullPath, 'utf-8');
|
|
90
|
-
}
|
|
91
|
-
catch { }
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
for (const entry of entries) {
|
|
95
|
-
const fullPath = join(soulDir, entry);
|
|
96
|
-
if (statSync(fullPath).isDirectory()) {
|
|
97
|
-
const subEntries = readdirSync(fullPath);
|
|
98
|
-
for (const subEntry of subEntries) {
|
|
99
|
-
const subPath = join(fullPath, subEntry);
|
|
100
|
-
if (statSync(subPath).isFile()) {
|
|
101
|
-
try {
|
|
102
|
-
files[`${entry}/${subEntry}`] = readFileSync(subPath, 'utf-8');
|
|
103
|
-
}
|
|
104
|
-
catch { }
|
|
105
|
-
}
|
|
106
|
-
}
|
|
103
|
+
if (!options?.confirm) {
|
|
104
|
+
const confirmed = await askConfirmation('Do you confirm this is your original work or you have the rights to distribute it? (y/N) ');
|
|
105
|
+
if (!confirmed) {
|
|
106
|
+
console.error('Publish cancelled.');
|
|
107
|
+
process.exit(1);
|
|
107
108
|
}
|
|
108
109
|
}
|
|
110
|
+
const soulName = manifest.name.includes('/') ? manifest.name.split('/')[1] : manifest.name;
|
|
111
|
+
manifest.name = soulName;
|
|
112
|
+
const files = collectFiles(soulDir);
|
|
109
113
|
const fileCount = Object.keys(files).length;
|
|
110
114
|
console.log(`Publishing ${owner}/${soulName}@${manifest.version || '0.1.0'}...`);
|
|
111
115
|
console.log(` ${fileCount} files`);
|
|
@@ -131,10 +135,8 @@ export async function publishCommand(dir) {
|
|
|
131
135
|
console.log(`\nā
Published successfully!`);
|
|
132
136
|
console.log(` URL: ${data.url}`);
|
|
133
137
|
if (data.warnings?.length) {
|
|
134
|
-
|
|
135
|
-
for (const w of data.warnings) {
|
|
138
|
+
for (const w of data.warnings)
|
|
136
139
|
console.log(` ā ļø ${w}`);
|
|
137
|
-
}
|
|
138
140
|
}
|
|
139
141
|
}
|
|
140
142
|
catch (err) {
|
|
@@ -142,5 +144,4 @@ export async function publishCommand(dir) {
|
|
|
142
144
|
process.exit(1);
|
|
143
145
|
}
|
|
144
146
|
}
|
|
145
|
-
// loginCommand moved to login.ts
|
|
146
147
|
//# sourceMappingURL=publish.js.map
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
|