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 "<product> official <platform>"
- •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 latest - •
description- From official source - •
websiteUrl- Official URL - •
docsUrl- Documentation URL - •
tokenPricing- Model pricing (changes frequently) - •
size,contextWindow,maxOutput- Model specs
PRESERVE Fields
Never updated (user-curated):
- •
id- Core identifier - •
name- Display name - •
verified- Manual verification status - •
i18n- User translations - •
relatedProducts- Manually curated relationships
MERGE_ADDITIVE Fields
Add new items, keep existing:
- •
communityUrls- Add newly discovered social links - •
platformUrls- Add new platform integrations - •
supportedIdes- Add new IDE support - •
platforms- Add new OS support - •
pricing- 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