@hustle-together/api-dev-tools 1.2.1 → 1.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.
Files changed (3) hide show
  1. package/README.md +2 -2
  2. package/bin/cli.js +27 -27
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -35,7 +35,7 @@ Three Python hooks that provide **real programmatic guarantees**:
35
35
  ### State Tracking
36
36
  - **`.claude/api-dev-state.json`** - Persistent state file tracking all workflow progress
37
37
 
38
- ### MCP Servers (Auto-configured in `.mcp.json`)
38
+ ### MCP Servers (Auto-installed via `claude mcp add`)
39
39
  - **Context7** - Fetches LIVE documentation from library source code (not training data)
40
40
  - **GitHub** - Read/create issues, pull requests, and access repository data (requires `GITHUB_PERSONAL_ACCESS_TOKEN`)
41
41
 
@@ -432,7 +432,7 @@ Required for `/pr` and `/issue` commands to work with GitHub MCP tools.
432
432
  export GITHUB_PERSONAL_ACCESS_TOKEN=ghp_your_token_here
433
433
  ```
434
434
 
435
- The MCP configuration is written to `.mcp.json` in your project root and will be picked up by Claude Code on restart. First use will prompt for security approval.
435
+ The installer runs `claude mcp add` commands directly, which registers the servers in your Claude Code config (`~/.claude.json`). Restart Claude Code after installation for MCP tools to be available.
436
436
 
437
437
  ## šŸ“– Documentation
438
438
 
package/bin/cli.js CHANGED
@@ -234,40 +234,40 @@ function main() {
234
234
  }
235
235
 
236
236
  // ========================================
237
- // 5. Install/Merge MCP Servers (Context7, GitHub)
237
+ // 5. Install MCP Servers via CLI (Context7, GitHub)
238
238
  // ========================================
239
- // NOTE: Claude Code uses .mcp.json in project root, NOT .claude/mcp-servers.json
240
- const mcpSource = path.join(sourceTemplatesDir, 'mcp-servers.json');
241
- const mcpDest = path.join(targetDir, '.mcp.json');
239
+ // NOTE: We use `claude mcp add` directly because .mcp.json requires manual approval
240
+ // and doesn't auto-load. Using the CLI ensures servers are immediately available.
241
+ log('\nšŸ”Œ Configuring MCP servers:', 'cyan');
242
242
 
243
- if (fs.existsSync(mcpSource)) {
244
- log('\nšŸ”Œ Configuring MCP servers:', 'cyan');
243
+ const { execSync } = require('child_process');
245
244
 
245
+ const mcpServers = [
246
+ { name: 'context7', command: 'npx -y @upstash/context7-mcp', description: 'Live documentation from library source code' },
247
+ { name: 'github', command: 'npx -y @modelcontextprotocol/server-github', description: 'GitHub issues, PRs, and repository access' }
248
+ ];
249
+
250
+ for (const server of mcpServers) {
246
251
  try {
247
- const newMcp = JSON.parse(fs.readFileSync(mcpSource, 'utf8'));
248
-
249
- if (fs.existsSync(mcpDest)) {
250
- // Merge with existing MCP config
251
- const existingMcp = JSON.parse(fs.readFileSync(mcpDest, 'utf8'));
252
- const mergedMcp = mergeMcpServers(existingMcp, newMcp);
253
- fs.writeFileSync(mcpDest, JSON.stringify(mergedMcp, null, 2));
254
- log(' āœ… Merged into existing .mcp.json', 'green');
255
- } else {
256
- // Create new MCP config file
257
- fs.writeFileSync(mcpDest, JSON.stringify(newMcp, null, 2));
258
- log(' āœ… Created .mcp.json in project root', 'green');
252
+ // Check if server already exists
253
+ const checkResult = execSync(`claude mcp get ${server.name} 2>&1`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
254
+ if (checkResult.includes('Connected') || checkResult.includes('Scope:')) {
255
+ log(` āœ“ ${server.name} - already configured`, 'blue');
256
+ }
257
+ } catch (checkError) {
258
+ // Server doesn't exist, add it
259
+ try {
260
+ execSync(`claude mcp add ${server.name} -- ${server.command}`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
261
+ log(` āœ… ${server.name} - ${server.description}`, 'green');
262
+ } catch (addError) {
263
+ log(` āš ļø ${server.name} - Could not add (run manually: claude mcp add ${server.name} -- ${server.command})`, 'yellow');
259
264
  }
260
-
261
- log('\n MCP servers configured:', 'blue');
262
- log(' • context7 - Live documentation from library source code', 'blue');
263
- log(' • github - GitHub issues, PRs, and repository access', 'blue');
264
- log('\n āš ļø GitHub MCP requires GITHUB_PERSONAL_ACCESS_TOKEN in env', 'yellow');
265
- log(' āš ļø First use will prompt for security approval', 'yellow');
266
- } catch (error) {
267
- log(` āŒ Failed to configure MCP servers: ${error.message}`, 'red');
268
265
  }
269
266
  }
270
267
 
268
+ log('\n āš ļø GitHub MCP requires GITHUB_PERSONAL_ACCESS_TOKEN in env', 'yellow');
269
+ log(' šŸ’” Restart Claude Code for MCP tools to be available', 'yellow');
270
+
271
271
  // ========================================
272
272
  // Success Summary
273
273
  // ========================================
@@ -280,7 +280,7 @@ function main() {
280
280
  log(' Hooks: .claude/hooks/*.py', 'blue');
281
281
  log(' Settings: .claude/settings.json', 'blue');
282
282
  log(' State: .claude/api-dev-state.json', 'blue');
283
- log(' MCP: .mcp.json (Context7, GitHub)', 'blue');
283
+ log(' MCP: context7, github (via claude mcp add)', 'blue');
284
284
 
285
285
  log('\nšŸ”’ Enforcement Features:', 'bright');
286
286
  log(' • Research MUST happen before code writing', 'cyan');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hustle-together/api-dev-tools",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Interview-driven API development workflow for Claude Code - Automates research, testing, and documentation",
5
5
  "main": "bin/cli.js",
6
6
  "bin": {