coder-config 0.40.5 → 0.40.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/cli.js CHANGED
@@ -16,10 +16,10 @@ const args = process.argv.slice(2);
16
16
  const command = args[0] || '';
17
17
 
18
18
  // PID file for daemon mode
19
- const PID_FILE = path.join(os.homedir(), '.claude-config', 'ui.pid');
19
+ const PID_FILE = path.join(os.homedir(), '.coder-config', 'ui.pid');
20
20
 
21
21
  // LaunchAgent for macOS auto-start
22
- const LAUNCH_AGENT_LABEL = 'io.regression.claude-config';
22
+ const LAUNCH_AGENT_LABEL = 'io.regression.coder-config';
23
23
  const LAUNCH_AGENT_PATH = path.join(os.homedir(), 'Library', 'LaunchAgents', `${LAUNCH_AGENT_LABEL}.plist`);
24
24
 
25
25
  // UI command needs special handling (starts web server with better error handling)
@@ -108,10 +108,10 @@ function checkDaemonStatus() {
108
108
  // Check if LaunchAgent exists but not running
109
109
  if (process.platform === 'darwin' && fs.existsSync(LAUNCH_AGENT_PATH)) {
110
110
  console.log('Daemon: not running (LaunchAgent installed but stopped)');
111
- console.log('Run: launchctl load ~/Library/LaunchAgents/io.regression.claude-config.plist');
111
+ console.log('Run: launchctl load ~/Library/LaunchAgents/io.regression.coder-config.plist');
112
112
  } else {
113
113
  console.log('Daemon: not running');
114
- console.log('Run: claude-config ui');
114
+ console.log('Run: coder-config ui');
115
115
  }
116
116
  }
117
117
 
@@ -122,10 +122,10 @@ function installLaunchAgent() {
122
122
  process.exit(1);
123
123
  }
124
124
 
125
- // Find the claude-config executable
125
+ // Find the coder-config executable
126
126
  let execPath;
127
127
  try {
128
- execPath = execSync('which claude-config', { encoding: 'utf8' }).trim();
128
+ execPath = execSync('which coder-config', { encoding: 'utf8' }).trim();
129
129
  } catch {
130
130
  execPath = path.join(__dirname, 'cli.js');
131
131
  }
