clawsouls 0.4.1 → 0.4.3
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 +107 -100
- package/dist/bin/clawsouls.js +27 -3
- package/dist/bin/clawsouls.js.map +1 -1
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.js +160 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/platform.d.ts +1 -0
- package/dist/commands/platform.js +37 -0
- package/dist/commands/platform.js.map +1 -0
- package/dist/commands/use.d.ts +3 -1
- package/dist/commands/use.js +6 -21
- package/dist/commands/use.js.map +1 -1
- package/dist/storage/manager.d.ts +1 -1
- package/dist/storage/manager.js +2 -2
- package/dist/storage/manager.js.map +1 -1
- package/dist/utils/config.js +3 -11
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/platform.d.ts +4 -1
- package/dist/utils/platform.js +77 -45
- package/dist/utils/platform.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# 🧠 ClawSouls CLI
|
|
1
|
+
# 🧠 ClawSouls CLI
|
|
2
2
|
|
|
3
|
-
**Give your AI a soul.** Install, manage, and switch AI agent personas for
|
|
3
|
+
**Give your AI a soul.** Install, manage, and switch AI agent personas — built for OpenClaw, works with any SOUL.md-compatible agent.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/clawsouls)
|
|
6
6
|
[](LICENSE)
|
|
@@ -11,6 +11,59 @@ ClawSouls is a persona sharing platform for AI agents. A **Soul** is a personali
|
|
|
11
11
|
|
|
12
12
|
Browse available souls at [clawsouls.ai](https://clawsouls.ai).
|
|
13
13
|
|
|
14
|
+
## Multi-Platform Support
|
|
15
|
+
|
|
16
|
+
ClawSouls works with **any SOUL.md-compatible agent framework**. The CLI auto-detects your installed platform and applies souls to the correct workspace.
|
|
17
|
+
|
|
18
|
+
| Platform | Directory | Status |
|
|
19
|
+
|----------|-----------|--------|
|
|
20
|
+
| **OpenClaw** | `~/.openclaw/workspace/` | ✅ Auto-detected |
|
|
21
|
+
| **ZeroClaw** | `~/.zeroclaw/workspace/` | ✅ Auto-detected |
|
|
22
|
+
| **Clawdbot** | `~/.clawdbot/workspace/` | ✅ Auto-detected |
|
|
23
|
+
| **Moltbot** | `~/.moltbot/workspace/` | ✅ Auto-detected |
|
|
24
|
+
| **Moldbot** | `~/.moldbot/workspace/` | ✅ Auto-detected |
|
|
25
|
+
| **Custom** | Any path | ✅ Via `--workspace` or `--platform` |
|
|
26
|
+
|
|
27
|
+
### How It Works
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
┌──────────────────────────────────────────────────┐
|
|
31
|
+
│ clawsouls install clawsouls/surgical-coder │
|
|
32
|
+
│ clawsouls use surgical-coder │
|
|
33
|
+
└──────────────┬───────────────────────────────────┘
|
|
34
|
+
│
|
|
35
|
+
▼ Auto-detect installed platform
|
|
36
|
+
┌────────────────────┐
|
|
37
|
+
│ ~/.openclaw/ ? │──yes──▶ Apply to ~/.openclaw/workspace/
|
|
38
|
+
│ ~/.zeroclaw/ ? │──yes──▶ Apply to ~/.zeroclaw/workspace/
|
|
39
|
+
│ ~/.clawdbot/ ? │──yes──▶ Apply to ~/.clawdbot/workspace/
|
|
40
|
+
│ ~/.moltbot/ ? │──yes──▶ Apply to ~/.moltbot/workspace/
|
|
41
|
+
│ ~/.moldbot/ ? │──yes──▶ Apply to ~/.moldbot/workspace/
|
|
42
|
+
│ --workspace path │──yes──▶ Apply to custom path
|
|
43
|
+
└────────────────────┘
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
1. **Install** downloads soul files to `~/<platform>/souls/<owner>/<name>/`
|
|
47
|
+
2. **Use** copies soul files (SOUL.md, IDENTITY.md, etc.) to the workspace
|
|
48
|
+
3. **Protected files** (USER.md, MEMORY.md, TOOLS.md) are **never overwritten**
|
|
49
|
+
4. **Automatic backup** before every switch — revert with `clawsouls restore`
|
|
50
|
+
|
|
51
|
+
### Override Platform
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Explicit platform flag
|
|
55
|
+
clawsouls --platform zeroclaw use surgical-coder
|
|
56
|
+
|
|
57
|
+
# Custom workspace path
|
|
58
|
+
clawsouls --workspace ~/my-agent/workspace use surgical-coder
|
|
59
|
+
|
|
60
|
+
# Environment variable
|
|
61
|
+
CLAWSOULS_PLATFORM=clawdbot clawsouls use surgical-coder
|
|
62
|
+
|
|
63
|
+
# Check detection
|
|
64
|
+
clawsouls platform
|
|
65
|
+
```
|
|
66
|
+
|
|
14
67
|
## Quick Start
|
|
15
68
|
|
|
16
69
|
```bash
|
|
@@ -20,7 +73,7 @@ npx clawsouls install clawsouls/surgical-coder
|
|
|
20
73
|
# Activate it (backs up your current workspace)
|
|
21
74
|
npx clawsouls use surgical-coder
|
|
22
75
|
|
|
23
|
-
# Restart your
|
|
76
|
+
# Restart your agent session — done!
|
|
24
77
|
```
|
|
25
78
|
|
|
26
79
|
## Installation
|
|
@@ -37,6 +90,21 @@ npm install -g clawsouls
|
|
|
37
90
|
|
|
38
91
|
## Commands
|
|
39
92
|
|
|
93
|
+
### `clawsouls platform`
|
|
94
|
+
|
|
95
|
+
Show detected agent platform(s) and workspace path.
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
clawsouls platform
|
|
99
|
+
|
|
100
|
+
# 🔍 Agent Platform Detection
|
|
101
|
+
#
|
|
102
|
+
# ▶ Active: OpenClaw 🦞
|
|
103
|
+
# Workspace: /home/user/.openclaw/workspace
|
|
104
|
+
# Souls dir: /home/user/.openclaw/souls
|
|
105
|
+
# Restart: openclaw gateway restart
|
|
106
|
+
```
|
|
107
|
+
|
|
40
108
|
### `clawsouls init [name]`
|
|
41
109
|
|
|
42
110
|
Scaffold a new soul package directory with template files.
|
|
@@ -51,8 +119,6 @@ Creates a directory with `soul.json`, `SOUL.md`, `IDENTITY.md`, `AGENTS.md`, `HE
|
|
|
51
119
|
|
|
52
120
|
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
121
|
|
|
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
|
-
|
|
56
122
|
```bash
|
|
57
123
|
clawsouls install clawsouls/minimalist
|
|
58
124
|
clawsouls install clawsouls/devops-veteran
|
|
@@ -68,7 +134,7 @@ Activate an installed soul. Your current workspace files are automatically backe
|
|
|
68
134
|
clawsouls use minimalist
|
|
69
135
|
```
|
|
70
136
|
|
|
71
|
-
**Automatic backup:** Before applying a new soul, the current workspace files (SOUL.md, IDENTITY.md, AGENTS.md, HEARTBEAT.md) are saved to
|
|
137
|
+
**Automatic backup:** Before applying a new soul, the current workspace files (SOUL.md, IDENTITY.md, AGENTS.md, HEARTBEAT.md) are saved to `~/<platform>/souls/_backup/<timestamp>/`. You can always revert with `clawsouls restore`.
|
|
72
138
|
|
|
73
139
|
**Protected files** — these are never overwritten:
|
|
74
140
|
- `USER.md` (your personal data)
|
|
@@ -77,136 +143,77 @@ clawsouls use minimalist
|
|
|
77
143
|
|
|
78
144
|
### `clawsouls restore`
|
|
79
145
|
|
|
80
|
-
Revert to your previous soul from the latest backup
|
|
146
|
+
Revert to your previous soul from the latest backup.
|
|
81
147
|
|
|
82
148
|
```bash
|
|
83
149
|
clawsouls restore
|
|
84
150
|
```
|
|
85
151
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
### `clawsouls publish <dir>`
|
|
89
|
-
|
|
90
|
-
Publish a soul package to the ClawSouls registry. Requires authentication.
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
# 1. Log in at https://clawsouls.ai and get your API token from the Dashboard
|
|
94
|
-
# 2. Set the token
|
|
95
|
-
export CLAWSOULS_TOKEN=<your-token>
|
|
96
|
-
|
|
97
|
-
# 3. Publish your soul
|
|
98
|
-
clawsouls publish ./my-soul/
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
The directory must contain a valid `soul.json`. All files in the directory are uploaded. A security scan runs automatically before publishing (blocks on dangerous patterns with 400 error).
|
|
102
|
-
|
|
103
|
-
**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`).
|
|
104
|
-
|
|
105
|
-
### `clawsouls login <token>`
|
|
152
|
+
### `clawsouls list`
|
|
106
153
|
|
|
107
|
-
|
|
154
|
+
List installed souls.
|
|
108
155
|
|
|
109
156
|
```bash
|
|
110
|
-
clawsouls
|
|
157
|
+
clawsouls list
|
|
158
|
+
clawsouls ls
|
|
111
159
|
```
|
|
112
160
|
|
|
113
|
-
|
|
161
|
+
### `clawsouls validate [dir]`
|
|
114
162
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
Remove the saved API token.
|
|
163
|
+
Validate a soul package against the Soul Spec.
|
|
118
164
|
|
|
119
165
|
```bash
|
|
120
|
-
clawsouls
|
|
166
|
+
clawsouls validate # validate current directory
|
|
167
|
+
clawsouls validate ./my-soul # validate specific directory
|
|
168
|
+
clawsouls validate --soulscan # include SoulScan security analysis
|
|
121
169
|
```
|
|
122
170
|
|
|
123
|
-
### `clawsouls
|
|
171
|
+
### `clawsouls soulscan [dir]`
|
|
124
172
|
|
|
125
|
-
|
|
173
|
+
Run SoulScan™ security and quality analysis on a soul package or active workspace.
|
|
126
174
|
|
|
127
175
|
```bash
|
|
128
|
-
clawsouls
|
|
129
|
-
#
|
|
176
|
+
clawsouls soulscan # scan active workspace
|
|
177
|
+
clawsouls soulscan ./my-soul # scan specific directory
|
|
178
|
+
clawsouls soulscan -q # quiet mode (for cron)
|
|
179
|
+
clawsouls soulscan --init # initialize baseline checksums
|
|
130
180
|
```
|
|
131
181
|
|
|
132
|
-
### `clawsouls
|
|
182
|
+
### `clawsouls publish <dir>`
|
|
133
183
|
|
|
134
|
-
|
|
184
|
+
Publish a soul package to the registry.
|
|
135
185
|
|
|
136
186
|
```bash
|
|
137
|
-
clawsouls
|
|
187
|
+
clawsouls login <token> # authenticate first
|
|
188
|
+
clawsouls publish ./my-soul # publish to clawsouls.ai
|
|
138
189
|
```
|
|
139
190
|
|
|
140
|
-
##
|
|
141
|
-
|
|
142
|
-
**78+ souls** across 10 categories — browse all at [clawsouls.ai](https://clawsouls.ai).
|
|
143
|
-
|
|
144
|
-
Popular picks:
|
|
191
|
+
## Soul Spec
|
|
145
192
|
|
|
146
|
-
|
|
147
|
-
|------|----------|-------------|
|
|
148
|
-
| 🔬 **Surgical Coder** | Engineering | Karpathy-inspired surgical coding precision |
|
|
149
|
-
| 🔬 **Surgical Coder** | Engineering | Disciplined coding agent inspired by Karpathy's CLAUDE.md |
|
|
150
|
-
| 🔧 **DevOps Veteran** | DevOps | Battle-scarred infrastructure engineer |
|
|
151
|
-
| 🎮 **GameDev Mentor** | Game Dev | Experienced game developer and mentor |
|
|
152
|
-
| ⚡ **Minimalist** | Lifestyle | Extremely concise responses |
|
|
153
|
-
| 🔍 **Code Reviewer** | Engineering | Thorough, constructive code reviewer |
|
|
154
|
-
| 📚 **Coding Tutor** | Education | Patient programming teacher |
|
|
155
|
-
| 🧬 **MBTI Personas** | Lifestyle | 16 personality types (INTJ, ENFP, etc.) |
|
|
156
|
-
| 🔬 **Research Scientist** | Science | Rigorous research methodology and analysis |
|
|
157
|
-
| 📊 **Data Scientist** | Data | ML/AI-focused data analysis |
|
|
158
|
-
|
|
159
|
-
## What's in a Soul?
|
|
160
|
-
|
|
161
|
-
A soul is a directory with these files:
|
|
193
|
+
Souls follow the [Soul Spec](https://clawsouls.ai/spec) — an open specification for AI agent persona packages. A soul package contains:
|
|
162
194
|
|
|
163
195
|
```
|
|
164
196
|
my-soul/
|
|
165
|
-
├── soul.json
|
|
166
|
-
├── SOUL.md
|
|
167
|
-
├── IDENTITY.md
|
|
168
|
-
├── AGENTS.md
|
|
169
|
-
├── HEARTBEAT.md
|
|
170
|
-
└── README.md
|
|
197
|
+
├── soul.json # Metadata (name, version, tags, compatibility)
|
|
198
|
+
├── SOUL.md # Persona, tone, and boundaries
|
|
199
|
+
├── IDENTITY.md # Name, avatar, and vibe
|
|
200
|
+
├── AGENTS.md # Operating instructions
|
|
201
|
+
├── HEARTBEAT.md # Periodic check behavior
|
|
202
|
+
└── README.md # Human-readable description
|
|
171
203
|
```
|
|
172
204
|
|
|
173
|
-
|
|
205
|
+
## Security
|
|
174
206
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
```
|
|
178
|
-
┌──────────────────┐ install ┌──────────────┐
|
|
179
|
-
│ clawsouls.ai │ ───────────→ │ ~/.openclaw/ │
|
|
180
|
-
│ (API Registry) │ GET /api/ │ souls/surgical-coder/ │
|
|
181
|
-
└──────────────────┘ v1/souls/ └──────┬───────┘
|
|
182
|
-
▲ owner/name │ use
|
|
183
|
-
│ ▼
|
|
184
|
-
publish (POST) ┌──────────────────┐
|
|
185
|
-
│ │ ~/.openclaw/ │
|
|
186
|
-
┌───────┴──────┐ │ workspace/ │
|
|
187
|
-
│ clawsouls │ │ ├ SOUL.md │
|
|
188
|
-
│ publish ./ │ │ ├ IDENTITY.md │
|
|
189
|
-
└──────────────┘ │ ├ AGENTS.md │
|
|
190
|
-
│ └ HEARTBEAT.md │
|
|
191
|
-
└──────────────────┘
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
1. **Install** fetches soul files from the API (`clawsouls.ai/api/v1/souls/:owner/:name`) and saves to `~/.openclaw/souls/<name>/`
|
|
195
|
-
2. **Use** backs up your current workspace to `~/.openclaw/souls/_backup/<timestamp>/`, then copies soul files in
|
|
196
|
-
3. **Restart** your OpenClaw session to load the new personality
|
|
197
|
-
4. **Publish** uploads your soul directory to the registry (requires `CLAWSOULS_TOKEN`)
|
|
207
|
+
All souls on [clawsouls.ai](https://clawsouls.ai) are automatically scanned by **SoulScan™** — our security engine that checks for prompt injection, data exfiltration, harmful content, and 50+ other patterns.
|
|
198
208
|
|
|
199
209
|
## Links
|
|
200
210
|
|
|
201
211
|
- 🌐 [clawsouls.ai](https://clawsouls.ai) — Browse souls
|
|
202
|
-
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
212
|
+
- 📖 [Soul Spec](https://clawsouls.ai/spec) — Open specification
|
|
213
|
+
- 🔒 [SoulScan](https://clawsouls.ai/soulscan) — Security scanner
|
|
214
|
+
- 📜 [Manifesto](https://clawsouls.ai/manifesto) — Our philosophy
|
|
215
|
+
- 📄 [Research Paper](https://doi.org/10.5281/zenodo.18678616) — Academic foundation
|
|
205
216
|
|
|
206
217
|
## License
|
|
207
218
|
|
|
208
|
-
Apache
|
|
209
|
-
|
|
210
|
-
## Disclaimer
|
|
211
|
-
|
|
212
|
-
ClawSouls is an independent project. Not affiliated with or endorsed by OpenClaw.
|
|
219
|
+
Apache-2.0
|
package/dist/bin/clawsouls.js
CHANGED
|
@@ -10,13 +10,23 @@ import { loginCommand, logoutCommand, whoamiCommand } from '../commands/login.js
|
|
|
10
10
|
import { initCommand } from '../commands/init.js';
|
|
11
11
|
import { validateCommand } from '../commands/validate.js';
|
|
12
12
|
import { soulscanCommand } from '../commands/soulscan.js';
|
|
13
|
+
import { platformCommand } from '../commands/platform.js';
|
|
14
|
+
import { exportCommand } from '../commands/export.js';
|
|
13
15
|
const require = createRequire(import.meta.url);
|
|
14
16
|
const { version } = require('../../package.json');
|
|
15
17
|
const program = new Command();
|
|
16
18
|
program
|
|
17
19
|
.name('clawsouls')
|
|
18
|
-
.description('AI agent persona manager
|
|
19
|
-
.version(version)
|
|
20
|
+
.description('AI agent persona manager — works with any SOUL.md-compatible agent')
|
|
21
|
+
.version(version)
|
|
22
|
+
.option('--platform <name>', 'Override agent platform (openclaw, zeroclaw, clawdbot, moltbot, moldbot, or a path)')
|
|
23
|
+
.option('--workspace <path>', 'Override workspace directory')
|
|
24
|
+
.hook('preAction', (thisCommand) => {
|
|
25
|
+
const opts = thisCommand.opts();
|
|
26
|
+
if (opts.platform) {
|
|
27
|
+
process.env.CLAWSOULS_PLATFORM = opts.platform;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
20
30
|
program
|
|
21
31
|
.command('install <name>')
|
|
22
32
|
.description('Install a soul from the registry')
|
|
@@ -25,7 +35,10 @@ program
|
|
|
25
35
|
program
|
|
26
36
|
.command('use <name>')
|
|
27
37
|
.description('Activate an installed soul (backs up current workspace)')
|
|
28
|
-
.action(
|
|
38
|
+
.action((name) => {
|
|
39
|
+
const globalOpts = program.opts();
|
|
40
|
+
useCommand(name, { workspace: globalOpts.workspace });
|
|
41
|
+
});
|
|
29
42
|
program
|
|
30
43
|
.command('restore')
|
|
31
44
|
.description('Restore workspace from the latest backup')
|
|
@@ -74,5 +87,16 @@ program
|
|
|
74
87
|
.option('--verify-audit', 'Verify the audit log hash chain integrity')
|
|
75
88
|
.option('--audit-log', 'Display recent audit log entries')
|
|
76
89
|
.action((dir, opts) => soulscanCommand(dir, opts));
|
|
90
|
+
program
|
|
91
|
+
.command('export <format>')
|
|
92
|
+
.description('Export soul to another format (claude-md, system-prompt)')
|
|
93
|
+
.option('-o, --output <path>', 'Output file path')
|
|
94
|
+
.option('-d, --dir <path>', 'Source soul directory (default: active workspace)')
|
|
95
|
+
.action((format, opts) => exportCommand(format, opts));
|
|
96
|
+
program
|
|
97
|
+
.command('platform')
|
|
98
|
+
.alias('detect')
|
|
99
|
+
.description('Show detected agent platform(s) and workspace path')
|
|
100
|
+
.action(platformCommand);
|
|
77
101
|
program.parse();
|
|
78
102
|
//# 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;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"clawsouls.js","sourceRoot":"","sources":["../../src/bin/clawsouls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
3
|
+
import { join, resolve } from 'path';
|
|
4
|
+
import { getConfig } from '../utils/config.js';
|
|
5
|
+
const SOUL_SPEC_FILES = ['SOUL.md', 'IDENTITY.md', 'AGENTS.md', 'HEARTBEAT.md', 'STYLE.md'];
|
|
6
|
+
function readSoulFiles(dir) {
|
|
7
|
+
const files = new Map();
|
|
8
|
+
for (const filename of SOUL_SPEC_FILES) {
|
|
9
|
+
const filepath = join(dir, filename);
|
|
10
|
+
if (existsSync(filepath)) {
|
|
11
|
+
files.set(filename, readFileSync(filepath, 'utf-8').trim());
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return files;
|
|
15
|
+
}
|
|
16
|
+
function readSoulJson(dir) {
|
|
17
|
+
const p = join(dir, 'soul.json');
|
|
18
|
+
if (existsSync(p)) {
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(readFileSync(p, 'utf-8'));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
function toClaudeMd(files, meta) {
|
|
29
|
+
const sections = [];
|
|
30
|
+
// Header
|
|
31
|
+
const name = meta?.displayName || meta?.name || 'AI Agent';
|
|
32
|
+
const version = meta?.version || '';
|
|
33
|
+
const desc = meta?.description || '';
|
|
34
|
+
sections.push(`# ${name}${version ? ` v${version}` : ''}`);
|
|
35
|
+
if (desc)
|
|
36
|
+
sections.push(`> ${desc}`);
|
|
37
|
+
sections.push('');
|
|
38
|
+
sections.push('<!-- Generated by ClawSouls CLI (clawsouls export --format claude-md) -->');
|
|
39
|
+
sections.push('<!-- Source: https://clawsouls.ai -->');
|
|
40
|
+
sections.push('');
|
|
41
|
+
// SOUL.md → core persona
|
|
42
|
+
const soul = files.get('SOUL.md');
|
|
43
|
+
if (soul) {
|
|
44
|
+
sections.push('## Persona');
|
|
45
|
+
sections.push('');
|
|
46
|
+
sections.push(soul);
|
|
47
|
+
sections.push('');
|
|
48
|
+
}
|
|
49
|
+
// IDENTITY.md → identity details
|
|
50
|
+
const identity = files.get('IDENTITY.md');
|
|
51
|
+
if (identity) {
|
|
52
|
+
sections.push('## Identity');
|
|
53
|
+
sections.push('');
|
|
54
|
+
sections.push(identity);
|
|
55
|
+
sections.push('');
|
|
56
|
+
}
|
|
57
|
+
// STYLE.md → communication style
|
|
58
|
+
const style = files.get('STYLE.md');
|
|
59
|
+
if (style) {
|
|
60
|
+
sections.push('## Communication Style');
|
|
61
|
+
sections.push('');
|
|
62
|
+
sections.push(style);
|
|
63
|
+
sections.push('');
|
|
64
|
+
}
|
|
65
|
+
// AGENTS.md → workflow
|
|
66
|
+
const agents = files.get('AGENTS.md');
|
|
67
|
+
if (agents) {
|
|
68
|
+
sections.push('## Workflow');
|
|
69
|
+
sections.push('');
|
|
70
|
+
sections.push(agents);
|
|
71
|
+
sections.push('');
|
|
72
|
+
}
|
|
73
|
+
// HEARTBEAT.md → periodic checks
|
|
74
|
+
const heartbeat = files.get('HEARTBEAT.md');
|
|
75
|
+
if (heartbeat) {
|
|
76
|
+
sections.push('## Periodic Checks');
|
|
77
|
+
sections.push('');
|
|
78
|
+
sections.push(heartbeat);
|
|
79
|
+
sections.push('');
|
|
80
|
+
}
|
|
81
|
+
return sections.join('\n').trimEnd() + '\n';
|
|
82
|
+
}
|
|
83
|
+
function toSystemPrompt(files, meta) {
|
|
84
|
+
const parts = [];
|
|
85
|
+
const name = meta?.displayName || meta?.name || 'AI Agent';
|
|
86
|
+
parts.push(`You are ${name}.`);
|
|
87
|
+
const soul = files.get('SOUL.md');
|
|
88
|
+
if (soul)
|
|
89
|
+
parts.push('', soul);
|
|
90
|
+
const identity = files.get('IDENTITY.md');
|
|
91
|
+
if (identity)
|
|
92
|
+
parts.push('', '---', '', identity);
|
|
93
|
+
const style = files.get('STYLE.md');
|
|
94
|
+
if (style)
|
|
95
|
+
parts.push('', '---', '', style);
|
|
96
|
+
const agents = files.get('AGENTS.md');
|
|
97
|
+
if (agents)
|
|
98
|
+
parts.push('', '---', '', agents);
|
|
99
|
+
return parts.join('\n').trimEnd() + '\n';
|
|
100
|
+
}
|
|
101
|
+
const FORMATS = {
|
|
102
|
+
'claude-md': {
|
|
103
|
+
ext: 'CLAUDE.md',
|
|
104
|
+
convert: toClaudeMd,
|
|
105
|
+
label: 'Claude Code / Cowork (CLAUDE.md)',
|
|
106
|
+
},
|
|
107
|
+
'system-prompt': {
|
|
108
|
+
ext: 'system-prompt.txt',
|
|
109
|
+
convert: toSystemPrompt,
|
|
110
|
+
label: 'System Prompt (plain text)',
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
export async function exportCommand(format, options) {
|
|
114
|
+
const fmt = FORMATS[format];
|
|
115
|
+
if (!fmt) {
|
|
116
|
+
console.error(chalk.red(`Unknown format: "${format}"`));
|
|
117
|
+
console.error(`Available formats: ${Object.keys(FORMATS).join(', ')}`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
// Resolve source directory
|
|
121
|
+
let sourceDir;
|
|
122
|
+
if (options.dir) {
|
|
123
|
+
sourceDir = resolve(options.dir);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Default: current workspace
|
|
127
|
+
const config = getConfig();
|
|
128
|
+
sourceDir = config.workspace;
|
|
129
|
+
}
|
|
130
|
+
if (!existsSync(sourceDir)) {
|
|
131
|
+
console.error(chalk.red(`Directory not found: ${sourceDir}`));
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
// Check for soul files
|
|
135
|
+
const files = readSoulFiles(sourceDir);
|
|
136
|
+
if (files.size === 0) {
|
|
137
|
+
console.error(chalk.red('No soul files found (SOUL.md, IDENTITY.md, etc.)'));
|
|
138
|
+
console.error(`Searched in: ${sourceDir}`);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
const meta = readSoulJson(sourceDir);
|
|
142
|
+
const output = fmt.convert(files, meta);
|
|
143
|
+
const outPath = options.output || fmt.ext;
|
|
144
|
+
writeFileSync(outPath, output, 'utf-8');
|
|
145
|
+
console.log(chalk.green(`✓ Exported to ${chalk.bold(outPath)}`));
|
|
146
|
+
console.log(chalk.dim(` Format: ${fmt.label}`));
|
|
147
|
+
console.log(chalk.dim(` Source: ${sourceDir}`));
|
|
148
|
+
console.log(chalk.dim(` Files included: ${[...files.keys()].join(', ')}`));
|
|
149
|
+
if (format === 'claude-md') {
|
|
150
|
+
console.log('');
|
|
151
|
+
console.log(chalk.cyan('Usage with Claude Cowork:'));
|
|
152
|
+
console.log(chalk.dim(' 1. Copy CLAUDE.md to your Cowork shared folder'));
|
|
153
|
+
console.log(chalk.dim(' 2. Claude will automatically read it as project instructions'));
|
|
154
|
+
console.log('');
|
|
155
|
+
console.log(chalk.cyan('Usage with Claude Code:'));
|
|
156
|
+
console.log(chalk.dim(' 1. Place CLAUDE.md in your project root'));
|
|
157
|
+
console.log(chalk.dim(' 2. Claude Code picks it up automatically'));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function platformCommand(): Promise<void>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { detectPlatform, detectAllPlatforms, getPlatformLabel, getKnownPlatformNames } from '../utils/platform.js';
|
|
3
|
+
import { getConfig } from '../utils/config.js';
|
|
4
|
+
export async function platformCommand() {
|
|
5
|
+
const active = detectPlatform(process.env.CLAWSOULS_PLATFORM);
|
|
6
|
+
const all = detectAllPlatforms();
|
|
7
|
+
const config = getConfig();
|
|
8
|
+
console.log(chalk.bold('\n🔍 Agent Platform Detection\n'));
|
|
9
|
+
// Active platform
|
|
10
|
+
console.log(chalk.green('▶ Active:'), getPlatformLabel(active));
|
|
11
|
+
console.log(` Workspace: ${chalk.cyan(config.workspace)}`);
|
|
12
|
+
console.log(` Souls dir: ${chalk.cyan(config.soulsDir)}`);
|
|
13
|
+
console.log(` Restart: ${chalk.dim(active.restartCommand)}`);
|
|
14
|
+
// All detected platforms
|
|
15
|
+
if (all.length > 1) {
|
|
16
|
+
console.log(chalk.bold('\n📦 All detected platforms:'));
|
|
17
|
+
for (const p of all) {
|
|
18
|
+
const isActive = p.name === active.name;
|
|
19
|
+
const marker = isActive ? chalk.green(' ◀ active') : '';
|
|
20
|
+
console.log(` ${getPlatformLabel(p)}${marker}`);
|
|
21
|
+
console.log(` ${chalk.dim(p.workspace)}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else if (all.length === 0) {
|
|
25
|
+
console.log(chalk.yellow('\n⚠ No agent platforms detected.'));
|
|
26
|
+
console.log(chalk.dim(' Defaulting to OpenClaw (~/.openclaw/workspace)'));
|
|
27
|
+
}
|
|
28
|
+
// Help
|
|
29
|
+
console.log(chalk.bold('\n💡 Override:'));
|
|
30
|
+
console.log(` ${chalk.dim('clawsouls --platform zeroclaw use <soul>')} # use ZeroClaw workspace`);
|
|
31
|
+
console.log(` ${chalk.dim('clawsouls --workspace /path/to use <soul>')} # use custom workspace`);
|
|
32
|
+
console.log(` ${chalk.dim('CLAWSOULS_PLATFORM=clawdbot clawsouls use')} # env var override`);
|
|
33
|
+
console.log(chalk.bold('\n🤝 Supported platforms:'));
|
|
34
|
+
console.log(` ${getKnownPlatformNames().join(', ')}, or any custom path`);
|
|
35
|
+
console.log();
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/commands/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACnH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAE3D,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAEhE,yBAAyB;IACzB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;YACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO;IACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,6BAA6B,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,0BAA0B,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,qBAAqB,CAAC,CAAC;IAE9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAqB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/commands/use.d.ts
CHANGED
package/dist/commands/use.js
CHANGED
|
@@ -1,26 +1,11 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { existsSync } from 'fs';
|
|
4
|
-
import { join } from 'path';
|
|
5
|
-
import { homedir } from 'os';
|
|
6
3
|
import { StorageManager } from '../storage/manager.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (platform === 'zeroclaw')
|
|
10
|
-
return 'zeroclaw gateway restart';
|
|
11
|
-
if (platform === 'openclaw')
|
|
12
|
-
return 'openclaw gateway restart';
|
|
13
|
-
// Auto-detect
|
|
14
|
-
const hasZeroClaw = existsSync(join(homedir(), '.zeroclaw'));
|
|
15
|
-
const hasOpenClaw = existsSync(join(homedir(), '.openclaw'));
|
|
16
|
-
if (hasZeroClaw && !hasOpenClaw)
|
|
17
|
-
return 'zeroclaw gateway restart';
|
|
18
|
-
return 'openclaw gateway restart';
|
|
19
|
-
}
|
|
20
|
-
export async function useCommand(name) {
|
|
4
|
+
import { detectPlatform, getPlatformLabel } from '../utils/platform.js';
|
|
5
|
+
export async function useCommand(name, opts) {
|
|
21
6
|
const spinner = ora(`Switching to soul "${name}"...`).start();
|
|
22
7
|
try {
|
|
23
|
-
const storage = new StorageManager();
|
|
8
|
+
const storage = new StorageManager(opts?.workspace);
|
|
24
9
|
if (!storage.isInstalled(name)) {
|
|
25
10
|
spinner.fail(`Soul "${name}" is not installed.\n` +
|
|
26
11
|
` Run ${chalk.cyan(`clawsouls install ${name}`)} first.`);
|
|
@@ -32,10 +17,10 @@ export async function useCommand(name) {
|
|
|
32
17
|
// Apply soul
|
|
33
18
|
spinner.text = `Applying "${name}"...`;
|
|
34
19
|
storage.applySoul(name);
|
|
35
|
-
const
|
|
36
|
-
spinner.succeed(`Switched to ${chalk.green(name)}\n` +
|
|
20
|
+
const platform = detectPlatform(process.env.CLAWSOULS_PLATFORM);
|
|
21
|
+
spinner.succeed(`Switched to ${chalk.green(name)} (${getPlatformLabel(platform)})\n` +
|
|
37
22
|
` ${chalk.dim('Backup saved. Use')} ${chalk.cyan('clawsouls restore')} ${chalk.dim('to revert.')}\n` +
|
|
38
|
-
` ${chalk.yellow('⚠')} Run ${chalk.cyan(
|
|
23
|
+
` ${chalk.yellow('⚠')} Run ${chalk.cyan(platform.restartCommand)} to apply the new persona.`);
|
|
39
24
|
}
|
|
40
25
|
catch (err) {
|
|
41
26
|
spinner.fail(err.message);
|
package/dist/commands/use.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.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,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAA6B;IAC1E,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAEpD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,SAAS,IAAI,uBAAuB;gBACpC,SAAS,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,SAAS,CAC1D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,IAAI,GAAG,iCAAiC,CAAC;QACjD,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAE7C,aAAa;QACb,OAAO,CAAC,IAAI,GAAG,aAAa,IAAI,MAAM,CAAC;QACvC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChE,OAAO,CAAC,OAAO,CACb,eAAe,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,QAAQ,CAAC,KAAK;YACpE,KAAK,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI;YACrG,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,4BAA4B,CAC/F,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -10,7 +10,7 @@ export declare class StorageManager {
|
|
|
10
10
|
private soulsDir;
|
|
11
11
|
private workspace;
|
|
12
12
|
private backupDir;
|
|
13
|
-
constructor();
|
|
13
|
+
constructor(workspaceOverride?: string);
|
|
14
14
|
/** List all installed souls (supports owner/name directories) */
|
|
15
15
|
listInstalled(): InstalledSoul[];
|
|
16
16
|
/** Check if a soul is installed (supports owner/name) */
|
package/dist/storage/manager.js
CHANGED
|
@@ -9,10 +9,10 @@ export class StorageManager {
|
|
|
9
9
|
soulsDir;
|
|
10
10
|
workspace;
|
|
11
11
|
backupDir;
|
|
12
|
-
constructor() {
|
|
12
|
+
constructor(workspaceOverride) {
|
|
13
13
|
const config = getConfig();
|
|
14
14
|
this.soulsDir = config.soulsDir;
|
|
15
|
-
this.workspace = config.workspace;
|
|
15
|
+
this.workspace = workspaceOverride || config.workspace;
|
|
16
16
|
this.backupDir = join(this.soulsDir, '_backup');
|
|
17
17
|
}
|
|
18
18
|
/** List all installed souls (supports owner/name directories) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/storage/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAa,MAAM,EAAE,MAAM,IAAI,CAAC;AAC3G,OAAO,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE1D,kDAAkD;AAClD,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AAEvF,uDAAuD;AACvD,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAW7D,MAAM,OAAO,cAAc;IACjB,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,SAAS,CAAS;IAE1B;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/storage/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/config.js
CHANGED
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { homedir } from 'os';
|
|
4
|
+
import { detectPlatform } from './platform.js';
|
|
4
5
|
const CONFIG_DIR = join(homedir(), '.clawsouls');
|
|
5
6
|
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
6
7
|
function detectWorkspaceBase() {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
const platform = process.env.CLAWSOULS_PLATFORM;
|
|
10
|
-
if (platform === 'zeroclaw')
|
|
11
|
-
return zeroclawDir;
|
|
12
|
-
if (platform === 'openclaw')
|
|
13
|
-
return openclawDir;
|
|
14
|
-
// Auto-detect
|
|
15
|
-
if (existsSync(zeroclawDir) && !existsSync(openclawDir))
|
|
16
|
-
return zeroclawDir;
|
|
17
|
-
return openclawDir; // default
|
|
8
|
+
const platform = detectPlatform(process.env.CLAWSOULS_PLATFORM);
|
|
9
|
+
return platform.configDir;
|
|
18
10
|
}
|
|
19
11
|
const PLATFORM_BASE = detectWorkspaceBase();
|
|
20
12
|
const DEFAULT_CONFIG = {
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAY/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,SAAS,mBAAmB;IAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC5B,CAAC;AAED,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;AAE5C,MAAM,cAAc,GAAoB;IACtC,QAAQ,EAAE,0BAA0B;IACpC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,wDAAwD;IAC1F,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;IAC3C,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAgC;IACzD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IACzC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
|
package/dist/utils/platform.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
export type PlatformName = 'openclaw' | 'zeroclaw' | 'clawdbot' | 'moltbot' | 'moldbot' | 'custom';
|
|
1
2
|
export interface PlatformInfo {
|
|
2
|
-
name:
|
|
3
|
+
name: PlatformName;
|
|
3
4
|
workspace: string;
|
|
4
5
|
restartCommand: string;
|
|
5
6
|
configDir: string;
|
|
6
7
|
}
|
|
7
8
|
export declare function detectPlatform(override?: string): PlatformInfo;
|
|
9
|
+
export declare function detectAllPlatforms(): PlatformInfo[];
|
|
8
10
|
export declare function getPlatformLabel(platform: PlatformInfo): string;
|
|
11
|
+
export declare function getKnownPlatformNames(): string[];
|
package/dist/utils/platform.js
CHANGED
|
@@ -1,64 +1,96 @@
|
|
|
1
1
|
import { existsSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { homedir } from 'os';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Known SOUL.md-compatible agent frameworks and their directory conventions.
|
|
6
|
+
* Priority order: OpenClaw (current) > ZeroClaw > legacy (clawdbot > moltbot > moldbot)
|
|
7
|
+
*/
|
|
8
|
+
const KNOWN_PLATFORMS = [
|
|
9
|
+
{ name: 'openclaw', dir: '.openclaw', restartCmd: 'openclaw gateway restart', label: 'OpenClaw 🦞' },
|
|
10
|
+
{ name: 'zeroclaw', dir: '.zeroclaw', restartCmd: 'zeroclaw gateway restart', label: 'ZeroClaw 🦀' },
|
|
11
|
+
{ name: 'clawdbot', dir: '.clawdbot', restartCmd: 'clawdbot gateway restart', label: 'Clawdbot 🤖' },
|
|
12
|
+
{ name: 'moltbot', dir: '.moltbot', restartCmd: 'moltbot gateway restart', label: 'Moltbot 🐚' },
|
|
13
|
+
{ name: 'moldbot', dir: '.moldbot', restartCmd: 'moldbot gateway restart', label: 'Moldbot 🍄' },
|
|
14
|
+
];
|
|
15
|
+
function getPlatformByName(name) {
|
|
16
|
+
return KNOWN_PLATFORMS.find(p => p.name === name);
|
|
17
|
+
}
|
|
8
18
|
export function detectPlatform(override) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
const home = homedir();
|
|
20
|
+
// 1. Explicit override via --platform flag or CLAWSOULS_PLATFORM env
|
|
21
|
+
if (override) {
|
|
22
|
+
const known = getPlatformByName(override);
|
|
23
|
+
if (known) {
|
|
24
|
+
const dir = join(home, known.dir);
|
|
25
|
+
return {
|
|
26
|
+
name: known.name,
|
|
27
|
+
workspace: join(dir, 'workspace'),
|
|
28
|
+
restartCommand: known.restartCmd,
|
|
29
|
+
configDir: dir,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Custom path override (e.g., --platform /path/to/agent)
|
|
33
|
+
if (override.startsWith('/') || override.startsWith('~')) {
|
|
34
|
+
const resolved = override.startsWith('~') ? join(home, override.slice(1)) : override;
|
|
35
|
+
return {
|
|
36
|
+
name: 'custom',
|
|
37
|
+
workspace: join(resolved, 'workspace'),
|
|
38
|
+
restartCommand: '# restart your agent manually',
|
|
39
|
+
configDir: resolved,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
16
42
|
}
|
|
17
|
-
|
|
43
|
+
// 2. Auto-detect: find installed platforms in priority order
|
|
44
|
+
const installed = KNOWN_PLATFORMS.filter(p => existsSync(join(home, p.dir)));
|
|
45
|
+
if (installed.length === 1) {
|
|
46
|
+
const p = installed[0];
|
|
47
|
+
const dir = join(home, p.dir);
|
|
18
48
|
return {
|
|
19
|
-
name:
|
|
20
|
-
workspace:
|
|
21
|
-
restartCommand:
|
|
22
|
-
configDir:
|
|
49
|
+
name: p.name,
|
|
50
|
+
workspace: join(dir, 'workspace'),
|
|
51
|
+
restartCommand: p.restartCmd,
|
|
52
|
+
configDir: dir,
|
|
23
53
|
};
|
|
24
54
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
55
|
+
if (installed.length > 1) {
|
|
56
|
+
// Multiple found — prefer by priority order (OpenClaw first)
|
|
57
|
+
const p = installed[0];
|
|
58
|
+
const dir = join(home, p.dir);
|
|
29
59
|
return {
|
|
30
|
-
name:
|
|
31
|
-
workspace:
|
|
32
|
-
restartCommand:
|
|
33
|
-
configDir:
|
|
60
|
+
name: p.name,
|
|
61
|
+
workspace: join(dir, 'workspace'),
|
|
62
|
+
restartCommand: p.restartCmd,
|
|
63
|
+
configDir: dir,
|
|
34
64
|
};
|
|
35
65
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
name: 'zeroclaw',
|
|
39
|
-
workspace: ZEROCLAW_WORKSPACE,
|
|
40
|
-
restartCommand: 'zeroclaw gateway restart',
|
|
41
|
-
configDir: ZEROCLAW_DIR,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
if (hasOpenClaw && hasZeroClaw) {
|
|
45
|
-
// Both exist — prefer OpenClaw (default), user can override with --platform
|
|
46
|
-
return {
|
|
47
|
-
name: 'openclaw',
|
|
48
|
-
workspace: OPENCLAW_WORKSPACE,
|
|
49
|
-
restartCommand: 'openclaw gateway restart',
|
|
50
|
-
configDir: OPENCLAW_DIR,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
// Neither — default to OpenClaw
|
|
66
|
+
// 3. None found — default to OpenClaw
|
|
67
|
+
const defaultDir = join(home, '.openclaw');
|
|
54
68
|
return {
|
|
55
69
|
name: 'openclaw',
|
|
56
|
-
workspace:
|
|
70
|
+
workspace: join(defaultDir, 'workspace'),
|
|
57
71
|
restartCommand: 'openclaw gateway restart',
|
|
58
|
-
configDir:
|
|
72
|
+
configDir: defaultDir,
|
|
59
73
|
};
|
|
60
74
|
}
|
|
75
|
+
export function detectAllPlatforms() {
|
|
76
|
+
const home = homedir();
|
|
77
|
+
return KNOWN_PLATFORMS
|
|
78
|
+
.filter(p => existsSync(join(home, p.dir)))
|
|
79
|
+
.map(p => {
|
|
80
|
+
const dir = join(home, p.dir);
|
|
81
|
+
return {
|
|
82
|
+
name: p.name,
|
|
83
|
+
workspace: join(dir, 'workspace'),
|
|
84
|
+
restartCommand: p.restartCmd,
|
|
85
|
+
configDir: dir,
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
}
|
|
61
89
|
export function getPlatformLabel(platform) {
|
|
62
|
-
|
|
90
|
+
const known = KNOWN_PLATFORMS.find(p => p.name === platform.name);
|
|
91
|
+
return known?.label ?? `${platform.name} 🔧`;
|
|
92
|
+
}
|
|
93
|
+
export function getKnownPlatformNames() {
|
|
94
|
+
return KNOWN_PLATFORMS.map(p => p.name);
|
|
63
95
|
}
|
|
64
96
|
//# sourceMappingURL=platform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"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"}
|