SuperClaude/setup/components/behavior_modes.py
kazuki nakai 00706f0ea9
feat: comprehensive framework improvements (#447)
* refactor(docs): move core docs into framework/business/research (move-only)

- framework/: principles, rules, flags (思想・行動規範)
- business/: symbols, examples (ビジネス領域)
- research/: config (調査設定)
- All files renamed to lowercase for consistency

* docs: update references to new directory structure

- Update ~/.claude/CLAUDE.md with new paths
- Add migration notice in core/MOVED.md
- Remove pm.md.backup
- All @superclaude/ references now point to framework/business/research/

* fix(setup): update framework_docs to use new directory structure

- Add validate_prerequisites() override for multi-directory validation
- Add _get_source_dirs() for framework/business/research directories
- Override _discover_component_files() for multi-directory discovery
- Override get_files_to_install() for relative path handling
- Fix get_size_estimate() to use get_files_to_install()
- Fix uninstall/update/validate to use install_component_subdir

Fixes installation validation errors for new directory structure.

Tested: make dev installs successfully with new structure
  - framework/: flags.md, principles.md, rules.md
  - business/: examples.md, symbols.md
  - research/: config.md

* refactor(modes): update component references for docs restructure

* chore: remove redundant docs after PLANNING.md migration

Cleanup after Self-Improvement Loop implementation:

**Deleted (21 files, ~210KB)**:
- docs/Development/ - All content migrated to PLANNING.md & TASK.md
  * ARCHITECTURE.md (15KB) → PLANNING.md
  * TASKS.md (3.7KB) → TASK.md
  * ROADMAP.md (11KB) → TASK.md
  * PROJECT_STATUS.md (4.2KB) → outdated
  * 13 PM Agent research files → archived in KNOWLEDGE.md
- docs/PM_AGENT.md - Old implementation status
- docs/pm-agent-implementation-status.md - Duplicate
- docs/templates/ - Empty directory

**Retained (valuable documentation)**:
- docs/memory/ - Active session metrics & context
- docs/patterns/ - Reusable patterns
- docs/research/ - Research reports
- docs/user-guide*/ - User documentation (4 languages)
- docs/reference/ - Reference materials
- docs/getting-started/ - Quick start guides
- docs/agents/ - Agent-specific guides
- docs/testing/ - Test procedures

**Result**:
- Eliminated redundancy after Root Documents consolidation
- Preserved all valuable content in PLANNING.md, TASK.md, KNOWLEDGE.md
- Maintained user-facing documentation structure

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: relocate PM modules to commands/modules

- Move modules to superclaude/commands/modules/
- Organize command-specific modules under commands/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: add self-improvement loop with 4 root documents

Implements Self-Improvement Loop based on Cursor's proven patterns:

**New Root Documents**:
- PLANNING.md: Architecture, design principles, 10 absolute rules
- TASK.md: Current tasks with priority (🔴🟡🟢)
- KNOWLEDGE.md: Accumulated insights, best practices, failures
- README.md: Updated with developer documentation links

**Key Features**:
- Session Start Protocol: Read docs → Git status → Token budget → Ready
- Evidence-Based Development: No guessing, always verify
- Parallel Execution Default: Wave → Checkpoint → Wave pattern
- Mac Environment Protection: Docker-first, no host pollution
- Failure Pattern Learning: Past mistakes become prevention rules

**Cleanup**:
- Removed: docs/memory/checkpoint.json, current_plan.json (migrated to TASK.md)
- Enhanced: setup/components/commands.py (module discovery)

**Benefits**:
- LLM reads rules at session start → consistent quality
- Past failures documented → no repeats
- Progressive knowledge accumulation → continuous improvement
- 3.5x faster execution with parallel patterns

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* test: validate Self-Improvement Loop workflow

Tested complete cycle: Read docs → Extract rules → Execute task → Update docs

Test Results:
- Session Start Protocol:  All 6 steps successful
- Rule Extraction:  10/10 absolute rules identified from PLANNING.md
- Task Identification:  Next tasks identified from TASK.md
- Knowledge Application:  Failure patterns accessed from KNOWLEDGE.md
- Documentation Update:  TASK.md and KNOWLEDGE.md updated with completed work
- Confidence Score: 95% (exceeds 70% threshold)

Proved Self-Improvement Loop closes: Execute → Learn → Update → Improve

* refactor: responsibility-driven component architecture

Rename components to reflect their responsibilities:
- framework_docs.py → knowledge_base.py (KnowledgeBaseComponent)
- modes.py → behavior_modes.py (BehaviorModesComponent)
- agents.py → agent_personas.py (AgentPersonasComponent)
- commands.py → slash_commands.py (SlashCommandsComponent)
- mcp.py → mcp_integration.py (MCPIntegrationComponent)

Each component now clearly documents its responsibility:
- knowledge_base: Framework knowledge initialization
- behavior_modes: Execution mode definitions
- agent_personas: AI agent personality definitions
- slash_commands: CLI command registration
- mcp_integration: External tool integration

Benefits:
- Self-documenting architecture
- Clear responsibility boundaries
- Easy to navigate and extend
- Scalable for future hierarchical organization

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* docs: add project-specific CLAUDE.md with UV rules

- Document UV as required Python package manager
- Add common operations and integration examples
- Document project structure and component architecture
- Provide development workflow guidelines

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: resolve installation failures after framework_docs rename

## Problems Fixed
1. **Syntax errors**: Duplicate docstrings in all component files (line 1)
2. **Dependency mismatch**: Stale framework_docs references after rename to knowledge_base

## Changes
- Fix docstring format in all component files (behavior_modes, agent_personas, slash_commands, mcp_integration)
- Update all dependency references: framework_docs → knowledge_base
- Update component registration calls in knowledge_base.py (5 locations)
- Update install.py files in both setup/ and superclaude/ (5 locations total)
- Fix documentation links in README-ja.md and README-zh.md

## Verification
 All components load successfully without syntax errors
 Dependency resolution works correctly
 Installation completes in 0.5s with all validations passing
 make dev succeeds

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: add automated README translation workflow

## New Features
- **Auto-translation workflow** using GPT-Translate
- Automatically translates README.md to Chinese (ZH) and Japanese (JA)
- Triggers on README.md changes to master/main branches
- Cost-effective: ~¥90/month for typical usage

## Implementation Details
- Uses OpenAI GPT-4 for high-quality translations
- GitHub Actions integration with gpt-translate@v1.1.11
- Secure API key management via GitHub Secrets
- Automatic commit and PR creation on translation updates

## Files Added
- `.github/workflows/translation-sync.yml` - Auto-translation workflow
- `docs/Development/translation-workflow.md` - Setup guide and documentation

## Setup Required
Add `OPENAI_API_KEY` to GitHub repository secrets to enable auto-translation.

## Benefits
- 🤖 Automated translation on every README update
- 💰 Low cost (~$0.06 per translation)
- 🛡️ Secure API key storage
- 🔄 Consistent translation quality across languages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(mcp): update airis-mcp-gateway URL to correct organization

Fixes #440

## Problem
Code referenced non-existent `oraios/airis-mcp-gateway` repository,
causing MCP installation to fail completely.

## Root Cause
- Repository was moved to organization: `agiletec-inc/airis-mcp-gateway`
- Old reference `oraios/airis-mcp-gateway` no longer exists
- Users reported "not a python/uv module" error

## Changes
- Update install_command URL: oraios → agiletec-inc
- Update run_command URL: oraios → agiletec-inc
- Location: setup/components/mcp_integration.py lines 37-38

## Verification
 Correct URL now references active repository
 MCP installation will succeed with proper organization
 No other code references oraios/airis-mcp-gateway

## Related Issues
- Fixes #440 (Airis-mcp-gateway url has changed)
- Related to #442 (MCP update issues)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: replace cloud translation with local Neural CLI

## Changes

### Removed (OpenAI-dependent)
-  `.github/workflows/translation-sync.yml` - GPT-Translate workflow
-  `docs/Development/translation-workflow.md` - OpenAI setup docs

### Added (Local Ollama-based)
-  `Makefile`: New `make translate` target using Neural CLI
-  `docs/Development/translation-guide.md` - Neural CLI guide

## Benefits

**Before (GPT-Translate)**:
- 💰 Monthly cost: ~¥90 (OpenAI API)
- 🔑 Requires API key setup
- 🌐 Data sent to external API
- ⏱️ Network latency

**After (Neural CLI)**:
-  **$0 cost** - Fully local execution
-  **No API keys** - Zero setup friction
-  **Privacy** - No external data transfer
-  **Fast** - ~1-2 min per README
-  **Offline capable** - Works without internet

## Technical Details

**Neural CLI**:
- Built in Rust with Tauri
- Uses Ollama + qwen2.5:3b model
- Binary size: 4.0MB
- Auto-installs to ~/.local/bin/

**Usage**:
```bash
make translate  # Translates README.md → README-zh.md, README-ja.md
```

## Requirements

- Ollama installed: `curl -fsSL https://ollama.com/install.sh | sh`
- Model downloaded: `ollama pull qwen2.5:3b`
- Neural CLI built: `cd ~/github/neural/src-tauri && cargo build --bin neural-cli --release`

🤖 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>
2025-10-18 20:28:10 +05:30

246 lines
8.9 KiB
Python

"""
Behavior Modes Component
Responsibility: Defines and manages execution modes for Claude behavior.
Controls how Claude responds to different contexts and user intent.
"""
from typing import Dict, List, Tuple, Optional, Any
from pathlib import Path
from ..core.base import Component
from setup import __version__
from ..services.claude_md import CLAUDEMdService
class BehaviorModesComponent(Component):
"""SuperClaude behavioral modes component"""
def __init__(self, install_dir: Optional[Path] = None):
"""Initialize modes component"""
super().__init__(install_dir, Path("modes"))
def get_metadata(self) -> Dict[str, str]:
"""Get component metadata"""
return {
"name": "modes",
"version": __version__,
"description": "7 behavioral modes for enhanced Claude Code operation",
"category": "modes",
}
def is_reinstallable(self) -> bool:
"""
Modes should always be synced to latest version.
SuperClaude mode files always overwrite existing files.
"""
return True
def _install(self, config: Dict[str, Any]) -> bool:
"""Install modes component"""
self.logger.info("Installing SuperClaude behavioral modes...")
# Validate installation
success, errors = self.validate_prerequisites()
if not success:
for error in errors:
self.logger.error(error)
return False
# Get files to install
files_to_install = self.get_files_to_install()
if not files_to_install:
self.logger.warning("No mode files found to install")
return False
# Copy mode files
success_count = 0
for source, target in files_to_install:
self.logger.debug(f"Copying {source.name} to {target}")
if self.file_manager.copy_file(source, target):
success_count += 1
self.logger.debug(f"Successfully copied {source.name}")
else:
self.logger.error(f"Failed to copy {source.name}")
if success_count != len(files_to_install):
self.logger.error(
f"Only {success_count}/{len(files_to_install)} mode files copied successfully"
)
return False
self.logger.success(
f"Modes component installed successfully ({success_count} mode files)"
)
return self._post_install()
def _post_install(self) -> bool:
"""Post-installation tasks"""
try:
# Update metadata
metadata_mods = {
"components": {
"modes": {
"version": __version__,
"installed": True,
"files_count": len(self.component_files),
"files": list(self.component_files), # Track for sync/deletion
}
}
}
self.settings_manager.update_metadata(metadata_mods)
self.logger.info("Updated metadata with modes component registration")
# Update CLAUDE.md with mode imports (include modes/ prefix)
try:
manager = CLAUDEMdService(self.install_dir)
mode_files_with_path = [f"modes/{f}" for f in self.component_files]
manager.add_imports(mode_files_with_path, category="Behavioral Modes")
self.logger.info("Updated CLAUDE.md with mode imports")
except Exception as e:
self.logger.warning(
f"Failed to update CLAUDE.md with mode imports: {e}"
)
# Don't fail the whole installation for this
return True
except Exception as e:
self.logger.error(f"Failed to update metadata: {e}")
return False
def uninstall(self) -> bool:
"""Uninstall modes component"""
try:
self.logger.info("Uninstalling SuperClaude modes component...")
# Remove mode files
removed_count = 0
for _, target in self.get_files_to_install():
if self.file_manager.remove_file(target):
removed_count += 1
self.logger.debug(f"Removed {target.name}")
# Remove modes directory if empty
try:
if self.install_component_subdir.exists():
remaining_files = list(self.install_component_subdir.iterdir())
if not remaining_files:
self.install_component_subdir.rmdir()
self.logger.debug("Removed empty modes directory")
except Exception as e:
self.logger.warning(f"Could not remove modes directory: {e}")
# Update settings.json
try:
if self.settings_manager.is_component_installed("modes"):
self.settings_manager.remove_component_registration("modes")
self.logger.info("Removed modes component from settings.json")
except Exception as e:
self.logger.warning(f"Could not update settings.json: {e}")
self.logger.success(
f"Modes component uninstalled ({removed_count} files removed)"
)
return True
except Exception as e:
self.logger.exception(f"Unexpected error during modes uninstallation: {e}")
return False
def get_dependencies(self) -> List[str]:
"""Get dependencies"""
return ["knowledge_base"]
def update(self, config: Dict[str, Any]) -> bool:
"""
Sync modes component (overwrite + delete obsolete files).
No backup needed - SuperClaude source files are always authoritative.
"""
try:
self.logger.info("Syncing SuperClaude modes component...")
# Get previously installed files from metadata
metadata = self.settings_manager.load_metadata()
previous_files = set(
metadata.get("components", {}).get("modes", {}).get("files", [])
)
# Get current files from source
current_files = set(self.component_files)
# Files to delete (were installed before, but no longer in source)
files_to_delete = previous_files - current_files
# Delete obsolete files
deleted_count = 0
for filename in files_to_delete:
file_path = self.install_dir / filename
if file_path.exists():
try:
file_path.unlink()
deleted_count += 1
self.logger.info(f"Deleted obsolete mode: {filename}")
except Exception as e:
self.logger.warning(f"Could not delete {filename}: {e}")
# Install/overwrite current files (no backup)
success = self.install(config)
if success:
# Update metadata with current file list
metadata_mods = {
"components": {
"modes": {
"version": __version__,
"installed": True,
"files_count": len(current_files),
"files": list(current_files), # Track installed files
}
}
}
self.settings_manager.update_metadata(metadata_mods)
self.logger.success(
f"Modes synced: {len(current_files)} files, {deleted_count} obsolete files removed"
)
else:
self.logger.error("Modes sync failed")
return success
except Exception as e:
self.logger.exception(f"Unexpected error during modes sync: {e}")
return False
def _get_source_dir(self) -> Optional[Path]:
"""Get source directory for mode files"""
# Assume we're in superclaude/setup/components/modes.py
# and mode files are in superclaude/superclaude/Modes/
project_root = Path(__file__).parent.parent.parent
modes_dir = project_root / "superclaude" / "modes"
# Return None if directory doesn't exist to prevent warning
if not modes_dir.exists():
return None
return modes_dir
def get_size_estimate(self) -> int:
"""Get estimated installation size"""
source_dir = self._get_source_dir()
total_size = 0
if source_dir and source_dir.exists():
for filename in self.component_files:
file_path = source_dir / filename
if file_path.exists():
total_size += file_path.stat().st_size
# Minimum size estimate
total_size = max(total_size, 20480) # At least 20KB
return total_size