@regression-io/claude-config 0.38.6 → 0.38.8
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 +44 -19
- package/lib/constants.js +1 -1
- package/package.json +1 -1
- package/scripts/tauri-prepare.js +300 -0
- package/ui/dist/assets/{index-DTADVG7R.js → index-BGKsqCBk.js} +47 -27
- package/ui/dist/index.html +1 -1
- package/ui/routes/subprojects.js +1 -1
package/README.md
CHANGED
|
@@ -17,13 +17,36 @@ Claude Code works great out of the box. This tool helps when you need more contr
|
|
|
17
17
|
|
|
18
18
|
## Installation
|
|
19
19
|
|
|
20
|
+
### Option A: Desktop App (Recommended)
|
|
21
|
+
|
|
22
|
+
Download the native app from [GitHub Releases](https://github.com/regression-io/claude-config/releases):
|
|
23
|
+
|
|
24
|
+
| Platform | Download |
|
|
25
|
+
|----------|----------|
|
|
26
|
+
| **macOS (Apple Silicon)** | `Claude.Config_*_aarch64.dmg` |
|
|
27
|
+
| **macOS (Intel)** | `Claude.Config_*_x64.dmg` |
|
|
28
|
+
| **Windows** | `Claude.Config_*_x64-setup.exe` |
|
|
29
|
+
| **Linux** | `Claude.Config_*_amd64.deb` or `.AppImage` |
|
|
30
|
+
|
|
31
|
+
No Node.js required. Just download, install, and run.
|
|
32
|
+
|
|
33
|
+
### Option B: npm Package
|
|
34
|
+
|
|
20
35
|
```bash
|
|
21
36
|
npm install -g @regression-io/claude-config
|
|
22
37
|
```
|
|
23
38
|
|
|
39
|
+
Requires Node.js 18+.
|
|
40
|
+
|
|
24
41
|
## Quick Start
|
|
25
42
|
|
|
26
|
-
###
|
|
43
|
+
### Desktop App Users
|
|
44
|
+
|
|
45
|
+
1. Download and install from [GitHub Releases](https://github.com/regression-io/claude-config/releases)
|
|
46
|
+
2. Launch the app
|
|
47
|
+
3. Add your projects and configure
|
|
48
|
+
|
|
49
|
+
### npm Package Users
|
|
27
50
|
|
|
28
51
|
```bash
|
|
29
52
|
# 1. Install
|
|
@@ -36,25 +59,18 @@ claude-config ui install
|
|
|
36
59
|
open http://localhost:3333
|
|
37
60
|
```
|
|
38
61
|
|
|
39
|
-
The server
|
|
62
|
+
The server starts automatically on login. Install as a PWA from your browser for app-like access.
|
|
63
|
+
|
|
64
|
+
### Updating
|
|
40
65
|
|
|
41
|
-
|
|
66
|
+
**Desktop App:** Download latest from [GitHub Releases](https://github.com/regression-io/claude-config/releases).
|
|
42
67
|
|
|
68
|
+
**npm Package:**
|
|
43
69
|
```bash
|
|
44
|
-
# Option A: Update via CLI
|
|
45
70
|
claude-config update
|
|
46
|
-
|
|
47
|
-
# Option B: Update via UI
|
|
48
|
-
# Click the green "Update" button in the header when available
|
|
49
|
-
|
|
50
|
-
# After updating, restart to pick up changes:
|
|
51
|
-
claude-config ui install # If using auto-start
|
|
52
|
-
# OR
|
|
53
|
-
claude-config ui stop && claude-config ui # Manual restart
|
|
71
|
+
# Then restart: claude-config ui stop && claude-config ui
|
|
54
72
|
```
|
|
55
73
|
|
|
56
|
-
The UI shows a restart indicator when the running version differs from the installed version.
|
|
57
|
-
|
|
58
74
|
### CLI Alternative
|
|
59
75
|
|
|
60
76
|
```bash
|
|
@@ -528,11 +544,22 @@ User settings stored in `~/.claude-config/config.json`:
|
|
|
528
544
|
| `ui.port` | Default port for web UI |
|
|
529
545
|
| `ui.openBrowser` | Auto-open browser on `claude-config ui` |
|
|
530
546
|
|
|
531
|
-
## Native Desktop App
|
|
547
|
+
## Native Desktop App
|
|
548
|
+
|
|
549
|
+
The desktop app provides a true native experience - no terminal, no Node.js, no CLI commands.
|
|
532
550
|
|
|
533
|
-
|
|
551
|
+
### Download
|
|
534
552
|
|
|
535
|
-
|
|
553
|
+
Get the latest release from [GitHub Releases](https://github.com/regression-io/claude-config/releases):
|
|
554
|
+
|
|
555
|
+
- **macOS Apple Silicon**: `Claude.Config_*_aarch64.dmg`
|
|
556
|
+
- **macOS Intel**: `Claude.Config_*_x64.dmg`
|
|
557
|
+
- **Windows**: `Claude.Config_*_x64-setup.exe`
|
|
558
|
+
- **Linux**: `Claude.Config_*_amd64.deb` or `.AppImage`
|
|
559
|
+
|
|
560
|
+
### Building from Source
|
|
561
|
+
|
|
562
|
+
If you prefer to build locally:
|
|
536
563
|
|
|
537
564
|
```bash
|
|
538
565
|
# Prerequisites: Rust toolchain
|
|
@@ -551,8 +578,6 @@ The `.app` bundle will be created in `src-tauri/target/release/bundle/macos/`.
|
|
|
551
578
|
npm run tauri:dev
|
|
552
579
|
```
|
|
553
580
|
|
|
554
|
-
This opens the native window connected to the local Node.js server.
|
|
555
|
-
|
|
556
581
|
## Requirements
|
|
557
582
|
|
|
558
583
|
- Node.js 18+
|
package/lib/constants.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@regression-io/claude-config",
|
|
3
|
-
"version": "0.38.
|
|
3
|
+
"version": "0.38.8",
|
|
4
4
|
"description": "Configuration management UI for Claude Code and Antigravity - manage MCPs, rules, commands, memory, and project folders",
|
|
5
5
|
"author": "regression.io",
|
|
6
6
|
"main": "config-loader.js",
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tauri Build Preparation Script
|
|
5
|
+
*
|
|
6
|
+
* Prepares the Node.js server bundle for Tauri packaging:
|
|
7
|
+
* 1. Downloads Node.js binary for target platform
|
|
8
|
+
* 2. Copies server files to bundle location
|
|
9
|
+
* 3. Installs production dependencies
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const https = require('https');
|
|
15
|
+
const { spawnSync } = require('child_process');
|
|
16
|
+
const os = require('os');
|
|
17
|
+
|
|
18
|
+
const ROOT_DIR = path.join(__dirname, '..');
|
|
19
|
+
const SRC_TAURI = path.join(ROOT_DIR, 'src-tauri');
|
|
20
|
+
const BINARIES_DIR = path.join(SRC_TAURI, 'binaries');
|
|
21
|
+
const SERVER_DIR = path.join(SRC_TAURI, 'server');
|
|
22
|
+
|
|
23
|
+
// Node.js version to bundle (LTS)
|
|
24
|
+
const NODE_VERSION = '20.18.1';
|
|
25
|
+
|
|
26
|
+
// Platform detection
|
|
27
|
+
function getPlatform() {
|
|
28
|
+
const platform = os.platform();
|
|
29
|
+
const arch = os.arch();
|
|
30
|
+
|
|
31
|
+
if (platform === 'darwin') {
|
|
32
|
+
return arch === 'arm64' ? 'darwin-arm64' : 'darwin-x64';
|
|
33
|
+
} else if (platform === 'win32') {
|
|
34
|
+
return arch === 'arm64' ? 'win-arm64' : 'win-x64';
|
|
35
|
+
} else if (platform === 'linux') {
|
|
36
|
+
return arch === 'arm64' ? 'linux-arm64' : 'linux-x64';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
throw new Error(`Unsupported platform: ${platform}-${arch}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Get Tauri target triple
|
|
43
|
+
function getTauriTarget() {
|
|
44
|
+
const platform = os.platform();
|
|
45
|
+
const arch = os.arch();
|
|
46
|
+
|
|
47
|
+
if (platform === 'darwin') {
|
|
48
|
+
return arch === 'arm64' ? 'aarch64-apple-darwin' : 'x86_64-apple-darwin';
|
|
49
|
+
} else if (platform === 'win32') {
|
|
50
|
+
return arch === 'arm64' ? 'aarch64-pc-windows-msvc' : 'x86_64-pc-windows-msvc';
|
|
51
|
+
} else if (platform === 'linux') {
|
|
52
|
+
return arch === 'arm64' ? 'aarch64-unknown-linux-gnu' : 'x86_64-unknown-linux-gnu';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
throw new Error(`Unsupported platform: ${platform}-${arch}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Download a file
|
|
59
|
+
async function downloadFile(url, dest) {
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
console.log(`Downloading: ${url}`);
|
|
62
|
+
|
|
63
|
+
const file = fs.createWriteStream(dest);
|
|
64
|
+
|
|
65
|
+
const request = (reqUrl) => {
|
|
66
|
+
https.get(reqUrl, (response) => {
|
|
67
|
+
if (response.statusCode === 302 || response.statusCode === 301) {
|
|
68
|
+
// Follow redirect
|
|
69
|
+
request(response.headers.location);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (response.statusCode !== 200) {
|
|
74
|
+
reject(new Error(`HTTP ${response.statusCode}: ${reqUrl}`));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const total = parseInt(response.headers['content-length'], 10);
|
|
79
|
+
let downloaded = 0;
|
|
80
|
+
|
|
81
|
+
response.on('data', (chunk) => {
|
|
82
|
+
downloaded += chunk.length;
|
|
83
|
+
if (total) {
|
|
84
|
+
const pct = Math.round((downloaded / total) * 100);
|
|
85
|
+
process.stdout.write(`\r Progress: ${pct}%`);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
response.pipe(file);
|
|
90
|
+
|
|
91
|
+
file.on('finish', () => {
|
|
92
|
+
file.close();
|
|
93
|
+
console.log('\n Download complete');
|
|
94
|
+
resolve();
|
|
95
|
+
});
|
|
96
|
+
}).on('error', (err) => {
|
|
97
|
+
fs.unlink(dest, () => {});
|
|
98
|
+
reject(err);
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
request(url);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Extract tar.gz using spawn (safe from injection)
|
|
107
|
+
function extractArchive(archivePath, destDir) {
|
|
108
|
+
console.log(`Extracting to: ${destDir}`);
|
|
109
|
+
|
|
110
|
+
// Use spawnSync with array arguments (safe from shell injection)
|
|
111
|
+
const result = spawnSync('tar', ['-xzf', archivePath, '-C', destDir], {
|
|
112
|
+
stdio: 'inherit'
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
if (result.status !== 0) {
|
|
116
|
+
throw new Error(`Failed to extract archive: ${result.stderr || 'unknown error'}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Download Node.js binary
|
|
121
|
+
async function downloadNode() {
|
|
122
|
+
const platform = getPlatform();
|
|
123
|
+
const tauriTarget = getTauriTarget();
|
|
124
|
+
const ext = platform.startsWith('win') ? 'zip' : 'tar.gz';
|
|
125
|
+
const nodeDir = `node-v${NODE_VERSION}-${platform}`;
|
|
126
|
+
const archiveName = `${nodeDir}.${ext}`;
|
|
127
|
+
const url = `https://nodejs.org/dist/v${NODE_VERSION}/${archiveName}`;
|
|
128
|
+
|
|
129
|
+
console.log(`\n=== Downloading Node.js ${NODE_VERSION} for ${platform} ===`);
|
|
130
|
+
|
|
131
|
+
// Create directories
|
|
132
|
+
if (!fs.existsSync(BINARIES_DIR)) {
|
|
133
|
+
fs.mkdirSync(BINARIES_DIR, { recursive: true });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const archivePath = path.join(BINARIES_DIR, archiveName);
|
|
137
|
+
const extractDir = BINARIES_DIR;
|
|
138
|
+
|
|
139
|
+
// Download if not already present
|
|
140
|
+
if (!fs.existsSync(archivePath)) {
|
|
141
|
+
await downloadFile(url, archivePath);
|
|
142
|
+
} else {
|
|
143
|
+
console.log(' Archive already exists, skipping download');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Extract
|
|
147
|
+
extractArchive(archivePath, extractDir);
|
|
148
|
+
|
|
149
|
+
// Move node binary to expected location with Tauri naming convention
|
|
150
|
+
const sourceDir = path.join(extractDir, nodeDir);
|
|
151
|
+
const isWindows = platform.startsWith('win');
|
|
152
|
+
const sourceNode = path.join(sourceDir, isWindows ? 'node.exe' : 'bin/node');
|
|
153
|
+
|
|
154
|
+
// Tauri sidecar naming: <name>-<target-triple>[.exe]
|
|
155
|
+
const destNodeName = `node-server-${tauriTarget}${isWindows ? '.exe' : ''}`;
|
|
156
|
+
const destNode = path.join(BINARIES_DIR, destNodeName);
|
|
157
|
+
|
|
158
|
+
if (fs.existsSync(sourceNode)) {
|
|
159
|
+
fs.copyFileSync(sourceNode, destNode);
|
|
160
|
+
fs.chmodSync(destNode, 0o755);
|
|
161
|
+
console.log(` Node binary copied to: ${destNodeName}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Clean up extracted directory (keep archive for caching)
|
|
165
|
+
fs.rmSync(sourceDir, { recursive: true, force: true });
|
|
166
|
+
|
|
167
|
+
return destNode;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Copy server files
|
|
171
|
+
function copyServerFiles() {
|
|
172
|
+
console.log('\n=== Copying server files ===');
|
|
173
|
+
|
|
174
|
+
// Create server directory
|
|
175
|
+
if (fs.existsSync(SERVER_DIR)) {
|
|
176
|
+
fs.rmSync(SERVER_DIR, { recursive: true });
|
|
177
|
+
}
|
|
178
|
+
fs.mkdirSync(SERVER_DIR, { recursive: true });
|
|
179
|
+
|
|
180
|
+
// Files to copy (individual files)
|
|
181
|
+
const filesToCopy = [
|
|
182
|
+
'cli.js',
|
|
183
|
+
'config-loader.js',
|
|
184
|
+
'package.json',
|
|
185
|
+
'ui/server.cjs',
|
|
186
|
+
'ui/terminal-server.cjs',
|
|
187
|
+
];
|
|
188
|
+
|
|
189
|
+
// Directories to copy (recursive)
|
|
190
|
+
const dirsToCopy = [
|
|
191
|
+
'lib',
|
|
192
|
+
'ui/routes',
|
|
193
|
+
'ui/dist',
|
|
194
|
+
'shared',
|
|
195
|
+
];
|
|
196
|
+
|
|
197
|
+
// Copy individual files
|
|
198
|
+
for (const file of filesToCopy) {
|
|
199
|
+
const src = path.join(ROOT_DIR, file);
|
|
200
|
+
const dest = path.join(SERVER_DIR, file);
|
|
201
|
+
if (fs.existsSync(src)) {
|
|
202
|
+
// Ensure destination directory exists
|
|
203
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
204
|
+
fs.copyFileSync(src, dest);
|
|
205
|
+
console.log(` Copied: ${file}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Copy directories
|
|
210
|
+
for (const dir of dirsToCopy) {
|
|
211
|
+
const src = path.join(ROOT_DIR, dir);
|
|
212
|
+
const dest = path.join(SERVER_DIR, dir);
|
|
213
|
+
if (fs.existsSync(src)) {
|
|
214
|
+
copyDirSync(src, dest);
|
|
215
|
+
console.log(` Copied: ${dir}/`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Recursive directory copy
|
|
221
|
+
function copyDirSync(src, dest) {
|
|
222
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
223
|
+
|
|
224
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
225
|
+
|
|
226
|
+
for (const entry of entries) {
|
|
227
|
+
const srcPath = path.join(src, entry.name);
|
|
228
|
+
const destPath = path.join(dest, entry.name);
|
|
229
|
+
|
|
230
|
+
if (entry.isDirectory()) {
|
|
231
|
+
copyDirSync(srcPath, destPath);
|
|
232
|
+
} else {
|
|
233
|
+
fs.copyFileSync(srcPath, destPath);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Install production dependencies
|
|
239
|
+
function installDependencies() {
|
|
240
|
+
console.log('\n=== Installing production dependencies ===');
|
|
241
|
+
|
|
242
|
+
const result = spawnSync('npm', ['install', '--production', '--ignore-scripts'], {
|
|
243
|
+
cwd: SERVER_DIR,
|
|
244
|
+
stdio: 'inherit',
|
|
245
|
+
shell: true
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
if (result.status !== 0) {
|
|
249
|
+
console.warn(' Warning: npm install may have had issues');
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Note: node-pty needs to be rebuilt for the target platform
|
|
253
|
+
// This is handled by npm rebuild during the Tauri build
|
|
254
|
+
console.log(' Dependencies installed');
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Create a wrapper script for the sidecar
|
|
258
|
+
function createWrapperScript() {
|
|
259
|
+
console.log('\n=== Creating wrapper script ===');
|
|
260
|
+
|
|
261
|
+
const wrapperPath = path.join(SERVER_DIR, 'start-server.js');
|
|
262
|
+
const wrapperContent = `#!/usr/bin/env node
|
|
263
|
+
// Wrapper script to start the server
|
|
264
|
+
// Used by Tauri sidecar
|
|
265
|
+
process.chdir(__dirname);
|
|
266
|
+
require('./cli.js');
|
|
267
|
+
`;
|
|
268
|
+
|
|
269
|
+
fs.writeFileSync(wrapperPath, wrapperContent);
|
|
270
|
+
fs.chmodSync(wrapperPath, 0o755);
|
|
271
|
+
console.log(' Wrapper script created');
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Main
|
|
275
|
+
async function main() {
|
|
276
|
+
console.log('=== Claude Config Tauri Build Preparation ===\n');
|
|
277
|
+
|
|
278
|
+
try {
|
|
279
|
+
// Check if we're building for distribution or just development
|
|
280
|
+
const args = process.argv.slice(2);
|
|
281
|
+
const skipNodeDownload = args.includes('--skip-node');
|
|
282
|
+
|
|
283
|
+
if (!skipNodeDownload) {
|
|
284
|
+
await downloadNode();
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
copyServerFiles();
|
|
288
|
+
installDependencies();
|
|
289
|
+
createWrapperScript();
|
|
290
|
+
|
|
291
|
+
console.log('\n=== Build preparation complete! ===');
|
|
292
|
+
console.log('Run `npm run tauri:build` to create the app bundle.');
|
|
293
|
+
|
|
294
|
+
} catch (error) {
|
|
295
|
+
console.error('Build preparation failed:', error);
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
main();
|
|
@@ -631,44 +631,52 @@ ${x.description}`;break;case"history":case"context":default:if(!x.content.trim()
|
|
|
631
631
|
This won't delete any files.`))try{const v=await we.removeProject(_.id);v.success?(r(y=>y.filter(x=>x.id!==_.id)),Z.success(`Removed project: ${_.name}`)):Z.error(v.error||"Failed to remove project")}catch(v){Z.error("Failed to remove project: "+v.message)}},k=_=>{r(v=>[...v,{..._,exists:!0,hasClaudeConfig:!1}])};return u?n.jsx("div",{className:"flex items-center justify-center h-64",children:n.jsx(dt,{className:"w-8 h-8 animate-spin text-indigo-600"})}):n.jsxs("div",{className:"space-y-6",children:[n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx("div",{className:"w-10 h-10 rounded-lg bg-indigo-100 dark:bg-indigo-900/30 flex items-center justify-center",children:n.jsx(ai,{className:"w-5 h-5 text-indigo-600 dark:text-indigo-400"})}),n.jsxs("div",{children:[n.jsx("h2",{className:"text-lg font-semibold text-gray-900 dark:text-white",children:"Projects"}),n.jsx("p",{className:"text-sm text-gray-500 dark:text-slate-400",children:"Registered projects for quick switching"})]})]}),n.jsxs("div",{className:"flex gap-2",children:[n.jsxs(le,{variant:"outline",onClick:h,size:"sm",children:[n.jsx(dr,{className:"w-4 h-4 mr-2"}),"Refresh"]}),n.jsxs(le,{onClick:()=>m(!0),className:"bg-indigo-600 hover:bg-indigo-700",children:[n.jsx(_t,{className:"w-4 h-4 mr-2"}),"Add Project"]})]})]}),n.jsx("div",{className:"bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 rounded-lg p-4 text-sm text-blue-700 dark:text-blue-400",children:n.jsx("p",{children:"Projects registered here can be quickly switched in the header dropdown. The UI will update to show the selected project's configuration."})}),n.jsx("div",{className:"bg-white dark:bg-slate-950 rounded-xl border border-gray-200 dark:border-slate-800 shadow-sm overflow-hidden",children:t.length===0?n.jsxs("div",{className:"p-12 text-center",children:[n.jsx(gr,{className:"w-12 h-12 mx-auto mb-4 text-gray-300 dark:text-slate-600"}),n.jsx("h3",{className:"text-lg font-medium text-gray-900 dark:text-white mb-2",children:"No Projects Yet"}),n.jsx("p",{className:"text-sm text-gray-500 dark:text-slate-400 mb-4",children:"Add your first project to get started with quick switching."}),n.jsxs(le,{onClick:()=>m(!0),children:[n.jsx(_t,{className:"w-4 h-4 mr-2"}),"Add Your First Project"]})]}):n.jsx("div",{className:"divide-y divide-gray-100 dark:divide-slate-800",children:t.map(_=>n.jsxs("div",{className:`p-4 flex items-center gap-4 transition-colors ${_.isActive?"bg-indigo-50 dark:bg-indigo-950/30":"hover:bg-gray-50 dark:hover:bg-slate-900"}`,children:[n.jsx("div",{className:`w-10 h-10 rounded-lg flex items-center justify-center ${_.isActive?"bg-indigo-100 dark:bg-indigo-900/50":_.exists?"bg-gray-100 dark:bg-slate-800":"bg-amber-100 dark:bg-amber-900/30"}`,children:_.isActive?n.jsx(Et,{className:"w-5 h-5 text-indigo-600 dark:text-indigo-400"}):_.exists?n.jsx(gr,{className:"w-5 h-5 text-gray-500 dark:text-slate-400"}):n.jsx(Ju,{className:"w-5 h-5 text-amber-600 dark:text-amber-400"})}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("h3",{className:`font-medium truncate ${_.isActive?"text-indigo-700 dark:text-indigo-400":"text-gray-900 dark:text-white"}`,children:_.name}),_.hasClaudeConfig&&n.jsx("span",{className:"text-xs bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400 px-1.5 py-0.5 rounded",children:".claude"}),_.isActive&&n.jsx("span",{className:"text-xs bg-indigo-100 dark:bg-indigo-900/50 text-indigo-700 dark:text-indigo-400 px-1.5 py-0.5 rounded",children:"Active"})]}),n.jsx("p",{className:"text-sm text-gray-500 dark:text-slate-400 font-mono truncate",children:_.path.replace(/^\/Users\/[^/]+/,"~")}),!_.exists&&n.jsx("p",{className:"text-xs text-amber-600 dark:text-amber-400 mt-1",children:"Path not found - the directory may have been moved or deleted"})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[!_.isActive&&_.exists&&n.jsx(le,{size:"sm",onClick:()=>g(_.id),disabled:l===_.id,children:l===_.id?n.jsx(dt,{className:"w-4 h-4 animate-spin"}):"Select"}),n.jsx(le,{size:"sm",variant:"ghost",onClick:()=>w(_),className:"text-gray-500 dark:text-slate-400 hover:text-red-600 dark:hover:text-red-400",title:"Remove from registry",children:n.jsx(Fn,{className:"w-4 h-4"})})]})]},_.id))})}),n.jsxs("div",{className:"bg-gray-50 dark:bg-slate-900 rounded-lg p-4 border border-transparent dark:border-slate-800",children:[n.jsx("h4",{className:"text-sm font-medium text-gray-900 dark:text-white mb-2",children:"CLI Commands"}),n.jsxs("div",{className:"space-y-1 text-sm text-gray-600 dark:text-slate-400 font-mono",children:[n.jsx("p",{children:"claude-config project add [path] # Add project"}),n.jsx("p",{children:"claude-config project remove <name> # Remove project"}),n.jsx("p",{children:"claude-config project # List projects"})]})]}),n.jsx(Rj,{open:f,onOpenChange:m,onAdded:k})]})}const lH=[{id:"getting-started",title:"Getting Started",icon:Li,subsections:[{id:"installation",title:"Installation"},{id:"quick-start",title:"Quick Start"},{id:"updating",title:"Updating"}]},{id:"projects",title:"Project Management",icon:ri,subsections:[{id:"project-registry",title:"Project Registry"},{id:"project-switching",title:"Switching Projects"},{id:"project-structure",title:"Project Structure"}]},{id:"file-explorer",title:"Project Explorer",icon:gr,subsections:[{id:"claude-folders",title:".claude Folders"},{id:"rules",title:"Rules"},{id:"commands",title:"Commands"},{id:"workflows",title:"Workflows"},{id:"hierarchy",title:"Configuration Hierarchy"},{id:"subprojects",title:"Sub-Projects"}]},{id:"workstreams",title:"Workstreams",icon:ri,isNew:!0,subsections:[{id:"workstreams-overview",title:"Overview"},{id:"creating-workstreams",title:"Creating Workstreams"},{id:"workstream-hooks",title:"Hook Integration"},{id:"activity-tracking",title:"Activity Tracking"},{id:"smart-sync",title:"Smart Sync"}]},{id:"plugins",title:"Plugins",icon:ns,isNew:!0,subsections:[{id:"plugins-overview",title:"Overview"},{id:"installing-plugins",title:"Installing Plugins"},{id:"plugin-marketplaces",title:"Marketplaces"}]},{id:"mcp-registry",title:"MCP Registry",icon:ns,subsections:[{id:"mcp-overview",title:"Overview"},{id:"adding-mcps",title:"Adding MCPs"},{id:"configuring-mcps",title:"Configuring MCPs"},{id:"environment-vars",title:"Environment Variables"}]},{id:"memory",title:"Memory System",icon:Ii,subsections:[{id:"memory-overview",title:"Overview"},{id:"global-memory",title:"Global Memory"},{id:"project-memory",title:"Project Memory"},{id:"memory-entries",title:"Memory Entry Types"}]},{id:"claude-settings",title:"Claude Code Settings",icon:Ps,subsections:[{id:"permissions",title:"Permissions"},{id:"model-selection",title:"Model Selection"},{id:"behavior",title:"Behavior Settings"},{id:"hooks",title:"Hooks"}]},{id:"gemini-settings",title:"Gemini CLI Settings",icon:Jt,isNew:!0,subsections:[{id:"gemini-model",title:"Model Selection"},{id:"gemini-display",title:"Display Options"},{id:"gemini-general",title:"General Settings"},{id:"gemini-sandbox",title:"Sandbox Mode"}]},{id:"antigravity-settings",title:"Antigravity Settings",icon:Sl,isNew:!0,subsections:[{id:"antigravity-security",title:"Security Policies"},{id:"antigravity-mcp",title:"MCP Servers"},{id:"antigravity-browser",title:"Browser Allowlist"},{id:"antigravity-agent",title:"Agent Mode"}]},{id:"cli",title:"CLI Reference",icon:Jt,subsections:[{id:"cli-overview",title:"Overview"},{id:"cli-commands",title:"All Commands"},{id:"daemon-mode",title:"Daemon Mode"}]},{id:"multi-tool",title:"Multi-Tool Support",icon:Gt,subsections:[{id:"supported-tools",title:"Supported Tools"},{id:"gemini-cli",title:"Gemini CLI"},{id:"antigravity",title:"Antigravity"},{id:"tool-differences",title:"Tool Differences"},{id:"enabling-tools",title:"Enabling Tools"},{id:"syncing-rules",title:"Syncing Rules"}]},{id:"keyboard",title:"Keyboard Shortcuts",icon:eM,subsections:[]},{id:"troubleshooting",title:"Troubleshooting",icon:al,subsections:[{id:"common-issues",title:"Common Issues"},{id:"getting-help",title:"Getting Help"}]}],cH={installation:{title:"Installation",content:`
|
|
632
632
|
## Installation
|
|
633
633
|
|
|
634
|
-
|
|
634
|
+
Choose your preferred installation method:
|
|
635
635
|
|
|
636
|
-
|
|
637
|
-
npm install -g @regression-io/claude-config
|
|
638
|
-
\`\`\`
|
|
636
|
+
### Option A: Desktop App (Recommended)
|
|
639
637
|
|
|
640
|
-
|
|
638
|
+
Download the native app from [GitHub Releases](https://github.com/regression-io/claude-config/releases):
|
|
641
639
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
640
|
+
| Platform | Download |
|
|
641
|
+
|----------|----------|
|
|
642
|
+
| **macOS (Apple Silicon)** | \`Claude.Config_*_aarch64.dmg\` |
|
|
643
|
+
| **macOS (Intel)** | \`Claude.Config_*_x64.dmg\` |
|
|
644
|
+
| **Windows** | \`Claude.Config_*_x64-setup.exe\` |
|
|
645
|
+
| **Linux** | \`Claude.Config_*_amd64.deb\` or \`.AppImage\` |
|
|
645
646
|
|
|
646
|
-
|
|
647
|
+
The desktop app bundles everything - no Node.js or npm required. Just download, install, and run.
|
|
647
648
|
|
|
648
|
-
|
|
649
|
-
- Works on macOS, Linux, and Windows (with some limitations)
|
|
649
|
+
### Option B: npm Package (CLI)
|
|
650
650
|
|
|
651
|
-
|
|
651
|
+
Install globally via npm:
|
|
652
652
|
|
|
653
|
-
|
|
653
|
+
\`\`\`bash
|
|
654
|
+
npm install -g @regression-io/claude-config
|
|
655
|
+
\`\`\`
|
|
656
|
+
|
|
657
|
+
**Requirements:** Node.js 18+
|
|
658
|
+
|
|
659
|
+
Verify installation:
|
|
654
660
|
|
|
655
661
|
\`\`\`bash
|
|
656
662
|
claude-config --version
|
|
657
663
|
\`\`\`
|
|
658
664
|
|
|
659
|
-
|
|
665
|
+
Then start the UI:
|
|
666
|
+
|
|
667
|
+
\`\`\`bash
|
|
668
|
+
claude-config ui
|
|
669
|
+
\`\`\`
|
|
660
670
|
`},"quick-start":{title:"Quick Start",content:`
|
|
661
671
|
## Quick Start
|
|
662
672
|
|
|
663
673
|
Claude Code works great out of the box. This tool helps you manage its configuration visually.
|
|
664
674
|
|
|
665
|
-
### 1.
|
|
675
|
+
### 1. Launch Claude Config
|
|
666
676
|
|
|
667
|
-
|
|
668
|
-
claude-config ui
|
|
669
|
-
\`\`\`
|
|
677
|
+
**Desktop App:** Double-click the app after installing from GitHub Releases.
|
|
670
678
|
|
|
671
|
-
|
|
679
|
+
**CLI:** Run \`claude-config ui\` in your terminal.
|
|
672
680
|
|
|
673
681
|
### 2. Add Your Projects
|
|
674
682
|
|
|
@@ -692,25 +700,27 @@ claude
|
|
|
692
700
|
|
|
693
701
|
Claude Code automatically reads configuration from the \`.claude/\` folder.
|
|
694
702
|
|
|
695
|
-
### Optional: Install as
|
|
703
|
+
### Optional: Install as PWA
|
|
696
704
|
|
|
697
|
-
The UI is a PWA - install it to your taskbar via Chrome/Edge's install button or Safari's Share → Add to Dock.
|
|
705
|
+
Using the CLI version? The UI is a PWA - install it to your taskbar via Chrome/Edge's install button or Safari's Share → Add to Dock.
|
|
698
706
|
`},updating:{title:"Updating",content:`
|
|
699
707
|
## Updating
|
|
700
708
|
|
|
701
|
-
###
|
|
709
|
+
### Desktop App
|
|
710
|
+
|
|
711
|
+
Download the latest version from [GitHub Releases](https://github.com/regression-io/claude-config/releases) and install over your existing installation.
|
|
712
|
+
|
|
713
|
+
### npm Package
|
|
702
714
|
|
|
703
715
|
The UI automatically checks npm for new versions. When an update is available, you'll see a notification in the Preferences page.
|
|
704
716
|
|
|
705
|
-
|
|
717
|
+
**Manual update:**
|
|
706
718
|
|
|
707
719
|
\`\`\`bash
|
|
708
720
|
npm install -g @regression-io/claude-config@latest
|
|
709
721
|
\`\`\`
|
|
710
722
|
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
If you have the UI running as a daemon, restart it:
|
|
723
|
+
**After updating (if using daemon mode):**
|
|
714
724
|
|
|
715
725
|
\`\`\`bash
|
|
716
726
|
claude-config ui stop
|
|
@@ -2383,6 +2393,14 @@ This cannot be undone.`))try{const Le=await we.deleteWorkstream(re.id);Le.succes
|
|
|
2383
2393
|
Defaulting to \`null\`.`}var z2=O2,OH=F2;const H2=C.forwardRef(({className:e,value:t,...r},s)=>n.jsx(z2,{ref:s,className:Ne("relative h-2 w-full overflow-hidden rounded-full bg-primary/20",e),...r,children:n.jsx(OH,{className:"h-full w-full flex-1 bg-primary transition-all",style:{transform:`translateX(-${100-(t||0)}%)`}})}));H2.displayName=z2.displayName;const Ha=[{id:"welcome",title:"Welcome",icon:Gt,subsections:[{id:"intro",title:"What is Claude Config?"},{id:"what-youll-learn",title:"What You'll Learn"}]},{id:"first-project",title:"Your First Project",icon:ni,subsections:[{id:"adding-project",title:"Adding a Project"},{id:"exploring-project",title:"Exploring Your Project"},{id:"claude-folder",title:"The .claude Folder"}]},{id:"rules-guide",title:"Working with Rules",icon:br,subsections:[{id:"what-are-rules",title:"What Are Rules?"},{id:"creating-rules",title:"Creating Your First Rule"},{id:"rule-tips",title:"Tips for Great Rules"}]},{id:"mcp-guide",title:"MCP Servers",icon:ns,subsections:[{id:"what-are-mcps",title:"What Are MCPs?"},{id:"adding-mcp",title:"Adding Your First MCP"},{id:"mcp-config",title:"Configuring MCPs"}]},{id:"permissions-guide",title:"Permissions",icon:Ps,subsections:[{id:"understanding-permissions",title:"How Permissions Work"},{id:"setting-permissions",title:"Setting Up Permissions"},{id:"permission-patterns",title:"Permission Patterns"}]},{id:"memory-guide",title:"Memory System",icon:Ii,subsections:[{id:"what-is-memory",title:"What is Memory?"},{id:"using-memory",title:"Using Memory"}]},{id:"plugins-guide",title:"Plugins",icon:Fi,subsections:[{id:"what-are-plugins",title:"What Are Plugins?"},{id:"installing-plugin",title:"Installing a Plugin"}]},{id:"workstreams-guide",title:"Workstreams",icon:Qa,subsections:[{id:"what-are-workstreams",title:"What Are Workstreams?"},{id:"creating-workstream",title:"Creating a Workstream"}]},{id:"multi-tool-guide",title:"Multi-Tool Support",icon:Qn,subsections:[{id:"other-tools",title:"Beyond Claude Code"},{id:"syncing-tools",title:"Syncing Between Tools"}]},{id:"next-steps",title:"Next Steps",icon:Sl,subsections:[]}],BH={intro:{title:"What is Claude Config?",content:`
|
|
2384
2394
|
Think of Claude Config as your **control center** for Claude Code (and other AI coding tools). Instead of manually editing JSON files or remembering command-line flags, you get a friendly UI to manage everything.
|
|
2385
2395
|
|
|
2396
|
+
### How are you using Claude Config?
|
|
2397
|
+
|
|
2398
|
+
**Desktop App** - Downloaded from [GitHub Releases](https://github.com/regression-io/claude-config/releases). No terminal needed!
|
|
2399
|
+
|
|
2400
|
+
**npm Package** - Installed via \`npm install -g @regression-io/claude-config\` and running \`claude-config ui\`.
|
|
2401
|
+
|
|
2402
|
+
Both work identically - this tutorial applies to either.
|
|
2403
|
+
|
|
2386
2404
|
### What can you do here?
|
|
2387
2405
|
|
|
2388
2406
|
- **Register projects** you're working on
|
|
@@ -3217,7 +3235,7 @@ Click **"Create MCP"** to build your own MCP server. Great for connecting Claude
|
|
|
3217
3235
|
- \`Cmd/Ctrl + ,\` - Open preferences
|
|
3218
3236
|
- \`Cmd/Ctrl + R\` - Refresh
|
|
3219
3237
|
|
|
3220
|
-
**
|
|
3238
|
+
**For CLI Users**
|
|
3221
3239
|
\`\`\`bash
|
|
3222
3240
|
claude-config ui # Start the UI
|
|
3223
3241
|
claude-config ui stop # Stop the daemon
|
|
@@ -3225,6 +3243,8 @@ claude-config apply # Apply config to current project
|
|
|
3225
3243
|
claude-config --help # See all commands
|
|
3226
3244
|
\`\`\`
|
|
3227
3245
|
|
|
3246
|
+
*Desktop app users: These commands are optional - the app handles everything automatically.*
|
|
3247
|
+
|
|
3228
3248
|
### Thank You!
|
|
3229
3249
|
|
|
3230
3250
|
Thanks for using Claude Config. We built this to make working with AI coding tools easier and more powerful.
|
package/ui/dist/index.html
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
<!-- PWA Manifest -->
|
|
21
21
|
<link rel="manifest" href="/manifest.json">
|
|
22
|
-
<script type="module" crossorigin src="/assets/index-
|
|
22
|
+
<script type="module" crossorigin src="/assets/index-BGKsqCBk.js"></script>
|
|
23
23
|
<link rel="stylesheet" crossorigin href="/assets/index-1RcqzPnS.css">
|
|
24
24
|
</head>
|
|
25
25
|
<body>
|
package/ui/routes/subprojects.js
CHANGED