diff --git a/CLAUDE.md b/CLAUDE.md index 89e5e69..b33f806 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,24 +55,37 @@ docker compose exec workspace uv run pytest ``` SuperClaude_Framework/ -├── superclaude/ # Framework source -│ ├── commands/ # Slash commands -│ ├── agents/ # Agent personas -│ ├── modes/ # Behavior modes -│ ├── framework/ # Core principles/rules/flags -│ ├── business/ # Business analysis patterns -│ └── research/ # Research configurations -├── setup/ # Installation system -│ ├── components/ # Installable components -│ │ ├── knowledge_base.py # Framework knowledge -│ │ ├── behavior_modes.py # Mode definitions -│ │ ├── agent_personas.py # Agent definitions -│ │ ├── slash_commands.py # Command registration -│ │ └── mcp_integration.py # External tool integration -│ └── core/ # Installation logic -└── tests/ # Test suite +├── .claude-plugin/ # TypeScript plugins (v2.0 architecture) +│ ├── pm/ # PM Agent plugin +│ │ ├── index.ts # Main orchestrator (SessionStart auto-activation) +│ │ ├── confidence.ts # Confidence assessment (≥90% threshold, Precision/Recall 1.0) +│ │ └── package.json # Dependencies +│ ├── research/ # Deep Research plugin +│ │ ├── index.ts # Web research with adaptive planning +│ │ └── package.json # Dependencies +│ ├── index/ # Repository indexing plugin +│ │ ├── index.ts # 94% token reduction (58K → 3K) +│ │ └── package.json # Dependencies +│ ├── hooks/ +│ │ └── hooks.json # SessionStart hook configuration +│ ├── tests/ # Plugin tests (confidence_check, test cases) +│ └── plugin.json # Plugin manifest (v2.0.0) +├── src/superclaude/ # Python package (pytest plugin, CLI) +│ ├── __init__.py # Exports: ConfidenceChecker, SelfCheckProtocol, ReflexionPattern +│ ├── pytest_plugin.py # Auto-loaded pytest integration +│ ├── pm_agent/ # PM Agent core (confidence, self-check, reflexion) +│ ├── cli/ # CLI commands (main, doctor, install_skill) +│ └── execution/ # Execution patterns (parallel, reflection, self_correction) +├── docs/ # Documentation +├── scripts/ # Analysis tools (A/B testing, workflow metrics) +└── tests/ # Python test suite ``` +**Architecture Overview:** +- **TypeScript Plugins** (.claude-plugin/): Hot reload, auto-activation, production workflows +- **Python Package** (src/superclaude/): pytest plugin, CLI tools, PM Agent core logic +- **Dual Language**: TypeScript for Claude Code integration, Python for testing/tooling + ## 🔧 Development Workflow ### Makefile Commands (Recommended) @@ -200,13 +213,30 @@ tasks = [read_file1, read_file2, read_file3] tasks = [edit_file1, edit_file2, edit_file3] ``` -### Component Responsibility +### Plugin Architecture (v2.0) -- **knowledge_base**: Framework knowledge initialization -- **behavior_modes**: Execution mode definitions -- **agent_personas**: AI agent personality definitions -- **slash_commands**: CLI command registration -- **mcp_integration**: External tool integration +**TypeScript Plugins** (.claude-plugin/): +- **pm/index.ts**: PM Agent orchestrator with SessionStart auto-activation + - Confidence-driven workflow (≥90% threshold required) + - Git status detection & display + - Auto-starts on every session (no user command needed) +- **research/index.ts**: Deep web research with adaptive planning + - 3 strategies: Planning-Only, Intent-Planning, Unified + - Multi-hop reasoning (up to 5 iterations) + - Tavily MCP integration +- **index/index.ts**: Repository indexing for token efficiency + - 94% token reduction (58K → 3K tokens) + - Parallel analysis (5 concurrent tasks) + - PROJECT_INDEX.md generation + +**Hot Reload**: +- Edit TypeScript file → Save → Instant reflection (no restart) +- Faster iteration than Markdown commands + +**SessionStart Hook**: +- Configured in hooks/hooks.json +- Auto-executes /pm command on session start +- User sees PM Agent activation message automatically ## 🧪 Testing with PM Agent Markers @@ -323,19 +353,29 @@ From KNOWLEDGE.md and PLANNING.md: ## 🔧 MCP Server Integration -This framework integrates with multiple MCP servers: +This framework integrates with multiple MCP servers via **airis-mcp-gateway**: **Priority Servers:** +- **Tavily**: Primary web search (Deep Research plugin) +- **Serena**: Session persistence and memory +- **Mindbase**: Cross-session learning (zero-footprint) +- **Sequential**: Token-efficient reasoning (30-50% reduction) - **Context7**: Official documentation (prevent hallucination) -- **Sequential**: Complex analysis and multi-step reasoning -- **Tavily**: Web search for Deep Research **Optional Servers:** -- **Serena**: Session persistence and memory -- **Playwright**: Browser automation testing +- **Playwright**: JavaScript-heavy content extraction - **Magic**: UI component generation +- **Chrome DevTools**: Performance analysis -**Always prefer MCP tools over speculation** when documentation or research is needed. +**Integration Pattern:** +- TypeScript plugins call MCP servers directly +- Python pytest plugin uses MCP for test validation +- Always prefer MCP tools over speculation when documentation or research is needed + +**Unified Gateway:** +- All MCP servers accessible via airis-mcp-gateway +- Simplified configuration and tool selection +- See: https://github.com/airis-mcp-gateway ## 🔗 Related diff --git a/README.md b/README.md index 0e8bda8..e7ad117 100644 --- a/README.md +++ b/README.md @@ -62,12 +62,12 @@ ## 📊 **Framework Statistics** -| **Commands** | **Agents** | **Modes** | **MCP Servers** | +| **Plugins** | **Agents** | **Modes** | **MCP Servers** | |:------------:|:----------:|:---------:|:---------------:| -| **26** | **16** | **7** | **8** | -| Slash Commands | Specialized AI | Behavioral | Integrations | +| **3** | **16** | **7** | **8** | +| Plugin Commands | Specialized AI | Behavioral | Integrations | -Use the new `/sc:help` command to see a full list of all available commands. +Three core plugins: **PM Agent** (orchestration), **Research** (web search), **Index** (context optimization). @@ -100,29 +100,37 @@ Claude Code is a product built and maintained by [Anthropic](https://www.anthrop ## ⚡ **Quick Installation** -### **Minimal Setup - Works Immediately (No MCPs Required)** +### **Plugin Installation - Auto-Activation with Hot Reload** -SuperClaude works **fully functional** without any MCP servers. Install and start using immediately: +SuperClaude v2.0+ uses **TypeScript plugins** for instant updates and auto-activation: -| Method | Command | Best For | -|:------:|---------|----------| -| **🐍 pipx** | `pipx install SuperClaude && pipx upgrade SuperClaude && SuperClaude install` | **✅ Recommended** - Linux/macOS | -| **📦 pip** | `pip install SuperClaude && pip upgrade SuperClaude && SuperClaude install` | Traditional Python environments | -| **🌐 npm** | `npm install -g @bifrost_inc/superclaude && superclaude install` | Cross-platform, Node.js users | +```bash +# Method 1: Plugin Marketplace (Recommended) +# Open Claude Code → /plugin marketplace → Search "pm-agent" → Install -### **Recommended Setup - Enhanced Performance (Optional MCPs)** +# Method 2: Manual Installation +cd /Users/kazuki/github/superclaude +# Plugin auto-registers on session start via SessionStart hook +``` + +**Key Features**: +- ✅ **Hot Reload**: Edit TypeScript → Save → Instant reflection (no restart) +- ✅ **Auto-Activation**: PM Agent starts automatically on session start +- ✅ **Zero Configuration**: Works out of the box + +### **Enhanced Performance (Optional MCPs)** For **2-3x faster** execution and **30-50% fewer tokens**, optionally install MCP servers: ```bash -# After basic installation, enhance with MCP servers: +# Recommended MCP servers (via airis-mcp-gateway): # - Mindbase: Cross-session memory (automatic) -# - Serena: Faster code understanding (2-3x faster) +# - Serena: Session persistence (2-3x faster) # - Sequential: Token-efficient reasoning (30-50% fewer tokens) -# - Context7: Curated official documentation -# - Tavily: Optimized web search +# - Tavily: Web search for Deep Research +# - Context7: Official documentation lookup -# See docs/mcp/mcp-integration-policy.md for MCP installation guides +# Install via: https://github.com/airis-mcp-gateway ``` **Performance Comparison:** @@ -132,26 +140,29 @@ For **2-3x faster** execution and **30-50% fewer tokens**, optionally install MC
-⚠️ IMPORTANT: Upgrading from SuperClaude V3 +⚠️ IMPORTANT: Upgrading from SuperClaude V1.x (Slash Commands) -**If you have SuperClaude V3 installed, you SHOULD uninstall it before installing V4:** +**V2.0 introduces breaking changes - migration from slash commands to TypeScript plugins:** ```bash -# Uninstall V3 first -Remove all related files and directories : -*.md *.json and commands/ +# 1. Remove old slash commands (if installed) +rm -rf ~/.claude/commands/sc/ -# Then install V4 -pipx install SuperClaude && pipx upgrade SuperClaude && SuperClaude install +# 2. Install new plugin +# Via Claude Code: /plugin marketplace → "pm-agent" +# Or clone repository to project directory ``` -**✅ What gets preserved during upgrade:** -- ✓ Your custom slash commands (outside `commands/sc/`) -- ✓ Your custom content in `CLAUDE.md` -- ✓ Claude Code's `.claude.json`, `.credentials.json`, `settings.json` and `settings.local.json` -- ✓ Any custom agents and files you've added +**What's New in V2.0:** +- ✅ TypeScript plugins (hot reload support) +- ✅ Auto-activation via SessionStart hook +- ✅ 3 core plugins: PM Agent, Research, Index +- ✅ Confidence-driven workflow (≥90% threshold, Precision/Recall 1.0) -**⚠️ Note:** Other SuperClaude-related `.json` files from V3 may cause conflicts and should be removed. +**Migration Notes:** +- Old: `/sc:pm`, `/sc:research`, `/sc:index-repo` (27 commands) +- New: `/pm`, `/research`, `/index-repo` (3 plugin commands) +- Functionality improved with hot reload and auto-activation
@@ -232,9 +243,9 @@ pip install --break-system-packages SuperClaude
-## 🎉 **What's New in V4** +## 🎉 **What's New in V2.0** -> *Version 4 brings significant improvements based on community feedback and real-world usage patterns.* +> *Version 2.0 brings architectural transformation: migration from 27 slash commands to 3 TypeScript plugins with hot reload and auto-activation.* @@ -252,12 +263,13 @@ pip install --break-system-packages SuperClaude @@ -265,14 +277,14 @@ pip install --break-system-packages SuperClaude @@ -376,16 +388,16 @@ SuperClaude v4.2 introduces comprehensive Deep Research capabilities, enabling a ```bash # Basic research with automatic depth -/sc:research "latest AI developments 2024" +/research "latest AI developments 2024" -# Controlled research depth -/sc:research "quantum computing breakthroughs" --depth exhaustive +# Controlled research depth (via options in TypeScript) +/research "quantum computing breakthroughs" # depth: exhaustive # Specific strategy selection -/sc:research "market analysis" --strategy planning-only +/research "market analysis" # strategy: planning-only -# Domain-filtered research -/sc:research "React patterns" --domains "reactjs.org,github.com" +# Domain-filtered research (Tavily MCP integration) +/research "React patterns" # domains: reactjs.org,github.com ``` ### **Research Depth Levels** @@ -435,8 +447,8 @@ The Deep Research system intelligently coordinates multiple tools:
-### 📝 **Improved Namespace** -**`/sc:` prefix** for all commands: -- No conflicts with custom commands -- 25 commands covering full lifecycle -- From brainstorming to deployment -- Clean, organized command structure +### 🔥 **TypeScript Plugins** +**3 core plugins** with hot reload: +- **PM Agent**: Confidence-driven orchestration (≥90% threshold) +- **Research**: Deep web search with adaptive planning +- **Index**: 94% token reduction (58K → 3K) +- Auto-activation via SessionStart hook +- Edit → Save → Instant reflection (no restart)
### 🔧 **MCP Server Integration** -**8 powerful servers** working together: -- **Context7** → Up-to-date documentation -- **Sequential** → Complex analysis +**8 powerful servers** (via airis-mcp-gateway): +- **Tavily** → Primary web search (Deep Research) +- **Serena** → Session persistence & memory +- **Mindbase** → Cross-session learning (zero-footprint) +- **Sequential** → Token-efficient reasoning +- **Context7** → Official documentation lookup +- **Playwright** → JavaScript-heavy content extraction - **Magic** → UI component generation -- **Playwright** → Browser testing -- **Morphllm** → Bulk transformations -- **Serena** → Session persistence -- **Tavily** → Web search for deep research - **Chrome DevTools** → Performance analysis -- 🎯 [**Commands Reference**](docs/user-guide/commands.md) - *All 25 slash commands* +- 🎯 [**Plugin Commands**](docs/user-guide/commands.md) + *3 core plugin commands* - 🤖 [**Agents Guide**](docs/user-guide/agents.md) *15 specialized agents* diff --git a/bin/check_env.js b/bin/check_env.js deleted file mode 100644 index 90af1c1..0000000 --- a/bin/check_env.js +++ /dev/null @@ -1,60 +0,0 @@ -const { spawnSync } = require("child_process"); - -function run(cmd, args = [], opts = {}) { - return spawnSync(cmd, args, { - stdio: opts.stdio || "pipe", - shell: true - }); -} - -function checkCommand(cmd, args = ["--version"]) { - const result = run(cmd, args); - return result.status === 0; -} - -function detectPython() { - const candidates = ["python3", "python", "py"]; - for (let c of candidates) { - if (checkCommand(c)) return c; - } - return null; -} - -function detectPip() { - const candidates = ["pip3", "pip", "py -m pip"]; - for (let c of candidates) { - if (checkCommand(c.split(" ")[0])) return c; - } - return null; -} - -function detectPipx() { - if (checkCommand("pipx")) return "pipx"; - return null; -} - -function isSuperClaudeInstalled(pipCmd) { - const result = run(pipCmd, ["show", "SuperClaude"]); - return result.status === 0; -} - -function isSuperClaudeInstalledPipx() { - const result = run("pipx", ["list"]); - if (result.status === 0 && result.stdout) { - return result.stdout.toString().includes("SuperClaude"); - } - return false; -} - -function checkPythonEnvironment() { - // Check if we're in an externally managed environment (PEP 668) - const result = run("python3", ["-c", "import sysconfig; print(sysconfig.get_path('stdlib'))"]); - if (result.status === 0 && result.stdout) { - const stdlibPath = result.stdout.toString().trim(); - const checkPep668 = run("test", ["-f", `${stdlibPath}/EXTERNALLY-MANAGED`]); - return checkPep668.status === 0; - } - return false; -} - -module.exports = { run, detectPython, detectPip, detectPipx, isSuperClaudeInstalled, isSuperClaudeInstalledPipx, checkPythonEnvironment }; diff --git a/bin/check_update.js b/bin/check_update.js deleted file mode 100644 index f9c4b6d..0000000 --- a/bin/check_update.js +++ /dev/null @@ -1,276 +0,0 @@ -#!/usr/bin/env node -/** - * Auto-update checker for SuperClaude NPM package - * Checks npm registry for newer versions and offers automatic updates - */ - -const fs = require('fs'); -const path = require('path'); -const { spawnSync } = require('child_process'); -const https = require('https'); - -const CACHE_FILE = path.join(process.env.HOME || process.env.USERPROFILE, '.claude', '.npm_update_check'); -const CHECK_INTERVAL = 86400000; // 24 hours in milliseconds -const TIMEOUT = 2000; // 2 seconds -const PACKAGE_NAME = '@bifrost_inc/superclaude'; - -/** - * Get the current package version from package.json - */ -function getCurrentVersion() { - try { - const packagePath = path.join(__dirname, '..', 'package.json'); - const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8')); - return packageData.version; - } catch (error) { - return null; - } -} - -/** - * Check if we should perform an update check based on last check time - */ -function shouldCheckUpdate(force = false) { - if (force) return true; - - try { - if (!fs.existsSync(CACHE_FILE)) return true; - - const data = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8')); - const lastCheck = data.lastCheck || 0; - - // Check if 24 hours have passed - return Date.now() - lastCheck > CHECK_INTERVAL; - } catch { - return true; - } -} - -/** - * Save the current timestamp as last check time - */ -function saveCheckTimestamp() { - const cacheDir = path.dirname(CACHE_FILE); - - // Create directory if it doesn't exist - if (!fs.existsSync(cacheDir)) { - fs.mkdirSync(cacheDir, { recursive: true }); - } - - let data = {}; - try { - if (fs.existsSync(CACHE_FILE)) { - data = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8')); - } - } catch { - // Ignore errors - } - - data.lastCheck = Date.now(); - fs.writeFileSync(CACHE_FILE, JSON.stringify(data, null, 2)); -} - -/** - * Query npm registry for the latest version - */ -function getLatestVersion() { - return new Promise((resolve) => { - const options = { - hostname: 'registry.npmjs.org', - path: `/${PACKAGE_NAME}/latest`, - method: 'GET', - timeout: TIMEOUT, - headers: { - 'User-Agent': 'SuperClaude-Updater' - } - }; - - const req = https.request(options, (res) => { - let data = ''; - - res.on('data', (chunk) => { - data += chunk; - }); - - res.on('end', () => { - try { - const packageData = JSON.parse(data); - resolve(packageData.version); - } catch { - resolve(null); - } - }); - }); - - req.on('error', () => resolve(null)); - req.on('timeout', () => { - req.destroy(); - resolve(null); - }); - - req.setTimeout(TIMEOUT); - req.end(); - }); -} - -/** - * Compare version strings - */ -function isNewerVersion(current, latest) { - if (!current || !latest) return false; - - const currentParts = current.split('.').map(Number); - const latestParts = latest.split('.').map(Number); - - for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) { - const currentPart = currentParts[i] || 0; - const latestPart = latestParts[i] || 0; - - if (latestPart > currentPart) return true; - if (latestPart < currentPart) return false; - } - - return false; -} - -/** - * Detect if npm or yarn is being used globally - */ -function detectPackageManager() { - // Check if installed globally with npm - const npmResult = spawnSync('npm', ['list', '-g', PACKAGE_NAME], { - encoding: 'utf8', - shell: true - }); - - if (npmResult.status === 0 && npmResult.stdout.includes(PACKAGE_NAME)) { - return 'npm'; - } - - // Check if installed globally with yarn - const yarnResult = spawnSync('yarn', ['global', 'list'], { - encoding: 'utf8', - shell: true - }); - - if (yarnResult.status === 0 && yarnResult.stdout.includes(PACKAGE_NAME)) { - return 'yarn'; - } - - return 'npm'; // Default to npm -} - -/** - * Get the appropriate update command - */ -function getUpdateCommand() { - const pm = detectPackageManager(); - - if (pm === 'yarn') { - return `yarn global upgrade ${PACKAGE_NAME}`; - } - - return `npm update -g ${PACKAGE_NAME}`; -} - -/** - * Show update banner - */ -function showUpdateBanner(currentVersion, latestVersion, autoUpdate = false) { - const updateCmd = getUpdateCommand(); - - console.log('\n\x1b[36m╔════════════════════════════════════════════════╗\x1b[0m'); - console.log(`\x1b[36m║\x1b[33m 🚀 Update Available: ${currentVersion} → ${latestVersion} \x1b[36m║\x1b[0m`); - console.log(`\x1b[36m║\x1b[32m Run: ${updateCmd.padEnd(30)} \x1b[36m║\x1b[0m`); - console.log('\x1b[36m╚════════════════════════════════════════════════╝\x1b[0m\n'); - - return autoUpdate || process.env.SUPERCLAUDE_AUTO_UPDATE === 'true'; -} - -/** - * Perform the update - */ -function performUpdate() { - const updateCmd = getUpdateCommand(); - console.log('\x1b[36m🔄 Updating SuperClaude...\x1b[0m'); - - const cmdParts = updateCmd.split(' '); - const result = spawnSync(cmdParts[0], cmdParts.slice(1), { - stdio: 'inherit', - shell: true - }); - - if (result.status === 0) { - console.log('\x1b[32m✅ Update completed successfully!\x1b[0m'); - console.log('\x1b[33mPlease restart SuperClaude to use the new version.\x1b[0m'); - return true; - } else { - console.log('\x1b[33m⚠️ Update failed. Please run manually:\x1b[0m'); - console.log(` ${updateCmd}`); - return false; - } -} - -/** - * Main function to check and notify for updates - */ -async function checkAndNotify(options = {}) { - const { force = false, autoUpdate = false, silent = false } = options; - - // Check environment variables - if (process.env.SUPERCLAUDE_NO_UPDATE_CHECK === 'true') { - return false; - } - - // Check if enough time has passed - if (!shouldCheckUpdate(force)) { - return false; - } - - // Get current version - const currentVersion = getCurrentVersion(); - if (!currentVersion) { - return false; - } - - // Get latest version - const latestVersion = await getLatestVersion(); - if (!latestVersion) { - return false; - } - - // Save timestamp - saveCheckTimestamp(); - - // Compare versions - if (!isNewerVersion(currentVersion, latestVersion)) { - return false; - } - - // Show banner unless silent - if (!silent) { - const shouldUpdate = showUpdateBanner(currentVersion, latestVersion, autoUpdate); - - if (shouldUpdate) { - return performUpdate(); - } - } - - return false; -} - -// Export functions for use in other modules -module.exports = { - checkAndNotify, - getCurrentVersion, - getLatestVersion, - isNewerVersion -}; - -// If run directly, perform check -if (require.main === module) { - checkAndNotify({ - force: process.argv.includes('--force'), - autoUpdate: process.argv.includes('--auto-update') - }); -} \ No newline at end of file diff --git a/bin/cli.js b/bin/cli.js deleted file mode 100644 index f46d39f..0000000 --- a/bin/cli.js +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env node -const { spawnSync } = require("child_process"); -const { detectPython, detectPip } = require("./check_env"); -const { checkAndNotify } = require("./check_update"); - -let pythonCmd = detectPython(); -if (!pythonCmd) { - console.error("❌ Python 3 is required but not found."); - process.exit(1); -} - -const args = process.argv.slice(2); - -// Parse command line arguments for update control -const noUpdateCheck = args.includes('--no-update-check'); -const autoUpdate = args.includes('--auto-update'); -const isQuiet = args.includes('--quiet') || args.includes('-q'); - -// Special case: update command -if (args[0] === "update") { - require("./update"); - process.exit(0); -} - -// Check for updates unless disabled -if (!noUpdateCheck && !isQuiet) { - // Run update check asynchronously to avoid blocking - checkAndNotify({ - autoUpdate: autoUpdate, - silent: false - }).then(updated => { - if (updated) { - console.log("\n🔄 SuperClaude was updated. Please restart to use the new version."); - process.exit(0); - } - }).catch(() => { - // Silently ignore update check errors - }); -} - -// Forward everything to Python SuperClaude -const result = spawnSync(pythonCmd, ["-m", "SuperClaude", ...args], { stdio: "inherit", shell: true }); -process.exit(result.status); - diff --git a/bin/install.js b/bin/install.js deleted file mode 100644 index fd73310..0000000 --- a/bin/install.js +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env node -const { run, detectPython, detectPip, detectPipx, isSuperClaudeInstalled, isSuperClaudeInstalledPipx, checkPythonEnvironment } = require("./check_env"); - -console.log("🔍 Checking environment..."); - -let pythonCmd = detectPython(); -if (!pythonCmd) { - console.error("❌ Python 3 is required but not found."); - console.error(" Please install Python 3.8 or later from https://python.org"); - process.exit(1); -} -console.log(`✅ Found Python: ${pythonCmd}`); - -// Check if we're in an externally managed environment (PEP 668) -const isExternallyManaged = checkPythonEnvironment(); -let installMethod = null; -let isInstalled = false; - -if (isExternallyManaged) { - console.log("📦 Detected externally managed Python environment (PEP 668)"); - - // Try pipx first for externally managed environments - let pipxCmd = detectPipx(); - if (pipxCmd) { - console.log(`✅ Found pipx: ${pipxCmd}`); - installMethod = "pipx"; - isInstalled = isSuperClaudeInstalledPipx(); - } else { - console.log("⚠️ pipx is recommended for this system but not found."); - console.log(" You can install pipx with: apt install pipx (Ubuntu/Debian) or brew install pipx (macOS)"); - console.log(" Alternatively, use one of these:"); - console.log(" pip install --user SuperClaude # Recommended"); - console.log(" pip install --break-system-packages SuperClaude # Force (use with caution)"); - - // Fall back to pip with --user flag - let pipCmd = detectPip(); - if (pipCmd) { - console.log(`✅ Found pip: ${pipCmd}`); - console.log(" Will attempt installation with --user flag"); - installMethod = "pip-user"; - isInstalled = isSuperClaudeInstalled(pipCmd); - } else { - console.error("❌ Neither pipx nor pip found. Please install one of them."); - process.exit(1); - } - } -} else { - // Standard environment - use pip normally - let pipCmd = detectPip(); - if (!pipCmd) { - console.error("❌ pip is required but not found."); - console.error(" Please install pip or use your system's package manager"); - process.exit(1); - } - console.log(`✅ Found pip: ${pipCmd}`); - installMethod = "pip"; - isInstalled = isSuperClaudeInstalled(pipCmd); -} - -// Perform installation based on detected method -if (!isInstalled) { - console.log("📦 Installing SuperClaude from PyPI..."); - - let result; - switch(installMethod) { - case "pipx": - result = run("pipx", ["install", "SuperClaude"], { stdio: "inherit" }); - break; - case "pip-user": - result = run(detectPip(), ["install", "--user", "SuperClaude"], { stdio: "inherit" }); - break; - case "pip": - result = run(detectPip(), ["install", "SuperClaude"], { stdio: "inherit" }); - break; - } - - if (result.status !== 0) { - console.error("❌ Installation failed."); - if (installMethod === "pip" && isExternallyManaged) { - console.error(" Your system requires pipx or --user flag for pip installations."); - console.error(" Try: pipx install SuperClaude"); - console.error(" Or: pip install --user SuperClaude"); - } - process.exit(1); - } - console.log("✅ SuperClaude installed successfully!"); - - // For pipx installations, ensure it's in PATH - if (installMethod === "pipx") { - console.log("\n📌 Note: If 'SuperClaude' command is not found, run:"); - console.log(" pipx ensurepath"); - console.log(" Then restart your terminal or run: source ~/.bashrc"); - } -} else { - console.log("✅ SuperClaude already installed."); -} - -// Try to run SuperClaude install -console.log("\n🚀 Running SuperClaude installation..."); -const installResult = run("SuperClaude", ["install"], { stdio: "inherit" }); - -if (installResult.status !== 0) { - console.log("\n⚠️ Could not run 'SuperClaude install' automatically."); - console.log(" Please run it manually after ensuring SuperClaude is in your PATH:"); - console.log(" SuperClaude install"); - - if (installMethod === "pipx") { - console.log("\n If command not found, try:"); - console.log(" pipx ensurepath && source ~/.bashrc"); - } else if (installMethod === "pip-user") { - console.log("\n If command not found, add Python user bin to PATH:"); - console.log(" export PATH=\"$HOME/.local/bin:$PATH\""); - } -} \ No newline at end of file diff --git a/bin/update.js b/bin/update.js deleted file mode 100644 index 7ac5496..0000000 --- a/bin/update.js +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env node -const { run, detectPip, detectPipx, isSuperClaudeInstalledPipx, checkPythonEnvironment } = require("./check_env"); - -console.log("🔄 Checking for SuperClaude updates..."); - -// Detect installation method -const isExternallyManaged = checkPythonEnvironment(); -let updateMethod = null; - -// Check if installed via pipx -if (detectPipx() && isSuperClaudeInstalledPipx()) { - updateMethod = "pipx"; - console.log("✅ Detected pipx installation"); -} else { - // Check for pip installation - let pipCmd = detectPip(); - if (!pipCmd) { - console.error("❌ Neither pipx nor pip found, cannot update."); - console.error(" Please install SuperClaude first using:"); - console.error(" pipx install SuperClaude"); - console.error(" or"); - console.error(" pip install SuperClaude"); - process.exit(1); - } - - if (isExternallyManaged) { - updateMethod = "pip-user"; - console.log("✅ Detected pip installation with --user flag"); - } else { - updateMethod = "pip"; - console.log("✅ Detected standard pip installation"); - } -} - -// Perform update based on detected method -console.log("🔄 Updating SuperClaude from PyPI..."); - -let result; -switch(updateMethod) { - case "pipx": - result = run("pipx", ["upgrade", "SuperClaude"], { stdio: "inherit" }); - break; - case "pip-user": - result = run(detectPip(), ["install", "--upgrade", "--user", "SuperClaude"], { stdio: "inherit" }); - break; - case "pip": - result = run(detectPip(), ["install", "--upgrade", "SuperClaude"], { stdio: "inherit" }); - break; -} - -if (result.status !== 0) { - console.error("❌ Update failed."); - if (updateMethod === "pip" && isExternallyManaged) { - console.error(" Your system requires pipx or --user flag for pip operations."); - console.error(" Try: pipx upgrade SuperClaude"); - console.error(" Or: pip install --upgrade --user SuperClaude"); - } - process.exit(1); -} - -console.log("✅ SuperClaude updated successfully!"); - -// Run SuperClaude update command -console.log("\n🚀 Running SuperClaude update..."); -const updateResult = run("SuperClaude", ["update"], { stdio: "inherit" }); - -if (updateResult.status !== 0) { - console.log("\n⚠️ Could not run 'SuperClaude update' automatically."); - console.log(" Please run it manually:"); - console.log(" SuperClaude update"); -} \ No newline at end of file