clawsouls 0.4.3 → 0.6.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.
Files changed (52) hide show
  1. package/README.md +11 -1
  2. package/dist/bin/clawsouls.js +93 -2
  3. package/dist/bin/clawsouls.js.map +1 -1
  4. package/dist/commands/__tests__/init.test.d.ts +1 -0
  5. package/dist/commands/__tests__/init.test.js +61 -0
  6. package/dist/commands/__tests__/init.test.js.map +1 -0
  7. package/dist/commands/diff.d.ts +1 -0
  8. package/dist/commands/diff.js +65 -0
  9. package/dist/commands/diff.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +1 -0
  11. package/dist/commands/doctor.js +130 -0
  12. package/dist/commands/doctor.js.map +1 -0
  13. package/dist/commands/info.d.ts +1 -0
  14. package/dist/commands/info.js +69 -0
  15. package/dist/commands/info.js.map +1 -0
  16. package/dist/commands/init.d.ts +1 -1
  17. package/dist/commands/init.js +81 -25
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/login.d.ts +3 -1
  20. package/dist/commands/login.js +14 -1
  21. package/dist/commands/login.js.map +1 -1
  22. package/dist/commands/migrate.d.ts +4 -0
  23. package/dist/commands/migrate.js +74 -0
  24. package/dist/commands/migrate.js.map +1 -0
  25. package/dist/commands/publish.d.ts +1 -0
  26. package/dist/commands/publish.js +17 -0
  27. package/dist/commands/publish.js.map +1 -1
  28. package/dist/commands/search.d.ts +1 -0
  29. package/dist/commands/search.js +52 -0
  30. package/dist/commands/search.js.map +1 -0
  31. package/dist/commands/sync.d.ts +10 -0
  32. package/dist/commands/sync.js +323 -0
  33. package/dist/commands/sync.js.map +1 -0
  34. package/dist/commands/test.d.ts +7 -0
  35. package/dist/commands/test.js +330 -0
  36. package/dist/commands/test.js.map +1 -0
  37. package/dist/commands/update.d.ts +1 -0
  38. package/dist/commands/update.js +73 -0
  39. package/dist/commands/update.js.map +1 -0
  40. package/dist/commands/use.js +9 -1
  41. package/dist/commands/use.js.map +1 -1
  42. package/dist/commands/validate.js +10 -0
  43. package/dist/commands/validate.js.map +1 -1
  44. package/dist/commands/version.d.ts +4 -0
  45. package/dist/commands/version.js +45 -0
  46. package/dist/commands/version.js.map +1 -0
  47. package/dist/storage/manager.d.ts +2 -0
  48. package/dist/storage/manager.js +15 -0
  49. package/dist/storage/manager.js.map +1 -1
  50. package/dist/utils/config.d.ts +1 -0
  51. package/dist/utils/config.js.map +1 -1
  52. package/package.json +14 -4
package/README.md CHANGED
@@ -105,14 +105,24 @@ clawsouls platform
105
105
  # Restart: openclaw gateway restart
106
106
  ```
107
107
 
108
- ### `clawsouls init [name]`
108
+ ### `clawsouls init [name] [--spec <version>]`
109
109
 
110
110
  Scaffold a new soul package directory with template files.
111
111
 
112
112
  ```bash
113
113
  clawsouls init my-soul
