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:
kazuki nakai 2025-10-14 12:17:09 +09:00 committed by GitHub
parent 302c5851b1
commit 050d5ea2ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
194 changed files with 9698 additions and 3693 deletions

View File

@ -98,7 +98,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Technical ### Technical
- Added `setup/utils/updater.py` for PyPI update checking logic - Added `setup/utils/updater.py` for PyPI update checking logic
- Added `bin/checkUpdate.js` for NPM 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 - Non-blocking update checks with 2-second timeout to avoid delays
### Changed ### 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 - Commands are now installed in `~/.claude/commands/sc/` subdirectory
- All 21 commands updated: `/analyze``/sc:analyze`, `/build``/sc:build`, etc. - All 21 commands updated: `/analyze``/sc:analyze`, `/build``/sc:build`, etc.
- Automatic migration from old command locations to new `sc/` subdirectory - 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 ### Added
- **NEW AGENTS**: 14 specialized domain agents with enhanced capabilities - **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 - Migration preserves existing functionality while preventing naming conflicts
- Installation process detects and migrates existing commands automatically - Installation process detects and migrates existing commands automatically
- Tab completion support for `/sc:` prefix to discover all SuperClaude commands - 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 ## [4.0.6] - 2025-08-23

View File

@ -12,7 +12,7 @@ SuperClaude Framework transforms Claude Code into a structured development platf
**Before Reporting:** **Before Reporting:**
- Search existing issues to avoid duplicates - Search existing issues to avoid duplicates
- Test with latest SuperClaude version - 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:** **Required Information:**
- SuperClaude version: `SuperClaude --version` - SuperClaude version: `SuperClaude --version`
@ -188,8 +188,8 @@ Reference/ # Best practices and troubleshooting
- Security best practices for external integrations - Security best practices for external integrations
**Development Workflow:** **Development Workflow:**
1. Review [Technical Architecture](Docs/Developer-Guide/technical-architecture.md) 1. Review [Technical Architecture](docs/Developer-Guide/technical-architecture.md)
2. Study [Contributing Code Guide](Docs/Developer-Guide/contributing-code.md) 2. Study [Contributing Code Guide](docs/Developer-Guide/contributing-code.md)
3. Set up development environment 3. Set up development environment
4. Create feature branch from `master` 4. Create feature branch from `master`
5. Implement changes with tests 5. Implement changes with tests
@ -203,7 +203,7 @@ Reference/ # Best practices and troubleshooting
- Documentation completeness and clarity - Documentation completeness and clarity
- Test coverage and quality - 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 ## 🤝 Community Guidelines
@ -315,14 +315,14 @@ SuperClaude Framework enhances Claude Code for systematic software development w
- Design discussions for major features - Design discussions for major features
**Documentation Resources** **Documentation Resources**
- [Troubleshooting Guide](Docs/Reference/troubleshooting.md) - Common issues and solutions - [Troubleshooting Guide](docs/Reference/troubleshooting.md) - Common issues and solutions
- [Examples Cookbook](Docs/Reference/examples-cookbook.md) - Practical usage patterns - [Examples Cookbook](docs/Reference/examples-cookbook.md) - Practical usage patterns
- [Quick Start Practices](Docs/Reference/quick-start-practices.md) - Optimization strategies - [Quick Start Practices](docs/Reference/quick-start-practices.md) - Optimization strategies
- [Technical Architecture](Docs/Developer-Guide/technical-architecture.md) - Framework design - [Technical Architecture](docs/Developer-Guide/technical-architecture.md) - Framework design
**Development Support** **Development Support**
- [Contributing Code Guide](Docs/Developer-Guide/contributing-code.md) - Development setup - [Contributing Code Guide](docs/Developer-Guide/contributing-code.md) - Development setup
- [Testing & Debugging](Docs/Developer-Guide/testing-debugging.md) - Quality procedures - [Testing & Debugging](docs/Developer-Guide/testing-debugging.md) - Quality procedures
- Code review process through pull requests - Code review process through pull requests
- Maintainer guidance on complex contributions - Maintainer guidance on complex contributions
@ -344,7 +344,7 @@ Before seeking support, please:
**Development Environment Issues:** **Development Environment Issues:**
**Q: "SuperClaude install fails with permission errors"** **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"** **Q: "Commands not recognized after installation"**
A: Restart Claude Code session. Verify installation with `SuperClaude install --list-components`. Check ~/.claude directory exists. 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. A: Follow agent patterns in setup/components/agents.py. Include trigger keywords, capabilities description, and integration tests.
**Q: "Testing framework setup?"** **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?"** **Q: "Documentation structure?"**
A: Follow existing patterns: Getting-Started → User-Guide → Developer-Guide → Reference. Include examples and progressive complexity. A: Follow existing patterns: Getting-Started → User-Guide → Developer-Guide → Reference. Include examples and progressive complexity.

View File

@ -14,7 +14,7 @@
<a href="https://superclaude.netlify.app/"> <a href="https://superclaude.netlify.app/">
<img src="https://img.shields.io/badge/🌐_ウェブサイトを訪問-blue" alt="Website"> <img src="https://img.shields.io/badge/🌐_ウェブサイトを訪問-blue" alt="Website">
</a> </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"> <img src="https://img.shields.io/pypi/v/SuperClaude.svg?" alt="PyPI">
</a> </a>
<a href="https://www.npmjs.com/package/@bifrost_inc/superclaude"> <a href="https://www.npmjs.com/package/@bifrost_inc/superclaude">
@ -275,55 +275,55 @@ pip install --break-system-packages SuperClaude
<tr> <tr>
<td valign="top"> <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>
<td valign="top"> <td valign="top">
- 🎯 [**コマンドリファレンス**](Docs/User-Guide-jp/commands.md) - 🎯 [**コマンドリファレンス**](docs/User-Guide-jp/commands.md)
*全21のスラッシュコマンド* *全21のスラッシュコマンド*
- 🤖 [**エージェントガイド**](Docs/User-Guide-jp/agents.md) - 🤖 [**エージェントガイド**](docs/User-Guide-jp/agents.md)
*14の専門エージェント* *14の専門エージェント*
- 🎨 [**動作モード**](Docs/User-Guide-jp/modes.md) - 🎨 [**動作モード**](docs/User-Guide-jp/modes.md)
*5つの適応モード* *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つのサーバー統合* *6つのサーバー統合*
- 💼 [**セッション管理**](Docs/User-Guide-jp/session-management.md) - 💼 [**セッション管理**](docs/User-Guide-jp/session-management.md)
*状態の保存と復元* *状態の保存と復元*
</td> </td>
<td valign="top"> <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>
<td valign="top"> <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> </td>

View File

@ -14,7 +14,7 @@
<a href="https://superclaude.netlify.app/"> <a href="https://superclaude.netlify.app/">
<img src="https://img.shields.io/badge/🌐_웹사이트_방문-blue" alt="Website"> <img src="https://img.shields.io/badge/🌐_웹사이트_방문-blue" alt="Website">
</a> </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"> <img src="https://img.shields.io/pypi/v/SuperClaude.svg?" alt="PyPI">
</a> </a>
<a href="https://www.npmjs.com/package/@bifrost_inc/superclaude"> <a href="https://www.npmjs.com/package/@bifrost_inc/superclaude">
@ -278,55 +278,55 @@ pip install --break-system-packages SuperClaude
<tr> <tr>
<td valign="top"> <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>
<td valign="top"> <td valign="top">
- 🎯 [**명령어 레퍼런스**](Docs/User-Guide/commands.md) - 🎯 [**명령어 레퍼런스**](docs/User-Guide/commands.md)
*전체 21개 슬래시 명령어* *전체 21개 슬래시 명령어*
- 🤖 [**에이전트 가이드**](Docs/User-Guide/agents.md) - 🤖 [**에이전트 가이드**](docs/User-Guide/agents.md)
*14개 전문 에이전트* *14개 전문 에이전트*
- 🎨 [**작동 모드**](Docs/User-Guide/modes.md) - 🎨 [**작동 모드**](docs/User-Guide/modes.md)
*5가지 적응형 모드* *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개 서버 통합* *6개 서버 통합*
- 💼 [**세션 관리**](Docs/User-Guide/session-management.md) - 💼 [**세션 관리**](docs/User-Guide/session-management.md)
*상태 저장 및 복원* *상태 저장 및 복원*
</td> </td>
<td valign="top"> <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>
<td valign="top"> <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> </td>

View File

@ -14,7 +14,7 @@
<a href="https://superclaude.netlify.app/"> <a href="https://superclaude.netlify.app/">
<img src="https://img.shields.io/badge/🌐_访问网站-blue" alt="Website"> <img src="https://img.shields.io/badge/🌐_访问网站-blue" alt="Website">
</a> </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"> <img src="https://img.shields.io/pypi/v/SuperClaude.svg?" alt="PyPI">
</a> </a>
<a href="https://www.npmjs.com/package/@bifrost_inc/superclaude"> <a href="https://www.npmjs.com/package/@bifrost_inc/superclaude">
@ -275,55 +275,55 @@ pip install --break-system-packages SuperClaude
<tr> <tr>
<td valign="top"> <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>
<td valign="top"> <td valign="top">
- 🎯 [**命令参考**](Docs/User-Guide-zh/commands.md) - 🎯 [**命令参考**](docs/User-Guide-zh/commands.md)
*全部21个斜杠命令* *全部21个斜杠命令*
- 🤖 [**智能体指南**](Docs/User-Guide-zh/agents.md) - 🤖 [**智能体指南**](docs/User-Guide-zh/agents.md)
*14个专业智能体* *14个专业智能体*
- 🎨 [**行为模式**](Docs/User-Guide-zh/modes.md) - 🎨 [**行为模式**](docs/User-Guide-zh/modes.md)
*5种自适应模式* *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个服务器集成* *6个服务器集成*
- 💼 [**会话管理**](Docs/User-Guide-zh/session-management.md) - 💼 [**会话管理**](docs/User-Guide-zh/session-management.md)
*保存和恢复状态* *保存和恢复状态*
</td> </td>
<td valign="top"> <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>
<td valign="top"> <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> </td>

View File

@ -23,7 +23,7 @@
<a href="https://superclaude.netlify.app/"> <a href="https://superclaude.netlify.app/">
<img src="https://img.shields.io/badge/🌐_Visit_Website-blue" alt="Website"> <img src="https://img.shields.io/badge/🌐_Visit_Website-blue" alt="Website">
</a> </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"> <img src="https://img.shields.io/pypi/v/SuperClaude.svg?" alt="PyPI">
</a> </a>
<a href="https://pepy.tech/projects/superclaude"> <a href="https://pepy.tech/projects/superclaude">
@ -392,51 +392,51 @@ The Deep Research system intelligently coordinates multiple tools:
<tr> <tr>
<td valign="top"> <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* *Get up and running fast*
- 💾 [**Installation Guide**](Docs/Getting-Started/installation.md) - 💾 [**Installation Guide**](docs/Getting-Started/installation.md)
*Detailed setup instructions* *Detailed setup instructions*
</td> </td>
<td valign="top"> <td valign="top">
- 🎯 [**Commands Reference**](Docs/User-Guide/commands.md) - 🎯 [**Commands Reference**](docs/User-Guide/commands.md)
*All 25 slash commands* *All 25 slash commands*
- 🤖 [**Agents Guide**](Docs/User-Guide/agents.md) - 🤖 [**Agents Guide**](docs/User-Guide/agents.md)
*15 specialized agents* *15 specialized agents*
- 🎨 [**Behavioral Modes**](Docs/User-Guide/modes.md) - 🎨 [**Behavioral Modes**](docs/User-Guide/modes.md)
*7 adaptive modes* *7 adaptive modes*
- 🚩 [**Flags Guide**](Docs/User-Guide/flags.md) - 🚩 [**Flags Guide**](docs/User-Guide/flags.md)
*Control behaviors* *Control behaviors*
- 🔧 [**MCP Servers**](Docs/User-Guide/mcp-servers.md) - 🔧 [**MCP Servers**](docs/User-Guide/mcp-servers.md)
*7 server integrations* *7 server integrations*
- 💼 [**Session Management**](Docs/User-Guide/session-management.md) - 💼 [**Session Management**](docs/User-Guide/session-management.md)
*Save & restore state* *Save & restore state*
</td> </td>
<td valign="top"> <td valign="top">
- 🏗️ [**Technical Architecture**](Docs/Developer-Guide/technical-architecture.md) - 🏗️ [**Technical Architecture**](docs/Developer-Guide/technical-architecture.md)
*System design details* *System design details*
- 💻 [**Contributing Code**](Docs/Developer-Guide/contributing-code.md) - 💻 [**Contributing Code**](docs/Developer-Guide/contributing-code.md)
*Development workflow* *Development workflow*
- 🧪 [**Testing & Debugging**](Docs/Developer-Guide/testing-debugging.md) - 🧪 [**Testing & Debugging**](docs/Developer-Guide/testing-debugging.md)
*Quality assurance* *Quality assurance*
</td> </td>
<td valign="top"> <td valign="top">
- 📓 [**Examples Cookbook**](Docs/Reference/examples-cookbook.md) - 📓 [**Examples Cookbook**](docs/Reference/examples-cookbook.md)
*Real-world recipes* *Real-world recipes*
- 🔍 [**Troubleshooting**](Docs/Reference/troubleshooting.md) - 🔍 [**Troubleshooting**](docs/Reference/troubleshooting.md)
*Common issues & fixes* *Common issues & fixes*
</td> </td>

View File

