| name | manifest-automation |
| description | Create and update manifest files using advanced web automation with Playwright, intelligent retry logic, and smart merge capabilities |
Manifest Automation Skill
Automate the creation and updating of manifest files for AI coding tools using advanced browser automation, web search, and intelligent field-level retry logic.
Overview
This skill extends beyond the existing manifest-creator by adding:
- Dual Mode Operation: CREATE new manifests or UPDATE existing ones with smart merge
- Advanced Web Automation: Playwright MCP for dynamic content, pricing calculators, and marketplace navigation
- Intelligent Retry Logic: 3-attempt strategy per field with graceful degradation to TODO comments
- Smart Merge: UPDATE mode preserves user-curated data while refreshing auto-discoverable fields
- Type-Optimized Workflows: Dedicated extraction strategies for each manifest type
Supported Manifest Types
- CLI - Command-line tools with platform-specific install commands
- Extension - IDE extensions with marketplace URLs and install URIs
- IDE - Integrated development environments with GUI installers
- Model - AI models with technical specs and token pricing
- Provider - Model providers (foundation or service)
- Vendor - Companies and organizations
Usage
CREATE Mode
Create a new manifest from scratch:
# CLI tool
node .claude/skills/manifest-automation/scripts/automate.mjs create cli cursor-cli https://cursor.com/cli
# Extension
node .claude/skills/manifest-automation/scripts/automate.mjs create extension copilot https://github.com/features/copilot
# Model
node .claude/skills/manifest-automation/scripts/automate.mjs create model claude-opus https://anthropic.com/claude
# Provider
node .claude/skills/manifest-automation/scripts/automate.mjs create provider openrouter https://openrouter.ai
# IDE
node .claude/skills/manifest-automation/scripts/automate.mjs create ide cursor https://cursor.com
# Vendor
node .claude/skills/manifest-automation/scripts/automate.mjs create vendor anthropic https://anthropic.com
UPDATE Mode
Update an existing manifest with fresh data:
# Update existing CLI manifest
node .claude/skills/manifest-automation/scripts/automate.mjs update cli cursor-cli https://cursor.com/cli
# Update extension (URL optional if already in manifest)
node .claude/skills/manifest-automation/scripts/automate.mjs update extension copilot
How It Works
CREATE Mode Workflow
Load Schema & Workflow
- Read JSON schema for manifest type
- Load type-specific workflow instructions
- Initialize field tracker for retry logic
Extract Information
- Use Playwright MCP to navigate websites
- Use WebSearch to discover GitHub repos, marketplaces, social media
- Extract data following type-specific workflow
- Track attempts per field (max 3)
Handle Failures Gracefully
- After 3 failed attempts per field: add TODO comment
- Continue with partial data (save as draft)
- Generate completion report
Validate & Save
- Write manifest JSON to appropriate path
- For IDE/CLI/Extension: check vendor manifest exists, create if missing
- Update
data/github-stars.json - Run
npm run generateto regenerate TypeScript data files - Run schema validation
- Report success/failures to user
UPDATE Mode Workflow
Load Existing Manifest
- Read current manifest from disk
- Parse and validate structure
Extract Fresh Data
- Follow same extraction workflow as CREATE
- Use Playwright and WebSearch for current data
Smart Merge
- AUTO_UPDATE: Replace with new values (versions, descriptions, pricing, specs)
- PRESERVE: Keep existing (id, name, verified, i18n, relatedProducts)
- MERGE_ADDITIVE: Add new items to arrays/objects (communityUrls, platforms)
- CONDITIONAL: Present both for manual review (license)
Generate Change Report
- Show what was updated, added, preserved
- Flag fields needing manual review
- Validate and save merged manifest
Field Extraction Strategies
CLI Workflow Focus
- Platform-specific install commands (brew, npm, apt, winget)
- Launch commands and installation paths
- GitHub releases for version tracking
- Cross-platform support detection
Extension Workflow Focus
- IDE marketplace URLs (VS Code, JetBrains, Open VSX)
- Install URIs (vscode:extension/, cursor:extension/)
- Supported IDE detection and compatibility
- Publisher and extension ID extraction
Model Workflow Focus
- Technical specifications (parameter size, context window, max output)
- Token pricing ($/M tokens for input/output/cache)
- Platform URLs (HuggingFace, Artificial Analysis, OpenRouter)
- Model card information extraction
Provider Workflow Focus
- Provider type detection (foundation vs service)
- API key application URLs
- Platform integration discovery
- Developer documentation
IDE Workflow Focus
- GUI installation (DMG, EXE, DEB installers)
- Download page navigation
- App Store distributions
- GUI-based installation steps
Vendor Workflow Focus
- Company mission and description
- Official social media accounts
- Community links and presence
- Organization-level information
Tool Integration
When to Use Each Tool
Playwright MCP (mcp__playwright__browser_*):
- Dynamic JavaScript-rendered content
- Multi-step navigation (tabs, dropdowns, modals)
- IDE marketplace pages
- Pricing calculators and forms
- Interactive website elements
- LinkedIn company pages (verification and metadata)
WebSearch:
- Discovering GitHub repositories
- Finding marketplace URLs
- Locating social media profiles
- Platform-specific pages (HuggingFace, npm, PyPI)
- Validation and alternatives
- Wikipedia for cross-referencing company information
- LinkedIn company pages for authoritative metadata
WebFetch (fallback):
- Static documentation pages
- Simple content fetching
- Direct URL access for known pages
Reference-Only Sources
Wikipedia:
- Use for verifying company descriptions and basic facts
- Cross-reference founding dates, headquarters, official names
- Validate social media links listed in Wikipedia infobox
- NEVER store Wikipedia URLs in manifests - use only for verification
LinkedIn Company Pages:
- Primary authoritative source for company metadata
- Verify company size, industry, official description
- Store the LinkedIn URL in
communityUrls.linkedin - Use company description to validate website description accuracy
Playwright Patterns
Pattern 1: Navigate โ Snapshot โ Extract
1. mcp__playwright__browser_navigate(url)
2. mcp__playwright__browser_snapshot()
3. Extract data from snapshot elements
Pattern 2: Interactive Navigation
1. Take initial snapshot
2. mcp__playwright__browser_click(element)
3. mcp__playwright__browser_wait_for(text)
4. Take new snapshot and extract
Pattern 3: Form Interaction
1. mcp__playwright__browser_fill_form(fields)
2. Click submit button
3. Extract results from response
Retry Logic
3-Attempt Strategy
Each field gets up to 3 extraction attempts before falling back to TODO comment:
Attempt 1: Direct extraction from primary source
- Official website, documentation, or main page
- Most authoritative source
Attempt 2: Alternative sources or search
- WebSearch for the information
- Alternative URL patterns
- Related pages or sections
Attempt 3: Final fallback sources
- Third-party platforms
- Package manager websites
- Community resources
After 3 failures: Add TODO comment with reason
Retry Examples
Installation Commands:
- Official installation docs page
- WebSearch for package manager (brew, npm, PyPI)
- GitHub README or package manager sites
- TODO if still not found
Pricing:
- Official pricing page
- Footer/header navigation links
- Documentation pricing mentions
- TODO if behind "Contact Sales"
Community URLs:
- Website footer social links
- WebSearch "
official " - Common URL patterns validation
- Set to null if not found
TODO Comment Format
{
"communityUrls": {
"discord": null, // TODO: Could not auto-discover after 3 attempts. Not found in footer or search results.
"twitter": "https://x.com/product"
}
}
Smart Merge Field Categories
AUTO_UPDATE Fields
Always replaced with freshly discovered values:
latestVersion- Always fetch latestdescription- From official sourcewebsiteUrl- Official URLdocsUrl- Documentation URLtokenPricing- Model pricing (changes frequently)size,contextWindow,maxOutput- Model specs
PRESERVE Fields
Never updated (user-curated):
id- Core identifiername- Display nameverified- Manual verification statusi18n- User translationsrelatedProducts- Manually curated relationships
MERGE_ADDITIVE Fields
Add new items, keep existing:
communityUrls- Add newly discovered social linksplatformUrls- Add new platform integrationssupportedIdes- Add new IDE supportplatforms- Add new OS supportpricing- Add new tiers, preserve existing
CONDITIONAL Fields
Require manual review:
license- Only update if from authoritative source (GitHub)vendor- Review name changes carefully
Error Handling
Graceful Degradation
- Field-Level Failures: Track each field independently
- Partial Manifests: Save draft even with missing fields
- TODO Comments: Mark failed fields with reason
- Completion Reports: Show what succeeded/failed
Completion Report Format
๐ Manifest Automation Report
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Status: DRAFT (3 fields incomplete)
โ
Successfully Extracted (42 fields)
โ Failed Extraction (3 fields):
1. communityUrls.discord (3 attempts)
Reason: Not found in website footer or WebSearch
2. pricing[2].value (3 attempts)
Reason: Enterprise pricing behind contact form
3. platforms[1].installCommand (3 attempts)
Reason: Windows installation docs incomplete
โ ๏ธ Cross-Reference Validation:
โ Wikipedia: Company description verified
โ LinkedIn: Company metadata matches
โ ๏ธ Description length mismatch: Website (180 chars) vs LinkedIn (220 chars)
๐ i18n Consistency Warnings (UPDATE mode only):
โ ๏ธ English description updated - review i18n translations
โ ๏ธ i18n.zh-Hans may be outdated (last updated: previous description)
โ ๏ธ i18n.de may be outdated (last updated: previous description)
โ Add TODO comments to i18n fields requiring manual review
๐ Next Steps:
1. Review manifest file: manifests/clis/cursor-cli.json
2. Manually fill TODO-marked fields if information available
3. Add i18n translations (zh-Hans, de, ko)
4. Update verified field once data confirmed accurate
5. Run validation: npm run test:validate
Note: Vendor manifest, github-stars.json, and TypeScript files already updated.
Comparison with manifest-creator
| Feature | manifest-creator | manifest-automation |
|---|---|---|
| Tools | WebFetch only | Playwright MCP + WebSearch + WebFetch |
| Modes | CREATE only | CREATE + UPDATE |
| Retry Logic | Manual/ask user | Automatic 3-attempt per field |
| Dynamic Content | Limited | Full Playwright support |
| Merge Logic | N/A | Smart field categorization |
| Error Handling | Stop and ask | TODO + draft + report |
| Workflows | Generic 7-step | Type-optimized phases |
| Community Discovery | Basic | Advanced WebSearch |
| Pricing Extraction | Static pages | Dynamic calculators |
| Marketplace Support | Limited | Full automation (VS Code, JetBrains) |
Best Practices
Accuracy
- Never generate or guess data - always extract from authoritative sources
- Validate URLs exist and are official
- Verify version numbers from releases, not estimates
- Check social media accounts are official (verification badges, content)
- Use Wikipedia for cross-referencing company facts, model specs, and historical data
- Use LinkedIn as authoritative source for company metadata and descriptions
Completeness
- Follow type-specific workflow completely
- Don't skip optional fields - attempt extraction
- Use full 3-attempt retry strategy before TODO
- Generate comprehensive completion reports
- Cross-reference with Wikipedia and LinkedIn to ensure no critical information is missed
- Validate i18n translations match English default content
Validation
- Always run schema validation after manifest creation
- Fix validation errors before marking complete
- Verify enum values (os, ideId, pricing categories)
- Check URL formats (https://, proper domains)
- Verify company information against Wikipedia and LinkedIn
- Ensure i18n consistency - all languages must reflect the same content
Smart Merge
- In UPDATE mode, trust the merge categories
- Review CONDITIONAL fields manually
- Don't blindly replace PRESERVE fields
- Validate MERGE_ADDITIVE doesn't create duplicates
- Flag i18n fields for review when English content changes
- Include i18n drift warnings in completion reports
Cross-Referencing Strategy
- Primary source: Official website and documentation
- Verification source 1: LinkedIn company page (for vendors/companies)
- Verification source 2: Wikipedia (for well-known entities)
- Conflict resolution: Official website > LinkedIn > Wikipedia
- Never store reference URLs: Wikipedia and verification sources are for validation only
Troubleshooting
Playwright Navigation Fails
- Wait 2 seconds, retry navigation
- Check for redirects or authentication walls
- Try alternative URLs or WebSearch fallback
Element Not Found in Snapshot
- Take screenshot for debugging
- Search page text directly (not by element ref)
- Try WebSearch as alternative approach
Dynamic Content Doesn't Load
- Use
mcp__playwright__browser_wait_forwith specific text - Scroll page to trigger lazy loading
- Click "Load More" or "Show All" buttons
- Fallback to WebSearch
Rate Limiting or Blocking
- Add delays between requests
- Use WebSearch as alternative data source
- Mark field as TODO if consistently blocked
Files Created
After running this skill, expect:
- Manifest file:
manifests/<type>s/<name>.json - With TODO comments: For failed field extractions
- Valid against schema:
manifests/$schemas/<type>.schema.json - Ready for validation: Run
npm run test:validate
GitHub Stars Update
After creating or updating a manifest, you MUST update the data/github-stars.json file:
Why Update github-stars.json?
The github-stars.json file tracks GitHub star counts for all manifests. When you create or update a manifest:
- A new entry must be added for tracking
- The entry is initialized with
null(stars not yet fetched) - A scheduled job will automatically fetch the actual star count later
How to Update
Use the updateGithubStarsEntry() function from github-stars-updater.mjs:
import { updateGithubStarsEntry } from './lib/github-stars-updater.mjs'
// After creating a new manifest
const result = updateGithubStarsEntry('cli', 'cursor-cli', { isNew: true })
// After updating an existing manifest
const result = updateGithubStarsEntry('extension', 'claude-code', { isNew: false })
CLI Usage
You can also use the CLI directly:
# Add new entry
node .claude/skills/manifest-automation/scripts/lib/github-stars-updater.mjs add cli cursor-cli
# Update existing entry
node .claude/skills/manifest-automation/scripts/lib/github-stars-updater.mjs update extension claude-code
# Remove entry
node .claude/skills/manifest-automation/scripts/lib/github-stars-updater.mjs remove ide windsurf
What It Does
The updater will:
- Load the current
github-stars.jsonfile - Add or update the entry:
<category>["<id>"] = null - Sort entries alphabetically within the category
- Save the updated file back to disk
Example Result
For a new CLI manifest cursor-cli:
{
"clis": {
"claude-code-cli": 43.5,
"cursor-cli": null, // โ newly added
"kode": 3.6
}
}
Integration with Workflow
The automate.mjs script exports the necessary information for you to call the updater:
// After workflow completes and manifest is saved:
import {
updateGithubStarsEntry,
manifestType,
manifestName,
operationMode
} from './automate.mjs'
updateGithubStarsEntry(manifestType, manifestName, { isNew: operationMode === 'create' })
Next Steps After Creation
- Review manifest: Check all extracted values for accuracy
- Fill TODOs: Manually add fields that couldn't be auto-discovered
- Add translations: Populate
i18nobject with localized content (zh-Hans, de, ko) - Set verified: Change
verifiedtotrueif data is confirmed accurate - Add related products: Manually curate
relatedProductsarray - Run validation: Ensure schema compliance with
npm run test:validate - Commit changes: Add manifest to git repository
Note: Vendor manifest and github-stars.json are automatically handled during creation.
i18n Consistency Requirements
IMPORTANT: When creating or updating manifests with i18n content:
Default Language (English):
- All English content should be in top-level fields (e.g.,
description,name) - English should NEVER appear in the
i18nobject
- All English content should be in top-level fields (e.g.,
Multi-Language Support:
- Support at least 3 languages: English (default), Simplified Chinese (
zh-Hans), German (de) - NEVER hardcode only
'en' | 'zh-Hans'- always includedeand support extensibility
- Support at least 3 languages: English (default), Simplified Chinese (
Content Synchronization:
- All i18n translations must reflect the SAME content as the English default
- When updating default English fields, flag i18n fields for manual review
- Never auto-translate - mark translations as TODO if not manually provided
Validation Checks:
- After UPDATE mode, verify i18n content hasn't become stale
- Flag i18n fields that may need updating when English content changes
- Include i18n consistency warnings in completion reports
Structure Example:
{
"name": "Example Product",
"description": "This is the default English description",
"i18n": {
"zh-Hans": {
"name": "็คบไพไบงๅ",
"description": "่ฟๆฏ้ป่ฎค็่ฑๆๆ่ฟฐ"
},
"de": {
"name": "Beispielprodukt",
"description": "Dies ist die englische Standardbeschreibung"
}
}
}
In UPDATE mode:
- If default English fields change, add comment:
// TODO: Update i18n translations to match new English content - Report i18n drift in completion report
- Preserve existing i18n content (PRESERVE category) but flag for review