@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 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
- ### New Users
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 now starts automatically on login. Install as a PWA from your browser for app-like access.
62
+ The server starts automatically on login. Install as a PWA from your browser for app-like access.
63
+
64
+ ### Updating
40
65
 
41
- ### Existing Users (Updating)
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 (Tauri)
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
- For a true desktop experience without running CLI commands, you can build a native macOS app.
551
+ ### Download
534
552
 
535
- ### Building the Desktop App
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
@@ -2,7 +2,7 @@
2
2
  * Constants and tool path configurations
3
3
  */
4
4
 
5
- const VERSION = '0.38.6';
5
+ const VERSION = '0.38.8';
6
6
 
7
7
  // Tool-specific path configurations
8
8
  const TOOL_PATHS = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@regression-io/claude-config",
3
- "version": "0.38.6",
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
- Install claude-config globally via npm:
634
+ Choose your preferred installation method:
635
635
 
636
- \`\`\`bash
637
- npm install -g @regression-io/claude-config
638
- \`\`\`
636
+ ### Option A: Desktop App (Recommended)
639
637
 
640
- Or install from GitHub directly:
638
+ Download the native app from [GitHub Releases](https://github.com/regression-io/claude-config/releases):
641
639
 
642
- \`\`\`bash
643
- npm install -g github:regression-io/claude-config
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
- ### Requirements
647
+ The desktop app bundles everything - no Node.js or npm required. Just download, install, and run.
647
648
 
648
- - **Node.js 18+** is required
649
- - Works on macOS, Linux, and Windows (with some limitations)
649
+ ### Option B: npm Package (CLI)
650
650
 
651
- ### Verify Installation
651
+ Install globally via npm:
652
652
 
653
- After installation, verify it's working:
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
- This should display the version number and installation paths.
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. Start the Config UI
675
+ ### 1. Launch Claude Config
666
676
 
667
- \`\`\`bash
668
- claude-config ui
669
- \`\`\`
677
+ **Desktop App:** Double-click the app after installing from GitHub Releases.
670
678
 
671
- This opens a web UI for managing Claude Code settings.
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 App
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
- ### Automatic Update Detection
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
- ### Manual Update
717
+ **Manual update:**
706
718
 
707
719
  \`\`\`bash
708
720
  npm install -g @regression-io/claude-config@latest
709
721
  \`\`\`
710
722
 
711
- ### After Updating
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
- **Useful CLI Commands**
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.
@@ -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-DTADVG7R.js"></script>
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>
@@ -119,7 +119,7 @@ function addManualSubproject(config, saveConfig, projectDir, subprojectDir) {
119
119
  saveConfig(config);
120
120
  }
121
121
 
122
- return { success: true };
122
+ return { success: true, resolvedPath: resolvedSubproject };
123
123
  }
124
124
 
125
125
  /**