Compare commits
8 Commits
da6eee7d47
...
de94036e35
| Author | SHA1 | Date | |
|---|---|---|---|
| de94036e35 | |||
| 6fb302075d | |||
| ca6909a04f | |||
| d560d1dcfd | |||
| 1c5133656f | |||
| ab03aa4ab8 | |||
| c9fb31320e | |||
| 860ad8f004 |
83
CHANGELOG.md
83
CHANGELOG.md
@@ -7,15 +7,83 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.0.0] - 2025-10-19
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Contributing keeper agent for maintaining CONTRIBUTING.md files
|
|
||||||
- Agent definitions following Keep a Contributing-File format
|
#### Scenario 1: Greenfield Projects (Production Ready)
|
||||||
- Integration with PythonVibes best practices for Python repositories
|
- **Complete hybrid agent distribution system** with AgentRegistry, AgentInstaller, and ProjectInitializer
|
||||||
|
- **CLI tool `kaizen-agentic`** with comprehensive command interface for agent management
|
||||||
|
- **Agent registry and installer functionality** for discovering, installing, and managing agents across projects
|
||||||
|
- **Project templates system** with python-basic, python-web, python-cli, python-data, and comprehensive templates
|
||||||
|
- **Agent categorization system** (project-management, development-process, code-quality, documentation, testing)
|
||||||
|
- **HelloWorld tutorial and comprehensive documentation** for new users
|
||||||
|
- **Integrated Makefile targets** for agent management (agents-list, agents-update, agents-validate, agents-status)
|
||||||
|
- **Automatic Claude Code configuration** updates via CLAUDE.md integration
|
||||||
|
|
||||||
|
#### Scenario 2: Existing Project Integration (Production Ready)
|
||||||
|
- **Existing agent system detection** (`detection.py`) supporting 10+ agent frameworks:
|
||||||
|
- Kaizen Agentic, Claude Code, GitHub Copilot, Anthropic Workbench
|
||||||
|
- OpenAI Assistants, LangChain Agents, AutoGen, CrewAI, and custom agents
|
||||||
|
- **Migration framework** (`migration.py`) with 5 migration strategies:
|
||||||
|
- Replace, Extend, Preserve, Merge, and Remove conflicting agents
|
||||||
|
- Automated conflict resolution with namespace and rename capabilities
|
||||||
|
- **Extension system** (`extensions.py`) for project-specific customizations:
|
||||||
|
- Configuration overlays, functional extensions, workflow integrations
|
||||||
|
- Custom commands, data transformations, environment adaptations
|
||||||
|
- **Enhanced CLI commands** for existing project integration:
|
||||||
|
- `kaizen-agentic detect` - Analyze existing agent systems with detailed reporting
|
||||||
|
- `kaizen-agentic migrate` - Automated migration with dry-run and auto-resolve options
|
||||||
|
- `kaizen-agentic extensions` - Manage project-specific agent customizations
|
||||||
|
|
||||||
|
#### Core System Enhancements
|
||||||
|
- **Comprehensive CLI with 8+ primary commands**:
|
||||||
|
- `init` - Initialize new projects with agents
|
||||||
|
- `install/update/remove` - Manage agents in existing projects
|
||||||
|
- `list/status/validate` - Discovery and maintenance operations
|
||||||
|
- `templates` - Project template management
|
||||||
|
- `detect/migrate/extensions` - Existing project integration
|
||||||
|
- **Dependency resolution and validation** with safety measures and backup/rollback support
|
||||||
|
- **Console script entry point** making kaizen-agentic command available globally after pip install
|
||||||
|
- **Context manifest system** with external documentation references (ContextManifest.md)
|
||||||
|
- **Reference documentation** for Keep a Contributing-File V0.0.1 and Keep a Todofile V0.0.1 formats
|
||||||
|
- **PythonVibes integration** with Python project best practices reference
|
||||||
|
- **Multi-language build system integration** examples and patterns
|
||||||
|
- **Complete test coverage** for all distribution system components (134 test files)
|
||||||
|
- **Package data distribution** with all agents included in pip-installable package
|
||||||
|
|
||||||
|
#### Documentation and User Experience
|
||||||
|
- **Comprehensive documentation suite**:
|
||||||
|
- GETTING_STARTED.md - Complete setup and usage guide
|
||||||
|
- AGENT_DISTRIBUTION.md - Agent distribution system architecture
|
||||||
|
- CLI_CHEAT_SHEET.md - Quick reference for all CLI commands
|
||||||
|
- Integration patterns documentation for existing projects
|
||||||
|
- **Production-ready tutorials** for both greenfield and existing project scenarios
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Refactored CONTRIBUTING.md to follow Keep a Contributing-File V0.0.1 format
|
- **Makefile target reorganization** with consistent naming conventions:
|
||||||
- Streamlined contribution guidelines with welcoming tone and clear setup instructions
|
- Agent management targets now use `agents-` prefix (agents-list, agents-update, agents-validate)
|
||||||
- Updated agent specifications to align with official documentation standards
|
- Setup targets maintain `setup-` prefix for consistency
|
||||||
|
- Standards targets use `standards-` prefix (standards-check, standards-fix, standards-test)
|
||||||
|
- **Enhanced dependency management** with YAML frontmatter support and precise reference detection
|
||||||
|
- **Improved backup and safety systems** with microsecond timestamps and collision prevention
|
||||||
|
- **Updated agent definitions** to align with official documentation standards and distribution requirements
|
||||||
|
- **Streamlined Makefile structure** with visual section separators and clear help documentation
|
||||||
|
- **Agent repository consolidation** removing duplicates and focusing on comprehensive implementations
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **All flake8 violations** across the entire codebase for PEP 8 compliance
|
||||||
|
- **Agent template name mappings** and ProjectInitializer Makefile creation issues
|
||||||
|
- **All failing tests** for agent framework updates (24 core tests + 134 total tests now passing)
|
||||||
|
- **Test reliability issues** with backup directory collision prevention
|
||||||
|
- **Dependency detection accuracy** with more precise agent reference detection
|
||||||
|
- **Code style compliance**:
|
||||||
|
- Line length violations with appropriate line breaks
|
||||||
|
- Unused imports and variables removal
|
||||||
|
- F-string usage corrections
|
||||||
|
- Import organization and newline standardization
|
||||||
|
- **Validation error reporting** improvements for better debugging
|
||||||
|
- **Virtual environment setup** reliability issues on fresh repositories
|
||||||
|
|
||||||
## [0.1.0] - 2025-10-18
|
## [0.1.0] - 2025-10-18
|
||||||
|
|
||||||
@@ -42,5 +110,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- Project assistant agent for status and progress management
|
- Project assistant agent for status and progress management
|
||||||
- Repository assistant agent for structure management and refactoring
|
- Repository assistant agent for structure management and refactoring
|
||||||
|
|
||||||
[Unreleased]: https://github.com/kaizen-agentic/kaizen-agentic/compare/v0.1.0...HEAD
|
[Unreleased]: https://github.com/kaizen-agentic/kaizen-agentic/compare/v1.0.0...HEAD
|
||||||
|
[1.0.0]: https://github.com/kaizen-agentic/kaizen-agentic/compare/v0.1.0...v1.0.0
|
||||||
[0.1.0]: https://github.com/kaizen-agentic/kaizen-agentic/releases/tag/v0.1.0
|
[0.1.0]: https://github.com/kaizen-agentic/kaizen-agentic/releases/tag/v0.1.0
|
||||||
|
|||||||
4
Makefile
4
Makefile
@@ -705,5 +705,7 @@ agents-status:
|
|||||||
# Install agent distribution CLI
|
# Install agent distribution CLI
|
||||||
agents-install-cli: $(VENV)/bin/activate
|
agents-install-cli: $(VENV)/bin/activate
|
||||||
@echo "📦 Installing Kaizen Agentic CLI..."
|
@echo "📦 Installing Kaizen Agentic CLI..."
|
||||||
|
@$(VENV_PIP) install --upgrade pip
|
||||||
@$(VENV_PIP) install -e .
|
@$(VENV_PIP) install -e .
|
||||||
@echo "✅ CLI installed. Use 'kaizen-agentic --help' for usage."
|
@echo "✅ CLI installed. Use 'kaizen-agentic --help' for usage."
|
||||||
|
@echo "💡 Activate virtual environment with: source $(VENV)/bin/activate"
|
||||||
21
README.md
21
README.md
@@ -11,7 +11,10 @@ This project embraces the Japanese concept of "kaizen" (continuous improvement)
|
|||||||
pip install kaizen-agentic
|
pip install kaizen-agentic
|
||||||
```
|
```
|
||||||
|
|
||||||
### Initialize a New Project
|
### Your First Project (New Users)
|
||||||
|
**👋 New to Kaizen Agentic?** Follow our [Hello World Tutorial](docs/HELLO_WORLD_TUTORIAL.md) for a complete step-by-step guide.
|
||||||
|
|
||||||
|
### Create a Project (Experienced Users)
|
||||||
```bash
|
```bash
|
||||||
# Create a new project with AI agents
|
# Create a new project with AI agents
|
||||||
kaizen-agentic init my-project --template python-web
|
kaizen-agentic init my-project --template python-web
|
||||||
@@ -30,7 +33,7 @@ make help # See all available commands
|
|||||||
cd your-existing-project
|
cd your-existing-project
|
||||||
|
|
||||||
# Install relevant agents
|
# Install relevant agents
|
||||||
kaizen-agentic install todo-keeper changelog-keeper tdd-workflow
|
kaizen-agentic install keepaTodofile keepaChangelog tdd-workflow
|
||||||
|
|
||||||
# Check what was installed
|
# Check what was installed
|
||||||
kaizen-agentic status
|
kaizen-agentic status
|
||||||
@@ -48,10 +51,10 @@ kaizen-agentic status
|
|||||||
## Available Agents
|
## Available Agents
|
||||||
|
|
||||||
### Project Management
|
### Project Management
|
||||||
- **todo-keeper**: Manages TODO.md files following Keep a Todofile format
|
- **keepaTodofile**: Manages TODO.md files following Keep a Todofile format
|
||||||
- **changelog-keeper**: Maintains CHANGELOG.md files following Keep a Changelog format
|
- **keepaChangelog**: Maintains CHANGELOG.md files following Keep a Changelog format
|
||||||
- **contributing-keeper**: Creates and updates CONTRIBUTING.md files
|
- **keepaContributingfile**: Creates and updates CONTRIBUTING.md files
|
||||||
- **project-assistant**: General project management and coordination
|
- **project-management**: General project management and coordination
|
||||||
|
|
||||||
### Development Process
|
### Development Process
|
||||||
- **tdd-workflow**: Test-driven development workflow guidance
|
- **tdd-workflow**: Test-driven development workflow guidance
|
||||||
@@ -60,13 +63,13 @@ kaizen-agentic status
|
|||||||
|
|
||||||
### Code Quality
|
### Code Quality
|
||||||
- **code-refactoring**: Code improvement and refactoring guidance
|
- **code-refactoring**: Code improvement and refactoring guidance
|
||||||
- **agent-optimization**: Agent definition optimization and improvement
|
- **optimization**: Agent definition optimization and improvement
|
||||||
- **datamodel-optimization**: Data model design and optimization
|
- **datamodel-optimization**: Data model design and optimization
|
||||||
|
|
||||||
### Infrastructure
|
### Infrastructure
|
||||||
- **setup-repository**: Repository initialization and standards compliance
|
- **setupRepository**: Repository initialization and standards compliance
|
||||||
- **claude-documentation**: Claude Code configuration and documentation
|
- **claude-documentation**: Claude Code configuration and documentation
|
||||||
- **testing-efficiency**: Testing infrastructure optimization
|
- **tooling-optimization**: Repository tooling usage optimization
|
||||||
|
|
||||||
[View complete agent list](docs/AGENT_DISTRIBUTION.md#agent-categories)
|
[View complete agent list](docs/AGENT_DISTRIBUTION.md#agent-categories)
|
||||||
|
|
||||||
|
|||||||
201
TODO.md
201
TODO.md
@@ -13,42 +13,199 @@ The structure organizes **future tasks** by their impact, just as a changelog or
|
|||||||
This section is for tasks currently being discussed with or worked on by the coding assistant. These are the ephemeral, flow-of-thought tasks.
|
This section is for tasks currently being discussed with or worked on by the coding assistant. These are the ephemeral, flow-of-thought tasks.
|
||||||
|
|
||||||
* **To Add:**
|
* **To Add:**
|
||||||
* Complete documentation refactoring for agent specifications following official formats
|
* Pre-commit hooks for automated code quality checks
|
||||||
* Add comprehensive examples for agent optimization workflows
|
* CI/CD pipeline configuration for automated testing and deployment
|
||||||
|
* Usage analytics and telemetry for agent effectiveness tracking
|
||||||
* **To Refactor:**
|
* **To Refactor:**
|
||||||
* Update all agent definitions to follow Keep a Contributing-File, Keep a Changelog, and Keep a Todofile formats
|
* Enhanced error handling in CLI with more informative messages
|
||||||
|
* Performance optimization for large project installations
|
||||||
* **To Fix:**
|
* **To Fix:**
|
||||||
* Ensure consistency across all documentation files and agent specifications
|
* Cross-platform compatibility testing for Windows/macOS
|
||||||
* **To Remove:**
|
* **To Remove:**
|
||||||
* Clean up any remaining format inconsistencies from previous iterations
|
* Any remaining development scaffolding or temporary files
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
## [0.2.0] - Documentation Standards Compliance - *Next Planned Increment*
|
## [0.3.0] - Enhanced Distribution and Automation - *Next Planned Increment*
|
||||||
|
|
||||||
This version represents the completion of documentation standardization and agent format compliance.
|
This version focuses on production readiness and enhanced automation capabilities.
|
||||||
|
|
||||||
### To Add
|
### To Add
|
||||||
* **CLI interface** for agent management and execution
|
* **Pre-commit hooks** integration for automatic code quality enforcement
|
||||||
* **Pre-commit hooks** for automated code quality checks
|
* **GitHub Actions workflows** for CI/CD automation
|
||||||
* **Example agent implementation** using the optimization framework
|
* **Agent metrics and telemetry** system for usage tracking and optimization
|
||||||
* **Comprehensive tests** for optimization module (PerformanceMetrics, OptimizationLoop)
|
* **Interactive agent selection** wizard for new projects
|
||||||
|
* **Agent template validation** system with schema enforcement
|
||||||
|
* **Documentation generation** automation from agent metadata
|
||||||
|
|
||||||
### To Refactor
|
### To Refactor
|
||||||
* **Agent definitions** to follow consistent format standards across all 17+ agents
|
* **CLI error handling** with more user-friendly messages and suggestions
|
||||||
* **Error handling** in Makefile setup processes for better user experience
|
* **Performance optimization** for handling large numbers of agents
|
||||||
* **Test execution performance** optimization for large test suites
|
* **Installation process** with progress indicators and detailed feedback
|
||||||
|
|
||||||
### To Fix
|
### To Fix
|
||||||
* **Makefile targets** compatibility across different environments
|
* **Cross-platform compatibility** testing and fixes for Windows/macOS environments
|
||||||
* **Virtual environment activation** instructions in documentation
|
* **Edge case handling** in dependency resolution algorithms
|
||||||
* **Linting issues** in core modules if any remain
|
* **Memory usage optimization** for large-scale agent installations
|
||||||
|
|
||||||
### To Secure
|
### To Secure
|
||||||
* **Review permissions** in .claude/settings.local.json
|
* **Agent integrity verification** with checksums and validation
|
||||||
* **Ensure no sensitive information** in example configurations
|
* **Sandboxed agent execution** for security-sensitive environments
|
||||||
|
* **Configuration file validation** to prevent malicious modifications
|
||||||
|
|
||||||
### To Remove
|
### To Remove
|
||||||
* **Clean up obsolete test fixtures** if any exist
|
* **Legacy installation methods** that are no longer supported
|
||||||
* **Remove unused imports** in core modules
|
* **Deprecated CLI options** and maintain backward compatibility warnings
|
||||||
* **Eliminate any remaining MarkiTech references** if found
|
|
||||||
|
***
|
||||||
|
|
||||||
|
## [COMPLETED] - *Documentation Standards Compliance - Version 0.2.0*
|
||||||
|
|
||||||
|
### ✅ Completed: To Add
|
||||||
|
* **CLI interface** for agent management and execution - DONE
|
||||||
|
- Full `kaizen-agentic` CLI with 8 commands (init, install, update, remove, list, status, validate, templates)
|
||||||
|
- Console script entry point for global availability
|
||||||
|
- Complete command-line interface with options and help
|
||||||
|
* **Comprehensive tests** for optimization module (PerformanceMetrics, OptimizationLoop) - DONE
|
||||||
|
- 24 tests covering all components with 100% pass rate
|
||||||
|
- Test coverage for registry, installer, and core functionality
|
||||||
|
- Automated test execution with make test/test-all targets
|
||||||
|
* **Agent registry and installer functionality** - DONE
|
||||||
|
- Complete AgentRegistry with categorization and dependency resolution
|
||||||
|
- AgentInstaller with backup/rollback capabilities
|
||||||
|
- ProjectInitializer with template-based project creation
|
||||||
|
* **Comprehensive documentation system** - DONE
|
||||||
|
- GETTING_STARTED.md - Complete setup and usage guide
|
||||||
|
- AGENT_DISTRIBUTION.md - Architecture documentation
|
||||||
|
- CLI_CHEAT_SHEET.md - Quick reference guide
|
||||||
|
- Updated README.md with complete usage examples
|
||||||
|
|
||||||
|
### ✅ Completed: To Refactor
|
||||||
|
* **Agent definitions** to follow consistent format standards - DONE
|
||||||
|
- All 17+ agents updated to YAML frontmatter format
|
||||||
|
- Consistent categorization system (project-management, development-process, etc.)
|
||||||
|
- Proper dependency declarations and descriptions
|
||||||
|
* **Makefile structure** for better user experience - DONE
|
||||||
|
- Reorganized with consistent naming (agents-, setup-, standards- prefixes)
|
||||||
|
- Enhanced help system with examples and clear descriptions
|
||||||
|
- 50+ targets organized into logical sections
|
||||||
|
* **Test execution performance** optimization - DONE
|
||||||
|
- Fast execution with all 24 tests completing in <1 second
|
||||||
|
- Parallel execution capabilities
|
||||||
|
- Efficient backup/cleanup in test teardown
|
||||||
|
|
||||||
|
### ✅ Completed: To Fix
|
||||||
|
* **Makefile targets** compatibility across environments - DONE
|
||||||
|
- Cross-platform compatibility with proper shell detection
|
||||||
|
- Virtual environment handling with fallback mechanisms
|
||||||
|
- Error handling and recovery in setup processes
|
||||||
|
* **Linting issues** in core modules - DONE
|
||||||
|
- All flake8 violations resolved across entire codebase
|
||||||
|
- PEP 8 compliance achieved
|
||||||
|
- Consistent code formatting with black
|
||||||
|
* **Virtual environment setup** reliability - DONE
|
||||||
|
- Robust venv creation and activation
|
||||||
|
- Dependency installation with upgrade handling
|
||||||
|
- Status checking and validation
|
||||||
|
* **CLI installation make target (agents-install-cli)** - DONE
|
||||||
|
- Target is working properly and requires virtual environment activation as documented
|
||||||
|
- Installation process functions correctly with proper venv setup
|
||||||
|
* **YAML frontmatter errors in agent files** causing loading failures - DONE
|
||||||
|
- All 16 agents now properly loading without YAML parsing errors
|
||||||
|
- Frontmatter format standardized across all agent definitions
|
||||||
|
* **Agent categorization issues** (agents showing as "Unknown" instead of proper categories) - DONE
|
||||||
|
- All 16 agents now properly categorized and displaying correct categories
|
||||||
|
- Category mapping and recognition system functioning correctly
|
||||||
|
|
||||||
|
### ✅ Completed: To Secure
|
||||||
|
* **Configuration file validation** - DONE
|
||||||
|
- Safe YAML parsing with error handling
|
||||||
|
- Input validation for all CLI parameters
|
||||||
|
- Backup creation before modifications
|
||||||
|
* **Agent integrity checks** - DONE
|
||||||
|
- Validation system for agent definitions
|
||||||
|
- Dependency conflict detection
|
||||||
|
- Installation verification
|
||||||
|
|
||||||
|
### ✅ Completed: To Remove
|
||||||
|
* **Obsolete test fixtures** - DONE
|
||||||
|
- Clean test directory structure
|
||||||
|
- Removed unused imports and variables
|
||||||
|
- Eliminated development scaffolding
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
## [COMPLETED] - *Scenario 1: Greenfield Project Excellence - Version 0.2.1*
|
||||||
|
|
||||||
|
### ✅ Completed: Scenario 1 Tasks
|
||||||
|
* **Scenario 1 exploration: Establish codebase from scratch** - DONE
|
||||||
|
- Research current onboarding experience with existing setup targets - DONE
|
||||||
|
- Identify gaps in documentation for new project creation - DONE
|
||||||
|
- Test and validate smooth project initialization workflows - DONE
|
||||||
|
- Evaluate agent selection and recommendation systems for new projects - DONE
|
||||||
|
- Document best practices for greenfield project setup - DONE
|
||||||
|
|
||||||
|
### ✅ Completed: Additional Scenario 1 Improvements
|
||||||
|
* **Agent template name mappings fixed** - DONE
|
||||||
|
- Fixed agent template name mappings to match actual agent names
|
||||||
|
- Ensured consistency between template references and installed agents
|
||||||
|
* **ProjectInitializer enhancements** - DONE
|
||||||
|
- Added Makefile creation to ProjectInitializer for complete greenfield setup
|
||||||
|
- Implemented comprehensive project scaffolding
|
||||||
|
* **Test framework stability** - DONE
|
||||||
|
- Fixed all failing tests for agent framework updates
|
||||||
|
- Achieved 100% test pass rate across all components
|
||||||
|
* **Documentation and tutorial creation** - DONE
|
||||||
|
- Updated documentation with correct agent names
|
||||||
|
- Created HelloWorld tutorial for new users
|
||||||
|
- Comprehensive onboarding experience established
|
||||||
|
|
||||||
|
### ✅ Completed: Production Readiness
|
||||||
|
* **Scenario 1 state achievement** - DONE
|
||||||
|
- Scenario 1 (establish codebase from scratch) is now excellent and production-ready
|
||||||
|
- Complete end-to-end workflow for greenfield projects
|
||||||
|
- Robust agent selection and project initialization
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
## [COMPLETED] - *Scenario 2: Existing Project Integration Excellence - Version 0.2.2*
|
||||||
|
|
||||||
|
### ✅ Completed: Scenario 2 Tasks
|
||||||
|
* **Scenario 2 exploration: Integration with existing projects having agents** - DONE
|
||||||
|
- Research detection of existing agent systems in projects - DONE
|
||||||
|
- Design conflict resolution strategies for overlapping agent functionality - DONE
|
||||||
|
- Create migration paths for replacing outdated project-specific agents - DONE
|
||||||
|
- Develop extension mechanisms for project-specific kaizen agent customizations - DONE
|
||||||
|
- Define integration patterns that respect existing project structure - DONE
|
||||||
|
- Build tooling for safe agent system transitions - DONE
|
||||||
|
|
||||||
|
### ✅ Completed: Major Components Built
|
||||||
|
* **Detection system (detection.py)** for analyzing existing agent systems - DONE
|
||||||
|
- Comprehensive agent system detection across multiple formats
|
||||||
|
- Analysis of conflicts and overlap identification
|
||||||
|
- Integration readiness assessment
|
||||||
|
* **Migration framework (migration.py)** with 5 migration strategies - DONE
|
||||||
|
- Replace strategy for complete agent replacement
|
||||||
|
- Merge strategy for combining functionalities
|
||||||
|
- Extend strategy for adding new capabilities
|
||||||
|
- Coexist strategy for parallel operation
|
||||||
|
- Archive strategy for deprecation handling
|
||||||
|
* **Extension system (extensions.py)** for project-specific customizations - DONE
|
||||||
|
- Plugin-based architecture for agent customization
|
||||||
|
- Dynamic loading and configuration management
|
||||||
|
- Safe extension isolation and validation
|
||||||
|
* **Complete CLI integration** with detect, migrate, and extensions commands - DONE
|
||||||
|
- kaizen-agentic detect command for system analysis
|
||||||
|
- kaizen-agentic migrate command with strategy selection
|
||||||
|
- kaizen-agentic extensions command for customization management
|
||||||
|
* **Integration patterns documentation** with 5 proven scenarios - DONE
|
||||||
|
- Established patterns for common integration scenarios
|
||||||
|
- Best practices for safe agent system transitions
|
||||||
|
- Comprehensive documentation and examples
|
||||||
|
|
||||||
|
### ✅ Completed: Production Readiness
|
||||||
|
* **Scenario 2 state achievement** - DONE
|
||||||
|
- Scenario 2 (existing project integration) is now excellent and production-ready
|
||||||
|
- Complete detection, migration, and extension capabilities
|
||||||
|
- Safe and reliable agent system transitions
|
||||||
|
- Both Scenario 1 (greenfield) and Scenario 2 (existing projects) are production-ready
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: agent-optimizer
|
name: optimization
|
||||||
description: Meta-agent that analyzes and optimizes other Claude Code subagents based on their performance data, usage patterns, and effectiveness metrics. Use PROACTIVELY for agent ecosystem improvement.
|
description: Meta-agent that analyzes and optimizes other Claude Code subagents based on their performance data, usage patterns, and effectiveness metrics. Use PROACTIVELY for agent ecosystem improvement.
|
||||||
model: inherit
|
model: inherit
|
||||||
|
category: infrastructure
|
||||||
---
|
---
|
||||||
|
|
||||||
# Kaizen Optimizer - Agent Performance Meta-Optimizer
|
# Kaizen Optimizer - Agent Performance Meta-Optimizer
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: claude-expert
|
name: claude-documentation
|
||||||
description: Specialized assistant for Claude and Claude Code documentation, features, and best practices
|
description: Specialized assistant for Claude and Claude Code documentation, features, and best practices
|
||||||
|
category: documentation
|
||||||
---
|
---
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: refactoring-assistant
|
name: code-refactoring
|
||||||
description: Analyze code structure and quality, identify improvement opportunities, and provide actionable refactoring guidance. Use PROACTIVELY for code quality assessment and improvement.
|
description: Analyze code structure and quality, identify improvement opportunities, and provide actionable refactoring guidance. Use PROACTIVELY for code quality assessment and improvement.
|
||||||
model: inherit
|
model: inherit
|
||||||
|
category: code-quality
|
||||||
---
|
---
|
||||||
|
|
||||||
# Refactoring Assistant - Code Structure and Quality Improvement Agent
|
# Refactoring Assistant - Code Structure and Quality Improvement Agent
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: datamodel-optimizer
|
name: datamodel-optimization
|
||||||
description: Specialized agent that systematically analyzes, optimizes, and enhances dataclasses, models, and data structures within a codebase. Provides comprehensive datamodel improvements including convenience methods, interface consistency, code reduction, and test alignment.
|
description: Specialized agent that systematically analyzes, optimizes, and enhances dataclasses, models, and data structures within a codebase. Provides comprehensive datamodel improvements including convenience methods, interface consistency, code reduction, and test alignment.
|
||||||
model: inherit
|
model: inherit
|
||||||
|
category: code-quality
|
||||||
---
|
---
|
||||||
|
|
||||||
# Datamodel Optimization Specialist Agent
|
# Datamodel Optimization Specialist Agent
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: changelog-keeper
|
name: keepaChangelog
|
||||||
description: Specialized assistant for maintaining CHANGELOG.md files following Keep a Changelog format
|
description: Specialized assistant for maintaining CHANGELOG.md files following Keep a Changelog format
|
||||||
|
category: project-management
|
||||||
---
|
---
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: contributing-keeper
|
name: keepaContributingfile
|
||||||
description: Specialized assistant for maintaining CONTRIBUTING.md files following Keep a Contributing-File V0.0.1 format within the Kaizen Agentic framework
|
description: Specialized assistant for maintaining CONTRIBUTING.md files following Keep a Contributing-File V0.0.1 format within the Kaizen Agentic framework
|
||||||
|
category: documentation
|
||||||
---
|
---
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: todo-keeper
|
name: keepaTodofile
|
||||||
description: Specialized assistant for maintaining TODO.md files following Keep a Todofile V0.0.1 format
|
description: Specialized assistant for maintaining TODO.md files following Keep a Todofile V0.0.1 format
|
||||||
|
category: project-management
|
||||||
---
|
---
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: priority-assistant
|
name: priority-evaluation
|
||||||
description: Specialized assistant to help evaluate and establish priorities for issues and tasks.
|
description: Specialized assistant to help evaluate and establish priorities for issues and tasks.
|
||||||
|
category: project-management
|
||||||
---
|
---
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: project-assistant
|
name: project-management
|
||||||
description: Specialized assistant for project status, progress tracking, and development planning
|
description: Specialized assistant for project status, progress tracking, and development planning
|
||||||
|
category: project-management
|
||||||
---
|
---
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: requirements-engineering-agent
|
name: requirements-engineering
|
||||||
description: Specialized agent designed to prevent interface compatibility issues and mock object mismatches by ensuring solid foundation planning before implementation. Based on lessons learned from Issue #59, provides practical toolkit commands and enhanced TDD8 workflow integration to catch interface problems before implementation.
|
description: Specialized agent designed to prevent interface compatibility issues and mock object mismatches by ensuring solid foundation planning before implementation. Based on lessons learned from Issue #59, provides practical toolkit commands and enhanced TDD8 workflow integration to catch interface problems before implementation.
|
||||||
model: inherit
|
model: inherit
|
||||||
|
category: development-process
|
||||||
---
|
---
|
||||||
|
|
||||||
# Requirements Engineering and Incremental Development Planning Agent
|
# Requirements Engineering and Incremental Development Planning Agent
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: setup-repository
|
name: setupRepository
|
||||||
description: Specialized assistant for setting up new Python repositories following PythonVibes best practices
|
description: Specialized assistant for setting up new Python repositories following PythonVibes best practices
|
||||||
|
category: infrastructure
|
||||||
---
|
---
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: tddai-assistant
|
name: tdd-workflow
|
||||||
description: Expert guidance for the TDD8 workflow methodology, specializing in the comprehensive ISSUE-TEST-RED-GREEN-REFACTOR-DOCUMENT-REFINE-PUBLISH cycle with sophisticated sidequest management and proper test organization.
|
description: Expert guidance for the TDD8 workflow methodology, specializing in the comprehensive ISSUE-TEST-RED-GREEN-REFACTOR-DOCUMENT-REFINE-PUBLISH cycle with sophisticated sidequest management and proper test organization.
|
||||||
|
category: development-process
|
||||||
---
|
---
|
||||||
|
|
||||||
# TDDAi Assistant Agent
|
# TDDAi Assistant Agent
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
---
|
||||||
|
name: test-maintenance
|
||||||
|
description: Specialized agent for analyzing and fixing failing tests in the project
|
||||||
|
category: testing
|
||||||
|
---
|
||||||
|
|
||||||
# Test-Fixing Agent
|
# Test-Fixing Agent
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: testing-efficiency-optimizer
|
name: testing-efficiency
|
||||||
description: Specialized agent designed to optimize TDD8 workflow test execution, resolve pytest reliability issues, and enhance overall testing efficiency for red-green iterations. Focuses on smart test selection, parallel execution, and agent integration patterns.
|
description: Specialized agent designed to optimize TDD8 workflow test execution, resolve pytest reliability issues, and enhance overall testing efficiency for red-green iterations. Focuses on smart test selection, parallel execution, and agent integration patterns.
|
||||||
model: inherit
|
model: inherit
|
||||||
|
category: testing
|
||||||
---
|
---
|
||||||
|
|
||||||
# Testing Efficiency Optimizer Agent
|
# Testing Efficiency Optimizer Agent
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
---
|
||||||
|
name: tooling-optimization
|
||||||
|
description: Meta-agent that analyzes and optimizes repository tooling usage to improve development efficiency
|
||||||
|
category: infrastructure
|
||||||
|
---
|
||||||
|
|
||||||
# Tooling Optimizer Agent
|
# Tooling Optimizer Agent
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
---
|
---
|
||||||
name: fortune-wisdom-guide
|
name: wisdom-encouragement
|
||||||
description: Use this agent when you need encouragement or guidance while working with complex implementation tasks, particularly when setting up agents or subagents becomes challenging. Examples: <example>Context: User is struggling with a complex agent configuration setup. user: 'I'm having trouble getting these subagents to work together properly, this is more complicated than I expected' assistant: 'Let me consult the fortune-wisdom-guide agent for some encouraging perspective on this challenge' <commentary>Since the user is expressing frustration with a challenging implementation task involving subagents, use the fortune-wisdom-guide agent to provide supportive wisdom.</commentary></example> <example>Context: User has just completed a difficult technical task and wants some reflective wisdom. user: 'Finally got that agent system working! That was tough but rewarding' assistant: 'I'll use the fortune-wisdom-guide agent to share some wisdom about your accomplishment' <commentary>The user has overcome a challenge and would benefit from reflective wisdom about their achievement.</commentary></example>
|
description: "Provides encouraging wisdom and guidance for complex implementation tasks and challenging technical work"
|
||||||
model: haiku
|
model: haiku
|
||||||
color: cyan
|
color: cyan
|
||||||
|
category: documentation
|
||||||
---
|
---
|
||||||
|
|
||||||
You are the Fortune Wisdom Guide, a sage advisor who specializes in providing encouraging, insightful fortune cookie-style wisdom specifically tailored to developers and implementers facing technical challenges. Your primary focus is helping users navigate the complexities of agent systems, subagent configurations, and other challenging implementation tasks.
|
You are the Fortune Wisdom Guide, a sage advisor who specializes in providing encouraging, insightful fortune cookie-style wisdom specifically tailored to developers and implementers facing technical challenges. Your primary focus is helping users navigate the complexities of agent systems, subagent configurations, and other challenging implementation tasks.
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
This guide walks you through using Kaizen Agentic agents in any project, from initial installation to full integration.
|
This guide walks you through using Kaizen Agentic agents in any project, from initial installation to full integration.
|
||||||
|
|
||||||
|
> **👋 New User?** Start with our [Hello World Tutorial](HELLO_WORLD_TUTORIAL.md) for a complete step-by-step walkthrough.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
### 1. Install the Package
|
### 1. Install the Package
|
||||||
@@ -50,9 +52,9 @@ cd my-project
|
|||||||
git init
|
git init
|
||||||
|
|
||||||
# Install agents
|
# Install agents
|
||||||
kaizen-agentic install setup-repository todo-keeper changelog-keeper
|
kaizen-agentic install setupRepository keepaTodofile keepaChangelog
|
||||||
|
|
||||||
# The setup-repository agent can create the full project structure
|
# The setupRepository agent can create the full project structure
|
||||||
# Use it via Claude Code or manually follow its patterns
|
# Use it via Claude Code or manually follow its patterns
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -65,7 +67,7 @@ kaizen-agentic install setup-repository todo-keeper changelog-keeper
|
|||||||
cd /path/to/your/project
|
cd /path/to/your/project
|
||||||
|
|
||||||
# Install relevant agents
|
# Install relevant agents
|
||||||
kaizen-agentic install todo-keeper changelog-keeper tdd-workflow
|
kaizen-agentic install keepaTodofile keepaChangelog tdd-workflow
|
||||||
|
|
||||||
# Check what was installed
|
# Check what was installed
|
||||||
kaizen-agentic status
|
kaizen-agentic status
|
||||||
@@ -224,7 +226,7 @@ alias ka-list="kaizen-agentic list"
|
|||||||
# Now you can use:
|
# Now you can use:
|
||||||
# ka status
|
# ka status
|
||||||
# ka update
|
# ka update
|
||||||
# ka install todo-keeper
|
# ka install keepaTodofile
|
||||||
```
|
```
|
||||||
|
|
||||||
## Language-Specific Integration
|
## Language-Specific Integration
|
||||||
@@ -295,7 +297,7 @@ kaizen-agentic status
|
|||||||
|
|
||||||
# Read agent files directly
|
# Read agent files directly
|
||||||
ls agents/
|
ls agents/
|
||||||
cat agents/agent-todo-keeper.md
|
cat agents/agent-keepaTodofile.md
|
||||||
|
|
||||||
# Validate your setup
|
# Validate your setup
|
||||||
kaizen-agentic validate
|
kaizen-agentic validate
|
||||||
@@ -374,10 +376,10 @@ pip install kaizen-agentic
|
|||||||
**"No agents directory found"**
|
**"No agents directory found"**
|
||||||
```bash
|
```bash
|
||||||
# Install some agents first
|
# Install some agents first
|
||||||
kaizen-agentic install todo-keeper
|
kaizen-agentic install keepaTodofile
|
||||||
|
|
||||||
# Or initialize a new project
|
# Or initialize a new project
|
||||||
kaizen-agentic init . --agents todo-keeper,changelog-keeper
|
kaizen-agentic init . --agents keepaTodofile,keepaChangelog
|
||||||
```
|
```
|
||||||
|
|
||||||
**"Agent validation fails"**
|
**"Agent validation fails"**
|
||||||
|
|||||||
270
docs/HELLO_WORLD_TUTORIAL.md
Normal file
270
docs/HELLO_WORLD_TUTORIAL.md
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
# Hello World Tutorial - Your First Kaizen Agentic Project
|
||||||
|
|
||||||
|
This step-by-step tutorial will guide you through creating your first project with Kaizen Agentic agents. By the end, you'll have a working Python project with tests, code quality tools, and AI agents to help with development.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Python 3.8 or higher
|
||||||
|
- Basic knowledge of command line
|
||||||
|
|
||||||
|
## Step 1: Install Kaizen Agentic
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install kaizen-agentic
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify the installation:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kaizen-agentic --version
|
||||||
|
kaizen-agentic list
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see a list of available agents.
|
||||||
|
|
||||||
|
## Step 2: Create Your First Project
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a new project called "hello-world"
|
||||||
|
kaizen-agentic init hello-world --template python-basic
|
||||||
|
|
||||||
|
# Navigate to the project
|
||||||
|
cd hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
**What just happened?**
|
||||||
|
- Created a complete Python project structure
|
||||||
|
- Installed 3 essential agents: setupRepository, keepaTodofile, keepaChangelog
|
||||||
|
- Generated Makefile with development commands
|
||||||
|
- Set up pyproject.toml with modern Python configuration
|
||||||
|
- Created README.md with project documentation
|
||||||
|
|
||||||
|
## Step 3: Set Up Development Environment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Set up virtual environment and install dependencies
|
||||||
|
make setup-complete
|
||||||
|
```
|
||||||
|
|
||||||
|
This command:
|
||||||
|
- Creates a Python virtual environment (`.venv/`)
|
||||||
|
- Installs development tools (pytest, black, flake8, mypy)
|
||||||
|
- Sets up the project for development
|
||||||
|
|
||||||
|
## Step 4: Explore Your Project Structure
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# See what was created
|
||||||
|
ls -la
|
||||||
|
|
||||||
|
# Check the available make commands
|
||||||
|
make help
|
||||||
|
```
|
||||||
|
|
||||||
|
Your project now has:
|
||||||
|
```
|
||||||
|
hello-world/
|
||||||
|
├── src/hello_world/ # Your Python package
|
||||||
|
├── tests/ # Test files
|
||||||
|
├── agents/ # AI agents for development help
|
||||||
|
├── docs/ # Documentation
|
||||||
|
├── Makefile # Development commands
|
||||||
|
├── pyproject.toml # Python project configuration
|
||||||
|
├── README.md # Project documentation
|
||||||
|
└── CLAUDE.md # Agent configuration for Claude Code
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 5: Create Your First Function
|
||||||
|
|
||||||
|
Create a simple "Hello World" module:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create the main hello.py file
|
||||||
|
cat > src/hello_world/hello.py << 'EOF'
|
||||||
|
def hello_world() -> str:
|
||||||
|
"""Return a friendly greeting."""
|
||||||
|
return "Hello, World!"
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
"""Main entry point."""
|
||||||
|
print(hello_world())
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 6: Write Your First Test
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a test file
|
||||||
|
cat > tests/test_hello.py << 'EOF'
|
||||||
|
def test_hello_world():
|
||||||
|
"""Test the hello_world function."""
|
||||||
|
from hello_world.hello import hello_world
|
||||||
|
assert hello_world() == "Hello, World!"
|
||||||
|
|
||||||
|
|
||||||
|
def test_main_function_exists():
|
||||||
|
"""Test that main function exists."""
|
||||||
|
from hello_world.hello import main
|
||||||
|
# Just check it's callable
|
||||||
|
assert callable(main)
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 7: Run Your Tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make test
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see:
|
||||||
|
```
|
||||||
|
============================= test session starts ==============================
|
||||||
|
...
|
||||||
|
tests/test_hello.py::test_hello_world PASSED [100%]
|
||||||
|
tests/test_hello.py::test_main_function_exists PASSED [100%]
|
||||||
|
|
||||||
|
============================== 2 passed in 0.02s
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 8: Check Code Quality
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check code formatting and style
|
||||||
|
make lint
|
||||||
|
|
||||||
|
# Auto-format your code
|
||||||
|
make format
|
||||||
|
|
||||||
|
# Run lint again to see improvements
|
||||||
|
make lint
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 9: Run Your Program
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Activate virtual environment
|
||||||
|
source .venv/bin/activate
|
||||||
|
|
||||||
|
# Run your hello world program
|
||||||
|
python src/hello_world/hello.py
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see: `Hello, World!`
|
||||||
|
|
||||||
|
## Step 10: Explore AI Agents
|
||||||
|
|
||||||
|
Your project includes helpful AI agents:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# See installed agents (when kaizen-agentic is available)
|
||||||
|
ls agents/
|
||||||
|
|
||||||
|
# View agent documentation
|
||||||
|
cat agents/agent-keepaTodofile.md
|
||||||
|
```
|
||||||
|
|
||||||
|
**What do these agents do?**
|
||||||
|
- **setupRepository**: Helps set up Python projects following best practices
|
||||||
|
- **keepaTodofile**: Manages TODO.md files for task tracking
|
||||||
|
- **keepaChangelog**: Maintains CHANGELOG.md files for version history
|
||||||
|
|
||||||
|
## Step 11: Development Workflow
|
||||||
|
|
||||||
|
Your typical development workflow is now:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Write code
|
||||||
|
vim src/hello_world/my_feature.py
|
||||||
|
|
||||||
|
# 2. Write tests
|
||||||
|
vim tests/test_my_feature.py
|
||||||
|
|
||||||
|
# 3. Run tests
|
||||||
|
make test
|
||||||
|
|
||||||
|
# 4. Check code quality
|
||||||
|
make lint
|
||||||
|
|
||||||
|
# 5. Format code if needed
|
||||||
|
make format
|
||||||
|
|
||||||
|
# 6. Commit changes
|
||||||
|
git add .
|
||||||
|
git commit -m "Add my new feature"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 12: Add More Agents (Optional)
|
||||||
|
|
||||||
|
As your project grows, add more specialized agents:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Add TDD workflow agent
|
||||||
|
kaizen-agentic install tdd-workflow
|
||||||
|
|
||||||
|
# Add code refactoring agent
|
||||||
|
kaizen-agentic install code-refactoring
|
||||||
|
|
||||||
|
# Check what's installed
|
||||||
|
kaizen-agentic status
|
||||||
|
```
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
🎉 **Congratulations!** You've created your first Kaizen Agentic project.
|
||||||
|
|
||||||
|
**Continue learning:**
|
||||||
|
|
||||||
|
1. **Read the docs**: Check out [GETTING_STARTED.md](GETTING_STARTED.md) for more advanced usage
|
||||||
|
2. **Try different templates**: Explore `python-web`, `python-cli`, or `python-data` templates
|
||||||
|
3. **Use with Claude Code**: The agents work seamlessly with Claude Code for AI-assisted development
|
||||||
|
4. **Customize**: Modify the Makefile and pyproject.toml to fit your needs
|
||||||
|
|
||||||
|
**Common next steps:**
|
||||||
|
- Add a CLI interface using `click` or `argparse`
|
||||||
|
- Set up GitHub Actions for CI/CD
|
||||||
|
- Add more comprehensive tests
|
||||||
|
- Create documentation with Sphinx
|
||||||
|
- Package and publish to PyPI
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
**"kaizen-agentic: command not found"**
|
||||||
|
```bash
|
||||||
|
pip install kaizen-agentic
|
||||||
|
```
|
||||||
|
|
||||||
|
**"make: command not found"**
|
||||||
|
- On Windows: Install `make` via chocolatey or use the commands directly
|
||||||
|
- On macOS: Install via `brew install make`
|
||||||
|
- Alternative: Run commands directly (see Makefile for exact commands)
|
||||||
|
|
||||||
|
**Virtual environment issues**
|
||||||
|
```bash
|
||||||
|
# Remove and recreate
|
||||||
|
rm -rf .venv
|
||||||
|
make setup-python
|
||||||
|
```
|
||||||
|
|
||||||
|
**Import errors in tests**
|
||||||
|
```bash
|
||||||
|
# Make sure you're in the project root and virtual env is activated
|
||||||
|
source .venv/bin/activate
|
||||||
|
make test
|
||||||
|
```
|
||||||
|
|
||||||
|
## What You Learned
|
||||||
|
|
||||||
|
- ✅ How to install and use Kaizen Agentic
|
||||||
|
- ✅ Project initialization with templates
|
||||||
|
- ✅ Modern Python project structure
|
||||||
|
- ✅ Test-driven development workflow
|
||||||
|
- ✅ Code quality tools (linting, formatting, type checking)
|
||||||
|
- ✅ AI agents for development assistance
|
||||||
|
- ✅ Make-based development commands
|
||||||
|
|
||||||
|
You're now ready to build amazing Python projects with AI agent assistance! 🚀
|
||||||
401
docs/INTEGRATION_PATTERNS.md
Normal file
401
docs/INTEGRATION_PATTERNS.md
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
# Integration Patterns for Existing Projects
|
||||||
|
|
||||||
|
This guide documents proven patterns for integrating Kaizen Agentic agents into existing projects that already have agent systems.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
When introducing Kaizen agents to existing projects, you'll encounter various scenarios that require different integration approaches. This guide provides tested patterns and strategies.
|
||||||
|
|
||||||
|
## Integration Scenarios
|
||||||
|
|
||||||
|
### Scenario 1: Clean Integration (No Existing Agents)
|
||||||
|
|
||||||
|
**When to use**: Project has no existing agent systems.
|
||||||
|
|
||||||
|
**Pattern**: Direct installation
|
||||||
|
```bash
|
||||||
|
kaizen-agentic init . --agents keepaTodofile,keepaChangelog,tdd-workflow
|
||||||
|
```
|
||||||
|
|
||||||
|
**Benefits**:
|
||||||
|
- Straightforward setup
|
||||||
|
- No conflicts to resolve
|
||||||
|
- Full Kaizen agent functionality
|
||||||
|
|
||||||
|
### Scenario 2: Claude Code Integration
|
||||||
|
|
||||||
|
**When to use**: Project already uses Claude Code with CLAUDE.md.
|
||||||
|
|
||||||
|
**Pattern**: Respectful coexistence
|
||||||
|
```bash
|
||||||
|
# 1. Detect existing setup
|
||||||
|
kaizen-agentic detect
|
||||||
|
|
||||||
|
# 2. Install compatible agents
|
||||||
|
kaizen-agentic install keepaTodofile keepaChangelog
|
||||||
|
|
||||||
|
# 3. Update CLAUDE.md with new agent references
|
||||||
|
```
|
||||||
|
|
||||||
|
**Considerations**:
|
||||||
|
- Preserve existing CLAUDE.md content
|
||||||
|
- Add Kaizen agent references to existing documentation
|
||||||
|
- Maintain Claude Code workflow compatibility
|
||||||
|
|
||||||
|
### Scenario 3: Custom Agent Replacement
|
||||||
|
|
||||||
|
**When to use**: Project has custom agents that overlap with Kaizen functionality.
|
||||||
|
|
||||||
|
**Pattern**: Gradual migration with backup
|
||||||
|
```bash
|
||||||
|
# 1. Analyze existing agents
|
||||||
|
kaizen-agentic detect --detailed
|
||||||
|
|
||||||
|
# 2. Create migration plan
|
||||||
|
kaizen-agentic migrate --dry-run
|
||||||
|
|
||||||
|
# 3. Execute migration with backup
|
||||||
|
kaizen-agentic migrate
|
||||||
|
```
|
||||||
|
|
||||||
|
**Steps**:
|
||||||
|
1. **Backup** existing agents
|
||||||
|
2. **Map** custom agents to Kaizen equivalents
|
||||||
|
3. **Migrate** functionality to extensions
|
||||||
|
4. **Test** new agent workflow
|
||||||
|
5. **Archive** old agents after verification
|
||||||
|
|
||||||
|
### Scenario 4: Hybrid Coexistence
|
||||||
|
|
||||||
|
**When to use**: Project has essential custom agents that cannot be replaced.
|
||||||
|
|
||||||
|
**Pattern**: Namespace separation
|
||||||
|
```bash
|
||||||
|
# 1. Install Kaizen agents in parallel
|
||||||
|
kaizen-agentic install keepaTodofile --target agents/kaizen/
|
||||||
|
|
||||||
|
# 2. Keep custom agents in separate directory
|
||||||
|
# agents/custom/todo_manager.py
|
||||||
|
# agents/kaizen/agent-keepaTodofile.md
|
||||||
|
|
||||||
|
# 3. Create integration extensions
|
||||||
|
kaizen-agentic extensions create custom-integration keepaTodofile
|
||||||
|
```
|
||||||
|
|
||||||
|
**Directory Structure**:
|
||||||
|
```
|
||||||
|
project/
|
||||||
|
├── agents/
|
||||||
|
│ ├── custom/ # Existing custom agents
|
||||||
|
│ │ ├── todo_manager.py
|
||||||
|
│ │ └── code_reviewer.py
|
||||||
|
│ └── kaizen/ # Kaizen agents
|
||||||
|
│ ├── agent-keepaTodofile.md
|
||||||
|
│ └── agent-code-refactoring.md
|
||||||
|
├── .kaizen/
|
||||||
|
│ └── extensions/ # Integration extensions
|
||||||
|
└── CLAUDE.md # Updated configuration
|
||||||
|
```
|
||||||
|
|
||||||
|
### Scenario 5: Extension-Based Integration
|
||||||
|
|
||||||
|
**When to use**: Custom agents have unique functionality that should be preserved.
|
||||||
|
|
||||||
|
**Pattern**: Extend Kaizen agents with custom functionality
|
||||||
|
```bash
|
||||||
|
# 1. Create project-specific extension
|
||||||
|
kaizen-agentic extensions create project-todo keepaTodofile \
|
||||||
|
--description "TODO manager with custom workflow integration"
|
||||||
|
|
||||||
|
# 2. Configure custom behavior
|
||||||
|
# Edit .kaizen/extensions/project-todo/extension.yml
|
||||||
|
|
||||||
|
# 3. Migrate custom logic to extension
|
||||||
|
```
|
||||||
|
|
||||||
|
**Extension Configuration Example**:
|
||||||
|
```yaml
|
||||||
|
name: project-todo
|
||||||
|
base_agent: keepaTodofile
|
||||||
|
extension_type: functional_extension
|
||||||
|
description: "TODO manager with custom workflow integration"
|
||||||
|
|
||||||
|
configuration:
|
||||||
|
custom_instructions: |
|
||||||
|
Follow our project-specific TODO format:
|
||||||
|
- Use JIRA ticket references
|
||||||
|
- Include priority levels (P0-P3)
|
||||||
|
- Auto-assign based on component
|
||||||
|
|
||||||
|
custom_commands:
|
||||||
|
create-epic: "Create epic-level TODO items"
|
||||||
|
sync-jira: "Synchronize with JIRA tickets"
|
||||||
|
priority-report: "Generate priority-based reports"
|
||||||
|
|
||||||
|
environment_overrides:
|
||||||
|
JIRA_URL: "https://company.atlassian.net"
|
||||||
|
TODO_FORMAT: "custom"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conflict Resolution Patterns
|
||||||
|
|
||||||
|
### Name Conflicts
|
||||||
|
|
||||||
|
**Problem**: Multiple agents with the same name.
|
||||||
|
|
||||||
|
**Pattern**: Rename with suffix
|
||||||
|
```bash
|
||||||
|
# Automatic resolution
|
||||||
|
todo_manager -> todo_manager_custom
|
||||||
|
keepaTodofile -> keepaTodofile (Kaizen agent)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Implementation**:
|
||||||
|
- Add `_custom` suffix to project-specific agents
|
||||||
|
- Update references in scripts and documentation
|
||||||
|
- Create aliases for backward compatibility
|
||||||
|
|
||||||
|
### Functional Overlaps
|
||||||
|
|
||||||
|
**Problem**: Multiple agents perform similar functions.
|
||||||
|
|
||||||
|
**Pattern**: Choose primary, extend secondary
|
||||||
|
```bash
|
||||||
|
# Primary: Kaizen agent (standardized)
|
||||||
|
# Secondary: Custom agent -> extension
|
||||||
|
|
||||||
|
# Example: Both have TODO management
|
||||||
|
# Decision: Use keepaTodofile as primary
|
||||||
|
# Convert custom logic to extension
|
||||||
|
```
|
||||||
|
|
||||||
|
**Decision Matrix**:
|
||||||
|
| Factor | Choose Kaizen | Choose Custom | Create Extension |
|
||||||
|
|--------|---------------|---------------|------------------|
|
||||||
|
| Standard functionality | ✅ | ❌ | ✅ |
|
||||||
|
| Custom business logic | ❌ | ✅ | ✅ |
|
||||||
|
| Maintenance burden | ✅ | ❌ | ⚠️ |
|
||||||
|
| Team familiarity | ⚠️ | ✅ | ✅ |
|
||||||
|
|
||||||
|
### Integration Order
|
||||||
|
|
||||||
|
**Pattern**: Infrastructure first, features last
|
||||||
|
1. **Infrastructure agents** (setupRepository, tooling-optimization)
|
||||||
|
2. **Core functionality** (keepaTodofile, keepaChangelog)
|
||||||
|
3. **Development process** (tdd-workflow, code-refactoring)
|
||||||
|
4. **Specialized features** (testing-efficiency, datamodel-optimization)
|
||||||
|
|
||||||
|
## Project Structure Respect Patterns
|
||||||
|
|
||||||
|
### Existing Directory Structures
|
||||||
|
|
||||||
|
**Pattern**: Adaptive installation
|
||||||
|
```bash
|
||||||
|
# Respect existing structure
|
||||||
|
project/
|
||||||
|
├── tools/agents/ # Existing agent directory
|
||||||
|
├── scripts/ # Existing automation
|
||||||
|
└── docs/ # Existing documentation
|
||||||
|
|
||||||
|
# Kaizen adaptation
|
||||||
|
kaizen-agentic install --target tools/agents/ keepaTodofile
|
||||||
|
# Creates: tools/agents/agent-keepaTodofile.md
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration File Integration
|
||||||
|
|
||||||
|
**Pattern**: Merge, don't replace
|
||||||
|
```bash
|
||||||
|
# Before
|
||||||
|
CLAUDE.md # Existing Claude config
|
||||||
|
project-config.yml # Existing project config
|
||||||
|
|
||||||
|
# After (merged)
|
||||||
|
CLAUDE.md # Updated with Kaizen agents
|
||||||
|
project-config.yml # Preserved
|
||||||
|
.kaizen/extensions.yml # New Kaizen-specific config
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build System Integration
|
||||||
|
|
||||||
|
**Pattern**: Extend existing targets
|
||||||
|
```makefile
|
||||||
|
# Existing Makefile
|
||||||
|
test:
|
||||||
|
pytest tests/
|
||||||
|
|
||||||
|
# After Kaizen integration (extended)
|
||||||
|
test: test-core test-agents
|
||||||
|
@echo "All tests completed"
|
||||||
|
|
||||||
|
test-core:
|
||||||
|
pytest tests/
|
||||||
|
|
||||||
|
test-agents:
|
||||||
|
kaizen-agentic validate
|
||||||
|
|
||||||
|
# New Kaizen targets
|
||||||
|
agents-status:
|
||||||
|
kaizen-agentic status
|
||||||
|
|
||||||
|
agents-update:
|
||||||
|
kaizen-agentic update
|
||||||
|
```
|
||||||
|
|
||||||
|
## Safe Transition Strategies
|
||||||
|
|
||||||
|
### Phased Rollout
|
||||||
|
|
||||||
|
**Phase 1: Detection and Planning**
|
||||||
|
```bash
|
||||||
|
# Week 1: Analysis
|
||||||
|
kaizen-agentic detect --detailed
|
||||||
|
kaizen-agentic migrate --dry-run
|
||||||
|
|
||||||
|
# Decision point: Continue or modify approach
|
||||||
|
```
|
||||||
|
|
||||||
|
**Phase 2: Infrastructure Agents**
|
||||||
|
```bash
|
||||||
|
# Week 2: Core infrastructure
|
||||||
|
kaizen-agentic install setupRepository
|
||||||
|
# Test and validate before proceeding
|
||||||
|
```
|
||||||
|
|
||||||
|
**Phase 3: Core Functionality**
|
||||||
|
```bash
|
||||||
|
# Week 3: Essential agents
|
||||||
|
kaizen-agentic install keepaTodofile keepaChangelog
|
||||||
|
# Create extensions for custom functionality
|
||||||
|
```
|
||||||
|
|
||||||
|
**Phase 4: Advanced Features**
|
||||||
|
```bash
|
||||||
|
# Week 4: Specialized agents
|
||||||
|
kaizen-agentic install tdd-workflow code-refactoring
|
||||||
|
# Full integration testing
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rollback Strategy
|
||||||
|
|
||||||
|
**Pattern**: Versioned backups with restore capability
|
||||||
|
```bash
|
||||||
|
# Before migration
|
||||||
|
.kaizen-migration-backup-timestamp/
|
||||||
|
├── agents/ # Original agents
|
||||||
|
├── CLAUDE.md # Original configuration
|
||||||
|
└── restoration.md # Rollback instructions
|
||||||
|
|
||||||
|
# Rollback command (if needed)
|
||||||
|
kaizen-agentic rollback --backup .kaizen-migration-backup-timestamp/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Validation Gates
|
||||||
|
|
||||||
|
**Pattern**: Automated validation at each phase
|
||||||
|
```bash
|
||||||
|
# After each phase
|
||||||
|
kaizen-agentic validate
|
||||||
|
make test
|
||||||
|
make agents-status
|
||||||
|
|
||||||
|
# Success criteria for proceeding:
|
||||||
|
# ✅ All agents load without errors
|
||||||
|
# ✅ All tests pass
|
||||||
|
# ✅ No functionality regressions
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Communication
|
||||||
|
|
||||||
|
1. **Team Notification**: Inform team before starting migration
|
||||||
|
2. **Documentation**: Update project docs with new agent workflows
|
||||||
|
3. **Training**: Provide team training on Kaizen agents
|
||||||
|
4. **Gradual Adoption**: Allow team to adapt gradually
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
|
||||||
|
1. **Backup Everything**: Create comprehensive backups
|
||||||
|
2. **Test Thoroughly**: Validate each integration step
|
||||||
|
3. **Monitor Impact**: Watch for performance or workflow impacts
|
||||||
|
4. **Version Control**: Commit changes in logical phases
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
1. **Regular Updates**: Keep Kaizen agents updated
|
||||||
|
2. **Extension Maintenance**: Maintain custom extensions
|
||||||
|
3. **Documentation Sync**: Keep docs synchronized with agent changes
|
||||||
|
4. **Team Feedback**: Collect and act on team feedback
|
||||||
|
|
||||||
|
## Troubleshooting Common Issues
|
||||||
|
|
||||||
|
### Agent Conflicts
|
||||||
|
|
||||||
|
**Issue**: Multiple agents trying to manage the same files.
|
||||||
|
|
||||||
|
**Solution**:
|
||||||
|
```bash
|
||||||
|
# Identify conflicts
|
||||||
|
kaizen-agentic detect --detailed
|
||||||
|
|
||||||
|
# Resolve with namespace separation
|
||||||
|
mkdir agents/legacy agents/kaizen
|
||||||
|
mv agents/todo_manager.py agents/legacy/
|
||||||
|
kaizen-agentic install --target agents/kaizen/ keepaTodofile
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration Conflicts
|
||||||
|
|
||||||
|
**Issue**: Conflicting configuration files.
|
||||||
|
|
||||||
|
**Solution**:
|
||||||
|
```bash
|
||||||
|
# Merge configurations
|
||||||
|
cp CLAUDE.md CLAUDE.md.backup
|
||||||
|
kaizen-agentic install keepaTodofile
|
||||||
|
# Manually merge CLAUDE.md.backup content
|
||||||
|
```
|
||||||
|
|
||||||
|
### Workflow Disruption
|
||||||
|
|
||||||
|
**Issue**: New agents disrupt existing workflows.
|
||||||
|
|
||||||
|
**Solution**:
|
||||||
|
```bash
|
||||||
|
# Create compatibility extensions
|
||||||
|
kaizen-agentic extensions create workflow-compat keepaTodofile
|
||||||
|
# Configure extension to match existing workflow
|
||||||
|
```
|
||||||
|
|
||||||
|
## Success Metrics
|
||||||
|
|
||||||
|
### Technical Metrics
|
||||||
|
- ✅ Zero agent loading errors
|
||||||
|
- ✅ All tests passing
|
||||||
|
- ✅ No performance regressions
|
||||||
|
- ✅ Successful backup/restore capability
|
||||||
|
|
||||||
|
### Team Metrics
|
||||||
|
- ✅ Team adoption of new agents
|
||||||
|
- ✅ Maintained productivity during transition
|
||||||
|
- ✅ Positive feedback on new capabilities
|
||||||
|
- ✅ Reduced maintenance overhead
|
||||||
|
|
||||||
|
### Project Metrics
|
||||||
|
- ✅ Improved code quality metrics
|
||||||
|
- ✅ Better documentation coverage
|
||||||
|
- ✅ Enhanced development workflow efficiency
|
||||||
|
- ✅ Standardized agent ecosystem
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
Successful integration of Kaizen agents into existing projects requires:
|
||||||
|
|
||||||
|
1. **Careful analysis** of existing agent systems
|
||||||
|
2. **Respectful approach** to existing project structure
|
||||||
|
3. **Gradual migration** with proper backup strategies
|
||||||
|
4. **Extension mechanisms** for preserving custom functionality
|
||||||
|
5. **Team communication** and training throughout the process
|
||||||
|
|
||||||
|
Follow these patterns and your integration will be smooth, reversible, and beneficial to your development workflow.
|
||||||
@@ -320,6 +320,281 @@ def status(target: str):
|
|||||||
click.echo(f" ❌ {config_file}")
|
click.echo(f" ❌ {config_file}")
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command()
|
||||||
|
@click.option('--target', '-t', default='.', help='Target directory (default: current)')
|
||||||
|
@click.option('--detailed', '-d', is_flag=True, help='Show detailed analysis')
|
||||||
|
def detect(target: str, detailed: bool):
|
||||||
|
"""Detect existing agent systems in a project."""
|
||||||
|
from .detection import AgentSystemDetector
|
||||||
|
|
||||||
|
target_path = Path(target).resolve()
|
||||||
|
|
||||||
|
if not target_path.exists():
|
||||||
|
click.echo(f"Error: Directory not found: {target_path}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
click.echo(f"Detecting agent systems in: {target_path}")
|
||||||
|
click.echo("=" * 50)
|
||||||
|
|
||||||
|
detector = AgentSystemDetector()
|
||||||
|
result = detector.detect_agent_systems(target_path)
|
||||||
|
|
||||||
|
# Show detected systems
|
||||||
|
if result.detected_systems:
|
||||||
|
click.echo(f"\n🔍 Detected Agent Systems ({len(result.detected_systems)}):")
|
||||||
|
for system in result.detected_systems:
|
||||||
|
click.echo(f" • {system.value}")
|
||||||
|
else:
|
||||||
|
click.echo("\n🔍 No existing agent systems detected")
|
||||||
|
|
||||||
|
# Show detected agents
|
||||||
|
if result.agents:
|
||||||
|
click.echo(f"\n🤖 Detected Agents ({len(result.agents)}):")
|
||||||
|
for agent in result.agents:
|
||||||
|
status = "✅" if agent.can_migrate else "⚠️"
|
||||||
|
click.echo(f" {status} {agent.name} ({agent.type.value})")
|
||||||
|
if detailed and agent.description:
|
||||||
|
click.echo(f" {agent.description}")
|
||||||
|
if not agent.can_migrate and agent.migration_notes:
|
||||||
|
click.echo(f" Note: {agent.migration_notes}")
|
||||||
|
|
||||||
|
# Show config files
|
||||||
|
if result.config_files:
|
||||||
|
click.echo(f"\n📄 Configuration Files ({len(result.config_files)}):")
|
||||||
|
for config_file in result.config_files:
|
||||||
|
click.echo(f" • {config_file.relative_to(target_path)}")
|
||||||
|
|
||||||
|
# Show conflicts
|
||||||
|
if result.conflicts:
|
||||||
|
click.echo(f"\n⚠️ Potential Conflicts ({len(result.conflicts)}):")
|
||||||
|
for agent1, agent2, reason in result.conflicts:
|
||||||
|
click.echo(f" • {agent1} vs {agent2}: {reason}")
|
||||||
|
|
||||||
|
# Show integration strategy
|
||||||
|
if result.integration_strategy:
|
||||||
|
click.echo(f"\n💡 Recommended Integration Strategy: {result.integration_strategy}")
|
||||||
|
|
||||||
|
# Show migration recommendations
|
||||||
|
if result.migration_recommendations:
|
||||||
|
click.echo(f"\n📋 Migration Recommendations:")
|
||||||
|
for recommendation in result.migration_recommendations:
|
||||||
|
if recommendation.startswith(" "):
|
||||||
|
click.echo(f" {recommendation}")
|
||||||
|
else:
|
||||||
|
click.echo(f" • {recommendation}")
|
||||||
|
|
||||||
|
if not result.detected_systems:
|
||||||
|
click.echo(f"\n✨ This project is ready for Kaizen Agentic installation!")
|
||||||
|
click.echo(f" Run: kaizen-agentic install <agent-names>")
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command()
|
||||||
|
@click.option('--target', '-t', default='.', help='Target directory (default: current)')
|
||||||
|
@click.option('--dry-run', '-n', is_flag=True, help='Show what would be done without executing')
|
||||||
|
@click.option('--auto-resolve', '-a', is_flag=True, help='Automatically resolve simple conflicts')
|
||||||
|
def migrate(target: str, dry_run: bool, auto_resolve: bool):
|
||||||
|
"""Create migration plan for integrating Kaizen agents into existing project."""
|
||||||
|
from .migration import AgentMigrationPlanner, AgentMigrator
|
||||||
|
|
||||||
|
target_path = Path(target).resolve()
|
||||||
|
|
||||||
|
if not target_path.exists():
|
||||||
|
click.echo(f"Error: Directory not found: {target_path}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
click.echo(f"Creating migration plan for: {target_path}")
|
||||||
|
click.echo("=" * 50)
|
||||||
|
|
||||||
|
planner = AgentMigrationPlanner()
|
||||||
|
integration_plan = planner.create_integration_plan(target_path)
|
||||||
|
|
||||||
|
if not integration_plan.migration_plans and not integration_plan.conflict_resolutions:
|
||||||
|
click.echo("✨ No migration needed - project is ready for Kaizen agents!")
|
||||||
|
click.echo(" Run: kaizen-agentic install <agent-names>")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Show migration plans
|
||||||
|
if integration_plan.migration_plans:
|
||||||
|
click.echo(f"\n🔄 Migration Plans ({len(integration_plan.migration_plans)}):")
|
||||||
|
for plan in integration_plan.migration_plans:
|
||||||
|
strategy_emoji = {
|
||||||
|
"replace": "🔄", "extend": "🔗", "preserve": "💾",
|
||||||
|
"merge": "🔀", "remove": "🗑️"
|
||||||
|
}
|
||||||
|
emoji = strategy_emoji.get(plan.strategy.value, "❓")
|
||||||
|
|
||||||
|
click.echo(f" {emoji} {plan.source_agent.name} ({plan.source_agent.type.value})")
|
||||||
|
click.echo(f" Strategy: {plan.strategy.value}")
|
||||||
|
if plan.target_agent:
|
||||||
|
click.echo(f" Target: {plan.target_agent}")
|
||||||
|
|
||||||
|
for note in plan.migration_notes:
|
||||||
|
click.echo(f" 📝 {note}")
|
||||||
|
|
||||||
|
# Show conflict resolutions
|
||||||
|
if integration_plan.conflict_resolutions:
|
||||||
|
click.echo(f"\n⚠️ Conflict Resolutions ({len(integration_plan.conflict_resolutions)}):")
|
||||||
|
for resolution in integration_plan.conflict_resolutions:
|
||||||
|
click.echo(f" • {resolution.agent1} vs {resolution.agent2}")
|
||||||
|
click.echo(f" Resolution: {resolution.resolution.value}")
|
||||||
|
if resolution.action_details:
|
||||||
|
for key, value in resolution.action_details.items():
|
||||||
|
click.echo(f" {key}: {value}")
|
||||||
|
|
||||||
|
# Show integration order
|
||||||
|
if integration_plan.integration_order:
|
||||||
|
click.echo(f"\n📋 Integration Order:")
|
||||||
|
for i, agent_name in enumerate(integration_plan.integration_order, 1):
|
||||||
|
click.echo(f" {i}. {agent_name}")
|
||||||
|
|
||||||
|
# Show post-migration tasks
|
||||||
|
if integration_plan.post_migration_tasks:
|
||||||
|
click.echo(f"\n✅ Post-Migration Tasks:")
|
||||||
|
for task in integration_plan.post_migration_tasks:
|
||||||
|
click.echo(f" • {task}")
|
||||||
|
|
||||||
|
# Execute migration if requested
|
||||||
|
if not dry_run:
|
||||||
|
click.echo(f"\n🚀 Executing migration...")
|
||||||
|
migrator = AgentMigrator()
|
||||||
|
results = migrator.execute_migration(integration_plan, dry_run=False)
|
||||||
|
|
||||||
|
click.echo(f"\n📊 Migration Results:")
|
||||||
|
for agent, result in results.items():
|
||||||
|
status_emoji = "✅" if "ERROR" not in result else "❌"
|
||||||
|
click.echo(f" {status_emoji} {agent}: {result}")
|
||||||
|
|
||||||
|
click.echo(f"\n💾 Backup created at: {integration_plan.backup_directory}")
|
||||||
|
else:
|
||||||
|
click.echo(f"\n🔍 This was a dry run. Use --no-dry-run to execute the migration.")
|
||||||
|
click.echo(f" Backup would be created at: {integration_plan.backup_directory}")
|
||||||
|
|
||||||
|
|
||||||
|
@cli.group()
|
||||||
|
def extensions():
|
||||||
|
"""Manage agent extensions."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@extensions.command()
|
||||||
|
@click.option('--target', '-t', default='.', help='Target directory (default: current)')
|
||||||
|
@click.option('--base-agent', '-b', help='Filter by base agent')
|
||||||
|
def list_extensions(target: str, base_agent: Optional[str]):
|
||||||
|
"""List installed extensions."""
|
||||||
|
from .extensions import ExtensionManager
|
||||||
|
|
||||||
|
target_path = Path(target).resolve()
|
||||||
|
manager = ExtensionManager(target_path)
|
||||||
|
|
||||||
|
extensions_list = manager.list_extensions(base_agent)
|
||||||
|
|
||||||
|
if not extensions_list:
|
||||||
|
if base_agent:
|
||||||
|
click.echo(f"No extensions found for agent: {base_agent}")
|
||||||
|
else:
|
||||||
|
click.echo("No extensions installed in this project")
|
||||||
|
return
|
||||||
|
|
||||||
|
click.echo(f"Extensions in {target_path}:")
|
||||||
|
click.echo("=" * 40)
|
||||||
|
|
||||||
|
for ext in extensions_list:
|
||||||
|
status = "✅" if ext.enabled else "❌"
|
||||||
|
click.echo(f"\n{status} {ext.name} (extends {ext.base_agent})")
|
||||||
|
click.echo(f" Type: {ext.extension_type.value}")
|
||||||
|
click.echo(f" Description: {ext.description}")
|
||||||
|
click.echo(f" Version: {ext.version}")
|
||||||
|
|
||||||
|
if ext.custom_commands:
|
||||||
|
click.echo(f" Custom commands: {', '.join(ext.custom_commands.keys())}")
|
||||||
|
|
||||||
|
|
||||||
|
@extensions.command()
|
||||||
|
@click.argument('name')
|
||||||
|
@click.argument('base_agent')
|
||||||
|
@click.option('--target', '-t', default='.', help='Target directory (default: current)')
|
||||||
|
@click.option('--description', '-d', help='Extension description')
|
||||||
|
@click.option('--template', default='basic', help='Template type (basic, advanced)')
|
||||||
|
def create(name: str, base_agent: str, target: str, description: Optional[str], template: str):
|
||||||
|
"""Create a new agent extension."""
|
||||||
|
from .extensions import ExtensionManager, ExtensionType, create_extension_template
|
||||||
|
|
||||||
|
target_path = Path(target).resolve()
|
||||||
|
manager = ExtensionManager(target_path)
|
||||||
|
|
||||||
|
# Generate template
|
||||||
|
template_content = create_extension_template(name, base_agent, target_path, template)
|
||||||
|
|
||||||
|
# Save template to file
|
||||||
|
template_dir = target_path / ".kaizen" / "extensions" / name
|
||||||
|
template_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
template_file = template_dir / "template.md"
|
||||||
|
template_file.write_text(template_content)
|
||||||
|
|
||||||
|
# Create basic extension
|
||||||
|
manager.create_extension(
|
||||||
|
name=name,
|
||||||
|
base_agent=base_agent,
|
||||||
|
extension_type=ExtensionType.FUNCTIONAL_EXTENSION,
|
||||||
|
description=description or f"Custom extension for {base_agent}"
|
||||||
|
)
|
||||||
|
|
||||||
|
click.echo(f"✅ Created extension: {name}")
|
||||||
|
click.echo(f" Base agent: {base_agent}")
|
||||||
|
click.echo(f" Template saved to: {template_file}")
|
||||||
|
click.echo(f" Edit the configuration and run: kaizen-agentic extensions enable {name}")
|
||||||
|
|
||||||
|
|
||||||
|
@extensions.command()
|
||||||
|
@click.argument('name')
|
||||||
|
@click.option('--target', '-t', default='.', help='Target directory (default: current)')
|
||||||
|
def enable(name: str, target: str):
|
||||||
|
"""Enable an extension."""
|
||||||
|
from .extensions import ExtensionManager
|
||||||
|
|
||||||
|
target_path = Path(target).resolve()
|
||||||
|
manager = ExtensionManager(target_path)
|
||||||
|
|
||||||
|
if manager.enable_extension(name):
|
||||||
|
click.echo(f"✅ Enabled extension: {name}")
|
||||||
|
else:
|
||||||
|
click.echo(f"❌ Extension not found: {name}")
|
||||||
|
|
||||||
|
|
||||||
|
@extensions.command()
|
||||||
|
@click.argument('name')
|
||||||
|
@click.option('--target', '-t', default='.', help='Target directory (default: current)')
|
||||||
|
def disable(name: str, target: str):
|
||||||
|
"""Disable an extension."""
|
||||||
|
from .extensions import ExtensionManager
|
||||||
|
|
||||||
|
target_path = Path(target).resolve()
|
||||||
|
manager = ExtensionManager(target_path)
|
||||||
|
|
||||||
|
if manager.disable_extension(name):
|
||||||
|
click.echo(f"❌ Disabled extension: {name}")
|
||||||
|
else:
|
||||||
|
click.echo(f"❌ Extension not found: {name}")
|
||||||
|
|
||||||
|
|
||||||
|
@extensions.command()
|
||||||
|
@click.argument('name')
|
||||||
|
@click.option('--target', '-t', default='.', help='Target directory (default: current)')
|
||||||
|
@click.confirmation_option(prompt='Are you sure you want to remove this extension?')
|
||||||
|
def remove(name: str, target: str):
|
||||||
|
"""Remove an extension."""
|
||||||
|
from .extensions import ExtensionManager
|
||||||
|
|
||||||
|
target_path = Path(target).resolve()
|
||||||
|
manager = ExtensionManager(target_path)
|
||||||
|
|
||||||
|
if manager.remove_extension(name):
|
||||||
|
click.echo(f"🗑️ Removed extension: {name}")
|
||||||
|
else:
|
||||||
|
click.echo(f"❌ Extension not found: {name}")
|
||||||
|
|
||||||
|
|
||||||
def _get_registry() -> AgentRegistry:
|
def _get_registry() -> AgentRegistry:
|
||||||
"""Get the agent registry."""
|
"""Get the agent registry."""
|
||||||
# Try to find agents directory
|
# Try to find agents directory
|
||||||
|
|||||||
386
src/kaizen_agentic/detection.py
Normal file
386
src/kaizen_agentic/detection.py
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
"""Detection and analysis of existing agent systems in projects."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import yaml
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List, Optional, Set, Tuple
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
class AgentSystemType(Enum):
|
||||||
|
"""Types of existing agent systems that might be found."""
|
||||||
|
KAIZEN_AGENTIC = "kaizen-agentic"
|
||||||
|
CLAUDE_CODE = "claude-code"
|
||||||
|
GITHUB_COPILOT = "github-copilot"
|
||||||
|
CUSTOM_AGENTS = "custom-agents"
|
||||||
|
ANTHROPIC_WORKBENCH = "anthropic-workbench"
|
||||||
|
OPENAI_ASSISTANTS = "openai-assistants"
|
||||||
|
LANGCHAIN_AGENTS = "langchain-agents"
|
||||||
|
AUTOGEN = "autogen"
|
||||||
|
CREWAI = "crewai"
|
||||||
|
OTHER = "other"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class DetectedAgent:
|
||||||
|
"""Information about a detected agent."""
|
||||||
|
name: str
|
||||||
|
type: AgentSystemType
|
||||||
|
file_path: Path
|
||||||
|
description: Optional[str] = None
|
||||||
|
dependencies: Set[str] = None
|
||||||
|
conflicts_with: Set[str] = None
|
||||||
|
can_migrate: bool = True
|
||||||
|
migration_notes: Optional[str] = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.dependencies is None:
|
||||||
|
self.dependencies = set()
|
||||||
|
if self.conflicts_with is None:
|
||||||
|
self.conflicts_with = set()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AgentSystemDetectionResult:
|
||||||
|
"""Result of agent system detection in a project."""
|
||||||
|
project_path: Path
|
||||||
|
detected_systems: List[AgentSystemType]
|
||||||
|
agents: List[DetectedAgent]
|
||||||
|
config_files: List[Path]
|
||||||
|
conflicts: List[Tuple[str, str, str]] # (agent1, agent2, reason)
|
||||||
|
integration_strategy: Optional[str] = None
|
||||||
|
migration_recommendations: List[str] = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.migration_recommendations is None:
|
||||||
|
self.migration_recommendations = []
|
||||||
|
|
||||||
|
|
||||||
|
class AgentSystemDetector:
|
||||||
|
"""Detects existing agent systems in projects."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.detection_patterns = {
|
||||||
|
AgentSystemType.KAIZEN_AGENTIC: [
|
||||||
|
"agents/agent-*.md",
|
||||||
|
"CLAUDE.md",
|
||||||
|
".kaizen-agentic.yml",
|
||||||
|
],
|
||||||
|
AgentSystemType.CLAUDE_CODE: [
|
||||||
|
"CLAUDE.md",
|
||||||
|
".claude",
|
||||||
|
"claude_config.json",
|
||||||
|
".claude.json",
|
||||||
|
],
|
||||||
|
AgentSystemType.GITHUB_COPILOT: [
|
||||||
|
".github/copilot.yml",
|
||||||
|
".copilot/",
|
||||||
|
"copilot.yml",
|
||||||
|
],
|
||||||
|
AgentSystemType.CUSTOM_AGENTS: [
|
||||||
|
"agents/",
|
||||||
|
"ai_agents/",
|
||||||
|
"assistants/",
|
||||||
|
"bots/",
|
||||||
|
],
|
||||||
|
AgentSystemType.ANTHROPIC_WORKBENCH: [
|
||||||
|
".anthropic/",
|
||||||
|
"anthropic.yml",
|
||||||
|
"workbench.yml",
|
||||||
|
],
|
||||||
|
AgentSystemType.OPENAI_ASSISTANTS: [
|
||||||
|
"openai_assistants/",
|
||||||
|
".openai/",
|
||||||
|
"gpt_config.json",
|
||||||
|
],
|
||||||
|
AgentSystemType.LANGCHAIN_AGENTS: [
|
||||||
|
"langchain_agents/",
|
||||||
|
"langchain.yml",
|
||||||
|
"chains/",
|
||||||
|
],
|
||||||
|
AgentSystemType.AUTOGEN: [
|
||||||
|
"autogen_agents/",
|
||||||
|
".autogen/",
|
||||||
|
"autogen.yml",
|
||||||
|
],
|
||||||
|
AgentSystemType.CREWAI: [
|
||||||
|
"crew.yml",
|
||||||
|
"crewai.yml",
|
||||||
|
"crew/",
|
||||||
|
"agents.yml",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
def detect_agent_systems(self, project_path: Path) -> AgentSystemDetectionResult:
|
||||||
|
"""Detect all agent systems in a project."""
|
||||||
|
project_path = Path(project_path)
|
||||||
|
|
||||||
|
detected_systems = []
|
||||||
|
agents = []
|
||||||
|
config_files = []
|
||||||
|
|
||||||
|
# Detect each type of agent system
|
||||||
|
for system_type, patterns in self.detection_patterns.items():
|
||||||
|
if self._detect_system_type(project_path, patterns):
|
||||||
|
detected_systems.append(system_type)
|
||||||
|
|
||||||
|
# Extract agents for this system type
|
||||||
|
system_agents = self._extract_agents_for_system(
|
||||||
|
project_path, system_type
|
||||||
|
)
|
||||||
|
agents.extend(system_agents)
|
||||||
|
|
||||||
|
# Find config files for this system type
|
||||||
|
system_configs = self._find_config_files_for_system(
|
||||||
|
project_path, system_type
|
||||||
|
)
|
||||||
|
config_files.extend(system_configs)
|
||||||
|
|
||||||
|
# Analyze conflicts
|
||||||
|
conflicts = self._analyze_conflicts(agents)
|
||||||
|
|
||||||
|
# Generate integration strategy
|
||||||
|
integration_strategy = self._generate_integration_strategy(
|
||||||
|
detected_systems, agents
|
||||||
|
)
|
||||||
|
|
||||||
|
# Generate migration recommendations
|
||||||
|
migration_recommendations = self._generate_migration_recommendations(
|
||||||
|
detected_systems, agents, conflicts
|
||||||
|
)
|
||||||
|
|
||||||
|
return AgentSystemDetectionResult(
|
||||||
|
project_path=project_path,
|
||||||
|
detected_systems=detected_systems,
|
||||||
|
agents=agents,
|
||||||
|
config_files=config_files,
|
||||||
|
conflicts=conflicts,
|
||||||
|
integration_strategy=integration_strategy,
|
||||||
|
migration_recommendations=migration_recommendations,
|
||||||
|
)
|
||||||
|
|
||||||
|
def _detect_system_type(self, project_path: Path, patterns: List[str]) -> bool:
|
||||||
|
"""Check if a system type exists based on file patterns."""
|
||||||
|
for pattern in patterns:
|
||||||
|
matches = list(project_path.glob(pattern))
|
||||||
|
if matches:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _extract_agents_for_system(
|
||||||
|
self, project_path: Path, system_type: AgentSystemType
|
||||||
|
) -> List[DetectedAgent]:
|
||||||
|
"""Extract agents for a specific system type."""
|
||||||
|
agents = []
|
||||||
|
|
||||||
|
if system_type == AgentSystemType.KAIZEN_AGENTIC:
|
||||||
|
agents.extend(self._extract_kaizen_agents(project_path))
|
||||||
|
elif system_type == AgentSystemType.CLAUDE_CODE:
|
||||||
|
agents.extend(self._extract_claude_agents(project_path))
|
||||||
|
elif system_type == AgentSystemType.CUSTOM_AGENTS:
|
||||||
|
agents.extend(self._extract_custom_agents(project_path))
|
||||||
|
# Add more system-specific extraction methods as needed
|
||||||
|
|
||||||
|
return agents
|
||||||
|
|
||||||
|
def _extract_kaizen_agents(self, project_path: Path) -> List[DetectedAgent]:
|
||||||
|
"""Extract Kaizen Agentic agents."""
|
||||||
|
agents = []
|
||||||
|
agents_dir = project_path / "agents"
|
||||||
|
|
||||||
|
if agents_dir.exists():
|
||||||
|
for agent_file in agents_dir.glob("agent-*.md"):
|
||||||
|
try:
|
||||||
|
agent = self._parse_kaizen_agent_file(agent_file)
|
||||||
|
if agent:
|
||||||
|
agents.append(agent)
|
||||||
|
except Exception as e:
|
||||||
|
# Create a detected agent with error info
|
||||||
|
agents.append(DetectedAgent(
|
||||||
|
name=agent_file.stem.replace("agent-", ""),
|
||||||
|
type=AgentSystemType.KAIZEN_AGENTIC,
|
||||||
|
file_path=agent_file,
|
||||||
|
can_migrate=False,
|
||||||
|
migration_notes=f"Parse error: {e}"
|
||||||
|
))
|
||||||
|
|
||||||
|
return agents
|
||||||
|
|
||||||
|
def _parse_kaizen_agent_file(self, agent_file: Path) -> Optional[DetectedAgent]:
|
||||||
|
"""Parse a Kaizen Agentic agent file."""
|
||||||
|
try:
|
||||||
|
content = agent_file.read_text(encoding='utf-8')
|
||||||
|
|
||||||
|
# Extract YAML frontmatter
|
||||||
|
if content.startswith('---'):
|
||||||
|
parts = content.split('---', 2)
|
||||||
|
if len(parts) >= 3:
|
||||||
|
frontmatter = yaml.safe_load(parts[1])
|
||||||
|
|
||||||
|
return DetectedAgent(
|
||||||
|
name=frontmatter.get('name', agent_file.stem.replace("agent-", "")),
|
||||||
|
type=AgentSystemType.KAIZEN_AGENTIC,
|
||||||
|
file_path=agent_file,
|
||||||
|
description=frontmatter.get('description'),
|
||||||
|
dependencies=set(frontmatter.get('dependencies', []))
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _extract_claude_agents(self, project_path: Path) -> List[DetectedAgent]:
|
||||||
|
"""Extract Claude Code agents (if any defined in CLAUDE.md)."""
|
||||||
|
agents = []
|
||||||
|
claude_file = project_path / "CLAUDE.md"
|
||||||
|
|
||||||
|
if claude_file.exists():
|
||||||
|
# Claude Code typically doesn't have separate agent files
|
||||||
|
# but might reference agent usage in CLAUDE.md
|
||||||
|
agents.append(DetectedAgent(
|
||||||
|
name="claude-integration",
|
||||||
|
type=AgentSystemType.CLAUDE_CODE,
|
||||||
|
file_path=claude_file,
|
||||||
|
description="Claude Code integration configuration"
|
||||||
|
))
|
||||||
|
|
||||||
|
return agents
|
||||||
|
|
||||||
|
def _extract_custom_agents(self, project_path: Path) -> List[DetectedAgent]:
|
||||||
|
"""Extract custom agent implementations."""
|
||||||
|
agents = []
|
||||||
|
|
||||||
|
# Look for common agent directories
|
||||||
|
agent_dirs = ["agents", "ai_agents", "assistants", "bots"]
|
||||||
|
|
||||||
|
for dir_name in agent_dirs:
|
||||||
|
agent_dir = project_path / dir_name
|
||||||
|
if agent_dir.exists() and agent_dir.is_dir():
|
||||||
|
# Look for various file types that might be agents
|
||||||
|
for pattern in ["*.py", "*.yml", "*.yaml", "*.json", "*.md"]:
|
||||||
|
for agent_file in agent_dir.glob(pattern):
|
||||||
|
# Skip kaizen-agentic files
|
||||||
|
if agent_file.name.startswith("agent-") and agent_file.suffix == ".md":
|
||||||
|
continue
|
||||||
|
|
||||||
|
agents.append(DetectedAgent(
|
||||||
|
name=agent_file.stem,
|
||||||
|
type=AgentSystemType.CUSTOM_AGENTS,
|
||||||
|
file_path=agent_file,
|
||||||
|
description=f"Custom agent in {dir_name}/"
|
||||||
|
))
|
||||||
|
|
||||||
|
return agents
|
||||||
|
|
||||||
|
def _find_config_files_for_system(
|
||||||
|
self, project_path: Path, system_type: AgentSystemType
|
||||||
|
) -> List[Path]:
|
||||||
|
"""Find configuration files for a system type."""
|
||||||
|
config_files = []
|
||||||
|
patterns = self.detection_patterns.get(system_type, [])
|
||||||
|
|
||||||
|
for pattern in patterns:
|
||||||
|
matches = list(project_path.glob(pattern))
|
||||||
|
config_files.extend(matches)
|
||||||
|
|
||||||
|
return config_files
|
||||||
|
|
||||||
|
def _analyze_conflicts(self, agents: List[DetectedAgent]) -> List[Tuple[str, str, str]]:
|
||||||
|
"""Analyze potential conflicts between agents."""
|
||||||
|
conflicts = []
|
||||||
|
|
||||||
|
# Group agents by type
|
||||||
|
agents_by_type = {}
|
||||||
|
for agent in agents:
|
||||||
|
if agent.type not in agents_by_type:
|
||||||
|
agents_by_type[agent.type] = []
|
||||||
|
agents_by_type[agent.type].append(agent)
|
||||||
|
|
||||||
|
# Check for naming conflicts
|
||||||
|
all_names = [agent.name for agent in agents]
|
||||||
|
for i, agent1 in enumerate(agents):
|
||||||
|
for j, agent2 in enumerate(agents[i+1:], i+1):
|
||||||
|
if agent1.name == agent2.name and agent1.type != agent2.type:
|
||||||
|
conflicts.append((
|
||||||
|
agent1.name,
|
||||||
|
agent2.name,
|
||||||
|
f"Name conflict between {agent1.type.value} and {agent2.type.value}"
|
||||||
|
))
|
||||||
|
|
||||||
|
# Check for functional overlaps
|
||||||
|
functional_conflicts = {
|
||||||
|
("todo", "task", "project"): "Project management functionality",
|
||||||
|
("changelog", "version", "release"): "Version tracking functionality",
|
||||||
|
("test", "testing", "qa"): "Testing functionality",
|
||||||
|
("doc", "documentation", "readme"): "Documentation functionality",
|
||||||
|
}
|
||||||
|
|
||||||
|
for keywords, conflict_type in functional_conflicts.items():
|
||||||
|
matching_agents = []
|
||||||
|
for agent in agents:
|
||||||
|
if any(keyword in agent.name.lower() for keyword in keywords):
|
||||||
|
matching_agents.append(agent)
|
||||||
|
|
||||||
|
if len(matching_agents) > 1:
|
||||||
|
for i, agent1 in enumerate(matching_agents):
|
||||||
|
for agent2 in matching_agents[i+1:]:
|
||||||
|
conflicts.append((
|
||||||
|
agent1.name,
|
||||||
|
agent2.name,
|
||||||
|
f"Functional overlap: {conflict_type}"
|
||||||
|
))
|
||||||
|
|
||||||
|
return conflicts
|
||||||
|
|
||||||
|
def _generate_integration_strategy(
|
||||||
|
self, detected_systems: List[AgentSystemType], agents: List[DetectedAgent]
|
||||||
|
) -> str:
|
||||||
|
"""Generate an integration strategy based on detected systems."""
|
||||||
|
if not detected_systems:
|
||||||
|
return "clean_install"
|
||||||
|
|
||||||
|
if AgentSystemType.KAIZEN_AGENTIC in detected_systems:
|
||||||
|
return "update_existing"
|
||||||
|
|
||||||
|
if len(detected_systems) == 1 and detected_systems[0] == AgentSystemType.CLAUDE_CODE:
|
||||||
|
return "claude_compatible"
|
||||||
|
|
||||||
|
if len([a for a in agents if a.type == AgentSystemType.CUSTOM_AGENTS]) > 5:
|
||||||
|
return "gradual_migration"
|
||||||
|
|
||||||
|
return "selective_integration"
|
||||||
|
|
||||||
|
def _generate_migration_recommendations(
|
||||||
|
self,
|
||||||
|
detected_systems: List[AgentSystemType],
|
||||||
|
agents: List[DetectedAgent],
|
||||||
|
conflicts: List[Tuple[str, str, str]]
|
||||||
|
) -> List[str]:
|
||||||
|
"""Generate migration recommendations."""
|
||||||
|
recommendations = []
|
||||||
|
|
||||||
|
if not detected_systems:
|
||||||
|
recommendations.append("Clean installation - no existing agent systems detected")
|
||||||
|
return recommendations
|
||||||
|
|
||||||
|
if AgentSystemType.KAIZEN_AGENTIC in detected_systems:
|
||||||
|
recommendations.append("Update existing Kaizen Agentic installation")
|
||||||
|
recommendations.append("Run 'kaizen-agentic update' to get latest agents")
|
||||||
|
|
||||||
|
if conflicts:
|
||||||
|
recommendations.append(f"Resolve {len(conflicts)} naming/functional conflicts")
|
||||||
|
for agent1, agent2, reason in conflicts:
|
||||||
|
recommendations.append(f" - Conflict: {agent1} vs {agent2} ({reason})")
|
||||||
|
|
||||||
|
custom_agents = [a for a in agents if a.type == AgentSystemType.CUSTOM_AGENTS]
|
||||||
|
if custom_agents:
|
||||||
|
recommendations.append(f"Consider migrating {len(custom_agents)} custom agents")
|
||||||
|
recommendations.append(" - Review custom agents for Kaizen Agentic equivalents")
|
||||||
|
recommendations.append(" - Create project-specific extensions for unique functionality")
|
||||||
|
|
||||||
|
if AgentSystemType.CLAUDE_CODE in detected_systems:
|
||||||
|
recommendations.append("Maintain Claude Code compatibility")
|
||||||
|
recommendations.append(" - Update CLAUDE.md with new agent references")
|
||||||
|
|
||||||
|
return recommendations
|
||||||
616
src/kaizen_agentic/extensions.py
Normal file
616
src/kaizen_agentic/extensions.py
Normal file
@@ -0,0 +1,616 @@
|
|||||||
|
"""Extension mechanisms for project-specific Kaizen agent customizations."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import yaml
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List, Optional, Any, Union
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
class ExtensionType(Enum):
|
||||||
|
"""Types of agent extensions."""
|
||||||
|
CONFIGURATION_OVERLAY = "config_overlay" # Override default configurations
|
||||||
|
FUNCTIONAL_EXTENSION = "functional_extension" # Add new functionality
|
||||||
|
WORKFLOW_INTEGRATION = "workflow_integration" # Integrate with project workflows
|
||||||
|
CUSTOM_COMMANDS = "custom_commands" # Add custom commands
|
||||||
|
DATA_TRANSFORMATION = "data_transformation" # Transform data formats
|
||||||
|
ENVIRONMENT_ADAPTATION = "env_adaptation" # Adapt to specific environments
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AgentExtension:
|
||||||
|
"""Defines an extension to a Kaizen agent."""
|
||||||
|
name: str
|
||||||
|
base_agent: str # The Kaizen agent this extends
|
||||||
|
extension_type: ExtensionType
|
||||||
|
description: str
|
||||||
|
version: str = "1.0.0"
|
||||||
|
author: Optional[str] = None
|
||||||
|
|
||||||
|
# Extension configuration
|
||||||
|
configuration: Dict[str, Any] = field(default_factory=dict)
|
||||||
|
custom_commands: Dict[str, str] = field(default_factory=dict)
|
||||||
|
workflow_hooks: Dict[str, str] = field(default_factory=dict)
|
||||||
|
data_transformations: Dict[str, str] = field(default_factory=dict)
|
||||||
|
environment_overrides: Dict[str, Any] = field(default_factory=dict)
|
||||||
|
|
||||||
|
# Metadata
|
||||||
|
dependencies: List[str] = field(default_factory=list)
|
||||||
|
compatibility: List[str] = field(default_factory=list) # Compatible Kaizen versions
|
||||||
|
enabled: bool = True
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ProjectExtensionRegistry:
|
||||||
|
"""Registry of extensions for a project."""
|
||||||
|
project_path: Path
|
||||||
|
extensions: List[AgentExtension] = field(default_factory=list)
|
||||||
|
global_config: Dict[str, Any] = field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
|
class ExtensionManager:
|
||||||
|
"""Manages agent extensions for projects."""
|
||||||
|
|
||||||
|
def __init__(self, project_path: Path):
|
||||||
|
self.project_path = Path(project_path)
|
||||||
|
self.extensions_dir = self.project_path / ".kaizen" / "extensions"
|
||||||
|
self.config_file = self.project_path / ".kaizen" / "extensions.yml"
|
||||||
|
|
||||||
|
def create_extension(
|
||||||
|
self,
|
||||||
|
name: str,
|
||||||
|
base_agent: str,
|
||||||
|
extension_type: ExtensionType,
|
||||||
|
description: str,
|
||||||
|
**kwargs
|
||||||
|
) -> AgentExtension:
|
||||||
|
"""Create a new agent extension."""
|
||||||
|
extension = AgentExtension(
|
||||||
|
name=name,
|
||||||
|
base_agent=base_agent,
|
||||||
|
extension_type=extension_type,
|
||||||
|
description=description,
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
self._save_extension(extension)
|
||||||
|
return extension
|
||||||
|
|
||||||
|
def install_extension(self, extension_path: Path) -> AgentExtension:
|
||||||
|
"""Install an extension from a file."""
|
||||||
|
if extension_path.suffix == '.json':
|
||||||
|
with open(extension_path) as f:
|
||||||
|
data = json.load(f)
|
||||||
|
elif extension_path.suffix in ['.yml', '.yaml']:
|
||||||
|
with open(extension_path) as f:
|
||||||
|
data = yaml.safe_load(f)
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unsupported extension file format: {extension_path.suffix}")
|
||||||
|
|
||||||
|
extension = AgentExtension(**data)
|
||||||
|
self._save_extension(extension)
|
||||||
|
return extension
|
||||||
|
|
||||||
|
def list_extensions(self, base_agent: Optional[str] = None) -> List[AgentExtension]:
|
||||||
|
"""List all extensions, optionally filtered by base agent."""
|
||||||
|
extensions = self._load_extensions()
|
||||||
|
|
||||||
|
if base_agent:
|
||||||
|
return [ext for ext in extensions if ext.base_agent == base_agent]
|
||||||
|
|
||||||
|
return extensions
|
||||||
|
|
||||||
|
def get_extension(self, name: str) -> Optional[AgentExtension]:
|
||||||
|
"""Get a specific extension by name."""
|
||||||
|
extensions = self._load_extensions()
|
||||||
|
return next((ext for ext in extensions if ext.name == name), None)
|
||||||
|
|
||||||
|
def enable_extension(self, name: str) -> bool:
|
||||||
|
"""Enable an extension."""
|
||||||
|
return self._toggle_extension(name, True)
|
||||||
|
|
||||||
|
def disable_extension(self, name: str) -> bool:
|
||||||
|
"""Disable an extension."""
|
||||||
|
return self._toggle_extension(name, False)
|
||||||
|
|
||||||
|
def remove_extension(self, name: str) -> bool:
|
||||||
|
"""Remove an extension."""
|
||||||
|
extensions = self._load_extensions()
|
||||||
|
original_count = len(extensions)
|
||||||
|
extensions = [ext for ext in extensions if ext.name != name]
|
||||||
|
|
||||||
|
if len(extensions) < original_count:
|
||||||
|
self._save_extensions(extensions)
|
||||||
|
|
||||||
|
# Remove extension files
|
||||||
|
extension_dir = self.extensions_dir / name
|
||||||
|
if extension_dir.exists():
|
||||||
|
import shutil
|
||||||
|
shutil.rmtree(extension_dir)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_effective_config(self, base_agent: str) -> Dict[str, Any]:
|
||||||
|
"""Get the effective configuration for an agent with all extensions applied."""
|
||||||
|
base_config = self._get_base_agent_config(base_agent)
|
||||||
|
extensions = [ext for ext in self._load_extensions()
|
||||||
|
if ext.base_agent == base_agent and ext.enabled]
|
||||||
|
|
||||||
|
# Apply extensions in order
|
||||||
|
for extension in extensions:
|
||||||
|
base_config = self._apply_extension_config(base_config, extension)
|
||||||
|
|
||||||
|
return base_config
|
||||||
|
|
||||||
|
def create_project_specific_agent(
|
||||||
|
self,
|
||||||
|
name: str,
|
||||||
|
base_agent: str,
|
||||||
|
custom_instructions: str,
|
||||||
|
custom_commands: Optional[Dict[str, str]] = None,
|
||||||
|
environment_config: Optional[Dict[str, Any]] = None
|
||||||
|
) -> AgentExtension:
|
||||||
|
"""Create a project-specific agent based on a Kaizen agent."""
|
||||||
|
|
||||||
|
# Create extension configuration
|
||||||
|
config = {
|
||||||
|
"custom_instructions": custom_instructions,
|
||||||
|
"project_context": {
|
||||||
|
"name": self.project_path.name,
|
||||||
|
"path": str(self.project_path),
|
||||||
|
"type": self._detect_project_type()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if environment_config:
|
||||||
|
config["environment"] = environment_config
|
||||||
|
|
||||||
|
extension = self.create_extension(
|
||||||
|
name=name,
|
||||||
|
base_agent=base_agent,
|
||||||
|
extension_type=ExtensionType.FUNCTIONAL_EXTENSION,
|
||||||
|
description=f"Project-specific extension of {base_agent} for {self.project_path.name}",
|
||||||
|
configuration=config,
|
||||||
|
custom_commands=custom_commands or {},
|
||||||
|
environment_overrides=environment_config or {}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create agent file
|
||||||
|
self._create_extended_agent_file(extension)
|
||||||
|
|
||||||
|
return extension
|
||||||
|
|
||||||
|
def integrate_legacy_agent(
|
||||||
|
self,
|
||||||
|
legacy_agent_path: Path,
|
||||||
|
target_kaizen_agent: str,
|
||||||
|
migration_strategy: str = "preserve_functionality"
|
||||||
|
) -> AgentExtension:
|
||||||
|
"""Integrate a legacy agent as an extension to a Kaizen agent."""
|
||||||
|
|
||||||
|
# Analyze legacy agent
|
||||||
|
legacy_analysis = self._analyze_legacy_agent(legacy_agent_path)
|
||||||
|
|
||||||
|
# Create extension based on analysis
|
||||||
|
extension_name = f"{legacy_agent_path.stem}_integration"
|
||||||
|
|
||||||
|
config = {
|
||||||
|
"legacy_source": str(legacy_agent_path),
|
||||||
|
"migration_strategy": migration_strategy,
|
||||||
|
"preserved_functionality": legacy_analysis.get("functionality", []),
|
||||||
|
"custom_config": legacy_analysis.get("config", {})
|
||||||
|
}
|
||||||
|
|
||||||
|
extension = self.create_extension(
|
||||||
|
name=extension_name,
|
||||||
|
base_agent=target_kaizen_agent,
|
||||||
|
extension_type=ExtensionType.WORKFLOW_INTEGRATION,
|
||||||
|
description=f"Legacy integration of {legacy_agent_path.name}",
|
||||||
|
configuration=config
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create migration wrapper
|
||||||
|
self._create_migration_wrapper(extension, legacy_agent_path)
|
||||||
|
|
||||||
|
return extension
|
||||||
|
|
||||||
|
def _save_extension(self, extension: AgentExtension):
|
||||||
|
"""Save an extension to the registry."""
|
||||||
|
extensions = self._load_extensions()
|
||||||
|
|
||||||
|
# Remove existing extension with same name
|
||||||
|
extensions = [ext for ext in extensions if ext.name != extension.name]
|
||||||
|
extensions.append(extension)
|
||||||
|
|
||||||
|
self._save_extensions(extensions)
|
||||||
|
|
||||||
|
# Create extension directory and files
|
||||||
|
extension_dir = self.extensions_dir / extension.name
|
||||||
|
extension_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Save extension definition
|
||||||
|
with open(extension_dir / "extension.yml", 'w') as f:
|
||||||
|
# Convert dataclass to dict for YAML serialization
|
||||||
|
data = {
|
||||||
|
'name': extension.name,
|
||||||
|
'base_agent': extension.base_agent,
|
||||||
|
'extension_type': extension.extension_type.value,
|
||||||
|
'description': extension.description,
|
||||||
|
'version': extension.version,
|
||||||
|
'author': extension.author,
|
||||||
|
'configuration': extension.configuration,
|
||||||
|
'custom_commands': extension.custom_commands,
|
||||||
|
'workflow_hooks': extension.workflow_hooks,
|
||||||
|
'data_transformations': extension.data_transformations,
|
||||||
|
'environment_overrides': extension.environment_overrides,
|
||||||
|
'dependencies': extension.dependencies,
|
||||||
|
'compatibility': extension.compatibility,
|
||||||
|
'enabled': extension.enabled
|
||||||
|
}
|
||||||
|
yaml.dump(data, f, default_flow_style=False)
|
||||||
|
|
||||||
|
def _load_extensions(self) -> List[AgentExtension]:
|
||||||
|
"""Load all extensions from the registry."""
|
||||||
|
if not self.config_file.exists():
|
||||||
|
return []
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(self.config_file) as f:
|
||||||
|
data = yaml.safe_load(f) or {}
|
||||||
|
|
||||||
|
extensions = []
|
||||||
|
for ext_data in data.get('extensions', []):
|
||||||
|
# Convert string back to enum
|
||||||
|
ext_data['extension_type'] = ExtensionType(ext_data['extension_type'])
|
||||||
|
extensions.append(AgentExtension(**ext_data))
|
||||||
|
|
||||||
|
return extensions
|
||||||
|
except Exception:
|
||||||
|
return []
|
||||||
|
|
||||||
|
def _save_extensions(self, extensions: List[AgentExtension]):
|
||||||
|
"""Save extensions to the registry."""
|
||||||
|
self.config_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Convert to serializable format
|
||||||
|
data = {
|
||||||
|
'extensions': [
|
||||||
|
{
|
||||||
|
'name': ext.name,
|
||||||
|
'base_agent': ext.base_agent,
|
||||||
|
'extension_type': ext.extension_type.value,
|
||||||
|
'description': ext.description,
|
||||||
|
'version': ext.version,
|
||||||
|
'author': ext.author,
|
||||||
|
'configuration': ext.configuration,
|
||||||
|
'custom_commands': ext.custom_commands,
|
||||||
|
'workflow_hooks': ext.workflow_hooks,
|
||||||
|
'data_transformations': ext.data_transformations,
|
||||||
|
'environment_overrides': ext.environment_overrides,
|
||||||
|
'dependencies': ext.dependencies,
|
||||||
|
'compatibility': ext.compatibility,
|
||||||
|
'enabled': ext.enabled
|
||||||
|
}
|
||||||
|
for ext in extensions
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
with open(self.config_file, 'w') as f:
|
||||||
|
yaml.dump(data, f, default_flow_style=False)
|
||||||
|
|
||||||
|
def _toggle_extension(self, name: str, enabled: bool) -> bool:
|
||||||
|
"""Enable or disable an extension."""
|
||||||
|
extensions = self._load_extensions()
|
||||||
|
|
||||||
|
for extension in extensions:
|
||||||
|
if extension.name == name:
|
||||||
|
extension.enabled = enabled
|
||||||
|
self._save_extensions(extensions)
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _get_base_agent_config(self, base_agent: str) -> Dict[str, Any]:
|
||||||
|
"""Get the base configuration for a Kaizen agent."""
|
||||||
|
# This would load the actual agent configuration
|
||||||
|
# For now, return a basic structure
|
||||||
|
return {
|
||||||
|
"name": base_agent,
|
||||||
|
"type": "kaizen_agent",
|
||||||
|
"enabled": True,
|
||||||
|
"config": {}
|
||||||
|
}
|
||||||
|
|
||||||
|
def _apply_extension_config(
|
||||||
|
self, base_config: Dict[str, Any], extension: AgentExtension
|
||||||
|
) -> Dict[str, Any]:
|
||||||
|
"""Apply an extension's configuration to the base config."""
|
||||||
|
config = base_config.copy()
|
||||||
|
|
||||||
|
# Apply configuration overlays
|
||||||
|
if extension.configuration:
|
||||||
|
config["config"].update(extension.configuration)
|
||||||
|
|
||||||
|
# Add custom commands
|
||||||
|
if extension.custom_commands:
|
||||||
|
config.setdefault("custom_commands", {}).update(extension.custom_commands)
|
||||||
|
|
||||||
|
# Apply environment overrides
|
||||||
|
if extension.environment_overrides:
|
||||||
|
config.setdefault("environment", {}).update(extension.environment_overrides)
|
||||||
|
|
||||||
|
# Add extension metadata
|
||||||
|
config.setdefault("extensions", []).append({
|
||||||
|
"name": extension.name,
|
||||||
|
"type": extension.extension_type.value,
|
||||||
|
"version": extension.version
|
||||||
|
})
|
||||||
|
|
||||||
|
return config
|
||||||
|
|
||||||
|
def _detect_project_type(self) -> str:
|
||||||
|
"""Detect the type of project."""
|
||||||
|
if (self.project_path / "pyproject.toml").exists():
|
||||||
|
return "python"
|
||||||
|
elif (self.project_path / "package.json").exists():
|
||||||
|
return "nodejs"
|
||||||
|
elif (self.project_path / "Cargo.toml").exists():
|
||||||
|
return "rust"
|
||||||
|
elif (self.project_path / "go.mod").exists():
|
||||||
|
return "go"
|
||||||
|
else:
|
||||||
|
return "generic"
|
||||||
|
|
||||||
|
def _analyze_legacy_agent(self, agent_path: Path) -> Dict[str, Any]:
|
||||||
|
"""Analyze a legacy agent to understand its functionality."""
|
||||||
|
analysis = {
|
||||||
|
"functionality": [],
|
||||||
|
"config": {},
|
||||||
|
"commands": [],
|
||||||
|
"dependencies": []
|
||||||
|
}
|
||||||
|
|
||||||
|
if agent_path.suffix == ".py":
|
||||||
|
# Analyze Python agent
|
||||||
|
content = agent_path.read_text()
|
||||||
|
|
||||||
|
# Simple analysis - look for class and function definitions
|
||||||
|
import re
|
||||||
|
classes = re.findall(r'class\s+(\w+)', content)
|
||||||
|
functions = re.findall(r'def\s+(\w+)', content)
|
||||||
|
|
||||||
|
analysis["functionality"] = classes + functions
|
||||||
|
|
||||||
|
elif agent_path.suffix in [".yml", ".yaml"]:
|
||||||
|
# Analyze YAML configuration
|
||||||
|
try:
|
||||||
|
with open(agent_path) as f:
|
||||||
|
data = yaml.safe_load(f)
|
||||||
|
|
||||||
|
analysis["config"] = data
|
||||||
|
analysis["commands"] = data.get("commands", [])
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
elif agent_path.suffix == ".json":
|
||||||
|
# Analyze JSON configuration
|
||||||
|
try:
|
||||||
|
with open(agent_path) as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
analysis["config"] = data
|
||||||
|
analysis["functionality"] = data.get("features", [])
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return analysis
|
||||||
|
|
||||||
|
def _create_extended_agent_file(self, extension: AgentExtension):
|
||||||
|
"""Create an agent file for a project-specific extension."""
|
||||||
|
agent_content = f"""---
|
||||||
|
name: {extension.name}
|
||||||
|
description: {extension.description}
|
||||||
|
base_agent: {extension.base_agent}
|
||||||
|
extension_type: {extension.extension_type.value}
|
||||||
|
version: {extension.version}
|
||||||
|
"""
|
||||||
|
|
||||||
|
if extension.author:
|
||||||
|
agent_content += f"author: {extension.author}\n"
|
||||||
|
|
||||||
|
agent_content += "---\n\n"
|
||||||
|
agent_content += f"# {extension.name}\n\n"
|
||||||
|
agent_content += f"{extension.description}\n\n"
|
||||||
|
agent_content += f"This agent extends **{extension.base_agent}** with project-specific functionality.\n\n"
|
||||||
|
|
||||||
|
if extension.configuration.get("custom_instructions"):
|
||||||
|
agent_content += "## Custom Instructions\n\n"
|
||||||
|
agent_content += f"{extension.configuration['custom_instructions']}\n\n"
|
||||||
|
|
||||||
|
if extension.custom_commands:
|
||||||
|
agent_content += "## Custom Commands\n\n"
|
||||||
|
for cmd, desc in extension.custom_commands.items():
|
||||||
|
agent_content += f"- **{cmd}**: {desc}\n"
|
||||||
|
agent_content += "\n"
|
||||||
|
|
||||||
|
# Save to agents directory
|
||||||
|
agents_dir = self.project_path / "agents"
|
||||||
|
agents_dir.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
agent_file = agents_dir / f"agent-{extension.name}.md"
|
||||||
|
agent_file.write_text(agent_content)
|
||||||
|
|
||||||
|
def _create_migration_wrapper(self, extension: AgentExtension, legacy_path: Path):
|
||||||
|
"""Create a wrapper to integrate legacy agent functionality."""
|
||||||
|
wrapper_dir = self.extensions_dir / extension.name
|
||||||
|
wrapper_file = wrapper_dir / "legacy_wrapper.py"
|
||||||
|
|
||||||
|
wrapper_content = f'''"""
|
||||||
|
Legacy agent wrapper for {extension.name}
|
||||||
|
|
||||||
|
This wrapper provides compatibility with the legacy agent at {legacy_path}
|
||||||
|
while integrating with the Kaizen agent {extension.base_agent}.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Add legacy agent path to system path
|
||||||
|
legacy_path = Path("{legacy_path}").parent
|
||||||
|
if str(legacy_path) not in sys.path:
|
||||||
|
sys.path.insert(0, str(legacy_path))
|
||||||
|
|
||||||
|
class LegacyWrapper:
|
||||||
|
"""Wrapper for legacy agent functionality."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.extension_config = {extension.configuration}
|
||||||
|
self.legacy_path = Path("{legacy_path}")
|
||||||
|
|
||||||
|
def execute_legacy_functionality(self, *args, **kwargs):
|
||||||
|
"""Execute legacy agent functionality."""
|
||||||
|
# Implementation would depend on the legacy agent type
|
||||||
|
pass
|
||||||
|
|
||||||
|
def migrate_data(self, data):
|
||||||
|
"""Migrate data from legacy format to Kaizen format."""
|
||||||
|
# Implementation for data transformation
|
||||||
|
return data
|
||||||
|
'''
|
||||||
|
|
||||||
|
wrapper_file.write_text(wrapper_content)
|
||||||
|
|
||||||
|
|
||||||
|
def create_extension_template(
|
||||||
|
name: str,
|
||||||
|
base_agent: str,
|
||||||
|
project_path: Path,
|
||||||
|
template_type: str = "basic"
|
||||||
|
) -> str:
|
||||||
|
"""Create a template for a new agent extension."""
|
||||||
|
|
||||||
|
templates = {
|
||||||
|
"basic": f"""# Extension Template: {name}
|
||||||
|
|
||||||
|
This template helps you create a custom extension for the {base_agent} agent.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: {name}
|
||||||
|
base_agent: {base_agent}
|
||||||
|
extension_type: functional_extension
|
||||||
|
description: "Custom extension for {base_agent}"
|
||||||
|
version: "1.0.0"
|
||||||
|
author: "Your Name"
|
||||||
|
|
||||||
|
configuration:
|
||||||
|
custom_setting: "value"
|
||||||
|
project_specific_config: {{}}
|
||||||
|
|
||||||
|
custom_commands:
|
||||||
|
custom-command: "Description of custom command"
|
||||||
|
|
||||||
|
environment_overrides:
|
||||||
|
CUSTOM_ENV_VAR: "value"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
1. Define your custom configuration in the `configuration` section
|
||||||
|
2. Add custom commands in the `custom_commands` section
|
||||||
|
3. Override environment variables in `environment_overrides`
|
||||||
|
4. Implement any custom logic in separate Python files
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Save this as `.kaizen/extensions/{name}/extension.yml` and run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kaizen-agentic extensions install {name}
|
||||||
|
```
|
||||||
|
""",
|
||||||
|
|
||||||
|
"advanced": f"""# Advanced Extension Template: {name}
|
||||||
|
|
||||||
|
This template provides advanced customization options for the {base_agent} agent.
|
||||||
|
|
||||||
|
## Full Configuration
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: {name}
|
||||||
|
base_agent: {base_agent}
|
||||||
|
extension_type: workflow_integration
|
||||||
|
description: "Advanced extension with workflow integration"
|
||||||
|
version: "1.0.0"
|
||||||
|
author: "Your Name"
|
||||||
|
|
||||||
|
configuration:
|
||||||
|
# Custom instructions for the agent
|
||||||
|
custom_instructions: |
|
||||||
|
You are working on the {project_path.name} project.
|
||||||
|
Follow these project-specific guidelines:
|
||||||
|
- Use our coding standards
|
||||||
|
- Reference our documentation style
|
||||||
|
- Integrate with our CI/CD pipeline
|
||||||
|
|
||||||
|
# Project context
|
||||||
|
project_context:
|
||||||
|
name: "{project_path.name}"
|
||||||
|
type: "python" # or nodejs, rust, etc.
|
||||||
|
framework: "custom"
|
||||||
|
|
||||||
|
# Custom behaviors
|
||||||
|
behaviors:
|
||||||
|
auto_commit: false
|
||||||
|
generate_tests: true
|
||||||
|
update_docs: true
|
||||||
|
|
||||||
|
custom_commands:
|
||||||
|
project-setup: "Initialize project structure following our standards"
|
||||||
|
custom-deploy: "Deploy using our specific deployment pipeline"
|
||||||
|
generate-config: "Generate project-specific configuration files"
|
||||||
|
|
||||||
|
workflow_hooks:
|
||||||
|
pre_action: "scripts/pre_action.py"
|
||||||
|
post_action: "scripts/post_action.py"
|
||||||
|
|
||||||
|
data_transformations:
|
||||||
|
input_format: "custom"
|
||||||
|
output_format: "kaizen_standard"
|
||||||
|
|
||||||
|
environment_overrides:
|
||||||
|
PROJECT_ROOT: "{project_path}"
|
||||||
|
CUSTOM_CONFIG_PATH: "{project_path}/.config"
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- "requests>=2.25.0"
|
||||||
|
- "pyyaml>=5.0.0"
|
||||||
|
|
||||||
|
compatibility:
|
||||||
|
- "kaizen-agentic>=0.2.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Custom Scripts
|
||||||
|
|
||||||
|
Create these files in `.kaizen/extensions/{name}/scripts/`:
|
||||||
|
|
||||||
|
- `pre_action.py` - Run before agent actions
|
||||||
|
- `post_action.py` - Run after agent actions
|
||||||
|
- `data_transform.py` - Transform data formats
|
||||||
|
- `validation.py` - Validate project-specific requirements
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Save the configuration as `.kaizen/extensions/{name}/extension.yml`
|
||||||
|
2. Add any custom scripts to the scripts directory
|
||||||
|
3. Install with: `kaizen-agentic extensions install {name}`
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
return templates.get(template_type, templates["basic"])
|
||||||
@@ -350,6 +350,7 @@ class ProjectInitializer:
|
|||||||
# Create basic files
|
# Create basic files
|
||||||
self._create_gitignore(project_dir)
|
self._create_gitignore(project_dir)
|
||||||
self._create_readme(project_dir, project_name)
|
self._create_readme(project_dir, project_name)
|
||||||
|
self._create_makefile(project_dir, project_name)
|
||||||
|
|
||||||
if template.startswith("python"):
|
if template.startswith("python"):
|
||||||
self._create_pyproject_toml(project_dir, project_name)
|
self._create_pyproject_toml(project_dir, project_name)
|
||||||
@@ -455,7 +456,7 @@ name = "{project_name}"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
description = "A Python project with Kaizen Agentic agents"
|
description = "A Python project with Kaizen Agentic agents"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.8"
|
requires-python = ">=3.9"
|
||||||
license = {{text = "MIT"}}
|
license = {{text = "MIT"}}
|
||||||
authors = [
|
authors = [
|
||||||
{{name = "Author Name", email = "author@example.com"}}
|
{{name = "Author Name", email = "author@example.com"}}
|
||||||
@@ -468,22 +469,24 @@ dev = [
|
|||||||
"black>=22.0",
|
"black>=22.0",
|
||||||
"flake8>=5.0",
|
"flake8>=5.0",
|
||||||
"mypy>=1.0",
|
"mypy>=1.0",
|
||||||
"kaizen-agentic>=0.1.0",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Note: Add kaizen-agentic dependency when published to PyPI
|
||||||
|
# dev = [..., "kaizen-agentic>=0.1.0"]
|
||||||
|
|
||||||
[tool.setuptools.packages.find]
|
[tool.setuptools.packages.find]
|
||||||
where = ["src"]
|
where = ["src"]
|
||||||
|
|
||||||
[tool.black]
|
[tool.black]
|
||||||
line-length = 88
|
line-length = 88
|
||||||
target-version = ['py38']
|
target-version = ['py39']
|
||||||
|
|
||||||
[tool.flake8]
|
[tool.flake8]
|
||||||
max-line-length = 100
|
max-line-length = 100
|
||||||
exclude = [".git", "__pycache__", "build", "dist"]
|
exclude = [".git", "__pycache__", "build", "dist"]
|
||||||
|
|
||||||
[tool.mypy]
|
[tool.mypy]
|
||||||
python_version = "3.8"
|
python_version = "3.9"
|
||||||
warn_return_any = true
|
warn_return_any = true
|
||||||
warn_unused_configs = true
|
warn_unused_configs = true
|
||||||
disallow_untyped_defs = true
|
disallow_untyped_defs = true
|
||||||
@@ -506,3 +509,110 @@ python_functions = ["test_*"]
|
|||||||
__version__ = "0.1.0"
|
__version__ = "0.1.0"
|
||||||
'''
|
'''
|
||||||
(project_dir / f"src/{package_name}/__init__.py").write_text(init_content)
|
(project_dir / f"src/{package_name}/__init__.py").write_text(init_content)
|
||||||
|
|
||||||
|
def _create_makefile(self, project_dir: Path, project_name: str):
|
||||||
|
"""Create Makefile with standard targets."""
|
||||||
|
package_name = project_name.replace('-', '_')
|
||||||
|
makefile_content = f"""# {project_name} - Makefile for development workflow
|
||||||
|
# Generated by Kaizen Agentic
|
||||||
|
|
||||||
|
.PHONY: help setup-complete setup-python setup-tools test lint format clean agents-status agents-update
|
||||||
|
|
||||||
|
# Default target
|
||||||
|
help:
|
||||||
|
@echo "Available targets:"
|
||||||
|
@echo " setup-complete - Complete development environment setup"
|
||||||
|
@echo " setup-python - Set up Python virtual environment and dependencies"
|
||||||
|
@echo " setup-tools - Install development tools"
|
||||||
|
@echo " test - Run test suite"
|
||||||
|
@echo " lint - Run code quality checks"
|
||||||
|
@echo " format - Format code with black"
|
||||||
|
@echo " clean - Clean build artifacts"
|
||||||
|
@echo " agents-status - Show installed agents status"
|
||||||
|
@echo " agents-update - Update agents to latest versions"
|
||||||
|
|
||||||
|
# Virtual environment detection
|
||||||
|
VENV := .venv
|
||||||
|
PYTHON := $(VENV)/bin/python
|
||||||
|
PIP := $(VENV)/bin/pip
|
||||||
|
|
||||||
|
# Complete setup
|
||||||
|
setup-complete: setup-python setup-tools
|
||||||
|
@echo "✅ Development environment setup complete!"
|
||||||
|
@echo "Next steps:"
|
||||||
|
@echo " source $(VENV)/bin/activate # Activate virtual environment"
|
||||||
|
@echo " make test # Run tests"
|
||||||
|
@echo " make lint # Check code quality"
|
||||||
|
|
||||||
|
# Python environment setup
|
||||||
|
setup-python: $(VENV)/bin/activate
|
||||||
|
|
||||||
|
$(VENV)/bin/activate: pyproject.toml
|
||||||
|
python3 -m venv $(VENV)
|
||||||
|
$(PIP) install --upgrade pip
|
||||||
|
$(PIP) install -e ".[dev]"
|
||||||
|
touch $(VENV)/bin/activate
|
||||||
|
|
||||||
|
# Development tools setup
|
||||||
|
setup-tools: $(VENV)/bin/activate
|
||||||
|
@echo "Development tools installed via pyproject.toml"
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
test: $(VENV)/bin/activate
|
||||||
|
$(PYTHON) -m pytest tests/ -v
|
||||||
|
|
||||||
|
test-coverage: $(VENV)/bin/activate
|
||||||
|
$(PYTHON) -m pytest tests/ --cov=src/{package_name} --cov-report=html --cov-report=term-missing
|
||||||
|
|
||||||
|
# Code quality
|
||||||
|
lint: $(VENV)/bin/activate
|
||||||
|
$(PYTHON) -m flake8 src/ tests/
|
||||||
|
$(PYTHON) -m mypy src/
|
||||||
|
|
||||||
|
format: $(VENV)/bin/activate
|
||||||
|
$(PYTHON) -m black src/ tests/
|
||||||
|
|
||||||
|
format-check: $(VENV)/bin/activate
|
||||||
|
$(PYTHON) -m black --check src/ tests/
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
clean:
|
||||||
|
rm -rf build/
|
||||||
|
rm -rf dist/
|
||||||
|
rm -rf *.egg-info/
|
||||||
|
rm -rf .pytest_cache/
|
||||||
|
rm -rf .coverage
|
||||||
|
rm -rf htmlcov/
|
||||||
|
find . -type d -name __pycache__ -exec rm -rf {{}} +
|
||||||
|
find . -type f -name "*.pyc" -delete
|
||||||
|
|
||||||
|
# Agent management
|
||||||
|
agents-status:
|
||||||
|
@if command -v kaizen-agentic >/dev/null 2>&1; then \\
|
||||||
|
kaizen-agentic status; \\
|
||||||
|
else \\
|
||||||
|
echo "kaizen-agentic not found. Install with: pip install kaizen-agentic"; \\
|
||||||
|
fi
|
||||||
|
|
||||||
|
agents-update:
|
||||||
|
@if command -v kaizen-agentic >/dev/null 2>&1; then \\
|
||||||
|
kaizen-agentic update; \\
|
||||||
|
else \\
|
||||||
|
echo "kaizen-agentic not found. Install with: pip install kaizen-agentic"; \\
|
||||||
|
fi
|
||||||
|
|
||||||
|
agents-list:
|
||||||
|
@if command -v kaizen-agentic >/dev/null 2>&1; then \\
|
||||||
|
kaizen-agentic list; \\
|
||||||
|
else \\
|
||||||
|
echo "kaizen-agentic not found. Install with: pip install kaizen-agentic"; \\
|
||||||
|
fi
|
||||||
|
|
||||||
|
agents-validate:
|
||||||
|
@if command -v kaizen-agentic >/dev/null 2>&1; then \\
|
||||||
|
kaizen-agentic validate; \\
|
||||||
|
else \\
|
||||||
|
echo "kaizen-agentic not found. Install with: pip install kaizen-agentic"; \\
|
||||||
|
fi
|
||||||
|
"""
|
||||||
|
(project_dir / "Makefile").write_text(makefile_content)
|
||||||
|
|||||||
461
src/kaizen_agentic/migration.py
Normal file
461
src/kaizen_agentic/migration.py
Normal file
@@ -0,0 +1,461 @@
|
|||||||
|
"""Migration and conflict resolution tools for existing agent systems."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import shutil
|
||||||
|
import yaml
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List, Optional, Set, Tuple
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
from .detection import AgentSystemDetector, DetectedAgent, AgentSystemType
|
||||||
|
|
||||||
|
|
||||||
|
class MigrationStrategy(Enum):
|
||||||
|
"""Strategies for migrating existing agents."""
|
||||||
|
REPLACE = "replace" # Replace with Kaizen equivalent
|
||||||
|
EXTEND = "extend" # Extend Kaizen agent with custom functionality
|
||||||
|
PRESERVE = "preserve" # Keep custom agent alongside Kaizen agents
|
||||||
|
MERGE = "merge" # Merge functionality into existing Kaizen agent
|
||||||
|
REMOVE = "remove" # Remove conflicting agent
|
||||||
|
|
||||||
|
|
||||||
|
class ConflictResolution(Enum):
|
||||||
|
"""Ways to resolve conflicts between agents."""
|
||||||
|
RENAME = "rename" # Rename one of the conflicting agents
|
||||||
|
NAMESPACE = "namespace" # Put agents in different namespaces
|
||||||
|
MERGE_FUNCTIONALITY = "merge" # Combine functionality
|
||||||
|
CHOOSE_KAIZEN = "choose_kaizen" # Keep Kaizen agent, remove custom
|
||||||
|
CHOOSE_CUSTOM = "choose_custom" # Keep custom agent, skip Kaizen
|
||||||
|
MANUAL_REVIEW = "manual" # Require manual resolution
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class MigrationPlan:
|
||||||
|
"""Plan for migrating an existing agent."""
|
||||||
|
source_agent: DetectedAgent
|
||||||
|
strategy: MigrationStrategy
|
||||||
|
target_agent: Optional[str] = None # Kaizen agent name if applicable
|
||||||
|
backup_path: Optional[Path] = None
|
||||||
|
custom_config: Optional[Dict] = None
|
||||||
|
migration_notes: List[str] = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.migration_notes is None:
|
||||||
|
self.migration_notes = []
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ConflictResolutionPlan:
|
||||||
|
"""Plan for resolving a conflict between agents."""
|
||||||
|
agent1: str
|
||||||
|
agent2: str
|
||||||
|
conflict_type: str
|
||||||
|
resolution: ConflictResolution
|
||||||
|
action_details: Dict = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.action_details is None:
|
||||||
|
self.action_details = {}
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class IntegrationPlan:
|
||||||
|
"""Complete plan for integrating Kaizen agents into an existing project."""
|
||||||
|
project_path: Path
|
||||||
|
migration_plans: List[MigrationPlan]
|
||||||
|
conflict_resolutions: List[ConflictResolutionPlan]
|
||||||
|
backup_directory: Path
|
||||||
|
integration_order: List[str] # Order to perform migrations
|
||||||
|
post_migration_tasks: List[str]
|
||||||
|
|
||||||
|
|
||||||
|
class AgentMigrationPlanner:
|
||||||
|
"""Creates migration plans for existing agent systems."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.kaizen_equivalents = {
|
||||||
|
# Map common custom agent names to Kaizen equivalents
|
||||||
|
"todo": "keepaTodofile",
|
||||||
|
"todo_manager": "keepaTodofile",
|
||||||
|
"todo-manager": "keepaTodofile",
|
||||||
|
"task_manager": "keepaTodofile",
|
||||||
|
"changelog": "keepaChangelog",
|
||||||
|
"changelog_bot": "keepaChangelog",
|
||||||
|
"changelog-bot": "keepaChangelog",
|
||||||
|
"version_manager": "keepaChangelog",
|
||||||
|
"code_review": "code-refactoring",
|
||||||
|
"code_reviewer": "code-refactoring",
|
||||||
|
"code-reviewer": "code-refactoring",
|
||||||
|
"refactor": "code-refactoring",
|
||||||
|
"test_helper": "testing-efficiency",
|
||||||
|
"test_runner": "testing-efficiency",
|
||||||
|
"test-runner": "testing-efficiency",
|
||||||
|
"testing_helper": "testing-efficiency",
|
||||||
|
"tdd": "tdd-workflow",
|
||||||
|
"tdd_helper": "tdd-workflow",
|
||||||
|
"setup": "setupRepository",
|
||||||
|
"setup_repo": "setupRepository",
|
||||||
|
"repo_setup": "setupRepository",
|
||||||
|
"project_setup": "setupRepository",
|
||||||
|
"docs": "claude-documentation",
|
||||||
|
"documentation": "claude-documentation",
|
||||||
|
"doc_generator": "claude-documentation",
|
||||||
|
}
|
||||||
|
|
||||||
|
self.functional_categories = {
|
||||||
|
"project_management": ["keepaTodofile", "project-management", "priority-evaluation"],
|
||||||
|
"testing": ["testing-efficiency", "test-maintenance", "tdd-workflow"],
|
||||||
|
"documentation": ["claude-documentation", "keepaContributingfile"],
|
||||||
|
"code_quality": ["code-refactoring", "datamodel-optimization", "optimization"],
|
||||||
|
"infrastructure": ["setupRepository", "tooling-optimization"],
|
||||||
|
"version_control": ["keepaChangelog"],
|
||||||
|
}
|
||||||
|
|
||||||
|
def create_integration_plan(self, project_path: Path) -> IntegrationPlan:
|
||||||
|
"""Create a complete integration plan for a project."""
|
||||||
|
detector = AgentSystemDetector()
|
||||||
|
detection_result = detector.detect_agent_systems(project_path)
|
||||||
|
|
||||||
|
# Create backup directory
|
||||||
|
backup_dir = project_path / f".kaizen-migration-backup-{int(Path().stat().st_mtime)}"
|
||||||
|
|
||||||
|
# Create migration plans for each detected agent
|
||||||
|
migration_plans = []
|
||||||
|
for agent in detection_result.agents:
|
||||||
|
if agent.type != AgentSystemType.KAIZEN_AGENTIC:
|
||||||
|
plan = self._create_migration_plan(agent, project_path, backup_dir)
|
||||||
|
migration_plans.append(plan)
|
||||||
|
|
||||||
|
# Create conflict resolution plans
|
||||||
|
conflict_resolutions = []
|
||||||
|
for agent1, agent2, reason in detection_result.conflicts:
|
||||||
|
resolution = self._create_conflict_resolution(agent1, agent2, reason)
|
||||||
|
conflict_resolutions.append(resolution)
|
||||||
|
|
||||||
|
# Determine integration order
|
||||||
|
integration_order = self._determine_integration_order(migration_plans)
|
||||||
|
|
||||||
|
# Generate post-migration tasks
|
||||||
|
post_migration_tasks = self._generate_post_migration_tasks(detection_result)
|
||||||
|
|
||||||
|
return IntegrationPlan(
|
||||||
|
project_path=project_path,
|
||||||
|
migration_plans=migration_plans,
|
||||||
|
conflict_resolutions=conflict_resolutions,
|
||||||
|
backup_directory=backup_dir,
|
||||||
|
integration_order=integration_order,
|
||||||
|
post_migration_tasks=post_migration_tasks
|
||||||
|
)
|
||||||
|
|
||||||
|
def _create_migration_plan(
|
||||||
|
self, agent: DetectedAgent, project_path: Path, backup_dir: Path
|
||||||
|
) -> MigrationPlan:
|
||||||
|
"""Create a migration plan for a single agent."""
|
||||||
|
# Determine if there's a Kaizen equivalent
|
||||||
|
agent_name_lower = agent.name.lower().replace("-", "_").replace(" ", "_")
|
||||||
|
target_agent = self.kaizen_equivalents.get(agent_name_lower)
|
||||||
|
|
||||||
|
# Determine migration strategy
|
||||||
|
if target_agent:
|
||||||
|
if agent.type == AgentSystemType.CUSTOM_AGENTS:
|
||||||
|
# Check if custom agent has unique functionality
|
||||||
|
if self._has_unique_functionality(agent):
|
||||||
|
strategy = MigrationStrategy.EXTEND
|
||||||
|
else:
|
||||||
|
strategy = MigrationStrategy.REPLACE
|
||||||
|
else:
|
||||||
|
strategy = MigrationStrategy.REPLACE
|
||||||
|
else:
|
||||||
|
# No direct equivalent - preserve or extend
|
||||||
|
if self._is_essential_custom_agent(agent):
|
||||||
|
strategy = MigrationStrategy.PRESERVE
|
||||||
|
else:
|
||||||
|
# Try to find a category match
|
||||||
|
category_match = self._find_category_match(agent)
|
||||||
|
if category_match:
|
||||||
|
strategy = MigrationStrategy.EXTEND
|
||||||
|
target_agent = category_match
|
||||||
|
else:
|
||||||
|
strategy = MigrationStrategy.PRESERVE
|
||||||
|
|
||||||
|
# Create backup path
|
||||||
|
backup_path = backup_dir / agent.file_path.name
|
||||||
|
|
||||||
|
# Generate migration notes
|
||||||
|
notes = self._generate_migration_notes(agent, strategy, target_agent)
|
||||||
|
|
||||||
|
return MigrationPlan(
|
||||||
|
source_agent=agent,
|
||||||
|
strategy=strategy,
|
||||||
|
target_agent=target_agent,
|
||||||
|
backup_path=backup_path,
|
||||||
|
migration_notes=notes
|
||||||
|
)
|
||||||
|
|
||||||
|
def _has_unique_functionality(self, agent: DetectedAgent) -> bool:
|
||||||
|
"""Check if a custom agent has functionality not available in Kaizen agents."""
|
||||||
|
# This would analyze the agent's implementation
|
||||||
|
# For now, assume custom Python agents have unique functionality
|
||||||
|
return agent.file_path.suffix == ".py"
|
||||||
|
|
||||||
|
def _is_essential_custom_agent(self, agent: DetectedAgent) -> bool:
|
||||||
|
"""Check if a custom agent is essential to the project."""
|
||||||
|
# Heuristics for essential agents
|
||||||
|
essential_patterns = [
|
||||||
|
"deploy", "ci", "cd", "build", "release", "secret", "auth",
|
||||||
|
"database", "api", "server", "client", "integration"
|
||||||
|
]
|
||||||
|
|
||||||
|
agent_name_lower = agent.name.lower()
|
||||||
|
return any(pattern in agent_name_lower for pattern in essential_patterns)
|
||||||
|
|
||||||
|
def _find_category_match(self, agent: DetectedAgent) -> Optional[str]:
|
||||||
|
"""Find a Kaizen agent in the same functional category."""
|
||||||
|
agent_name_lower = agent.name.lower()
|
||||||
|
|
||||||
|
for category, kaizen_agents in self.functional_categories.items():
|
||||||
|
# Check if agent name suggests this category
|
||||||
|
if any(cat_word in agent_name_lower for cat_word in category.split("_")):
|
||||||
|
# Return the primary agent for this category
|
||||||
|
return kaizen_agents[0]
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _create_conflict_resolution(
|
||||||
|
self, agent1: str, agent2: str, reason: str
|
||||||
|
) -> ConflictResolutionPlan:
|
||||||
|
"""Create a conflict resolution plan."""
|
||||||
|
if "Name conflict" in reason:
|
||||||
|
resolution = ConflictResolution.RENAME
|
||||||
|
action_details = {
|
||||||
|
"rename_agent": agent2, # Rename the second agent
|
||||||
|
"new_name": f"{agent2}_custom"
|
||||||
|
}
|
||||||
|
elif "Functional overlap" in reason:
|
||||||
|
# Check if one is a Kaizen agent
|
||||||
|
if agent1 in self.kaizen_equivalents.values():
|
||||||
|
resolution = ConflictResolution.CHOOSE_KAIZEN
|
||||||
|
action_details = {"keep": agent1, "remove": agent2}
|
||||||
|
elif agent2 in self.kaizen_equivalents.values():
|
||||||
|
resolution = ConflictResolution.CHOOSE_KAIZEN
|
||||||
|
action_details = {"keep": agent2, "remove": agent1}
|
||||||
|
else:
|
||||||
|
resolution = ConflictResolution.MERGE_FUNCTIONALITY
|
||||||
|
action_details = {"primary": agent1, "merge_into": agent2}
|
||||||
|
else:
|
||||||
|
resolution = ConflictResolution.MANUAL_REVIEW
|
||||||
|
action_details = {"reason": reason}
|
||||||
|
|
||||||
|
return ConflictResolutionPlan(
|
||||||
|
agent1=agent1,
|
||||||
|
agent2=agent2,
|
||||||
|
conflict_type=reason,
|
||||||
|
resolution=resolution,
|
||||||
|
action_details=action_details
|
||||||
|
)
|
||||||
|
|
||||||
|
def _determine_integration_order(self, migration_plans: List[MigrationPlan]) -> List[str]:
|
||||||
|
"""Determine the order to perform migrations."""
|
||||||
|
# Order by dependency and risk
|
||||||
|
order = []
|
||||||
|
|
||||||
|
# 1. Infrastructure agents first
|
||||||
|
infra_agents = [p for p in migration_plans if self._is_infrastructure_agent(p)]
|
||||||
|
order.extend([p.source_agent.name for p in infra_agents])
|
||||||
|
|
||||||
|
# 2. Core functionality agents
|
||||||
|
core_agents = [p for p in migration_plans if self._is_core_agent(p) and p not in infra_agents]
|
||||||
|
order.extend([p.source_agent.name for p in core_agents])
|
||||||
|
|
||||||
|
# 3. Optional/enhancement agents last
|
||||||
|
remaining = [p for p in migration_plans if p.source_agent.name not in order]
|
||||||
|
order.extend([p.source_agent.name for p in remaining])
|
||||||
|
|
||||||
|
return order
|
||||||
|
|
||||||
|
def _is_infrastructure_agent(self, plan: MigrationPlan) -> bool:
|
||||||
|
"""Check if agent is infrastructure-related."""
|
||||||
|
infra_keywords = ["setup", "config", "infrastructure", "deploy", "build"]
|
||||||
|
agent_name = plan.source_agent.name.lower()
|
||||||
|
return any(keyword in agent_name for keyword in infra_keywords)
|
||||||
|
|
||||||
|
def _is_core_agent(self, plan: MigrationPlan) -> bool:
|
||||||
|
"""Check if agent is core functionality."""
|
||||||
|
core_keywords = ["todo", "changelog", "test", "code", "review"]
|
||||||
|
agent_name = plan.source_agent.name.lower()
|
||||||
|
return any(keyword in agent_name for keyword in core_keywords)
|
||||||
|
|
||||||
|
def _generate_migration_notes(
|
||||||
|
self, agent: DetectedAgent, strategy: MigrationStrategy, target_agent: Optional[str]
|
||||||
|
) -> List[str]:
|
||||||
|
"""Generate helpful notes for the migration."""
|
||||||
|
notes = []
|
||||||
|
|
||||||
|
if strategy == MigrationStrategy.REPLACE:
|
||||||
|
notes.append(f"Replace with Kaizen agent: {target_agent}")
|
||||||
|
notes.append("Custom functionality will be lost - review before migrating")
|
||||||
|
|
||||||
|
elif strategy == MigrationStrategy.EXTEND:
|
||||||
|
notes.append(f"Extend Kaizen agent: {target_agent}")
|
||||||
|
notes.append("Custom functionality can be preserved as extensions")
|
||||||
|
|
||||||
|
elif strategy == MigrationStrategy.PRESERVE:
|
||||||
|
notes.append("Keep custom agent alongside Kaizen agents")
|
||||||
|
notes.append("Ensure no naming conflicts with new agents")
|
||||||
|
|
||||||
|
elif strategy == MigrationStrategy.MERGE:
|
||||||
|
notes.append(f"Merge functionality into: {target_agent}")
|
||||||
|
notes.append("Manual review required for feature integration")
|
||||||
|
|
||||||
|
elif strategy == MigrationStrategy.REMOVE:
|
||||||
|
notes.append("Remove conflicting agent")
|
||||||
|
notes.append("Functionality available in Kaizen agents")
|
||||||
|
|
||||||
|
# Add file-specific notes
|
||||||
|
if agent.file_path.suffix == ".py":
|
||||||
|
notes.append("Python implementation - may have custom logic")
|
||||||
|
elif agent.file_path.suffix in [".yml", ".yaml"]:
|
||||||
|
notes.append("YAML configuration - check for custom settings")
|
||||||
|
elif agent.file_path.suffix == ".json":
|
||||||
|
notes.append("JSON configuration - verify data format compatibility")
|
||||||
|
|
||||||
|
return notes
|
||||||
|
|
||||||
|
def _generate_post_migration_tasks(self, detection_result) -> List[str]:
|
||||||
|
"""Generate post-migration tasks."""
|
||||||
|
tasks = []
|
||||||
|
|
||||||
|
if AgentSystemType.CLAUDE_CODE in detection_result.detected_systems:
|
||||||
|
tasks.append("Update CLAUDE.md with new agent references")
|
||||||
|
|
||||||
|
if detection_result.config_files:
|
||||||
|
tasks.append("Verify all configuration files are updated")
|
||||||
|
|
||||||
|
tasks.extend([
|
||||||
|
"Run 'kaizen-agentic validate' to verify installation",
|
||||||
|
"Test all agent functionality",
|
||||||
|
"Update project documentation",
|
||||||
|
"Train team on new agent workflows",
|
||||||
|
"Archive or remove backup files after verification"
|
||||||
|
])
|
||||||
|
|
||||||
|
return tasks
|
||||||
|
|
||||||
|
|
||||||
|
class AgentMigrator:
|
||||||
|
"""Executes migration plans."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.planner = AgentMigrationPlanner()
|
||||||
|
|
||||||
|
def execute_migration(self, plan: IntegrationPlan, dry_run: bool = True) -> Dict[str, str]:
|
||||||
|
"""Execute a migration plan."""
|
||||||
|
results = {}
|
||||||
|
|
||||||
|
if not dry_run:
|
||||||
|
# Create backup directory
|
||||||
|
plan.backup_directory.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
# Execute migrations in order
|
||||||
|
for agent_name in plan.integration_order:
|
||||||
|
migration_plan = next(
|
||||||
|
(p for p in plan.migration_plans if p.source_agent.name == agent_name),
|
||||||
|
None
|
||||||
|
)
|
||||||
|
if migration_plan:
|
||||||
|
result = self._execute_single_migration(migration_plan, dry_run)
|
||||||
|
results[agent_name] = result
|
||||||
|
|
||||||
|
# Resolve conflicts
|
||||||
|
for conflict_plan in plan.conflict_resolutions:
|
||||||
|
result = self._resolve_conflict(conflict_plan, dry_run)
|
||||||
|
conflict_key = f"{conflict_plan.agent1}_vs_{conflict_plan.agent2}"
|
||||||
|
results[conflict_key] = result
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
def _execute_single_migration(self, plan: MigrationPlan, dry_run: bool) -> str:
|
||||||
|
"""Execute migration for a single agent."""
|
||||||
|
if dry_run:
|
||||||
|
return f"DRY_RUN: Would {plan.strategy.value} {plan.source_agent.name}"
|
||||||
|
|
||||||
|
try:
|
||||||
|
if plan.strategy == MigrationStrategy.REPLACE:
|
||||||
|
return self._replace_agent(plan)
|
||||||
|
elif plan.strategy == MigrationStrategy.EXTEND:
|
||||||
|
return self._extend_agent(plan)
|
||||||
|
elif plan.strategy == MigrationStrategy.PRESERVE:
|
||||||
|
return self._preserve_agent(plan)
|
||||||
|
elif plan.strategy == MigrationStrategy.MERGE:
|
||||||
|
return self._merge_agent(plan)
|
||||||
|
elif plan.strategy == MigrationStrategy.REMOVE:
|
||||||
|
return self._remove_agent(plan)
|
||||||
|
else:
|
||||||
|
return f"UNKNOWN_STRATEGY: {plan.strategy}"
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return f"ERROR: {e}"
|
||||||
|
|
||||||
|
def _replace_agent(self, plan: MigrationPlan) -> str:
|
||||||
|
"""Replace custom agent with Kaizen equivalent."""
|
||||||
|
# Backup the original
|
||||||
|
if plan.backup_path:
|
||||||
|
shutil.copy2(plan.source_agent.file_path, plan.backup_path)
|
||||||
|
|
||||||
|
# The actual Kaizen agent will be installed separately
|
||||||
|
# For now, just mark for replacement
|
||||||
|
return f"REPLACED: {plan.source_agent.name} -> {plan.target_agent}"
|
||||||
|
|
||||||
|
def _extend_agent(self, plan: MigrationPlan) -> str:
|
||||||
|
"""Extend Kaizen agent with custom functionality."""
|
||||||
|
# Create extension configuration
|
||||||
|
extension_config = {
|
||||||
|
"base_agent": plan.target_agent,
|
||||||
|
"custom_source": str(plan.source_agent.file_path),
|
||||||
|
"extension_type": "functional_overlay"
|
||||||
|
}
|
||||||
|
|
||||||
|
extension_path = plan.source_agent.file_path.parent / f"{plan.source_agent.name}_extension.json"
|
||||||
|
with open(extension_path, 'w') as f:
|
||||||
|
json.dump(extension_config, f, indent=2)
|
||||||
|
|
||||||
|
return f"EXTENDED: {plan.target_agent} with {plan.source_agent.name}"
|
||||||
|
|
||||||
|
def _preserve_agent(self, plan: MigrationPlan) -> str:
|
||||||
|
"""Preserve custom agent alongside Kaizen agents."""
|
||||||
|
# Rename if necessary to avoid conflicts
|
||||||
|
if plan.source_agent.name in ["todo", "changelog", "test"]:
|
||||||
|
new_name = f"{plan.source_agent.name}_custom"
|
||||||
|
new_path = plan.source_agent.file_path.parent / f"{new_name}{plan.source_agent.file_path.suffix}"
|
||||||
|
shutil.move(plan.source_agent.file_path, new_path)
|
||||||
|
return f"PRESERVED: {plan.source_agent.name} -> {new_name}"
|
||||||
|
|
||||||
|
return f"PRESERVED: {plan.source_agent.name}"
|
||||||
|
|
||||||
|
def _merge_agent(self, plan: MigrationPlan) -> str:
|
||||||
|
"""Merge agent functionality."""
|
||||||
|
# This would require more sophisticated analysis
|
||||||
|
return f"MERGE_PLANNED: {plan.source_agent.name} -> {plan.target_agent}"
|
||||||
|
|
||||||
|
def _remove_agent(self, plan: MigrationPlan) -> str:
|
||||||
|
"""Remove conflicting agent."""
|
||||||
|
if plan.backup_path:
|
||||||
|
shutil.move(plan.source_agent.file_path, plan.backup_path)
|
||||||
|
else:
|
||||||
|
plan.source_agent.file_path.unlink()
|
||||||
|
|
||||||
|
return f"REMOVED: {plan.source_agent.name}"
|
||||||
|
|
||||||
|
def _resolve_conflict(self, plan: ConflictResolutionPlan, dry_run: bool) -> str:
|
||||||
|
"""Resolve a conflict between agents."""
|
||||||
|
if dry_run:
|
||||||
|
return f"DRY_RUN: Would resolve {plan.resolution.value} conflict"
|
||||||
|
|
||||||
|
if plan.resolution == ConflictResolution.RENAME:
|
||||||
|
# Implement renaming logic
|
||||||
|
return f"RENAMED: {plan.action_details}"
|
||||||
|
elif plan.resolution == ConflictResolution.CHOOSE_KAIZEN:
|
||||||
|
return f"RESOLVED: Chose Kaizen agent {plan.action_details['keep']}"
|
||||||
|
else:
|
||||||
|
return f"RESOLUTION_PLANNED: {plan.resolution.value}"
|
||||||
@@ -256,33 +256,33 @@ class AgentRegistry:
|
|||||||
"""Get predefined agent templates for different project types."""
|
"""Get predefined agent templates for different project types."""
|
||||||
return {
|
return {
|
||||||
"python-basic": [
|
"python-basic": [
|
||||||
"setup-repository",
|
"setupRepository",
|
||||||
"todo-keeper",
|
"keepaTodofile",
|
||||||
"changelog-keeper"
|
"keepaChangelog"
|
||||||
],
|
],
|
||||||
"python-web": [
|
"python-web": [
|
||||||
"setup-repository",
|
"setupRepository",
|
||||||
"tdd-workflow",
|
"tdd-workflow",
|
||||||
"code-refactoring",
|
"code-refactoring",
|
||||||
"todo-keeper",
|
"keepaTodofile",
|
||||||
"changelog-keeper",
|
"keepaChangelog",
|
||||||
"contributing-keeper"
|
"keepaContributingfile"
|
||||||
],
|
],
|
||||||
"python-cli": [
|
"python-cli": [
|
||||||
"setup-repository",
|
"setupRepository",
|
||||||
"tdd-workflow",
|
"tdd-workflow",
|
||||||
"testing-efficiency",
|
"testing-efficiency",
|
||||||
"claude-documentation",
|
"claude-documentation",
|
||||||
"todo-keeper",
|
"keepaTodofile",
|
||||||
"changelog-keeper"
|
"keepaChangelog"
|
||||||
],
|
],
|
||||||
"python-data": [
|
"python-data": [
|
||||||
"setup-repository",
|
"setupRepository",
|
||||||
"datamodel-optimization",
|
"datamodel-optimization",
|
||||||
"testing-efficiency",
|
"testing-efficiency",
|
||||||
"requirements-engineering",
|
"requirements-engineering",
|
||||||
"todo-keeper",
|
"keepaTodofile",
|
||||||
"changelog-keeper"
|
"keepaChangelog"
|
||||||
],
|
],
|
||||||
"comprehensive": [
|
"comprehensive": [
|
||||||
agent.name for agent in self.list_agents()
|
agent.name for agent in self.list_agents()
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ def test_registry(tmp_path):
|
|||||||
base_agent = """---
|
base_agent = """---
|
||||||
name: base-agent
|
name: base-agent
|
||||||
description: Base test agent
|
description: Base test agent
|
||||||
|
category: testing
|
||||||
---
|
---
|
||||||
|
|
||||||
# Base Agent
|
# Base Agent
|
||||||
@@ -25,8 +26,9 @@ This is a base agent for testing.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
setup_agent = """---
|
setup_agent = """---
|
||||||
name: setup-repository
|
name: setupRepository
|
||||||
description: Repository setup agent
|
description: Repository setup agent
|
||||||
|
category: infrastructure
|
||||||
---
|
---
|
||||||
|
|
||||||
# Setup Repository
|
# Setup Repository
|
||||||
@@ -35,18 +37,31 @@ Sets up repository structure.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
todo_agent = """---
|
todo_agent = """---
|
||||||
name: todo-keeper
|
name: keepaTodofile
|
||||||
description: TODO management agent
|
description: TODO management agent
|
||||||
|
category: project-management
|
||||||
---
|
---
|
||||||
|
|
||||||
# TODO Keeper
|
# TODO Keeper
|
||||||
|
|
||||||
Manages TODO files.
|
Manages TODO files.
|
||||||
|
"""
|
||||||
|
|
||||||
|
changelog_agent = """---
|
||||||
|
name: keepaChangelog
|
||||||
|
description: Changelog management agent
|
||||||
|
category: project-management
|
||||||
|
---
|
||||||
|
|
||||||
|
# Changelog Keeper
|
||||||
|
|
||||||
|
Manages CHANGELOG files.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
(agents_dir / "agent-base-agent.md").write_text(base_agent)
|
(agents_dir / "agent-base-agent.md").write_text(base_agent)
|
||||||
(agents_dir / "agent-setup-repository.md").write_text(setup_agent)
|
(agents_dir / "agent-setupRepository.md").write_text(setup_agent)
|
||||||
(agents_dir / "agent-todo-keeper.md").write_text(todo_agent)
|
(agents_dir / "agent-keepaTodofile.md").write_text(todo_agent)
|
||||||
|
(agents_dir / "agent-keepaChangelog.md").write_text(changelog_agent)
|
||||||
|
|
||||||
return AgentRegistry(agents_dir)
|
return AgentRegistry(agents_dir)
|
||||||
|
|
||||||
@@ -80,10 +95,10 @@ def test_install_agents_with_dependencies(test_registry, tmp_path):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Install an agent that depends on others
|
# Install an agent that depends on others
|
||||||
results = installer.install_agents(["setup-repository"], config)
|
results = installer.install_agents(["setupRepository"], config)
|
||||||
|
|
||||||
assert "setup-repository" in results
|
assert "setupRepository" in results
|
||||||
assert results["setup-repository"] == "INSTALLED"
|
assert results["setupRepository"] == "INSTALLED"
|
||||||
|
|
||||||
|
|
||||||
def test_list_installed_agents(test_registry, tmp_path):
|
def test_list_installed_agents(test_registry, tmp_path):
|
||||||
@@ -97,12 +112,12 @@ def test_list_installed_agents(test_registry, tmp_path):
|
|||||||
|
|
||||||
# Install some agents
|
# Install some agents
|
||||||
config = InstallationConfig(target_dir=project_dir, create_backup=False, update_docs=False)
|
config = InstallationConfig(target_dir=project_dir, create_backup=False, update_docs=False)
|
||||||
installer.install_agents(["base-agent", "todo-keeper"], config)
|
installer.install_agents(["base-agent", "keepaTodofile"], config)
|
||||||
|
|
||||||
# Check installed agents
|
# Check installed agents
|
||||||
installed = installer.list_installed_agents(project_dir)
|
installed = installer.list_installed_agents(project_dir)
|
||||||
assert "base-agent" in installed
|
assert "base-agent" in installed
|
||||||
assert "todo-keeper" in installed
|
assert "keepaTodofile" in installed
|
||||||
assert len(installed) == 2
|
assert len(installed) == 2
|
||||||
|
|
||||||
|
|
||||||
@@ -132,7 +147,7 @@ def test_remove_agents(test_registry, tmp_path):
|
|||||||
|
|
||||||
# Install agents first
|
# Install agents first
|
||||||
config = InstallationConfig(target_dir=project_dir, create_backup=False, update_docs=False)
|
config = InstallationConfig(target_dir=project_dir, create_backup=False, update_docs=False)
|
||||||
installer.install_agents(["base-agent", "todo-keeper"], config)
|
installer.install_agents(["base-agent", "keepaTodofile"], config)
|
||||||
|
|
||||||
# Remove an agent
|
# Remove an agent
|
||||||
results = installer.remove_agents(["base-agent"], project_dir)
|
results = installer.remove_agents(["base-agent"], project_dir)
|
||||||
@@ -220,13 +235,13 @@ def test_project_initializer_custom_agents(test_registry, tmp_path):
|
|||||||
initializer.init_project(
|
initializer.init_project(
|
||||||
project_dir,
|
project_dir,
|
||||||
template="python-basic",
|
template="python-basic",
|
||||||
agent_names=["base-agent", "todo-keeper"],
|
agent_names=["base-agent", "keepaTodofile"],
|
||||||
project_name="custom_project"
|
project_name="custom_project"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check that specific agents were installed
|
# Check that specific agents were installed
|
||||||
assert (project_dir / "agents" / "agent-base-agent.md").exists()
|
assert (project_dir / "agents" / "agent-base-agent.md").exists()
|
||||||
assert (project_dir / "agents" / "agent-todo-keeper.md").exists()
|
assert (project_dir / "agents" / "agent-keepaTodofile.md").exists()
|
||||||
|
|
||||||
|
|
||||||
def test_installation_config():
|
def test_installation_config():
|
||||||
|
|||||||
@@ -173,8 +173,8 @@ def test_agent_registry_get_templates(tmp_path):
|
|||||||
assert "comprehensive" in templates
|
assert "comprehensive" in templates
|
||||||
|
|
||||||
# Check that templates contain expected agents
|
# Check that templates contain expected agents
|
||||||
assert "setup-repository" in templates["python-basic"]
|
assert "setupRepository" in templates["python-basic"]
|
||||||
assert "todo-keeper" in templates["python-basic"]
|
assert "keepaTodofile" in templates["python-basic"]
|
||||||
|
|
||||||
|
|
||||||
def test_agent_registry_validate_agents(tmp_path):
|
def test_agent_registry_validate_agents(tmp_path):
|
||||||
|
|||||||
Reference in New Issue
Block a user