@@ -161,9 +161,9 @@ function installLaunchAgent() {
161
161
  <key>KeepAlive</key>
162
162
  <true/>
163
163
  <key>StandardOutPath</key>
164
- <string>${path.join(os.homedir(), '.claude-config', 'ui.log')}</string>
164
+ <string>${path.join(os.homedir(), '.coder-config', 'ui.log')}</string>
165
165
  <key>StandardErrorPath</key>
166
- <string>${path.join(os.homedir(), '.claude-config', 'ui.log')}</string>
166
+ <string>${path.join(os.homedir(), '.coder-config', 'ui.log')}</string>
167
167
  <key>WorkingDirectory</key>
168
168
  <string>${os.homedir()}</string>
169
169
  </dict>
@@ -176,7 +176,7 @@ function installLaunchAgent() {
176
176
  }
177
177
 
178
178
  // Ensure log directory exists
179
- const logDir = path.join(os.homedir(), '.claude-config');
179
+ const logDir = path.join(os.homedir(), '.coder-config');
180
180
  if (!fs.existsSync(logDir)) {
181
181
  fs.mkdirSync(logDir, { recursive: true });
182
182
  }
@@ -223,8 +223,8 @@ function installLaunchAgent() {
223
223
  console.log('Your PWA can now connect anytime!');
224
224
  console.log('');
225
225
  console.log('Commands:');
226
- console.log(' claude-config ui status - Check if running');
227
- console.log(' claude-config ui uninstall - Remove auto-start');
226
+ console.log(' coder-config ui status - Check if running');
227
+ console.log(' coder-config ui uninstall - Remove auto-start');
228
228
  }
229
229
 
230
230
  function uninstallLaunchAgent() {
@@ -249,7 +249,7 @@ function uninstallLaunchAgent() {
249
249
 
250
250
  console.log('✓ Removed auto-start for Coder Config UI');
251
251
  console.log('');
252
- console.log('To start manually: claude-config ui');
252
+ console.log('To start manually: coder-config ui');
253
253
  }
254
254
 
255
255
  function startDaemon(flags) {
@@ -260,7 +260,7 @@ function startDaemon(flags) {
260
260
  process.kill(existingPid, 0);
261
261
  console.log(`Daemon already running (PID: ${existingPid})`);
262
262
  console.log(`UI available at: http://localhost:${flags.port}`);
263
- console.log('Use "claude-config ui stop" to stop the daemon');
263
+ console.log('Use "coder-config ui stop" to stop the daemon');
264
264
  return;
265
265
  } catch (err) {
266
266
  // Process not running, clean up stale PID file
@@ -306,8 +306,8 @@ function startDaemon(flags) {
306
306
  console.log(`UI available at: http://localhost:${flags.port}`);
307
307
  console.log(`Logs: ${logFile}`);
308
308
  console.log('\nCommands:');
309
- console.log(' claude-config ui status - Check daemon status');
310
- console.log(' claude-config ui stop - Stop the daemon');
309
+ console.log(' coder-config ui status - Check daemon status');
310
+ console.log(' coder-config ui stop - Stop the daemon');
311
311
  }
312
312
 
313
313
  function startUI() {
@@ -407,7 +407,7 @@ function startUI() {
407
407
  process.on('uncaughtException', (err) => {
408
408
  if (err.code === 'EADDRINUSE') {
409
409
  console.error(`\nError: Port ${flags.port} is already in use.`);
410
- console.error(`Try a different port: claude-config ui --port ${flags.port + 1}`);
410
+ console.error(`Try a different port: coder-config ui --port ${flags.port + 1}`);
411
411
  process.exit(1);
412
412
  } else if (err.code === 'EACCES') {
413
413
  console.error(`\nError: Permission denied for port ${flags.port}.`);
package/config-loader.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * Claude Code Configuration Loader
4
+ * Coder Config - Configuration Loader
5
5
  *
6
6
  * Uses standard JSON format throughout - no custom YAML.
7
7
  * Copy/paste MCP configs from anywhere.
8
8
  *
9
9
  * Files:
10
- * ~/.claude-config/mcp-registry.json - All available MCPs (copy/paste friendly)
10
+ * ~/.coder-config/mcp-registry.json - All available MCPs (copy/paste friendly)
11
11
  * project/.claude/mcps.json - Which MCPs this project uses
12
12
  * project/.claude/rules/*.md - Project rules
13
13
  * project/.claude/commands/*.md - Project commands
@@ -34,7 +34,7 @@ const { runCli } = require('./lib/cli');
34
34
 
35
35
  class ClaudeConfigManager {
36
36
  constructor() {
37
- this.installDir = process.env.CLAUDE_CONFIG_HOME || path.join(process.env.HOME || '', '.claude-config');
37
+ this.installDir = process.env.CLAUDE_CONFIG_HOME || path.join(process.env.HOME || '', '.coder-config');
38
38
 
39
39
  // Look for registry in multiple places
40
40
  const possiblePaths = [
@@ -180,23 +180,23 @@ class ClaudeConfigManager {
180
180
  console.log(`\nUpdate available: v${VERSION} → v${npmVersion}`);
181
181
 
182
182
  if (checkOnly) {
183
- console.log('\nRun "claude-config update" to install the update.');
183
+ console.log('\nRun "coder-config update" to install the update.');
184
184
  return true;
185
185
  }
186
186
 
187
187
  // Perform npm update
188
188
  console.log('\nUpdating via npm...');
189
189
  try {
190
- execSync('npm install -g @regression-io/claude-config@latest', {
190
+ execSync('npm install -g coder-config@latest', {
191
191
  stdio: 'inherit',
192
192
  timeout: 120000
193
193
  });
194
194
  console.log(`\n✅ Updated to v${npmVersion}`);
195
- console.log('Run "claude-config ui" to restart the UI with the new version.');
195
+ console.log('Run "coder-config ui" to restart the UI with the new version.');
196
196
  return true;
197
197
  } catch (error) {
198
198
  console.error('Update failed:', error.message);
199
- console.log('\nTry manually: npm install -g @regression-io/claude-config@latest');
199
+ console.log('\nTry manually: npm install -g coder-config@latest');
200
200
  return false;
201
201
  }
202
202
  }
@@ -204,7 +204,7 @@ class ClaudeConfigManager {
204
204
  // Fetch latest version from npm registry
205
205
  _fetchNpmVersion(https) {
206
206
  return new Promise((resolve) => {
207
- const url = 'https://registry.npmjs.org/@regression-io/claude-config/latest';
207
+ const url = 'https://registry.npmjs.org/coder-config/latest';
208
208
  https.get(url, (res) => {
209
209
  let data = '';
210
210
  res.on('data', chunk => data += chunk);
@@ -245,7 +245,7 @@ class ClaudeConfigManager {
245
245
  const files = [
246
246
  'config-loader.js',
247
247
  'shared/mcp-registry.json',
248
- 'shell/claude-config.zsh'
248
+ 'shell/coder-config.zsh'
249
249
  ];
250
250
 
251
251
  let updated = 0;
@@ -1,12 +1,12 @@
1
1
  #!/bin/bash
2
2
  # Codex CLI Workstream Injection Hook
3
- # Install: claude-config workstream install-hook --codex
3
+ # Install: coder-config workstream install-hook --codex
4
4
  #
5
5
  # This hook injects workstream context at session start, restricting
6
6
  # the agent to work within specified directories.
7
7
 
8
- # Exit silently if claude-config isn't available
9
- if ! command -v claude-config &> /dev/null; then
8
+ # Exit silently if coder-config isn't available
9
+ if ! command -v coder-config &> /dev/null; then
10
10
  echo '{"decision": "allow"}'
11
11
  exit 0
12
12
  fi
@@ -14,15 +14,16 @@ fi
14
14
  # Read input from stdin (Codex passes JSON)
15
15
  input=$(cat)
16
16
 
17
- # Check for active workstream via env var
18
- if [ -z "$CLAUDE_WORKSTREAM" ]; then
17
+ # Check for active workstream via env var (CODER_WORKSTREAM preferred, CLAUDE_WORKSTREAM legacy)
18
+ WORKSTREAM="${CODER_WORKSTREAM:-$CLAUDE_WORKSTREAM}"
19
+ if [ -z "$WORKSTREAM" ]; then
19
20
  # No workstream active, allow without context
20
21
  echo '{"decision": "allow"}'
21
22
  exit 0
22
23
  fi
23
24
 
24
25
  # Get workstream injection content
25
- context=$(claude-config workstream inject --silent 2>/dev/null)
26
+ context=$(coder-config workstream inject --silent 2>/dev/null)
26
27
 
27
28
  if [ -n "$context" ]; then
28
29
  # Escape the context for JSON
@@ -5,8 +5,8 @@
5
5
  # This hook injects workstream context at session start, restricting
6
6
  # the agent to work within specified directories.
7
7
 
8
- # Exit silently if claude-config isn't available
9
- if ! command -v claude-config &> /dev/null; then
8
+ # Exit silently if coder-config isn't available
9
+ if ! command -v coder-config &> /dev/null; then
10
10
  echo '{"decision": "allow"}'
11
11
  exit 0
12
12
  fi
@@ -14,15 +14,16 @@ fi
14
14
  # Read input from stdin (Gemini passes JSON)
15
15
  input=$(cat)
16
16
 
17
- # Check for active workstream via env var
18
- if [ -z "$CLAUDE_WORKSTREAM" ]; then
17
+ # Check for active workstream via env var (CODER_WORKSTREAM preferred, CLAUDE_WORKSTREAM legacy)
18
+ WORKSTREAM="${CODER_WORKSTREAM:-$CLAUDE_WORKSTREAM}"
19
+ if [ -z "$WORKSTREAM" ]; then
19
20
  # No workstream active, allow without context
20
21
  echo '{"decision": "allow"}'
21
22
  exit 0
22
23
  fi
23
24
 
24
25
  # Get workstream injection content
25
- context=$(claude-config workstream inject --silent 2>/dev/null)
26
+ context=$(coder-config workstream inject --silent 2>/dev/null)
26
27
 
27
28
  if [ -n "$context" ]; then
28
29
  # Escape the context for JSON
package/lib/apply.js CHANGED
@@ -25,7 +25,7 @@ function apply(registryPath, projectDir = null) {
25
25
 
26
26
  if (configLocations.length === 0) {
27
27
  console.error(`No .claude/mcps.json found in ${dir} or parent directories`);
28
- console.error('Run: claude-config init');
28
+ console.error('Run: coder-config init');
29
29
  return false;
30
30
  }
31
31
 
package/lib/cli.js CHANGED
@@ -138,7 +138,7 @@ function runCli(manager) {
138
138
  } else if (args[1] === 'check-path') {
139
139
  const targetPath = args[2];
140
140
  if (!targetPath) {
141
- console.error('Usage: claude-config workstream check-path <path>');
141
+ console.error('Usage: coder-config workstream check-path <path>');
142
142
  process.exit(1);
143
143
  }
144
144
  const silent = args.includes('--silent') || args.includes('-s');
@@ -230,7 +230,7 @@ Workstream Commands:
230
230
  workstream install-hook --all Install for all supported tools
231
231
 
232
232
  Per-session activation (enables parallel work):
233
- export CLAUDE_WORKSTREAM=<name-or-id>
233
+ export CODER_WORKSTREAM=<name-or-id>
234
234
 
235
235
  Registry Commands:
236
236
  registry List MCPs in global registry
package/lib/constants.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * Constants and tool path configurations
3
3
  */
4
4
 
5
- const VERSION = '0.40.5';
5
+ const VERSION = '0.40.8';
6
6
 
7
7
  // Tool-specific path configurations
8
8
  const TOOL_PATHS = {
package/lib/env.js CHANGED
@@ -15,7 +15,7 @@ function envList(projectDir = process.cwd()) {
15
15
 
16
16
  if (!fs.existsSync(envPath)) {
17
17
  console.log(' No .env file found.');
18
- console.log(' Create with: claude-config env set <KEY> <value>\n');
18
+ console.log(' Create with: coder-config env set <KEY> <value>\n');
19
19
  return;
20
20
  }
21
21
 
@@ -41,7 +41,7 @@ function envList(projectDir = process.cwd()) {
41
41
  */
42
42
  function envSet(key, value, projectDir = process.cwd()) {
43
43
  if (!key || value === undefined) {
44
- console.error('Usage: claude-config env set <KEY> <value>');
44
+ console.error('Usage: coder-config env set <KEY> <value>');
45
45
  return;
46
46
  }
47
47
 
@@ -81,7 +81,7 @@ function envSet(key, value, projectDir = process.cwd()) {
81
81
  */
82
82
  function envUnset(key, projectDir = process.cwd()) {
83
83
  if (!key) {
84
- console.error('Usage: claude-config env unset <KEY>');
84
+ console.error('Usage: coder-config env unset <KEY>');
85
85
  return;
86
86
  }
87
87
 
package/lib/init.js CHANGED
@@ -51,9 +51,9 @@ function init(registryPath, projectDir = null) {
51
51
  console.log('\n✅ Project initialized!');
52
52
  console.log('Next steps:');
53
53
  console.log(' 1. Edit .claude/mcps.json to customize MCPs');
54
- console.log(' 2. Run: claude-config ui');
54
+ console.log(' 2. Run: coder-config ui');
55
55
  console.log(' (Plugins marketplace auto-installs on first use)');
56
- console.log(' 3. Run: claude-config apply\n');
56
+ console.log(' 3. Run: coder-config apply\n');
57
57
 
58
58
  return true;
59
59
  }
package/lib/mcps.js CHANGED
@@ -37,7 +37,7 @@ function list(registryPath) {
37
37
  */
38
38
  function add(registryPath, installDir, mcpNames) {
39
39
  if (!mcpNames || mcpNames.length === 0) {
40
- console.error('Usage: claude-config add <mcp-name> [mcp-name...]');
40
+ console.error('Usage: coder-config add <mcp-name> [mcp-name...]');
41
41
  return false;
42
42
  }
43
43
 
@@ -46,7 +46,7 @@ function add(registryPath, installDir, mcpNames) {
46
46
  let config = loadJson(configPath);
47
47
 
48
48
  if (!config) {
49
- console.error('No .claude/mcps.json found. Run: claude-config init');
49
+ console.error('No .claude/mcps.json found. Run: coder-config init');
50
50
  return false;
51
51
  }
52
52
 
@@ -77,11 +77,11 @@ function add(registryPath, installDir, mcpNames) {
77
77
  }
78
78
  if (notFound.length) {
79
79
  console.log(`Not in registry: ${notFound.join(', ')}`);
80
- console.log(' (Use "claude-config list" to see available MCPs)');
80
+ console.log(' (Use "coder-config list" to see available MCPs)');
81
81
  }
82
82
 
83
83
  if (added.length) {
84
- console.log('\nRun "claude-config apply" to regenerate .mcp.json');
84
+ console.log('\nRun "coder-config apply" to regenerate .mcp.json');
85
85
  }
86
86
 
87
87
  return added.length > 0;
@@ -92,7 +92,7 @@ function add(registryPath, installDir, mcpNames) {
92
92
  */
93
93
  function remove(installDir, mcpNames) {
94
94
  if (!mcpNames || mcpNames.length === 0) {
95
- console.error('Usage: claude-config remove <mcp-name> [mcp-name...]');
95
+ console.error('Usage: coder-config remove <mcp-name> [mcp-name...]');
96
96
  return false;
97
97
  }
98
98
 
@@ -123,7 +123,7 @@ function remove(installDir, mcpNames) {
123
123
  if (removed.length) {
124
124
  saveJson(configPath, config);
125
125
  console.log(`✓ Removed: ${removed.join(', ')}`);
126
- console.log('\nRun "claude-config apply" to regenerate .mcp.json');
126
+ console.log('\nRun "coder-config apply" to regenerate .mcp.json');
127
127
  }
128
128
  if (notFound.length) {
129
129
  console.log(`Not in project: ${notFound.join(', ')}`);
package/lib/memory.js CHANGED
@@ -46,7 +46,7 @@ function memoryList(projectDir = process.cwd()) {
46
46
  }
47
47
  }
48
48
  } else {
49
- console.log(' Not initialized. Run: claude-config memory init');
49
+ console.log(' Not initialized. Run: coder-config memory init');
50
50
  }
51
51
  console.log();
52
52
  }
@@ -88,7 +88,7 @@ function memoryInit(projectDir = process.cwd()) {
88
88
  */
89
89
  function memoryAdd(type, content, projectDir = process.cwd()) {
90
90
  if (!type || !content) {
91
- console.error('Usage: claude-config memory add <type> "<content>"');
91
+ console.error('Usage: coder-config memory add <type> "<content>"');
92
92
  console.log('\nTypes:');
93
93
  console.log(' Global: preference, correction, fact');
94
94
  console.log(' Project: context, pattern, decision, issue, history');
@@ -147,7 +147,7 @@ function memoryAdd(type, content, projectDir = process.cwd()) {
147
147
  */
148
148
  function memorySearch(query, projectDir = process.cwd()) {
149
149
  if (!query) {
150
- console.error('Usage: claude-config memory search <query>');
150
+ console.error('Usage: coder-config memory search <query>');
151
151
  return;
152
152
  }
153
153
 
package/lib/projects.js CHANGED
@@ -44,7 +44,7 @@ function projectList(installDir) {
44
44
 
45
45
  if (registry.projects.length === 0) {
46
46
  console.log('\nNo projects registered.');
47
- console.log('Add one with: claude-config project add [path]\n');
47
+ console.log('Add one with: coder-config project add [path]\n');
48
48
  return;
49
49
  }
50
50
 
@@ -101,7 +101,7 @@ function projectAdd(installDir, projectPath = process.cwd(), name = null) {
101
101
  */
102
102
  function projectRemove(installDir, nameOrPath) {
103
103
  if (!nameOrPath) {
104
- console.error('Usage: claude-config project remove <name|path>');
104
+ console.error('Usage: coder-config project remove <name|path>');
105
105
  return false;
106
106
  }
107
107
 
package/lib/registry.js CHANGED
@@ -14,7 +14,7 @@ function registryList(registryPath) {
14
14
 
15
15
  if (names.length === 0) {
16
16
  console.log('\nNo MCPs in global registry.');
17
- console.log('Add one with: claude-config registry add <name> \'{"command":"..."}\'');
17
+ console.log('Add one with: coder-config registry add <name> \'{"command":"..."}\'');
18
18
  return [];
19
19
  }
20
20
 
@@ -34,7 +34,7 @@ function registryList(registryPath) {
34
34
  */
35
35
  function registryAdd(registryPath, name, configJson) {
36
36
  if (!name || !configJson) {
37
- console.error('Usage: claude-config registry add <name> \'{"command":"...","args":[...]}\'');
37
+ console.error('Usage: coder-config registry add <name> \'{"command":"...","args":[...]}\'');
38
38
  return false;
39
39
  }
40
40
 
@@ -59,7 +59,7 @@ function registryAdd(registryPath, name, configJson) {
59
59
  */
60
60
  function registryRemove(registryPath, name) {
61
61
  if (!name) {
62
- console.error('Usage: claude-config registry remove <name>');
62
+ console.error('Usage: coder-config registry remove <name>');
63
63
  return false;
64
64
  }
65
65
 
@@ -47,7 +47,7 @@ function workstreamList(installDir) {
47
47
 
48
48
  if (data.workstreams.length === 0) {
49
49
  console.log('\nNo workstreams defined.');
50
- console.log('Create one with: claude-config workstream create "Name"\n');
50
+ console.log('Create one with: coder-config workstream create "Name"\n');
51
51
  return data.workstreams;
52
52
  }
53
53
 
@@ -72,7 +72,7 @@ function workstreamList(installDir) {
72
72
  */
73
73
  function workstreamCreate(installDir, name, projects = [], rules = '') {
74
74
  if (!name) {
75
- console.error('Usage: claude-config workstream create "Name"');
75
+ console.error('Usage: coder-config workstream create "Name"');
76
76
  return null;
77
77
  }
78
78
 
@@ -258,7 +258,8 @@ function getActiveWorkstream(installDir) {
258
258
  const data = loadWorkstreams(installDir);
259
259
 
260
260
  // Check env var first (per-session activation)
261
- const envWorkstream = process.env.CLAUDE_WORKSTREAM;
261
+ // Support both CODER_WORKSTREAM (preferred) and CLAUDE_WORKSTREAM (legacy)
262
+ const envWorkstream = process.env.CODER_WORKSTREAM || process.env.CLAUDE_WORKSTREAM;
262
263
  if (envWorkstream) {
263
264
  const ws = data.workstreams.find(
264
265
  w => w.id === envWorkstream || w.name.toLowerCase() === envWorkstream.toLowerCase()
@@ -396,18 +397,18 @@ function workstreamInstallHook() {
396
397
 
397
398
  const hookContent = `#!/bin/bash
398
399
  # Claude Code pre-prompt hook for workstream injection
399
- # Installed by claude-config
400
+ # Installed by coder-config
400
401
 
401
402
  # Check for active workstream via env var or file
402
- if [ -n "$CLAUDE_WORKSTREAM" ] || claude-config workstream active >/dev/null 2>&1; then
403
- claude-config workstream inject --silent
403
+ if [ -n "$CODER_WORKSTREAM" ] || coder-config workstream active >/dev/null 2>&1; then
404
+ coder-config workstream inject --silent
404
405
  fi
405
406
  `;
406
407
 
407
408
  // Check if hook already exists
408
409
  if (fs.existsSync(hookPath)) {
409
410
  const existing = fs.readFileSync(hookPath, 'utf8');
410
- if (existing.includes('claude-config workstream inject')) {
411
+ if (existing.includes('coder-config workstream inject')) {
411
412
  console.log('✓ Workstream hook already installed');
412
413
  return true;
413
414
  }
@@ -423,9 +424,9 @@ fi
423
424
  console.log('\nWorkstream injection is now active. When a workstream is active,');
424
425
  console.log('Claude will see the restriction and context at the start of each prompt.');
425
426
  console.log('\nTo activate a workstream for this session:');
426
- console.log(' export CLAUDE_WORKSTREAM=<name-or-id>');
427
+ console.log(' export CODER_WORKSTREAM=<name-or-id>');
427
428
  console.log('\nOr use the global active workstream:');
428
- console.log(' claude-config workstream use <name>');
429
+ console.log(' coder-config workstream use <name>');
429
430
 
430
431
  return true;
431
432
  }
@@ -452,13 +453,13 @@ function workstreamInstallHookGemini() {
452
453
  }
453
454
  }
454
455
 
455
- // Find the hook script path (relative to claude-config installation)
456
+ // Find the hook script path (relative to coder-config installation)
456
457
  const hookScriptPath = path.join(__dirname, '..', 'hooks', 'gemini-workstream.sh');
457
458
 
458
459
  // Check if hook already installed
459
460
  const existingHooks = settings.hooks?.SessionStart || [];
460
461
  const alreadyInstalled = existingHooks.some(h =>
461
- h.name === 'claude-config-workstream' || (h.command && h.command.includes('gemini-workstream'))
462
+ h.name === 'coder-config-workstream' || (h.command && h.command.includes('gemini-workstream'))
462
463
  );
463
464
 
464
465
  if (alreadyInstalled) {
@@ -478,7 +479,7 @@ function workstreamInstallHookGemini() {
478
479
  }
479
480
 
480
481
  settings.hooks.SessionStart.push({
481
- name: 'claude-config-workstream',
482
+ name: 'coder-config-workstream',
482
483
  type: 'command',
483
484
  command: hookScriptPath,
484
485
  description: 'Inject workstream context and restrictions',
@@ -495,7 +496,7 @@ function workstreamInstallHookGemini() {
495
496
  console.log('When a workstream is active, Gemini will see the restriction');
496
497
  console.log('and context at the start of each session.');
497
498
  console.log('\nTo activate a workstream for this session:');
498
- console.log(' export CLAUDE_WORKSTREAM=<name-or-id>');
499
+ console.log(' export CODER_WORKSTREAM=<name-or-id>');
499
500
 
500
501
  return true;
501
502
  }
@@ -534,15 +535,15 @@ function workstreamInstallHookCodex() {
534
535
  // Check if hook already exists with our content
535
536
  if (fs.existsSync(targetHookPath)) {
536
537
  const existing = fs.readFileSync(targetHookPath, 'utf8');
537
- if (existing.includes('claude-config workstream inject')) {
538
+ if (existing.includes('coder-config workstream inject')) {
538
539
  console.log('✓ Workstream hook already installed for Codex CLI');
539
540
  return true;
540
541
  }
541
542
  // Append to existing hook
542
543
  const appendContent = `
543
- # claude-config workstream injection
544
- if [ -n "$CLAUDE_WORKSTREAM" ] && command -v claude-config &> /dev/null; then
545
- claude-config workstream inject --silent
544
+ # coder-config workstream injection
545
+ if [ -n "$CODER_WORKSTREAM" ] && command -v coder-config &> /dev/null; then
546
+ coder-config workstream inject --silent
546
547
  fi
547
548
  `;
548
549
  fs.appendFileSync(targetHookPath, appendContent);
@@ -551,11 +552,11 @@ fi
551
552
  // Create new hook
552
553
  const hookContent = `#!/bin/bash
553
554
  # Codex CLI pre-session hook for workstream injection
554
- # Installed by claude-config
555
+ # Installed by coder-config
555
556
 
556
557
  # Check for active workstream via env var
557
- if [ -n "$CLAUDE_WORKSTREAM" ] && command -v claude-config &> /dev/null; then
558
- claude-config workstream inject --silent
558
+ if [ -n "$CODER_WORKSTREAM" ] && command -v coder-config &> /dev/null; then
559
+ coder-config workstream inject --silent
559
560
  fi
560
561
  `;
561
562
  fs.writeFileSync(targetHookPath, hookContent);
@@ -568,7 +569,7 @@ fi
568
569
  console.log('When a workstream is active, Codex will see the restriction');
569
570
  console.log('and context at the start of each session.');
570
571
  console.log('\nTo activate a workstream for this session:');
571
- console.log(' export CLAUDE_WORKSTREAM=<name-or-id>');
572
+ console.log(' export CODER_WORKSTREAM=<name-or-id>');
572
573
 
573
574
  return true;
574
575
  }
@@ -578,9 +579,9 @@ fi
578
579
  */
579
580
  function workstreamDeactivate() {
580
581
  console.log('To deactivate the workstream for this session, run:');
581
- console.log(' unset CLAUDE_WORKSTREAM');
582
+ console.log(' unset CODER_WORKSTREAM');
582
583
  console.log('\nOr to clear the global active workstream:');
583
- console.log(' claude-config workstream use --clear');
584
+ console.log(' coder-config workstream use --clear');
584
585
  return true;
585
586
  }
586
587
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coder-config",
3
- "version": "0.40.5",
3
+ "version": "0.40.8",
4
4
  "description": "Configuration manager for AI coding tools - Claude Code, Gemini CLI, Codex CLI, Antigravity. Manage MCPs, rules, permissions, memory, and workstreams.",
5
5
  "author": "regression.io",
6
6
  "main": "config-loader.js",
@@ -41,7 +41,7 @@ function getVersionFromFile(filePath) {
41
41
  */
42
42
  function fetchNpmVersion() {
43
43
  return new Promise((resolve) => {
44
- const url = 'https://registry.npmjs.org/@regression-io/claude-config/latest';
44
+ const url = 'https://registry.npmjs.org/coder-config/latest';
45
45
  const req = https.get(url, (res) => {
46
46
  let data = '';
47
47
  res.on('data', chunk => data += chunk);
@@ -167,7 +167,7 @@ async function performNpmUpdate(targetVersion) {
167
167
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
168
168
  try {
169
169
  // Use npm install @latest instead of npm update for reliable updates
170
- execSync('npm install -g @regression-io/claude-config@latest', {
170
+ execSync('npm install -g coder-config@latest', {
171
171
  stdio: 'pipe',
172
172
  timeout: 120000
173
173
  });
@@ -170,9 +170,12 @@ function installWorkstreamHook() {
170
170
  const hookPath = path.join(hookDir, 'pre-prompt.sh');
171
171
 
172
172
  const hookCode = `
173
- # Workstream rule injection (added by claude-config)
174
- if command -v claude-config &> /dev/null; then
175
- claude-config workstream inject --silent
173
+ # Workstream rule injection (added by coder-config)
174
+ # Supports both CODER_WORKSTREAM (preferred) and CLAUDE_WORKSTREAM (legacy)
175
+ if [ -n "$CODER_WORKSTREAM" ] || [ -n "$CLAUDE_WORKSTREAM" ]; then
176
+ if command -v coder-config &> /dev/null; then
177
+ coder-config workstream inject --silent
178
+ fi
176
179
  fi
177
180
  `;
178
181