generated from coulomb/repo-seed
Add comprehensive feedback system that enables lightweight, unstructured feedback collection from users of the issue-facade capability, establishing a continuous improvement loop grounded in real-world usage. Core Components: - .feedback/ directory structure (inbound, reviewed, archived) - Standalone CLI tool (.capability/feedback) for submission and management - Comprehensive documentation (.feedback/README.md) - Integration examples and usage guides Key Features: - Multiple submission methods (CLI, Makefile, direct file drop) - No structure imposement - accepts any text/markdown format - Automatic metadata capture (timestamp, git context, version) - Maintainer workflow (list, review, archive, create issues) - Colored terminal output for better UX - Future-ready for API endpoint evolution Integration: - Updated CAPABILITY.yaml with feedback section - Enhanced CLAUDE.md with comprehensive integration guide - Added Makefile commands (feedback, feedback-list, feedback-stats, etc.) - Created detailed usage examples (examples/feedback-example.md) Design Philosophy: - Capability-agnostic pattern (reusable across all markitect capabilities) - Decentralized (each capability owns its feedback) - Flexible (no required formats or fields) - Durable (plain markdown files, git-tracked) - Actionable (feedback lives where maintainers work) - Scalable (works for 1 user or 1000 users) Feedback Submission Examples: ./.capability/feedback submit "Your feedback" make feedback MSG="Your feedback" echo "Feedback" > .feedback/inbound/$(date +%Y%m%d)-feedback.md Maintainer Workflow: make feedback-list # List pending make feedback-stats # Show statistics make feedback-review-issue FILE=xxx # Review and create issue This establishes a robust continuous improvement loop: User Experience → Feedback → Review → Action → Improved Capability The pattern is designed to be copied to any capability in the markitect project, providing consistent feedback collection across all capabilities. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
361 lines
11 KiB
Makefile
361 lines
11 KiB
Makefile
# Issue Facade Capability Makefile
|
|
# Universal CLI for issue tracking across multiple backends
|
|
|
|
# Capability metadata
|
|
CAPABILITY_NAME := issue-facade
|
|
CAPABILITY_DESCRIPTION := Universal CLI for issue tracking across multiple backends
|
|
|
|
# Default target
|
|
.PHONY: help
|
|
help: ## Show issue facade capability help
|
|
@echo "🎯 Issue Facade - Universal Issue Tracking CLI"
|
|
@echo "==============================================="
|
|
@echo ""
|
|
@echo "Core Issue Operations:"
|
|
@echo " issue-list List all issues from configured backend"
|
|
@echo " issue-show ID=42 Show details for issue #42"
|
|
@echo " issue-create TITLE=\"Bug\" Create new issue with title"
|
|
@echo " issue-close ID=42 Close issue #42"
|
|
@echo " issue-stats Show issue statistics"
|
|
@echo ""
|
|
@echo "Backend Management:"
|
|
@echo " issue-backend-list List configured backends"
|
|
@echo " issue-backend-detect Auto-detect backend from repository"
|
|
@echo " issue-backend-set-local Configure local SQLite backend"
|
|
@echo " issue-backend-set-gitea Configure Gitea backend"
|
|
@echo ""
|
|
@echo "Synchronization:"
|
|
@echo " issue-sync Sync with remote backend"
|
|
@echo " issue-sync-pull Pull issues from remote"
|
|
@echo " issue-sync-push Push local issues to remote"
|
|
@echo ""
|
|
@echo "Development & Setup (local):"
|
|
@echo " install Install issue facade for local development"
|
|
@echo " install-dev Install with development dependencies"
|
|
@echo " test Run all tests"
|
|
@echo " test-unit Run unit tests only"
|
|
@echo " test-integration Run integration tests only"
|
|
@echo " test-cov Run tests with coverage report"
|
|
@echo " test-verbose Run tests with verbose output"
|
|
@echo ""
|
|
@echo "Feedback & Continuous Improvement:"
|
|
@echo " feedback MSG=\"...\" Submit feedback about issue-facade"
|
|
@echo " feedback-list List pending feedback"
|
|
@echo " feedback-stats Show feedback statistics"
|
|
@echo " feedback-show FILE=\"...\" Show specific feedback"
|
|
@echo " feedback-review FILE=\"...\" Review feedback (maintainers)"
|
|
@echo ""
|
|
@echo "Development & Setup (from parent):"
|
|
@echo " issue-facade-install Install issue facade capability"
|
|
@echo " issue-facade-install-dev Install with development dependencies"
|
|
@echo " issue-facade-test Run issue facade tests"
|
|
@echo " issue-facade-test-cov Run tests with coverage report"
|
|
@echo " issue-facade-lint Run code quality checks"
|
|
@echo " issue-facade-clean Clean build artifacts"
|
|
@echo ""
|
|
@echo "CLI Functionality:"
|
|
@echo " issue-facade-help Show CLI help documentation"
|
|
@echo " issue-facade-demo Demonstrate facade functionality"
|
|
|
|
# Check if issue command is available
|
|
ISSUE_CLI := $(shell command -v issue 2> /dev/null)
|
|
|
|
# Core Issue Operations
|
|
.PHONY: issue-list
|
|
issue-list: ## List all issues from configured backend
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@echo " Install with: make issue-facade-install"
|
|
@exit 1
|
|
endif
|
|
issue list
|
|
|
|
.PHONY: issue-show
|
|
issue-show: ## Show details for specific issue (requires ID=number)
|
|
ifndef ID
|
|
@echo "❌ ID is required. Usage: make issue-show ID=42"
|
|
@exit 1
|
|
endif
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue show $(ID)
|
|
|
|
.PHONY: issue-create
|
|
issue-create: ## Create new issue (requires TITLE="Issue Title")
|
|
ifndef TITLE
|
|
@echo "❌ TITLE is required. Usage: make issue-create TITLE=\"Bug in parser\""
|
|
@exit 1
|
|
endif
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue create "$(TITLE)"
|
|
|
|
.PHONY: issue-close
|
|
issue-close: ## Close issue (requires ID=number)
|
|
ifndef ID
|
|
@echo "❌ ID is required. Usage: make issue-close ID=42"
|
|
@exit 1
|
|
endif
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue close $(ID)
|
|
|
|
.PHONY: issue-stats
|
|
issue-stats: ## Show issue statistics
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue stats
|
|
|
|
# Backend Management
|
|
.PHONY: issue-backend-list
|
|
issue-backend-list: ## List configured backends
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue backend list
|
|
|
|
.PHONY: issue-backend-detect
|
|
issue-backend-detect: ## Auto-detect backend from repository
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue config detect
|
|
|
|
.PHONY: issue-backend-set-local
|
|
issue-backend-set-local: ## Configure local SQLite backend
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue backend set local
|
|
|
|
.PHONY: issue-backend-set-gitea
|
|
issue-backend-set-gitea: ## Configure Gitea backend (requires REPO=repository-name)
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
ifdef REPO
|
|
issue backend add gitea $(REPO)
|
|
else
|
|
issue backend set gitea
|
|
endif
|
|
|
|
# Synchronization
|
|
.PHONY: issue-sync
|
|
issue-sync: ## Sync with remote backend
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue sync
|
|
|
|
.PHONY: issue-sync-pull
|
|
issue-sync-pull: ## Pull issues from remote
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue sync pull
|
|
|
|
.PHONY: issue-sync-push
|
|
issue-sync-push: ## Push local issues to remote
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
issue sync push
|
|
|
|
# Development and Setup
|
|
.PHONY: integrate
|
|
integrate: ## Integrate capability into main project (interactive)
|
|
@./.capability/integrate.sh
|
|
|
|
.PHONY: install
|
|
install: ## Install issue facade (local development)
|
|
pip install -e .
|
|
|
|
.PHONY: install-dev
|
|
install-dev: ## Install with development dependencies (local development)
|
|
pip install -e ".[dev]"
|
|
|
|
.PHONY: test
|
|
test: ## Run all tests (local development)
|
|
pytest tests/
|
|
|
|
.PHONY: test-unit
|
|
test-unit: ## Run unit tests only (local development)
|
|
pytest tests/ -m unit -v
|
|
|
|
.PHONY: test-integration
|
|
test-integration: ## Run integration tests only (local development)
|
|
pytest tests/ -m integration -v
|
|
|
|
.PHONY: test-cov
|
|
test-cov: ## Run tests with coverage report (local development)
|
|
pytest tests/ --cov=issue_tracker --cov-report=html --cov-report=term
|
|
|
|
.PHONY: test-verbose
|
|
test-verbose: ## Run tests with verbose output (local development)
|
|
pytest tests/ -v
|
|
|
|
# Feedback and Continuous Improvement
|
|
.PHONY: feedback
|
|
feedback: ## Submit feedback (Usage: make feedback MSG="your feedback")
|
|
@./.capability/feedback submit "$(MSG)"
|
|
|
|
.PHONY: feedback-list
|
|
feedback-list: ## List pending feedback
|
|
@./.capability/feedback list
|
|
|
|
.PHONY: feedback-stats
|
|
feedback-stats: ## Show feedback statistics
|
|
@./.capability/feedback stats
|
|
|
|
.PHONY: feedback-show
|
|
feedback-show: ## Show specific feedback (Usage: make feedback-show FILE=20251217-xxx.md)
|
|
@./.capability/feedback show "$(FILE)"
|
|
|
|
.PHONY: feedback-review
|
|
feedback-review: ## Review feedback (Usage: make feedback-review FILE=20251217-xxx.md)
|
|
@./.capability/feedback review "$(FILE)"
|
|
|
|
.PHONY: feedback-review-issue
|
|
feedback-review-issue: ## Review feedback and create issue (Usage: make feedback-review-issue FILE=20251217-xxx.md)
|
|
@./.capability/feedback review "$(FILE)" --create-issue
|
|
|
|
.PHONY: issue-facade-install
|
|
issue-facade-install: ## Install issue facade capability
|
|
pip install -e capabilities/issue-facade/
|
|
|
|
.PHONY: issue-facade-install-dev
|
|
issue-facade-install-dev: ## Install issue facade capability with development dependencies
|
|
pip install -e "capabilities/issue-facade/[dev]"
|
|
|
|
.PHONY: issue-facade-test
|
|
issue-facade-test: ## Run issue facade tests
|
|
cd capabilities/issue-facade && pytest tests/
|
|
|
|
.PHONY: issue-facade-test-cov
|
|
issue-facade-test-cov: ## Run tests with coverage report
|
|
cd capabilities/issue-facade && pytest tests/ --cov=issue_tracker --cov-report=html --cov-report=term
|
|
|
|
.PHONY: issue-facade-lint
|
|
issue-facade-lint: ## Run code quality checks
|
|
@echo "🔍 Running code quality checks for issue-facade..."
|
|
cd capabilities/issue-facade && python -m py_compile cli/*.py core/*.py backends/*/*.py 2>/dev/null || echo "⚠️ Some files may not compile due to missing dependencies"
|
|
@echo "✅ Code quality checks completed"
|
|
|
|
.PHONY: issue-facade-clean
|
|
issue-facade-clean: ## Clean build artifacts
|
|
cd capabilities/issue-facade && rm -rf build/ dist/ *.egg-info/ __pycache__/ .pytest_cache/ htmlcov/ .coverage
|
|
find capabilities/issue-facade -name "*.pyc" -delete
|
|
find capabilities/issue-facade -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true
|
|
|
|
# CLI Functionality
|
|
.PHONY: issue-facade-help
|
|
issue-facade-help: ## Show CLI help documentation
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@echo " Install with: make issue-facade-install"
|
|
@exit 1
|
|
endif
|
|
issue --help
|
|
|
|
.PHONY: issue-facade-demo
|
|
issue-facade-demo: ## Demonstrate facade functionality
|
|
@echo "🎬 Issue Facade Demonstration"
|
|
@echo "============================="
|
|
@echo ""
|
|
@echo "The Issue Facade provides a unified CLI for issue tracking across:"
|
|
@echo " • GitHub Issues"
|
|
@echo " • GitLab Issues"
|
|
@echo " • Gitea Issues"
|
|
@echo " • Local SQLite storage"
|
|
@echo ""
|
|
@echo "Key features:"
|
|
@echo " • Repository-aware backend detection"
|
|
@echo " • Offline capability with sync"
|
|
@echo " • Consistent CLI across all platforms"
|
|
@echo ""
|
|
ifndef ISSUE_CLI
|
|
@echo "To try it out:"
|
|
@echo " 1. make issue-facade-install"
|
|
@echo " 2. make issue-backend-detect"
|
|
@echo " 3. make issue-list"
|
|
else
|
|
@echo "Current backend status:"
|
|
@$(MAKE) --no-print-directory issue-backend-list 2>/dev/null || echo " No backends configured yet"
|
|
@echo ""
|
|
@echo "Try: make issue-backend-detect"
|
|
endif
|
|
|
|
# Repository Integration
|
|
.PHONY: issue-detect-repo
|
|
issue-detect-repo: ## Detect and configure backend for current repository
|
|
@echo "🔍 Analyzing repository for issue tracking configuration..."
|
|
@if [ -d .git ]; then \
|
|
echo "✅ Git repository detected"; \
|
|
if git remote -v 2>/dev/null | grep -q github; then \
|
|
echo "🐙 GitHub remote detected"; \
|
|
elif git remote -v 2>/dev/null | grep -q gitlab; then \
|
|
echo "🦊 GitLab remote detected"; \
|
|
elif git remote -v 2>/dev/null | grep -q gitea; then \
|
|
echo "🦋 Gitea remote detected"; \
|
|
else \
|
|
echo "📁 Generic git repository - local backend recommended"; \
|
|
fi; \
|
|
else \
|
|
echo "❌ Not a git repository"; \
|
|
fi
|
|
@echo ""
|
|
@echo "Run 'make issue-backend-detect' to auto-configure"
|
|
|
|
# Advanced Operations
|
|
.PHONY: issue-export
|
|
issue-export: ## Export issues to backup file (requires FILE=backup.json)
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
ifdef FILE
|
|
issue export "$(FILE)"
|
|
else
|
|
@echo "❌ FILE is required. Usage: make issue-export FILE=backup.json"
|
|
@exit 1
|
|
endif
|
|
|
|
.PHONY: issue-import
|
|
issue-import: ## Import issues from backup file (requires FILE=backup.json)
|
|
ifndef ISSUE_CLI
|
|
@echo "❌ Issue facade not installed"
|
|
@exit 1
|
|
endif
|
|
ifdef FILE
|
|
issue import "$(FILE)"
|
|
else
|
|
@echo "❌ FILE is required. Usage: make issue-import FILE=backup.json"
|
|
@exit 1
|
|
endif
|
|
|
|
# Meta information for capability discovery
|
|
.PHONY: capability-info
|
|
capability-info: ## Show capability information
|
|
@echo "Name: $(CAPABILITY_NAME)"
|
|
@echo "Description: $(CAPABILITY_DESCRIPTION)"
|
|
@echo "Type: CLI application with backend facade pattern"
|
|
@echo "Main command: issue"
|
|
@echo "Supported backends: Local SQLite, GitHub, GitLab, Gitea"
|
|
@echo "Key features: Repository-aware, offline-capable, unified interface"
|
|
@echo "Targets:"
|
|
@$(MAKE) --no-print-directory help | grep "^ " | sed 's/^ / /'
|