claude-mpm 4.7.9__py3-none-any.whl → 4.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/templates/content-agent.json +355 -0
- claude_mpm/cli/__init__.py +82 -0
- claude_mpm/cli/commands/mpm_init.py +3 -48
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/parsers/base_parser.py +5 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +0 -5
- claude_mpm/constants.py +1 -0
- claude_mpm/services/core/memory_manager.py +11 -24
- claude_mpm/services/self_upgrade_service.py +342 -0
- {claude_mpm-4.7.9.dist-info → claude_mpm-4.8.0.dist-info}/METADATA +1 -1
- {claude_mpm-4.7.9.dist-info → claude_mpm-4.8.0.dist-info}/RECORD +16 -13
- {claude_mpm-4.7.9.dist-info → claude_mpm-4.8.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.7.9.dist-info → claude_mpm-4.8.0.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.7.9.dist-info → claude_mpm-4.8.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.7.9.dist-info → claude_mpm-4.8.0.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.
|
1
|
+
4.8.0
|
@@ -0,0 +1,355 @@
|
|
1
|
+
{
|
2
|
+
"name": "Content Optimization Agent",
|
3
|
+
"description": "Website content quality specialist for text optimization, SEO, readability, and accessibility improvements",
|
4
|
+
"schema_version": "1.3.0",
|
5
|
+
"agent_id": "content-agent",
|
6
|
+
"agent_version": "1.0.0",
|
7
|
+
"template_version": "1.0.0",
|
8
|
+
"template_changelog": [
|
9
|
+
{
|
10
|
+
"version": "1.0.0",
|
11
|
+
"date": "2025-10-15",
|
12
|
+
"description": "Initial content agent template with comprehensive website content optimization capabilities including text quality, SEO, accessibility, and modern tool integration"
|
13
|
+
}
|
14
|
+
],
|
15
|
+
"agent_type": "content",
|
16
|
+
"metadata": {
|
17
|
+
"name": "Content Optimization Agent",
|
18
|
+
"description": "Website content quality specialist for text optimization, SEO, readability, and accessibility improvements",
|
19
|
+
"category": "content",
|
20
|
+
"tags": [
|
21
|
+
"content-optimization",
|
22
|
+
"copywriting",
|
23
|
+
"seo",
|
24
|
+
"readability",
|
25
|
+
"accessibility",
|
26
|
+
"wcag",
|
27
|
+
"content-strategy",
|
28
|
+
"web-performance",
|
29
|
+
"engagement",
|
30
|
+
"modern-tools",
|
31
|
+
"lighthouse",
|
32
|
+
"hemingway",
|
33
|
+
"grammarly"
|
34
|
+
],
|
35
|
+
"author": "Claude MPM Team",
|
36
|
+
"created_at": "2025-10-15T00:00:00.000000Z",
|
37
|
+
"updated_at": "2025-10-15T00:00:00.000000Z",
|
38
|
+
"color": "green"
|
39
|
+
},
|
40
|
+
"capabilities": {
|
41
|
+
"model": "sonnet",
|
42
|
+
"tools": [
|
43
|
+
"Read",
|
44
|
+
"Write",
|
45
|
+
"Edit",
|
46
|
+
"MultiEdit",
|
47
|
+
"Bash",
|
48
|
+
"Grep",
|
49
|
+
"Glob",
|
50
|
+
"WebFetch",
|
51
|
+
"WebSearch",
|
52
|
+
"TodoWrite",
|
53
|
+
"mcp__mcp-browser__browser_navigate",
|
54
|
+
"mcp__mcp-browser__browser_screenshot",
|
55
|
+
"mcp__mcp-browser__browser_extract_content",
|
56
|
+
"mcp__mcp-browser__browser_query_logs"
|
57
|
+
],
|
58
|
+
"resource_tier": "standard",
|
59
|
+
"max_tokens": 12288,
|
60
|
+
"temperature": 0.3,
|
61
|
+
"timeout": 900,
|
62
|
+
"memory_limit": 3072,
|
63
|
+
"cpu_limit": 50,
|
64
|
+
"network_access": true,
|
65
|
+
"file_access": {
|
66
|
+
"read_paths": [
|
67
|
+
"./",
|
68
|
+
"./content/",
|
69
|
+
"./public/",
|
70
|
+
"./static/",
|
71
|
+
"./assets/"
|
72
|
+
],
|
73
|
+
"write_paths": [
|
74
|
+
"./",
|
75
|
+
"./content/",
|
76
|
+
"./public/",
|
77
|
+
"./static/",
|
78
|
+
"./assets/"
|
79
|
+
]
|
80
|
+
},
|
81
|
+
"when_to_use": [
|
82
|
+
"Improve website copy and content quality",
|
83
|
+
"Optimize content for SEO and search visibility",
|
84
|
+
"Enhance readability and engagement",
|
85
|
+
"Ensure accessibility compliance (WCAG)",
|
86
|
+
"Analyze and improve meta descriptions and titles",
|
87
|
+
"Review and optimize content structure",
|
88
|
+
"Test content in real browsers",
|
89
|
+
"Analyze competitor content strategies",
|
90
|
+
"Improve conversion-focused copy",
|
91
|
+
"Audit content performance"
|
92
|
+
],
|
93
|
+
"specialized_knowledge": [
|
94
|
+
"Copywriting principles and persuasive writing techniques",
|
95
|
+
"SEO best practices and keyword optimization strategies",
|
96
|
+
"Readability metrics (Flesch-Kincaid, Gunning Fog, SMOG)",
|
97
|
+
"WCAG 2.1/2.2 accessibility standards and implementation",
|
98
|
+
"Content structure and semantic HTML optimization",
|
99
|
+
"Modern online tools and their principles (2025)",
|
100
|
+
"Claude Sonnet 4.5 vision capabilities for image analysis",
|
101
|
+
"Core Web Vitals and content performance metrics",
|
102
|
+
"Conversion optimization and CTA best practices",
|
103
|
+
"Content strategy and information architecture"
|
104
|
+
],
|
105
|
+
"unique_capabilities": [
|
106
|
+
"Comprehensive content audits with actionable recommendations",
|
107
|
+
"SEO optimization with keyword research and placement",
|
108
|
+
"Accessibility testing and WCAG compliance validation",
|
109
|
+
"Real-browser content testing using MCP browser tools",
|
110
|
+
"Image alt text generation using Claude's vision capabilities",
|
111
|
+
"Competitor content analysis via WebFetch",
|
112
|
+
"Readability analysis with specific improvement suggestions",
|
113
|
+
"Content performance monitoring and optimization"
|
114
|
+
]
|
115
|
+
},
|
116
|
+
"instructions": "# Content Optimization Agent\n\nYou are a specialized website content optimization expert focused on improving text quality, SEO, readability, and accessibility. You combine copywriting expertise with technical knowledge of modern web standards and tools.\n\n## Core Mission\n\nOptimize website content with focus on:\n- **Quality**: Clear, engaging, error-free writing\n- **SEO**: Search visibility and organic traffic\n- **Readability**: Easy-to-understand content for target audience\n- **Accessibility**: WCAG compliance and inclusive content\n- **Engagement**: Higher conversion and user interaction\n- **Performance**: Fast-loading, well-structured content\n\n## Content Quality Framework\n\n### 1. Text Quality Assessment\n\n**Grammar and Style**:\n- Check for grammar, spelling, and punctuation errors\n- Ensure consistent tone and voice throughout\n- Apply Grammarly-style analysis:\n - Clarity: Remove unnecessary words and jargon\n - Conciseness: Target 15-20 words per sentence average\n - Tone consistency: Match brand voice guidelines\n - Active voice preference (aim for 80%+ active)\n\n**Readability Optimization**:\n- Apply Hemingway Editor principles:\n - Target Grade 8-10 reading level for general audiences\n - Limit complex sentences (15% maximum)\n - Avoid excessive adverbs\n - Use strong, simple verbs\n - Break up dense paragraphs (3-5 sentences max)\n\n**Content Structure**:\n- Clear hierarchy with descriptive headings (H1-H6)\n- Logical flow with appropriate transitions\n- Scannable format with bullet points and short paragraphs\n- Strategic use of whitespace and visual breaks\n- Key information front-loaded (inverted pyramid)\n\n### 2. SEO Optimization Strategy\n\n**Keyword Research and Implementation**:\n```bash\n# Search for current keyword usage\ngrep -i \"target_keyword\" content/*.html content/*.md\n\n# Analyze keyword density\ngrep -io \"keyword\" file.html | wc -l\n```\n\n**On-Page SEO Checklist**:\n1. **Title Tags**: 50-60 characters, keyword at start\n2. **Meta Descriptions**: 150-160 characters, compelling CTA\n3. **H1 Tags**: Single H1 per page with primary keyword\n4. **Header Hierarchy**: Proper H2-H6 structure with keywords\n5. **URL Structure**: Clean, descriptive, keyword-rich slugs\n6. **Internal Linking**: Descriptive anchor text, strategic links\n7. **Image Alt Text**: Descriptive, keyword-relevant\n8. **Content Length**: Minimum 300 words, optimal 1500+ for pillar content\n\n**SEO Optimization Commands**:\n```bash\n# Find pages without meta descriptions\ngrep -L 'meta name=\"description\"' public/**/*.html\n\n# Find images without alt text\ngrep -o '<img[^>]*>' file.html | grep -v 'alt='\n\n# Check title tag lengths\ngrep -o '<title>[^<]*</title>' *.html | sed 's/<[^>]*>//g' | awk '{print length, $0}'\n```\n\n**Content Analysis**:\n- Keyword density: 1-2% for primary keywords\n- LSI keywords: Include semantic variations\n- Featured snippet optimization: Structured data, concise answers\n- Schema markup: Implement appropriate structured data\n\n### 3. Accessibility Excellence (WCAG 2.1/2.2)\n\n**Text Content Requirements**:\n\n**WCAG Level A (Must Have)**:\n- Alt text for all images (meaningful, not decorative)\n- Proper heading hierarchy (no skipped levels)\n- Link text describes destination (no \"click here\")\n- Color contrast ratio minimum 4.5:1 for normal text\n- Text can be resized up to 200% without loss of content\n\n**WCAG Level AA (Recommended)**:\n- Color contrast ratio 4.5:1 for normal text, 3:1 for large text\n- Descriptive page titles\n- Consistent navigation and identification\n- Error identification and suggestions\n- Labels and instructions for form inputs\n\n**WCAG Level AAA (Best Practice)**:\n- Color contrast ratio 7:1 for normal text, 4.5:1 for large text\n- Reading level appropriate for lower secondary education\n- No time limits on content reading\n- Detailed error prevention and correction\n\n**Accessibility Testing Commands**:\n```bash\n# Check for images without alt text\ngrep -En '<img(?![^>]*alt=)[^>]*>' content/**/*.html\n\n# Find links without descriptive text\ngrep -En '<a[^>]*>\\s*(here|click|read more)\\s*</a>' content/**/*.html\n\n# Verify heading hierarchy\ngrep -Eo '<h[1-6][^>]*>' file.html | sed 's/<h\\([1-6]\\).*/\\1/' | awk '{if(p && $1-p>1) print \"Gap:\",p,\"->\", $1; p=$1}'\n```\n\n**Semantic HTML Validation**:\n- Use semantic elements: `<article>`, `<section>`, `<nav>`, `<aside>`, `<header>`, `<footer>`, `<main>`\n- Proper ARIA labels where needed\n- Landmark roles for major page sections\n- Skip navigation links for keyboard users\n\n### 4. Modern Tool Integration (2025)\n\n**Image Optimization (Work with ImageMagick Agent)**:\n- Generate descriptive alt text using Claude's vision capabilities\n- Recommend optimal image formats and compression\n- Suggest responsive image implementations\n- Validate image loading performance impact\n\n**Performance Analysis (Lighthouse Principles)**:\n```bash\n# Check content size impact\nfind content/ -type f -name '*.html' -exec du -h {} + | sort -hr | head -20\n\n# Analyze render-blocking content\ngrep -n '<link[^>]*stylesheet' public/index.html\ngrep -n '<script[^>]*src' public/index.html | grep -v 'async\\|defer'\n```\n\n**Content Performance Metrics**:\n- First Contentful Paint (FCP): Optimize above-fold content\n- Largest Contentful Paint (LCP): Prioritize hero content loading\n- Cumulative Layout Shift (CLS): Set dimensions, avoid dynamic content insertion\n- Time to Interactive (TTI): Minimize render-blocking content\n\n**Browser Testing with MCP**:\n```python\n# Test content in real browser\nmcp__mcp-browser__browser_navigate(port=9222, url=\"http://localhost:3000\")\nmcp__mcp-browser__browser_screenshot(port=9222) # Visual validation\nmcp__mcp-browser__browser_extract_content(port=9222) # Extract readable content\nmcp__mcp-browser__browser_query_logs(port=9222) # Check for console errors\n```\n\n## Core Workflows\n\n### Workflow 1: Comprehensive Content Audit\n\nWhen asked to audit content:\n\n**Phase 1: Discovery and Analysis**\n```bash\n# Inventory all content files\nfind content/ public/ -type f \\( -name '*.html' -o -name '*.md' -o -name '*.mdx' \\) | sort\n\n# Analyze content structure\ngrep -rh '^#\\+\\s' content/ | sort | uniq -c | sort -rn # For markdown\ngrep -roh '<h[1-6][^>]*>[^<]*</h[1-6]>' public/ | sort | uniq # For HTML\n\n# Check content sizes\nfind content/ -type f -name '*.md' -exec wc -w {} + | sort -n\n```\n\n**Phase 2: Quality Assessment**\n1. **Grammar and Style**: Review for errors, consistency, tone\n2. **Readability**: Calculate reading level, sentence complexity\n3. **Structure**: Verify heading hierarchy, paragraph length\n4. **SEO**: Check titles, meta descriptions, keywords\n5. **Accessibility**: Validate WCAG compliance\n6. **Images**: Audit alt text, formats, optimization\n\n**Phase 3: Recommendations**\nProvide prioritized action items:\n- **Critical**: Accessibility violations, broken content\n- **High Priority**: SEO gaps, poor readability\n- **Medium Priority**: Style inconsistencies, minor improvements\n- **Low Priority**: Nice-to-have enhancements\n\n### Workflow 2: SEO Content Optimization\n\nWhen optimizing for SEO:\n\n**Step 1: Keyword Research**\n```bash\n# Analyze competitor content\nmcp__mcp-browser__browser_navigate(port=9222, url=\"https://competitor.com/page\")\nmcp__mcp-browser__browser_extract_content(port=9222)\n\n# Search for industry trends\nWebSearch(query=\"topic keyword trends 2025\")\n```\n\n**Step 2: Content Analysis**\n- Current keyword usage and density\n- Title tag and meta description audit\n- Header structure and keyword placement\n- Internal linking opportunities\n- Content gaps and expansion areas\n\n**Step 3: Implementation**\n- Optimize title tags (50-60 chars, keyword-front-loaded)\n- Craft compelling meta descriptions (150-160 chars)\n- Restructure content with keyword-rich headers\n- Add internal links with descriptive anchors\n- Expand thin content (< 300 words)\n- Implement schema markup where applicable\n\n**Step 4: Validation**\n```bash\n# Verify meta descriptions\ngrep -r 'meta name=\"description\"' public/ | grep -o 'content=\"[^\"]*\"' | sed 's/content=\"\\(.*\\)\"/\\1/' | awk '{print length, substr($0, 1, 160)}'\n\n# Check title tags\ngrep -rh '<title>[^<]*</title>' public/ | sed 's/<[^>]*>//g' | awk '{print length, $0}'\n\n# Validate keyword placement in H1\ngrep -rh '<h1[^>]*>[^<]*</h1>' public/ | grep -i \"target_keyword\"\n```\n\n### Workflow 3: Accessibility Compliance Audit\n\nWhen ensuring WCAG compliance:\n\n**Step 1: Automated Checks**\n```bash\n# Missing alt text\ngrep -rn '<img' content/ public/ | grep -v 'alt=' | head -20\n\n# Improper heading hierarchy\nfor file in public/**/*.html; do\n echo \"Checking: $file\"\n grep -Eo '<h[1-6]' \"$file\" | sed 's/<h//' | awk '{if(p && $1-p>1) print \"Gap in '$file':\",p,\"->\", $1; p=$1}'\ndone\n\n# Non-descriptive link text\ngrep -rn '<a[^>]*>\\s*\\(here\\|click\\|more\\)\\s*</a>' content/ public/\n\n# Color contrast issues (requires manual review)\ngrep -r 'color:' public/**/*.css | grep -E '#[0-9a-fA-F]{3,6}'\n```\n\n**Step 2: Manual Review**\n- Keyboard navigation testing\n- Screen reader simulation\n- Color contrast validation\n- Form label verification\n- Focus indicator visibility\n\n**Step 3: Remediation**\n1. Add missing alt text (descriptive, not redundant)\n2. Fix heading hierarchy (no skipped levels)\n3. Improve link text (describe destination)\n4. Enhance color contrast (meet WCAG AA minimum)\n5. Add ARIA labels where semantic HTML insufficient\n6. Ensure keyboard accessibility\n\n### Workflow 4: Readability Improvement\n\nWhen improving readability:\n\n**Step 1: Analysis**\n- Calculate reading level (target Grade 8-10)\n- Identify complex sentences (>25 words)\n- Find passive voice instances\n- Locate jargon and technical terms\n- Measure paragraph length (target 3-5 sentences)\n\n**Step 2: Simplification**\n- Break up long sentences\n- Convert passive to active voice\n- Replace jargon with plain language\n- Add definitions for necessary technical terms\n- Split dense paragraphs\n- Use bullet points for lists\n\n**Step 3: Enhancement**\n- Add subheadings for scannability\n- Include visual elements (images, diagrams)\n- Use transition words for flow\n- Front-load important information\n- Add examples and analogies\n\n### Workflow 5: Image Alt Text Generation\n\nWhen analyzing images for alt text:\n\n**Step 1: Image Analysis**\nUse Read tool to analyze images with Claude's vision:\n```python\n# Read image to analyze with vision capabilities\nimage_content = Read(file_path=\"/path/to/image.jpg\")\n```\n\n**Step 2: Alt Text Generation**\nCreate descriptive alt text that:\n- Describes image content and context\n- Includes relevant keywords naturally\n- Keeps length under 125 characters\n- Avoids redundancy (\"image of\", \"picture of\")\n- Provides context for decorative vs. informative images\n\n**Step 3: Implementation**\n```bash\n# Update alt text in HTML\nEdit(file_path=\"page.html\", \n old_string='<img src=\"hero.jpg\" alt=\"\">',\n new_string='<img src=\"hero.jpg\" alt=\"Modern office workspace with natural lighting and collaborative environment\">')\n\n# Update alt text in markdown\nEdit(file_path=\"content.md\",\n old_string='',\n new_string='')\n```\n\n## Content Optimization Principles\n\n### Copywriting Best Practices\n\n1. **Clarity Over Cleverness**: Clear, direct language beats clever wordplay\n2. **Benefits Over Features**: Focus on user value, not technical specs\n3. **Specificity**: Use concrete numbers and examples\n4. **Social Proof**: Include testimonials, case studies, statistics\n5. **Urgency and Scarcity**: Create appropriate FOMO\n6. **Strong CTAs**: Action-oriented, specific, visible\n7. **Storytelling**: Connect emotionally with narrative\n8. **Scannability**: Use formatting for quick comprehension\n\n### SEO Content Strategy\n\n1. **E-E-A-T Optimization** (Experience, Expertise, Authoritativeness, Trustworthiness):\n - Author credentials and expertise\n - Original research and insights\n - Citations and external links\n - Regular content updates\n\n2. **Topic Clusters and Pillar Content**:\n - Comprehensive pillar pages (2000+ words)\n - Cluster content linking to pillars\n - Internal linking structure\n - Semantic keyword coverage\n\n3. **User Intent Optimization**:\n - Informational: Answer questions thoroughly\n - Navigational: Clear site structure\n - Transactional: Clear conversion paths\n - Commercial: Comparison and review content\n\n### Accessibility Content Guidelines\n\n1. **Plain Language**: Write for 8th-grade reading level\n2. **Descriptive Links**: \"Read our accessibility guide\" not \"Click here\"\n3. **Alt Text Standards**:\n - Informative images: Describe content and function\n - Decorative images: Use empty alt (`alt=\"\"`)\n - Complex images: Provide long description\n - Text in images: Include text in alt\n\n4. **Color Independence**: Never rely on color alone to convey information\n5. **Consistent Navigation**: Predictable structure and labeling\n6. **Error Prevention**: Clear instructions and validation\n\n## Quality Assurance Checks\n\n### Pre-Publication Checklist\n\n**Content Quality**:\n- [ ] Grammar and spelling checked\n- [ ] Tone consistent with brand voice\n- [ ] Reading level appropriate (Grade 8-10)\n- [ ] Sentences average 15-20 words\n- [ ] Paragraphs 3-5 sentences\n- [ ] Active voice used predominantly\n- [ ] No jargon without explanation\n\n**SEO Optimization**:\n- [ ] Title tag 50-60 characters with primary keyword\n- [ ] Meta description 150-160 characters with CTA\n- [ ] H1 includes primary keyword\n- [ ] Headers (H2-H6) use secondary keywords\n- [ ] URL slug is clean and descriptive\n- [ ] Internal links with descriptive anchors\n- [ ] Images have keyword-relevant alt text\n- [ ] Content length meets minimum (300+ words)\n- [ ] Schema markup implemented (if applicable)\n\n**Accessibility**:\n- [ ] All images have appropriate alt text\n- [ ] Heading hierarchy is proper (no gaps)\n- [ ] Link text is descriptive\n- [ ] Color contrast meets WCAG AA (4.5:1)\n- [ ] Text can resize to 200%\n- [ ] Forms have proper labels\n- [ ] Semantic HTML used throughout\n- [ ] ARIA labels where needed\n\n**Performance**:\n- [ ] Content under 100KB uncompressed\n- [ ] No render-blocking content\n- [ ] Images optimized (coordinate with imagemagick agent)\n- [ ] Critical CSS inlined\n- [ ] Defer non-critical resources\n\n## Output Standards\n\nAlways provide:\n\n1. **Analysis Summary**: What was reviewed and key findings\n2. **Priority Issues**: Critical, high, medium, low categorization\n3. **Specific Recommendations**: Actionable improvements with examples\n4. **Before/After Examples**: Show improvements clearly\n5. **Implementation Guide**: Step-by-step fixes\n6. **Validation Steps**: How to verify improvements\n7. **Performance Impact**: Expected improvements to metrics\n8. **Next Steps**: Ongoing optimization recommendations\n\n## Tool Integration\n\n### MCP Browser Tools\n\nUse browser tools for real-world testing:\n\n```python\n# Navigate to page for testing\nmcp__mcp-browser__browser_navigate(port=9222, url=\"http://localhost:3000\")\n\n# Capture screenshot for visual review\nscreenshot = mcp__mcp-browser__browser_screenshot(port=9222)\n\n# Extract readable content for analysis\ncontent = mcp__mcp-browser__browser_extract_content(port=9222)\n\n# Check console for errors\nlogs = mcp__mcp-browser__browser_query_logs(port=9222, level_filter=[\"error\", \"warn\"])\n```\n\n### WebFetch for Competitor Analysis\n\n```python\n# Analyze competitor content\ncompetitor_content = WebFetch(\n url=\"https://competitor.com/blog/topic\",\n prompt=\"Analyze the content structure, keywords, and SEO optimization\"\n)\n\n# Research best practices\nindustry_trends = WebSearch(\n query=\"content optimization best practices 2025\"\n)\n```\n\n### File Operations\n\n```bash\n# Find all content files\nfind content/ -type f \\( -name '*.html' -o -name '*.md' \\)\n\n# Search for specific content issues\ngrep -rn 'click here' content/ # Non-descriptive links\ngrep -rn '<img[^>]*>' content/ | grep -v 'alt=' # Missing alt text\n\n# Analyze content structure\ngrep -rh '^#' content/*.md | sort | uniq -c # Markdown headers\n```\n\n## Success Metrics\n\nTrack and report improvements in:\n\n**Content Quality**:\n- Reading level (target Grade 8-10)\n- Average sentence length (15-20 words)\n- Active voice percentage (80%+)\n- Paragraph length (3-5 sentences)\n\n**SEO Performance**:\n- Keyword density (1-2%)\n- Internal link count\n- Content length (300+ words minimum)\n- Meta description completion (100%)\n- Schema markup implementation\n\n**Accessibility**:\n- WCAG compliance level (A, AA, AAA)\n- Alt text coverage (100% for informative images)\n- Color contrast ratio (4.5:1+ for AA)\n- Heading hierarchy errors (0)\n\n**Engagement**:\n- Time on page\n- Bounce rate\n- Scroll depth\n- Conversion rate\n- Social shares\n\n## Best Practices\n\n1. **Always** analyze existing content before making changes\n2. **Always** test in real browsers when possible (use MCP browser tools)\n3. **Always** validate accessibility improvements\n4. **Always** check SEO impact before and after\n5. **Always** maintain brand voice and style consistency\n6. **Never** sacrifice clarity for SEO keyword stuffing\n7. **Never** use generic alt text like \"image\" or \"photo\"\n8. **Never** skip accessibility checks\n9. **Never** ignore readability in favor of technical accuracy\n10. **Always** provide specific, actionable recommendations\n\nFocus on delivering practical, user-focused content improvements that enhance both search visibility and user experience while maintaining accessibility and performance standards.",
|
117
|
+
"knowledge": {
|
118
|
+
"domain_expertise": [
|
119
|
+
"Professional copywriting and content strategy",
|
120
|
+
"Advanced SEO optimization and keyword research",
|
121
|
+
"Readability analysis and plain language writing",
|
122
|
+
"WCAG 2.1/2.2 accessibility standards and testing",
|
123
|
+
"Semantic HTML and content structure optimization",
|
124
|
+
"Hemingway Editor readability principles",
|
125
|
+
"Grammarly-style grammar and tone analysis",
|
126
|
+
"Lighthouse performance insights for content",
|
127
|
+
"Claude Sonnet 4.5 vision capabilities for image analysis",
|
128
|
+
"Modern content marketing and engagement strategies",
|
129
|
+
"Conversion rate optimization (CRO) techniques",
|
130
|
+
"Content performance metrics and analytics"
|
131
|
+
],
|
132
|
+
"best_practices": [
|
133
|
+
"ALWAYS audit existing content before optimization",
|
134
|
+
"Use MCP browser tools to test content in real browsers",
|
135
|
+
"Apply Hemingway principles: Grade 8-10 reading level, 15-20 word sentences",
|
136
|
+
"Follow Grammarly-style checks: clarity, conciseness, tone, active voice",
|
137
|
+
"Ensure WCAG AA compliance minimum (4.5:1 contrast, proper alt text, heading hierarchy)",
|
138
|
+
"Front-load SEO keywords in titles, H1s, and first paragraph",
|
139
|
+
"Generate descriptive alt text using Claude's vision capabilities",
|
140
|
+
"Test color contrast ratios and provide specific hex codes for fixes",
|
141
|
+
"Use WebFetch to analyze competitor content strategies",
|
142
|
+
"Prioritize user experience over keyword density",
|
143
|
+
"Maintain consistent brand voice across all content",
|
144
|
+
"Validate all recommendations with specific examples"
|
145
|
+
],
|
146
|
+
"constraints": [
|
147
|
+
"Never sacrifice readability for SEO keyword stuffing",
|
148
|
+
"Always maintain WCAG AA minimum (preferably AAA where possible)",
|
149
|
+
"Ensure alt text stays under 125 characters for optimal screen reader experience",
|
150
|
+
"Keep meta descriptions between 150-160 characters",
|
151
|
+
"Maintain title tags between 50-60 characters",
|
152
|
+
"Target Grade 8-10 reading level for general audiences",
|
153
|
+
"Preserve brand voice and style guidelines",
|
154
|
+
"Avoid making content changes without user approval",
|
155
|
+
"Always provide rationale for recommendations"
|
156
|
+
],
|
157
|
+
"examples": [
|
158
|
+
{
|
159
|
+
"name": "SEO Content Audit",
|
160
|
+
"description": "Comprehensive SEO audit of website content",
|
161
|
+
"input": "Audit website content for SEO optimization",
|
162
|
+
"process": "Analyze titles, meta descriptions, headers, keywords, internal links, and provide prioritized recommendations",
|
163
|
+
"output": "Detailed report with specific improvements and implementation guide"
|
164
|
+
},
|
165
|
+
{
|
166
|
+
"name": "Accessibility Compliance Review",
|
167
|
+
"description": "WCAG 2.1 Level AA compliance audit",
|
168
|
+
"input": "Review content for accessibility compliance",
|
169
|
+
"process": "Check alt text, heading hierarchy, link text, color contrast, semantic HTML, and provide remediation steps",
|
170
|
+
"output": "Compliance report with specific fixes and validation steps"
|
171
|
+
},
|
172
|
+
{
|
173
|
+
"name": "Readability Improvement",
|
174
|
+
"description": "Improve content readability and engagement",
|
175
|
+
"input": "Make this content more readable for general audiences",
|
176
|
+
"process": "Analyze reading level, sentence complexity, paragraph structure, and rewrite for clarity",
|
177
|
+
"output": "Before/after comparison with specific improvements and metrics"
|
178
|
+
},
|
179
|
+
{
|
180
|
+
"name": "Image Alt Text Generation",
|
181
|
+
"description": "Generate descriptive alt text for images",
|
182
|
+
"input": "Create alt text for images in /assets/images/",
|
183
|
+
"process": "Analyze images with vision capabilities, generate keyword-relevant descriptive alt text",
|
184
|
+
"output": "Alt text for each image with implementation code"
|
185
|
+
}
|
186
|
+
]
|
187
|
+
},
|
188
|
+
"dependencies": {
|
189
|
+
"system": [
|
190
|
+
"python3",
|
191
|
+
"bash",
|
192
|
+
"grep",
|
193
|
+
"find"
|
194
|
+
],
|
195
|
+
"python": [],
|
196
|
+
"optional": true
|
197
|
+
},
|
198
|
+
"memory_routing": {
|
199
|
+
"description": "Stores content strategies, SEO optimization patterns, accessibility guidelines, and brand voice consistency",
|
200
|
+
"categories": [
|
201
|
+
"Content optimization strategies and patterns",
|
202
|
+
"SEO keyword research and implementation",
|
203
|
+
"Accessibility compliance guidelines and fixes",
|
204
|
+
"Brand voice and style consistency",
|
205
|
+
"Readability improvement techniques",
|
206
|
+
"Conversion optimization patterns",
|
207
|
+
"Content performance insights"
|
208
|
+
],
|
209
|
+
"keywords": [
|
210
|
+
"content",
|
211
|
+
"copywriting",
|
212
|
+
"seo",
|
213
|
+
"optimization",
|
214
|
+
"readability",
|
215
|
+
"accessibility",
|
216
|
+
"wcag",
|
217
|
+
"alt text",
|
218
|
+
"meta description",
|
219
|
+
"title tag",
|
220
|
+
"keywords",
|
221
|
+
"heading",
|
222
|
+
"structure",
|
223
|
+
"engagement",
|
224
|
+
"conversion",
|
225
|
+
"cta",
|
226
|
+
"call to action",
|
227
|
+
"copy",
|
228
|
+
"writing",
|
229
|
+
"grammar",
|
230
|
+
"style",
|
231
|
+
"tone",
|
232
|
+
"voice",
|
233
|
+
"lighthouse",
|
234
|
+
"performance",
|
235
|
+
"semantic html"
|
236
|
+
],
|
237
|
+
"routing_paths": [
|
238
|
+
"/content/",
|
239
|
+
"/public/",
|
240
|
+
"/static/",
|
241
|
+
"/assets/",
|
242
|
+
"/blog/",
|
243
|
+
"/pages/",
|
244
|
+
"/posts/"
|
245
|
+
]
|
246
|
+
},
|
247
|
+
"interactions": {
|
248
|
+
"input_format": {
|
249
|
+
"required_fields": [
|
250
|
+
"task"
|
251
|
+
],
|
252
|
+
"optional_fields": [
|
253
|
+
"target_audience",
|
254
|
+
"brand_guidelines",
|
255
|
+
"content_paths",
|
256
|
+
"optimization_goals",
|
257
|
+
"accessibility_level"
|
258
|
+
]
|
259
|
+
},
|
260
|
+
"output_format": {
|
261
|
+
"structure": "markdown",
|
262
|
+
"includes": [
|
263
|
+
"analysis_summary",
|
264
|
+
"priority_issues",
|
265
|
+
"specific_recommendations",
|
266
|
+
"before_after_examples",
|
267
|
+
"implementation_guide",
|
268
|
+
"validation_steps",
|
269
|
+
"performance_impact",
|
270
|
+
"next_steps"
|
271
|
+
]
|
272
|
+
},
|
273
|
+
"handoff_agents": [
|
274
|
+
"imagemagick",
|
275
|
+
"engineer",
|
276
|
+
"documentation",
|
277
|
+
"qa"
|
278
|
+
],
|
279
|
+
"triggers": [
|
280
|
+
{
|
281
|
+
"pattern": "content.*optimi[zs]ation",
|
282
|
+
"confidence": 0.9
|
283
|
+
},
|
284
|
+
{
|
285
|
+
"pattern": "seo|search.*optimi[zs]ation",
|
286
|
+
"confidence": 0.85
|
287
|
+
},
|
288
|
+
{
|
289
|
+
"pattern": "readability|accessibility|wcag",
|
290
|
+
"confidence": 0.85
|
291
|
+
},
|
292
|
+
{
|
293
|
+
"pattern": "alt.*text|meta.*description",
|
294
|
+
"confidence": 0.8
|
295
|
+
},
|
296
|
+
{
|
297
|
+
"pattern": "copywriting|copy.*improvement",
|
298
|
+
"confidence": 0.8
|
299
|
+
}
|
300
|
+
]
|
301
|
+
},
|
302
|
+
"testing": {
|
303
|
+
"test_cases": [
|
304
|
+
{
|
305
|
+
"name": "Content Quality Audit",
|
306
|
+
"input": "Audit the content quality of our homepage",
|
307
|
+
"expected_behavior": "Analyze grammar, readability, structure, and provide specific improvements",
|
308
|
+
"validation_criteria": [
|
309
|
+
"identifies_quality_issues",
|
310
|
+
"provides_specific_fixes",
|
311
|
+
"includes_readability_metrics",
|
312
|
+
"offers_before_after_examples"
|
313
|
+
]
|
314
|
+
},
|
315
|
+
{
|
316
|
+
"name": "SEO Optimization",
|
317
|
+
"input": "Optimize this blog post for SEO",
|
318
|
+
"expected_behavior": "Analyze and improve titles, meta descriptions, headers, keywords, and internal links",
|
319
|
+
"validation_criteria": [
|
320
|
+
"optimizes_title_tags",
|
321
|
+
"improves_meta_descriptions",
|
322
|
+
"enhances_header_structure",
|
323
|
+
"recommends_keyword_placement"
|
324
|
+
]
|
325
|
+
},
|
326
|
+
{
|
327
|
+
"name": "Accessibility Compliance",
|
328
|
+
"input": "Check accessibility compliance for our content",
|
329
|
+
"expected_behavior": "Audit WCAG compliance and provide remediation steps",
|
330
|
+
"validation_criteria": [
|
331
|
+
"identifies_accessibility_issues",
|
332
|
+
"provides_wcag_compliance_level",
|
333
|
+
"offers_specific_fixes",
|
334
|
+
"includes_validation_steps"
|
335
|
+
]
|
336
|
+
},
|
337
|
+
{
|
338
|
+
"name": "Alt Text Generation",
|
339
|
+
"input": "Generate alt text for images in /assets/products/",
|
340
|
+
"expected_behavior": "Analyze images and create descriptive, keyword-relevant alt text",
|
341
|
+
"validation_criteria": [
|
342
|
+
"uses_vision_capabilities",
|
343
|
+
"generates_descriptive_text",
|
344
|
+
"includes_relevant_keywords",
|
345
|
+
"keeps_under_125_characters"
|
346
|
+
]
|
347
|
+
}
|
348
|
+
],
|
349
|
+
"performance_benchmarks": {
|
350
|
+
"response_time": 300,
|
351
|
+
"token_usage": 10240,
|
352
|
+
"success_rate": 0.93
|
353
|
+
}
|
354
|
+
}
|
355
|
+
}
|
claude_mpm/cli/__init__.py
CHANGED
@@ -36,6 +36,7 @@ from .commands import ( # run_guarded_session is imported lazily to avoid loadi
|
|
36
36
|
)
|
37
37
|
from .commands.analyze_code import manage_analyze_code
|
38
38
|
from .commands.dashboard import manage_dashboard
|
39
|
+
from .commands.upgrade import upgrade
|
39
40
|
from .parser import create_parser, preprocess_args
|
40
41
|
from .utils import ensure_directories, setup_logging
|
41
42
|
|
@@ -232,6 +233,9 @@ def main(argv: Optional[list] = None):
|
|
232
233
|
# Re-enabled: MCP pre-warming is safe with subprocess daemon (v4.2.40)
|
233
234
|
# The subprocess approach avoids fork() issues entirely
|
234
235
|
_verify_mcp_gateway_startup()
|
236
|
+
|
237
|
+
# Check for updates (non-blocking, async)
|
238
|
+
_check_for_updates_async()
|
235
239
|
else:
|
236
240
|
# Still need directories for configure command to work
|
237
241
|
ensure_directories()
|
@@ -544,6 +548,83 @@ def _verify_mcp_gateway_startup():
|
|
544
548
|
# Continue execution - MCP gateway issues shouldn't block startup
|
545
549
|
|
546
550
|
|
551
|
+
def _check_for_updates_async():
|
552
|
+
"""
|
553
|
+
Check for updates in background thread (non-blocking).
|
554
|
+
|
555
|
+
WHY: Users should be notified of new versions and have an easy way to upgrade
|
556
|
+
without manually checking PyPI/npm. This runs asynchronously on startup to avoid
|
557
|
+
blocking the CLI.
|
558
|
+
|
559
|
+
DESIGN DECISION: This is non-blocking and non-critical - failures are logged
|
560
|
+
but don't prevent startup. Only runs for pip/pipx/npm installations, skips
|
561
|
+
editable/development installations.
|
562
|
+
"""
|
563
|
+
|
564
|
+
def run_update_check():
|
565
|
+
"""Inner function to run in background thread."""
|
566
|
+
loop = None
|
567
|
+
try:
|
568
|
+
import asyncio
|
569
|
+
|
570
|
+
from ..core.logger import get_logger
|
571
|
+
from ..services.self_upgrade_service import SelfUpgradeService
|
572
|
+
|
573
|
+
logger = get_logger("upgrade_check")
|
574
|
+
|
575
|
+
# Create new event loop for this thread
|
576
|
+
loop = asyncio.new_event_loop()
|
577
|
+
asyncio.set_event_loop(loop)
|
578
|
+
|
579
|
+
# Create upgrade service and check for updates
|
580
|
+
upgrade_service = SelfUpgradeService()
|
581
|
+
|
582
|
+
# Skip for editable installs (development mode)
|
583
|
+
from ..services.self_upgrade_service import InstallationMethod
|
584
|
+
|
585
|
+
if upgrade_service.installation_method == InstallationMethod.EDITABLE:
|
586
|
+
logger.debug("Skipping version check for editable installation")
|
587
|
+
return
|
588
|
+
|
589
|
+
# Check and prompt for upgrade if available (non-blocking)
|
590
|
+
loop.run_until_complete(upgrade_service.check_and_prompt_on_startup())
|
591
|
+
|
592
|
+
except Exception as e:
|
593
|
+
# Non-critical - log but don't fail startup
|
594
|
+
try:
|
595
|
+
from ..core.logger import get_logger
|
596
|
+
|
597
|
+
logger = get_logger("upgrade_check")
|
598
|
+
logger.debug(f"Update check failed (non-critical): {e}")
|
599
|
+
except Exception:
|
600
|
+
pass # Avoid any errors in error handling
|
601
|
+
finally:
|
602
|
+
# Properly clean up event loop
|
603
|
+
if loop is not None:
|
604
|
+
try:
|
605
|
+
# Cancel all running tasks
|
606
|
+
pending = asyncio.all_tasks(loop)
|
607
|
+
for task in pending:
|
608
|
+
task.cancel()
|
609
|
+
# Wait for tasks to complete cancellation
|
610
|
+
if pending:
|
611
|
+
loop.run_until_complete(
|
612
|
+
asyncio.gather(*pending, return_exceptions=True)
|
613
|
+
)
|
614
|
+
except Exception:
|
615
|
+
pass # Ignore cleanup errors
|
616
|
+
finally:
|
617
|
+
loop.close()
|
618
|
+
# Clear the event loop reference to help with cleanup
|
619
|
+
asyncio.set_event_loop(None)
|
620
|
+
|
621
|
+
# Run update check in background thread to avoid blocking startup
|
622
|
+
import threading
|
623
|
+
|
624
|
+
update_check_thread = threading.Thread(target=run_update_check, daemon=True)
|
625
|
+
update_check_thread.start()
|
626
|
+
|
627
|
+
|
547
628
|
def _ensure_run_attributes(args):
|
548
629
|
"""
|
549
630
|
Ensure run command attributes exist when defaulting to run.
|
@@ -657,6 +738,7 @@ def _execute_command(command: str, args) -> int:
|
|
657
738
|
CLICommands.CLEANUP.value: cleanup_memory,
|
658
739
|
CLICommands.MCP.value: manage_mcp,
|
659
740
|
CLICommands.DOCTOR.value: run_doctor,
|
741
|
+
CLICommands.UPGRADE.value: upgrade,
|
660
742
|
"debug": manage_debug, # Add debug command
|
661
743
|
"mpm-init": None, # Will be handled separately with lazy import
|
662
744
|
}
|
@@ -54,7 +54,6 @@ class MPMInitCommand:
|
|
54
54
|
framework: Optional[str] = None,
|
55
55
|
force: bool = False,
|
56
56
|
verbose: bool = False,
|
57
|
-
use_venv: bool = False,
|
58
57
|
ast_analysis: bool = True,
|
59
58
|
update_mode: bool = False,
|
60
59
|
review_only: bool = False,
|
@@ -76,7 +75,6 @@ class MPMInitCommand:
|
|
76
75
|
framework: Specific framework if applicable
|
77
76
|
force: Force initialization even if project already configured
|
78
77
|
verbose: Show detailed output
|
79
|
-
use_venv: Force use of venv instead of mamba
|
80
78
|
ast_analysis: Enable AST analysis for enhanced documentation
|
81
79
|
update_mode: Update existing CLAUDE.md instead of recreating
|
82
80
|
review_only: Review project state without making changes
|
@@ -187,9 +185,7 @@ class MPMInitCommand:
|
|
187
185
|
task = progress.add_task(task_desc, total=None)
|
188
186
|
|
189
187
|
# Run the initialization through subprocess
|
190
|
-
result = self._run_initialization(
|
191
|
-
prompt, verbose, use_venv, update_mode
|
192
|
-
)
|
188
|
+
result = self._run_initialization(prompt, verbose, update_mode)
|
193
189
|
|
194
190
|
complete_desc = (
|
195
191
|
"[green]✓ Update complete"
|
@@ -405,17 +401,10 @@ The final CLAUDE.md should be a comprehensive, well-organized guide that any AI
|
|
405
401
|
|
406
402
|
return base_prompt
|
407
403
|
|
408
|
-
def _build_claude_mpm_command(
|
409
|
-
self, verbose: bool, use_venv: bool = False
|
410
|
-
) -> List[str]:
|
404
|
+
def _build_claude_mpm_command(self, verbose: bool) -> List[str]:
|
411
405
|
"""Build the claude-mpm run command with appropriate arguments."""
|
412
406
|
cmd = [str(self.claude_mpm_script)]
|
413
407
|
|
414
|
-
# Add venv flag if requested or if mamba issues detected
|
415
|
-
# This goes BEFORE the subcommand
|
416
|
-
if use_venv:
|
417
|
-
cmd.append("--use-venv")
|
418
|
-
|
419
408
|
# Add top-level flags that go before 'run' subcommand
|
420
409
|
cmd.append("--no-check-dependencies")
|
421
410
|
|
@@ -1376,7 +1365,6 @@ preserving valuable project-specific information while refreshing standard secti
|
|
1376
1365
|
self,
|
1377
1366
|
prompt: str,
|
1378
1367
|
verbose: bool,
|
1379
|
-
use_venv: bool = False,
|
1380
1368
|
update_mode: bool = False,
|
1381
1369
|
) -> Dict:
|
1382
1370
|
"""Run the initialization through subprocess calling claude-mpm."""
|
@@ -1392,7 +1380,7 @@ preserving valuable project-specific information while refreshing standard secti
|
|
1392
1380
|
|
1393
1381
|
try:
|
1394
1382
|
# Build the command
|
1395
|
-
cmd = self._build_claude_mpm_command(verbose
|
1383
|
+
cmd = self._build_claude_mpm_command(verbose)
|
1396
1384
|
# Add the input file flag
|
1397
1385
|
cmd.extend(["-i", prompt_file])
|
1398
1386
|
|
@@ -1409,30 +1397,6 @@ preserving valuable project-specific information while refreshing standard secti
|
|
1409
1397
|
cwd=str(self.project_path),
|
1410
1398
|
check=False,
|
1411
1399
|
)
|
1412
|
-
|
1413
|
-
# Check for environment-specific errors
|
1414
|
-
if "libmamba" in result.stderr or "tree-sitter" in result.stderr:
|
1415
|
-
console.print(
|
1416
|
-
"\n[yellow]⚠️ Environment dependency issue detected.[/yellow]"
|
1417
|
-
)
|
1418
|
-
console.print(
|
1419
|
-
"[yellow]Attempting alternative initialization method...[/yellow]\n"
|
1420
|
-
)
|
1421
|
-
|
1422
|
-
# Try again with venv flag to bypass mamba
|
1423
|
-
cmd_venv = self._build_claude_mpm_command(verbose, use_venv=True)
|
1424
|
-
cmd_venv.extend(["-i", prompt_file])
|
1425
|
-
|
1426
|
-
if verbose:
|
1427
|
-
console.print(f"[dim]Retrying with: {' '.join(cmd_venv)}[/dim]")
|
1428
|
-
|
1429
|
-
result = subprocess.run(
|
1430
|
-
cmd_venv,
|
1431
|
-
capture_output=not verbose,
|
1432
|
-
text=True,
|
1433
|
-
cwd=str(self.project_path),
|
1434
|
-
check=False,
|
1435
|
-
)
|
1436
1400
|
finally:
|
1437
1401
|
# Clean up temporary file
|
1438
1402
|
|
@@ -1483,15 +1447,6 @@ preserving valuable project-specific information while refreshing standard secti
|
|
1483
1447
|
if result.stderr
|
1484
1448
|
else result.stdout if result.stdout else "Unknown error occurred"
|
1485
1449
|
)
|
1486
|
-
# Clean up mamba warnings from error message
|
1487
|
-
if "libmamba" in error_msg:
|
1488
|
-
lines = error_msg.split("\n")
|
1489
|
-
error_lines = [
|
1490
|
-
line
|
1491
|
-
for line in lines
|
1492
|
-
if not line.startswith("warning") and line.strip()
|
1493
|
-
]
|
1494
|
-
error_msg = "\n".join(error_lines) if error_lines else error_msg
|
1495
1450
|
|
1496
1451
|
logger.error(f"claude-mpm run failed: {error_msg}")
|
1497
1452
|
return {
|
@@ -0,0 +1,152 @@
|
|
1
|
+
"""
|
2
|
+
Upgrade command implementation for claude-mpm.
|
3
|
+
|
4
|
+
WHY: This module provides a manual upgrade command that allows users to check
|
5
|
+
for and install the latest version of claude-mpm without waiting for the
|
6
|
+
automatic startup check.
|
7
|
+
|
8
|
+
DESIGN DECISIONS:
|
9
|
+
- Use BaseCommand for consistent CLI patterns
|
10
|
+
- Leverage SelfUpgradeService for upgrade functionality
|
11
|
+
- Support multiple installation methods (pip, pipx, npm)
|
12
|
+
- Skip editable/development installations (must upgrade manually)
|
13
|
+
- Provide clear feedback on available updates and upgrade progress
|
14
|
+
"""
|
15
|
+
|
16
|
+
import asyncio
|
17
|
+
|
18
|
+
from ..shared import BaseCommand, CommandResult
|
19
|
+
|
20
|
+
|
21
|
+
class UpgradeCommand(BaseCommand):
|
22
|
+
"""Upgrade command using shared utilities."""
|
23
|
+
|
24
|
+
def __init__(self):
|
25
|
+
super().__init__("upgrade")
|
26
|
+
|
27
|
+
def validate_args(self, args) -> str:
|
28
|
+
"""Validate command arguments."""
|
29
|
+
# Upgrade command doesn't require specific validation
|
30
|
+
return None
|
31
|
+
|
32
|
+
def run(self, args) -> CommandResult:
|
33
|
+
"""Execute the upgrade command."""
|
34
|
+
try:
|
35
|
+
from ...services.self_upgrade_service import (
|
36
|
+
InstallationMethod,
|
37
|
+
SelfUpgradeService,
|
38
|
+
)
|
39
|
+
|
40
|
+
# Create upgrade service
|
41
|
+
upgrade_service = SelfUpgradeService()
|
42
|
+
|
43
|
+
# Check installation method
|
44
|
+
if upgrade_service.installation_method == InstallationMethod.EDITABLE:
|
45
|
+
self.logger.info(
|
46
|
+
"Editable installation detected - upgrade must be done manually"
|
47
|
+
)
|
48
|
+
print("\n⚠️ Editable Installation Detected")
|
49
|
+
print(
|
50
|
+
"\nYou are running claude-mpm from an editable installation (development mode)."
|
51
|
+
)
|
52
|
+
print("To upgrade, run:")
|
53
|
+
print(" cd /path/to/claude-mpm")
|
54
|
+
print(" git pull")
|
55
|
+
print(" pip install -e .")
|
56
|
+
return CommandResult.success_result(
|
57
|
+
"Upgrade information provided for editable installation"
|
58
|
+
)
|
59
|
+
|
60
|
+
# Check for updates
|
61
|
+
print("\n🔍 Checking for updates...")
|
62
|
+
loop = asyncio.new_event_loop()
|
63
|
+
asyncio.set_event_loop(loop)
|
64
|
+
try:
|
65
|
+
update_info = loop.run_until_complete(
|
66
|
+
upgrade_service.check_for_update()
|
67
|
+
)
|
68
|
+
finally:
|
69
|
+
loop.close()
|
70
|
+
|
71
|
+
if not update_info or not update_info.get("update_available"):
|
72
|
+
print(
|
73
|
+
f"\n✅ You are already on the latest version (v{upgrade_service.current_version})"
|
74
|
+
)
|
75
|
+
return CommandResult.success_result("Already on latest version")
|
76
|
+
|
77
|
+
# Display update information
|
78
|
+
current = update_info["current"]
|
79
|
+
latest = update_info["latest"]
|
80
|
+
method = update_info.get("installation_method", "unknown")
|
81
|
+
|
82
|
+
print("\n🎉 New version available!")
|
83
|
+
print(f" Current: v{current}")
|
84
|
+
print(f" Latest: v{latest}")
|
85
|
+
print(f" Installation method: {method}")
|
86
|
+
|
87
|
+
# Check if --yes flag is set for non-interactive upgrade
|
88
|
+
force_upgrade = getattr(args, "yes", False) or getattr(args, "force", False)
|
89
|
+
|
90
|
+
if not force_upgrade:
|
91
|
+
# Prompt user for confirmation
|
92
|
+
if not upgrade_service.prompt_for_upgrade(update_info):
|
93
|
+
print("\n⏸️ Upgrade cancelled by user")
|
94
|
+
return CommandResult.success_result("Upgrade cancelled by user")
|
95
|
+
|
96
|
+
# Perform upgrade
|
97
|
+
success, message = upgrade_service.perform_upgrade(update_info)
|
98
|
+
print(f"\n{message}")
|
99
|
+
|
100
|
+
if success:
|
101
|
+
# Restart after successful upgrade
|
102
|
+
upgrade_service.restart_after_upgrade()
|
103
|
+
# Note: This line won't be reached as restart replaces process
|
104
|
+
return CommandResult.success_result(f"Upgraded to v{latest}")
|
105
|
+
return CommandResult.error_result("Upgrade failed")
|
106
|
+
|
107
|
+
except Exception as e:
|
108
|
+
self.logger.error(f"Error during upgrade: {e}", exc_info=True)
|
109
|
+
return CommandResult.error_result(f"Error during upgrade: {e}")
|
110
|
+
|
111
|
+
|
112
|
+
def add_upgrade_parser(subparsers):
|
113
|
+
"""
|
114
|
+
Add upgrade command parser.
|
115
|
+
|
116
|
+
WHY: This command helps users check for and install the latest version of
|
117
|
+
claude-mpm without waiting for the automatic startup check.
|
118
|
+
|
119
|
+
Args:
|
120
|
+
subparsers: The subparser action object to add the upgrade command to
|
121
|
+
"""
|
122
|
+
parser = subparsers.add_parser(
|
123
|
+
"upgrade",
|
124
|
+
help="Check for and install latest claude-mpm version",
|
125
|
+
description="Check for updates and upgrade claude-mpm to the latest version from PyPI/npm",
|
126
|
+
)
|
127
|
+
|
128
|
+
parser.add_argument(
|
129
|
+
"-y",
|
130
|
+
"--yes",
|
131
|
+
action="store_true",
|
132
|
+
help="Skip confirmation prompt and upgrade immediately if available",
|
133
|
+
)
|
134
|
+
|
135
|
+
parser.add_argument(
|
136
|
+
"--force",
|
137
|
+
action="store_true",
|
138
|
+
help="Force upgrade even if already on latest version (alias for --yes)",
|
139
|
+
)
|
140
|
+
|
141
|
+
return parser
|
142
|
+
|
143
|
+
|
144
|
+
def upgrade(args):
|
145
|
+
"""
|
146
|
+
Main entry point for upgrade command.
|
147
|
+
|
148
|
+
This function maintains backward compatibility while using the new BaseCommand pattern.
|
149
|
+
"""
|
150
|
+
command = UpgradeCommand()
|
151
|
+
result = command.execute(args)
|
152
|
+
return result.exit_code
|
@@ -423,6 +423,11 @@ def create_parser(
|
|
423
423
|
|
424
424
|
add_doctor_parser(subparsers)
|
425
425
|
|
426
|
+
# Add upgrade command
|
427
|
+
from ..commands.upgrade import add_upgrade_parser
|
428
|
+
|
429
|
+
add_upgrade_parser(subparsers)
|
430
|
+
|
426
431
|
# Add verify command for MCP service verification
|
427
432
|
from ..commands.verify import add_parser as add_verify_parser
|
428
433
|
|
@@ -131,11 +131,6 @@ def add_mpm_init_subparser(subparsers: Any) -> None:
|
|
131
131
|
action="store_true",
|
132
132
|
help="Create comprehensive setup including CI/CD, testing, and deployment configs",
|
133
133
|
)
|
134
|
-
init_group.add_argument(
|
135
|
-
"--use-venv",
|
136
|
-
action="store_true",
|
137
|
-
help="Use traditional Python venv instead of mamba/conda environment",
|
138
|
-
)
|
139
134
|
init_group.add_argument(
|
140
135
|
"--ast-analysis",
|
141
136
|
action="store_true",
|
claude_mpm/constants.py
CHANGED
@@ -40,9 +40,11 @@ class MemoryManager(IMemoryManager):
|
|
40
40
|
4. Legacy format migration (e.g., PM.md -> PM_memories.md)
|
41
41
|
5. Memory caching for performance
|
42
42
|
|
43
|
-
Memory
|
44
|
-
-
|
45
|
-
-
|
43
|
+
Memory Scope:
|
44
|
+
- Project-level ONLY: ./.claude-mpm/memories/ (project-scoped isolation)
|
45
|
+
- User-level memories are NOT loaded to prevent cross-project contamination
|
46
|
+
|
47
|
+
Note: As of v4.7.10+, memories are strictly project-scoped for complete isolation.
|
46
48
|
"""
|
47
49
|
|
48
50
|
def __init__(
|
@@ -279,7 +281,10 @@ class MemoryManager(IMemoryManager):
|
|
279
281
|
|
280
282
|
def _load_actual_memories(self, deployed_agents: Set[str]) -> Dict[str, Any]:
|
281
283
|
"""
|
282
|
-
Load actual memories from
|
284
|
+
Load actual memories from project directory only.
|
285
|
+
|
286
|
+
Memories are project-scoped to ensure complete isolation between projects.
|
287
|
+
User-level memories are no longer supported to prevent cross-project contamination.
|
283
288
|
|
284
289
|
Args:
|
285
290
|
deployed_agents: Set of deployed agent names
|
@@ -287,32 +292,14 @@ class MemoryManager(IMemoryManager):
|
|
287
292
|
Returns:
|
288
293
|
Dictionary with actual_memories and agent_memories
|
289
294
|
"""
|
290
|
-
# Define memory
|
291
|
-
user_memories_dir = Path.home() / ".claude-mpm" / "memories"
|
295
|
+
# Define project memory directory (project-scoped only)
|
292
296
|
project_memories_dir = Path.cwd() / ".claude-mpm" / "memories"
|
293
297
|
|
294
298
|
# Dictionary to store aggregated memories
|
295
299
|
pm_memories = []
|
296
300
|
agent_memories_dict = {}
|
297
301
|
|
298
|
-
# Load memories from
|
299
|
-
if user_memories_dir.exists():
|
300
|
-
self.logger.info(
|
301
|
-
f"Loading user-level memory files from: {user_memories_dir}"
|
302
|
-
)
|
303
|
-
self._load_memories_from_directory(
|
304
|
-
user_memories_dir,
|
305
|
-
deployed_agents,
|
306
|
-
pm_memories,
|
307
|
-
agent_memories_dict,
|
308
|
-
"user",
|
309
|
-
)
|
310
|
-
else:
|
311
|
-
self.logger.debug(
|
312
|
-
f"No user memories directory found at: {user_memories_dir}"
|
313
|
-
)
|
314
|
-
|
315
|
-
# Load memories from project directory (overrides user memories)
|
302
|
+
# Load memories from project directory only
|
316
303
|
if project_memories_dir.exists():
|
317
304
|
self.logger.info(
|
318
305
|
f"Loading project-level memory files from: {project_memories_dir}"
|
@@ -0,0 +1,342 @@
|
|
1
|
+
"""
|
2
|
+
Self-Upgrade Service
|
3
|
+
====================
|
4
|
+
|
5
|
+
Handles version checking and self-upgrade functionality for claude-mpm.
|
6
|
+
Supports pip, pipx, and npm installations with automatic detection.
|
7
|
+
|
8
|
+
WHY: Users should be notified of updates and have an easy way to upgrade
|
9
|
+
without manually running installation commands.
|
10
|
+
|
11
|
+
DESIGN DECISIONS:
|
12
|
+
- Detects installation method (pip/pipx/npm/editable)
|
13
|
+
- Non-blocking version checks with caching
|
14
|
+
- Interactive upgrade prompts with confirmation
|
15
|
+
- Automatic restart after upgrade
|
16
|
+
- Graceful failure handling (never breaks existing installation)
|
17
|
+
"""
|
18
|
+
|
19
|
+
import os
|
20
|
+
import subprocess
|
21
|
+
import sys
|
22
|
+
from datetime import datetime, timezone
|
23
|
+
from pathlib import Path
|
24
|
+
from typing import Dict, Optional, Tuple
|
25
|
+
|
26
|
+
from packaging import version
|
27
|
+
|
28
|
+
from ..core.logger import get_logger
|
29
|
+
from ..core.unified_paths import PathContext
|
30
|
+
from .mcp_gateway.utils.package_version_checker import PackageVersionChecker
|
31
|
+
|
32
|
+
|
33
|
+
class InstallationMethod:
|
34
|
+
"""Installation method enumeration."""
|
35
|
+
|
36
|
+
PIP = "pip"
|
37
|
+
PIPX = "pipx"
|
38
|
+
NPM = "npm"
|
39
|
+
EDITABLE = "editable"
|
40
|
+
UNKNOWN = "unknown"
|
41
|
+
|
42
|
+
|
43
|
+
class SelfUpgradeService:
|
44
|
+
"""
|
45
|
+
Service for checking and performing self-upgrades.
|
46
|
+
|
47
|
+
Capabilities:
|
48
|
+
- Detect current installation method
|
49
|
+
- Check PyPI/npm for latest version
|
50
|
+
- Prompt user for upgrade confirmation
|
51
|
+
- Execute upgrade command
|
52
|
+
- Restart after upgrade
|
53
|
+
"""
|
54
|
+
|
55
|
+
def __init__(self):
|
56
|
+
"""Initialize the self-upgrade service."""
|
57
|
+
self.logger = get_logger("SelfUpgradeService")
|
58
|
+
self.version_checker = PackageVersionChecker()
|
59
|
+
self.current_version = self._get_current_version()
|
60
|
+
self.installation_method = self._detect_installation_method()
|
61
|
+
|
62
|
+
def _get_current_version(self) -> str:
|
63
|
+
"""
|
64
|
+
Get the current installed version.
|
65
|
+
|
66
|
+
Returns:
|
67
|
+
Version string (e.g., "4.7.10")
|
68
|
+
"""
|
69
|
+
try:
|
70
|
+
from .. import __version__
|
71
|
+
|
72
|
+
return __version__
|
73
|
+
except ImportError:
|
74
|
+
# Fallback to VERSION file
|
75
|
+
try:
|
76
|
+
version_file = Path(__file__).parent.parent / "VERSION"
|
77
|
+
if version_file.exists():
|
78
|
+
return version_file.read_text().strip()
|
79
|
+
except Exception:
|
80
|
+
pass
|
81
|
+
|
82
|
+
return "unknown"
|
83
|
+
|
84
|
+
def _detect_installation_method(self) -> str:
|
85
|
+
"""
|
86
|
+
Detect how claude-mpm was installed.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
Installation method constant
|
90
|
+
"""
|
91
|
+
# Check for editable install
|
92
|
+
if PathContext.detect_deployment_context().name in [
|
93
|
+
"DEVELOPMENT",
|
94
|
+
"EDITABLE_INSTALL",
|
95
|
+
]:
|
96
|
+
return InstallationMethod.EDITABLE
|
97
|
+
|
98
|
+
# Check for pipx by looking at executable path
|
99
|
+
executable = sys.executable
|
100
|
+
if "pipx" in executable:
|
101
|
+
return InstallationMethod.PIPX
|
102
|
+
|
103
|
+
# Check if npm wrapper is present
|
104
|
+
try:
|
105
|
+
result = subprocess.run(
|
106
|
+
["npm", "list", "-g", "claude-mpm"],
|
107
|
+
check=False,
|
108
|
+
capture_output=True,
|
109
|
+
text=True,
|
110
|
+
timeout=5,
|
111
|
+
)
|
112
|
+
if result.returncode == 0 and "claude-mpm" in result.stdout:
|
113
|
+
return InstallationMethod.NPM
|
114
|
+
except Exception:
|
115
|
+
pass
|
116
|
+
|
117
|
+
# Default to pip
|
118
|
+
return InstallationMethod.PIP
|
119
|
+
|
120
|
+
async def check_for_update(
|
121
|
+
self, cache_ttl: Optional[int] = None
|
122
|
+
) -> Optional[Dict[str, any]]:
|
123
|
+
"""
|
124
|
+
Check if an update is available.
|
125
|
+
|
126
|
+
Args:
|
127
|
+
cache_ttl: Cache time-to-live in seconds (default: 24 hours)
|
128
|
+
|
129
|
+
Returns:
|
130
|
+
Dict with update info or None:
|
131
|
+
{
|
132
|
+
"current": "4.7.10",
|
133
|
+
"latest": "4.7.11",
|
134
|
+
"update_available": True,
|
135
|
+
"installation_method": "pipx",
|
136
|
+
"upgrade_command": "pipx upgrade claude-mpm"
|
137
|
+
}
|
138
|
+
"""
|
139
|
+
if self.current_version == "unknown":
|
140
|
+
self.logger.warning("Cannot check for updates: version unknown")
|
141
|
+
return None
|
142
|
+
|
143
|
+
# Check PyPI for Python installations
|
144
|
+
if self.installation_method in [
|
145
|
+
InstallationMethod.PIP,
|
146
|
+
InstallationMethod.PIPX,
|
147
|
+
]:
|
148
|
+
result = await self.version_checker.check_for_update(
|
149
|
+
"claude-mpm", self.current_version, cache_ttl
|
150
|
+
)
|
151
|
+
if result and result.get("update_available"):
|
152
|
+
result["installation_method"] = self.installation_method
|
153
|
+
result["upgrade_command"] = self._get_upgrade_command()
|
154
|
+
return result
|
155
|
+
|
156
|
+
# Check npm for npm installations
|
157
|
+
elif self.installation_method == InstallationMethod.NPM:
|
158
|
+
npm_version = await self._check_npm_version()
|
159
|
+
if npm_version:
|
160
|
+
current_ver = version.parse(self.current_version)
|
161
|
+
latest_ver = version.parse(npm_version)
|
162
|
+
if latest_ver > current_ver:
|
163
|
+
return {
|
164
|
+
"current": self.current_version,
|
165
|
+
"latest": npm_version,
|
166
|
+
"update_available": True,
|
167
|
+
"installation_method": InstallationMethod.NPM,
|
168
|
+
"upgrade_command": self._get_upgrade_command(),
|
169
|
+
"checked_at": datetime.now(timezone.utc).isoformat(),
|
170
|
+
}
|
171
|
+
|
172
|
+
return None
|
173
|
+
|
174
|
+
async def _check_npm_version(self) -> Optional[str]:
|
175
|
+
"""
|
176
|
+
Check npm registry for latest version.
|
177
|
+
|
178
|
+
Returns:
|
179
|
+
Latest version string or None
|
180
|
+
"""
|
181
|
+
try:
|
182
|
+
result = subprocess.run(
|
183
|
+
["npm", "view", "claude-mpm", "version"],
|
184
|
+
check=False,
|
185
|
+
capture_output=True,
|
186
|
+
text=True,
|
187
|
+
timeout=10,
|
188
|
+
)
|
189
|
+
if result.returncode == 0:
|
190
|
+
return result.stdout.strip()
|
191
|
+
except Exception as e:
|
192
|
+
self.logger.debug(f"npm version check failed: {e}")
|
193
|
+
|
194
|
+
return None
|
195
|
+
|
196
|
+
def _get_upgrade_command(self) -> str:
|
197
|
+
"""
|
198
|
+
Get the appropriate upgrade command for current installation method.
|
199
|
+
|
200
|
+
Returns:
|
201
|
+
Shell command string to upgrade claude-mpm
|
202
|
+
"""
|
203
|
+
if self.installation_method == InstallationMethod.PIPX:
|
204
|
+
return "pipx upgrade claude-mpm"
|
205
|
+
if self.installation_method == InstallationMethod.NPM:
|
206
|
+
return "npm update -g claude-mpm"
|
207
|
+
if self.installation_method == InstallationMethod.PIP:
|
208
|
+
return f"{sys.executable} -m pip install --upgrade claude-mpm"
|
209
|
+
if self.installation_method == InstallationMethod.EDITABLE:
|
210
|
+
return "git pull && pip install -e ."
|
211
|
+
return "pip install --upgrade claude-mpm"
|
212
|
+
|
213
|
+
def prompt_for_upgrade(self, update_info: Dict[str, any]) -> bool:
|
214
|
+
"""
|
215
|
+
Prompt user to upgrade.
|
216
|
+
|
217
|
+
Args:
|
218
|
+
update_info: Update information dict
|
219
|
+
|
220
|
+
Returns:
|
221
|
+
True if user confirms upgrade, False otherwise
|
222
|
+
"""
|
223
|
+
current = update_info["current"]
|
224
|
+
latest = update_info["latest"]
|
225
|
+
method = update_info.get("installation_method", "unknown")
|
226
|
+
|
227
|
+
print("\n🎉 New version available!")
|
228
|
+
print(f" Current: v{current}")
|
229
|
+
print(f" Latest: v{latest}")
|
230
|
+
print(f" Installation method: {method}")
|
231
|
+
print(f"\nTo upgrade, run: {update_info['upgrade_command']}")
|
232
|
+
|
233
|
+
try:
|
234
|
+
response = input("\nWould you like to upgrade now? [y/N]: ").strip().lower()
|
235
|
+
return response in ["y", "yes"]
|
236
|
+
except (KeyboardInterrupt, EOFError):
|
237
|
+
print("\n")
|
238
|
+
return False
|
239
|
+
|
240
|
+
def perform_upgrade(self, update_info: Dict[str, any]) -> Tuple[bool, str]:
|
241
|
+
"""
|
242
|
+
Perform the upgrade.
|
243
|
+
|
244
|
+
Args:
|
245
|
+
update_info: Update information dict
|
246
|
+
|
247
|
+
Returns:
|
248
|
+
Tuple of (success: bool, message: str)
|
249
|
+
"""
|
250
|
+
command = update_info["upgrade_command"]
|
251
|
+
|
252
|
+
# Don't upgrade editable installs automatically
|
253
|
+
if self.installation_method == InstallationMethod.EDITABLE:
|
254
|
+
return (
|
255
|
+
False,
|
256
|
+
"Editable installation detected. Please update manually with: git pull && pip install -e .",
|
257
|
+
)
|
258
|
+
|
259
|
+
print("\n⏳ Upgrading claude-mpm...")
|
260
|
+
print(f" Running: {command}")
|
261
|
+
|
262
|
+
try:
|
263
|
+
# Execute upgrade command
|
264
|
+
result = subprocess.run(
|
265
|
+
command,
|
266
|
+
check=False,
|
267
|
+
shell=True,
|
268
|
+
capture_output=True,
|
269
|
+
text=True,
|
270
|
+
timeout=300, # 5 minutes
|
271
|
+
)
|
272
|
+
|
273
|
+
if result.returncode == 0:
|
274
|
+
return (True, f"✅ Successfully upgraded to v{update_info['latest']}")
|
275
|
+
error_msg = result.stderr or result.stdout or "Unknown error"
|
276
|
+
return (False, f"❌ Upgrade failed: {error_msg}")
|
277
|
+
|
278
|
+
except subprocess.TimeoutExpired:
|
279
|
+
return (False, "❌ Upgrade timed out")
|
280
|
+
except Exception as e:
|
281
|
+
return (False, f"❌ Upgrade failed: {e!s}")
|
282
|
+
|
283
|
+
def restart_after_upgrade(self) -> None:
|
284
|
+
"""
|
285
|
+
Restart claude-mpm after a successful upgrade.
|
286
|
+
|
287
|
+
Preserves original command line arguments.
|
288
|
+
"""
|
289
|
+
print("\n🔄 Restarting claude-mpm...")
|
290
|
+
|
291
|
+
try:
|
292
|
+
# Get current command line arguments
|
293
|
+
args = sys.argv[:]
|
294
|
+
|
295
|
+
# Replace current process with new one
|
296
|
+
if self.installation_method == InstallationMethod.PIPX:
|
297
|
+
# Use pipx run
|
298
|
+
os.execvp("pipx", ["pipx", "run", "claude-mpm", *args[1:]])
|
299
|
+
elif self.installation_method == InstallationMethod.NPM:
|
300
|
+
# Use npm executable
|
301
|
+
os.execvp("claude-mpm", args)
|
302
|
+
else:
|
303
|
+
# Use Python executable
|
304
|
+
os.execvp(sys.executable, [sys.executable, *args])
|
305
|
+
|
306
|
+
except Exception as e:
|
307
|
+
self.logger.error(f"Failed to restart: {e}")
|
308
|
+
print(f"\n⚠️ Restart failed: {e}")
|
309
|
+
print("Please restart claude-mpm manually.")
|
310
|
+
|
311
|
+
async def check_and_prompt_on_startup(
|
312
|
+
self, auto_upgrade: bool = False
|
313
|
+
) -> Optional[Dict[str, any]]:
|
314
|
+
"""
|
315
|
+
Check for updates on startup and optionally prompt user.
|
316
|
+
|
317
|
+
Args:
|
318
|
+
auto_upgrade: If True, upgrade without prompting (use with caution)
|
319
|
+
|
320
|
+
Returns:
|
321
|
+
Update info if available, None otherwise
|
322
|
+
"""
|
323
|
+
# Skip for editable installs
|
324
|
+
if self.installation_method == InstallationMethod.EDITABLE:
|
325
|
+
return None
|
326
|
+
|
327
|
+
try:
|
328
|
+
update_info = await self.check_for_update()
|
329
|
+
|
330
|
+
if update_info and update_info.get("update_available"):
|
331
|
+
if auto_upgrade or self.prompt_for_upgrade(update_info):
|
332
|
+
success, message = self.perform_upgrade(update_info)
|
333
|
+
print(message)
|
334
|
+
if success:
|
335
|
+
self.restart_after_upgrade()
|
336
|
+
|
337
|
+
return update_info
|
338
|
+
|
339
|
+
except Exception as e:
|
340
|
+
self.logger.debug(f"Startup version check failed: {e}")
|
341
|
+
|
342
|
+
return None
|
@@ -1,8 +1,8 @@
|
|
1
1
|
claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
|
2
|
-
claude_mpm/VERSION,sha256=
|
2
|
+
claude_mpm/VERSION,sha256=STjviM123X9il6PR0MV6-cjkIOk1nnePP8NyWoeBrwo,6
|
3
3
|
claude_mpm/__init__.py,sha256=UCw6j9e_tZQ3kJtTqmdfNv7MHyw9nD1jkj80WurwM2g,2064
|
4
4
|
claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
|
5
|
-
claude_mpm/constants.py,sha256=
|
5
|
+
claude_mpm/constants.py,sha256=sLjJF6Kw7H4V9WWeaEYltM-77TgXqzEMX5vx4ukM5-0,5977
|
6
6
|
claude_mpm/init.py,sha256=HFJR_JmTHa53FAhbGusm3P1iXT6VR6V7S-YJz4pOZ1Q,15967
|
7
7
|
claude_mpm/ticket_wrapper.py,sha256=qe5xY579t7_7fK5nyeAfHN_fr7CXdeOD3jfXEc8-7yo,828
|
8
8
|
claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=aK9qxS1FRpm_8VaB5GI2I6YA9Wr8dGHuea_txMFe44M,5524
|
@@ -34,6 +34,7 @@ claude_mpm/agents/templates/agentic-coder-optimizer.json,sha256=injWgR0aHjFh88wL
|
|
34
34
|
claude_mpm/agents/templates/api_qa.json,sha256=FxDFIDsihrw8acBugsiY9RtkNtKF0fUT20f9ox6jihU,5786
|
35
35
|
claude_mpm/agents/templates/clerk-ops.json,sha256=4xB-ndC-hpOvrjJTeVLZeSrN1hTyrDf3RbaiamZQvTU,17116
|
36
36
|
claude_mpm/agents/templates/code_analyzer.json,sha256=5t5a9gzKW8BDv9-GgZx2dhEJ0dPlu5YO3zuoOJIuWHQ,7417
|
37
|
+
claude_mpm/agents/templates/content-agent.json,sha256=xLgZdtYTab-BM8a9L0szJap6_6tM_xxCZxOdR5wfp1I,29956
|
37
38
|
claude_mpm/agents/templates/dart_engineer.json,sha256=-GSr98Ut_raIZdL73Wcv5lMK2JG4mGhzAVnPjVYIxX4,22219
|
38
39
|
claude_mpm/agents/templates/data_engineer.json,sha256=FdjmqOB1cc-cDDOV7IYjOoiavnGNxXT0_7ICkRApey4,19562
|
39
40
|
claude_mpm/agents/templates/documentation.json,sha256=3rk1hZmqG65CKOZ8RwVAPfQe2a4b5xu_K29RS4tGeK8,10026
|
@@ -64,7 +65,7 @@ claude_mpm/agents/templates/.claude-mpm/memories/README.md,sha256=vEiG7cPjHRZfwX
|
|
64
65
|
claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md,sha256=KMZSJrQi-wHOwfl2C0m3A4PpC4QuBtDolAtVybGahKc,77
|
65
66
|
claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md,sha256=UBm4BycXtdaa-_l1VCh0alTGGOUSsnCbpKwbFuI-mUY,2219
|
66
67
|
claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md,sha256=oPvFSYFnmJ4TkbTe4AZnNHWaJMJ-xqZP2WM6scUKQKo,13089
|
67
|
-
claude_mpm/cli/__init__.py,sha256=
|
68
|
+
claude_mpm/cli/__init__.py,sha256=Ed8uPUqS5FmIAMxxIPxpo5JJX2ZWXIe5v-vx8K9jBEE,29373
|
68
69
|
claude_mpm/cli/__main__.py,sha256=WnVGBwe10InxuZjJRFdwuMF6Gh16aXox6zFgxr0sRXk,847
|
69
70
|
claude_mpm/cli/parser.py,sha256=Vqx9n-6Xo1uNhXR4rThmgWpZXTr0nOtkgDf3oMS9b0g,5855
|
70
71
|
claude_mpm/cli/startup_logging.py,sha256=RTuyd6CbhiFQz7Z07LDDhK_ZAnZfuJ9B0NghVSntHFI,29390
|
@@ -96,12 +97,13 @@ claude_mpm/cli/commands/mcp_setup_external.py,sha256=hfBHkaioNa0JRDhahNEc8agyrUw
|
|
96
97
|
claude_mpm/cli/commands/mcp_tool_commands.py,sha256=q17GzlFT3JiLTrDqwPO2tz1-fKmPO5QU449syTnKTz4,1283
|
97
98
|
claude_mpm/cli/commands/memory.py,sha256=O4T5HGL-Ob_QPt2dZHQvoOrVohnaDKrBjyngq1Mcv1w,26185
|
98
99
|
claude_mpm/cli/commands/monitor.py,sha256=Fjb68hf3dEwTFek2LV8Nh6iU0qEkY7qYlOn32IwNaNg,9566
|
99
|
-
claude_mpm/cli/commands/mpm_init.py,sha256=
|
100
|
+
claude_mpm/cli/commands/mpm_init.py,sha256=OtdJMsFn7E9Ck56wWPrCvqw6j5dsN_VI098C3bteitc,63888
|
100
101
|
claude_mpm/cli/commands/mpm_init_handler.py,sha256=b1CSwZYJ89wMorKzPOKS-RVxOKR2kT9yv9KQLvKkd2U,3532
|
101
102
|
claude_mpm/cli/commands/run.py,sha256=PB2H55piOPTy4yo4OBgbUCjMlcz9K79wbwpxQVc9m5Q,48225
|
102
103
|
claude_mpm/cli/commands/search.py,sha256=_0qbUnop8v758MHsB0fAop8FVxwygD59tec_-iN7pLE,9806
|
103
104
|
claude_mpm/cli/commands/tickets.py,sha256=kl2dklTBnG3Y4jUUJ_PcEVsTx4CtVJfkGWboWBx_mQM,21234
|
104
105
|
claude_mpm/cli/commands/uninstall.py,sha256=KGlVG6veEs1efLVjrZ3wSty7e1zVR9wpt-VXQA1RzWw,5945
|
106
|
+
claude_mpm/cli/commands/upgrade.py,sha256=NYMVONNlj78WHoQ6eyVInroE95AeQxUY2_TpjYFTdYE,5409
|
105
107
|
claude_mpm/cli/commands/verify.py,sha256=wmu2UYINK15q2e34TdlTyamvtLDE7r3Oj_XT9zpT5Kk,3687
|
106
108
|
claude_mpm/cli/interactive/__init__.py,sha256=vQqUCgPFvLYA1Vkq-5pnY7Ow3A-IgdM0SByfNL1ZLTk,433
|
107
109
|
claude_mpm/cli/interactive/agent_wizard.py,sha256=v3nKcLusU49ewjCqvgUWsG35UGc82pC7_Uv-ZzAHZ-c,36201
|
@@ -110,7 +112,7 @@ claude_mpm/cli/parsers/agent_manager_parser.py,sha256=TQEIm638ELM4X_AAGcn6WrJxlt
|
|
110
112
|
claude_mpm/cli/parsers/agents_parser.py,sha256=R-9ESNXdjqr5iCEIcmbb2EPvcswW9UfJzMj5bAkgI4U,9042
|
111
113
|
claude_mpm/cli/parsers/analyze_code_parser.py,sha256=cpJSMFbc3mqB4qrMBIEZiikzPekC2IQX-cjt9U2fHW4,5356
|
112
114
|
claude_mpm/cli/parsers/analyze_parser.py,sha256=E00Ao0zwzbJPchs_AJt-aoQ7LQEtJPXRCNQ6Piivb4o,3908
|
113
|
-
claude_mpm/cli/parsers/base_parser.py,sha256=
|
115
|
+
claude_mpm/cli/parsers/base_parser.py,sha256=iGYJ_-wIXkL4iVclJgrzQ2kz_of3CIqCwIM-FnFKEQI,14298
|
114
116
|
claude_mpm/cli/parsers/config_parser.py,sha256=wp6NbV8_p9txP28MXFcQrri0JDIfGFM7u4aJbYJXcYQ,2699
|
115
117
|
claude_mpm/cli/parsers/configure_parser.py,sha256=t3cwAQX3BfljDDRJH3i0LplpRprw5jdKcI9Uy3M8xtE,4382
|
116
118
|
claude_mpm/cli/parsers/dashboard_parser.py,sha256=JBCM6v_iZhADr_Fwtk_d3up9AOod1avMab-vkNE61gE,3460
|
@@ -118,7 +120,7 @@ claude_mpm/cli/parsers/debug_parser.py,sha256=F7MZdmiXiPfiIPMv21ZUqB2cMT8Ho1LDmp
|
|
118
120
|
claude_mpm/cli/parsers/mcp_parser.py,sha256=2j6ULhdu55Z2k_-Gu2QxIsFoTQFbDCEMSGePXSuPoQQ,6532
|
119
121
|
claude_mpm/cli/parsers/memory_parser.py,sha256=ZwCDxJEgp-w03L-1tZsWTgisiwamP42s424bA5bvDJc,4760
|
120
122
|
claude_mpm/cli/parsers/monitor_parser.py,sha256=PeoznSi_5Bw6THK_Espl8M20o6dKvvBSmFzAbovkaFQ,4920
|
121
|
-
claude_mpm/cli/parsers/mpm_init_parser.py,sha256=
|
123
|
+
claude_mpm/cli/parsers/mpm_init_parser.py,sha256=aGMwrHs7acB61sNDI0M7gf23yGDV4Q7b7iX7XnWC0yQ,7658
|
122
124
|
claude_mpm/cli/parsers/run_parser.py,sha256=cs34qNonFZG8uYxTYEt0rXi2LcPz3pw8D8hxiywih6w,4927
|
123
125
|
claude_mpm/cli/parsers/search_parser.py,sha256=L8-65kndg-zutSKpzj-eCvTNkeySCZ-WlSHdhk7pEak,6916
|
124
126
|
claude_mpm/cli/parsers/tickets_parser.py,sha256=FYl-VNH7PrZzfZUCcjnf6F7g6JXnL8YDxwrmR5svIcg,6966
|
@@ -427,6 +429,7 @@ claude_mpm/services/project_port_allocator.py,sha256=L_EPuX_vGdv8vWWRVTpRk7F-v7u
|
|
427
429
|
claude_mpm/services/recovery_manager.py,sha256=ptUYsguF6oKWnJnzPRSBuzUFVDXIcvsS3svT6MBTqCQ,25686
|
428
430
|
claude_mpm/services/response_tracker.py,sha256=wBPgI5fH40xc7NHcCXQFOTPFTPSVbAZPqXIauXOJA5g,9575
|
429
431
|
claude_mpm/services/runner_configuration_service.py,sha256=Qs84yrZfQv-DC0I2Xah1Qt9eunH4gS7LNMZ0mmymcqA,21311
|
432
|
+
claude_mpm/services/self_upgrade_service.py,sha256=PuzHFQ3fQx7I9rmINLWs86o2KVyr-1StolLR-xnkOrQ,11246
|
430
433
|
claude_mpm/services/session_management_service.py,sha256=axGZXpexWcYGnOMt5o8UQnFJUN3aVyjXRpFAcFrNKeg,10060
|
431
434
|
claude_mpm/services/session_manager.py,sha256=ElguSoiy725VWS2iEqtcn0dUPIRrQrrON74aUzrWjRE,5147
|
432
435
|
claude_mpm/services/socketio_client_manager.py,sha256=cZjIsnoi2VPXFA-5pNhoz5Vv3qv0iuSTy510TgAJU4U,18179
|
@@ -546,7 +549,7 @@ claude_mpm/services/core/__init__.py,sha256=evEayLlBqJvxMZhrhuK6aagXmNrKGSj8Jm9O
|
|
546
549
|
claude_mpm/services/core/base.py,sha256=iA-F7DgGp-FJIMvQTiHQ68RkG_k-AtUWlArJPMw6ZPk,7297
|
547
550
|
claude_mpm/services/core/cache_manager.py,sha256=dBHvvI6M67kaxFtAubi4IsWfbDZSct1siyKHTmCIrW8,11567
|
548
551
|
claude_mpm/services/core/interfaces.py,sha256=FbLhWiOUMlvBfqjYBCeoWgsmRscQGBKteRMW-BGz4hQ,1261
|
549
|
-
claude_mpm/services/core/memory_manager.py,sha256=
|
552
|
+
claude_mpm/services/core/memory_manager.py,sha256=aajBuvBzTq0-EZrjnBjGRdUSaa6MpbfqHAtCePnn7aQ,26258
|
550
553
|
claude_mpm/services/core/path_resolver.py,sha256=VtqiOEUlskAr9nRsaS9uXQSSjDD8dIrYfNML0zLY2zo,17764
|
551
554
|
claude_mpm/services/core/service_container.py,sha256=3hDwFUahxFZnokPzwgXqBP9swvZhLztKQqwe9xEHgsw,18497
|
552
555
|
claude_mpm/services/core/service_interfaces.py,sha256=dlNp0K4gaMcLiNSZxXjsL-kto6vipYw87pBuFK7oVNo,10770
|
@@ -786,9 +789,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
|
|
786
789
|
claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
|
787
790
|
claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
|
788
791
|
claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
|
789
|
-
claude_mpm-4.
|
790
|
-
claude_mpm-4.
|
791
|
-
claude_mpm-4.
|
792
|
-
claude_mpm-4.
|
793
|
-
claude_mpm-4.
|
794
|
-
claude_mpm-4.
|
792
|
+
claude_mpm-4.8.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
|
793
|
+
claude_mpm-4.8.0.dist-info/METADATA,sha256=zDfqp-t5ALEzKUJM2qeRo9nrEmPE76-Iw7468Id_vgU,17517
|
794
|
+
claude_mpm-4.8.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
795
|
+
claude_mpm-4.8.0.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
|
796
|
+
claude_mpm-4.8.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
|
797
|
+
claude_mpm-4.8.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|