clawsouls 0.2.9 ā 0.3.1
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 +1 -1
- 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/package.json +2 -4
- package/dist/registry/client.d.ts +0 -24
- package/dist/registry/client.js +0 -143
- package/dist/registry/client.js.map +0 -1
- package/dist/utils/validate.d.ts +0 -174
- package/dist/utils/validate.js +0 -71
- package/dist/utils/validate.js.map +0 -1
package/README.md
CHANGED
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,QAAQ,GAAG,6BAA6B,CAAC;AAE/C,qDAAqD;AACrD,MAAM,cAAc,GAA2B;IAC7C,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;QAC1B,WAAW,EAAE,KAAK;QAClB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,qBAAqB;QAClC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE;QACpD,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE;KACpG,EAAE,IAAI,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,+CAA+C;IAC1D,aAAa,EAAE,qDAAqD;IACpE,WAAW,EAAE,wCAAwC;IACrD,cAAc,EAAE,eAAe;IAC/B,WAAW,EAAE,kDAAkD;CAChE,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAa;IAC7C,MAAM,QAAQ,GAAG,IAAI,IAAI,SAAS,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE1C,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,6BAA6B;IAC7B,IAAI,KAA6B,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,oBAAoB,CAAC,CAAC;QACzD,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,cAAc,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,cAAc,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,2BAA2B;IAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,IAAI,SAAS,GAAG,OAAO,CAAC;QACxB,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACzB,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChH,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,YAAY,QAAQ,GAAG,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,QAAQ,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
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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"}
|