soulclaw-vscode 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscodeignore +8 -0
- package/.vsixignore +2 -0
- package/LICENSE +190 -0
- package/README.md +167 -0
- package/docs/TESTCASE.md +217 -0
- package/esbuild.mjs +59 -0
- package/media/chat.css +316 -0
- package/media/clawsouls_vscode_logo.png +0 -0
- package/media/clawsouls_vscode_logo_small.png +0 -0
- package/media/icon.png +0 -0
- package/media/soul-icon.svg +18 -0
- package/media/swarm-icon.png +0 -0
- package/package.json +344 -0
- package/resources/icon.png +0 -0
- package/resources/soul-icon.svg +6 -0
- package/resources/soul-spec-schema.json +55 -0
- package/src/commands/setup.ts +866 -0
- package/src/context/workspaceTracker.ts +229 -0
- package/src/extension.ts +198 -0
- package/src/gateway/connection.ts +291 -0
- package/src/gateway/launcher.ts +458 -0
- package/src/ui/chatHistoryPanel.ts +100 -0
- package/src/ui/chatPanel.ts +502 -0
- package/src/ui/checkpointPanel.ts +218 -0
- package/src/ui/soulExplorer.ts +438 -0
- package/src/ui/statusBar.ts +206 -0
- package/src/ui/swarmPanel.ts +338 -0
- package/tsconfig.json +27 -0
package/.vscodeignore
ADDED
package/.vsixignore
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to the Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by the Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding any notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
Copyright 2026 ClawSouls
|
|
179
|
+
|
|
180
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
181
|
+
you may not use this file except in compliance with the License.
|
|
182
|
+
You may obtain a copy of the License at
|
|
183
|
+
|
|
184
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
185
|
+
|
|
186
|
+
Unless required by applicable law or agreed to in writing, software
|
|
187
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
188
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
189
|
+
See the License for the specific language governing permissions and
|
|
190
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# SoulClaw — Soul-Powered AI Agent
|
|
2
|
+
|
|
3
|
+
Zero-setup AI agent with Soul-based personas, Swarm Memory collaboration, and integrated development tools — powered by [OpenClaw](https://github.com/openclaw/openclaw).
|
|
4
|
+
|
|
5
|
+
> ⚠️ **Early Preview** — Under active development. Expect breaking changes.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
### ✅ Implemented
|
|
10
|
+
|
|
11
|
+
- 💬 **Chat Panel** — Real-time AI chat in VSCode with streaming responses, message history, and session persistence
|
|
12
|
+
- 🎭 **Soul Explorer** — Browse 85+ community souls from [ClawSouls](https://clawsouls.ai), search/filter by category, preview details, one-click apply
|
|
13
|
+
- 🐝 **Swarm Memory** — Git-based team knowledge collaboration with branch management, push/pull, LLM-powered merge conflict resolution, age encryption
|
|
14
|
+
- 📊 **Checkpoints** — Create, scan, compare, and restore agent state snapshots with contamination detection
|
|
15
|
+
- 🔍 **SoulScan** — Run security scans on AI persona packages directly from the editor
|
|
16
|
+
- ⚙️ **Setup Wizard** — 5-step guided onboarding (LLM provider → API key → port → soul selection → done)
|
|
17
|
+
- 🎭 **Onboarding Soul Browser** — Dynamic soul picker during first-run setup, fetches live data from ClawSouls API with search, category filters, and popularity ranking
|
|
18
|
+
- 🔌 **Contained Runtime** — OpenClaw installs into extension storage, zero system pollution, clean uninstall
|
|
19
|
+
- 📋 **Chat History** — Browse and switch between past conversation sessions
|
|
20
|
+
- 📍 **Status Bar** — Live soul name, agent branch, connection status, quick actions
|
|
21
|
+
- 🔄 **Workspace Tracker** — Auto-syncs current project path to agent TOOLS.md for context awareness
|
|
22
|
+
|
|
23
|
+
### 🚧 Planned
|
|
24
|
+
|
|
25
|
+
- 🛒 VS Marketplace publishing
|
|
26
|
+
- 🔐 Private soul management
|
|
27
|
+
- 🤖 Multi-agent orchestration panel
|
|
28
|
+
|
|
29
|
+
## Requirements
|
|
30
|
+
|
|
31
|
+
- **Node.js 22+** (required for OpenClaw runtime)
|
|
32
|
+
- VSCode 1.85+
|
|
33
|
+
- **For local LLM**: [Ollama](https://ollama.com) installed and running (`ollama serve`)
|
|
34
|
+
|
|
35
|
+
## Setup Guide
|
|
36
|
+
|
|
37
|
+
### Step 1: Install Node.js 22+
|
|
38
|
+
|
|
39
|
+
The extension auto-detects Node.js from nvm, fnm, volta, or system PATH.
|
|
40
|
+
|
|
41
|
+
#### macOS / Linux
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Using nvm (recommended)
|
|
45
|
+
nvm install 24
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
#### Windows
|
|
49
|
+
|
|
50
|
+
```powershell
|
|
51
|
+
# Using nvm-windows
|
|
52
|
+
nvm install 24.13.0 64
|
|
53
|
+
nvm use 24.13.0
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> ⚠️ **Windows**: Specify architecture: `nvm install 24 64`. Without `64`, nvm-windows may fail.
|
|
57
|
+
|
|
58
|
+
#### Direct Install
|
|
59
|
+
|
|
60
|
+
Download Node.js 24+ from [nodejs.org](https://nodejs.org/).
|
|
61
|
+
|
|
62
|
+
### Step 2: (Optional) Set Up Ollama for Local LLM
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Install from https://ollama.com
|
|
66
|
+
ollama pull llama3.2
|
|
67
|
+
ollama serve
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Step 3: Install & Configure
|
|
71
|
+
|
|
72
|
+
1. Install the extension from `.vsix` or VS Marketplace
|
|
73
|
+
2. Setup Wizard runs automatically on first launch:
|
|
74
|
+
- **Step 1**: Choose LLM provider (Anthropic / OpenAI / Ollama)
|
|
75
|
+
- **Step 2**: Enter API key or Ollama config
|
|
76
|
+
- **Step 3**: Configure Gateway port (default: 18789)
|
|
77
|
+
- **Step 4**: Browse and pick a soul from the community — search, filter by category, see download counts and scan scores
|
|
78
|
+
- **Step 5**: Done! Chat opens automatically
|
|
79
|
+
3. Start building with your AI partner
|
|
80
|
+
|
|
81
|
+
## Panels
|
|
82
|
+
|
|
83
|
+
### 💬 Chat
|
|
84
|
+
|
|
85
|
+
Full-featured chat with streaming, markdown rendering, code blocks, and persistent history. Messages are saved across sessions — switch between past conversations via the history panel.
|
|
86
|
+
|
|
87
|
+
### 🎭 Soul Explorer
|
|
88
|
+
|
|
89
|
+
- **Browse mode**: Souls grouped by category, sorted by downloads, with SoulScan badges
|
|
90
|
+
- **Search**: Filter by name, description, or tags
|
|
91
|
+
- **Preview**: View full soul details, files, and scan results
|
|
92
|
+
- **Apply**: One-click apply to OpenClaw workspace with optional memory clear
|
|
93
|
+
- **Local mode**: Toggle to see soul files in your current workspace
|
|
94
|
+
|
|
95
|
+
### 📊 Checkpoints
|
|
96
|
+
|
|
97
|
+
- **Create**: Snapshot current agent state (SOUL.md, MEMORY.md, etc.)
|
|
98
|
+
- **Scan**: Run 4-layer contamination detection on any checkpoint
|
|
99
|
+
- **Compare**: Diff two checkpoints to see what changed
|
|
100
|
+
- **Restore**: Roll back to a previous state
|
|
101
|
+
|
|
102
|
+
### 🐝 Swarm Memory
|
|
103
|
+
|
|
104
|
+
- **Init/Join**: Create or join a shared swarm repository
|
|
105
|
+
- **Push/Pull**: Sync memory changes with the team
|
|
106
|
+
- **Branch**: Create topic branches for isolated exploration
|
|
107
|
+
- **Merge**: LLM-powered semantic conflict resolution
|
|
108
|
+
- **Encryption**: Age-based encryption for sensitive memory with key rotation
|
|
109
|
+
|
|
110
|
+
## Status Bar
|
|
111
|
+
|
|
112
|
+
| Item | Description |
|
|
113
|
+
|------|-------------|
|
|
114
|
+
| 🔮 Soul Name | Current soul — click to chat |
|
|
115
|
+
| 🐝 agent/main | Current swarm branch |
|
|
116
|
+
| 🟢 connected | Gateway status — click for action |
|
|
117
|
+
| 🔄 | Restart Gateway |
|
|
118
|
+
| ⚙️ | Re-run setup wizard |
|
|
119
|
+
|
|
120
|
+
## Settings
|
|
121
|
+
|
|
122
|
+
| Setting | Default | Description |
|
|
123
|
+
|---------|---------|-------------|
|
|
124
|
+
| `clawsouls.llmProvider` | `anthropic` | LLM provider (anthropic / openai / ollama) |
|
|
125
|
+
| `clawsouls.llmApiKey` | | API key for Anthropic or OpenAI |
|
|
126
|
+
| `clawsouls.llmModel` | | Model override (e.g. `claude-opus-4-6`) |
|
|
127
|
+
| `clawsouls.ollamaUrl` | `http://127.0.0.1:11434` | Ollama API URL |
|
|
128
|
+
| `clawsouls.ollamaModel` | `llama3` | Ollama model name |
|
|
129
|
+
| `clawsouls.gatewayUrl` | `ws://127.0.0.1:18789` | Gateway WebSocket URL |
|
|
130
|
+
| `clawsouls.gatewayPort` | `18789` | Gateway port |
|
|
131
|
+
| `clawsouls.autoConnect` | `true` | Auto-connect on startup |
|
|
132
|
+
| `clawsouls.showStatusBar` | `true` | Show status bar items |
|
|
133
|
+
|
|
134
|
+
## How It Works
|
|
135
|
+
|
|
136
|
+
1. Extension finds Node.js 22+ on your system (nvm, fnm, volta, PATH)
|
|
137
|
+
2. Installs OpenClaw into extension storage (`globalStorage/`)
|
|
138
|
+
3. Starts the OpenClaw Gateway as a background process
|
|
139
|
+
4. Connects via WebSocket for real-time chat
|
|
140
|
+
|
|
141
|
+
Everything is contained — uninstalling cleans up completely.
|
|
142
|
+
|
|
143
|
+
## File Locations
|
|
144
|
+
|
|
145
|
+
| OS | Extension Storage | OpenClaw Config |
|
|
146
|
+
|----|-------------------|-----------------|
|
|
147
|
+
| **Windows** | `%APPDATA%\Code\User\globalStorage\clawsouls.soulclaw-vscode\` | `%USERPROFILE%\.openclaw\` |
|
|
148
|
+
| **macOS** | `~/Library/Application Support/Code/User/globalStorage/clawsouls.soulclaw-vscode/` | `~/.openclaw/` |
|
|
149
|
+
| **Linux** | `~/.config/Code/User/globalStorage/clawsouls.soulclaw-vscode/` | `~/.openclaw/` |
|
|
150
|
+
|
|
151
|
+
## Disclaimer
|
|
152
|
+
|
|
153
|
+
This extension is provided "as is" without warranty of any kind. It is an independent project by [ClawSouls](https://clawsouls.ai) and is **not officially affiliated with or endorsed by the OpenClaw project**. Use at your own risk.
|
|
154
|
+
|
|
155
|
+
## License
|
|
156
|
+
|
|
157
|
+
**Apache License 2.0** (extension) + **MIT** (embedded OpenClaw runtime).
|
|
158
|
+
|
|
159
|
+
See [LICENSE](LICENSE) for details.
|
|
160
|
+
|
|
161
|
+
## Links
|
|
162
|
+
|
|
163
|
+
- [ClawSouls](https://clawsouls.ai) — AI persona platform
|
|
164
|
+
- [Soul Spec](https://clawsouls.ai/spec) — Open persona specification
|
|
165
|
+
- [Documentation](https://docs.clawsouls.ai) — Full docs
|
|
166
|
+
- [Blog](https://blog.clawsouls.ai) — Guides & updates
|
|
167
|
+
- [GitHub](https://github.com/clawsouls/clawsouls-vscode) — Source code & issues
|
package/docs/TESTCASE.md
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# ClawSouls Agent — VSCode Extension Test Cases
|
|
2
|
+
|
|
3
|
+
## 환경 준비
|
|
4
|
+
- Windows amd64, Node v24+
|
|
5
|
+
- VSCode 1.85+
|
|
6
|
+
- `.vsix` 설치: Extensions → `...` → Install from VSIX
|
|
7
|
+
- 아무 프로젝트 폴더 열기
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Setup Wizard
|
|
12
|
+
|
|
13
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
14
|
+
|---|--------|-----------|------|
|
|
15
|
+
| S-01 | Extension 설치 후 최초 실행 | Setup Wizard 패널 자동 표시 | |
|
|
16
|
+
| S-02 | Anthropic API key 입력 | key 저장, Gateway 연결 시작 | |
|
|
17
|
+
| S-03 | Ollama 선택 → URL 입력 | Ollama 모드로 설정 | |
|
|
18
|
+
| S-04 | 잘못된 API key 입력 | 에러 메시지 표시 | |
|
|
19
|
+
| S-05 | Command Palette → "ClawSouls: Setup" | Setup Wizard 재실행 | |
|
|
20
|
+
| S-06 | Step 4: Soul 브라우저 로딩 | API에서 soul 목록 fetch, 카드 그리드 표시 | |
|
|
21
|
+
| S-07 | Step 4: 검색 입력 | 이름/설명/태그로 실시간 필터링 | |
|
|
22
|
+
| S-08 | Step 4: 카테고리 필터 클릭 | 해당 카테고리만 표시 | |
|
|
23
|
+
| S-09 | Step 4: 인기 soul ⭐ 배지 | 상위 3개에 "Popular" 배지 표시 | |
|
|
24
|
+
| S-10 | Step 4: Soul 카드 클릭 → Next | 선택한 soul이 OpenClaw workspace에 apply | |
|
|
25
|
+
| S-11 | Step 4: "Create Custom" 선택 → Next | Custom soul 생성 플로우 | |
|
|
26
|
+
| S-12 | Step 4: "Start Empty" 선택 → Next | Soul 없이 진행 | |
|
|
27
|
+
| S-13 | Step 4: 다운로드 수/스캔 상태 표시 | 각 카드에 ⬇ count, ✅/⚠️ 배지 | |
|
|
28
|
+
| S-14 | Step 4: API 장애 시 | "No souls found" 표시, Custom/Empty로 진행 가능 | |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. Gateway Connection
|
|
33
|
+
|
|
34
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
35
|
+
|---|--------|-----------|------|
|
|
36
|
+
| G-01 | Setup 완료 후 | Status bar "🟢 connected" 표시 | |
|
|
37
|
+
| G-02 | Gateway 연결 끊김 | Status bar "⚪ disconnected" 표시 | |
|
|
38
|
+
| G-03 | "🔄" 버튼 클릭 | Gateway 재시작, 재연결 | |
|
|
39
|
+
| G-04 | Chat 패널에서 연결 상태 확인 | "● Gateway: connected" 실시간 업데이트 | |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 3. Chat Panel
|
|
44
|
+
|
|
45
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
46
|
+
|---|--------|-----------|------|
|
|
47
|
+
| C-01 | Status bar "💬 Chat" 클릭 | Chat 패널 열림 | |
|
|
48
|
+
| C-02 | 메시지 입력 → Send | 메시지 전송, 유저 메시지 표시 | |
|
|
49
|
+
| C-03 | Enter 키로 전송 | Shift+Enter 없이 Enter만 누르면 전송 | |
|
|
50
|
+
| C-04 | Shift+Enter | 줄바꿈 (전송 아님) | |
|
|
51
|
+
| C-05 | AI 응답 수신 | Assistant 메시지 표시 (마크다운 렌더링) | |
|
|
52
|
+
| C-06 | 긴 대화 후 새 메시지 | 스크롤 점프 없이 메시지 append | |
|
|
53
|
+
| C-07 | Chat 패널 닫기 → 다시 열기 | 이전 대화 내용 유지 (최대 200개) | |
|
|
54
|
+
| C-08 | VSCode 재시작 후 Chat 열기 | 대화 히스토리 유지 | |
|
|
55
|
+
| C-09 | 파일 drag & drop | 파일 내용 텍스트에 삽입 (100KB 이하) | |
|
|
56
|
+
| C-10 | 100KB 초과 파일 drag & drop | 경고 메시지 | |
|
|
57
|
+
| C-11 | 스트리밍 응답 중 | "typing..." 인디케이터 표시 | |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 4. Status Bar
|
|
62
|
+
|
|
63
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
64
|
+
|---|--------|-----------|------|
|
|
65
|
+
| SB-01 | soul.json 있는 프로젝트 열기 | "🔮 {displayName}" 표시 | |
|
|
66
|
+
| SB-02 | soul.json 없는 프로젝트 열기 | "🔮 No Soul" 표시 | |
|
|
67
|
+
| SB-03 | Soul Explorer에서 soul apply 후 | Status bar soul name 업데이트 | |
|
|
68
|
+
| SB-04 | soul.json 수동 삭제 | "🔮 No Soul"로 변경 | |
|
|
69
|
+
| SB-05 | soul.json 수동 생성/수정 | soul name 자동 업데이트 | |
|
|
70
|
+
| SB-06 | "🐝 agent/main" 표시 확인 | agent 이름 표시 | |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 5. Soul Explorer
|
|
75
|
+
|
|
76
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
77
|
+
|---|--------|-----------|------|
|
|
78
|
+
| SE-01 | 사이드바 ClawSouls 아이콘 클릭 | Soul Explorer 패널 열림 | |
|
|
79
|
+
| SE-02 | Browse 모드 | 카테고리별 soul 목록 로드 (89개) | |
|
|
80
|
+
| SE-03 | 검색 아이콘 클릭 → 키워드 입력 | 이름/태그/설명 검색 필터링 | |
|
|
81
|
+
| SE-04 | Soul 항목 클릭 → Preview | Webview에 soul 상세 정보 표시 | |
|
|
82
|
+
| SE-05 | Apply 버튼 (☁↓) 클릭 | 확인 다이얼로그 → "Apply" 선택 | |
|
|
83
|
+
| SE-06 | Apply 완료 후 | "✅ Soul applied" 메시지 + Gateway 재시작 | |
|
|
84
|
+
| SE-07 | Apply 후 Chat에서 대화 | 해당 soul 페르소나로 응답 | |
|
|
85
|
+
| SE-08 | Toggle View (로컬/브라우즈) | 로컬 파일 ↔ API 목록 전환 | |
|
|
86
|
+
| SE-09 | Refresh 버튼 | soul 목록 새로고침 | |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 6. Checkpoint
|
|
91
|
+
|
|
92
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
93
|
+
|---|--------|-----------|------|
|
|
94
|
+
| CP-01 | "ClawSouls: Create Checkpoint" 실행 | 체크포인트 이름 입력 프롬프트 | |
|
|
95
|
+
| CP-02 | 이름 입력 → 생성 | `.clawsouls/checkpoints/{id}/` 에 파일 저장 | |
|
|
96
|
+
| CP-03 | Checkpoints 패널에 목록 표시 | 생성한 체크포인트 보임 | |
|
|
97
|
+
| CP-04 | Restore 버튼 클릭 | 확인 다이얼로그 → soul.json 복원 | |
|
|
98
|
+
| CP-05 | Diff 버튼 클릭 | 파일 선택 → VSCode diff viewer 열림 | |
|
|
99
|
+
| CP-06 | Delete 버튼 클릭 | 체크포인트 삭제 | |
|
|
100
|
+
| CP-07 | 체크포인트 없는 상태 | "No checkpoints" 메시지 | |
|
|
101
|
+
| CP-08 | **저장 위치** | `~/.openclaw/workspace/.clawsouls/checkpoints/`에 저장 (프로젝트 폴더 아님) | |
|
|
102
|
+
| CP-09 | **Restore 후 gateway restart** | 복원 후 gateway 자동 재시작, 에이전트가 복원된 soul 사용 | |
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 7. Swarm Memory
|
|
107
|
+
|
|
108
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
109
|
+
|---|--------|-----------|------|
|
|
110
|
+
| SW-01 | 초기 상태 | "Initialize Swarm Memory" 버튼만 표시 | |
|
|
111
|
+
| SW-02 | Initialize 클릭 → URL 비움 | globalStorage에 로컬 git repo 생성 | |
|
|
112
|
+
| SW-03 | Initialize 클릭 → URL 입력 | git clone 실행 | |
|
|
113
|
+
| SW-04 | 초기화 후 패널 | Join/Push/Pull/Merge/Encryption 버튼 표시 | |
|
|
114
|
+
| SW-05 | "👤 Join as Agent" 클릭 | branch 이름 입력 → `agent/{name}` 생성 | |
|
|
115
|
+
| SW-06 | "⬆ Push" 클릭 | 터미널에서 `npx clawsouls swarm push` 실행 | |
|
|
116
|
+
| SW-07 | "⬇ Pull" 클릭 | 터미널에서 `npx clawsouls swarm pull` 실행 | |
|
|
117
|
+
| SW-08 | "🔀 Merge" 클릭 | branch 선택 → 전략 선택 (Git/LLM) | |
|
|
118
|
+
| SW-09 | Git merge 선택 | 직접 git merge 실행 | |
|
|
119
|
+
| SW-10 | LLM merge 선택 | 터미널에서 `--strategy llm` 실행 | |
|
|
120
|
+
| SW-11 | "🔐 Encryption Keys" 클릭 | QuickPick: init/show/add/list/rotate | |
|
|
121
|
+
| SW-12 | Keys → Init 선택 | 터미널에서 `swarm keys init` 실행 | |
|
|
122
|
+
| SW-13 | Keys → Add 선택 | public key 입력 프롬프트 → 실행 | |
|
|
123
|
+
| SW-14 | Branch 목록 표시 | 현재 branch에 ★ 표시 | |
|
|
124
|
+
| SW-15 | Branch 항목 클릭 | branch 전환 | |
|
|
125
|
+
| SW-16 | **프로젝트 repo 무영향 확인** | `git branch` — agent/* 브랜치 없음 | |
|
|
126
|
+
| SW-17 | 터미널 명령어 구분자 | `;` 사용 (PowerShell 호환) | |
|
|
127
|
+
| SW-18 | **Swarm dir 위치** | `~/.openclaw/swarm/`에 git repo 생성 (globalStorage 아님) | |
|
|
128
|
+
| SW-19 | **Pull 후 workspace sync** | Pull → `~/.openclaw/workspace/`에 메모리 파일 복사됨 | |
|
|
129
|
+
| SW-20 | **Pull 후 gateway restart** | Pull 완료 5초 후 gateway 재시작 | |
|
|
130
|
+
| SW-21 | **Merge 후 workspace sync** | Merge → workspace에 메모리 파일 복사 + gateway 재시작 | |
|
|
131
|
+
| SW-22 | **joinAgent prefix 자동추가** | "brad" 입력 → `agent/brad` 브랜치 생성 | |
|
|
132
|
+
| SW-23 | **Push/Pull 비agent 브랜치 경고** | main 브랜치에서 Push → "not an agent branch" 경고 | |
|
|
133
|
+
| SW-24 | **여러 workspace에서 같은 swarm** | 다른 프로젝트 열어도 같은 `~/.openclaw/swarm/` 참조 | |
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 8. SoulScan
|
|
138
|
+
|
|
139
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
140
|
+
|---|--------|-----------|------|
|
|
141
|
+
| SC-01 | "ClawSouls: Run SoulScan" 실행 | 터미널에서 `npx clawsouls scan` 실행 | |
|
|
142
|
+
| SC-02 | soul.json 있는 프로젝트에서 실행 | 스캔 결과 터미널 출력 | |
|
|
143
|
+
| SC-03 | soul.json 없는 프로젝트에서 실행 | 에러 메시지 | |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 9. Edit Soul
|
|
148
|
+
|
|
149
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
150
|
+
|---|--------|-----------|------|
|
|
151
|
+
| ES-01 | "ClawSouls: Edit Soul" — soul.json 있음 | soul.json 에디터에서 열림 | |
|
|
152
|
+
| ES-02 | "ClawSouls: Edit Soul" — soul.json 없음 | "Create?" 다이얼로그 → 생성 | |
|
|
153
|
+
| ES-03 | Create 선택 후 | 기본 soul.json 템플릿 생성 + 에디터 열림 | |
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 10. Chat History
|
|
158
|
+
|
|
159
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
160
|
+
|---|--------|-----------|------|
|
|
161
|
+
| CH-01 | Chat History 패널 열기 | 과거 세션 목록 표시 | |
|
|
162
|
+
| CH-02 | 세션 항목 클릭 | 해당 세션 대화 내용 Chat에 로드 | |
|
|
163
|
+
| CH-03 | 여러 세션 전환 | 각 세션 히스토리 정확히 표시 | |
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 11. Workspace Tracker
|
|
168
|
+
|
|
169
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
170
|
+
|---|--------|-----------|------|
|
|
171
|
+
| WT-01 | 프로젝트 폴더 열기 | TOOLS.md에 `## Current Project` 섹션 자동 추가 | |
|
|
172
|
+
| WT-02 | 다른 프로젝트로 전환 | TOOLS.md 프로젝트 경로 업데이트 | |
|
|
173
|
+
| WT-03 | Agent 대화에서 프로젝트 컨텍스트 | Agent가 현재 프로젝트 경로 인식 | |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 12. Activity Bar & UI
|
|
178
|
+
|
|
179
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
180
|
+
|---|--------|-----------|------|
|
|
181
|
+
| UI-01 | Activity bar 아이콘 확인 | 새 SVG 아이콘 표시 | |
|
|
182
|
+
| UI-02 | Swarm Memory 패널 이름 | "Swarm Memory" (not "Swarm") | |
|
|
183
|
+
| UI-03 | Swarm Memory 아이콘 | 다이아몬드+화살표 PNG 아이콘 | |
|
|
184
|
+
| UI-04 | 다크 테마에서 전체 UI | 가독성 확인 | |
|
|
185
|
+
| UI-05 | 라이트 테마에서 전체 UI | 가독성 확인 | |
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 13. Cross-Platform
|
|
190
|
+
|
|
191
|
+
| # | 테스트 | 기대 결과 | Pass |
|
|
192
|
+
|---|--------|-----------|------|
|
|
193
|
+
| XP-01 | Windows + Anthropic | Chat 정상 동작 | |
|
|
194
|
+
| XP-02 | Windows + Ollama | Chat 정상 동작 | |
|
|
195
|
+
| XP-03 | Mac + Anthropic | Chat 정상 동작 | |
|
|
196
|
+
| XP-04 | Mac + Ollama | Chat 정상 동작 | |
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Summary
|
|
201
|
+
|
|
202
|
+
| 카테고리 | 항목 수 |
|
|
203
|
+
|----------|---------|
|
|
204
|
+
| Setup Wizard | 14 |
|
|
205
|
+
| Gateway | 4 |
|
|
206
|
+
| Chat | 11 |
|
|
207
|
+
| Status Bar | 6 |
|
|
208
|
+
| Soul Explorer | 9 |
|
|
209
|
+
| Checkpoint | 9 |
|
|
210
|
+
| Swarm Memory | 24 |
|
|
211
|
+
| SoulScan | 3 |
|
|
212
|
+
| Edit Soul | 3 |
|
|
213
|
+
| Chat History | 3 |
|
|
214
|
+
| Workspace Tracker | 3 |
|
|
215
|
+
| UI | 5 |
|
|
216
|
+
| Cross-Platform | 4 |
|
|
217
|
+
| **Total** | **98** |
|
package/esbuild.mjs
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import esbuild from 'esbuild';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
|
|
8
|
+
const production = process.argv.includes('--production');
|
|
9
|
+
const watch = process.argv.includes('--watch');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @type {import('esbuild').Plugin}
|
|
13
|
+
*/
|
|
14
|
+
const esbuildProblemMatcherPlugin = {
|
|
15
|
+
name: 'esbuild-problem-matcher',
|
|
16
|
+
|
|
17
|
+
setup(build) {
|
|
18
|
+
build.onStart(() => {
|
|
19
|
+
console.log('[watch] build started');
|
|
20
|
+
});
|
|
21
|
+
build.onEnd((result) => {
|
|
22
|
+
result.errors.forEach(({ text, location }) => {
|
|
23
|
+
console.error(`✘ [ERROR] ${text}`);
|
|
24
|
+
console.error(` ${location.file}:${location.line}:${location.column}:`);
|
|
25
|
+
});
|
|
26
|
+
console.log('[watch] build finished');
|
|
27
|
+
});
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
async function main() {
|
|
32
|
+
const ctx = await esbuild.context({
|
|
33
|
+
entryPoints: ['src/extension.ts'],
|
|
34
|
+
bundle: true,
|
|
35
|
+
format: 'cjs',
|
|
36
|
+
minify: production,
|
|
37
|
+
sourcemap: !production,
|
|
38
|
+
sourcesContent: false,
|
|
39
|
+
platform: 'node',
|
|
40
|
+
outfile: 'dist/extension.js',
|
|
41
|
+
external: ['vscode'],
|
|
42
|
+
logLevel: 'silent',
|
|
43
|
+
plugins: [
|
|
44
|
+
esbuildProblemMatcherPlugin,
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
if (watch) {
|
|
49
|
+
await ctx.watch();
|
|
50
|
+
} else {
|
|
51
|
+
await ctx.rebuild();
|
|
52
|
+
await ctx.dispose();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
main().catch(e => {
|
|
57
|
+
console.error(e);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
});
|