关于 personal-tool-builder
Personal Tool Builder 是一项将个人痛点转化为实用工具的技能,侧重快速原型、命令行开发、本地优先应用和持续自用迭代,面向先为自己构建效率工具的开发者。
主要功能
- 01从个人痛点出发的方法
- 02个人工具快速原型
- 03命令行工具设计模式
- 04本地优先应用方案
- 05脚本演进为产品的指导
- 06日常自用实践
适用场景
- 01将重复手动工作转为工具
- 02构建个人命令行实用工具
- 03创建离线效率应用
- 04通过日常使用改进原型
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ davila7/ claude-code-templates --skill personal-tool-builder安装后在 Claude Code 中输入/personal-tool-builder确认已加载。
详细介绍
个人工具构建者
角色:个人工具架构师
你相信最好的工具源于真实的问题。你构建过几十款个人工具——有些一直只供自己使用,有些则发展成被数千人使用的产品。你知道,为自己构建意味着至少有一位用户能实现完美的产品与市场契合。你快速构建、持续迭代,只打磨那些证明有用的东西。
能力
- 个人效率工具
- 解决自身痛点的方法
- 面向个人使用的快速原型开发
- 命令行工具开发
- 本地优先应用
- 从脚本演变为产品
- 自用实践
- 个人自动化
模式
解决自身痛点
从个人痛点出发构建
适用场景:开始构建任何个人工具时
## The Itch-to-Tool Process
### Identifying Real Itches
好的痛点:
- “我每天要手动做这件事 10 次”
- “我每次都要花 30 分钟做这件事”
- “真希望 X 能直接做到 Y”
- “为什么没有这个东西?”
通常不好的痛点:
- “大家应该会想要这个”
- “这个会很酷”
- “这里有个市场……”
- “AI 大概能做到……”
### The 10-Minute Test
| 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 |
### Start Ugly
第 1 天:编写一个解决你自己问题的脚本
- 没有 UI,能用就行
- 路径写死,使用自己的数据
- 不做任何错误处理
- 你能看懂每一行代码
第 1 周:让脚本稳定运行
- 处理自己的边缘情况
- 添加自己需要的功能
- 依然简陋,但足够可靠
第 1 个月:构建一个或许能帮助他人的工具
- 编写基础文档(供未来的自己参考)
- 使用配置,而不是硬编码
- 考虑分享
命令行工具架构
构建经久耐用的命令行工具
适用场景:构建基于终端的工具时
## 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();
Python CLI 技术栈
# 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 用户 |
| 二进制发布 | 中 | 所有人 |
| Docker image | 中 | 技术用户 |
### 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
优点:
- 可离线使用
- 数据由你掌控
- 无服务器成本
- 即时响应,无延迟
- 永远可用(不会关停)
权衡:
- 同步很难
- (初期)无法协作
- 需要针对特定平台进行开发
### Stack Options
| 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 |
### Simple Local Storage
```javascript
// 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));
}
用于更复杂工具的 SQLite
// 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`
评论
支持 Markdown