mirror of
https://github.com/SuperClaude-Org/SuperClaude_Framework.git
synced 2025-12-29 16:16:08 +00:00
refactor: PEP8 compliance - directory rename and code formatting (#425)
* fix(orchestration): add WebFetch auto-trigger for infrastructure configuration Problem: Infrastructure configuration changes (e.g., Traefik port settings) were being made based on assumptions without consulting official documentation, violating the 'Evidence > assumptions' principle in PRINCIPLES.md. Solution: - Added Infrastructure Configuration Validation section to MODE_Orchestration.md - Auto-triggers WebFetch for infrastructure tools (Traefik, nginx, Docker, etc.) - Enforces MODE_DeepResearch activation for investigation - BLOCKS assumption-based configuration changes Testing: Verified WebFetch successfully retrieves Traefik official docs (port 80 default) This prevents production outages from infrastructure misconfiguration by ensuring all technical recommendations are backed by official documentation. * feat: Add PM Agent (Project Manager Agent) for seamless orchestration Introduces PM Agent as the default orchestration layer that coordinates all sub-agents and manages workflows automatically. Key Features: - Default orchestration: All user interactions handled by PM Agent - Auto-delegation: Intelligent sub-agent selection based on task analysis - Docker Gateway integration: Zero-token baseline with dynamic MCP loading - Self-improvement loop: Automatic documentation of patterns and mistakes - Optional override: Users can specify sub-agents explicitly if desired Architecture: - Agent spec: SuperClaude/Agents/pm-agent.md - Command: SuperClaude/Commands/pm.md - Updated docs: README.md (15→16 agents), agents.md (new Orchestration category) User Experience: - Default: PM Agent handles everything (seamless, no manual routing) - Optional: Explicit --agent flag for direct sub-agent access - Both modes available simultaneously (no user downside) Implementation Status: - ✅ Specification complete - ✅ Documentation complete - ⏳ Prototype implementation needed - ⏳ Docker Gateway integration needed - ⏳ Testing and validation needed Refs: kazukinakai/docker-mcp-gateway (IRIS MCP Gateway integration) * feat: Add Agent Orchestration rules for PM Agent default activation Implements PM Agent as the default orchestration layer in RULES.md. Key Changes: - New 'Agent Orchestration' section (CRITICAL priority) - PM Agent receives ALL user requests by default - Manual override with @agent-[name] bypasses PM Agent - Agent Selection Priority clearly defined: 1. Manual override → Direct routing 2. Default → PM Agent → Auto-delegation 3. Delegation based on keywords, file types, complexity, context User Experience: - Default: PM Agent handles everything (seamless) - Override: @agent-[name] for direct specialist access - Transparent: PM Agent reports delegation decisions This establishes PM Agent as the orchestration layer while respecting existing auto-activation patterns and manual overrides. Next Steps: - Local testing in agiletec project - Iteration based on actual behavior - Documentation updates as needed * refactor(pm-agent): redesign as self-improvement meta-layer Problem Resolution: PM Agent's initial design competed with existing auto-activation for task routing, creating confusion about orchestration responsibilities and adding unnecessary complexity. Design Change: Redefined PM Agent as a meta-layer agent that operates AFTER specialist agents complete tasks, focusing on: - Post-implementation documentation and pattern recording - Immediate mistake analysis with prevention checklists - Monthly documentation maintenance and noise reduction - Pattern extraction and knowledge synthesis Two-Layer Orchestration System: 1. Task Execution Layer: Existing auto-activation handles task routing (unchanged) 2. Self-Improvement Layer: PM Agent meta-layer handles documentation (new) Files Modified: - SuperClaude/Agents/pm-agent.md: Complete rewrite with meta-layer design - Category: orchestration → meta - Triggers: All user interactions → Post-implementation, mistakes, monthly - Behavioral Mindset: Continuous learning system - Self-Improvement Workflow: BEFORE/DURING/AFTER/MISTAKE RECOVERY/MAINTENANCE - SuperClaude/Core/RULES.md: Agent Orchestration section updated - Split into Task Execution Layer + Self-Improvement Layer - Added orchestration flow diagram - Clarified PM Agent activates AFTER task completion - README.md: Updated PM Agent description - "orchestrates all interactions" → "ensures continuous learning" - Docs/User-Guide/agents.md: PM Agent section rewritten - Section: Orchestration Agent → Meta-Layer Agent - Expertise: Project orchestration → Self-improvement workflow executor - Examples: Task coordination → Post-implementation documentation - PR_DOCUMENTATION.md: Comprehensive PR documentation added - Summary, motivation, changes, testing, breaking changes - Two-layer orchestration system diagram - Verification checklist Integration Validated: Tested with agiletec project's self-improvement-workflow.md: ✅ PM Agent aligns with existing BEFORE/DURING/AFTER/MISTAKE RECOVERY phases ✅ Complements (not competes with) existing workflow ✅ agiletec workflow defines WHAT, PM Agent defines WHO executes it Breaking Changes: None - Existing auto-activation continues unchanged - Specialist agents unaffected - User workflows remain the same - New capability: Automatic documentation and knowledge maintenance Value Proposition: Transforms SuperClaude into a continuously learning system that accumulates knowledge, prevents recurring mistakes, and maintains fresh documentation without manual intervention. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * docs: add Claude Code conversation history management research Research covering .jsonl file structure, performance impact, and retention policies. Content: - Claude Code .jsonl file format and message types - Performance issues from GitHub (memory leaks, conversation compaction) - Retention policies (consumer vs enterprise) - Rotation recommendations based on actual data - File history snapshot tracking mechanics Source: Moved from agiletec project (research applicable to all Claude Code projects) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: add Development documentation structure Phase 1: Documentation Structure complete - Add Docs/Development/ directory for development documentation - Add ARCHITECTURE.md - System architecture with PM Agent meta-layer - Add ROADMAP.md - 5-phase development plan with checkboxes - Add TASKS.md - Daily task tracking with progress indicators - Add PROJECT_STATUS.md - Current status dashboard and metrics - Add pm-agent-integration.md - Implementation guide for PM Agent mode This establishes comprehensive documentation foundation for: - System architecture understanding - Development planning and tracking - Implementation guidance - Progress visibility Related: #pm-agent-mode #documentation #phase-1 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: PM Agent session lifecycle and PDCA implementation Phase 2: PM Agent Mode Integration (Design Phase) Commands/pm.md updates: - Add "Always-Active Foundation Layer" concept - Add Session Lifecycle (Session Start/During Work/Session End) - Add PDCA Cycle (Plan/Do/Check/Act) automation - Add Serena MCP Memory Integration (list/read/write_memory) - Document auto-activation triggers Agents/pm-agent.md updates: - Add Session Start Protocol (MANDATORY auto-activation) - Add During Work PDCA Cycle with example workflows - Add Session End Protocol with state preservation - Add PDCA Self-Evaluation Pattern - Add Documentation Strategy (temp → patterns/mistakes) - Add Memory Operations Reference Key Features: - Session start auto-activation for context restoration - 30-minute checkpoint saves during work - Self-evaluation with think_about_* operations - Systematic documentation lifecycle - Knowledge evolution to CLAUDE.md Implementation Status: - ✅ Design complete (Commands/pm.md, Agents/pm-agent.md) - ⏳ Implementation pending (Core components) - ⏳ Serena MCP integration pending Salvaged from mistaken development in ~/.claude directory Related: #pm-agent-mode #session-lifecycle #pdca-cycle #phase-2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: disable Serena MCP auto-browser launch Disable web dashboard and GUI log window auto-launch in Serena MCP server to prevent intrusive browser popups on startup. Users can still manually access the dashboard at http://localhost:24282/dashboard/ if needed. Changes: - Add CLI flags to Serena run command: - --enable-web-dashboard false - --enable-gui-log-window false - Ensures Git-tracked configuration (no reliance on ~/.serena/serena_config.yml) - Aligns with AIRIS MCP Gateway integration approach 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: rename directories to lowercase for PEP8 compliance - Rename superclaude/Agents -> superclaude/agents - Rename superclaude/Commands -> superclaude/commands - Rename superclaude/Core -> superclaude/core - Rename superclaude/Examples -> superclaude/examples - Rename superclaude/MCP -> superclaude/mcp - Rename superclaude/Modes -> superclaude/modes This change follows Python PEP8 naming conventions for package directories. * style: fix PEP8 violations and update package name to lowercase Changes: - Format all Python files with black (43 files reformatted) - Update package name from 'SuperClaude' to 'superclaude' in pyproject.toml - Fix import statements to use lowercase package name - Add missing imports (timedelta, __version__) - Remove old SuperClaude.egg-info directory PEP8 violations reduced from 2672 to 701 (mostly E501 line length due to black's 88 char vs flake8's 79 char limit). * docs: add PM Agent development documentation Add comprehensive PM Agent development documentation: - PM Agent ideal workflow (7-phase autonomous cycle) - Project structure understanding (Git vs installed environment) - Installation flow understanding (CommandsComponent behavior) - Task management system (current-tasks.md) Purpose: Eliminate repeated explanations and enable autonomous PDCA cycles 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(pm-agent): add self-correcting execution and warning investigation culture ## Changes ### superclaude/commands/pm.md - Add "Self-Correcting Execution" section with root cause analysis protocol - Add "Warning/Error Investigation Culture" section enforcing zero-tolerance for dismissal - Define error detection protocol: STOP → Investigate → Hypothesis → Different Solution → Execute - Document anti-patterns (retry without understanding) and correct patterns (research-first) ### docs/Development/hypothesis-pm-autonomous-enhancement-2025-10-14.md - Add PDCA workflow hypothesis document for PM Agent autonomous enhancement ## Rationale PM Agent must never retry failed operations without understanding root causes. All warnings and errors require investigation via context7/WebFetch/documentation to ensure production-quality code and prevent technical debt accumulation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(installer): add airis-mcp-gateway MCP server option ## Changes - Add airis-mcp-gateway to MCP server options in installer - Configuration: GitHub-based installation via uvx - Repository: https://github.com/oraios/airis-mcp-gateway - Purpose: Dynamic MCP Gateway for zero-token baseline and on-demand tool loading ## Implementation Added to setup/components/mcp.py self.mcp_servers dictionary with: - install_method: github - install_command: uvx test installation - run_command: uvx runtime execution - required: False (optional server) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: kazuki <kazuki@kazukinoMacBook-Air.local> Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
parent
302c5851b1
commit
050d5ea2ab
@ -98,7 +98,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
### Technical
|
||||
- Added `setup/utils/updater.py` for PyPI update checking logic
|
||||
- Added `bin/checkUpdate.js` for NPM update checking logic
|
||||
- Integrated update checks into main entry points (SuperClaude/__main__.py and bin/cli.js)
|
||||
- Integrated update checks into main entry points (superclaude/__main__.py and bin/cli.js)
|
||||
- Non-blocking update checks with 2-second timeout to avoid delays
|
||||
|
||||
### Changed
|
||||
@ -107,7 +107,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Commands are now installed in `~/.claude/commands/sc/` subdirectory
|
||||
- All 21 commands updated: `/analyze` → `/sc:analyze`, `/build` → `/sc:build`, etc.
|
||||
- Automatic migration from old command locations to new `sc/` subdirectory
|
||||
- **BREAKING**: Documentation reorganization - Docs/ directory renamed to Guides/
|
||||
- **BREAKING**: Documentation reorganization - docs/ directory renamed to Guides/
|
||||
|
||||
### Added
|
||||
- **NEW AGENTS**: 14 specialized domain agents with enhanced capabilities
|
||||
@ -140,7 +140,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Migration preserves existing functionality while preventing naming conflicts
|
||||
- Installation process detects and migrates existing commands automatically
|
||||
- Tab completion support for `/sc:` prefix to discover all SuperClaude commands
|
||||
- Guides/ directory replaces Docs/ for improved organization
|
||||
- Guides/ directory replaces docs/ for improved organization
|
||||
|
||||
## [4.0.6] - 2025-08-23
|
||||
|
||||
|
||||
@ -12,7 +12,7 @@ SuperClaude Framework transforms Claude Code into a structured development platf
|
||||
**Before Reporting:**
|
||||
- Search existing issues to avoid duplicates
|
||||
- Test with latest SuperClaude version
|
||||
- Verify issue isn't covered in [Troubleshooting Guide](Docs/Reference/troubleshooting.md)
|
||||
- Verify issue isn't covered in [Troubleshooting Guide](docs/Reference/troubleshooting.md)
|
||||
|
||||
**Required Information:**
|
||||
- SuperClaude version: `SuperClaude --version`
|
||||
@ -188,8 +188,8 @@ Reference/ # Best practices and troubleshooting
|
||||
- Security best practices for external integrations
|
||||
|
||||
**Development Workflow:**
|
||||
1. Review [Technical Architecture](Docs/Developer-Guide/technical-architecture.md)
|
||||
2. Study [Contributing Code Guide](Docs/Developer-Guide/contributing-code.md)
|
||||
1. Review [Technical Architecture](docs/Developer-Guide/technical-architecture.md)
|
||||
2. Study [Contributing Code Guide](docs/Developer-Guide/contributing-code.md)
|
||||
3. Set up development environment
|
||||
4. Create feature branch from `master`
|
||||
5. Implement changes with tests
|
||||
@ -203,7 +203,7 @@ Reference/ # Best practices and troubleshooting
|
||||
- Documentation completeness and clarity
|
||||
- Test coverage and quality
|
||||
|
||||
For detailed development guidelines, see [Contributing Code Guide](Docs/Developer-Guide/contributing-code.md).
|
||||
For detailed development guidelines, see [Contributing Code Guide](docs/Developer-Guide/contributing-code.md).
|
||||
|
||||
## 🤝 Community Guidelines
|
||||
|
||||
@ -315,14 +315,14 @@ SuperClaude Framework enhances Claude Code for systematic software development w
|
||||
- Design discussions for major features
|
||||
|
||||
**Documentation Resources**
|
||||
- [Troubleshooting Guide](Docs/Reference/troubleshooting.md) - Common issues and solutions
|
||||
- [Examples Cookbook](Docs/Reference/examples-cookbook.md) - Practical usage patterns
|
||||
- [Quick Start Practices](Docs/Reference/quick-start-practices.md) - Optimization strategies
|
||||
- [Technical Architecture](Docs/Developer-Guide/technical-architecture.md) - Framework design
|
||||
- [Troubleshooting Guide](docs/Reference/troubleshooting.md) - Common issues and solutions
|
||||
- [Examples Cookbook](docs/Reference/examples-cookbook.md) - Practical usage patterns
|
||||
- [Quick Start Practices](docs/Reference/quick-start-practices.md) - Optimization strategies
|
||||
- [Technical Architecture](docs/Developer-Guide/technical-architecture.md) - Framework design
|
||||
|
||||
**Development Support**
|
||||
- [Contributing Code Guide](Docs/Developer-Guide/contributing-code.md) - Development setup
|
||||
- [Testing & Debugging](Docs/Developer-Guide/testing-debugging.md) - Quality procedures
|
||||
- [Contributing Code Guide](docs/Developer-Guide/contributing-code.md) - Development setup
|
||||
- [Testing & Debugging](docs/Developer-Guide/testing-debugging.md) - Quality procedures
|
||||
- Code review process through pull requests
|
||||
- Maintainer guidance on complex contributions
|
||||
|
||||
@ -344,7 +344,7 @@ Before seeking support, please:
|
||||
**Development Environment Issues:**
|
||||
|
||||
**Q: "SuperClaude install fails with permission errors"**
|
||||
A: Use `pip install --user SuperClaude` or create virtual environment. See [Installation Guide](Docs/Getting-Started/installation.md) for details.
|
||||
A: Use `pip install --user SuperClaude` or create virtual environment. See [Installation Guide](docs/Getting-Started/installation.md) for details.
|
||||
|
||||
**Q: "Commands not recognized after installation"**
|
||||
A: Restart Claude Code session. Verify installation with `SuperClaude install --list-components`. Check ~/.claude directory exists.
|
||||
@ -358,7 +358,7 @@ A: Check Node.js installation for MCP servers. Verify ~/.claude/.claude.json con
|
||||
A: Follow agent patterns in setup/components/agents.py. Include trigger keywords, capabilities description, and integration tests.
|
||||
|
||||
**Q: "Testing framework setup?"**
|
||||
A: See [Testing & Debugging Guide](Docs/Developer-Guide/testing-debugging.md). Use pytest for Python tests, include component validation.
|
||||
A: See [Testing & Debugging Guide](docs/Developer-Guide/testing-debugging.md). Use pytest for Python tests, include component validation.
|
||||
|
||||
**Q: "Documentation structure?"**
|
||||
A: Follow existing patterns: Getting-Started → User-Guide → Developer-Guide → Reference. Include examples and progressive complexity.
|
||||
|
||||
30
README-ja.md
30
README-ja.md
@ -14,7 +14,7 @@
|
||||
<a href="https://superclaude.netlify.app/">
|
||||
<img src="https://img.shields.io/badge/🌐_ウェブサイトを訪問-blue" alt="Website">
|
||||
</a>
|
||||
<a href="https://pypi.org/project/SuperClaude/">
|
||||
<a href="https://pypi.org/project/superclaude/">
|
||||
<img src="https://img.shields.io/pypi/v/SuperClaude.svg?" alt="PyPI">
|
||||
</a>
|
||||
<a href="https://www.npmjs.com/package/@bifrost_inc/superclaude">
|
||||
@ -275,55 +275,55 @@ pip install --break-system-packages SuperClaude
|
||||
<tr>
|
||||
<td valign="top">
|
||||
|
||||
- 📝 [**クイックスタートガイド**](Docs/Getting-Started/quick-start.md)
|
||||
- 📝 [**クイックスタートガイド**](docs/Getting-Started/quick-start.md)
|
||||
*すぐに開始*
|
||||
|
||||
- 💾 [**インストールガイド**](Docs/Getting-Started/installation.md)
|
||||
- 💾 [**インストールガイド**](docs/Getting-Started/installation.md)
|
||||
*詳細なセットアップ手順*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- 🎯 [**コマンドリファレンス**](Docs/User-Guide-jp/commands.md)
|
||||
- 🎯 [**コマンドリファレンス**](docs/User-Guide-jp/commands.md)
|
||||
*全21のスラッシュコマンド*
|
||||
|
||||
- 🤖 [**エージェントガイド**](Docs/User-Guide-jp/agents.md)
|
||||
- 🤖 [**エージェントガイド**](docs/User-Guide-jp/agents.md)
|
||||
*14の専門エージェント*
|
||||
|
||||
- 🎨 [**動作モード**](Docs/User-Guide-jp/modes.md)
|
||||
- 🎨 [**動作モード**](docs/User-Guide-jp/modes.md)
|
||||
*5つの適応モード*
|
||||
|
||||
- 🚩 [**フラグガイド**](Docs/User-Guide-jp/flags.md)
|
||||
- 🚩 [**フラグガイド**](docs/User-Guide-jp/flags.md)
|
||||
*動作制御パラメータ*
|
||||
|
||||
- 🔧 [**MCPサーバー**](Docs/User-Guide-jp/mcp-servers.md)
|
||||
- 🔧 [**MCPサーバー**](docs/User-Guide-jp/mcp-servers.md)
|
||||
*6つのサーバー統合*
|
||||
|
||||
- 💼 [**セッション管理**](Docs/User-Guide-jp/session-management.md)
|
||||
- 💼 [**セッション管理**](docs/User-Guide-jp/session-management.md)
|
||||
*状態の保存と復元*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- 🏗️ [**技術アーキテクチャ**](Docs/Developer-Guide/technical-architecture.md)
|
||||
- 🏗️ [**技術アーキテクチャ**](docs/Developer-Guide/technical-architecture.md)
|
||||
*システム設計の詳細*
|
||||
|
||||
- 💻 [**コード貢献**](Docs/Developer-Guide/contributing-code.md)
|
||||
- 💻 [**コード貢献**](docs/Developer-Guide/contributing-code.md)
|
||||
*開発ワークフロー*
|
||||
|
||||
- 🧪 [**テスト&デバッグ**](Docs/Developer-Guide/testing-debugging.md)
|
||||
- 🧪 [**テスト&デバッグ**](docs/Developer-Guide/testing-debugging.md)
|
||||
*品質保証*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- ✨ [**ベストプラクティス**](Docs/Reference/quick-start-practices.md)
|
||||
- ✨ [**ベストプラクティス**](docs/Reference/quick-start-practices.md)
|
||||
*プロのコツとパターン*
|
||||
|
||||
- 📓 [**サンプル集**](Docs/Reference/examples-cookbook.md)
|
||||
- 📓 [**サンプル集**](docs/Reference/examples-cookbook.md)
|
||||
*実際の使用例*
|
||||
|
||||
- 🔍 [**トラブルシューティング**](Docs/Reference/troubleshooting.md)
|
||||
- 🔍 [**トラブルシューティング**](docs/Reference/troubleshooting.md)
|
||||
*一般的な問題と修正*
|
||||
|
||||
</td>
|
||||
|
||||
30
README-kr.md
30
README-kr.md
@ -14,7 +14,7 @@
|
||||
<a href="https://superclaude.netlify.app/">
|
||||
<img src="https://img.shields.io/badge/🌐_웹사이트_방문-blue" alt="Website">
|
||||
</a>
|
||||
<a href="https://pypi.org/project/SuperClaude/">
|
||||
<a href="https://pypi.org/project/superclaude/">
|
||||
<img src="https://img.shields.io/pypi/v/SuperClaude.svg?" alt="PyPI">
|
||||
</a>
|
||||
<a href="https://www.npmjs.com/package/@bifrost_inc/superclaude">
|
||||
@ -278,55 +278,55 @@ pip install --break-system-packages SuperClaude
|
||||
<tr>
|
||||
<td valign="top">
|
||||
|
||||
- 📝 [**빠른 시작 가이드**](Docs/Getting-Started/quick-start.md)
|
||||
- 📝 [**빠른 시작 가이드**](docs/Getting-Started/quick-start.md)
|
||||
*즉시 시작하기*
|
||||
|
||||
- 💾 [**설치 가이드**](Docs/Getting-Started/installation.md)
|
||||
- 💾 [**설치 가이드**](docs/Getting-Started/installation.md)
|
||||
*상세한 설정 단계*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- 🎯 [**명령어 레퍼런스**](Docs/User-Guide/commands.md)
|
||||
- 🎯 [**명령어 레퍼런스**](docs/User-Guide/commands.md)
|
||||
*전체 21개 슬래시 명령어*
|
||||
|
||||
- 🤖 [**에이전트 가이드**](Docs/User-Guide/agents.md)
|
||||
- 🤖 [**에이전트 가이드**](docs/User-Guide/agents.md)
|
||||
*14개 전문 에이전트*
|
||||
|
||||
- 🎨 [**작동 모드**](Docs/User-Guide/modes.md)
|
||||
- 🎨 [**작동 모드**](docs/User-Guide/modes.md)
|
||||
*5가지 적응형 모드*
|
||||
|
||||
- 🚩 [**플래그 가이드**](Docs/User-Guide/flags.md)
|
||||
- 🚩 [**플래그 가이드**](docs/User-Guide/flags.md)
|
||||
*동작 제어 매개변수*
|
||||
|
||||
- 🔧 [**MCP 서버**](Docs/User-Guide/mcp-servers.md)
|
||||
- 🔧 [**MCP 서버**](docs/User-Guide/mcp-servers.md)
|
||||
*6개 서버 통합*
|
||||
|
||||
- 💼 [**세션 관리**](Docs/User-Guide/session-management.md)
|
||||
- 💼 [**세션 관리**](docs/User-Guide/session-management.md)
|
||||
*상태 저장 및 복원*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- 🏗️ [**기술 아키텍처**](Docs/Developer-Guide/technical-architecture.md)
|
||||
- 🏗️ [**기술 아키텍처**](docs/Developer-Guide/technical-architecture.md)
|
||||
*시스템 설계 세부사항*
|
||||
|
||||
- 💻 [**코드 기여**](Docs/Developer-Guide/contributing-code.md)
|
||||
- 💻 [**코드 기여**](docs/Developer-Guide/contributing-code.md)
|
||||
*개발 워크플로우*
|
||||
|
||||
- 🧪 [**테스트 및 디버깅**](Docs/Developer-Guide/testing-debugging.md)
|
||||
- 🧪 [**테스트 및 디버깅**](docs/Developer-Guide/testing-debugging.md)
|
||||
*품질 보증*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- ✨ [**모범 사례**](Docs/Reference/quick-start-practices.md)
|
||||
- ✨ [**모범 사례**](docs/Reference/quick-start-practices.md)
|
||||
*전문가 팁과 패턴*
|
||||
|
||||
- 📓 [**예제 모음**](Docs/Reference/examples-cookbook.md)
|
||||
- 📓 [**예제 모음**](docs/Reference/examples-cookbook.md)
|
||||
*실제 사용 예제*
|
||||
|
||||
- 🔍 [**문제 해결**](Docs/Reference/troubleshooting.md)
|
||||
- 🔍 [**문제 해결**](docs/Reference/troubleshooting.md)
|
||||
*일반적인 문제와 수정*
|
||||
|
||||
</td>
|
||||
|
||||
30
README-zh.md
30
README-zh.md
@ -14,7 +14,7 @@
|
||||
<a href="https://superclaude.netlify.app/">
|
||||
<img src="https://img.shields.io/badge/🌐_访问网站-blue" alt="Website">
|
||||
</a>
|
||||
<a href="https://pypi.org/project/SuperClaude/">
|
||||
<a href="https://pypi.org/project/superclaude/">
|
||||
<img src="https://img.shields.io/pypi/v/SuperClaude.svg?" alt="PyPI">
|
||||
</a>
|
||||
<a href="https://www.npmjs.com/package/@bifrost_inc/superclaude">
|
||||
@ -275,55 +275,55 @@ pip install --break-system-packages SuperClaude
|
||||
<tr>
|
||||
<td valign="top">
|
||||
|
||||
- 📝 [**快速开始指南**](Docs/Getting-Started/quick-start.md)
|
||||
- 📝 [**快速开始指南**](docs/Getting-Started/quick-start.md)
|
||||
*快速上手使用*
|
||||
|
||||
- 💾 [**安装指南**](Docs/Getting-Started/installation.md)
|
||||
- 💾 [**安装指南**](docs/Getting-Started/installation.md)
|
||||
*详细的安装说明*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- 🎯 [**命令参考**](Docs/User-Guide-zh/commands.md)
|
||||
- 🎯 [**命令参考**](docs/User-Guide-zh/commands.md)
|
||||
*全部21个斜杠命令*
|
||||
|
||||
- 🤖 [**智能体指南**](Docs/User-Guide-zh/agents.md)
|
||||
- 🤖 [**智能体指南**](docs/User-Guide-zh/agents.md)
|
||||
*14个专业智能体*
|
||||
|
||||
- 🎨 [**行为模式**](Docs/User-Guide-zh/modes.md)
|
||||
- 🎨 [**行为模式**](docs/User-Guide-zh/modes.md)
|
||||
*5种自适应模式*
|
||||
|
||||
- 🚩 [**标志指南**](Docs/User-Guide-zh/flags.md)
|
||||
- 🚩 [**标志指南**](docs/User-Guide-zh/flags.md)
|
||||
*控制行为参数*
|
||||
|
||||
- 🔧 [**MCP服务器**](Docs/User-Guide-zh/mcp-servers.md)
|
||||
- 🔧 [**MCP服务器**](docs/User-Guide-zh/mcp-servers.md)
|
||||
*6个服务器集成*
|
||||
|
||||
- 💼 [**会话管理**](Docs/User-Guide-zh/session-management.md)
|
||||
- 💼 [**会话管理**](docs/User-Guide-zh/session-management.md)
|
||||
*保存和恢复状态*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- 🏗️ [**技术架构**](Docs/Developer-Guide/technical-architecture.md)
|
||||
- 🏗️ [**技术架构**](docs/Developer-Guide/technical-architecture.md)
|
||||
*系统设计详情*
|
||||
|
||||
- 💻 [**贡献代码**](Docs/Developer-Guide/contributing-code.md)
|
||||
- 💻 [**贡献代码**](docs/Developer-Guide/contributing-code.md)
|
||||
*开发工作流程*
|
||||
|
||||
- 🧪 [**测试与调试**](Docs/Developer-Guide/testing-debugging.md)
|
||||
- 🧪 [**测试与调试**](docs/Developer-Guide/testing-debugging.md)
|
||||
*质量保证*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- ✨ [**最佳实践**](Docs/Reference/quick-start-practices.md)
|
||||
- ✨ [**最佳实践**](docs/Reference/quick-start-practices.md)
|
||||
*专业技巧和模式*
|
||||
|
||||
- 📓 [**示例手册**](Docs/Reference/examples-cookbook.md)
|
||||
- 📓 [**示例手册**](docs/Reference/examples-cookbook.md)
|
||||
*实际应用示例*
|
||||
|
||||
- 🔍 [**故障排除**](Docs/Reference/troubleshooting.md)
|
||||
- 🔍 [**故障排除**](docs/Reference/troubleshooting.md)
|
||||
*常见问题和修复*
|
||||
|
||||
</td>
|
||||
|
||||
28
README.md
28
README.md
@ -23,7 +23,7 @@
|
||||
<a href="https://superclaude.netlify.app/">
|
||||
<img src="https://img.shields.io/badge/🌐_Visit_Website-blue" alt="Website">
|
||||
</a>
|
||||
<a href="https://pypi.org/project/SuperClaude/">
|
||||
<a href="https://pypi.org/project/superclaude/">
|
||||
<img src="https://img.shields.io/pypi/v/SuperClaude.svg?" alt="PyPI">
|
||||
</a>
|
||||
<a href="https://pepy.tech/projects/superclaude">
|
||||
@ -392,51 +392,51 @@ The Deep Research system intelligently coordinates multiple tools:
|
||||
<tr>
|
||||
<td valign="top">
|
||||
|
||||
- 📝 [**Quick Start Guide**](Docs/Getting-Started/quick-start.md)
|
||||
- 📝 [**Quick Start Guide**](docs/Getting-Started/quick-start.md)
|
||||
*Get up and running fast*
|
||||
|
||||
- 💾 [**Installation Guide**](Docs/Getting-Started/installation.md)
|
||||
- 💾 [**Installation Guide**](docs/Getting-Started/installation.md)
|
||||
*Detailed setup instructions*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- 🎯 [**Commands Reference**](Docs/User-Guide/commands.md)
|
||||
- 🎯 [**Commands Reference**](docs/User-Guide/commands.md)
|
||||
*All 25 slash commands*
|
||||
|
||||
- 🤖 [**Agents Guide**](Docs/User-Guide/agents.md)
|
||||
- 🤖 [**Agents Guide**](docs/User-Guide/agents.md)
|
||||
*15 specialized agents*
|
||||
|
||||
- 🎨 [**Behavioral Modes**](Docs/User-Guide/modes.md)
|
||||
- 🎨 [**Behavioral Modes**](docs/User-Guide/modes.md)
|
||||
*7 adaptive modes*
|
||||
|
||||
- 🚩 [**Flags Guide**](Docs/User-Guide/flags.md)
|
||||
- 🚩 [**Flags Guide**](docs/User-Guide/flags.md)
|
||||
*Control behaviors*
|
||||
|
||||
- 🔧 [**MCP Servers**](Docs/User-Guide/mcp-servers.md)
|
||||
- 🔧 [**MCP Servers**](docs/User-Guide/mcp-servers.md)
|
||||
*7 server integrations*
|
||||
|
||||
- 💼 [**Session Management**](Docs/User-Guide/session-management.md)
|
||||
- 💼 [**Session Management**](docs/User-Guide/session-management.md)
|
||||
*Save & restore state*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
||||
- 🏗️ [**Technical Architecture**](Docs/Developer-Guide/technical-architecture.md)
|
||||
- 🏗️ [**Technical Architecture**](docs/Developer-Guide/technical-architecture.md)
|
||||
*System design details*
|
||||
|
||||
- 💻 [**Contributing Code**](Docs/Developer-Guide/contributing-code.md)
|
||||
- 💻 [**Contributing Code**](docs/Developer-Guide/contributing-code.md)
|
||||
*Development workflow*
|
||||
|
||||
- 🧪 [**Testing & Debugging**](Docs/Developer-Guide/testing-debugging.md)
|
||||
- 🧪 [**Testing & Debugging**](docs/Developer-Guide/testing-debugging.md)
|
||||
*Quality assurance*
|
||||
|
||||
</td>
|
||||
<td valign="top">
|
||||
- 📓 [**Examples Cookbook**](Docs/Reference/examples-cookbook.md)
|
||||
- 📓 [**Examples Cookbook**](docs/Reference/examples-cookbook.md)
|
||||
*Real-world recipes*
|
||||
|
||||
- 🔍 [**Troubleshooting**](Docs/Reference/troubleshooting.md)
|
||||
- 🔍 [**Troubleshooting**](docs/Reference/troubleshooting.md)
|
||||
*Common issues & fixes*
|
||||
|
||||
</td>
|
||||
|
||||
18
SECURITY.md
18
SECURITY.md
@ -631,7 +631,7 @@ For critical vulnerabilities requiring immediate attention:
|
||||
**General Security Questions:**
|
||||
- **GitHub Discussions**: https://github.com/SuperClaude-Org/SuperClaude_Framework/discussions
|
||||
- **Community Forums**: Security-focused discussion threads
|
||||
- **Documentation**: [Security Best Practices](Docs/Reference/quick-start-practices.md#security-practices)
|
||||
- **Documentation**: [Security Best Practices](docs/Reference/quick-start-practices.md#security-practices)
|
||||
- **Issue Tracker**: Non-sensitive security configuration questions
|
||||
|
||||
**Technical Security Support:**
|
||||
@ -663,25 +663,25 @@ For organizations requiring dedicated security support:
|
||||
|
||||
### Security-Related Documentation
|
||||
**Framework Security Documentation:**
|
||||
- [Quick Start Practices Guide](Docs/Reference/quick-start-practices.md) - Security-focused usage patterns
|
||||
- [Technical Architecture](Docs/Developer-Guide/technical-architecture.md) - Security design principles
|
||||
- [Contributing Code Guide](Docs/Developer-Guide/contributing-code.md) - Secure development practices
|
||||
- [Testing & Debugging Guide](Docs/Developer-Guide/testing-debugging.md) - Security testing procedures
|
||||
- [Quick Start Practices Guide](docs/Reference/quick-start-practices.md) - Security-focused usage patterns
|
||||
- [Technical Architecture](docs/Developer-Guide/technical-architecture.md) - Security design principles
|
||||
- [Contributing Code Guide](docs/Developer-Guide/contributing-code.md) - Secure development practices
|
||||
- [Testing & Debugging Guide](docs/Developer-Guide/testing-debugging.md) - Security testing procedures
|
||||
|
||||
**MCP Server Security:**
|
||||
- [MCP Servers Guide](Docs/User-Guide/mcp-servers.md) - Server security configuration
|
||||
- [Troubleshooting Guide](Docs/Reference/troubleshooting.md) - Security-related issue resolution
|
||||
- [MCP Servers Guide](docs/User-Guide/mcp-servers.md) - Server security configuration
|
||||
- [Troubleshooting Guide](docs/Reference/troubleshooting.md) - Security-related issue resolution
|
||||
- MCP Server Documentation - Individual server security considerations
|
||||
- Configuration Security - Secure MCP setup and credential management
|
||||
|
||||
**Agent Security:**
|
||||
- [Agents Guide](Docs/User-Guide/agents.md) - Agent security boundaries and coordination
|
||||
- [Agents Guide](docs/User-Guide/agents.md) - Agent security boundaries and coordination
|
||||
- Agent Development - Security considerations for agent implementation
|
||||
- Behavioral Modes - Security implications of different operational modes
|
||||
- Command Security - Security aspects of command execution and validation
|
||||
|
||||
**Session Management Security:**
|
||||
- [Session Management Guide](Docs/User-Guide/session-management.md) - Secure session handling
|
||||
- [Session Management Guide](docs/User-Guide/session-management.md) - Secure session handling
|
||||
- Memory Security - Secure handling of persistent session data
|
||||
- Project Isolation - Security boundaries between different projects
|
||||
- Context Security - Secure context loading and validation
|
||||
|
||||
@ -1,291 +0,0 @@
|
||||
---
|
||||
name: pm
|
||||
description: "Project Manager Agent - Default orchestration agent that coordinates all sub-agents and manages workflows seamlessly"
|
||||
category: orchestration
|
||||
complexity: meta
|
||||
mcp-servers: [sequential, context7, magic, playwright, morphllm, serena, tavily, chrome-devtools]
|
||||
personas: [pm-agent]
|
||||
---
|
||||
|
||||
# /sc:pm - Project Manager Agent
|
||||
|
||||
> **Default Orchestration Mode**: PM Agent is the default entry point for all user interactions. It automatically delegates to appropriate specialist agents based on task analysis without requiring manual agent selection.
|
||||
|
||||
## Triggers
|
||||
- **Auto-Activation**: All user requests default to PM Agent unless explicit sub-agent override
|
||||
- Vague project requests: "作りたい", "実装したい", "どうすれば"
|
||||
- Multi-domain tasks requiring cross-functional coordination
|
||||
- Ambiguous requirements needing discovery before implementation
|
||||
- Complex projects requiring systematic planning and execution
|
||||
|
||||
## Context Trigger Pattern
|
||||
```
|
||||
# Default (no command needed - PM Agent handles all interactions)
|
||||
"Build authentication system for my app"
|
||||
|
||||
# Explicit PM Agent invocation (optional)
|
||||
/sc:pm [request] [--strategy brainstorm|direct|wave] [--verbose]
|
||||
|
||||
# Override to specific sub-agent (optional)
|
||||
/sc:implement "user profile" --agent backend
|
||||
```
|
||||
|
||||
## Behavioral Flow
|
||||
1. **Request Analysis**: Parse user intent, classify complexity, identify required domains
|
||||
2. **Strategy Selection**: Choose execution approach (Brainstorming, Direct, Multi-Agent, Wave)
|
||||
3. **Sub-Agent Delegation**: Auto-select optimal specialists without manual routing
|
||||
4. **MCP Orchestration**: Dynamically load tools per phase, unload after completion
|
||||
5. **Progress Monitoring**: Track execution via TodoWrite, validate quality gates
|
||||
6. **Self-Improvement**: Document continuously (implementations, mistakes, patterns)
|
||||
|
||||
Key behaviors:
|
||||
- **Seamless Orchestration**: Users interact only with PM Agent, sub-agents work transparently
|
||||
- **Auto-Delegation**: Intelligent routing to domain specialists based on task analysis
|
||||
- **Zero-Token Efficiency**: Dynamic MCP tool loading via Docker Gateway integration
|
||||
- **Self-Documenting**: Automatic knowledge capture in project docs and CLAUDE.md
|
||||
|
||||
## MCP Integration (Docker Gateway Pattern)
|
||||
|
||||
### Zero-Token Baseline
|
||||
- **Start**: No MCP tools loaded (gateway URL only)
|
||||
- **Load**: On-demand tool activation per execution phase
|
||||
- **Unload**: Tool removal after phase completion
|
||||
- **Cache**: Strategic tool retention for sequential phases
|
||||
|
||||
### Phase-Based Tool Loading
|
||||
```yaml
|
||||
Discovery Phase:
|
||||
Load: [sequential, context7]
|
||||
Execute: Requirements analysis, pattern research
|
||||
Unload: After requirements complete
|
||||
|
||||
Design Phase:
|
||||
Load: [sequential, magic]
|
||||
Execute: Architecture planning, UI mockups
|
||||
Unload: After design approval
|
||||
|
||||
Implementation Phase:
|
||||
Load: [context7, magic, morphllm]
|
||||
Execute: Code generation, bulk transformations
|
||||
Unload: After implementation complete
|
||||
|
||||
Testing Phase:
|
||||
Load: [playwright, sequential]
|
||||
Execute: E2E testing, quality validation
|
||||
Unload: After tests pass
|
||||
```
|
||||
|
||||
## Sub-Agent Orchestration Patterns
|
||||
|
||||
### Vague Feature Request Pattern
|
||||
```
|
||||
User: "アプリに認証機能作りたい"
|
||||
|
||||
PM Agent Workflow:
|
||||
1. Activate Brainstorming Mode
|
||||
→ Socratic questioning to discover requirements
|
||||
2. Delegate to requirements-analyst
|
||||
→ Create formal PRD with acceptance criteria
|
||||
3. Delegate to system-architect
|
||||
→ Architecture design (JWT, OAuth, Supabase Auth)
|
||||
4. Delegate to security-engineer
|
||||
→ Threat modeling, security patterns
|
||||
5. Delegate to backend-architect
|
||||
→ Implement authentication middleware
|
||||
6. Delegate to quality-engineer
|
||||
→ Security testing, integration tests
|
||||
7. Delegate to technical-writer
|
||||
→ Documentation, update CLAUDE.md
|
||||
|
||||
Output: Complete authentication system with docs
|
||||
```
|
||||
|
||||
### Clear Implementation Pattern
|
||||
```
|
||||
User: "Fix the login form validation bug in LoginForm.tsx:45"
|
||||
|
||||
PM Agent Workflow:
|
||||
1. Load: [context7] for validation patterns
|
||||
2. Analyze: Read LoginForm.tsx, identify root cause
|
||||
3. Delegate to refactoring-expert
|
||||
→ Fix validation logic, add missing tests
|
||||
4. Delegate to quality-engineer
|
||||
→ Validate fix, run regression tests
|
||||
5. Document: Update self-improvement-workflow.md
|
||||
|
||||
Output: Fixed bug with tests and documentation
|
||||
```
|
||||
|
||||
### Multi-Domain Complex Project Pattern
|
||||
```
|
||||
User: "Build a real-time chat feature with video calling"
|
||||
|
||||
PM Agent Workflow:
|
||||
1. Delegate to requirements-analyst
|
||||
→ User stories, acceptance criteria
|
||||
2. Delegate to system-architect
|
||||
→ Architecture (Supabase Realtime, WebRTC)
|
||||
3. Phase 1 (Parallel):
|
||||
- backend-architect: Realtime subscriptions
|
||||
- backend-architect: WebRTC signaling
|
||||
- security-engineer: Security review
|
||||
4. Phase 2 (Parallel):
|
||||
- frontend-architect: Chat UI components
|
||||
- frontend-architect: Video calling UI
|
||||
- Load magic: Component generation
|
||||
5. Phase 3 (Sequential):
|
||||
- Integration: Chat + video
|
||||
- Load playwright: E2E testing
|
||||
6. Phase 4 (Parallel):
|
||||
- quality-engineer: Testing
|
||||
- performance-engineer: Optimization
|
||||
- security-engineer: Security audit
|
||||
7. Phase 5:
|
||||
- technical-writer: User guide
|
||||
- Update architecture docs
|
||||
|
||||
Output: Production-ready real-time chat with video
|
||||
```
|
||||
|
||||
## Tool Coordination
|
||||
- **TodoWrite**: Hierarchical task tracking across all phases
|
||||
- **Task**: Advanced delegation for complex multi-agent coordination
|
||||
- **Write/Edit/MultiEdit**: Cross-agent code generation and modification
|
||||
- **Read/Grep/Glob**: Context gathering for sub-agent coordination
|
||||
- **sequentialthinking**: Structured reasoning for complex delegation decisions
|
||||
|
||||
## Key Patterns
|
||||
- **Default Orchestration**: PM Agent handles all user interactions by default
|
||||
- **Auto-Delegation**: Intelligent sub-agent selection without manual routing
|
||||
- **Phase-Based MCP**: Dynamic tool loading/unloading for resource efficiency
|
||||
- **Self-Improvement**: Continuous documentation of implementations and patterns
|
||||
|
||||
## Examples
|
||||
|
||||
### Default Usage (No Command Needed)
|
||||
```
|
||||
# User simply describes what they want
|
||||
User: "Need to add payment processing to the app"
|
||||
|
||||
# PM Agent automatically handles orchestration
|
||||
PM Agent: Analyzing requirements...
|
||||
→ Delegating to requirements-analyst for specification
|
||||
→ Coordinating backend-architect + security-engineer
|
||||
→ Engaging payment processing implementation
|
||||
→ Quality validation with testing
|
||||
→ Documentation update
|
||||
|
||||
Output: Complete payment system implementation
|
||||
```
|
||||
|
||||
### Explicit Strategy Selection
|
||||
```
|
||||
/sc:pm "Improve application security" --strategy wave
|
||||
|
||||
# Wave mode for large-scale security audit
|
||||
PM Agent: Initiating comprehensive security analysis...
|
||||
→ Wave 1: Security engineer audits (authentication, authorization)
|
||||
→ Wave 2: Backend architect reviews (API security, data validation)
|
||||
→ Wave 3: Quality engineer tests (penetration testing, vulnerability scanning)
|
||||
→ Wave 4: Documentation (security policies, incident response)
|
||||
|
||||
Output: Comprehensive security improvements with documentation
|
||||
```
|
||||
|
||||
### Brainstorming Mode
|
||||
```
|
||||
User: "Maybe we could improve the user experience?"
|
||||
|
||||
PM Agent: Activating Brainstorming Mode...
|
||||
🤔 Discovery Questions:
|
||||
- What specific UX challenges are users facing?
|
||||
- Which workflows are most problematic?
|
||||
- Have you gathered user feedback or analytics?
|
||||
- What are your improvement priorities?
|
||||
|
||||
📝 Brief: [Generate structured improvement plan]
|
||||
|
||||
Output: Clear UX improvement roadmap with priorities
|
||||
```
|
||||
|
||||
### Manual Sub-Agent Override (Optional)
|
||||
```
|
||||
# User can still specify sub-agents directly if desired
|
||||
/sc:implement "responsive navbar" --agent frontend
|
||||
|
||||
# PM Agent delegates to specified agent
|
||||
PM Agent: Routing to frontend-architect...
|
||||
→ Frontend specialist handles implementation
|
||||
→ PM Agent monitors progress and quality gates
|
||||
|
||||
Output: Frontend-optimized implementation
|
||||
```
|
||||
|
||||
## Self-Improvement Integration
|
||||
|
||||
### Implementation Documentation
|
||||
```yaml
|
||||
After each successful implementation:
|
||||
- Update docs/ with new patterns discovered
|
||||
- Document architecture decisions in ADR format
|
||||
- Add working examples to project documentation
|
||||
- Update CLAUDE.md with new best practices
|
||||
```
|
||||
|
||||
### Mistake Recording
|
||||
```yaml
|
||||
When errors occur:
|
||||
- Capture error in self-improvement-workflow.md
|
||||
- Document root cause analysis
|
||||
- Create prevention checklist
|
||||
- Update anti-patterns documentation
|
||||
```
|
||||
|
||||
### Monthly Maintenance
|
||||
```yaml
|
||||
Regular documentation health:
|
||||
- Remove outdated patterns and deprecated approaches
|
||||
- Merge duplicate documentation
|
||||
- Update version numbers and dependencies
|
||||
- Prune noise, keep essential knowledge
|
||||
```
|
||||
|
||||
## Boundaries
|
||||
|
||||
**Will:**
|
||||
- Orchestrate all user interactions and automatically delegate to appropriate specialists
|
||||
- Provide seamless experience without requiring manual agent selection
|
||||
- Dynamically load/unload MCP tools for resource efficiency
|
||||
- Continuously document implementations, mistakes, and patterns
|
||||
- Transparently report delegation decisions and progress
|
||||
|
||||
**Will Not:**
|
||||
- Bypass quality gates or compromise standards for speed
|
||||
- Make unilateral technical decisions without appropriate sub-agent expertise
|
||||
- Execute without proper planning for complex multi-domain projects
|
||||
- Skip documentation or self-improvement recording steps
|
||||
|
||||
**User Control:**
|
||||
- Default: PM Agent auto-delegates (seamless)
|
||||
- Override: Explicit `--agent [name]` for direct sub-agent access
|
||||
- Both options available simultaneously (no user downside)
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Resource Efficiency
|
||||
- **Zero-Token Baseline**: Start with no MCP tools (gateway only)
|
||||
- **Dynamic Loading**: Load tools only when needed per phase
|
||||
- **Strategic Unloading**: Remove tools after phase completion
|
||||
- **Parallel Execution**: Concurrent sub-agent delegation when independent
|
||||
|
||||
### Quality Assurance
|
||||
- **Domain Expertise**: Route to specialized agents for quality
|
||||
- **Cross-Validation**: Multiple agent perspectives for complex decisions
|
||||
- **Quality Gates**: Systematic validation at phase transitions
|
||||
- **User Feedback**: Incorporate user guidance throughout execution
|
||||
|
||||
### Continuous Learning
|
||||
- **Pattern Recognition**: Identify recurring successful patterns
|
||||
- **Mistake Prevention**: Document errors with prevention checklist
|
||||
- **Documentation Pruning**: Monthly cleanup to remove noise
|
||||
- **Knowledge Synthesis**: Codify learnings in CLAUDE.md and docs/
|
||||
@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env node
|
||||
const { spawnSync } = require("child_process");
|
||||
const { detectPython, detectPip } = require("./checkEnv");
|
||||
const { checkAndNotify } = require("./checkUpdate");
|
||||
const { detectPython, detectPip } = require("./check_env");
|
||||
const { checkAndNotify } = require("./check_update");
|
||||
|
||||
let pythonCmd = detectPython();
|
||||
if (!pythonCmd) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env node
|
||||
const { run, detectPython, detectPip, detectPipx, isSuperClaudeInstalled, isSuperClaudeInstalledPipx, checkPythonEnvironment } = require("./checkEnv");
|
||||
const { run, detectPython, detectPip, detectPipx, isSuperClaudeInstalled, isSuperClaudeInstalledPipx, checkPythonEnvironment } = require("./check_env");
|
||||
|
||||
console.log("🔍 Checking environment...");
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env node
|
||||
const { run, detectPip, detectPipx, isSuperClaudeInstalledPipx, checkPythonEnvironment } = require("./checkEnv");
|
||||
const { run, detectPip, detectPipx, isSuperClaudeInstalledPipx, checkPythonEnvironment } = require("./check_env");
|
||||
|
||||
console.log("🔄 Checking for SuperClaude updates...");
|
||||
|
||||
|
||||
@ -57,14 +57,14 @@ SuperClaude is a **Context-Oriented Configuration Framework** - not executing so
|
||||
|
||||
```
|
||||
SuperClaude_Framework/
|
||||
├── SuperClaude/ # Framework components (the source of truth)
|
||||
├── superclaude/ # Framework components (the source of truth)
|
||||
│ ├── Core/ # PRINCIPLES.md, RULES.md, FLAGS.md
|
||||
│ ├── Agents/ # 15 specialized domain experts
|
||||
│ ├── Commands/ # 21 context trigger patterns (/sc: behavioral instructions)
|
||||
│ ├── Modes/ # 6 behavioral modification patterns
|
||||
│ └── MCP/ # 6 MCP server configurations
|
||||
├── setup/ # Python installation system
|
||||
├── Docs/ # Documentation (what you're reading)
|
||||
├── docs/ # Documentation (what you're reading)
|
||||
└── tests/ # File validation scripts
|
||||
```
|
||||
|
||||
@ -82,7 +82,7 @@ User Input → Claude Code → Reads SuperClaude Context → Modified Behavior
|
||||
```
|
||||
|
||||
1. User types `/sc:implement "auth system"` **in Claude Code conversation** (not terminal)
|
||||
2. Claude Code reads `SuperClaude/Commands/implement.md`
|
||||
2. Claude Code reads `superclaude/Commands/implement.md`
|
||||
3. Command activates security-engineer agent context
|
||||
4. Context7 MCP provides authentication patterns
|
||||
5. Claude generates complete, secure implementation
|
||||
@ -208,7 +208,7 @@ Brief description of context file changes
|
||||
|
||||
**Agent Development Process:**
|
||||
1. Identify domain expertise gap
|
||||
2. Create agent file in `SuperClaude/Agents/`
|
||||
2. Create agent file in `superclaude/Agents/`
|
||||
3. Define triggers, behaviors, and boundaries
|
||||
4. Test with various Claude Code scenarios
|
||||
5. Document usage patterns and examples
|
||||
529
docs/Development/ARCHITECTURE.md
Normal file
529
docs/Development/ARCHITECTURE.md
Normal file
@ -0,0 +1,529 @@
|
||||
# SuperClaude Architecture
|
||||
|
||||
**Last Updated**: 2025-10-14
|
||||
**Version**: 4.1.5
|
||||
|
||||
## 📋 Table of Contents
|
||||
|
||||
1. [System Overview](#system-overview)
|
||||
2. [Core Architecture](#core-architecture)
|
||||
3. [PM Agent Mode: The Meta-Layer](#pm-agent-mode-the-meta-layer)
|
||||
4. [Component Relationships](#component-relationships)
|
||||
5. [Serena MCP Integration](#serena-mcp-integration)
|
||||
6. [PDCA Engine](#pdca-engine)
|
||||
7. [Data Flow](#data-flow)
|
||||
8. [Extension Points](#extension-points)
|
||||
|
||||
---
|
||||
|
||||
## System Overview
|
||||
|
||||
### What is SuperClaude?
|
||||
|
||||
SuperClaude is a **Context-Oriented Configuration Framework** that transforms Claude Code into a structured development platform. It is NOT standalone software with running processes - it is a collection of `.md` instruction files that Claude Code reads to adopt specialized behaviors.
|
||||
|
||||
### Key Components
|
||||
|
||||
```
|
||||
SuperClaude Framework
|
||||
├── Commands (26) → Workflow patterns
|
||||
├── Agents (16) → Domain expertise
|
||||
├── Modes (7) → Behavioral modifiers
|
||||
├── MCP Servers (8) → External tool integrations
|
||||
└── PM Agent Mode → Meta-layer orchestration (Always-Active)
|
||||
```
|
||||
|
||||
### Version Information
|
||||
|
||||
- **Current Version**: 4.1.5
|
||||
- **Commands**: 26 slash commands (`/sc:*`)
|
||||
- **Agents**: 16 specialized domain experts
|
||||
- **Modes**: 7 behavioral modes
|
||||
- **MCP Servers**: 8 integrations (Context7, Sequential, Magic, Playwright, Morphllm, Serena, Tavily, Chrome DevTools)
|
||||
|
||||
---
|
||||
|
||||
## Core Architecture
|
||||
|
||||
### Context-Oriented Configuration
|
||||
|
||||
SuperClaude's architecture is built on a simple principle: **behavioral modification through structured context files**.
|
||||
|
||||
```
|
||||
User Input
|
||||
↓
|
||||
Context Loading (CLAUDE.md imports)
|
||||
↓
|
||||
Command Detection (/sc:* pattern)
|
||||
↓
|
||||
Agent Activation (manual or auto)
|
||||
↓
|
||||
Mode Application (flags or triggers)
|
||||
↓
|
||||
MCP Tool Coordination
|
||||
↓
|
||||
Output Generation
|
||||
```
|
||||
|
||||
### Directory Structure
|
||||
|
||||
```
|
||||
~/.claude/
|
||||
├── CLAUDE.md # Main context with @imports
|
||||
├── FLAGS.md # Flag definitions
|
||||
├── RULES.md # Core behavioral rules
|
||||
├── PRINCIPLES.md # Guiding principles
|
||||
├── MODE_*.md # 7 behavioral modes
|
||||
├── MCP_*.md # 8 MCP server integrations
|
||||
├── agents/ # 16 specialized agents
|
||||
│ ├── pm-agent.md # 🆕 Meta-layer orchestrator
|
||||
│ ├── backend-architect.md
|
||||
│ ├── frontend-architect.md
|
||||
│ ├── security-engineer.md
|
||||
│ └── ... (13 more)
|
||||
└── commands/sc/ # 26 workflow commands
|
||||
├── pm.md # 🆕 PM Agent command
|
||||
├── implement.md
|
||||
├── analyze.md
|
||||
└── ... (23 more)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PM Agent Mode: The Meta-Layer
|
||||
|
||||
### Position in Architecture
|
||||
|
||||
PM Agent operates as a **meta-layer** above all other components:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ PM Agent Mode (Meta-Layer) │
|
||||
│ • Always Active (Session Start) │
|
||||
│ • Context Preservation │
|
||||
│ • PDCA Self-Evaluation │
|
||||
│ • Knowledge Management │
|
||||
└─────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Specialist Agents (16) │
|
||||
│ backend-architect, security-engineer, etc. │
|
||||
└─────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Commands & Modes │
|
||||
│ /sc:implement, /sc:analyze, etc. │
|
||||
└─────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ MCP Tool Layer │
|
||||
│ Context7, Sequential, Magic, etc. │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### PM Agent Responsibilities
|
||||
|
||||
1. **Session Lifecycle Management**
|
||||
- Auto-activation at session start
|
||||
- Context restoration from Serena MCP memory
|
||||
- User report generation (前回/進捗/今回/課題)
|
||||
|
||||
2. **PDCA Cycle Execution**
|
||||
- Plan: Hypothesis generation
|
||||
- Do: Experimentation with checkpoints
|
||||
- Check: Self-evaluation
|
||||
- Act: Knowledge extraction
|
||||
|
||||
3. **Documentation Strategy**
|
||||
- Temporary documentation (`docs/temp/`)
|
||||
- Formal patterns (`docs/patterns/`)
|
||||
- Mistake records (`docs/mistakes/`)
|
||||
- Knowledge evolution to CLAUDE.md
|
||||
|
||||
4. **Sub-Agent Orchestration**
|
||||
- Auto-delegation to specialists
|
||||
- Context coordination
|
||||
- Quality gate validation
|
||||
- Progress monitoring
|
||||
|
||||
---
|
||||
|
||||
## Component Relationships
|
||||
|
||||
### Commands → Agents → Modes → MCP
|
||||
|
||||
```
|
||||
User: "/sc:implement authentication" --security
|
||||
↓
|
||||
[Command Layer]
|
||||
commands/sc/implement.md
|
||||
↓
|
||||
[Agent Auto-Activation]
|
||||
agents/security-engineer.md
|
||||
agents/backend-architect.md
|
||||
↓
|
||||
[Mode Application]
|
||||
MODE_Task_Management.md (TodoWrite)
|
||||
↓
|
||||
[MCP Tool Coordination]
|
||||
Context7 (auth patterns)
|
||||
Sequential (complex analysis)
|
||||
↓
|
||||
[PM Agent Meta-Layer]
|
||||
Document learnings → docs/patterns/
|
||||
```
|
||||
|
||||
### Activation Flow
|
||||
|
||||
1. **Explicit Command**: User types `/sc:implement`
|
||||
- Loads `commands/sc/implement.md`
|
||||
- Activates related agents (backend-architect, etc.)
|
||||
|
||||
2. **Agent Activation**: `@agent-security` or auto-detected
|
||||
- Loads agent expertise context
|
||||
- May activate related MCP servers
|
||||
|
||||
3. **Mode Application**: `--brainstorm` flag or keywords
|
||||
- Modifies interaction style
|
||||
- Enables specific behaviors
|
||||
|
||||
4. **PM Agent Meta-Layer**: Always active
|
||||
- Monitors all interactions
|
||||
- Documents learnings
|
||||
- Preserves context across sessions
|
||||
|
||||
---
|
||||
|
||||
## Serena MCP Integration
|
||||
|
||||
### Memory Operations
|
||||
|
||||
Serena MCP provides semantic code analysis and session persistence through memory operations:
|
||||
|
||||
```
|
||||
Session Start:
|
||||
PM Agent → list_memories()
|
||||
PM Agent → read_memory("pm_context")
|
||||
PM Agent → read_memory("last_session")
|
||||
PM Agent → read_memory("next_actions")
|
||||
PM Agent → Report to User
|
||||
|
||||
During Work (every 30min):
|
||||
PM Agent → write_memory("checkpoint", progress)
|
||||
PM Agent → write_memory("decision", rationale)
|
||||
|
||||
Session End:
|
||||
PM Agent → write_memory("last_session", summary)
|
||||
PM Agent → write_memory("next_actions", todos)
|
||||
PM Agent → write_memory("pm_context", complete_state)
|
||||
```
|
||||
|
||||
### Memory Structure
|
||||
|
||||
```json
|
||||
{
|
||||
"pm_context": {
|
||||
"project": "SuperClaude_Framework",
|
||||
"current_phase": "Phase 1: Documentation",
|
||||
"active_tasks": ["ARCHITECTURE.md", "ROADMAP.md"],
|
||||
"architecture": "Context-Oriented Configuration",
|
||||
"patterns": ["PDCA Cycle", "Session Lifecycle"]
|
||||
},
|
||||
"last_session": {
|
||||
"date": "2025-10-14",
|
||||
"accomplished": ["PM Agent mode design", "Salvaged implementations"],
|
||||
"issues": ["Serena MCP not configured"],
|
||||
"learned": ["Session Lifecycle pattern", "PDCA automation"]
|
||||
},
|
||||
"next_actions": [
|
||||
"Create docs/Development/ structure",
|
||||
"Write ARCHITECTURE.md",
|
||||
"Configure Serena MCP server"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PDCA Engine
|
||||
|
||||
### Continuous Improvement Cycle
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ Plan │ → write_memory("plan", goal)
|
||||
│ (仮説) │ → docs/temp/hypothesis-YYYY-MM-DD.md
|
||||
└──────┬──────┘
|
||||
↓
|
||||
┌─────────────┐
|
||||
│ Do │ → TodoWrite tracking
|
||||
│ (実験) │ → write_memory("checkpoint", progress)
|
||||
└──────┬──────┘ → docs/temp/experiment-YYYY-MM-DD.md
|
||||
↓
|
||||
┌─────────────┐
|
||||
│ Check │ → think_about_task_adherence()
|
||||
│ (評価) │ → think_about_whether_you_are_done()
|
||||
└──────┬──────┘ → docs/temp/lessons-YYYY-MM-DD.md
|
||||
↓
|
||||
┌─────────────┐
|
||||
│ Act │ → Success: docs/patterns/[name].md
|
||||
│ (改善) │ → Failure: docs/mistakes/mistake-*.md
|
||||
└──────┬──────┘ → Update CLAUDE.md
|
||||
↓
|
||||
[Repeat]
|
||||
```
|
||||
|
||||
### Documentation Evolution
|
||||
|
||||
```
|
||||
Trial-and-Error (docs/temp/)
|
||||
↓
|
||||
Success → Formal Pattern (docs/patterns/)
|
||||
↓
|
||||
Accumulate Knowledge
|
||||
↓
|
||||
Extract Best Practices → CLAUDE.md (Global Rules)
|
||||
```
|
||||
|
||||
```
|
||||
Mistake Detection (docs/temp/)
|
||||
↓
|
||||
Root Cause Analysis → docs/mistakes/
|
||||
↓
|
||||
Prevention Checklist
|
||||
↓
|
||||
Update Anti-Patterns → CLAUDE.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Data Flow
|
||||
|
||||
### Session Lifecycle Data Flow
|
||||
|
||||
```
|
||||
Session Start:
|
||||
┌──────────────┐
|
||||
│ Claude Code │
|
||||
│ Startup │
|
||||
└──────┬───────┘
|
||||
↓
|
||||
┌──────────────┐
|
||||
│ PM Agent │ list_memories()
|
||||
│ Activation │ read_memory("pm_context")
|
||||
└──────┬───────┘
|
||||
↓
|
||||
┌──────────────┐
|
||||
│ Serena │ Return: pm_context,
|
||||
│ MCP │ last_session,
|
||||
└──────┬───────┘ next_actions
|
||||
↓
|
||||
┌──────────────┐
|
||||
│ Context │ Restore project state
|
||||
│ Restoration │ Generate user report
|
||||
└──────┬───────┘
|
||||
↓
|
||||
┌──────────────┐
|
||||
│ User │ 前回: [summary]
|
||||
│ Report │ 進捗: [status]
|
||||
└──────────────┘ 今回: [actions]
|
||||
課題: [blockers]
|
||||
```
|
||||
|
||||
### Implementation Data Flow
|
||||
|
||||
```
|
||||
User Request → PM Agent Analyzes
|
||||
↓
|
||||
PM Agent → Delegate to Specialist Agents
|
||||
↓
|
||||
Specialist Agents → Execute Implementation
|
||||
↓
|
||||
Implementation Complete → PM Agent Documents
|
||||
↓
|
||||
PM Agent → write_memory("checkpoint", progress)
|
||||
PM Agent → docs/temp/experiment-*.md
|
||||
↓
|
||||
Success → docs/patterns/ | Failure → docs/mistakes/
|
||||
↓
|
||||
Update CLAUDE.md (if global pattern)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Extension Points
|
||||
|
||||
### Adding New Components
|
||||
|
||||
#### 1. New Command
|
||||
```markdown
|
||||
File: ~/.claude/commands/sc/new-command.md
|
||||
Structure:
|
||||
- Metadata (name, category, complexity)
|
||||
- Triggers (when to use)
|
||||
- Workflow Pattern (step-by-step)
|
||||
- Examples
|
||||
|
||||
Integration:
|
||||
- Auto-loads when user types /sc:new-command
|
||||
- Can activate related agents
|
||||
- PM Agent automatically documents usage patterns
|
||||
```
|
||||
|
||||
#### 2. New Agent
|
||||
```markdown
|
||||
File: ~/.claude/agents/new-specialist.md
|
||||
Structure:
|
||||
- Metadata (name, category)
|
||||
- Triggers (keywords, file types)
|
||||
- Behavioral Mindset
|
||||
- Focus Areas
|
||||
|
||||
Integration:
|
||||
- Auto-activates on trigger keywords
|
||||
- Manual activation: @agent-new-specialist
|
||||
- PM Agent orchestrates with other agents
|
||||
```
|
||||
|
||||
#### 3. New Mode
|
||||
```markdown
|
||||
File: ~/.claude/MODE_NewMode.md
|
||||
Structure:
|
||||
- Activation Triggers (flags, keywords)
|
||||
- Behavioral Modifications
|
||||
- Interaction Patterns
|
||||
|
||||
Integration:
|
||||
- Flag: --new-mode
|
||||
- Auto-activation on complexity threshold
|
||||
- Modifies all agent behaviors
|
||||
```
|
||||
|
||||
#### 4. New MCP Server
|
||||
```json
|
||||
File: ~/.claude/.claude.json
|
||||
{
|
||||
"mcpServers": {
|
||||
"new-server": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "new-server-mcp@latest"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```markdown
|
||||
File: ~/.claude/MCP_NewServer.md
|
||||
Structure:
|
||||
- Purpose (what this server provides)
|
||||
- Triggers (when to use)
|
||||
- Integration (how to coordinate with other tools)
|
||||
```
|
||||
|
||||
### PM Agent Integration for Extensions
|
||||
|
||||
All new components automatically integrate with PM Agent meta-layer:
|
||||
|
||||
1. **Session Lifecycle**: New components' usage tracked across sessions
|
||||
2. **PDCA Cycle**: Patterns extracted from new component usage
|
||||
3. **Documentation**: Learnings automatically documented
|
||||
4. **Orchestration**: PM Agent coordinates new components with existing ones
|
||||
|
||||
---
|
||||
|
||||
## Architecture Principles
|
||||
|
||||
### 1. Simplicity First
|
||||
- No executing code, only context files
|
||||
- No performance systems, only instructional patterns
|
||||
- No detection engines, Claude Code does pattern matching
|
||||
|
||||
### 2. Context-Oriented
|
||||
- Behavior modification through structured context
|
||||
- Import system for modular context loading
|
||||
- Clear trigger patterns for activation
|
||||
|
||||
### 3. Meta-Layer Design
|
||||
- PM Agent orchestrates without interfering
|
||||
- Specialist agents work transparently
|
||||
- Users interact with cohesive system
|
||||
|
||||
### 4. Knowledge Accumulation
|
||||
- Every experience generates learnings
|
||||
- Mistakes documented with prevention
|
||||
- Patterns extracted to reusable knowledge
|
||||
|
||||
### 5. Session Continuity
|
||||
- Context preserved across sessions
|
||||
- No re-explanation needed
|
||||
- Seamless resumption from last checkpoint
|
||||
|
||||
---
|
||||
|
||||
## Technical Considerations
|
||||
|
||||
### Performance
|
||||
- Framework is pure context (no runtime overhead)
|
||||
- Token efficiency through dynamic MCP loading
|
||||
- Strategic context caching for related phases
|
||||
|
||||
### Scalability
|
||||
- Unlimited commands/agents/modes through context files
|
||||
- Modular architecture supports independent development
|
||||
- PM Agent meta-layer handles coordination complexity
|
||||
|
||||
### Maintainability
|
||||
- Clear separation of concerns (Commands/Agents/Modes)
|
||||
- Self-documenting through PDCA cycle
|
||||
- Living documentation evolves with usage
|
||||
|
||||
### Extensibility
|
||||
- Drop-in new contexts without code changes
|
||||
- MCP servers add capabilities externally
|
||||
- PM Agent auto-integrates new components
|
||||
|
||||
---
|
||||
|
||||
## Future Architecture
|
||||
|
||||
### Planned Enhancements
|
||||
|
||||
1. **Auto-Activation System**
|
||||
- PM Agent activates automatically at session start
|
||||
- No manual invocation needed
|
||||
|
||||
2. **Enhanced Memory Operations**
|
||||
- Full Serena MCP integration
|
||||
- Cross-project knowledge sharing
|
||||
- Pattern recognition across sessions
|
||||
|
||||
3. **PDCA Automation**
|
||||
- Automatic documentation lifecycle
|
||||
- AI-driven pattern extraction
|
||||
- Self-improving knowledge base
|
||||
|
||||
4. **Multi-Project Orchestration**
|
||||
- PM Agent coordinates across projects
|
||||
- Shared learnings and patterns
|
||||
- Unified knowledge management
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
SuperClaude's architecture is elegantly simple: **structured context files** that Claude Code reads to adopt sophisticated behaviors. The addition of PM Agent mode as a meta-layer transforms this from a collection of tools into a **continuously learning, self-improving development platform**.
|
||||
|
||||
**Key Architectural Innovation**: PM Agent meta-layer provides:
|
||||
- Always-active foundation layer
|
||||
- Context preservation across sessions
|
||||
- PDCA self-evaluation and learning
|
||||
- Systematic knowledge management
|
||||
- Seamless orchestration of specialist agents
|
||||
|
||||
This architecture enables SuperClaude to function as a **最高司令官 (Supreme Commander)** that orchestrates all development activities while continuously learning and improving from every interaction.
|
||||
|
||||
---
|
||||
|
||||
**Last Verified**: 2025-10-14
|
||||
**Next Review**: 2025-10-21 (1 week)
|
||||
**Version**: 4.1.5
|
||||
172
docs/Development/PROJECT_STATUS.md
Normal file
172
docs/Development/PROJECT_STATUS.md
Normal file
@ -0,0 +1,172 @@
|
||||
# SuperClaude Project Status
|
||||
|
||||
**Last Updated**: 2025-10-14
|
||||
**Version**: 4.1.5
|
||||
**Phase**: Phase 1 - Documentation Structure
|
||||
|
||||
---
|
||||
|
||||
## 📊 Quick Overview
|
||||
|
||||
| Metric | Status | Progress |
|
||||
|--------|--------|----------|
|
||||
| **Overall Completion** | 🔄 In Progress | 35% |
|
||||
| **Phase 1 (Documentation)** | 🔄 In Progress | 66% |
|
||||
| **Phase 2 (PM Agent)** | 🔄 In Progress | 30% |
|
||||
| **Phase 3 (Serena MCP)** | ⏳ Not Started | 0% |
|
||||
| **Phase 4 (Doc Strategy)** | ⏳ Not Started | 0% |
|
||||
| **Phase 5 (Auto-Activation)** | 🔬 Research | 0% |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Current Sprint
|
||||
|
||||
**Sprint**: Phase 1 - Documentation Structure
|
||||
**Timeline**: 2025-10-14 ~ 2025-10-20
|
||||
**Status**: 🔄 66% Complete
|
||||
|
||||
### This Week's Focus
|
||||
- [ ] Complete Phase 1 documentation (TASKS.md, PROJECT_STATUS.md, pm-agent-integration.md)
|
||||
- [ ] Commit Phase 1 changes
|
||||
- [ ] Commit PM Agent Mode improvements
|
||||
|
||||
---
|
||||
|
||||
## ✅ Completed Features
|
||||
|
||||
### Core Framework (v4.1.5)
|
||||
- ✅ **26 Commands**: `/sc:*` namespace
|
||||
- ✅ **16 Agents**: Specialized domain experts
|
||||
- ✅ **7 Modes**: Behavioral modifiers
|
||||
- ✅ **8 MCP Servers**: External tool integrations
|
||||
|
||||
### PM Agent Mode (Design Phase)
|
||||
- ✅ Session Lifecycle design
|
||||
- ✅ PDCA Cycle design
|
||||
- ✅ Documentation Strategy design
|
||||
- ✅ Commands/pm.md updated
|
||||
- ✅ Agents/pm-agent.md updated
|
||||
|
||||
### Documentation
|
||||
- ✅ docs/Development/ARCHITECTURE.md
|
||||
- ✅ docs/Development/ROADMAP.md
|
||||
- ✅ docs/Development/TASKS.md
|
||||
- ✅ docs/Development/PROJECT_STATUS.md
|
||||
- ✅ docs/pm-agent-implementation-status.md
|
||||
|
||||
---
|
||||
|
||||
## 🔄 In Progress
|
||||
|
||||
### Phase 1: Documentation Structure (66%)
|
||||
- [x] ARCHITECTURE.md
|
||||
- [x] ROADMAP.md
|
||||
- [x] TASKS.md
|
||||
- [x] PROJECT_STATUS.md
|
||||
- [ ] pm-agent-integration.md
|
||||
|
||||
### Phase 2: PM Agent Mode (30%)
|
||||
- [ ] superclaude/Core/session_lifecycle.py
|
||||
- [ ] superclaude/Core/pdca_engine.py
|
||||
- [ ] superclaude/Core/memory_ops.py
|
||||
- [ ] Unit tests
|
||||
- [ ] Integration tests
|
||||
|
||||
---
|
||||
|
||||
## ⏳ Pending
|
||||
|
||||
### Phase 3: Serena MCP Integration (0%)
|
||||
- Serena MCP server configuration
|
||||
- Memory operations implementation
|
||||
- Think operations implementation
|
||||
- Cross-session persistence testing
|
||||
|
||||
### Phase 4: Documentation Strategy (0%)
|
||||
- Directory templates creation
|
||||
- Lifecycle automation
|
||||
- Migration scripts
|
||||
- Knowledge management
|
||||
|
||||
### Phase 5: Auto-Activation (0%)
|
||||
- Claude Code initialization hooks research
|
||||
- Auto-activation implementation
|
||||
- Context restoration
|
||||
- Performance optimization
|
||||
|
||||
---
|
||||
|
||||
## 🚫 Blockers
|
||||
|
||||
### Critical
|
||||
- **Serena MCP Not Configured**: Blocks Phase 3 (Memory Operations)
|
||||
- **Auto-Activation Hooks Unknown**: Blocks Phase 5 (Research needed)
|
||||
|
||||
### Non-Critical
|
||||
- Documentation directory structure (in progress - Phase 1)
|
||||
|
||||
---
|
||||
|
||||
## 📈 Metrics Dashboard
|
||||
|
||||
### Development Velocity
|
||||
- **Phase 1**: 6 days estimated, on track for 7 days completion
|
||||
- **Phase 2**: 14 days estimated, not yet started full implementation
|
||||
- **Overall**: 35% complete, on schedule for 8-week timeline
|
||||
|
||||
### Code Quality
|
||||
- **Test Coverage**: 0% (implementation not started)
|
||||
- **Documentation Coverage**: 40% (4/10 major docs complete)
|
||||
|
||||
### Component Status
|
||||
- **Commands**: ✅ 26/26 functional
|
||||
- **Agents**: ✅ 16/16 functional, 1 (PM Agent) enhanced
|
||||
- **Modes**: ✅ 7/7 functional
|
||||
- **MCP Servers**: ⚠️ 7/8 functional (Serena pending)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Upcoming Milestones
|
||||
|
||||
### Week 1 (Current)
|
||||
- ✅ Complete Phase 1 documentation
|
||||
- ✅ Commit changes to repository
|
||||
|
||||
### Week 2-3
|
||||
- [ ] Implement PM Agent Core (session_lifecycle, pdca_engine, memory_ops)
|
||||
- [ ] Write unit tests
|
||||
- [ ] Update User-Guide documentation
|
||||
|
||||
### Week 4-5
|
||||
- [ ] Configure Serena MCP server
|
||||
- [ ] Implement memory operations
|
||||
- [ ] Test cross-session persistence
|
||||
|
||||
---
|
||||
|
||||
## 📝 Recent Changes
|
||||
|
||||
### 2025-10-14
|
||||
- Created docs/Development/ structure
|
||||
- Wrote ARCHITECTURE.md (system overview)
|
||||
- Wrote ROADMAP.md (5-phase development plan)
|
||||
- Wrote TASKS.md (task tracking)
|
||||
- Wrote PROJECT_STATUS.md (this file)
|
||||
- Salvaged PM Agent mode changes from ~/.claude
|
||||
- Updated Commands/pm.md and Agents/pm-agent.md
|
||||
|
||||
---
|
||||
|
||||
## 🔮 Next Steps
|
||||
|
||||
1. **Complete pm-agent-integration.md** (Phase 1 final doc)
|
||||
2. **Commit Phase 1 documentation** (establish foundation)
|
||||
3. **Commit PM Agent Mode improvements** (design complete)
|
||||
4. **Begin Phase 2 implementation** (Core components)
|
||||
5. **Configure Serena MCP** (unblock Phase 3)
|
||||
|
||||
---
|
||||
|
||||
**Last Verified**: 2025-10-14
|
||||
**Next Review**: 2025-10-17 (Mid-week check)
|
||||
**Version**: 4.1.5
|
||||
349
docs/Development/ROADMAP.md
Normal file
349
docs/Development/ROADMAP.md
Normal file
@ -0,0 +1,349 @@
|
||||
# SuperClaude Development Roadmap
|
||||
|
||||
**Last Updated**: 2025-10-14
|
||||
**Version**: 4.1.5
|
||||
|
||||
## 🎯 Vision
|
||||
|
||||
Transform SuperClaude into a self-improving development platform with PM Agent mode as the always-active meta-layer, enabling continuous context preservation, systematic knowledge management, and intelligent orchestration of all development activities.
|
||||
|
||||
---
|
||||
|
||||
## 📊 Phase Overview
|
||||
|
||||
| Phase | Status | Timeline | Focus |
|
||||
|-------|--------|----------|-------|
|
||||
| **Phase 1** | ✅ Completed | Week 1 | Documentation Structure |
|
||||
| **Phase 2** | 🔄 In Progress | Week 2-3 | PM Agent Mode Integration |
|
||||
| **Phase 3** | ⏳ Planned | Week 4-5 | Serena MCP Integration |
|
||||
| **Phase 4** | ⏳ Planned | Week 6-7 | Documentation Strategy |
|
||||
| **Phase 5** | 🔬 Research | Week 8+ | Auto-Activation System |
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Documentation Structure ✅
|
||||
|
||||
**Goal**: Create comprehensive documentation foundation for development
|
||||
|
||||
**Timeline**: Week 1 (2025-10-14 ~ 2025-10-20)
|
||||
|
||||
**Status**: ✅ Completed
|
||||
|
||||
### Tasks
|
||||
|
||||
- [x] Create `docs/Development/` directory structure
|
||||
- [x] Write `ARCHITECTURE.md` - System overview with PM Agent position
|
||||
- [x] Write `ROADMAP.md` - Phase-based development plan with checkboxes
|
||||
- [ ] Write `TASKS.md` - Current task tracking system
|
||||
- [ ] Write `PROJECT_STATUS.md` - Implementation status dashboard
|
||||
- [ ] Write `pm-agent-integration.md` - Integration guide and procedures
|
||||
|
||||
### Deliverables
|
||||
|
||||
- [x] **docs/Development/ARCHITECTURE.md** - Complete system architecture
|
||||
- [x] **docs/Development/ROADMAP.md** - This file (development roadmap)
|
||||
- [ ] **docs/Development/TASKS.md** - Task management with checkboxes
|
||||
- [ ] **docs/Development/PROJECT_STATUS.md** - Current status and metrics
|
||||
- [ ] **docs/Development/pm-agent-integration.md** - Integration procedures
|
||||
|
||||
### Success Criteria
|
||||
|
||||
- [x] Documentation structure established
|
||||
- [x] Architecture clearly documented
|
||||
- [ ] Roadmap with phase breakdown complete
|
||||
- [ ] Task tracking system functional
|
||||
- [ ] Status dashboard provides visibility
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: PM Agent Mode Integration 🔄
|
||||
|
||||
**Goal**: Integrate PM Agent mode as always-active meta-layer
|
||||
|
||||
**Timeline**: Week 2-3 (2025-10-21 ~ 2025-11-03)
|
||||
|
||||
**Status**: 🔄 In Progress (30% complete)
|
||||
|
||||
### Tasks
|
||||
|
||||
#### Documentation Updates
|
||||
- [x] Update `superclaude/Commands/pm.md` with Session Lifecycle
|
||||
- [x] Update `superclaude/Agents/pm-agent.md` with PDCA Cycle
|
||||
- [x] Create `docs/pm-agent-implementation-status.md`
|
||||
- [ ] Update `docs/User-Guide/agents.md` - Add PM Agent section
|
||||
- [ ] Update `docs/User-Guide/commands.md` - Add /sc:pm command
|
||||
|
||||
#### Core Implementation
|
||||
- [ ] Implement `superclaude/Core/session_lifecycle.py`
|
||||
- [ ] Session start hooks
|
||||
- [ ] Context restoration logic
|
||||
- [ ] User report generation
|
||||
- [ ] Error handling and fallback
|
||||
- [ ] Implement `superclaude/Core/pdca_engine.py`
|
||||
- [ ] Plan phase automation
|
||||
- [ ] Do phase tracking
|
||||
- [ ] Check phase self-evaluation
|
||||
- [ ] Act phase documentation
|
||||
- [ ] Implement `superclaude/Core/memory_ops.py`
|
||||
- [ ] Serena MCP wrapper
|
||||
- [ ] Memory operation abstractions
|
||||
- [ ] Checkpoint management
|
||||
- [ ] Session state handling
|
||||
|
||||
#### Testing
|
||||
- [ ] Unit tests for session_lifecycle.py
|
||||
- [ ] Unit tests for pdca_engine.py
|
||||
- [ ] Unit tests for memory_ops.py
|
||||
- [ ] Integration tests for PM Agent flow
|
||||
- [ ] Test auto-activation at session start
|
||||
|
||||
### Deliverables
|
||||
|
||||
- [x] **Updated pm.md and pm-agent.md** - Design documentation
|
||||
- [x] **pm-agent-implementation-status.md** - Status tracking
|
||||
- [ ] **superclaude/Core/session_lifecycle.py** - Session management
|
||||
- [ ] **superclaude/Core/pdca_engine.py** - PDCA automation
|
||||
- [ ] **superclaude/Core/memory_ops.py** - Memory operations
|
||||
- [ ] **tests/test_pm_agent.py** - Comprehensive test suite
|
||||
|
||||
### Success Criteria
|
||||
|
||||
- [ ] PM Agent mode loads at session start
|
||||
- [ ] Session Lifecycle functional
|
||||
- [ ] PDCA Cycle automated
|
||||
- [ ] Memory operations working
|
||||
- [ ] All tests passing (>90% coverage)
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Serena MCP Integration ⏳
|
||||
|
||||
**Goal**: Full Serena MCP integration for session persistence
|
||||
|
||||
**Timeline**: Week 4-5 (2025-11-04 ~ 2025-11-17)
|
||||
|
||||
**Status**: ⏳ Planned
|
||||
|
||||
### Tasks
|
||||
|
||||
#### MCP Configuration
|
||||
- [ ] Install and configure Serena MCP server
|
||||
- [ ] Update `~/.claude/.claude.json` with Serena config
|
||||
- [ ] Test basic Serena operations
|
||||
- [ ] Troubleshoot connection issues
|
||||
|
||||
#### Memory Operations Implementation
|
||||
- [ ] Implement `list_memories()` integration
|
||||
- [ ] Implement `read_memory(key)` integration
|
||||
- [ ] Implement `write_memory(key, value)` integration
|
||||
- [ ] Implement `delete_memory(key)` integration
|
||||
- [ ] Test memory persistence across sessions
|
||||
|
||||
#### Think Operations Implementation
|
||||
- [ ] Implement `think_about_task_adherence()` hook
|
||||
- [ ] Implement `think_about_collected_information()` hook
|
||||
- [ ] Implement `think_about_whether_you_are_done()` hook
|
||||
- [ ] Integrate with TodoWrite completion tracking
|
||||
- [ ] Test self-evaluation triggers
|
||||
|
||||
#### Cross-Session Testing
|
||||
- [ ] Test context restoration after restart
|
||||
- [ ] Test checkpoint save/restore
|
||||
- [ ] Test memory persistence durability
|
||||
- [ ] Test multi-project memory isolation
|
||||
- [ ] Performance testing (memory operations latency)
|
||||
|
||||
### Deliverables
|
||||
|
||||
- [ ] **Serena MCP Server** - Configured and operational
|
||||
- [ ] **superclaude/Core/serena_client.py** - Serena MCP client wrapper
|
||||
- [ ] **superclaude/Core/think_operations.py** - Think hooks implementation
|
||||
- [ ] **docs/troubleshooting/serena-setup.md** - Setup guide
|
||||
- [ ] **tests/test_serena_integration.py** - Integration test suite
|
||||
|
||||
### Success Criteria
|
||||
|
||||
- [ ] Serena MCP server operational
|
||||
- [ ] All memory operations functional
|
||||
- [ ] Think operations trigger correctly
|
||||
- [ ] Cross-session persistence verified
|
||||
- [ ] Performance acceptable (<100ms per operation)
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Documentation Strategy ⏳
|
||||
|
||||
**Goal**: Implement systematic documentation lifecycle
|
||||
|
||||
**Timeline**: Week 6-7 (2025-11-18 ~ 2025-12-01)
|
||||
|
||||
**Status**: ⏳ Planned
|
||||
|
||||
### Tasks
|
||||
|
||||
#### Directory Structure
|
||||
- [ ] Create `docs/temp/` template structure
|
||||
- [ ] Create `docs/patterns/` template structure
|
||||
- [ ] Create `docs/mistakes/` template structure
|
||||
- [ ] Add README.md to each directory explaining purpose
|
||||
- [ ] Create .gitignore for temporary files
|
||||
|
||||
#### File Templates
|
||||
- [ ] Create `hypothesis-template.md` for Plan phase
|
||||
- [ ] Create `experiment-template.md` for Do phase
|
||||
- [ ] Create `lessons-template.md` for Check phase
|
||||
- [ ] Create `pattern-template.md` for successful patterns
|
||||
- [ ] Create `mistake-template.md` for error records
|
||||
|
||||
#### Lifecycle Automation
|
||||
- [ ] Implement 7-day temporary file cleanup
|
||||
- [ ] Create docs/temp → docs/patterns migration script
|
||||
- [ ] Create docs/temp → docs/mistakes migration script
|
||||
- [ ] Automate "Last Verified" date updates
|
||||
- [ ] Implement duplicate pattern detection
|
||||
|
||||
#### Knowledge Management
|
||||
- [ ] Implement pattern extraction logic
|
||||
- [ ] Implement CLAUDE.md auto-update mechanism
|
||||
- [ ] Create knowledge graph visualization
|
||||
- [ ] Implement pattern search functionality
|
||||
- [ ] Create mistake prevention checklist generator
|
||||
|
||||
### Deliverables
|
||||
|
||||
- [ ] **docs/temp/**, **docs/patterns/**, **docs/mistakes/** - Directory templates
|
||||
- [ ] **superclaude/Core/doc_lifecycle.py** - Lifecycle automation
|
||||
- [ ] **superclaude/Core/knowledge_manager.py** - Knowledge extraction
|
||||
- [ ] **scripts/migrate_docs.py** - Migration utilities
|
||||
- [ ] **tests/test_doc_lifecycle.py** - Lifecycle test suite
|
||||
|
||||
### Success Criteria
|
||||
|
||||
- [ ] Directory templates functional
|
||||
- [ ] Lifecycle automation working
|
||||
- [ ] Migration scripts reliable
|
||||
- [ ] Knowledge extraction accurate
|
||||
- [ ] CLAUDE.md auto-updates verified
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Auto-Activation System 🔬
|
||||
|
||||
**Goal**: PM Agent activates automatically at every session start
|
||||
|
||||
**Timeline**: Week 8+ (2025-12-02 onwards)
|
||||
|
||||
**Status**: 🔬 Research Needed
|
||||
|
||||
### Research Phase
|
||||
|
||||
- [ ] Research Claude Code initialization hooks
|
||||
- [ ] Investigate session start event handling
|
||||
- [ ] Study existing auto-activation patterns
|
||||
- [ ] Analyze Claude Code plugin system (if available)
|
||||
- [ ] Review Anthropic documentation on extensibility
|
||||
|
||||
### Tasks
|
||||
|
||||
#### Hook Implementation
|
||||
- [ ] Identify session start hook mechanism
|
||||
- [ ] Implement PM Agent auto-activation hook
|
||||
- [ ] Test activation timing and reliability
|
||||
- [ ] Handle edge cases (crash recovery, etc.)
|
||||
- [ ] Performance optimization (minimize startup delay)
|
||||
|
||||
#### Context Restoration
|
||||
- [ ] Implement automatic context loading
|
||||
- [ ] Test memory restoration at startup
|
||||
- [ ] Verify user report generation
|
||||
- [ ] Handle missing or corrupted memory
|
||||
- [ ] Graceful fallback for new sessions
|
||||
|
||||
#### Integration Testing
|
||||
- [ ] Test across multiple sessions
|
||||
- [ ] Test with different project contexts
|
||||
- [ ] Test memory persistence durability
|
||||
- [ ] Test error recovery mechanisms
|
||||
- [ ] Performance testing (startup time impact)
|
||||
|
||||
### Deliverables
|
||||
|
||||
- [ ] **superclaude/Core/auto_activation.py** - Auto-activation system
|
||||
- [ ] **docs/Developer-Guide/auto-activation.md** - Implementation guide
|
||||
- [ ] **tests/test_auto_activation.py** - Auto-activation tests
|
||||
- [ ] **Performance Report** - Startup time impact analysis
|
||||
|
||||
### Success Criteria
|
||||
|
||||
- [ ] PM Agent activates at every session start
|
||||
- [ ] Context restoration reliable (>99%)
|
||||
- [ ] User report generated consistently
|
||||
- [ ] Startup delay minimal (<500ms)
|
||||
- [ ] Error recovery robust
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Future Enhancements (Post-Phase 5)
|
||||
|
||||
### Multi-Project Orchestration
|
||||
- [ ] Cross-project knowledge sharing
|
||||
- [ ] Unified pattern library
|
||||
- [ ] Multi-project context switching
|
||||
- [ ] Project-specific memory namespaces
|
||||
|
||||
### AI-Driven Pattern Recognition
|
||||
- [ ] Machine learning for pattern extraction
|
||||
- [ ] Automatic best practice identification
|
||||
- [ ] Predictive mistake prevention
|
||||
- [ ] Smart knowledge graph generation
|
||||
|
||||
### Enhanced Self-Evaluation
|
||||
- [ ] Advanced think operations
|
||||
- [ ] Quality scoring automation
|
||||
- [ ] Performance regression detection
|
||||
- [ ] Code quality trend analysis
|
||||
|
||||
### Community Features
|
||||
- [ ] Pattern sharing marketplace
|
||||
- [ ] Community knowledge contributions
|
||||
- [ ] Collaborative PDCA cycles
|
||||
- [ ] Public pattern library
|
||||
|
||||
---
|
||||
|
||||
## 📊 Metrics & KPIs
|
||||
|
||||
### Phase Completion Metrics
|
||||
|
||||
| Metric | Target | Current | Status |
|
||||
|--------|--------|---------|--------|
|
||||
| Documentation Coverage | 100% | 40% | 🔄 In Progress |
|
||||
| PM Agent Integration | 100% | 30% | 🔄 In Progress |
|
||||
| Serena MCP Integration | 100% | 0% | ⏳ Pending |
|
||||
| Documentation Strategy | 100% | 0% | ⏳ Pending |
|
||||
| Auto-Activation | 100% | 0% | 🔬 Research |
|
||||
|
||||
### Quality Metrics
|
||||
|
||||
| Metric | Target | Current | Status |
|
||||
|--------|--------|---------|--------|
|
||||
| Test Coverage | >90% | 0% | ⏳ Pending |
|
||||
| Context Restoration Rate | 100% | N/A | ⏳ Pending |
|
||||
| Session Continuity | >95% | N/A | ⏳ Pending |
|
||||
| Documentation Freshness | <7 days | N/A | ⏳ Pending |
|
||||
| Mistake Prevention | <10% recurring | N/A | ⏳ Pending |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Update Schedule
|
||||
|
||||
- **Weekly**: Task progress updates
|
||||
- **Bi-weekly**: Phase milestone reviews
|
||||
- **Monthly**: Roadmap revision and priority adjustment
|
||||
- **Quarterly**: Long-term vision alignment
|
||||
|
||||
---
|
||||
|
||||
**Last Verified**: 2025-10-14
|
||||
**Next Review**: 2025-10-21 (1 week)
|
||||
**Version**: 4.1.5
|
||||
151
docs/Development/TASKS.md
Normal file
151
docs/Development/TASKS.md
Normal file
@ -0,0 +1,151 @@
|
||||
# SuperClaude Development Tasks
|
||||
|
||||
**Last Updated**: 2025-10-14
|
||||
**Current Sprint**: Phase 1 - Documentation Structure
|
||||
|
||||
---
|
||||
|
||||
## 🔥 High Priority (This Week: 2025-10-14 ~ 2025-10-20)
|
||||
|
||||
### Phase 1: Documentation Structure
|
||||
- [x] Create docs/Development/ directory
|
||||
- [x] Write ARCHITECTURE.md
|
||||
- [x] Write ROADMAP.md
|
||||
- [ ] Write TASKS.md (this file)
|
||||
- [ ] Write PROJECT_STATUS.md
|
||||
- [ ] Write pm-agent-integration.md
|
||||
- [ ] Commit Phase 1 changes
|
||||
|
||||
### PM Agent Mode
|
||||
- [x] Design Session Lifecycle
|
||||
- [x] Design PDCA Cycle
|
||||
- [x] Update Commands/pm.md
|
||||
- [x] Update Agents/pm-agent.md
|
||||
- [x] Create pm-agent-implementation-status.md
|
||||
- [ ] Commit PM Agent Mode changes
|
||||
|
||||
---
|
||||
|
||||
## 📋 Medium Priority (This Month: October 2025)
|
||||
|
||||
### Phase 2: Core Implementation
|
||||
- [ ] Implement superclaude/Core/session_lifecycle.py
|
||||
- [ ] Implement superclaude/Core/pdca_engine.py
|
||||
- [ ] Implement superclaude/Core/memory_ops.py
|
||||
- [ ] Write unit tests for PM Agent core
|
||||
- [ ] Update User-Guide documentation
|
||||
|
||||
### Testing & Validation
|
||||
- [ ] Create test suite for session_lifecycle
|
||||
- [ ] Create test suite for pdca_engine
|
||||
- [ ] Create test suite for memory_ops
|
||||
- [ ] Integration testing for PM Agent flow
|
||||
- [ ] Performance benchmarking
|
||||
|
||||
---
|
||||
|
||||
## 💡 Low Priority (Future)
|
||||
|
||||
### Phase 3: Serena MCP Integration
|
||||
- [ ] Configure Serena MCP server
|
||||
- [ ] Test Serena connection
|
||||
- [ ] Implement memory operations
|
||||
- [ ] Test cross-session persistence
|
||||
|
||||
### Phase 4: Documentation Strategy
|
||||
- [ ] Create docs/temp/ template
|
||||
- [ ] Create docs/patterns/ template
|
||||
- [ ] Create docs/mistakes/ template
|
||||
- [ ] Implement 7-day cleanup automation
|
||||
|
||||
### Phase 5: Auto-Activation
|
||||
- [ ] Research Claude Code init hooks
|
||||
- [ ] Implement auto-activation
|
||||
- [ ] Test session start behavior
|
||||
- [ ] Performance optimization
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Bugs & Issues
|
||||
|
||||
### Known Issues
|
||||
- [ ] Serena MCP not configured (blocker for Phase 3)
|
||||
- [ ] Auto-activation hooks unknown (research needed for Phase 5)
|
||||
- [ ] Documentation directory structure missing (in progress)
|
||||
|
||||
### Recent Fixes
|
||||
- [x] PM Agent changes salvaged from ~/.claude directory (2025-10-14)
|
||||
- [x] Git repository cleanup in ~/.claude (2025-10-14)
|
||||
|
||||
---
|
||||
|
||||
## ✅ Completed Tasks
|
||||
|
||||
### 2025-10-14
|
||||
- [x] Salvaged PM Agent mode changes from ~/.claude
|
||||
- [x] Cleaned up ~/.claude git repository
|
||||
- [x] Created pm-agent-implementation-status.md
|
||||
- [x] Created docs/Development/ directory
|
||||
- [x] Wrote ARCHITECTURE.md
|
||||
- [x] Wrote ROADMAP.md
|
||||
- [x] Wrote TASKS.md
|
||||
|
||||
---
|
||||
|
||||
## 📊 Sprint Metrics
|
||||
|
||||
### Current Sprint (Week 1)
|
||||
- **Planned Tasks**: 8
|
||||
- **Completed**: 7
|
||||
- **In Progress**: 1
|
||||
- **Blocked**: 0
|
||||
- **Completion Rate**: 87.5%
|
||||
|
||||
### Overall Progress (Phase 1)
|
||||
- **Total Tasks**: 6
|
||||
- **Completed**: 3
|
||||
- **Remaining**: 3
|
||||
- **On Schedule**: ✅ Yes
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Task Management Process
|
||||
|
||||
### Weekly Cycle
|
||||
1. **Monday**: Review last week, plan this week
|
||||
2. **Mid-week**: Progress check, adjust priorities
|
||||
3. **Friday**: Update task status, prepare next week
|
||||
|
||||
### Task Categories
|
||||
- 🔥 **High Priority**: Must complete this week
|
||||
- 📋 **Medium Priority**: Complete this month
|
||||
- 💡 **Low Priority**: Future enhancements
|
||||
- 🐛 **Bugs**: Critical issues requiring immediate attention
|
||||
|
||||
### Status Markers
|
||||
- ✅ **Completed**: Task finished and verified
|
||||
- 🔄 **In Progress**: Currently working on
|
||||
- ⏳ **Pending**: Waiting for dependencies
|
||||
- 🚫 **Blocked**: Cannot proceed (document blocker)
|
||||
|
||||
---
|
||||
|
||||
## 📝 Task Template
|
||||
|
||||
When adding new tasks, use this format:
|
||||
|
||||
```markdown
|
||||
- [ ] Task description
|
||||
- **Priority**: High/Medium/Low
|
||||
- **Estimate**: 1-2 hours / 1-2 days / 1 week
|
||||
- **Dependencies**: List dependent tasks
|
||||
- **Blocker**: Any blocking issues
|
||||
- **Assigned**: Person/Team
|
||||
- **Due Date**: YYYY-MM-DD
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Verified**: 2025-10-14
|
||||
**Next Update**: 2025-10-17 (Mid-week check)
|
||||
**Version**: 4.1.5
|
||||
@ -0,0 +1,390 @@
|
||||
# PM Agent Autonomous Enhancement - 改善提案
|
||||
|
||||
> **Date**: 2025-10-14
|
||||
> **Status**: 提案中(ユーザーレビュー待ち)
|
||||
> **Goal**: ユーザーインプット最小化 + 確信を持った先回り提案
|
||||
|
||||
---
|
||||
|
||||
## 🎯 現状の問題点
|
||||
|
||||
### 既存の `superclaude/commands/pm.md`
|
||||
```yaml
|
||||
良い点:
|
||||
✅ PDCAサイクルが定義されている
|
||||
✅ サブエージェント連携が明確
|
||||
✅ ドキュメント記録の仕組みがある
|
||||
|
||||
改善が必要な点:
|
||||
❌ ユーザーインプット依存度が高い
|
||||
❌ 調査フェーズが受動的
|
||||
❌ 提案が「どうしますか?」スタイル
|
||||
❌ 確信を持った提案がない
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 改善提案
|
||||
|
||||
### Phase 0: **自律的調査フェーズ**(新規追加)
|
||||
|
||||
#### ユーザーリクエスト受信時の自動実行
|
||||
```yaml
|
||||
Auto-Investigation (許可不要・自動実行):
|
||||
1. Context Restoration:
|
||||
- Read docs/Development/tasks/current-tasks.md
|
||||
- list_memories() → 前回のセッション確認
|
||||
- read_memory("project_context") → プロジェクト理解
|
||||
- read_memory("past_mistakes") → 過去の失敗確認
|
||||
|
||||
2. Project Analysis:
|
||||
- Read CLAUDE.md → プロジェクト固有ルール
|
||||
- Glob **/*.md → ドキュメント構造把握
|
||||
- mcp__serena__get_symbols_overview → コード構造理解
|
||||
- Grep "TODO\|FIXME\|XXX" → 既知の課題確認
|
||||
|
||||
3. Current State Assessment:
|
||||
- Bash "git status" → 現在の状態
|
||||
- Bash "git log -5 --oneline" → 最近の変更
|
||||
- Read tests/ → テストカバレッジ確認
|
||||
- Security scan → セキュリティリスク確認
|
||||
|
||||
4. Competitive Research (必要時):
|
||||
- tavily search → ベストプラクティス調査
|
||||
- context7 → 公式ドキュメント参照
|
||||
- Deep Research → 競合サービス分析
|
||||
|
||||
5. Architecture Evaluation:
|
||||
- 既存アーキテクチャの強み分析
|
||||
- 技術スタックの特徴把握
|
||||
- 拡張可能性の評価
|
||||
```
|
||||
|
||||
#### 出力形式
|
||||
```markdown
|
||||
📊 自律調査完了
|
||||
|
||||
現状分析:
|
||||
- プロジェクト: [名前]([技術スタック])
|
||||
- 進捗: [前回セッションの続き or 新規タスク]
|
||||
- コードベース: [ファイル数]、テストカバレッジ [%]
|
||||
- 既知の課題: [TODO/FIXME数]
|
||||
- 最近の変更: [git log要約]
|
||||
|
||||
アーキテクチャの強み:
|
||||
- [強み1]: [具体的な理由]
|
||||
- [強み2]: [具体的な理由]
|
||||
|
||||
不足している要素:
|
||||
- [不足1]: [影響]
|
||||
- [不足2]: [影響]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 1: **確信を持った提案**(強化)
|
||||
|
||||
#### ❌ 改善前(受動的)
|
||||
```
|
||||
User: "認証機能作って"
|
||||
|
||||
PM Agent: "認証機能を実装しますね。
|
||||
どんな認証方式がいいですか?"
|
||||
|
||||
→ ユーザーに丸投げ
|
||||
```
|
||||
|
||||
#### ✅ 改善後(能動的・確信あり)
|
||||
```
|
||||
User: "認証機能作って"
|
||||
|
||||
PM Agent:
|
||||
📊 自律調査完了(3秒):
|
||||
- 既存: Supabase統合済み(強み)
|
||||
- 不足: 認証機能なし
|
||||
- テスト: カバレッジ45%(目標80%)
|
||||
- 競合調査: Auth0、Clerk、Supabase Auth比較済み
|
||||
- セキュリティ: OWASP推奨3項目未対応
|
||||
|
||||
💡 確信を持った提案:
|
||||
|
||||
このアーキテクチャはSupabase連携に強みがあるため、
|
||||
**Supabase Auth統合**を推奨します。
|
||||
|
||||
具体的な実装方針:
|
||||
1. Supabase Auth統合(JWT + リフレッシュトークン)
|
||||
2. MFA対応(TOTP実装)
|
||||
3. セキュリティテスト追加(カバレッジ85%目標)
|
||||
4. 既存APIとのシームレス統合
|
||||
|
||||
選択理由:
|
||||
✅ 既存のSupabase接続再利用(実装コスト最小)
|
||||
✅ エンタープライズグレードのセキュリティ
|
||||
✅ 無料枠で十分な機能(コスト効率◎)
|
||||
✅ 将来のスケーラビリティ確保
|
||||
|
||||
代替案との比較:
|
||||
- Auth0: 月$25〜、実装複雑度高
|
||||
- Clerk: 月$25〜、React特化(このプロジェクトはNext.js)
|
||||
- Supabase Auth: 無料、既存統合済み ← 推奨
|
||||
|
||||
この方針で進めてよろしいですか?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: **自律実行**(既存を強化)
|
||||
|
||||
#### 承認後の自動フロー
|
||||
```yaml
|
||||
User: "OK"
|
||||
|
||||
PM Agent(完全自律実行):
|
||||
1. Architecture Design:
|
||||
- system-architect: Supabase Auth設計
|
||||
- security-engineer: セキュリティレビュー
|
||||
|
||||
2. Implementation:
|
||||
- backend-architect: API統合実装
|
||||
- frontend-architect: UI実装
|
||||
- Load magic: Login/Register components
|
||||
|
||||
3. Testing:
|
||||
- Write tests/auth/*.test.ts
|
||||
- pytest実行 → 失敗検出
|
||||
|
||||
4. Self-Correction:
|
||||
- context7 → Supabase公式ドキュメント確認
|
||||
- エラー原因特定: "JWTシークレット未設定"
|
||||
- 修正実装
|
||||
- 再テスト → 合格
|
||||
|
||||
5. Documentation:
|
||||
- Update docs/patterns/supabase-auth-integration.md
|
||||
- Update CLAUDE.md(認証パターン追加)
|
||||
- write_memory("success_pattern", 詳細)
|
||||
|
||||
6. Report:
|
||||
✅ 認証機能実装完了
|
||||
|
||||
実装内容:
|
||||
- Supabase Auth統合(JWT + リフレッシュ)
|
||||
- MFA対応(TOTP)
|
||||
- テストカバレッジ: 45% → 87%(目標達成)
|
||||
- セキュリティ: OWASP準拠確認済み
|
||||
|
||||
学習記録:
|
||||
- 成功パターン: docs/patterns/supabase-auth-integration.md
|
||||
- 遭遇したエラー: JWT設定不足(修正済み)
|
||||
- 次回の改善: 環境変数チェックリスト更新
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 実装方針
|
||||
|
||||
### `superclaude/commands/pm.md` への追加セクション
|
||||
|
||||
#### 1. Autonomous Investigation Phase(新規)
|
||||
```markdown
|
||||
## Phase 0: Autonomous Investigation (Auto-Execute)
|
||||
|
||||
**Trigger**: Any user request received
|
||||
|
||||
**Execution**: Automatic, no permission required
|
||||
|
||||
### Investigation Steps:
|
||||
1. **Context Restoration**
|
||||
- Read `docs/Development/tasks/current-tasks.md`
|
||||
- Serena memory restoration
|
||||
- Project context loading
|
||||
|
||||
2. **Project Analysis**
|
||||
- CLAUDE.md → Project rules
|
||||
- Code structure analysis
|
||||
- Test coverage check
|
||||
- Security scan
|
||||
- Known issues detection (TODO/FIXME)
|
||||
|
||||
3. **Competitive Research** (when relevant)
|
||||
- Best practices research (Tavily)
|
||||
- Official documentation (Context7)
|
||||
- Alternative solutions analysis
|
||||
|
||||
4. **Architecture Evaluation**
|
||||
- Identify architectural strengths
|
||||
- Detect technology stack characteristics
|
||||
- Assess extensibility
|
||||
|
||||
### Output Format:
|
||||
```
|
||||
📊 Autonomous Investigation Complete
|
||||
|
||||
Current State:
|
||||
- Project: [name] ([stack])
|
||||
- Progress: [status]
|
||||
- Codebase: [files count], Test Coverage: [%]
|
||||
- Known Issues: [count]
|
||||
- Recent Changes: [git log summary]
|
||||
|
||||
Architectural Strengths:
|
||||
- [strength 1]: [rationale]
|
||||
- [strength 2]: [rationale]
|
||||
|
||||
Missing Elements:
|
||||
- [gap 1]: [impact]
|
||||
- [gap 2]: [impact]
|
||||
```
|
||||
```
|
||||
|
||||
#### 2. Confident Proposal Phase(強化)
|
||||
```markdown
|
||||
## Phase 1: Confident Proposal (Enhanced)
|
||||
|
||||
**Principle**: Never ask "What do you want?" - Always propose with conviction
|
||||
|
||||
### Proposal Format:
|
||||
```
|
||||
💡 Confident Proposal:
|
||||
|
||||
[Implementation approach] is recommended.
|
||||
|
||||
Specific Implementation Plan:
|
||||
1. [Step 1 with rationale]
|
||||
2. [Step 2 with rationale]
|
||||
3. [Step 3 with rationale]
|
||||
|
||||
Selection Rationale:
|
||||
✅ [Reason 1]: [Evidence]
|
||||
✅ [Reason 2]: [Evidence]
|
||||
✅ [Reason 3]: [Evidence]
|
||||
|
||||
Alternatives Considered:
|
||||
- [Alt 1]: [Why not chosen]
|
||||
- [Alt 2]: [Why not chosen]
|
||||
- [Recommended]: [Why chosen] ← Recommended
|
||||
|
||||
Proceed with this approach?
|
||||
```
|
||||
|
||||
### Anti-Patterns (Never Do):
|
||||
❌ "What authentication do you want?" (Passive)
|
||||
❌ "How should we implement this?" (Uncertain)
|
||||
❌ "There are several options..." (Indecisive)
|
||||
|
||||
✅ "Supabase Auth is recommended because..." (Confident)
|
||||
✅ "Based on your architecture's Supabase integration..." (Evidence-based)
|
||||
```
|
||||
|
||||
#### 3. Autonomous Execution Phase(既存を明示化)
|
||||
```markdown
|
||||
## Phase 2: Autonomous Execution
|
||||
|
||||
**Trigger**: User approval ("OK", "Go ahead", "Yes")
|
||||
|
||||
**Execution**: Fully autonomous, systematic PDCA
|
||||
|
||||
### Self-Correction Loop:
|
||||
```yaml
|
||||
Implementation:
|
||||
- Execute with sub-agents
|
||||
- Write comprehensive tests
|
||||
- Run validation
|
||||
|
||||
Error Detected:
|
||||
→ Context7: Check official documentation
|
||||
→ Identify root cause
|
||||
→ Implement fix
|
||||
→ Re-test
|
||||
→ Repeat until passing
|
||||
|
||||
Success:
|
||||
→ Document pattern (docs/patterns/)
|
||||
→ Update learnings (write_memory)
|
||||
→ Report completion with evidence
|
||||
```
|
||||
|
||||
### Quality Gates:
|
||||
- Tests must pass (no exceptions)
|
||||
- Coverage targets must be met
|
||||
- Security checks must pass
|
||||
- Documentation must be updated
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 期待される効果
|
||||
|
||||
### Before (現状)
|
||||
```yaml
|
||||
User Input Required: 高
|
||||
- 認証方式の選択
|
||||
- 実装方針の決定
|
||||
- エラー対応の指示
|
||||
- テスト方針の決定
|
||||
|
||||
Proposal Quality: 受動的
|
||||
- "どうしますか?"スタイル
|
||||
- 選択肢の羅列のみ
|
||||
- ユーザーが決定
|
||||
|
||||
Execution: 半自動
|
||||
- エラー時にユーザーに報告
|
||||
- 修正方針をユーザーが指示
|
||||
```
|
||||
|
||||
### After (改善後)
|
||||
```yaml
|
||||
User Input Required: 最小
|
||||
- "認証機能作って"のみ
|
||||
- 提案への承認/拒否のみ
|
||||
|
||||
Proposal Quality: 能動的・確信あり
|
||||
- 調査済みの根拠提示
|
||||
- 明確な推奨案
|
||||
- 代替案との比較
|
||||
|
||||
Execution: 完全自律
|
||||
- エラー自己修正
|
||||
- 公式ドキュメント自動参照
|
||||
- テスト合格まで自動実行
|
||||
- 学習自動記録
|
||||
```
|
||||
|
||||
### 定量的目標
|
||||
- ユーザーインプット削減: **80%削減**
|
||||
- 提案品質向上: **確信度90%以上**
|
||||
- 自律実行成功率: **95%以上**
|
||||
|
||||
---
|
||||
|
||||
## 🚀 実装ステップ
|
||||
|
||||
### Step 1: pm.md 修正
|
||||
- [ ] Phase 0: Autonomous Investigation 追加
|
||||
- [ ] Phase 1: Confident Proposal 強化
|
||||
- [ ] Phase 2: Autonomous Execution 明示化
|
||||
- [ ] Examples セクションに具体例追加
|
||||
|
||||
### Step 2: テスト作成
|
||||
- [ ] `tests/test_pm_autonomous.py`
|
||||
- [ ] 自律調査フローのテスト
|
||||
- [ ] 確信提案フォーマットのテスト
|
||||
- [ ] 自己修正ループのテスト
|
||||
|
||||
### Step 3: 動作確認
|
||||
- [ ] 開発版インストール
|
||||
- [ ] 実際のワークフローで検証
|
||||
- [ ] フィードバック収集
|
||||
|
||||
### Step 4: 学習記録
|
||||
- [ ] `docs/patterns/pm-autonomous-workflow.md`
|
||||
- [ ] 成功パターンの文書化
|
||||
|
||||
---
|
||||
|
||||
## ✅ ユーザー承認待ち
|
||||
|
||||
**この方針で実装を進めてよろしいですか?**
|
||||
|
||||
承認いただければ、すぐに `superclaude/commands/pm.md` の修正を開始します。
|
||||
378
docs/Development/installation-flow-understanding.md
Normal file
378
docs/Development/installation-flow-understanding.md
Normal file
@ -0,0 +1,378 @@
|
||||
# SuperClaude Installation Flow - Complete Understanding
|
||||
|
||||
> **学習内容**: インストーラーがどうやって `~/.claude/` にファイルを配置するかの完全理解
|
||||
|
||||
---
|
||||
|
||||
## 🔄 インストールフロー全体像
|
||||
|
||||
### ユーザー操作
|
||||
```bash
|
||||
# Step 1: パッケージインストール
|
||||
pipx install SuperClaude
|
||||
# または
|
||||
npm install -g @bifrost_inc/superclaude
|
||||
|
||||
# Step 2: セットアップ実行
|
||||
SuperClaude install
|
||||
```
|
||||
|
||||
### 内部処理の流れ
|
||||
|
||||
```yaml
|
||||
1. Entry Point:
|
||||
File: superclaude/__main__.py → main()
|
||||
|
||||
2. CLI Parser:
|
||||
File: superclaude/__main__.py → create_parser()
|
||||
Command: "install" サブコマンド登録
|
||||
|
||||
3. Component Manager:
|
||||
File: setup/cli/install.py
|
||||
Role: インストールコンポーネントの調整
|
||||
|
||||
4. Commands Component:
|
||||
File: setup/components/commands.py → CommandsComponent
|
||||
Role: スラッシュコマンドのインストール
|
||||
|
||||
5. Source Files:
|
||||
Location: superclaude/commands/*.md
|
||||
Content: pm.md, implement.md, test.md, etc.
|
||||
|
||||
6. Destination:
|
||||
Location: ~/.claude/commands/sc/*.md
|
||||
Result: ユーザー環境に配置
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 CommandsComponent の詳細
|
||||
|
||||
### クラス構造
|
||||
```python
|
||||
class CommandsComponent(Component):
|
||||
"""
|
||||
Role: スラッシュコマンドのインストール・管理
|
||||
Parent: setup/core/base.py → Component
|
||||
Install Path: ~/.claude/commands/sc/
|
||||
"""
|
||||
```
|
||||
|
||||
### 主要メソッド
|
||||
|
||||
#### 1. `__init__()`
|
||||
```python
|
||||
def __init__(self, install_dir: Optional[Path] = None):
|
||||
super().__init__(install_dir, Path("commands/sc"))
|
||||
```
|
||||
**理解**:
|
||||
- `install_dir`: `~/.claude/` (ユーザー環境)
|
||||
- `Path("commands/sc")`: サブディレクトリ指定
|
||||
- 結果: `~/.claude/commands/sc/` にインストール
|
||||
|
||||
#### 2. `_get_source_dir()`
|
||||
```python
|
||||
def _get_source_dir(self) -> Path:
|
||||
# setup/components/commands.py の位置から計算
|
||||
project_root = Path(__file__).parent.parent.parent
|
||||
# → ~/github/SuperClaude_Framework/
|
||||
|
||||
return project_root / "superclaude" / "commands"
|
||||
# → ~/github/SuperClaude_Framework/superclaude/commands/
|
||||
```
|
||||
|
||||
**理解**:
|
||||
```
|
||||
Source: ~/github/SuperClaude_Framework/superclaude/commands/*.md
|
||||
Target: ~/.claude/commands/sc/*.md
|
||||
|
||||
つまり:
|
||||
superclaude/commands/pm.md
|
||||
↓ コピー
|
||||
~/.claude/commands/sc/pm.md
|
||||
```
|
||||
|
||||
#### 3. `_install()` - インストール実行
|
||||
```python
|
||||
def _install(self, config: Dict[str, Any]) -> bool:
|
||||
self.logger.info("Installing SuperClaude command definitions...")
|
||||
|
||||
# 既存コマンドのマイグレーション
|
||||
self._migrate_existing_commands()
|
||||
|
||||
# 親クラスのインストール実行
|
||||
return super()._install(config)
|
||||
```
|
||||
|
||||
**理解**:
|
||||
1. ログ出力
|
||||
2. 旧バージョンからの移行処理
|
||||
3. 実際のファイルコピー(親クラスで実行)
|
||||
|
||||
#### 4. `_migrate_existing_commands()` - マイグレーション
|
||||
```python
|
||||
def _migrate_existing_commands(self) -> None:
|
||||
"""
|
||||
旧Location: ~/.claude/commands/*.md
|
||||
新Location: ~/.claude/commands/sc/*.md
|
||||
|
||||
V3 → V4 移行時の処理
|
||||
"""
|
||||
old_commands_dir = self.install_dir / "commands"
|
||||
new_commands_dir = self.install_dir / "commands" / "sc"
|
||||
|
||||
# 旧場所からファイル検出
|
||||
# 新場所へコピー
|
||||
# 旧場所から削除
|
||||
```
|
||||
|
||||
**理解**:
|
||||
- V3: `/analyze` → V4: `/sc:analyze`
|
||||
- 名前空間衝突を防ぐため `/sc:` プレフィックス
|
||||
|
||||
#### 5. `_post_install()` - メタデータ更新
|
||||
```python
|
||||
def _post_install(self) -> bool:
|
||||
# メタデータ更新
|
||||
metadata_mods = self.get_metadata_modifications()
|
||||
self.settings_manager.update_metadata(metadata_mods)
|
||||
|
||||
# コンポーネント登録
|
||||
self.settings_manager.add_component_registration(
|
||||
"commands",
|
||||
{
|
||||
"version": __version__,
|
||||
"category": "commands",
|
||||
"files_count": len(self.component_files),
|
||||
},
|
||||
)
|
||||
```
|
||||
|
||||
**理解**:
|
||||
- `~/.claude/.superclaude.json` 更新
|
||||
- インストール済みコンポーネント記録
|
||||
- バージョン管理
|
||||
|
||||
---
|
||||
|
||||
## 📋 実際のファイルマッピング
|
||||
|
||||
### Source(このプロジェクト)
|
||||
```
|
||||
~/github/SuperClaude_Framework/superclaude/commands/
|
||||
├── pm.md # PM Agent定義
|
||||
├── implement.md # Implement コマンド
|
||||
├── test.md # Test コマンド
|
||||
├── analyze.md # Analyze コマンド
|
||||
├── research.md # Research コマンド
|
||||
├── ...(全26コマンド)
|
||||
```
|
||||
|
||||
### Destination(ユーザー環境)
|
||||
```
|
||||
~/.claude/commands/sc/
|
||||
├── pm.md # → /sc:pm で実行可能
|
||||
├── implement.md # → /sc:implement で実行可能
|
||||
├── test.md # → /sc:test で実行可能
|
||||
├── analyze.md # → /sc:analyze で実行可能
|
||||
├── research.md # → /sc:research で実行可能
|
||||
├── ...(全26コマンド)
|
||||
```
|
||||
|
||||
### Claude Code動作
|
||||
```
|
||||
User: /sc:pm "Build authentication"
|
||||
|
||||
Claude Code:
|
||||
1. ~/.claude/commands/sc/pm.md 読み込み
|
||||
2. YAML frontmatter 解析
|
||||
3. Markdown本文を展開
|
||||
4. PM Agent として実行
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 他のコンポーネント
|
||||
|
||||
### Modes Component
|
||||
```python
|
||||
File: setup/components/modes.py
|
||||
Source: superclaude/modes/*.md
|
||||
Target: ~/.claude/*.md
|
||||
|
||||
Example:
|
||||
superclaude/modes/MODE_Brainstorming.md
|
||||
↓
|
||||
~/.claude/MODE_Brainstorming.md
|
||||
```
|
||||
|
||||
### Agents Component
|
||||
```python
|
||||
File: setup/components/agents.py
|
||||
Source: superclaude/agents/*.md
|
||||
Target: ~/.claude/agents/*.md(または統合先)
|
||||
```
|
||||
|
||||
### Core Component
|
||||
```python
|
||||
File: setup/components/core.py
|
||||
Source: superclaude/core/CLAUDE.md
|
||||
Target: ~/.claude/CLAUDE.md
|
||||
|
||||
これがグローバル設定!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 開発時の注意点
|
||||
|
||||
### ✅ 正しい変更方法
|
||||
```bash
|
||||
# 1. ソースファイルを変更(Git管理)
|
||||
cd ~/github/SuperClaude_Framework
|
||||
vim superclaude/commands/pm.md
|
||||
|
||||
# 2. テスト追加
|
||||
Write tests/test_pm_command.py
|
||||
|
||||
# 3. テスト実行
|
||||
pytest tests/test_pm_command.py -v
|
||||
|
||||
# 4. コミット
|
||||
git add superclaude/commands/pm.md tests/
|
||||
git commit -m "feat: enhance PM command"
|
||||
|
||||
# 5. 開発版インストール
|
||||
pip install -e .
|
||||
# または
|
||||
SuperClaude install --dev
|
||||
|
||||
# 6. 動作確認
|
||||
claude
|
||||
/sc:pm "test"
|
||||
```
|
||||
|
||||
### ❌ 間違った変更方法
|
||||
```bash
|
||||
# ダメ!Git管理外を直接変更
|
||||
vim ~/.claude/commands/sc/pm.md
|
||||
|
||||
# 変更は次回インストール時に上書きされる
|
||||
SuperClaude install # ← 変更が消える!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 PM Mode改善の正しいフロー
|
||||
|
||||
### Phase 1: 理解(今ここ!)
|
||||
```bash
|
||||
✅ setup/components/commands.py 理解完了
|
||||
✅ superclaude/commands/*.md の存在確認完了
|
||||
✅ インストールフロー理解完了
|
||||
```
|
||||
|
||||
### Phase 2: 現在の仕様確認
|
||||
```bash
|
||||
# ソース確認(Git管理)
|
||||
Read superclaude/commands/pm.md
|
||||
|
||||
# インストール後確認(参考用)
|
||||
Read ~/.claude/commands/sc/pm.md
|
||||
|
||||
# 「なるほど、こういう仕様になってるのか」
|
||||
```
|
||||
|
||||
### Phase 3: 改善案作成
|
||||
```bash
|
||||
# このプロジェクト内で(Git管理)
|
||||
Write docs/Development/hypothesis-pm-enhancement-2025-10-14.md
|
||||
|
||||
内容:
|
||||
- 現状の問題(ドキュメント寄りすぎ、PMO機能不足)
|
||||
- 改善案(自律的PDCA、自己評価)
|
||||
- 実装方針
|
||||
- 期待される効果
|
||||
```
|
||||
|
||||
### Phase 4: 実装
|
||||
```bash
|
||||
# ソースファイル修正
|
||||
Edit superclaude/commands/pm.md
|
||||
|
||||
変更例:
|
||||
- PDCA自動実行の強化
|
||||
- docs/ ディレクトリ活用の明示
|
||||
- 自己評価ステップの追加
|
||||
- エラー時再学習フローの追加
|
||||
```
|
||||
|
||||
### Phase 5: テスト・検証
|
||||
```bash
|
||||
# テスト追加
|
||||
Write tests/test_pm_enhanced.py
|
||||
|
||||
# テスト実行
|
||||
pytest tests/test_pm_enhanced.py -v
|
||||
|
||||
# 開発版インストール
|
||||
SuperClaude install --dev
|
||||
|
||||
# 実際に使ってみる
|
||||
claude
|
||||
/sc:pm "test enhanced workflow"
|
||||
```
|
||||
|
||||
### Phase 6: 学習記録
|
||||
```bash
|
||||
# 成功パターン記録
|
||||
Write docs/patterns/pm-autonomous-workflow.md
|
||||
|
||||
# 失敗があれば記録
|
||||
Write docs/mistakes/mistake-2025-10-14.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Component間の依存関係
|
||||
|
||||
```yaml
|
||||
Commands Component:
|
||||
depends_on: ["core"]
|
||||
|
||||
Core Component:
|
||||
provides:
|
||||
- ~/.claude/CLAUDE.md(グローバル設定)
|
||||
- 基本ディレクトリ構造
|
||||
|
||||
Modes Component:
|
||||
depends_on: ["core"]
|
||||
provides:
|
||||
- ~/.claude/MODE_*.md
|
||||
|
||||
Agents Component:
|
||||
depends_on: ["core"]
|
||||
provides:
|
||||
- エージェント定義
|
||||
|
||||
MCP Component:
|
||||
depends_on: ["core"]
|
||||
provides:
|
||||
- MCPサーバー設定
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 次のアクション
|
||||
|
||||
理解完了!次は:
|
||||
|
||||
1. ✅ `superclaude/commands/pm.md` の現在の仕様確認
|
||||
2. ✅ 改善提案ドキュメント作成
|
||||
3. ✅ 実装修正(PDCA強化、PMO機能追加)
|
||||
4. ✅ テスト追加・実行
|
||||
5. ✅ 動作確認
|
||||
6. ✅ 学習記録
|
||||
|
||||
このドキュメント自体が**インストールフローの完全理解記録**として機能する。
|
||||
次回のセッションで読めば、同じ説明を繰り返さなくて済む。
|
||||
341
docs/Development/pm-agent-ideal-workflow.md
Normal file
341
docs/Development/pm-agent-ideal-workflow.md
Normal file
@ -0,0 +1,341 @@
|
||||
# PM Agent - Ideal Autonomous Workflow
|
||||
|
||||
> **目的**: 何百回も同じ指示を繰り返さないための自律的オーケストレーションシステム
|
||||
|
||||
## 🎯 解決すべき問題
|
||||
|
||||
### 現状の課題
|
||||
- **繰り返し指示**: 同じことを何百回も説明している
|
||||
- **同じミスの反復**: 一度間違えたことを再度間違える
|
||||
- **知識の喪失**: セッションが途切れると学習内容が失われる
|
||||
- **コンテキスト制限**: 限られたコンテキストで効率的に動作できていない
|
||||
|
||||
### あるべき姿
|
||||
**自律的で賢いPM Agent** - ドキュメントから学び、計画し、実行し、検証し、学習を記録するループ
|
||||
|
||||
---
|
||||
|
||||
## 📋 完璧なワークフロー(理想形)
|
||||
|
||||
### Phase 1: 📖 状況把握(Context Restoration)
|
||||
|
||||
```yaml
|
||||
1. ドキュメント読み込み:
|
||||
優先順位:
|
||||
1. タスク管理ドキュメント → 進捗確認
|
||||
- docs/Development/tasks/current-tasks.md
|
||||
- 前回どこまでやったか
|
||||
- 次に何をすべきか
|
||||
|
||||
2. アーキテクチャドキュメント → 仕組み理解
|
||||
- docs/Development/architecture-*.md
|
||||
- このプロジェクトの構造
|
||||
- インストールフロー
|
||||
- コンポーネント連携
|
||||
|
||||
3. 禁止事項・ルール → 制約確認
|
||||
- CLAUDE.md(グローバル)
|
||||
- PROJECT/CLAUDE.md(プロジェクト固有)
|
||||
- docs/Development/constraints.md
|
||||
|
||||
4. 過去の学び → 同じミスを防ぐ
|
||||
- docs/mistakes/ (失敗記録)
|
||||
- docs/patterns/ (成功パターン)
|
||||
|
||||
2. ユーザーリクエスト理解:
|
||||
- 何をしたいのか
|
||||
- どこまで進んでいるのか
|
||||
- 何が課題なのか
|
||||
```
|
||||
|
||||
### Phase 2: 🔍 調査・分析(Research & Analysis)
|
||||
|
||||
```yaml
|
||||
1. 既存実装の理解:
|
||||
# ソースコード側(Git管理)
|
||||
- setup/components/*.py → インストールロジック
|
||||
- superclaude/ → ランタイムロジック
|
||||
- tests/ → テストパターン
|
||||
|
||||
# インストール後(ユーザー環境・Git管理外)
|
||||
- ~/.claude/commands/sc/ → 実際の配置確認
|
||||
- ~/.claude/*.md → 現在の仕様確認
|
||||
|
||||
理解内容:
|
||||
「なるほど、ここでこう処理されて、
|
||||
こういうファイルが ~/.claude/ に作られるのね」
|
||||
|
||||
2. ベストプラクティス調査:
|
||||
# Deep Research活用
|
||||
- 公式リファレンス確認
|
||||
- 他プロジェクトの実装調査
|
||||
- 最新のベストプラクティス
|
||||
|
||||
気づき:
|
||||
- 「ここ無駄だな」
|
||||
- 「ここ古いな」
|
||||
- 「これはいい実装だな」
|
||||
- 「この共通化できるな」
|
||||
|
||||
3. 重複・改善ポイント発見:
|
||||
- ライブラリの共通化可能性
|
||||
- 重複実装の検出
|
||||
- コード品質向上余地
|
||||
```
|
||||
|
||||
### Phase 3: 📝 計画立案(Planning)
|
||||
|
||||
```yaml
|
||||
1. 改善仮説作成:
|
||||
# このプロジェクト内で(Git管理)
|
||||
File: docs/Development/hypothesis-YYYY-MM-DD.md
|
||||
|
||||
内容:
|
||||
- 現状の問題点
|
||||
- 改善案
|
||||
- 期待される効果(トークン削減、パフォーマンス向上等)
|
||||
- 実装方針
|
||||
- 必要なテスト
|
||||
|
||||
2. ユーザーレビュー:
|
||||
「こういうプランでこんなことをやろうと思っています」
|
||||
|
||||
提示内容:
|
||||
- 調査結果のサマリー
|
||||
- 改善提案(理由付き)
|
||||
- 実装ステップ
|
||||
- 期待される成果
|
||||
|
||||
ユーザー承認待ち → OK出たら実装へ
|
||||
```
|
||||
|
||||
### Phase 4: 🛠️ 実装(Implementation)
|
||||
|
||||
```yaml
|
||||
1. ソースコード修正:
|
||||
# Git管理されているこのプロジェクトで作業
|
||||
cd ~/github/SuperClaude_Framework
|
||||
|
||||
修正対象:
|
||||
- setup/components/*.py → インストールロジック
|
||||
- superclaude/ → ランタイム機能
|
||||
- setup/data/*.json → 設定データ
|
||||
|
||||
# サブエージェント活用
|
||||
- backend-architect: アーキテクチャ実装
|
||||
- refactoring-expert: コード改善
|
||||
- quality-engineer: テスト設計
|
||||
|
||||
2. 実装記録:
|
||||
File: docs/Development/experiment-YYYY-MM-DD.md
|
||||
|
||||
内容:
|
||||
- 試行錯誤の記録
|
||||
- 遭遇したエラー
|
||||
- 解決方法
|
||||
- 気づき
|
||||
```
|
||||
|
||||
### Phase 5: ✅ 検証(Validation)
|
||||
|
||||
```yaml
|
||||
1. テスト作成・実行:
|
||||
# テストを書く
|
||||
Write tests/test_new_feature.py
|
||||
|
||||
# テスト実行
|
||||
pytest tests/test_new_feature.py -v
|
||||
|
||||
# ユーザー要求を満たしているか確認
|
||||
- 期待通りの動作か?
|
||||
- エッジケースは?
|
||||
- パフォーマンスは?
|
||||
|
||||
2. エラー時の対応:
|
||||
エラー発生
|
||||
↓
|
||||
公式リファレンス確認
|
||||
「このエラー何でだろう?」
|
||||
「ここの定義違ってたんだ」
|
||||
↓
|
||||
修正
|
||||
↓
|
||||
再テスト
|
||||
↓
|
||||
合格まで繰り返し
|
||||
|
||||
3. 動作確認:
|
||||
# インストールして実際の環境でテスト
|
||||
SuperClaude install --dev
|
||||
|
||||
# 動作確認
|
||||
claude # 起動して実際に試す
|
||||
```
|
||||
|
||||
### Phase 6: 📚 学習記録(Learning Documentation)
|
||||
|
||||
```yaml
|
||||
1. 成功パターン記録:
|
||||
File: docs/patterns/[pattern-name].md
|
||||
|
||||
内容:
|
||||
- どんな問題を解決したか
|
||||
- どう実装したか
|
||||
- なぜこのアプローチか
|
||||
- 再利用可能なパターン
|
||||
|
||||
2. 失敗・ミス記録:
|
||||
File: docs/mistakes/mistake-YYYY-MM-DD.md
|
||||
|
||||
内容:
|
||||
- どんなミスをしたか
|
||||
- なぜ起きたか
|
||||
- 防止策
|
||||
- チェックリスト
|
||||
|
||||
3. タスク更新:
|
||||
File: docs/Development/tasks/current-tasks.md
|
||||
|
||||
内容:
|
||||
- 完了したタスク
|
||||
- 次のタスク
|
||||
- 進捗状況
|
||||
- ブロッカー
|
||||
|
||||
4. グローバルパターン更新:
|
||||
必要に応じて:
|
||||
- CLAUDE.md更新(グローバルルール)
|
||||
- PROJECT/CLAUDE.md更新(プロジェクト固有)
|
||||
```
|
||||
|
||||
### Phase 7: 🔄 セッション保存(Session Persistence)
|
||||
|
||||
```yaml
|
||||
1. Serenaメモリー保存:
|
||||
write_memory("session_summary", 完了内容)
|
||||
write_memory("next_actions", 次のアクション)
|
||||
write_memory("learnings", 学んだこと)
|
||||
|
||||
2. ドキュメント整理:
|
||||
- docs/temp/ → docs/patterns/ or docs/mistakes/
|
||||
- 一時ファイル削除
|
||||
- 正式ドキュメント更新
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 活用可能なツール・リソース
|
||||
|
||||
### MCPサーバー(フル活用)
|
||||
- **Sequential**: 複雑な分析・推論
|
||||
- **Context7**: 公式ドキュメント参照
|
||||
- **Tavily**: Deep Research(ベストプラクティス調査)
|
||||
- **Serena**: セッション永続化、メモリー管理
|
||||
- **Playwright**: E2Eテスト、動作確認
|
||||
- **Morphllm**: 一括コード変換
|
||||
- **Magic**: UI生成(必要時)
|
||||
- **Chrome DevTools**: パフォーマンス測定
|
||||
|
||||
### サブエージェント(適材適所)
|
||||
- **requirements-analyst**: 要件整理
|
||||
- **system-architect**: アーキテクチャ設計
|
||||
- **backend-architect**: バックエンド実装
|
||||
- **refactoring-expert**: コード改善
|
||||
- **security-engineer**: セキュリティ検証
|
||||
- **quality-engineer**: テスト設計・実行
|
||||
- **performance-engineer**: パフォーマンス最適化
|
||||
- **technical-writer**: ドキュメント執筆
|
||||
|
||||
### 他プロジェクト統合
|
||||
- **makefile-global**: Makefile標準化パターン
|
||||
- **airis-mcp-gateway**: MCPゲートウェイ統合
|
||||
- その他有用なパターンは積極的に取り込む
|
||||
|
||||
---
|
||||
|
||||
## 🎯 重要な原則
|
||||
|
||||
### Git管理の区別
|
||||
```yaml
|
||||
✅ Git管理されている(変更追跡可能):
|
||||
- ~/github/SuperClaude_Framework/
|
||||
- ここで全ての変更を行う
|
||||
- コミット履歴で追跡
|
||||
- PR提出可能
|
||||
|
||||
❌ Git管理外(変更追跡不可):
|
||||
- ~/.claude/
|
||||
- 読むだけ、理解のみ
|
||||
- テスト時のみ一時変更(必ず戻す!)
|
||||
```
|
||||
|
||||
### テスト時の注意
|
||||
```bash
|
||||
# テスト前: 必ずバックアップ
|
||||
cp ~/.claude/commands/sc/pm.md ~/.claude/commands/sc/pm.md.backup
|
||||
|
||||
# テスト実行
|
||||
# ... 検証 ...
|
||||
|
||||
# テスト後: 必ず復元!!
|
||||
mv ~/.claude/commands/sc/pm.md.backup ~/.claude/commands/sc/pm.md
|
||||
```
|
||||
|
||||
### ドキュメント構造
|
||||
```
|
||||
docs/
|
||||
├── Development/ # 開発用ドキュメント
|
||||
│ ├── tasks/ # タスク管理
|
||||
│ ├── architecture-*.md # アーキテクチャ
|
||||
│ ├── constraints.md # 制約・禁止事項
|
||||
│ ├── hypothesis-*.md # 改善仮説
|
||||
│ └── experiment-*.md # 実験記録
|
||||
├── patterns/ # 成功パターン(清書後)
|
||||
├── mistakes/ # 失敗記録と防止策
|
||||
└── (既存のUser-Guide等)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 実装優先度
|
||||
|
||||
### Phase 1(必須)
|
||||
1. ドキュメント構造整備
|
||||
2. タスク管理システム
|
||||
3. セッション復元ワークフロー
|
||||
|
||||
### Phase 2(重要)
|
||||
4. 自己評価・検証ループ
|
||||
5. 学習記録自動化
|
||||
6. エラー時再学習フロー
|
||||
|
||||
### Phase 3(強化)
|
||||
7. PMO機能(重複検出、共通化提案)
|
||||
8. パフォーマンス測定・改善
|
||||
9. 他プロジェクト統合
|
||||
|
||||
---
|
||||
|
||||
## 📊 成功指標
|
||||
|
||||
### 定量的指標
|
||||
- **繰り返し指示の削減**: 同じ指示 → 50%削減目標
|
||||
- **ミス再発率**: 同じミス → 80%削減目標
|
||||
- **セッション復元時間**: <30秒で前回の続きから開始
|
||||
|
||||
### 定性的指標
|
||||
- ユーザーが「前回の続きから」と言うだけで再開できる
|
||||
- 過去のミスを自動的に避けられる
|
||||
- 公式ドキュメント参照が自動化されている
|
||||
- 実装→テスト→検証が自律的に回る
|
||||
|
||||
---
|
||||
|
||||
## 💡 次のアクション
|
||||
|
||||
このドキュメント作成後:
|
||||
1. 既存のインストールロジック理解(setup/components/)
|
||||
2. タスク管理ドキュメント作成(docs/Development/tasks/)
|
||||
3. PM Agent実装修正(このワークフローを実際に実装)
|
||||
|
||||
このドキュメント自体が**PM Agentの憲法**となる。
|
||||
477
docs/Development/pm-agent-integration.md
Normal file
477
docs/Development/pm-agent-integration.md
Normal file
@ -0,0 +1,477 @@
|
||||
# PM Agent Mode Integration Guide
|
||||
|
||||
**Last Updated**: 2025-10-14
|
||||
**Target Version**: 4.2.0
|
||||
**Status**: Implementation Guide
|
||||
|
||||
---
|
||||
|
||||
## 📋 Overview
|
||||
|
||||
This guide provides step-by-step procedures for integrating PM Agent mode as SuperClaude's always-active meta-layer with session lifecycle management, PDCA self-evaluation, and systematic knowledge management.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Integration Goals
|
||||
|
||||
1. **Session Lifecycle**: Auto-activation at session start with context restoration
|
||||
2. **PDCA Engine**: Automated Plan-Do-Check-Act cycle execution
|
||||
3. **Memory Operations**: Serena MCP integration for session persistence
|
||||
4. **Documentation Strategy**: Systematic knowledge evolution
|
||||
|
||||
---
|
||||
|
||||
## 📐 Architecture Integration
|
||||
|
||||
### PM Agent Position
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────┐
|
||||
│ PM Agent Mode (Meta-Layer) │
|
||||
│ • Always Active │
|
||||
│ • Session Management │
|
||||
│ • PDCA Self-Evaluation │
|
||||
└──────────────┬───────────────────────────┘
|
||||
↓
|
||||
[Specialist Agents Layer]
|
||||
↓
|
||||
[Commands & Modes Layer]
|
||||
↓
|
||||
[MCP Tool Layer]
|
||||
```
|
||||
|
||||
See: [ARCHITECTURE.md](./ARCHITECTURE.md) for full system architecture
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Phase 2: Core Implementation
|
||||
|
||||
### File Structure
|
||||
|
||||
```
|
||||
superclaude/
|
||||
├── Commands/
|
||||
│ └── pm.md # ✅ Already updated
|
||||
├── Agents/
|
||||
│ └── pm-agent.md # ✅ Already updated
|
||||
└── Core/
|
||||
├── __init__.py # Module initialization
|
||||
├── session_lifecycle.py # 🆕 Session management
|
||||
├── pdca_engine.py # 🆕 PDCA automation
|
||||
└── memory_ops.py # 🆕 Memory operations
|
||||
```
|
||||
|
||||
### Implementation Order
|
||||
|
||||
1. `memory_ops.py` - Serena MCP wrapper (foundation)
|
||||
2. `session_lifecycle.py` - Session management (depends on memory_ops)
|
||||
3. `pdca_engine.py` - PDCA automation (depends on memory_ops)
|
||||
|
||||
---
|
||||
|
||||
## 1️⃣ memory_ops.py Implementation
|
||||
|
||||
### Purpose
|
||||
Wrapper for Serena MCP memory operations with error handling and fallback.
|
||||
|
||||
### Key Functions
|
||||
|
||||
```python
|
||||
# superclaude/Core/memory_ops.py
|
||||
|
||||
class MemoryOperations:
|
||||
"""Serena MCP memory operations wrapper"""
|
||||
|
||||
def list_memories() -> List[str]:
|
||||
"""List all available memories"""
|
||||
|
||||
def read_memory(key: str) -> Optional[Dict]:
|
||||
"""Read memory by key"""
|
||||
|
||||
def write_memory(key: str, value: Dict) -> bool:
|
||||
"""Write memory with key"""
|
||||
|
||||
def delete_memory(key: str) -> bool:
|
||||
"""Delete memory by key"""
|
||||
```
|
||||
|
||||
### Integration Points
|
||||
- Connect to Serena MCP server
|
||||
- Handle connection errors gracefully
|
||||
- Provide fallback for offline mode
|
||||
- Validate memory structure
|
||||
|
||||
### Testing
|
||||
```bash
|
||||
pytest tests/test_memory_ops.py -v
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2️⃣ session_lifecycle.py Implementation
|
||||
|
||||
### Purpose
|
||||
Auto-activation at session start, context restoration, user report generation.
|
||||
|
||||
### Key Functions
|
||||
|
||||
```python
|
||||
# superclaude/Core/session_lifecycle.py
|
||||
|
||||
class SessionLifecycle:
|
||||
"""Session lifecycle management"""
|
||||
|
||||
def on_session_start():
|
||||
"""Hook for session start (auto-activation)"""
|
||||
# 1. list_memories()
|
||||
# 2. read_memory("pm_context")
|
||||
# 3. read_memory("last_session")
|
||||
# 4. read_memory("next_actions")
|
||||
# 5. generate_user_report()
|
||||
|
||||
def generate_user_report() -> str:
|
||||
"""Generate user report (前回/進捗/今回/課題)"""
|
||||
|
||||
def on_session_end():
|
||||
"""Hook for session end (checkpoint save)"""
|
||||
# 1. write_memory("last_session", summary)
|
||||
# 2. write_memory("next_actions", todos)
|
||||
# 3. write_memory("pm_context", complete_state)
|
||||
```
|
||||
|
||||
### User Report Format
|
||||
```
|
||||
前回: [last session summary]
|
||||
進捗: [current progress status]
|
||||
今回: [planned next actions]
|
||||
課題: [blockers or issues]
|
||||
```
|
||||
|
||||
### Integration Points
|
||||
- Hook into Claude Code session start
|
||||
- Read memories using memory_ops
|
||||
- Generate human-readable report
|
||||
- Handle missing or corrupted memory
|
||||
|
||||
### Testing
|
||||
```bash
|
||||
pytest tests/test_session_lifecycle.py -v
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3️⃣ pdca_engine.py Implementation
|
||||
|
||||
### Purpose
|
||||
Automate PDCA cycle execution with documentation generation.
|
||||
|
||||
### Key Functions
|
||||
|
||||
```python
|
||||
# superclaude/Core/pdca_engine.py
|
||||
|
||||
class PDCAEngine:
|
||||
"""PDCA cycle automation"""
|
||||
|
||||
def plan_phase(goal: str):
|
||||
"""Generate hypothesis (仮説)"""
|
||||
# 1. write_memory("plan", goal)
|
||||
# 2. Create docs/temp/hypothesis-YYYY-MM-DD.md
|
||||
|
||||
def do_phase():
|
||||
"""Track experimentation (実験)"""
|
||||
# 1. TodoWrite tracking
|
||||
# 2. write_memory("checkpoint", progress) every 30min
|
||||
# 3. Update docs/temp/experiment-YYYY-MM-DD.md
|
||||
|
||||
def check_phase():
|
||||
"""Self-evaluation (評価)"""
|
||||
# 1. think_about_task_adherence()
|
||||
# 2. think_about_whether_you_are_done()
|
||||
# 3. Create docs/temp/lessons-YYYY-MM-DD.md
|
||||
|
||||
def act_phase():
|
||||
"""Knowledge extraction (改善)"""
|
||||
# 1. Success → docs/patterns/[pattern-name].md
|
||||
# 2. Failure → docs/mistakes/mistake-YYYY-MM-DD.md
|
||||
# 3. Update CLAUDE.md if global pattern
|
||||
```
|
||||
|
||||
### Documentation Templates
|
||||
|
||||
**hypothesis-template.md**:
|
||||
```markdown
|
||||
# Hypothesis: [Goal Description]
|
||||
|
||||
Date: YYYY-MM-DD
|
||||
Status: Planning
|
||||
|
||||
## Goal
|
||||
What are we trying to accomplish?
|
||||
|
||||
## Approach
|
||||
How will we implement this?
|
||||
|
||||
## Success Criteria
|
||||
How do we know when we're done?
|
||||
|
||||
## Potential Risks
|
||||
What could go wrong?
|
||||
```
|
||||
|
||||
**experiment-template.md**:
|
||||
```markdown
|
||||
# Experiment Log: [Implementation Name]
|
||||
|
||||
Date: YYYY-MM-DD
|
||||
Status: In Progress
|
||||
|
||||
## Implementation Steps
|
||||
- [ ] Step 1
|
||||
- [ ] Step 2
|
||||
|
||||
## Errors Encountered
|
||||
- Error 1: Description, solution
|
||||
|
||||
## Solutions Applied
|
||||
- Solution 1: Description, result
|
||||
|
||||
## Checkpoint Saves
|
||||
- 10:00: [progress snapshot]
|
||||
- 10:30: [progress snapshot]
|
||||
```
|
||||
|
||||
### Integration Points
|
||||
- Create docs/ directory templates
|
||||
- Integrate with TodoWrite
|
||||
- Call Serena MCP think operations
|
||||
- Generate documentation files
|
||||
|
||||
### Testing
|
||||
```bash
|
||||
pytest tests/test_pdca_engine.py -v
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔌 Phase 3: Serena MCP Integration
|
||||
|
||||
### Prerequisites
|
||||
```bash
|
||||
# Install Serena MCP server
|
||||
# See: docs/troubleshooting/serena-installation.md
|
||||
```
|
||||
|
||||
### Configuration
|
||||
```json
|
||||
// ~/.claude/.claude.json
|
||||
{
|
||||
"mcpServers": {
|
||||
"serena": {
|
||||
"command": "uv",
|
||||
"args": ["run", "serena-mcp"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Memory Structure
|
||||
```json
|
||||
{
|
||||
"pm_context": {
|
||||
"project": "SuperClaude_Framework",
|
||||
"current_phase": "Phase 2",
|
||||
"architecture": "Context-Oriented Configuration",
|
||||
"patterns": ["PDCA Cycle", "Session Lifecycle"]
|
||||
},
|
||||
"last_session": {
|
||||
"date": "2025-10-14",
|
||||
"accomplished": ["Phase 1 complete"],
|
||||
"issues": ["Serena MCP not configured"],
|
||||
"learned": ["Session Lifecycle pattern"]
|
||||
},
|
||||
"next_actions": [
|
||||
"Implement session_lifecycle.py",
|
||||
"Configure Serena MCP",
|
||||
"Test memory operations"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Testing Serena Connection
|
||||
```bash
|
||||
# Test memory operations
|
||||
python -m SuperClaude.Core.memory_ops --test
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Phase 4: Documentation Strategy
|
||||
|
||||
### Directory Structure
|
||||
```
|
||||
docs/
|
||||
├── temp/ # Temporary (7-day lifecycle)
|
||||
│ ├── hypothesis-YYYY-MM-DD.md
|
||||
│ ├── experiment-YYYY-MM-DD.md
|
||||
│ └── lessons-YYYY-MM-DD.md
|
||||
├── patterns/ # Formal patterns (永久保存)
|
||||
│ └── [pattern-name].md
|
||||
└── mistakes/ # Mistake records (永久保存)
|
||||
└── mistake-YYYY-MM-DD.md
|
||||
```
|
||||
|
||||
### Lifecycle Automation
|
||||
```bash
|
||||
# Create cleanup script
|
||||
scripts/cleanup_temp_docs.sh
|
||||
|
||||
# Run daily via cron
|
||||
0 0 * * * /path/to/scripts/cleanup_temp_docs.sh
|
||||
```
|
||||
|
||||
### Migration Scripts
|
||||
```bash
|
||||
# Migrate successful experiments to patterns
|
||||
python scripts/migrate_to_patterns.py
|
||||
|
||||
# Migrate failures to mistakes
|
||||
python scripts/migrate_to_mistakes.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Phase 5: Auto-Activation (Research Needed)
|
||||
|
||||
### Research Questions
|
||||
1. How does Claude Code handle initialization?
|
||||
2. Are there plugin hooks available?
|
||||
3. Can we intercept session start events?
|
||||
|
||||
### Implementation Plan (TBD)
|
||||
Once research complete, implement auto-activation hooks:
|
||||
|
||||
```python
|
||||
# superclaude/Core/auto_activation.py (future)
|
||||
|
||||
def on_claude_code_start():
|
||||
"""Auto-activate PM Agent at session start"""
|
||||
session_lifecycle.on_session_start()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Implementation Checklist
|
||||
|
||||
### Phase 2: Core Implementation
|
||||
- [ ] Implement `memory_ops.py`
|
||||
- [ ] Write unit tests for memory_ops
|
||||
- [ ] Implement `session_lifecycle.py`
|
||||
- [ ] Write unit tests for session_lifecycle
|
||||
- [ ] Implement `pdca_engine.py`
|
||||
- [ ] Write unit tests for pdca_engine
|
||||
- [ ] Integration testing
|
||||
|
||||
### Phase 3: Serena MCP
|
||||
- [ ] Install Serena MCP server
|
||||
- [ ] Configure `.claude.json`
|
||||
- [ ] Test memory operations
|
||||
- [ ] Test think operations
|
||||
- [ ] Test cross-session persistence
|
||||
|
||||
### Phase 4: Documentation Strategy
|
||||
- [ ] Create `docs/temp/` template
|
||||
- [ ] Create `docs/patterns/` template
|
||||
- [ ] Create `docs/mistakes/` template
|
||||
- [ ] Implement lifecycle automation
|
||||
- [ ] Create migration scripts
|
||||
|
||||
### Phase 5: Auto-Activation
|
||||
- [ ] Research Claude Code hooks
|
||||
- [ ] Design auto-activation system
|
||||
- [ ] Implement auto-activation
|
||||
- [ ] Test session start behavior
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Testing Strategy
|
||||
|
||||
### Unit Tests
|
||||
```bash
|
||||
tests/
|
||||
├── test_memory_ops.py # Memory operations
|
||||
├── test_session_lifecycle.py # Session management
|
||||
└── test_pdca_engine.py # PDCA automation
|
||||
```
|
||||
|
||||
### Integration Tests
|
||||
```bash
|
||||
tests/integration/
|
||||
├── test_pm_agent_flow.py # End-to-end PM Agent
|
||||
├── test_serena_integration.py # Serena MCP integration
|
||||
└── test_cross_session.py # Session persistence
|
||||
```
|
||||
|
||||
### Manual Testing
|
||||
1. Start new session → Verify context restoration
|
||||
2. Work on task → Verify checkpoint saves
|
||||
3. End session → Verify state preservation
|
||||
4. Restart → Verify seamless resumption
|
||||
|
||||
---
|
||||
|
||||
## 📊 Success Criteria
|
||||
|
||||
### Functional
|
||||
- [ ] PM Agent activates at session start
|
||||
- [ ] Context restores from memory
|
||||
- [ ] User report generates correctly
|
||||
- [ ] PDCA cycle executes automatically
|
||||
- [ ] Documentation strategy works
|
||||
|
||||
### Performance
|
||||
- [ ] Session start delay <500ms
|
||||
- [ ] Memory operations <100ms
|
||||
- [ ] Context restoration reliable (>99%)
|
||||
|
||||
### Quality
|
||||
- [ ] Test coverage >90%
|
||||
- [ ] No regression in existing features
|
||||
- [ ] Documentation complete
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**"Serena MCP not connecting"**
|
||||
- Check server installation
|
||||
- Verify `.claude.json` configuration
|
||||
- Test connection: `claude mcp list`
|
||||
|
||||
**"Memory operations failing"**
|
||||
- Check network connection
|
||||
- Verify Serena server running
|
||||
- Check error logs
|
||||
|
||||
**"Context not restoring"**
|
||||
- Verify memory structure
|
||||
- Check `pm_context` exists
|
||||
- Test with fresh memory
|
||||
|
||||
---
|
||||
|
||||
## 📚 References
|
||||
|
||||
- [ARCHITECTURE.md](./ARCHITECTURE.md) - System architecture
|
||||
- [ROADMAP.md](./ROADMAP.md) - Development roadmap
|
||||
- [pm-agent-implementation-status.md](../pm-agent-implementation-status.md) - Status tracking
|
||||
- [Commands/pm.md](../../superclaude/Commands/pm.md) - PM Agent command
|
||||
- [Agents/pm-agent.md](../../superclaude/Agents/pm-agent.md) - PM Agent persona
|
||||
|
||||
---
|
||||
|
||||
**Last Verified**: 2025-10-14
|
||||
**Next Review**: 2025-10-21 (1 week)
|
||||
**Version**: 4.1.5
|
||||
368
docs/Development/project-structure-understanding.md
Normal file
368
docs/Development/project-structure-understanding.md
Normal file
@ -0,0 +1,368 @@
|
||||
# SuperClaude Framework - Project Structure Understanding
|
||||
|
||||
> **Critical Understanding**: このプロジェクトとインストール後の環境の関係
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ 2つの世界の区別
|
||||
|
||||
### 1. このプロジェクト(Git管理・開発環境)
|
||||
|
||||
**Location**: `~/github/SuperClaude_Framework/`
|
||||
|
||||
**Role**: ソースコード・開発・テスト
|
||||
|
||||
```
|
||||
SuperClaude_Framework/
|
||||
├── setup/ # インストーラーロジック
|
||||
│ ├── components/ # コンポーネント定義(何をインストールするか)
|
||||
│ ├── data/ # 設定データ(JSON/YAML)
|
||||
│ ├── cli/ # CLIインターフェース
|
||||
│ ├── utils/ # ユーティリティ関数
|
||||
│ └── services/ # サービスロジック
|
||||
│
|
||||
├── superclaude/ # ランタイムロジック(実行時の動作)
|
||||
│ ├── core/ # コア機能
|
||||
│ ├── modes/ # 行動モード
|
||||
│ ├── agents/ # エージェント定義
|
||||
│ ├── mcp/ # MCPサーバー統合
|
||||
│ └── commands/ # コマンド実装
|
||||
│
|
||||
├── tests/ # テストコード
|
||||
├── docs/ # 開発者向けドキュメント
|
||||
├── pyproject.toml # Python設定
|
||||
└── package.json # npm設定
|
||||
```
|
||||
|
||||
**Operations**:
|
||||
- ✅ ソースコード変更
|
||||
- ✅ Git コミット・PR
|
||||
- ✅ テスト実行
|
||||
- ✅ ドキュメント作成
|
||||
- ✅ バージョン管理
|
||||
|
||||
---
|
||||
|
||||
### 2. インストール後(ユーザー環境・Git管理外)
|
||||
|
||||
**Location**: `~/.claude/`
|
||||
|
||||
**Role**: 実際に動作する設定・コマンド(ユーザー環境)
|
||||
|
||||
```
|
||||
~/.claude/
|
||||
├── commands/
|
||||
│ └── sc/ # スラッシュコマンド(インストール後)
|
||||
│ ├── pm.md
|
||||
│ ├── implement.md
|
||||
│ ├── test.md
|
||||
│ └── ... (26 commands)
|
||||
│
|
||||
├── CLAUDE.md # グローバル設定(インストール後)
|
||||
├── *.md # モード定義(インストール後)
|
||||
│ ├── MODE_Brainstorming.md
|
||||
│ ├── MODE_Orchestration.md
|
||||
│ └── ...
|
||||
│
|
||||
└── .claude.json # Claude Code設定
|
||||
```
|
||||
|
||||
**Operations**:
|
||||
- ✅ **読むだけ**(理解・確認用)
|
||||
- ✅ 動作確認
|
||||
- ⚠️ テスト時のみ一時変更(**必ず元に戻す!**)
|
||||
- ❌ 永続的な変更禁止(Git追跡不可)
|
||||
|
||||
---
|
||||
|
||||
## 🔄 インストールフロー
|
||||
|
||||
### ユーザー操作
|
||||
```bash
|
||||
# 1. インストール
|
||||
pipx install SuperClaude
|
||||
# または
|
||||
npm install -g @bifrost_inc/superclaude
|
||||
|
||||
# 2. セットアップ実行
|
||||
SuperClaude install
|
||||
```
|
||||
|
||||
### 内部処理(setup/が実行)
|
||||
```python
|
||||
# setup/components/*.py が実行される
|
||||
|
||||
1. ~/.claude/ ディレクトリ作成
|
||||
2. commands/sc/ にスラッシュコマンド配置
|
||||
3. CLAUDE.md と各種 *.md 配置
|
||||
4. .claude.json 更新
|
||||
5. MCPサーバー設定
|
||||
```
|
||||
|
||||
### 結果
|
||||
- **このプロジェクトのファイル** → **~/.claude/ にコピー**
|
||||
- ユーザーがClaude起動 → `~/.claude/` の設定が読み込まれる
|
||||
- `/sc:pm` 実行 → `~/.claude/commands/sc/pm.md` が展開される
|
||||
|
||||
---
|
||||
|
||||
## 📝 開発ワークフロー
|
||||
|
||||
### ❌ 間違った方法
|
||||
```bash
|
||||
# Git管理外を直接変更
|
||||
vim ~/.claude/commands/sc/pm.md # ← ダメ!履歴追えない
|
||||
|
||||
# 変更テスト
|
||||
claude # 動作確認
|
||||
|
||||
# 変更が ~/.claude/ に残る
|
||||
# → 元に戻すの忘れる
|
||||
# → 設定がぐちゃぐちゃになる
|
||||
# → Gitで追跡できない
|
||||
```
|
||||
|
||||
### ✅ 正しい方法
|
||||
|
||||
#### Step 1: 既存実装を理解
|
||||
```bash
|
||||
cd ~/github/SuperClaude_Framework
|
||||
|
||||
# インストールロジック確認
|
||||
Read setup/components/commands.py # コマンドのインストール方法
|
||||
Read setup/components/modes.py # モードのインストール方法
|
||||
Read setup/data/commands.json # コマンド定義データ
|
||||
|
||||
# インストール後の状態確認(理解のため)
|
||||
ls ~/.claude/commands/sc/
|
||||
cat ~/.claude/commands/sc/pm.md # 現在の仕様確認
|
||||
|
||||
# 「なるほど、setup/components/commands.py でこう処理されて、
|
||||
# ~/.claude/commands/sc/ に配置されるのね」
|
||||
```
|
||||
|
||||
#### Step 2: 改善案をドキュメント化
|
||||
```bash
|
||||
cd ~/github/SuperClaude_Framework
|
||||
|
||||
# Git管理されているこのプロジェクト内で
|
||||
Write docs/Development/hypothesis-pm-improvement-YYYY-MM-DD.md
|
||||
|
||||
# 内容例:
|
||||
# - 現状の問題
|
||||
# - 改善案
|
||||
# - 実装方針
|
||||
# - 期待される効果
|
||||
```
|
||||
|
||||
#### Step 3: テストが必要な場合
|
||||
```bash
|
||||
# バックアップ作成(必須!)
|
||||
cp ~/.claude/commands/sc/pm.md ~/.claude/commands/sc/pm.md.backup
|
||||
|
||||
# 実験的変更
|
||||
vim ~/.claude/commands/sc/pm.md
|
||||
|
||||
# Claude起動して検証
|
||||
claude
|
||||
# ... 動作確認 ...
|
||||
|
||||
# テスト完了後、必ず復元!!
|
||||
mv ~/.claude/commands/sc/pm.md.backup ~/.claude/commands/sc/pm.md
|
||||
```
|
||||
|
||||
#### Step 4: 本実装
|
||||
```bash
|
||||
cd ~/github/SuperClaude_Framework
|
||||
|
||||
# ソースコード側で変更
|
||||
Edit setup/components/commands.py # インストールロジック修正
|
||||
Edit setup/data/commands/pm.md # コマンド仕様修正
|
||||
|
||||
# テスト追加
|
||||
Write tests/test_pm_command.py
|
||||
|
||||
# テスト実行
|
||||
pytest tests/test_pm_command.py -v
|
||||
|
||||
# コミット(Git履歴に残る)
|
||||
git add setup/ tests/
|
||||
git commit -m "feat: enhance PM command with autonomous workflow"
|
||||
```
|
||||
|
||||
#### Step 5: 動作確認
|
||||
```bash
|
||||
# 開発版インストール
|
||||
cd ~/github/SuperClaude_Framework
|
||||
pip install -e .
|
||||
|
||||
# または
|
||||
SuperClaude install --dev
|
||||
|
||||
# 実際の環境でテスト
|
||||
claude
|
||||
/sc:pm "test request"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 重要なルール
|
||||
|
||||
### Rule 1: Git管理の境界を守る
|
||||
- **変更**: このプロジェクト内のみ
|
||||
- **確認**: `~/.claude/` は読むだけ
|
||||
- **テスト**: バックアップ → 変更 → 復元
|
||||
|
||||
### Rule 2: テスト時は必ず復元
|
||||
```bash
|
||||
# テスト前
|
||||
cp original backup
|
||||
|
||||
# テスト
|
||||
# ... 実験 ...
|
||||
|
||||
# テスト後(必須!)
|
||||
mv backup original
|
||||
```
|
||||
|
||||
### Rule 3: ドキュメント駆動開発
|
||||
1. 理解 → docs/Development/ に記録
|
||||
2. 仮説 → docs/Development/hypothesis-*.md
|
||||
3. 実験 → docs/Development/experiment-*.md
|
||||
4. 成功 → docs/patterns/
|
||||
5. 失敗 → docs/mistakes/
|
||||
|
||||
---
|
||||
|
||||
## 📚 理解すべきファイル
|
||||
|
||||
### インストーラー側(setup/)
|
||||
```python
|
||||
# 優先度: 高
|
||||
setup/components/commands.py # コマンドインストール
|
||||
setup/components/modes.py # モードインストール
|
||||
setup/components/agents.py # エージェント定義
|
||||
setup/data/commands/*.md # コマンド仕様(ソース)
|
||||
setup/data/modes/*.md # モード仕様(ソース)
|
||||
|
||||
# これらが ~/.claude/ に配置される
|
||||
```
|
||||
|
||||
### ランタイム側(superclaude/)
|
||||
```python
|
||||
# 優先度: 中
|
||||
superclaude/__main__.py # CLIエントリーポイント
|
||||
superclaude/core/ # コア機能実装
|
||||
superclaude/agents/ # エージェントロジック
|
||||
```
|
||||
|
||||
### インストール後(~/.claude/)
|
||||
```markdown
|
||||
# 優先度: 理解のため(変更不可)
|
||||
~/.claude/commands/sc/pm.md # 実際に動くPM仕様
|
||||
~/.claude/MODE_*.md # 実際に動くモード仕様
|
||||
~/.claude/CLAUDE.md # 実際に読み込まれるグローバル設定
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 デバッグ方法
|
||||
|
||||
### インストール確認
|
||||
```bash
|
||||
# インストール済みコンポーネント確認
|
||||
SuperClaude install --list-components
|
||||
|
||||
# インストール先確認
|
||||
ls -la ~/.claude/commands/sc/
|
||||
ls -la ~/.claude/*.md
|
||||
```
|
||||
|
||||
### 動作確認
|
||||
```bash
|
||||
# Claude起動
|
||||
claude
|
||||
|
||||
# コマンド実行
|
||||
/sc:pm "test"
|
||||
|
||||
# ログ確認(必要に応じて)
|
||||
tail -f ~/.claude/logs/*.log
|
||||
```
|
||||
|
||||
### トラブルシューティング
|
||||
```bash
|
||||
# 設定が壊れた場合
|
||||
SuperClaude install --force # 再インストール
|
||||
|
||||
# 開発版に切り替え
|
||||
cd ~/github/SuperClaude_Framework
|
||||
pip install -e .
|
||||
|
||||
# 本番版に戻す
|
||||
pip uninstall superclaude
|
||||
pipx install SuperClaude
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 よくある間違い
|
||||
|
||||
### 間違い1: Git管理外を変更
|
||||
```bash
|
||||
# ❌ WRONG
|
||||
vim ~/.claude/commands/sc/pm.md
|
||||
git add ~/.claude/ # ← できない!Git管理外
|
||||
```
|
||||
|
||||
### 間違い2: バックアップなしテスト
|
||||
```bash
|
||||
# ❌ WRONG
|
||||
vim ~/.claude/commands/sc/pm.md
|
||||
# テスト...
|
||||
# 元に戻すの忘れる → 設定ぐちゃぐちゃ
|
||||
```
|
||||
|
||||
### 間違い3: ソース確認せずに変更
|
||||
```bash
|
||||
# ❌ WRONG
|
||||
「PMモード直したい」
|
||||
→ いきなり ~/.claude/ 変更
|
||||
→ ソースコード理解してない
|
||||
→ 再インストールで上書きされる
|
||||
```
|
||||
|
||||
### 正解
|
||||
```bash
|
||||
# ✅ CORRECT
|
||||
1. setup/components/ でロジック理解
|
||||
2. docs/Development/ に改善案記録
|
||||
3. setup/ 側で変更・テスト
|
||||
4. Git コミット
|
||||
5. SuperClaude install --dev で動作確認
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 次のステップ
|
||||
|
||||
このドキュメント理解後:
|
||||
|
||||
1. **setup/components/ 読解**
|
||||
- インストールロジックの理解
|
||||
- どこに何が配置されるか
|
||||
|
||||
2. **既存仕様の把握**
|
||||
- `~/.claude/commands/sc/pm.md` 確認(読むだけ)
|
||||
- 現在の動作理解
|
||||
|
||||
3. **改善提案作成**
|
||||
- `docs/Development/hypothesis-*.md` 作成
|
||||
- ユーザーレビュー
|
||||
|
||||
4. **実装・テスト**
|
||||
- `setup/` 側で変更
|
||||
- `tests/` でテスト追加
|
||||
- Git管理下で開発
|
||||
|
||||
これで**何百回も同じ説明をしなくて済む**ようになる。
|
||||
163
docs/Development/tasks/current-tasks.md
Normal file
163
docs/Development/tasks/current-tasks.md
Normal file
@ -0,0 +1,163 @@
|
||||
# Current Tasks - SuperClaude Framework
|
||||
|
||||
> **Last Updated**: 2025-10-14
|
||||
> **Session**: PM Agent Enhancement & PDCA Integration
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Main Objective
|
||||
|
||||
**PM Agent を完璧な自律的オーケストレーターに進化させる**
|
||||
|
||||
- 繰り返し指示を不要にする
|
||||
- 同じミスを繰り返さない
|
||||
- セッション間で学習内容を保持
|
||||
- 自律的にPDCAサイクルを回す
|
||||
|
||||
---
|
||||
|
||||
## ✅ Completed Tasks
|
||||
|
||||
### Phase 1: ドキュメント基盤整備
|
||||
- [x] **PM Agent理想ワークフローをドキュメント化**
|
||||
- File: `docs/Development/pm-agent-ideal-workflow.md`
|
||||
- Content: 完璧なワークフロー(7フェーズ)
|
||||
- Purpose: 次回セッションで同じ説明を繰り返さない
|
||||
|
||||
- [x] **プロジェクト構造理解をドキュメント化**
|
||||
- File: `docs/Development/project-structure-understanding.md`
|
||||
- Content: Git管理とインストール後環境の区別
|
||||
- Purpose: 何百回も説明した内容を外部化
|
||||
|
||||
- [x] **インストールフロー理解をドキュメント化**
|
||||
- File: `docs/Development/installation-flow-understanding.md`
|
||||
- Content: CommandsComponent動作の完全理解
|
||||
- Source: `superclaude/commands/*.md` → `~/.claude/commands/sc/*.md`
|
||||
|
||||
- [x] **ディレクトリ構造作成**
|
||||
- `docs/Development/tasks/` - タスク管理
|
||||
- `docs/patterns/` - 成功パターン記録
|
||||
- `docs/mistakes/` - 失敗記録と防止策
|
||||
|
||||
---
|
||||
|
||||
## 🔄 In Progress
|
||||
|
||||
### Phase 2: 現状分析と改善提案
|
||||
|
||||
- [ ] **superclaude/commands/pm.md 現在の仕様確認**
|
||||
- Status: Pending
|
||||
- Action: ソースファイルを読んで現在の実装を理解
|
||||
- File: `superclaude/commands/pm.md`
|
||||
|
||||
- [ ] **~/.claude/commands/sc/pm.md 動作確認**
|
||||
- Status: Pending
|
||||
- Action: インストール後の実際の仕様確認(読むだけ)
|
||||
- File: `~/.claude/commands/sc/pm.md`
|
||||
|
||||
- [ ] **改善提案ドキュメント作成**
|
||||
- Status: Pending
|
||||
- Action: 仮説ドキュメント作成
|
||||
- File: `docs/Development/hypothesis-pm-enhancement-2025-10-14.md`
|
||||
- Content:
|
||||
- 現状の問題点(ドキュメント寄り、PMO機能不足)
|
||||
- 改善案(自律的PDCA、自己評価)
|
||||
- 実装方針
|
||||
- 期待される効果
|
||||
|
||||
---
|
||||
|
||||
## 📋 Pending Tasks
|
||||
|
||||
### Phase 3: 実装修正
|
||||
|
||||
- [ ] **superclaude/commands/pm.md 修正**
|
||||
- Content:
|
||||
- PDCA自動実行の強化
|
||||
- docs/ディレクトリ活用の明示
|
||||
- 自己評価ステップの追加
|
||||
- エラー時再学習フローの追加
|
||||
- PMO機能(重複検出、共通化提案)
|
||||
|
||||
- [ ] **MODE_Task_Management.md 修正**
|
||||
- Serenaメモリー → docs/統合
|
||||
- タスク管理ドキュメント連携
|
||||
|
||||
### Phase 4: テスト・検証
|
||||
|
||||
- [ ] **テスト追加**
|
||||
- File: `tests/test_pm_enhanced.py`
|
||||
- Coverage: PDCA実行、自己評価、学習記録
|
||||
|
||||
- [ ] **動作確認**
|
||||
- 開発版インストール: `SuperClaude install --dev`
|
||||
- 実際のワークフロー実行
|
||||
- Before/After比較
|
||||
|
||||
### Phase 5: 学習記録
|
||||
|
||||
- [ ] **成功パターン記録**
|
||||
- File: `docs/patterns/pm-autonomous-workflow.md`
|
||||
- Content: 自律的PDCAパターンの詳細
|
||||
|
||||
- [ ] **失敗記録(必要時)**
|
||||
- File: `docs/mistakes/mistake-2025-10-14.md`
|
||||
- Content: 遭遇したエラーと防止策
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Success Criteria
|
||||
|
||||
### 定量的指標
|
||||
- [ ] 繰り返し指示 50%削減
|
||||
- [ ] 同じミス再発率 80%削減
|
||||
- [ ] セッション復元時間 <30秒
|
||||
|
||||
### 定性的指標
|
||||
- [ ] 「前回の続きから」だけで再開可能
|
||||
- [ ] 過去のミスを自動的に回避
|
||||
- [ ] 公式ドキュメント参照が自動化
|
||||
- [ ] 実装→テスト→検証が自律的に回る
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notes
|
||||
|
||||
### 重要な学び
|
||||
- **Git管理の区別が最重要**
|
||||
- このプロジェクト(Git管理)で変更
|
||||
- `~/.claude/`(Git管理外)は読むだけ
|
||||
- テスト時のバックアップ・復元必須
|
||||
|
||||
- **ドキュメント駆動開発**
|
||||
- 理解 → docs/Development/ に記録
|
||||
- 仮説 → hypothesis-*.md
|
||||
- 実験 → experiment-*.md
|
||||
- 成功 → docs/patterns/
|
||||
- 失敗 → docs/mistakes/
|
||||
|
||||
- **インストールフロー**
|
||||
- Source: `superclaude/commands/*.md`
|
||||
- Installer: `setup/components/commands.py`
|
||||
- Target: `~/.claude/commands/sc/*.md`
|
||||
|
||||
### ブロッカー
|
||||
- なし(現時点)
|
||||
|
||||
### 次回セッション用のメモ
|
||||
1. このファイル(current-tasks.md)を最初に読む
|
||||
2. Completedセクションで進捗確認
|
||||
3. In Progressから再開
|
||||
4. 新しい学びを適切なドキュメントに記録
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Related Documentation
|
||||
|
||||
- [PM Agent理想ワークフロー](../pm-agent-ideal-workflow.md)
|
||||
- [プロジェクト構造理解](../project-structure-understanding.md)
|
||||
- [インストールフロー理解](../installation-flow-understanding.md)
|
||||
|
||||
---
|
||||
|
||||
**次のステップ**: `superclaude/commands/pm.md` を読んで現在の仕様を確認する
|
||||
556
docs/Reference/claude-code-history-management.md
Normal file
556
docs/Reference/claude-code-history-management.md
Normal file
@ -0,0 +1,556 @@
|
||||
# Claude Code Conversation History Management Research
|
||||
|
||||
**Research Date**: 2025-10-09
|
||||
**Purpose**: Understand .jsonl file structure, performance impact, and establish rotation policy
|
||||
|
||||
---
|
||||
|
||||
## 1. Official Documentation & Purpose
|
||||
|
||||
### .jsonl File Structure
|
||||
**Location**: `~/.claude/projects/{project-directory}/`
|
||||
|
||||
**Data Structure** (from analysis of actual files):
|
||||
```json
|
||||
{
|
||||
"type": "summary|file-history-snapshot|user|assistant|system|tool_use|tool_result|message",
|
||||
"timestamp": "ISO-8601 timestamp",
|
||||
"cwd": "/absolute/path/to/working/directory",
|
||||
"sessionId": "uuid",
|
||||
"gitBranch": "branch-name",
|
||||
"content": "message content or command",
|
||||
"messageId": "uuid for message tracking"
|
||||
}
|
||||
```
|
||||
|
||||
**Key Message Types** (from 2.6MB conversation analysis):
|
||||
- `message` (228): Container for conversation messages
|
||||
- `assistant` (228): Claude's responses
|
||||
- `user` (182): User inputs
|
||||
- `tool_use` (137): Tool invocations
|
||||
- `tool_result` (137): Tool execution results
|
||||
- `text` (74): Text content blocks
|
||||
- `file-history-snapshot` (39): File state tracking
|
||||
- `thinking` (31): Claude's reasoning process
|
||||
- `system` (12): System-level messages
|
||||
|
||||
### File History Snapshot Purpose
|
||||
```json
|
||||
{
|
||||
"type": "file-history-snapshot",
|
||||
"messageId": "uuid",
|
||||
"snapshot": {
|
||||
"messageId": "uuid",
|
||||
"trackedFileBackups": {},
|
||||
"timestamp": "ISO-8601"
|
||||
},
|
||||
"isSnapshotUpdate": false
|
||||
}
|
||||
```
|
||||
|
||||
**Purpose** (inferred from structure):
|
||||
- Tracks file states at specific conversation points
|
||||
- Enables undo/redo functionality for file changes
|
||||
- Provides rollback capability for edits
|
||||
- **Note**: No official documentation found on this feature
|
||||
|
||||
### Conversation Loading Behavior
|
||||
**Official Best Practices** ([source](https://www.anthropic.com/engineering/claude-code-best-practices)):
|
||||
- "All conversations are automatically saved locally with their full message history"
|
||||
- "When resuming, the entire message history is restored to maintain context"
|
||||
- "Tool usage and results from previous conversations preserved"
|
||||
|
||||
**Resume Commands**:
|
||||
- `--continue`: Automatically continue most recent conversation
|
||||
- `/resume`: Show list of recent sessions and choose one
|
||||
- Session ID specification: Resume specific conversation
|
||||
|
||||
---
|
||||
|
||||
## 2. Performance Impact
|
||||
|
||||
### Known Issues from GitHub
|
||||
|
||||
#### Issue #5024: History Accumulation Causing Performance Issues
|
||||
**Status**: Open (Major Issue)
|
||||
**URL**: https://github.com/anthropics/claude-code/issues/5024
|
||||
|
||||
**Reported Problems**:
|
||||
- File sizes growing to "hundreds of MB or more"
|
||||
- Slower application startup times
|
||||
- System performance degradation
|
||||
- No automatic cleanup mechanism
|
||||
- One user reported file size of 968KB+ continuously growing
|
||||
|
||||
**Current Workaround**:
|
||||
- Manual editing of `.claude.json` (risky - can break configurations)
|
||||
- `claude history clear` (removes ALL history across ALL projects)
|
||||
|
||||
#### Issue #7985: Severe Memory Leak
|
||||
**Status**: Critical
|
||||
**URL**: https://github.com/anthropics/claude-code/issues/7985
|
||||
|
||||
**Reported Problems**:
|
||||
- Context accumulation causing massive memory usage
|
||||
- Memory leaks with objects not garbage collected
|
||||
- One user reported ~570GB of virtual memory usage
|
||||
- Long-running sessions become unusable
|
||||
|
||||
#### Issue #8839: Conversation Compaction Failure
|
||||
**Status**: Regression (after undo/redo feature)
|
||||
**URL**: https://github.com/anthropics/claude-code/issues/8839
|
||||
|
||||
**Impact**:
|
||||
- Claude Code can no longer automatically compact long conversations
|
||||
- "Too long" errors after conversation history navigation feature added
|
||||
- Conversations become unmanageable without manual intervention
|
||||
|
||||
#### Issue #8755: /clear Command Not Working
|
||||
**Status**: Bug
|
||||
**URL**: https://github.com/anthropics/claude-code/issues/8755
|
||||
|
||||
**Impact**:
|
||||
- `/clear` command stopped functioning for some users
|
||||
- "Clear Conversations" menu option non-functional
|
||||
- Users cannot reset context window as recommended
|
||||
|
||||
### Actual Performance Data (Your Environment)
|
||||
|
||||
**Current State** (as of 2025-10-09):
|
||||
- **Total agiletec project**: 33MB (57 conversation files)
|
||||
- **Largest file**: 2.6MB (462 lines)
|
||||
- **Average file**: ~580KB
|
||||
- **Files >1MB**: 3 files
|
||||
- **Total across all projects**: ~62MB
|
||||
|
||||
**Age Distribution**:
|
||||
- Files older than 30 days: 0
|
||||
- Files older than 7 days: 4
|
||||
- Most files: <7 days old
|
||||
|
||||
**Comparison to Other Projects**:
|
||||
```
|
||||
33M agiletec (57 files) - Most active
|
||||
14M SSD-2TB project
|
||||
6.3M tokium
|
||||
2.6M bunseki
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Official Retention Policies
|
||||
|
||||
### Standard Retention (Consumer)
|
||||
**Source**: [Anthropic Privacy Center](https://privacy.claude.com/en/articles/10023548-how-long-do-you-store-my-data)
|
||||
|
||||
- **Prompts/Responses**: Up to 30 days in back-end logs
|
||||
- **Deleted chats**: Immediately removed from UI, purged within 30 days
|
||||
- **API logs**: Reducing to 7 days starting September 15, 2025 (from 30 days)
|
||||
|
||||
### Enterprise Controls
|
||||
**Source**: [Custom Data Retention Controls](https://privacy.anthropic.com/en/articles/10440198-custom-data-retention-controls-for-claude-enterprise)
|
||||
|
||||
- **Minimum retention**: 30 days
|
||||
- **Retention start**: Last observed activity (last message or project update)
|
||||
- **Custom periods**: Available for organizations
|
||||
|
||||
### Local Storage (No Official Policy)
|
||||
**Finding**: No official documentation found regarding:
|
||||
- Recommended local .jsonl file retention periods
|
||||
- Automatic cleanup of old conversations
|
||||
- Performance thresholds for file sizes
|
||||
- Safe deletion procedures
|
||||
|
||||
**Current Tools**:
|
||||
- `claude history clear`: Removes ALL history (all projects, destructive)
|
||||
- No selective cleanup tools available
|
||||
- No archive functionality
|
||||
|
||||
---
|
||||
|
||||
## 4. Best Practices (Official & Community)
|
||||
|
||||
### Official Recommendations
|
||||
|
||||
#### Context Management
|
||||
**Source**: [Claude Code Best Practices](https://www.anthropic.com/engineering/claude-code-best-practices)
|
||||
|
||||
**Key Guidelines**:
|
||||
1. **Use `/clear` frequently**: "Reset context window between tasks"
|
||||
2. **Scope conversations**: "One project or feature per conversation"
|
||||
3. **Clear before switching**: "/clear before fixing bugs to prevent context pollution"
|
||||
4. **Don't rely on long context**: "Claude's context window can fill with irrelevant conversation"
|
||||
|
||||
**Quote**: "During long sessions, Claude's context window can fill with irrelevant conversation, file contents, and commands which can reduce performance, so use the /clear command frequently between tasks to reset the context window."
|
||||
|
||||
#### CLAUDE.md Strategy
|
||||
- **Persistent context**: Use CLAUDE.md files for stable instructions
|
||||
- **Auto-loaded**: "Claude automatically pulls into context when starting"
|
||||
- **Hierarchy**: Global (`~/.claude/CLAUDE.md`) → Workspace → Project
|
||||
- **Refinement**: "Take time to experiment and determine what produces best results"
|
||||
|
||||
#### When to Restart vs /clear
|
||||
**Source**: [Community Best Practices](https://claudelog.com/faqs/does-claude-code-store-my-data/)
|
||||
|
||||
**Use `/clear` when**:
|
||||
- Starting new task/feature
|
||||
- Switching between features
|
||||
- Context becomes polluted
|
||||
- Before bug fixing
|
||||
|
||||
**Restart session when**:
|
||||
- Switching projects
|
||||
- Updating CLAUDE.md files
|
||||
- Experiencing session issues
|
||||
- Memory usage high
|
||||
|
||||
### Community Strategies
|
||||
|
||||
#### Conversation Organization
|
||||
**Pattern**: "Scope a chat to one project or feature"
|
||||
- Start conversation for specific goal
|
||||
- Use `/clear` when goal complete
|
||||
- Don't mix unrelated tasks in same conversation
|
||||
|
||||
#### Context Optimization
|
||||
**Pattern**: "Avoid extensive, unrefined context"
|
||||
- Iterate on CLAUDE.md effectiveness
|
||||
- Remove ineffective instructions
|
||||
- Test and refine periodically
|
||||
|
||||
#### Incognito Mode for Sensitive Work
|
||||
**Pattern**: "Ghost icon for temporary conversations"
|
||||
- Not saved to chat history
|
||||
- No contribution to context memory
|
||||
- Useful for experimental or sensitive work
|
||||
|
||||
---
|
||||
|
||||
## 5. Recommended Rotation Policy
|
||||
|
||||
### Immediate Actions (No Risk)
|
||||
|
||||
#### 1. Delete Very Old Conversations (>30 days)
|
||||
```bash
|
||||
# Backup first
|
||||
mkdir -p ~/.claude/projects-archive/$(date +%Y-%m)
|
||||
|
||||
# Find and archive
|
||||
find ~/.claude/projects/ -name "*.jsonl" -mtime +30 -type f \
|
||||
-exec mv {} ~/.claude/projects-archive/$(date +%Y-%m)/ \;
|
||||
```
|
||||
|
||||
**Rationale**:
|
||||
- Aligns with Anthropic's 30-day back-end retention
|
||||
- Minimal functionality loss (context rarely useful after 30 days)
|
||||
- Significant space savings
|
||||
|
||||
#### 2. Archive Project-Specific Old Conversations (>14 days)
|
||||
```bash
|
||||
# Per-project archive
|
||||
mkdir -p ~/.claude/projects-archive/agiletec/$(date +%Y-%m)
|
||||
|
||||
find ~/.claude/projects/-Users-kazuki-github-agiletec -name "*.jsonl" -mtime +14 -type f \
|
||||
-exec mv {} ~/.claude/projects-archive/agiletec/$(date +%Y-%m)/ \;
|
||||
```
|
||||
|
||||
**Rationale**:
|
||||
- 14 days provides buffer for resumed work
|
||||
- Most development tasks complete within 2 weeks
|
||||
- Easy to restore if needed
|
||||
|
||||
### Periodic Maintenance (Weekly)
|
||||
|
||||
#### 3. Identify Large Files for Manual Review
|
||||
```bash
|
||||
# Find files >1MB
|
||||
find ~/.claude/projects/ -name "*.jsonl" -type f -size +1M -exec ls -lh {} \;
|
||||
|
||||
# Review and archive if not actively used
|
||||
```
|
||||
|
||||
**Criteria for Archival**:
|
||||
- File >1MB and not modified in 7 days
|
||||
- Completed feature/project conversations
|
||||
- Debugging sessions that are resolved
|
||||
|
||||
### Aggressive Cleanup (Monthly)
|
||||
|
||||
#### 4. Archive All Inactive Conversations (>7 days)
|
||||
```bash
|
||||
# Monthly archive
|
||||
mkdir -p ~/.claude/projects-archive/$(date +%Y-%m)
|
||||
|
||||
find ~/.claude/projects/ -name "*.jsonl" -mtime +7 -type f \
|
||||
-exec mv {} ~/.claude/projects-archive/$(date +%Y-%m)/ \;
|
||||
```
|
||||
|
||||
**When to Use**:
|
||||
- Project directory >50MB
|
||||
- Startup performance degraded
|
||||
- Running low on disk space
|
||||
|
||||
### Emergency Cleanup (Performance Issues)
|
||||
|
||||
#### 5. Nuclear Option - Keep Only Recent Week
|
||||
```bash
|
||||
# BACKUP EVERYTHING FIRST
|
||||
tar -czf ~/claude-history-backup-$(date +%Y%m%d).tar.gz ~/.claude/projects/
|
||||
|
||||
# Keep only last 7 days
|
||||
find ~/.claude/projects/ -name "*.jsonl" -mtime +7 -type f -delete
|
||||
```
|
||||
|
||||
**When to Use**:
|
||||
- Claude Code startup >10 seconds
|
||||
- Memory usage abnormally high
|
||||
- Experiencing Issue #7985 symptoms
|
||||
|
||||
---
|
||||
|
||||
## 6. Proposed Automated Solution
|
||||
|
||||
### Shell Script: `claude-history-rotate.sh`
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Claude Code Conversation History Rotation
|
||||
# Usage: ./claude-history-rotate.sh [--dry-run] [--days N]
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
DAYS=${DAYS:-30}
|
||||
DRY_RUN=false
|
||||
ARCHIVE_BASE=~/.claude/projects-archive
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--dry-run) DRY_RUN=true; shift ;;
|
||||
--days) DAYS="$2"; shift 2 ;;
|
||||
*) echo "Unknown option: $1"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Create archive directory
|
||||
ARCHIVE_DIR="$ARCHIVE_BASE/$(date +%Y-%m)"
|
||||
mkdir -p "$ARCHIVE_DIR"
|
||||
|
||||
# Find old conversations
|
||||
OLD_FILES=$(find ~/.claude/projects/ -name "*.jsonl" -mtime "+$DAYS" -type f)
|
||||
|
||||
if [[ -z "$OLD_FILES" ]]; then
|
||||
echo "No files older than $DAYS days found."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Count and size
|
||||
FILE_COUNT=$(echo "$OLD_FILES" | wc -l | tr -d ' ')
|
||||
TOTAL_SIZE=$(echo "$OLD_FILES" | xargs du -ch | tail -1 | awk '{print $1}')
|
||||
|
||||
echo "Found $FILE_COUNT files older than $DAYS days ($TOTAL_SIZE total)"
|
||||
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
echo "DRY RUN - Would archive:"
|
||||
echo "$OLD_FILES"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Archive files
|
||||
echo "$OLD_FILES" | while read -r file; do
|
||||
mv "$file" "$ARCHIVE_DIR/"
|
||||
echo "Archived: $(basename "$file")"
|
||||
done
|
||||
|
||||
echo "✓ Archived $FILE_COUNT files to $ARCHIVE_DIR"
|
||||
```
|
||||
|
||||
### Cron Job Setup (Optional)
|
||||
```bash
|
||||
# Add to crontab (monthly cleanup)
|
||||
# 0 3 1 * * /Users/kazuki/.local/bin/claude-history-rotate.sh --days 30
|
||||
|
||||
# Or use launchd on macOS
|
||||
cat > ~/Library/LaunchAgents/com.user.claude-history-rotate.plist <<'EOF'
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.user.claude-history-rotate</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Users/kazuki/.local/bin/claude-history-rotate.sh</string>
|
||||
<string>--days</string>
|
||||
<string>30</string>
|
||||
</array>
|
||||
<key>StartCalendarInterval</key>
|
||||
<dict>
|
||||
<key>Day</key>
|
||||
<integer>1</integer>
|
||||
<key>Hour</key>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
|
||||
launchctl load ~/Library/LaunchAgents/com.user.claude-history-rotate.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Monitoring & Alerts
|
||||
|
||||
### Disk Usage Check Script
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# claude-history-check.sh
|
||||
|
||||
THRESHOLD_MB=100
|
||||
PROJECTS_DIR=~/.claude/projects
|
||||
|
||||
TOTAL_SIZE_MB=$(du -sm "$PROJECTS_DIR" | awk '{print $1}')
|
||||
|
||||
echo "Claude Code conversation history: ${TOTAL_SIZE_MB}MB"
|
||||
|
||||
if [[ $TOTAL_SIZE_MB -gt $THRESHOLD_MB ]]; then
|
||||
echo "⚠️ WARNING: History size exceeds ${THRESHOLD_MB}MB threshold"
|
||||
echo "Consider running: claude-history-rotate.sh --days 30"
|
||||
|
||||
# Find largest projects
|
||||
echo ""
|
||||
echo "Largest projects:"
|
||||
du -sm "$PROJECTS_DIR"/*/ | sort -rn | head -5
|
||||
fi
|
||||
```
|
||||
|
||||
### Performance Indicators to Watch
|
||||
1. **Startup time**: >5 seconds = investigate
|
||||
2. **File sizes**: >2MB per conversation = review
|
||||
3. **Total size**: >100MB across all projects = cleanup
|
||||
4. **Memory usage**: >2GB during session = Issue #7985
|
||||
5. **Conversation length**: >500 message pairs = use `/clear`
|
||||
|
||||
---
|
||||
|
||||
## 8. Key Takeaways & Recommendations
|
||||
|
||||
### Critical Findings
|
||||
|
||||
✅ **Safe to Delete**:
|
||||
- Conversations >30 days old (aligns with Anthropic retention)
|
||||
- Completed feature/project conversations
|
||||
- Large files (>1MB) not accessed in 14+ days
|
||||
|
||||
⚠️ **Caution Required**:
|
||||
- Active project conversations (<7 days)
|
||||
- Files referenced in recent work
|
||||
- Conversations with unfinished tasks
|
||||
|
||||
❌ **Known Issues**:
|
||||
- No official cleanup tools (Issue #5024)
|
||||
- Memory leaks in long sessions (Issue #7985)
|
||||
- `/clear` command bugs (Issue #8755)
|
||||
- Conversation compaction broken (Issue #8839)
|
||||
|
||||
### Recommended Policy for Your Environment
|
||||
|
||||
**Daily Practice**:
|
||||
- Use `/clear` between major tasks
|
||||
- Scope conversations to single features
|
||||
- Restart session if >2 hours continuous work
|
||||
|
||||
**Weekly Review** (Sunday):
|
||||
```bash
|
||||
# Check current state
|
||||
du -sh ~/.claude/projects/*/
|
||||
|
||||
# Archive old conversations (>14 days)
|
||||
claude-history-rotate.sh --days 14 --dry-run # Preview
|
||||
claude-history-rotate.sh --days 14 # Execute
|
||||
```
|
||||
|
||||
**Monthly Cleanup** (1st of month):
|
||||
```bash
|
||||
# Aggressive cleanup (>30 days)
|
||||
claude-history-rotate.sh --days 30
|
||||
|
||||
# Review large files
|
||||
find ~/.claude/projects/ -name "*.jsonl" -size +1M -mtime +7
|
||||
```
|
||||
|
||||
**Performance Threshold Actions**:
|
||||
- Total size >50MB: Archive 30-day-old conversations
|
||||
- Total size >100MB: Archive 14-day-old conversations
|
||||
- Total size >200MB: Emergency cleanup (7-day retention)
|
||||
- Startup >10s: Investigate memory leaks, consider Issue #7985
|
||||
|
||||
### Future-Proofing
|
||||
|
||||
**Watch for Official Solutions**:
|
||||
- `claude history prune` command (requested in #5024)
|
||||
- Automatic history rotation feature
|
||||
- Configurable retention settings
|
||||
- Separate configuration from history storage
|
||||
|
||||
**Community Tools**:
|
||||
- [cclogviewer](https://github.com/hesreallyhim/awesome-claude-code): View .jsonl files
|
||||
- Consider contributing to #5024 discussion
|
||||
- Monitor anthropics/claude-code releases
|
||||
|
||||
---
|
||||
|
||||
## 9. References
|
||||
|
||||
### Official Documentation
|
||||
- [Claude Code Best Practices](https://www.anthropic.com/engineering/claude-code-best-practices)
|
||||
- [How Long Do You Store My Data?](https://privacy.claude.com/en/articles/10023548-how-long-do-you-store-my-data)
|
||||
- [Custom Data Retention Controls](https://privacy.anthropic.com/en/articles/10440198-custom-data-retention-controls-for-claude-enterprise)
|
||||
|
||||
### GitHub Issues
|
||||
- [#5024: History accumulation causes performance issues](https://github.com/anthropics/claude-code/issues/5024)
|
||||
- [#7985: Severe memory leak](https://github.com/anthropics/claude-code/issues/7985)
|
||||
- [#8839: Conversation compaction failure](https://github.com/anthropics/claude-code/issues/8839)
|
||||
- [#8755: /clear command not working](https://github.com/anthropics/claude-code/issues/8755)
|
||||
|
||||
### Community Resources
|
||||
- [Awesome Claude Code](https://github.com/hesreallyhim/awesome-claude-code)
|
||||
- [Claude Code Context Guide](https://www.arsturn.com/blog/beyond-prompting-a-guide-to-managing-context-in-claude-code)
|
||||
- [ClaudeLog Documentation](https://claudelog.com/)
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Current Environment Statistics
|
||||
|
||||
**Generated**: 2025-10-09 04:24 JST
|
||||
|
||||
### Project Size Breakdown
|
||||
```
|
||||
33M -Users-kazuki-github-agiletec (57 files)
|
||||
14M -Volumes-SSD-2TB (project count: N/A)
|
||||
6.3M -Users-kazuki-github-tokium
|
||||
2.6M -Users-kazuki-github-bunseki
|
||||
1.9M -Users-kazuki
|
||||
1.9M -Users-kazuki-github-superclaude
|
||||
---
|
||||
Total: ~62MB across all projects
|
||||
```
|
||||
|
||||
### agiletec Project Details
|
||||
- **Total conversations**: 57
|
||||
- **Largest file**: 2.6MB (d4852655-b760-4311-8f67-26f593f2403f.jsonl)
|
||||
- **Files >1MB**: 3 files
|
||||
- **Avg file size**: ~580KB
|
||||
- **Files >7 days**: 4 files
|
||||
- **Files >30 days**: 0 files
|
||||
|
||||
### Immediate Recommendation
|
||||
**Status**: ✅ Healthy (no immediate action required)
|
||||
|
||||
**Reasoning**:
|
||||
- Total size (33MB) well below concern threshold (100MB)
|
||||
- No files >30 days old
|
||||
- Only 4 files >7 days old
|
||||
- Largest file (2.6MB) within acceptable range
|
||||
|
||||
**Next Review**: 2025-10-16 (weekly check)
|
||||
@ -1,12 +1,12 @@
|
||||
# SuperClaude エージェントガイド 🤖
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#superclaude-agents-guide-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#superclaude-agents-guide-)
|
||||
|
||||
SuperClaude は、Claude Code が専門知識を得るために呼び出すことができる 14 のドメイン スペシャリスト エージェントを提供します。
|
||||
|
||||
## 🧪 エージェントのアクティベーションのテスト
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#-testing-agent-activation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#-testing-agent-activation)
|
||||
|
||||
このガイドを使用する前に、エージェントの選択が機能することを確認してください。
|
||||
|
||||
@ -37,23 +37,23 @@ SuperClaude は、Claude Code が専門知識を得るために呼び出すこ
|
||||
|
||||
## コアコンセプト
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#core-concepts)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#core-concepts)
|
||||
|
||||
### SuperClaude エージェントとは何ですか?
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#what-are-superclaude-agents)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#what-are-superclaude-agents)
|
||||
|
||||
**エージェントは**、Claude Codeの行動を変更するコンテキスト指示として実装された、専門分野のAIドメインエキスパートです。各エージェントは、ドメイン固有の専門知識、行動パターン、問題解決アプローチを含む、ディレクトリ`.md`内に綿密に作成されたファイルです`SuperClaude/Agents/`。
|
||||
**エージェントは**、Claude Codeの行動を変更するコンテキスト指示として実装された、専門分野のAIドメインエキスパートです。各エージェントは、ドメイン固有の専門知識、行動パターン、問題解決アプローチを含む、ディレクトリ`.md`内に綿密に作成されたファイルです`superclaude/Agents/`。
|
||||
|
||||
**重要**: エージェントは別個の AI モデルやソフトウェアではなく、Claude Code が読み取って特殊な動作を採用するコンテキスト構成です。
|
||||
|
||||
### エージェントの2つの使用方法
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#two-ways-to-use-agents)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#two-ways-to-use-agents)
|
||||
|
||||
#### 1. @agent- プレフィックスを使用した手動呼び出し
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#1-manual-invocation-with-agent--prefix)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#1-manual-invocation-with-agent--prefix)
|
||||
|
||||
```shell
|
||||
# Directly invoke a specific agent
|
||||
@ -64,7 +64,7 @@ SuperClaude は、Claude Code が専門知識を得るために呼び出すこ
|
||||
|
||||
#### 2. 自動アクティベーション(行動ルーティング)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#2-auto-activation-behavioral-routing)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#2-auto-activation-behavioral-routing)
|
||||
|
||||
「自動アクティベーション」とは、Claude Codeがリクエスト内のキーワードとパターンに基づいて適切なコンテキストで動作指示を読み取り、エンゲージすることを意味します。SuperClaudeは、Claudeが最適なスペシャリストにルーティングするための動作ガイドラインを提供します。
|
||||
|
||||
@ -83,7 +83,7 @@ SuperClaude は、Claude Code が専門知識を得るために呼び出すこ
|
||||
|
||||
### エージェント選択ルール
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#agent-selection-rules)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#agent-selection-rules)
|
||||
|
||||
**優先順位の階層:**
|
||||
|
||||
@ -115,11 +115,11 @@ Task Analysis →
|
||||
|
||||
## クイックスタートの例
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#quick-start-examples)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#quick-start-examples)
|
||||
|
||||
### 手動エージェント呼び出し
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#manual-agent-invocation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#manual-agent-invocation)
|
||||
|
||||
```shell
|
||||
# Explicitly call specific agents with @agent- prefix
|
||||
@ -131,7 +131,7 @@ Task Analysis →
|
||||
|
||||
### 自動エージェント調整
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#automatic-agent-coordination)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#automatic-agent-coordination)
|
||||
|
||||
```shell
|
||||
# Commands that trigger auto-activation
|
||||
@ -150,7 +150,7 @@ Task Analysis →
|
||||
|
||||
### 手動と自動のアプローチを組み合わせる
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#combining-manual-and-auto-approaches)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#combining-manual-and-auto-approaches)
|
||||
|
||||
```shell
|
||||
# Start with command (auto-activation)
|
||||
@ -165,15 +165,15 @@ Task Analysis →
|
||||
|
||||
## SuperClaude エージェントチーム 👥
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#the-superclaude-agent-team-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#the-superclaude-agent-team-)
|
||||
|
||||
### アーキテクチャとシステム設計エージェント 🏗️
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#architecture--system-design-agents-%EF%B8%8F)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#architecture--system-design-agents-%EF%B8%8F)
|
||||
|
||||
### システムアーキテクト 🏢
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#system-architect-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#system-architect-)
|
||||
|
||||
**専門分野**:スケーラビリティとサービスアーキテクチャに重点を置いた大規模分散システム設計
|
||||
|
||||
@ -199,7 +199,7 @@ Task Analysis →
|
||||
|
||||
### 成功基準
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#success-criteria)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#success-criteria)
|
||||
|
||||
- [ ] 応答に表れたシステムレベルの思考
|
||||
- [ ] サービスの境界と統合パターンについて言及する
|
||||
@ -216,7 +216,7 @@ Task Analysis →
|
||||
|
||||
### バックエンドアーキテクト ⚙️
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#backend-architect-%EF%B8%8F)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#backend-architect-%EF%B8%8F)
|
||||
|
||||
**専門分野**: APIの信頼性とデータの整合性を重視した堅牢なサーバーサイドシステム設計
|
||||
|
||||
@ -246,7 +246,7 @@ Task Analysis →
|
||||
|
||||
### フロントエンドアーキテクト 🎨
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#frontend-architect-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#frontend-architect-)
|
||||
|
||||
**専門分野**: アクセシビリティとユーザーエクスペリエンスを重視した最新の Web アプリケーション アーキテクチャ
|
||||
|
||||
@ -276,7 +276,7 @@ Task Analysis →
|
||||
|
||||
### DevOps アーキテクト 🚀
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#devops-architect-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#devops-architect-)
|
||||
|
||||
**専門分野**: 信頼性の高いソフトウェア配信のためのインフラストラクチャ自動化と展開パイプライン設計
|
||||
|
||||
@ -304,11 +304,11 @@ Task Analysis →
|
||||
|
||||
### 品質・分析エージェント 🔍
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#quality--analysis-agents-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#quality--analysis-agents-)
|
||||
|
||||
### セキュリティエンジニア 🔒
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#security-engineer-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#security-engineer-)
|
||||
|
||||
**専門分野**: 脅威モデリングと脆弱性防止に重点を置いたアプリケーション セキュリティ アーキテクチャ
|
||||
|
||||
@ -338,7 +338,7 @@ Task Analysis →
|
||||
|
||||
### パフォーマンスエンジニア ⚡
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#performance-engineer-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#performance-engineer-)
|
||||
|
||||
**専門分野**:スケーラビリティとリソース効率を重視したシステムパフォーマンスの最適化
|
||||
|
||||
@ -368,7 +368,7 @@ Task Analysis →
|
||||
|
||||
### 根本原因分析者 🔍
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#root-cause-analyst-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#root-cause-analyst-)
|
||||
|
||||
**専門分野**:証拠に基づく分析と仮説検定を用いた体系的な問題調査
|
||||
|
||||
@ -398,7 +398,7 @@ Task Analysis →
|
||||
|
||||
### 品質エンジニア ✅
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#quality-engineer-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#quality-engineer-)
|
||||
|
||||
**専門分野**:自動化とカバレッジに重点を置いた包括的なテスト戦略と品質保証
|
||||
|
||||
@ -428,7 +428,7 @@ Task Analysis →
|
||||
|
||||
### リファクタリングの専門家 🔧
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#refactoring-expert-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#refactoring-expert-)
|
||||
|
||||
**専門分野**:体系的なリファクタリングと技術的負債管理によるコード品質の改善
|
||||
|
||||
@ -456,11 +456,11 @@ Task Analysis →
|
||||
|
||||
### 専門開発エージェント 🎯
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#specialized-development-agents-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#specialized-development-agents-)
|
||||
|
||||
### Python エキスパート 🐍
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#python-expert-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#python-expert-)
|
||||
|
||||
**専門分野**: 最新のフレームワークとパフォーマンスを重視した、本番環境対応の Python 開発
|
||||
|
||||
@ -490,7 +490,7 @@ Task Analysis →
|
||||
|
||||
### 要件アナリスト 📝
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#requirements-analyst-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#requirements-analyst-)
|
||||
|
||||
**専門分野**:体系的なステークホルダー分析による要件発見と仕様策定
|
||||
|
||||
@ -518,11 +518,11 @@ Task Analysis →
|
||||
|
||||
### コミュニケーションと学習エージェント 📚
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#communication--learning-agents-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#communication--learning-agents-)
|
||||
|
||||
### テクニカルライター 📚
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#technical-writer-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#technical-writer-)
|
||||
|
||||
**専門分野**: 視聴者分析と明確さを重視した技術文書作成とコミュニケーション
|
||||
|
||||
@ -552,7 +552,7 @@ Task Analysis →
|
||||
|
||||
### 学習ガイド 🎓
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#learning-guide-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#learning-guide-)
|
||||
|
||||
**専門分野**:スキル開発とメンターシップに重点を置いた教育コンテンツの設計と漸進的学習
|
||||
|
||||
@ -582,11 +582,11 @@ Task Analysis →
|
||||
|
||||
## エージェントの調整と統合 🤝
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#agent-coordination--integration-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#agent-coordination--integration-)
|
||||
|
||||
### 調整パターン
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#coordination-patterns)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#coordination-patterns)
|
||||
|
||||
**アーキテクチャチーム**:
|
||||
|
||||
@ -608,7 +608,7 @@ Task Analysis →
|
||||
|
||||
### MCP サーバー統合
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#mcp-server-integration)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#mcp-server-integration)
|
||||
|
||||
**MCP サーバーによる拡張機能**:
|
||||
|
||||
@ -621,20 +621,20 @@ Task Analysis →
|
||||
|
||||
### エージェントのアクティベーションのトラブルシューティング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#troubleshooting-agent-activation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#troubleshooting-agent-activation)
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#troubleshooting)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#troubleshooting)
|
||||
|
||||
トラブルシューティングのヘルプについては、以下を参照してください。
|
||||
|
||||
- [よくある問題](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/common-issues.md)- よくある問題に対するクイック修正
|
||||
- [トラブルシューティングガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/troubleshooting.md)- 包括的な問題解決
|
||||
- [よくある問題](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/common-issues.md)- よくある問題に対するクイック修正
|
||||
- [トラブルシューティングガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/troubleshooting.md)- 包括的な問題解決
|
||||
|
||||
### よくある問題
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#common-issues)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#common-issues)
|
||||
|
||||
- **エージェントのアクティベーションなし**: ドメインキーワード「セキュリティ」、「パフォーマンス」、「フロントエンド」を使用します
|
||||
- **間違ったエージェントが選択されました**: エージェントのドキュメントでトリガーキーワードを確認してください
|
||||
@ -644,7 +644,7 @@ Task Analysis →
|
||||
|
||||
### 即時修正
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#immediate-fixes)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#immediate-fixes)
|
||||
|
||||
- **エージェントの強制アクティベーション**: リクエストで明示的なドメインキーワードを使用する
|
||||
- **エージェントの選択をリセット**: エージェントの状態をリセットするには、Claude Code セッションを再起動します。
|
||||
@ -653,7 +653,7 @@ Task Analysis →
|
||||
|
||||
### エージェント固有のトラブルシューティング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#agent-specific-troubleshooting)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#agent-specific-troubleshooting)
|
||||
|
||||
**セキュリティエージェントなし:**
|
||||
|
||||
@ -697,7 +697,7 @@ Task Analysis →
|
||||
|
||||
### サポートレベル
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#support-levels)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#support-levels)
|
||||
|
||||
**クイックフィックス:**
|
||||
|
||||
@ -707,13 +707,13 @@ Task Analysis →
|
||||
|
||||
**詳細なヘルプ:**
|
||||
|
||||
- エージェントのインストールに関する問題については、[一般的な問題ガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/common-issues.md)を参照してください。
|
||||
- エージェントのインストールに関する問題については、[一般的な問題ガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/common-issues.md)を参照してください。
|
||||
- 対象エージェントのトリガーキーワードを確認する
|
||||
|
||||
**専門家によるサポート:**
|
||||
|
||||
- 使用`SuperClaude install --diagnose`
|
||||
- 協調分析については[診断リファレンスガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/diagnostic-reference.md)を参照してください
|
||||
- 協調分析については[診断リファレンスガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/diagnostic-reference.md)を参照してください
|
||||
|
||||
**コミュニティサポート:**
|
||||
|
||||
@ -722,7 +722,7 @@ Task Analysis →
|
||||
|
||||
### 成功の検証
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#success-validation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#success-validation)
|
||||
|
||||
エージェントの修正を適用した後、次のようにテストします。
|
||||
|
||||
@ -734,7 +734,7 @@ Task Analysis →
|
||||
|
||||
## クイックトラブルシューティング(レガシー)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#quick-troubleshooting-legacy)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#quick-troubleshooting-legacy)
|
||||
|
||||
- **エージェントが有効化されていない場合**→ ドメインキーワード「セキュリティ」、「パフォーマンス」、「フロントエンド」を使用します
|
||||
- **エージェントが間違っている**→ エージェントのドキュメントでトリガーキーワードを確認してください
|
||||
@ -762,11 +762,11 @@ Task Analysis →
|
||||
|
||||
## クイックリファレンス 📋
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#quick-reference-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#quick-reference-)
|
||||
|
||||
### エージェントトリガー検索
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#agent-trigger-lookup)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#agent-trigger-lookup)
|
||||
|
||||
|トリガータイプ|キーワード/パターン|活性化エージェント|
|
||||
|---|---|---|
|
||||
@ -786,7 +786,7 @@ Task Analysis →
|
||||
|
||||
### コマンドエージェントマッピング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#command-agent-mapping)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#command-agent-mapping)
|
||||
|
||||
|指示|主な薬剤|サポートエージェント|
|
||||
|---|---|---|
|
||||
@ -801,7 +801,7 @@ Task Analysis →
|
||||
|
||||
### 効果的な薬剤の組み合わせ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#effective-agent-combinations)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#effective-agent-combinations)
|
||||
|
||||
**開発ワークフロー**:
|
||||
|
||||
@ -822,11 +822,11 @@ Task Analysis →
|
||||
|
||||
## ベストプラクティス💡
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#best-practices-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#best-practices-)
|
||||
|
||||
### はじめに(シンプルなアプローチ)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#getting-started-simple-approach)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#getting-started-simple-approach)
|
||||
|
||||
**自然言語ファースト:**
|
||||
|
||||
@ -837,7 +837,7 @@ Task Analysis →
|
||||
|
||||
### エージェントの選択の最適化
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#optimizing-agent-selection)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#optimizing-agent-selection)
|
||||
|
||||
**効果的なキーワードの使用法:**
|
||||
|
||||
@ -859,7 +859,7 @@ Task Analysis →
|
||||
|
||||
### 一般的な使用パターン
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#common-usage-patterns)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#common-usage-patterns)
|
||||
|
||||
**開発ワークフロー:**
|
||||
|
||||
@ -895,7 +895,7 @@ Task Analysis →
|
||||
|
||||
### 高度なエージェント調整
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#advanced-agent-coordination)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#advanced-agent-coordination)
|
||||
|
||||
**マルチドメインプロジェクト:**
|
||||
|
||||
@ -923,7 +923,7 @@ Task Analysis →
|
||||
|
||||
### 品質重視の開発
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#quality-driven-development)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#quality-driven-development)
|
||||
|
||||
**セキュリティ第一のアプローチ:** 開発リクエストには常にセキュリティに関する考慮事項を含め、ドメインスペシャリストとともにセキュリティエンジニアを自動的に関与させます。
|
||||
|
||||
@ -937,11 +937,11 @@ Task Analysis →
|
||||
|
||||
## エージェントインテリジェンスを理解する🧠
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#understanding-agent-intelligence-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#understanding-agent-intelligence-)
|
||||
|
||||
### エージェントを効果的にする要素
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#what-makes-agents-effective)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#what-makes-agents-effective)
|
||||
|
||||
**ドメイン専門知識**: 各エージェントは、それぞれのドメインに特有の専門的な知識パターン、行動アプローチ、問題解決方法論を備えています。
|
||||
|
||||
@ -953,7 +953,7 @@ Task Analysis →
|
||||
|
||||
### エージェント vs. 従来のAI
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#agent-vs-traditional-ai)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#agent-vs-traditional-ai)
|
||||
|
||||
**従来のアプローチ**: 単一のAIが、さまざまなレベルの専門知識を持つすべてのドメインを処理します。 **エージェントアプローチ**: 専門のエキスパートが、深いドメイン知識と集中的な問題解決で協力します。
|
||||
|
||||
@ -966,7 +966,7 @@ Task Analysis →
|
||||
|
||||
### システムを信頼し、パターンを理解する
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#trust-the-system-understand-the-patterns)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#trust-the-system-understand-the-patterns)
|
||||
|
||||
**期待すること**:
|
||||
|
||||
@ -986,36 +986,36 @@ Task Analysis →
|
||||
|
||||
## 関連リソース 📚
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#related-resources-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#related-resources-)
|
||||
|
||||
### 必須ドキュメント
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#essential-documentation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#essential-documentation)
|
||||
|
||||
- **[コマンドガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md)**- 最適なエージェント調整をトリガーするSuperClaudeコマンドをマスターする
|
||||
- **[MCP サーバー](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md)**- 専用ツールの統合によるエージェント機能の強化
|
||||
- **[セッション管理](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md)**- 永続的なエージェントコンテキストによる長期ワークフロー
|
||||
- **[コマンドガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md)**- 最適なエージェント調整をトリガーするSuperClaudeコマンドをマスターする
|
||||
- **[MCP サーバー](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md)**- 専用ツールの統合によるエージェント機能の強化
|
||||
- **[セッション管理](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md)**- 永続的なエージェントコンテキストによる長期ワークフロー
|
||||
|
||||
### 高度な使用法
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#advanced-usage)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#advanced-usage)
|
||||
|
||||
- **[行動モード](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md)**- エージェントの調整を強化するためのコンテキスト最適化
|
||||
- **[はじめに](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Getting-Started/quick-start.md)**- エージェントの最適化のための専門家のテクニック
|
||||
- **[例のクックブック](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/examples-cookbook.md)**- 現実世界のエージェントの調整パターン
|
||||
- **[行動モード](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md)**- エージェントの調整を強化するためのコンテキスト最適化
|
||||
- **[はじめに](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Getting-Started/quick-start.md)**- エージェントの最適化のための専門家のテクニック
|
||||
- **[例のクックブック](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/examples-cookbook.md)**- 現実世界のエージェントの調整パターン
|
||||
|
||||
### 開発リソース
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#development-resources)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#development-resources)
|
||||
|
||||
- **[技術アーキテクチャ](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Developer-Guide/technical-architecture.md)**- SuperClaude のエージェント システム設計を理解する
|
||||
- **[貢献](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Developer-Guide/contributing-code.md)**- エージェントの機能と調整パターンの拡張
|
||||
- **[技術アーキテクチャ](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Developer-Guide/technical-architecture.md)**- SuperClaude のエージェント システム設計を理解する
|
||||
- **[貢献](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Developer-Guide/contributing-code.md)**- エージェントの機能と調整パターンの拡張
|
||||
|
||||
---
|
||||
|
||||
## エージェントとしての道のり 🚀
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md#your-agent-journey-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md#your-agent-journey-)
|
||||
|
||||
**第1週:自然な使用法** 自然な言語による説明から始めましょう。どのエージェントが、そしてなぜアクティブになるのかに注目しましょう。プロセスを考えすぎずに、キーワードのパターンに対する直感を養います。
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
# SuperClaude コマンドガイド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#superclaude-commands-guide)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#superclaude-commands-guide)
|
||||
|
||||
`/sc:*`SuperClaude は、ワークフロー用コマンドと`@agent-*`スペシャリスト用コマンドの 21 個の Claude Code コマンドを提供します。
|
||||
|
||||
## コマンドの種類
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#command-types)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#command-types)
|
||||
|
||||
|タイプ|使用場所|形式|例|
|
||||
|---|---|---|---|
|
||||
@ -16,7 +16,7 @@
|
||||
|
||||
## クイックテスト
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#quick-test)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#quick-test)
|
||||
|
||||
```shell
|
||||
# Terminal: Verify installation
|
||||
@ -32,11 +32,11 @@ python3 -m SuperClaude --version
|
||||
|
||||
## 🎯 SuperClaude コマンドの理解
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#-understanding-superclaude-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#-understanding-superclaude-commands)
|
||||
|
||||
## SuperClaudeの仕組み
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#how-superclaude-works)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#how-superclaude-works)
|
||||
|
||||
SuperClaude は、Claude Code が特殊な動作を実行するために読み込む動作コンテキストファイルを提供します。 と入力すると`/sc:implement`、Claude Code は`implement.md`コンテキストファイルを読み込み、その動作指示に従います。
|
||||
|
||||
@ -44,7 +44,7 @@ SuperClaude は、Claude Code が特殊な動作を実行するために読み
|
||||
|
||||
### コマンドの種類:
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#command-types-1)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#command-types-1)
|
||||
|
||||
- **スラッシュコマンド**(`/sc:*`):ワークフローパターンと動作モードをトリガーする
|
||||
- **エージェントの呼び出し**(`@agent-*`):特定のドメインスペシャリストを手動で起動する
|
||||
@ -52,10 +52,10 @@ SuperClaude は、Claude Code が特殊な動作を実行するために読み
|
||||
|
||||
### コンテキストメカニズム:
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#the-context-mechanism)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#the-context-mechanism)
|
||||
|
||||
1. **ユーザー入力**: 入力する`/sc:implement "auth system"`
|
||||
2. **コンテキスト読み込み**: クロードコード読み取り`~/.claude/SuperClaude/Commands/implement.md`
|
||||
2. **コンテキスト読み込み**: クロードコード読み取り`~/.claude/superclaude/Commands/implement.md`
|
||||
3. **行動の採用**:クロードはドメインの専門知識、ツールの選択、検証パターンを適用します
|
||||
4. **強化された出力**: セキュリティ上の考慮事項とベストプラクティスを備えた構造化された実装
|
||||
|
||||
@ -63,7 +63,7 @@ SuperClaude は、Claude Code が特殊な動作を実行するために読み
|
||||
|
||||
### インストールコマンドと使用コマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#installation-vs-usage-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#installation-vs-usage-commands)
|
||||
|
||||
**🖥️ ターミナルコマンド**(実際の CLI ソフトウェア):
|
||||
|
||||
@ -83,11 +83,11 @@ SuperClaude は、Claude Code が特殊な動作を実行するために読み
|
||||
|
||||
## 🧪 セットアップのテスト
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#-testing-your-setup)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#-testing-your-setup)
|
||||
|
||||
### 🖥️ ターミナル検証(ターミナル/CMDで実行)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#%EF%B8%8F-terminal-verification-run-in-terminalcmd)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#%EF%B8%8F-terminal-verification-run-in-terminalcmd)
|
||||
|
||||
```shell
|
||||
# Verify SuperClaude is working (primary method)
|
||||
@ -104,7 +104,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### 💬 クロードコードテスト(クロードコードチャットに入力)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#-claude-code-testing-type-in-claude-code-chat)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#-claude-code-testing-type-in-claude-code-chat)
|
||||
|
||||
```
|
||||
# Test basic /sc: command
|
||||
@ -116,11 +116,11 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
# Example behavior: List of available commands
|
||||
```
|
||||
|
||||
**テストが失敗した場合**:[インストールガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Getting-Started/installation.md)または[トラブルシューティングを確認してください](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#troubleshooting)
|
||||
**テストが失敗した場合**:[インストールガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Getting-Started/installation.md)または[トラブルシューティングを確認してください](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#troubleshooting)
|
||||
|
||||
### 📝 コマンドクイックリファレンス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#-command-quick-reference)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#-command-quick-reference)
|
||||
|
||||
|コマンドタイプ|走る場所|形式|目的|例|
|
||||
|---|---|---|---|---|
|
||||
@ -134,25 +134,25 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
## 目次
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#table-of-contents)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#table-of-contents)
|
||||
|
||||
- [必須コマンド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#essential-commands)- ここから始めましょう(8つのコアコマンド)
|
||||
- [一般的なワークフロー](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#common-workflows)- 機能するコマンドの組み合わせ
|
||||
- [完全なコマンドリファレンス](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#full-command-reference)- カテゴリ別に整理された全21個のコマンド
|
||||
- [トラブルシューティング](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#troubleshooting)- よくある問題と解決策
|
||||
- [コマンドインデックス](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#command-index)- カテゴリ別にコマンドを検索
|
||||
- [必須コマンド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#essential-commands)- ここから始めましょう(8つのコアコマンド)
|
||||
- [一般的なワークフロー](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#common-workflows)- 機能するコマンドの組み合わせ
|
||||
- [完全なコマンドリファレンス](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#full-command-reference)- カテゴリ別に整理された全21個のコマンド
|
||||
- [トラブルシューティング](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#troubleshooting)- よくある問題と解決策
|
||||
- [コマンドインデックス](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#command-index)- カテゴリ別にコマンドを検索
|
||||
|
||||
---
|
||||
|
||||
## 必須コマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#essential-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#essential-commands)
|
||||
|
||||
**即時の生産性向上のためのコアワークフロー コマンド:**
|
||||
|
||||
### `/sc:brainstorm`- プロジェクト発見
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#scbrainstorm---project-discovery)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#scbrainstorm---project-discovery)
|
||||
|
||||
**目的**: 対話型の要件検出とプロジェクト計画
|
||||
**構文**:`/sc:brainstorm "your idea"` `[--strategy systematic|creative]`
|
||||
@ -165,7 +165,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### `/sc:implement`- 機能開発
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#scimplement---feature-development)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#scimplement---feature-development)
|
||||
|
||||
**目的**: インテリジェントなスペシャリストルーティングによるフルスタック機能の実装
|
||||
**構文**:`/sc:implement "feature description"` `[--type frontend|backend|fullstack] [--focus security|performance]`
|
||||
@ -179,7 +179,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### `/sc:analyze`- コード評価
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#scanalyze---code-assessment)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#scanalyze---code-assessment)
|
||||
|
||||
**目的**: 品質、セキュリティ、パフォーマンスにわたる包括的なコード分析
|
||||
**構文**:`/sc:analyze [path]` `[--focus quality|security|performance|architecture]`
|
||||
@ -192,7 +192,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### `/sc:troubleshoot`- 問題診断
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#sctroubleshoot---problem-diagnosis)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#sctroubleshoot---problem-diagnosis)
|
||||
|
||||
**目的**: 根本原因分析による体系的な問題診断
|
||||
**構文**:`/sc:troubleshoot "issue description"` `[--type build|runtime|performance]`
|
||||
@ -205,7 +205,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### `/sc:test`- 品質保証
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#sctest---quality-assurance)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#sctest---quality-assurance)
|
||||
|
||||
**目的**: カバレッジ分析による包括的なテスト
|
||||
**構文**:`/sc:test` `[--type unit|integration|e2e] [--coverage] [--fix]`
|
||||
@ -218,7 +218,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### `/sc:improve`- コード強化
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#scimprove---code-enhancement)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#scimprove---code-enhancement)
|
||||
|
||||
**目的**: 体系的なコードの改善と最適化を適用する
|
||||
**構文**:`/sc:improve [path]` `[--type performance|quality|security] [--preview]`
|
||||
@ -231,7 +231,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### `/sc:document`- ドキュメント生成
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#scdocument---documentation-generation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#scdocument---documentation-generation)
|
||||
|
||||
**目的**: コードとAPIの包括的なドキュメントを生成する
|
||||
**構文**:`/sc:document [path]` `[--type api|user-guide|technical] [--format markdown|html]`
|
||||
@ -244,7 +244,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### `/sc:workflow`- 実装計画
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#scworkflow---implementation-planning)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#scworkflow---implementation-planning)
|
||||
|
||||
**目的**: 要件から構造化された実装計画を生成する
|
||||
**構文**:`/sc:workflow "feature description"` `[--strategy agile|waterfall] [--format markdown]`
|
||||
@ -259,13 +259,13 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
## 一般的なワークフロー
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#common-workflows)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#common-workflows)
|
||||
|
||||
**実証済みのコマンドの組み合わせ:**
|
||||
|
||||
### 新しいプロジェクトのセットアップ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#new-project-setup)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#new-project-setup)
|
||||
|
||||
```shell
|
||||
/sc:brainstorm "project concept" # Define requirements
|
||||
@ -275,7 +275,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### 機能開発
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#feature-development)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#feature-development)
|
||||
|
||||
```shell
|
||||
/sc:implement "feature name" # Build the feature
|
||||
@ -285,7 +285,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### コード品質の改善
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#code-quality-improvement)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#code-quality-improvement)
|
||||
|
||||
```shell
|
||||
/sc:analyze --focus quality # Assess current state
|
||||
@ -295,7 +295,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### バグ調査
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#bug-investigation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#bug-investigation)
|
||||
|
||||
```shell
|
||||
/sc:troubleshoot "issue description" # Diagnose the problem
|
||||
@ -305,11 +305,11 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
## 完全なコマンドリファレンス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#full-command-reference)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#full-command-reference)
|
||||
|
||||
### 開発コマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#development-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#development-commands)
|
||||
|
||||
|指示|目的|最適な用途|
|
||||
|---|---|---|
|
||||
@ -320,7 +320,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### 分析コマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#analysis-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#analysis-commands)
|
||||
|
||||
|指示|目的|最適な用途|
|
||||
|---|---|---|
|
||||
@ -330,7 +330,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### 品質コマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#quality-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#quality-commands)
|
||||
|
||||
|指示|目的|最適な用途|
|
||||
|---|---|---|
|
||||
@ -341,7 +341,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### プロジェクト管理
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#project-management)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#project-management)
|
||||
|
||||
|指示|目的|最適な用途|
|
||||
|---|---|---|
|
||||
@ -351,7 +351,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### ユーティリティコマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#utility-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#utility-commands)
|
||||
|
||||
|指示|目的|最適な用途|
|
||||
|---|---|---|
|
||||
@ -360,7 +360,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
### セッションコマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#session-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#session-commands)
|
||||
|
||||
|指示|目的|最適な用途|
|
||||
|---|---|---|
|
||||
@ -373,7 +373,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
## コマンドインデックス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#command-index)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#command-index)
|
||||
|
||||
**機能別:**
|
||||
|
||||
@ -392,7 +392,7 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#troubleshooting)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#troubleshooting)
|
||||
|
||||
**コマンドの問題:**
|
||||
|
||||
@ -404,12 +404,12 @@ python3 -m SuperClaude install --list-components | grep mcp
|
||||
|
||||
- セッションをリセット:`/sc:load`再初期化する
|
||||
- ステータスを確認:`SuperClaude install --list-components`
|
||||
- ヘルプ:[トラブルシューティングガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/troubleshooting.md)
|
||||
- ヘルプ:[トラブルシューティングガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/troubleshooting.md)
|
||||
|
||||
## 次のステップ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#next-steps)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#next-steps)
|
||||
|
||||
- [フラグガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md)- コマンドの動作を制御する
|
||||
- [エージェントガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md)- スペシャリストのアクティベーション
|
||||
- [例のクックブック](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/examples-cookbook.md)- 実際の使用パターン
|
||||
- [フラグガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md)- コマンドの動作を制御する
|
||||
- [エージェントガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md)- スペシャリストのアクティベーション
|
||||
- [例のクックブック](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/examples-cookbook.md)- 実際の使用パターン
|
||||
@ -1,16 +1,16 @@
|
||||
# SuperClaude フラグガイド 🏁
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#superclaude-flags-guide-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#superclaude-flags-guide-)
|
||||
|
||||
**ほとんどのフラグは自動的にアクティブになります**。Claude Code は、リクエスト内のキーワードとパターンに基づいて適切なコンテキストを実行するための動作指示を読み取ります。
|
||||
|
||||
## 必須の自動アクティベーションフラグ(ユースケースの90%)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#essential-auto-activation-flags-90-of-use-cases)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#essential-auto-activation-flags-90-of-use-cases)
|
||||
|
||||
### コア分析フラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#core-analysis-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#core-analysis-flags)
|
||||
|
||||
|フラグ|起動時|何をするのか|
|
||||
|---|---|---|
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
### MCP サーバーフラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#mcp-server-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#mcp-server-flags)
|
||||
|
||||
|フラグ|サーバ|目的|自動トリガー|
|
||||
|---|---|---|---|
|
||||
@ -33,7 +33,7 @@
|
||||
|
||||
### 動作モードフラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#behavioral-mode-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#behavioral-mode-flags)
|
||||
|
||||
|フラグ|起動時|何をするのか|
|
||||
|---|---|---|
|
||||
@ -45,7 +45,7 @@
|
||||
|
||||
### 実行制御フラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#execution-control-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#execution-control-flags)
|
||||
|
||||
|フラグ|起動時|何をするのか|
|
||||
|---|---|---|
|
||||
@ -56,11 +56,11 @@
|
||||
|
||||
## コマンド固有のフラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#command-specific-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#command-specific-flags)
|
||||
|
||||
### 分析コマンドフラグ(`/sc:analyze`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#analysis-command-flags-scanalyze)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#analysis-command-flags-scanalyze)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -70,7 +70,7 @@
|
||||
|
||||
### ビルドコマンドフラグ(`/sc:build`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#build-command-flags-scbuild)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#build-command-flags-scbuild)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -81,7 +81,7 @@
|
||||
|
||||
### 設計コマンドフラグ(`/sc:design`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#design-command-flags-scdesign)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#design-command-flags-scdesign)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -90,7 +90,7 @@
|
||||
|
||||
### コマンドフラグの説明(`/sc:explain`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#explain-command-flags-scexplain)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#explain-command-flags-scexplain)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -100,7 +100,7 @@
|
||||
|
||||
### コマンドフラグの改善(`/sc:improve`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#improve-command-flags-scimprove)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#improve-command-flags-scimprove)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -111,7 +111,7 @@
|
||||
|
||||
### タスクコマンドフラグ(`/sc:task`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#task-command-flags-sctask)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#task-command-flags-sctask)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -121,7 +121,7 @@
|
||||
|
||||
### ワークフローコマンドフラグ(`/sc:workflow`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#workflow-command-flags-scworkflow)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#workflow-command-flags-scworkflow)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -131,7 +131,7 @@
|
||||
|
||||
### コマンドフラグのトラブルシューティング ( `/sc:troubleshoot`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#troubleshoot-command-flags-sctroubleshoot)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#troubleshoot-command-flags-sctroubleshoot)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -141,7 +141,7 @@
|
||||
|
||||
### クリーンアップコマンドフラグ(`/sc:cleanup`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#cleanup-command-flags-sccleanup)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#cleanup-command-flags-sccleanup)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -152,7 +152,7 @@
|
||||
|
||||
### コマンドフラグの推定(`/sc:estimate`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#estimate-command-flags-scestimate)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#estimate-command-flags-scestimate)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -162,7 +162,7 @@
|
||||
|
||||
### インデックスコマンドフラグ(`/sc:index`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#index-command-flags-scindex)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#index-command-flags-scindex)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -171,7 +171,7 @@
|
||||
|
||||
### コマンドフラグを反映する ( `/sc:reflect`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#reflect-command-flags-screflect)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#reflect-command-flags-screflect)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -181,7 +181,7 @@
|
||||
|
||||
### スポーンコマンドフラグ(`/sc:spawn`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#spawn-command-flags-scspawn)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#spawn-command-flags-scspawn)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -190,7 +190,7 @@
|
||||
|
||||
### Gitコマンドフラグ(`/sc:git`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#git-command-flags-scgit)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#git-command-flags-scgit)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -199,7 +199,7 @@
|
||||
|
||||
### 選択ツールコマンドフラグ ( `/sc:select-tool`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#select-tool-command-flags-scselect-tool)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#select-tool-command-flags-scselect-tool)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -208,7 +208,7 @@
|
||||
|
||||
### テストコマンドフラグ(`/sc:test`)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#test-command-flags-sctest)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#test-command-flags-sctest)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -218,11 +218,11 @@
|
||||
|
||||
## 高度な制御フラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#advanced-control-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#advanced-control-flags)
|
||||
|
||||
### 範囲と焦点
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#scope-and-focus)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#scope-and-focus)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -231,7 +231,7 @@
|
||||
|
||||
### 実行制御
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#execution-control)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#execution-control)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -242,7 +242,7 @@
|
||||
|
||||
### システムフラグ(SuperClaude インストール)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#system-flags-superclaude-installation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#system-flags-superclaude-installation)
|
||||
|
||||
|フラグ|目的|価値観|
|
||||
|---|---|---|
|
||||
@ -258,11 +258,11 @@
|
||||
|
||||
## 一般的な使用パターン
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#common-usage-patterns)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#common-usage-patterns)
|
||||
|
||||
### フロントエンド開発
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#frontend-development)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#frontend-development)
|
||||
|
||||
```shell
|
||||
/sc:implement "responsive dashboard" --magic --c7
|
||||
@ -273,7 +273,7 @@
|
||||
|
||||
### バックエンド開発
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#backend-development)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#backend-development)
|
||||
|
||||
```shell
|
||||
/sc:analyze api/ --focus performance --seq --think
|
||||
@ -284,7 +284,7 @@
|
||||
|
||||
### 大規模プロジェクト
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#large-projects)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#large-projects)
|
||||
|
||||
```shell
|
||||
/sc:analyze . --ultrathink --all-mcp --safe-mode
|
||||
@ -295,7 +295,7 @@
|
||||
|
||||
### 品質とメンテナンス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#quality--maintenance)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#quality--maintenance)
|
||||
|
||||
```shell
|
||||
/sc:improve src/ --type quality --safe --interactive
|
||||
@ -306,11 +306,11 @@
|
||||
|
||||
## フラグインタラクション
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#flag-interactions)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#flag-interactions)
|
||||
|
||||
### 互換性のある組み合わせ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#compatible-combinations)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#compatible-combinations)
|
||||
|
||||
- `--think`+ `--c7`: ドキュメント付き分析
|
||||
- `--magic`+ `--play`: テスト付きのUI生成
|
||||
@ -320,7 +320,7 @@
|
||||
|
||||
### 競合するフラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#conflicting-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#conflicting-flags)
|
||||
|
||||
- `--all-mcp`個別のMCPフラグと比較(どちらか一方を使用)
|
||||
- `--no-mcp`任意のMCPフラグと比較(--no-mcpが優先)
|
||||
@ -329,7 +329,7 @@
|
||||
|
||||
### 関係の自動有効化
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#auto-enabling-relationships)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#auto-enabling-relationships)
|
||||
|
||||
- `--safe-mode`自動的`--uc`に有効になり、`--validate`
|
||||
- `--ultrathink`すべてのMCPサーバーを自動的に有効にする
|
||||
@ -338,11 +338,11 @@
|
||||
|
||||
## トラブルシューティングフラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#troubleshooting-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#troubleshooting-flags)
|
||||
|
||||
### よくある問題
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#common-issues)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#common-issues)
|
||||
|
||||
- **ツールが多すぎる**:`--no-mcp`ネイティブツールのみでテストする
|
||||
- **操作が遅すぎます**:`--uc`出力を圧縮するために追加します
|
||||
@ -351,7 +351,7 @@
|
||||
|
||||
### デバッグフラグ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#debug-flags)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#debug-flags)
|
||||
|
||||
```shell
|
||||
/sc:analyze . --verbose # Shows decision logic and flag activation
|
||||
@ -361,7 +361,7 @@
|
||||
|
||||
### クイックフィックス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#quick-fixes)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#quick-fixes)
|
||||
|
||||
```shell
|
||||
/sc:analyze . --help # Shows available flags for command
|
||||
@ -371,7 +371,7 @@
|
||||
|
||||
## フラグの優先ルール
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#flag-priority-rules)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#flag-priority-rules)
|
||||
|
||||
1. **安全第一**: `--safe-mode`> `--validate`> 最適化フラグ
|
||||
2. **明示的なオーバーライド**: ユーザーフラグ > 自動検出
|
||||
@ -381,8 +381,8 @@
|
||||
|
||||
## 関連リソース
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md#related-resources)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md#related-resources)
|
||||
|
||||
- [コマンドガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md)- これらのフラグを使用するコマンド
|
||||
- [MCP サーバーガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md)- MCP フラグのアクティブ化について
|
||||
- [セッション管理](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md)- 永続セッションでのフラグの使用
|
||||
- [コマンドガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md)- これらのフラグを使用するコマンド
|
||||
- [MCP サーバーガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md)- MCP フラグのアクティブ化について
|
||||
- [セッション管理](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md)- 永続セッションでのフラグの使用
|
||||
@ -1,16 +1,16 @@
|
||||
# SuperClaude MCP サーバーガイド 🔌
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#superclaude-mcp-servers-guide-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#superclaude-mcp-servers-guide-)
|
||||
|
||||
## 概要
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#overview)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#overview)
|
||||
|
||||
MCP(モデルコンテキストプロトコル)サーバーは、専用ツールを通じてClaude Codeの機能を拡張します。SuperClaudeは6つのMCPサーバーを統合し、タスクに応じてサーバーをいつ起動するかをClaudeに指示します。
|
||||
|
||||
### 🔍 現実チェック
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#-reality-check)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#-reality-check)
|
||||
|
||||
- **MCPサーバーとは**: 追加ツールを提供する外部Node.jsプロセス
|
||||
- **含まれていないもの**:SuperClaude 機能が組み込まれている
|
||||
@ -28,9 +28,9 @@ MCP(モデルコンテキストプロトコル)サーバーは、専用ツ
|
||||
|
||||
## クイックスタート
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#quick-start)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#quick-start)
|
||||
|
||||
**セットアップの確認**:MCPサーバーは自動的に起動します。インストールとトラブルシューティングについては、[「インストールガイド」](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Getting-Started/installation.md)と[「トラブルシューティング」](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/troubleshooting.md)を参照してください。
|
||||
**セットアップの確認**:MCPサーバーは自動的に起動します。インストールとトラブルシューティングについては、[「インストールガイド」](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Getting-Started/installation.md)と[「トラブルシューティング」](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/troubleshooting.md)を参照してください。
|
||||
|
||||
**自動アクティベーションロジック:**
|
||||
|
||||
@ -45,11 +45,11 @@ MCP(モデルコンテキストプロトコル)サーバーは、専用ツ
|
||||
|
||||
## サーバーの詳細
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#server-details)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#server-details)
|
||||
|
||||
### コンテキスト7 📚
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#context7-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#context7-)
|
||||
|
||||
**目的**: 公式ライブラリドキュメントへのアクセス **トリガー**: インポートステートメント、フレームワークキーワード、ドキュメントリクエスト **要件**: Node.js 16+、APIキーなし
|
||||
|
||||
@ -64,7 +64,7 @@ MCP(モデルコンテキストプロトコル)サーバーは、専用ツ
|
||||
|
||||
### 連続思考 🧠
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#sequential-thinking-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#sequential-thinking-)
|
||||
|
||||
**目的**: 構造化された多段階の推論と体系的な分析 **トリガー**: 複雑なデバッグ、`--think`フラグ、アーキテクチャ分析 **要件**: Node.js 16+、APIキーなし
|
||||
|
||||
@ -79,7 +79,7 @@ MCP(モデルコンテキストプロトコル)サーバーは、専用ツ
|
||||
|
||||
### 魔法✨
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#magic-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#magic-)
|
||||
|
||||
**目的**: 21st.dev パターンからのモダン UI コンポーネント生成 **トリガー**: UI リクエスト、`/ui`コマンド、コンポーネント開発 **要件**: Node.js 16+、TWENTYFIRST_API_KEY()
|
||||
|
||||
@ -94,7 +94,7 @@ export TWENTYFIRST_API_KEY="your_key_here"
|
||||
|
||||
### 劇作家🎭
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#playwright-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#playwright-)
|
||||
|
||||
**目的**: 実際のブラウザ自動化とE2Eテスト **トリガー**: ブラウザテスト、E2Eシナリオ、視覚的検証 **要件**: Node.js 16以上、APIキーなし
|
||||
|
||||
@ -109,7 +109,7 @@ export TWENTYFIRST_API_KEY="your_key_here"
|
||||
|
||||
### morphllm-fast-apply 🔄
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#morphllm-fast-apply-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#morphllm-fast-apply-)
|
||||
|
||||
**目的**: 効率的なパターンベースのコード変換 **トリガー**: 複数ファイルの編集、リファクタリング、フレームワークの移行 **要件**: Node.js 16+、MORPH_API_KEY
|
||||
|
||||
@ -124,7 +124,7 @@ export MORPH_API_KEY="your_key_here"
|
||||
|
||||
### セレナ🧭
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#serena-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#serena-)
|
||||
|
||||
**目的**: プロジェクトメモリを使用したセマンティックコード理解 **トリガー**: シンボル操作、大規模コードベース、セッション管理 **要件**: Python 3.9+、UV パッケージマネージャー、API キーなし
|
||||
|
||||
@ -139,7 +139,7 @@ export MORPH_API_KEY="your_key_here"
|
||||
|
||||
## 構成
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#configuration)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#configuration)
|
||||
|
||||
**MCP 構成ファイル ( `~/.claude.json`):**
|
||||
|
||||
@ -178,7 +178,7 @@ export MORPH_API_KEY="your_key_here"
|
||||
|
||||
## 使用パターン
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#usage-patterns)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#usage-patterns)
|
||||
|
||||
**サーバー制御:**
|
||||
|
||||
@ -207,7 +207,7 @@ export MORPH_API_KEY="your_key_here"
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#troubleshooting)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#troubleshooting)
|
||||
|
||||
**よくある問題:**
|
||||
|
||||
@ -255,7 +255,7 @@ echo 'export MORPH_API_KEY="your_key"' >> ~/.bashrc
|
||||
|
||||
## サーバーの組み合わせ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#server-combinations)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#server-combinations)
|
||||
|
||||
**APIキーなし(無料)** :
|
||||
|
||||
@ -278,7 +278,7 @@ echo 'export MORPH_API_KEY="your_key"' >> ~/.bashrc
|
||||
|
||||
## 統合
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#integration)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#integration)
|
||||
|
||||
**SuperClaude コマンドを使用する場合:**
|
||||
|
||||
@ -300,20 +300,20 @@ echo 'export MORPH_API_KEY="your_key"' >> ~/.bashrc
|
||||
|
||||
## 関連リソース
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md#related-resources)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md#related-resources)
|
||||
|
||||
**必読:**
|
||||
|
||||
- [コマンドガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md)- MCPサーバーをアクティブ化するコマンド
|
||||
- [クイックスタートガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Getting-Started/quick-start.md)- MCP セットアップガイド
|
||||
- [コマンドガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md)- MCPサーバーをアクティブ化するコマンド
|
||||
- [クイックスタートガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Getting-Started/quick-start.md)- MCP セットアップガイド
|
||||
|
||||
**高度な使用法:**
|
||||
|
||||
- [行動モード](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md)- モード-MCP調整
|
||||
- [エージェントガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md)- エージェントとMCPの統合
|
||||
- [セッション管理](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md)- Serena ワークフロー
|
||||
- [行動モード](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md)- モード-MCP調整
|
||||
- [エージェントガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md)- エージェントとMCPの統合
|
||||
- [セッション管理](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md)- Serena ワークフロー
|
||||
|
||||
**技術リファレンス:**
|
||||
|
||||
- [例のクックブック](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/examples-cookbook.md)- MCP ワークフローパターン
|
||||
- [技術アーキテクチャ](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Developer-Guide/technical-architecture.md)- 統合の詳細
|
||||
- [例のクックブック](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/examples-cookbook.md)- MCP ワークフローパターン
|
||||
- [技術アーキテクチャ](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Developer-Guide/technical-architecture.md)- 統合の詳細
|
||||
@ -1,16 +1,16 @@
|
||||
# SuperClaude 行動モードガイド 🧠
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#superclaude-behavioral-modes-guide-)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#superclaude-behavioral-modes-guide-)
|
||||
|
||||
## ✅ クイック検証
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#-quick-verification)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#-quick-verification)
|
||||
|
||||
コマンドを使用してモードをテストします`/sc:`。モードはタスクの複雑さに基づいて自動的にアクティブになります。コマンドの完全なリファレンスについては、[コマンドガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md)をご覧ください。
|
||||
コマンドを使用してモードをテストします`/sc:`。モードはタスクの複雑さに基づいて自動的にアクティブになります。コマンドの完全なリファレンスについては、[コマンドガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md)をご覧ください。
|
||||
|
||||
## クイックリファレンステーブル
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#quick-reference-table)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#quick-reference-table)
|
||||
|
||||
|モード|目的|自動トリガー|重要な行動|最適な用途|
|
||||
|---|---|---|---|---|
|
||||
@ -24,7 +24,7 @@
|
||||
|
||||
## はじめに(2分の概要)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#getting-started-2-minute-overview)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#getting-started-2-minute-overview)
|
||||
|
||||
**モードは動作指示を通じてアクティブ化されます**- Claude Code はコンテキスト ファイルを読み取り、タスクのパターンと複雑さに基づいてどのモード動作を採用するかを決定します。
|
||||
|
||||
@ -47,11 +47,11 @@
|
||||
|
||||
## モードの詳細
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#mode-details)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#mode-details)
|
||||
|
||||
### 🧠 ブレインストーミングモード - インタラクティブな発見
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#-brainstorming-mode---interactive-discovery)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#-brainstorming-mode---interactive-discovery)
|
||||
|
||||
**目的**: 共同作業による発見を通じて、漠然としたアイデアを構造化された要件に変換します。
|
||||
|
||||
@ -85,7 +85,7 @@ Brainstorming Approach:
|
||||
|
||||
#### 成功基準
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#success-criteria)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#success-criteria)
|
||||
|
||||
- [ ] すぐに解決策を提示するのではなく、質問で応答する
|
||||
- [ ] 質問はユーザーのニーズ、技術的制約、ビジネス目標を探ります
|
||||
@ -106,7 +106,7 @@ Brainstorming Approach:
|
||||
|
||||
### 🔍 内省モード - メタ認知分析
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#-introspection-mode---meta-cognitive-analysis)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#-introspection-mode---meta-cognitive-analysis)
|
||||
|
||||
**目的**: 学習の最適化と透明な意思決定のための推論プロセスを公開します。
|
||||
|
||||
@ -149,7 +149,7 @@ Introspective Approach:
|
||||
|
||||
### 📋 タスク管理モード - 複雑な調整
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#-task-management-mode---complex-coordination)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#-task-management-mode---complex-coordination)
|
||||
|
||||
**目的**: 複数ステップの操作のためのセッション永続性を備えた階層的なタスク構成。
|
||||
|
||||
@ -193,7 +193,7 @@ Task Management Approach:
|
||||
|
||||
### 🎯 オーケストレーションモード - インテリジェントなツール選択
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#-orchestration-mode---intelligent-tool-selection)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#-orchestration-mode---intelligent-tool-selection)
|
||||
|
||||
**目的**: インテリジェントなツールルーティングと並列調整を通じてタスクの実行を最適化します。
|
||||
|
||||
@ -235,7 +235,7 @@ Orchestration Approach:
|
||||
|
||||
### ⚡ トークン効率モード - 圧縮通信
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#-token-efficiency-mode---compressed-communication)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#-token-efficiency-mode---compressed-communication)
|
||||
|
||||
**目的**: 情報の品質を維持しながら、シンボル システムを通じて推定 30 ~ 50% のトークン削減を実現します。
|
||||
|
||||
@ -276,7 +276,7 @@ Token Efficient Approach:
|
||||
|
||||
### 🎨 標準モード - バランスのとれたデフォルト
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#-standard-mode---balanced-default)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#-standard-mode---balanced-default)
|
||||
|
||||
**目的**: 簡単な開発タスクに対して明確でプロフェッショナルなコミュニケーションを提供します。
|
||||
|
||||
@ -319,11 +319,11 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
## 高度な使用法
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#advanced-usage)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#advanced-usage)
|
||||
|
||||
### モードの組み合わせ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#mode-combinations)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#mode-combinations)
|
||||
|
||||
**マルチモードワークフロー:**
|
||||
|
||||
@ -341,7 +341,7 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
### 手動モード制御
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#manual-mode-control)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#manual-mode-control)
|
||||
|
||||
**特定の動作を強制する:**
|
||||
|
||||
@ -366,7 +366,7 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
### モードの境界と優先順位
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#mode-boundaries-and-priority)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#mode-boundaries-and-priority)
|
||||
|
||||
**モードがアクティブになると:**
|
||||
|
||||
@ -387,11 +387,11 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
## 実世界の例
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#real-world-examples)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#real-world-examples)
|
||||
|
||||
### 完全なワークフローの例
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#complete-workflow-examples)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#complete-workflow-examples)
|
||||
|
||||
**新規プロジェクト開発:**
|
||||
|
||||
@ -430,7 +430,7 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
### モードの組み合わせパターン
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#mode-combination-patterns)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#mode-combination-patterns)
|
||||
|
||||
**非常に複雑なシナリオ:**
|
||||
|
||||
@ -447,11 +447,11 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
## クイックリファレンス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#quick-reference)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#quick-reference)
|
||||
|
||||
### モード起動パターン
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#mode-activation-patterns)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#mode-activation-patterns)
|
||||
|
||||
|トリガータイプ|入力例|モードが有効|主要な動作|
|
||||
|---|---|---|---|
|
||||
@ -464,7 +464,7 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
### 手動オーバーライドコマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#manual-override-commands)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#manual-override-commands)
|
||||
|
||||
```shell
|
||||
# Force specific mode behaviors
|
||||
@ -483,26 +483,26 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#troubleshooting)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#troubleshooting)
|
||||
|
||||
トラブルシューティングのヘルプについては、以下を参照してください。
|
||||
|
||||
- [よくある問題](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/common-issues.md)- よくある問題に対するクイック修正
|
||||
- [トラブルシューティングガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/troubleshooting.md)- 包括的な問題解決
|
||||
- [よくある問題](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/common-issues.md)- よくある問題に対するクイック修正
|
||||
- [トラブルシューティングガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/troubleshooting.md)- 包括的な問題解決
|
||||
|
||||
### よくある問題
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#common-issues)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#common-issues)
|
||||
|
||||
- **モードがアクティブ化されていません**: 手動フラグを使用してください: `--brainstorm`、、`--introspect``--uc`
|
||||
- **間違ったモードがアクティブです**: リクエスト内の複雑なトリガーとキーワードを確認してください
|
||||
- **予期しないモード切り替え**:タスクの進行に基づく通常の動作
|
||||
- **実行への影響**: モードはツールの使用を最適化するものであり、実行には影響しないはずです。
|
||||
- **モードの競合**:[フラグガイドでフラグの優先順位ルールを確認してください](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md)
|
||||
- **モードの競合**:[フラグガイドでフラグの優先順位ルールを確認してください](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md)
|
||||
|
||||
### 即時修正
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#immediate-fixes)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#immediate-fixes)
|
||||
|
||||
- **特定のモードを強制**:`--brainstorm`またはのような明示的なフラグを使用する`--task-manage`
|
||||
- **リセットモードの動作**: モード状態をリセットするには、Claude Code セッションを再起動します。
|
||||
@ -511,7 +511,7 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
### モード固有のトラブルシューティング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#mode-specific-troubleshooting)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#mode-specific-troubleshooting)
|
||||
|
||||
**ブレインストーミングモードの問題:**
|
||||
|
||||
@ -564,7 +564,7 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
### エラーコードリファレンス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#error-code-reference)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#error-code-reference)
|
||||
|
||||
|モードエラー|意味|クイックフィックス|
|
||||
|---|---|---|
|
||||
@ -579,7 +579,7 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
|
||||
### プログレッシブサポートレベル
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#progressive-support-levels)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#progressive-support-levels)
|
||||
|
||||
**レベル 1: クイックフィックス (< 2 分)**
|
||||
|
||||
@ -596,7 +596,7 @@ Standard Approach: Consistent, professional baseline for all tasks
|
||||
# Review request complexity and triggers
|
||||
```
|
||||
|
||||
- モードのインストールに関する問題については、[一般的な問題ガイドを](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/common-issues.md)参照してください。
|
||||
- モードのインストールに関する問題については、[一般的な問題ガイドを](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/common-issues.md)参照してください。
|
||||
|
||||
**レベル3: 専門家によるサポート(30分以上)**
|
||||
|
||||
@ -607,7 +607,7 @@ SuperClaude install --diagnose
|
||||
# Review behavioral triggers and thresholds
|
||||
```
|
||||
|
||||
- 行動モード分析については[診断リファレンスガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/diagnostic-reference.md)を参照してください
|
||||
- 行動モード分析については[診断リファレンスガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/diagnostic-reference.md)を参照してください
|
||||
|
||||
**レベル4: コミュニティサポート**
|
||||
|
||||
@ -617,7 +617,7 @@ SuperClaude install --diagnose
|
||||
|
||||
### 成功の検証
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#success-validation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#success-validation)
|
||||
|
||||
モード修正を適用した後、次のようにテストします。
|
||||
|
||||
@ -629,17 +629,17 @@ SuperClaude install --diagnose
|
||||
|
||||
## クイックトラブルシューティング(レガシー)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#quick-troubleshooting-legacy)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#quick-troubleshooting-legacy)
|
||||
|
||||
- **モードがアクティブ化されない**→手動フラグを使用: `--brainstorm`、、`--introspect``--uc`
|
||||
- **間違ったモードがアクティブです**→ リクエスト内の複雑なトリガーとキーワードを確認してください
|
||||
- **予期せぬモード切り替え**→ タスクの進行に基づく通常の動作
|
||||
- **実行への影響**→ モードはツールの使用を最適化するものであり、実行には影響しないはずです
|
||||
- **モードの競合→**[フラグガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md)でフラグの優先順位ルールを確認してください[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md)
|
||||
- **モードの競合→**[フラグガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md)でフラグの優先順位ルールを確認してください[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md)
|
||||
|
||||
## よくある質問
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#frequently-asked-questions)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#frequently-asked-questions)
|
||||
|
||||
**Q: どのモードがアクティブになっているかはどうすればわかりますか?** A: 通信パターンで次のインジケーターを確認してください。
|
||||
|
||||
@ -674,7 +674,7 @@ SuperClaude install --diagnose
|
||||
|
||||
## まとめ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#summary)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#summary)
|
||||
|
||||
SuperClaude の 5 つの行動モードは、ユーザーのニーズに自動的に適合する**インテリジェントな適応システムを作成します。**
|
||||
|
||||
@ -691,36 +691,36 @@ SuperClaude の 5 つの行動モードは、ユーザーのニーズに自動
|
||||
|
||||
## 関連ガイド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/modes.md#related-guides)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/modes.md#related-guides)
|
||||
|
||||
**学習の進捗:**
|
||||
|
||||
**🌱 エッセンシャル(第1週)**
|
||||
|
||||
- [クイックスタートガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Getting-Started/quick-start.md)- モードの有効化例
|
||||
- [コマンドリファレンス](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md)- コマンドは自動的にモードをアクティブ化します
|
||||
- [インストールガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Getting-Started/installation.md)- 動作モードの設定
|
||||
- [クイックスタートガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Getting-Started/quick-start.md)- モードの有効化例
|
||||
- [コマンドリファレンス](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md)- コマンドは自動的にモードをアクティブ化します
|
||||
- [インストールガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Getting-Started/installation.md)- 動作モードの設定
|
||||
|
||||
**🌿中級(第2~3週)**
|
||||
|
||||
- [エージェントガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.md)- モードとスペシャリストの連携方法
|
||||
- [フラグガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/flags.md)- 手動モードの制御と最適化
|
||||
- [例文集](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/examples-cookbook.md)- モードパターンの実践
|
||||
- [エージェントガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/agents.md)- モードとスペシャリストの連携方法
|
||||
- [フラグガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/flags.md)- 手動モードの制御と最適化
|
||||
- [例文集](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/examples-cookbook.md)- モードパターンの実践
|
||||
|
||||
**🌲 上級(2ヶ月目以降)**
|
||||
|
||||
- [MCP サーバー](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md)- 拡張機能を備えたモード統合
|
||||
- [セッション管理](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md)- タスク管理モードのワークフロー
|
||||
- [はじめに](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Getting-Started/quick-start.md)- モードの使用パターン
|
||||
- [MCP サーバー](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md)- 拡張機能を備えたモード統合
|
||||
- [セッション管理](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md)- タスク管理モードのワークフロー
|
||||
- [はじめに](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Getting-Started/quick-start.md)- モードの使用パターン
|
||||
|
||||
**🔧 エキスパート**
|
||||
|
||||
- [技術アーキテクチャ](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Developer-Guide/technical-architecture.md)- モード実装の詳細
|
||||
- [コードの貢献](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Developer-Guide/contributing-code.md)- モードの機能を拡張する
|
||||
- [技術アーキテクチャ](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Developer-Guide/technical-architecture.md)- モード実装の詳細
|
||||
- [コードの貢献](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Developer-Guide/contributing-code.md)- モードの機能を拡張する
|
||||
|
||||
**モード固有のガイド:**
|
||||
|
||||
- **ブレインストーミング**:[要件発見パターン](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/examples-cookbook.md#requirements)
|
||||
- **タスク管理**:[セッション管理ガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md)
|
||||
- **オーケストレーション**: [MCP サーバー ガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/mcp-servers.md)
|
||||
- **トークン効率**:[コマンドの基礎](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/commands.md#token-efficiency)
|
||||
- **ブレインストーミング**:[要件発見パターン](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/examples-cookbook.md#requirements)
|
||||
- **タスク管理**:[セッション管理ガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md)
|
||||
- **オーケストレーション**: [MCP サーバー ガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/mcp-servers.md)
|
||||
- **トークン効率**:[コマンドの基礎](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/commands.md#token-efficiency)
|
||||
@ -1,16 +1,16 @@
|
||||
# セッション管理ガイド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#session-management-guide)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#session-management-guide)
|
||||
|
||||
SuperClaude は、Serena MCP サーバーを通じて永続的なセッション管理を提供し、Claude Code の会話全体にわたる真のコンテキスト保存と長期的なプロジェクト継続性を実現します。
|
||||
|
||||
## 永続メモリを使用したコアセッションコマンド
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#core-session-commands-with-persistent-memory)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#core-session-commands-with-persistent-memory)
|
||||
|
||||
### `/sc:load`- 永続メモリによるコンテキストの読み込み
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#scload---context-loading-with-persistent-memory)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#scload---context-loading-with-persistent-memory)
|
||||
|
||||
**目的**: 以前のセッションからのプロジェクトコンテキストと永続メモリを使用してセッションを初期化します。MCP
|
||||
**統合**: Serena MCP をトリガーして、保存されたプロジェクトメモリを読み取ります。
|
||||
@ -38,7 +38,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### `/sc:save`- メモリへのセッションの永続性
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#scsave---session-persistence-to-memory)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#scsave---session-persistence-to-memory)
|
||||
|
||||
**目的**: 現在のセッション状態と決定を永続メモリ
|
||||
**MCP に保存します。統合**: Serena MCP をトリガーしてメモリ ファイルに書き込みます。
|
||||
@ -66,7 +66,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### `/sc:reflect`- メモリコンテキストによる進捗状況の評価
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#screflect---progress-assessment-with-memory-context)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#screflect---progress-assessment-with-memory-context)
|
||||
|
||||
**目的**: 保存されたメモリに対して現在の進行状況を分析し、セッションの完全性を検証する
|
||||
**MCP 統合**: Serena MCP を使用して、保存されたメモリと現在の状態を比較する
|
||||
@ -94,11 +94,11 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
## 永続メモリアーキテクチャ
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#persistent-memory-architecture)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#persistent-memory-architecture)
|
||||
|
||||
### Serena MCP が真の永続性を実現する方法
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#how-serena-mcp-enables-true-persistence)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#how-serena-mcp-enables-true-persistence)
|
||||
|
||||
**メモリストレージ**:
|
||||
|
||||
@ -123,11 +123,11 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
## 永続性を備えたセッションライフサイクルパターン
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#session-lifecycle-patterns-with-persistence)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#session-lifecycle-patterns-with-persistence)
|
||||
|
||||
### 新しいプロジェクトの初期化
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#new-project-initialization)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#new-project-initialization)
|
||||
|
||||
```shell
|
||||
# 1. Start fresh project
|
||||
@ -145,7 +145,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### 既存の作業の再開(クロス会話)
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#resuming-existing-work-cross-conversation)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#resuming-existing-work-cross-conversation)
|
||||
|
||||
```shell
|
||||
# 1. Load previous context from persistent memory
|
||||
@ -163,7 +163,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### 長期プロジェクト管理
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#long-term-project-management)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#long-term-project-management)
|
||||
|
||||
```shell
|
||||
# Weekly checkpoint pattern with persistence
|
||||
@ -180,11 +180,11 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
## クロス会話の継続性
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#cross-conversation-continuity)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#cross-conversation-continuity)
|
||||
|
||||
### 粘り強く新しい会話を始める
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#starting-new-conversations-with-persistence)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#starting-new-conversations-with-persistence)
|
||||
|
||||
新しい Claude Code 会話を開始すると、永続メモリ システムによって次のことが可能になります。
|
||||
|
||||
@ -208,7 +208,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### メモリ最適化
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#memory-optimization)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#memory-optimization)
|
||||
|
||||
**有効なメモリ使用量**:
|
||||
|
||||
@ -233,11 +233,11 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
## 永続セッションのベストプラクティス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#best-practices-for-persistent-sessions)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#best-practices-for-persistent-sessions)
|
||||
|
||||
### セッション開始プロトコル
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#session-start-protocol)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#session-start-protocol)
|
||||
|
||||
1. `/sc:load`既存のプロジェクトの場合は常に
|
||||
2. `/sc:reflect`記憶から現在の状態を理解するために使用する
|
||||
@ -246,7 +246,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### セッション終了プロトコル
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#session-end-protocol)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#session-end-protocol)
|
||||
|
||||
1. `/sc:reflect`保存された目標に対する完全性を評価するために使用します
|
||||
2. 重要な決定を`/sc:save`将来のセッションのために保存する
|
||||
@ -255,7 +255,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### 記憶品質の維持
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#memory-quality-maintenance)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#memory-quality-maintenance)
|
||||
|
||||
- 簡単に思い出せるように、分かりやすく説明的なメモリ名を使用する
|
||||
- 決定事項と代替アプローチに関する背景情報を含める
|
||||
@ -264,11 +264,11 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
## 他のSuperClaude機能との統合
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#integration-with-other-superclaude-features)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#integration-with-other-superclaude-features)
|
||||
|
||||
### MCP サーバー調整
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#mcp-server-coordination)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#mcp-server-coordination)
|
||||
|
||||
- **Serena MCP** : 永続メモリインフラストラクチャを提供します
|
||||
- **シーケンシャルMCP** : 保存されたメモリを使用して複雑な分析を強化します
|
||||
@ -277,7 +277,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### エージェントとメモリの連携
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#agent-collaboration-with-memory)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#agent-collaboration-with-memory)
|
||||
|
||||
- エージェントは強化されたコンテキストのために永続的なメモリにアクセスします
|
||||
- 以前の専門家の決定は保存され、参照されます
|
||||
@ -286,7 +286,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### 永続性を備えたコマンド統合
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#command-integration-with-persistence)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#command-integration-with-persistence)
|
||||
|
||||
- すべての`/sc:`コマンドは永続的なコンテキストを参照し、そのコンテキストに基づいて構築できます。
|
||||
- 以前のコマンド出力と決定はセッション間で利用可能
|
||||
@ -295,11 +295,11 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
## 永続セッションのトラブルシューティング
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#troubleshooting-persistent-sessions)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#troubleshooting-persistent-sessions)
|
||||
|
||||
### よくある問題
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#common-issues)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#common-issues)
|
||||
|
||||
**メモリが読み込まれません**:
|
||||
|
||||
@ -324,7 +324,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### クイックフィックス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#quick-fixes)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#quick-fixes)
|
||||
|
||||
**セッション状態をリセット**:
|
||||
|
||||
@ -349,11 +349,11 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
## 高度な永続セッションパターン
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#advanced-persistent-session-patterns)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#advanced-persistent-session-patterns)
|
||||
|
||||
### 複数フェーズのプロジェクト
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#multi-phase-projects)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#multi-phase-projects)
|
||||
|
||||
- 整理のためにフェーズ固有のメモリ命名を使用する
|
||||
- フェーズ全体でアーキテクチャ上の決定の継続性を維持する
|
||||
@ -362,7 +362,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### チームコラボレーション
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#team-collaboration)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#team-collaboration)
|
||||
|
||||
- 共有メモリの規則と命名規則
|
||||
- チームのコンテキストにおける意思決定根拠の保存
|
||||
@ -371,7 +371,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### 長期メンテナンス
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#long-term-maintenance)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#long-term-maintenance)
|
||||
|
||||
- 完了したプロジェクトのメモリアーカイブ戦略
|
||||
- 蓄積された記憶によるパターンライブラリの開発
|
||||
@ -380,11 +380,11 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
## 永続セッション管理の主な利点
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#key-benefits-of-persistent-session-management)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#key-benefits-of-persistent-session-management)
|
||||
|
||||
### プロジェクトの継続性
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#project-continuity)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#project-continuity)
|
||||
|
||||
- 複数の会話にわたるシームレスな作業継続
|
||||
- Claude Codeセッション間でコンテキストが失われることはありません
|
||||
@ -393,7 +393,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### 生産性の向上
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#enhanced-productivity)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#enhanced-productivity)
|
||||
|
||||
- プロジェクトのコンテキストを再度説明する必要性が減少
|
||||
- 起動時間が速く、作業を継続できる
|
||||
@ -402,7 +402,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
|
||||
|
||||
### 品質の一貫性
|
||||
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/session-management.md#quality-consistency)
|
||||
[](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/User-Guide/session-management.md#quality-consistency)
|
||||
|
||||
- セッション間で一貫したアーキテクチャパターン
|
||||
- コード品質の決定と標準の保持
|
||||
@ -35,7 +35,7 @@ SuperClaude는 Claude Code가 전문 지식을 위해 호출할 수 있는 15개
|
||||
|
||||
### SuperClaude 에이전트란?
|
||||
|
||||
**에이전트**는 Claude Code의 동작을 수정하는 컨텍스트 지시문으로 구현된 전문 AI 도메인 전문가입니다. 각 에이전트는 `SuperClaude/Agents/` 디렉토리에 있는 신중하게 작성된 `.md` 파일로, 도메인별 전문 지식, 행동 패턴, 문제 해결 접근 방식을 포함합니다.
|
||||
**에이전트**는 Claude Code의 동작을 수정하는 컨텍스트 지시문으로 구현된 전문 AI 도메인 전문가입니다. 각 에이전트는 `superclaude/Agents/` 디렉토리에 있는 신중하게 작성된 `.md` 파일로, 도메인별 전문 지식, 행동 패턴, 문제 해결 접근 방식을 포함합니다.
|
||||
|
||||
**중요**: 에이전트는 별도의 AI 모델이나 소프트웨어가 아닙니다 - Claude Code가 읽어 전문화된 행동을 채택하는 컨텍스트 구성입니다.
|
||||
|
||||
@ -38,7 +38,7 @@ SuperClaude는 Claude Code가 읽어 전문화된 동작을 채택하는 행동
|
||||
|
||||
### 컨텍스트 메커니즘:
|
||||
1. **사용자 입력**: `/sc:implement "인증 시스템"` 입력
|
||||
2. **컨텍스트 로딩**: Claude Code가 `~/.claude/SuperClaude/Commands/implement.md` 읽음
|
||||
2. **컨텍스트 로딩**: Claude Code가 `~/.claude/superclaude/Commands/implement.md` 읽음
|
||||
3. **동작 채택**: Claude가 도메인 전문 지식, 도구 선택, 검증 패턴 적용
|
||||
4. **향상된 출력**: 보안 고려사항 및 모범 사례를 갖춘 구조화된 구현
|
||||
|
||||
@ -35,7 +35,7 @@ SuperClaude 提供了 14 个领域专业智能体,Claude Code 可以调用它
|
||||
## 核心概念
|
||||
|
||||
### 什么是 SuperClaude 智能体?
|
||||
**智能体**是专业的 AI 领域专家,以上下文指令的形式实现,用于修改 Claude Code 的行为。每个智能体都是 `SuperClaude/Agents/` 目录中精心制作的 `.md` 文件,包含领域特定的专业知识、行为模式和问题解决方法。
|
||||
**智能体**是专业的 AI 领域专家,以上下文指令的形式实现,用于修改 Claude Code 的行为。每个智能体都是 `superclaude/Agents/` 目录中精心制作的 `.md` 文件,包含领域特定的专业知识、行为模式和问题解决方法。
|
||||
|
||||
**重要提示**:智能体不是独立的 AI 模型或软件 - 它们是 Claude Code 读取的上下文配置,用于采用专门的行为。
|
||||
|
||||
@ -38,7 +38,7 @@ SuperClaude 提供行为上下文文件,Claude Code 通过读取这些文件
|
||||
|
||||
### 上下文机制:
|
||||
1. **用户输入**:您输入 `/sc:implement "auth system"`
|
||||
2. **上下文加载**:Claude Code 读取 `~/.claude/SuperClaude/Commands/implement.md`
|
||||
2. **上下文加载**:Claude Code 读取 `~/.claude/superclaude/Commands/implement.md`
|
||||
3. **行为采用**:Claude 运用专业知识进行工具选择和验证
|
||||
4. **增强输出**:带有安全考虑和最佳实践的结构化实现
|
||||
|
||||
@ -35,7 +35,7 @@ Before using this guide, verify agent selection works:
|
||||
## Core Concepts
|
||||
|
||||
### What are SuperClaude Agents?
|
||||
**Agents** are specialized AI domain experts implemented as context instructions that modify Claude Code's behavior. Each agent is a carefully crafted `.md` file in the `SuperClaude/Agents/` directory containing domain-specific expertise, behavioral patterns, and problem-solving approaches.
|
||||
**Agents** are specialized AI domain experts implemented as context instructions that modify Claude Code's behavior. Each agent is a carefully crafted `.md` file in the `superclaude/Agents/` directory containing domain-specific expertise, behavioral patterns, and problem-solving approaches.
|
||||
|
||||
**Important**: Agents are NOT separate AI models or software - they are context configurations that Claude Code reads to adopt specialized behaviors.
|
||||
|
||||
@ -38,7 +38,7 @@ SuperClaude provides behavioral context files that Claude Code reads to adopt sp
|
||||
|
||||
### The Context Mechanism:
|
||||
1. **User Input**: You type `/sc:implement "auth system"`
|
||||
2. **Context Loading**: Claude Code reads `~/.claude/SuperClaude/Commands/implement.md`
|
||||
2. **Context Loading**: Claude Code reads `~/.claude/superclaude/Commands/implement.md`
|
||||
3. **Behavior Adoption**: Claude applies domain expertise, tool selection, and validation patterns
|
||||
4. **Enhanced Output**: Structured implementation with security considerations and best practices
|
||||
|
||||
332
docs/pm-agent-implementation-status.md
Normal file
332
docs/pm-agent-implementation-status.md
Normal file
@ -0,0 +1,332 @@
|
||||
# PM Agent Implementation Status
|
||||
|
||||
**Last Updated**: 2025-10-14
|
||||
**Version**: 1.0.0
|
||||
|
||||
## 📋 Overview
|
||||
|
||||
PM Agent has been redesigned as an **Always-Active Foundation Layer** that provides continuous context preservation, PDCA self-evaluation, and systematic knowledge management across sessions.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Implemented Features
|
||||
|
||||
### 1. Session Lifecycle (Serena MCP Memory Integration)
|
||||
|
||||
**Status**: ✅ Documented (Implementation Pending)
|
||||
|
||||
#### Session Start Protocol
|
||||
- **Auto-Activation**: PM Agent restores context at every session start
|
||||
- **Memory Operations**:
|
||||
- `list_memories()` → Check existing state
|
||||
- `read_memory("pm_context")` → Overall project context
|
||||
- `read_memory("last_session")` → Previous session summary
|
||||
- `read_memory("next_actions")` → Planned next steps
|
||||
- **User Report**: Automatic status report (前回/進捗/今回/課題)
|
||||
|
||||
**Implementation Details**: superclaude/Commands/pm.md:34-97
|
||||
|
||||
#### During Work (PDCA Cycle)
|
||||
- **Plan Phase**: Hypothesis generation with `docs/temp/hypothesis-*.md`
|
||||
- **Do Phase**: Experimentation with `docs/temp/experiment-*.md`
|
||||
- **Check Phase**: Self-evaluation with `docs/temp/lessons-*.md`
|
||||
- **Act Phase**: Success → `docs/patterns/` | Failure → `docs/mistakes/`
|
||||
|
||||
**Implementation Details**: superclaude/Commands/pm.md:56-80, superclaude/Agents/pm-agent.md:48-98
|
||||
|
||||
#### Session End Protocol
|
||||
- **Final Checkpoint**: `think_about_whether_you_are_done()`
|
||||
- **State Preservation**: `write_memory("pm_context", complete_state)`
|
||||
- **Documentation Cleanup**: Temporary → Formal/Mistakes
|
||||
|
||||
**Implementation Details**: superclaude/Commands/pm.md:82-97, superclaude/Agents/pm-agent.md:100-135
|
||||
|
||||
---
|
||||
|
||||
### 2. PDCA Self-Evaluation Pattern
|
||||
|
||||
**Status**: ✅ Documented (Implementation Pending)
|
||||
|
||||
#### Plan (仮説生成)
|
||||
- Goal definition and success criteria
|
||||
- Hypothesis formulation
|
||||
- Risk identification
|
||||
|
||||
#### Do (実験実行)
|
||||
- TodoWrite task tracking
|
||||
- 30-minute checkpoint saves
|
||||
- Trial-and-error recording
|
||||
|
||||
#### Check (自己評価)
|
||||
- `think_about_task_adherence()` → Pattern compliance
|
||||
- `think_about_collected_information()` → Context sufficiency
|
||||
- `think_about_whether_you_are_done()` → Completion verification
|
||||
|
||||
#### Act (改善実行)
|
||||
- Success → Extract pattern → docs/patterns/
|
||||
- Failure → Root cause analysis → docs/mistakes/
|
||||
- Update CLAUDE.md if global pattern
|
||||
|
||||
**Implementation Details**: superclaude/Agents/pm-agent.md:137-175
|
||||
|
||||
---
|
||||
|
||||
### 3. Documentation Strategy (Trial-and-Error to Knowledge)
|
||||
|
||||
**Status**: ✅ Documented (Implementation Pending)
|
||||
|
||||
#### Temporary Documentation (`docs/temp/`)
|
||||
- **Purpose**: Trial-and-error experimentation
|
||||
- **Files**:
|
||||
- `hypothesis-YYYY-MM-DD.md` → Initial plan
|
||||
- `experiment-YYYY-MM-DD.md` → Implementation log
|
||||
- `lessons-YYYY-MM-DD.md` → Reflections
|
||||
- **Lifecycle**: 7 days → Move to formal or delete
|
||||
|
||||
#### Formal Documentation (`docs/patterns/`)
|
||||
- **Purpose**: Successful patterns ready for reuse
|
||||
- **Trigger**: Verified implementation success
|
||||
- **Content**: Clean approach + concrete examples + "Last Verified" date
|
||||
|
||||
#### Mistake Documentation (`docs/mistakes/`)
|
||||
- **Purpose**: Error records with prevention strategies
|
||||
- **Structure**:
|
||||
- What Happened (現象)
|
||||
- Root Cause (根本原因)
|
||||
- Why Missed (なぜ見逃したか)
|
||||
- Fix Applied (修正内容)
|
||||
- Prevention Checklist (防止策)
|
||||
- Lesson Learned (教訓)
|
||||
|
||||
**Implementation Details**: superclaude/Agents/pm-agent.md:177-235
|
||||
|
||||
---
|
||||
|
||||
### 4. Memory Operations Reference
|
||||
|
||||
**Status**: ✅ Documented (Implementation Pending)
|
||||
|
||||
#### Memory Types
|
||||
- **Session Start**: `pm_context`, `last_session`, `next_actions`
|
||||
- **During Work**: `plan`, `checkpoint`, `decision`
|
||||
- **Self-Evaluation**: `think_about_*` operations
|
||||
- **Session End**: `last_session`, `next_actions`, `pm_context`
|
||||
|
||||
**Implementation Details**: superclaude/Agents/pm-agent.md:237-267
|
||||
|
||||
---
|
||||
|
||||
## 🚧 Pending Implementation
|
||||
|
||||
### 1. Serena MCP Memory Operations
|
||||
|
||||
**Required Actions**:
|
||||
- [ ] Implement `list_memories()` integration
|
||||
- [ ] Implement `read_memory(key)` integration
|
||||
- [ ] Implement `write_memory(key, value)` integration
|
||||
- [ ] Test memory persistence across sessions
|
||||
|
||||
**Blockers**: Requires Serena MCP server configuration
|
||||
|
||||
---
|
||||
|
||||
### 2. PDCA Think Operations
|
||||
|
||||
**Required Actions**:
|
||||
- [ ] Implement `think_about_task_adherence()` hook
|
||||
- [ ] Implement `think_about_collected_information()` hook
|
||||
- [ ] Implement `think_about_whether_you_are_done()` hook
|
||||
- [ ] Integrate with TodoWrite completion tracking
|
||||
|
||||
**Blockers**: Requires Serena MCP server configuration
|
||||
|
||||
---
|
||||
|
||||
### 3. Documentation Directory Structure
|
||||
|
||||
**Required Actions**:
|
||||
- [ ] Create `docs/temp/` directory template
|
||||
- [ ] Create `docs/patterns/` directory template
|
||||
- [ ] Create `docs/mistakes/` directory template
|
||||
- [ ] Implement automatic file lifecycle management (7-day cleanup)
|
||||
|
||||
**Blockers**: None (can be implemented immediately)
|
||||
|
||||
---
|
||||
|
||||
### 4. Auto-Activation at Session Start
|
||||
|
||||
**Required Actions**:
|
||||
- [ ] Implement PM Agent auto-activation hook
|
||||
- [ ] Integrate with Claude Code session lifecycle
|
||||
- [ ] Test context restoration across sessions
|
||||
- [ ] Verify "前回/進捗/今回/課題" report generation
|
||||
|
||||
**Blockers**: Requires understanding of Claude Code initialization hooks
|
||||
|
||||
---
|
||||
|
||||
## 📊 Implementation Roadmap
|
||||
|
||||
### Phase 1: Documentation Structure (Immediate)
|
||||
**Timeline**: 1-2 days
|
||||
**Complexity**: Low
|
||||
|
||||
1. Create `docs/temp/`, `docs/patterns/`, `docs/mistakes/` directories
|
||||
2. Add README.md to each directory explaining purpose
|
||||
3. Create template files for hypothesis/experiment/lessons
|
||||
|
||||
### Phase 2: Serena MCP Integration (High Priority)
|
||||
**Timeline**: 1 week
|
||||
**Complexity**: Medium
|
||||
|
||||
1. Configure Serena MCP server
|
||||
2. Implement memory operations (read/write/list)
|
||||
3. Test memory persistence
|
||||
4. Integrate with PM Agent workflow
|
||||
|
||||
### Phase 3: PDCA Think Operations (High Priority)
|
||||
**Timeline**: 1 week
|
||||
**Complexity**: Medium
|
||||
|
||||
1. Implement think_about_* hooks
|
||||
2. Integrate with TodoWrite
|
||||
3. Test self-evaluation flow
|
||||
4. Document best practices
|
||||
|
||||
### Phase 4: Auto-Activation (Critical)
|
||||
**Timeline**: 2 weeks
|
||||
**Complexity**: High
|
||||
|
||||
1. Research Claude Code initialization hooks
|
||||
2. Implement PM Agent auto-activation
|
||||
3. Test session start protocol
|
||||
4. Verify context restoration
|
||||
|
||||
### Phase 5: Documentation Lifecycle (Medium Priority)
|
||||
**Timeline**: 3-5 days
|
||||
**Complexity**: Low
|
||||
|
||||
1. Implement 7-day temporary file cleanup
|
||||
2. Create docs/temp → docs/patterns migration script
|
||||
3. Create docs/temp → docs/mistakes migration script
|
||||
4. Automate "Last Verified" date updates
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Testing Strategy
|
||||
|
||||
### Unit Tests
|
||||
- [ ] Memory operations (read/write/list)
|
||||
- [ ] Think operations (task_adherence/collected_information/done)
|
||||
- [ ] File lifecycle management (7-day cleanup)
|
||||
|
||||
### Integration Tests
|
||||
- [ ] Session start → context restoration → user report
|
||||
- [ ] PDCA cycle → temporary docs → formal docs
|
||||
- [ ] Mistake detection → root cause analysis → prevention checklist
|
||||
|
||||
### E2E Tests
|
||||
- [ ] Full session lifecycle (start → work → end)
|
||||
- [ ] Cross-session context preservation
|
||||
- [ ] Knowledge accumulation over time
|
||||
|
||||
---
|
||||
|
||||
## 📖 Documentation Updates Needed
|
||||
|
||||
### SuperClaude Framework
|
||||
- [x] `superclaude/Commands/pm.md` - Updated with session lifecycle
|
||||
- [x] `superclaude/Agents/pm-agent.md` - Updated with PDCA and memory operations
|
||||
- [ ] `docs/ARCHITECTURE.md` - Add PM Agent architecture section
|
||||
- [ ] `docs/GETTING_STARTED.md` - Add PM Agent usage examples
|
||||
|
||||
### Global CLAUDE.md (Future)
|
||||
- [ ] Add PM Agent PDCA cycle to global rules
|
||||
- [ ] Document session lifecycle best practices
|
||||
- [ ] Add memory operations reference
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Known Issues
|
||||
|
||||
### Issue 1: Serena MCP Not Configured
|
||||
**Status**: Blocker
|
||||
**Impact**: High (prevents memory operations)
|
||||
**Resolution**: Configure Serena MCP server in project
|
||||
|
||||
### Issue 2: Auto-Activation Hook Unknown
|
||||
**Status**: Research Needed
|
||||
**Impact**: High (prevents session start automation)
|
||||
**Resolution**: Research Claude Code initialization hooks
|
||||
|
||||
### Issue 3: Documentation Directory Structure Missing
|
||||
**Status**: Can Implement Immediately
|
||||
**Impact**: Medium (prevents PDCA documentation flow)
|
||||
**Resolution**: Create directory structure (Phase 1)
|
||||
|
||||
---
|
||||
|
||||
## 📈 Success Metrics
|
||||
|
||||
### Quantitative
|
||||
- **Context Restoration Rate**: 100% (sessions resume without re-explanation)
|
||||
- **Documentation Coverage**: >80% (implementations documented)
|
||||
- **Mistake Prevention**: <10% (recurring mistakes)
|
||||
- **Session Continuity**: >90% (successful checkpoint restorations)
|
||||
|
||||
### Qualitative
|
||||
- Users never re-explain project context
|
||||
- Knowledge accumulates systematically
|
||||
- Mistakes documented with prevention checklists
|
||||
- Documentation stays fresh (Last Verified dates)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Next Steps
|
||||
|
||||
1. **Immediate**: Create documentation directory structure (Phase 1)
|
||||
2. **High Priority**: Configure Serena MCP server (Phase 2)
|
||||
3. **High Priority**: Implement PDCA think operations (Phase 3)
|
||||
4. **Critical**: Research and implement auto-activation (Phase 4)
|
||||
5. **Medium Priority**: Implement documentation lifecycle automation (Phase 5)
|
||||
|
||||
---
|
||||
|
||||
## 📚 References
|
||||
|
||||
- **PM Agent Command**: `superclaude/Commands/pm.md`
|
||||
- **PM Agent Persona**: `superclaude/Agents/pm-agent.md`
|
||||
- **Salvaged Changes**: `tmp/salvaged-pm-agent/`
|
||||
- **Original Patches**: `tmp/salvaged-pm-agent/*.patch`
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Commit Information
|
||||
|
||||
**Branch**: master
|
||||
**Salvaged From**: `/Users/kazuki/.claude` (mistaken development location)
|
||||
**Integration Date**: 2025-10-14
|
||||
**Status**: Documentation complete, implementation pending
|
||||
|
||||
**Git Operations**:
|
||||
```bash
|
||||
# Salvaged valuable changes to tmp/
|
||||
cp ~/.claude/Commands/pm.md tmp/salvaged-pm-agent/pm.md
|
||||
cp ~/.claude/agents/pm-agent.md tmp/salvaged-pm-agent/pm-agent.md
|
||||
git diff ~/.claude/CLAUDE.md > tmp/salvaged-pm-agent/CLAUDE.md.patch
|
||||
git diff ~/.claude/RULES.md > tmp/salvaged-pm-agent/RULES.md.patch
|
||||
|
||||
# Cleaned up .claude directory
|
||||
cd ~/.claude && git reset --hard HEAD
|
||||
cd ~/.claude && rm -rf .git
|
||||
|
||||
# Applied changes to SuperClaude_Framework
|
||||
cp tmp/salvaged-pm-agent/pm.md superclaude/Commands/pm.md
|
||||
cp tmp/salvaged-pm-agent/pm-agent.md superclaude/Agents/pm-agent.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Verified**: 2025-10-14
|
||||
**Next Review**: 2025-10-21 (1 week)
|
||||
191
pr_documentation.md
Normal file
191
pr_documentation.md
Normal file
@ -0,0 +1,191 @@
|
||||
# Pull Request: Redesign PM Agent as Self-Improvement Meta-Layer
|
||||
|
||||
## Summary
|
||||
|
||||
Redesigned PM Agent from task orchestration system to self-improvement workflow executor (meta-layer agent). PM Agent now complements existing auto-activation by systematically documenting implementations, analyzing mistakes, and maintaining knowledge base quality.
|
||||
|
||||
## Motivation
|
||||
|
||||
**Problem**: Initial PM Agent design competed with existing auto-activation system for task routing, creating confusion about responsibilities and adding unnecessary complexity.
|
||||
|
||||
**Solution**: Redefined PM Agent as a meta-layer that operates AFTER specialist agents complete tasks, focusing on:
|
||||
- Post-implementation documentation
|
||||
- Immediate mistake analysis and prevention
|
||||
- Monthly documentation maintenance
|
||||
- Pattern extraction and knowledge synthesis
|
||||
|
||||
**Value Proposition**: Transforms SuperClaude into a continuously learning system that accumulates knowledge, prevents recurring mistakes, and maintains fresh documentation without manual intervention.
|
||||
|
||||
## Changes
|
||||
|
||||
### 1. PM Agent Agent File (`superclaude/Agents/pm-agent.md`)
|
||||
**Status**: Complete rewrite
|
||||
|
||||
**Before**:
|
||||
- Category: orchestration
|
||||
- Triggers: All user interactions (default mode)
|
||||
- Role: Task router and sub-agent coordinator
|
||||
- Competed with existing auto-activation
|
||||
|
||||
**After**:
|
||||
- Category: meta
|
||||
- Triggers: Post-implementation, mistake detection, monthly maintenance
|
||||
- Role: Self-improvement workflow executor
|
||||
- Complements existing auto-activation
|
||||
|
||||
**Key Additions**:
|
||||
- Behavioral Mindset: "Think like a continuous learning system"
|
||||
- Focus Areas: Implementation Documentation, Mistake Analysis, Pattern Recognition, Knowledge Maintenance, Self-Improvement Loop
|
||||
- Self-Improvement Workflow Integration: BEFORE/DURING/AFTER/MISTAKE RECOVERY/MAINTENANCE phases
|
||||
- Quality Standards: Latest, Minimal, Clear, Practical documentation criteria
|
||||
- Performance Metrics: Documentation coverage, mistake prevention effectiveness, knowledge maintenance health
|
||||
|
||||
**Workflow Examples**:
|
||||
1. Post-Implementation Documentation: Backend architect implements JWT → PM Agent documents pattern
|
||||
2. Immediate Mistake Analysis: Kong Gateway bypass detected → PM Agent stops, analyzes, documents prevention
|
||||
3. Monthly Documentation Maintenance: PM Agent prunes outdated docs, merges duplicates, updates versions
|
||||
|
||||
### 2. Framework Rules (`superclaude/Core/RULES.md`)
|
||||
**Status**: Agent Orchestration section updated (lines 17-44)
|
||||
|
||||
**Changes**:
|
||||
- Split orchestration into two clear layers:
|
||||
- **Task Execution Layer**: Existing auto-activation (unchanged)
|
||||
- **Self-Improvement Layer**: PM Agent meta-layer (new)
|
||||
- Added orchestration flow diagram showing task execution → documentation cycle
|
||||
- Clarified examples: ✅ Right patterns and ❌ Wrong anti-patterns
|
||||
- Emphasized PM Agent activates AFTER task completion, not before/during
|
||||
|
||||
**Purpose**: Eliminate confusion between task routing (auto-activation) and learning (PM Agent)
|
||||
|
||||
### 3. README.md
|
||||
**Status**: PM Agent description updated (line 208)
|
||||
|
||||
**Before**: "PM Agent orchestrates all interactions seamlessly"
|
||||
|
||||
**After**: "PM Agent ensures continuous learning through systematic documentation"
|
||||
|
||||
**Impact**: Accurate representation of PM Agent's meta-layer role in main documentation
|
||||
|
||||
### 4. Agents Guide (`docs/User-Guide/agents.md`)
|
||||
**Status**: PM Agent section completely rewritten (lines 140-208)
|
||||
|
||||
**Changes**:
|
||||
- Section title: "Orchestration Agent" → "Meta-Layer Agent"
|
||||
- Expertise: Project orchestration → Self-improvement workflow executor
|
||||
- Auto-Activation: Default mode for all interactions → Post-implementation, mistake detection, monthly maintenance
|
||||
- Capabilities: Workflow orchestration → Implementation documentation, mistake analysis, pattern recognition, knowledge maintenance
|
||||
- Examples: Vague feature requests → Post-implementation documentation, immediate mistake analysis, monthly maintenance
|
||||
- Integration: Orchestrates entire ecosystem → Documents specialist agents' work
|
||||
|
||||
**Purpose**: User-facing documentation accurately reflects PM Agent's actual behavior
|
||||
|
||||
## Two-Layer Orchestration System
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Task Execution Layer (Existing Auto-Activation) │
|
||||
│ ─────────────────────────────────────────────────────── │
|
||||
│ User Request → Context Analysis → Specialist Selection │
|
||||
│ backend-architect | frontend-architect | security, etc. │
|
||||
│ │
|
||||
│ ↓ Implementation Complete ↓ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Self-Improvement Layer (PM Agent Meta-Layer) │
|
||||
│ ─────────────────────────────────────────────────────── │
|
||||
│ PM Agent Auto-Triggers → Documentation → Learning │
|
||||
│ Pattern Recording | Mistake Analysis | Maintenance │
|
||||
│ │
|
||||
│ ↓ Knowledge Base Updated ↓ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Flow**:
|
||||
1. User: "Add JWT authentication"
|
||||
2. Task Execution Layer: Auto-activation → security-engineer + backend-architect → Implementation
|
||||
3. Self-Improvement Layer: PM Agent auto-triggers → Documents JWT pattern in docs/authentication.md → Records security decisions → Updates CLAUDE.md
|
||||
|
||||
## Testing
|
||||
|
||||
**Validation Method**: Verified integration with existing self-improvement workflow
|
||||
|
||||
**Test Case**: agiletec project
|
||||
- ✅ Reviewed `/Users/kazuki/github/agiletec/docs/self-improvement-workflow.md`
|
||||
- ✅ Confirmed PM Agent design aligns with BEFORE/DURING/AFTER/MISTAKE RECOVERY phases
|
||||
- ✅ Verified PM Agent complements (not competes with) existing workflow
|
||||
- ✅ Confirmed agiletec workflow defines WHAT, PM Agent defines WHO executes it
|
||||
|
||||
**Integration Check**:
|
||||
- ✅ PM Agent operates as meta-layer above specialist agents
|
||||
- ✅ Existing auto-activation handles task routing (unchanged)
|
||||
- ✅ PM Agent handles post-implementation documentation (new capability)
|
||||
- ✅ No conflicts with existing agent activation patterns
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
**None**. This is a design clarification and documentation update:
|
||||
|
||||
- ✅ Existing auto-activation continues to work identically
|
||||
- ✅ Specialist agents (backend-architect, frontend-architect, etc.) unchanged
|
||||
- ✅ User workflows remain the same
|
||||
- ✅ Manual `@agent-[name]` override still works
|
||||
- ✅ Commands (`/sc:implement`, `/sc:build`, etc.) unchanged
|
||||
|
||||
**New Capability**: PM Agent now automatically documents implementations and maintains knowledge base without user intervention.
|
||||
|
||||
## Impact on User Experience
|
||||
|
||||
**Before**:
|
||||
- User requests task → Specialist agents implement → User manually documents (if at all)
|
||||
- Mistakes repeated due to lack of systematic documentation
|
||||
- Documentation becomes outdated over time
|
||||
|
||||
**After**:
|
||||
- User requests task → Specialist agents implement → PM Agent auto-documents patterns
|
||||
- Mistakes automatically analyzed with prevention checklists created
|
||||
- Documentation systematically maintained through monthly reviews
|
||||
|
||||
**Result**: Zero additional user effort, continuous improvement built into framework
|
||||
|
||||
## Verification Checklist
|
||||
|
||||
- [x] PM Agent agent file completely rewritten with meta-layer design
|
||||
- [x] RULES.md Agent Orchestration section updated with two-layer system
|
||||
- [x] README.md PM Agent description updated
|
||||
- [x] agents.md PM Agent section completely rewritten
|
||||
- [x] Integration validated with agiletec project self-improvement workflow
|
||||
- [x] All files properly formatted and consistent
|
||||
- [x] No breaking changes to existing functionality
|
||||
- [x] Documentation accurately reflects implementation
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
**Potential Additions** (not included in this PR):
|
||||
1. `/sc:pm status` - Show documentation coverage and maintenance health
|
||||
2. `/sc:pm review` - Manual trigger for documentation review
|
||||
3. Performance metrics dashboard - Track mistake prevention effectiveness
|
||||
4. Integration with CI/CD - Auto-generate documentation on PR merge
|
||||
|
||||
**These are OPTIONAL** and should be separate PRs based on user feedback.
|
||||
|
||||
## Related Issues
|
||||
|
||||
Addresses internal design discussion about PM Agent role clarity and integration with existing auto-activation system.
|
||||
|
||||
## Reviewer Notes
|
||||
|
||||
**Key Points to Review**:
|
||||
1. **pm-agent.md**: Complete rewrite - verify behavioral mindset, focus areas, and workflow examples make sense
|
||||
2. **RULES.md**: Two-layer orchestration system - verify clear distinction between task execution and self-improvement
|
||||
3. **agents.md**: User-facing documentation - verify accurate representation of PM Agent behavior
|
||||
4. **Integration**: Verify PM Agent complements (not competes with) existing auto-activation
|
||||
|
||||
**Expected Outcome**: PM Agent transforms SuperClaude into a continuously learning system through systematic documentation, mistake analysis, and knowledge maintenance.
|
||||
|
||||
---
|
||||
|
||||
**PR Type**: Enhancement (Design Clarification)
|
||||
**Complexity**: Medium (Documentation-focused, no code changes)
|
||||
**Risk**: Low (No breaking changes, purely additive capability)
|
||||
@ -3,7 +3,7 @@ requires = ["setuptools>=61.0", "wheel"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "SuperClaude"
|
||||
name = "superclaude"
|
||||
version = "4.1.5"
|
||||
authors = [
|
||||
{name = "NomenAK", email = "anton.knoery@gmail.com"},
|
||||
@ -43,8 +43,8 @@ GitHub = "https://github.com/SuperClaude-Org/SuperClaude_Framework"
|
||||
"NomenAK" = "https://github.com/NomenAK"
|
||||
|
||||
[project.scripts]
|
||||
SuperClaude = "SuperClaude.__main__:main"
|
||||
superclaude = "SuperClaude.__main__:main"
|
||||
SuperClaude = "superclaude.__main__:main"
|
||||
superclaude = "superclaude.__main__:main"
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = [
|
||||
@ -64,12 +64,12 @@ include-package-data = true
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["."]
|
||||
include = ["SuperClaude*", "setup*"]
|
||||
include = ["superclaude*", "setup*"]
|
||||
exclude = ["tests*", "*.tests*", "*.tests", ".git*", ".venv*", "*.egg-info*"]
|
||||
|
||||
[tool.setuptools.package-data]
|
||||
"setup" = ["data/*.json", "data/*.yaml", "data/*.yml", "components/*.py", "**/*.py"]
|
||||
"SuperClaude" = ["*.md", "*.txt", "**/*.md", "**/*.txt", "**/*.json", "**/*.yaml", "**/*.yml"]
|
||||
"superclaude" = ["*.md", "*.txt", "**/*.md", "**/*.txt", "**/*.json", "**/*.yaml", "**/*.yml"]
|
||||
|
||||
[tool.black]
|
||||
line-length = 88
|
||||
@ -115,7 +115,7 @@ markers = [
|
||||
]
|
||||
|
||||
[tool.coverage.run]
|
||||
source = ["SuperClaude", "setup"]
|
||||
source = ["superclaude", "setup"]
|
||||
omit = [
|
||||
"*/tests/*",
|
||||
"*/test_*",
|
||||
|
||||
@ -107,8 +107,8 @@ Set these in your GitHub repository settings → Secrets and variables → Actio
|
||||
|
||||
Before publishing, ensure version consistency across:
|
||||
- `pyproject.toml`
|
||||
- `SuperClaude/__init__.py`
|
||||
- `SuperClaude/__main__.py`
|
||||
- `superclaude/__init__.py`
|
||||
- `superclaude/__main__.py`
|
||||
- `setup/__init__.py`
|
||||
|
||||
The build script validates version consistency automatically.
|
||||
|
||||
@ -17,16 +17,13 @@ PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DIST_DIR = PROJECT_ROOT / "dist"
|
||||
BUILD_DIR = PROJECT_ROOT / "build"
|
||||
|
||||
|
||||
def run_command(cmd: List[str], description: str) -> Tuple[bool, str]:
|
||||
"""Run a command and return success status and output"""
|
||||
print(f"🔄 {description}...")
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
cwd=PROJECT_ROOT,
|
||||
check=True
|
||||
cmd, capture_output=True, text=True, cwd=PROJECT_ROOT, check=True
|
||||
)
|
||||
print(f"✅ {description} completed successfully")
|
||||
return True, result.stdout
|
||||
@ -39,9 +36,10 @@ def run_command(cmd: List[str], description: str) -> Tuple[bool, str]:
|
||||
print(f"❌ {description} failed with exception: {e}")
|
||||
return False, str(e)
|
||||
|
||||
|
||||
def clean_build_artifacts():
|
||||
"""Clean previous build artifacts"""
|
||||
artifacts = [DIST_DIR, BUILD_DIR, PROJECT_ROOT / "SuperClaude.egg-info"]
|
||||
artifacts = [DIST_DIR, BUILD_DIR, PROJECT_ROOT / "superclaude.egg-info"]
|
||||
|
||||
for artifact in artifacts:
|
||||
if artifact.exists():
|
||||
@ -51,6 +49,7 @@ def clean_build_artifacts():
|
||||
else:
|
||||
artifact.unlink()
|
||||
|
||||
|
||||
def install_build_tools() -> bool:
|
||||
"""Install required build tools"""
|
||||
tools = ["build", "twine"]
|
||||
@ -58,22 +57,23 @@ def install_build_tools() -> bool:
|
||||
for tool in tools:
|
||||
success, _ = run_command(
|
||||
[sys.executable, "-m", "pip", "install", "--upgrade", tool],
|
||||
f"Installing {tool}"
|
||||
f"Installing {tool}",
|
||||
)
|
||||
if not success:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def validate_project_structure() -> bool:
|
||||
"""Validate project structure before building"""
|
||||
required_files = [
|
||||
"pyproject.toml",
|
||||
"README.md",
|
||||
"LICENSE",
|
||||
"SuperClaude/__init__.py",
|
||||
"SuperClaude/__main__.py",
|
||||
"setup/__init__.py"
|
||||
"superclaude/__init__.py",
|
||||
"superclaude/__main__.py",
|
||||
"setup/__init__.py",
|
||||
]
|
||||
|
||||
print("🔍 Validating project structure...")
|
||||
@ -86,7 +86,8 @@ def validate_project_structure() -> bool:
|
||||
|
||||
# Check if version is consistent
|
||||
try:
|
||||
from SuperClaude import __version__
|
||||
from superclaude import __version__
|
||||
|
||||
print(f"📦 Package version: {__version__}")
|
||||
except ImportError as e:
|
||||
print(f"❌ Could not import version from SuperClaude: {e}")
|
||||
@ -95,13 +96,14 @@ def validate_project_structure() -> bool:
|
||||
print("✅ Project structure validation passed")
|
||||
return True
|
||||
|
||||
|
||||
def build_package() -> bool:
|
||||
"""Build the package"""
|
||||
return run_command(
|
||||
[sys.executable, "-m", "build"],
|
||||
"Building package distributions"
|
||||
[sys.executable, "-m", "build"], "Building package distributions"
|
||||
)[0]
|
||||
|
||||
|
||||
def validate_distribution() -> bool:
|
||||
"""Validate the built distribution"""
|
||||
if not DIST_DIR.exists():
|
||||
@ -120,27 +122,35 @@ def validate_distribution() -> bool:
|
||||
# Check with twine
|
||||
return run_command(
|
||||
[sys.executable, "-m", "twine", "check"] + [str(f) for f in dist_files],
|
||||
"Validating distributions with twine"
|
||||
"Validating distributions with twine",
|
||||
)[0]
|
||||
|
||||
|
||||
def upload_to_testpypi() -> bool:
|
||||
"""Upload to TestPyPI for testing"""
|
||||
dist_files = list(DIST_DIR.glob("*"))
|
||||
return run_command(
|
||||
[sys.executable, "-m", "twine", "upload", "--repository", "testpypi"] + [str(f) for f in dist_files],
|
||||
"Uploading to TestPyPI"
|
||||
[sys.executable, "-m", "twine", "upload", "--repository", "testpypi"]
|
||||
+ [str(f) for f in dist_files],
|
||||
"Uploading to TestPyPI",
|
||||
)[0]
|
||||
|
||||
|
||||
def upload_to_pypi() -> bool:
|
||||
"""Upload to production PyPI"""
|
||||
dist_files = list(DIST_DIR.glob("*"))
|
||||
|
||||
# Check if we have API token in environment
|
||||
if os.getenv('PYPI_API_TOKEN'):
|
||||
if os.getenv("PYPI_API_TOKEN"):
|
||||
cmd = [
|
||||
sys.executable, "-m", "twine", "upload",
|
||||
"--username", "__token__",
|
||||
"--password", os.getenv('PYPI_API_TOKEN')
|
||||
sys.executable,
|
||||
"-m",
|
||||
"twine",
|
||||
"upload",
|
||||
"--username",
|
||||
"__token__",
|
||||
"--password",
|
||||
os.getenv("PYPI_API_TOKEN"),
|
||||
] + [str(f) for f in dist_files]
|
||||
else:
|
||||
# Fall back to .pypirc configuration
|
||||
@ -148,24 +158,36 @@ def upload_to_pypi() -> bool:
|
||||
|
||||
return run_command(cmd, "Uploading to PyPI")[0]
|
||||
|
||||
|
||||
def test_installation_from_testpypi() -> bool:
|
||||
"""Test installation from TestPyPI"""
|
||||
print("🧪 Testing installation from TestPyPI...")
|
||||
print(" Note: This will install in a separate process")
|
||||
|
||||
success, output = run_command([
|
||||
sys.executable, "-m", "pip", "install",
|
||||
"--index-url", "https://test.pypi.org/simple/",
|
||||
"--extra-index-url", "https://pypi.org/simple/",
|
||||
"SuperClaude", "--force-reinstall", "--no-deps"
|
||||
], "Installing from TestPyPI")
|
||||
success, output = run_command(
|
||||
[
|
||||
sys.executable,
|
||||
"-m",
|
||||
"pip",
|
||||
"install",
|
||||
"--index-url",
|
||||
"https://test.pypi.org/simple/",
|
||||
"--extra-index-url",
|
||||
"https://pypi.org/simple/",
|
||||
"SuperClaude",
|
||||
"--force-reinstall",
|
||||
"--no-deps",
|
||||
],
|
||||
"Installing from TestPyPI",
|
||||
)
|
||||
|
||||
if success:
|
||||
print("✅ Test installation successful")
|
||||
# Try to import the package
|
||||
try:
|
||||
import SuperClaude
|
||||
print(f"✅ Package import successful, version: {SuperClaude.__version__}")
|
||||
import superclaude
|
||||
|
||||
print(f"✅ Package import successful, version: {superclaude.__version__}")
|
||||
return True
|
||||
except ImportError as e:
|
||||
print(f"❌ Package import failed: {e}")
|
||||
@ -173,14 +195,25 @@ def test_installation_from_testpypi() -> bool:
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""Main execution function"""
|
||||
parser = argparse.ArgumentParser(description="Build and upload SuperClaude to PyPI")
|
||||
parser.add_argument("--testpypi", action="store_true", help="Upload to TestPyPI instead of PyPI")
|
||||
parser.add_argument("--test-install", action="store_true", help="Test installation from TestPyPI")
|
||||
parser.add_argument("--skip-build", action="store_true", help="Skip build step (use existing dist)")
|
||||
parser.add_argument("--skip-validation", action="store_true", help="Skip validation steps")
|
||||
parser.add_argument("--clean", action="store_true", help="Only clean build artifacts")
|
||||
parser.add_argument(
|
||||
"--testpypi", action="store_true", help="Upload to TestPyPI instead of PyPI"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--test-install", action="store_true", help="Test installation from TestPyPI"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--skip-build", action="store_true", help="Skip build step (use existing dist)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--skip-validation", action="store_true", help="Skip validation steps"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--clean", action="store_true", help="Only clean build artifacts"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
@ -231,7 +264,9 @@ def main():
|
||||
sys.exit(1)
|
||||
else:
|
||||
# Confirm production upload
|
||||
response = input("🚨 Upload to production PyPI? This cannot be undone! (yes/no): ")
|
||||
response = input(
|
||||
"🚨 Upload to production PyPI? This cannot be undone! (yes/no): "
|
||||
)
|
||||
if response.lower() != "yes":
|
||||
print("❌ Upload cancelled")
|
||||
sys.exit(1)
|
||||
@ -242,5 +277,6 @@ def main():
|
||||
|
||||
print("✅ All operations completed successfully!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -12,6 +12,7 @@ from typing import List, Tuple
|
||||
# Project root
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
|
||||
|
||||
def check_file_exists(file_path: Path, description: str) -> bool:
|
||||
"""Check if a required file exists"""
|
||||
if file_path.exists():
|
||||
@ -21,6 +22,7 @@ def check_file_exists(file_path: Path, description: str) -> bool:
|
||||
print(f"❌ Missing {description}: {file_path}")
|
||||
return False
|
||||
|
||||
|
||||
def check_version_consistency() -> bool:
|
||||
"""Check if versions are consistent across files"""
|
||||
print("\n🔍 Checking version consistency...")
|
||||
@ -30,20 +32,21 @@ def check_version_consistency() -> bool:
|
||||
# Check pyproject.toml
|
||||
try:
|
||||
pyproject_path = PROJECT_ROOT / "pyproject.toml"
|
||||
with open(pyproject_path, 'r') as f:
|
||||
with open(pyproject_path, "r") as f:
|
||||
pyproject = toml.load(f)
|
||||
versions['pyproject.toml'] = pyproject['project']['version']
|
||||
versions["pyproject.toml"] = pyproject["project"]["version"]
|
||||
print(f"📋 pyproject.toml version: {versions['pyproject.toml']}")
|
||||
except Exception as e:
|
||||
print(f"❌ Error reading pyproject.toml: {e}")
|
||||
return False
|
||||
|
||||
# Check SuperClaude/__init__.py
|
||||
# Check superclaude/__init__.py
|
||||
try:
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
from SuperClaude import __version__
|
||||
versions['SuperClaude/__init__.py'] = __version__
|
||||
print(f"📦 Package version: {versions['SuperClaude/__init__.py']}")
|
||||
from superclaude import __version__
|
||||
|
||||
versions["superclaude/__init__.py"] = __version__
|
||||
print(f"📦 Package version: {versions['superclaude/__init__.py']}")
|
||||
except Exception as e:
|
||||
print(f"❌ Error importing SuperClaude version: {e}")
|
||||
return False
|
||||
@ -51,7 +54,8 @@ def check_version_consistency() -> bool:
|
||||
# Check setup/__init__.py
|
||||
try:
|
||||
from setup import __version__ as setup_version
|
||||
versions['setup/__init__.py'] = setup_version
|
||||
|
||||
versions["setup/__init__.py"] = setup_version
|
||||
print(f"🔧 Setup version: {versions['setup/__init__.py']}")
|
||||
except Exception as e:
|
||||
print(f"❌ Error importing setup version: {e}")
|
||||
@ -66,18 +70,19 @@ def check_version_consistency() -> bool:
|
||||
print(f"❌ Version mismatch: {versions}")
|
||||
return False
|
||||
|
||||
|
||||
def check_package_structure() -> bool:
|
||||
"""Check if package structure is correct"""
|
||||
print("\n🏗️ Checking package structure...")
|
||||
|
||||
required_structure = [
|
||||
("SuperClaude/__init__.py", "Main package __init__.py"),
|
||||
("SuperClaude/__main__.py", "Main entry point"),
|
||||
("SuperClaude/Core/__init__.py", "Core module __init__.py"),
|
||||
("SuperClaude/Commands/__init__.py", "Commands module __init__.py"),
|
||||
("SuperClaude/Agents/__init__.py", "Agents module __init__.py"),
|
||||
("SuperClaude/Modes/__init__.py", "Modes module __init__.py"),
|
||||
("SuperClaude/MCP/__init__.py", "MCP module __init__.py"),
|
||||
("superclaude/__init__.py", "Main package __init__.py"),
|
||||
("superclaude/__main__.py", "Main entry point"),
|
||||
("superclaude/Core/__init__.py", "Core module __init__.py"),
|
||||
("superclaude/Commands/__init__.py", "Commands module __init__.py"),
|
||||
("superclaude/Agents/__init__.py", "Agents module __init__.py"),
|
||||
("superclaude/Modes/__init__.py", "Modes module __init__.py"),
|
||||
("superclaude/MCP/__init__.py", "MCP module __init__.py"),
|
||||
("setup/__init__.py", "Setup package __init__.py"),
|
||||
]
|
||||
|
||||
@ -89,6 +94,7 @@ def check_package_structure() -> bool:
|
||||
|
||||
return all_good
|
||||
|
||||
|
||||
def check_required_files() -> bool:
|
||||
"""Check if all required files are present"""
|
||||
print("\n📄 Checking required files...")
|
||||
@ -109,19 +115,20 @@ def check_required_files() -> bool:
|
||||
|
||||
return all_good
|
||||
|
||||
|
||||
def check_pyproject_config() -> bool:
|
||||
"""Check pyproject.toml configuration"""
|
||||
print("\n⚙️ Checking pyproject.toml configuration...")
|
||||
|
||||
try:
|
||||
pyproject_path = PROJECT_ROOT / "pyproject.toml"
|
||||
with open(pyproject_path, 'r') as f:
|
||||
with open(pyproject_path, "r") as f:
|
||||
pyproject = toml.load(f)
|
||||
|
||||
project = pyproject.get('project', {})
|
||||
project = pyproject.get("project", {})
|
||||
|
||||
# Required fields
|
||||
required_fields = ['name', 'version', 'description', 'authors']
|
||||
required_fields = ["name", "version", "description", "authors"]
|
||||
for field in required_fields:
|
||||
if field in project:
|
||||
print(f"✅ {field}: {project[field]}")
|
||||
@ -130,15 +137,15 @@ def check_pyproject_config() -> bool:
|
||||
return False
|
||||
|
||||
# Check entry points
|
||||
scripts = project.get('scripts', {})
|
||||
if 'SuperClaude' in scripts:
|
||||
print(f"✅ CLI entry point: {scripts['SuperClaude']}")
|
||||
scripts = project.get("scripts", {})
|
||||
if "superclaude" in scripts:
|
||||
print(f"✅ CLI entry point: {scripts['superclaude']}")
|
||||
else:
|
||||
print("❌ Missing CLI entry point")
|
||||
return False
|
||||
|
||||
# Check classifiers
|
||||
classifiers = project.get('classifiers', [])
|
||||
classifiers = project.get("classifiers", [])
|
||||
if len(classifiers) > 0:
|
||||
print(f"✅ {len(classifiers)} PyPI classifiers defined")
|
||||
else:
|
||||
@ -150,21 +157,24 @@ def check_pyproject_config() -> bool:
|
||||
print(f"❌ Error reading pyproject.toml: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def check_import_test() -> bool:
|
||||
"""Test if the package can be imported"""
|
||||
print("\n🧪 Testing package import...")
|
||||
|
||||
try:
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
import SuperClaude
|
||||
import superclaude
|
||||
|
||||
print(f"✅ SuperClaude import successful")
|
||||
print(f"📦 Version: {SuperClaude.__version__}")
|
||||
print(f"👤 Author: {SuperClaude.__author__}")
|
||||
print(f"📦 Version: {superclaude.__version__}")
|
||||
print(f"👤 Author: {superclaude.__author__}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ Import failed: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""Main validation function"""
|
||||
print("🔍 SuperClaude PyPI Readiness Validation")
|
||||
@ -215,6 +225,7 @@ def main():
|
||||
print("❌ Project needs fixes before PyPI publication")
|
||||
return False
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = main()
|
||||
sys.exit(0 if success else 1)
|
||||
@ -7,5 +7,5 @@ from .base import OperationBase
|
||||
from .commands import *
|
||||
|
||||
__all__ = [
|
||||
'OperationBase',
|
||||
"OperationBase",
|
||||
]
|
||||
@ -19,23 +19,23 @@ def get_command_info():
|
||||
"install": {
|
||||
"name": "install",
|
||||
"description": "Install SuperClaude framework components",
|
||||
"module": "setup.cli.commands.install"
|
||||
"module": "setup.cli.commands.install",
|
||||
},
|
||||
"update": {
|
||||
"name": "update",
|
||||
"description": "Update existing SuperClaude installation",
|
||||
"module": "setup.cli.commands.update"
|
||||
"module": "setup.cli.commands.update",
|
||||
},
|
||||
"uninstall": {
|
||||
"name": "uninstall",
|
||||
"description": "Remove SuperClaude framework installation",
|
||||
"module": "setup.cli.commands.uninstall"
|
||||
"module": "setup.cli.commands.uninstall",
|
||||
},
|
||||
"backup": {
|
||||
"name": "backup",
|
||||
"description": "Backup and restore SuperClaude installations",
|
||||
"module": "setup.cli.commands.backup"
|
||||
}
|
||||
"module": "setup.cli.commands.backup",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -49,6 +49,7 @@ class OperationBase:
|
||||
def setup_operation_logging(self, args):
|
||||
"""Setup operation-specific logging"""
|
||||
from ..utils.logger import get_logger
|
||||
|
||||
self.logger = get_logger()
|
||||
self.logger.info(f"Starting {self.operation_name} operation")
|
||||
|
||||
@ -57,14 +58,17 @@ class OperationBase:
|
||||
errors = []
|
||||
|
||||
# Validate install directory
|
||||
if hasattr(args, 'install_dir') and args.install_dir:
|
||||
if hasattr(args, "install_dir") and args.install_dir:
|
||||
from ..utils.security import SecurityValidator
|
||||
is_safe, validation_errors = SecurityValidator.validate_installation_target(args.install_dir)
|
||||
|
||||
is_safe, validation_errors = SecurityValidator.validate_installation_target(
|
||||
args.install_dir
|
||||
)
|
||||
if not is_safe:
|
||||
errors.extend(validation_errors)
|
||||
|
||||
# Check for conflicting flags
|
||||
if hasattr(args, 'verbose') and hasattr(args, 'quiet'):
|
||||
if hasattr(args, "verbose") and hasattr(args, "quiet"):
|
||||
if args.verbose and args.quiet:
|
||||
errors.append("Cannot specify both --verbose and --quiet")
|
||||
|
||||
|
||||
@ -10,9 +10,9 @@ from .update import UpdateOperation
|
||||
from .backup import BackupOperation
|
||||
|
||||
__all__ = [
|
||||
'OperationBase',
|
||||
'InstallOperation',
|
||||
'UninstallOperation',
|
||||
'UpdateOperation',
|
||||
'BackupOperation'
|
||||
"OperationBase",
|
||||
"InstallOperation",
|
||||
"UninstallOperation",
|
||||
"UpdateOperation",
|
||||
"BackupOperation",
|
||||
]
|
||||
@ -9,14 +9,22 @@ import tarfile
|
||||
import json
|
||||
from pathlib import Path
|
||||
from ...utils.paths import get_home_directory
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Optional, Dict, Any, Tuple
|
||||
import argparse
|
||||
|
||||
from ...services.settings import SettingsService
|
||||
from ...utils.ui import (
|
||||
display_header, display_info, display_success, display_error,
|
||||
display_warning, Menu, confirm, ProgressBar, Colors, format_size
|
||||
display_header,
|
||||
display_info,
|
||||
display_success,
|
||||
display_error,
|
||||
display_warning,
|
||||
Menu,
|
||||
confirm,
|
||||
ProgressBar,
|
||||
Colors,
|
||||
format_size,
|
||||
)
|
||||
from ...utils.logger import get_logger
|
||||
from ... import DEFAULT_INSTALL_DIR
|
||||
@ -48,68 +56,56 @@ Examples:
|
||||
SuperClaude backup --cleanup --force # Clean up old backups (forced)
|
||||
""",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
parents=parents
|
||||
parents=parents,
|
||||
)
|
||||
|
||||
# Backup operations (mutually exclusive)
|
||||
operation_group = parser.add_mutually_exclusive_group(required=True)
|
||||
|
||||
operation_group.add_argument(
|
||||
"--create",
|
||||
action="store_true",
|
||||
help="Create a new backup"
|
||||
"--create", action="store_true", help="Create a new backup"
|
||||
)
|
||||
|
||||
operation_group.add_argument(
|
||||
"--list",
|
||||
action="store_true",
|
||||
help="List available backups"
|
||||
"--list", action="store_true", help="List available backups"
|
||||
)
|
||||
|
||||
operation_group.add_argument(
|
||||
"--restore",
|
||||
nargs="?",
|
||||
const="interactive",
|
||||
help="Restore from backup (optionally specify backup file)"
|
||||
help="Restore from backup (optionally specify backup file)",
|
||||
)
|
||||
|
||||
operation_group.add_argument(
|
||||
"--info",
|
||||
type=str,
|
||||
help="Show information about a specific backup file"
|
||||
"--info", type=str, help="Show information about a specific backup file"
|
||||
)
|
||||
|
||||
operation_group.add_argument(
|
||||
"--cleanup",
|
||||
action="store_true",
|
||||
help="Clean up old backup files"
|
||||
"--cleanup", action="store_true", help="Clean up old backup files"
|
||||
)
|
||||
|
||||
# Backup options
|
||||
parser.add_argument(
|
||||
"--backup-dir",
|
||||
type=Path,
|
||||
help="Backup directory (default: <install-dir>/backups)"
|
||||
help="Backup directory (default: <install-dir>/backups)",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--name",
|
||||
type=str,
|
||||
help="Custom backup name (for --create)"
|
||||
)
|
||||
parser.add_argument("--name", type=str, help="Custom backup name (for --create)")
|
||||
|
||||
parser.add_argument(
|
||||
"--compress",
|
||||
choices=["none", "gzip", "bzip2"],
|
||||
default="gzip",
|
||||
help="Compression method (default: gzip)"
|
||||
help="Compression method (default: gzip)",
|
||||
)
|
||||
|
||||
# Restore options
|
||||
parser.add_argument(
|
||||
"--overwrite",
|
||||
action="store_true",
|
||||
help="Overwrite existing files during restore"
|
||||
help="Overwrite existing files during restore",
|
||||
)
|
||||
|
||||
# Cleanup options
|
||||
@ -117,13 +113,11 @@ Examples:
|
||||
"--keep",
|
||||
type=int,
|
||||
default=5,
|
||||
help="Number of backups to keep during cleanup (default: 5)"
|
||||
help="Number of backups to keep during cleanup (default: 5)",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--older-than",
|
||||
type=int,
|
||||
help="Remove backups older than N days"
|
||||
"--older-than", type=int, help="Remove backups older than N days"
|
||||
)
|
||||
|
||||
return parser
|
||||
@ -141,7 +135,10 @@ def check_installation_exists(install_dir: Path) -> bool:
|
||||
"""Check if SuperClaude installation (v2 included) exists"""
|
||||
settings_manager = SettingsService(install_dir)
|
||||
|
||||
return settings_manager.check_installation_exists() or settings_manager.check_v2_installation_exists()
|
||||
return (
|
||||
settings_manager.check_installation_exists()
|
||||
or settings_manager.check_v2_installation_exists()
|
||||
)
|
||||
|
||||
|
||||
def get_backup_info(backup_path: Path) -> Dict[str, Any]:
|
||||
@ -151,7 +148,7 @@ def get_backup_info(backup_path: Path) -> Dict[str, Any]:
|
||||
"exists": backup_path.exists(),
|
||||
"size": 0,
|
||||
"created": None,
|
||||
"metadata": {}
|
||||
"metadata": {},
|
||||
}
|
||||
|
||||
if not backup_path.exists():
|
||||
@ -224,7 +221,11 @@ def display_backup_list(backups: List[Dict[str, Any]]) -> None:
|
||||
for backup in backups:
|
||||
name = backup["path"].name
|
||||
size = format_size(backup["size"]) if backup["size"] > 0 else "unknown"
|
||||
created = backup["created"].strftime("%Y-%m-%d %H:%M") if backup["created"] else "unknown"
|
||||
created = (
|
||||
backup["created"].strftime("%Y-%m-%d %H:%M")
|
||||
if backup["created"]
|
||||
else "unknown"
|
||||
)
|
||||
files = str(backup.get("files", "unknown"))
|
||||
|
||||
print(f"{name:<30} {size:<10} {created:<20} {files:<8}")
|
||||
@ -234,12 +235,14 @@ def display_backup_list(backups: List[Dict[str, Any]]) -> None:
|
||||
|
||||
def create_backup_metadata(install_dir: Path) -> Dict[str, Any]:
|
||||
"""Create metadata for the backup"""
|
||||
from setup import __version__
|
||||
|
||||
metadata = {
|
||||
"backup_version": __version__,
|
||||
"created": datetime.now().isoformat(),
|
||||
"install_dir": str(install_dir),
|
||||
"components": {},
|
||||
"framework_version": "unknown"
|
||||
"framework_version": "unknown",
|
||||
}
|
||||
|
||||
try:
|
||||
@ -304,7 +307,10 @@ def create_backup(args: argparse.Namespace) -> bool:
|
||||
with tarfile.open(backup_file, mode) as tar:
|
||||
# Add metadata file
|
||||
import tempfile
|
||||
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as temp_file:
|
||||
|
||||
with tempfile.NamedTemporaryFile(
|
||||
mode="w", suffix=".json", delete=False
|
||||
) as temp_file:
|
||||
json.dump(metadata, temp_file, indent=2)
|
||||
temp_file.flush()
|
||||
tar.add(temp_file.name, arcname="backup_metadata.json")
|
||||
@ -429,7 +435,11 @@ def interactive_restore_selection(backups: List[Dict[str, Any]]) -> Optional[Pat
|
||||
for backup in backups:
|
||||
name = backup["path"].name
|
||||
size = format_size(backup["size"]) if backup["size"] > 0 else "unknown"
|
||||
created = backup["created"].strftime("%Y-%m-%d %H:%M") if backup["created"] else "unknown"
|
||||
created = (
|
||||
backup["created"].strftime("%Y-%m-%d %H:%M")
|
||||
if backup["created"]
|
||||
else "unknown"
|
||||
)
|
||||
backup_options.append(f"{name} ({size}, {created})")
|
||||
|
||||
menu = Menu("Select backup:", backup_options)
|
||||
@ -464,7 +474,7 @@ def cleanup_old_backups(backup_dir: Path, args: argparse.Namespace) -> bool:
|
||||
if args.keep and len(backups) > args.keep:
|
||||
# Sort by date and take oldest ones to remove
|
||||
backups.sort(key=lambda x: x.get("created", datetime.min), reverse=True)
|
||||
to_remove.extend(backups[args.keep:])
|
||||
to_remove.extend(backups[args.keep :])
|
||||
|
||||
# Remove duplicates
|
||||
to_remove = list({backup["path"]: backup for backup in to_remove}.values())
|
||||
@ -515,9 +525,10 @@ def run(args: argparse.Namespace) -> int:
|
||||
# Display header
|
||||
if not args.quiet:
|
||||
from setup.cli.base import __version__
|
||||
|
||||
display_header(
|
||||
f"SuperClaude Backup v{__version__}",
|
||||
"Backup and restore SuperClaude installations"
|
||||
"Backup and restore SuperClaude installations",
|
||||
)
|
||||
|
||||
backup_dir = get_backup_directory(args)
|
||||
@ -562,7 +573,9 @@ def run(args: argparse.Namespace) -> int:
|
||||
|
||||
if info["metadata"]:
|
||||
metadata = info["metadata"]
|
||||
print(f"Framework Version: {metadata.get('framework_version', 'unknown')}")
|
||||
print(
|
||||
f"Framework Version: {metadata.get('framework_version', 'unknown')}"
|
||||
)
|
||||
if metadata.get("components"):
|
||||
print("Components:")
|
||||
for comp, ver in metadata["components"].items():
|
||||
|
||||
@ -15,8 +15,17 @@ from ...core.registry import ComponentRegistry
|
||||
from ...services.config import ConfigService
|
||||
from ...core.validator import Validator
|
||||
from ...utils.ui import (
|
||||
display_header, display_info, display_success, display_error,
|
||||
display_warning, Menu, confirm, ProgressBar, Colors, format_size, prompt_api_key
|
||||
display_header,
|
||||
display_info,
|
||||
display_success,
|
||||
display_error,
|
||||
display_warning,
|
||||
Menu,
|
||||
confirm,
|
||||
ProgressBar,
|
||||
Colors,
|
||||
format_size,
|
||||
prompt_api_key,
|
||||
)
|
||||
from ...utils.environment import setup_environment_variables
|
||||
from ...utils.logger import get_logger
|
||||
@ -47,41 +56,36 @@ Examples:
|
||||
SuperClaude install --verbose --force # Verbose with force mode
|
||||
""",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
parents=parents
|
||||
parents=parents,
|
||||
)
|
||||
|
||||
# Installation mode options
|
||||
|
||||
parser.add_argument(
|
||||
"--components",
|
||||
type=str,
|
||||
nargs="+",
|
||||
help="Specific components to install"
|
||||
"--components", type=str, nargs="+", help="Specific components to install"
|
||||
)
|
||||
|
||||
# Installation options
|
||||
parser.add_argument(
|
||||
"--no-backup",
|
||||
action="store_true",
|
||||
help="Skip backup creation"
|
||||
)
|
||||
parser.add_argument("--no-backup", action="store_true", help="Skip backup creation")
|
||||
|
||||
parser.add_argument(
|
||||
"--list-components",
|
||||
action="store_true",
|
||||
help="List available components and exit"
|
||||
help="List available components and exit",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--diagnose",
|
||||
action="store_true",
|
||||
help="Run system diagnostics and show installation help"
|
||||
help="Run system diagnostics and show installation help",
|
||||
)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
def validate_system_requirements(validator: Validator, component_names: List[str]) -> bool:
|
||||
def validate_system_requirements(
|
||||
validator: Validator, component_names: List[str]
|
||||
) -> bool:
|
||||
"""Validate system requirements"""
|
||||
logger = get_logger()
|
||||
|
||||
@ -93,7 +97,9 @@ def validate_system_requirements(validator: Validator, component_names: List[str
|
||||
requirements = config_manager.get_requirements_for_components(component_names)
|
||||
|
||||
# Validate requirements
|
||||
success, errors = validator.validate_component_requirements(component_names, requirements)
|
||||
success, errors = validator.validate_component_requirements(
|
||||
component_names, requirements
|
||||
)
|
||||
|
||||
if success:
|
||||
logger.success("All system requirements met")
|
||||
@ -105,7 +111,9 @@ def validate_system_requirements(validator: Validator, component_names: List[str
|
||||
|
||||
# Provide additional guidance
|
||||
print(f"\n{Colors.CYAN}💡 Installation Help:{Colors.RESET}")
|
||||
print(" Run 'SuperClaude install --diagnose' for detailed system diagnostics")
|
||||
print(
|
||||
" Run 'superclaude install --diagnose' for detailed system diagnostics"
|
||||
)
|
||||
print(" and step-by-step installation instructions.")
|
||||
|
||||
return False
|
||||
@ -115,37 +123,45 @@ def validate_system_requirements(validator: Validator, component_names: List[str
|
||||
return False
|
||||
|
||||
|
||||
def get_components_to_install(args: argparse.Namespace, registry: ComponentRegistry, config_manager: ConfigService) -> Optional[List[str]]:
|
||||
def get_components_to_install(
|
||||
args: argparse.Namespace, registry: ComponentRegistry, config_manager: ConfigService
|
||||
) -> Optional[List[str]]:
|
||||
"""Determine which components to install"""
|
||||
logger = get_logger()
|
||||
|
||||
# Explicit components specified
|
||||
if args.components:
|
||||
if 'all' in args.components:
|
||||
if "all" in args.components:
|
||||
components = ["core", "commands", "agents", "modes", "mcp", "mcp_docs"]
|
||||
else:
|
||||
components = args.components
|
||||
|
||||
# If mcp or mcp_docs is specified non-interactively, we should still ask which servers to install.
|
||||
if 'mcp' in components or 'mcp_docs' in components:
|
||||
if "mcp" in components or "mcp_docs" in components:
|
||||
selected_servers = select_mcp_servers(registry)
|
||||
if not hasattr(config_manager, '_installation_context'):
|
||||
if not hasattr(config_manager, "_installation_context"):
|
||||
config_manager._installation_context = {}
|
||||
config_manager._installation_context["selected_mcp_servers"] = selected_servers
|
||||
config_manager._installation_context["selected_mcp_servers"] = (
|
||||
selected_servers
|
||||
)
|
||||
|
||||
# If the user selected some servers, ensure both mcp and mcp_docs are included
|
||||
if selected_servers:
|
||||
if 'mcp' not in components:
|
||||
components.append('mcp')
|
||||
logger.debug(f"Auto-added 'mcp' component for selected servers: {selected_servers}")
|
||||
if 'mcp_docs' not in components:
|
||||
components.append('mcp_docs')
|
||||
logger.debug(f"Auto-added 'mcp_docs' component for selected servers: {selected_servers}")
|
||||
if "mcp" not in components:
|
||||
components.append("mcp")
|
||||
logger.debug(
|
||||
f"Auto-added 'mcp' component for selected servers: {selected_servers}"
|
||||
)
|
||||
if "mcp_docs" not in components:
|
||||
components.append("mcp_docs")
|
||||
logger.debug(
|
||||
f"Auto-added 'mcp_docs' component for selected servers: {selected_servers}"
|
||||
)
|
||||
|
||||
logger.info(f"Final components to install: {components}")
|
||||
|
||||
# If mcp_docs was explicitly requested but no servers selected, allow auto-detection
|
||||
elif not selected_servers and 'mcp_docs' in components:
|
||||
elif not selected_servers and "mcp_docs" in components:
|
||||
logger.info("mcp_docs component will auto-detect existing MCP servers")
|
||||
logger.info("Documentation will be installed for any detected servers")
|
||||
|
||||
@ -155,7 +171,9 @@ def get_components_to_install(args: argparse.Namespace, registry: ComponentRegis
|
||||
return interactive_component_selection(registry, config_manager)
|
||||
|
||||
|
||||
def collect_api_keys_for_servers(selected_servers: List[str], mcp_instance) -> Dict[str, str]:
|
||||
def collect_api_keys_for_servers(
|
||||
selected_servers: List[str], mcp_instance
|
||||
) -> Dict[str, str]:
|
||||
"""
|
||||
Collect API keys for servers that require them
|
||||
|
||||
@ -170,8 +188,8 @@ def collect_api_keys_for_servers(selected_servers: List[str], mcp_instance) -> D
|
||||
servers_needing_keys = [
|
||||
(server_key, mcp_instance.mcp_servers[server_key])
|
||||
for server_key in selected_servers
|
||||
if server_key in mcp_instance.mcp_servers and
|
||||
mcp_instance.mcp_servers[server_key].get("requires_api_key", False)
|
||||
if server_key in mcp_instance.mcp_servers
|
||||
and mcp_instance.mcp_servers[server_key].get("requires_api_key", False)
|
||||
]
|
||||
|
||||
if not servers_needing_keys:
|
||||
@ -179,7 +197,9 @@ def collect_api_keys_for_servers(selected_servers: List[str], mcp_instance) -> D
|
||||
|
||||
# Display API key configuration header
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}=== API Key Configuration ==={Colors.RESET}")
|
||||
print(f"{Colors.YELLOW}The following servers require API keys for full functionality:{Colors.RESET}\n")
|
||||
print(
|
||||
f"{Colors.YELLOW}The following servers require API keys for full functionality:{Colors.RESET}\n"
|
||||
)
|
||||
|
||||
collected_keys = {}
|
||||
for server_key, server_info in servers_needing_keys:
|
||||
@ -200,8 +220,10 @@ def select_mcp_servers(registry: ComponentRegistry) -> List[str]:
|
||||
|
||||
try:
|
||||
# Get MCP component to access server list
|
||||
mcp_instance = registry.get_component_instance("mcp", get_home_directory() / ".claude")
|
||||
if not mcp_instance or not hasattr(mcp_instance, 'mcp_servers'):
|
||||
mcp_instance = registry.get_component_instance(
|
||||
"mcp", get_home_directory() / ".claude"
|
||||
)
|
||||
if not mcp_instance or not hasattr(mcp_instance, "mcp_servers"):
|
||||
logger.error("Could not access MCP server information")
|
||||
return []
|
||||
|
||||
@ -211,19 +233,31 @@ def select_mcp_servers(registry: ComponentRegistry) -> List[str]:
|
||||
|
||||
for server_key, server_info in mcp_servers.items():
|
||||
description = server_info["description"]
|
||||
api_key_note = " (requires API key)" if server_info.get("requires_api_key", False) else ""
|
||||
api_key_note = (
|
||||
" (requires API key)"
|
||||
if server_info.get("requires_api_key", False)
|
||||
else ""
|
||||
)
|
||||
server_options.append(f"{server_key} - {description}{api_key_note}")
|
||||
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}{'='*51}{Colors.RESET}")
|
||||
print(f"{Colors.CYAN}{Colors.BRIGHT}Stage 1: MCP Server Selection (Optional){Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.CYAN}{Colors.BRIGHT}Stage 1: MCP Server Selection (Optional){Colors.RESET}"
|
||||
)
|
||||
print(f"{Colors.CYAN}{Colors.BRIGHT}{'='*51}{Colors.RESET}")
|
||||
print(f"\n{Colors.BLUE}MCP servers extend Claude Code with specialized capabilities.{Colors.RESET}")
|
||||
print(f"{Colors.BLUE}Select servers to configure (you can always add more later):{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.BLUE}MCP servers extend Claude Code with specialized capabilities.{Colors.RESET}"
|
||||
)
|
||||
print(
|
||||
f"{Colors.BLUE}Select servers to configure (you can always add more later):{Colors.RESET}"
|
||||
)
|
||||
|
||||
# Add option to skip MCP
|
||||
server_options.append("Skip MCP Server installation")
|
||||
|
||||
menu = Menu("Select MCP servers to configure:", server_options, multi_select=True)
|
||||
menu = Menu(
|
||||
"Select MCP servers to configure:", server_options, multi_select=True
|
||||
)
|
||||
selections = menu.display()
|
||||
|
||||
if not selections:
|
||||
@ -242,7 +276,9 @@ def select_mcp_servers(registry: ComponentRegistry) -> List[str]:
|
||||
logger.info(f"Selected MCP servers: {', '.join(selected_servers)}")
|
||||
|
||||
# NEW: Collect API keys for selected servers
|
||||
collected_keys = collect_api_keys_for_servers(selected_servers, mcp_instance)
|
||||
collected_keys = collect_api_keys_for_servers(
|
||||
selected_servers, mcp_instance
|
||||
)
|
||||
|
||||
# Set up environment variables
|
||||
if collected_keys:
|
||||
@ -260,7 +296,11 @@ def select_mcp_servers(registry: ComponentRegistry) -> List[str]:
|
||||
return []
|
||||
|
||||
|
||||
def select_framework_components(registry: ComponentRegistry, config_manager: ConfigService, selected_mcp_servers: List[str]) -> List[str]:
|
||||
def select_framework_components(
|
||||
registry: ComponentRegistry,
|
||||
config_manager: ConfigService,
|
||||
selected_mcp_servers: List[str],
|
||||
) -> List[str]:
|
||||
"""Stage 2: Framework Component Selection"""
|
||||
logger = get_logger()
|
||||
|
||||
@ -285,15 +325,25 @@ def select_framework_components(registry: ComponentRegistry, config_manager: Con
|
||||
component_options.append(f"mcp_docs - {mcp_docs_desc}")
|
||||
auto_selected_mcp_docs = True
|
||||
else:
|
||||
component_options.append("mcp_docs - MCP server documentation (none selected)")
|
||||
component_options.append(
|
||||
"mcp_docs - MCP server documentation (none selected)"
|
||||
)
|
||||
auto_selected_mcp_docs = False
|
||||
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}{'='*51}{Colors.RESET}")
|
||||
print(f"{Colors.CYAN}{Colors.BRIGHT}Stage 2: Framework Component Selection{Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.CYAN}{Colors.BRIGHT}Stage 2: Framework Component Selection{Colors.RESET}"
|
||||
)
|
||||
print(f"{Colors.CYAN}{Colors.BRIGHT}{'='*51}{Colors.RESET}")
|
||||
print(f"\n{Colors.BLUE}Select SuperClaude framework components to install:{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.BLUE}Select SuperClaude framework components to install:{Colors.RESET}"
|
||||
)
|
||||
|
||||
menu = Menu("Select components (Core is recommended):", component_options, multi_select=True)
|
||||
menu = Menu(
|
||||
"Select components (Core is recommended):",
|
||||
component_options,
|
||||
multi_select=True,
|
||||
)
|
||||
selections = menu.display()
|
||||
|
||||
if not selections:
|
||||
@ -329,24 +379,32 @@ def select_framework_components(registry: ComponentRegistry, config_manager: Con
|
||||
return ["core"] # Fallback to core
|
||||
|
||||
|
||||
def interactive_component_selection(registry: ComponentRegistry, config_manager: ConfigService) -> Optional[List[str]]:
|
||||
def interactive_component_selection(
|
||||
registry: ComponentRegistry, config_manager: ConfigService
|
||||
) -> Optional[List[str]]:
|
||||
"""Two-stage interactive component selection"""
|
||||
logger = get_logger()
|
||||
|
||||
try:
|
||||
print(f"\n{Colors.CYAN}SuperClaude Interactive Installation{Colors.RESET}")
|
||||
print(f"{Colors.BLUE}Select components to install using the two-stage process:{Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.BLUE}Select components to install using the two-stage process:{Colors.RESET}"
|
||||
)
|
||||
|
||||
# Stage 1: MCP Server Selection
|
||||
selected_mcp_servers = select_mcp_servers(registry)
|
||||
|
||||
# Stage 2: Framework Component Selection
|
||||
selected_components = select_framework_components(registry, config_manager, selected_mcp_servers)
|
||||
selected_components = select_framework_components(
|
||||
registry, config_manager, selected_mcp_servers
|
||||
)
|
||||
|
||||
# Store selected MCP servers for components to use
|
||||
if not hasattr(config_manager, '_installation_context'):
|
||||
if not hasattr(config_manager, "_installation_context"):
|
||||
config_manager._installation_context = {}
|
||||
config_manager._installation_context["selected_mcp_servers"] = selected_mcp_servers
|
||||
config_manager._installation_context["selected_mcp_servers"] = (
|
||||
selected_mcp_servers
|
||||
)
|
||||
|
||||
return selected_components
|
||||
|
||||
@ -355,7 +413,9 @@ def interactive_component_selection(registry: ComponentRegistry, config_manager:
|
||||
return None
|
||||
|
||||
|
||||
def display_installation_plan(components: List[str], registry: ComponentRegistry, install_dir: Path) -> None:
|
||||
def display_installation_plan(
|
||||
components: List[str], registry: ComponentRegistry, install_dir: Path
|
||||
) -> None:
|
||||
"""Display installation plan"""
|
||||
logger = get_logger()
|
||||
|
||||
@ -378,8 +438,10 @@ def display_installation_plan(components: List[str], registry: ComponentRegistry
|
||||
|
||||
# Get size estimate if component supports it
|
||||
try:
|
||||
instance = registry.get_component_instance(component_name, install_dir)
|
||||
if instance and hasattr(instance, 'get_size_estimate'):
|
||||
instance = registry.get_component_instance(
|
||||
component_name, install_dir
|
||||
)
|
||||
if instance and hasattr(instance, "get_size_estimate"):
|
||||
size = instance.get_size_estimate()
|
||||
total_size += size
|
||||
except Exception:
|
||||
@ -388,7 +450,9 @@ def display_installation_plan(components: List[str], registry: ComponentRegistry
|
||||
print(f" {i}. {component_name} - Unknown component")
|
||||
|
||||
if total_size > 0:
|
||||
print(f"\n{Colors.BLUE}Estimated size:{Colors.RESET} {format_size(total_size)}")
|
||||
print(
|
||||
f"\n{Colors.BLUE}Estimated size:{Colors.RESET} {format_size(total_size)}"
|
||||
)
|
||||
|
||||
print()
|
||||
|
||||
@ -414,43 +478,53 @@ def run_system_diagnostics(validator: Validator) -> None:
|
||||
print(f"\n{Colors.BLUE}System Checks:{Colors.RESET}")
|
||||
all_passed = True
|
||||
|
||||
for check_name, check_info in diagnostics['checks'].items():
|
||||
status = check_info['status']
|
||||
message = check_info['message']
|
||||
for check_name, check_info in diagnostics["checks"].items():
|
||||
status = check_info["status"]
|
||||
message = check_info["message"]
|
||||
|
||||
if status == 'pass':
|
||||
if status == "pass":
|
||||
print(f" ✅ {check_name}: {message}")
|
||||
else:
|
||||
print(f" ❌ {check_name}: {message}")
|
||||
all_passed = False
|
||||
|
||||
# Display issues and recommendations
|
||||
if diagnostics['issues']:
|
||||
if diagnostics["issues"]:
|
||||
print(f"\n{Colors.YELLOW}Issues Found:{Colors.RESET}")
|
||||
for issue in diagnostics['issues']:
|
||||
for issue in diagnostics["issues"]:
|
||||
print(f" ⚠️ {issue}")
|
||||
|
||||
print(f"\n{Colors.CYAN}Recommendations:{Colors.RESET}")
|
||||
for recommendation in diagnostics['recommendations']:
|
||||
for recommendation in diagnostics["recommendations"]:
|
||||
print(recommendation)
|
||||
|
||||
# Summary
|
||||
if all_passed:
|
||||
print(f"\n{Colors.GREEN}✅ All system checks passed! Your system is ready for SuperClaude.{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.GREEN}✅ All system checks passed! Your system is ready for superclaude.{Colors.RESET}"
|
||||
)
|
||||
else:
|
||||
print(f"\n{Colors.YELLOW}⚠️ Some issues found. Please address the recommendations above.{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.YELLOW}⚠️ Some issues found. Please address the recommendations above.{Colors.RESET}"
|
||||
)
|
||||
|
||||
print(f"\n{Colors.BLUE}Next steps:{Colors.RESET}")
|
||||
if all_passed:
|
||||
print(" 1. Run 'SuperClaude install' to proceed with installation")
|
||||
print(" 2. Choose your preferred installation mode (quick, minimal, or custom)")
|
||||
print(" 1. Run 'superclaude install' to proceed with installation")
|
||||
print(
|
||||
" 2. Choose your preferred installation mode (quick, minimal, or custom)"
|
||||
)
|
||||
else:
|
||||
print(" 1. Install missing dependencies using the commands above")
|
||||
print(" 2. Restart your terminal after installing tools")
|
||||
print(" 3. Run 'SuperClaude install --diagnose' again to verify")
|
||||
print(" 3. Run 'superclaude install --diagnose' again to verify")
|
||||
|
||||
|
||||
def perform_installation(components: List[str], args: argparse.Namespace, config_manager: ConfigService = None) -> bool:
|
||||
def perform_installation(
|
||||
components: List[str],
|
||||
args: argparse.Namespace,
|
||||
config_manager: ConfigService = None,
|
||||
) -> bool:
|
||||
"""Perform the actual installation"""
|
||||
logger = get_logger()
|
||||
start_time = time.time()
|
||||
@ -464,7 +538,9 @@ def perform_installation(components: List[str], args: argparse.Namespace, config
|
||||
registry.discover_components()
|
||||
|
||||
# Create component instances
|
||||
component_instances = registry.create_component_instances(components, args.install_dir)
|
||||
component_instances = registry.create_component_instances(
|
||||
components, args.install_dir
|
||||
)
|
||||
|
||||
if not component_instances:
|
||||
logger.error("No valid component instances created")
|
||||
@ -478,9 +554,7 @@ def perform_installation(components: List[str], args: argparse.Namespace, config
|
||||
|
||||
# Setup progress tracking
|
||||
progress = ProgressBar(
|
||||
total=len(ordered_components),
|
||||
prefix="Installing: ",
|
||||
suffix=""
|
||||
total=len(ordered_components), prefix="Installing: ", suffix=""
|
||||
)
|
||||
|
||||
# Install components
|
||||
@ -490,7 +564,9 @@ def perform_installation(components: List[str], args: argparse.Namespace, config
|
||||
"force": args.force,
|
||||
"backup": not args.no_backup,
|
||||
"dry_run": args.dry_run,
|
||||
"selected_mcp_servers": getattr(config_manager, '_installation_context', {}).get("selected_mcp_servers", [])
|
||||
"selected_mcp_servers": getattr(
|
||||
config_manager, "_installation_context", {}
|
||||
).get("selected_mcp_servers", []),
|
||||
}
|
||||
|
||||
success = installer.install_components(ordered_components, config)
|
||||
@ -509,21 +585,25 @@ def perform_installation(components: List[str], args: argparse.Namespace, config
|
||||
duration = time.time() - start_time
|
||||
|
||||
if success:
|
||||
logger.success(f"Installation completed successfully in {duration:.1f} seconds")
|
||||
logger.success(
|
||||
f"Installation completed successfully in {duration:.1f} seconds"
|
||||
)
|
||||
|
||||
# Show summary
|
||||
summary = installer.get_installation_summary()
|
||||
if summary['installed']:
|
||||
if summary["installed"]:
|
||||
logger.info(f"Installed components: {', '.join(summary['installed'])}")
|
||||
|
||||
if summary['backup_path']:
|
||||
if summary["backup_path"]:
|
||||
logger.info(f"Backup created: {summary['backup_path']}")
|
||||
|
||||
else:
|
||||
logger.error(f"Installation completed with errors in {duration:.1f} seconds")
|
||||
logger.error(
|
||||
f"Installation completed with errors in {duration:.1f} seconds"
|
||||
)
|
||||
|
||||
summary = installer.get_installation_summary()
|
||||
if summary['failed']:
|
||||
if summary["failed"]:
|
||||
logger.error(f"Failed components: {', '.join(summary['failed'])}")
|
||||
|
||||
return success
|
||||
@ -556,8 +636,8 @@ def run(args: argparse.Namespace) -> int:
|
||||
home_parts = expected_home.parts
|
||||
|
||||
# Skip home directory parts
|
||||
if len(parts) >= len(home_parts) and parts[:len(home_parts)] == home_parts:
|
||||
relative_parts = parts[len(home_parts):]
|
||||
if len(parts) >= len(home_parts) and parts[: len(home_parts)] == home_parts:
|
||||
relative_parts = parts[len(home_parts) :]
|
||||
|
||||
for part in relative_parts:
|
||||
current_path = current_path / part
|
||||
@ -587,9 +667,10 @@ def run(args: argparse.Namespace) -> int:
|
||||
# Display header
|
||||
if not args.quiet:
|
||||
from setup.cli.base import __version__
|
||||
|
||||
display_header(
|
||||
f"SuperClaude Installation v{__version__}",
|
||||
"Installing SuperClaude framework components"
|
||||
"Installing SuperClaude framework components",
|
||||
)
|
||||
|
||||
# Handle special modes
|
||||
@ -636,7 +717,9 @@ def run(args: argparse.Namespace) -> int:
|
||||
return 1
|
||||
|
||||
# Get components to install
|
||||
components_to_install = get_components_to_install(args, registry, config_manager)
|
||||
components_to_install = get_components_to_install(
|
||||
args, registry, config_manager
|
||||
)
|
||||
if not components_to_install:
|
||||
logger.error("No components selected for installation")
|
||||
return 1
|
||||
@ -654,13 +737,19 @@ def run(args: argparse.Namespace) -> int:
|
||||
logger.error("System requirements not met. Use --force to override.")
|
||||
return 1
|
||||
else:
|
||||
logger.warning("System requirements not met, but continuing due to --force flag")
|
||||
logger.warning(
|
||||
"System requirements not met, but continuing due to --force flag"
|
||||
)
|
||||
|
||||
# Check for existing installation
|
||||
if args.install_dir.exists() and not args.force:
|
||||
if not args.dry_run:
|
||||
logger.warning(f"Installation directory already exists: {args.install_dir}")
|
||||
if not args.yes and not confirm("Continue and update existing installation?", default=False):
|
||||
logger.warning(
|
||||
f"Installation directory already exists: {args.install_dir}"
|
||||
)
|
||||
if not args.yes and not confirm(
|
||||
"Continue and update existing installation?", default=False
|
||||
):
|
||||
logger.info("Installation cancelled by user")
|
||||
return 0
|
||||
|
||||
@ -669,7 +758,9 @@ def run(args: argparse.Namespace) -> int:
|
||||
display_installation_plan(resolved_components, registry, args.install_dir)
|
||||
|
||||
if not args.dry_run:
|
||||
if not args.yes and not confirm("Proceed with installation?", default=True):
|
||||
if not args.yes and not confirm(
|
||||
"Proceed with installation?", default=True
|
||||
):
|
||||
logger.info("Installation cancelled by user")
|
||||
return 0
|
||||
|
||||
|
||||
@ -14,10 +14,20 @@ from ...core.registry import ComponentRegistry
|
||||
from ...services.settings import SettingsService
|
||||
from ...services.files import FileService
|
||||
from ...utils.ui import (
|
||||
display_header, display_info, display_success, display_error,
|
||||
display_warning, Menu, confirm, ProgressBar, Colors
|
||||
display_header,
|
||||
display_info,
|
||||
display_success,
|
||||
display_error,
|
||||
display_warning,
|
||||
Menu,
|
||||
confirm,
|
||||
ProgressBar,
|
||||
Colors,
|
||||
)
|
||||
from ...utils.environment import (
|
||||
get_superclaude_environment_variables,
|
||||
cleanup_environment_variables,
|
||||
)
|
||||
from ...utils.environment import get_superclaude_environment_variables, cleanup_environment_variables
|
||||
from ...utils.logger import get_logger
|
||||
from ... import DEFAULT_INSTALL_DIR, PROJECT_ROOT
|
||||
from . import OperationBase
|
||||
@ -37,33 +47,51 @@ def verify_superclaude_file(file_path: Path, component: str) -> bool:
|
||||
try:
|
||||
# Known SuperClaude file patterns by component
|
||||
superclaude_patterns = {
|
||||
'core': [
|
||||
'CLAUDE.md', 'FLAGS.md', 'PRINCIPLES.md', 'RULES.md',
|
||||
'ORCHESTRATOR.md', 'SESSION_LIFECYCLE.md'
|
||||
"core": [
|
||||
"CLAUDE.md",
|
||||
"FLAGS.md",
|
||||
"PRINCIPLES.md",
|
||||
"RULES.md",
|
||||
"ORCHESTRATOR.md",
|
||||
"SESSION_LIFECYCLE.md",
|
||||
],
|
||||
'commands': [
|
||||
"commands": [
|
||||
# Commands are only in sc/ subdirectory
|
||||
],
|
||||
'agents': [
|
||||
'backend-engineer.md', 'brainstorm-PRD.md', 'code-educator.md',
|
||||
'code-refactorer.md', 'devops-engineer.md', 'frontend-specialist.md',
|
||||
'performance-optimizer.md', 'python-ultimate-expert.md', 'qa-specialist.md',
|
||||
'root-cause-analyzer.md', 'security-auditor.md', 'system-architect.md',
|
||||
'technical-writer.md'
|
||||
"agents": [
|
||||
"backend-engineer.md",
|
||||
"brainstorm-PRD.md",
|
||||
"code-educator.md",
|
||||
"code-refactorer.md",
|
||||
"devops-engineer.md",
|
||||
"frontend-specialist.md",
|
||||
"performance-optimizer.md",
|
||||
"python-ultimate-expert.md",
|
||||
"qa-specialist.md",
|
||||
"root-cause-analyzer.md",
|
||||
"security-auditor.md",
|
||||
"system-architect.md",
|
||||
"technical-writer.md",
|
||||
],
|
||||
'modes': [
|
||||
'MODE_Brainstorming.md', 'MODE_Introspection.md',
|
||||
'MODE_Task_Management.md', 'MODE_Token_Efficiency.md'
|
||||
"modes": [
|
||||
"MODE_Brainstorming.md",
|
||||
"MODE_Introspection.md",
|
||||
"MODE_Task_Management.md",
|
||||
"MODE_Token_Efficiency.md",
|
||||
],
|
||||
"mcp_docs": [
|
||||
"MCP_Context7.md",
|
||||
"MCP_Sequential.md",
|
||||
"MCP_Magic.md",
|
||||
"MCP_Playwright.md",
|
||||
"MCP_Morphllm.md",
|
||||
"MCP_Serena.md",
|
||||
],
|
||||
'mcp_docs': [
|
||||
'MCP_Context7.md', 'MCP_Sequential.md', 'MCP_Magic.md',
|
||||
'MCP_Playwright.md', 'MCP_Morphllm.md', 'MCP_Serena.md'
|
||||
]
|
||||
}
|
||||
|
||||
# For commands component, verify it's in the sc/ subdirectory
|
||||
if component == 'commands':
|
||||
return 'commands/sc/' in str(file_path)
|
||||
if component == "commands":
|
||||
return "commands/sc/" in str(file_path)
|
||||
|
||||
# For other components, check against known file lists
|
||||
if component in superclaude_patterns:
|
||||
@ -71,7 +99,7 @@ def verify_superclaude_file(file_path: Path, component: str) -> bool:
|
||||
return filename in superclaude_patterns[component]
|
||||
|
||||
# For MCP component, it doesn't remove files but modifies .claude.json
|
||||
if component == 'mcp':
|
||||
if component == "mcp":
|
||||
return True # MCP component has its own safety logic
|
||||
|
||||
# Default to preserve if uncertain
|
||||
@ -141,64 +169,58 @@ Examples:
|
||||
SuperClaude uninstall --keep-backups # Keep backup files
|
||||
""",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
parents=parents
|
||||
parents=parents,
|
||||
)
|
||||
|
||||
# Uninstall mode options
|
||||
parser.add_argument(
|
||||
"--components",
|
||||
type=str,
|
||||
nargs="+",
|
||||
help="Specific components to uninstall"
|
||||
"--components", type=str, nargs="+", help="Specific components to uninstall"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--complete",
|
||||
action="store_true",
|
||||
help="Complete uninstall (remove all files and directories)"
|
||||
help="Complete uninstall (remove all files and directories)",
|
||||
)
|
||||
|
||||
# Data preservation options
|
||||
parser.add_argument(
|
||||
"--keep-backups",
|
||||
action="store_true",
|
||||
help="Keep backup files during uninstall"
|
||||
"--keep-backups", action="store_true", help="Keep backup files during uninstall"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--keep-logs",
|
||||
action="store_true",
|
||||
help="Keep log files during uninstall"
|
||||
"--keep-logs", action="store_true", help="Keep log files during uninstall"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--keep-settings",
|
||||
action="store_true",
|
||||
help="Keep user settings during uninstall"
|
||||
help="Keep user settings during uninstall",
|
||||
)
|
||||
|
||||
# Safety options
|
||||
parser.add_argument(
|
||||
"--no-confirm",
|
||||
action="store_true",
|
||||
help="Skip confirmation prompts (use with caution)"
|
||||
help="Skip confirmation prompts (use with caution)",
|
||||
)
|
||||
|
||||
# Environment cleanup options
|
||||
parser.add_argument(
|
||||
"--cleanup-env",
|
||||
action="store_true",
|
||||
help="Remove SuperClaude environment variables"
|
||||
help="Remove SuperClaude environment variables",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--no-restore-script",
|
||||
action="store_true",
|
||||
help="Skip creating environment variable restore script"
|
||||
help="Skip creating environment variable restore script",
|
||||
)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
def get_installed_components(install_dir: Path) -> Dict[str, Dict[str, Any]]:
|
||||
"""Get currently installed components and their versions"""
|
||||
try:
|
||||
@ -216,7 +238,7 @@ def get_installation_info(install_dir: Path) -> Dict[str, Any]:
|
||||
"components": {},
|
||||
"directories": [],
|
||||
"files": [],
|
||||
"total_size": 0
|
||||
"total_size": 0,
|
||||
}
|
||||
|
||||
if not install_dir.exists():
|
||||
@ -246,15 +268,21 @@ def display_environment_info() -> Dict[str, str]:
|
||||
if env_vars:
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Environment Variables{Colors.RESET}")
|
||||
print("=" * 50)
|
||||
print(f"{Colors.BLUE}SuperClaude API key environment variables found:{Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.BLUE}SuperClaude API key environment variables found:{Colors.RESET}"
|
||||
)
|
||||
for env_var, value in env_vars.items():
|
||||
# Show only first few and last few characters for security
|
||||
masked_value = f"{value[:4]}...{value[-4:]}" if len(value) > 8 else "***"
|
||||
print(f" {env_var}: {masked_value}")
|
||||
|
||||
print(f"\n{Colors.YELLOW}Note: These environment variables will remain unless you use --cleanup-env{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.YELLOW}Note: These environment variables will remain unless you use --cleanup-env{Colors.RESET}"
|
||||
)
|
||||
else:
|
||||
print(f"\n{Colors.GREEN}No SuperClaude environment variables found{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.GREEN}No SuperClaude environment variables found{Colors.RESET}"
|
||||
)
|
||||
|
||||
return env_vars
|
||||
|
||||
@ -280,12 +308,17 @@ def display_uninstall_info(info: Dict[str, Any]) -> None:
|
||||
|
||||
if info["total_size"] > 0:
|
||||
from ...utils.ui import format_size
|
||||
print(f"{Colors.BLUE}Total Size:{Colors.RESET} {format_size(info['total_size'])}")
|
||||
|
||||
print(
|
||||
f"{Colors.BLUE}Total Size:{Colors.RESET} {format_size(info['total_size'])}"
|
||||
)
|
||||
|
||||
print()
|
||||
|
||||
|
||||
def get_components_to_uninstall(args: argparse.Namespace, installed_components: Dict[str, str]) -> Optional[List[str]]:
|
||||
def get_components_to_uninstall(
|
||||
args: argparse.Namespace, installed_components: Dict[str, str]
|
||||
) -> Optional[List[str]]:
|
||||
"""Determine which components to uninstall"""
|
||||
logger = get_logger()
|
||||
|
||||
@ -296,7 +329,9 @@ def get_components_to_uninstall(args: argparse.Namespace, installed_components:
|
||||
# Explicit components specified
|
||||
if args.components:
|
||||
# Validate that specified components are installed
|
||||
invalid_components = [c for c in args.components if c not in installed_components]
|
||||
invalid_components = [
|
||||
c for c in args.components if c not in installed_components
|
||||
]
|
||||
if invalid_components:
|
||||
logger.error(f"Components not installed: {invalid_components}")
|
||||
return None
|
||||
@ -306,7 +341,9 @@ def get_components_to_uninstall(args: argparse.Namespace, installed_components:
|
||||
return interactive_uninstall_selection(installed_components)
|
||||
|
||||
|
||||
def interactive_component_selection(installed_components: Dict[str, str], env_vars: Dict[str, str]) -> Optional[tuple]:
|
||||
def interactive_component_selection(
|
||||
installed_components: Dict[str, str], env_vars: Dict[str, str]
|
||||
) -> Optional[tuple]:
|
||||
"""
|
||||
Enhanced interactive selection with granular component options
|
||||
|
||||
@ -323,7 +360,7 @@ def interactive_component_selection(installed_components: Dict[str, str], env_va
|
||||
main_options = [
|
||||
"Complete Uninstall (remove all SuperClaude components)",
|
||||
"Custom Uninstall (choose specific components)",
|
||||
"Cancel Uninstall"
|
||||
"Cancel Uninstall",
|
||||
]
|
||||
|
||||
print(f"\n{Colors.BLUE}Choose uninstall type:{Colors.RESET}")
|
||||
@ -345,9 +382,9 @@ def interactive_component_selection(installed_components: Dict[str, str], env_va
|
||||
def _ask_complete_uninstall_options(env_vars: Dict[str, str]) -> Dict[str, bool]:
|
||||
"""Ask for complete uninstall options"""
|
||||
cleanup_options = {
|
||||
'remove_mcp_configs': True,
|
||||
'cleanup_env_vars': False,
|
||||
'create_restore_script': True
|
||||
"remove_mcp_configs": True,
|
||||
"cleanup_env_vars": False,
|
||||
"create_restore_script": True,
|
||||
}
|
||||
|
||||
print(f"\n{Colors.YELLOW}{Colors.BRIGHT}Complete Uninstall Options{Colors.RESET}")
|
||||
@ -359,19 +396,27 @@ def _ask_complete_uninstall_options(env_vars: Dict[str, str]) -> Dict[str, bool]
|
||||
masked_value = f"{value[:4]}...{value[-4:]}" if len(value) > 8 else "***"
|
||||
print(f" {env_var}: {masked_value}")
|
||||
|
||||
cleanup_env = confirm("Also remove API key environment variables?", default=False)
|
||||
cleanup_options['cleanup_env_vars'] = cleanup_env
|
||||
cleanup_env = confirm(
|
||||
"Also remove API key environment variables?", default=False
|
||||
)
|
||||
cleanup_options["cleanup_env_vars"] = cleanup_env
|
||||
|
||||
if cleanup_env:
|
||||
create_script = confirm("Create restore script for environment variables?", default=True)
|
||||
cleanup_options['create_restore_script'] = create_script
|
||||
create_script = confirm(
|
||||
"Create restore script for environment variables?", default=True
|
||||
)
|
||||
cleanup_options["create_restore_script"] = create_script
|
||||
|
||||
return cleanup_options
|
||||
|
||||
|
||||
def _custom_component_selection(installed_components: Dict[str, str], env_vars: Dict[str, str]) -> Optional[tuple]:
|
||||
def _custom_component_selection(
|
||||
installed_components: Dict[str, str], env_vars: Dict[str, str]
|
||||
) -> Optional[tuple]:
|
||||
"""Handle custom component selection with granular options"""
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Custom Uninstall - Choose Components{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.CYAN}{Colors.BRIGHT}Custom Uninstall - Choose Components{Colors.RESET}"
|
||||
)
|
||||
print("Select which SuperClaude components to remove:")
|
||||
|
||||
# Build component options with descriptions
|
||||
@ -379,12 +424,12 @@ def _custom_component_selection(installed_components: Dict[str, str], env_vars:
|
||||
component_keys = []
|
||||
|
||||
component_descriptions = {
|
||||
'core': 'Core Framework Files (CLAUDE.md, FLAGS.md, PRINCIPLES.md, etc.)',
|
||||
'commands': 'SuperClaude Commands (commands/sc/*.md)',
|
||||
'agents': 'Specialized Agents (agents/*.md)',
|
||||
'mcp': 'MCP Server Configurations',
|
||||
'mcp_docs': 'MCP Documentation',
|
||||
'modes': 'SuperClaude Modes'
|
||||
"core": "Core Framework Files (CLAUDE.md, FLAGS.md, PRINCIPLES.md, etc.)",
|
||||
"commands": "superclaude Commands (commands/sc/*.md)",
|
||||
"agents": "Specialized Agents (agents/*.md)",
|
||||
"mcp": "MCP Server Configurations",
|
||||
"mcp_docs": "MCP Documentation",
|
||||
"modes": "superclaude Modes",
|
||||
}
|
||||
|
||||
for component, version in installed_components.items():
|
||||
@ -403,20 +448,24 @@ def _custom_component_selection(installed_components: Dict[str, str], env_vars:
|
||||
|
||||
# If MCP component is selected, ask about related cleanup options
|
||||
cleanup_options = {
|
||||
'remove_mcp_configs': 'mcp' in selected_components,
|
||||
'cleanup_env_vars': False,
|
||||
'create_restore_script': True
|
||||
"remove_mcp_configs": "mcp" in selected_components,
|
||||
"cleanup_env_vars": False,
|
||||
"create_restore_script": True,
|
||||
}
|
||||
|
||||
if 'mcp' in selected_components:
|
||||
if "mcp" in selected_components:
|
||||
cleanup_options.update(_ask_mcp_cleanup_options(env_vars))
|
||||
elif env_vars:
|
||||
# Even if MCP not selected, ask about env vars if they exist
|
||||
cleanup_env = confirm(f"Remove {len(env_vars)} API key environment variables?", default=False)
|
||||
cleanup_options['cleanup_env_vars'] = cleanup_env
|
||||
cleanup_env = confirm(
|
||||
f"Remove {len(env_vars)} API key environment variables?", default=False
|
||||
)
|
||||
cleanup_options["cleanup_env_vars"] = cleanup_env
|
||||
if cleanup_env:
|
||||
create_script = confirm("Create restore script for environment variables?", default=True)
|
||||
cleanup_options['create_restore_script'] = create_script
|
||||
create_script = confirm(
|
||||
"Create restore script for environment variables?", default=True
|
||||
)
|
||||
cleanup_options["create_restore_script"] = create_script
|
||||
|
||||
return selected_components, cleanup_options
|
||||
|
||||
@ -429,32 +478,42 @@ def _ask_mcp_cleanup_options(env_vars: Dict[str, str]) -> Dict[str, bool]:
|
||||
cleanup_options = {}
|
||||
|
||||
# Ask about MCP server configurations
|
||||
remove_configs = confirm("Remove MCP server configurations from .claude.json?", default=True)
|
||||
cleanup_options['remove_mcp_configs'] = remove_configs
|
||||
remove_configs = confirm(
|
||||
"Remove MCP server configurations from .claude.json?", default=True
|
||||
)
|
||||
cleanup_options["remove_mcp_configs"] = remove_configs
|
||||
|
||||
# Ask about API key environment variables
|
||||
if env_vars:
|
||||
print(f"\n{Colors.BLUE}Related API key environment variables found:{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.BLUE}Related API key environment variables found:{Colors.RESET}"
|
||||
)
|
||||
for env_var, value in env_vars.items():
|
||||
masked_value = f"{value[:4]}...{value[-4:]}" if len(value) > 8 else "***"
|
||||
print(f" {env_var}: {masked_value}")
|
||||
|
||||
cleanup_env = confirm(f"Remove {len(env_vars)} API key environment variables?", default=False)
|
||||
cleanup_options['cleanup_env_vars'] = cleanup_env
|
||||
cleanup_env = confirm(
|
||||
f"Remove {len(env_vars)} API key environment variables?", default=False
|
||||
)
|
||||
cleanup_options["cleanup_env_vars"] = cleanup_env
|
||||
|
||||
if cleanup_env:
|
||||
create_script = confirm("Create restore script for environment variables?", default=True)
|
||||
cleanup_options['create_restore_script'] = create_script
|
||||
create_script = confirm(
|
||||
"Create restore script for environment variables?", default=True
|
||||
)
|
||||
cleanup_options["create_restore_script"] = create_script
|
||||
else:
|
||||
cleanup_options['create_restore_script'] = True
|
||||
cleanup_options["create_restore_script"] = True
|
||||
else:
|
||||
cleanup_options['cleanup_env_vars'] = False
|
||||
cleanup_options['create_restore_script'] = True
|
||||
cleanup_options["cleanup_env_vars"] = False
|
||||
cleanup_options["create_restore_script"] = True
|
||||
|
||||
return cleanup_options
|
||||
|
||||
|
||||
def interactive_uninstall_selection(installed_components: Dict[str, str]) -> Optional[List[str]]:
|
||||
def interactive_uninstall_selection(
|
||||
installed_components: Dict[str, str],
|
||||
) -> Optional[List[str]]:
|
||||
"""Legacy function - redirects to enhanced selection"""
|
||||
env_vars = get_superclaude_environment_variables()
|
||||
result = interactive_component_selection(installed_components, env_vars)
|
||||
@ -471,67 +530,72 @@ def display_preservation_info() -> None:
|
||||
"""Show what will NOT be removed (user's custom files)"""
|
||||
print(f"\n{Colors.GREEN}{Colors.BRIGHT}Files that will be preserved:{Colors.RESET}")
|
||||
print(f"{Colors.GREEN}+ User's custom commands (not in commands/sc/){Colors.RESET}")
|
||||
print(f"{Colors.GREEN}+ User's custom agents (not SuperClaude agents){Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.GREEN}+ User's custom agents (not SuperClaude agents){Colors.RESET}"
|
||||
)
|
||||
print(f"{Colors.GREEN}+ User's custom .claude.json configurations{Colors.RESET}")
|
||||
print(f"{Colors.GREEN}+ User's custom files in shared directories{Colors.RESET}")
|
||||
print(f"{Colors.GREEN}+ Claude Code settings and other tools' configurations{Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.GREEN}+ Claude Code settings and other tools' configurations{Colors.RESET}"
|
||||
)
|
||||
|
||||
|
||||
def display_component_details(component: str, info: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""Get detailed information about what will be removed for a component"""
|
||||
details = {
|
||||
'files': [],
|
||||
'directories': [],
|
||||
'size': 0,
|
||||
'description': ''
|
||||
}
|
||||
details = {"files": [], "directories": [], "size": 0, "description": ""}
|
||||
|
||||
install_dir = info['install_dir']
|
||||
install_dir = info["install_dir"]
|
||||
|
||||
component_paths = {
|
||||
'core': {
|
||||
'files': ['CLAUDE.md', 'FLAGS.md', 'PRINCIPLES.md', 'RULES.md', 'ORCHESTRATOR.md', 'SESSION_LIFECYCLE.md'],
|
||||
'description': 'Core framework files in ~/.claude/'
|
||||
"core": {
|
||||
"files": [
|
||||
"CLAUDE.md",
|
||||
"FLAGS.md",
|
||||
"PRINCIPLES.md",
|
||||
"RULES.md",
|
||||
"ORCHESTRATOR.md",
|
||||
"SESSION_LIFECYCLE.md",
|
||||
],
|
||||
"description": "Core framework files in ~/.claude/",
|
||||
},
|
||||
'commands': {
|
||||
'files': 'commands/sc/*.md',
|
||||
'description': 'SuperClaude commands in ~/.claude/commands/sc/'
|
||||
"commands": {
|
||||
"files": "commands/sc/*.md",
|
||||
"description": "superclaude commands in ~/.claude/commands/sc/",
|
||||
},
|
||||
'agents': {
|
||||
'files': 'agents/*.md',
|
||||
'description': 'Specialized AI agents in ~/.claude/agents/'
|
||||
"agents": {
|
||||
"files": "agents/*.md",
|
||||
"description": "Specialized AI agents in ~/.claude/agents/",
|
||||
},
|
||||
'mcp': {
|
||||
'files': 'MCP server configurations in .claude.json',
|
||||
'description': 'MCP server configurations'
|
||||
"mcp": {
|
||||
"files": "MCP server configurations in .claude.json",
|
||||
"description": "MCP server configurations",
|
||||
},
|
||||
'mcp_docs': {
|
||||
'files': 'MCP/*.md',
|
||||
'description': 'MCP documentation files'
|
||||
},
|
||||
'modes': {
|
||||
'files': 'MODE_*.md',
|
||||
'description': 'SuperClaude operational modes'
|
||||
}
|
||||
"mcp_docs": {"files": "MCP/*.md", "description": "MCP documentation files"},
|
||||
"modes": {"files": "MODE_*.md", "description": "superclaude operational modes"},
|
||||
}
|
||||
|
||||
if component in component_paths:
|
||||
details['description'] = component_paths[component]['description']
|
||||
details["description"] = component_paths[component]["description"]
|
||||
|
||||
# Get actual file count from metadata if available
|
||||
component_metadata = info["components"].get(component, {})
|
||||
if isinstance(component_metadata, dict):
|
||||
if 'files_count' in component_metadata:
|
||||
details['file_count'] = component_metadata['files_count']
|
||||
elif 'agents_count' in component_metadata:
|
||||
details['file_count'] = component_metadata['agents_count']
|
||||
elif 'servers_configured' in component_metadata:
|
||||
details['file_count'] = component_metadata['servers_configured']
|
||||
if "files_count" in component_metadata:
|
||||
details["file_count"] = component_metadata["files_count"]
|
||||
elif "agents_count" in component_metadata:
|
||||
details["file_count"] = component_metadata["agents_count"]
|
||||
elif "servers_configured" in component_metadata:
|
||||
details["file_count"] = component_metadata["servers_configured"]
|
||||
|
||||
return details
|
||||
|
||||
|
||||
def display_uninstall_plan(components: List[str], args: argparse.Namespace, info: Dict[str, Any], env_vars: Dict[str, str]) -> None:
|
||||
def display_uninstall_plan(
|
||||
components: List[str],
|
||||
args: argparse.Namespace,
|
||||
info: Dict[str, Any],
|
||||
env_vars: Dict[str, str],
|
||||
) -> None:
|
||||
"""Display detailed uninstall plan"""
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Uninstall Plan{Colors.RESET}")
|
||||
print("=" * 60)
|
||||
@ -547,11 +611,19 @@ def display_uninstall_plan(components: List[str], args: argparse.Namespace, info
|
||||
version = info["components"].get(component_name, "unknown")
|
||||
|
||||
if isinstance(version, dict):
|
||||
version_str = version.get('version', 'unknown')
|
||||
file_count = details.get('file_count', version.get('files_count', version.get('agents_count', version.get('servers_configured', '?'))))
|
||||
version_str = version.get("version", "unknown")
|
||||
file_count = details.get(
|
||||
"file_count",
|
||||
version.get(
|
||||
"files_count",
|
||||
version.get(
|
||||
"agents_count", version.get("servers_configured", "?")
|
||||
),
|
||||
),
|
||||
)
|
||||
else:
|
||||
version_str = str(version)
|
||||
file_count = details.get('file_count', '?')
|
||||
file_count = details.get("file_count", "?")
|
||||
|
||||
print(f" {i}. {component_name} (v{version_str}) - {file_count} files")
|
||||
print(f" {details['description']}")
|
||||
@ -559,14 +631,22 @@ def display_uninstall_plan(components: List[str], args: argparse.Namespace, info
|
||||
if isinstance(file_count, int):
|
||||
total_files += file_count
|
||||
|
||||
print(f"\n{Colors.YELLOW}Total estimated files to remove: {total_files}{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.YELLOW}Total estimated files to remove: {total_files}{Colors.RESET}"
|
||||
)
|
||||
|
||||
# Show detailed preservation information
|
||||
print(f"\n{Colors.GREEN}{Colors.BRIGHT}Safety Guarantees - Will Preserve:{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.GREEN}{Colors.BRIGHT}Safety Guarantees - Will Preserve:{Colors.RESET}"
|
||||
)
|
||||
print(f"{Colors.GREEN}+ User's custom commands (not in commands/sc/){Colors.RESET}")
|
||||
print(f"{Colors.GREEN}+ User's custom agents (not SuperClaude agents){Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.GREEN}+ User's custom agents (not SuperClaude agents){Colors.RESET}"
|
||||
)
|
||||
print(f"{Colors.GREEN}+ User's .claude.json customizations{Colors.RESET}")
|
||||
print(f"{Colors.GREEN}+ Claude Code settings and other tools' configurations{Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.GREEN}+ Claude Code settings and other tools' configurations{Colors.RESET}"
|
||||
)
|
||||
|
||||
# Show additional preserved items
|
||||
preserved = []
|
||||
@ -582,19 +662,25 @@ def display_uninstall_plan(components: List[str], args: argparse.Namespace, info
|
||||
print(f"{Colors.GREEN}+ {item}{Colors.RESET}")
|
||||
|
||||
if args.complete:
|
||||
print(f"\n{Colors.RED}⚠️ WARNING: Complete uninstall will remove all SuperClaude files{Colors.RESET}")
|
||||
print(
|
||||
f"\n{Colors.RED}⚠️ WARNING: Complete uninstall will remove all SuperClaude files{Colors.RESET}"
|
||||
)
|
||||
|
||||
# Environment variable cleanup information
|
||||
if env_vars:
|
||||
print(f"\n{Colors.BLUE}Environment Variables:{Colors.RESET}")
|
||||
if args.cleanup_env:
|
||||
print(f"{Colors.YELLOW}Will remove {len(env_vars)} API key environment variables:{Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.YELLOW}Will remove {len(env_vars)} API key environment variables:{Colors.RESET}"
|
||||
)
|
||||
for env_var in env_vars.keys():
|
||||
print(f" - {env_var}")
|
||||
if not args.no_restore_script:
|
||||
print(f"{Colors.GREEN} + Restore script will be created{Colors.RESET}")
|
||||
else:
|
||||
print(f"{Colors.BLUE}Will preserve {len(env_vars)} API key environment variables:{Colors.RESET}")
|
||||
print(
|
||||
f"{Colors.BLUE}Will preserve {len(env_vars)} API key environment variables:{Colors.RESET}"
|
||||
)
|
||||
for env_var in env_vars.keys():
|
||||
print(f" + {env_var}")
|
||||
|
||||
@ -607,6 +693,7 @@ def create_uninstall_backup(install_dir: Path, components: List[str]) -> Optiona
|
||||
|
||||
try:
|
||||
from datetime import datetime
|
||||
|
||||
backup_dir = install_dir / "backups"
|
||||
backup_dir.mkdir(exist_ok=True)
|
||||
|
||||
@ -633,7 +720,12 @@ def create_uninstall_backup(install_dir: Path, components: List[str]) -> Optiona
|
||||
return None
|
||||
|
||||
|
||||
def perform_uninstall(components: List[str], args: argparse.Namespace, info: Dict[str, Any], env_vars: Dict[str, str]) -> bool:
|
||||
def perform_uninstall(
|
||||
components: List[str],
|
||||
args: argparse.Namespace,
|
||||
info: Dict[str, Any],
|
||||
env_vars: Dict[str, str],
|
||||
) -> bool:
|
||||
"""Perform the actual uninstall"""
|
||||
logger = get_logger()
|
||||
start_time = time.time()
|
||||
@ -644,13 +736,13 @@ def perform_uninstall(components: List[str], args: argparse.Namespace, info: Dic
|
||||
registry.discover_components()
|
||||
|
||||
# Create component instances
|
||||
component_instances = registry.create_component_instances(components, args.install_dir)
|
||||
component_instances = registry.create_component_instances(
|
||||
components, args.install_dir
|
||||
)
|
||||
|
||||
# Setup progress tracking
|
||||
progress = ProgressBar(
|
||||
total=len(components),
|
||||
prefix="Uninstalling: ",
|
||||
suffix=""
|
||||
total=len(components), prefix="Uninstalling: ", suffix=""
|
||||
)
|
||||
|
||||
# Uninstall components
|
||||
@ -692,7 +784,9 @@ def perform_uninstall(components: List[str], args: argparse.Namespace, info: Dic
|
||||
if args.cleanup_env and env_vars:
|
||||
logger.info("Cleaning up environment variables...")
|
||||
create_restore_script = not args.no_restore_script
|
||||
env_cleanup_success = cleanup_environment_variables(env_vars, create_restore_script)
|
||||
env_cleanup_success = cleanup_environment_variables(
|
||||
env_vars, create_restore_script
|
||||
)
|
||||
|
||||
if env_cleanup_success:
|
||||
logger.success(f"Removed {len(env_vars)} environment variables")
|
||||
@ -703,10 +797,14 @@ def perform_uninstall(components: List[str], args: argparse.Namespace, info: Dic
|
||||
duration = time.time() - start_time
|
||||
|
||||
if failed_components:
|
||||
logger.warning(f"Uninstall completed with some failures in {duration:.1f} seconds")
|
||||
logger.warning(
|
||||
f"Uninstall completed with some failures in {duration:.1f} seconds"
|
||||
)
|
||||
logger.warning(f"Failed components: {', '.join(failed_components)}")
|
||||
else:
|
||||
logger.success(f"Uninstall completed successfully in {duration:.1f} seconds")
|
||||
logger.success(
|
||||
f"Uninstall completed successfully in {duration:.1f} seconds"
|
||||
)
|
||||
|
||||
if uninstalled_components:
|
||||
logger.info(f"Uninstalled components: {', '.join(uninstalled_components)}")
|
||||
@ -740,7 +838,9 @@ def cleanup_installation_directory(install_dir: Path, args: argparse.Namespace)
|
||||
if file_manager.remove_directory(install_dir):
|
||||
logger.info(f"Removed installation directory: {install_dir}")
|
||||
else:
|
||||
logger.warning(f"Could not remove installation directory: {install_dir}")
|
||||
logger.warning(
|
||||
f"Could not remove installation directory: {install_dir}"
|
||||
)
|
||||
else:
|
||||
# Selective removal
|
||||
for item in install_dir.iterdir():
|
||||
@ -787,9 +887,10 @@ def run(args: argparse.Namespace) -> int:
|
||||
# Display header
|
||||
if not args.quiet:
|
||||
from setup.cli.base import __version__
|
||||
|
||||
display_header(
|
||||
f"SuperClaude Uninstall v{__version__}",
|
||||
"Removing SuperClaude framework components"
|
||||
"Removing SuperClaude framework components",
|
||||
)
|
||||
|
||||
# Get installation information
|
||||
@ -800,7 +901,11 @@ def run(args: argparse.Namespace) -> int:
|
||||
display_uninstall_info(info)
|
||||
|
||||
# Check for environment variables
|
||||
env_vars = display_environment_info() if not args.quiet else get_superclaude_environment_variables()
|
||||
env_vars = (
|
||||
display_environment_info()
|
||||
if not args.quiet
|
||||
else get_superclaude_environment_variables()
|
||||
)
|
||||
|
||||
# Check if SuperClaude is installed
|
||||
if not info["exists"]:
|
||||
@ -812,9 +917,9 @@ def run(args: argparse.Namespace) -> int:
|
||||
# Non-interactive mode - use existing logic
|
||||
components = get_components_to_uninstall(args, info["components"])
|
||||
cleanup_options = {
|
||||
'remove_mcp_configs': 'mcp' in (components or []),
|
||||
'cleanup_env_vars': args.cleanup_env,
|
||||
'create_restore_script': not args.no_restore_script
|
||||
"remove_mcp_configs": "mcp" in (components or []),
|
||||
"cleanup_env_vars": args.cleanup_env,
|
||||
"create_restore_script": not args.no_restore_script,
|
||||
}
|
||||
if components is None:
|
||||
logger.info("Uninstall cancelled by user")
|
||||
@ -835,8 +940,10 @@ def run(args: argparse.Namespace) -> int:
|
||||
components, cleanup_options = result
|
||||
|
||||
# Override command-line args with interactive choices
|
||||
args.cleanup_env = cleanup_options.get('cleanup_env_vars', False)
|
||||
args.no_restore_script = not cleanup_options.get('create_restore_script', True)
|
||||
args.cleanup_env = cleanup_options.get("cleanup_env_vars", False)
|
||||
args.no_restore_script = not cleanup_options.get(
|
||||
"create_restore_script", True
|
||||
)
|
||||
|
||||
# Display uninstall plan
|
||||
if not args.quiet:
|
||||
@ -845,9 +952,11 @@ def run(args: argparse.Namespace) -> int:
|
||||
# Confirmation
|
||||
if not args.no_confirm and not args.yes:
|
||||
if args.complete:
|
||||
warning_msg = "This will completely remove SuperClaude. Continue?"
|
||||
warning_msg = "This will completely remove superclaude. Continue?"
|
||||
else:
|
||||
warning_msg = f"This will remove {len(components)} component(s). Continue?"
|
||||
warning_msg = (
|
||||
f"This will remove {len(components)} component(s). Continue?"
|
||||
)
|
||||
|
||||
if not confirm(warning_msg, default=False):
|
||||
logger.info("Uninstall cancelled by user")
|
||||
@ -868,11 +977,13 @@ def run(args: argparse.Namespace) -> int:
|
||||
print(f"\n{Colors.CYAN}Uninstall complete:{Colors.RESET}")
|
||||
print(f"SuperClaude has been removed from {args.install_dir}")
|
||||
if not args.complete:
|
||||
print(f"You can reinstall anytime using 'SuperClaude install'")
|
||||
print(f"You can reinstall anytime using 'superclaude install'")
|
||||
|
||||
return 0
|
||||
else:
|
||||
display_error("Uninstall completed with some failures. Check logs for details.")
|
||||
display_error(
|
||||
"Uninstall completed with some failures. Check logs for details."
|
||||
)
|
||||
return 1
|
||||
|
||||
except KeyboardInterrupt:
|
||||
|
||||
@ -15,8 +15,17 @@ from ...core.registry import ComponentRegistry
|
||||
from ...services.settings import SettingsService
|
||||
from ...core.validator import Validator
|
||||
from ...utils.ui import (
|
||||
display_header, display_info, display_success, display_error,
|
||||
display_warning, Menu, confirm, ProgressBar, Colors, format_size, prompt_api_key
|
||||
display_header,
|
||||
display_info,
|
||||
display_success,
|
||||
display_error,
|
||||
display_warning,
|
||||
Menu,
|
||||
confirm,
|
||||
ProgressBar,
|
||||
Colors,
|
||||
format_size,
|
||||
prompt_api_key,
|
||||
)
|
||||
from ...utils.environment import setup_environment_variables
|
||||
from ...utils.logger import get_logger
|
||||
@ -47,51 +56,44 @@ Examples:
|
||||
SuperClaude update --backup --force # Create backup before update (forced)
|
||||
""",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
parents=parents
|
||||
parents=parents,
|
||||
)
|
||||
|
||||
# Update mode options
|
||||
parser.add_argument(
|
||||
"--check",
|
||||
action="store_true",
|
||||
help="Check for available updates without installing"
|
||||
help="Check for available updates without installing",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--components",
|
||||
type=str,
|
||||
nargs="+",
|
||||
help="Specific components to update"
|
||||
"--components", type=str, nargs="+", help="Specific components to update"
|
||||
)
|
||||
|
||||
# Backup options
|
||||
parser.add_argument(
|
||||
"--backup",
|
||||
action="store_true",
|
||||
help="Create backup before update"
|
||||
"--backup", action="store_true", help="Create backup before update"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--no-backup",
|
||||
action="store_true",
|
||||
help="Skip backup creation"
|
||||
)
|
||||
parser.add_argument("--no-backup", action="store_true", help="Skip backup creation")
|
||||
|
||||
# Update options
|
||||
parser.add_argument(
|
||||
"--reinstall",
|
||||
action="store_true",
|
||||
help="Reinstall components even if versions match"
|
||||
help="Reinstall components even if versions match",
|
||||
)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
def check_installation_exists(install_dir: Path) -> bool:
|
||||
"""Check if SuperClaude installation exists"""
|
||||
settings_manager = SettingsService(install_dir)
|
||||
|
||||
return settings_manager.check_installation_exists()
|
||||
|
||||
|
||||
def get_installed_components(install_dir: Path) -> Dict[str, Dict[str, Any]]:
|
||||
"""Get currently installed components and their versions"""
|
||||
try:
|
||||
@ -101,7 +103,9 @@ def get_installed_components(install_dir: Path) -> Dict[str, Dict[str, Any]]:
|
||||
return {}
|
||||
|
||||
|
||||
def get_available_updates(installed_components: Dict[str, str], registry: ComponentRegistry) -> Dict[str, Dict[str, str]]:
|
||||
def get_available_updates(
|
||||
installed_components: Dict[str, str], registry: ComponentRegistry
|
||||
) -> Dict[str, Dict[str, str]]:
|
||||
"""Check for available updates"""
|
||||
updates = {}
|
||||
|
||||
@ -114,7 +118,7 @@ def get_available_updates(installed_components: Dict[str, str], registry: Compon
|
||||
updates[component_name] = {
|
||||
"current": current_version,
|
||||
"available": available_version,
|
||||
"description": metadata.get("description", "No description")
|
||||
"description": metadata.get("description", "No description"),
|
||||
}
|
||||
except Exception:
|
||||
continue
|
||||
@ -122,7 +126,9 @@ def get_available_updates(installed_components: Dict[str, str], registry: Compon
|
||||
return updates
|
||||
|
||||
|
||||
def display_update_check(installed_components: Dict[str, str], available_updates: Dict[str, Dict[str, str]]) -> None:
|
||||
def display_update_check(
|
||||
installed_components: Dict[str, str], available_updates: Dict[str, Dict[str, str]]
|
||||
) -> None:
|
||||
"""Display update check results"""
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Update Check Results{Colors.RESET}")
|
||||
print("=" * 50)
|
||||
@ -146,15 +152,20 @@ def display_update_check(installed_components: Dict[str, str], available_updates
|
||||
print()
|
||||
|
||||
|
||||
def get_components_to_update(args: argparse.Namespace, installed_components: Dict[str, str],
|
||||
available_updates: Dict[str, Dict[str, str]]) -> Optional[List[str]]:
|
||||
def get_components_to_update(
|
||||
args: argparse.Namespace,
|
||||
installed_components: Dict[str, str],
|
||||
available_updates: Dict[str, Dict[str, str]],
|
||||
) -> Optional[List[str]]:
|
||||
"""Determine which components to update"""
|
||||
logger = get_logger()
|
||||
|
||||
# Explicit components specified
|
||||
if args.components:
|
||||
# Validate that specified components are installed
|
||||
invalid_components = [c for c in args.components if c not in installed_components]
|
||||
invalid_components = [
|
||||
c for c in args.components if c not in installed_components
|
||||
]
|
||||
if invalid_components:
|
||||
logger.error(f"Components not installed: {invalid_components}")
|
||||
return None
|
||||
@ -175,7 +186,9 @@ def get_components_to_update(args: argparse.Namespace, installed_components: Dic
|
||||
return []
|
||||
|
||||
|
||||
def collect_api_keys_for_servers(selected_servers: List[str], mcp_instance) -> Dict[str, str]:
|
||||
def collect_api_keys_for_servers(
|
||||
selected_servers: List[str], mcp_instance
|
||||
) -> Dict[str, str]:
|
||||
"""
|
||||
Collect API keys for servers that require them during update
|
||||
|
||||
@ -190,8 +203,8 @@ def collect_api_keys_for_servers(selected_servers: List[str], mcp_instance) -> D
|
||||
servers_needing_keys = [
|
||||
(server_key, mcp_instance.mcp_servers[server_key])
|
||||
for server_key in selected_servers
|
||||
if server_key in mcp_instance.mcp_servers and
|
||||
mcp_instance.mcp_servers[server_key].get("requires_api_key", False)
|
||||
if server_key in mcp_instance.mcp_servers
|
||||
and mcp_instance.mcp_servers[server_key].get("requires_api_key", False)
|
||||
]
|
||||
|
||||
if not servers_needing_keys:
|
||||
@ -199,7 +212,9 @@ def collect_api_keys_for_servers(selected_servers: List[str], mcp_instance) -> D
|
||||
|
||||
# Display API key configuration header
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}=== API Key Configuration ==={Colors.RESET}")
|
||||
print(f"{Colors.YELLOW}New MCP servers require API keys for full functionality:{Colors.RESET}\n")
|
||||
print(
|
||||
f"{Colors.YELLOW}New MCP servers require API keys for full functionality:{Colors.RESET}\n"
|
||||
)
|
||||
|
||||
collected_keys = {}
|
||||
for server_key, server_info in servers_needing_keys:
|
||||
@ -214,8 +229,9 @@ def collect_api_keys_for_servers(selected_servers: List[str], mcp_instance) -> D
|
||||
return collected_keys
|
||||
|
||||
|
||||
def interactive_update_selection(available_updates: Dict[str, Dict[str, str]],
|
||||
installed_components: Dict[str, str]) -> Optional[List[str]]:
|
||||
def interactive_update_selection(
|
||||
available_updates: Dict[str, Dict[str, str]], installed_components: Dict[str, str]
|
||||
) -> Optional[List[str]]:
|
||||
"""Interactive update selection"""
|
||||
if not available_updates:
|
||||
return []
|
||||
@ -234,7 +250,7 @@ def interactive_update_selection(available_updates: Dict[str, Dict[str, str]],
|
||||
preset_options = [
|
||||
"Update All Components",
|
||||
"Select Individual Components",
|
||||
"Cancel Update"
|
||||
"Cancel Update",
|
||||
]
|
||||
|
||||
menu = Menu("Select update option:", preset_options)
|
||||
@ -245,7 +261,9 @@ def interactive_update_selection(available_updates: Dict[str, Dict[str, str]],
|
||||
elif choice == 0: # Update all
|
||||
return component_names
|
||||
elif choice == 1: # Select individual
|
||||
component_menu = Menu("Select components to update:", update_options, multi_select=True)
|
||||
component_menu = Menu(
|
||||
"Select components to update:", update_options, multi_select=True
|
||||
)
|
||||
selections = component_menu.display()
|
||||
|
||||
if not selections:
|
||||
@ -256,8 +274,12 @@ def interactive_update_selection(available_updates: Dict[str, Dict[str, str]],
|
||||
return None
|
||||
|
||||
|
||||
def display_update_plan(components: List[str], available_updates: Dict[str, Dict[str, str]],
|
||||
installed_components: Dict[str, str], install_dir: Path) -> None:
|
||||
def display_update_plan(
|
||||
components: List[str],
|
||||
available_updates: Dict[str, Dict[str, str]],
|
||||
installed_components: Dict[str, str],
|
||||
install_dir: Path,
|
||||
) -> None:
|
||||
"""Display update plan"""
|
||||
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Update Plan{Colors.RESET}")
|
||||
print("=" * 50)
|
||||
@ -276,7 +298,9 @@ def display_update_plan(components: List[str], available_updates: Dict[str, Dict
|
||||
print()
|
||||
|
||||
|
||||
def perform_update(components: List[str], args: argparse.Namespace, registry: ComponentRegistry) -> bool:
|
||||
def perform_update(
|
||||
components: List[str], args: argparse.Namespace, registry: ComponentRegistry
|
||||
) -> bool:
|
||||
"""Perform the actual update"""
|
||||
logger = get_logger()
|
||||
start_time = time.time()
|
||||
@ -286,7 +310,9 @@ def perform_update(components: List[str], args: argparse.Namespace, registry: Co
|
||||
installer = Installer(args.install_dir, dry_run=args.dry_run)
|
||||
|
||||
# Create component instances
|
||||
component_instances = registry.create_component_instances(components, args.install_dir)
|
||||
component_instances = registry.create_component_instances(
|
||||
components, args.install_dir
|
||||
)
|
||||
|
||||
if not component_instances:
|
||||
logger.error("No valid component instances created")
|
||||
@ -296,12 +322,14 @@ def perform_update(components: List[str], args: argparse.Namespace, registry: Co
|
||||
collected_api_keys = {}
|
||||
if "mcp" in components and "mcp" in component_instances:
|
||||
mcp_instance = component_instances["mcp"]
|
||||
if hasattr(mcp_instance, 'mcp_servers'):
|
||||
if hasattr(mcp_instance, "mcp_servers"):
|
||||
# Get all available MCP servers
|
||||
all_server_keys = list(mcp_instance.mcp_servers.keys())
|
||||
|
||||
# Collect API keys for any servers that require them
|
||||
collected_api_keys = collect_api_keys_for_servers(all_server_keys, mcp_instance)
|
||||
collected_api_keys = collect_api_keys_for_servers(
|
||||
all_server_keys, mcp_instance
|
||||
)
|
||||
|
||||
# Set up environment variables if any keys were collected
|
||||
if collected_api_keys:
|
||||
@ -310,17 +338,15 @@ def perform_update(components: List[str], args: argparse.Namespace, registry: Co
|
||||
# Store keys for MCP component to use during update
|
||||
mcp_instance.collected_api_keys = collected_api_keys
|
||||
|
||||
logger.info(f"Collected {len(collected_api_keys)} API keys for MCP server update")
|
||||
logger.info(
|
||||
f"Collected {len(collected_api_keys)} API keys for MCP server update"
|
||||
)
|
||||
|
||||
# Register components with installer
|
||||
installer.register_components(list(component_instances.values()))
|
||||
|
||||
# Setup progress tracking
|
||||
progress = ProgressBar(
|
||||
total=len(components),
|
||||
prefix="Updating: ",
|
||||
suffix=""
|
||||
)
|
||||
progress = ProgressBar(total=len(components), prefix="Updating: ", suffix="")
|
||||
|
||||
# Update components
|
||||
logger.info(f"Updating {len(components)} components...")
|
||||
@ -333,7 +359,11 @@ def perform_update(components: List[str], args: argparse.Namespace, registry: Co
|
||||
"backup": backup,
|
||||
"dry_run": args.dry_run,
|
||||
"update_mode": True,
|
||||
"selected_mcp_servers": list(mcp_instance.mcp_servers.keys()) if "mcp" in component_instances else []
|
||||
"selected_mcp_servers": (
|
||||
list(mcp_instance.mcp_servers.keys())
|
||||
if "mcp" in component_instances
|
||||
else []
|
||||
),
|
||||
}
|
||||
|
||||
success = installer.update_components(components, config)
|
||||
@ -356,17 +386,17 @@ def perform_update(components: List[str], args: argparse.Namespace, registry: Co
|
||||
|
||||
# Show summary
|
||||
summary = installer.get_update_summary()
|
||||
if summary.get('updated'):
|
||||
if summary.get("updated"):
|
||||
logger.info(f"Updated components: {', '.join(summary['updated'])}")
|
||||
|
||||
if summary.get('backup_path'):
|
||||
if summary.get("backup_path"):
|
||||
logger.info(f"Backup created: {summary['backup_path']}")
|
||||
|
||||
else:
|
||||
logger.error(f"Update completed with errors in {duration:.1f} seconds")
|
||||
|
||||
summary = installer.get_update_summary()
|
||||
if summary.get('failed'):
|
||||
if summary.get("failed"):
|
||||
logger.error(f"Failed components: {', '.join(summary['failed'])}")
|
||||
|
||||
return success
|
||||
@ -406,13 +436,13 @@ def run(args: argparse.Namespace) -> int:
|
||||
if not args.quiet:
|
||||
display_header(
|
||||
f"SuperClaude Update v{__version__}",
|
||||
"Updating SuperClaude framework components"
|
||||
"Updating SuperClaude framework components",
|
||||
)
|
||||
|
||||
# Check if SuperClaude is installed
|
||||
if not check_installation_exists(args.install_dir):
|
||||
logger.error(f"SuperClaude installation not found in {args.install_dir}")
|
||||
logger.info("Use 'SuperClaude install' to install SuperClaude first")
|
||||
logger.info("Use 'superclaude install' to install SuperClaude first")
|
||||
return 1
|
||||
|
||||
# Create component registry
|
||||
@ -439,7 +469,9 @@ def run(args: argparse.Namespace) -> int:
|
||||
return 0
|
||||
|
||||
# Get components to update
|
||||
components = get_components_to_update(args, installed_components, available_updates)
|
||||
components = get_components_to_update(
|
||||
args, installed_components, available_updates
|
||||
)
|
||||
if components is None:
|
||||
logger.info("Update cancelled by user")
|
||||
return 0
|
||||
@ -449,7 +481,9 @@ def run(args: argparse.Namespace) -> int:
|
||||
|
||||
# Display update plan
|
||||
if not args.quiet:
|
||||
display_update_plan(components, available_updates, installed_components, args.install_dir)
|
||||
display_update_plan(
|
||||
components, available_updates, installed_components, args.install_dir
|
||||
)
|
||||
|
||||
if not args.dry_run:
|
||||
if not args.yes and not confirm("Proceed with update?", default=True):
|
||||
|
||||
@ -8,10 +8,10 @@ from .modes import ModesComponent
|
||||
from .mcp_docs import MCPDocsComponent
|
||||
|
||||
__all__ = [
|
||||
'CoreComponent',
|
||||
'CommandsComponent',
|
||||
'MCPComponent',
|
||||
'AgentsComponent',
|
||||
'ModesComponent',
|
||||
'MCPDocsComponent'
|
||||
"CoreComponent",
|
||||
"CommandsComponent",
|
||||
"MCPComponent",
|
||||
"AgentsComponent",
|
||||
"ModesComponent",
|
||||
"MCPDocsComponent",
|
||||
]
|
||||
@ -22,7 +22,7 @@ class AgentsComponent(Component):
|
||||
"name": "agents",
|
||||
"version": __version__,
|
||||
"description": "15 specialized AI agents with domain expertise and intelligent routing",
|
||||
"category": "agents"
|
||||
"category": "agents",
|
||||
}
|
||||
|
||||
def get_metadata_modifications(self) -> Dict[str, Any]:
|
||||
@ -33,7 +33,7 @@ class AgentsComponent(Component):
|
||||
"version": __version__,
|
||||
"installed": True,
|
||||
"agents_count": len(self.component_files),
|
||||
"install_directory": str(self.install_component_subdir)
|
||||
"install_directory": str(self.install_component_subdir),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -50,7 +50,9 @@ class AgentsComponent(Component):
|
||||
success = self._post_install()
|
||||
|
||||
if success:
|
||||
self.logger.success(f"Successfully installed {len(self.component_files)} specialized agents")
|
||||
self.logger.success(
|
||||
f"Successfully installed {len(self.component_files)} specialized agents"
|
||||
)
|
||||
|
||||
return success
|
||||
|
||||
@ -63,12 +65,15 @@ class AgentsComponent(Component):
|
||||
self.logger.info("Updated metadata with agents configuration")
|
||||
|
||||
# Add component registration
|
||||
self.settings_manager.add_component_registration("agents", {
|
||||
self.settings_manager.add_component_registration(
|
||||
"agents",
|
||||
{
|
||||
"version": __version__,
|
||||
"category": "agents",
|
||||
"agents_count": len(self.component_files),
|
||||
"agents_list": self.component_files
|
||||
})
|
||||
"agents_list": self.component_files,
|
||||
},
|
||||
)
|
||||
|
||||
self.logger.info("Registered agents component in metadata")
|
||||
return True
|
||||
@ -94,7 +99,9 @@ class AgentsComponent(Component):
|
||||
|
||||
# Remove agents directory if empty
|
||||
try:
|
||||
if self.install_component_subdir.exists() and not any(self.install_component_subdir.iterdir()):
|
||||
if self.install_component_subdir.exists() and not any(
|
||||
self.install_component_subdir.iterdir()
|
||||
):
|
||||
self.install_component_subdir.rmdir()
|
||||
self.logger.debug("Removed empty agents directory")
|
||||
except Exception as e:
|
||||
@ -108,7 +115,9 @@ class AgentsComponent(Component):
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
self.logger.success(f"Agents component uninstalled ({removed_count} agents removed)")
|
||||
self.logger.success(
|
||||
f"Agents component uninstalled ({removed_count} agents removed)"
|
||||
)
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
@ -129,10 +138,14 @@ class AgentsComponent(Component):
|
||||
target_version = self.get_metadata()["version"]
|
||||
|
||||
if current_version == target_version:
|
||||
self.logger.info(f"Agents component already at version {target_version}")
|
||||
self.logger.info(
|
||||
f"Agents component already at version {target_version}"
|
||||
)
|
||||
return True
|
||||
|
||||
self.logger.info(f"Updating agents component from {current_version} to {target_version}")
|
||||
self.logger.info(
|
||||
f"Updating agents component from {current_version} to {target_version}"
|
||||
)
|
||||
|
||||
# Create backup of existing agents
|
||||
backup_files = []
|
||||
@ -146,14 +159,19 @@ class AgentsComponent(Component):
|
||||
|
||||
# Perform installation (will overwrite existing files)
|
||||
if self._install(config):
|
||||
self.logger.success(f"Agents component updated to version {target_version}")
|
||||
self.logger.success(
|
||||
f"Agents component updated to version {target_version}"
|
||||
)
|
||||
return True
|
||||
else:
|
||||
# Restore backups on failure
|
||||
self.logger.error("Agents update failed, restoring backups...")
|
||||
for backup_path in backup_files:
|
||||
try:
|
||||
original_path = self.install_component_subdir / backup_path.name.replace('.backup', '')
|
||||
original_path = (
|
||||
self.install_component_subdir
|
||||
/ backup_path.name.replace(".backup", "")
|
||||
)
|
||||
self.file_manager.copy_file(backup_path, original_path)
|
||||
self.logger.debug(f"Restored {original_path.name}")
|
||||
except Exception as e:
|
||||
@ -166,10 +184,10 @@ class AgentsComponent(Component):
|
||||
|
||||
def _get_source_dir(self) -> Path:
|
||||
"""Get source directory for agent files"""
|
||||
# Assume we're in SuperClaude/setup/components/agents.py
|
||||
# and agent files are in SuperClaude/SuperClaude/Agents/
|
||||
# Assume we're in superclaude/setup/components/agents.py
|
||||
# and agent files are in superclaude/superclaude/Agents/
|
||||
project_root = Path(__file__).parent.parent.parent
|
||||
return project_root / "SuperClaude" / "Agents"
|
||||
return project_root / "superclaude" / "agents"
|
||||
|
||||
def get_size_estimate(self) -> int:
|
||||
"""Get estimated installation size"""
|
||||
@ -195,7 +213,7 @@ class AgentsComponent(Component):
|
||||
"agent_files": self.component_files,
|
||||
"estimated_size": self.get_size_estimate(),
|
||||
"install_directory": str(self.install_component_subdir),
|
||||
"dependencies": self.get_dependencies()
|
||||
"dependencies": self.get_dependencies(),
|
||||
}
|
||||
|
||||
def validate_installation(self) -> Tuple[bool, List[str]]:
|
||||
@ -204,7 +222,9 @@ class AgentsComponent(Component):
|
||||
|
||||
# Check if agents directory exists
|
||||
if not self.install_component_subdir.exists():
|
||||
errors.append(f"Agents directory not found: {self.install_component_subdir}")
|
||||
errors.append(
|
||||
f"Agents directory not found: {self.install_component_subdir}"
|
||||
)
|
||||
return False, errors
|
||||
|
||||
# Check if all agent files exist
|
||||
@ -226,7 +246,7 @@ class AgentsComponent(Component):
|
||||
"system-architect.md",
|
||||
"frontend-architect.md",
|
||||
"backend-architect.md",
|
||||
"security-engineer.md"
|
||||
"security-engineer.md",
|
||||
]
|
||||
|
||||
missing_core_agents = []
|
||||
|
||||
@ -8,6 +8,7 @@ from pathlib import Path
|
||||
from ..core.base import Component
|
||||
from setup import __version__
|
||||
|
||||
|
||||
class CommandsComponent(Component):
|
||||
"""SuperClaude slash commands component"""
|
||||
|
||||
@ -21,7 +22,7 @@ class CommandsComponent(Component):
|
||||
"name": "commands",
|
||||
"version": __version__,
|
||||
"description": "SuperClaude slash command definitions",
|
||||
"category": "commands"
|
||||
"category": "commands",
|
||||
}
|
||||
|
||||
def get_metadata_modifications(self) -> Dict[str, Any]:
|
||||
@ -31,14 +32,10 @@ class CommandsComponent(Component):
|
||||
"commands": {
|
||||
"version": __version__,
|
||||
"installed": True,
|
||||
"files_count": len(self.component_files)
|
||||
"files_count": len(self.component_files),
|
||||
}
|
||||
},
|
||||
"commands": {
|
||||
"enabled": True,
|
||||
"version": __version__,
|
||||
"auto_update": False
|
||||
}
|
||||
"commands": {"enabled": True, "version": __version__, "auto_update": False},
|
||||
}
|
||||
|
||||
def _install(self, config: Dict[str, Any]) -> bool:
|
||||
@ -48,7 +45,7 @@ class CommandsComponent(Component):
|
||||
# Check for and migrate existing commands from old location
|
||||
self._migrate_existing_commands()
|
||||
|
||||
return super()._install(config);
|
||||
return super()._install(config)
|
||||
|
||||
def _post_install(self) -> bool:
|
||||
# Update metadata
|
||||
@ -58,11 +55,14 @@ class CommandsComponent(Component):
|
||||
self.logger.info("Updated metadata with commands configuration")
|
||||
|
||||
# Add component registration to metadata
|
||||
self.settings_manager.add_component_registration("commands", {
|
||||
self.settings_manager.add_component_registration(
|
||||
"commands",
|
||||
{
|
||||
"version": __version__,
|
||||
"category": "commands",
|
||||
"files_count": len(self.component_files)
|
||||
})
|
||||
"files_count": len(self.component_files),
|
||||
},
|
||||
)
|
||||
self.logger.info("Updated metadata with commands component registration")
|
||||
except Exception as e:
|
||||
self.logger.error(f"Failed to update metadata: {e}")
|
||||
@ -101,7 +101,9 @@ class CommandsComponent(Component):
|
||||
self.logger.warning(f"Could not remove old {filename}")
|
||||
|
||||
if old_removed_count > 0:
|
||||
self.logger.info(f"Also removed {old_removed_count} commands from old location")
|
||||
self.logger.info(
|
||||
f"Also removed {old_removed_count} commands from old location"
|
||||
)
|
||||
|
||||
removed_count += old_removed_count
|
||||
|
||||
@ -119,7 +121,9 @@ class CommandsComponent(Component):
|
||||
remaining_files = list(parent_commands_dir.iterdir())
|
||||
if not remaining_files:
|
||||
parent_commands_dir.rmdir()
|
||||
self.logger.debug("Removed empty parent commands directory")
|
||||
self.logger.debug(
|
||||
"Removed empty parent commands directory"
|
||||
)
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not remove commands directory: {e}")
|
||||
|
||||
@ -136,11 +140,15 @@ class CommandsComponent(Component):
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
self.logger.success(f"Commands component uninstalled ({removed_count} files removed)")
|
||||
self.logger.success(
|
||||
f"Commands component uninstalled ({removed_count} files removed)"
|
||||
)
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
self.logger.exception(f"Unexpected error during commands uninstallation: {e}")
|
||||
self.logger.exception(
|
||||
f"Unexpected error during commands uninstallation: {e}"
|
||||
)
|
||||
return False
|
||||
|
||||
def get_dependencies(self) -> List[str]:
|
||||
@ -157,10 +165,14 @@ class CommandsComponent(Component):
|
||||
target_version = self.get_metadata()["version"]
|
||||
|
||||
if current_version == target_version:
|
||||
self.logger.info(f"Commands component already at version {target_version}")
|
||||
self.logger.info(
|
||||
f"Commands component already at version {target_version}"
|
||||
)
|
||||
return True
|
||||
|
||||
self.logger.info(f"Updating commands component from {current_version} to {target_version}")
|
||||
self.logger.info(
|
||||
f"Updating commands component from {current_version} to {target_version}"
|
||||
)
|
||||
|
||||
# Create backup of existing command files
|
||||
commands_dir = self.install_dir / "commands" / "sc"
|
||||
@ -186,13 +198,15 @@ class CommandsComponent(Component):
|
||||
except Exception:
|
||||
pass # Ignore cleanup errors
|
||||
|
||||
self.logger.success(f"Commands component updated to version {target_version}")
|
||||
self.logger.success(
|
||||
f"Commands component updated to version {target_version}"
|
||||
)
|
||||
else:
|
||||
# Restore from backup on failure
|
||||
self.logger.warning("Update failed, restoring from backup...")
|
||||
for backup_path in backup_files:
|
||||
try:
|
||||
original_path = backup_path.with_suffix('')
|
||||
original_path = backup_path.with_suffix("")
|
||||
backup_path.rename(original_path)
|
||||
self.logger.debug(f"Restored {original_path.name}")
|
||||
except Exception as e:
|
||||
@ -230,16 +244,18 @@ class CommandsComponent(Component):
|
||||
installed_version = self.settings_manager.get_component_version("commands")
|
||||
expected_version = self.get_metadata()["version"]
|
||||
if installed_version != expected_version:
|
||||
errors.append(f"Version mismatch: installed {installed_version}, expected {expected_version}")
|
||||
errors.append(
|
||||
f"Version mismatch: installed {installed_version}, expected {expected_version}"
|
||||
)
|
||||
|
||||
return len(errors) == 0, errors
|
||||
|
||||
def _get_source_dir(self) -> Path:
|
||||
"""Get source directory for command files"""
|
||||
# Assume we're in SuperClaude/setup/components/commands.py
|
||||
# and command files are in SuperClaude/SuperClaude/Commands/
|
||||
# Assume we're in superclaude/setup/components/commands.py
|
||||
# and command files are in superclaude/superclaude/Commands/
|
||||
project_root = Path(__file__).parent.parent.parent
|
||||
return project_root / "SuperClaude" / "Commands"
|
||||
return project_root / "superclaude" / "commands"
|
||||
|
||||
def get_size_estimate(self) -> int:
|
||||
"""Get estimated installation size"""
|
||||
@ -265,7 +281,7 @@ class CommandsComponent(Component):
|
||||
"command_files": self.component_files,
|
||||
"estimated_size": self.get_size_estimate(),
|
||||
"install_directory": str(self.install_dir / "commands" / "sc"),
|
||||
"dependencies": self.get_dependencies()
|
||||
"dependencies": self.get_dependencies(),
|
||||
}
|
||||
|
||||
def _migrate_existing_commands(self) -> None:
|
||||
@ -285,11 +301,15 @@ class CommandsComponent(Component):
|
||||
commands_to_migrate.append(filename)
|
||||
|
||||
if commands_to_migrate:
|
||||
self.logger.info(f"Found {len(commands_to_migrate)} existing commands to migrate to sc/ subdirectory")
|
||||
self.logger.info(
|
||||
f"Found {len(commands_to_migrate)} existing commands to migrate to sc/ subdirectory"
|
||||
)
|
||||
|
||||
# Ensure new directory exists
|
||||
if not self.file_manager.ensure_directory(new_commands_dir):
|
||||
self.logger.error(f"Could not create sc commands directory: {new_commands_dir}")
|
||||
self.logger.error(
|
||||
f"Could not create sc commands directory: {new_commands_dir}"
|
||||
)
|
||||
return
|
||||
|
||||
# Move files from old to new location
|
||||
@ -303,28 +323,42 @@ class CommandsComponent(Component):
|
||||
# Remove old file
|
||||
if self.file_manager.remove_file(old_file_path):
|
||||
migrated_count += 1
|
||||
self.logger.debug(f"Migrated {filename} to sc/ subdirectory")
|
||||
self.logger.debug(
|
||||
f"Migrated {filename} to sc/ subdirectory"
|
||||
)
|
||||
else:
|
||||
self.logger.warning(f"Could not remove old {filename}")
|
||||
else:
|
||||
self.logger.warning(f"Could not copy {filename} to sc/ subdirectory")
|
||||
self.logger.warning(
|
||||
f"Could not copy {filename} to sc/ subdirectory"
|
||||
)
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Error migrating {filename}: {e}")
|
||||
|
||||
if migrated_count > 0:
|
||||
self.logger.success(f"Successfully migrated {migrated_count} commands to /sc: namespace")
|
||||
self.logger.info("Commands are now available as /sc:analyze, /sc:build, etc.")
|
||||
self.logger.success(
|
||||
f"Successfully migrated {migrated_count} commands to /sc: namespace"
|
||||
)
|
||||
self.logger.info(
|
||||
"Commands are now available as /sc:analyze, /sc:build, etc."
|
||||
)
|
||||
|
||||
# Try to remove old commands directory if empty
|
||||
try:
|
||||
if old_commands_dir.exists():
|
||||
remaining_files = [f for f in old_commands_dir.iterdir() if f.is_file()]
|
||||
remaining_files = [
|
||||
f for f in old_commands_dir.iterdir() if f.is_file()
|
||||
]
|
||||
if not remaining_files:
|
||||
# Only remove if no user files remain
|
||||
old_commands_dir.rmdir()
|
||||
self.logger.debug("Removed empty old commands directory")
|
||||
self.logger.debug(
|
||||
"Removed empty old commands directory"
|
||||
)
|
||||
except Exception as e:
|
||||
self.logger.debug(f"Could not remove old commands directory: {e}")
|
||||
self.logger.debug(
|
||||
f"Could not remove old commands directory: {e}"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Error during command migration: {e}")
|
||||
|
||||
@ -10,6 +10,7 @@ from ..core.base import Component
|
||||
from ..services.claude_md import CLAUDEMdService
|
||||
from setup import __version__
|
||||
|
||||
|
||||
class CoreComponent(Component):
|
||||
"""Core SuperClaude framework files component"""
|
||||
|
||||
@ -23,7 +24,7 @@ class CoreComponent(Component):
|
||||
"name": "core",
|
||||
"version": __version__,
|
||||
"description": "SuperClaude framework documentation and core files",
|
||||
"category": "core"
|
||||
"category": "core",
|
||||
}
|
||||
|
||||
def get_metadata_modifications(self) -> Dict[str, Any]:
|
||||
@ -31,24 +32,24 @@ class CoreComponent(Component):
|
||||
return {
|
||||
"framework": {
|
||||
"version": __version__,
|
||||
"name": "SuperClaude",
|
||||
"name": "superclaude",
|
||||
"description": "AI-enhanced development framework for Claude Code",
|
||||
"installation_type": "global",
|
||||
"components": ["core"]
|
||||
"components": ["core"],
|
||||
},
|
||||
"superclaude": {
|
||||
"enabled": True,
|
||||
"version": __version__,
|
||||
"profile": "default",
|
||||
"auto_update": False
|
||||
}
|
||||
"auto_update": False,
|
||||
},
|
||||
}
|
||||
|
||||
def _install(self, config: Dict[str, Any]) -> bool:
|
||||
"""Install core component"""
|
||||
self.logger.info("Installing SuperClaude core framework files...")
|
||||
|
||||
return super()._install(config);
|
||||
return super()._install(config)
|
||||
|
||||
def _post_install(self) -> bool:
|
||||
# Create or update metadata
|
||||
@ -58,17 +59,22 @@ class CoreComponent(Component):
|
||||
self.logger.info("Updated metadata with framework configuration")
|
||||
|
||||
# Add component registration to metadata
|
||||
self.settings_manager.add_component_registration("core", {
|
||||
self.settings_manager.add_component_registration(
|
||||
"core",
|
||||
{
|
||||
"version": __version__,
|
||||
"category": "core",
|
||||
"files_count": len(self.component_files)
|
||||
})
|
||||
"files_count": len(self.component_files),
|
||||
},
|
||||
)
|
||||
|
||||
self.logger.info("Updated metadata with core component registration")
|
||||
|
||||
# Migrate any existing SuperClaude data from settings.json
|
||||
if self.settings_manager.migrate_superclaude_data():
|
||||
self.logger.info("Migrated existing SuperClaude data from settings.json")
|
||||
self.logger.info(
|
||||
"Migrated existing SuperClaude data from settings.json"
|
||||
)
|
||||
except Exception as e:
|
||||
self.logger.error(f"Failed to update metadata: {e}")
|
||||
return False
|
||||
@ -86,12 +92,13 @@ class CoreComponent(Component):
|
||||
manager.add_imports(self.component_files, category="Core Framework")
|
||||
self.logger.info("Updated CLAUDE.md with core framework imports")
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Failed to update CLAUDE.md with core framework imports: {e}")
|
||||
self.logger.warning(
|
||||
f"Failed to update CLAUDE.md with core framework imports: {e}"
|
||||
)
|
||||
# Don't fail the whole installation for this
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def uninstall(self) -> bool:
|
||||
"""Uninstall core component"""
|
||||
try:
|
||||
@ -122,7 +129,9 @@ class CoreComponent(Component):
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
self.logger.success(f"Core component uninstalled ({removed_count} files removed)")
|
||||
self.logger.success(
|
||||
f"Core component uninstalled ({removed_count} files removed)"
|
||||
)
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
@ -146,7 +155,9 @@ class CoreComponent(Component):
|
||||
self.logger.info(f"Core component already at version {target_version}")
|
||||
return True
|
||||
|
||||
self.logger.info(f"Updating core component from {current_version} to {target_version}")
|
||||
self.logger.info(
|
||||
f"Updating core component from {current_version} to {target_version}"
|
||||
)
|
||||
|
||||
# Create backup of existing files
|
||||
backup_files = []
|
||||
@ -169,13 +180,15 @@ class CoreComponent(Component):
|
||||
except Exception:
|
||||
pass # Ignore cleanup errors
|
||||
|
||||
self.logger.success(f"Core component updated to version {target_version}")
|
||||
self.logger.success(
|
||||
f"Core component updated to version {target_version}"
|
||||
)
|
||||
else:
|
||||
# Restore from backup on failure
|
||||
self.logger.warning("Update failed, restoring from backup...")
|
||||
for backup_path in backup_files:
|
||||
try:
|
||||
original_path = backup_path.with_suffix('')
|
||||
original_path = backup_path.with_suffix("")
|
||||
shutil.move(str(backup_path), str(original_path))
|
||||
self.logger.debug(f"Restored {original_path.name}")
|
||||
except Exception as e:
|
||||
@ -207,7 +220,9 @@ class CoreComponent(Component):
|
||||
installed_version = self.settings_manager.get_component_version("core")
|
||||
expected_version = self.get_metadata()["version"]
|
||||
if installed_version != expected_version:
|
||||
errors.append(f"Version mismatch: installed {installed_version}, expected {expected_version}")
|
||||
errors.append(
|
||||
f"Version mismatch: installed {installed_version}, expected {expected_version}"
|
||||
)
|
||||
|
||||
# Check metadata structure
|
||||
try:
|
||||
@ -226,10 +241,10 @@ class CoreComponent(Component):
|
||||
|
||||
def _get_source_dir(self):
|
||||
"""Get source directory for framework files"""
|
||||
# Assume we're in SuperClaude/setup/components/core.py
|
||||
# and framework files are in SuperClaude/SuperClaude/Core/
|
||||
# Assume we're in superclaude/setup/components/core.py
|
||||
# and framework files are in superclaude/superclaude/Core/
|
||||
project_root = Path(__file__).parent.parent.parent
|
||||
return project_root / "SuperClaude" / "Core"
|
||||
return project_root / "superclaude" / "core"
|
||||
|
||||
def get_size_estimate(self) -> int:
|
||||
"""Get estimated installation size"""
|
||||
@ -255,5 +270,5 @@ class CoreComponent(Component):
|
||||
"framework_files": self.component_files,
|
||||
"estimated_size": self.get_size_estimate(),
|
||||
"install_directory": str(self.install_dir),
|
||||
"dependencies": self.get_dependencies()
|
||||
"dependencies": self.get_dependencies(),
|
||||
}
|
||||
|
||||
@ -30,13 +30,13 @@ class MCPComponent(Component):
|
||||
"name": "sequential-thinking",
|
||||
"description": "Multi-step problem solving and systematic analysis",
|
||||
"npm_package": "@modelcontextprotocol/server-sequential-thinking",
|
||||
"required": True
|
||||
"required": True,
|
||||
},
|
||||
"context7": {
|
||||
"name": "context7",
|
||||
"description": "Official library documentation and code examples",
|
||||
"npm_package": "@upstash/context7-mcp",
|
||||
"required": True
|
||||
"required": True,
|
||||
},
|
||||
"magic": {
|
||||
"name": "magic",
|
||||
@ -44,21 +44,21 @@ class MCPComponent(Component):
|
||||
"npm_package": "@21st-dev/magic",
|
||||
"required": False,
|
||||
"api_key_env": "TWENTYFIRST_API_KEY",
|
||||
"api_key_description": "21st.dev API key for UI component generation"
|
||||
"api_key_description": "21st.dev API key for UI component generation",
|
||||
},
|
||||
"playwright": {
|
||||
"name": "playwright",
|
||||
"description": "Cross-browser E2E testing and automation",
|
||||
"npm_package": "@playwright/mcp@latest",
|
||||
"required": False
|
||||
"required": False,
|
||||
},
|
||||
"serena": {
|
||||
"name": "serena",
|
||||
"description": "Semantic code analysis and intelligent editing",
|
||||
"install_method": "github",
|
||||
"install_command": "uvx --from git+https://github.com/oraios/serena serena --help",
|
||||
"run_command": "uvx --from git+https://github.com/oraios/serena serena start-mcp-server --context ide-assistant",
|
||||
"required": False
|
||||
"run_command": "uvx --from git+https://github.com/oraios/serena serena start-mcp-server --context ide-assistant --enable-web-dashboard false --enable-gui-log-window false",
|
||||
"required": False,
|
||||
},
|
||||
"morphllm-fast-apply": {
|
||||
"name": "morphllm-fast-apply",
|
||||
@ -66,7 +66,7 @@ class MCPComponent(Component):
|
||||
"npm_package": "@morph-llm/morph-fast-apply",
|
||||
"required": False,
|
||||
"api_key_env": "MORPH_API_KEY",
|
||||
"api_key_description": "Morph API key for Fast Apply"
|
||||
"api_key_description": "Morph API key for Fast Apply",
|
||||
},
|
||||
"tavily": {
|
||||
"name": "tavily",
|
||||
@ -75,15 +75,23 @@ class MCPComponent(Component):
|
||||
"install_command": "npx -y tavily-mcp@0.1.2",
|
||||
"required": False,
|
||||
"api_key_env": "TAVILY_API_KEY",
|
||||
"api_key_description": "Tavily API key for web search (get from https://app.tavily.com)"
|
||||
"api_key_description": "Tavily API key for web search (get from https://app.tavily.com)",
|
||||
},
|
||||
"chrome-devtools": {
|
||||
"name": "chrome-devtools",
|
||||
"description": "Chrome DevTools debugging and performance analysis",
|
||||
"install_method": "npm",
|
||||
"install_command": "npx -y chrome-devtools-mcp@latest",
|
||||
"required": False
|
||||
}
|
||||
"required": False,
|
||||
},
|
||||
"airis-mcp-gateway": {
|
||||
"name": "airis-mcp-gateway",
|
||||
"description": "Dynamic MCP Gateway for zero-token baseline and on-demand tool loading",
|
||||
"install_method": "github",
|
||||
"install_command": "uvx --from git+https://github.com/oraios/airis-mcp-gateway airis-mcp-gateway --help",
|
||||
"run_command": "uvx --from git+https://github.com/oraios/airis-mcp-gateway airis-mcp-gateway",
|
||||
"required": False,
|
||||
},
|
||||
}
|
||||
|
||||
def get_metadata(self) -> Dict[str, str]:
|
||||
@ -92,14 +100,16 @@ class MCPComponent(Component):
|
||||
"name": "mcp",
|
||||
"version": __version__,
|
||||
"description": "MCP server integration (Context7, Sequential, Magic, Playwright)",
|
||||
"category": "integration"
|
||||
"category": "integration",
|
||||
}
|
||||
|
||||
def is_reinstallable(self) -> bool:
|
||||
"""This component manages sub-components (servers) and should be re-run."""
|
||||
return True
|
||||
|
||||
def _run_command_cross_platform(self, cmd: List[str], **kwargs) -> subprocess.CompletedProcess:
|
||||
def _run_command_cross_platform(
|
||||
self, cmd: List[str], **kwargs
|
||||
) -> subprocess.CompletedProcess:
|
||||
"""
|
||||
Run a command with proper cross-platform shell handling.
|
||||
|
||||
@ -119,20 +129,21 @@ class MCPComponent(Component):
|
||||
cmd_str = " ".join(shlex.quote(str(arg)) for arg in cmd)
|
||||
|
||||
# Use the user's shell to execute the command, supporting aliases
|
||||
user_shell = os.environ.get('SHELL', '/bin/bash')
|
||||
return subprocess.run(cmd_str, shell=True, env=os.environ, executable=user_shell, **kwargs)
|
||||
user_shell = os.environ.get("SHELL", "/bin/bash")
|
||||
return subprocess.run(
|
||||
cmd_str, shell=True, env=os.environ, executable=user_shell, **kwargs
|
||||
)
|
||||
|
||||
def validate_prerequisites(self, installSubPath: Optional[Path] = None) -> Tuple[bool, List[str]]:
|
||||
def validate_prerequisites(
|
||||
self, installSubPath: Optional[Path] = None
|
||||
) -> Tuple[bool, List[str]]:
|
||||
"""Check prerequisites"""
|
||||
errors = []
|
||||
|
||||
# Check if Node.js is available
|
||||
try:
|
||||
result = self._run_command_cross_platform(
|
||||
["node", "--version"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
["node", "--version"], capture_output=True, text=True, timeout=10
|
||||
)
|
||||
if result.returncode != 0:
|
||||
errors.append("Node.js not found - required for MCP servers")
|
||||
@ -142,9 +153,11 @@ class MCPComponent(Component):
|
||||
|
||||
# Check version (require 18+)
|
||||
try:
|
||||
version_num = int(version.lstrip('v').split('.')[0])
|
||||
version_num = int(version.lstrip("v").split(".")[0])
|
||||
if version_num < 18:
|
||||
errors.append(f"Node.js version {version} found, but version 18+ required")
|
||||
errors.append(
|
||||
f"Node.js version {version} found, but version 18+ required"
|
||||
)
|
||||
except:
|
||||
self.logger.warning(f"Could not parse Node.js version: {version}")
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
@ -153,13 +166,12 @@ class MCPComponent(Component):
|
||||
# Check if Claude CLI is available
|
||||
try:
|
||||
result = self._run_command_cross_platform(
|
||||
["claude", "--version"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
["claude", "--version"], capture_output=True, text=True, timeout=10
|
||||
)
|
||||
if result.returncode != 0:
|
||||
errors.append("Claude CLI not found - required for MCP server management")
|
||||
errors.append(
|
||||
"Claude CLI not found - required for MCP server management"
|
||||
)
|
||||
else:
|
||||
version = result.stdout.strip()
|
||||
self.logger.debug(f"Found Claude CLI {version}")
|
||||
@ -169,10 +181,7 @@ class MCPComponent(Component):
|
||||
# Check if npm is available
|
||||
try:
|
||||
result = self._run_command_cross_platform(
|
||||
["npm", "--version"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
["npm", "--version"], capture_output=True, text=True, timeout=10
|
||||
)
|
||||
if result.returncode != 0:
|
||||
errors.append("npm not found - required for MCP server installation")
|
||||
@ -185,18 +194,19 @@ class MCPComponent(Component):
|
||||
# Check if uv is available (required for Serena)
|
||||
try:
|
||||
result = self._run_command_cross_platform(
|
||||
["uv", "--version"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
["uv", "--version"], capture_output=True, text=True, timeout=10
|
||||
)
|
||||
if result.returncode != 0:
|
||||
self.logger.warning("uv not found - required for Serena MCP server installation")
|
||||
self.logger.warning(
|
||||
"uv not found - required for Serena MCP server installation"
|
||||
)
|
||||
else:
|
||||
version = result.stdout.strip()
|
||||
self.logger.debug(f"Found uv {version}")
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
self.logger.warning("uv not found - required for Serena MCP server installation")
|
||||
self.logger.warning(
|
||||
"uv not found - required for Serena MCP server installation"
|
||||
)
|
||||
|
||||
return len(errors) == 0, errors
|
||||
|
||||
@ -211,24 +221,28 @@ class MCPComponent(Component):
|
||||
"mcp": {
|
||||
"version": __version__,
|
||||
"installed": True,
|
||||
"servers_count": len(self.installed_servers_in_session)
|
||||
"servers_count": len(self.installed_servers_in_session),
|
||||
}
|
||||
},
|
||||
"mcp": {
|
||||
"enabled": True,
|
||||
"servers": self.installed_servers_in_session,
|
||||
"auto_update": False
|
||||
}
|
||||
"auto_update": False,
|
||||
},
|
||||
}
|
||||
|
||||
def _install_uv_mcp_server(self, server_info: Dict[str, Any], config: Dict[str, Any]) -> bool:
|
||||
def _install_uv_mcp_server(
|
||||
self, server_info: Dict[str, Any], config: Dict[str, Any]
|
||||
) -> bool:
|
||||
"""Install a single MCP server using uv"""
|
||||
server_name = server_info["name"]
|
||||
install_command = server_info.get("install_command")
|
||||
run_command = server_info.get("run_command")
|
||||
|
||||
if not install_command:
|
||||
self.logger.error(f"No install_command found for uv-based server {server_name}")
|
||||
self.logger.error(
|
||||
f"No install_command found for uv-based server {server_name}"
|
||||
)
|
||||
return False
|
||||
if not run_command:
|
||||
self.logger.error(f"No run_command found for uv-based server {server_name}")
|
||||
@ -244,85 +258,125 @@ class MCPComponent(Component):
|
||||
# Check if uv is available
|
||||
try:
|
||||
uv_check = self._run_command_cross_platform(
|
||||
["uv", "--version"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
["uv", "--version"], capture_output=True, text=True, timeout=10
|
||||
)
|
||||
if uv_check.returncode != 0:
|
||||
self.logger.error(f"uv not found - required for {server_name} installation")
|
||||
self.logger.error(
|
||||
f"uv not found - required for {server_name} installation"
|
||||
)
|
||||
return False
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
self.logger.error(f"uv not found - required for {server_name} installation")
|
||||
self.logger.error(
|
||||
f"uv not found - required for {server_name} installation"
|
||||
)
|
||||
return False
|
||||
|
||||
if config.get("dry_run"):
|
||||
self.logger.info(f"Would install MCP server (user scope): {install_command}")
|
||||
self.logger.info(f"Would register MCP server run command: {run_command}")
|
||||
self.logger.info(
|
||||
f"Would install MCP server (user scope): {install_command}"
|
||||
)
|
||||
self.logger.info(
|
||||
f"Would register MCP server run command: {run_command}"
|
||||
)
|
||||
return True
|
||||
|
||||
# Run install command
|
||||
self.logger.debug(f"Running: {install_command}")
|
||||
cmd_parts = shlex.split(install_command)
|
||||
result = self._run_command_cross_platform(
|
||||
cmd_parts,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=900 # 15 minutes
|
||||
cmd_parts, capture_output=True, text=True, timeout=900 # 15 minutes
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
self.logger.success(f"Successfully installed MCP server (user scope): {server_name}")
|
||||
self.logger.success(
|
||||
f"Successfully installed MCP server (user scope): {server_name}"
|
||||
)
|
||||
|
||||
# For Serena, we need to handle the run command specially
|
||||
if server_name == "serena":
|
||||
# Serena needs project-specific registration, use current working directory
|
||||
current_dir = os.getcwd()
|
||||
serena_run_cmd = f"{run_command} --project {shlex.quote(current_dir)}"
|
||||
self.logger.info(f"Registering {server_name} with Claude CLI for project: {current_dir}")
|
||||
reg_cmd = ["claude", "mcp", "add", "-s", "user", "--", server_name] + shlex.split(serena_run_cmd)
|
||||
serena_run_cmd = (
|
||||
f"{run_command} --project {shlex.quote(current_dir)}"
|
||||
)
|
||||
self.logger.info(
|
||||
f"Registering {server_name} with Claude CLI for project: {current_dir}"
|
||||
)
|
||||
reg_cmd = [
|
||||
"claude",
|
||||
"mcp",
|
||||
"add",
|
||||
"-s",
|
||||
"user",
|
||||
"--",
|
||||
server_name,
|
||||
] + shlex.split(serena_run_cmd)
|
||||
else:
|
||||
self.logger.info(f"Registering {server_name} with Claude CLI. Run command: {run_command}")
|
||||
reg_cmd = ["claude", "mcp", "add", "-s", "user", "--", server_name] + shlex.split(run_command)
|
||||
self.logger.info(
|
||||
f"Registering {server_name} with Claude CLI. Run command: {run_command}"
|
||||
)
|
||||
reg_cmd = [
|
||||
"claude",
|
||||
"mcp",
|
||||
"add",
|
||||
"-s",
|
||||
"user",
|
||||
"--",
|
||||
server_name,
|
||||
] + shlex.split(run_command)
|
||||
|
||||
reg_result = self._run_command_cross_platform(
|
||||
reg_cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=120
|
||||
reg_cmd, capture_output=True, text=True, timeout=120
|
||||
)
|
||||
|
||||
if reg_result.returncode == 0:
|
||||
self.logger.success(f"Successfully registered {server_name} with Claude CLI.")
|
||||
self.logger.success(
|
||||
f"Successfully registered {server_name} with Claude CLI."
|
||||
)
|
||||
return True
|
||||
else:
|
||||
error_msg = reg_result.stderr.strip() if reg_result.stderr else "Unknown error"
|
||||
self.logger.error(f"Failed to register MCP server {server_name} with Claude CLI: {error_msg}")
|
||||
error_msg = (
|
||||
reg_result.stderr.strip()
|
||||
if reg_result.stderr
|
||||
else "Unknown error"
|
||||
)
|
||||
self.logger.error(
|
||||
f"Failed to register MCP server {server_name} with Claude CLI: {error_msg}"
|
||||
)
|
||||
return False
|
||||
else:
|
||||
error_msg = result.stderr.strip() if result.stderr else "Unknown error"
|
||||
self.logger.error(f"Failed to install MCP server {server_name} using uv: {error_msg}\n{result.stdout}")
|
||||
self.logger.error(
|
||||
f"Failed to install MCP server {server_name} using uv: {error_msg}\n{result.stdout}"
|
||||
)
|
||||
return False
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
self.logger.error(f"Timeout installing MCP server {server_name} using uv")
|
||||
return False
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error installing MCP server {server_name} using uv: {e}")
|
||||
self.logger.error(
|
||||
f"Error installing MCP server {server_name} using uv: {e}"
|
||||
)
|
||||
return False
|
||||
|
||||
|
||||
def _install_github_mcp_server(self, server_info: Dict[str, Any], config: Dict[str, Any]) -> bool:
|
||||
def _install_github_mcp_server(
|
||||
self, server_info: Dict[str, Any], config: Dict[str, Any]
|
||||
) -> bool:
|
||||
"""Install a single MCP server from GitHub using uvx"""
|
||||
server_name = server_info["name"]
|
||||
install_command = server_info.get("install_command")
|
||||
run_command = server_info.get("run_command")
|
||||
|
||||
if not install_command:
|
||||
self.logger.error(f"No install_command found for GitHub-based server {server_name}")
|
||||
self.logger.error(
|
||||
f"No install_command found for GitHub-based server {server_name}"
|
||||
)
|
||||
return False
|
||||
if not run_command:
|
||||
self.logger.error(f"No run_command found for GitHub-based server {server_name}")
|
||||
self.logger.error(
|
||||
f"No run_command found for GitHub-based server {server_name}"
|
||||
)
|
||||
return False
|
||||
|
||||
try:
|
||||
@ -335,21 +389,26 @@ class MCPComponent(Component):
|
||||
# Check if uvx is available
|
||||
try:
|
||||
uvx_check = self._run_command_cross_platform(
|
||||
["uvx", "--version"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
["uvx", "--version"], capture_output=True, text=True, timeout=10
|
||||
)
|
||||
if uvx_check.returncode != 0:
|
||||
self.logger.error(f"uvx not found - required for {server_name} installation")
|
||||
self.logger.error(
|
||||
f"uvx not found - required for {server_name} installation"
|
||||
)
|
||||
return False
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
self.logger.error(f"uvx not found - required for {server_name} installation")
|
||||
self.logger.error(
|
||||
f"uvx not found - required for {server_name} installation"
|
||||
)
|
||||
return False
|
||||
|
||||
if config.get("dry_run"):
|
||||
self.logger.info(f"Would install MCP server from GitHub: {install_command}")
|
||||
self.logger.info(f"Would register MCP server run command: {run_command}")
|
||||
self.logger.info(
|
||||
f"Would install MCP server from GitHub: {install_command}"
|
||||
)
|
||||
self.logger.info(
|
||||
f"Would register MCP server run command: {run_command}"
|
||||
)
|
||||
return True
|
||||
|
||||
# Run install command to test the GitHub installation
|
||||
@ -359,50 +418,70 @@ class MCPComponent(Component):
|
||||
cmd_parts,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=300 # 5 minutes for GitHub clone and build
|
||||
timeout=300, # 5 minutes for GitHub clone and build
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
self.logger.success(f"Successfully tested GitHub MCP server: {server_name}")
|
||||
self.logger.success(
|
||||
f"Successfully tested GitHub MCP server: {server_name}"
|
||||
)
|
||||
|
||||
# Register with Claude CLI using the run command
|
||||
self.logger.info(f"Registering {server_name} with Claude CLI. Run command: {run_command}")
|
||||
reg_cmd = ["claude", "mcp", "add", "-s", "user", "--", server_name] + shlex.split(run_command)
|
||||
self.logger.info(
|
||||
f"Registering {server_name} with Claude CLI. Run command: {run_command}"
|
||||
)
|
||||
reg_cmd = [
|
||||
"claude",
|
||||
"mcp",
|
||||
"add",
|
||||
"-s",
|
||||
"user",
|
||||
"--",
|
||||
server_name,
|
||||
] + shlex.split(run_command)
|
||||
|
||||
reg_result = self._run_command_cross_platform(
|
||||
reg_cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=120
|
||||
reg_cmd, capture_output=True, text=True, timeout=120
|
||||
)
|
||||
|
||||
if reg_result.returncode == 0:
|
||||
self.logger.success(f"Successfully registered {server_name} with Claude CLI.")
|
||||
self.logger.success(
|
||||
f"Successfully registered {server_name} with Claude CLI."
|
||||
)
|
||||
return True
|
||||
else:
|
||||
error_msg = reg_result.stderr.strip() if reg_result.stderr else "Unknown error"
|
||||
self.logger.error(f"Failed to register MCP server {server_name} with Claude CLI: {error_msg}")
|
||||
error_msg = (
|
||||
reg_result.stderr.strip()
|
||||
if reg_result.stderr
|
||||
else "Unknown error"
|
||||
)
|
||||
self.logger.error(
|
||||
f"Failed to register MCP server {server_name} with Claude CLI: {error_msg}"
|
||||
)
|
||||
return False
|
||||
else:
|
||||
error_msg = result.stderr.strip() if result.stderr else "Unknown error"
|
||||
self.logger.error(f"Failed to install MCP server {server_name} from GitHub: {error_msg}\n{result.stdout}")
|
||||
self.logger.error(
|
||||
f"Failed to install MCP server {server_name} from GitHub: {error_msg}\n{result.stdout}"
|
||||
)
|
||||
return False
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
self.logger.error(f"Timeout installing MCP server {server_name} from GitHub")
|
||||
self.logger.error(
|
||||
f"Timeout installing MCP server {server_name} from GitHub"
|
||||
)
|
||||
return False
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error installing MCP server {server_name} from GitHub: {e}")
|
||||
self.logger.error(
|
||||
f"Error installing MCP server {server_name} from GitHub: {e}"
|
||||
)
|
||||
return False
|
||||
|
||||
def _check_mcp_server_installed(self, server_name: str) -> bool:
|
||||
"""Check if MCP server is already installed"""
|
||||
try:
|
||||
result = self._run_command_cross_platform(
|
||||
["claude", "mcp", "list"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=60
|
||||
["claude", "mcp", "list"], capture_output=True, text=True, timeout=60
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
@ -427,8 +506,16 @@ class MCPComponent(Component):
|
||||
self.install_dir / "claude_desktop_config.json",
|
||||
Path.home() / ".claude" / "claude_desktop_config.json",
|
||||
Path.home() / ".claude.json", # Claude CLI config
|
||||
Path.home() / "AppData" / "Roaming" / "Claude" / "claude_desktop_config.json", # Windows
|
||||
Path.home() / "Library" / "Application Support" / "Claude" / "claude_desktop_config.json", # macOS
|
||||
Path.home()
|
||||
/ "AppData"
|
||||
/ "Roaming"
|
||||
/ "Claude"
|
||||
/ "claude_desktop_config.json", # Windows
|
||||
Path.home()
|
||||
/ "Library"
|
||||
/ "Application Support"
|
||||
/ "Claude"
|
||||
/ "claude_desktop_config.json", # macOS
|
||||
]
|
||||
|
||||
config_file = None
|
||||
@ -442,7 +529,8 @@ class MCPComponent(Component):
|
||||
return detected_servers
|
||||
|
||||
import json
|
||||
with open(config_file, 'r') as f:
|
||||
|
||||
with open(config_file, "r") as f:
|
||||
config = json.load(f)
|
||||
|
||||
# Extract MCP server names from mcpServers section
|
||||
@ -454,7 +542,9 @@ class MCPComponent(Component):
|
||||
detected_servers.append(normalized_name)
|
||||
|
||||
if detected_servers:
|
||||
self.logger.info(f"Detected existing MCP servers from config: {detected_servers}")
|
||||
self.logger.info(
|
||||
f"Detected existing MCP servers from config: {detected_servers}"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not read Claude Desktop config: {e}")
|
||||
@ -467,10 +557,7 @@ class MCPComponent(Component):
|
||||
|
||||
try:
|
||||
result = self._run_command_cross_platform(
|
||||
["claude", "mcp", "list"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=60
|
||||
["claude", "mcp", "list"], capture_output=True, text=True, timeout=60
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
@ -478,10 +565,10 @@ class MCPComponent(Component):
|
||||
return detected_servers
|
||||
|
||||
# Parse the output to extract server names
|
||||
output_lines = result.stdout.strip().split('\n')
|
||||
output_lines = result.stdout.strip().split("\n")
|
||||
for line in output_lines:
|
||||
line = line.strip().lower()
|
||||
if line and not line.startswith('#') and not line.startswith('no'):
|
||||
if line and not line.startswith("#") and not line.startswith("no"):
|
||||
# Extract server name (usually the first word or before first space/colon)
|
||||
server_name = line.split()[0] if line.split() else ""
|
||||
normalized_name = self._normalize_server_name(server_name)
|
||||
@ -489,7 +576,9 @@ class MCPComponent(Component):
|
||||
detected_servers.append(normalized_name)
|
||||
|
||||
if detected_servers:
|
||||
self.logger.info(f"Detected existing MCP servers from CLI: {detected_servers}")
|
||||
self.logger.info(
|
||||
f"Detected existing MCP servers from CLI: {detected_servers}"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not detect existing MCP servers from CLI: {e}")
|
||||
@ -513,12 +602,17 @@ class MCPComponent(Component):
|
||||
"serena": "serena",
|
||||
"morphllm": "morphllm-fast-apply",
|
||||
"morphllm-fast-apply": "morphllm-fast-apply",
|
||||
"morph": "morphllm-fast-apply"
|
||||
"morph": "morphllm-fast-apply",
|
||||
}
|
||||
|
||||
return name_mappings.get(server_name)
|
||||
|
||||
def _merge_server_lists(self, existing_servers: List[str], selected_servers: List[str], previous_servers: List[str]) -> List[str]:
|
||||
def _merge_server_lists(
|
||||
self,
|
||||
existing_servers: List[str],
|
||||
selected_servers: List[str],
|
||||
previous_servers: List[str],
|
||||
) -> List[str]:
|
||||
"""Merge existing, selected, and previously installed servers"""
|
||||
all_servers = set()
|
||||
|
||||
@ -541,7 +635,9 @@ class MCPComponent(Component):
|
||||
|
||||
return valid_servers
|
||||
|
||||
def _install_mcp_server(self, server_info: Dict[str, Any], config: Dict[str, Any]) -> bool:
|
||||
def _install_mcp_server(
|
||||
self, server_info: Dict[str, Any], config: Dict[str, Any]
|
||||
) -> bool:
|
||||
"""Install a single MCP server"""
|
||||
if server_info.get("install_method") == "uv":
|
||||
return self._install_uv_mcp_server(server_info, config)
|
||||
@ -553,7 +649,9 @@ class MCPComponent(Component):
|
||||
install_command = server_info.get("install_command")
|
||||
|
||||
if not npm_package and not install_command:
|
||||
self.logger.error(f"No npm_package or install_command found for server {server_name}")
|
||||
self.logger.error(
|
||||
f"No npm_package or install_command found for server {server_name}"
|
||||
)
|
||||
return False
|
||||
|
||||
command = "npx"
|
||||
@ -569,7 +667,9 @@ class MCPComponent(Component):
|
||||
# Handle API key requirements
|
||||
if "api_key_env" in server_info:
|
||||
api_key_env = server_info["api_key_env"]
|
||||
api_key_desc = server_info.get("api_key_description", f"API key for {server_name}")
|
||||
api_key_desc = server_info.get(
|
||||
"api_key_description", f"API key for {server_name}"
|
||||
)
|
||||
|
||||
if not config.get("dry_run", False):
|
||||
display_info(f"MCP server '{server_name}' requires an API key")
|
||||
@ -578,47 +678,76 @@ class MCPComponent(Component):
|
||||
|
||||
# Check if API key is already set
|
||||
import os
|
||||
|
||||
if not os.getenv(api_key_env):
|
||||
display_warning(f"API key {api_key_env} not found in environment")
|
||||
self.logger.warning(f"Proceeding without {api_key_env} - server may not function properly")
|
||||
display_warning(
|
||||
f"API key {api_key_env} not found in environment"
|
||||
)
|
||||
self.logger.warning(
|
||||
f"Proceeding without {api_key_env} - server may not function properly"
|
||||
)
|
||||
|
||||
# Install using Claude CLI
|
||||
if install_command:
|
||||
# Use the full install command (e.g., for tavily-mcp@0.1.2)
|
||||
install_args = install_command.split()
|
||||
if config.get("dry_run"):
|
||||
self.logger.info(f"Would install MCP server (user scope): claude mcp add -s user {server_name} {' '.join(install_args)}")
|
||||
self.logger.info(
|
||||
f"Would install MCP server (user scope): claude mcp add -s user {server_name} {' '.join(install_args)}"
|
||||
)
|
||||
return True
|
||||
|
||||
self.logger.debug(f"Running: claude mcp add -s user {server_name} {' '.join(install_args)}")
|
||||
self.logger.debug(
|
||||
f"Running: claude mcp add -s user {server_name} {' '.join(install_args)}"
|
||||
)
|
||||
|
||||
result = self._run_command_cross_platform(
|
||||
["claude", "mcp", "add", "-s", "user", "--", server_name] + install_args,
|
||||
["claude", "mcp", "add", "-s", "user", "--", server_name]
|
||||
+ install_args,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=120 # 2 minutes timeout for installation
|
||||
timeout=120, # 2 minutes timeout for installation
|
||||
)
|
||||
else:
|
||||
# Use npm_package
|
||||
if config.get("dry_run"):
|
||||
self.logger.info(f"Would install MCP server (user scope): claude mcp add -s user {server_name} {command} -y {npm_package}")
|
||||
self.logger.info(
|
||||
f"Would install MCP server (user scope): claude mcp add -s user {server_name} {command} -y {npm_package}"
|
||||
)
|
||||
return True
|
||||
|
||||
self.logger.debug(f"Running: claude mcp add -s user {server_name} {command} -y {npm_package}")
|
||||
self.logger.debug(
|
||||
f"Running: claude mcp add -s user {server_name} {command} -y {npm_package}"
|
||||
)
|
||||
|
||||
result = self._run_command_cross_platform(
|
||||
["claude", "mcp", "add", "-s", "user", "--", server_name, command, "-y", npm_package],
|
||||
[
|
||||
"claude",
|
||||
"mcp",
|
||||
"add",
|
||||
"-s",
|
||||
"user",
|
||||
"--",
|
||||
server_name,
|
||||
command,
|
||||
"-y",
|
||||
npm_package,
|
||||
],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=120 # 2 minutes timeout for installation
|
||||
timeout=120, # 2 minutes timeout for installation
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
self.logger.success(f"Successfully installed MCP server (user scope): {server_name}")
|
||||
self.logger.success(
|
||||
f"Successfully installed MCP server (user scope): {server_name}"
|
||||
)
|
||||
return True
|
||||
else:
|
||||
error_msg = result.stderr.strip() if result.stderr else "Unknown error"
|
||||
self.logger.error(f"Failed to install MCP server {server_name}: {error_msg}")
|
||||
self.logger.error(
|
||||
f"Failed to install MCP server {server_name}: {error_msg}"
|
||||
)
|
||||
return False
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
@ -638,21 +767,27 @@ class MCPComponent(Component):
|
||||
self.logger.info(f"MCP server {server_name} not installed")
|
||||
return True
|
||||
|
||||
self.logger.debug(f"Running: claude mcp remove {server_name} (auto-detect scope)")
|
||||
self.logger.debug(
|
||||
f"Running: claude mcp remove {server_name} (auto-detect scope)"
|
||||
)
|
||||
|
||||
result = self._run_command_cross_platform(
|
||||
["claude", "mcp", "remove", server_name],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=60
|
||||
timeout=60,
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
self.logger.success(f"Successfully uninstalled MCP server: {server_name}")
|
||||
self.logger.success(
|
||||
f"Successfully uninstalled MCP server: {server_name}"
|
||||
)
|
||||
return True
|
||||
else:
|
||||
error_msg = result.stderr.strip() if result.stderr else "Unknown error"
|
||||
self.logger.error(f"Failed to uninstall MCP server {server_name}: {error_msg}")
|
||||
self.logger.error(
|
||||
f"Failed to uninstall MCP server {server_name}: {error_msg}"
|
||||
)
|
||||
return False
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
@ -686,10 +821,14 @@ class MCPComponent(Component):
|
||||
previous_servers = self.settings_manager.get_metadata_setting("mcp.servers", [])
|
||||
|
||||
# Merge all server lists
|
||||
all_servers = self._merge_server_lists(existing_servers, selected_servers, previous_servers)
|
||||
all_servers = self._merge_server_lists(
|
||||
existing_servers, selected_servers, previous_servers
|
||||
)
|
||||
|
||||
if not all_servers:
|
||||
self.logger.info("No MCP servers detected or selected. Skipping MCP installation.")
|
||||
self.logger.info(
|
||||
"No MCP servers detected or selected. Skipping MCP installation."
|
||||
)
|
||||
# Still run post-install to update metadata
|
||||
return self._post_install()
|
||||
|
||||
@ -706,7 +845,9 @@ class MCPComponent(Component):
|
||||
|
||||
# Check if already installed and working
|
||||
if self._check_mcp_server_installed(server_name):
|
||||
self.logger.info(f"MCP server {server_name} already installed and working")
|
||||
self.logger.info(
|
||||
f"MCP server {server_name} already installed and working"
|
||||
)
|
||||
installed_count += 1
|
||||
verified_servers.append(server_name)
|
||||
else:
|
||||
@ -719,10 +860,14 @@ class MCPComponent(Component):
|
||||
|
||||
# Check if this is a required server
|
||||
if server_info.get("required", False):
|
||||
self.logger.error(f"Required MCP server {server_name} failed to install")
|
||||
self.logger.error(
|
||||
f"Required MCP server {server_name} failed to install"
|
||||
)
|
||||
return False
|
||||
else:
|
||||
self.logger.warning(f"Unknown MCP server '{server_name}' cannot be managed by SuperClaude")
|
||||
self.logger.warning(
|
||||
f"Unknown MCP server '{server_name}' cannot be managed by SuperClaude"
|
||||
)
|
||||
|
||||
# Update the list of successfully managed servers
|
||||
self.installed_servers_in_session = verified_servers
|
||||
@ -735,12 +880,12 @@ class MCPComponent(Component):
|
||||
["claude", "mcp", "list"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=60
|
||||
timeout=60,
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
self.logger.debug("MCP servers list:")
|
||||
for line in result.stdout.strip().split('\n'):
|
||||
for line in result.stdout.strip().split("\n"):
|
||||
if line.strip():
|
||||
self.logger.debug(f" {line.strip()}")
|
||||
else:
|
||||
@ -751,9 +896,13 @@ class MCPComponent(Component):
|
||||
|
||||
if failed_servers:
|
||||
self.logger.warning(f"Some MCP servers failed to install: {failed_servers}")
|
||||
self.logger.success(f"MCP component partially managed ({installed_count} servers)")
|
||||
self.logger.success(
|
||||
f"MCP component partially managed ({installed_count} servers)"
|
||||
)
|
||||
else:
|
||||
self.logger.success(f"MCP component successfully managing ({installed_count} servers)")
|
||||
self.logger.success(
|
||||
f"MCP component successfully managing ({installed_count} servers)"
|
||||
)
|
||||
|
||||
return self._post_install()
|
||||
|
||||
@ -765,12 +914,15 @@ class MCPComponent(Component):
|
||||
self.settings_manager.update_metadata(metadata_mods)
|
||||
|
||||
# Add component registration to metadata
|
||||
self.settings_manager.add_component_registration("mcp", {
|
||||
self.settings_manager.add_component_registration(
|
||||
"mcp",
|
||||
{
|
||||
"version": __version__,
|
||||
"category": "integration",
|
||||
"servers_count": len(self.installed_servers_in_session),
|
||||
"installed_servers": self.installed_servers_in_session
|
||||
})
|
||||
"installed_servers": self.installed_servers_in_session,
|
||||
},
|
||||
)
|
||||
|
||||
self.logger.info("Updated metadata with MCP component registration")
|
||||
return True
|
||||
@ -803,7 +955,9 @@ class MCPComponent(Component):
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
self.logger.success(f"MCP component uninstalled ({uninstalled_count} servers removed)")
|
||||
self.logger.success(
|
||||
f"MCP component uninstalled ({uninstalled_count} servers removed)"
|
||||
)
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
@ -827,7 +981,9 @@ class MCPComponent(Component):
|
||||
self.logger.info(f"MCP component already at version {target_version}")
|
||||
return True
|
||||
|
||||
self.logger.info(f"Updating MCP component from {current_version} to {target_version}")
|
||||
self.logger.info(
|
||||
f"Updating MCP component from {current_version} to {target_version}"
|
||||
)
|
||||
|
||||
# For MCP servers, update means reinstall to get latest versions
|
||||
updated_count = 0
|
||||
@ -855,7 +1011,9 @@ class MCPComponent(Component):
|
||||
metadata = self.settings_manager.load_metadata()
|
||||
if "components" in metadata and "mcp" in metadata["components"]:
|
||||
metadata["components"]["mcp"]["version"] = target_version
|
||||
metadata["components"]["mcp"]["servers_count"] = len(self.mcp_servers)
|
||||
metadata["components"]["mcp"]["servers_count"] = len(
|
||||
self.mcp_servers
|
||||
)
|
||||
if "mcp" in metadata:
|
||||
metadata["mcp"]["servers"] = list(self.mcp_servers.keys())
|
||||
self.settings_manager.save_metadata(metadata)
|
||||
@ -863,10 +1021,14 @@ class MCPComponent(Component):
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
if failed_servers:
|
||||
self.logger.warning(f"Some MCP servers failed to update: {failed_servers}")
|
||||
self.logger.warning(
|
||||
f"Some MCP servers failed to update: {failed_servers}"
|
||||
)
|
||||
return False
|
||||
else:
|
||||
self.logger.success(f"MCP component updated to version {target_version}")
|
||||
self.logger.success(
|
||||
f"MCP component updated to version {target_version}"
|
||||
)
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
@ -886,28 +1048,33 @@ class MCPComponent(Component):
|
||||
installed_version = self.settings_manager.get_component_version("mcp")
|
||||
expected_version = self.get_metadata()["version"]
|
||||
if installed_version != expected_version:
|
||||
errors.append(f"Version mismatch: installed {installed_version}, expected {expected_version}")
|
||||
errors.append(
|
||||
f"Version mismatch: installed {installed_version}, expected {expected_version}"
|
||||
)
|
||||
|
||||
# Check if Claude CLI is available and validate installed servers
|
||||
try:
|
||||
result = self._run_command_cross_platform(
|
||||
["claude", "mcp", "list"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=60
|
||||
["claude", "mcp", "list"], capture_output=True, text=True, timeout=60
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
errors.append("Could not communicate with Claude CLI for MCP server verification")
|
||||
errors.append(
|
||||
"Could not communicate with Claude CLI for MCP server verification"
|
||||
)
|
||||
else:
|
||||
claude_mcp_output = result.stdout.lower()
|
||||
|
||||
# Get the list of servers that should be installed from metadata
|
||||
installed_servers = self.settings_manager.get_metadata_setting("mcp.servers", [])
|
||||
installed_servers = self.settings_manager.get_metadata_setting(
|
||||
"mcp.servers", []
|
||||
)
|
||||
|
||||
for server_name in installed_servers:
|
||||
if server_name.lower() not in claude_mcp_output:
|
||||
errors.append(f"Installed MCP server '{server_name}' not found in 'claude mcp list' output.")
|
||||
errors.append(
|
||||
f"Installed MCP server '{server_name}' not found in 'claude mcp list' output."
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
errors.append(f"Could not verify MCP server installation: {e}")
|
||||
@ -933,5 +1100,5 @@ class MCPComponent(Component):
|
||||
"mcp_servers": list(self.mcp_servers.keys()),
|
||||
"estimated_size": self.get_size_estimate(),
|
||||
"dependencies": self.get_dependencies(),
|
||||
"required_tools": ["node", "npm", "claude"]
|
||||
"required_tools": ["node", "npm", "claude"],
|
||||
}
|
||||
|
||||
@ -29,7 +29,7 @@ class MCPDocsComponent(Component):
|
||||
"serena": "MCP_Serena.md",
|
||||
"morphllm": "MCP_Morphllm.md",
|
||||
"morphllm-fast-apply": "MCP_Morphllm.md", # Handle both naming conventions
|
||||
"tavily": "MCP_Tavily.md"
|
||||
"tavily": "MCP_Tavily.md",
|
||||
}
|
||||
|
||||
super().__init__(install_dir, Path(""))
|
||||
@ -40,7 +40,7 @@ class MCPDocsComponent(Component):
|
||||
"name": "mcp_docs",
|
||||
"version": __version__,
|
||||
"description": "MCP server documentation and usage guides",
|
||||
"category": "documentation"
|
||||
"category": "documentation",
|
||||
}
|
||||
|
||||
def is_reinstallable(self) -> bool:
|
||||
@ -73,9 +73,13 @@ class MCPDocsComponent(Component):
|
||||
target = self.install_dir / doc_file
|
||||
if source.exists():
|
||||
files.append((source, target))
|
||||
self.logger.debug(f"Will install documentation for {server_name}: {doc_file}")
|
||||
self.logger.debug(
|
||||
f"Will install documentation for {server_name}: {doc_file}"
|
||||
)
|
||||
else:
|
||||
self.logger.warning(f"Documentation file not found for {server_name}: {doc_file}")
|
||||
self.logger.warning(
|
||||
f"Documentation file not found for {server_name}: {doc_file}"
|
||||
)
|
||||
|
||||
return files
|
||||
|
||||
@ -101,8 +105,16 @@ class MCPDocsComponent(Component):
|
||||
self.install_dir / "claude_desktop_config.json",
|
||||
Path.home() / ".claude" / "claude_desktop_config.json",
|
||||
Path.home() / ".claude.json", # Claude CLI config
|
||||
Path.home() / "AppData" / "Roaming" / "Claude" / "claude_desktop_config.json", # Windows
|
||||
Path.home() / "Library" / "Application Support" / "Claude" / "claude_desktop_config.json", # macOS
|
||||
Path.home()
|
||||
/ "AppData"
|
||||
/ "Roaming"
|
||||
/ "Claude"
|
||||
/ "claude_desktop_config.json", # Windows
|
||||
Path.home()
|
||||
/ "Library"
|
||||
/ "Application Support"
|
||||
/ "Claude"
|
||||
/ "claude_desktop_config.json", # macOS
|
||||
]
|
||||
|
||||
config_file = None
|
||||
@ -116,7 +128,8 @@ class MCPDocsComponent(Component):
|
||||
return detected_servers
|
||||
|
||||
import json
|
||||
with open(config_file, 'r') as f:
|
||||
|
||||
with open(config_file, "r") as f:
|
||||
config = json.load(f)
|
||||
|
||||
# Extract MCP server names from mcpServers section
|
||||
@ -128,7 +141,9 @@ class MCPDocsComponent(Component):
|
||||
detected_servers.append(normalized_name)
|
||||
|
||||
if detected_servers:
|
||||
self.logger.info(f"Detected existing MCP servers from config: {detected_servers}")
|
||||
self.logger.info(
|
||||
f"Detected existing MCP servers from config: {detected_servers}"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not read Claude Desktop config: {e}")
|
||||
@ -152,7 +167,7 @@ class MCPDocsComponent(Component):
|
||||
"serena": "serena",
|
||||
"morphllm": "morphllm",
|
||||
"morphllm-fast-apply": "morphllm",
|
||||
"morph": "morphllm"
|
||||
"morph": "morphllm",
|
||||
}
|
||||
|
||||
return name_mappings.get(server_name)
|
||||
@ -169,7 +184,9 @@ class MCPDocsComponent(Component):
|
||||
selected_servers = config.get("selected_mcp_servers", [])
|
||||
|
||||
# Get previously documented servers from metadata
|
||||
previous_servers = self.settings_manager.get_metadata_setting("components.mcp_docs.servers_documented", [])
|
||||
previous_servers = self.settings_manager.get_metadata_setting(
|
||||
"components.mcp_docs.servers_documented", []
|
||||
)
|
||||
|
||||
# Merge all server lists
|
||||
all_servers = list(set(detected_servers + selected_servers + previous_servers))
|
||||
@ -178,13 +195,17 @@ class MCPDocsComponent(Component):
|
||||
valid_servers = [s for s in all_servers if s in self.server_docs_map]
|
||||
|
||||
if not valid_servers:
|
||||
self.logger.info("No MCP servers detected or selected for documentation installation")
|
||||
self.logger.info(
|
||||
"No MCP servers detected or selected for documentation installation"
|
||||
)
|
||||
# Still proceed to update metadata
|
||||
self.set_selected_servers([])
|
||||
self.component_files = []
|
||||
return self._post_install()
|
||||
|
||||
self.logger.info(f"Installing documentation for MCP servers: {', '.join(valid_servers)}")
|
||||
self.logger.info(
|
||||
f"Installing documentation for MCP servers: {', '.join(valid_servers)}"
|
||||
)
|
||||
if detected_servers:
|
||||
self.logger.info(f" - Detected from config: {detected_servers}")
|
||||
if selected_servers:
|
||||
@ -225,12 +246,16 @@ class MCPDocsComponent(Component):
|
||||
self.logger.error(f"Failed to copy {source.name}")
|
||||
|
||||
if success_count != len(files_to_install):
|
||||
self.logger.error(f"Only {success_count}/{len(files_to_install)} documentation files copied successfully")
|
||||
self.logger.error(
|
||||
f"Only {success_count}/{len(files_to_install)} documentation files copied successfully"
|
||||
)
|
||||
return False
|
||||
|
||||
# Update component_files to only include successfully copied files
|
||||
self.component_files = successfully_copied_files
|
||||
self.logger.success(f"MCP documentation installed successfully ({success_count} files for {len(valid_servers)} servers)")
|
||||
self.logger.success(
|
||||
f"MCP documentation installed successfully ({success_count} files for {len(valid_servers)} servers)"
|
||||
)
|
||||
|
||||
return self._post_install()
|
||||
|
||||
@ -244,7 +269,7 @@ class MCPDocsComponent(Component):
|
||||
"version": __version__,
|
||||
"installed": True,
|
||||
"files_count": len(self.component_files),
|
||||
"servers_documented": self.selected_servers
|
||||
"servers_documented": self.selected_servers,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -257,7 +282,9 @@ class MCPDocsComponent(Component):
|
||||
manager.add_imports(self.component_files, category="MCP Documentation")
|
||||
self.logger.info("Updated CLAUDE.md with MCP documentation imports")
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Failed to update CLAUDE.md with MCP documentation imports: {e}")
|
||||
self.logger.warning(
|
||||
f"Failed to update CLAUDE.md with MCP documentation imports: {e}"
|
||||
)
|
||||
# Don't fail the whole installation for this
|
||||
|
||||
return True
|
||||
@ -300,11 +327,15 @@ class MCPDocsComponent(Component):
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update settings.json: {e}")
|
||||
|
||||
self.logger.success(f"MCP documentation uninstalled ({removed_count} files removed)")
|
||||
self.logger.success(
|
||||
f"MCP documentation uninstalled ({removed_count} files removed)"
|
||||
)
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
self.logger.exception(f"Unexpected error during MCP docs uninstallation: {e}")
|
||||
self.logger.exception(
|
||||
f"Unexpected error during MCP docs uninstallation: {e}"
|
||||
)
|
||||
return False
|
||||
|
||||
def get_dependencies(self) -> List[str]:
|
||||
@ -313,10 +344,10 @@ class MCPDocsComponent(Component):
|
||||
|
||||
def _get_source_dir(self) -> Optional[Path]:
|
||||
"""Get source directory for MCP documentation files"""
|
||||
# Assume we're in SuperClaude/setup/components/mcp_docs.py
|
||||
# and MCP docs are in SuperClaude/SuperClaude/MCP/
|
||||
# Assume we're in superclaude/setup/components/mcp_docs.py
|
||||
# and MCP docs are in superclaude/superclaude/MCP/
|
||||
project_root = Path(__file__).parent.parent.parent
|
||||
mcp_dir = project_root / "SuperClaude" / "MCP"
|
||||
mcp_dir = project_root / "superclaude" / "mcp"
|
||||
|
||||
# Return None if directory doesn't exist to prevent warning
|
||||
if not mcp_dir.exists():
|
||||
|
||||
@ -23,7 +23,7 @@ class ModesComponent(Component):
|
||||
"name": "modes",
|
||||
"version": __version__,
|
||||
"description": "7 behavioral modes for enhanced Claude Code operation",
|
||||
"category": "modes"
|
||||
"category": "modes",
|
||||
}
|
||||
|
||||
def _install(self, config: Dict[str, Any]) -> bool:
|
||||
@ -56,10 +56,14 @@ class ModesComponent(Component):
|
||||
self.logger.error(f"Failed to copy {source.name}")
|
||||
|
||||
if success_count != len(files_to_install):
|
||||
self.logger.error(f"Only {success_count}/{len(files_to_install)} mode files copied successfully")
|
||||
self.logger.error(
|
||||
f"Only {success_count}/{len(files_to_install)} mode files copied successfully"
|
||||
)
|
||||
return False
|
||||
|
||||
self.logger.success(f"Modes component installed successfully ({success_count} mode files)")
|
||||
self.logger.success(
|
||||
f"Modes component installed successfully ({success_count} mode files)"
|
||||
)
|
||||
|
||||
return self._post_install()
|
||||
|
||||
@ -72,7 +76,7 @@ class ModesComponent(Component):
|
||||
"modes": {
|
||||
"version": __version__,
|
||||
"installed": True,
|
||||
"files_count": len(self.component_files)
|
||||
"files_count": len(self.component_files),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -85,7 +89,9 @@ class ModesComponent(Component):
|
||||
manager.add_imports(self.component_files, category="Behavioral Modes")
|
||||
self.logger.info("Updated CLAUDE.md with mode imports")
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Failed to update CLAUDE.md with mode imports: {e}")
|
||||
self.logger.warning(
|
||||
f"Failed to update CLAUDE.md with mode imports: {e}"
|
||||
)
|
||||
# Don't fail the whole installation for this
|
||||
|
||||
return True
|
||||
@ -123,7 +129,9 @@ class ModesComponent(Component):
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update settings.json: {e}")
|
||||
|
||||
self.logger.success(f"Modes component uninstalled ({removed_count} files removed)")
|
||||
self.logger.success(
|
||||
f"Modes component uninstalled ({removed_count} files removed)"
|
||||
)
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
@ -136,10 +144,10 @@ class ModesComponent(Component):
|
||||
|
||||
def _get_source_dir(self) -> Optional[Path]:
|
||||
"""Get source directory for mode files"""
|
||||
# Assume we're in SuperClaude/setup/components/modes.py
|
||||
# and mode files are in SuperClaude/SuperClaude/Modes/
|
||||
# Assume we're in superclaude/setup/components/modes.py
|
||||
# and mode files are in superclaude/superclaude/Modes/
|
||||
project_root = Path(__file__).parent.parent.parent
|
||||
modes_dir = project_root / "SuperClaude" / "Modes"
|
||||
modes_dir = project_root / "superclaude" / "modes"
|
||||
|
||||
# Return None if directory doesn't exist to prevent warning
|
||||
if not modes_dir.exists():
|
||||
|
||||
@ -3,7 +3,4 @@
|
||||
from .validator import Validator
|
||||
from .registry import ComponentRegistry
|
||||
|
||||
__all__ = [
|
||||
'Validator',
|
||||
'ComponentRegistry'
|
||||
]
|
||||
__all__ = ["Validator", "ComponentRegistry"]
|
||||
|
||||
@ -15,7 +15,9 @@ from ..utils.security import SecurityValidator
|
||||
class Component(ABC):
|
||||
"""Base class for all installable components"""
|
||||
|
||||
def __init__(self, install_dir: Optional[Path] = None, component_subdir: Path = Path('')):
|
||||
def __init__(
|
||||
self, install_dir: Optional[Path] = None, component_subdir: Path = Path("")
|
||||
):
|
||||
"""
|
||||
Initialize component with installation directory
|
||||
|
||||
@ -23,6 +25,7 @@ class Component(ABC):
|
||||
install_dir: Target installation directory (defaults to ~/.claude)
|
||||
"""
|
||||
from .. import DEFAULT_INSTALL_DIR
|
||||
|
||||
# Initialize logger first
|
||||
self.logger = get_logger()
|
||||
# Resolve path safely
|
||||
@ -53,7 +56,9 @@ class Component(ABC):
|
||||
"""
|
||||
return False
|
||||
|
||||
def validate_prerequisites(self, installSubPath: Optional[Path] = None) -> Tuple[bool, List[str]]:
|
||||
def validate_prerequisites(
|
||||
self, installSubPath: Optional[Path] = None
|
||||
) -> Tuple[bool, List[str]]:
|
||||
"""
|
||||
Check prerequisites for this component
|
||||
|
||||
@ -80,13 +85,15 @@ class Component(ABC):
|
||||
|
||||
# Check write permissions to install directory
|
||||
has_perms, missing = SecurityValidator.check_permissions(
|
||||
self.install_dir, {'write'}
|
||||
self.install_dir, {"write"}
|
||||
)
|
||||
if not has_perms:
|
||||
errors.append(f"No write permissions to {self.install_dir}: {missing}")
|
||||
|
||||
# Validate installation target
|
||||
is_safe, validation_errors = SecurityValidator.validate_installation_target(self.install_component_subdir)
|
||||
is_safe, validation_errors = SecurityValidator.validate_installation_target(
|
||||
self.install_component_subdir
|
||||
)
|
||||
if not is_safe:
|
||||
errors.extend(validation_errors)
|
||||
|
||||
@ -101,7 +108,9 @@ class Component(ABC):
|
||||
errors.extend(security_errors)
|
||||
|
||||
if not self.file_manager.ensure_directory(self.install_component_subdir):
|
||||
errors.append(f"Could not create install directory: {self.install_component_subdir}")
|
||||
errors.append(
|
||||
f"Could not create install directory: {self.install_component_subdir}"
|
||||
)
|
||||
|
||||
return len(errors) == 0, errors
|
||||
|
||||
@ -138,7 +147,9 @@ class Component(ABC):
|
||||
try:
|
||||
return self._install(config)
|
||||
except Exception as e:
|
||||
self.logger.exception(f"Unexpected error during {repr(self)} installation: {e}")
|
||||
self.logger.exception(
|
||||
f"Unexpected error during {repr(self)} installation: {e}"
|
||||
)
|
||||
return False
|
||||
|
||||
@abstractmethod
|
||||
@ -174,19 +185,21 @@ class Component(ABC):
|
||||
self.logger.error(f"Failed to copy {source.name}")
|
||||
|
||||
if success_count != len(files_to_install):
|
||||
self.logger.error(f"Only {success_count}/{len(files_to_install)} files copied successfully")
|
||||
self.logger.error(
|
||||
f"Only {success_count}/{len(files_to_install)} files copied successfully"
|
||||
)
|
||||
return False
|
||||
|
||||
self.logger.success(f"{repr(self)} component installed successfully ({success_count} files)")
|
||||
self.logger.success(
|
||||
f"{repr(self)} component installed successfully ({success_count} files)"
|
||||
)
|
||||
|
||||
return self._post_install()
|
||||
|
||||
|
||||
@abstractmethod
|
||||
def _post_install(self) -> bool:
|
||||
pass
|
||||
|
||||
|
||||
@abstractmethod
|
||||
def uninstall(self) -> bool:
|
||||
"""
|
||||
@ -239,10 +252,14 @@ class Component(ABC):
|
||||
if metadata_file.exists():
|
||||
self.logger.debug("Metadata file exists, reading version")
|
||||
try:
|
||||
with open(metadata_file, 'r') as f:
|
||||
with open(metadata_file, "r") as f:
|
||||
metadata = json.load(f)
|
||||
component_name = self.get_metadata()['name']
|
||||
version = metadata.get('components', {}).get(component_name, {}).get('version')
|
||||
component_name = self.get_metadata()["name"]
|
||||
version = (
|
||||
metadata.get("components", {})
|
||||
.get(component_name, {})
|
||||
.get("version")
|
||||
)
|
||||
self.logger.debug(f"Found version: {version}")
|
||||
return version
|
||||
except Exception as e:
|
||||
@ -293,7 +310,9 @@ class Component(ABC):
|
||||
if source.is_file():
|
||||
total_size += source.stat().st_size
|
||||
elif source.is_dir():
|
||||
total_size += sum(f.stat().st_size for f in source.rglob('*') if f.is_file())
|
||||
total_size += sum(
|
||||
f.stat().st_size for f in source.rglob("*") if f.is_file()
|
||||
)
|
||||
return total_size
|
||||
|
||||
def _discover_component_files(self) -> List[str]:
|
||||
@ -310,12 +329,16 @@ class Component(ABC):
|
||||
|
||||
return self._discover_files_in_directory(
|
||||
source_dir,
|
||||
extension='.md',
|
||||
exclude_patterns=['README.md', 'CHANGELOG.md', 'LICENSE.md']
|
||||
extension=".md",
|
||||
exclude_patterns=["README.md", "CHANGELOG.md", "LICENSE.md"],
|
||||
)
|
||||
|
||||
def _discover_files_in_directory(self, directory: Path, extension: str = '.md',
|
||||
exclude_patterns: Optional[List[str]] = None) -> List[str]:
|
||||
def _discover_files_in_directory(
|
||||
self,
|
||||
directory: Path,
|
||||
extension: str = ".md",
|
||||
exclude_patterns: Optional[List[str]] = None,
|
||||
) -> List[str]:
|
||||
"""
|
||||
Shared utility for discovering files in a directory
|
||||
|
||||
@ -342,15 +365,19 @@ class Component(ABC):
|
||||
# Discover files with the specified extension
|
||||
files = []
|
||||
for file_path in directory.iterdir():
|
||||
if (file_path.is_file() and
|
||||
file_path.suffix.lower() == extension.lower() and
|
||||
file_path.name not in exclude_patterns):
|
||||
if (
|
||||
file_path.is_file()
|
||||
and file_path.suffix.lower() == extension.lower()
|
||||
and file_path.name not in exclude_patterns
|
||||
):
|
||||
files.append(file_path.name)
|
||||
|
||||
# Sort for consistent ordering
|
||||
files.sort()
|
||||
|
||||
self.logger.debug(f"Discovered {len(files)} {extension} files in {directory}")
|
||||
self.logger.debug(
|
||||
f"Discovered {len(files)} {extension} files in {directory}"
|
||||
)
|
||||
if files:
|
||||
self.logger.debug(f"Files found: {files}")
|
||||
|
||||
@ -394,13 +421,22 @@ class Component(ABC):
|
||||
|
||||
# Check for most dangerous system patterns (but allow /tmp for testing)
|
||||
dangerous_patterns = [
|
||||
'/etc/', '/bin/', '/sbin/', '/usr/bin/', '/usr/sbin/',
|
||||
'/var/log/', '/var/lib/', '/dev/', '/proc/', '/sys/',
|
||||
'c:\\windows\\', 'c:\\program files\\'
|
||||
"/etc/",
|
||||
"/bin/",
|
||||
"/sbin/",
|
||||
"/usr/bin/",
|
||||
"/usr/sbin/",
|
||||
"/var/log/",
|
||||
"/var/lib/",
|
||||
"/dev/",
|
||||
"/proc/",
|
||||
"/sys/",
|
||||
"c:\\windows\\",
|
||||
"c:\\program files\\",
|
||||
]
|
||||
|
||||
# Allow temporary directories for testing
|
||||
if path_str.startswith('/tmp/') or 'temp' in path_str:
|
||||
if path_str.startswith("/tmp/") or "temp" in path_str:
|
||||
self.logger.debug(f"Allowing temporary directory: {resolved_path}")
|
||||
return resolved_path
|
||||
|
||||
|
||||
@ -14,9 +14,7 @@ from ..utils.logger import get_logger
|
||||
class Installer:
|
||||
"""Main installer orchestrator"""
|
||||
|
||||
def __init__(self,
|
||||
install_dir: Optional[Path] = None,
|
||||
dry_run: bool = False):
|
||||
def __init__(self, install_dir: Optional[Path] = None, dry_run: bool = False):
|
||||
"""
|
||||
Initialize installer
|
||||
|
||||
@ -25,12 +23,16 @@ class Installer:
|
||||
dry_run: If True, only simulate installation
|
||||
"""
|
||||
from .. import DEFAULT_INSTALL_DIR
|
||||
|
||||
self.install_dir = install_dir or DEFAULT_INSTALL_DIR
|
||||
self.dry_run = dry_run
|
||||
self.components: Dict[str, Component] = {}
|
||||
from ..services.settings import SettingsService
|
||||
|
||||
settings_manager = SettingsService(self.install_dir)
|
||||
self.installed_components: Set[str] = set(settings_manager.get_installed_components().keys())
|
||||
self.installed_components: Set[str] = set(
|
||||
settings_manager.get_installed_components().keys()
|
||||
)
|
||||
self.updated_components: Set[str] = set()
|
||||
|
||||
self.failed_components: Set[str] = set()
|
||||
@ -46,7 +48,7 @@ class Installer:
|
||||
component: Component instance to register
|
||||
"""
|
||||
metadata = component.get_metadata()
|
||||
self.components[metadata['name']] = component
|
||||
self.components[metadata["name"]] = component
|
||||
|
||||
def register_components(self, components: List[Component]) -> None:
|
||||
"""
|
||||
@ -79,8 +81,7 @@ class Installer:
|
||||
return
|
||||
|
||||
if name in resolving:
|
||||
raise ValueError(
|
||||
f"Circular dependency detected involving {name}")
|
||||
raise ValueError(f"Circular dependency detected involving {name}")
|
||||
|
||||
if name not in self.components:
|
||||
raise ValueError(f"Unknown component: {name}")
|
||||
@ -174,7 +175,7 @@ class Installer:
|
||||
|
||||
# Always create an archive, even if empty, to ensure it's a valid tarball
|
||||
base_path = backup_dir / backup_name
|
||||
shutil.make_archive(str(base_path), 'gztar', temp_backup)
|
||||
shutil.make_archive(str(base_path), "gztar", temp_backup)
|
||||
|
||||
if not any(temp_backup.iterdir()):
|
||||
self.logger.warning(
|
||||
@ -184,8 +185,7 @@ class Installer:
|
||||
self.backup_path = backup_path
|
||||
return backup_path
|
||||
|
||||
def install_component(self, component_name: str,
|
||||
config: Dict[str, Any]) -> bool:
|
||||
def install_component(self, component_name: str, config: Dict[str, Any]) -> bool:
|
||||
"""
|
||||
Install a single component
|
||||
|
||||
@ -202,7 +202,11 @@ class Installer:
|
||||
component = self.components[component_name]
|
||||
|
||||
# Skip if already installed and not in update mode, unless component is reinstallable
|
||||
if not component.is_reinstallable() and component_name in self.installed_components and not config.get("update_mode"):
|
||||
if (
|
||||
not component.is_reinstallable()
|
||||
and component_name in self.installed_components
|
||||
and not config.get("update_mode")
|
||||
):
|
||||
self.skipped_components.add(component_name)
|
||||
self.logger.info(f"Skipping already installed component: {component_name}")
|
||||
return True
|
||||
@ -237,9 +241,9 @@ class Installer:
|
||||
self.failed_components.add(component_name)
|
||||
return False
|
||||
|
||||
def install_components(self,
|
||||
component_names: List[str],
|
||||
config: Optional[Dict[str, Any]] = None) -> bool:
|
||||
def install_components(
|
||||
self, component_names: List[str], config: Optional[Dict[str, Any]] = None
|
||||
) -> bool:
|
||||
"""
|
||||
Install multiple components in dependency order
|
||||
|
||||
@ -296,7 +300,9 @@ class Installer:
|
||||
all_valid = True
|
||||
for name in self.updated_components:
|
||||
if name not in self.components:
|
||||
self.logger.warning(f"Cannot validate component '{name}' as it was not part of this installation session.")
|
||||
self.logger.warning(
|
||||
f"Cannot validate component '{name}' as it was not part of this installation session."
|
||||
)
|
||||
continue
|
||||
|
||||
component = self.components[name]
|
||||
@ -315,12 +321,13 @@ class Installer:
|
||||
else:
|
||||
self.logger.error("Some components failed validation. Check errors above.")
|
||||
|
||||
def update_components(self, component_names: List[str], config: Dict[str, Any]) -> bool:
|
||||
def update_components(
|
||||
self, component_names: List[str], config: Dict[str, Any]
|
||||
) -> bool:
|
||||
"""Alias for update operation (uses install logic)"""
|
||||
config["update_mode"] = True
|
||||
return self.install_components(component_names, config)
|
||||
|
||||
|
||||
def get_installation_summary(self) -> Dict[str, Any]:
|
||||
"""
|
||||
Get summary of installation results
|
||||
@ -329,17 +336,17 @@ class Installer:
|
||||
Dict with installation statistics and results
|
||||
"""
|
||||
return {
|
||||
'installed': list(self.installed_components),
|
||||
'failed': list(self.failed_components),
|
||||
'skipped': list(self.skipped_components),
|
||||
'backup_path': str(self.backup_path) if self.backup_path else None,
|
||||
'install_dir': str(self.install_dir),
|
||||
'dry_run': self.dry_run
|
||||
"installed": list(self.installed_components),
|
||||
"failed": list(self.failed_components),
|
||||
"skipped": list(self.skipped_components),
|
||||
"backup_path": str(self.backup_path) if self.backup_path else None,
|
||||
"install_dir": str(self.install_dir),
|
||||
"dry_run": self.dry_run,
|
||||
}
|
||||
|
||||
def get_update_summary(self) -> Dict[str, Any]:
|
||||
return {
|
||||
'updated': list(self.updated_components),
|
||||
'failed': list(self.failed_components),
|
||||
'backup_path': str(self.backup_path) if self.backup_path else None
|
||||
"updated": list(self.updated_components),
|
||||
"failed": list(self.failed_components),
|
||||
"backup_path": str(self.backup_path) if self.backup_path else None,
|
||||
}
|
||||
|
||||
@ -46,6 +46,7 @@ class ComponentRegistry:
|
||||
|
||||
# Add components directory to Python path temporarily
|
||||
import sys
|
||||
|
||||
original_path = sys.path.copy()
|
||||
|
||||
try:
|
||||
@ -84,9 +85,11 @@ class ComponentRegistry:
|
||||
|
||||
# Find all Component subclasses in the module
|
||||
for name, obj in inspect.getmembers(module):
|
||||
if (inspect.isclass(obj) and
|
||||
issubclass(obj, Component) and
|
||||
obj is not Component):
|
||||
if (
|
||||
inspect.isclass(obj)
|
||||
and issubclass(obj, Component)
|
||||
and obj is not Component
|
||||
):
|
||||
|
||||
# Create instance to get metadata
|
||||
try:
|
||||
@ -98,7 +101,9 @@ class ComponentRegistry:
|
||||
self.component_instances[component_name] = instance
|
||||
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not instantiate component {name}: {e}")
|
||||
self.logger.warning(
|
||||
f"Could not instantiate component {name}: {e}"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not load component module {module_name}: {e}")
|
||||
@ -126,7 +131,9 @@ class ComponentRegistry:
|
||||
self.discover_components()
|
||||
return self.component_classes.get(component_name)
|
||||
|
||||
def get_component_instance(self, component_name: str, install_dir: Optional[Path] = None) -> Optional[Component]:
|
||||
def get_component_instance(
|
||||
self, component_name: str, install_dir: Optional[Path] = None
|
||||
) -> Optional[Component]:
|
||||
"""
|
||||
Get component instance by name
|
||||
|
||||
@ -146,7 +153,9 @@ class ComponentRegistry:
|
||||
try:
|
||||
return component_class(install_dir)
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error creating component instance {component_name}: {e}")
|
||||
self.logger.error(
|
||||
f"Error creating component instance {component_name}: {e}"
|
||||
)
|
||||
return None
|
||||
|
||||
return self.component_instances.get(component_name)
|
||||
@ -270,7 +279,9 @@ class ComponentRegistry:
|
||||
for name, deps in self.dependency_graph.items():
|
||||
missing_deps = deps - all_components
|
||||
if missing_deps:
|
||||
errors.append(f"Component {name} has missing dependencies: {missing_deps}")
|
||||
errors.append(
|
||||
f"Component {name} has missing dependencies: {missing_deps}"
|
||||
)
|
||||
|
||||
# Check for circular dependencies
|
||||
for name in all_components:
|
||||
@ -336,14 +347,18 @@ class ComponentRegistry:
|
||||
|
||||
if not current_level:
|
||||
# This shouldn't happen if dependency graph is valid
|
||||
raise ValueError("Circular dependency detected in installation order calculation")
|
||||
raise ValueError(
|
||||
"Circular dependency detected in installation order calculation"
|
||||
)
|
||||
|
||||
levels.append(current_level)
|
||||
remaining -= set(current_level)
|
||||
|
||||
return levels
|
||||
|
||||
def create_component_instances(self, component_names: List[str], install_dir: Optional[Path] = None) -> Dict[str, Component]:
|
||||
def create_component_instances(
|
||||
self, component_names: List[str], install_dir: Optional[Path] = None
|
||||
) -> Dict[str, Component]:
|
||||
"""
|
||||
Create instances for multiple components
|
||||
|
||||
@ -392,6 +407,8 @@ class ComponentRegistry:
|
||||
return {
|
||||
"total_components": len(self.component_classes),
|
||||
"categories": categories,
|
||||
"dependency_graph": {name: list(deps) for name, deps in self.dependency_graph.items()},
|
||||
"validation_errors": self.validate_dependency_graph()
|
||||
"dependency_graph": {
|
||||
name: list(deps) for name, deps in self.dependency_graph.items()
|
||||
},
|
||||
"validation_errors": self.validate_dependency_graph(),
|
||||
}
|
||||
@ -13,6 +13,7 @@ from ..utils.paths import get_home_directory
|
||||
# Handle packaging import - if not available, use a simple version comparison
|
||||
try:
|
||||
from packaging import version
|
||||
|
||||
PACKAGING_AVAILABLE = True
|
||||
except ImportError:
|
||||
PACKAGING_AVAILABLE = False
|
||||
@ -22,7 +23,7 @@ except ImportError:
|
||||
self.version_str = version_str
|
||||
# Simple version parsing: split by dots and convert to integers
|
||||
try:
|
||||
self.parts = [int(x) for x in version_str.split('.')]
|
||||
self.parts = [int(x) for x in version_str.split(".")]
|
||||
except ValueError:
|
||||
self.parts = [0, 0, 0]
|
||||
|
||||
@ -58,7 +59,9 @@ class Validator:
|
||||
"""Initialize validator"""
|
||||
self.validation_cache: Dict[str, Any] = {}
|
||||
|
||||
def check_python(self, min_version: str = "3.8", max_version: Optional[str] = None) -> Tuple[bool, str]:
|
||||
def check_python(
|
||||
self, min_version: str = "3.8", max_version: Optional[str] = None
|
||||
) -> Tuple[bool, str]:
|
||||
"""
|
||||
Check Python version requirements
|
||||
|
||||
@ -80,13 +83,21 @@ class Validator:
|
||||
# Check minimum version
|
||||
if version.parse(current_version) < version.parse(min_version):
|
||||
help_msg = self.get_installation_help("python")
|
||||
result = (False, f"Python {min_version}+ required, found {current_version}{help_msg}")
|
||||
result = (
|
||||
False,
|
||||
f"Python {min_version}+ required, found {current_version}{help_msg}",
|
||||
)
|
||||
self.validation_cache[cache_key] = result
|
||||
return result
|
||||
|
||||
# Check maximum version if specified
|
||||
if max_version and version.parse(current_version) > version.parse(max_version):
|
||||
result = (False, f"Python version {current_version} exceeds maximum supported {max_version}")
|
||||
if max_version and version.parse(current_version) > version.parse(
|
||||
max_version
|
||||
):
|
||||
result = (
|
||||
False,
|
||||
f"Python version {current_version} exceeds maximum supported {max_version}",
|
||||
)
|
||||
self.validation_cache[cache_key] = result
|
||||
return result
|
||||
|
||||
@ -99,7 +110,9 @@ class Validator:
|
||||
self.validation_cache[cache_key] = result
|
||||
return result
|
||||
|
||||
def check_node(self, min_version: str = "16.0", max_version: Optional[str] = None) -> Tuple[bool, str]:
|
||||
def check_node(
|
||||
self, min_version: str = "16.0", max_version: Optional[str] = None
|
||||
) -> Tuple[bool, str]:
|
||||
"""
|
||||
Check Node.js version requirements
|
||||
|
||||
@ -117,11 +130,11 @@ class Validator:
|
||||
try:
|
||||
# Check if node is installed - use shell=True on Windows for better PATH resolution
|
||||
result = subprocess.run(
|
||||
['node', '--version'],
|
||||
["node", "--version"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10,
|
||||
shell=(sys.platform == "win32")
|
||||
shell=(sys.platform == "win32"),
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
@ -132,7 +145,7 @@ class Validator:
|
||||
|
||||
# Parse version (format: v18.17.0)
|
||||
version_output = result.stdout.strip()
|
||||
if version_output.startswith('v'):
|
||||
if version_output.startswith("v"):
|
||||
current_version = version_output[1:]
|
||||
else:
|
||||
current_version = version_output
|
||||
@ -140,13 +153,21 @@ class Validator:
|
||||
# Check minimum version
|
||||
if version.parse(current_version) < version.parse(min_version):
|
||||
help_msg = self.get_installation_help("node")
|
||||
result_tuple = (False, f"Node.js {min_version}+ required, found {current_version}{help_msg}")
|
||||
result_tuple = (
|
||||
False,
|
||||
f"Node.js {min_version}+ required, found {current_version}{help_msg}",
|
||||
)
|
||||
self.validation_cache[cache_key] = result_tuple
|
||||
return result_tuple
|
||||
|
||||
# Check maximum version if specified
|
||||
if max_version and version.parse(current_version) > version.parse(max_version):
|
||||
result_tuple = (False, f"Node.js version {current_version} exceeds maximum supported {max_version}")
|
||||
if max_version and version.parse(current_version) > version.parse(
|
||||
max_version
|
||||
):
|
||||
result_tuple = (
|
||||
False,
|
||||
f"Node.js version {current_version} exceeds maximum supported {max_version}",
|
||||
)
|
||||
self.validation_cache[cache_key] = result_tuple
|
||||
return result_tuple
|
||||
|
||||
@ -185,11 +206,11 @@ class Validator:
|
||||
try:
|
||||
# Check if claude is installed - use shell=True on Windows for better PATH resolution
|
||||
result = subprocess.run(
|
||||
['claude', '--version'],
|
||||
["claude", "--version"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10,
|
||||
shell=(sys.platform == "win32")
|
||||
shell=(sys.platform == "win32"),
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
@ -200,7 +221,7 @@ class Validator:
|
||||
|
||||
# Parse version from output
|
||||
version_output = result.stdout.strip()
|
||||
version_match = re.search(r'(\d+\.\d+\.\d+)', version_output)
|
||||
version_match = re.search(r"(\d+\.\d+\.\d+)", version_output)
|
||||
|
||||
if not version_match:
|
||||
result_tuple = (True, "Claude CLI found (version format unknown)")
|
||||
@ -210,8 +231,13 @@ class Validator:
|
||||
current_version = version_match.group(1)
|
||||
|
||||
# Check minimum version if specified
|
||||
if min_version and version.parse(current_version) < version.parse(min_version):
|
||||
result_tuple = (False, f"Claude CLI {min_version}+ required, found {current_version}")
|
||||
if min_version and version.parse(current_version) < version.parse(
|
||||
min_version
|
||||
):
|
||||
result_tuple = (
|
||||
False,
|
||||
f"Claude CLI {min_version}+ required, found {current_version}",
|
||||
)
|
||||
self.validation_cache[cache_key] = result_tuple
|
||||
return result_tuple
|
||||
|
||||
@ -233,7 +259,9 @@ class Validator:
|
||||
self.validation_cache[cache_key] = result_tuple
|
||||
return result_tuple
|
||||
|
||||
def check_external_tool(self, tool_name: str, command: str, min_version: Optional[str] = None) -> Tuple[bool, str]:
|
||||
def check_external_tool(
|
||||
self, tool_name: str, command: str, min_version: Optional[str] = None
|
||||
) -> Tuple[bool, str]:
|
||||
"""
|
||||
Check external tool availability and version
|
||||
|
||||
@ -258,7 +286,7 @@ class Validator:
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10,
|
||||
shell=(sys.platform == "win32")
|
||||
shell=(sys.platform == "win32"),
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
@ -269,13 +297,16 @@ class Validator:
|
||||
# Extract version if min_version specified
|
||||
if min_version:
|
||||
version_output = result.stdout + result.stderr
|
||||
version_match = re.search(r'(\d+\.\d+(?:\.\d+)?)', version_output)
|
||||
version_match = re.search(r"(\d+\.\d+(?:\.\d+)?)", version_output)
|
||||
|
||||
if version_match:
|
||||
current_version = version_match.group(1)
|
||||
|
||||
if version.parse(current_version) < version.parse(min_version):
|
||||
result_tuple = (False, f"{tool_name} {min_version}+ required, found {current_version}")
|
||||
result_tuple = (
|
||||
False,
|
||||
f"{tool_name} {min_version}+ required, found {current_version}",
|
||||
)
|
||||
self.validation_cache[cache_key] = result_tuple
|
||||
return result_tuple
|
||||
|
||||
@ -328,7 +359,10 @@ class Validator:
|
||||
free_mb = stat_result.free / (1024 * 1024)
|
||||
|
||||
if free_mb < required_mb:
|
||||
result = (False, f"Insufficient disk space: {free_mb:.1f}MB free, {required_mb}MB required")
|
||||
result = (
|
||||
False,
|
||||
f"Insufficient disk space: {free_mb:.1f}MB free, {required_mb}MB required",
|
||||
)
|
||||
else:
|
||||
result = (True, f"Sufficient disk space: {free_mb:.1f}MB free")
|
||||
|
||||
@ -373,7 +407,9 @@ class Validator:
|
||||
self.validation_cache[cache_key] = result
|
||||
return result
|
||||
|
||||
def validate_requirements(self, requirements: Dict[str, Any]) -> Tuple[bool, List[str]]:
|
||||
def validate_requirements(
|
||||
self, requirements: Dict[str, Any]
|
||||
) -> Tuple[bool, List[str]]:
|
||||
"""
|
||||
Validate all system requirements
|
||||
|
||||
@ -389,8 +425,7 @@ class Validator:
|
||||
if "python" in requirements:
|
||||
python_req = requirements["python"]
|
||||
success, message = self.check_python(
|
||||
python_req["min_version"],
|
||||
python_req.get("max_version")
|
||||
python_req["min_version"], python_req.get("max_version")
|
||||
)
|
||||
if not success:
|
||||
errors.append(f"Python: {message}")
|
||||
@ -399,8 +434,7 @@ class Validator:
|
||||
if "node" in requirements:
|
||||
node_req = requirements["node"]
|
||||
success, message = self.check_node(
|
||||
node_req["min_version"],
|
||||
node_req.get("max_version")
|
||||
node_req["min_version"], node_req.get("max_version")
|
||||
)
|
||||
if not success:
|
||||
errors.append(f"Node.js: {message}")
|
||||
@ -408,8 +442,7 @@ class Validator:
|
||||
# Check disk space
|
||||
if "disk_space_mb" in requirements:
|
||||
success, message = self.check_disk_space(
|
||||
get_home_directory(),
|
||||
requirements["disk_space_mb"]
|
||||
get_home_directory(), requirements["disk_space_mb"]
|
||||
)
|
||||
if not success:
|
||||
errors.append(f"Disk space: {message}")
|
||||
@ -421,9 +454,7 @@ class Validator:
|
||||
is_optional = tool_req.get("optional", False)
|
||||
|
||||
success, message = self.check_external_tool(
|
||||
tool_name,
|
||||
tool_req["command"],
|
||||
tool_req.get("min_version")
|
||||
tool_name, tool_req["command"], tool_req.get("min_version")
|
||||
)
|
||||
|
||||
if not success and not is_optional:
|
||||
@ -431,7 +462,9 @@ class Validator:
|
||||
|
||||
return len(errors) == 0, errors
|
||||
|
||||
def validate_component_requirements(self, component_names: List[str], all_requirements: Dict[str, Any]) -> Tuple[bool, List[str]]:
|
||||
def validate_component_requirements(
|
||||
self, component_names: List[str], all_requirements: Dict[str, Any]
|
||||
) -> Tuple[bool, List[str]]:
|
||||
"""
|
||||
Validate requirements for specific components
|
||||
|
||||
@ -447,7 +480,7 @@ class Validator:
|
||||
# Start with base requirements
|
||||
base_requirements = {
|
||||
"python": all_requirements.get("python", {}),
|
||||
"disk_space_mb": all_requirements.get("disk_space_mb", 500)
|
||||
"disk_space_mb": all_requirements.get("disk_space_mb", 500),
|
||||
}
|
||||
|
||||
# Add conditional requirements based on components
|
||||
@ -488,7 +521,7 @@ class Validator:
|
||||
info = {
|
||||
"platform": sys.platform,
|
||||
"python_version": f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}",
|
||||
"python_executable": sys.executable
|
||||
"python_executable": sys.executable,
|
||||
}
|
||||
|
||||
# Add Node.js info if available
|
||||
@ -510,7 +543,7 @@ class Validator:
|
||||
info["disk_space"] = {
|
||||
"total_gb": stat_result.total / (1024**3),
|
||||
"free_gb": stat_result.free / (1024**3),
|
||||
"used_gb": (stat_result.total - stat_result.free) / (1024**3)
|
||||
"used_gb": (stat_result.total - stat_result.free) / (1024**3),
|
||||
}
|
||||
except Exception:
|
||||
info["disk_space"] = {"error": "Could not determine disk space"}
|
||||
@ -543,7 +576,9 @@ class Validator:
|
||||
except Exception:
|
||||
return {}
|
||||
|
||||
def get_installation_help(self, tool_name: str, platform: Optional[str] = None) -> str:
|
||||
def get_installation_help(
|
||||
self, tool_name: str, platform: Optional[str] = None
|
||||
) -> str:
|
||||
"""
|
||||
Get installation help for a specific tool
|
||||
|
||||
@ -587,14 +622,14 @@ class Validator:
|
||||
"platform": self.get_platform(),
|
||||
"checks": {},
|
||||
"issues": [],
|
||||
"recommendations": []
|
||||
"recommendations": [],
|
||||
}
|
||||
|
||||
# Check Python
|
||||
python_success, python_msg = self.check_python()
|
||||
diagnostics["checks"]["python"] = {
|
||||
"status": "pass" if python_success else "fail",
|
||||
"message": python_msg
|
||||
"message": python_msg,
|
||||
}
|
||||
if not python_success:
|
||||
diagnostics["issues"].append("Python version issue")
|
||||
@ -604,7 +639,7 @@ class Validator:
|
||||
node_success, node_msg = self.check_node()
|
||||
diagnostics["checks"]["node"] = {
|
||||
"status": "pass" if node_success else "fail",
|
||||
"message": node_msg
|
||||
"message": node_msg,
|
||||
}
|
||||
if not node_success:
|
||||
diagnostics["issues"].append("Node.js not found or version issue")
|
||||
@ -614,17 +649,19 @@ class Validator:
|
||||
claude_success, claude_msg = self.check_claude_cli()
|
||||
diagnostics["checks"]["claude_cli"] = {
|
||||
"status": "pass" if claude_success else "fail",
|
||||
"message": claude_msg
|
||||
"message": claude_msg,
|
||||
}
|
||||
if not claude_success:
|
||||
diagnostics["issues"].append("Claude CLI not found")
|
||||
diagnostics["recommendations"].append(self.get_installation_help("claude_cli"))
|
||||
diagnostics["recommendations"].append(
|
||||
self.get_installation_help("claude_cli")
|
||||
)
|
||||
|
||||
# Check disk space
|
||||
disk_success, disk_msg = self.check_disk_space(get_home_directory())
|
||||
diagnostics["checks"]["disk_space"] = {
|
||||
"status": "pass" if disk_success else "fail",
|
||||
"message": disk_msg
|
||||
"message": disk_msg,
|
||||
}
|
||||
if not disk_success:
|
||||
diagnostics["issues"].append("Insufficient disk space")
|
||||
@ -644,7 +681,7 @@ class Validator:
|
||||
(["python3", "python"], "Python (python3 or python)"),
|
||||
(["node"], "Node.js"),
|
||||
(["npm"], "npm"),
|
||||
(["claude"], "Claude CLI")
|
||||
(["claude"], "Claude CLI"),
|
||||
]
|
||||
|
||||
for tool_alternatives, display_name in tool_checks:
|
||||
@ -656,7 +693,7 @@ class Validator:
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=5,
|
||||
shell=(sys.platform == "win32")
|
||||
shell=(sys.platform == "win32"),
|
||||
)
|
||||
if result.returncode == 0:
|
||||
tool_found = True
|
||||
|
||||
@ -8,9 +8,4 @@ from .config import ConfigService
|
||||
from .files import FileService
|
||||
from .settings import SettingsService
|
||||
|
||||
__all__ = [
|
||||
'CLAUDEMdService',
|
||||
'ConfigService',
|
||||
'FileService',
|
||||
'SettingsService'
|
||||
]
|
||||
__all__ = ["CLAUDEMdService", "ConfigService", "FileService", "SettingsService"]
|
||||
|
||||
@ -35,11 +35,11 @@ class CLAUDEMdService:
|
||||
return existing_imports
|
||||
|
||||
try:
|
||||
with open(self.claude_md_path, 'r', encoding='utf-8') as f:
|
||||
with open(self.claude_md_path, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
# Find all @import statements using regex
|
||||
import_pattern = r'^@([^\s\n]+\.md)\s*$'
|
||||
import_pattern = r"^@([^\s\n]+\.md)\s*$"
|
||||
matches = re.findall(import_pattern, content, re.MULTILINE)
|
||||
existing_imports.update(matches)
|
||||
|
||||
@ -61,7 +61,7 @@ class CLAUDEMdService:
|
||||
return ""
|
||||
|
||||
try:
|
||||
with open(self.claude_md_path, 'r', encoding='utf-8') as f:
|
||||
with open(self.claude_md_path, "r", encoding="utf-8") as f:
|
||||
return f.read()
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not read existing CLAUDE.md: {e}")
|
||||
@ -88,7 +88,9 @@ class CLAUDEMdService:
|
||||
|
||||
return user_content
|
||||
|
||||
def organize_imports_by_category(self, files_by_category: Dict[str, List[str]]) -> str:
|
||||
def organize_imports_by_category(
|
||||
self, files_by_category: Dict[str, List[str]]
|
||||
) -> str:
|
||||
"""
|
||||
Organize imports into categorized sections
|
||||
|
||||
@ -145,13 +147,17 @@ class CLAUDEMdService:
|
||||
self.logger.info("All files already imported, no changes needed")
|
||||
return True
|
||||
|
||||
self.logger.info(f"Adding {len(new_files)} new imports to category '{category}': {new_files}")
|
||||
self.logger.info(
|
||||
f"Adding {len(new_files)} new imports to category '{category}': {new_files}"
|
||||
)
|
||||
|
||||
# Extract user content (preserve everything before framework section)
|
||||
user_content = self.extract_user_content(existing_content)
|
||||
|
||||
# Parse existing framework imports by category
|
||||
existing_framework_imports = self._parse_existing_framework_imports(existing_content)
|
||||
existing_framework_imports = self._parse_existing_framework_imports(
|
||||
existing_content
|
||||
)
|
||||
|
||||
# Add new files to the specified category
|
||||
if category not in existing_framework_imports:
|
||||
@ -167,14 +173,16 @@ class CLAUDEMdService:
|
||||
new_content_parts.append("") # Add blank line before framework section
|
||||
|
||||
# Add organized framework imports
|
||||
framework_section = self.organize_imports_by_category(existing_framework_imports)
|
||||
framework_section = self.organize_imports_by_category(
|
||||
existing_framework_imports
|
||||
)
|
||||
if framework_section:
|
||||
new_content_parts.append(framework_section)
|
||||
|
||||
# Write updated content
|
||||
new_content = "\n".join(new_content_parts)
|
||||
|
||||
with open(self.claude_md_path, 'w', encoding='utf-8') as f:
|
||||
with open(self.claude_md_path, "w", encoding="utf-8") as f:
|
||||
f.write(new_content)
|
||||
|
||||
self.logger.success(f"Updated CLAUDE.md with {len(new_files)} new imports")
|
||||
@ -203,27 +211,29 @@ class CLAUDEMdService:
|
||||
return imports_by_category
|
||||
|
||||
# Extract framework section
|
||||
framework_section = content.split(framework_marker)[1] if framework_marker in content else ""
|
||||
framework_section = (
|
||||
content.split(framework_marker)[1] if framework_marker in content else ""
|
||||
)
|
||||
|
||||
# Parse categories and imports
|
||||
lines = framework_section.split('\n')
|
||||
lines = framework_section.split("\n")
|
||||
current_category = None
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
|
||||
# Skip section header lines and empty lines
|
||||
if line.startswith('# ===') or not line:
|
||||
if line.startswith("# ===") or not line:
|
||||
continue
|
||||
|
||||
# Category header (starts with # but not the section divider)
|
||||
if line.startswith('# ') and not line.startswith('# ==='):
|
||||
if line.startswith("# ") and not line.startswith("# ==="):
|
||||
current_category = line[2:].strip() # Remove "# "
|
||||
if current_category not in imports_by_category:
|
||||
imports_by_category[current_category] = []
|
||||
|
||||
# Import line (starts with @)
|
||||
elif line.startswith('@') and current_category:
|
||||
elif line.startswith("@") and current_category:
|
||||
import_file = line[1:].strip() # Remove "@"
|
||||
if import_file not in imports_by_category[current_category]:
|
||||
imports_by_category[current_category].append(import_file)
|
||||
@ -250,7 +260,7 @@ You can add your own custom instructions and configurations here.
|
||||
The SuperClaude framework components will be automatically imported below.
|
||||
"""
|
||||
|
||||
with open(self.claude_md_path, 'w', encoding='utf-8') as f:
|
||||
with open(self.claude_md_path, "w", encoding="utf-8") as f:
|
||||
f.write(default_content)
|
||||
|
||||
self.logger.info("Created CLAUDE.md with default content")
|
||||
@ -275,7 +285,9 @@ The SuperClaude framework components will be automatically imported below.
|
||||
|
||||
existing_content = self.read_existing_content()
|
||||
user_content = self.extract_user_content(existing_content)
|
||||
existing_framework_imports = self._parse_existing_framework_imports(existing_content)
|
||||
existing_framework_imports = self._parse_existing_framework_imports(
|
||||
existing_content
|
||||
)
|
||||
|
||||
# Remove files from all categories
|
||||
removed_any = False
|
||||
@ -286,7 +298,9 @@ The SuperClaude framework components will be automatically imported below.
|
||||
removed_any = True
|
||||
|
||||
# Remove empty categories
|
||||
existing_framework_imports = {k: v for k, v in existing_framework_imports.items() if v}
|
||||
existing_framework_imports = {
|
||||
k: v for k, v in existing_framework_imports.items() if v
|
||||
}
|
||||
|
||||
if not removed_any:
|
||||
return True # Nothing was removed
|
||||
@ -298,14 +312,16 @@ The SuperClaude framework components will be automatically imported below.
|
||||
new_content_parts.append(user_content)
|
||||
new_content_parts.append("")
|
||||
|
||||
framework_section = self.organize_imports_by_category(existing_framework_imports)
|
||||
framework_section = self.organize_imports_by_category(
|
||||
existing_framework_imports
|
||||
)
|
||||
if framework_section:
|
||||
new_content_parts.append(framework_section)
|
||||
|
||||
# Write updated content
|
||||
new_content = "\n".join(new_content_parts)
|
||||
|
||||
with open(self.claude_md_path, 'w', encoding='utf-8') as f:
|
||||
with open(self.claude_md_path, "w", encoding="utf-8") as f:
|
||||
f.write(new_content)
|
||||
|
||||
self.logger.info(f"Removed {len(files)} imports from CLAUDE.md")
|
||||
|
||||
@ -10,12 +10,14 @@ from pathlib import Path
|
||||
try:
|
||||
import jsonschema
|
||||
from jsonschema import validate, ValidationError
|
||||
|
||||
JSONSCHEMA_AVAILABLE = True
|
||||
except ImportError:
|
||||
JSONSCHEMA_AVAILABLE = False
|
||||
|
||||
class ValidationError(Exception):
|
||||
"""Simple validation error for when jsonschema is not available"""
|
||||
|
||||
def __init__(self, message):
|
||||
self.message = message
|
||||
super().__init__(message)
|
||||
@ -32,7 +34,9 @@ except ImportError:
|
||||
elif expected_type == "string" and not isinstance(instance, str):
|
||||
raise ValidationError(f"Expected string, got {type(instance).__name__}")
|
||||
elif expected_type == "integer" and not isinstance(instance, int):
|
||||
raise ValidationError(f"Expected integer, got {type(instance).__name__}")
|
||||
raise ValidationError(
|
||||
f"Expected integer, got {type(instance).__name__}"
|
||||
)
|
||||
# Skip detailed validation if jsonschema not available
|
||||
|
||||
|
||||
@ -68,22 +72,22 @@ class ConfigService:
|
||||
"category": {"type": "string"},
|
||||
"dependencies": {
|
||||
"type": "array",
|
||||
"items": {"type": "string"}
|
||||
"items": {"type": "string"},
|
||||
},
|
||||
"enabled": {"type": "boolean"},
|
||||
"required_tools": {
|
||||
"type": "array",
|
||||
"items": {"type": "string"}
|
||||
}
|
||||
"items": {"type": "string"},
|
||||
},
|
||||
},
|
||||
"required": ["name", "version", "description", "category"],
|
||||
"additionalProperties": False
|
||||
}
|
||||
"additionalProperties": False,
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
"required": ["components"],
|
||||
"additionalProperties": False
|
||||
"additionalProperties": False,
|
||||
}
|
||||
|
||||
# Schema for requirements.json
|
||||
@ -94,21 +98,18 @@ class ConfigService:
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"min_version": {"type": "string"},
|
||||
"max_version": {"type": "string"}
|
||||
"max_version": {"type": "string"},
|
||||
},
|
||||
"required": ["min_version"]
|
||||
"required": ["min_version"],
|
||||
},
|
||||
"node": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"min_version": {"type": "string"},
|
||||
"max_version": {"type": "string"},
|
||||
"required_for": {
|
||||
"type": "array",
|
||||
"items": {"type": "string"}
|
||||
}
|
||||
"required_for": {"type": "array", "items": {"type": "string"}},
|
||||
},
|
||||
"required": ["min_version"]
|
||||
"required": ["min_version"],
|
||||
},
|
||||
"disk_space_mb": {"type": "integer"},
|
||||
"external_tools": {
|
||||
@ -121,15 +122,15 @@ class ConfigService:
|
||||
"min_version": {"type": "string"},
|
||||
"required_for": {
|
||||
"type": "array",
|
||||
"items": {"type": "string"}
|
||||
"items": {"type": "string"},
|
||||
},
|
||||
"optional": {"type": "boolean"}
|
||||
"optional": {"type": "boolean"},
|
||||
},
|
||||
"required": ["command"],
|
||||
"additionalProperties": False
|
||||
}
|
||||
"additionalProperties": False,
|
||||
}
|
||||
},
|
||||
},
|
||||
"installation_commands": {
|
||||
"type": "object",
|
||||
"patternProperties": {
|
||||
@ -140,15 +141,15 @@ class ConfigService:
|
||||
"darwin": {"type": "string"},
|
||||
"win32": {"type": "string"},
|
||||
"all": {"type": "string"},
|
||||
"description": {"type": "string"}
|
||||
"description": {"type": "string"},
|
||||
},
|
||||
"additionalProperties": False
|
||||
}
|
||||
}
|
||||
"additionalProperties": False,
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
"required": ["python", "disk_space_mb"],
|
||||
"additionalProperties": False
|
||||
"additionalProperties": False,
|
||||
}
|
||||
|
||||
def load_features(self) -> Dict[str, Any]:
|
||||
@ -169,7 +170,7 @@ class ConfigService:
|
||||
raise FileNotFoundError(f"Features config not found: {self.features_file}")
|
||||
|
||||
try:
|
||||
with open(self.features_file, 'r') as f:
|
||||
with open(self.features_file, "r") as f:
|
||||
features = json.load(f)
|
||||
|
||||
# Validate schema
|
||||
@ -198,10 +199,12 @@ class ConfigService:
|
||||
return self._requirements_cache
|
||||
|
||||
if not self.requirements_file.exists():
|
||||
raise FileNotFoundError(f"Requirements config not found: {self.requirements_file}")
|
||||
raise FileNotFoundError(
|
||||
f"Requirements config not found: {self.requirements_file}"
|
||||
)
|
||||
|
||||
try:
|
||||
with open(self.requirements_file, 'r') as f:
|
||||
with open(self.requirements_file, "r") as f:
|
||||
requirements = json.load(f)
|
||||
|
||||
# Validate schema
|
||||
@ -287,7 +290,9 @@ class ConfigService:
|
||||
"""
|
||||
return self.load_requirements()
|
||||
|
||||
def get_requirements_for_components(self, component_names: List[str]) -> Dict[str, Any]:
|
||||
def get_requirements_for_components(
|
||||
self, component_names: List[str]
|
||||
) -> Dict[str, Any]:
|
||||
"""
|
||||
Get consolidated requirements for specific components
|
||||
|
||||
@ -304,7 +309,7 @@ class ConfigService:
|
||||
result = {
|
||||
"python": requirements["python"],
|
||||
"disk_space_mb": requirements["disk_space_mb"],
|
||||
"external_tools": {}
|
||||
"external_tools": {},
|
||||
}
|
||||
|
||||
# Add Node.js requirements if needed
|
||||
@ -327,7 +332,9 @@ class ConfigService:
|
||||
|
||||
for tool in required_tools:
|
||||
if tool in requirements.get("external_tools", {}):
|
||||
result["external_tools"][tool] = requirements["external_tools"][tool]
|
||||
result["external_tools"][tool] = requirements["external_tools"][
|
||||
tool
|
||||
]
|
||||
|
||||
return result
|
||||
|
||||
|
||||
@ -24,7 +24,9 @@ class FileService:
|
||||
self.copied_files: List[Path] = []
|
||||
self.created_dirs: List[Path] = []
|
||||
|
||||
def copy_file(self, source: Path, target: Path, preserve_permissions: bool = True) -> bool:
|
||||
def copy_file(
|
||||
self, source: Path, target: Path, preserve_permissions: bool = True
|
||||
) -> bool:
|
||||
"""
|
||||
Copy single file with permission preservation
|
||||
|
||||
@ -63,7 +65,9 @@ class FileService:
|
||||
print(f"Error copying {source} to {target}: {e}")
|
||||
return False
|
||||
|
||||
def copy_directory(self, source: Path, target: Path, ignore_patterns: Optional[List[str]] = None) -> bool:
|
||||
def copy_directory(
|
||||
self, source: Path, target: Path, ignore_patterns: Optional[List[str]] = None
|
||||
) -> bool:
|
||||
"""
|
||||
Recursively copy directory with gitignore-style patterns
|
||||
|
||||
@ -82,7 +86,7 @@ class FileService:
|
||||
raise ValueError(f"Source is not a directory: {source}")
|
||||
|
||||
ignore_patterns = ignore_patterns or []
|
||||
default_ignores = ['.git', '.gitignore', '__pycache__', '*.pyc', '.DS_Store']
|
||||
default_ignores = [".git", ".gitignore", "__pycache__", "*.pyc", ".DS_Store"]
|
||||
all_ignores = ignore_patterns + default_ignores
|
||||
|
||||
if self.dry_run:
|
||||
@ -99,7 +103,9 @@ class FileService:
|
||||
|
||||
# Check against ignore patterns
|
||||
for pattern in all_ignores:
|
||||
if fnmatch.fnmatch(item, pattern) or fnmatch.fnmatch(str(rel_path), pattern):
|
||||
if fnmatch.fnmatch(item, pattern) or fnmatch.fnmatch(
|
||||
str(rel_path), pattern
|
||||
):
|
||||
ignored.append(item)
|
||||
break
|
||||
|
||||
@ -109,7 +115,7 @@ class FileService:
|
||||
shutil.copytree(source, target, ignore=ignore_func, dirs_exist_ok=True)
|
||||
|
||||
# Track created directories and files
|
||||
for item in target.rglob('*'):
|
||||
for item in target.rglob("*"):
|
||||
if item.is_dir():
|
||||
self.created_dirs.append(item)
|
||||
else:
|
||||
@ -260,7 +266,9 @@ class FileService:
|
||||
print(f"Error making {file_path} executable: {e}")
|
||||
return False
|
||||
|
||||
def get_file_hash(self, file_path: Path, algorithm: str = 'sha256') -> Optional[str]:
|
||||
def get_file_hash(
|
||||
self, file_path: Path, algorithm: str = "sha256"
|
||||
) -> Optional[str]:
|
||||
"""
|
||||
Calculate file hash
|
||||
|
||||
@ -277,7 +285,7 @@ class FileService:
|
||||
try:
|
||||
hasher = hashlib.new(algorithm)
|
||||
|
||||
with open(file_path, 'rb') as f:
|
||||
with open(file_path, "rb") as f:
|
||||
# Read in chunks for large files
|
||||
for chunk in iter(lambda: f.read(8192), b""):
|
||||
hasher.update(chunk)
|
||||
@ -287,7 +295,9 @@ class FileService:
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def verify_file_integrity(self, file_path: Path, expected_hash: str, algorithm: str = 'sha256') -> bool:
|
||||
def verify_file_integrity(
|
||||
self, file_path: Path, expected_hash: str, algorithm: str = "sha256"
|
||||
) -> bool:
|
||||
"""
|
||||
Verify file integrity using hash
|
||||
|
||||
@ -317,7 +327,7 @@ class FileService:
|
||||
|
||||
total_size = 0
|
||||
try:
|
||||
for file_path in directory.rglob('*'):
|
||||
for file_path in directory.rglob("*"):
|
||||
if file_path.is_file():
|
||||
total_size += file_path.stat().st_size
|
||||
except Exception:
|
||||
@ -325,7 +335,9 @@ class FileService:
|
||||
|
||||
return total_size
|
||||
|
||||
def find_files(self, directory: Path, pattern: str = '*', recursive: bool = True) -> List[Path]:
|
||||
def find_files(
|
||||
self, directory: Path, pattern: str = "*", recursive: bool = True
|
||||
) -> List[Path]:
|
||||
"""
|
||||
Find files matching pattern
|
||||
|
||||
@ -348,7 +360,9 @@ class FileService:
|
||||
except Exception:
|
||||
return []
|
||||
|
||||
def backup_file(self, file_path: Path, backup_suffix: str = '.backup') -> Optional[Path]:
|
||||
def backup_file(
|
||||
self, file_path: Path, backup_suffix: str = ".backup"
|
||||
) -> Optional[Path]:
|
||||
"""
|
||||
Create backup copy of file
|
||||
|
||||
@ -420,9 +434,9 @@ class FileService:
|
||||
Dict with operation statistics
|
||||
"""
|
||||
return {
|
||||
'files_copied': len(self.copied_files),
|
||||
'directories_created': len(self.created_dirs),
|
||||
'dry_run': self.dry_run,
|
||||
'copied_files': [str(f) for f in self.copied_files],
|
||||
'created_directories': [str(d) for d in self.created_dirs]
|
||||
"files_copied": len(self.copied_files),
|
||||
"directories_created": len(self.created_dirs),
|
||||
"dry_run": self.dry_run,
|
||||
"copied_files": [str(f) for f in self.copied_files],
|
||||
"created_directories": [str(d) for d in self.created_dirs],
|
||||
}
|
||||
@ -38,12 +38,14 @@ class SettingsService:
|
||||
return {}
|
||||
|
||||
try:
|
||||
with open(self.settings_file, 'r', encoding='utf-8') as f:
|
||||
with open(self.settings_file, "r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
except (json.JSONDecodeError, IOError) as e:
|
||||
raise ValueError(f"Could not load settings from {self.settings_file}: {e}")
|
||||
|
||||
def save_settings(self, settings: Dict[str, Any], create_backup: bool = True) -> None:
|
||||
def save_settings(
|
||||
self, settings: Dict[str, Any], create_backup: bool = True
|
||||
) -> None:
|
||||
"""
|
||||
Save settings to settings.json with optional backup
|
||||
|
||||
@ -60,7 +62,7 @@ class SettingsService:
|
||||
|
||||
# Save with pretty formatting
|
||||
try:
|
||||
with open(self.settings_file, 'w', encoding='utf-8') as f:
|
||||
with open(self.settings_file, "w", encoding="utf-8") as f:
|
||||
json.dump(settings, f, indent=2, ensure_ascii=False, sort_keys=True)
|
||||
except IOError as e:
|
||||
raise ValueError(f"Could not save settings to {self.settings_file}: {e}")
|
||||
@ -76,7 +78,7 @@ class SettingsService:
|
||||
return {}
|
||||
|
||||
try:
|
||||
with open(self.metadata_file, 'r', encoding='utf-8') as f:
|
||||
with open(self.metadata_file, "r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
except (json.JSONDecodeError, IOError) as e:
|
||||
raise ValueError(f"Could not load metadata from {self.metadata_file}: {e}")
|
||||
@ -93,7 +95,7 @@ class SettingsService:
|
||||
|
||||
# Save with pretty formatting
|
||||
try:
|
||||
with open(self.metadata_file, 'w', encoding='utf-8') as f:
|
||||
with open(self.metadata_file, "w", encoding="utf-8") as f:
|
||||
json.dump(metadata, f, indent=2, ensure_ascii=False, sort_keys=True)
|
||||
except IOError as e:
|
||||
raise ValueError(f"Could not save metadata to {self.metadata_file}: {e}")
|
||||
@ -153,7 +155,9 @@ class SettingsService:
|
||||
self.save_metadata(merged_metadata)
|
||||
|
||||
# Remove SuperClaude fields from settings
|
||||
clean_settings = {k: v for k, v in settings.items() if k not in superclaude_fields}
|
||||
clean_settings = {
|
||||
k: v for k, v in settings.items() if k not in superclaude_fields
|
||||
}
|
||||
|
||||
# Save cleaned settings
|
||||
self.save_settings(clean_settings, create_backup=True)
|
||||
@ -173,7 +177,9 @@ class SettingsService:
|
||||
existing = self.load_settings()
|
||||
return self._deep_merge(existing, modifications)
|
||||
|
||||
def update_settings(self, modifications: Dict[str, Any], create_backup: bool = True) -> None:
|
||||
def update_settings(
|
||||
self, modifications: Dict[str, Any], create_backup: bool = True
|
||||
) -> None:
|
||||
"""
|
||||
Update settings with modifications
|
||||
|
||||
@ -199,13 +205,15 @@ class SettingsService:
|
||||
|
||||
try:
|
||||
value = settings
|
||||
for key in key_path.split('.'):
|
||||
for key in key_path.split("."):
|
||||
value = value[key]
|
||||
return value
|
||||
except (KeyError, TypeError):
|
||||
return default
|
||||
|
||||
def set_setting(self, key_path: str, value: Any, create_backup: bool = True) -> None:
|
||||
def set_setting(
|
||||
self, key_path: str, value: Any, create_backup: bool = True
|
||||
) -> None:
|
||||
"""
|
||||
Set setting value using dot-notation path
|
||||
|
||||
@ -215,7 +223,7 @@ class SettingsService:
|
||||
create_backup: Whether to create backup before updating
|
||||
"""
|
||||
# Build nested dict structure
|
||||
keys = key_path.split('.')
|
||||
keys = key_path.split(".")
|
||||
modification = {}
|
||||
current = modification
|
||||
|
||||
@ -239,7 +247,7 @@ class SettingsService:
|
||||
True if setting was removed, False if not found
|
||||
"""
|
||||
settings = self.load_settings()
|
||||
keys = key_path.split('.')
|
||||
keys = key_path.split(".")
|
||||
|
||||
# Navigate to parent of target key
|
||||
current = settings
|
||||
@ -258,7 +266,9 @@ class SettingsService:
|
||||
except (KeyError, TypeError):
|
||||
return False
|
||||
|
||||
def add_component_registration(self, component_name: str, component_info: Dict[str, Any]) -> None:
|
||||
def add_component_registration(
|
||||
self, component_name: str, component_info: Dict[str, Any]
|
||||
) -> None:
|
||||
"""
|
||||
Add component to registry in metadata
|
||||
|
||||
@ -272,7 +282,7 @@ class SettingsService:
|
||||
|
||||
metadata["components"][component_name] = {
|
||||
**component_info,
|
||||
"installed_at": datetime.now().isoformat()
|
||||
"installed_at": datetime.now().isoformat(),
|
||||
}
|
||||
|
||||
self.save_metadata(metadata)
|
||||
@ -380,13 +390,15 @@ class SettingsService:
|
||||
|
||||
try:
|
||||
value = metadata
|
||||
for key in key_path.split('.'):
|
||||
for key in key_path.split("."):
|
||||
value = value[key]
|
||||
return value
|
||||
except (KeyError, TypeError):
|
||||
return default
|
||||
|
||||
def _deep_merge(self, base: Dict[str, Any], overlay: Dict[str, Any]) -> Dict[str, Any]:
|
||||
def _deep_merge(
|
||||
self, base: Dict[str, Any], overlay: Dict[str, Any]
|
||||
) -> Dict[str, Any]:
|
||||
"""
|
||||
Deep merge two dictionaries
|
||||
|
||||
@ -400,7 +412,11 @@ class SettingsService:
|
||||
result = copy.deepcopy(base)
|
||||
|
||||
for key, value in overlay.items():
|
||||
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
|
||||
if (
|
||||
key in result
|
||||
and isinstance(result[key], dict)
|
||||
and isinstance(value, dict)
|
||||
):
|
||||
result[key] = self._deep_merge(result[key], value)
|
||||
else:
|
||||
result[key] = copy.deepcopy(value)
|
||||
@ -469,13 +485,15 @@ class SettingsService:
|
||||
for file in self.backup_dir.glob("settings_*.json"):
|
||||
try:
|
||||
stat = file.stat()
|
||||
backups.append({
|
||||
backups.append(
|
||||
{
|
||||
"name": file.name,
|
||||
"path": str(file),
|
||||
"size": stat.st_size,
|
||||
"created": datetime.fromtimestamp(stat.st_ctime).isoformat(),
|
||||
"modified": datetime.fromtimestamp(stat.st_mtime).isoformat()
|
||||
})
|
||||
"modified": datetime.fromtimestamp(stat.st_mtime).isoformat(),
|
||||
}
|
||||
)
|
||||
except OSError:
|
||||
continue
|
||||
|
||||
@ -500,7 +518,7 @@ class SettingsService:
|
||||
|
||||
try:
|
||||
# Validate backup file first
|
||||
with open(backup_file, 'r', encoding='utf-8') as f:
|
||||
with open(backup_file, "r", encoding="utf-8") as f:
|
||||
json.load(f) # Will raise exception if invalid
|
||||
|
||||
# Create backup of current settings
|
||||
|
||||
@ -4,11 +4,4 @@ from .ui import ProgressBar, Menu, confirm, Colors
|
||||
from .logger import Logger
|
||||
from .security import SecurityValidator
|
||||
|
||||
__all__ = [
|
||||
'ProgressBar',
|
||||
'Menu',
|
||||
'confirm',
|
||||
'Colors',
|
||||
'Logger',
|
||||
'SecurityValidator'
|
||||
]
|
||||
__all__ = ["ProgressBar", "Menu", "confirm", "Colors", "Logger", "SecurityValidator"]
|
||||
|
||||
@ -18,6 +18,7 @@ from .paths import get_home_directory
|
||||
def _get_env_tracking_file() -> Path:
|
||||
"""Get path to environment variable tracking file"""
|
||||
from .. import DEFAULT_INSTALL_DIR
|
||||
|
||||
install_dir = get_home_directory() / ".claude"
|
||||
install_dir.mkdir(exist_ok=True)
|
||||
return install_dir / "superclaude_env_vars.json"
|
||||
@ -29,7 +30,7 @@ def _load_env_tracking() -> Dict[str, Dict[str, str]]:
|
||||
|
||||
try:
|
||||
if tracking_file.exists():
|
||||
with open(tracking_file, 'r') as f:
|
||||
with open(tracking_file, "r") as f:
|
||||
return json.load(f)
|
||||
except Exception as e:
|
||||
get_logger().warning(f"Could not load environment tracking: {e}")
|
||||
@ -42,7 +43,7 @@ def _save_env_tracking(tracking_data: Dict[str, Dict[str, str]]) -> bool:
|
||||
tracking_file = _get_env_tracking_file()
|
||||
|
||||
try:
|
||||
with open(tracking_file, 'w') as f:
|
||||
with open(tracking_file, "w") as f:
|
||||
json.dump(tracking_data, f, indent=2)
|
||||
return True
|
||||
except Exception as e:
|
||||
@ -62,7 +63,7 @@ def _add_env_tracking(env_vars: Dict[str, str]) -> None:
|
||||
tracking_data[env_var] = {
|
||||
"set_by": "superclaude",
|
||||
"timestamp": timestamp,
|
||||
"value_hash": str(hash(value)) # Store hash, not actual value for security
|
||||
"value_hash": str(hash(value)), # Store hash, not actual value for security
|
||||
}
|
||||
|
||||
_save_env_tracking(tracking_data)
|
||||
@ -98,7 +99,7 @@ def detect_shell_config() -> Optional[Path]:
|
||||
home / ".zshrc", # Zsh (Mac default)
|
||||
home / ".bashrc", # Bash
|
||||
home / ".profile", # Generic shell profile
|
||||
home / ".bash_profile" # Mac Bash profile
|
||||
home / ".bash_profile", # Mac Bash profile
|
||||
]
|
||||
|
||||
for config in configs:
|
||||
@ -132,18 +133,20 @@ def setup_environment_variables(api_keys: Dict[str, str]) -> bool:
|
||||
# Set for current session
|
||||
os.environ[env_var] = value
|
||||
|
||||
if os.name == 'nt': # Windows
|
||||
if os.name == "nt": # Windows
|
||||
# Use setx for persistent user variable
|
||||
result = subprocess.run(
|
||||
['setx', env_var, value],
|
||||
capture_output=True,
|
||||
text=True
|
||||
["setx", env_var, value], capture_output=True, text=True
|
||||
)
|
||||
if result.returncode != 0:
|
||||
display_warning(f"Could not set {env_var} persistently: {result.stderr.strip()}")
|
||||
display_warning(
|
||||
f"Could not set {env_var} persistently: {result.stderr.strip()}"
|
||||
)
|
||||
success = False
|
||||
else:
|
||||
logger.info(f"Windows environment variable {env_var} set persistently")
|
||||
logger.info(
|
||||
f"Windows environment variable {env_var} set persistently"
|
||||
)
|
||||
else: # Unix-like systems
|
||||
shell_config = detect_shell_config()
|
||||
|
||||
@ -151,17 +154,19 @@ def setup_environment_variables(api_keys: Dict[str, str]) -> bool:
|
||||
export_line = f'export {env_var}="{value}"'
|
||||
|
||||
try:
|
||||
with open(shell_config, 'r') as f:
|
||||
with open(shell_config, "r") as f:
|
||||
content = f.read()
|
||||
|
||||
# Check if this environment variable is already set
|
||||
if f'export {env_var}=' in content:
|
||||
if f"export {env_var}=" in content:
|
||||
# Variable exists - don't duplicate
|
||||
logger.info(f"Environment variable {env_var} already exists in {shell_config.name}")
|
||||
logger.info(
|
||||
f"Environment variable {env_var} already exists in {shell_config.name}"
|
||||
)
|
||||
else:
|
||||
# Append export to shell config
|
||||
with open(shell_config, 'a') as f:
|
||||
f.write(f'\n# SuperClaude API Key\n{export_line}\n')
|
||||
with open(shell_config, "a") as f:
|
||||
f.write(f"\n# SuperClaude API Key\n{export_line}\n")
|
||||
|
||||
display_info(f"Added {env_var} to {shell_config.name}")
|
||||
logger.info(f"Added {env_var} to {shell_config}")
|
||||
@ -170,7 +175,9 @@ def setup_environment_variables(api_keys: Dict[str, str]) -> bool:
|
||||
display_warning(f"Could not update {shell_config.name}: {e}")
|
||||
success = False
|
||||
|
||||
logger.info(f"Environment variable {env_var} configured for current session")
|
||||
logger.info(
|
||||
f"Environment variable {env_var} configured for current session"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to set {env_var}: {e}")
|
||||
@ -182,10 +189,14 @@ def setup_environment_variables(api_keys: Dict[str, str]) -> bool:
|
||||
_add_env_tracking(api_keys)
|
||||
|
||||
display_success("Environment variables configured successfully")
|
||||
if os.name != 'nt':
|
||||
display_info("Restart your terminal or run 'source ~/.bashrc' to apply changes")
|
||||
if os.name != "nt":
|
||||
display_info(
|
||||
"Restart your terminal or run 'source ~/.bashrc' to apply changes"
|
||||
)
|
||||
else:
|
||||
display_info("New environment variables will be available in new terminal sessions")
|
||||
display_info(
|
||||
"New environment variables will be available in new terminal sessions"
|
||||
)
|
||||
else:
|
||||
display_warning("Some environment variables could not be set persistently")
|
||||
display_info("You can set them manually or check the logs for details")
|
||||
@ -228,10 +239,10 @@ def get_shell_name() -> str:
|
||||
Returns:
|
||||
Name of the shell (e.g., 'bash', 'zsh', 'fish')
|
||||
"""
|
||||
shell_path = os.environ.get('SHELL', '')
|
||||
shell_path = os.environ.get("SHELL", "")
|
||||
if shell_path:
|
||||
return Path(shell_path).name
|
||||
return 'unknown'
|
||||
return "unknown"
|
||||
|
||||
|
||||
def get_superclaude_environment_variables() -> Dict[str, str]:
|
||||
@ -255,7 +266,7 @@ def get_superclaude_environment_variables() -> Dict[str, str]:
|
||||
# (for backwards compatibility with existing installations)
|
||||
known_superclaude_env_vars = [
|
||||
"TWENTYFIRST_API_KEY", # Magic server
|
||||
"MORPH_API_KEY" # Morphllm server
|
||||
"MORPH_API_KEY", # Morphllm server
|
||||
]
|
||||
|
||||
for env_var in known_superclaude_env_vars:
|
||||
@ -267,7 +278,9 @@ def get_superclaude_environment_variables() -> Dict[str, str]:
|
||||
return found_vars
|
||||
|
||||
|
||||
def cleanup_environment_variables(env_vars_to_remove: Dict[str, str], create_restore_script: bool = True) -> bool:
|
||||
def cleanup_environment_variables(
|
||||
env_vars_to_remove: Dict[str, str], create_restore_script: bool = True
|
||||
) -> bool:
|
||||
"""
|
||||
Safely remove environment variables with backup and restore options
|
||||
|
||||
@ -301,16 +314,18 @@ def cleanup_environment_variables(env_vars_to_remove: Dict[str, str], create_res
|
||||
del os.environ[env_var]
|
||||
logger.info(f"Removed {env_var} from current session")
|
||||
|
||||
if os.name == 'nt': # Windows
|
||||
if os.name == "nt": # Windows
|
||||
# Remove persistent user variable using reg command
|
||||
result = subprocess.run(
|
||||
['reg', 'delete', 'HKCU\\Environment', '/v', env_var, '/f'],
|
||||
["reg", "delete", "HKCU\\Environment", "/v", env_var, "/f"],
|
||||
capture_output=True,
|
||||
text=True
|
||||
text=True,
|
||||
)
|
||||
if result.returncode != 0:
|
||||
# Variable might not exist in registry, which is fine
|
||||
logger.debug(f"Registry deletion for {env_var}: {result.stderr.strip()}")
|
||||
logger.debug(
|
||||
f"Registry deletion for {env_var}: {result.stderr.strip()}"
|
||||
)
|
||||
else:
|
||||
logger.info(f"Removed {env_var} from Windows registry")
|
||||
else: # Unix-like systems
|
||||
@ -328,8 +343,10 @@ def cleanup_environment_variables(env_vars_to_remove: Dict[str, str], create_res
|
||||
_remove_env_tracking(list(env_vars_to_remove.keys()))
|
||||
|
||||
display_success("Environment variables removed successfully")
|
||||
if os.name != 'nt':
|
||||
display_info("Restart your terminal or source your shell config to apply changes")
|
||||
if os.name != "nt":
|
||||
display_info(
|
||||
"Restart your terminal or source your shell config to apply changes"
|
||||
)
|
||||
else:
|
||||
display_info("Changes will take effect in new terminal sessions")
|
||||
else:
|
||||
@ -342,9 +359,9 @@ def _create_restore_script(env_vars: Dict[str, str]) -> Optional[Path]:
|
||||
"""Create a script to restore environment variables"""
|
||||
try:
|
||||
home = get_home_directory()
|
||||
if os.name == 'nt': # Windows
|
||||
if os.name == "nt": # Windows
|
||||
script_path = home / "restore_superclaude_env.bat"
|
||||
with open(script_path, 'w') as f:
|
||||
with open(script_path, "w") as f:
|
||||
f.write("@echo off\n")
|
||||
f.write("REM SuperClaude Environment Variable Restore Script\n")
|
||||
f.write("REM Generated during uninstall\n\n")
|
||||
@ -354,7 +371,7 @@ def _create_restore_script(env_vars: Dict[str, str]) -> Optional[Path]:
|
||||
f.write("pause\n")
|
||||
else: # Unix-like
|
||||
script_path = home / "restore_superclaude_env.sh"
|
||||
with open(script_path, 'w') as f:
|
||||
with open(script_path, "w") as f:
|
||||
f.write("#!/bin/bash\n")
|
||||
f.write("# SuperClaude Environment Variable Restore Script\n")
|
||||
f.write("# Generated during uninstall\n\n")
|
||||
@ -362,7 +379,9 @@ def _create_restore_script(env_vars: Dict[str, str]) -> Optional[Path]:
|
||||
for env_var, value in env_vars.items():
|
||||
f.write(f'export {env_var}="{value}"\n')
|
||||
if shell_config:
|
||||
f.write(f'echo \'export {env_var}="{value}"\' >> {shell_config}\n')
|
||||
f.write(
|
||||
f"echo 'export {env_var}=\"{value}\"' >> {shell_config}\n"
|
||||
)
|
||||
f.write("\necho 'Environment variables restored'\n")
|
||||
|
||||
# Make script executable
|
||||
@ -379,7 +398,7 @@ def _remove_env_var_from_shell_config(shell_config: Path, env_var: str) -> bool:
|
||||
"""Remove environment variable export from shell configuration file"""
|
||||
try:
|
||||
# Read current content
|
||||
with open(shell_config, 'r') as f:
|
||||
with open(shell_config, "r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
# Filter out lines that export this variable
|
||||
@ -388,12 +407,12 @@ def _remove_env_var_from_shell_config(shell_config: Path, env_var: str) -> bool:
|
||||
|
||||
for line in lines:
|
||||
# Check if this line exports our variable
|
||||
if f'export {env_var}=' in line or line.strip() == f'# SuperClaude API Key':
|
||||
if f"export {env_var}=" in line or line.strip() == f"# SuperClaude API Key":
|
||||
skip_next_blank = True
|
||||
continue
|
||||
|
||||
# Skip blank line after removed export
|
||||
if skip_next_blank and line.strip() == '':
|
||||
if skip_next_blank and line.strip() == "":
|
||||
skip_next_blank = False
|
||||
continue
|
||||
|
||||
@ -401,7 +420,7 @@ def _remove_env_var_from_shell_config(shell_config: Path, env_var: str) -> bool:
|
||||
filtered_lines.append(line)
|
||||
|
||||
# Write back the filtered content
|
||||
with open(shell_config, 'w') as f:
|
||||
with open(shell_config, "w") as f:
|
||||
f.writelines(filtered_lines)
|
||||
|
||||
get_logger().info(f"Removed {env_var} export from {shell_config.name}")
|
||||
@ -412,7 +431,9 @@ def _remove_env_var_from_shell_config(shell_config: Path, env_var: str) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def create_env_file(api_keys: Dict[str, str], env_file_path: Optional[Path] = None) -> bool:
|
||||
def create_env_file(
|
||||
api_keys: Dict[str, str], env_file_path: Optional[Path] = None
|
||||
) -> bool:
|
||||
"""
|
||||
Create a .env file with the API keys (alternative to shell config)
|
||||
|
||||
@ -432,7 +453,7 @@ def create_env_file(api_keys: Dict[str, str], env_file_path: Optional[Path] = No
|
||||
# Read existing .env file if it exists
|
||||
existing_content = ""
|
||||
if env_file_path.exists():
|
||||
with open(env_file_path, 'r') as f:
|
||||
with open(env_file_path, "r") as f:
|
||||
existing_content = f.read()
|
||||
|
||||
# Prepare new content
|
||||
@ -441,19 +462,19 @@ def create_env_file(api_keys: Dict[str, str], env_file_path: Optional[Path] = No
|
||||
line = f'{env_var}="{value}"'
|
||||
|
||||
# Check if this variable already exists
|
||||
if f'{env_var}=' in existing_content:
|
||||
if f"{env_var}=" in existing_content:
|
||||
logger.info(f"Variable {env_var} already exists in .env file")
|
||||
else:
|
||||
new_lines.append(line)
|
||||
|
||||
# Append new lines if any
|
||||
if new_lines:
|
||||
with open(env_file_path, 'a') as f:
|
||||
if existing_content and not existing_content.endswith('\n'):
|
||||
f.write('\n')
|
||||
f.write('# SuperClaude API Keys\n')
|
||||
with open(env_file_path, "a") as f:
|
||||
if existing_content and not existing_content.endswith("\n"):
|
||||
f.write("\n")
|
||||
f.write("# SuperClaude API Keys\n")
|
||||
for line in new_lines:
|
||||
f.write(line + '\n')
|
||||
f.write(line + "\n")
|
||||
|
||||
# Set file permissions (readable only by owner)
|
||||
env_file_path.chmod(0o600)
|
||||
@ -491,6 +512,7 @@ def check_research_prerequisites() -> tuple[bool, list[str]]:
|
||||
|
||||
# Check Node.js for MCP
|
||||
import shutil
|
||||
|
||||
if not shutil.which("node"):
|
||||
warnings.append(
|
||||
"Node.js not found - Required for Tavily MCP\n"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user