Files
markitect-main/scripts/capability_discovery.mk
tegwick d0ffdc057c feat: implement modular capability system with automatic discovery
- Move release management to capabilities/release-management/ with complete Makefile
- Create automatic capability discovery system in scripts/capability_discovery.mk
- Add capability-manager subagent for managing modular architecture
- Implement target delegation system enabling capability-name-target patterns
- Create Makefiles for markitect-content, markitect-utils, and issue-facade capabilities
- Remove legacy release management code and documentation from main project
- Update main Makefile to use capability discovery and delegation
- Add comprehensive capability status, help, and management targets

The capability system provides:
- Automatic discovery of capabilities with Makefiles
- Clean target delegation without conflicts
- Modular architecture following established patterns
- Comprehensive help and status reporting
- Zero-conflict capability integration

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 01:29:15 +01:00

174 lines
5.9 KiB
Makefile

# Capability Discovery System
# Automatically discovers and includes capability Makefiles
# Find all capability directories that contain Makefiles
CAPABILITY_DIRS := $(dir $(wildcard capabilities/*/Makefile))
CAPABILITY_MAKEFILES := $(foreach dir,$(CAPABILITY_DIRS),$(dir)Makefile)
# DO NOT include capability Makefiles directly to avoid target conflicts
# Instead, use delegation patterns below for accessing capability targets
# Capability discovery and delegation system
.PHONY: capabilities-list
capabilities-list: ## List all available capabilities
@echo "🧩 Available Capabilities:"
@echo "=========================="
@for dir in $(CAPABILITY_DIRS); do \
if [ -f "$$dir/Makefile" ]; then \
echo ""; \
capability=$$(basename $$dir); \
echo "📦 $$capability"; \
echo " Location: $$dir"; \
if [ -f "$$dir/README.md" ]; then \
desc=$$(head -5 "$$dir/README.md" | grep -E "^[A-Z].*" | head -1 || echo "No description"); \
echo " Description: $$desc"; \
fi; \
echo " Makefile: Available"; \
fi; \
done
@echo ""
@echo "Use 'make capabilities-help' to see all capability targets"
.PHONY: capabilities-help
capabilities-help: ## Show help for all capabilities
@echo "🧩 All Capability Targets:"
@echo "=========================="
@for dir in $(CAPABILITY_DIRS); do \
if [ -f "$$dir/Makefile" ]; then \
echo ""; \
capability=$$(basename $$dir); \
echo "📦 $$capability capability:"; \
echo ""; \
$(MAKE) -C "$$dir" help 2>/dev/null | grep -E "^ " || echo " No help available"; \
fi; \
done
.PHONY: capabilities-install
capabilities-install: ## Install all capabilities
@echo "🔧 Installing all capabilities..."
@for dir in $(CAPABILITY_DIRS); do \
if [ -f "$$dir/pyproject.toml" ]; then \
capability=$$(basename $$dir); \
echo "Installing $$capability..."; \
pip install -e "$$dir" || echo "Failed to install $$capability"; \
fi; \
done
.PHONY: capabilities-test
capabilities-test: ## Run tests for all capabilities
@echo "🧪 Testing all capabilities..."
@for dir in $(CAPABILITY_DIRS); do \
if [ -f "$$dir/Makefile" ]; then \
capability=$$(basename $$dir); \
echo ""; \
echo "Testing $$capability..."; \
$(MAKE) -C "$$dir" test 2>/dev/null || echo "No tests or test failed for $$capability"; \
fi; \
done
# Create delegation targets for common patterns
# This allows calling capability targets directly from main makefile
# Release management delegation (special handling since it's commonly used)
.PHONY: release-%
release-%:
@if [ -f "capabilities/release-management/Makefile" ]; then \
$(MAKE) -C capabilities/release-management $@; \
else \
echo "❌ Release management capability not found"; \
exit 1; \
fi
# Generic capability delegation pattern
# Format: capability-name-target-name
define CAPABILITY_DELEGATION
.PHONY: $(1)-%
$(1)-%:
@if [ -f "capabilities/$(1)/Makefile" ]; then \
target_name=$$$$(echo "$$@" | sed 's/$(1)-//'); \
$(MAKE) -C "capabilities/$(1)" "$$$$target_name" || \
$(MAKE) -C "capabilities/$(1)" "$(1)-$$$$target_name" 2>/dev/null || \
echo "❌ Target '$$$$target_name' not found in $(1) capability"; \
else \
echo "❌ Capability '$(1)' not found or has no Makefile"; \
exit 1; \
fi
endef
# Generate delegation targets for each capability
$(foreach cap,$(patsubst capabilities/%/,%,$(CAPABILITY_DIRS)),$(eval $(call CAPABILITY_DELEGATION,$(cap))))
# Show available capability targets
.PHONY: capabilities-targets
capabilities-targets: ## Show all available capability targets
@echo "🎯 Available Capability Targets:"
@echo "================================"
@for dir in $(CAPABILITY_DIRS); do \
if [ -f "$$dir/Makefile" ]; then \
capability=$$(basename $$dir); \
echo ""; \
echo "📦 $$capability:"; \
$(MAKE) -C "$$dir" -qp 2>/dev/null | \
grep -E "^[a-zA-Z][^:]*:.*##" | \
sed 's/:.*##//' | \
while read target; do \
echo " $$capability-$$target"; \
echo " $@"; \
done || echo " No documented targets"; \
fi; \
done
# Capability status check
.PHONY: capabilities-status
capabilities-status: ## Show status of all capabilities
@echo "📊 Capability Status:"
@echo "===================="
@for dir in $(CAPABILITY_DIRS); do \
capability=$$(basename $$dir); \
echo ""; \
echo "📦 $$capability:"; \
if [ -f "$$dir/Makefile" ]; then \
echo " ✅ Makefile: Available"; \
else \
echo " ❌ Makefile: Missing"; \
fi; \
if [ -f "$$dir/pyproject.toml" ]; then \
echo " ✅ Package: Available"; \
if pip show "$$(echo $$capability | tr '-' '_')" >/dev/null 2>&1 || \
pip show "$$capability" >/dev/null 2>&1; then \
echo " ✅ Installed: Yes"; \
else \
echo " ❌ Installed: No"; \
fi; \
else \
echo " ❌ Package: Not available"; \
fi; \
if [ -f "$$dir/README.md" ]; then \
echo " ✅ Documentation: Available"; \
else \
echo " ❌ Documentation: Missing"; \
fi; \
done
# Auto-complete help integration
.PHONY: help-capabilities
help-capabilities: ## Show capability system help
@echo ""
@echo "🧩 Capability System:"
@echo " capabilities-list List all available capabilities"
@echo " capabilities-help Show help for all capabilities"
@echo " capabilities-status Show status of all capabilities"
@echo " capabilities-install Install all capabilities"
@echo " capabilities-test Test all capabilities"
@echo " capabilities-targets Show all available capability targets"
@echo ""
@echo "🎯 Capability Delegation:"
@echo " Use 'capability-name-target' to call targets from capabilities"
@echo " Example: 'make release-management-status' calls status from release-management"
@echo " Special: release-* targets are delegated to release-management capability"
@echo ""
# Export capability information for use by main Makefile
CAPABILITIES_FOUND := $(words $(CAPABILITY_DIRS))
export CAPABILITIES_FOUND
export CAPABILITY_DIRS