Create and update manifest files using advanced web automation with Playwright, intelligent retry logic, and smart merge capabilities
Automate the creation and updating of manifest files for AI coding tools using advanced browser automation, web search, and intelligent field-level retry logic.
This skill extends beyond the existing manifest-creator by adding:
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 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
Load Schema & Workflow
Extract Information
Handle Failures Gracefully
Validate & Save
data/github-stars.jsonpnpm generate to regenerate TypeScript data filesLoad Existing Manifest
Extract Fresh Data
Smart Merge
Generate Change Report
Playwright MCP (mcp__playwright__browser_*):
WebSearch:
WebFetch (fallback):
Wikipedia:
LinkedIn Company Pages:
communityUrls.linkedinPattern 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
Each field gets up to 3 extraction attempts before falling back to TODO comment:
Attempt 1: Direct extraction from primary source
Attempt 2: Alternative sources or search
Attempt 3: Final fallback sources
After 3 failures: Add TODO comment with reason
Installation Commands:
Pricing:
Community URLs:
{
"communityUrls": {
"discord": null, // TODO: Could not auto-discover after 3 attempts. Not found in footer or search results.
"twitter": "https://x.com/product"
}
}
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 specsNever updated (user-curated):
id - Core identifiername - Display nameverified - Manual verification statusi18n - User translationsrelatedProducts - Manually curated relationshipsAdd 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 existingRequire manual review:
license - Only update if from authoritative source (GitHub)vendor - Review name changes carefully📊 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: pnpm test:validate
Note: Vendor manifest, github-stars.json, and TypeScript files already updated.
| 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) |
mcp__playwright__browser_wait_for with specific textAfter running this skill, expect:
manifests/<type>s/<name>.jsonmanifests/$schemas/<type>.schema.jsonpnpm test:validateAfter creating or updating a manifest, you MUST update the data/github-stars.json file:
The github-stars.json file tracks GitHub star counts for all manifests. When you create or update a manifest:
null (stars not yet fetched)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 })
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
The updater will:
github-stars.json file<category>["<id>"] = nullFor a new CLI manifest cursor-cli:
{
"clis": {
"claude-code-cli": 43.5,
"cursor-cli": null, // ← newly added
"kode": 3.6
}
}
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' })
i18n object with localized content (zh-Hans, de, ko)verified to true if data is confirmed accuraterelatedProducts arraypnpm test:validateNote: Vendor manifest and github-stars.json are automatically handled during creation.
IMPORTANT: When creating or updating manifests with i18n content:
Default Language (English):
description, name)i18n objectMulti-Language Support:
zh-Hans), German (de)'en' | 'zh-Hans' - always include de and support extensibilityContent Synchronization:
Validation Checks:
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:
// TODO: Update i18n translations to match new English contentnpx skills add aicodingstack/manifest-automation下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer