supermind-claude 2.1.0 → 2.1.1
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/commands/install.js +1 -1
- package/cli/commands/update.js +2 -1
- package/cli/lib/mcp.js +25 -5
- package/cli/lib/templates.js +48 -1
- package/package.json +1 -1
- package/templates/CLAUDE.md +1 -0
package/cli/commands/install.js
CHANGED
|
@@ -72,7 +72,7 @@ module.exports = async function install(flags) {
|
|
|
72
72
|
|
|
73
73
|
// Step 7: Templates
|
|
74
74
|
logger.step(7, TOTAL, 'Installing templates...');
|
|
75
|
-
installTemplates();
|
|
75
|
+
installTemplates(mcpConfig.mode);
|
|
76
76
|
|
|
77
77
|
// Write version marker
|
|
78
78
|
fs.writeFileSync(PATHS.versionFile, version);
|
package/cli/commands/update.js
CHANGED
|
@@ -7,6 +7,7 @@ const { readSettings, writeSettings, mergeSettings, backupSettings } = require('
|
|
|
7
7
|
const { installHooks, getHookSettings } = require('../lib/hooks');
|
|
8
8
|
const { installSkills, removeLegacySkills } = require('../lib/skills');
|
|
9
9
|
const { installTemplates } = require('../lib/templates');
|
|
10
|
+
const { detectMcpMode } = require('../lib/mcp');
|
|
10
11
|
const { version } = require('../../package.json');
|
|
11
12
|
|
|
12
13
|
module.exports = function update(flags) {
|
|
@@ -44,7 +45,7 @@ module.exports = function update(flags) {
|
|
|
44
45
|
|
|
45
46
|
// Step 4: Templates
|
|
46
47
|
logger.step(4, TOTAL, 'Updating templates...');
|
|
47
|
-
installTemplates();
|
|
48
|
+
installTemplates(detectMcpMode());
|
|
48
49
|
|
|
49
50
|
// Write version marker
|
|
50
51
|
fs.writeFileSync(PATHS.versionFile, version);
|
package/cli/lib/mcp.js
CHANGED
|
@@ -91,22 +91,42 @@ async function setupMcp(flags) {
|
|
|
91
91
|
}
|
|
92
92
|
if (!mode || mode === 'skip') {
|
|
93
93
|
logger.info('Skipping MCP setup');
|
|
94
|
-
return {};
|
|
94
|
+
return { mode: 'skip' };
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
if (mode === 'docker') {
|
|
98
98
|
await setupDocker();
|
|
99
|
-
return {}; // Docker
|
|
99
|
+
return { mode: 'docker' }; // Docker uses AIRIS gateway; mode drives template MCP section
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
if (mode === 'direct') {
|
|
103
103
|
const apiKeys = await promptApiKeys(flags);
|
|
104
104
|
const servers = setupDirect(apiKeys);
|
|
105
105
|
logger.success(`Configured ${Object.keys(servers).length} MCP servers`);
|
|
106
|
-
return { mcpServers: servers };
|
|
106
|
+
return { mode: 'direct', mcpServers: servers };
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
return {};
|
|
109
|
+
return { mode: 'skip' };
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
// Infer MCP mode from installed artifacts. Used by update to re-render the template MCP section.
|
|
113
|
+
function detectMcpMode() {
|
|
114
|
+
if (fs.existsSync(path.join(PATHS.airisDir, 'docker-compose.yml'))) {
|
|
115
|
+
return 'docker';
|
|
116
|
+
}
|
|
117
|
+
// Any known direct-mode server in settings.json means direct install was used
|
|
118
|
+
try {
|
|
119
|
+
const settings = JSON.parse(fs.readFileSync(PATHS.settings, 'utf-8'));
|
|
120
|
+
const servers = settings.mcpServers || {};
|
|
121
|
+
if (servers.context7 || servers.playwright || servers.serena || servers.tavily) {
|
|
122
|
+
return 'direct';
|
|
123
|
+
}
|
|
124
|
+
} catch (err) {
|
|
125
|
+
if (err.code !== 'ENOENT') {
|
|
126
|
+
logger.warn(`Could not read settings.json to detect MCP mode: ${err.message}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return 'skip';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
module.exports = { setupMcp, detectMcpMode };
|
package/cli/lib/templates.js
CHANGED
|
@@ -5,11 +5,58 @@ const path = require('path');
|
|
|
5
5
|
const { PATHS, ensureDir, getPackageRoot } = require('./platform');
|
|
6
6
|
const logger = require('./logger');
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
const MCP_SECTIONS = {
|
|
9
|
+
docker: `## MCP Servers
|
|
10
|
+
Use these naturally when relevant — don't wait to be asked.
|
|
11
|
+
|
|
12
|
+
- **Magic MCP** — \`component_builder\`, \`component_inspiration\`, \`component_refiner\`, \`logo_search\` — use when building/refining UI components
|
|
13
|
+
- **Airis Gateway** (Docker, localhost:9400) — cold-start sub-servers:
|
|
14
|
+
- **context7** — Library docs lookup
|
|
15
|
+
- **playwright** — Browser automation/testing
|
|
16
|
+
- **serena** — Symbolic code navigation (run \`activate_project\` on first use)
|
|
17
|
+
- **tavily** — Web search/research
|
|
18
|
+
- **chrome-devtools** — Chrome debugging
|
|
19
|
+
- **shadcn** — shadcn/ui component search
|
|
20
|
+
`,
|
|
21
|
+
|
|
22
|
+
direct: `## MCP Servers
|
|
23
|
+
Use these naturally when relevant — don't wait to be asked.
|
|
24
|
+
|
|
25
|
+
- **Magic MCP** — \`component_builder\`, \`component_inspiration\`, \`component_refiner\`, \`logo_search\` — use when building/refining UI components
|
|
26
|
+
- **context7** — Library docs lookup (npx)
|
|
27
|
+
- **playwright** — Browser automation/testing (npx)
|
|
28
|
+
- **serena** — Symbolic code navigation; run \`activate_project\` on first use (uvx)
|
|
29
|
+
- **tavily** — Web search/research (npx, requires TAVILY_API_KEY)
|
|
30
|
+
- **chrome-devtools** — Chrome debugging (npx)
|
|
31
|
+
- **shadcn** — shadcn/ui component search (npx)
|
|
32
|
+
`,
|
|
33
|
+
|
|
34
|
+
skip: `## MCP Servers
|
|
35
|
+
Use these naturally when relevant — don't wait to be asked.
|
|
36
|
+
|
|
37
|
+
- **Magic MCP** — \`component_builder\`, \`component_inspiration\`, \`component_refiner\`, \`logo_search\` — use when building/refining UI components
|
|
38
|
+
<!-- Add your MCP servers here. Run \`npx supermind-claude\` to set up context7, playwright, serena, tavily, and more. -->
|
|
39
|
+
`,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Matches MCP section up to next heading or end of file (with or without trailing newline)
|
|
43
|
+
const MCP_SECTION_PATTERN = /## MCP Servers\nUse these naturally when relevant.*?(?=\n## |\n?$)/s;
|
|
44
|
+
|
|
45
|
+
function installTemplates(mcpMode) {
|
|
9
46
|
ensureDir(PATHS.templatesDir);
|
|
10
47
|
const src = path.join(getPackageRoot(), 'templates', 'CLAUDE.md');
|
|
11
48
|
const dest = path.join(PATHS.templatesDir, 'CLAUDE.md');
|
|
12
49
|
fs.copyFileSync(src, dest);
|
|
50
|
+
|
|
51
|
+
if (mcpMode && MCP_SECTIONS[mcpMode]) {
|
|
52
|
+
const content = fs.readFileSync(dest, 'utf-8');
|
|
53
|
+
const updated = content.replace(MCP_SECTION_PATTERN, MCP_SECTIONS[mcpMode]);
|
|
54
|
+
if (updated === content && mcpMode !== 'docker') { // docker is the template default, so no-op is expected
|
|
55
|
+
logger.warn('MCP section pattern did not match template — using default MCP content');
|
|
56
|
+
}
|
|
57
|
+
fs.writeFileSync(dest, updated);
|
|
58
|
+
}
|
|
59
|
+
|
|
13
60
|
logger.success('CLAUDE.md template');
|
|
14
61
|
}
|
|
15
62
|
|
package/package.json
CHANGED
package/templates/CLAUDE.md
CHANGED
|
@@ -78,6 +78,7 @@ Use the superpowers `/using-git-worktrees` skill for worktree creation. It handl
|
|
|
78
78
|
- The code reviewer must find zero remaining issues before merging. If it finds problems, fix them and run the reviewer again. Repeat until clean.
|
|
79
79
|
- Never skip the review step. Never skip "minor" fixes. Every finding gets fixed.
|
|
80
80
|
- This entire process — create, implement, review, fix, merge, clean up — executes without stopping to ask for permission.
|
|
81
|
+
- **Branch safety:** If the current branch is `main` or `master` when a code change is requested, create a feature branch first (`feature/…`, `fix/…`, or `chore/…`) before making any changes. Never commit directly to `main` or `master`.
|
|
81
82
|
|
|
82
83
|
## MCP Servers
|
|
83
84
|
Use these naturally when relevant — don't wait to be asked.
|