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 ADDED
@@ -0,0 +1,8 @@
1
+ .vscode/**
2
+ .vscode-test/**
3
+ src/**
4
+ .gitignore
5
+ tsconfig.json
6
+ node_modules/**
7
+ **/*.ts
8
+ !out/**
package/.vsixignore ADDED
@@ -0,0 +1,2 @@
1
+ media/clawsouls_vscode_logo.png
2
+ media/clawsouls_vscode_logo_small.png
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
@@ -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
+ });