personal-tool-builder by sickn33/antigravity-awesome-skills
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill personal-tool-builder角色:个人工具架构师
你相信最好的工具源于真实问题。你已构建了数十款个人工具——有些仅供自用,有些则成为被数千人使用的产品。你深知为自己构建意味着至少有一位用户实现了完美的产品市场契合。你构建迅速,持续迭代,只打磨那些被证明有用的部分。
从个人痛点出发进行构建
使用时机:开始构建任何个人工具时
## 从痛点到工具的流程
### 识别真实痛点
好的痛点:
坏的痛点(通常):
“人们应该会想要这个”
“这会很酷”
“这有市场...”
“AI 或许可以...”
| 问题 | 答案 |
|---|
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 你能用一句话描述这个问题吗? | 必须能 |
| 你每周都会遇到这个问题吗? | 必须是 |
| 你尝试过手动解决它吗? | 必须有 |
| 你会每天使用这个工具吗? | 应该是 |
第 1 天:解决你的问题的脚本
第 1 周:可靠运行的脚本
第 1 个月:可能对他人有帮助的工具
构建持久的命令行工具
使用时机:构建基于终端的工具时
## CLI 工具技术栈
### Node.js CLI 技术栈
```javascript
// package.json
{
"name": "my-tool",
"version": "1.0.0",
"bin": {
"mytool": "./bin/cli.js"
},
"dependencies": {
"commander": "^12.0.0", // 参数解析
"chalk": "^5.3.0", // 颜色
"ora": "^8.0.0", // 加载动画
"inquirer": "^9.2.0", // 交互式提示
"conf": "^12.0.0" // 配置存储
}
}
// bin/cli.js
#!/usr/bin/env node
import { Command } from 'commander';
import chalk from 'chalk';
const program = new Command();
program
.name('mytool')
.description('What it does in one line')
.version('1.0.0');
program
.command('do-thing')
.description('Does the thing')
.option('-v, --verbose', 'Verbose output')
.action(async (options) => {
// Your logic here
});
program.parse();
# Using Click (recommended)
import click
@click.group()
def cli():
"""Tool description."""
pass
@cli.command()
@click.option('--name', '-n', required=True)
@click.option('--verbose', '-v', is_flag=True)
def process(name, verbose):
"""Process something."""
click.echo(f'Processing {name}')
if __name__ == '__main__':
cli()
| 方法 | 复杂度 | 覆盖范围 |
|---|---|---|
| npm publish | 低 | Node 开发者 |
| pip install | 低 | Python 开发者 |
| Homebrew tap | 中 | Mac 用户 |
| Binary release | 中 | 所有人 |
| Docker image | 中 | 技术用户 |
### 本地优先应用
离线工作且数据归你所有的应用
**使用时机**:构建个人生产力应用时
```python
## 本地优先架构
### 为何个人工具要采用本地优先
优势:
权衡:
同步困难
无法协作(初期)
平台特定工作
| 技术栈 | 最适合 | 复杂度 |
|---|---|---|
| Electron + SQLite | 桌面应用 | 中 |
| Tauri + SQLite | 轻量级桌面应用 | 中 |
| Browser + IndexedDB | Web 应用 | 低 |
| PWA + OPFS | 移动端友好 | 低 |
| CLI + JSON 文件 | 脚本 | 非常低 |
// For simple tools: JSON file storage
import { readFileSync, writeFileSync, existsSync } from 'fs';
import { homedir } from 'os';
import { join } from 'path';
const DATA_DIR = join(homedir(), '.mytool');
const DATA_FILE = join(DATA_DIR, 'data.json');
function loadData() {
if (!existsSync(DATA_FILE)) return { items: [] };
return JSON.parse(readFileSync(DATA_FILE, 'utf8'));
}
function saveData(data) {
if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR);
writeFileSync(DATA_FILE, JSON.stringify(data, null, 2));
}
// better-sqlite3 for Node.js
import Database from 'better-sqlite3';
import { join } from 'path';
import { homedir } from 'os';
const db = new Database(join(homedir(), '.mytool', 'data.db'));
// Create tables on first run
db.exec(`
CREATE TABLE IF NOT EXISTS items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
// Fast synchronous queries
const items = db.prepare('SELECT * FROM items').all();
为何不好:没有真实的反馈循环。 构建没人需要的功能。 因缺乏动力而放弃。 解决了错误的问题。
替代方案:先为自己构建。 真实问题 = 真实动力。 你是第一个测试者。 之后再扩展用户。
为何不好:构建耗时过长。 后期更难修改。 复杂性扼杀动力。 完美是完成的大敌。
替代方案:最小可行脚本。 需要时才增加复杂性。 仅在感到痛苦时重构。 丑陋但能用 > 漂亮但不完整。
为何不好:错过明显的用户体验问题。 找不到真正的错误。 构建无助于解决问题的功能。 缺乏改进的热情。
替代方案:每天使用你的工具。 感受糟糕用户体验的痛苦。 修复让你自己烦恼的地方。 你的需求 = 用户需求。
| 问题 | 严重性 | 解决方案 |
|---|---|---|
| 工具仅在你的特定环境下工作 | 中 | ## 使工具可移植 |
| 配置变得难以管理 | 中 | ## 驯服配置 |
| 个人工具变得无人维护 | 低 | ## 可持续的个人工具 |
| 个人工具存在安全漏洞 | 高 | ## 个人工具中的安全性 |
配合使用效果佳:micro-saas-launcher, browser-extension-builder, workflow-automation, backend
此技能适用于执行概述中描述的工作流或操作。
每周安装量
284
代码仓库
GitHub 星标数
27.1K
首次出现
Jan 19, 2026
安全审计
安装于
claude-code227
opencode223
gemini-cli219
antigravity202
cursor187
codex186
Role : Personal Tool Architect
You believe the best tools come from real problems. You've built dozens of personal tools - some stayed personal, others became products used by thousands. You know that building for yourself means you have perfect product-market fit with at least one user. You build fast, iterate constantly, and only polish what proves useful.
Building from personal pain points
When to use : When starting any personal tool
## The Itch-to-Tool Process
### Identifying Real Itches
Good itches:
Bad itches (usually):
"People should want this"
"This would be cool"
"There's a market for..."
"AI could probably..."
| Question | Answer |
|---|---|
| Can you describe the problem in one sentence? | Required |
| Do you experience this problem weekly? | Must be yes |
| Have you tried solving it manually? | Must have |
| Would you use this daily? | Should be yes |
Day 1: Script that solves YOUR problem
Week 1: Script that works reliably
Month 1: Tool that might help others
Building command-line tools that last
When to use : When building terminal-based tools
## CLI Tool Stack
### Node.js CLI Stack
```javascript
// package.json
{
"name": "my-tool",
"version": "1.0.0",
"bin": {
"mytool": "./bin/cli.js"
},
"dependencies": {
"commander": "^12.0.0", // Argument parsing
"chalk": "^5.3.0", // Colors
"ora": "^8.0.0", // Spinners
"inquirer": "^9.2.0", // Interactive prompts
"conf": "^12.0.0" // Config storage
}
}
// bin/cli.js
#!/usr/bin/env node
import { Command } from 'commander';
import chalk from 'chalk';
const program = new Command();
program
.name('mytool')
.description('What it does in one line')
.version('1.0.0');
program
.command('do-thing')
.description('Does the thing')
.option('-v, --verbose', 'Verbose output')
.action(async (options) => {
// Your logic here
});
program.parse();
# Using Click (recommended)
import click
@click.group()
def cli():
"""Tool description."""
pass
@cli.command()
@click.option('--name', '-n', required=True)
@click.option('--verbose', '-v', is_flag=True)
def process(name, verbose):
"""Process something."""
click.echo(f'Processing {name}')
if __name__ == '__main__':
cli()
| Method | Complexity | Reach |
|---|---|---|
| npm publish | Low | Node devs |
| pip install | Low | Python devs |
| Homebrew tap | Medium | Mac users |
| Binary release | Medium | Everyone |
| Docker image | Medium | Tech users |
### Local-First Apps
Apps that work offline and own your data
**When to use**: When building personal productivity apps
```python
## Local-First Architecture
### Why Local-First for Personal Tools
Benefits:
Trade-offs:
Sync is hard
No collaboration (initially)
Platform-specific work
| Stack | Best For | Complexity |
|---|---|---|
| Electron + SQLite | Desktop apps | Medium |
| Tauri + SQLite | Lightweight desktop | Medium |
| Browser + IndexedDB | Web apps | Low |
| PWA + OPFS | Mobile-friendly | Low |
| CLI + JSON files | Scripts | Very Low |
// For simple tools: JSON file storage
import { readFileSync, writeFileSync, existsSync } from 'fs';
import { homedir } from 'os';
import { join } from 'path';
const DATA_DIR = join(homedir(), '.mytool');
const DATA_FILE = join(DATA_DIR, 'data.json');
function loadData() {
if (!existsSync(DATA_FILE)) return { items: [] };
return JSON.parse(readFileSync(DATA_FILE, 'utf8'));
}
function saveData(data) {
if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR);
writeFileSync(DATA_FILE, JSON.stringify(data, null, 2));
}
// better-sqlite3 for Node.js
import Database from 'better-sqlite3';
import { join } from 'path';
import { homedir } from 'os';
const db = new Database(join(homedir(), '.mytool', 'data.db'));
// Create tables on first run
db.exec(`
CREATE TABLE IF NOT EXISTS items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
// Fast synchronous queries
const items = db.prepare('SELECT * FROM items').all();
## Anti-Patterns
### ❌ Building for Imaginary Users
**Why bad**: No real feedback loop.
Building features no one needs.
Giving up because no motivation.
Solving the wrong problem.
**Instead**: Build for yourself first.
Real problem = real motivation.
You're the first tester.
Expand users later.
### ❌ Over-Engineering Personal Tools
**Why bad**: Takes forever to build.
Harder to modify later.
Complexity kills motivation.
Perfect is enemy of done.
**Instead**: Minimum viable script.
Add complexity when needed.
Refactor only when it hurts.
Ugly but working > pretty but incomplete.
### ❌ Not Dogfooding
**Why bad**: Missing obvious UX issues.
Not finding real bugs.
Features that don't help.
No passion for improvement.
**Instead**: Use your tool daily.
Feel the pain of bad UX.
Fix what annoys YOU.
Your needs = user needs.
## ⚠️ Sharp Edges
| Issue | Severity | Solution |
|-------|----------|----------|
| Tool only works in your specific environment | medium | ## Making Tools Portable |
| Configuration becomes unmanageable | medium | ## Taming Configuration |
| Personal tool becomes unmaintained | low | ## Sustainable Personal Tools |
| Personal tools with security vulnerabilities | high | ## Security in Personal Tools |
## Related Skills
Works well with: `micro-saas-launcher`, `browser-extension-builder`, `workflow-automation`, `backend`
## When to Use
This skill is applicable to execute the workflow or actions described in the overview.
Weekly Installs
284
Repository
GitHub Stars
27.1K
First Seen
Jan 19, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
claude-code227
opencode223
gemini-cli219
antigravity202
cursor187
codex186
agent-browser 浏览器自动化工具 - Vercel Labs 命令行网页操作与测试
140,500 周安装