114
+ clawsouls init my-robot --spec 0.5
114
115
  ```
115
116
 
117
+ The `--spec` flag selects which Soul Spec version template to use:
118
+
119
+ | Flag | Version | Use Case |
120
+ |------|---------|----------|
121
+ | *(default)* | v0.4 | General-purpose personas |
122
+ | `--spec 0.3` | v0.3 | Minimal / legacy |
123
+ | `--spec 0.4` | v0.4 | General-purpose personas |
124
+ | `--spec 0.5` | v0.5 | Robotics / embodied agents (adds `environment`, `interactionMode`, sensor/actuator schemas) |
125
+
116
126
  Creates a directory with `soul.json`, `SOUL.md`, `IDENTITY.md`, `AGENTS.md`, `HEARTBEAT.md`, and `README.md` — ready for customization and publishing.
117
127
 
118
128
  ### `clawsouls install <owner/name[@version]>`
@@ -12,6 +12,15 @@ import { validateCommand } from '../commands/validate.js';
12
12
  import { soulscanCommand } from '../commands/soulscan.js';
13
13
  import { platformCommand } from '../commands/platform.js';
14
14
  import { exportCommand } from '../commands/export.js';
15
+ import { syncInitCommand, syncPushCommand, syncPullCommand, syncStatusCommand, syncExportKeyCommand, syncImportKeyCommand } from '../commands/sync.js';
16
+ import { versionBumpCommand } from '../commands/version.js';
17
+ import { diffCommand } from '../commands/diff.js';
18
+ import { doctorCommand } from '../commands/doctor.js';
19
+ import { migrateCommand } from '../commands/migrate.js';
20
+ import { searchCommand } from '../commands/search.js';
21
+ import { infoCommand } from '../commands/info.js';
22
+ import { updateCommand } from '../commands/update.js';
23
+ import { testCommand } from '../commands/test.js';
15
24
  const require = createRequire(import.meta.url);
16
25
  const { version } = require('../../package.json');
17
26
  const program = new Command();
@@ -52,11 +61,13 @@ program
52
61
  .command('publish <dir>')
53
62
  .description('Publish a soul package to the registry')
54
63
  .option('--confirm', 'Skip interactive confirmation prompt')
64
+ .option('-f, --force', 'Force re-publish even if version exists')
55
65
  .action((dir, opts) => publishCommand(dir, opts));
56
66
  program
57
67
  .command('login <token>')
58
68
  .description('Save API token for registry authentication')
59
- .action(loginCommand);
69
+ .option('--github', 'Save as GitHub token (for memory sync)')
70
+ .action((token, opts) => loginCommand(token, opts));
60
71
  program
61
72
  .command('logout')
62
73
  .description('Remove saved API token')
@@ -68,7 +79,8 @@ program
68
79
  program
69
80
  .command('init [name]')
70
81
  .description('Scaffold a new soul directory')
71
- .action((name) => initCommand(name));
82
+ .option('--spec <version>', 'Soul Spec version (0.3, 0.4, 0.5)', '0.4')
83
+ .action((name, opts) => initCommand(name, opts?.spec));
72
84
  program
73
85
  .command('validate [dir]')
74
86
  .alias('check')
@@ -93,10 +105,89 @@ program
93
105
  .option('-o, --output <path>', 'Output file path')
94
106
  .option('-d, --dir <path>', 'Source soul directory (default: active workspace)')
95
107
  .action((format, opts) => exportCommand(format, opts));
108
+ // ─── Sync Commands ───────────────────────────────────────
109
+ const sync = program
110
+ .command('sync')
111
+ .description('Sync encrypted memory to/from GitHub');
112
+ sync
113
+ .command('init')
114
+ .description('Initialize encryption keys and GitHub repository')
115
+ .action(syncInitCommand);
116
+ sync
117
+ .command('push')
118
+ .description('Encrypt and push memory files to GitHub')
119
+ .option('-f, --force', 'Force push even if no changes detected')
120
+ .action((opts) => syncPushCommand(opts));
121
+ sync
122
+ .command('pull')
123
+ .description('Pull and decrypt memory files from GitHub')
124
+ .option('-f, --force', 'Overwrite local files with remote')
125
+ .action((opts) => syncPullCommand(opts));
126
+ sync
127
+ .command('status')
128
+ .description('Show sync status')
129
+ .action(syncStatusCommand);
130
+ sync
131
+ .command('export-key')
132
+ .description('Display private key for device transfer')
133
+ .action(syncExportKeyCommand);
134
+ sync
135
+ .command('import-key <key>')
136
+ .description('Import private key from another device')
137
+ .action(syncImportKeyCommand);
138
+ // ─── Version Commands ────────────────────────────────────
139
+ const ver = program.command('version').description('Manage soul versions');
140
+ ver
141
+ .command('bump <type>')
142
+ .description('Bump version (major|minor|patch)')
143
+ .option('-m, --message <msg>', 'Changelog message')
144
+ .option('-d, --dir <path>', 'Soul directory')
145
+ .action((type, opts) => versionBumpCommand(type, opts));
146
+ // ─── Diff Command ────────────────────────────────────────
147
+ program
148
+ .command('diff <soul> <v1> <v2>')
149
+ .description('Show diff between two versions')
150
+ .action((soul, v1, v2) => diffCommand(soul, v1, v2));
151
+ // ─── Other Commands ──────────────────────────────────────
96
152
  program
97
153
  .command('platform')
98
154
  .alias('detect')
99
155
  .description('Show detected agent platform(s) and workspace path')
100
156
  .action(platformCommand);
157
+ // ─── Test Command ────────────────────────────────────────
158
+ program
159
+ .command('test')
160
+ .description('Run soul tests (schema + security + behavioral)')
161
+ .option('-l, --level <n>', 'Max test level (1-3)')
162
+ .option('-d, --dir <path>', 'Soul directory')
163
+ .option('--json', 'JSON output')
164
+ .action((opts) => testCommand(opts));
165
+ // ─── Doctor Command ──────────────────────────────────────
166
+ program
167
+ .command('doctor')
168
+ .description('Check environment and configuration')
169
+ .action(doctorCommand);
170
+ // ─── Migrate Command ─────────────────────────────────────
171
+ program
172
+ .command('migrate')
173
+ .description('Migrate soul.json to a newer spec version')
174
+ .requiredOption('--to <version>', 'Target spec version (0.4, 0.5)')
175
+ .option('-d, --dir <path>', 'Soul directory (default: current directory)')
176
+ .action((opts) => migrateCommand(opts));
177
+ // ─── Search Command ──────────────────────────────────────
178
+ program
179
+ .command('search <query>')
180
+ .description('Search souls in the registry')
181
+ .action(searchCommand);
182
+ // ─── Info Command ────────────────────────────────────────
183
+ program
184
+ .command('info <name>')
185
+ .description('Show detailed info about a soul (owner/name)')
186
+ .action(infoCommand);
187
+ // ─── Update Command ──────────────────────────────────────
188
+ program
189
+ .command('update')
190
+ .description('Check for updates on installed souls')
191
+ .action(updateCommand);
101
192
  program.parse();
102
193
  //# 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;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,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,oEAAoE,CAAC;KACjF,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,mBAAmB,EAAE,qFAAqF,CAAC;KAClH,MAAM,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;KAC5D,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,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,CAAC,IAAY,EAAE,EAAE;IACvB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,UAAU,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEL,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,YAAY,EAAE,8CAA8C,CAAC;KACpE,MAAM,CAAC,CAAC,GAAY,EAAE,IAA6B,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvF,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,KAAK,CAAC,MAAM,CAAC;KACb,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,aAAa,EAAE,6DAA6D,CAAC;KACpF,MAAM,CAAC,QAAQ,EAAE,2DAA2D,CAAC;KAC7E,MAAM,CAAC,WAAW,EAAE,qDAAqD,CAAC;KAC1E,MAAM,CAAC,WAAW,EAAE,4CAA4C,CAAC;KACjE,MAAM,CAAC,UAAU,EAAE,+CAA+C,CAAC;KACnE,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;KACrE,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;KACzD,MAAM,CAAC,CAAC,GAAY,EAAE,IAA6I,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvM,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,kBAAkB,EAAE,mDAAmD,CAAC;KAC/E,MAAM,CAAC,CAAC,MAAc,EAAE,IAAuC,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAEpG,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,KAAK,CAAC,QAAQ,CAAC;KACf,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"clawsouls.js","sourceRoot":"","sources":["../../src/bin/clawsouls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { existsSync, readFileSync, rmSync, mkdirSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { initCommand } from '../init.js';
5
+ const TEST_DIR = join(import.meta.dirname, '__test_output__');
6
+ describe('clawsouls init --spec', () => {
7
+ beforeEach(() => {
8
+ if (!existsSync(TEST_DIR)) {
9
+ mkdirSync(TEST_DIR, { recursive: true });
10
+ }
11
+ vi.spyOn(process, 'cwd').mockReturnValue(TEST_DIR);
12
+ vi.spyOn(process, 'exit').mockImplementation(((code) => {
13
+ throw new Error(`process.exit(${code})`);
14
+ }));
15
+ vi.spyOn(console, 'log').mockImplementation(() => { });
16
+ vi.spyOn(console, 'error').mockImplementation(() => { });
17
+ });
18
+ afterEach(() => {
19
+ vi.restoreAllMocks();
20
+ // Clean up created directories
21
+ if (existsSync(TEST_DIR)) {
22
+ rmSync(TEST_DIR, { recursive: true, force: true });
23
+ }
24
+ });
25
+ it('defaults to v0.4 when no --spec is provided', async () => {
26
+ await initCommand('test-default');
27
+ const soulJson = JSON.parse(readFileSync(join(TEST_DIR, 'test-default', 'soul.json'), 'utf-8'));
28
+ expect(soulJson.specVersion).toBe('0.4');
29
+ });
30
+ it('creates v0.3 template with --spec 0.3', async () => {
31
+ await initCommand('test-v03', '0.3');
32
+ const soulJson = JSON.parse(readFileSync(join(TEST_DIR, 'test-v03', 'soul.json'), 'utf-8'));
33
+ expect(soulJson.specVersion).toBe('0.3');
34
+ expect(soulJson).not.toHaveProperty('compatibility');
35
+ expect(soulJson).not.toHaveProperty('environment');
36
+ });
37
+ it('creates v0.4 template with --spec 0.4', async () => {
38
+ await initCommand('test-v04', '0.4');
39
+ const soulJson = JSON.parse(readFileSync(join(TEST_DIR, 'test-v04', 'soul.json'), 'utf-8'));
40
+ expect(soulJson.specVersion).toBe('0.4');
41
+ expect(soulJson).toHaveProperty('compatibility');
42
+ expect(soulJson).not.toHaveProperty('environment');
43
+ });
44
+ it('creates v0.5 template with --spec 0.5 (includes environment, interactionMode)', async () => {
45
+ await initCommand('test-v05', '0.5');
46
+ const soulJson = JSON.parse(readFileSync(join(TEST_DIR, 'test-v05', 'soul.json'), 'utf-8'));
47
+ expect(soulJson.specVersion).toBe('0.5');
48
+ expect(soulJson).toHaveProperty('environment');
49
+ expect(soulJson).toHaveProperty('interactionMode');
50
+ });
51
+ it('rejects unsupported spec version (0.6)', async () => {
52
+ await expect(initCommand('test-v06', '0.6')).rejects.toThrow('process.exit(1)');
53
+ expect(console.error).toHaveBeenCalledWith(expect.stringContaining('Unsupported spec version'));
54
+ });
55
+ it('errors when directory already exists', async () => {
56
+ mkdirSync(join(TEST_DIR, 'existing-dir'), { recursive: true });
57
+ await expect(initCommand('existing-dir')).rejects.toThrow('process.exit(1)');
58
+ expect(console.error).toHaveBeenCalledWith(expect.stringContaining('already exists'));
59
+ });
60
+ });
61
+ //# sourceMappingURL=init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/init.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function diffCommand(soul: string, v1: string, v2: string): Promise<void>;
@@ -0,0 +1,65 @@
1
+ import chalk from 'chalk';
2
+ import { createTwoFilesPatch } from 'diff';
3
+ const API_BASE = 'https://clawsouls.ai/api/v1';
4
+ export async function diffCommand(soul, v1, v2) {
5
+ const parts = soul.split('/');
6
+ if (parts.length !== 2) {
7
+ console.error('Error: Soul must be in "owner/name" format');
8
+ process.exit(1);
9
+ }
10
+ const [owner, name] = parts;
11
+ const url = `${API_BASE}/souls/${owner}/${name}/diff?v1=${encodeURIComponent(v1)}&v2=${encodeURIComponent(v2)}`;
12
+ let data;
13
+ try {
14
+ const res = await fetch(url);
15
+ if (!res.ok) {
16
+ const err = await res.json().catch(() => ({}));
17
+ console.error(`Error: ${err.error || `API returned ${res.status}`}`);
18
+ process.exit(1);
19
+ }
20
+ data = await res.json();
21
+ }
22
+ catch (err) {
23
+ console.error(`Error: Could not reach API — ${err.message || 'network error'}`);
24
+ process.exit(1);
25
+ }
26
+ const filesV1 = data.v1?.files || {};
27
+ const filesV2 = data.v2?.files || {};
28
+ const allFiles = new Set([...Object.keys(filesV1), ...Object.keys(filesV2)]);
29
+ if (allFiles.size === 0) {
30
+ console.log('No files to compare.');
31
+ return;
32
+ }
33
+ let filesChanged = 0;
34
+ let totalAdditions = 0;
35
+ let totalDeletions = 0;
36
+ for (const file of [...allFiles].sort()) {
37
+ const contentV1 = filesV1[file] || '';
38
+ const contentV2 = filesV2[file] || '';
39
+ if (contentV1 === contentV2)
40
+ continue;
41
+ filesChanged++;
42
+ const patch = createTwoFilesPatch(`a/${file}`, `b/${file}`, contentV1, contentV2, v1, v2);
43
+ for (const line of patch.split('\n')) {
44
+ if (line.startsWith('+') && !line.startsWith('+++')) {
45
+ totalAdditions++;
46
+ console.log(chalk.green(line));
47
+ }
48
+ else if (line.startsWith('-') && !line.startsWith('---')) {
49
+ totalDeletions++;
50
+ console.log(chalk.red(line));
51
+ }
52
+ else if (line.startsWith('@@')) {
53
+ console.log(chalk.cyan(line));
54
+ }
55
+ else {
56
+ console.log(line);
57
+ }
58
+ }
59
+ console.log();
60
+ }
61
+ console.log(`${filesChanged} file${filesChanged !== 1 ? 's' : ''} changed, ` +
62
+ chalk.green(`+${totalAdditions} additions`) + ', ' +
63
+ chalk.red(`-${totalDeletions} deletions`));
64
+ }
65
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function doctorCommand(): Promise<void>;
@@ -0,0 +1,130 @@
1
+ import chalk from 'chalk';
2
+ import { execSync } from 'child_process';
3
+ import { existsSync, readFileSync, readdirSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { homedir } from 'os';
6
+ import { createRequire } from 'node:module';
7
+ import { detectPlatform, getPlatformLabel } from '../utils/platform.js';
8
+ function tryExec(cmd) {
9
+ try {
10
+ return execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+ export async function doctorCommand() {
17
+ const checks = [];
18
+ const configDir = join(homedir(), '.clawsouls');
19
+ const configPath = join(configDir, 'config.json');
20
+ let config = {};
21
+ if (existsSync(configPath)) {
22
+ try {
23
+ config = JSON.parse(readFileSync(configPath, 'utf-8'));
24
+ }
25
+ catch { }
26
+ }
27
+ // 1. Node.js version
28
+ const nodeVer = process.version.replace('v', '');
29
+ const nodeMajor = parseInt(nodeVer.split('.')[0], 10);
30
+ checks.push(nodeMajor >= 22
31
+ ? { name: 'Node.js', status: 'pass', detail: `v${nodeVer}` }
32
+ : { name: 'Node.js', status: 'fail', detail: `v${nodeVer} (requires >= 22.0.0)`, fix: 'Install Node.js 22+ from https://nodejs.org' });
33
+ // 2. npm
34
+ const npmVer = tryExec('npm --version');
35
+ checks.push(npmVer
36
+ ? { name: 'npm', status: 'pass', detail: `v${npmVer}` }
37
+ : { name: 'npm', status: 'fail', detail: 'not found', fix: 'Install npm: https://docs.npmjs.com/downloading-and-installing-node-js-and-npm' });
38
+ // 3. git
39
+ const gitVer = tryExec('git --version');
40
+ checks.push(gitVer
41
+ ? { name: 'git', status: 'pass', detail: gitVer.replace('git version ', '') }
42
+ : { name: 'git', status: 'fail', detail: 'not found', fix: 'Install git: https://git-scm.com' });
43
+ // 4. CLI version
44
+ try {
45
+ const require = createRequire(import.meta.url);
46
+ const { version } = require('../../package.json');
47
+ checks.push({ name: 'ClawSouls CLI', status: 'pass', detail: `v${version}` });
48
+ }
49
+ catch {
50
+ checks.push({ name: 'ClawSouls CLI', status: 'warn', detail: 'could not read version' });
51
+ }
52
+ // 5. Config file
53
+ checks.push(existsSync(configPath)
54
+ ? { name: 'Config file', status: 'pass', detail: configPath }
55
+ : { name: 'Config file', status: 'warn', detail: 'not found', fix: `Run ${chalk.cyan('clawsouls login <token>')} to create config` });
56
+ // 6. Souls directory
57
+ const soulsDir = join(configDir, 'souls');
58
+ if (existsSync(soulsDir)) {
59
+ const count = readdirSync(soulsDir).filter(f => !f.startsWith('.')).length;
60
+ checks.push({ name: 'Installed souls', status: 'pass', detail: `${count} soul(s) in ${soulsDir}` });
61
+ }
62
+ else {
63
+ checks.push({ name: 'Installed souls', status: 'warn', detail: 'directory not found', fix: `Run ${chalk.cyan('clawsouls install <soul>')} to install a soul` });
64
+ }
65
+ // 7. Workspace / platform detection
66
+ try {
67
+ const platform = detectPlatform();
68
+ checks.push({ name: 'Platform', status: 'pass', detail: `${getPlatformLabel(platform)} (${platform.workspace})` });
69
+ }
70
+ catch {
71
+ checks.push({ name: 'Platform', status: 'warn', detail: 'no agent platform detected', fix: 'Run from an agent workspace directory' });
72
+ }
73
+ // 8. ClawSouls API auth
74
+ checks.push(config.auth?.token
75
+ ? { name: 'ClawSouls auth', status: 'pass', detail: 'token configured' }
76
+ : { name: 'ClawSouls auth', status: 'warn', detail: 'not authenticated', fix: `Run ${chalk.cyan('clawsouls login <token>')}` });
77
+ // 9. GitHub auth
78
+ checks.push(config.auth?.githubToken
79
+ ? { name: 'GitHub auth', status: 'pass', detail: 'token configured' }
80
+ : { name: 'GitHub auth', status: 'warn', detail: 'not configured', fix: `Run ${chalk.cyan('clawsouls login --github <token>')}` });
81
+ // 10. age encryption
82
+ const ageKeyPath = join(configDir, 'age-key.txt');
83
+ checks.push(existsSync(ageKeyPath)
84
+ ? { name: 'age encryption', status: 'pass', detail: 'key initialized' }
85
+ : { name: 'age encryption', status: 'warn', detail: 'not initialized', fix: `Run ${chalk.cyan('clawsouls sync init')} to generate keys` });
86
+ // 11. Registry reachable
87
+ const registry = config.registry || 'https://clawsouls.ai';
88
+ try {
89
+ const res = await fetch(`${registry}/api/v1/souls?limit=1`, { signal: AbortSignal.timeout(5000) });
90
+ checks.push(res.ok
91
+ ? { name: 'Registry', status: 'pass', detail: `${registry} reachable` }
92
+ : { name: 'Registry', status: 'fail', detail: `HTTP ${res.status}`, fix: 'Check your network or registry URL' });
93
+ }
94
+ catch {
95
+ checks.push({ name: 'Registry', status: 'fail', detail: 'unreachable', fix: 'Check your network connection' });
96
+ }
97
+ // 12. GitHub reachable
98
+ try {
99
+ const res = await fetch('https://api.github.com', { signal: AbortSignal.timeout(5000) });
100
+ checks.push(res.ok
101
+ ? { name: 'GitHub API', status: 'pass', detail: 'reachable' }
102
+ : { name: 'GitHub API', status: 'fail', detail: `HTTP ${res.status}` });
103
+ }
104
+ catch {
105
+ checks.push({ name: 'GitHub API', status: 'fail', detail: 'unreachable', fix: 'Check your network connection' });
106
+ }
107
+ // Output
108
+ console.log(chalk.bold('\n ClawSouls Doctor\n'));
109
+ const icons = { pass: chalk.green('✓'), warn: chalk.yellow('⚠'), fail: chalk.red('✗') };
110
+ for (const c of checks) {
111
+ console.log(` ${icons[c.status]} ${chalk.bold(c.name)}: ${c.detail}`);
112
+ if (c.fix && c.status !== 'pass') {
113
+ console.log(` ${chalk.dim('→')} ${chalk.dim(c.fix)}`);
114
+ }
115
+ }
116
+ const fails = checks.filter(c => c.status === 'fail').length;
117
+ const warns = checks.filter(c => c.status === 'warn').length;
118
+ console.log();
119
+ if (fails > 0) {
120
+ console.log(chalk.red(` ${fails} issue(s) found. Fix them to use all features.`));
121
+ }
122
+ else if (warns > 0) {
123
+ console.log(chalk.yellow(` ${warns} warning(s). Everything should work but some features may be limited.`));
124
+ }
125
+ else {
126
+ console.log(chalk.green(' All checks passed!'));
127
+ }
128
+ console.log();
129
+ }
130
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function infoCommand(nameArg: string): Promise<void>;
@@ -0,0 +1,69 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync, readFileSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+ export async function infoCommand(nameArg) {
6
+ const parts = nameArg.split('/');
7
+ if (parts.length !== 2) {
8
+ console.error(chalk.red('Usage: clawsouls info <owner/name>'));
9
+ process.exit(1);
10
+ }
11
+ const [owner, name] = parts;
12
+ const configPath = join(homedir(), '.clawsouls', 'config.json');
13
+ let registry = 'https://clawsouls.ai';
14
+ if (existsSync(configPath)) {
15
+ try {
16
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
17
+ if (config.registry)
18
+ registry = config.registry;
19
+ }
20
+ catch { }
21
+ }
22
+ const url = `${registry}/api/v1/souls/${owner}/${name}`;
23
+ let soul;
24
+ try {
25
+ const res = await fetch(url, { signal: AbortSignal.timeout(10000) });
26
+ if (!res.ok) {
27
+ if (res.status === 404) {
28
+ console.error(chalk.red(`Soul "${nameArg}" not found in registry.`));
29
+ }
30
+ else {
31
+ console.error(chalk.red(`Registry returned HTTP ${res.status}`));
32
+ }
33
+ process.exit(1);
34
+ }
35
+ soul = await res.json();
36
+ }
37
+ catch (err) {
38
+ console.error(chalk.red(`Failed to reach registry: ${err.message}`));
39
+ process.exit(1);
40
+ }
41
+ console.log(chalk.bold(`\n ${soul.displayName || soul.name}`));
42
+ console.log(chalk.dim(` ${owner}/${name}\n`));
43
+ const field = (label, value) => {
44
+ if (value != null)
45
+ console.log(` ${chalk.dim(label.padEnd(14))} ${value}`);
46
+ };
47
+ field('Version', soul.version);
48
+ field('Spec', soul.specVersion);
49
+ field('Description', soul.description);
50
+ field('Category', soul.category);
51
+ field('License', soul.license);
52
+ field('Downloads', soul.downloads);
53
+ field('Rating', soul.rating != null ? `${soul.rating} ★` : undefined);
54
+ field('Author', soul.author?.name || soul.author);
55
+ if (soul.tags?.length) {
56
+ field('Tags', soul.tags.join(', '));
57
+ }
58
+ if (soul.files) {
59
+ const fileList = typeof soul.files === 'object' ? Object.values(soul.files).join(', ') : soul.files;
60
+ field('Files', fileList);
61
+ }
62
+ if (soul.versions?.length) {
63
+ console.log(`\n ${chalk.dim('Versions'.padEnd(14))} ${soul.versions.slice(0, 10).join(', ')}${soul.versions.length > 10 ? ' ...' : ''}`);
64
+ }
65
+ const soulUrl = soul.url || `${registry}/souls/${owner}/${name}`;
66
+ console.log(`\n ${chalk.cyan(soulUrl)}`);
67
+ console.log(chalk.dim(`\n Install: ${chalk.cyan(`clawsouls install ${nameArg}`)}\n`));
68
+ }
69
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export declare function initCommand(name?: string): Promise<void>;
1
+ export declare function initCommand(name?: string, specVersion?: string): Promise<void>;