claude-code-achievements 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +7 -0
- package/README.md +201 -0
- package/bin/config.js +285 -0
- package/bin/install.js +221 -0
- package/commands/achievements-settings.md +63 -0
- package/commands/achievements.md +93 -0
- package/data/achievements.json +168 -0
- package/data/i18n/en.json +94 -0
- package/data/i18n/ko.json +94 -0
- package/hooks/hooks.json +28 -0
- package/hooks/track-achievement.sh +178 -0
- package/hooks/track-stop.sh +44 -0
- package/package.json +38 -0
- package/scripts/init-state.sh +44 -0
- package/scripts/show-achievements.sh +152 -0
- package/scripts/show-notification.sh +145 -0
package/bin/install.js
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const readline = require('readline');
|
|
7
|
+
const { execSync } = require('child_process');
|
|
8
|
+
|
|
9
|
+
const PLUGIN_NAME = 'claude-code-achievements';
|
|
10
|
+
const TARGET_DIR = path.join(os.homedir(), '.claude', 'plugins', 'local', PLUGIN_NAME);
|
|
11
|
+
|
|
12
|
+
const ITEMS_TO_COPY = ['.claude-plugin', 'commands', 'hooks', 'scripts', 'data', 'bin'];
|
|
13
|
+
|
|
14
|
+
// ANSI colors
|
|
15
|
+
const GREEN = '\x1b[32m';
|
|
16
|
+
const CYAN = '\x1b[36m';
|
|
17
|
+
const YELLOW = '\x1b[33m';
|
|
18
|
+
const RED = '\x1b[31m';
|
|
19
|
+
const DIM = '\x1b[2m';
|
|
20
|
+
const BOLD = '\x1b[1m';
|
|
21
|
+
const RESET = '\x1b[0m';
|
|
22
|
+
|
|
23
|
+
function copyRecursive(src, dest) {
|
|
24
|
+
const stat = fs.statSync(src);
|
|
25
|
+
if (stat.isDirectory()) {
|
|
26
|
+
if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true });
|
|
27
|
+
for (const entry of fs.readdirSync(src)) {
|
|
28
|
+
copyRecursive(path.join(src, entry), path.join(dest, entry));
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
fs.copyFileSync(src, dest);
|
|
32
|
+
if (src.endsWith('.sh') || src.endsWith('.js')) {
|
|
33
|
+
fs.chmodSync(dest, 0o755);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function detectOS() {
|
|
39
|
+
const platform = os.platform();
|
|
40
|
+
if (platform === 'darwin') return 'macOS';
|
|
41
|
+
if (platform === 'win32') return 'Windows';
|
|
42
|
+
return 'Linux';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function detectLanguage() {
|
|
46
|
+
const locale = process.env.LANG || process.env.LC_ALL || process.env.LANGUAGE || '';
|
|
47
|
+
if (locale.toLowerCase().includes('ko')) return 'ko';
|
|
48
|
+
return 'en';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function checkSystemNotification(osName) {
|
|
52
|
+
try {
|
|
53
|
+
if (osName === 'macOS') {
|
|
54
|
+
// macOS always has osascript
|
|
55
|
+
return { available: true, method: 'osascript' };
|
|
56
|
+
} else if (osName === 'Linux') {
|
|
57
|
+
// Check for notify-send
|
|
58
|
+
execSync('which notify-send', { stdio: 'ignore' });
|
|
59
|
+
return { available: true, method: 'notify-send' };
|
|
60
|
+
} else if (osName === 'Windows') {
|
|
61
|
+
// Check for PowerShell
|
|
62
|
+
execSync('where powershell.exe', { stdio: 'ignore' });
|
|
63
|
+
return { available: true, method: 'PowerShell' };
|
|
64
|
+
}
|
|
65
|
+
} catch (e) {
|
|
66
|
+
return { available: false, method: null };
|
|
67
|
+
}
|
|
68
|
+
return { available: false, method: null };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function prompt(question, options) {
|
|
72
|
+
const rl = readline.createInterface({
|
|
73
|
+
input: process.stdin,
|
|
74
|
+
output: process.stdout
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
return new Promise((resolve) => {
|
|
78
|
+
const optStr = options.map((o, i) => `${i + 1}) ${o.label}`).join(' ');
|
|
79
|
+
rl.question(`${question} [${optStr}]: `, (answer) => {
|
|
80
|
+
rl.close();
|
|
81
|
+
const num = parseInt(answer) || 1;
|
|
82
|
+
const idx = Math.max(0, Math.min(options.length - 1, num - 1));
|
|
83
|
+
resolve(options[idx].value);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function install() {
|
|
89
|
+
console.log('');
|
|
90
|
+
console.log(`${CYAN}${BOLD}╔═══════════════════════════════════════════════════════════╗${RESET}`);
|
|
91
|
+
console.log(`${CYAN}${BOLD}║ 🎮 Claude Code Achievements Installer 🎮 ║${RESET}`);
|
|
92
|
+
console.log(`${CYAN}${BOLD}╚═══════════════════════════════════════════════════════════╝${RESET}`);
|
|
93
|
+
console.log('');
|
|
94
|
+
|
|
95
|
+
const detectedOS = detectOS();
|
|
96
|
+
const detectedLang = detectLanguage();
|
|
97
|
+
const notifyCheck = checkSystemNotification(detectedOS);
|
|
98
|
+
|
|
99
|
+
console.log(`${DIM}Detected OS: ${detectedOS}${RESET}`);
|
|
100
|
+
if (notifyCheck.available) {
|
|
101
|
+
console.log(`${DIM}System notifications: ${GREEN}✓${RESET}${DIM} ${notifyCheck.method}${RESET}`);
|
|
102
|
+
} else {
|
|
103
|
+
console.log(`${DIM}System notifications: ${YELLOW}✗${RESET}${DIM} not available (will use terminal)${RESET}`);
|
|
104
|
+
}
|
|
105
|
+
console.log('');
|
|
106
|
+
|
|
107
|
+
// Check if interactive
|
|
108
|
+
const isInteractive = process.stdin.isTTY;
|
|
109
|
+
|
|
110
|
+
let language = detectedLang;
|
|
111
|
+
let notificationStyle = notifyCheck.available ? 'system' : 'terminal';
|
|
112
|
+
|
|
113
|
+
if (isInteractive) {
|
|
114
|
+
// Language selection
|
|
115
|
+
console.log(`${BOLD}Select language / 언어 선택:${RESET}`);
|
|
116
|
+
language = await prompt('', [
|
|
117
|
+
{ label: 'English', value: 'en' },
|
|
118
|
+
{ label: '한국어', value: 'ko' }
|
|
119
|
+
]);
|
|
120
|
+
console.log(` ${GREEN}✓${RESET} ${language === 'ko' ? '한국어' : 'English'}`);
|
|
121
|
+
console.log('');
|
|
122
|
+
|
|
123
|
+
// Notification style (only ask if system notifications available)
|
|
124
|
+
if (notifyCheck.available) {
|
|
125
|
+
console.log(`${BOLD}Notification style:${RESET}`);
|
|
126
|
+
notificationStyle = await prompt('', [
|
|
127
|
+
{ label: `System (${notifyCheck.method})`, value: 'system' },
|
|
128
|
+
{ label: 'Terminal', value: 'terminal' },
|
|
129
|
+
{ label: 'Both', value: 'both' }
|
|
130
|
+
]);
|
|
131
|
+
console.log(` ${GREEN}✓${RESET} ${notificationStyle}`);
|
|
132
|
+
} else {
|
|
133
|
+
console.log(`${BOLD}Notification:${RESET} Terminal (system not available)`);
|
|
134
|
+
notificationStyle = 'terminal';
|
|
135
|
+
}
|
|
136
|
+
console.log('');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Copy files
|
|
140
|
+
const packageRoot = path.resolve(__dirname, '..');
|
|
141
|
+
|
|
142
|
+
if (fs.existsSync(TARGET_DIR)) {
|
|
143
|
+
console.log(`${DIM}Removing existing installation...${RESET}`);
|
|
144
|
+
fs.rmSync(TARGET_DIR, { recursive: true, force: true });
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
console.log(`${DIM}Installing to ${TARGET_DIR}${RESET}`);
|
|
148
|
+
fs.mkdirSync(TARGET_DIR, { recursive: true });
|
|
149
|
+
|
|
150
|
+
for (const item of ITEMS_TO_COPY) {
|
|
151
|
+
const srcPath = path.join(packageRoot, item);
|
|
152
|
+
const destPath = path.join(TARGET_DIR, item);
|
|
153
|
+
if (fs.existsSync(srcPath)) {
|
|
154
|
+
copyRecursive(srcPath, destPath);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Initialize state
|
|
159
|
+
const stateDir = path.join(os.homedir(), '.claude', 'achievements');
|
|
160
|
+
const stateFile = path.join(stateDir, 'state.json');
|
|
161
|
+
|
|
162
|
+
if (!fs.existsSync(stateDir)) {
|
|
163
|
+
fs.mkdirSync(stateDir, { recursive: true });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Always update settings, preserve achievements if exists
|
|
167
|
+
let existingState = null;
|
|
168
|
+
if (fs.existsSync(stateFile)) {
|
|
169
|
+
try {
|
|
170
|
+
existingState = JSON.parse(fs.readFileSync(stateFile, 'utf8'));
|
|
171
|
+
} catch (e) {}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const newState = {
|
|
175
|
+
settings: {
|
|
176
|
+
language,
|
|
177
|
+
notifications: true,
|
|
178
|
+
notification_style: notificationStyle
|
|
179
|
+
},
|
|
180
|
+
achievements: existingState?.achievements || {},
|
|
181
|
+
counters: existingState?.counters || {},
|
|
182
|
+
session: {}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
fs.writeFileSync(stateFile, JSON.stringify(newState, null, 2));
|
|
186
|
+
|
|
187
|
+
// Copy commands to ~/.claude/commands/
|
|
188
|
+
const commandsDir = path.join(os.homedir(), '.claude', 'commands');
|
|
189
|
+
if (!fs.existsSync(commandsDir)) {
|
|
190
|
+
fs.mkdirSync(commandsDir, { recursive: true });
|
|
191
|
+
}
|
|
192
|
+
const srcCommands = path.join(packageRoot, 'commands');
|
|
193
|
+
if (fs.existsSync(srcCommands)) {
|
|
194
|
+
for (const file of fs.readdirSync(srcCommands)) {
|
|
195
|
+
fs.copyFileSync(
|
|
196
|
+
path.join(srcCommands, file),
|
|
197
|
+
path.join(commandsDir, file)
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
console.log('');
|
|
203
|
+
console.log(`${GREEN}${BOLD}✅ Installation complete!${RESET}`);
|
|
204
|
+
console.log('');
|
|
205
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
206
|
+
console.log('');
|
|
207
|
+
console.log(`${BOLD}Ready to use:${RESET}`);
|
|
208
|
+
console.log('');
|
|
209
|
+
console.log(` ${CYAN}/achievements${RESET} View your achievements`);
|
|
210
|
+
console.log(` ${CYAN}/achievements hint${RESET} Get tips for unlocking`);
|
|
211
|
+
console.log('');
|
|
212
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
213
|
+
console.log('');
|
|
214
|
+
console.log('🎮 Happy coding!');
|
|
215
|
+
console.log('');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
install().catch(err => {
|
|
219
|
+
console.error('❌ Installation failed:', err.message);
|
|
220
|
+
process.exit(1);
|
|
221
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Configure your achievements settings"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /achievements-settings Command
|
|
6
|
+
|
|
7
|
+
## Instructions
|
|
8
|
+
|
|
9
|
+
Use AskUserQuestion to let the user configure settings interactively.
|
|
10
|
+
|
|
11
|
+
### Step 1: Read Current Settings
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
cat ~/.claude/achievements/state.json | jq '.settings'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Step 2: Show Menu
|
|
18
|
+
|
|
19
|
+
Use AskUserQuestion with ALL settings in one question (multiSelect: false):
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Question: "Select a setting to change"
|
|
23
|
+
Header: "Settings"
|
|
24
|
+
Options:
|
|
25
|
+
- "Language: {current}" (description: "Change display language")
|
|
26
|
+
- "Notifications: {on/off}" (description: "Toggle unlock notifications")
|
|
27
|
+
- "Style: {current}" (description: "terminal / system / both")
|
|
28
|
+
- "Reset Progress" (description: "Clear all achievements")
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Step 3: Based on Selection
|
|
32
|
+
|
|
33
|
+
**If "Language"**: Ask with options "English", "한국어", then apply:
|
|
34
|
+
```bash
|
|
35
|
+
jq '.settings.language = "en"' ~/.claude/achievements/state.json > tmp.json && mv tmp.json ~/.claude/achievements/state.json
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**If "Notifications"**: Ask "On" or "Off", then apply:
|
|
39
|
+
```bash
|
|
40
|
+
jq '.settings.notifications = true' ~/.claude/achievements/state.json > tmp.json && mv tmp.json ~/.claude/achievements/state.json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**If "Style"**: Ask "terminal", "system", "both", then apply:
|
|
44
|
+
```bash
|
|
45
|
+
jq '.settings.notification_style = "system"' ~/.claude/achievements/state.json > tmp.json && mv tmp.json ~/.claude/achievements/state.json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**If "Reset"**: Confirm first, then:
|
|
49
|
+
```bash
|
|
50
|
+
jq '.achievements = {} | .counters = {"ralph_iterations": 0, "files_read": 0, "edits_made": 0} | .session = {"files_read_set": []}' ~/.claude/achievements/state.json > tmp.json && mv tmp.json ~/.claude/achievements/state.json
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Step 4: Confirm
|
|
54
|
+
|
|
55
|
+
Tell user what changed: "✓ Language changed to English"
|
|
56
|
+
|
|
57
|
+
## Direct Arguments
|
|
58
|
+
|
|
59
|
+
Skip menu if arguments provided:
|
|
60
|
+
- `/achievements-settings language en`
|
|
61
|
+
- `/achievements-settings notifications off`
|
|
62
|
+
- `/achievements-settings notification-style system`
|
|
63
|
+
- `/achievements-settings reset`
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Display your Claude Code achievements progress"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /achievements Command
|
|
6
|
+
|
|
7
|
+
Display Claude Code achievements progress. Output directly in your response (not bash).
|
|
8
|
+
|
|
9
|
+
## Arguments
|
|
10
|
+
|
|
11
|
+
- `(none)` or `all`: Show all achievements
|
|
12
|
+
- `hint` or `tips`: Show tips for unlocking
|
|
13
|
+
- `<category>`: Show specific category (basics, workflow, tools, mastery)
|
|
14
|
+
|
|
15
|
+
## Instructions
|
|
16
|
+
|
|
17
|
+
### Step 1: Read Data
|
|
18
|
+
|
|
19
|
+
Use the Read tool to read these files:
|
|
20
|
+
- `~/.claude/plugins/local/claude-code-achievements/data/achievements.json`
|
|
21
|
+
- `~/.claude/achievements/state.json`
|
|
22
|
+
|
|
23
|
+
### Step 2: Format Output
|
|
24
|
+
|
|
25
|
+
**IMPORTANT: Output directly in your response text, NOT via bash. Bash output gets collapsed and has bad UX.**
|
|
26
|
+
|
|
27
|
+
Format like this (compact, readable):
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
🎮 **Claude Code Achievements** — 4/18 unlocked (22%)
|
|
31
|
+
████░░░░░░░░░░░░░░░░
|
|
32
|
+
|
|
33
|
+
**Getting Started**
|
|
34
|
+
✅ First Touch ⬜ · ✅ Creator ⬜
|
|
35
|
+
⬛ Hello, Claude! ⬜ — Start your first conversation
|
|
36
|
+
⬛ Project Curator 🟩 — Create CLAUDE.md for project context
|
|
37
|
+
|
|
38
|
+
**Workflow**
|
|
39
|
+
⬛ Strategic Thinker 🟩 — Use Plan mode for complex tasks
|
|
40
|
+
⬛ Version Controller 🟩 — Commit changes with Claude
|
|
41
|
+
⬛ Ship It! 🟩 — Push changes to remote
|
|
42
|
+
⬛ Quality Guardian 🟩 — Run tests with Claude
|
|
43
|
+
|
|
44
|
+
**Power Tools**
|
|
45
|
+
✅ Delegation Master 🟦
|
|
46
|
+
⬛ MCP Pioneer 🟦 — Use an MCP tool
|
|
47
|
+
⬛ Web Explorer 🟦 — Search the web
|
|
48
|
+
⬛ Skill Master 🟦 — Use a slash command
|
|
49
|
+
⬛ Data Scientist 🟦 — Edit a Jupyter notebook
|
|
50
|
+
⬛ Customizer 🟦 — Modify Claude Code settings
|
|
51
|
+
|
|
52
|
+
**Mastery**
|
|
53
|
+
⬛ Automation Architect 🟪 — Set up hooks
|
|
54
|
+
⬛ Loop Master 🟪 — Start autonomous coding loop
|
|
55
|
+
⬛ Parallel Universe 🟪 — Run multiple Claude sessions
|
|
56
|
+
⬛ Full Stack Vibecoder 🟨 — Work on frontend, backend, DB in one session
|
|
57
|
+
|
|
58
|
+
_Rarity: ⬜ Common · 🟩 Uncommon · 🟦 Rare · 🟪 Epic · 🟨 Legendary_
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Rules:
|
|
62
|
+
- ✅ = unlocked (show name + rarity only)
|
|
63
|
+
- ⬛ = locked (show name + rarity + description)
|
|
64
|
+
- Group unlocked items on same line when possible
|
|
65
|
+
- Keep it compact!
|
|
66
|
+
|
|
67
|
+
### Step 3: Suggest Next
|
|
68
|
+
|
|
69
|
+
After showing achievements, suggest ONE easy achievement to unlock next.
|
|
70
|
+
|
|
71
|
+
## Hint Mode (/achievements hint)
|
|
72
|
+
|
|
73
|
+
Show tips for 2-3 locked achievements. Read the `tip` field from achievements.json:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
💡 **Tips to unlock more:**
|
|
77
|
+
|
|
78
|
+
📋 **Project Curator** (🟩 Uncommon)
|
|
79
|
+
Create a CLAUDE.md file for your project
|
|
80
|
+
→ Include tech stack, coding style, and common commands
|
|
81
|
+
|
|
82
|
+
🎯 **Strategic Thinker** (🟩 Uncommon)
|
|
83
|
+
Use Plan mode for your next complex task
|
|
84
|
+
→ Press Shift+Tab twice to enter Plan mode
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Rarity Reference
|
|
88
|
+
|
|
89
|
+
- ⬜ Common — basic actions
|
|
90
|
+
- 🟩 Uncommon — workflow essentials
|
|
91
|
+
- 🟦 Rare — power user features
|
|
92
|
+
- 🟪 Epic — advanced automation
|
|
93
|
+
- 🟨 Legendary — master vibecoder
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
{
|
|
2
|
+
"rarities": {
|
|
3
|
+
"common": { "name": "Common", "color": "⬜", "order": 1 },
|
|
4
|
+
"uncommon": { "name": "Uncommon", "color": "🟩", "order": 2 },
|
|
5
|
+
"rare": { "name": "Rare", "color": "🟦", "order": 3 },
|
|
6
|
+
"epic": { "name": "Epic", "color": "🟪", "order": 4 },
|
|
7
|
+
"legendary": { "name": "Legendary", "color": "🟨", "order": 5 }
|
|
8
|
+
},
|
|
9
|
+
"categories": {
|
|
10
|
+
"basics": {
|
|
11
|
+
"name": "Getting Started",
|
|
12
|
+
"description": "First steps with Claude Code",
|
|
13
|
+
"order": 1
|
|
14
|
+
},
|
|
15
|
+
"workflow": {
|
|
16
|
+
"name": "Workflow",
|
|
17
|
+
"description": "Mastering development workflow",
|
|
18
|
+
"order": 2
|
|
19
|
+
},
|
|
20
|
+
"tools": {
|
|
21
|
+
"name": "Power Tools",
|
|
22
|
+
"description": "Using advanced Claude Code features",
|
|
23
|
+
"order": 3
|
|
24
|
+
},
|
|
25
|
+
"mastery": {
|
|
26
|
+
"name": "Mastery",
|
|
27
|
+
"description": "Expert-level usage",
|
|
28
|
+
"order": 4
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"achievements": {
|
|
32
|
+
"first_edit": {
|
|
33
|
+
"id": "first_edit",
|
|
34
|
+
"name": "First Touch",
|
|
35
|
+
"description": "Edit a file with Claude's help",
|
|
36
|
+
"tip": "Be specific: instead of 'fix the bug', say 'fix the TypeError in login.js line 42'",
|
|
37
|
+
"category": "basics",
|
|
38
|
+
"rarity": "common",
|
|
39
|
+
"icon": "✏️"
|
|
40
|
+
},
|
|
41
|
+
"first_write": {
|
|
42
|
+
"id": "first_write",
|
|
43
|
+
"name": "Creator",
|
|
44
|
+
"description": "Create a new file",
|
|
45
|
+
"tip": "Claude can create entire files from description. Try: 'Create a React component for a login form'",
|
|
46
|
+
"category": "basics",
|
|
47
|
+
"rarity": "common",
|
|
48
|
+
"icon": "📝"
|
|
49
|
+
},
|
|
50
|
+
"claude_md_creator": {
|
|
51
|
+
"id": "claude_md_creator",
|
|
52
|
+
"name": "Project Curator",
|
|
53
|
+
"description": "Create CLAUDE.md for project context",
|
|
54
|
+
"tip": "CLAUDE.md helps Claude understand your project. Include: tech stack, coding style, important files, and common commands.",
|
|
55
|
+
"category": "basics",
|
|
56
|
+
"rarity": "uncommon",
|
|
57
|
+
"icon": "📋"
|
|
58
|
+
},
|
|
59
|
+
"plan_mode_user": {
|
|
60
|
+
"id": "plan_mode_user",
|
|
61
|
+
"name": "Strategic Thinker",
|
|
62
|
+
"description": "Use Plan mode for complex tasks",
|
|
63
|
+
"tip": "Press Shift+Tab twice to enter Plan mode. Great for architecture decisions and multi-step tasks.",
|
|
64
|
+
"category": "workflow",
|
|
65
|
+
"rarity": "uncommon",
|
|
66
|
+
"icon": "🎯"
|
|
67
|
+
},
|
|
68
|
+
"git_commit": {
|
|
69
|
+
"id": "git_commit",
|
|
70
|
+
"name": "Version Controller",
|
|
71
|
+
"description": "Commit changes with Claude",
|
|
72
|
+
"tip": "Let Claude write commit messages! It reads your changes and writes meaningful conventional commits.",
|
|
73
|
+
"category": "workflow",
|
|
74
|
+
"rarity": "uncommon",
|
|
75
|
+
"icon": "📦"
|
|
76
|
+
},
|
|
77
|
+
"git_push": {
|
|
78
|
+
"id": "git_push",
|
|
79
|
+
"name": "Ship It!",
|
|
80
|
+
"description": "Push changes to remote",
|
|
81
|
+
"tip": "Always review changes before pushing. Ask Claude to summarize what will be pushed.",
|
|
82
|
+
"category": "workflow",
|
|
83
|
+
"rarity": "uncommon",
|
|
84
|
+
"icon": "🚀"
|
|
85
|
+
},
|
|
86
|
+
"run_tests": {
|
|
87
|
+
"id": "run_tests",
|
|
88
|
+
"name": "Quality Guardian",
|
|
89
|
+
"description": "Run tests with Claude",
|
|
90
|
+
"tip": "Ask Claude: 'Run the tests and fix any failures'. This is the vibecoding verification loop!",
|
|
91
|
+
"category": "workflow",
|
|
92
|
+
"rarity": "uncommon",
|
|
93
|
+
"icon": "🧪"
|
|
94
|
+
},
|
|
95
|
+
"multi_agent": {
|
|
96
|
+
"id": "multi_agent",
|
|
97
|
+
"name": "Delegation Master",
|
|
98
|
+
"description": "Use Task tool to spawn sub-agents",
|
|
99
|
+
"tip": "Task tool creates specialized agents for complex work. Great for parallel exploration.",
|
|
100
|
+
"category": "tools",
|
|
101
|
+
"rarity": "rare",
|
|
102
|
+
"icon": "🤖"
|
|
103
|
+
},
|
|
104
|
+
"first_mcp": {
|
|
105
|
+
"id": "first_mcp",
|
|
106
|
+
"name": "MCP Pioneer",
|
|
107
|
+
"description": "Use an MCP tool",
|
|
108
|
+
"tip": "MCP extends Claude's abilities. Connect to databases, APIs, or custom tools.",
|
|
109
|
+
"category": "tools",
|
|
110
|
+
"rarity": "rare",
|
|
111
|
+
"icon": "🔌"
|
|
112
|
+
},
|
|
113
|
+
"web_searcher": {
|
|
114
|
+
"id": "web_searcher",
|
|
115
|
+
"name": "Web Explorer",
|
|
116
|
+
"description": "Search the web for information",
|
|
117
|
+
"tip": "Claude can search for latest docs, solutions, and APIs.",
|
|
118
|
+
"category": "tools",
|
|
119
|
+
"rarity": "rare",
|
|
120
|
+
"icon": "🌐"
|
|
121
|
+
},
|
|
122
|
+
"skill_invoker": {
|
|
123
|
+
"id": "skill_invoker",
|
|
124
|
+
"name": "Skill Master",
|
|
125
|
+
"description": "Use a slash command skill",
|
|
126
|
+
"tip": "Skills are shortcuts. Try /commit, /pr, /init. Create custom skills in ~/.claude/commands/",
|
|
127
|
+
"category": "tools",
|
|
128
|
+
"rarity": "rare",
|
|
129
|
+
"icon": "⚡"
|
|
130
|
+
},
|
|
131
|
+
"notebook_editor": {
|
|
132
|
+
"id": "notebook_editor",
|
|
133
|
+
"name": "Data Scientist",
|
|
134
|
+
"description": "Edit a Jupyter notebook",
|
|
135
|
+
"tip": "Claude understands notebooks! Ask for data analysis, visualizations, or ML experiments.",
|
|
136
|
+
"category": "tools",
|
|
137
|
+
"rarity": "rare",
|
|
138
|
+
"icon": "📓"
|
|
139
|
+
},
|
|
140
|
+
"config_modifier": {
|
|
141
|
+
"id": "config_modifier",
|
|
142
|
+
"name": "Customizer",
|
|
143
|
+
"description": "Modify Claude Code settings",
|
|
144
|
+
"tip": "Customize Claude with /config or edit ~/.claude/settings.json.",
|
|
145
|
+
"category": "tools",
|
|
146
|
+
"rarity": "rare",
|
|
147
|
+
"icon": "⚙️"
|
|
148
|
+
},
|
|
149
|
+
"hooks_user": {
|
|
150
|
+
"id": "hooks_user",
|
|
151
|
+
"name": "Automation Architect",
|
|
152
|
+
"description": "Set up Claude Code hooks",
|
|
153
|
+
"tip": "Hooks run scripts on events. Use them for linting, testing, or custom workflows.",
|
|
154
|
+
"category": "mastery",
|
|
155
|
+
"rarity": "epic",
|
|
156
|
+
"icon": "🪝"
|
|
157
|
+
},
|
|
158
|
+
"ralph_starter": {
|
|
159
|
+
"id": "ralph_starter",
|
|
160
|
+
"name": "Loop Master",
|
|
161
|
+
"description": "Start an autonomous coding loop",
|
|
162
|
+
"tip": "Ralph Loop lets Claude work autonomously until a goal is met. Great for complex refactoring!",
|
|
163
|
+
"category": "mastery",
|
|
164
|
+
"rarity": "legendary",
|
|
165
|
+
"icon": "🔄"
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ui": {
|
|
3
|
+
"title": "CLAUDE CODE ACHIEVEMENTS",
|
|
4
|
+
"unlocked": "Achievement Unlocked!",
|
|
5
|
+
"locked": "Locked",
|
|
6
|
+
"progress": "Progress",
|
|
7
|
+
"rarity": "Rarity",
|
|
8
|
+
"tip": "Tip",
|
|
9
|
+
"hint": "Hint"
|
|
10
|
+
},
|
|
11
|
+
"categories": {
|
|
12
|
+
"basics": { "name": "Getting Started", "description": "First steps with Claude Code" },
|
|
13
|
+
"workflow": { "name": "Workflow", "description": "Development workflow mastery" },
|
|
14
|
+
"tools": { "name": "Power Tools", "description": "Advanced Claude Code features" },
|
|
15
|
+
"mastery": { "name": "Mastery", "description": "Expert-level usage" }
|
|
16
|
+
},
|
|
17
|
+
"achievements": {
|
|
18
|
+
"first_edit": {
|
|
19
|
+
"name": "First Touch",
|
|
20
|
+
"description": "Edit a file with Claude's help",
|
|
21
|
+
"tip": "Be specific: instead of 'fix the bug', say 'fix the TypeError in login.js line 42'"
|
|
22
|
+
},
|
|
23
|
+
"first_write": {
|
|
24
|
+
"name": "Creator",
|
|
25
|
+
"description": "Create a new file",
|
|
26
|
+
"tip": "Claude can create entire files from description. Try: 'Create a React component for a login form'"
|
|
27
|
+
},
|
|
28
|
+
"claude_md_creator": {
|
|
29
|
+
"name": "Project Curator",
|
|
30
|
+
"description": "Create CLAUDE.md for project context",
|
|
31
|
+
"tip": "CLAUDE.md helps Claude understand your project. Include: tech stack, coding style, important files, and common commands."
|
|
32
|
+
},
|
|
33
|
+
"plan_mode_user": {
|
|
34
|
+
"name": "Strategic Thinker",
|
|
35
|
+
"description": "Use Plan mode for complex tasks",
|
|
36
|
+
"tip": "Press Shift+Tab twice to enter Plan mode. Great for architecture decisions and multi-step tasks."
|
|
37
|
+
},
|
|
38
|
+
"git_commit": {
|
|
39
|
+
"name": "Version Controller",
|
|
40
|
+
"description": "Commit changes with Claude",
|
|
41
|
+
"tip": "Let Claude write commit messages! It reads your changes and writes meaningful conventional commits."
|
|
42
|
+
},
|
|
43
|
+
"git_push": {
|
|
44
|
+
"name": "Ship It!",
|
|
45
|
+
"description": "Push changes to remote",
|
|
46
|
+
"tip": "Always review changes before pushing. Ask Claude to summarize what will be pushed."
|
|
47
|
+
},
|
|
48
|
+
"run_tests": {
|
|
49
|
+
"name": "Quality Guardian",
|
|
50
|
+
"description": "Run tests with Claude",
|
|
51
|
+
"tip": "Ask Claude: 'Run the tests and fix any failures'. This is the vibecoding verification loop!"
|
|
52
|
+
},
|
|
53
|
+
"multi_agent": {
|
|
54
|
+
"name": "Delegation Master",
|
|
55
|
+
"description": "Use Task tool to spawn sub-agents",
|
|
56
|
+
"tip": "Task tool creates specialized agents for complex work. Great for parallel exploration."
|
|
57
|
+
},
|
|
58
|
+
"first_mcp": {
|
|
59
|
+
"name": "MCP Pioneer",
|
|
60
|
+
"description": "Use an MCP tool",
|
|
61
|
+
"tip": "MCP extends Claude's abilities. Connect to databases, APIs, or custom tools."
|
|
62
|
+
},
|
|
63
|
+
"web_searcher": {
|
|
64
|
+
"name": "Web Explorer",
|
|
65
|
+
"description": "Search the web for information",
|
|
66
|
+
"tip": "Claude can search for latest docs, solutions, and APIs."
|
|
67
|
+
},
|
|
68
|
+
"skill_invoker": {
|
|
69
|
+
"name": "Skill Master",
|
|
70
|
+
"description": "Use a slash command skill",
|
|
71
|
+
"tip": "Skills are shortcuts. Try /commit, /pr, /init. Create custom skills in ~/.claude/commands/"
|
|
72
|
+
},
|
|
73
|
+
"notebook_editor": {
|
|
74
|
+
"name": "Data Scientist",
|
|
75
|
+
"description": "Edit a Jupyter notebook",
|
|
76
|
+
"tip": "Claude understands notebooks! Ask for data analysis, visualizations, or ML experiments."
|
|
77
|
+
},
|
|
78
|
+
"config_modifier": {
|
|
79
|
+
"name": "Customizer",
|
|
80
|
+
"description": "Modify Claude Code settings",
|
|
81
|
+
"tip": "Customize Claude with /config or edit ~/.claude/settings.json."
|
|
82
|
+
},
|
|
83
|
+
"hooks_user": {
|
|
84
|
+
"name": "Automation Architect",
|
|
85
|
+
"description": "Set up Claude Code hooks",
|
|
86
|
+
"tip": "Hooks run scripts on events. Use them for linting, testing, or custom workflows."
|
|
87
|
+
},
|
|
88
|
+
"ralph_starter": {
|
|
89
|
+
"name": "Loop Master",
|
|
90
|
+
"description": "Start an autonomous coding loop",
|
|
91
|
+
"tip": "Ralph Loop lets Claude work autonomously until a goal is met. Great for complex refactoring!"
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|