@ -631,7 +631,7 @@ For critical vulnerabilities requiring immediate attention:
**General Security Questions:** **General Security Questions:**
- **GitHub Discussions**: https://github.com/SuperClaude-Org/SuperClaude_Framework/discussions - **GitHub Discussions**: https://github.com/SuperClaude-Org/SuperClaude_Framework/discussions
- **Community Forums**: Security-focused discussion threads - **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 - **Issue Tracker**: Non-sensitive security configuration questions
**Technical Security Support:** **Technical Security Support:**
@ -663,25 +663,25 @@ For organizations requiring dedicated security support:
### Security-Related Documentation ### Security-Related Documentation
**Framework Security Documentation:** **Framework Security Documentation:**
- [Quick Start Practices Guide](Docs/Reference/quick-start-practices.md) - Security-focused usage patterns - [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 - [Technical Architecture](docs/Developer-Guide/technical-architecture.md) - Security design principles
- [Contributing Code Guide](Docs/Developer-Guide/contributing-code.md) - Secure development practices - [Contributing Code Guide](docs/Developer-Guide/contributing-code.md) - Secure development practices
- [Testing & Debugging Guide](Docs/Developer-Guide/testing-debugging.md) - Security testing procedures - [Testing & Debugging Guide](docs/Developer-Guide/testing-debugging.md) - Security testing procedures
**MCP Server Security:** **MCP Server Security:**
- [MCP Servers Guide](Docs/User-Guide/mcp-servers.md) - Server security configuration - [MCP Servers Guide](docs/User-Guide/mcp-servers.md) - Server security configuration
- [Troubleshooting Guide](Docs/Reference/troubleshooting.md) - Security-related issue resolution - [Troubleshooting Guide](docs/Reference/troubleshooting.md) - Security-related issue resolution
- MCP Server Documentation - Individual server security considerations - MCP Server Documentation - Individual server security considerations
- Configuration Security - Secure MCP setup and credential management - Configuration Security - Secure MCP setup and credential management
**Agent Security:** **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 - Agent Development - Security considerations for agent implementation
- Behavioral Modes - Security implications of different operational modes - Behavioral Modes - Security implications of different operational modes
- Command Security - Security aspects of command execution and validation - Command Security - Security aspects of command execution and validation
**Session Management Security:** **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 - Memory Security - Secure handling of persistent session data
- Project Isolation - Security boundaries between different projects - Project Isolation - Security boundaries between different projects
- Context Security - Secure context loading and validation - Context Security - Secure context loading and validation

View File

@ -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/

View File

@ -1,7 +1,7 @@
#!/usr/bin/env node #!/usr/bin/env node
const { spawnSync } = require("child_process"); const { spawnSync } = require("child_process");
const { detectPython, detectPip } = require("./checkEnv"); const { detectPython, detectPip } = require("./check_env");
const { checkAndNotify } = require("./checkUpdate"); const { checkAndNotify } = require("./check_update");
let pythonCmd = detectPython(); let pythonCmd = detectPython();
if (!pythonCmd) { if (!pythonCmd) {

View File

@ -1,5 +1,5 @@
#!/usr/bin/env node #!/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..."); console.log("🔍 Checking environment...");

View File

@ -1,5 +1,5 @@
#!/usr/bin/env node #!/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..."); console.log("🔄 Checking for SuperClaude updates...");

View File

@ -57,14 +57,14 @@ SuperClaude is a **Context-Oriented Configuration Framework** - not executing so
``` ```
SuperClaude_Framework/ SuperClaude_Framework/
├── SuperClaude/ # Framework components (the source of truth) ├── superclaude/ # Framework components (the source of truth)
│ ├── Core/ # PRINCIPLES.md, RULES.md, FLAGS.md │ ├── Core/ # PRINCIPLES.md, RULES.md, FLAGS.md
│ ├── Agents/ # 15 specialized domain experts │ ├── Agents/ # 15 specialized domain experts
│ ├── Commands/ # 21 context trigger patterns (/sc: behavioral instructions) │ ├── Commands/ # 21 context trigger patterns (/sc: behavioral instructions)
│ ├── Modes/ # 6 behavioral modification patterns │ ├── Modes/ # 6 behavioral modification patterns
│ └── MCP/ # 6 MCP server configurations │ └── MCP/ # 6 MCP server configurations
├── setup/ # Python installation system ├── setup/ # Python installation system
├── Docs/ # Documentation (what you're reading) ├── docs/ # Documentation (what you're reading)
└── tests/ # File validation scripts └── 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) 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 3. Command activates security-engineer agent context
4. Context7 MCP provides authentication patterns 4. Context7 MCP provides authentication patterns
5. Claude generates complete, secure implementation 5. Claude generates complete, secure implementation
@ -208,7 +208,7 @@ Brief description of context file changes
**Agent Development Process:** **Agent Development Process:**
1. Identify domain expertise gap 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 3. Define triggers, behaviors, and boundaries
4. Test with various Claude Code scenarios 4. Test with various Claude Code scenarios
5. Document usage patterns and examples 5. Document usage patterns and examples

View 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

View 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
View 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
View 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

View File

@ -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` の修正を開始します。

View 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. ✅ 学習記録
このドキュメント自体が**インストールフローの完全理解記録**として機能する。
次回のセッションで読めば、同じ説明を繰り返さなくて済む。

View 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の憲法**となる。

View 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

View 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管理下で開発
これで**何百回も同じ説明をしなくて済む**ようになる。

View 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` を読んで現在の仕様を確認する

View 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)

View File

@ -1,12 +1,12 @@
# SuperClaude エージェントガイド 🤖 # 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 のドメイン スペシャリスト エージェントを提供します。 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 エージェントとは何ですか? ### 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 が読み取って特殊な動作を採用するコンテキスト構成です。 **重要**: エージェントは別個の AI モデルやソフトウェアではなく、Claude Code が読み取って特殊な動作を採用するコンテキスト構成です。
### エージェントの2つの使用方法 ### エージェントの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- プレフィックスを使用した手動呼び出し #### 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 ```shell
# Directly invoke a specific agent # Directly invoke a specific agent
@ -64,7 +64,7 @@ SuperClaude は、Claude Code が専門知識を得るために呼び出すこ
#### 2. 自動アクティベーション(行動ルーティング) #### 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が最適なスペシャリストにルーティングするための動作ガイドラインを提供します。 「自動アクティベーション」とは、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 ```shell
# Explicitly call specific agents with @agent- prefix # 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 ```shell
# Commands that trigger auto-activation # 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 ```shell
# Start with command (auto-activation) # Start with command (auto-activation)
@ -165,15 +165,15 @@ Task Analysis →
## SuperClaude エージェントチーム 👥 ## 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の信頼性とデータの整合性を重視した堅牢なサーバーサイドシステム設計 **専門分野**: 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 アプリケーション アーキテクチャ **専門分野**: アクセシビリティとユーザーエクスペリエンスを重視した最新の Web アプリケーション アーキテクチャ
@ -276,7 +276,7 @@ Task Analysis →
### DevOps アーキテクト 🚀 ### 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 エキスパート 🐍 ### 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 開発 **専門分野**: 最新のフレームワークとパフォーマンスを重視した、本番環境対応の 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 サーバー統合 ### 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 サーバーによる拡張機能**: **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/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/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 セッションを再起動します。 - **エージェントの選択をリセット**: エージェントの状態をリセットするには、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` - 使用`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 ### エージェント 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が、さまざまなレベルの専門知識を持つすべてのドメインを処理します。 **エージェントアプローチ**: 専門のエキスパートが、深いドメイン知識と集中的な問題解決で協力します。 **従来のアプローチ**: 単一の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コマンドをマスターする - **[コマンドガイド](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)**- 専用ツールの統合によるエージェント機能の強化 - **[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/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/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/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/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/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/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週自然な使用法** 自然な言語による説明から始めましょう。どのエージェントが、そしてなぜアクティブになるのかに注目しましょう。プロセスを考えすぎずに、キーワードのパターンに対する直感を養います。

View File

@ -1,12 +1,12 @@
# SuperClaude コマンドガイド # 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 コマンドを提供します。 `/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 ```shell
# Terminal: Verify installation # Terminal: Verify installation
@ -32,11 +32,11 @@ python3 -m SuperClaude --version
## 🎯 SuperClaude コマンドの理解 ## 🎯 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の仕組み ## 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`コンテキストファイルを読み込み、その動作指示に従います。 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:*`):ワークフローパターンと動作​​モードをトリガーする - **スラッシュコマンド**`/sc:*`):ワークフローパターンと動作​​モードをトリガーする
- **エージェントの呼び出し**`@agent-*`):特定のドメインスペシャリストを手動で起動する - **エージェントの呼び出し**`@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"` 1. **ユーザー入力**: 入力する`/sc:implement "auth system"`
2. **コンテキスト読み込み**: クロードコード読み取り`~/.claude/SuperClaude/Commands/implement.md` 2. **コンテキスト読み込み**: クロードコード読み取り`~/.claude/superclaude/Commands/implement.md`
3. **行動の採用**:クロードはドメインの専門知識、ツールの選択、検証パターンを適用します 3. **行動の採用**:クロードはドメインの専門知識、ツールの選択、検証パターンを適用します
4. **強化された出力**: セキュリティ上の考慮事項とベストプラクティスを備えた構造化された実装 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 ソフトウェア): **🖥️ ターミナルコマンド**(実際の 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で実行 ### 🖥️ ターミナル検証(ターミナル/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 ```shell
# Verify SuperClaude is working (primary method) # 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 # Test basic /sc: command
@ -116,11 +116,11 @@ python3 -m SuperClaude install --list-components | grep mcp
# Example behavior: List of available commands # 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#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#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#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#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#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`- プロジェクト発見 ### `/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]` **構文**:`/sc:brainstorm "your idea"` `[--strategy systematic|creative]`
@ -165,7 +165,7 @@ python3 -m SuperClaude install --list-components | grep mcp
### `/sc:implement`- 機能開発 ### `/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]` **構文**:`/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`- コード評価 ### `/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]` **構文**:`/sc:analyze [path]` `[--focus quality|security|performance|architecture]`
@ -192,7 +192,7 @@ python3 -m SuperClaude install --list-components | grep mcp
### `/sc:troubleshoot`- 問題診断 ### `/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]` **構文**:`/sc:troubleshoot "issue description"` `[--type build|runtime|performance]`
@ -205,7 +205,7 @@ python3 -m SuperClaude install --list-components | grep mcp
### `/sc:test`- 品質保証 ### `/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]` **構文**:`/sc:test` `[--type unit|integration|e2e] [--coverage] [--fix]`
@ -218,7 +218,7 @@ python3 -m SuperClaude install --list-components | grep mcp
### `/sc:improve`- コード強化 ### `/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]` **構文**:`/sc:improve [path]` `[--type performance|quality|security] [--preview]`
@ -231,7 +231,7 @@ python3 -m SuperClaude install --list-components | grep mcp
### `/sc:document`- ドキュメント生成 ### `/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の包括的なドキュメントを生成する **目的**: コードとAPIの包括的なドキュメントを生成する
**構文**:`/sc:document [path]` `[--type api|user-guide|technical] [--format markdown|html]` **構文**:`/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`- 実装計画 ### `/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]` **構文**:`/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 ```shell
/sc:brainstorm "project concept" # Define requirements /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 ```shell
/sc:implement "feature name" # Build the feature /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 ```shell
/sc:analyze --focus quality # Assess current state /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 ```shell
/sc:troubleshoot "issue description" # Diagnose the problem /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`再初期化する - セッションをリセット:`/sc:load`再初期化する
- ステータスを確認:`SuperClaude install --list-components` - ステータスを確認:`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/flags.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/agents.md)- スペシャリストのアクティベーション
- [例のクックブック](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Reference/examples-cookbook.md)- 実際の使用パターン - [例のクックブック](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/docs/Reference/examples-cookbook.md)- 実際の使用パターン

View File

@ -1,16 +1,16 @@
# SuperClaude フラグガイド 🏁 # 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 は、リクエスト内のキーワードとパターンに基づいて適切なコンテキストを実行するための動作指示を読み取ります。 **ほとんどのフラグは自動的にアクティブになります**。Claude Code は、リクエスト内のキーワードとパターンに基づいて適切なコンテキストを実行するための動作指示を読み取ります。
## 必須の自動アクティベーションフラグユースケースの90% ## 必須の自動アクティベーションフラグユースケースの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 サーバーフラグ ### 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` ### 分析コマンドフラグ(`/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` ### ビルドコマンドフラグ(`/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` ### 設計コマンドフラグ(`/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` ### コマンドフラグの説明(`/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` ### コマンドフラグの改善(`/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` ### タスクコマンドフラグ(`/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` ### ワークフローコマンドフラグ(`/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`) ### コマンドフラグのトラブルシューティング ( `/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` ### クリーンアップコマンドフラグ(`/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` ### コマンドフラグの推定(`/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` ### インデックスコマンドフラグ(`/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`) ### コマンドフラグを反映する ( `/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` ### スポーンコマンドフラグ(`/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` ### 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`) ### 選択ツールコマンドフラグ ( `/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` ### テストコマンドフラグ(`/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 インストール) ### システムフラグ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 ```shell
/sc:implement "responsive dashboard" --magic --c7 /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 ```shell
/sc:analyze api/ --focus performance --seq --think /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 ```shell
/sc:analyze . --ultrathink --all-mcp --safe-mode /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 ```shell
/sc:improve src/ --type quality --safe --interactive /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`: ドキュメント付き分析 - `--think`+ `--c7`: ドキュメント付き分析
- `--magic`+ `--play`: テスト付きのUI生成 - `--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フラグと比較どちらか一方を使用 - `--all-mcp`個別のMCPフラグと比較どちらか一方を使用
- `--no-mcp`任意のMCPフラグと比較--no-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` - `--safe-mode`自動的`--uc`に有効になり、`--validate`
- `--ultrathink`すべてのMCPサーバーを自動的に有効にする - `--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`ネイティブツールのみでテストする - **ツールが多すぎる**:`--no-mcp`ネイティブツールのみでテストする
- **操作が遅すぎます**:`--uc`出力を圧縮するために追加します - **操作が遅すぎます**:`--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 ```shell
/sc:analyze . --verbose # Shows decision logic and flag activation /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 ```shell
/sc:analyze . --help # Shows available flags for command /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`> 最適化フラグ 1. **安全第一**: `--safe-mode`> `--validate`> 最適化フラグ
2. **明示的なオーバーライド**: ユーザーフラグ > 自動検出 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)- これらのフラグを使用するコマンド - [コマンドガイド](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 フラグのアクティブ化について - [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/session-management.md)- 永続セッションでのフラグの使用

View File

@ -1,16 +1,16 @@
# SuperClaude MCP サーバーガイド 🔌 # 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に指示します。 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プロセス - **MCPサーバーとは**: 追加ツールを提供する外部Node.jsプロセス
- **含まれていないもの**SuperClaude 機能が組み込まれている - **含まれていないもの**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 📚 ### コンテキスト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キーなし **目的**: 公式ライブラリドキュメントへのアクセス **トリガー**: インポートステートメント、フレームワークキーワード、ドキュメントリクエスト **要件**: 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キーなし **目的**: 構造化された多段階の推論と体系的な分析 **トリガー**: 複雑なデバッグ、`--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() **目的**: 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キーなし **目的**: 実際のブラウザ自動化とE2Eテスト **トリガー**: ブラウザテスト、E2Eシナリオ、視覚的検証 **要件**: Node.js 16以上、APIキーなし
@ -109,7 +109,7 @@ export TWENTYFIRST_API_KEY="your_key_here"
### morphllm-fast-apply 🔄 ### 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 **目的**: 効率的なパターンベースのコード変換 **トリガー**: 複数ファイルの編集、リファクタリング、フレームワークの移行 **要件**: 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 キーなし **目的**: プロジェクトメモリを使用したセマンティックコード理解 **トリガー**: シンボル操作、大規模コードベース、セッション管理 **要件**: 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`):** **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キーなし無料** : **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 コマンドを使用する場合:** **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/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/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/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/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/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/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/Developer-Guide/technical-architecture.md)- 統合の詳細

View File

@ -1,16 +1,16 @@
# SuperClaude 行動モードガイド 🧠 # 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分の概要 ## はじめに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 はコンテキスト ファイルを読み取り、タスクのパターンと複雑さに基づいてどのモード動作を採用するかを決定します。 **モードは動作指示を通じてアクティブ化されます**- 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% のトークン削減を実現します。 **目的**: 情報の品質を維持しながら、シンボル システムを通じて推定 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 ```shell
# Force specific mode behaviors # 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/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/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` - **モードがアクティブ化されていません**: 手動フラグを使用してください: `--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` - **特定のモードを強制**:`--brainstorm`またはのような明示的なフラグを使用する`--task-manage`
- **リセットモードの動作**: モード状態をリセットするには、Claude Code セッションを再起動します。 - **リセットモードの動作**: モード状態をリセットするには、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 )** **レベル 1: クイックフィックス (< 2 )**
@ -596,7 +596,7 @@ Standard Approach: Consistent, professional baseline for all tasks
# Review request complexity and triggers # 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分以上** **レベル3: 専門家によるサポート30分以上**
@ -607,7 +607,7 @@ SuperClaude install --diagnose
# Review behavioral triggers and thresholds # 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: コミュニティサポート** **レベル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` - **モードがアクティブ化されない**→手動フラグを使用: `--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: 通信パターンで次のインジケーターを確認してください。 **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 つの行動モードは、ユーザーのニーズに自動的に適合する**インテリジェントな適応システムを作成します。** 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週** **🌱 エッセンシャル第1週**
- [クイックスタートガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/Getting-Started/quick-start.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/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/installation.md)- 動作モードの設定
**🌿中級第23週** **🌿中級第23週**
- [エージェントガイド](https://github.com/khayashi4337/SuperClaude_Framework/blob/master/Docs/User-Guide/agents.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/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/Reference/examples-cookbook.md)- モードパターンの実践
**🌲 上級2ヶ月目以降** **🌲 上級2ヶ月目以降**
- [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/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/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/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/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/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/Reference/examples-cookbook.md#requirements)
- **タスク管理**[セッション管理ガイド](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/session-management.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/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/User-Guide/commands.md#token-efficiency)

View File

@ -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 の会話全体にわたる真のコンテキスト保存と長期的なプロジェクト継続性を実現します。 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`- 永続メモリによるコンテキストの読み込み ### `/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 **目的**: 以前のセッションからのプロジェクトコンテキストと永続メモリを使用してセッションを初期化します。MCP
**統合**: Serena MCP をトリガーして、保存されたプロジェクトメモリを読み取ります。 **統合**: Serena MCP をトリガーして、保存されたプロジェクトメモリを読み取ります。
@ -38,7 +38,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
### `/sc:save`- メモリへのセッションの永続性 ### `/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 をトリガーしてメモリ ファイルに書き込みます。 **MCP に保存します。統合**: Serena MCP をトリガーしてメモリ ファイルに書き込みます。
@ -66,7 +66,7 @@ SuperClaude は、Serena MCP サーバーを通じて永続的なセッション
### `/sc:reflect`- メモリコンテキストによる進捗状況の評価 ### `/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 を使用して、保存されたメモリと現在の状態を比較する **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 が真の永続性を実現する方法 ### 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 ```shell
# 1. Start fresh project # 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 ```shell
# 1. Load previous context from persistent memory # 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 ```shell
# Weekly checkpoint pattern with persistence # 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 会話を開始すると、永続メモリ システムによって次のことが可能になります。 新しい 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`既存のプロジェクトの場合は常に 1. `/sc:load`既存のプロジェクトの場合は常に
2. `/sc:reflect`記憶から現在の状態を理解するために使用する 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`保存された目標に対する完全性を評価するために使用します 1. `/sc:reflect`保存された目標に対する完全性を評価するために使用します
2. 重要な決定を`/sc:save`将来のセッションのために保存する 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機能との統合 ## 他の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 サーバー調整 ### 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** : 永続メモリインフラストラクチャを提供します - **Serena MCP** : 永続メモリインフラストラクチャを提供します
- **シーケンシャル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:`コマンドは永続的なコンテキストを参照し、そのコンテキストに基づいて構築できます。 - すべての`/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セッション間でコンテキストが失われることはありません - 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)
- セッション間で一貫したアーキテクチャパターン - セッション間で一貫したアーキテクチャパターン
- コード品質の決定と標準の保持 - コード品質の決定と標準の保持

View File

@ -35,7 +35,7 @@ SuperClaude는 Claude Code가 전문 지식을 위해 호출할 수 있는 15개
### SuperClaude 에이전트란? ### SuperClaude 에이전트란?
**에이전트**는 Claude Code의 동작을 수정하는 컨텍스트 지시문으로 구현된 전문 AI 도메인 전문가입니다. 각 에이전트는 `SuperClaude/Agents/` 디렉토리에 있는 신중하게 작성된 `.md` 파일로, 도메인별 전문 지식, 행동 패턴, 문제 해결 접근 방식을 포함합니다. **에이전트**는 Claude Code의 동작을 수정하는 컨텍스트 지시문으로 구현된 전문 AI 도메인 전문가입니다. 각 에이전트는 `superclaude/Agents/` 디렉토리에 있는 신중하게 작성된 `.md` 파일로, 도메인별 전문 지식, 행동 패턴, 문제 해결 접근 방식을 포함합니다.
**중요**: 에이전트는 별도의 AI 모델이나 소프트웨어가 아닙니다 - Claude Code가 읽어 전문화된 행동을 채택하는 컨텍스트 구성입니다. **중요**: 에이전트는 별도의 AI 모델이나 소프트웨어가 아닙니다 - Claude Code가 읽어 전문화된 행동을 채택하는 컨텍스트 구성입니다.

View File

@ -38,7 +38,7 @@ SuperClaude는 Claude Code가 읽어 전문화된 동작을 채택하는 행동
### 컨텍스트 메커니즘: ### 컨텍스트 메커니즘:
1. **사용자 입력**: `/sc:implement "인증 시스템"` 입력 1. **사용자 입력**: `/sc:implement "인증 시스템"` 입력
2. **컨텍스트 로딩**: Claude Code가 `~/.claude/SuperClaude/Commands/implement.md` 읽음 2. **컨텍스트 로딩**: Claude Code가 `~/.claude/superclaude/Commands/implement.md` 읽음
3. **동작 채택**: Claude가 도메인 전문 지식, 도구 선택, 검증 패턴 적용 3. **동작 채택**: Claude가 도메인 전문 지식, 도구 선택, 검증 패턴 적용
4. **향상된 출력**: 보안 고려사항 및 모범 사례를 갖춘 구조화된 구현 4. **향상된 출력**: 보안 고려사항 및 모범 사례를 갖춘 구조화된 구현

View File

@ -35,7 +35,7 @@ SuperClaude 提供了 14 个领域专业智能体Claude Code 可以调用它
## 核心概念 ## 核心概念
### 什么是 SuperClaude 智能体? ### 什么是 SuperClaude 智能体?
**智能体**是专业的 AI 领域专家,以上下文指令的形式实现,用于修改 Claude Code 的行为。每个智能体都是 `SuperClaude/Agents/` 目录中精心制作的 `.md` 文件,包含领域特定的专业知识、行为模式和问题解决方法。 **智能体**是专业的 AI 领域专家,以上下文指令的形式实现,用于修改 Claude Code 的行为。每个智能体都是 `superclaude/Agents/` 目录中精心制作的 `.md` 文件,包含领域特定的专业知识、行为模式和问题解决方法。
**重要提示**:智能体不是独立的 AI 模型或软件 - 它们是 Claude Code 读取的上下文配置,用于采用专门的行为。 **重要提示**:智能体不是独立的 AI 模型或软件 - 它们是 Claude Code 读取的上下文配置,用于采用专门的行为。

View File

@ -38,7 +38,7 @@ SuperClaude 提供行为上下文文件Claude Code 通过读取这些文件
### 上下文机制: ### 上下文机制:
1. **用户输入**:您输入 `/sc:implement "auth system"` 1. **用户输入**:您输入 `/sc:implement "auth system"`
2. **上下文加载**Claude Code 读取 `~/.claude/SuperClaude/Commands/implement.md` 2. **上下文加载**Claude Code 读取 `~/.claude/superclaude/Commands/implement.md`
3. **行为采用**Claude 运用专业知识进行工具选择和验证 3. **行为采用**Claude 运用专业知识进行工具选择和验证
4. **增强输出**:带有安全考虑和最佳实践的结构化实现 4. **增强输出**:带有安全考虑和最佳实践的结构化实现

View File

@ -35,7 +35,7 @@ Before using this guide, verify agent selection works:
## Core Concepts ## Core Concepts
### What are SuperClaude Agents? ### 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. **Important**: Agents are NOT separate AI models or software - they are context configurations that Claude Code reads to adopt specialized behaviors.

View File

@ -38,7 +38,7 @@ SuperClaude provides behavioral context files that Claude Code reads to adopt sp
### The Context Mechanism: ### The Context Mechanism:
1. **User Input**: You type `/sc:implement "auth system"` 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 3. **Behavior Adoption**: Claude applies domain expertise, tool selection, and validation patterns
4. **Enhanced Output**: Structured implementation with security considerations and best practices 4. **Enhanced Output**: Structured implementation with security considerations and best practices

View 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
View 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)

View File

@ -3,7 +3,7 @@ requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[project] [project]
name = "SuperClaude" name = "superclaude"
version = "4.1.5" version = "4.1.5"
authors = [ authors = [
{name = "NomenAK", email = "anton.knoery@gmail.com"}, {name = "NomenAK", email = "anton.knoery@gmail.com"},
@ -43,8 +43,8 @@ GitHub = "https://github.com/SuperClaude-Org/SuperClaude_Framework"
"NomenAK" = "https://github.com/NomenAK" "NomenAK" = "https://github.com/NomenAK"
[project.scripts] [project.scripts]
SuperClaude = "SuperClaude.__main__:main" SuperClaude = "superclaude.__main__:main"
superclaude = "SuperClaude.__main__:main" superclaude = "superclaude.__main__:main"
[project.optional-dependencies] [project.optional-dependencies]
dev = [ dev = [
@ -64,12 +64,12 @@ include-package-data = true
[tool.setuptools.packages.find] [tool.setuptools.packages.find]
where = ["."] where = ["."]
include = ["SuperClaude*", "setup*"] include = ["superclaude*", "setup*"]
exclude = ["tests*", "*.tests*", "*.tests", ".git*", ".venv*", "*.egg-info*"] exclude = ["tests*", "*.tests*", "*.tests", ".git*", ".venv*", "*.egg-info*"]
[tool.setuptools.package-data] [tool.setuptools.package-data]
"setup" = ["data/*.json", "data/*.yaml", "data/*.yml", "components/*.py", "**/*.py"] "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] [tool.black]
line-length = 88 line-length = 88
@ -115,7 +115,7 @@ markers = [
] ]
[tool.coverage.run] [tool.coverage.run]
source = ["SuperClaude", "setup"] source = ["superclaude", "setup"]
omit = [ omit = [
"*/tests/*", "*/tests/*",
"*/test_*", "*/test_*",

View File

@ -107,8 +107,8 @@ Set these in your GitHub repository settings → Secrets and variables → Actio
Before publishing, ensure version consistency across: Before publishing, ensure version consistency across:
- `pyproject.toml` - `pyproject.toml`
- `SuperClaude/__init__.py` - `superclaude/__init__.py`
- `SuperClaude/__main__.py` - `superclaude/__main__.py`
- `setup/__init__.py` - `setup/__init__.py`
The build script validates version consistency automatically. The build script validates version consistency automatically.

View File

@ -17,16 +17,13 @@ PROJECT_ROOT = Path(__file__).parent.parent
DIST_DIR = PROJECT_ROOT / "dist" DIST_DIR = PROJECT_ROOT / "dist"
BUILD_DIR = PROJECT_ROOT / "build" BUILD_DIR = PROJECT_ROOT / "build"
def run_command(cmd: List[str], description: str) -> Tuple[bool, str]: def run_command(cmd: List[str], description: str) -> Tuple[bool, str]:
"""Run a command and return success status and output""" """Run a command and return success status and output"""
print(f"🔄 {description}...") print(f"🔄 {description}...")
try: try:
result = subprocess.run( result = subprocess.run(
cmd, cmd, capture_output=True, text=True, cwd=PROJECT_ROOT, check=True
capture_output=True,
text=True,
cwd=PROJECT_ROOT,
check=True
) )
print(f"{description} completed successfully") print(f"{description} completed successfully")
return True, result.stdout 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}") print(f"{description} failed with exception: {e}")
return False, str(e) return False, str(e)
def clean_build_artifacts(): def clean_build_artifacts():
"""Clean previous 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: for artifact in artifacts:
if artifact.exists(): if artifact.exists():
@ -51,6 +49,7 @@ def clean_build_artifacts():
else: else:
artifact.unlink() artifact.unlink()
def install_build_tools() -> bool: def install_build_tools() -> bool:
"""Install required build tools""" """Install required build tools"""
tools = ["build", "twine"] tools = ["build", "twine"]
@ -58,22 +57,23 @@ def install_build_tools() -> bool:
for tool in tools: for tool in tools:
success, _ = run_command( success, _ = run_command(
[sys.executable, "-m", "pip", "install", "--upgrade", tool], [sys.executable, "-m", "pip", "install", "--upgrade", tool],
f"Installing {tool}" f"Installing {tool}",
) )
if not success: if not success:
return False return False
return True return True
def validate_project_structure() -> bool: def validate_project_structure() -> bool:
"""Validate project structure before building""" """Validate project structure before building"""
required_files = [ required_files = [
"pyproject.toml", "pyproject.toml",
"README.md", "README.md",
"LICENSE", "LICENSE",
"SuperClaude/__init__.py", "superclaude/__init__.py",
"SuperClaude/__main__.py", "superclaude/__main__.py",
"setup/__init__.py" "setup/__init__.py",
] ]
print("🔍 Validating project structure...") print("🔍 Validating project structure...")
@ -86,7 +86,8 @@ def validate_project_structure() -> bool:
# Check if version is consistent # Check if version is consistent
try: try:
from SuperClaude import __version__ from superclaude import __version__
print(f"📦 Package version: {__version__}") print(f"📦 Package version: {__version__}")
except ImportError as e: except ImportError as e:
print(f"❌ Could not import version from SuperClaude: {e}") print(f"❌ Could not import version from SuperClaude: {e}")
@ -95,13 +96,14 @@ def validate_project_structure() -> bool:
print("✅ Project structure validation passed") print("✅ Project structure validation passed")
return True return True
def build_package() -> bool: def build_package() -> bool:
"""Build the package""" """Build the package"""
return run_command( return run_command(
[sys.executable, "-m", "build"], [sys.executable, "-m", "build"], "Building package distributions"
"Building package distributions"
)[0] )[0]
def validate_distribution() -> bool: def validate_distribution() -> bool:
"""Validate the built distribution""" """Validate the built distribution"""
if not DIST_DIR.exists(): if not DIST_DIR.exists():
@ -120,27 +122,35 @@ def validate_distribution() -> bool:
# Check with twine # Check with twine
return run_command( return run_command(
[sys.executable, "-m", "twine", "check"] + [str(f) for f in dist_files], [sys.executable, "-m", "twine", "check"] + [str(f) for f in dist_files],
"Validating distributions with twine" "Validating distributions with twine",
)[0] )[0]
def upload_to_testpypi() -> bool: def upload_to_testpypi() -> bool:
"""Upload to TestPyPI for testing""" """Upload to TestPyPI for testing"""
dist_files = list(DIST_DIR.glob("*")) dist_files = list(DIST_DIR.glob("*"))
return run_command( return run_command(
[sys.executable, "-m", "twine", "upload", "--repository", "testpypi"] + [str(f) for f in dist_files], [sys.executable, "-m", "twine", "upload", "--repository", "testpypi"]
"Uploading to TestPyPI" + [str(f) for f in dist_files],
"Uploading to TestPyPI",
)[0] )[0]
def upload_to_pypi() -> bool: def upload_to_pypi() -> bool:
"""Upload to production PyPI""" """Upload to production PyPI"""
dist_files = list(DIST_DIR.glob("*")) dist_files = list(DIST_DIR.glob("*"))
# Check if we have API token in environment # Check if we have API token in environment
if os.getenv('PYPI_API_TOKEN'): if os.getenv("PYPI_API_TOKEN"):
cmd = [ cmd = [
sys.executable, "-m", "twine", "upload", sys.executable,
"--username", "__token__", "-m",
"--password", os.getenv('PYPI_API_TOKEN') "twine",
"upload",
"--username",
"__token__",
"--password",
os.getenv("PYPI_API_TOKEN"),
] + [str(f) for f in dist_files] ] + [str(f) for f in dist_files]
else: else:
# Fall back to .pypirc configuration # Fall back to .pypirc configuration
@ -148,24 +158,36 @@ def upload_to_pypi() -> bool:
return run_command(cmd, "Uploading to PyPI")[0] return run_command(cmd, "Uploading to PyPI")[0]
def test_installation_from_testpypi() -> bool: def test_installation_from_testpypi() -> bool:
"""Test installation from TestPyPI""" """Test installation from TestPyPI"""
print("🧪 Testing installation from TestPyPI...") print("🧪 Testing installation from TestPyPI...")
print(" Note: This will install in a separate process") print(" Note: This will install in a separate process")
success, output = run_command([ success, output = run_command(
sys.executable, "-m", "pip", "install", [
"--index-url", "https://test.pypi.org/simple/", sys.executable,
"--extra-index-url", "https://pypi.org/simple/", "-m",
"SuperClaude", "--force-reinstall", "--no-deps" "pip",
], "Installing from TestPyPI") "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: if success:
print("✅ Test installation successful") print("✅ Test installation successful")
# Try to import the package # Try to import the package
try: try:
import SuperClaude import superclaude
print(f"✅ Package import successful, version: {SuperClaude.__version__}")
print(f"✅ Package import successful, version: {superclaude.__version__}")
return True return True
except ImportError as e: except ImportError as e:
print(f"❌ Package import failed: {e}") print(f"❌ Package import failed: {e}")
@ -173,14 +195,25 @@ def test_installation_from_testpypi() -> bool:
return False return False
def main(): def main():
"""Main execution function""" """Main execution function"""
parser = argparse.ArgumentParser(description="Build and upload SuperClaude to PyPI") 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(
parser.add_argument("--test-install", action="store_true", help="Test installation from TestPyPI") "--testpypi", action="store_true", help="Upload to TestPyPI instead of PyPI"
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(
parser.add_argument("--clean", action="store_true", help="Only clean build artifacts") "--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() args = parser.parse_args()
@ -231,7 +264,9 @@ def main():
sys.exit(1) sys.exit(1)
else: else:
# Confirm production upload # 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": if response.lower() != "yes":
print("❌ Upload cancelled") print("❌ Upload cancelled")
sys.exit(1) sys.exit(1)
@ -242,5 +277,6 @@ def main():
print("✅ All operations completed successfully!") print("✅ All operations completed successfully!")
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -12,6 +12,7 @@ from typing import List, Tuple
# Project root # Project root
PROJECT_ROOT = Path(__file__).parent.parent PROJECT_ROOT = Path(__file__).parent.parent
def check_file_exists(file_path: Path, description: str) -> bool: def check_file_exists(file_path: Path, description: str) -> bool:
"""Check if a required file exists""" """Check if a required file exists"""
if file_path.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}") print(f"❌ Missing {description}: {file_path}")
return False return False
def check_version_consistency() -> bool: def check_version_consistency() -> bool:
"""Check if versions are consistent across files""" """Check if versions are consistent across files"""
print("\n🔍 Checking version consistency...") print("\n🔍 Checking version consistency...")
@ -30,20 +32,21 @@ def check_version_consistency() -> bool:
# Check pyproject.toml # Check pyproject.toml
try: try:
pyproject_path = PROJECT_ROOT / "pyproject.toml" pyproject_path = PROJECT_ROOT / "pyproject.toml"
with open(pyproject_path, 'r') as f: with open(pyproject_path, "r") as f:
pyproject = toml.load(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']}") print(f"📋 pyproject.toml version: {versions['pyproject.toml']}")
except Exception as e: except Exception as e:
print(f"❌ Error reading pyproject.toml: {e}") print(f"❌ Error reading pyproject.toml: {e}")
return False return False
# Check SuperClaude/__init__.py # Check superclaude/__init__.py
try: try:
sys.path.insert(0, str(PROJECT_ROOT)) sys.path.insert(0, str(PROJECT_ROOT))
from SuperClaude import __version__ from superclaude import __version__
versions['SuperClaude/__init__.py'] = __version__
print(f"📦 Package version: {versions['SuperClaude/__init__.py']}") versions["superclaude/__init__.py"] = __version__
print(f"📦 Package version: {versions['superclaude/__init__.py']}")
except Exception as e: except Exception as e:
print(f"❌ Error importing SuperClaude version: {e}") print(f"❌ Error importing SuperClaude version: {e}")
return False return False
@ -51,7 +54,8 @@ def check_version_consistency() -> bool:
# Check setup/__init__.py # Check setup/__init__.py
try: try:
from setup import __version__ as setup_version 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']}") print(f"🔧 Setup version: {versions['setup/__init__.py']}")
except Exception as e: except Exception as e:
print(f"❌ Error importing setup version: {e}") print(f"❌ Error importing setup version: {e}")
@ -66,18 +70,19 @@ def check_version_consistency() -> bool:
print(f"❌ Version mismatch: {versions}") print(f"❌ Version mismatch: {versions}")
return False return False
def check_package_structure() -> bool: def check_package_structure() -> bool:
"""Check if package structure is correct""" """Check if package structure is correct"""
print("\n🏗️ Checking package structure...") print("\n🏗️ Checking package structure...")
required_structure = [ required_structure = [
("SuperClaude/__init__.py", "Main package __init__.py"), ("superclaude/__init__.py", "Main package __init__.py"),
("SuperClaude/__main__.py", "Main entry point"), ("superclaude/__main__.py", "Main entry point"),
("SuperClaude/Core/__init__.py", "Core module __init__.py"), ("superclaude/Core/__init__.py", "Core module __init__.py"),
("SuperClaude/Commands/__init__.py", "Commands module __init__.py"), ("superclaude/Commands/__init__.py", "Commands module __init__.py"),
("SuperClaude/Agents/__init__.py", "Agents module __init__.py"), ("superclaude/Agents/__init__.py", "Agents module __init__.py"),
("SuperClaude/Modes/__init__.py", "Modes module __init__.py"), ("superclaude/Modes/__init__.py", "Modes module __init__.py"),
("SuperClaude/MCP/__init__.py", "MCP module __init__.py"), ("superclaude/MCP/__init__.py", "MCP module __init__.py"),
("setup/__init__.py", "Setup package __init__.py"), ("setup/__init__.py", "Setup package __init__.py"),
] ]
@ -89,6 +94,7 @@ def check_package_structure() -> bool:
return all_good return all_good
def check_required_files() -> bool: def check_required_files() -> bool:
"""Check if all required files are present""" """Check if all required files are present"""
print("\n📄 Checking required files...") print("\n📄 Checking required files...")
@ -109,19 +115,20 @@ def check_required_files() -> bool:
return all_good return all_good
def check_pyproject_config() -> bool: def check_pyproject_config() -> bool:
"""Check pyproject.toml configuration""" """Check pyproject.toml configuration"""
print("\n⚙️ Checking pyproject.toml configuration...") print("\n⚙️ Checking pyproject.toml configuration...")
try: try:
pyproject_path = PROJECT_ROOT / "pyproject.toml" pyproject_path = PROJECT_ROOT / "pyproject.toml"
with open(pyproject_path, 'r') as f: with open(pyproject_path, "r") as f:
pyproject = toml.load(f) pyproject = toml.load(f)
project = pyproject.get('project', {}) project = pyproject.get("project", {})
# Required fields # Required fields
required_fields = ['name', 'version', 'description', 'authors'] required_fields = ["name", "version", "description", "authors"]
for field in required_fields: for field in required_fields:
if field in project: if field in project:
print(f"{field}: {project[field]}") print(f"{field}: {project[field]}")
@ -130,15 +137,15 @@ def check_pyproject_config() -> bool:
return False return False
# Check entry points # Check entry points
scripts = project.get('scripts', {}) scripts = project.get("scripts", {})
if 'SuperClaude' in scripts: if "superclaude" in scripts:
print(f"✅ CLI entry point: {scripts['SuperClaude']}") print(f"✅ CLI entry point: {scripts['superclaude']}")
else: else:
print("❌ Missing CLI entry point") print("❌ Missing CLI entry point")
return False return False
# Check classifiers # Check classifiers
classifiers = project.get('classifiers', []) classifiers = project.get("classifiers", [])
if len(classifiers) > 0: if len(classifiers) > 0:
print(f"{len(classifiers)} PyPI classifiers defined") print(f"{len(classifiers)} PyPI classifiers defined")
else: else:
@ -150,21 +157,24 @@ def check_pyproject_config() -> bool:
print(f"❌ Error reading pyproject.toml: {e}") print(f"❌ Error reading pyproject.toml: {e}")
return False return False
def check_import_test() -> bool: def check_import_test() -> bool:
"""Test if the package can be imported""" """Test if the package can be imported"""
print("\n🧪 Testing package import...") print("\n🧪 Testing package import...")
try: try:
sys.path.insert(0, str(PROJECT_ROOT)) sys.path.insert(0, str(PROJECT_ROOT))
import SuperClaude import superclaude
print(f"✅ SuperClaude import successful") print(f"✅ SuperClaude import successful")
print(f"📦 Version: {SuperClaude.__version__}") print(f"📦 Version: {superclaude.__version__}")
print(f"👤 Author: {SuperClaude.__author__}") print(f"👤 Author: {superclaude.__author__}")
return True return True
except Exception as e: except Exception as e:
print(f"❌ Import failed: {e}") print(f"❌ Import failed: {e}")
return False return False
def main(): def main():
"""Main validation function""" """Main validation function"""
print("🔍 SuperClaude PyPI Readiness Validation") print("🔍 SuperClaude PyPI Readiness Validation")
@ -215,6 +225,7 @@ def main():
print("❌ Project needs fixes before PyPI publication") print("❌ Project needs fixes before PyPI publication")
return False return False
if __name__ == "__main__": if __name__ == "__main__":
success = main() success = main()
sys.exit(0 if success else 1) sys.exit(0 if success else 1)

View File

@ -7,5 +7,5 @@ from .base import OperationBase
from .commands import * from .commands import *
__all__ = [ __all__ = [
'OperationBase', "OperationBase",
] ]

View File

@ -19,23 +19,23 @@ def get_command_info():
"install": { "install": {
"name": "install", "name": "install",
"description": "Install SuperClaude framework components", "description": "Install SuperClaude framework components",
"module": "setup.cli.commands.install" "module": "setup.cli.commands.install",
}, },
"update": { "update": {
"name": "update", "name": "update",
"description": "Update existing SuperClaude installation", "description": "Update existing SuperClaude installation",
"module": "setup.cli.commands.update" "module": "setup.cli.commands.update",
}, },
"uninstall": { "uninstall": {
"name": "uninstall", "name": "uninstall",
"description": "Remove SuperClaude framework installation", "description": "Remove SuperClaude framework installation",
"module": "setup.cli.commands.uninstall" "module": "setup.cli.commands.uninstall",
}, },
"backup": { "backup": {
"name": "backup", "name": "backup",
"description": "Backup and restore SuperClaude installations", "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): def setup_operation_logging(self, args):
"""Setup operation-specific logging""" """Setup operation-specific logging"""
from ..utils.logger import get_logger from ..utils.logger import get_logger
self.logger = get_logger() self.logger = get_logger()
self.logger.info(f"Starting {self.operation_name} operation") self.logger.info(f"Starting {self.operation_name} operation")
@ -57,14 +58,17 @@ class OperationBase:
errors = [] errors = []
# Validate install directory # 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 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: if not is_safe:
errors.extend(validation_errors) errors.extend(validation_errors)
# Check for conflicting flags # 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: if args.verbose and args.quiet:
errors.append("Cannot specify both --verbose and --quiet") errors.append("Cannot specify both --verbose and --quiet")

View File

@ -10,9 +10,9 @@ from .update import UpdateOperation
from .backup import BackupOperation from .backup import BackupOperation
__all__ = [ __all__ = [
'OperationBase', "OperationBase",
'InstallOperation', "InstallOperation",
'UninstallOperation', "UninstallOperation",
'UpdateOperation', "UpdateOperation",
'BackupOperation' "BackupOperation",
] ]

View File

@ -9,14 +9,22 @@ import tarfile
import json import json
from pathlib import Path from pathlib import Path
from ...utils.paths import get_home_directory from ...utils.paths import get_home_directory
from datetime import datetime from datetime import datetime, timedelta
from typing import List, Optional, Dict, Any, Tuple from typing import List, Optional, Dict, Any, Tuple
import argparse import argparse
from ...services.settings import SettingsService from ...services.settings import SettingsService
from ...utils.ui import ( from ...utils.ui import (
display_header, display_info, display_success, display_error, display_header,
display_warning, Menu, confirm, ProgressBar, Colors, format_size display_info,
display_success,
display_error,
display_warning,
Menu,
confirm,
ProgressBar,
Colors,
format_size,
) )
from ...utils.logger import get_logger from ...utils.logger import get_logger
from ... import DEFAULT_INSTALL_DIR from ... import DEFAULT_INSTALL_DIR
@ -48,68 +56,56 @@ Examples:
SuperClaude backup --cleanup --force # Clean up old backups (forced) SuperClaude backup --cleanup --force # Clean up old backups (forced)
""", """,
formatter_class=argparse.RawDescriptionHelpFormatter, formatter_class=argparse.RawDescriptionHelpFormatter,
parents=parents parents=parents,
) )
# Backup operations (mutually exclusive) # Backup operations (mutually exclusive)
operation_group = parser.add_mutually_exclusive_group(required=True) operation_group = parser.add_mutually_exclusive_group(required=True)
operation_group.add_argument( operation_group.add_argument(
"--create", "--create", action="store_true", help="Create a new backup"
action="store_true",
help="Create a new backup"
) )
operation_group.add_argument( operation_group.add_argument(
"--list", "--list", action="store_true", help="List available backups"
action="store_true",
help="List available backups"
) )
operation_group.add_argument( operation_group.add_argument(
"--restore", "--restore",
nargs="?", nargs="?",
const="interactive", const="interactive",
help="Restore from backup (optionally specify backup file)" help="Restore from backup (optionally specify backup file)",
) )
operation_group.add_argument( operation_group.add_argument(
"--info", "--info", type=str, help="Show information about a specific backup file"
type=str,
help="Show information about a specific backup file"
) )
operation_group.add_argument( operation_group.add_argument(
"--cleanup", "--cleanup", action="store_true", help="Clean up old backup files"
action="store_true",
help="Clean up old backup files"
) )
# Backup options # Backup options
parser.add_argument( parser.add_argument(
"--backup-dir", "--backup-dir",
type=Path, type=Path,
help="Backup directory (default: <install-dir>/backups)" help="Backup directory (default: <install-dir>/backups)",
) )
parser.add_argument( parser.add_argument("--name", type=str, help="Custom backup name (for --create)")
"--name",
type=str,
help="Custom backup name (for --create)"
)
parser.add_argument( parser.add_argument(
"--compress", "--compress",
choices=["none", "gzip", "bzip2"], choices=["none", "gzip", "bzip2"],
default="gzip", default="gzip",
help="Compression method (default: gzip)" help="Compression method (default: gzip)",
) )
# Restore options # Restore options
parser.add_argument( parser.add_argument(
"--overwrite", "--overwrite",
action="store_true", action="store_true",
help="Overwrite existing files during restore" help="Overwrite existing files during restore",
) )
# Cleanup options # Cleanup options
@ -117,13 +113,11 @@ Examples:
"--keep", "--keep",
type=int, type=int,
default=5, 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( parser.add_argument(
"--older-than", "--older-than", type=int, help="Remove backups older than N days"
type=int,
help="Remove backups older than N days"
) )
return parser return parser
@ -141,7 +135,10 @@ def check_installation_exists(install_dir: Path) -> bool:
"""Check if SuperClaude installation (v2 included) exists""" """Check if SuperClaude installation (v2 included) exists"""
settings_manager = SettingsService(install_dir) 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]: 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(), "exists": backup_path.exists(),
"size": 0, "size": 0,
"created": None, "created": None,
"metadata": {} "metadata": {},
} }
if not backup_path.exists(): if not backup_path.exists():
@ -224,7 +221,11 @@ def display_backup_list(backups: List[Dict[str, Any]]) -> None:
for backup in backups: for backup in backups:
name = backup["path"].name name = backup["path"].name
size = format_size(backup["size"]) if backup["size"] > 0 else "unknown" 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")) files = str(backup.get("files", "unknown"))
print(f"{name:<30} {size:<10} {created:<20} {files:<8}") 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]: def create_backup_metadata(install_dir: Path) -> Dict[str, Any]:
"""Create metadata for the backup""" """Create metadata for the backup"""
from setup import __version__
metadata = { metadata = {
"backup_version": __version__, "backup_version": __version__,
"created": datetime.now().isoformat(), "created": datetime.now().isoformat(),
"install_dir": str(install_dir), "install_dir": str(install_dir),
"components": {}, "components": {},
"framework_version": "unknown" "framework_version": "unknown",
} }
try: try:
@ -304,7 +307,10 @@ def create_backup(args: argparse.Namespace) -> bool:
with tarfile.open(backup_file, mode) as tar: with tarfile.open(backup_file, mode) as tar:
# Add metadata file # Add metadata file
import tempfile 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) json.dump(metadata, temp_file, indent=2)
temp_file.flush() temp_file.flush()
tar.add(temp_file.name, arcname="backup_metadata.json") 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: for backup in backups:
name = backup["path"].name name = backup["path"].name
size = format_size(backup["size"]) if backup["size"] > 0 else "unknown" 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})") backup_options.append(f"{name} ({size}, {created})")
menu = Menu("Select backup:", backup_options) 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: if args.keep and len(backups) > args.keep:
# Sort by date and take oldest ones to remove # Sort by date and take oldest ones to remove
backups.sort(key=lambda x: x.get("created", datetime.min), reverse=True) 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 # Remove duplicates
to_remove = list({backup["path"]: backup for backup in to_remove}.values()) to_remove = list({backup["path"]: backup for backup in to_remove}.values())
@ -515,9 +525,10 @@ def run(args: argparse.Namespace) -> int:
# Display header # Display header
if not args.quiet: if not args.quiet:
from setup.cli.base import __version__ from setup.cli.base import __version__
display_header( display_header(
f"SuperClaude Backup v{__version__}", f"SuperClaude Backup v{__version__}",
"Backup and restore SuperClaude installations" "Backup and restore SuperClaude installations",
) )
backup_dir = get_backup_directory(args) backup_dir = get_backup_directory(args)
@ -562,7 +573,9 @@ def run(args: argparse.Namespace) -> int:
if info["metadata"]: if info["metadata"]:
metadata = 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"): if metadata.get("components"):
print("Components:") print("Components:")
for comp, ver in metadata["components"].items(): for comp, ver in metadata["components"].items():

View File

@ -15,8 +15,17 @@ from ...core.registry import ComponentRegistry
from ...services.config import ConfigService from ...services.config import ConfigService
from ...core.validator import Validator from ...core.validator import Validator
from ...utils.ui import ( from ...utils.ui import (
display_header, display_info, display_success, display_error, display_header,
display_warning, Menu, confirm, ProgressBar, Colors, format_size, prompt_api_key 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.environment import setup_environment_variables
from ...utils.logger import get_logger from ...utils.logger import get_logger
@ -47,41 +56,36 @@ Examples:
SuperClaude install --verbose --force # Verbose with force mode SuperClaude install --verbose --force # Verbose with force mode
""", """,
formatter_class=argparse.RawDescriptionHelpFormatter, formatter_class=argparse.RawDescriptionHelpFormatter,
parents=parents parents=parents,
) )
# Installation mode options # Installation mode options
parser.add_argument( parser.add_argument(
"--components", "--components", type=str, nargs="+", help="Specific components to install"
type=str,
nargs="+",
help="Specific components to install"
) )
# Installation options # Installation options
parser.add_argument( parser.add_argument("--no-backup", action="store_true", help="Skip backup creation")
"--no-backup",
action="store_true",
help="Skip backup creation"
)
parser.add_argument( parser.add_argument(
"--list-components", "--list-components",
action="store_true", action="store_true",
help="List available components and exit" help="List available components and exit",
) )
parser.add_argument( parser.add_argument(
"--diagnose", "--diagnose",
action="store_true", action="store_true",
help="Run system diagnostics and show installation help" help="Run system diagnostics and show installation help",
) )
return parser 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""" """Validate system requirements"""
logger = get_logger() 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) requirements = config_manager.get_requirements_for_components(component_names)
# Validate requirements # Validate requirements
success, errors = validator.validate_component_requirements(component_names, requirements) success, errors = validator.validate_component_requirements(
component_names, requirements
)
if success: if success:
logger.success("All system requirements met") logger.success("All system requirements met")
@ -105,7 +111,9 @@ def validate_system_requirements(validator: Validator, component_names: List[str
# Provide additional guidance # Provide additional guidance
print(f"\n{Colors.CYAN}💡 Installation Help:{Colors.RESET}") 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.") print(" and step-by-step installation instructions.")
return False return False
@ -115,37 +123,45 @@ def validate_system_requirements(validator: Validator, component_names: List[str
return False 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""" """Determine which components to install"""
logger = get_logger() logger = get_logger()
# Explicit components specified # Explicit components specified
if args.components: if args.components:
if 'all' in args.components: if "all" in args.components:
components = ["core", "commands", "agents", "modes", "mcp", "mcp_docs"] components = ["core", "commands", "agents", "modes", "mcp", "mcp_docs"]
else: else:
components = args.components components = args.components
# If mcp or mcp_docs is specified non-interactively, we should still ask which servers to install. # 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) 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 = {}
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 the user selected some servers, ensure both mcp and mcp_docs are included
if selected_servers: if selected_servers:
if 'mcp' not in components: if "mcp" not in components:
components.append('mcp') components.append("mcp")
logger.debug(f"Auto-added 'mcp' component for selected servers: {selected_servers}") logger.debug(
if 'mcp_docs' not in components: f"Auto-added 'mcp' component for selected servers: {selected_servers}"
components.append('mcp_docs') )
logger.debug(f"Auto-added 'mcp_docs' 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}") logger.info(f"Final components to install: {components}")
# If mcp_docs was explicitly requested but no servers selected, allow auto-detection # 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("mcp_docs component will auto-detect existing MCP servers")
logger.info("Documentation will be installed for any detected 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) 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 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 = [ servers_needing_keys = [
(server_key, mcp_instance.mcp_servers[server_key]) (server_key, mcp_instance.mcp_servers[server_key])
for server_key in selected_servers for server_key in selected_servers
if server_key in mcp_instance.mcp_servers and if server_key in mcp_instance.mcp_servers
mcp_instance.mcp_servers[server_key].get("requires_api_key", False) and mcp_instance.mcp_servers[server_key].get("requires_api_key", False)
] ]
if not servers_needing_keys: 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 # Display API key configuration header
print(f"\n{Colors.CYAN}{Colors.BRIGHT}=== API Key Configuration ==={Colors.RESET}") 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 = {} collected_keys = {}
for server_key, server_info in servers_needing_keys: for server_key, server_info in servers_needing_keys:
@ -200,8 +220,10 @@ def select_mcp_servers(registry: ComponentRegistry) -> List[str]:
try: try:
# Get MCP component to access server list # Get MCP component to access server list
mcp_instance = registry.get_component_instance("mcp", get_home_directory() / ".claude") mcp_instance = registry.get_component_instance(
if not mcp_instance or not hasattr(mcp_instance, 'mcp_servers'): "mcp", get_home_directory() / ".claude"
)
if not mcp_instance or not hasattr(mcp_instance, "mcp_servers"):
logger.error("Could not access MCP server information") logger.error("Could not access MCP server information")
return [] return []
@ -211,19 +233,31 @@ def select_mcp_servers(registry: ComponentRegistry) -> List[str]:
for server_key, server_info in mcp_servers.items(): for server_key, server_info in mcp_servers.items():
description = server_info["description"] 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}") server_options.append(f"{server_key} - {description}{api_key_note}")
print(f"\n{Colors.CYAN}{Colors.BRIGHT}{'='*51}{Colors.RESET}") 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"{Colors.CYAN}{Colors.BRIGHT}{'='*51}{Colors.RESET}")
print(f"\n{Colors.BLUE}MCP servers extend Claude Code with specialized capabilities.{Colors.RESET}") print(
print(f"{Colors.BLUE}Select servers to configure (you can always add more later):{Colors.RESET}") 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 # Add option to skip MCP
server_options.append("Skip MCP Server installation") 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() selections = menu.display()
if not selections: if not selections:
@ -242,7 +276,9 @@ def select_mcp_servers(registry: ComponentRegistry) -> List[str]:
logger.info(f"Selected MCP servers: {', '.join(selected_servers)}") logger.info(f"Selected MCP servers: {', '.join(selected_servers)}")
# NEW: Collect API keys for 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 # Set up environment variables
if collected_keys: if collected_keys:
@ -260,7 +296,11 @@ def select_mcp_servers(registry: ComponentRegistry) -> List[str]:
return [] 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""" """Stage 2: Framework Component Selection"""
logger = get_logger() 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}") component_options.append(f"mcp_docs - {mcp_docs_desc}")
auto_selected_mcp_docs = True auto_selected_mcp_docs = True
else: 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 auto_selected_mcp_docs = False
print(f"\n{Colors.CYAN}{Colors.BRIGHT}{'='*51}{Colors.RESET}") 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"{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() selections = menu.display()
if not selections: if not selections:
@ -329,24 +379,32 @@ def select_framework_components(registry: ComponentRegistry, config_manager: Con
return ["core"] # Fallback to core 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""" """Two-stage interactive component selection"""
logger = get_logger() logger = get_logger()
try: try:
print(f"\n{Colors.CYAN}SuperClaude Interactive Installation{Colors.RESET}") 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 # Stage 1: MCP Server Selection
selected_mcp_servers = select_mcp_servers(registry) selected_mcp_servers = select_mcp_servers(registry)
# Stage 2: Framework Component Selection # 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 # 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 = {}
config_manager._installation_context["selected_mcp_servers"] = selected_mcp_servers config_manager._installation_context["selected_mcp_servers"] = (
selected_mcp_servers
)
return selected_components return selected_components
@ -355,7 +413,9 @@ def interactive_component_selection(registry: ComponentRegistry, config_manager:
return None 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""" """Display installation plan"""
logger = get_logger() logger = get_logger()
@ -378,8 +438,10 @@ def display_installation_plan(components: List[str], registry: ComponentRegistry
# Get size estimate if component supports it # Get size estimate if component supports it
try: try:
instance = registry.get_component_instance(component_name, install_dir) instance = registry.get_component_instance(
if instance and hasattr(instance, 'get_size_estimate'): component_name, install_dir
)
if instance and hasattr(instance, "get_size_estimate"):
size = instance.get_size_estimate() size = instance.get_size_estimate()
total_size += size total_size += size
except Exception: except Exception:
@ -388,7 +450,9 @@ def display_installation_plan(components: List[str], registry: ComponentRegistry
print(f" {i}. {component_name} - Unknown component") print(f" {i}. {component_name} - Unknown component")
if total_size > 0: 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() print()
@ -414,43 +478,53 @@ def run_system_diagnostics(validator: Validator) -> None:
print(f"\n{Colors.BLUE}System Checks:{Colors.RESET}") print(f"\n{Colors.BLUE}System Checks:{Colors.RESET}")
all_passed = True all_passed = True
for check_name, check_info in diagnostics['checks'].items(): for check_name, check_info in diagnostics["checks"].items():
status = check_info['status'] status = check_info["status"]
message = check_info['message'] message = check_info["message"]
if status == 'pass': if status == "pass":
print(f"{check_name}: {message}") print(f"{check_name}: {message}")
else: else:
print(f"{check_name}: {message}") print(f"{check_name}: {message}")
all_passed = False all_passed = False
# Display issues and recommendations # Display issues and recommendations
if diagnostics['issues']: if diagnostics["issues"]:
print(f"\n{Colors.YELLOW}Issues Found:{Colors.RESET}") print(f"\n{Colors.YELLOW}Issues Found:{Colors.RESET}")
for issue in diagnostics['issues']: for issue in diagnostics["issues"]:
print(f" ⚠️ {issue}") print(f" ⚠️ {issue}")
print(f"\n{Colors.CYAN}Recommendations:{Colors.RESET}") print(f"\n{Colors.CYAN}Recommendations:{Colors.RESET}")
for recommendation in diagnostics['recommendations']: for recommendation in diagnostics["recommendations"]:
print(recommendation) print(recommendation)
# Summary # Summary
if all_passed: 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: 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}") print(f"\n{Colors.BLUE}Next steps:{Colors.RESET}")
if all_passed: if all_passed:
print(" 1. Run 'SuperClaude install' to proceed with installation") print(" 1. Run 'superclaude install' to proceed with installation")
print(" 2. Choose your preferred installation mode (quick, minimal, or custom)") print(
" 2. Choose your preferred installation mode (quick, minimal, or custom)"
)
else: else:
print(" 1. Install missing dependencies using the commands above") print(" 1. Install missing dependencies using the commands above")
print(" 2. Restart your terminal after installing tools") 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""" """Perform the actual installation"""
logger = get_logger() logger = get_logger()
start_time = time.time() start_time = time.time()
@ -464,7 +538,9 @@ def perform_installation(components: List[str], args: argparse.Namespace, config
registry.discover_components() registry.discover_components()
# Create component instances # 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: if not component_instances:
logger.error("No valid component instances created") logger.error("No valid component instances created")
@ -478,9 +554,7 @@ def perform_installation(components: List[str], args: argparse.Namespace, config
# Setup progress tracking # Setup progress tracking
progress = ProgressBar( progress = ProgressBar(
total=len(ordered_components), total=len(ordered_components), prefix="Installing: ", suffix=""
prefix="Installing: ",
suffix=""
) )
# Install components # Install components
@ -490,7 +564,9 @@ def perform_installation(components: List[str], args: argparse.Namespace, config
"force": args.force, "force": args.force,
"backup": not args.no_backup, "backup": not args.no_backup,
"dry_run": args.dry_run, "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) 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 duration = time.time() - start_time
if success: if success:
logger.success(f"Installation completed successfully in {duration:.1f} seconds") logger.success(
f"Installation completed successfully in {duration:.1f} seconds"
)
# Show summary # Show summary
summary = installer.get_installation_summary() summary = installer.get_installation_summary()
if summary['installed']: if summary["installed"]:
logger.info(f"Installed components: {', '.join(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']}") logger.info(f"Backup created: {summary['backup_path']}")
else: 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() summary = installer.get_installation_summary()
if summary['failed']: if summary["failed"]:
logger.error(f"Failed components: {', '.join(summary['failed'])}") logger.error(f"Failed components: {', '.join(summary['failed'])}")
return success return success
@ -556,8 +636,8 @@ def run(args: argparse.Namespace) -> int:
home_parts = expected_home.parts home_parts = expected_home.parts
# Skip home directory parts # Skip home directory parts
if len(parts) >= len(home_parts) and parts[:len(home_parts)] == home_parts: if len(parts) >= len(home_parts) and parts[: len(home_parts)] == home_parts:
relative_parts = parts[len(home_parts):] relative_parts = parts[len(home_parts) :]
for part in relative_parts: for part in relative_parts:
current_path = current_path / part current_path = current_path / part
@ -587,9 +667,10 @@ def run(args: argparse.Namespace) -> int:
# Display header # Display header
if not args.quiet: if not args.quiet:
from setup.cli.base import __version__ from setup.cli.base import __version__
display_header( display_header(
f"SuperClaude Installation v{__version__}", f"SuperClaude Installation v{__version__}",
"Installing SuperClaude framework components" "Installing SuperClaude framework components",
) )
# Handle special modes # Handle special modes
@ -636,7 +717,9 @@ def run(args: argparse.Namespace) -> int:
return 1 return 1
# Get components to install # 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: if not components_to_install:
logger.error("No components selected for installation") logger.error("No components selected for installation")
return 1 return 1
@ -654,13 +737,19 @@ def run(args: argparse.Namespace) -> int:
logger.error("System requirements not met. Use --force to override.") logger.error("System requirements not met. Use --force to override.")
return 1 return 1
else: 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 # Check for existing installation
if args.install_dir.exists() and not args.force: if args.install_dir.exists() and not args.force:
if not args.dry_run: if not args.dry_run:
logger.warning(f"Installation directory already exists: {args.install_dir}") logger.warning(
if not args.yes and not confirm("Continue and update existing installation?", default=False): 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") logger.info("Installation cancelled by user")
return 0 return 0
@ -669,7 +758,9 @@ def run(args: argparse.Namespace) -> int:
display_installation_plan(resolved_components, registry, args.install_dir) display_installation_plan(resolved_components, registry, args.install_dir)
if not args.dry_run: 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") logger.info("Installation cancelled by user")
return 0 return 0

View File

@ -14,10 +14,20 @@ from ...core.registry import ComponentRegistry
from ...services.settings import SettingsService from ...services.settings import SettingsService
from ...services.files import FileService from ...services.files import FileService
from ...utils.ui import ( from ...utils.ui import (
display_header, display_info, display_success, display_error, display_header,
display_warning, Menu, confirm, ProgressBar, Colors 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 ...utils.logger import get_logger
from ... import DEFAULT_INSTALL_DIR, PROJECT_ROOT from ... import DEFAULT_INSTALL_DIR, PROJECT_ROOT
from . import OperationBase from . import OperationBase
@ -37,33 +47,51 @@ def verify_superclaude_file(file_path: Path, component: str) -> bool:
try: try:
# Known SuperClaude file patterns by component # Known SuperClaude file patterns by component
superclaude_patterns = { superclaude_patterns = {
'core': [ "core": [
'CLAUDE.md', 'FLAGS.md', 'PRINCIPLES.md', 'RULES.md', "CLAUDE.md",
'ORCHESTRATOR.md', 'SESSION_LIFECYCLE.md' "FLAGS.md",
"PRINCIPLES.md",
"RULES.md",
"ORCHESTRATOR.md",
"SESSION_LIFECYCLE.md",
], ],
'commands': [ "commands": [
# Commands are only in sc/ subdirectory # Commands are only in sc/ subdirectory
], ],
'agents': [ "agents": [
'backend-engineer.md', 'brainstorm-PRD.md', 'code-educator.md', "backend-engineer.md",
'code-refactorer.md', 'devops-engineer.md', 'frontend-specialist.md', "brainstorm-PRD.md",
'performance-optimizer.md', 'python-ultimate-expert.md', 'qa-specialist.md', "code-educator.md",
'root-cause-analyzer.md', 'security-auditor.md', 'system-architect.md', "code-refactorer.md",
'technical-writer.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': [ "modes": [
'MODE_Brainstorming.md', 'MODE_Introspection.md', "MODE_Brainstorming.md",
'MODE_Task_Management.md', 'MODE_Token_Efficiency.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 # For commands component, verify it's in the sc/ subdirectory
if component == 'commands': if component == "commands":
return 'commands/sc/' in str(file_path) return "commands/sc/" in str(file_path)
# For other components, check against known file lists # For other components, check against known file lists
if component in superclaude_patterns: 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] return filename in superclaude_patterns[component]
# For MCP component, it doesn't remove files but modifies .claude.json # 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 return True # MCP component has its own safety logic
# Default to preserve if uncertain # Default to preserve if uncertain
@ -141,64 +169,58 @@ Examples:
SuperClaude uninstall --keep-backups # Keep backup files SuperClaude uninstall --keep-backups # Keep backup files
""", """,
formatter_class=argparse.RawDescriptionHelpFormatter, formatter_class=argparse.RawDescriptionHelpFormatter,
parents=parents parents=parents,
) )
# Uninstall mode options # Uninstall mode options
parser.add_argument( parser.add_argument(
"--components", "--components", type=str, nargs="+", help="Specific components to uninstall"
type=str,
nargs="+",
help="Specific components to uninstall"
) )
parser.add_argument( parser.add_argument(
"--complete", "--complete",
action="store_true", action="store_true",
help="Complete uninstall (remove all files and directories)" help="Complete uninstall (remove all files and directories)",
) )
# Data preservation options # Data preservation options
parser.add_argument( parser.add_argument(
"--keep-backups", "--keep-backups", action="store_true", help="Keep backup files during uninstall"
action="store_true",
help="Keep backup files during uninstall"
) )
parser.add_argument( parser.add_argument(
"--keep-logs", "--keep-logs", action="store_true", help="Keep log files during uninstall"
action="store_true",
help="Keep log files during uninstall"
) )
parser.add_argument( parser.add_argument(
"--keep-settings", "--keep-settings",
action="store_true", action="store_true",
help="Keep user settings during uninstall" help="Keep user settings during uninstall",
) )
# Safety options # Safety options
parser.add_argument( parser.add_argument(
"--no-confirm", "--no-confirm",
action="store_true", action="store_true",
help="Skip confirmation prompts (use with caution)" help="Skip confirmation prompts (use with caution)",
) )
# Environment cleanup options # Environment cleanup options
parser.add_argument( parser.add_argument(
"--cleanup-env", "--cleanup-env",
action="store_true", action="store_true",
help="Remove SuperClaude environment variables" help="Remove SuperClaude environment variables",
) )
parser.add_argument( parser.add_argument(
"--no-restore-script", "--no-restore-script",
action="store_true", action="store_true",
help="Skip creating environment variable restore script" help="Skip creating environment variable restore script",
) )
return parser return parser
def get_installed_components(install_dir: Path) -> Dict[str, Dict[str, Any]]: def get_installed_components(install_dir: Path) -> Dict[str, Dict[str, Any]]:
"""Get currently installed components and their versions""" """Get currently installed components and their versions"""
try: try:
@ -216,7 +238,7 @@ def get_installation_info(install_dir: Path) -> Dict[str, Any]:
"components": {}, "components": {},
"directories": [], "directories": [],
"files": [], "files": [],
"total_size": 0 "total_size": 0,
} }
if not install_dir.exists(): if not install_dir.exists():
@ -246,15 +268,21 @@ def display_environment_info() -> Dict[str, str]:
if env_vars: if env_vars:
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Environment Variables{Colors.RESET}") print(f"\n{Colors.CYAN}{Colors.BRIGHT}Environment Variables{Colors.RESET}")
print("=" * 50) 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(): for env_var, value in env_vars.items():
# Show only first few and last few characters for security # Show only first few and last few characters for security
masked_value = f"{value[:4]}...{value[-4:]}" if len(value) > 8 else "***" masked_value = f"{value[:4]}...{value[-4:]}" if len(value) > 8 else "***"
print(f" {env_var}: {masked_value}") 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: 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 return env_vars
@ -280,12 +308,17 @@ def display_uninstall_info(info: Dict[str, Any]) -> None:
if info["total_size"] > 0: if info["total_size"] > 0:
from ...utils.ui import format_size 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() 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""" """Determine which components to uninstall"""
logger = get_logger() logger = get_logger()
@ -296,7 +329,9 @@ def get_components_to_uninstall(args: argparse.Namespace, installed_components:
# Explicit components specified # Explicit components specified
if args.components: if args.components:
# Validate that specified components are installed # 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: if invalid_components:
logger.error(f"Components not installed: {invalid_components}") logger.error(f"Components not installed: {invalid_components}")
return None return None
@ -306,7 +341,9 @@ def get_components_to_uninstall(args: argparse.Namespace, installed_components:
return interactive_uninstall_selection(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 Enhanced interactive selection with granular component options
@ -323,7 +360,7 @@ def interactive_component_selection(installed_components: Dict[str, str], env_va
main_options = [ main_options = [
"Complete Uninstall (remove all SuperClaude components)", "Complete Uninstall (remove all SuperClaude components)",
"Custom Uninstall (choose specific components)", "Custom Uninstall (choose specific components)",
"Cancel Uninstall" "Cancel Uninstall",
] ]
print(f"\n{Colors.BLUE}Choose uninstall type:{Colors.RESET}") 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]: def _ask_complete_uninstall_options(env_vars: Dict[str, str]) -> Dict[str, bool]:
"""Ask for complete uninstall options""" """Ask for complete uninstall options"""
cleanup_options = { cleanup_options = {
'remove_mcp_configs': True, "remove_mcp_configs": True,
'cleanup_env_vars': False, "cleanup_env_vars": False,
'create_restore_script': True "create_restore_script": True,
} }
print(f"\n{Colors.YELLOW}{Colors.BRIGHT}Complete Uninstall Options{Colors.RESET}") 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 "***" masked_value = f"{value[:4]}...{value[-4:]}" if len(value) > 8 else "***"
print(f" {env_var}: {masked_value}") print(f" {env_var}: {masked_value}")
cleanup_env = confirm("Also remove API key environment variables?", default=False) cleanup_env = confirm(
cleanup_options['cleanup_env_vars'] = cleanup_env "Also remove API key environment variables?", default=False
)
cleanup_options["cleanup_env_vars"] = cleanup_env
if cleanup_env: if cleanup_env:
create_script = confirm("Create restore script for environment variables?", default=True) create_script = confirm(
cleanup_options['create_restore_script'] = create_script "Create restore script for environment variables?", default=True
)
cleanup_options["create_restore_script"] = create_script
return cleanup_options 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""" """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:") print("Select which SuperClaude components to remove:")
# Build component options with descriptions # Build component options with descriptions
@ -379,12 +424,12 @@ def _custom_component_selection(installed_components: Dict[str, str], env_vars:
component_keys = [] component_keys = []
component_descriptions = { component_descriptions = {
'core': 'Core Framework Files (CLAUDE.md, FLAGS.md, PRINCIPLES.md, etc.)', "core": "Core Framework Files (CLAUDE.md, FLAGS.md, PRINCIPLES.md, etc.)",
'commands': 'SuperClaude Commands (commands/sc/*.md)', "commands": "superclaude Commands (commands/sc/*.md)",
'agents': 'Specialized Agents (agents/*.md)', "agents": "Specialized Agents (agents/*.md)",
'mcp': 'MCP Server Configurations', "mcp": "MCP Server Configurations",
'mcp_docs': 'MCP Documentation', "mcp_docs": "MCP Documentation",
'modes': 'SuperClaude Modes' "modes": "superclaude Modes",
} }
for component, version in installed_components.items(): 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 # If MCP component is selected, ask about related cleanup options
cleanup_options = { cleanup_options = {
'remove_mcp_configs': 'mcp' in selected_components, "remove_mcp_configs": "mcp" in selected_components,
'cleanup_env_vars': False, "cleanup_env_vars": False,
'create_restore_script': True "create_restore_script": True,
} }
if 'mcp' in selected_components: if "mcp" in selected_components:
cleanup_options.update(_ask_mcp_cleanup_options(env_vars)) cleanup_options.update(_ask_mcp_cleanup_options(env_vars))
elif env_vars: elif env_vars:
# Even if MCP not selected, ask about env vars if they exist # 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_env = confirm(
cleanup_options['cleanup_env_vars'] = cleanup_env f"Remove {len(env_vars)} API key environment variables?", default=False
)
cleanup_options["cleanup_env_vars"] = cleanup_env
if cleanup_env: if cleanup_env:
create_script = confirm("Create restore script for environment variables?", default=True) create_script = confirm(
cleanup_options['create_restore_script'] = create_script "Create restore script for environment variables?", default=True
)
cleanup_options["create_restore_script"] = create_script
return selected_components, cleanup_options return selected_components, cleanup_options
@ -429,32 +478,42 @@ def _ask_mcp_cleanup_options(env_vars: Dict[str, str]) -> Dict[str, bool]:
cleanup_options = {} cleanup_options = {}
# Ask about MCP server configurations # Ask about MCP server configurations
remove_configs = confirm("Remove MCP server configurations from .claude.json?", default=True) remove_configs = confirm(
cleanup_options['remove_mcp_configs'] = remove_configs "Remove MCP server configurations from .claude.json?", default=True
)
cleanup_options["remove_mcp_configs"] = remove_configs
# Ask about API key environment variables # Ask about API key environment variables
if env_vars: 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(): for env_var, value in env_vars.items():
masked_value = f"{value[:4]}...{value[-4:]}" if len(value) > 8 else "***" masked_value = f"{value[:4]}...{value[-4:]}" if len(value) > 8 else "***"
print(f" {env_var}: {masked_value}") print(f" {env_var}: {masked_value}")
cleanup_env = confirm(f"Remove {len(env_vars)} API key environment variables?", default=False) cleanup_env = confirm(
cleanup_options['cleanup_env_vars'] = cleanup_env f"Remove {len(env_vars)} API key environment variables?", default=False
)
cleanup_options["cleanup_env_vars"] = cleanup_env
if cleanup_env: if cleanup_env:
create_script = confirm("Create restore script for environment variables?", default=True) create_script = confirm(
cleanup_options['create_restore_script'] = create_script "Create restore script for environment variables?", default=True
)
cleanup_options["create_restore_script"] = create_script
else: else:
cleanup_options['create_restore_script'] = True cleanup_options["create_restore_script"] = True
else: else:
cleanup_options['cleanup_env_vars'] = False cleanup_options["cleanup_env_vars"] = False
cleanup_options['create_restore_script'] = True cleanup_options["create_restore_script"] = True
return cleanup_options 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""" """Legacy function - redirects to enhanced selection"""
env_vars = get_superclaude_environment_variables() env_vars = get_superclaude_environment_variables()
result = interactive_component_selection(installed_components, env_vars) 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)""" """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"\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 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 .claude.json configurations{Colors.RESET}")
print(f"{Colors.GREEN}+ User's custom files in shared directories{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]: def display_component_details(component: str, info: Dict[str, Any]) -> Dict[str, Any]:
"""Get detailed information about what will be removed for a component""" """Get detailed information about what will be removed for a component"""
details = { details = {"files": [], "directories": [], "size": 0, "description": ""}
'files': [],
'directories': [],
'size': 0,
'description': ''
}
install_dir = info['install_dir'] install_dir = info["install_dir"]
component_paths = { component_paths = {
'core': { "core": {
'files': ['CLAUDE.md', 'FLAGS.md', 'PRINCIPLES.md', 'RULES.md', 'ORCHESTRATOR.md', 'SESSION_LIFECYCLE.md'], "files": [
'description': 'Core framework files in ~/.claude/' "CLAUDE.md",
"FLAGS.md",
"PRINCIPLES.md",
"RULES.md",
"ORCHESTRATOR.md",
"SESSION_LIFECYCLE.md",
],
"description": "Core framework files in ~/.claude/",
}, },
'commands': { "commands": {
'files': 'commands/sc/*.md', "files": "commands/sc/*.md",
'description': 'SuperClaude commands in ~/.claude/commands/sc/' "description": "superclaude commands in ~/.claude/commands/sc/",
}, },
'agents': { "agents": {
'files': 'agents/*.md', "files": "agents/*.md",
'description': 'Specialized AI agents in ~/.claude/agents/' "description": "Specialized AI agents in ~/.claude/agents/",
}, },
'mcp': { "mcp": {
'files': 'MCP server configurations in .claude.json', "files": "MCP server configurations in .claude.json",
'description': 'MCP server configurations' "description": "MCP server configurations",
}, },
'mcp_docs': { "mcp_docs": {"files": "MCP/*.md", "description": "MCP documentation files"},
'files': 'MCP/*.md', "modes": {"files": "MODE_*.md", "description": "superclaude operational modes"},
'description': 'MCP documentation files'
},
'modes': {
'files': 'MODE_*.md',
'description': 'SuperClaude operational modes'
}
} }
if component in component_paths: 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 # Get actual file count from metadata if available
component_metadata = info["components"].get(component, {}) component_metadata = info["components"].get(component, {})
if isinstance(component_metadata, dict): if isinstance(component_metadata, dict):
if 'files_count' in component_metadata: if "files_count" in component_metadata:
details['file_count'] = component_metadata['files_count'] details["file_count"] = component_metadata["files_count"]
elif 'agents_count' in component_metadata: elif "agents_count" in component_metadata:
details['file_count'] = component_metadata['agents_count'] details["file_count"] = component_metadata["agents_count"]
elif 'servers_configured' in component_metadata: elif "servers_configured" in component_metadata:
details['file_count'] = component_metadata['servers_configured'] details["file_count"] = component_metadata["servers_configured"]
return details 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""" """Display detailed uninstall plan"""
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Uninstall Plan{Colors.RESET}") print(f"\n{Colors.CYAN}{Colors.BRIGHT}Uninstall Plan{Colors.RESET}")
print("=" * 60) print("=" * 60)
@ -547,11 +611,19 @@ def display_uninstall_plan(components: List[str], args: argparse.Namespace, info
version = info["components"].get(component_name, "unknown") version = info["components"].get(component_name, "unknown")
if isinstance(version, dict): if isinstance(version, dict):
version_str = version.get('version', 'unknown') version_str = version.get("version", "unknown")
file_count = details.get('file_count', version.get('files_count', version.get('agents_count', version.get('servers_configured', '?')))) file_count = details.get(
"file_count",
version.get(
"files_count",
version.get(
"agents_count", version.get("servers_configured", "?")
),
),
)
else: else:
version_str = str(version) 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" {i}. {component_name} (v{version_str}) - {file_count} files")
print(f" {details['description']}") print(f" {details['description']}")
@ -559,14 +631,22 @@ def display_uninstall_plan(components: List[str], args: argparse.Namespace, info
if isinstance(file_count, int): if isinstance(file_count, int):
total_files += file_count 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 # 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 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}+ 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 # Show additional preserved items
preserved = [] preserved = []
@ -582,19 +662,25 @@ def display_uninstall_plan(components: List[str], args: argparse.Namespace, info
print(f"{Colors.GREEN}+ {item}{Colors.RESET}") print(f"{Colors.GREEN}+ {item}{Colors.RESET}")
if args.complete: 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 # Environment variable cleanup information
if env_vars: if env_vars:
print(f"\n{Colors.BLUE}Environment Variables:{Colors.RESET}") print(f"\n{Colors.BLUE}Environment Variables:{Colors.RESET}")
if args.cleanup_env: 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(): for env_var in env_vars.keys():
print(f" - {env_var}") print(f" - {env_var}")
if not args.no_restore_script: if not args.no_restore_script:
print(f"{Colors.GREEN} + Restore script will be created{Colors.RESET}") print(f"{Colors.GREEN} + Restore script will be created{Colors.RESET}")
else: 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(): for env_var in env_vars.keys():
print(f" + {env_var}") print(f" + {env_var}")
@ -607,6 +693,7 @@ def create_uninstall_backup(install_dir: Path, components: List[str]) -> Optiona
try: try:
from datetime import datetime from datetime import datetime
backup_dir = install_dir / "backups" backup_dir = install_dir / "backups"
backup_dir.mkdir(exist_ok=True) backup_dir.mkdir(exist_ok=True)
@ -633,7 +720,12 @@ def create_uninstall_backup(install_dir: Path, components: List[str]) -> Optiona
return None 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""" """Perform the actual uninstall"""
logger = get_logger() logger = get_logger()
start_time = time.time() start_time = time.time()
@ -644,13 +736,13 @@ def perform_uninstall(components: List[str], args: argparse.Namespace, info: Dic
registry.discover_components() registry.discover_components()
# Create component instances # 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 # Setup progress tracking
progress = ProgressBar( progress = ProgressBar(
total=len(components), total=len(components), prefix="Uninstalling: ", suffix=""
prefix="Uninstalling: ",
suffix=""
) )
# Uninstall components # Uninstall components
@ -692,7 +784,9 @@ def perform_uninstall(components: List[str], args: argparse.Namespace, info: Dic
if args.cleanup_env and env_vars: if args.cleanup_env and env_vars:
logger.info("Cleaning up environment variables...") logger.info("Cleaning up environment variables...")
create_restore_script = not args.no_restore_script 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: if env_cleanup_success:
logger.success(f"Removed {len(env_vars)} environment variables") 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 duration = time.time() - start_time
if failed_components: 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)}") logger.warning(f"Failed components: {', '.join(failed_components)}")
else: else:
logger.success(f"Uninstall completed successfully in {duration:.1f} seconds") logger.success(
f"Uninstall completed successfully in {duration:.1f} seconds"
)
if uninstalled_components: if uninstalled_components:
logger.info(f"Uninstalled components: {', '.join(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): if file_manager.remove_directory(install_dir):
logger.info(f"Removed installation directory: {install_dir}") logger.info(f"Removed installation directory: {install_dir}")
else: else:
logger.warning(f"Could not remove installation directory: {install_dir}") logger.warning(
f"Could not remove installation directory: {install_dir}"
)
else: else:
# Selective removal # Selective removal
for item in install_dir.iterdir(): for item in install_dir.iterdir():
@ -787,9 +887,10 @@ def run(args: argparse.Namespace) -> int:
# Display header # Display header
if not args.quiet: if not args.quiet:
from setup.cli.base import __version__ from setup.cli.base import __version__
display_header( display_header(
f"SuperClaude Uninstall v{__version__}", f"SuperClaude Uninstall v{__version__}",
"Removing SuperClaude framework components" "Removing SuperClaude framework components",
) )
# Get installation information # Get installation information
@ -800,7 +901,11 @@ def run(args: argparse.Namespace) -> int:
display_uninstall_info(info) display_uninstall_info(info)
# Check for environment variables # 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 # Check if SuperClaude is installed
if not info["exists"]: if not info["exists"]:
@ -812,9 +917,9 @@ def run(args: argparse.Namespace) -> int:
# Non-interactive mode - use existing logic # Non-interactive mode - use existing logic
components = get_components_to_uninstall(args, info["components"]) components = get_components_to_uninstall(args, info["components"])
cleanup_options = { cleanup_options = {
'remove_mcp_configs': 'mcp' in (components or []), "remove_mcp_configs": "mcp" in (components or []),
'cleanup_env_vars': args.cleanup_env, "cleanup_env_vars": args.cleanup_env,
'create_restore_script': not args.no_restore_script "create_restore_script": not args.no_restore_script,
} }
if components is None: if components is None:
logger.info("Uninstall cancelled by user") logger.info("Uninstall cancelled by user")
@ -835,8 +940,10 @@ def run(args: argparse.Namespace) -> int:
components, cleanup_options = result components, cleanup_options = result
# Override command-line args with interactive choices # Override command-line args with interactive choices
args.cleanup_env = cleanup_options.get('cleanup_env_vars', False) args.cleanup_env = cleanup_options.get("cleanup_env_vars", False)
args.no_restore_script = not cleanup_options.get('create_restore_script', True) args.no_restore_script = not cleanup_options.get(
"create_restore_script", True
)
# Display uninstall plan # Display uninstall plan
if not args.quiet: if not args.quiet:
@ -845,9 +952,11 @@ def run(args: argparse.Namespace) -> int:
# Confirmation # Confirmation
if not args.no_confirm and not args.yes: if not args.no_confirm and not args.yes:
if args.complete: if args.complete:
warning_msg = "This will completely remove SuperClaude. Continue?" warning_msg = "This will completely remove superclaude. Continue?"
else: 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): if not confirm(warning_msg, default=False):
logger.info("Uninstall cancelled by user") 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"\n{Colors.CYAN}Uninstall complete:{Colors.RESET}")
print(f"SuperClaude has been removed from {args.install_dir}") print(f"SuperClaude has been removed from {args.install_dir}")
if not args.complete: if not args.complete:
print(f"You can reinstall anytime using 'SuperClaude install'") print(f"You can reinstall anytime using 'superclaude install'")
return 0 return 0
else: 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 return 1
except KeyboardInterrupt: except KeyboardInterrupt:

View File

@ -15,8 +15,17 @@ from ...core.registry import ComponentRegistry
from ...services.settings import SettingsService from ...services.settings import SettingsService
from ...core.validator import Validator from ...core.validator import Validator
from ...utils.ui import ( from ...utils.ui import (
display_header, display_info, display_success, display_error, display_header,
display_warning, Menu, confirm, ProgressBar, Colors, format_size, prompt_api_key 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.environment import setup_environment_variables
from ...utils.logger import get_logger from ...utils.logger import get_logger
@ -47,51 +56,44 @@ Examples:
SuperClaude update --backup --force # Create backup before update (forced) SuperClaude update --backup --force # Create backup before update (forced)
""", """,
formatter_class=argparse.RawDescriptionHelpFormatter, formatter_class=argparse.RawDescriptionHelpFormatter,
parents=parents parents=parents,
) )
# Update mode options # Update mode options
parser.add_argument( parser.add_argument(
"--check", "--check",
action="store_true", action="store_true",
help="Check for available updates without installing" help="Check for available updates without installing",
) )
parser.add_argument( parser.add_argument(
"--components", "--components", type=str, nargs="+", help="Specific components to update"
type=str,
nargs="+",
help="Specific components to update"
) )
# Backup options # Backup options
parser.add_argument( parser.add_argument(
"--backup", "--backup", action="store_true", help="Create backup before update"
action="store_true",
help="Create backup before update"
) )
parser.add_argument( parser.add_argument("--no-backup", action="store_true", help="Skip backup creation")
"--no-backup",
action="store_true",
help="Skip backup creation"
)
# Update options # Update options
parser.add_argument( parser.add_argument(
"--reinstall", "--reinstall",
action="store_true", action="store_true",
help="Reinstall components even if versions match" help="Reinstall components even if versions match",
) )
return parser return parser
def check_installation_exists(install_dir: Path) -> bool: def check_installation_exists(install_dir: Path) -> bool:
"""Check if SuperClaude installation exists""" """Check if SuperClaude installation exists"""
settings_manager = SettingsService(install_dir) settings_manager = SettingsService(install_dir)
return settings_manager.check_installation_exists() return settings_manager.check_installation_exists()
def get_installed_components(install_dir: Path) -> Dict[str, Dict[str, Any]]: def get_installed_components(install_dir: Path) -> Dict[str, Dict[str, Any]]:
"""Get currently installed components and their versions""" """Get currently installed components and their versions"""
try: try:
@ -101,7 +103,9 @@ def get_installed_components(install_dir: Path) -> Dict[str, Dict[str, Any]]:
return {} 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""" """Check for available updates"""
updates = {} updates = {}
@ -114,7 +118,7 @@ def get_available_updates(installed_components: Dict[str, str], registry: Compon
updates[component_name] = { updates[component_name] = {
"current": current_version, "current": current_version,
"available": available_version, "available": available_version,
"description": metadata.get("description", "No description") "description": metadata.get("description", "No description"),
} }
except Exception: except Exception:
continue continue
@ -122,7 +126,9 @@ def get_available_updates(installed_components: Dict[str, str], registry: Compon
return updates 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""" """Display update check results"""
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Update Check Results{Colors.RESET}") print(f"\n{Colors.CYAN}{Colors.BRIGHT}Update Check Results{Colors.RESET}")
print("=" * 50) print("=" * 50)
@ -146,15 +152,20 @@ def display_update_check(installed_components: Dict[str, str], available_updates
print() print()
def get_components_to_update(args: argparse.Namespace, installed_components: Dict[str, str], def get_components_to_update(
available_updates: Dict[str, Dict[str, str]]) -> Optional[List[str]]: args: argparse.Namespace,
installed_components: Dict[str, str],
available_updates: Dict[str, Dict[str, str]],
) -> Optional[List[str]]:
"""Determine which components to update""" """Determine which components to update"""
logger = get_logger() logger = get_logger()
# Explicit components specified # Explicit components specified
if args.components: if args.components:
# Validate that specified components are installed # 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: if invalid_components:
logger.error(f"Components not installed: {invalid_components}") logger.error(f"Components not installed: {invalid_components}")
return None return None
@ -175,7 +186,9 @@ def get_components_to_update(args: argparse.Namespace, installed_components: Dic
return [] 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 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 = [ servers_needing_keys = [
(server_key, mcp_instance.mcp_servers[server_key]) (server_key, mcp_instance.mcp_servers[server_key])
for server_key in selected_servers for server_key in selected_servers
if server_key in mcp_instance.mcp_servers and if server_key in mcp_instance.mcp_servers
mcp_instance.mcp_servers[server_key].get("requires_api_key", False) and mcp_instance.mcp_servers[server_key].get("requires_api_key", False)
] ]
if not servers_needing_keys: 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 # Display API key configuration header
print(f"\n{Colors.CYAN}{Colors.BRIGHT}=== API Key Configuration ==={Colors.RESET}") 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 = {} collected_keys = {}
for server_key, server_info in servers_needing_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 return collected_keys
def interactive_update_selection(available_updates: Dict[str, Dict[str, str]], def interactive_update_selection(
installed_components: Dict[str, str]) -> Optional[List[str]]: available_updates: Dict[str, Dict[str, str]], installed_components: Dict[str, str]
) -> Optional[List[str]]:
"""Interactive update selection""" """Interactive update selection"""
if not available_updates: if not available_updates:
return [] return []
@ -234,7 +250,7 @@ def interactive_update_selection(available_updates: Dict[str, Dict[str, str]],
preset_options = [ preset_options = [
"Update All Components", "Update All Components",
"Select Individual Components", "Select Individual Components",
"Cancel Update" "Cancel Update",
] ]
menu = Menu("Select update option:", preset_options) 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 elif choice == 0: # Update all
return component_names return component_names
elif choice == 1: # Select individual 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() selections = component_menu.display()
if not selections: if not selections:
@ -256,8 +274,12 @@ def interactive_update_selection(available_updates: Dict[str, Dict[str, str]],
return None return None
def display_update_plan(components: List[str], available_updates: Dict[str, Dict[str, str]], def display_update_plan(
installed_components: Dict[str, str], install_dir: Path) -> None: components: List[str],
available_updates: Dict[str, Dict[str, str]],
installed_components: Dict[str, str],
install_dir: Path,
) -> None:
"""Display update plan""" """Display update plan"""
print(f"\n{Colors.CYAN}{Colors.BRIGHT}Update Plan{Colors.RESET}") print(f"\n{Colors.CYAN}{Colors.BRIGHT}Update Plan{Colors.RESET}")
print("=" * 50) print("=" * 50)
@ -276,7 +298,9 @@ def display_update_plan(components: List[str], available_updates: Dict[str, Dict
print() 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""" """Perform the actual update"""
logger = get_logger() logger = get_logger()
start_time = time.time() 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) installer = Installer(args.install_dir, dry_run=args.dry_run)
# Create component instances # 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: if not component_instances:
logger.error("No valid component instances created") 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 = {} collected_api_keys = {}
if "mcp" in components and "mcp" in component_instances: if "mcp" in components and "mcp" in component_instances:
mcp_instance = component_instances["mcp"] mcp_instance = component_instances["mcp"]
if hasattr(mcp_instance, 'mcp_servers'): if hasattr(mcp_instance, "mcp_servers"):
# Get all available MCP servers # Get all available MCP servers
all_server_keys = list(mcp_instance.mcp_servers.keys()) all_server_keys = list(mcp_instance.mcp_servers.keys())
# Collect API keys for any servers that require them # 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 # Set up environment variables if any keys were collected
if collected_api_keys: 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 # Store keys for MCP component to use during update
mcp_instance.collected_api_keys = collected_api_keys 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 # Register components with installer
installer.register_components(list(component_instances.values())) installer.register_components(list(component_instances.values()))
# Setup progress tracking # Setup progress tracking
progress = ProgressBar( progress = ProgressBar(total=len(components), prefix="Updating: ", suffix="")
total=len(components),
prefix="Updating: ",
suffix=""
)
# Update components # Update components
logger.info(f"Updating {len(components)} 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, "backup": backup,
"dry_run": args.dry_run, "dry_run": args.dry_run,
"update_mode": True, "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) success = installer.update_components(components, config)
@ -356,17 +386,17 @@ def perform_update(components: List[str], args: argparse.Namespace, registry: Co
# Show summary # Show summary
summary = installer.get_update_summary() summary = installer.get_update_summary()
if summary.get('updated'): if summary.get("updated"):
logger.info(f"Updated components: {', '.join(summary['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']}") logger.info(f"Backup created: {summary['backup_path']}")
else: else:
logger.error(f"Update completed with errors in {duration:.1f} seconds") logger.error(f"Update completed with errors in {duration:.1f} seconds")
summary = installer.get_update_summary() summary = installer.get_update_summary()
if summary.get('failed'): if summary.get("failed"):
logger.error(f"Failed components: {', '.join(summary['failed'])}") logger.error(f"Failed components: {', '.join(summary['failed'])}")
return success return success
@ -406,13 +436,13 @@ def run(args: argparse.Namespace) -> int:
if not args.quiet: if not args.quiet:
display_header( display_header(
f"SuperClaude Update v{__version__}", f"SuperClaude Update v{__version__}",
"Updating SuperClaude framework components" "Updating SuperClaude framework components",
) )
# Check if SuperClaude is installed # Check if SuperClaude is installed
if not check_installation_exists(args.install_dir): if not check_installation_exists(args.install_dir):
logger.error(f"SuperClaude installation not found in {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 return 1
# Create component registry # Create component registry
@ -439,7 +469,9 @@ def run(args: argparse.Namespace) -> int:
return 0 return 0
# Get components to update # 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: if components is None:
logger.info("Update cancelled by user") logger.info("Update cancelled by user")
return 0 return 0
@ -449,7 +481,9 @@ def run(args: argparse.Namespace) -> int:
# Display update plan # Display update plan
if not args.quiet: 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.dry_run:
if not args.yes and not confirm("Proceed with update?", default=True): if not args.yes and not confirm("Proceed with update?", default=True):

View File

@ -8,10 +8,10 @@ from .modes import ModesComponent
from .mcp_docs import MCPDocsComponent from .mcp_docs import MCPDocsComponent
__all__ = [ __all__ = [
'CoreComponent', "CoreComponent",
'CommandsComponent', "CommandsComponent",
'MCPComponent', "MCPComponent",
'AgentsComponent', "AgentsComponent",
'ModesComponent', "ModesComponent",
'MCPDocsComponent' "MCPDocsComponent",
] ]

View File

@ -22,7 +22,7 @@ class AgentsComponent(Component):
"name": "agents", "name": "agents",
"version": __version__, "version": __version__,
"description": "15 specialized AI agents with domain expertise and intelligent routing", "description": "15 specialized AI agents with domain expertise and intelligent routing",
"category": "agents" "category": "agents",
} }
def get_metadata_modifications(self) -> Dict[str, Any]: def get_metadata_modifications(self) -> Dict[str, Any]:
@ -33,7 +33,7 @@ class AgentsComponent(Component):
"version": __version__, "version": __version__,
"installed": True, "installed": True,
"agents_count": len(self.component_files), "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() success = self._post_install()
if success: 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 return success
@ -63,12 +65,15 @@ class AgentsComponent(Component):
self.logger.info("Updated metadata with agents configuration") self.logger.info("Updated metadata with agents configuration")
# Add component registration # Add component registration
self.settings_manager.add_component_registration("agents", { self.settings_manager.add_component_registration(
"version": __version__, "agents",
"category": "agents", {
"agents_count": len(self.component_files), "version": __version__,
"agents_list": self.component_files "category": "agents",
}) "agents_count": len(self.component_files),
"agents_list": self.component_files,
},
)
self.logger.info("Registered agents component in metadata") self.logger.info("Registered agents component in metadata")
return True return True
@ -94,7 +99,9 @@ class AgentsComponent(Component):
# Remove agents directory if empty # Remove agents directory if empty
try: 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.install_component_subdir.rmdir()
self.logger.debug("Removed empty agents directory") self.logger.debug("Removed empty agents directory")
except Exception as e: except Exception as e:
@ -108,7 +115,9 @@ class AgentsComponent(Component):
except Exception as e: except Exception as e:
self.logger.warning(f"Could not update metadata: {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 return True
except Exception as e: except Exception as e:
@ -129,10 +138,14 @@ class AgentsComponent(Component):
target_version = self.get_metadata()["version"] target_version = self.get_metadata()["version"]
if current_version == target_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 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 # Create backup of existing agents
backup_files = [] backup_files = []
@ -146,14 +159,19 @@ class AgentsComponent(Component):
# Perform installation (will overwrite existing files) # Perform installation (will overwrite existing files)
if self._install(config): 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 return True
else: else:
# Restore backups on failure # Restore backups on failure
self.logger.error("Agents update failed, restoring backups...") self.logger.error("Agents update failed, restoring backups...")
for backup_path in backup_files: for backup_path in backup_files:
try: 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.file_manager.copy_file(backup_path, original_path)
self.logger.debug(f"Restored {original_path.name}") self.logger.debug(f"Restored {original_path.name}")
except Exception as e: except Exception as e:
@ -166,10 +184,10 @@ class AgentsComponent(Component):
def _get_source_dir(self) -> Path: def _get_source_dir(self) -> Path:
"""Get source directory for agent files""" """Get source directory for agent files"""
# Assume we're in SuperClaude/setup/components/agents.py # Assume we're in superclaude/setup/components/agents.py
# and agent files are in SuperClaude/SuperClaude/Agents/ # and agent files are in superclaude/superclaude/Agents/
project_root = Path(__file__).parent.parent.parent project_root = Path(__file__).parent.parent.parent
return project_root / "SuperClaude" / "Agents" return project_root / "superclaude" / "agents"
def get_size_estimate(self) -> int: def get_size_estimate(self) -> int:
"""Get estimated installation size""" """Get estimated installation size"""
@ -195,7 +213,7 @@ class AgentsComponent(Component):
"agent_files": self.component_files, "agent_files": self.component_files,
"estimated_size": self.get_size_estimate(), "estimated_size": self.get_size_estimate(),
"install_directory": str(self.install_component_subdir), "install_directory": str(self.install_component_subdir),
"dependencies": self.get_dependencies() "dependencies": self.get_dependencies(),
} }
def validate_installation(self) -> Tuple[bool, List[str]]: def validate_installation(self) -> Tuple[bool, List[str]]:
@ -204,7 +222,9 @@ class AgentsComponent(Component):
# Check if agents directory exists # Check if agents directory exists
if not self.install_component_subdir.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 return False, errors
# Check if all agent files exist # Check if all agent files exist
@ -226,7 +246,7 @@ class AgentsComponent(Component):
"system-architect.md", "system-architect.md",
"frontend-architect.md", "frontend-architect.md",
"backend-architect.md", "backend-architect.md",
"security-engineer.md" "security-engineer.md",
] ]
missing_core_agents = [] missing_core_agents = []

View File

@ -8,6 +8,7 @@ from pathlib import Path
from ..core.base import Component from ..core.base import Component
from setup import __version__ from setup import __version__
class CommandsComponent(Component): class CommandsComponent(Component):
"""SuperClaude slash commands component""" """SuperClaude slash commands component"""
@ -21,7 +22,7 @@ class CommandsComponent(Component):
"name": "commands", "name": "commands",
"version": __version__, "version": __version__,
"description": "SuperClaude slash command definitions", "description": "SuperClaude slash command definitions",
"category": "commands" "category": "commands",
} }
def get_metadata_modifications(self) -> Dict[str, Any]: def get_metadata_modifications(self) -> Dict[str, Any]:
@ -31,14 +32,10 @@ class CommandsComponent(Component):
"commands": { "commands": {
"version": __version__, "version": __version__,
"installed": True, "installed": True,
"files_count": len(self.component_files) "files_count": len(self.component_files),
} }
}, },
"commands": { "commands": {"enabled": True, "version": __version__, "auto_update": False},
"enabled": True,
"version": __version__,
"auto_update": False
}
} }
def _install(self, config: Dict[str, Any]) -> bool: def _install(self, config: Dict[str, Any]) -> bool:
@ -48,7 +45,7 @@ class CommandsComponent(Component):
# Check for and migrate existing commands from old location # Check for and migrate existing commands from old location
self._migrate_existing_commands() self._migrate_existing_commands()
return super()._install(config); return super()._install(config)
def _post_install(self) -> bool: def _post_install(self) -> bool:
# Update metadata # Update metadata
@ -58,11 +55,14 @@ class CommandsComponent(Component):
self.logger.info("Updated metadata with commands configuration") self.logger.info("Updated metadata with commands configuration")
# Add component registration to metadata # Add component registration to metadata
self.settings_manager.add_component_registration("commands", { self.settings_manager.add_component_registration(
"version": __version__, "commands",
"category": "commands", {
"files_count": len(self.component_files) "version": __version__,
}) "category": "commands",
"files_count": len(self.component_files),
},
)
self.logger.info("Updated metadata with commands component registration") self.logger.info("Updated metadata with commands component registration")
except Exception as e: except Exception as e:
self.logger.error(f"Failed to update metadata: {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}") self.logger.warning(f"Could not remove old {filename}")
if old_removed_count > 0: 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 removed_count += old_removed_count
@ -119,7 +121,9 @@ class CommandsComponent(Component):
remaining_files = list(parent_commands_dir.iterdir()) remaining_files = list(parent_commands_dir.iterdir())
if not remaining_files: if not remaining_files:
parent_commands_dir.rmdir() parent_commands_dir.rmdir()
self.logger.debug("Removed empty parent commands directory") self.logger.debug(
"Removed empty parent commands directory"
)
except Exception as e: except Exception as e:
self.logger.warning(f"Could not remove commands directory: {e}") self.logger.warning(f"Could not remove commands directory: {e}")
@ -136,11 +140,15 @@ class CommandsComponent(Component):
except Exception as e: except Exception as e:
self.logger.warning(f"Could not update metadata: {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 return True
except Exception as e: 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 return False
def get_dependencies(self) -> List[str]: def get_dependencies(self) -> List[str]:
@ -157,10 +165,14 @@ class CommandsComponent(Component):
target_version = self.get_metadata()["version"] target_version = self.get_metadata()["version"]
if current_version == target_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 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 # Create backup of existing command files
commands_dir = self.install_dir / "commands" / "sc" commands_dir = self.install_dir / "commands" / "sc"
@ -186,13 +198,15 @@ class CommandsComponent(Component):
except Exception: except Exception:
pass # Ignore cleanup errors 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: else:
# Restore from backup on failure # Restore from backup on failure
self.logger.warning("Update failed, restoring from backup...") self.logger.warning("Update failed, restoring from backup...")
for backup_path in backup_files: for backup_path in backup_files:
try: try:
original_path = backup_path.with_suffix('') original_path = backup_path.with_suffix("")
backup_path.rename(original_path) backup_path.rename(original_path)
self.logger.debug(f"Restored {original_path.name}") self.logger.debug(f"Restored {original_path.name}")
except Exception as e: except Exception as e:
@ -230,16 +244,18 @@ class CommandsComponent(Component):
installed_version = self.settings_manager.get_component_version("commands") installed_version = self.settings_manager.get_component_version("commands")
expected_version = self.get_metadata()["version"] expected_version = self.get_metadata()["version"]
if installed_version != expected_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 return len(errors) == 0, errors
def _get_source_dir(self) -> Path: def _get_source_dir(self) -> Path:
"""Get source directory for command files""" """Get source directory for command files"""
# Assume we're in SuperClaude/setup/components/commands.py # Assume we're in superclaude/setup/components/commands.py
# and command files are in SuperClaude/SuperClaude/Commands/ # and command files are in superclaude/superclaude/Commands/
project_root = Path(__file__).parent.parent.parent project_root = Path(__file__).parent.parent.parent
return project_root / "SuperClaude" / "Commands" return project_root / "superclaude" / "commands"
def get_size_estimate(self) -> int: def get_size_estimate(self) -> int:
"""Get estimated installation size""" """Get estimated installation size"""
@ -265,7 +281,7 @@ class CommandsComponent(Component):
"command_files": self.component_files, "command_files": self.component_files,
"estimated_size": self.get_size_estimate(), "estimated_size": self.get_size_estimate(),
"install_directory": str(self.install_dir / "commands" / "sc"), "install_directory": str(self.install_dir / "commands" / "sc"),
"dependencies": self.get_dependencies() "dependencies": self.get_dependencies(),
} }
def _migrate_existing_commands(self) -> None: def _migrate_existing_commands(self) -> None:
@ -285,11 +301,15 @@ class CommandsComponent(Component):
commands_to_migrate.append(filename) commands_to_migrate.append(filename)
if commands_to_migrate: 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 # Ensure new directory exists
if not self.file_manager.ensure_directory(new_commands_dir): 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 return
# Move files from old to new location # Move files from old to new location
@ -303,28 +323,42 @@ class CommandsComponent(Component):
# Remove old file # Remove old file
if self.file_manager.remove_file(old_file_path): if self.file_manager.remove_file(old_file_path):
migrated_count += 1 migrated_count += 1
self.logger.debug(f"Migrated {filename} to sc/ subdirectory") self.logger.debug(
f"Migrated {filename} to sc/ subdirectory"
)
else: else:
self.logger.warning(f"Could not remove old {filename}") self.logger.warning(f"Could not remove old {filename}")
else: 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: except Exception as e:
self.logger.warning(f"Error migrating {filename}: {e}") self.logger.warning(f"Error migrating {filename}: {e}")
if migrated_count > 0: if migrated_count > 0:
self.logger.success(f"Successfully migrated {migrated_count} commands to /sc: namespace") self.logger.success(
self.logger.info("Commands are now available as /sc:analyze, /sc:build, etc.") 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 to remove old commands directory if empty
try: try:
if old_commands_dir.exists(): 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: if not remaining_files:
# Only remove if no user files remain # Only remove if no user files remain
old_commands_dir.rmdir() old_commands_dir.rmdir()
self.logger.debug("Removed empty old commands directory") self.logger.debug(
"Removed empty old commands directory"
)
except Exception as e: 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: except Exception as e:
self.logger.warning(f"Error during command migration: {e}") self.logger.warning(f"Error during command migration: {e}")

View File

@ -10,6 +10,7 @@ from ..core.base import Component
from ..services.claude_md import CLAUDEMdService from ..services.claude_md import CLAUDEMdService
from setup import __version__ from setup import __version__
class CoreComponent(Component): class CoreComponent(Component):
"""Core SuperClaude framework files component""" """Core SuperClaude framework files component"""
@ -23,7 +24,7 @@ class CoreComponent(Component):
"name": "core", "name": "core",
"version": __version__, "version": __version__,
"description": "SuperClaude framework documentation and core files", "description": "SuperClaude framework documentation and core files",
"category": "core" "category": "core",
} }
def get_metadata_modifications(self) -> Dict[str, Any]: def get_metadata_modifications(self) -> Dict[str, Any]:
@ -31,24 +32,24 @@ class CoreComponent(Component):
return { return {
"framework": { "framework": {
"version": __version__, "version": __version__,
"name": "SuperClaude", "name": "superclaude",
"description": "AI-enhanced development framework for Claude Code", "description": "AI-enhanced development framework for Claude Code",
"installation_type": "global", "installation_type": "global",
"components": ["core"] "components": ["core"],
}, },
"superclaude": { "superclaude": {
"enabled": True, "enabled": True,
"version": __version__, "version": __version__,
"profile": "default", "profile": "default",
"auto_update": False "auto_update": False,
} },
} }
def _install(self, config: Dict[str, Any]) -> bool: def _install(self, config: Dict[str, Any]) -> bool:
"""Install core component""" """Install core component"""
self.logger.info("Installing SuperClaude core framework files...") self.logger.info("Installing SuperClaude core framework files...")
return super()._install(config); return super()._install(config)
def _post_install(self) -> bool: def _post_install(self) -> bool:
# Create or update metadata # Create or update metadata
@ -58,17 +59,22 @@ class CoreComponent(Component):
self.logger.info("Updated metadata with framework configuration") self.logger.info("Updated metadata with framework configuration")
# Add component registration to metadata # Add component registration to metadata
self.settings_manager.add_component_registration("core", { self.settings_manager.add_component_registration(
"version": __version__, "core",
"category": "core", {
"files_count": len(self.component_files) "version": __version__,
}) "category": "core",
"files_count": len(self.component_files),
},
)
self.logger.info("Updated metadata with core component registration") self.logger.info("Updated metadata with core component registration")
# Migrate any existing SuperClaude data from settings.json # Migrate any existing SuperClaude data from settings.json
if self.settings_manager.migrate_superclaude_data(): 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: except Exception as e:
self.logger.error(f"Failed to update metadata: {e}") self.logger.error(f"Failed to update metadata: {e}")
return False return False
@ -86,12 +92,13 @@ class CoreComponent(Component):
manager.add_imports(self.component_files, category="Core Framework") manager.add_imports(self.component_files, category="Core Framework")
self.logger.info("Updated CLAUDE.md with core framework imports") self.logger.info("Updated CLAUDE.md with core framework imports")
except Exception as e: 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 # Don't fail the whole installation for this
return True return True
def uninstall(self) -> bool: def uninstall(self) -> bool:
"""Uninstall core component""" """Uninstall core component"""
try: try:
@ -122,7 +129,9 @@ class CoreComponent(Component):
except Exception as e: except Exception as e:
self.logger.warning(f"Could not update metadata: {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 return True
except Exception as e: except Exception as e:
@ -146,7 +155,9 @@ class CoreComponent(Component):
self.logger.info(f"Core component already at version {target_version}") self.logger.info(f"Core component already at version {target_version}")
return True 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 # Create backup of existing files
backup_files = [] backup_files = []
@ -169,13 +180,15 @@ class CoreComponent(Component):
except Exception: except Exception:
pass # Ignore cleanup errors 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: else:
# Restore from backup on failure # Restore from backup on failure
self.logger.warning("Update failed, restoring from backup...") self.logger.warning("Update failed, restoring from backup...")
for backup_path in backup_files: for backup_path in backup_files:
try: try:
original_path = backup_path.with_suffix('') original_path = backup_path.with_suffix("")
shutil.move(str(backup_path), str(original_path)) shutil.move(str(backup_path), str(original_path))
self.logger.debug(f"Restored {original_path.name}") self.logger.debug(f"Restored {original_path.name}")
except Exception as e: except Exception as e:
@ -207,7 +220,9 @@ class CoreComponent(Component):
installed_version = self.settings_manager.get_component_version("core") installed_version = self.settings_manager.get_component_version("core")
expected_version = self.get_metadata()["version"] expected_version = self.get_metadata()["version"]
if installed_version != expected_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 # Check metadata structure
try: try:
@ -226,10 +241,10 @@ class CoreComponent(Component):
def _get_source_dir(self): def _get_source_dir(self):
"""Get source directory for framework files""" """Get source directory for framework files"""
# Assume we're in SuperClaude/setup/components/core.py # Assume we're in superclaude/setup/components/core.py
# and framework files are in SuperClaude/SuperClaude/Core/ # and framework files are in superclaude/superclaude/Core/
project_root = Path(__file__).parent.parent.parent project_root = Path(__file__).parent.parent.parent
return project_root / "SuperClaude" / "Core" return project_root / "superclaude" / "core"
def get_size_estimate(self) -> int: def get_size_estimate(self) -> int:
"""Get estimated installation size""" """Get estimated installation size"""
@ -255,5 +270,5 @@ class CoreComponent(Component):
"framework_files": self.component_files, "framework_files": self.component_files,
"estimated_size": self.get_size_estimate(), "estimated_size": self.get_size_estimate(),
"install_directory": str(self.install_dir), "install_directory": str(self.install_dir),
"dependencies": self.get_dependencies() "dependencies": self.get_dependencies(),
} }

View File

@ -30,13 +30,13 @@ class MCPComponent(Component):
"name": "sequential-thinking", "name": "sequential-thinking",
"description": "Multi-step problem solving and systematic analysis", "description": "Multi-step problem solving and systematic analysis",
"npm_package": "@modelcontextprotocol/server-sequential-thinking", "npm_package": "@modelcontextprotocol/server-sequential-thinking",
"required": True "required": True,
}, },
"context7": { "context7": {
"name": "context7", "name": "context7",
"description": "Official library documentation and code examples", "description": "Official library documentation and code examples",
"npm_package": "@upstash/context7-mcp", "npm_package": "@upstash/context7-mcp",
"required": True "required": True,
}, },
"magic": { "magic": {
"name": "magic", "name": "magic",
@ -44,21 +44,21 @@ class MCPComponent(Component):
"npm_package": "@21st-dev/magic", "npm_package": "@21st-dev/magic",
"required": False, "required": False,
"api_key_env": "TWENTYFIRST_API_KEY", "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": { "playwright": {
"name": "playwright", "name": "playwright",
"description": "Cross-browser E2E testing and automation", "description": "Cross-browser E2E testing and automation",
"npm_package": "@playwright/mcp@latest", "npm_package": "@playwright/mcp@latest",
"required": False "required": False,
}, },
"serena": { "serena": {
"name": "serena", "name": "serena",
"description": "Semantic code analysis and intelligent editing", "description": "Semantic code analysis and intelligent editing",
"install_method": "github", "install_method": "github",
"install_command": "uvx --from git+https://github.com/oraios/serena serena --help", "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", "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 "required": False,
}, },
"morphllm-fast-apply": { "morphllm-fast-apply": {
"name": "morphllm-fast-apply", "name": "morphllm-fast-apply",
@ -66,7 +66,7 @@ class MCPComponent(Component):
"npm_package": "@morph-llm/morph-fast-apply", "npm_package": "@morph-llm/morph-fast-apply",
"required": False, "required": False,
"api_key_env": "MORPH_API_KEY", "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": { "tavily": {
"name": "tavily", "name": "tavily",
@ -75,15 +75,23 @@ class MCPComponent(Component):
"install_command": "npx -y tavily-mcp@0.1.2", "install_command": "npx -y tavily-mcp@0.1.2",
"required": False, "required": False,
"api_key_env": "TAVILY_API_KEY", "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": { "chrome-devtools": {
"name": "chrome-devtools", "name": "chrome-devtools",
"description": "Chrome DevTools debugging and performance analysis", "description": "Chrome DevTools debugging and performance analysis",
"install_method": "npm", "install_method": "npm",
"install_command": "npx -y chrome-devtools-mcp@latest", "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]: def get_metadata(self) -> Dict[str, str]:
@ -92,14 +100,16 @@ class MCPComponent(Component):
"name": "mcp", "name": "mcp",
"version": __version__, "version": __version__,
"description": "MCP server integration (Context7, Sequential, Magic, Playwright)", "description": "MCP server integration (Context7, Sequential, Magic, Playwright)",
"category": "integration" "category": "integration",
} }
def is_reinstallable(self) -> bool: def is_reinstallable(self) -> bool:
"""This component manages sub-components (servers) and should be re-run.""" """This component manages sub-components (servers) and should be re-run."""
return True 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. 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) cmd_str = " ".join(shlex.quote(str(arg)) for arg in cmd)
# Use the user's shell to execute the command, supporting aliases # Use the user's shell to execute the command, supporting aliases
user_shell = os.environ.get('SHELL', '/bin/bash') user_shell = os.environ.get("SHELL", "/bin/bash")
return subprocess.run(cmd_str, shell=True, env=os.environ, executable=user_shell, **kwargs) 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""" """Check prerequisites"""
errors = [] errors = []
# Check if Node.js is available # Check if Node.js is available
try: try:
result = self._run_command_cross_platform( result = self._run_command_cross_platform(
["node", "--version"], ["node", "--version"], capture_output=True, text=True, timeout=10
capture_output=True,
text=True,
timeout=10
) )
if result.returncode != 0: if result.returncode != 0:
errors.append("Node.js not found - required for MCP servers") errors.append("Node.js not found - required for MCP servers")
@ -142,9 +153,11 @@ class MCPComponent(Component):
# Check version (require 18+) # Check version (require 18+)
try: try:
version_num = int(version.lstrip('v').split('.')[0]) version_num = int(version.lstrip("v").split(".")[0])
if version_num < 18: 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: except:
self.logger.warning(f"Could not parse Node.js version: {version}") self.logger.warning(f"Could not parse Node.js version: {version}")
except (subprocess.TimeoutExpired, FileNotFoundError): except (subprocess.TimeoutExpired, FileNotFoundError):
@ -153,13 +166,12 @@ class MCPComponent(Component):
# Check if Claude CLI is available # Check if Claude CLI is available
try: try:
result = self._run_command_cross_platform( result = self._run_command_cross_platform(
["claude", "--version"], ["claude", "--version"], capture_output=True, text=True, timeout=10
capture_output=True,
text=True,
timeout=10
) )
if result.returncode != 0: 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: else:
version = result.stdout.strip() version = result.stdout.strip()
self.logger.debug(f"Found Claude CLI {version}") self.logger.debug(f"Found Claude CLI {version}")
@ -169,10 +181,7 @@ class MCPComponent(Component):
# Check if npm is available # Check if npm is available
try: try:
result = self._run_command_cross_platform( result = self._run_command_cross_platform(
["npm", "--version"], ["npm", "--version"], capture_output=True, text=True, timeout=10
capture_output=True,
text=True,
timeout=10
) )
if result.returncode != 0: if result.returncode != 0:
errors.append("npm not found - required for MCP server installation") 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) # Check if uv is available (required for Serena)
try: try:
result = self._run_command_cross_platform( result = self._run_command_cross_platform(
["uv", "--version"], ["uv", "--version"], capture_output=True, text=True, timeout=10
capture_output=True,
text=True,
timeout=10
) )
if result.returncode != 0: 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: else:
version = result.stdout.strip() version = result.stdout.strip()
self.logger.debug(f"Found uv {version}") self.logger.debug(f"Found uv {version}")
except (subprocess.TimeoutExpired, FileNotFoundError): 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 return len(errors) == 0, errors
@ -211,24 +221,28 @@ class MCPComponent(Component):
"mcp": { "mcp": {
"version": __version__, "version": __version__,
"installed": True, "installed": True,
"servers_count": len(self.installed_servers_in_session) "servers_count": len(self.installed_servers_in_session),
} }
}, },
"mcp": { "mcp": {
"enabled": True, "enabled": True,
"servers": self.installed_servers_in_session, "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""" """Install a single MCP server using uv"""
server_name = server_info["name"] server_name = server_info["name"]
install_command = server_info.get("install_command") install_command = server_info.get("install_command")
run_command = server_info.get("run_command") run_command = server_info.get("run_command")
if not install_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 return False
if not run_command: if not run_command:
self.logger.error(f"No run_command found for uv-based server {server_name}") 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 # Check if uv is available
try: try:
uv_check = self._run_command_cross_platform( uv_check = self._run_command_cross_platform(
["uv", "--version"], ["uv", "--version"], capture_output=True, text=True, timeout=10
capture_output=True,
text=True,
timeout=10
) )
if uv_check.returncode != 0: 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 return False
except (subprocess.TimeoutExpired, FileNotFoundError): 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 return False
if config.get("dry_run"): if config.get("dry_run"):
self.logger.info(f"Would install MCP server (user scope): {install_command}") self.logger.info(
self.logger.info(f"Would register MCP server run command: {run_command}") f"Would install MCP server (user scope): {install_command}"
)
self.logger.info(
f"Would register MCP server run command: {run_command}"
)
return True return True
# Run install command # Run install command
self.logger.debug(f"Running: {install_command}") self.logger.debug(f"Running: {install_command}")
cmd_parts = shlex.split(install_command) cmd_parts = shlex.split(install_command)
result = self._run_command_cross_platform( result = self._run_command_cross_platform(
cmd_parts, cmd_parts, capture_output=True, text=True, timeout=900 # 15 minutes
capture_output=True,
text=True,
timeout=900 # 15 minutes
) )
if result.returncode == 0: 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 # For Serena, we need to handle the run command specially
if server_name == "serena": if server_name == "serena":
# Serena needs project-specific registration, use current working directory # Serena needs project-specific registration, use current working directory
current_dir = os.getcwd() current_dir = os.getcwd()
serena_run_cmd = f"{run_command} --project {shlex.quote(current_dir)}" serena_run_cmd = (
self.logger.info(f"Registering {server_name} with Claude CLI for project: {current_dir}") f"{run_command} --project {shlex.quote(current_dir)}"
reg_cmd = ["claude", "mcp", "add", "-s", "user", "--", server_name] + shlex.split(serena_run_cmd) )
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: else:
self.logger.info(f"Registering {server_name} with Claude CLI. Run command: {run_command}") self.logger.info(
reg_cmd = ["claude", "mcp", "add", "-s", "user", "--", server_name] + shlex.split(run_command) 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_result = self._run_command_cross_platform(
reg_cmd, reg_cmd, capture_output=True, text=True, timeout=120
capture_output=True,
text=True,
timeout=120
) )
if reg_result.returncode == 0: 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 return True
else: else:
error_msg = reg_result.stderr.strip() if reg_result.stderr else "Unknown error" error_msg = (
self.logger.error(f"Failed to register MCP server {server_name} with Claude CLI: {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 return False
else: else:
error_msg = result.stderr.strip() if result.stderr else "Unknown error" 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 return False
except subprocess.TimeoutExpired: except subprocess.TimeoutExpired:
self.logger.error(f"Timeout installing MCP server {server_name} using uv") self.logger.error(f"Timeout installing MCP server {server_name} using uv")
return False return False
except Exception as e: 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 return False
def _install_github_mcp_server(
def _install_github_mcp_server(self, server_info: Dict[str, Any], config: Dict[str, Any]) -> bool: self, server_info: Dict[str, Any], config: Dict[str, Any]
) -> bool:
"""Install a single MCP server from GitHub using uvx""" """Install a single MCP server from GitHub using uvx"""
server_name = server_info["name"] server_name = server_info["name"]
install_command = server_info.get("install_command") install_command = server_info.get("install_command")
run_command = server_info.get("run_command") run_command = server_info.get("run_command")
if not install_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 return False
if not run_command: 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 return False
try: try:
@ -335,21 +389,26 @@ class MCPComponent(Component):
# Check if uvx is available # Check if uvx is available
try: try:
uvx_check = self._run_command_cross_platform( uvx_check = self._run_command_cross_platform(
["uvx", "--version"], ["uvx", "--version"], capture_output=True, text=True, timeout=10
capture_output=True,
text=True,
timeout=10
) )
if uvx_check.returncode != 0: 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 return False
except (subprocess.TimeoutExpired, FileNotFoundError): 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 return False
if config.get("dry_run"): if config.get("dry_run"):
self.logger.info(f"Would install MCP server from GitHub: {install_command}") self.logger.info(
self.logger.info(f"Would register MCP server run command: {run_command}") f"Would install MCP server from GitHub: {install_command}"
)
self.logger.info(
f"Would register MCP server run command: {run_command}"
)
return True return True
# Run install command to test the GitHub installation # Run install command to test the GitHub installation
@ -359,50 +418,70 @@ class MCPComponent(Component):
cmd_parts, cmd_parts,
capture_output=True, capture_output=True,
text=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: 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 # Register with Claude CLI using the run command
self.logger.info(f"Registering {server_name} with Claude CLI. Run command: {run_command}") self.logger.info(
reg_cmd = ["claude", "mcp", "add", "-s", "user", "--", server_name] + shlex.split(run_command) 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_result = self._run_command_cross_platform(
reg_cmd, reg_cmd, capture_output=True, text=True, timeout=120
capture_output=True,
text=True,
timeout=120
) )
if reg_result.returncode == 0: 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 return True
else: else:
error_msg = reg_result.stderr.strip() if reg_result.stderr else "Unknown error" error_msg = (
self.logger.error(f"Failed to register MCP server {server_name} with Claude CLI: {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 return False
else: else:
error_msg = result.stderr.strip() if result.stderr else "Unknown error" 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 return False
except subprocess.TimeoutExpired: 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 return False
except Exception as e: 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 return False
def _check_mcp_server_installed(self, server_name: str) -> bool: def _check_mcp_server_installed(self, server_name: str) -> bool:
"""Check if MCP server is already installed""" """Check if MCP server is already installed"""
try: try:
result = self._run_command_cross_platform( result = self._run_command_cross_platform(
["claude", "mcp", "list"], ["claude", "mcp", "list"], capture_output=True, text=True, timeout=60
capture_output=True,
text=True,
timeout=60
) )
if result.returncode != 0: if result.returncode != 0:
@ -427,8 +506,16 @@ class MCPComponent(Component):
self.install_dir / "claude_desktop_config.json", self.install_dir / "claude_desktop_config.json",
Path.home() / ".claude" / "claude_desktop_config.json", Path.home() / ".claude" / "claude_desktop_config.json",
Path.home() / ".claude.json", # Claude CLI config Path.home() / ".claude.json", # Claude CLI config
Path.home() / "AppData" / "Roaming" / "Claude" / "claude_desktop_config.json", # Windows Path.home()
Path.home() / "Library" / "Application Support" / "Claude" / "claude_desktop_config.json", # macOS / "AppData"
/ "Roaming"
/ "Claude"
/ "claude_desktop_config.json", # Windows
Path.home()
/ "Library"
/ "Application Support"
/ "Claude"
/ "claude_desktop_config.json", # macOS
] ]
config_file = None config_file = None
@ -442,7 +529,8 @@ class MCPComponent(Component):
return detected_servers return detected_servers
import json import json
with open(config_file, 'r') as f:
with open(config_file, "r") as f:
config = json.load(f) config = json.load(f)
# Extract MCP server names from mcpServers section # Extract MCP server names from mcpServers section
@ -454,7 +542,9 @@ class MCPComponent(Component):
detected_servers.append(normalized_name) detected_servers.append(normalized_name)
if detected_servers: 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: except Exception as e:
self.logger.warning(f"Could not read Claude Desktop config: {e}") self.logger.warning(f"Could not read Claude Desktop config: {e}")
@ -467,10 +557,7 @@ class MCPComponent(Component):
try: try:
result = self._run_command_cross_platform( result = self._run_command_cross_platform(
["claude", "mcp", "list"], ["claude", "mcp", "list"], capture_output=True, text=True, timeout=60
capture_output=True,
text=True,
timeout=60
) )
if result.returncode != 0: if result.returncode != 0:
@ -478,10 +565,10 @@ class MCPComponent(Component):
return detected_servers return detected_servers
# Parse the output to extract server names # 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: for line in output_lines:
line = line.strip().lower() 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) # Extract server name (usually the first word or before first space/colon)
server_name = line.split()[0] if line.split() else "" server_name = line.split()[0] if line.split() else ""
normalized_name = self._normalize_server_name(server_name) normalized_name = self._normalize_server_name(server_name)
@ -489,7 +576,9 @@ class MCPComponent(Component):
detected_servers.append(normalized_name) detected_servers.append(normalized_name)
if detected_servers: 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: except Exception as e:
self.logger.warning(f"Could not detect existing MCP servers from CLI: {e}") self.logger.warning(f"Could not detect existing MCP servers from CLI: {e}")
@ -513,12 +602,17 @@ class MCPComponent(Component):
"serena": "serena", "serena": "serena",
"morphllm": "morphllm-fast-apply", "morphllm": "morphllm-fast-apply",
"morphllm-fast-apply": "morphllm-fast-apply", "morphllm-fast-apply": "morphllm-fast-apply",
"morph": "morphllm-fast-apply" "morph": "morphllm-fast-apply",
} }
return name_mappings.get(server_name) 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""" """Merge existing, selected, and previously installed servers"""
all_servers = set() all_servers = set()
@ -541,7 +635,9 @@ class MCPComponent(Component):
return valid_servers 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""" """Install a single MCP server"""
if server_info.get("install_method") == "uv": if server_info.get("install_method") == "uv":
return self._install_uv_mcp_server(server_info, config) return self._install_uv_mcp_server(server_info, config)
@ -553,7 +649,9 @@ class MCPComponent(Component):
install_command = server_info.get("install_command") install_command = server_info.get("install_command")
if not npm_package and not 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 return False
command = "npx" command = "npx"
@ -569,7 +667,9 @@ class MCPComponent(Component):
# Handle API key requirements # Handle API key requirements
if "api_key_env" in server_info: if "api_key_env" in server_info:
api_key_env = server_info["api_key_env"] 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): if not config.get("dry_run", False):
display_info(f"MCP server '{server_name}' requires an API key") 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 # Check if API key is already set
import os import os
if not os.getenv(api_key_env): if not os.getenv(api_key_env):
display_warning(f"API key {api_key_env} not found in environment") display_warning(
self.logger.warning(f"Proceeding without {api_key_env} - server may not function properly") 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 # Install using Claude CLI
if install_command: if install_command:
# Use the full install command (e.g., for tavily-mcp@0.1.2) # Use the full install command (e.g., for tavily-mcp@0.1.2)
install_args = install_command.split() install_args = install_command.split()
if config.get("dry_run"): 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 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( 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, capture_output=True,
text=True, text=True,
timeout=120 # 2 minutes timeout for installation timeout=120, # 2 minutes timeout for installation
) )
else: else:
# Use npm_package # Use npm_package
if config.get("dry_run"): 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 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( 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, capture_output=True,
text=True, text=True,
timeout=120 # 2 minutes timeout for installation timeout=120, # 2 minutes timeout for installation
) )
if result.returncode == 0: 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 return True
else: else:
error_msg = result.stderr.strip() if result.stderr else "Unknown error" 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 return False
except subprocess.TimeoutExpired: except subprocess.TimeoutExpired:
@ -638,21 +767,27 @@ class MCPComponent(Component):
self.logger.info(f"MCP server {server_name} not installed") self.logger.info(f"MCP server {server_name} not installed")
return True 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( result = self._run_command_cross_platform(
["claude", "mcp", "remove", server_name], ["claude", "mcp", "remove", server_name],
capture_output=True, capture_output=True,
text=True, text=True,
timeout=60 timeout=60,
) )
if result.returncode == 0: 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 return True
else: else:
error_msg = result.stderr.strip() if result.stderr else "Unknown error" 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 return False
except subprocess.TimeoutExpired: except subprocess.TimeoutExpired:
@ -686,10 +821,14 @@ class MCPComponent(Component):
previous_servers = self.settings_manager.get_metadata_setting("mcp.servers", []) previous_servers = self.settings_manager.get_metadata_setting("mcp.servers", [])
# Merge all server lists # 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: 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 # Still run post-install to update metadata
return self._post_install() return self._post_install()
@ -706,7 +845,9 @@ class MCPComponent(Component):
# Check if already installed and working # Check if already installed and working
if self._check_mcp_server_installed(server_name): 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 installed_count += 1
verified_servers.append(server_name) verified_servers.append(server_name)
else: else:
@ -719,10 +860,14 @@ class MCPComponent(Component):
# Check if this is a required server # Check if this is a required server
if server_info.get("required", False): 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 return False
else: 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 # Update the list of successfully managed servers
self.installed_servers_in_session = verified_servers self.installed_servers_in_session = verified_servers
@ -735,12 +880,12 @@ class MCPComponent(Component):
["claude", "mcp", "list"], ["claude", "mcp", "list"],
capture_output=True, capture_output=True,
text=True, text=True,
timeout=60 timeout=60,
) )
if result.returncode == 0: if result.returncode == 0:
self.logger.debug("MCP servers list:") 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(): if line.strip():
self.logger.debug(f" {line.strip()}") self.logger.debug(f" {line.strip()}")
else: else:
@ -751,9 +896,13 @@ class MCPComponent(Component):
if failed_servers: if failed_servers:
self.logger.warning(f"Some MCP servers failed to install: {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: 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() return self._post_install()
@ -765,12 +914,15 @@ class MCPComponent(Component):
self.settings_manager.update_metadata(metadata_mods) self.settings_manager.update_metadata(metadata_mods)
# Add component registration to metadata # Add component registration to metadata
self.settings_manager.add_component_registration("mcp", { self.settings_manager.add_component_registration(
"version": __version__, "mcp",
"category": "integration", {
"servers_count": len(self.installed_servers_in_session), "version": __version__,
"installed_servers": self.installed_servers_in_session "category": "integration",
}) "servers_count": len(self.installed_servers_in_session),
"installed_servers": self.installed_servers_in_session,
},
)
self.logger.info("Updated metadata with MCP component registration") self.logger.info("Updated metadata with MCP component registration")
return True return True
@ -803,7 +955,9 @@ class MCPComponent(Component):
except Exception as e: except Exception as e:
self.logger.warning(f"Could not update metadata: {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 return True
except Exception as e: except Exception as e:
@ -827,7 +981,9 @@ class MCPComponent(Component):
self.logger.info(f"MCP component already at version {target_version}") self.logger.info(f"MCP component already at version {target_version}")
return True 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 # For MCP servers, update means reinstall to get latest versions
updated_count = 0 updated_count = 0
@ -855,7 +1011,9 @@ class MCPComponent(Component):
metadata = self.settings_manager.load_metadata() metadata = self.settings_manager.load_metadata()
if "components" in metadata and "mcp" in metadata["components"]: if "components" in metadata and "mcp" in metadata["components"]:
metadata["components"]["mcp"]["version"] = target_version 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: if "mcp" in metadata:
metadata["mcp"]["servers"] = list(self.mcp_servers.keys()) metadata["mcp"]["servers"] = list(self.mcp_servers.keys())
self.settings_manager.save_metadata(metadata) self.settings_manager.save_metadata(metadata)
@ -863,10 +1021,14 @@ class MCPComponent(Component):
self.logger.warning(f"Could not update metadata: {e}") self.logger.warning(f"Could not update metadata: {e}")
if failed_servers: 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 return False
else: 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 return True
except Exception as e: except Exception as e:
@ -886,28 +1048,33 @@ class MCPComponent(Component):
installed_version = self.settings_manager.get_component_version("mcp") installed_version = self.settings_manager.get_component_version("mcp")
expected_version = self.get_metadata()["version"] expected_version = self.get_metadata()["version"]
if installed_version != expected_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 # Check if Claude CLI is available and validate installed servers
try: try:
result = self._run_command_cross_platform( result = self._run_command_cross_platform(
["claude", "mcp", "list"], ["claude", "mcp", "list"], capture_output=True, text=True, timeout=60
capture_output=True,
text=True,
timeout=60
) )
if result.returncode != 0: 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: else:
claude_mcp_output = result.stdout.lower() claude_mcp_output = result.stdout.lower()
# Get the list of servers that should be installed from metadata # 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: for server_name in installed_servers:
if server_name.lower() not in claude_mcp_output: 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: except Exception as e:
errors.append(f"Could not verify MCP server installation: {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()), "mcp_servers": list(self.mcp_servers.keys()),
"estimated_size": self.get_size_estimate(), "estimated_size": self.get_size_estimate(),
"dependencies": self.get_dependencies(), "dependencies": self.get_dependencies(),
"required_tools": ["node", "npm", "claude"] "required_tools": ["node", "npm", "claude"],
} }

View File

@ -29,7 +29,7 @@ class MCPDocsComponent(Component):
"serena": "MCP_Serena.md", "serena": "MCP_Serena.md",
"morphllm": "MCP_Morphllm.md", "morphllm": "MCP_Morphllm.md",
"morphllm-fast-apply": "MCP_Morphllm.md", # Handle both naming conventions "morphllm-fast-apply": "MCP_Morphllm.md", # Handle both naming conventions
"tavily": "MCP_Tavily.md" "tavily": "MCP_Tavily.md",
} }
super().__init__(install_dir, Path("")) super().__init__(install_dir, Path(""))
@ -40,7 +40,7 @@ class MCPDocsComponent(Component):
"name": "mcp_docs", "name": "mcp_docs",
"version": __version__, "version": __version__,
"description": "MCP server documentation and usage guides", "description": "MCP server documentation and usage guides",
"category": "documentation" "category": "documentation",
} }
def is_reinstallable(self) -> bool: def is_reinstallable(self) -> bool:
@ -73,9 +73,13 @@ class MCPDocsComponent(Component):
target = self.install_dir / doc_file target = self.install_dir / doc_file
if source.exists(): if source.exists():
files.append((source, target)) 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: 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 return files
@ -101,8 +105,16 @@ class MCPDocsComponent(Component):
self.install_dir / "claude_desktop_config.json", self.install_dir / "claude_desktop_config.json",
Path.home() / ".claude" / "claude_desktop_config.json", Path.home() / ".claude" / "claude_desktop_config.json",
Path.home() / ".claude.json", # Claude CLI config Path.home() / ".claude.json", # Claude CLI config
Path.home() / "AppData" / "Roaming" / "Claude" / "claude_desktop_config.json", # Windows Path.home()
Path.home() / "Library" / "Application Support" / "Claude" / "claude_desktop_config.json", # macOS / "AppData"
/ "Roaming"
/ "Claude"
/ "claude_desktop_config.json", # Windows
Path.home()
/ "Library"
/ "Application Support"
/ "Claude"
/ "claude_desktop_config.json", # macOS
] ]
config_file = None config_file = None
@ -116,7 +128,8 @@ class MCPDocsComponent(Component):
return detected_servers return detected_servers
import json import json
with open(config_file, 'r') as f:
with open(config_file, "r") as f:
config = json.load(f) config = json.load(f)
# Extract MCP server names from mcpServers section # Extract MCP server names from mcpServers section
@ -128,7 +141,9 @@ class MCPDocsComponent(Component):
detected_servers.append(normalized_name) detected_servers.append(normalized_name)
if detected_servers: 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: except Exception as e:
self.logger.warning(f"Could not read Claude Desktop config: {e}") self.logger.warning(f"Could not read Claude Desktop config: {e}")
@ -152,7 +167,7 @@ class MCPDocsComponent(Component):
"serena": "serena", "serena": "serena",
"morphllm": "morphllm", "morphllm": "morphllm",
"morphllm-fast-apply": "morphllm", "morphllm-fast-apply": "morphllm",
"morph": "morphllm" "morph": "morphllm",
} }
return name_mappings.get(server_name) return name_mappings.get(server_name)
@ -169,7 +184,9 @@ class MCPDocsComponent(Component):
selected_servers = config.get("selected_mcp_servers", []) selected_servers = config.get("selected_mcp_servers", [])
# Get previously documented servers from metadata # 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 # Merge all server lists
all_servers = list(set(detected_servers + selected_servers + previous_servers)) 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] valid_servers = [s for s in all_servers if s in self.server_docs_map]
if not valid_servers: 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 # Still proceed to update metadata
self.set_selected_servers([]) self.set_selected_servers([])
self.component_files = [] self.component_files = []
return self._post_install() 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: if detected_servers:
self.logger.info(f" - Detected from config: {detected_servers}") self.logger.info(f" - Detected from config: {detected_servers}")
if selected_servers: if selected_servers:
@ -225,12 +246,16 @@ class MCPDocsComponent(Component):
self.logger.error(f"Failed to copy {source.name}") self.logger.error(f"Failed to copy {source.name}")
if success_count != len(files_to_install): 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 return False
# Update component_files to only include successfully copied files # Update component_files to only include successfully copied files
self.component_files = 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() return self._post_install()
@ -244,7 +269,7 @@ class MCPDocsComponent(Component):
"version": __version__, "version": __version__,
"installed": True, "installed": True,
"files_count": len(self.component_files), "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") manager.add_imports(self.component_files, category="MCP Documentation")
self.logger.info("Updated CLAUDE.md with MCP documentation imports") self.logger.info("Updated CLAUDE.md with MCP documentation imports")
except Exception as e: 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 # Don't fail the whole installation for this
return True return True
@ -300,11 +327,15 @@ class MCPDocsComponent(Component):
except Exception as e: except Exception as e:
self.logger.warning(f"Could not update settings.json: {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 return True
except Exception as e: 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 return False
def get_dependencies(self) -> List[str]: def get_dependencies(self) -> List[str]:
@ -313,10 +344,10 @@ class MCPDocsComponent(Component):
def _get_source_dir(self) -> Optional[Path]: def _get_source_dir(self) -> Optional[Path]:
"""Get source directory for MCP documentation files""" """Get source directory for MCP documentation files"""
# Assume we're in SuperClaude/setup/components/mcp_docs.py # Assume we're in superclaude/setup/components/mcp_docs.py
# and MCP docs are in SuperClaude/SuperClaude/MCP/ # and MCP docs are in superclaude/superclaude/MCP/
project_root = Path(__file__).parent.parent.parent 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 # Return None if directory doesn't exist to prevent warning
if not mcp_dir.exists(): if not mcp_dir.exists():

View File

@ -23,7 +23,7 @@ class ModesComponent(Component):
"name": "modes", "name": "modes",
"version": __version__, "version": __version__,
"description": "7 behavioral modes for enhanced Claude Code operation", "description": "7 behavioral modes for enhanced Claude Code operation",
"category": "modes" "category": "modes",
} }
def _install(self, config: Dict[str, Any]) -> bool: def _install(self, config: Dict[str, Any]) -> bool:
@ -56,10 +56,14 @@ class ModesComponent(Component):
self.logger.error(f"Failed to copy {source.name}") self.logger.error(f"Failed to copy {source.name}")
if success_count != len(files_to_install): 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 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() return self._post_install()
@ -72,7 +76,7 @@ class ModesComponent(Component):
"modes": { "modes": {
"version": __version__, "version": __version__,
"installed": True, "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") manager.add_imports(self.component_files, category="Behavioral Modes")
self.logger.info("Updated CLAUDE.md with mode imports") self.logger.info("Updated CLAUDE.md with mode imports")
except Exception as e: 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 # Don't fail the whole installation for this
return True return True
@ -123,7 +129,9 @@ class ModesComponent(Component):
except Exception as e: except Exception as e:
self.logger.warning(f"Could not update settings.json: {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 return True
except Exception as e: except Exception as e:
@ -136,10 +144,10 @@ class ModesComponent(Component):
def _get_source_dir(self) -> Optional[Path]: def _get_source_dir(self) -> Optional[Path]:
"""Get source directory for mode files""" """Get source directory for mode files"""
# Assume we're in SuperClaude/setup/components/modes.py # Assume we're in superclaude/setup/components/modes.py
# and mode files are in SuperClaude/SuperClaude/Modes/ # and mode files are in superclaude/superclaude/Modes/
project_root = Path(__file__).parent.parent.parent 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 # Return None if directory doesn't exist to prevent warning
if not modes_dir.exists(): if not modes_dir.exists():

View File

@ -3,7 +3,4 @@
from .validator import Validator from .validator import Validator
from .registry import ComponentRegistry from .registry import ComponentRegistry
__all__ = [ __all__ = ["Validator", "ComponentRegistry"]
'Validator',
'ComponentRegistry'
]

View File

@ -15,7 +15,9 @@ from ..utils.security import SecurityValidator
class Component(ABC): class Component(ABC):
"""Base class for all installable components""" """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 Initialize component with installation directory
@ -23,6 +25,7 @@ class Component(ABC):
install_dir: Target installation directory (defaults to ~/.claude) install_dir: Target installation directory (defaults to ~/.claude)
""" """
from .. import DEFAULT_INSTALL_DIR from .. import DEFAULT_INSTALL_DIR
# Initialize logger first # Initialize logger first
self.logger = get_logger() self.logger = get_logger()
# Resolve path safely # Resolve path safely
@ -53,7 +56,9 @@ class Component(ABC):
""" """
return False 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 Check prerequisites for this component
@ -80,13 +85,15 @@ class Component(ABC):
# Check write permissions to install directory # Check write permissions to install directory
has_perms, missing = SecurityValidator.check_permissions( has_perms, missing = SecurityValidator.check_permissions(
self.install_dir, {'write'} self.install_dir, {"write"}
) )
if not has_perms: if not has_perms:
errors.append(f"No write permissions to {self.install_dir}: {missing}") errors.append(f"No write permissions to {self.install_dir}: {missing}")
# Validate installation target # 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: if not is_safe:
errors.extend(validation_errors) errors.extend(validation_errors)
@ -101,7 +108,9 @@ class Component(ABC):
errors.extend(security_errors) errors.extend(security_errors)
if not self.file_manager.ensure_directory(self.install_component_subdir): 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 return len(errors) == 0, errors
@ -138,7 +147,9 @@ class Component(ABC):
try: try:
return self._install(config) return self._install(config)
except Exception as e: 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 return False
@abstractmethod @abstractmethod
@ -174,19 +185,21 @@ class Component(ABC):
self.logger.error(f"Failed to copy {source.name}") self.logger.error(f"Failed to copy {source.name}")
if success_count != len(files_to_install): 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 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() return self._post_install()
@abstractmethod @abstractmethod
def _post_install(self) -> bool: def _post_install(self) -> bool:
pass pass
@abstractmethod @abstractmethod
def uninstall(self) -> bool: def uninstall(self) -> bool:
""" """
@ -239,10 +252,14 @@ class Component(ABC):
if metadata_file.exists(): if metadata_file.exists():
self.logger.debug("Metadata file exists, reading version") self.logger.debug("Metadata file exists, reading version")
try: try:
with open(metadata_file, 'r') as f: with open(metadata_file, "r") as f:
metadata = json.load(f) metadata = json.load(f)
component_name = self.get_metadata()['name'] component_name = self.get_metadata()["name"]
version = metadata.get('components', {}).get(component_name, {}).get('version') version = (
metadata.get("components", {})
.get(component_name, {})
.get("version")
)
self.logger.debug(f"Found version: {version}") self.logger.debug(f"Found version: {version}")
return version return version
except Exception as e: except Exception as e:
@ -293,7 +310,9 @@ class Component(ABC):
if source.is_file(): if source.is_file():
total_size += source.stat().st_size total_size += source.stat().st_size
elif source.is_dir(): 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 return total_size
def _discover_component_files(self) -> List[str]: def _discover_component_files(self) -> List[str]:
@ -310,12 +329,16 @@ class Component(ABC):
return self._discover_files_in_directory( return self._discover_files_in_directory(
source_dir, source_dir,
extension='.md', extension=".md",
exclude_patterns=['README.md', 'CHANGELOG.md', 'LICENSE.md'] exclude_patterns=["README.md", "CHANGELOG.md", "LICENSE.md"],
) )
def _discover_files_in_directory(self, directory: Path, extension: str = '.md', def _discover_files_in_directory(
exclude_patterns: Optional[List[str]] = None) -> List[str]: self,
directory: Path,
extension: str = ".md",
exclude_patterns: Optional[List[str]] = None,
) -> List[str]:
""" """
Shared utility for discovering files in a directory Shared utility for discovering files in a directory
@ -342,15 +365,19 @@ class Component(ABC):
# Discover files with the specified extension # Discover files with the specified extension
files = [] files = []
for file_path in directory.iterdir(): for file_path in directory.iterdir():
if (file_path.is_file() and if (
file_path.suffix.lower() == extension.lower() and file_path.is_file()
file_path.name not in exclude_patterns): and file_path.suffix.lower() == extension.lower()
and file_path.name not in exclude_patterns
):
files.append(file_path.name) files.append(file_path.name)
# Sort for consistent ordering # Sort for consistent ordering
files.sort() 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: if files:
self.logger.debug(f"Files found: {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) # Check for most dangerous system patterns (but allow /tmp for testing)
dangerous_patterns = [ dangerous_patterns = [
'/etc/', '/bin/', '/sbin/', '/usr/bin/', '/usr/sbin/', "/etc/",
'/var/log/', '/var/lib/', '/dev/', '/proc/', '/sys/', "/bin/",
'c:\\windows\\', 'c:\\program files\\' "/sbin/",
"/usr/bin/",
"/usr/sbin/",
"/var/log/",
"/var/lib/",
"/dev/",
"/proc/",
"/sys/",
"c:\\windows\\",
"c:\\program files\\",
] ]
# Allow temporary directories for testing # 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}") self.logger.debug(f"Allowing temporary directory: {resolved_path}")
return resolved_path return resolved_path

View File

@ -14,9 +14,7 @@ from ..utils.logger import get_logger
class Installer: class Installer:
"""Main installer orchestrator""" """Main installer orchestrator"""
def __init__(self, def __init__(self, install_dir: Optional[Path] = None, dry_run: bool = False):
install_dir: Optional[Path] = None,
dry_run: bool = False):
""" """
Initialize installer Initialize installer
@ -25,12 +23,16 @@ class Installer:
dry_run: If True, only simulate installation dry_run: If True, only simulate installation
""" """
from .. import DEFAULT_INSTALL_DIR from .. import DEFAULT_INSTALL_DIR
self.install_dir = install_dir or DEFAULT_INSTALL_DIR self.install_dir = install_dir or DEFAULT_INSTALL_DIR
self.dry_run = dry_run self.dry_run = dry_run
self.components: Dict[str, Component] = {} self.components: Dict[str, Component] = {}
from ..services.settings import SettingsService from ..services.settings import SettingsService
settings_manager = SettingsService(self.install_dir) 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.updated_components: Set[str] = set()
self.failed_components: Set[str] = set() self.failed_components: Set[str] = set()
@ -46,7 +48,7 @@ class Installer:
component: Component instance to register component: Component instance to register
""" """
metadata = component.get_metadata() metadata = component.get_metadata()
self.components[metadata['name']] = component self.components[metadata["name"]] = component
def register_components(self, components: List[Component]) -> None: def register_components(self, components: List[Component]) -> None:
""" """
@ -79,8 +81,7 @@ class Installer:
return return
if name in resolving: if name in resolving:
raise ValueError( raise ValueError(f"Circular dependency detected involving {name}")
f"Circular dependency detected involving {name}")
if name not in self.components: if name not in self.components:
raise ValueError(f"Unknown component: {name}") 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 # Always create an archive, even if empty, to ensure it's a valid tarball
base_path = backup_dir / backup_name 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()): if not any(temp_backup.iterdir()):
self.logger.warning( self.logger.warning(
@ -184,8 +185,7 @@ class Installer:
self.backup_path = backup_path self.backup_path = backup_path
return backup_path return backup_path
def install_component(self, component_name: str, def install_component(self, component_name: str, config: Dict[str, Any]) -> bool:
config: Dict[str, Any]) -> bool:
""" """
Install a single component Install a single component
@ -202,7 +202,11 @@ class Installer:
component = self.components[component_name] component = self.components[component_name]
# Skip if already installed and not in update mode, unless component is reinstallable # 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.skipped_components.add(component_name)
self.logger.info(f"Skipping already installed component: {component_name}") self.logger.info(f"Skipping already installed component: {component_name}")
return True return True
@ -237,9 +241,9 @@ class Installer:
self.failed_components.add(component_name) self.failed_components.add(component_name)
return False return False
def install_components(self, def install_components(
component_names: List[str], self, component_names: List[str], config: Optional[Dict[str, Any]] = None
config: Optional[Dict[str, Any]] = None) -> bool: ) -> bool:
""" """
Install multiple components in dependency order Install multiple components in dependency order
@ -296,7 +300,9 @@ class Installer:
all_valid = True all_valid = True
for name in self.updated_components: for name in self.updated_components:
if name not in self.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 continue
component = self.components[name] component = self.components[name]
@ -315,12 +321,13 @@ class Installer:
else: else:
self.logger.error("Some components failed validation. Check errors above.") 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)""" """Alias for update operation (uses install logic)"""
config["update_mode"] = True config["update_mode"] = True
return self.install_components(component_names, config) return self.install_components(component_names, config)
def get_installation_summary(self) -> Dict[str, Any]: def get_installation_summary(self) -> Dict[str, Any]:
""" """
Get summary of installation results Get summary of installation results
@ -329,17 +336,17 @@ class Installer:
Dict with installation statistics and results Dict with installation statistics and results
""" """
return { return {
'installed': list(self.installed_components), "installed": list(self.installed_components),
'failed': list(self.failed_components), "failed": list(self.failed_components),
'skipped': list(self.skipped_components), "skipped": list(self.skipped_components),
'backup_path': str(self.backup_path) if self.backup_path else None, "backup_path": str(self.backup_path) if self.backup_path else None,
'install_dir': str(self.install_dir), "install_dir": str(self.install_dir),
'dry_run': self.dry_run "dry_run": self.dry_run,
} }
def get_update_summary(self) -> Dict[str, Any]: def get_update_summary(self) -> Dict[str, Any]:
return { return {
'updated': list(self.updated_components), "updated": list(self.updated_components),
'failed': list(self.failed_components), "failed": list(self.failed_components),
'backup_path': str(self.backup_path) if self.backup_path else None "backup_path": str(self.backup_path) if self.backup_path else None,
} }

View File

@ -46,6 +46,7 @@ class ComponentRegistry:
# Add components directory to Python path temporarily # Add components directory to Python path temporarily
import sys import sys
original_path = sys.path.copy() original_path = sys.path.copy()
try: try:
@ -84,9 +85,11 @@ class ComponentRegistry:
# Find all Component subclasses in the module # Find all Component subclasses in the module
for name, obj in inspect.getmembers(module): for name, obj in inspect.getmembers(module):
if (inspect.isclass(obj) and if (
issubclass(obj, Component) and inspect.isclass(obj)
obj is not Component): and issubclass(obj, Component)
and obj is not Component
):
# Create instance to get metadata # Create instance to get metadata
try: try:
@ -98,7 +101,9 @@ class ComponentRegistry:
self.component_instances[component_name] = instance self.component_instances[component_name] = instance
except Exception as e: 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: except Exception as e:
self.logger.warning(f"Could not load component module {module_name}: {e}") self.logger.warning(f"Could not load component module {module_name}: {e}")
@ -126,7 +131,9 @@ class ComponentRegistry:
self.discover_components() self.discover_components()
return self.component_classes.get(component_name) 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 Get component instance by name
@ -146,7 +153,9 @@ class ComponentRegistry:
try: try:
return component_class(install_dir) return component_class(install_dir)
except Exception as e: 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 None
return self.component_instances.get(component_name) return self.component_instances.get(component_name)
@ -270,7 +279,9 @@ class ComponentRegistry:
for name, deps in self.dependency_graph.items(): for name, deps in self.dependency_graph.items():
missing_deps = deps - all_components missing_deps = deps - all_components
if missing_deps: 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 # Check for circular dependencies
for name in all_components: for name in all_components:
@ -336,14 +347,18 @@ class ComponentRegistry:
if not current_level: if not current_level:
# This shouldn't happen if dependency graph is valid # 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) levels.append(current_level)
remaining -= set(current_level) remaining -= set(current_level)
return levels 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 Create instances for multiple components
@ -392,6 +407,8 @@ class ComponentRegistry:
return { return {
"total_components": len(self.component_classes), "total_components": len(self.component_classes),
"categories": categories, "categories": categories,
"dependency_graph": {name: list(deps) for name, deps in self.dependency_graph.items()}, "dependency_graph": {
"validation_errors": self.validate_dependency_graph() name: list(deps) for name, deps in self.dependency_graph.items()
},
"validation_errors": self.validate_dependency_graph(),
} }

View File

@ -13,6 +13,7 @@ from ..utils.paths import get_home_directory
# Handle packaging import - if not available, use a simple version comparison # Handle packaging import - if not available, use a simple version comparison
try: try:
from packaging import version from packaging import version
PACKAGING_AVAILABLE = True PACKAGING_AVAILABLE = True
except ImportError: except ImportError:
PACKAGING_AVAILABLE = False PACKAGING_AVAILABLE = False
@ -22,7 +23,7 @@ except ImportError:
self.version_str = version_str self.version_str = version_str
# Simple version parsing: split by dots and convert to integers # Simple version parsing: split by dots and convert to integers
try: try:
self.parts = [int(x) for x in version_str.split('.')] self.parts = [int(x) for x in version_str.split(".")]
except ValueError: except ValueError:
self.parts = [0, 0, 0] self.parts = [0, 0, 0]
@ -58,7 +59,9 @@ class Validator:
"""Initialize validator""" """Initialize validator"""
self.validation_cache: Dict[str, Any] = {} 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 Check Python version requirements
@ -80,13 +83,21 @@ class Validator:
# Check minimum version # Check minimum version
if version.parse(current_version) < version.parse(min_version): if version.parse(current_version) < version.parse(min_version):
help_msg = self.get_installation_help("python") 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 self.validation_cache[cache_key] = result
return result return result
# Check maximum version if specified # Check maximum version if specified
if max_version and version.parse(current_version) > version.parse(max_version): if max_version and version.parse(current_version) > version.parse(
result = (False, f"Python version {current_version} exceeds maximum supported {max_version}") max_version
):
result = (
False,
f"Python version {current_version} exceeds maximum supported {max_version}",
)
self.validation_cache[cache_key] = result self.validation_cache[cache_key] = result
return result return result
@ -99,7 +110,9 @@ class Validator:
self.validation_cache[cache_key] = result self.validation_cache[cache_key] = result
return 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 Check Node.js version requirements
@ -117,11 +130,11 @@ class Validator:
try: try:
# Check if node is installed - use shell=True on Windows for better PATH resolution # Check if node is installed - use shell=True on Windows for better PATH resolution
result = subprocess.run( result = subprocess.run(
['node', '--version'], ["node", "--version"],
capture_output=True, capture_output=True,
text=True, text=True,
timeout=10, timeout=10,
shell=(sys.platform == "win32") shell=(sys.platform == "win32"),
) )
if result.returncode != 0: if result.returncode != 0:
@ -132,7 +145,7 @@ class Validator:
# Parse version (format: v18.17.0) # Parse version (format: v18.17.0)
version_output = result.stdout.strip() version_output = result.stdout.strip()
if version_output.startswith('v'): if version_output.startswith("v"):
current_version = version_output[1:] current_version = version_output[1:]
else: else:
current_version = version_output current_version = version_output
@ -140,13 +153,21 @@ class Validator:
# Check minimum version # Check minimum version
if version.parse(current_version) < version.parse(min_version): if version.parse(current_version) < version.parse(min_version):
help_msg = self.get_installation_help("node") 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 self.validation_cache[cache_key] = result_tuple
return result_tuple return result_tuple
# Check maximum version if specified # Check maximum version if specified
if max_version and version.parse(current_version) > version.parse(max_version): if max_version and version.parse(current_version) > version.parse(
result_tuple = (False, f"Node.js version {current_version} exceeds maximum supported {max_version}") max_version
):
result_tuple = (
False,
f"Node.js version {current_version} exceeds maximum supported {max_version}",
)
self.validation_cache[cache_key] = result_tuple self.validation_cache[cache_key] = result_tuple
return result_tuple return result_tuple
@ -185,11 +206,11 @@ class Validator:
try: try:
# Check if claude is installed - use shell=True on Windows for better PATH resolution # Check if claude is installed - use shell=True on Windows for better PATH resolution
result = subprocess.run( result = subprocess.run(
['claude', '--version'], ["claude", "--version"],
capture_output=True, capture_output=True,
text=True, text=True,
timeout=10, timeout=10,
shell=(sys.platform == "win32") shell=(sys.platform == "win32"),
) )
if result.returncode != 0: if result.returncode != 0:
@ -200,7 +221,7 @@ class Validator:
# Parse version from output # Parse version from output
version_output = result.stdout.strip() 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: if not version_match:
result_tuple = (True, "Claude CLI found (version format unknown)") result_tuple = (True, "Claude CLI found (version format unknown)")
@ -210,8 +231,13 @@ class Validator:
current_version = version_match.group(1) current_version = version_match.group(1)
# Check minimum version if specified # Check minimum version if specified
if min_version and version.parse(current_version) < version.parse(min_version): if min_version and version.parse(current_version) < version.parse(
result_tuple = (False, f"Claude CLI {min_version}+ required, found {current_version}") min_version
):
result_tuple = (
False,
f"Claude CLI {min_version}+ required, found {current_version}",
)
self.validation_cache[cache_key] = result_tuple self.validation_cache[cache_key] = result_tuple
return result_tuple return result_tuple
@ -233,7 +259,9 @@ class Validator:
self.validation_cache[cache_key] = result_tuple self.validation_cache[cache_key] = result_tuple
return 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 Check external tool availability and version
@ -258,7 +286,7 @@ class Validator:
capture_output=True, capture_output=True,
text=True, text=True,
timeout=10, timeout=10,
shell=(sys.platform == "win32") shell=(sys.platform == "win32"),
) )
if result.returncode != 0: if result.returncode != 0:
@ -269,13 +297,16 @@ class Validator:
# Extract version if min_version specified # Extract version if min_version specified
if min_version: if min_version:
version_output = result.stdout + result.stderr 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: if version_match:
current_version = version_match.group(1) current_version = version_match.group(1)
if version.parse(current_version) < version.parse(min_version): 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 self.validation_cache[cache_key] = result_tuple
return result_tuple return result_tuple
@ -328,7 +359,10 @@ class Validator:
free_mb = stat_result.free / (1024 * 1024) free_mb = stat_result.free / (1024 * 1024)
if free_mb < required_mb: 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: else:
result = (True, f"Sufficient disk space: {free_mb:.1f}MB free") result = (True, f"Sufficient disk space: {free_mb:.1f}MB free")
@ -373,7 +407,9 @@ class Validator:
self.validation_cache[cache_key] = result self.validation_cache[cache_key] = result
return 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 Validate all system requirements
@ -389,8 +425,7 @@ class Validator:
if "python" in requirements: if "python" in requirements:
python_req = requirements["python"] python_req = requirements["python"]
success, message = self.check_python( success, message = self.check_python(
python_req["min_version"], python_req["min_version"], python_req.get("max_version")
python_req.get("max_version")
) )
if not success: if not success:
errors.append(f"Python: {message}") errors.append(f"Python: {message}")
@ -399,8 +434,7 @@ class Validator:
if "node" in requirements: if "node" in requirements:
node_req = requirements["node"] node_req = requirements["node"]
success, message = self.check_node( success, message = self.check_node(
node_req["min_version"], node_req["min_version"], node_req.get("max_version")
node_req.get("max_version")
) )
if not success: if not success:
errors.append(f"Node.js: {message}") errors.append(f"Node.js: {message}")
@ -408,8 +442,7 @@ class Validator:
# Check disk space # Check disk space
if "disk_space_mb" in requirements: if "disk_space_mb" in requirements:
success, message = self.check_disk_space( success, message = self.check_disk_space(
get_home_directory(), get_home_directory(), requirements["disk_space_mb"]
requirements["disk_space_mb"]
) )
if not success: if not success:
errors.append(f"Disk space: {message}") errors.append(f"Disk space: {message}")
@ -421,9 +454,7 @@ class Validator:
is_optional = tool_req.get("optional", False) is_optional = tool_req.get("optional", False)
success, message = self.check_external_tool( success, message = self.check_external_tool(
tool_name, tool_name, tool_req["command"], tool_req.get("min_version")
tool_req["command"],
tool_req.get("min_version")
) )
if not success and not is_optional: if not success and not is_optional:
@ -431,7 +462,9 @@ class Validator:
return len(errors) == 0, errors 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 Validate requirements for specific components
@ -447,7 +480,7 @@ class Validator:
# Start with base requirements # Start with base requirements
base_requirements = { base_requirements = {
"python": all_requirements.get("python", {}), "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 # Add conditional requirements based on components
@ -488,7 +521,7 @@ class Validator:
info = { info = {
"platform": sys.platform, "platform": sys.platform,
"python_version": f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}", "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 # Add Node.js info if available
@ -510,7 +543,7 @@ class Validator:
info["disk_space"] = { info["disk_space"] = {
"total_gb": stat_result.total / (1024**3), "total_gb": stat_result.total / (1024**3),
"free_gb": stat_result.free / (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: except Exception:
info["disk_space"] = {"error": "Could not determine disk space"} info["disk_space"] = {"error": "Could not determine disk space"}
@ -543,7 +576,9 @@ class Validator:
except Exception: except Exception:
return {} 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 Get installation help for a specific tool
@ -587,14 +622,14 @@ class Validator:
"platform": self.get_platform(), "platform": self.get_platform(),
"checks": {}, "checks": {},
"issues": [], "issues": [],
"recommendations": [] "recommendations": [],
} }
# Check Python # Check Python
python_success, python_msg = self.check_python() python_success, python_msg = self.check_python()
diagnostics["checks"]["python"] = { diagnostics["checks"]["python"] = {
"status": "pass" if python_success else "fail", "status": "pass" if python_success else "fail",
"message": python_msg "message": python_msg,
} }
if not python_success: if not python_success:
diagnostics["issues"].append("Python version issue") diagnostics["issues"].append("Python version issue")
@ -604,7 +639,7 @@ class Validator:
node_success, node_msg = self.check_node() node_success, node_msg = self.check_node()
diagnostics["checks"]["node"] = { diagnostics["checks"]["node"] = {
"status": "pass" if node_success else "fail", "status": "pass" if node_success else "fail",
"message": node_msg "message": node_msg,
} }
if not node_success: if not node_success:
diagnostics["issues"].append("Node.js not found or version issue") diagnostics["issues"].append("Node.js not found or version issue")
@ -614,17 +649,19 @@ class Validator:
claude_success, claude_msg = self.check_claude_cli() claude_success, claude_msg = self.check_claude_cli()
diagnostics["checks"]["claude_cli"] = { diagnostics["checks"]["claude_cli"] = {
"status": "pass" if claude_success else "fail", "status": "pass" if claude_success else "fail",
"message": claude_msg "message": claude_msg,
} }
if not claude_success: if not claude_success:
diagnostics["issues"].append("Claude CLI not found") 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 # Check disk space
disk_success, disk_msg = self.check_disk_space(get_home_directory()) disk_success, disk_msg = self.check_disk_space(get_home_directory())
diagnostics["checks"]["disk_space"] = { diagnostics["checks"]["disk_space"] = {
"status": "pass" if disk_success else "fail", "status": "pass" if disk_success else "fail",
"message": disk_msg "message": disk_msg,
} }
if not disk_success: if not disk_success:
diagnostics["issues"].append("Insufficient disk space") diagnostics["issues"].append("Insufficient disk space")
@ -644,7 +681,7 @@ class Validator:
(["python3", "python"], "Python (python3 or python)"), (["python3", "python"], "Python (python3 or python)"),
(["node"], "Node.js"), (["node"], "Node.js"),
(["npm"], "npm"), (["npm"], "npm"),
(["claude"], "Claude CLI") (["claude"], "Claude CLI"),
] ]
for tool_alternatives, display_name in tool_checks: for tool_alternatives, display_name in tool_checks:
@ -656,7 +693,7 @@ class Validator:
capture_output=True, capture_output=True,
text=True, text=True,
timeout=5, timeout=5,
shell=(sys.platform == "win32") shell=(sys.platform == "win32"),
) )
if result.returncode == 0: if result.returncode == 0:
tool_found = True tool_found = True

View File

@ -8,9 +8,4 @@ from .config import ConfigService
from .files import FileService from .files import FileService
from .settings import SettingsService from .settings import SettingsService
__all__ = [ __all__ = ["CLAUDEMdService", "ConfigService", "FileService", "SettingsService"]
'CLAUDEMdService',
'ConfigService',
'FileService',
'SettingsService'
]

View File

@ -35,11 +35,11 @@ class CLAUDEMdService:
return existing_imports return existing_imports
try: 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() content = f.read()
# Find all @import statements using regex # 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) matches = re.findall(import_pattern, content, re.MULTILINE)
existing_imports.update(matches) existing_imports.update(matches)
@ -61,7 +61,7 @@ class CLAUDEMdService:
return "" return ""
try: 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() return f.read()
except Exception as e: except Exception as e:
self.logger.warning(f"Could not read existing CLAUDE.md: {e}") self.logger.warning(f"Could not read existing CLAUDE.md: {e}")
@ -88,7 +88,9 @@ class CLAUDEMdService:
return user_content 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 Organize imports into categorized sections
@ -145,13 +147,17 @@ class CLAUDEMdService:
self.logger.info("All files already imported, no changes needed") self.logger.info("All files already imported, no changes needed")
return True 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) # Extract user content (preserve everything before framework section)
user_content = self.extract_user_content(existing_content) user_content = self.extract_user_content(existing_content)
# Parse existing framework imports by category # 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 # Add new files to the specified category
if category not in existing_framework_imports: if category not in existing_framework_imports:
@ -167,14 +173,16 @@ class CLAUDEMdService:
new_content_parts.append("") # Add blank line before framework section new_content_parts.append("") # Add blank line before framework section
# Add organized framework imports # 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: if framework_section:
new_content_parts.append(framework_section) new_content_parts.append(framework_section)
# Write updated content # Write updated content
new_content = "\n".join(new_content_parts) 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) f.write(new_content)
self.logger.success(f"Updated CLAUDE.md with {len(new_files)} new imports") self.logger.success(f"Updated CLAUDE.md with {len(new_files)} new imports")
@ -203,27 +211,29 @@ class CLAUDEMdService:
return imports_by_category return imports_by_category
# Extract framework section # 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 # Parse categories and imports
lines = framework_section.split('\n') lines = framework_section.split("\n")
current_category = None current_category = None
for line in lines: for line in lines:
line = line.strip() line = line.strip()
# Skip section header lines and empty lines # Skip section header lines and empty lines
if line.startswith('# ===') or not line: if line.startswith("# ===") or not line:
continue continue
# Category header (starts with # but not the section divider) # 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 "# " current_category = line[2:].strip() # Remove "# "
if current_category not in imports_by_category: if current_category not in imports_by_category:
imports_by_category[current_category] = [] imports_by_category[current_category] = []
# Import line (starts with @) # Import line (starts with @)
elif line.startswith('@') and current_category: elif line.startswith("@") and current_category:
import_file = line[1:].strip() # Remove "@" import_file = line[1:].strip() # Remove "@"
if import_file not in imports_by_category[current_category]: if import_file not in imports_by_category[current_category]:
imports_by_category[current_category].append(import_file) 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. 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) f.write(default_content)
self.logger.info("Created CLAUDE.md with 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() existing_content = self.read_existing_content()
user_content = self.extract_user_content(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 # Remove files from all categories
removed_any = False removed_any = False
@ -286,7 +298,9 @@ The SuperClaude framework components will be automatically imported below.
removed_any = True removed_any = True
# Remove empty categories # 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: if not removed_any:
return True # Nothing was removed 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(user_content)
new_content_parts.append("") 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: if framework_section:
new_content_parts.append(framework_section) new_content_parts.append(framework_section)
# Write updated content # Write updated content
new_content = "\n".join(new_content_parts) 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) f.write(new_content)
self.logger.info(f"Removed {len(files)} imports from CLAUDE.md") self.logger.info(f"Removed {len(files)} imports from CLAUDE.md")

View File

@ -10,12 +10,14 @@ from pathlib import Path
try: try:
import jsonschema import jsonschema
from jsonschema import validate, ValidationError from jsonschema import validate, ValidationError
JSONSCHEMA_AVAILABLE = True JSONSCHEMA_AVAILABLE = True
except ImportError: except ImportError:
JSONSCHEMA_AVAILABLE = False JSONSCHEMA_AVAILABLE = False
class ValidationError(Exception): class ValidationError(Exception):
"""Simple validation error for when jsonschema is not available""" """Simple validation error for when jsonschema is not available"""
def __init__(self, message): def __init__(self, message):
self.message = message self.message = message
super().__init__(message) super().__init__(message)
@ -32,7 +34,9 @@ except ImportError:
elif expected_type == "string" and not isinstance(instance, str): elif expected_type == "string" and not isinstance(instance, str):
raise ValidationError(f"Expected string, got {type(instance).__name__}") raise ValidationError(f"Expected string, got {type(instance).__name__}")
elif expected_type == "integer" and not isinstance(instance, int): 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 # Skip detailed validation if jsonschema not available
@ -68,22 +72,22 @@ class ConfigService:
"category": {"type": "string"}, "category": {"type": "string"},
"dependencies": { "dependencies": {
"type": "array", "type": "array",
"items": {"type": "string"} "items": {"type": "string"},
}, },
"enabled": {"type": "boolean"}, "enabled": {"type": "boolean"},
"required_tools": { "required_tools": {
"type": "array", "type": "array",
"items": {"type": "string"} "items": {"type": "string"},
} },
}, },
"required": ["name", "version", "description", "category"], "required": ["name", "version", "description", "category"],
"additionalProperties": False "additionalProperties": False,
} }
} },
} }
}, },
"required": ["components"], "required": ["components"],
"additionalProperties": False "additionalProperties": False,
} }
# Schema for requirements.json # Schema for requirements.json
@ -94,21 +98,18 @@ class ConfigService:
"type": "object", "type": "object",
"properties": { "properties": {
"min_version": {"type": "string"}, "min_version": {"type": "string"},
"max_version": {"type": "string"} "max_version": {"type": "string"},
}, },
"required": ["min_version"] "required": ["min_version"],
}, },
"node": { "node": {
"type": "object", "type": "object",
"properties": { "properties": {
"min_version": {"type": "string"}, "min_version": {"type": "string"},
"max_version": {"type": "string"}, "max_version": {"type": "string"},
"required_for": { "required_for": {"type": "array", "items": {"type": "string"}},
"type": "array",
"items": {"type": "string"}
}
}, },
"required": ["min_version"] "required": ["min_version"],
}, },
"disk_space_mb": {"type": "integer"}, "disk_space_mb": {"type": "integer"},
"external_tools": { "external_tools": {
@ -121,14 +122,14 @@ class ConfigService:
"min_version": {"type": "string"}, "min_version": {"type": "string"},
"required_for": { "required_for": {
"type": "array", "type": "array",
"items": {"type": "string"} "items": {"type": "string"},
}, },
"optional": {"type": "boolean"} "optional": {"type": "boolean"},
}, },
"required": ["command"], "required": ["command"],
"additionalProperties": False "additionalProperties": False,
} }
} },
}, },
"installation_commands": { "installation_commands": {
"type": "object", "type": "object",
@ -140,15 +141,15 @@ class ConfigService:
"darwin": {"type": "string"}, "darwin": {"type": "string"},
"win32": {"type": "string"}, "win32": {"type": "string"},
"all": {"type": "string"}, "all": {"type": "string"},
"description": {"type": "string"} "description": {"type": "string"},
}, },
"additionalProperties": False "additionalProperties": False,
} }
} },
} },
}, },
"required": ["python", "disk_space_mb"], "required": ["python", "disk_space_mb"],
"additionalProperties": False "additionalProperties": False,
} }
def load_features(self) -> Dict[str, Any]: def load_features(self) -> Dict[str, Any]:
@ -169,7 +170,7 @@ class ConfigService:
raise FileNotFoundError(f"Features config not found: {self.features_file}") raise FileNotFoundError(f"Features config not found: {self.features_file}")
try: try:
with open(self.features_file, 'r') as f: with open(self.features_file, "r") as f:
features = json.load(f) features = json.load(f)
# Validate schema # Validate schema
@ -198,10 +199,12 @@ class ConfigService:
return self._requirements_cache return self._requirements_cache
if not self.requirements_file.exists(): 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: try:
with open(self.requirements_file, 'r') as f: with open(self.requirements_file, "r") as f:
requirements = json.load(f) requirements = json.load(f)
# Validate schema # Validate schema
@ -287,7 +290,9 @@ class ConfigService:
""" """
return self.load_requirements() 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 Get consolidated requirements for specific components
@ -304,7 +309,7 @@ class ConfigService:
result = { result = {
"python": requirements["python"], "python": requirements["python"],
"disk_space_mb": requirements["disk_space_mb"], "disk_space_mb": requirements["disk_space_mb"],
"external_tools": {} "external_tools": {},
} }
# Add Node.js requirements if needed # Add Node.js requirements if needed
@ -327,7 +332,9 @@ class ConfigService:
for tool in required_tools: for tool in required_tools:
if tool in requirements.get("external_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 return result

View File

@ -24,7 +24,9 @@ class FileService:
self.copied_files: List[Path] = [] self.copied_files: List[Path] = []
self.created_dirs: 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 Copy single file with permission preservation
@ -63,7 +65,9 @@ class FileService:
print(f"Error copying {source} to {target}: {e}") print(f"Error copying {source} to {target}: {e}")
return False 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 Recursively copy directory with gitignore-style patterns
@ -82,7 +86,7 @@ class FileService:
raise ValueError(f"Source is not a directory: {source}") raise ValueError(f"Source is not a directory: {source}")
ignore_patterns = ignore_patterns or [] 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 all_ignores = ignore_patterns + default_ignores
if self.dry_run: if self.dry_run:
@ -99,7 +103,9 @@ class FileService:
# Check against ignore patterns # Check against ignore patterns
for pattern in all_ignores: 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) ignored.append(item)
break break
@ -109,7 +115,7 @@ class FileService:
shutil.copytree(source, target, ignore=ignore_func, dirs_exist_ok=True) shutil.copytree(source, target, ignore=ignore_func, dirs_exist_ok=True)
# Track created directories and files # Track created directories and files
for item in target.rglob('*'): for item in target.rglob("*"):
if item.is_dir(): if item.is_dir():
self.created_dirs.append(item) self.created_dirs.append(item)
else: else:
@ -260,7 +266,9 @@ class FileService:
print(f"Error making {file_path} executable: {e}") print(f"Error making {file_path} executable: {e}")
return False 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 Calculate file hash
@ -277,7 +285,7 @@ class FileService:
try: try:
hasher = hashlib.new(algorithm) hasher = hashlib.new(algorithm)
with open(file_path, 'rb') as f: with open(file_path, "rb") as f:
# Read in chunks for large files # Read in chunks for large files
for chunk in iter(lambda: f.read(8192), b""): for chunk in iter(lambda: f.read(8192), b""):
hasher.update(chunk) hasher.update(chunk)
@ -287,7 +295,9 @@ class FileService:
except Exception: except Exception:
return None 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 Verify file integrity using hash
@ -317,7 +327,7 @@ class FileService:
total_size = 0 total_size = 0
try: try:
for file_path in directory.rglob('*'): for file_path in directory.rglob("*"):
if file_path.is_file(): if file_path.is_file():
total_size += file_path.stat().st_size total_size += file_path.stat().st_size
except Exception: except Exception:
@ -325,7 +335,9 @@ class FileService:
return total_size 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 Find files matching pattern
@ -348,7 +360,9 @@ class FileService:
except Exception: except Exception:
return [] 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 Create backup copy of file
@ -420,9 +434,9 @@ class FileService:
Dict with operation statistics Dict with operation statistics
""" """
return { return {
'files_copied': len(self.copied_files), "files_copied": len(self.copied_files),
'directories_created': len(self.created_dirs), "directories_created": len(self.created_dirs),
'dry_run': self.dry_run, "dry_run": self.dry_run,
'copied_files': [str(f) for f in self.copied_files], "copied_files": [str(f) for f in self.copied_files],
'created_directories': [str(d) for d in self.created_dirs] "created_directories": [str(d) for d in self.created_dirs],
} }

View File

@ -38,12 +38,14 @@ class SettingsService:
return {} return {}
try: 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) return json.load(f)
except (json.JSONDecodeError, IOError) as e: except (json.JSONDecodeError, IOError) as e:
raise ValueError(f"Could not load settings from {self.settings_file}: {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 Save settings to settings.json with optional backup
@ -60,7 +62,7 @@ class SettingsService:
# Save with pretty formatting # Save with pretty formatting
try: 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) json.dump(settings, f, indent=2, ensure_ascii=False, sort_keys=True)
except IOError as e: except IOError as e:
raise ValueError(f"Could not save settings to {self.settings_file}: {e}") raise ValueError(f"Could not save settings to {self.settings_file}: {e}")
@ -76,7 +78,7 @@ class SettingsService:
return {} return {}
try: 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) return json.load(f)
except (json.JSONDecodeError, IOError) as e: except (json.JSONDecodeError, IOError) as e:
raise ValueError(f"Could not load metadata from {self.metadata_file}: {e}") raise ValueError(f"Could not load metadata from {self.metadata_file}: {e}")
@ -93,7 +95,7 @@ class SettingsService:
# Save with pretty formatting # Save with pretty formatting
try: 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) json.dump(metadata, f, indent=2, ensure_ascii=False, sort_keys=True)
except IOError as e: except IOError as e:
raise ValueError(f"Could not save metadata to {self.metadata_file}: {e}") raise ValueError(f"Could not save metadata to {self.metadata_file}: {e}")
@ -153,7 +155,9 @@ class SettingsService:
self.save_metadata(merged_metadata) self.save_metadata(merged_metadata)
# Remove SuperClaude fields from settings # 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 # Save cleaned settings
self.save_settings(clean_settings, create_backup=True) self.save_settings(clean_settings, create_backup=True)
@ -173,7 +177,9 @@ class SettingsService:
existing = self.load_settings() existing = self.load_settings()
return self._deep_merge(existing, modifications) 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 Update settings with modifications
@ -199,13 +205,15 @@ class SettingsService:
try: try:
value = settings value = settings
for key in key_path.split('.'): for key in key_path.split("."):
value = value[key] value = value[key]
return value return value
except (KeyError, TypeError): except (KeyError, TypeError):
return default 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 Set setting value using dot-notation path
@ -215,7 +223,7 @@ class SettingsService:
create_backup: Whether to create backup before updating create_backup: Whether to create backup before updating
""" """
# Build nested dict structure # Build nested dict structure
keys = key_path.split('.') keys = key_path.split(".")
modification = {} modification = {}
current = modification current = modification
@ -239,7 +247,7 @@ class SettingsService:
True if setting was removed, False if not found True if setting was removed, False if not found
""" """
settings = self.load_settings() settings = self.load_settings()
keys = key_path.split('.') keys = key_path.split(".")
# Navigate to parent of target key # Navigate to parent of target key
current = settings current = settings
@ -258,7 +266,9 @@ class SettingsService:
except (KeyError, TypeError): except (KeyError, TypeError):
return False 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 Add component to registry in metadata
@ -272,7 +282,7 @@ class SettingsService:
metadata["components"][component_name] = { metadata["components"][component_name] = {
**component_info, **component_info,
"installed_at": datetime.now().isoformat() "installed_at": datetime.now().isoformat(),
} }
self.save_metadata(metadata) self.save_metadata(metadata)
@ -380,13 +390,15 @@ class SettingsService:
try: try:
value = metadata value = metadata
for key in key_path.split('.'): for key in key_path.split("."):
value = value[key] value = value[key]
return value return value
except (KeyError, TypeError): except (KeyError, TypeError):
return default 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 Deep merge two dictionaries
@ -400,7 +412,11 @@ class SettingsService:
result = copy.deepcopy(base) result = copy.deepcopy(base)
for key, value in overlay.items(): 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) result[key] = self._deep_merge(result[key], value)
else: else:
result[key] = copy.deepcopy(value) result[key] = copy.deepcopy(value)
@ -469,13 +485,15 @@ class SettingsService:
for file in self.backup_dir.glob("settings_*.json"): for file in self.backup_dir.glob("settings_*.json"):
try: try:
stat = file.stat() stat = file.stat()
backups.append({ backups.append(
"name": file.name, {
"path": str(file), "name": file.name,
"size": stat.st_size, "path": str(file),
"created": datetime.fromtimestamp(stat.st_ctime).isoformat(), "size": stat.st_size,
"modified": datetime.fromtimestamp(stat.st_mtime).isoformat() "created": datetime.fromtimestamp(stat.st_ctime).isoformat(),
}) "modified": datetime.fromtimestamp(stat.st_mtime).isoformat(),
}
)
except OSError: except OSError:
continue continue
@ -500,7 +518,7 @@ class SettingsService:
try: try:
# Validate backup file first # 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 json.load(f) # Will raise exception if invalid
# Create backup of current settings # Create backup of current settings

View File

@ -4,11 +4,4 @@ from .ui import ProgressBar, Menu, confirm, Colors
from .logger import Logger from .logger import Logger
from .security import SecurityValidator from .security import SecurityValidator
__all__ = [ __all__ = ["ProgressBar", "Menu", "confirm", "Colors", "Logger", "SecurityValidator"]
'ProgressBar',
'Menu',
'confirm',
'Colors',
'Logger',
'SecurityValidator'
]

View File

@ -18,6 +18,7 @@ from .paths import get_home_directory
def _get_env_tracking_file() -> Path: def _get_env_tracking_file() -> Path:
"""Get path to environment variable tracking file""" """Get path to environment variable tracking file"""
from .. import DEFAULT_INSTALL_DIR from .. import DEFAULT_INSTALL_DIR
install_dir = get_home_directory() / ".claude" install_dir = get_home_directory() / ".claude"
install_dir.mkdir(exist_ok=True) install_dir.mkdir(exist_ok=True)
return install_dir / "superclaude_env_vars.json" return install_dir / "superclaude_env_vars.json"
@ -29,7 +30,7 @@ def _load_env_tracking() -> Dict[str, Dict[str, str]]:
try: try:
if tracking_file.exists(): if tracking_file.exists():
with open(tracking_file, 'r') as f: with open(tracking_file, "r") as f:
return json.load(f) return json.load(f)
except Exception as e: except Exception as e:
get_logger().warning(f"Could not load environment tracking: {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() tracking_file = _get_env_tracking_file()
try: try:
with open(tracking_file, 'w') as f: with open(tracking_file, "w") as f:
json.dump(tracking_data, f, indent=2) json.dump(tracking_data, f, indent=2)
return True return True
except Exception as e: except Exception as e:
@ -62,7 +63,7 @@ def _add_env_tracking(env_vars: Dict[str, str]) -> None:
tracking_data[env_var] = { tracking_data[env_var] = {
"set_by": "superclaude", "set_by": "superclaude",
"timestamp": timestamp, "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) _save_env_tracking(tracking_data)
@ -95,10 +96,10 @@ def detect_shell_config() -> Optional[Path]:
# Check in order of preference # Check in order of preference
configs = [ configs = [
home / ".zshrc", # Zsh (Mac default) home / ".zshrc", # Zsh (Mac default)
home / ".bashrc", # Bash home / ".bashrc", # Bash
home / ".profile", # Generic shell profile home / ".profile", # Generic shell profile
home / ".bash_profile" # Mac Bash profile home / ".bash_profile", # Mac Bash profile
] ]
for config in configs: for config in configs:
@ -132,18 +133,20 @@ def setup_environment_variables(api_keys: Dict[str, str]) -> bool:
# Set for current session # Set for current session
os.environ[env_var] = value os.environ[env_var] = value
if os.name == 'nt': # Windows if os.name == "nt": # Windows
# Use setx for persistent user variable # Use setx for persistent user variable
result = subprocess.run( result = subprocess.run(
['setx', env_var, value], ["setx", env_var, value], capture_output=True, text=True
capture_output=True,
text=True
) )
if result.returncode != 0: 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 success = False
else: 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 else: # Unix-like systems
shell_config = detect_shell_config() 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}"' export_line = f'export {env_var}="{value}"'
try: try:
with open(shell_config, 'r') as f: with open(shell_config, "r") as f:
content = f.read() content = f.read()
# Check if this environment variable is already set # 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 # 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: else:
# Append export to shell config # Append export to shell config
with open(shell_config, 'a') as f: with open(shell_config, "a") as f:
f.write(f'\n# SuperClaude API Key\n{export_line}\n') f.write(f"\n# SuperClaude API Key\n{export_line}\n")
display_info(f"Added {env_var} to {shell_config.name}") display_info(f"Added {env_var} to {shell_config.name}")
logger.info(f"Added {env_var} to {shell_config}") 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}") display_warning(f"Could not update {shell_config.name}: {e}")
success = False 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: except Exception as e:
logger.error(f"Failed to set {env_var}: {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) _add_env_tracking(api_keys)
display_success("Environment variables configured successfully") display_success("Environment variables configured successfully")
if os.name != 'nt': if os.name != "nt":
display_info("Restart your terminal or run 'source ~/.bashrc' to apply changes") display_info(
"Restart your terminal or run 'source ~/.bashrc' to apply changes"
)
else: 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: else:
display_warning("Some environment variables could not be set persistently") display_warning("Some environment variables could not be set persistently")
display_info("You can set them manually or check the logs for details") display_info("You can set them manually or check the logs for details")
@ -228,10 +239,10 @@ def get_shell_name() -> str:
Returns: Returns:
Name of the shell (e.g., 'bash', 'zsh', 'fish') Name of the shell (e.g., 'bash', 'zsh', 'fish')
""" """
shell_path = os.environ.get('SHELL', '') shell_path = os.environ.get("SHELL", "")
if shell_path: if shell_path:
return Path(shell_path).name return Path(shell_path).name
return 'unknown' return "unknown"
def get_superclaude_environment_variables() -> Dict[str, str]: 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) # (for backwards compatibility with existing installations)
known_superclaude_env_vars = [ known_superclaude_env_vars = [
"TWENTYFIRST_API_KEY", # Magic server "TWENTYFIRST_API_KEY", # Magic server
"MORPH_API_KEY" # Morphllm server "MORPH_API_KEY", # Morphllm server
] ]
for env_var in known_superclaude_env_vars: for env_var in known_superclaude_env_vars:
@ -267,7 +278,9 @@ def get_superclaude_environment_variables() -> Dict[str, str]:
return found_vars 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 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] del os.environ[env_var]
logger.info(f"Removed {env_var} from current session") 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 # Remove persistent user variable using reg command
result = subprocess.run( result = subprocess.run(
['reg', 'delete', 'HKCU\\Environment', '/v', env_var, '/f'], ["reg", "delete", "HKCU\\Environment", "/v", env_var, "/f"],
capture_output=True, capture_output=True,
text=True text=True,
) )
if result.returncode != 0: if result.returncode != 0:
# Variable might not exist in registry, which is fine # 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: else:
logger.info(f"Removed {env_var} from Windows registry") logger.info(f"Removed {env_var} from Windows registry")
else: # Unix-like systems 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())) _remove_env_tracking(list(env_vars_to_remove.keys()))
display_success("Environment variables removed successfully") display_success("Environment variables removed successfully")
if os.name != 'nt': if os.name != "nt":
display_info("Restart your terminal or source your shell config to apply changes") display_info(
"Restart your terminal or source your shell config to apply changes"
)
else: else:
display_info("Changes will take effect in new terminal sessions") display_info("Changes will take effect in new terminal sessions")
else: else:
@ -342,9 +359,9 @@ def _create_restore_script(env_vars: Dict[str, str]) -> Optional[Path]:
"""Create a script to restore environment variables""" """Create a script to restore environment variables"""
try: try:
home = get_home_directory() home = get_home_directory()
if os.name == 'nt': # Windows if os.name == "nt": # Windows
script_path = home / "restore_superclaude_env.bat" 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("@echo off\n")
f.write("REM SuperClaude Environment Variable Restore Script\n") f.write("REM SuperClaude Environment Variable Restore Script\n")
f.write("REM Generated during uninstall\n\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") f.write("pause\n")
else: # Unix-like else: # Unix-like
script_path = home / "restore_superclaude_env.sh" 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("#!/bin/bash\n")
f.write("# SuperClaude Environment Variable Restore Script\n") f.write("# SuperClaude Environment Variable Restore Script\n")
f.write("# Generated during uninstall\n\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(): for env_var, value in env_vars.items():
f.write(f'export {env_var}="{value}"\n') f.write(f'export {env_var}="{value}"\n')
if shell_config: 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") f.write("\necho 'Environment variables restored'\n")
# Make script executable # 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""" """Remove environment variable export from shell configuration file"""
try: try:
# Read current content # Read current content
with open(shell_config, 'r') as f: with open(shell_config, "r") as f:
lines = f.readlines() lines = f.readlines()
# Filter out lines that export this variable # 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: for line in lines:
# Check if this line exports our variable # 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 skip_next_blank = True
continue continue
# Skip blank line after removed export # Skip blank line after removed export
if skip_next_blank and line.strip() == '': if skip_next_blank and line.strip() == "":
skip_next_blank = False skip_next_blank = False
continue continue
@ -401,7 +420,7 @@ def _remove_env_var_from_shell_config(shell_config: Path, env_var: str) -> bool:
filtered_lines.append(line) filtered_lines.append(line)
# Write back the filtered content # Write back the filtered content
with open(shell_config, 'w') as f: with open(shell_config, "w") as f:
f.writelines(filtered_lines) f.writelines(filtered_lines)
get_logger().info(f"Removed {env_var} export from {shell_config.name}") 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 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) 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 # Read existing .env file if it exists
existing_content = "" existing_content = ""
if env_file_path.exists(): 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() existing_content = f.read()
# Prepare new content # 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}"' line = f'{env_var}="{value}"'
# Check if this variable already exists # 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") logger.info(f"Variable {env_var} already exists in .env file")
else: else:
new_lines.append(line) new_lines.append(line)
# Append new lines if any # Append new lines if any
if new_lines: if new_lines:
with open(env_file_path, 'a') as f: with open(env_file_path, "a") as f:
if existing_content and not existing_content.endswith('\n'): if existing_content and not existing_content.endswith("\n"):
f.write('\n') f.write("\n")
f.write('# SuperClaude API Keys\n') f.write("# SuperClaude API Keys\n")
for line in new_lines: for line in new_lines:
f.write(line + '\n') f.write(line + "\n")
# Set file permissions (readable only by owner) # Set file permissions (readable only by owner)
env_file_path.chmod(0o600) env_file_path.chmod(0o600)
@ -491,6 +512,7 @@ def check_research_prerequisites() -> tuple[bool, list[str]]:
# Check Node.js for MCP # Check Node.js for MCP
import shutil import shutil
if not shutil.which("node"): if not shutil.which("node"):
warnings.append( warnings.append(
"Node.js not found - Required for Tavily MCP\n" "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