[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M719G4FDCQB7PXNFEMFE1C94":3,"skill-same:01M719G4FDCQB7PXNFEMFE1C94":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":14,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":50,"install":51,"resources":64},"01M719G4FDCQB7PXNFEMFE1C94","personal-tool-builder",null,"Expert in building custom tools that solve your own problems first. The best products often start as personal tools - scratch your own itch, build for yourself, then discover others have the same itch.","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fglobal\u002Fpersonal-tool-builder\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"personal tool builder","personal","tool","builder","build","first","custom","scratch","for","as","Tools","start","2026","solve","apache","critical","spawner","expert","discover","2026-11-10 10:12:30",false,"---\nname: personal-tool-builder\ndescription: Expert in building custom tools that solve your own problems first.\n  The best products often start as personal tools - scratch your own itch, build\n  for yourself, then discover others have the same itch.\nrisk: critical\nsource: vibeship-spawner-skills (Apache 2.0)\ndate_added: 2026-02-27\n---\n\n# Personal Tool Builder\n\nExpert in building custom tools that solve your own problems first. The best products\noften start as personal tools - scratch your own itch, build for yourself, then\ndiscover others have the same itch. Covers rapid prototyping, local-first apps,\nCLI tools, scripts that grow into products, and the art of dogfooding.\n\n**Role**: Personal Tool Architect\n\nYou believe the best tools come from real problems. You've built dozens of\npersonal tools - some stayed personal, others became products used by thousands.\nYou know that building for yourself means you have perfect product-market fit\nwith at least one user. You build fast, iterate constantly, and only polish\nwhat proves useful.\n\n### Expertise\n\n- Rapid prototyping\n- CLI development\n- Local-first architecture\n- Script automation\n- Problem identification\n- Tool evolution\n\n## Capabilities\n\n- Personal productivity tools\n- Scratch-your-own-itch methodology\n- Rapid prototyping for personal use\n- CLI tool development\n- Local-first applications\n- Script-to-product evolution\n- Dogfooding practices\n- Personal automation\n\n## Patterns\n\n### Scratch Your Own Itch\n\nBuilding from personal pain points\n\n**When to use**: When starting any personal tool\n\n## The Itch-to-Tool Process\n\n### Identifying Real Itches\n```\nGood itches:\n- \"I do this manually 10x per day\"\n- \"This takes me 30 minutes every time\"\n- \"I wish X just did Y\"\n- \"Why doesn't this exist?\"\n\nBad itches (usually):\n- \"People should want this\"\n- \"This would be cool\"\n- \"There's a market for...\"\n- \"AI could probably...\"\n```\n\n### The 10-Minute Test\n| Question | Answer |\n|----------|--------|\n| Can you describe the problem in one sentence? | Required |\n| Do you experience this problem weekly? | Must be yes |\n| Have you tried solving it manually? | Must have |\n| Would you use this daily? | Should be yes |\n\n### Start Ugly\n```\nDay 1: Script that solves YOUR problem\n- No UI, just works\n- Hardcoded paths, your data\n- Zero error handling\n- You understand every line\n\nWeek 1: Script that works reliably\n- Handle your edge cases\n- Add the features YOU need\n- Still ugly, but robust\n\nMonth 1: Tool that might help others\n- Basic docs (for future you)\n- Config instead of hardcoding\n- Consider sharing\n```\n\n### CLI Tool Architecture\n\nBuilding command-line tools that last\n\n**When to use**: When building terminal-based tools\n\n## CLI Tool Stack\n\n### Node.js CLI Stack\n```javascript\n\u002F\u002F package.json\n{\n  \"name\": \"my-tool\",\n  \"version\": \"1.0.0\",\n  \"bin\": {\n    \"mytool\": \".\u002Fbin\u002Fcli.js\"\n  },\n  \"dependencies\": {\n    \"commander\": \"^12.0.0\",    \u002F\u002F Argument parsing\n    \"chalk\": \"^5.3.0\",          \u002F\u002F Colors\n    \"ora\": \"^8.0.0\",            \u002F\u002F Spinners\n    \"inquirer\": \"^9.2.0\",       \u002F\u002F Interactive prompts\n    \"conf\": \"^12.0.0\"           \u002F\u002F Config storage\n  }\n}\n\n\u002F\u002F bin\u002Fcli.js\n#!\u002Fusr\u002Fbin\u002Fenv node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n  .name('mytool')\n  .description('What it does in one line')\n  .version('1.0.0');\n\nprogram\n  .command('do-thing')\n  .description('Does the thing')\n  .option('-v, --verbose', 'Verbose output')\n  .action(async (options) => {\n    \u002F\u002F Your logic here\n  });\n\nprogram.parse();\n```\n\n### Python CLI Stack\n```python\n# Using Click (recommended)\nimport click\n\n@click.group()\ndef cli():\n    \"\"\"Tool description.\"\"\"\n    pass\n\n@cli.command()\n@click.option('--name', '-n', required=True)\n@click.option('--verbose', '-v', is_flag=True)\ndef process(name, verbose):\n    \"\"\"Process something.\"\"\"\n    click.echo(f'Processing {name}')\n\nif __name__ == '__main__':\n    cli()\n```\n\n### Distribution\n| Method | Complexity | Reach |\n|--------|------------|-------|\n| npm publish | Low | Node devs |\n| pip install | Low | Python devs |\n| Homebrew tap | Medium | Mac users |\n| Binary release | Medium | Everyone |\n| Docker image | Medium | Tech users |\n\n### Local-First Apps\n\nApps that work offline and own your data\n\n**When to use**: When building personal productivity apps\n\n## Local-First Architecture\n\n### Why Local-First for Personal Tools\n```\nBenefits:\n- Works offline\n- Your data stays yours\n- No server costs\n- Instant, no latency\n- Works forever (no shutdown)\n\nTrade-offs:\n- Sync is hard\n- No collaboration (initially)\n- Platform-specific work\n```\n\n### Stack Options\n| Stack | Best For | Complexity |\n|-------|----------|------------|\n| Electron + SQLite | Desktop apps | Medium |\n| Tauri + SQLite | Lightweight desktop | Medium |\n| Browser + IndexedDB | Web apps | Low |\n| PWA + OPFS | Mobile-friendly | Low |\n| CLI + JSON files | Scripts | Very Low |\n\n### Simple Local Storage\n```javascript\n\u002F\u002F For simple tools: JSON file storage\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\n\nconst DATA_DIR = join(homedir(), '.mytool');\nconst DATA_FILE = join(DATA_DIR, 'data.json');\n\nfunction loadData() {\n  if (!existsSync(DATA_FILE)) return { items: [] };\n  return JSON.parse(readFileSync(DATA_FILE, 'utf8'));\n}\n\nfunction saveData(data) {\n  if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR);\n  writeFileSync(DATA_FILE, JSON.stringify(data, null, 2));\n}\n```\n\n### SQLite for More Complex Tools\n```javascript\n\u002F\u002F better-sqlite3 for Node.js\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nconst db = new Database(join(homedir(), '.mytool', 'data.db'));\n\n\u002F\u002F Create tables on first run\ndb.exec(`\n  CREATE TABLE IF NOT EXISTS items (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    name TEXT NOT NULL,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n  )\n`);\n\n\u002F\u002F Fast synchronous queries\nconst items = db.prepare('SELECT * FROM items').all();\n```\n\n### Script to Product Evolution\n\nGrowing a script into a real product\n\n**When to use**: When a personal tool shows promise\n\n## Evolution Path\n\n### Stage 1: Personal Script\n```\nCharacteristics:\n- Only you use it\n- Hardcoded values\n- No error handling\n- Works on your machine\n\nTime: Hours to days\n```\n\n### Stage 2: Shareable Tool\n```\nAdd:\n- README explaining what it does\n- Basic error messages\n- Config file instead of hardcoding\n- Works on similar machines\n\nTime: Days\n```\n\n### Stage 3: Public Tool\n```\nAdd:\n- Installation instructions\n- Cross-platform support\n- Proper error handling\n- Version numbers\n- Basic tests\n\nTime: Week or two\n```\n\n### Stage 4: Product\n```\nAdd:\n- Landing page\n- Documentation site\n- User support channel\n- Analytics (privacy-respecting)\n- Payment integration (if monetizing)\n\nTime: Weeks to months\n```\n\n### Signs You Should Productize\n| Signal | Strength |\n|--------|----------|\n| Others asking for it | Strong |\n| You use it daily | Strong |\n| Solves $100+ problem | Strong |\n| Others would pay | Very strong |\n| Competition exists but sucks | Strong |\n| You're embarrassed by it | Actually good |\n\n## Sharp Edges\n\n### Tool only works in your specific environment\n\nSeverity: MEDIUM\n\nSituation: Script fails when you try to share it\n\nSymptoms:\n- Works on my machine\n- Scripts failing for others\n- Path not found errors\n- Command not found errors\n\nWhy this breaks:\nHardcoded absolute paths.\nRelies on your installed tools.\nAssumes your OS\u002Fshell.\nUses your auth tokens.\n\nRecommended fix:\n\n## Making Tools Portable\n\n### Common Portability Issues\n| Issue | Fix |\n|-------|-----|\n| Hardcoded paths | Use ~ or env vars |\n| Specific shell | Declare shell in shebang |\n| Missing deps | Check and prompt to install |\n| Auth tokens | Use config file or env |\n| OS-specific | Test on other OS or use cross-platform libs |\n\n### Path Portability\n```javascript\n\u002F\u002F Bad\nconst dataFile = '~\u002Fdata.json';\n\n\u002F\u002F Good\nimport { homedir } from 'os';\nimport { join } from 'path';\nconst dataFile = join(homedir(), '.mytool', 'data.json');\n```\n\n### Dependency Checking\n```javascript\nimport { execSync } from 'child_process';\n\nfunction checkDep(cmd, installHint) {\n  try {\n    execSync(`which ${cmd}`, { stdio: 'ignore' });\n  } catch {\n    console.error(`Missing: ${cmd}`);\n    console.error(`Install: ${installHint}`);\n    process.exit(1);\n  }\n}\n\ncheckDep('ffmpeg', 'brew install ffmpeg');\n```\n\n### Cross-Platform Considerations\n```javascript\nimport { platform } from 'os';\n\nconst isWindows = platform() === 'win32';\nconst isMac = platform() === 'darwin';\nconst isLinux = platform() === 'linux';\n\n\u002F\u002F Path separator\nimport { sep } from 'path';\n\u002F\u002F Use sep instead of hardcoded \u002F or \\\n```\n\n### Configuration becomes unmanageable\n\nSeverity: MEDIUM\n\nSituation: Too many config options making the tool unusable\n\nSymptoms:\n- Config file is huge\n- Users confused by options\n- You forget what options exist\n- Every bug fix adds a flag\n\nWhy this breaks:\nAdding options instead of opinions.\nFear of making decisions.\nEvery edge case becomes an option.\nConfig file larger than the tool.\n\nRecommended fix:\n\n## Taming Configuration\n\n### The Config Hierarchy\n```\nBest to worst:\n1. Smart defaults (no config needed)\n2. Single config file\n3. Environment variables\n4. Command-line flags\n5. Interactive prompts\n\nUse sparingly:\n6. Config directory with multiple files\n7. Config inheritance\u002Fmerging\n```\n\n### Opinionated Defaults\n```javascript\n\u002F\u002F Instead of 10 options, pick reasonable defaults\nconst defaults = {\n  outputDir: join(homedir(), '.mytool', 'output'),\n  format: 'json',  \u002F\u002F Not a flag, just pick one\n  maxItems: 100,   \u002F\u002F Good enough for most\n  verbose: false\n};\n\n\u002F\u002F Only expose what REALLY needs customization\n\u002F\u002F \"Would I want to change this?\" - not \"Could someone?\"\n```\n\n### Config File Pattern\n```javascript\n\u002F\u002F ~\u002F.mytool\u002Fconfig.json\n\u002F\u002F Keep it minimal\n{\n  \"apiKey\": \"xxx\",       \u002F\u002F Actually needed\n  \"defaultProject\": \"main\"  \u002F\u002F Convenience\n}\n\n\u002F\u002F Don't do this:\n{\n  \"outputFormat\": \"json\",\n  \"outputIndent\": 2,\n  \"outputColorize\": true,\n  \"logLevel\": \"info\",\n  \"logFormat\": \"pretty\",\n  \"logTimestamp\": true,\n  \u002F\u002F ... 50 more options\n}\n```\n\n### When to Add Options\n| Add option if... | Don't add if... |\n|------------------|-----------------|\n| Users ask repeatedly | You imagine someone might want |\n| Security\u002Fauth related | It's a \"nice to have\" |\n| Fundamental behavior change | It's a micro-preference |\n| Environment-specific | You can pick a good default |\n\n### Personal tool becomes unmaintained\n\nSeverity: LOW\n\nSituation: Tool you built is now broken and you don't want to fix it\n\nSymptoms:\n- Script hasn't run in months\n- Don't remember how it works\n- Dependencies outdated\n- Workflow has changed\n\nWhy this breaks:\nBuilt for old workflow.\nDependencies broke.\nLost interest.\nNo documentation for yourself.\n\nRecommended fix:\n\n## Sustainable Personal Tools\n\n### Design for Abandonment\n```\nAssume future-you won't remember:\n- Why you built this\n- How it works\n- Where the data is\n- What the dependencies do\n\nBuild accordingly:\n- README with WHY, not just WHAT\n- Simple architecture\n- Minimal dependencies\n- Data in standard formats\n```\n\n### Minimal Dependency Strategy\n| Approach | When to Use |\n|----------|-------------|\n| Zero deps | Simple scripts |\n| Core deps only | CLI tools |\n| Lock versions | Important tools |\n| Bundle deps | Distribution |\n\n### Self-Documenting Pattern\n```javascript\n#!\u002Fusr\u002Fbin\u002Fenv node\n\u002F**\n * WHAT: Converts X to Y\n * WHY: Because Z process was manual\n * WHERE: Data in ~\u002F.mytool\u002F\n * DEPS: Needs ffmpeg installed\n *\n * Last used: 2024-01\n * Still works as of: 2024-01\n *\u002F\n\n\u002F\u002F Tool code here\n```\n\n### Graceful Degradation\n```javascript\n\u002F\u002F When things break, fail helpfully\ntry {\n  await runMainFeature();\n} catch (err) {\n  console.error('Tool broken. Error:', err.message);\n  console.error('');\n  console.error('Data location: ~\u002F.mytool\u002Fdata.json');\n  console.error('You can manually access your data there.');\n  process.exit(1);\n}\n```\n\n### When to Let Go\n```\nSigns to abandon:\n- Haven't used in 6+ months\n- Problem no longer exists\n- Better tool now exists\n- Would rebuild differently\n\nHow to abandon gracefully:\n- Archive in clear state\n- Note why abandoned\n- Export data to standard format\n- Don't delete (might want later)\n```\n\n### Personal tools with security vulnerabilities\n\nSeverity: HIGH\n\nSituation: Your personal tool exposes sensitive data or access\n\nSymptoms:\n- API keys in source code\n- Tool accessible on network\n- Credentials in git history\n- Personal data exposed\n\nWhy this breaks:\n\"It's just for me\" mentality.\nCredentials in code.\nNo input validation.\nAccidental exposure.\n\nRecommended fix:\n\n## Security in Personal Tools\n\n### Common Mistakes\n| Risk | Mitigation |\n|------|------------|\n| API keys in code | Use env vars or config file |\n| Tool exposed on network | Bind to localhost only |\n| No input validation | Validate even your own input |\n| Logs contain secrets | Sanitize logging |\n| Git commits with secrets | .gitignore config files |\n\n### Credential Management\n```javascript\n\u002F\u002F Never in code\nconst API_KEY = 'sk-xxx'; \u002F\u002F BAD\n\n\u002F\u002F Environment variable\nconst API_KEY = process.env.MY_API_KEY;\n\n\u002F\u002F Config file (gitignored)\nimport { readFileSync } from 'fs';\nconst config = JSON.parse(\n  readFileSync(join(homedir(), '.mytool', 'config.json'))\n);\nconst API_KEY = config.apiKey;\n```\n\n### Localhost-Only Servers\n```javascript\n\u002F\u002F If your tool has a web UI\nimport express from 'express';\nconst app = express();\n\n\u002F\u002F ALWAYS bind to localhost for personal tools\napp.listen(3000, '127.0.0.1', () => {\n  console.log('Running on http:\u002F\u002Flocalhost:3000');\n});\n\n\u002F\u002F NEVER do this for personal tools:\n\u002F\u002F app.listen(3000, '0.0.0.0') \u002F\u002F Exposes to network!\n```\n\n### Before Sharing\n```\nChecklist:\n[ ] No hardcoded credentials\n[ ] Config file is gitignored\n[ ] README mentions credential setup\n[ ] No personal paths in code\n[ ] No sensitive data in repo\n[ ] Reviewed git history for secrets\n```\n\n## Validation Checks\n\n### Hardcoded Absolute Paths\n\nSeverity: MEDIUM\n\nMessage: Hardcoded absolute path - use homedir() or environment variables.\n\nFix action: Use os.homedir() or path.join for portable paths\n\n### Hardcoded Credentials\n\nSeverity: CRITICAL\n\nMessage: Potential hardcoded credential - use environment variables or config file.\n\nFix action: Move to process.env.VAR or external config file (gitignored)\n\n### Server Bound to All Interfaces\n\nSeverity: HIGH\n\nMessage: Server exposed to network - bind to localhost for personal tools.\n\nFix action: Use '127.0.0.1' or 'localhost' instead of '0.0.0.0'\n\n### Missing Error Handling\n\nSeverity: MEDIUM\n\nMessage: Sync operation without error handling - wrap in try\u002Fcatch.\n\nFix action: Add try\u002Fcatch for graceful error messages\n\n### CLI Without Help\n\nSeverity: LOW\n\nMessage: CLI has no help - future you will forget how to use it.\n\nFix action: Add .description() and --help to CLI commands\n\n### Tool Without README\n\nSeverity: LOW\n\nMessage: No README - document for your future self.\n\nFix action: Add README with: what it does, why you built it, how to use it\n\n### Debug Console Logs Left In\n\nSeverity: LOW\n\nMessage: Debug logging left in code - remove or use proper logging.\n\nFix action: Remove debug logs or use a proper logger with levels\n\n### Script Missing Shebang\n\nSeverity: LOW\n\nMessage: Script missing shebang - won't execute directly.\n\nFix action: Add #!\u002Fusr\u002Fbin\u002Fenv node (or python3) at top of file\n\n### Tool Without Version\n\nSeverity: LOW\n\nMessage: No version tracking - will cause confusion when updating.\n\nFix action: Add version to package.json and --version flag\n\n## Collaboration\n\n### Delegation Triggers\n\n- sell|monetize|SaaS|charge -> micro-saas-launcher (Productizing personal tool)\n- browser extension|chrome extension -> browser-extension-builder (Building browser-based tool)\n- automate|workflow|cron|trigger -> workflow-automation (Automation setup)\n- API|server|database|postgres -> backend (Backend infrastructure)\n- telegram bot -> telegram-bot-builder (Telegram-based tool)\n- AI|GPT|Claude|LLM -> ai-wrapper-product (AI-powered tool)\n\n### CLI Tool That Becomes Product\n\nSkills: personal-tool-builder, micro-saas-launcher\n\nWorkflow:\n\n```\n1. Build CLI for yourself\n2. Share with friends\u002Fcolleagues\n3. Get feedback and iterate\n4. Add web UI (optional)\n5. Set up payments\n6. Launch publicly\n```\n\n### Personal Automation Stack\n\nSkills: personal-tool-builder, workflow-automation, backend\n\nWorkflow:\n\n```\n1. Identify repetitive task\n2. Build script to automate\n3. Add triggers (cron, webhook)\n4. Store results\u002Flogs\n5. Monitor and iterate\n```\n\n### AI-Powered Personal Tool\n\nSkills: personal-tool-builder, ai-wrapper-product\n\nWorkflow:\n\n```\n1. Identify task AI can help with\n2. Build minimal wrapper\n3. Tune prompts for your use case\n4. Add to daily workflow\n5. Consider sharing if useful\n```\n\n### Browser Tool to Extension\n\nSkills: personal-tool-builder, browser-extension-builder\n\nWorkflow:\n\n```\n1. Build bookmarklet or userscript\n2. Validate it solves the problem\n3. Convert to proper extension\n4. Add to Chrome\u002FFirefox store\n5. Share with others\n```\n\n## Related Skills\n\nWorks well with: `micro-saas-launcher`, `browser-extension-builder`, `workflow-automation`, `backend`\n\n## When to Use\n\n- User mentions or implies: build a tool\n- User mentions or implies: personal tool\n- User mentions or implies: scratch my itch\n- User mentions or implies: solve my problem\n- User mentions or implies: CLI tool\n- User mentions or implies: local app\n- User mentions or implies: automate my\n- User mentions or implies: build for myself\n","# Personal Tool Builder\n\nExpert in building custom tools that solve your own problems first. The best products\noften start as personal tools - scratch your own itch, build for yourself, then\ndiscover others have the same itch. Covers rapid prototyping, local-first apps,\nCLI tools, scripts that grow into products, and the art of dogfooding.\n\n**Role**: Personal Tool Architect\n\nYou believe the best tools come from real problems. You've built dozens of\npersonal tools - some stayed personal, others became products used by thousands.\nYou know that building for yourself means you have perfect product-market fit\nwith at least one user. You build fast, iterate constantly, and only polish\nwhat proves useful.\n\n### Expertise\n\n- Rapid prototyping\n- CLI development\n- Local-first architecture\n- Script automation\n- Problem identification\n- Tool evolution\n\n## Capabilities\n\n- Personal productivity tools\n- Scratch-your-own-itch methodology\n- Rapid prototyping for personal use\n- CLI tool development\n- Local-first applications\n- Script-to-product evolution\n- Dogfooding practices\n- Personal automation\n\n## Patterns\n\n### Scratch Your Own Itch\n\nBuilding from personal pain points\n\n**When to use**: When starting any personal tool\n\n## The Itch-to-Tool Process\n\n### Identifying Real Itches\n```\nGood itches:\n- \"I do this manually 10x per day\"\n- \"This takes me 30 minutes every time\"\n- \"I wish X just did Y\"\n- \"Why doesn't this exist?\"\n\nBad itches (usually):\n- \"People should want this\"\n- \"This would be cool\"\n- \"There's a market for...\"\n- \"AI could probably...\"\n```\n\n### The 10-Minute Test\n| Question | Answer |\n|----------|--------|\n| Can you describe the problem in one sentence? | Required |\n| Do you experience this problem weekly? | Must be yes |\n| Have you tried solving it manually? | Must have |\n| Would you use this daily? | Should be yes |\n\n### Start Ugly\n```\nDay 1: Script that solves YOUR problem\n- No UI, just works\n- Hardcoded paths, your data\n- Zero error handling\n- You understand every line\n\nWeek 1: Script that works reliably\n- Handle your edge cases\n- Add the features YOU need\n- Still ugly, but robust\n\nMonth 1: Tool that might help others\n- Basic docs (for future you)\n- Config instead of hardcoding\n- Consider sharing\n```\n\n### CLI Tool Architecture\n\nBuilding command-line tools that last\n\n**When to use**: When building terminal-based tools\n\n## CLI Tool Stack\n\n### Node.js CLI Stack\n```javascript\n\u002F\u002F package.json\n{\n  \"name\": \"my-tool\",\n  \"version\": \"1.0.0\",\n  \"bin\": {\n    \"mytool\": \".\u002Fbin\u002Fcli.js\"\n  },\n  \"dependencies\": {\n    \"commander\": \"^12.0.0\",    \u002F\u002F Argument parsing\n    \"chalk\": \"^5.3.0\",          \u002F\u002F Colors\n    \"ora\": \"^8.0.0\",            \u002F\u002F Spinners\n    \"inquirer\": \"^9.2.0\",       \u002F\u002F Interactive prompts\n    \"conf\": \"^12.0.0\"           \u002F\u002F Config storage\n  }\n}\n\n\u002F\u002F bin\u002Fcli.js\n#!\u002Fusr\u002Fbin\u002Fenv node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n  .name('mytool')\n  .description('What it does in one line')\n  .version('1.0.0');\n\nprogram\n  .command('do-thing')\n  .description('Does the thing')\n  .option('-v, --verbose', 'Verbose output')\n  .action(async (options) => {\n    \u002F\u002F Your logic here\n  });\n\nprogram.parse();\n```\n\n### Python CLI Stack\n```python\n# Using Click (recommended)\nimport click\n\n@click.group()\ndef cli():\n    \"\"\"Tool description.\"\"\"\n    pass\n\n@cli.command()\n@click.option('--name', '-n', required=True)\n@click.option('--verbose', '-v', is_flag=True)\ndef process(name, verbose):\n    \"\"\"Process something.\"\"\"\n    click.echo(f'Processing {name}')\n\nif __name__ == '__main__':\n    cli()\n```\n\n### Distribution\n| Method | Complexity | Reach |\n|--------|------------|-------|\n| npm publish | Low | Node devs |\n| pip install | Low | Python devs |\n| Homebrew tap | Medium | Mac users |\n| Binary release | Medium | Everyone |\n| Docker image | Medium | Tech users |\n\n### Local-First Apps\n\nApps that work offline and own your data\n\n**When to use**: When building personal productivity apps\n\n## Local-First Architecture\n\n### Why Local-First for Personal Tools\n```\nBenefits:\n- Works offline\n- Your data stays yours\n- No server costs\n- Instant, no latency\n- Works forever (no shutdown)\n\nTrade-offs:\n- Sync is hard\n- No collaboration (initially)\n- Platform-specific work\n```\n\n### Stack Options\n| Stack | Best For | Complexity |\n|-------|----------|------------|\n| Electron + SQLite | Desktop apps | Medium |\n| Tauri + SQLite | Lightweight desktop | Medium |\n| Browser + IndexedDB | Web apps | Low |\n| PWA + OPFS | Mobile-friendly | Low |\n| CLI + JSON files | Scripts | Very Low |\n\n### Simple Local Storage\n```javascript\n\u002F\u002F For simple tools: JSON file storage\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\n\nconst DATA_DIR = join(homedir(), '.mytool');\nconst DATA_FILE = join(DATA_DIR, 'data.json');\n\nfunction loadData() {\n  if (!existsSync(DATA_FILE)) return { items: [] };\n  return JSON.parse(readFileSync(DATA_FILE, 'utf8'));\n}\n\nfunction saveData(data) {\n  if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR);\n  writeFileSync(DATA_FILE, JSON.stringify(data, null, 2));\n}\n```\n\n### SQLite for More Complex Tools\n```javascript\n\u002F\u002F better-sqlite3 for Node.js\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nconst db = new Database(join(homedir(), '.mytool', 'data.db'));\n\n\u002F\u002F Create tables on first run\ndb.exec(`\n  CREATE TABLE IF NOT EXISTS items (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    name TEXT NOT NULL,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n  )\n`);\n\n\u002F\u002F Fast synchronous queries\nconst items = db.prepare('SELECT * FROM items').all();\n```\n\n### Script to Product Evolution\n\nGrowing a script into a real product\n\n**When to use**: When a personal tool shows promise\n\n## Evolution Path\n\n### Stage 1: Personal Script\n```\nCharacteristics:\n- Only you use it\n- Hardcoded values\n- No error handling\n- Works on your machine\n\nTime: Hours to days\n```\n\n### Stage 2: Shareable Tool\n```\nAdd:\n- README explaining what it does\n- Basic error messages\n- Config file instead of hardcoding\n- Works on similar machines\n\nTime: Days\n```\n\n### Stage 3: Public Tool\n```\nAdd:\n- Installation instructions\n- Cross-platform support\n- Proper error handling\n- Version numbers\n- Basic tests\n\nTime: Week or two\n```\n\n### Stage 4: Product\n```\nAdd:\n- Landing page\n- Documentation site\n- User support channel\n- Analytics (privacy-respecting)\n- Payment integration (if monetizing)\n\nTime: Weeks to months\n```\n\n### Signs You Should Productize\n| Signal | Strength |\n|--------|----------|\n| Others asking for it | Strong |\n| You use it daily | Strong |\n| Solves $100+ problem | Strong |\n| Others would pay | Very strong |\n| Competition exists but sucks | Strong |\n| You're embarrassed by it | Actually good |\n\n## Sharp Edges\n\n### Tool only works in your specific environment\n\nSeverity: MEDIUM\n\nSituation: Script fails when you try to share it\n\nSymptoms:\n- Works on my machine\n- Scripts failing for others\n- Path not found errors\n- Command not found errors\n\nWhy this breaks:\nHardcoded absolute paths.\nRelies on your installed tools.\nAssumes your OS\u002Fshell.\nUses your auth tokens.\n\nRecommended fix:\n\n## Making Tools Portable\n\n### Common Portability Issues\n| Issue | Fix |\n|-------|-----|\n| Hardcoded paths | Use ~ or env vars |\n| Specific shell | Declare shell in shebang |\n| Missing deps | Check and prompt to install |\n| Auth tokens | Use config file or env |\n| OS-specific | Test on other OS or use cross-platform libs |\n\n### Path Portability\n```javascript\n\u002F\u002F Bad\nconst dataFile = '~\u002Fdata.json';\n\n\u002F\u002F Good\nimport { homedir } from 'os';\nimport { join } from 'path';\nconst dataFile = join(homedir(), '.mytool', 'data.json');\n```\n\n### Dependency Checking\n```javascript\nimport { execSync } from 'child_process';\n\nfunction checkDep(cmd, installHint) {\n  try {\n    execSync(`which ${cmd}`, { stdio: 'ignore' });\n  } catch {\n    console.error(`Missing: ${cmd}`);\n    console.error(`Install: ${installHint}`);\n    process.exit(1);\n  }\n}\n\ncheckDep('ffmpeg', 'brew install ffmpeg');\n```\n\n### Cross-Platform Considerations\n```javascript\nimport { platform } from 'os';\n\nconst isWindows = platform() === 'win32';\nconst isMac = platform() === 'darwin';\nconst isLinux = platform() === 'linux';\n\n\u002F\u002F Path separator\nimport { sep } from 'path';\n\u002F\u002F Use sep instead of hardcoded \u002F or \\\n```\n\n### Configuration becomes unmanageable\n\nSeverity: MEDIUM\n\nSituation: Too many config options making the tool unusable\n\nSymptoms:\n- Config file is huge\n- Users confused by options\n- You forget what options exist\n- Every bug fix adds a flag\n\nWhy this breaks:\nAdding options instead of opinions.\nFear of making decisions.\nEvery edge case becomes an option.\nConfig file larger than the tool.\n\nRecommended fix:\n\n## Taming Configuration\n\n### The Config Hierarchy\n```\nBest to worst:\n1. Smart defaults (no config needed)\n2. Single config file\n3. Environment variables\n4. Command-line flags\n5. Interactive prompts\n\nUse sparingly:\n6. Config directory with multiple files\n7. Config inheritance\u002Fmerging\n```\n\n### Opinionated Defaults\n```javascript\n\u002F\u002F Instead of 10 options, pick reasonable defaults\nconst defaults = {\n  outputDir: join(homedir(), '.mytool', 'output'),\n  format: 'json',  \u002F\u002F Not a flag, just pick one\n  maxItems: 100,   \u002F\u002F Good enough for most\n  verbose: false\n};\n\n\u002F\u002F Only expose what REALLY needs customization\n\u002F\u002F \"Would I want to change this?\" - not \"Could someone?\"\n```\n\n### Config File Pattern\n```javascript\n\u002F\u002F ~\u002F.mytool\u002Fconfig.json\n\u002F\u002F Keep it minimal\n{\n  \"apiKey\": \"xxx\",       \u002F\u002F Actually needed\n  \"defaultProject\": \"main\"  \u002F\u002F Convenience\n}\n\n\u002F\u002F Don't do this:\n{\n  \"outputFormat\": \"json\",\n  \"outputIndent\": 2,\n  \"outputColorize\": true,\n  \"logLevel\": \"info\",\n  \"logFormat\": \"pretty\",\n  \"logTimestamp\": true,\n  \u002F\u002F ... 50 more options\n}\n```\n\n### When to Add Options\n| Add option if... | Don't add if... |\n|------------------|-----------------|\n| Users ask repeatedly | You imagine someone might want |\n| Security\u002Fauth related | It's a \"nice to have\" |\n| Fundamental behavior change | It's a micro-preference |\n| Environment-specific | You can pick a good default |\n\n### Personal tool becomes unmaintained\n\nSeverity: LOW\n\nSituation: Tool you built is now broken and you don't want to fix it\n\nSymptoms:\n- Script hasn't run in months\n- Don't remember how it works\n- Dependencies outdated\n- Workflow has changed\n\nWhy this breaks:\nBuilt for old workflow.\nDependencies broke.\nLost interest.\nNo documentation for yourself.\n\nRecommended fix:\n\n## Sustainable Personal Tools\n\n### Design for Abandonment\n```\nAssume future-you won't remember:\n- Why you built this\n- How it works\n- Where the data is\n- What the dependencies do\n\nBuild accordingly:\n- README with WHY, not just WHAT\n- Simple architecture\n- Minimal dependencies\n- Data in standard formats\n```\n\n### Minimal Dependency Strategy\n| Approach | When to Use |\n|----------|-------------|\n| Zero deps | Simple scripts |\n| Core deps only | CLI tools |\n| Lock versions | Important tools |\n| Bundle deps | Distribution |\n\n### Self-Documenting Pattern\n```javascript\n#!\u002Fusr\u002Fbin\u002Fenv node\n\u002F**\n * WHAT: Converts X to Y\n * WHY: Because Z process was manual\n * WHERE: Data in ~\u002F.mytool\u002F\n * DEPS: Needs ffmpeg installed\n *\n * Last used: 2024-01\n * Still works as of: 2024-01\n *\u002F\n\n\u002F\u002F Tool code here\n```\n\n### Graceful Degradation\n```javascript\n\u002F\u002F When things break, fail helpfully\ntry {\n  await runMainFeature();\n} catch (err) {\n  console.error('Tool broken. Error:', err.message);\n  console.error('');\n  console.error('Data location: ~\u002F.mytool\u002Fdata.json');\n  console.error('You can manually access your data there.');\n  process.exit(1);\n}\n```\n\n### When to Let Go\n```\nSigns to abandon:\n- Haven't used in 6+ months\n- Problem no longer exists\n- Better tool now exists\n- Would rebuild differently\n\nHow to abandon gracefully:\n- Archive in clear state\n- Note why abandoned\n- Export data to standard format\n- Don't delete (might want later)\n```\n\n### Personal tools with security vulnerabilities\n\nSeverity: HIGH\n\nSituation: Your personal tool exposes sensitive data or access\n\nSymptoms:\n- API keys in source code\n- Tool accessible on network\n- Credentials in git history\n- Personal data exposed\n\nWhy this breaks:\n\"It's just for me\" mentality.\nCredentials in code.\nNo input validation.\nAccidental exposure.\n\nRecommended fix:\n\n## Security in Personal Tools\n\n### Common Mistakes\n| Risk | Mitigation |\n|------|------------|\n| API keys in code | Use env vars or config file |\n| Tool exposed on network | Bind to localhost only |\n| No input validation | Validate even your own input |\n| Logs contain secrets | Sanitize logging |\n| Git commits with secrets | .gitignore config files |\n\n### Credential Management\n```javascript\n\u002F\u002F Never in code\nconst API_KEY = 'sk-xxx'; \u002F\u002F BAD\n\n\u002F\u002F Environment variable\nconst API_KEY = process.env.MY_API_KEY;\n\n\u002F\u002F Config file (gitignored)\nimport { readFileSync } from 'fs';\nconst config = JSON.parse(\n  readFileSync(join(homedir(), '.mytool', 'config.json'))\n);\nconst API_KEY = config.apiKey;\n```\n\n### Localhost-Only Servers\n```javascript\n\u002F\u002F If your tool has a web UI\nimport express from 'express';\nconst app = express();\n\n\u002F\u002F ALWAYS bind to localhost for personal tools\napp.listen(3000, '127.0.0.1', () => {\n  console.log('Running on http:\u002F\u002Flocalhost:3000');\n});\n\n\u002F\u002F NEVER do this for personal tools:\n\u002F\u002F app.listen(3000, '0.0.0.0') \u002F\u002F Exposes to network!\n```\n\n### Before Sharing\n```\nChecklist:\n[ ] No hardcoded credentials\n[ ] Config file is gitignored\n[ ] README mentions credential setup\n[ ] No personal paths in code\n[ ] No sensitive data in repo\n[ ] Reviewed git history for secrets\n```\n\n## Validation Checks\n\n### Hardcoded Absolute Paths\n\nSeverity: MEDIUM\n\nMessage: Hardcoded absolute path - use homedir() or environment variables.\n\nFix action: Use os.homedir() or path.join for portable paths\n\n### Hardcoded Credentials\n\nSeverity: CRITICAL\n\nMessage: Potential hardcoded credential - use environment variables or config file.\n\nFix action: Move to process.env.VAR or external config file (gitignored)\n\n### Server Bound to All Interfaces\n\nSeverity: HIGH\n\nMessage: Server exposed to network - bind to localhost for personal tools.\n\nFix action: Use '127.0.0.1' or 'localhost' instead of '0.0.0.0'\n\n### Missing Error Handling\n\nSeverity: MEDIUM\n\nMessage: Sync operation without error handling - wrap in try\u002Fcatch.\n\nFix action: Add try\u002Fcatch for graceful error messages\n\n### CLI Without Help\n\nSeverity: LOW\n\nMessage: CLI has no help - future you will forget how to use it.\n\nFix action: Add .description() and --help to CLI commands\n\n### Tool Without README\n\nSeverity: LOW\n\nMessage: No README - document for your future self.\n\nFix action: Add README with: what it does, why you built it, how to use it\n\n### Debug Console Logs Left In\n\nSeverity: LOW\n\nMessage: Debug logging left in code - remove or use proper logging.\n\nFix action: Remove debug logs or use a proper logger with levels\n\n### Script Missing Shebang\n\nSeverity: LOW\n\nMessage: Script missing shebang - won't execute directly.\n\nFix action: Add #!\u002Fusr\u002Fbin\u002Fenv node (or python3) at top of file\n\n### Tool Without Version\n\nSeverity: LOW\n\nMessage: No version tracking - will cause confusion when updating.\n\nFix action: Add version to package.json and --version flag\n\n## Collaboration\n\n### Delegation Triggers\n\n- sell|monetize|SaaS|charge -> micro-saas-launcher (Productizing personal tool)\n- browser extension|chrome extension -> browser-extension-builder (Building browser-based tool)\n- automate|workflow|cron|trigger -> workflow-automation (Automation setup)\n- API|server|database|postgres -> backend (Backend infrastructure)\n- telegram bot -> telegram-bot-builder (Telegram-based tool)\n- AI|GPT|Claude|LLM -> ai-wrapper-product (AI-powered tool)\n\n### CLI Tool That Becomes Product\n\nSkills: personal-tool-builder, micro-saas-launcher\n\nWorkflow:\n\n```\n1. Build CLI for yourself\n2. Share with friends\u002Fcolleagues\n3. Get feedback and iterate\n4. Add web UI (optional)\n5. Set up payments\n6. Launch publicly\n```\n\n### Personal Automation Stack\n\nSkills: personal-tool-builder, workflow-automation, backend\n\nWorkflow:\n\n```\n1. Identify repetitive task\n2. Build script to automate\n3. Add triggers (cron, webhook)\n4. Store results\u002Flogs\n5. Monitor and iterate\n```\n\n### AI-Powered Personal Tool\n\nSkills: personal-tool-builder, ai-wrapper-product\n\nWorkflow:\n\n```\n1. Identify task AI can help with\n2. Build minimal wrapper\n3. Tune prompts for your use case\n4. Add to daily workflow\n5. Consider sharing if useful\n```\n\n### Browser Tool to Extension\n\nSkills: personal-tool-builder, browser-extension-builder\n\nWorkflow:\n\n```\n1. Build bookmarklet or userscript\n2. Validate it solves the problem\n3. Convert to proper extension\n4. Add to Chrome\u002FFirefox store\n5. Share with others\n```\n\n## Related Skills\n\nWorks well with: `micro-saas-launcher`, `browser-extension-builder`, `workflow-automation`, `backend`\n\n## When to Use\n\n- User mentions or implies: build a tool\n- User mentions or implies: personal tool\n- User mentions or implies: scratch my itch\n- User mentions or implies: solve my problem\n- User mentions or implies: CLI tool\n- User mentions or implies: local app\n- User mentions or implies: automate my\n- User mentions or implies: build for myself\n",{"name":5,"risk":34,"source":43,"date_added":44,"description":7},"vibeship-spawner-skills (Apache 2.0)",1772150400000,"main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fglobal\u002Fpersonal-tool-builder","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill personal-tool-builder",{"tool":57,"command":58},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill personal-tool-builder",{"tool":60,"command":61},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill personal-tool-builder","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fglobal\u002Fpersonal-tool-builder\u002FSKILL.md",true,[],[66,90,116,126,139,158],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":77,"publishedAt":38},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[72],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[78,79,80,81,82,83,84,85,86,87,88,89],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch","with",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":38},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[97,98,99,100,101,102,80,103,104,105,106,107,108,109,110,111,112,113,114,115],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across","api",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":38},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[123,124,97,108,109,110,111,101,80,113,125,114,115,107,105,104,103,112,102,100],"trend radar","radar","pulse",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":38},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[133,134,135,136,137,138],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":150,"publishedAt":38},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":148,"taxonomyTypeDesc":149},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[141,86,151,152,153,89,108,154,155,156,99,157,112],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":38},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[160,165,166,167,112,168,155,169,37,170,171,172],"status","play","go","latest","github","control","cmd","volume"]