@prestyj/cli 5.32.0 → 5.32.2
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/README.md +3 -2
- package/assets/skills/task-list/SKILL.md +39 -0
- package/dist/app-sidecar/app-settings.js +11 -5
- package/dist/app-sidecar/app-settings.js.map +1 -1
- package/dist/app-sidecar/auth-routes.js +10 -3
- package/dist/app-sidecar/auth-routes.js.map +1 -1
- package/dist/app-sidecar/git-target.d.ts +15 -2
- package/dist/app-sidecar/git-target.js +24 -10
- package/dist/app-sidecar/git-target.js.map +1 -1
- package/dist/app-sidecar/goal-routes.js +8 -0
- package/dist/app-sidecar/goal-routes.js.map +1 -1
- package/dist/app-sidecar/history-routes.js +7 -0
- package/dist/app-sidecar/history-routes.js.map +1 -1
- package/dist/app-sidecar/history.d.ts +5 -0
- package/dist/app-sidecar/history.js.map +1 -1
- package/dist/app-sidecar/integration-routes.js +4 -0
- package/dist/app-sidecar/integration-routes.js.map +1 -1
- package/dist/app-sidecar/mcp-routes.js +1 -0
- package/dist/app-sidecar/mcp-routes.js.map +1 -1
- package/dist/app-sidecar/mcp-rows.d.ts +2 -0
- package/dist/app-sidecar/mcp-rows.js +4 -1
- package/dist/app-sidecar/mcp-rows.js.map +1 -1
- package/dist/app-sidecar/prompt-routes.js +67 -1
- package/dist/app-sidecar/prompt-routes.js.map +1 -1
- package/dist/app-sidecar/route-context.d.ts +2 -0
- package/dist/app-sidecar/run-control-routes.js +43 -3
- package/dist/app-sidecar/run-control-routes.js.map +1 -1
- package/dist/app-sidecar/session-routes.js +10 -0
- package/dist/app-sidecar/session-routes.js.map +1 -1
- package/dist/app-sidecar/task-routes.js +2 -0
- package/dist/app-sidecar/task-routes.js.map +1 -1
- package/dist/app-sidecar/trophy-manager.d.ts +15 -0
- package/dist/app-sidecar/trophy-manager.js +71 -0
- package/dist/app-sidecar/trophy-manager.js.map +1 -0
- package/dist/app-sidecar/workspace-routes.js +1 -0
- package/dist/app-sidecar/workspace-routes.js.map +1 -1
- package/dist/app-sidecar.js +157 -30
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli/auth.js +22 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/mcp.js +6 -1
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli.js +13 -9
- package/dist/cli.js.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/core/action-threats.d.ts +68 -0
- package/dist/core/action-threats.js +894 -0
- package/dist/core/action-threats.js.map +1 -0
- package/dist/core/agent-notifications.d.ts +18 -0
- package/dist/core/agent-notifications.js +35 -2
- package/dist/core/agent-notifications.js.map +1 -1
- package/dist/core/agent-session/verification-tracker.d.ts +21 -0
- package/dist/core/agent-session/verification-tracker.js +39 -1
- package/dist/core/agent-session/verification-tracker.js.map +1 -1
- package/dist/core/agent-session.d.ts +168 -2
- package/dist/core/agent-session.js +486 -23
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/blocked-packages-file.d.ts +33 -0
- package/dist/core/blocked-packages-file.js +274 -0
- package/dist/core/blocked-packages-file.js.map +1 -0
- package/dist/core/compaction/policy.d.ts +2 -2
- package/dist/core/compaction/policy.js +86 -43
- package/dist/core/compaction/policy.js.map +1 -1
- package/dist/core/compaction/token-estimator.d.ts +4 -1
- package/dist/core/compaction/token-estimator.js +5 -2
- package/dist/core/compaction/token-estimator.js.map +1 -1
- package/dist/core/event-bus.d.ts +10 -0
- package/dist/core/event-bus.js +2 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/idle-wake.d.ts +62 -0
- package/dist/core/idle-wake.js +103 -0
- package/dist/core/idle-wake.js.map +1 -0
- package/dist/core/injection-detect.d.ts +2 -1
- package/dist/core/injection-detect.js +13 -4
- package/dist/core/injection-detect.js.map +1 -1
- package/dist/core/installed-threats.d.ts +23 -0
- package/dist/core/installed-threats.js +71 -0
- package/dist/core/installed-threats.js.map +1 -0
- package/dist/core/mcp/catalog-cache.d.ts +2 -0
- package/dist/core/mcp/catalog-cache.js +4 -0
- package/dist/core/mcp/catalog-cache.js.map +1 -1
- package/dist/core/mcp/client.d.ts +8 -0
- package/dist/core/mcp/client.js +37 -3
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/deferred-catalog.d.ts +12 -1
- package/dist/core/mcp/deferred-catalog.js +37 -10
- package/dist/core/mcp/deferred-catalog.js.map +1 -1
- package/dist/core/mcp/index.d.ts +2 -0
- package/dist/core/mcp/index.js +1 -0
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/tool-guard.d.ts +58 -0
- package/dist/core/mcp/tool-guard.js +215 -0
- package/dist/core/mcp/tool-guard.js.map +1 -0
- package/dist/core/network-guard.d.ts +0 -20
- package/dist/core/network-guard.js +6 -0
- package/dist/core/network-guard.js.map +1 -1
- package/dist/core/package-cooldown.d.ts +71 -0
- package/dist/core/package-cooldown.js +301 -0
- package/dist/core/package-cooldown.js.map +1 -0
- package/dist/core/package-threats.d.ts +77 -3
- package/dist/core/package-threats.js +1250 -78
- package/dist/core/package-threats.js.map +1 -1
- package/dist/core/process-manager.d.ts +54 -12
- package/dist/core/process-manager.js +233 -56
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/project-files.d.ts +15 -0
- package/dist/core/project-files.js +37 -0
- package/dist/core/project-files.js.map +1 -0
- package/dist/core/prompt-commands.js +1 -0
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.js +4 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shell-threats.d.ts +14 -1
- package/dist/core/shell-threats.js +73 -24
- package/dist/core/shell-threats.js.map +1 -1
- package/dist/core/skill-scan.d.ts +112 -0
- package/dist/core/skill-scan.js +781 -0
- package/dist/core/skill-scan.js.map +1 -0
- package/dist/core/skills.d.ts +33 -0
- package/dist/core/skills.js +87 -16
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +5 -1
- package/dist/core/slash-commands.js +24 -9
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/steering.d.ts +7 -0
- package/dist/core/steering.js +13 -0
- package/dist/core/steering.js.map +1 -1
- package/dist/core/style-packs/index.js +1 -1
- package/dist/core/style-packs/index.js.map +1 -1
- package/dist/core/style-packs/packs.js +2 -2
- package/dist/core/subagent-manager.js +5 -4
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/threat-feed.d.ts +65 -0
- package/dist/core/threat-feed.js +335 -0
- package/dist/core/threat-feed.js.map +1 -0
- package/dist/core/trophies/catalog-more.d.ts +2 -0
- package/dist/core/trophies/catalog-more.js +857 -0
- package/dist/core/trophies/catalog-more.js.map +1 -0
- package/dist/core/trophies/catalog.d.ts +4 -0
- package/dist/core/trophies/catalog.js +649 -0
- package/dist/core/trophies/catalog.js.map +1 -0
- package/dist/core/trophies/engine.d.ts +70 -0
- package/dist/core/trophies/engine.js +351 -0
- package/dist/core/trophies/engine.js.map +1 -0
- package/dist/core/trophies/store.d.ts +17 -0
- package/dist/core/trophies/store.js +113 -0
- package/dist/core/trophies/store.js.map +1 -0
- package/dist/core/trophies/types.d.ts +119 -0
- package/dist/core/trophies/types.js +78 -0
- package/dist/core/trophies/types.js.map +1 -0
- package/dist/core/verification-evidence.d.ts +10 -6
- package/dist/core/verification-evidence.js +190 -11
- package/dist/core/verification-evidence.js.map +1 -1
- package/dist/goals-agent/goals-agent.js +3 -2
- package/dist/goals-agent/goals-agent.js.map +1 -1
- package/dist/interactive.js +16 -5
- package/dist/interactive.js.map +1 -1
- package/dist/modes/acp-mode.js +8 -1
- package/dist/modes/acp-mode.js.map +1 -1
- package/dist/modes/agent-home-mode.js +13 -1
- package/dist/modes/agent-home-mode.js.map +1 -1
- package/dist/modes/rpc-mode.d.ts +2 -1
- package/dist/modes/rpc-mode.js +15 -3
- package/dist/modes/rpc-mode.js.map +1 -1
- package/dist/modes/serve-mode.js +13 -1
- package/dist/modes/serve-mode.js.map +1 -1
- package/dist/system-prompt.d.ts +8 -0
- package/dist/system-prompt.js +34 -13
- package/dist/system-prompt.js.map +1 -1
- package/dist/test-support/slow-git.d.ts +1 -0
- package/dist/test-support/slow-git.js +21 -0
- package/dist/test-support/slow-git.js.map +1 -0
- package/dist/tools/background-watch-lint.d.ts +18 -0
- package/dist/tools/background-watch-lint.js +102 -0
- package/dist/tools/background-watch-lint.js.map +1 -0
- package/dist/tools/bash.d.ts +15 -4
- package/dist/tools/bash.js +75 -47
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/checklist.d.ts +3 -3
- package/dist/tools/compress.js +45 -0
- package/dist/tools/compress.js.map +1 -1
- package/dist/tools/edit.js +5 -0
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/generate-image.d.ts +29 -6
- package/dist/tools/generate-image.js +325 -151
- package/dist/tools/generate-image.js.map +1 -1
- package/dist/tools/grep.d.ts +14 -0
- package/dist/tools/grep.js +36 -2
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +5 -1
- package/dist/tools/index.js +7 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts +8 -1
- package/dist/tools/prompt-hints.js +22 -2
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/routine-output.d.ts +30 -0
- package/dist/tools/routine-output.js +203 -0
- package/dist/tools/routine-output.js.map +1 -0
- package/dist/tools/skill.d.ts +2 -2
- package/dist/tools/skill.js +8 -1
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-shared.js +4 -1
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/task-output.js +11 -1
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/write.js +8 -0
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/ModelSelector.d.ts +10 -0
- package/dist/ui/components/ModelSelector.js +51 -5
- package/dist/ui/components/ModelSelector.js.map +1 -1
- package/dist/ui/components/ToolExecution.js +2 -2
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/mcp.d.ts +2 -0
- package/dist/ui/mcp.js.map +1 -1
- package/dist/ui/terminal-history.js +2 -1
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/tool-line-summary.js +3 -1
- package/dist/ui/tool-line-summary.js.map +1 -1
- package/dist/utils/git.d.ts +12 -3
- package/dist/utils/git.js +21 -8
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/image.d.ts +14 -0
- package/dist/utils/image.js +23 -0
- package/dist/utils/image.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,857 @@
|
|
|
1
|
+
// More trophies: the second half of the catalog (catalog.ts holds the first
|
|
2
|
+
// and assembles both). Every one is earned by something the sidecar can see in
|
|
3
|
+
// the app as it ships today: a route it serves, a tool it registers for
|
|
4
|
+
// everyone, a skill it bundles, or an XP total. Nothing depends on an optional
|
|
5
|
+
// add-on (OpenAI image generation, the steroids CLI) or a CLI-only flow.
|
|
6
|
+
//
|
|
7
|
+
// Ids are stored in ~/.ezcoder/trophies.json: never rename or reuse one. Copy is
|
|
8
|
+
// shown in the app: plain words, no em dashes.
|
|
9
|
+
const count = (key) => ({ kind: "count", key });
|
|
10
|
+
const distinct = (key) => ({ kind: "distinct", key });
|
|
11
|
+
const progress = (key) => ({ kind: "progress", key });
|
|
12
|
+
export const MORE_TROPHIES = [
|
|
13
|
+
// ── Getting started ──
|
|
14
|
+
{
|
|
15
|
+
id: "stop",
|
|
16
|
+
title: "Hold on",
|
|
17
|
+
tier: "bronze",
|
|
18
|
+
category: "start",
|
|
19
|
+
description: "You stopped a run. Press Stop or Escape any time and GG halts where it is, keeping what it already did.",
|
|
20
|
+
hint: "Press Stop (or Escape) while GG is working.",
|
|
21
|
+
stat: count("cancels"),
|
|
22
|
+
goal: 1,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "unqueue",
|
|
26
|
+
title: "Never mind",
|
|
27
|
+
tier: "bronze",
|
|
28
|
+
category: "start",
|
|
29
|
+
description: "You took back a queued message. Messages sent mid-run wait in a queue, and you can cancel them before they go.",
|
|
30
|
+
hint: "Send a message while GG is working, then cancel it from the queue.",
|
|
31
|
+
stat: count("queueCancels"),
|
|
32
|
+
goal: 1,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "autopilot-on",
|
|
36
|
+
title: "Second pair of eyes",
|
|
37
|
+
tier: "bronze",
|
|
38
|
+
category: "start",
|
|
39
|
+
description: "You turned on Autopilot. After each run, Nolan reviews the work and sends GG back if something needs fixing.",
|
|
40
|
+
hint: "Open the More menu and switch on Autopilot.",
|
|
41
|
+
stat: count("autopilotOn"),
|
|
42
|
+
goal: 1,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "radio",
|
|
46
|
+
title: "Tuned in",
|
|
47
|
+
tier: "bronze",
|
|
48
|
+
category: "start",
|
|
49
|
+
description: "EZ Coder has a built-in internet radio, for music while you work.",
|
|
50
|
+
hint: "Open Radio from the More menu and pick a station.",
|
|
51
|
+
stat: count("radioPlays"),
|
|
52
|
+
goal: 1,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "slash-10",
|
|
56
|
+
title: "Muscle memory",
|
|
57
|
+
tier: "silver",
|
|
58
|
+
category: "start",
|
|
59
|
+
description: "Ten slash commands run. They're second nature now.",
|
|
60
|
+
hint: "Run 10 slash commands.",
|
|
61
|
+
stat: count("slashCommands"),
|
|
62
|
+
goal: 10,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: "enhance-10",
|
|
66
|
+
title: "Wordsmith",
|
|
67
|
+
tier: "silver",
|
|
68
|
+
category: "start",
|
|
69
|
+
description: "Ten enhanced prompts. Clear briefs get better results.",
|
|
70
|
+
hint: "Send 10 messages after pressing Enhance.",
|
|
71
|
+
stat: count("enhancedSends"),
|
|
72
|
+
goal: 10,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "picture-10",
|
|
76
|
+
title: "Show, don't tell",
|
|
77
|
+
tier: "silver",
|
|
78
|
+
category: "start",
|
|
79
|
+
description: "Ten messages sent with images. A screenshot is often the fastest bug report.",
|
|
80
|
+
hint: "Send 10 messages with an image attached.",
|
|
81
|
+
stat: count("attachments"),
|
|
82
|
+
goal: 10,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "mention-25",
|
|
86
|
+
title: "Tour guide",
|
|
87
|
+
tier: "silver",
|
|
88
|
+
category: "start",
|
|
89
|
+
description: "Twenty-five messages that pointed GG at the right files.",
|
|
90
|
+
hint: "Mention files with @ in 25 messages.",
|
|
91
|
+
stat: count("fileMentions"),
|
|
92
|
+
goal: 25,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: "steer-25",
|
|
96
|
+
title: "Back-seat driver",
|
|
97
|
+
tier: "silver",
|
|
98
|
+
category: "start",
|
|
99
|
+
description: "Twenty-five course corrections mid-run. You steer, GG drives.",
|
|
100
|
+
hint: "Send 25 messages while GG is working.",
|
|
101
|
+
stat: count("steers"),
|
|
102
|
+
goal: 25,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: "fresh-25",
|
|
106
|
+
title: "Tidy mind",
|
|
107
|
+
tier: "silver",
|
|
108
|
+
category: "start",
|
|
109
|
+
description: "Twenty-five fresh sessions. Small contexts keep GG sharp and cheap.",
|
|
110
|
+
hint: "Start 25 new sessions.",
|
|
111
|
+
stat: count("newSessions"),
|
|
112
|
+
goal: 25,
|
|
113
|
+
},
|
|
114
|
+
// ── Working with GG ──
|
|
115
|
+
{
|
|
116
|
+
id: "compact",
|
|
117
|
+
title: "Making room",
|
|
118
|
+
tier: "bronze",
|
|
119
|
+
category: "flow",
|
|
120
|
+
description: "GG compacted a long conversation: it summarized the older parts so the session could keep going.",
|
|
121
|
+
hint: "Keep one session going until the context meter fills up.",
|
|
122
|
+
stat: count("compactions"),
|
|
123
|
+
goal: 1,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: "answer-25",
|
|
127
|
+
title: "Good collaborator",
|
|
128
|
+
tier: "silver",
|
|
129
|
+
category: "flow",
|
|
130
|
+
description: "Twenty-five of GG's questions answered. Clear answers, fewer wrong turns.",
|
|
131
|
+
hint: "Answer 25 questions from GG.",
|
|
132
|
+
stat: count("questionsAnswered"),
|
|
133
|
+
goal: 25,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: "plan-5",
|
|
137
|
+
title: "Blueprint",
|
|
138
|
+
tier: "silver",
|
|
139
|
+
category: "flow",
|
|
140
|
+
description: "Five approved plans. Planning first is becoming a habit.",
|
|
141
|
+
hint: "Approve 5 plans.",
|
|
142
|
+
stat: count("plansApproved"),
|
|
143
|
+
goal: 5,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: "ken-10",
|
|
147
|
+
title: "Regular at the desk",
|
|
148
|
+
tier: "silver",
|
|
149
|
+
category: "flow",
|
|
150
|
+
description: "Ten questions to Nolan Grout.",
|
|
151
|
+
hint: "Ask Nolan 10 times.",
|
|
152
|
+
stat: count("nolanQuestions"),
|
|
153
|
+
goal: 10,
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: "ken-pin",
|
|
157
|
+
title: "Nolan's own brain",
|
|
158
|
+
tier: "silver",
|
|
159
|
+
category: "flow",
|
|
160
|
+
description: "You gave Nolan a model of his own. By default he follows GG's model; pinning one keeps him on it.",
|
|
161
|
+
hint: "Open the model panel and pick a model for Nolan.",
|
|
162
|
+
stat: count("nolanPins"),
|
|
163
|
+
goal: 1,
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: "autopilot-5",
|
|
167
|
+
title: "Trust, but verify",
|
|
168
|
+
tier: "silver",
|
|
169
|
+
category: "flow",
|
|
170
|
+
description: "Five Autopilot reviews. Nolan has your back.",
|
|
171
|
+
hint: "Let Autopilot review 5 runs.",
|
|
172
|
+
stat: count("autopilotReviews"),
|
|
173
|
+
goal: 5,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: "every-command",
|
|
177
|
+
title: "The whole menu",
|
|
178
|
+
tier: "gold",
|
|
179
|
+
category: "flow",
|
|
180
|
+
description: "Every built-in workflow: /init, /commit, /expand, /compare, /setup-commit, /setup-ci, /setup-skills and /steroids.",
|
|
181
|
+
hint: "Run all 8 built-in slash commands at least once.",
|
|
182
|
+
stat: distinct("slashCommandNames"),
|
|
183
|
+
goal: 8,
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
id: "plan-100",
|
|
187
|
+
title: "Grand designer",
|
|
188
|
+
tier: "platinum",
|
|
189
|
+
category: "flow",
|
|
190
|
+
description: "A hundred approved plans. Nothing gets built without one.",
|
|
191
|
+
hint: "Approve 100 plans.",
|
|
192
|
+
stat: count("plansApproved"),
|
|
193
|
+
goal: 100,
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: "autopilot-100",
|
|
197
|
+
title: "Autopilot ace",
|
|
198
|
+
tier: "platinum",
|
|
199
|
+
category: "flow",
|
|
200
|
+
description: "A hundred Autopilot reviews. GG checks its own work as a matter of course.",
|
|
201
|
+
hint: "Let Autopilot review 100 runs.",
|
|
202
|
+
stat: count("autopilotReviews"),
|
|
203
|
+
goal: 100,
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: "compact-25",
|
|
207
|
+
title: "Long hauler",
|
|
208
|
+
tier: "gold",
|
|
209
|
+
category: "flow",
|
|
210
|
+
description: "Twenty-five conversations kept going past a full context.",
|
|
211
|
+
hint: "Let GG compact 25 long conversations.",
|
|
212
|
+
stat: count("compactions"),
|
|
213
|
+
goal: 25,
|
|
214
|
+
},
|
|
215
|
+
// ── Power tools ──
|
|
216
|
+
{
|
|
217
|
+
id: "screenshot",
|
|
218
|
+
title: "Say cheese",
|
|
219
|
+
tier: "bronze",
|
|
220
|
+
category: "power",
|
|
221
|
+
description: "GG took a screenshot to check its own work on screen.",
|
|
222
|
+
hint: "Ask GG to screenshot your app and check how it looks.",
|
|
223
|
+
stat: count("screenshots"),
|
|
224
|
+
goal: 1,
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
id: "code-search",
|
|
228
|
+
title: "Where is it?",
|
|
229
|
+
tier: "bronze",
|
|
230
|
+
category: "power",
|
|
231
|
+
description: "GG searched your code by meaning, not just by exact words.",
|
|
232
|
+
hint: "Ask GG where something happens in your code.",
|
|
233
|
+
stat: count("codeSearches"),
|
|
234
|
+
goal: 1,
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
id: "code-nav",
|
|
238
|
+
title: "Go to definition",
|
|
239
|
+
tier: "bronze",
|
|
240
|
+
category: "power",
|
|
241
|
+
description: "GG jumped to a definition and its callers, the way your editor does.",
|
|
242
|
+
hint: "Ask GG who calls a function, or where something is defined.",
|
|
243
|
+
stat: count("codeNavs"),
|
|
244
|
+
goal: 1,
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
id: "kill",
|
|
248
|
+
title: "Lights out",
|
|
249
|
+
tier: "bronze",
|
|
250
|
+
category: "power",
|
|
251
|
+
description: "You stopped a background process from the deck's tasks panel.",
|
|
252
|
+
hint: "Open the background tasks key on the deck and stop a process.",
|
|
253
|
+
stat: count("processKills"),
|
|
254
|
+
goal: 1,
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
id: "schedule",
|
|
258
|
+
title: "Clockwork",
|
|
259
|
+
tier: "silver",
|
|
260
|
+
category: "power",
|
|
261
|
+
description: "A scheduled prompt ran on its own. /schedule repeats a prompt on a timer.",
|
|
262
|
+
hint: "Run /schedule with a prompt and an interval, then let it fire.",
|
|
263
|
+
stat: count("scheduledRuns"),
|
|
264
|
+
goal: 1,
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
id: "debug",
|
|
268
|
+
title: "Bug hunter",
|
|
269
|
+
tier: "silver",
|
|
270
|
+
category: "power",
|
|
271
|
+
description: "GG ran a real debugger: breakpoints, stepping and live values instead of guesswork.",
|
|
272
|
+
hint: "Ask GG to debug a Node script with breakpoints.",
|
|
273
|
+
stat: count("debugRuns"),
|
|
274
|
+
goal: 1,
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: "ui-adopt",
|
|
278
|
+
title: "Off the shelf",
|
|
279
|
+
tier: "silver",
|
|
280
|
+
category: "power",
|
|
281
|
+
description: "GG added a ready-made UI component from a registry like shadcn.",
|
|
282
|
+
hint: "Ask GG to add a shadcn component to your app.",
|
|
283
|
+
stat: count("uiComponents"),
|
|
284
|
+
goal: 1,
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
id: "checklist-items",
|
|
288
|
+
title: "Health inspector",
|
|
289
|
+
tier: "silver",
|
|
290
|
+
category: "power",
|
|
291
|
+
description: "Ten different Checklist items checked: tests, CI, security, design and more.",
|
|
292
|
+
hint: "Run 10 different items from the Checklist.",
|
|
293
|
+
stat: distinct("checklistItems"),
|
|
294
|
+
goal: 10,
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
id: "skills-5",
|
|
298
|
+
title: "Specialist",
|
|
299
|
+
tier: "silver",
|
|
300
|
+
category: "power",
|
|
301
|
+
description: "Five different skills used. Each one is a proven method for one kind of job.",
|
|
302
|
+
hint: "Ask for work that needs different skills: a review, a refactor, a flaky bug.",
|
|
303
|
+
stat: distinct("skillsUsed"),
|
|
304
|
+
goal: 5,
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
id: "mcp-add",
|
|
308
|
+
title: "New connections",
|
|
309
|
+
tier: "silver",
|
|
310
|
+
category: "power",
|
|
311
|
+
description: "You added an MCP server, giving GG a new set of tools.",
|
|
312
|
+
hint: "Open Settings, then MCP, and add a server.",
|
|
313
|
+
stat: count("mcpServersAdded"),
|
|
314
|
+
goal: 1,
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
id: "mcp-25",
|
|
318
|
+
title: "Well connected",
|
|
319
|
+
tier: "gold",
|
|
320
|
+
category: "power",
|
|
321
|
+
description: "Twenty-five runs that used tools from MCP servers.",
|
|
322
|
+
hint: "Finish 25 runs that use an MCP server's tools.",
|
|
323
|
+
stat: count("mcpRuns"),
|
|
324
|
+
goal: 25,
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
id: "hf-pull",
|
|
328
|
+
title: "Download a brain",
|
|
329
|
+
tier: "silver",
|
|
330
|
+
category: "power",
|
|
331
|
+
description: "You pulled a model from Hugging Face to run locally.",
|
|
332
|
+
hint: "Open Settings, then AI Providers, and pull a model from the Hugging Face tile.",
|
|
333
|
+
stat: count("modelsPulled"),
|
|
334
|
+
goal: 1,
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
id: "endpoint",
|
|
338
|
+
title: "Bring your own server",
|
|
339
|
+
tier: "silver",
|
|
340
|
+
category: "power",
|
|
341
|
+
description: "You connected your own model server, so GG can use any compatible endpoint.",
|
|
342
|
+
hint: "Open Settings, then AI Providers, open the Ollama tile and add an endpoint.",
|
|
343
|
+
stat: count("localEndpoints"),
|
|
344
|
+
goal: 1,
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
id: "import",
|
|
348
|
+
title: "Moving in",
|
|
349
|
+
tier: "silver",
|
|
350
|
+
category: "power",
|
|
351
|
+
description: "You opened a Claude Code or Codex conversation in EZ Coder, ready to carry on where it left off.",
|
|
352
|
+
hint: "In a project's session list, open a conversation from Claude Code or Codex.",
|
|
353
|
+
stat: count("transcriptImports"),
|
|
354
|
+
goal: 1,
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
id: "telegram",
|
|
358
|
+
title: "Pocket GG",
|
|
359
|
+
tier: "silver",
|
|
360
|
+
category: "power",
|
|
361
|
+
description: "You connected Telegram, so you can talk to GG from your phone.",
|
|
362
|
+
hint: "Open Settings, then Remote, and connect a Telegram bot.",
|
|
363
|
+
stat: count("telegramSetups"),
|
|
364
|
+
goal: 1,
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
id: "remote",
|
|
368
|
+
title: "Working from anywhere",
|
|
369
|
+
tier: "gold",
|
|
370
|
+
category: "power",
|
|
371
|
+
description: "You turned on Remote. GG now answers your Telegram messages while you're away.",
|
|
372
|
+
hint: "Connect Telegram, then turn on Remote.",
|
|
373
|
+
stat: count("remoteStarts"),
|
|
374
|
+
goal: 1,
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
id: "providers-3",
|
|
378
|
+
title: "Shopping around",
|
|
379
|
+
tier: "silver",
|
|
380
|
+
category: "power",
|
|
381
|
+
description: "Runs finished with three different AI providers.",
|
|
382
|
+
hint: "Sign in to 3 providers and finish a run with each.",
|
|
383
|
+
stat: distinct("providersUsed"),
|
|
384
|
+
goal: 3,
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
id: "skills-all",
|
|
388
|
+
title: "Master of methods",
|
|
389
|
+
tier: "gold",
|
|
390
|
+
category: "power",
|
|
391
|
+
description: "All eleven built-in skills used, from test-first to security hardening.",
|
|
392
|
+
hint: "Use every built-in skill at least once.",
|
|
393
|
+
stat: distinct("skillsUsed"),
|
|
394
|
+
goal: 11,
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
id: "checklist-all",
|
|
398
|
+
title: "Clean bill of health",
|
|
399
|
+
tier: "gold",
|
|
400
|
+
category: "power",
|
|
401
|
+
description: "Every item on the Checklist checked at least once.",
|
|
402
|
+
hint: "Run all 24 Checklist items.",
|
|
403
|
+
stat: distinct("checklistItems"),
|
|
404
|
+
goal: 24,
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
id: "web-50",
|
|
408
|
+
title: "Researcher",
|
|
409
|
+
tier: "gold",
|
|
410
|
+
category: "power",
|
|
411
|
+
description: "Fifty runs that searched the web.",
|
|
412
|
+
hint: "Finish 50 runs where GG looks something up online.",
|
|
413
|
+
stat: count("webRuns"),
|
|
414
|
+
goal: 50,
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
id: "helpers-25",
|
|
418
|
+
title: "Delegator",
|
|
419
|
+
tier: "gold",
|
|
420
|
+
category: "power",
|
|
421
|
+
description: "Twenty-five runs that split work between helpers.",
|
|
422
|
+
hint: "Finish 25 runs that use helper agents.",
|
|
423
|
+
stat: count("subagentRuns"),
|
|
424
|
+
goal: 25,
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
id: "tools-30",
|
|
428
|
+
title: "Every tool in the box",
|
|
429
|
+
tier: "platinum",
|
|
430
|
+
category: "power",
|
|
431
|
+
description: "Thirty different tools used for you.",
|
|
432
|
+
hint: "Keep giving GG new kinds of work until it has used 30 tools.",
|
|
433
|
+
stat: distinct("toolsUsed"),
|
|
434
|
+
goal: 30,
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
id: "local-25",
|
|
438
|
+
title: "Fully offline",
|
|
439
|
+
tier: "gold",
|
|
440
|
+
category: "power",
|
|
441
|
+
description: "Twenty-five runs on local models.",
|
|
442
|
+
hint: "Finish 25 runs on a local model.",
|
|
443
|
+
stat: count("localRuns"),
|
|
444
|
+
goal: 25,
|
|
445
|
+
},
|
|
446
|
+
// ── Goals ──
|
|
447
|
+
{
|
|
448
|
+
id: "goal-pause",
|
|
449
|
+
title: "Hold the line",
|
|
450
|
+
tier: "bronze",
|
|
451
|
+
category: "goals",
|
|
452
|
+
description: "You paused a Goal. Its workers stop at a safe point, and you can resume any time.",
|
|
453
|
+
hint: "Pause a running Goal from its header.",
|
|
454
|
+
stat: count("goalPauses"),
|
|
455
|
+
goal: 1,
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
id: "goals-25",
|
|
459
|
+
title: "Visionary",
|
|
460
|
+
tier: "gold",
|
|
461
|
+
category: "goals",
|
|
462
|
+
description: "Twenty-five Goals started.",
|
|
463
|
+
hint: "Start 25 Goals.",
|
|
464
|
+
stat: count("goalsStarted"),
|
|
465
|
+
goal: 25,
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
id: "workers-1000",
|
|
469
|
+
title: "Industrialist",
|
|
470
|
+
tier: "platinum",
|
|
471
|
+
category: "goals",
|
|
472
|
+
description: "A thousand workers sent out across your Goals.",
|
|
473
|
+
hint: "Let your Goals send out 1,000 workers.",
|
|
474
|
+
stat: count("goalWorkers"),
|
|
475
|
+
goal: 1000,
|
|
476
|
+
},
|
|
477
|
+
// ── Chat and Motion ──
|
|
478
|
+
{
|
|
479
|
+
id: "memory",
|
|
480
|
+
title: "I'll remember that",
|
|
481
|
+
tier: "bronze",
|
|
482
|
+
category: "modes",
|
|
483
|
+
description: "GG Chat saved a memory. It remembers lasting facts about you across chats; see them in Brain.",
|
|
484
|
+
hint: "Tell GG Chat something about yourself worth remembering.",
|
|
485
|
+
stat: count("memoriesSaved"),
|
|
486
|
+
goal: 1,
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
id: "jiwa",
|
|
490
|
+
title: "Kindred spirit",
|
|
491
|
+
tier: "silver",
|
|
492
|
+
category: "modes",
|
|
493
|
+
description: "GG Chat wrote a Jiwa note: its sense of who you are and how you like to talk.",
|
|
494
|
+
hint: "Have a longer, personal conversation in GG Chat.",
|
|
495
|
+
stat: count("soulNotes"),
|
|
496
|
+
goal: 1,
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
id: "handoff",
|
|
500
|
+
title: "Let me get my colleague",
|
|
501
|
+
tier: "silver",
|
|
502
|
+
category: "modes",
|
|
503
|
+
description: "A chat agent handed your conversation to a specialist better suited to it.",
|
|
504
|
+
hint: "In GG Chat, ask for research or support and let it hand you over.",
|
|
505
|
+
stat: count("handoffs"),
|
|
506
|
+
goal: 1,
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
id: "chat-100",
|
|
510
|
+
title: "Good company",
|
|
511
|
+
tier: "gold",
|
|
512
|
+
category: "modes",
|
|
513
|
+
description: "A hundred runs in GG Chat.",
|
|
514
|
+
hint: "Finish 100 runs in GG Chat.",
|
|
515
|
+
stat: count("chatRuns"),
|
|
516
|
+
goal: 100,
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
id: "motion-5",
|
|
520
|
+
title: "Showreel",
|
|
521
|
+
tier: "silver",
|
|
522
|
+
category: "modes",
|
|
523
|
+
description: "Five runs in GG Motion.",
|
|
524
|
+
hint: "Finish 5 runs in GG Motion.",
|
|
525
|
+
stat: count("motionRuns"),
|
|
526
|
+
goal: 5,
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
id: "motion-100",
|
|
530
|
+
title: "Auteur",
|
|
531
|
+
tier: "platinum",
|
|
532
|
+
category: "modes",
|
|
533
|
+
description: "A hundred runs in GG Motion. That's a filmography.",
|
|
534
|
+
hint: "Finish 100 runs in GG Motion.",
|
|
535
|
+
stat: count("motionRuns"),
|
|
536
|
+
goal: 100,
|
|
537
|
+
},
|
|
538
|
+
// ── Shipping ──
|
|
539
|
+
{
|
|
540
|
+
id: "push",
|
|
541
|
+
title: "Out the door",
|
|
542
|
+
tier: "bronze",
|
|
543
|
+
category: "ship",
|
|
544
|
+
description: "GG pushed your commits to the remote, so they're backed up and shared.",
|
|
545
|
+
hint: "Ask GG to push your branch.",
|
|
546
|
+
stat: count("pushes"),
|
|
547
|
+
goal: 1,
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
id: "pr",
|
|
551
|
+
title: "Review requested",
|
|
552
|
+
tier: "silver",
|
|
553
|
+
category: "ship",
|
|
554
|
+
description: "GG opened a pull request with the GitHub CLI, title and description included.",
|
|
555
|
+
hint: "Ask GG to open a pull request (needs the gh CLI signed in).",
|
|
556
|
+
stat: count("pullRequests"),
|
|
557
|
+
goal: 1,
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
id: "big-change",
|
|
561
|
+
title: "Sweeping change",
|
|
562
|
+
tier: "silver",
|
|
563
|
+
category: "ship",
|
|
564
|
+
description: "One run changed ten or more files.",
|
|
565
|
+
hint: "Give GG a change that spans at least 10 files.",
|
|
566
|
+
stat: count("bigRuns"),
|
|
567
|
+
goal: 1,
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
id: "files-100",
|
|
571
|
+
title: "Hundred files",
|
|
572
|
+
tier: "silver",
|
|
573
|
+
category: "ship",
|
|
574
|
+
description: "A hundred files written or edited by GG.",
|
|
575
|
+
hint: "Let GG change 100 files across your runs.",
|
|
576
|
+
stat: count("filesTouched"),
|
|
577
|
+
goal: 100,
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
id: "commits-10",
|
|
581
|
+
title: "Getting going",
|
|
582
|
+
tier: "bronze",
|
|
583
|
+
category: "ship",
|
|
584
|
+
description: "Ten commits with EZ Coder.",
|
|
585
|
+
hint: "Make 10 commits.",
|
|
586
|
+
stat: progress("commits"),
|
|
587
|
+
goal: 10,
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
id: "lines-1k",
|
|
591
|
+
title: "First thousand",
|
|
592
|
+
tier: "bronze",
|
|
593
|
+
category: "ship",
|
|
594
|
+
description: "A thousand lines changed across your commits.",
|
|
595
|
+
hint: "Ship 1,000 changed lines.",
|
|
596
|
+
stat: progress("linesShipped"),
|
|
597
|
+
goal: 1000,
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
id: "push-25",
|
|
601
|
+
title: "Always shipping",
|
|
602
|
+
tier: "gold",
|
|
603
|
+
category: "ship",
|
|
604
|
+
description: "Twenty-five runs that pushed to the remote.",
|
|
605
|
+
hint: "Let GG push in 25 runs.",
|
|
606
|
+
stat: count("pushes"),
|
|
607
|
+
goal: 25,
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
id: "pr-25",
|
|
611
|
+
title: "Pull request pro",
|
|
612
|
+
tier: "gold",
|
|
613
|
+
category: "ship",
|
|
614
|
+
description: "Twenty-five pull requests opened by GG.",
|
|
615
|
+
hint: "Let GG open 25 pull requests.",
|
|
616
|
+
stat: count("pullRequests"),
|
|
617
|
+
goal: 25,
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
id: "commits-500",
|
|
621
|
+
title: "Prolific",
|
|
622
|
+
tier: "gold",
|
|
623
|
+
category: "ship",
|
|
624
|
+
description: "Five hundred commits with EZ Coder.",
|
|
625
|
+
hint: "Make 500 commits.",
|
|
626
|
+
stat: progress("commits"),
|
|
627
|
+
goal: 500,
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
id: "files-1000",
|
|
631
|
+
title: "Thousand files",
|
|
632
|
+
tier: "gold",
|
|
633
|
+
category: "ship",
|
|
634
|
+
description: "A thousand files written or edited by GG.",
|
|
635
|
+
hint: "Let GG change 1,000 files across your runs.",
|
|
636
|
+
stat: count("filesTouched"),
|
|
637
|
+
goal: 1000,
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
id: "big-change-25",
|
|
641
|
+
title: "Heavy lifter",
|
|
642
|
+
tier: "gold",
|
|
643
|
+
category: "ship",
|
|
644
|
+
description: "Twenty-five runs that each changed ten or more files.",
|
|
645
|
+
hint: "Finish 25 runs that each change at least 10 files.",
|
|
646
|
+
stat: count("bigRuns"),
|
|
647
|
+
goal: 25,
|
|
648
|
+
},
|
|
649
|
+
{
|
|
650
|
+
id: "lines-1m",
|
|
651
|
+
title: "Millionaire",
|
|
652
|
+
tier: "platinum",
|
|
653
|
+
category: "ship",
|
|
654
|
+
description: "A million lines changed. Truly legendary output.",
|
|
655
|
+
hint: "Ship 1,000,000 changed lines.",
|
|
656
|
+
stat: progress("linesShipped"),
|
|
657
|
+
goal: 1_000_000,
|
|
658
|
+
},
|
|
659
|
+
// ── Dedication ──
|
|
660
|
+
{
|
|
661
|
+
id: "prompts-10",
|
|
662
|
+
title: "Warming up",
|
|
663
|
+
tier: "bronze",
|
|
664
|
+
category: "habit",
|
|
665
|
+
description: "Ten finished runs.",
|
|
666
|
+
hint: "Finish 10 runs.",
|
|
667
|
+
stat: progress("prompts"),
|
|
668
|
+
goal: 10,
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
id: "level-5",
|
|
672
|
+
title: "Rising",
|
|
673
|
+
tier: "bronze",
|
|
674
|
+
category: "habit",
|
|
675
|
+
description: "Five level-ups. XP comes from runs, commits and streaks.",
|
|
676
|
+
hint: "Level up 5 times.",
|
|
677
|
+
stat: progress("level"),
|
|
678
|
+
goal: 5,
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
id: "projects-2",
|
|
682
|
+
title: "Second project",
|
|
683
|
+
tier: "bronze",
|
|
684
|
+
category: "habit",
|
|
685
|
+
description: "EZ Coder used in two projects.",
|
|
686
|
+
hint: "Open a second project and finish a run there.",
|
|
687
|
+
stat: distinct("projects"),
|
|
688
|
+
goal: 2,
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
id: "hunter-10",
|
|
692
|
+
title: "Collector",
|
|
693
|
+
tier: "bronze",
|
|
694
|
+
category: "habit",
|
|
695
|
+
description: "Ten trophies earned. The trophy case is filling up.",
|
|
696
|
+
hint: "Earn 10 trophies.",
|
|
697
|
+
stat: { kind: "earned" },
|
|
698
|
+
goal: 10,
|
|
699
|
+
},
|
|
700
|
+
{
|
|
701
|
+
id: "streak-14",
|
|
702
|
+
title: "Fortnight",
|
|
703
|
+
tier: "silver",
|
|
704
|
+
category: "habit",
|
|
705
|
+
description: "Two weeks in a row.",
|
|
706
|
+
hint: "Use EZ Coder 14 days in a row.",
|
|
707
|
+
stat: { kind: "streak" },
|
|
708
|
+
goal: 14,
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
id: "prompts-500",
|
|
712
|
+
title: "Seasoned",
|
|
713
|
+
tier: "silver",
|
|
714
|
+
category: "habit",
|
|
715
|
+
description: "Five hundred finished runs.",
|
|
716
|
+
hint: "Finish 500 runs.",
|
|
717
|
+
stat: progress("prompts"),
|
|
718
|
+
goal: 500,
|
|
719
|
+
},
|
|
720
|
+
{
|
|
721
|
+
id: "level-15",
|
|
722
|
+
title: "Climbing",
|
|
723
|
+
tier: "silver",
|
|
724
|
+
category: "habit",
|
|
725
|
+
description: "Fifteen level-ups.",
|
|
726
|
+
hint: "Level up 15 times.",
|
|
727
|
+
stat: progress("level"),
|
|
728
|
+
goal: 15,
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
id: "hunter-50",
|
|
732
|
+
title: "Trophy room",
|
|
733
|
+
tier: "gold",
|
|
734
|
+
category: "habit",
|
|
735
|
+
description: "Fifty trophies earned.",
|
|
736
|
+
hint: "Earn 50 trophies.",
|
|
737
|
+
stat: { kind: "earned" },
|
|
738
|
+
goal: 50,
|
|
739
|
+
},
|
|
740
|
+
{
|
|
741
|
+
id: "streak-60",
|
|
742
|
+
title: "Two months strong",
|
|
743
|
+
tier: "gold",
|
|
744
|
+
category: "habit",
|
|
745
|
+
description: "Sixty days in a row.",
|
|
746
|
+
hint: "Use EZ Coder 60 days in a row.",
|
|
747
|
+
stat: { kind: "streak" },
|
|
748
|
+
goal: 60,
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
id: "prompts-5000",
|
|
752
|
+
title: "Veteran",
|
|
753
|
+
tier: "gold",
|
|
754
|
+
category: "habit",
|
|
755
|
+
description: "Five thousand finished runs.",
|
|
756
|
+
hint: "Finish 5,000 runs.",
|
|
757
|
+
stat: progress("prompts"),
|
|
758
|
+
goal: 5000,
|
|
759
|
+
},
|
|
760
|
+
{
|
|
761
|
+
id: "projects-50",
|
|
762
|
+
title: "World tour",
|
|
763
|
+
tier: "gold",
|
|
764
|
+
category: "habit",
|
|
765
|
+
description: "Fifty different projects.",
|
|
766
|
+
hint: "Finish runs in 50 different projects.",
|
|
767
|
+
stat: distinct("projects"),
|
|
768
|
+
goal: 50,
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
id: "hunter-75",
|
|
772
|
+
title: "Hall of fame",
|
|
773
|
+
tier: "platinum",
|
|
774
|
+
category: "habit",
|
|
775
|
+
description: "Seventy-five trophies earned.",
|
|
776
|
+
hint: "Earn 75 trophies.",
|
|
777
|
+
stat: { kind: "earned" },
|
|
778
|
+
goal: 75,
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
id: "streak-365",
|
|
782
|
+
title: "A year of GG",
|
|
783
|
+
tier: "platinum",
|
|
784
|
+
category: "habit",
|
|
785
|
+
description: "Three hundred and sixty-five days in a row. Unstoppable.",
|
|
786
|
+
hint: "Use EZ Coder every day for a year.",
|
|
787
|
+
stat: { kind: "streak" },
|
|
788
|
+
goal: 365,
|
|
789
|
+
},
|
|
790
|
+
{
|
|
791
|
+
id: "level-100",
|
|
792
|
+
title: "Centurion",
|
|
793
|
+
tier: "platinum",
|
|
794
|
+
category: "habit",
|
|
795
|
+
description: "A hundred level-ups. The higher you go, the further each one is.",
|
|
796
|
+
hint: "Level up 100 times.",
|
|
797
|
+
stat: progress("level"),
|
|
798
|
+
goal: 100,
|
|
799
|
+
},
|
|
800
|
+
// ── Secrets ──
|
|
801
|
+
{
|
|
802
|
+
id: "early-bird",
|
|
803
|
+
title: "Early bird",
|
|
804
|
+
tier: "bronze",
|
|
805
|
+
category: "secret",
|
|
806
|
+
description: "A run finished between 5 and 7 in the morning.",
|
|
807
|
+
hint: "Finish a run between 5 and 7 am.",
|
|
808
|
+
stat: count("earlyRuns"),
|
|
809
|
+
goal: 1,
|
|
810
|
+
secret: true,
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
id: "weekend",
|
|
814
|
+
title: "Weekend warrior",
|
|
815
|
+
tier: "bronze",
|
|
816
|
+
category: "secret",
|
|
817
|
+
description: "Ten runs finished on weekends.",
|
|
818
|
+
hint: "Finish 10 runs on a Saturday or Sunday.",
|
|
819
|
+
stat: count("weekendRuns"),
|
|
820
|
+
goal: 10,
|
|
821
|
+
secret: true,
|
|
822
|
+
},
|
|
823
|
+
{
|
|
824
|
+
id: "dj",
|
|
825
|
+
title: "Resident DJ",
|
|
826
|
+
tier: "silver",
|
|
827
|
+
category: "secret",
|
|
828
|
+
description: "Ten different radio stations played.",
|
|
829
|
+
hint: "Play 10 different stations on the radio.",
|
|
830
|
+
stat: distinct("radioStations"),
|
|
831
|
+
goal: 10,
|
|
832
|
+
secret: true,
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
id: "insomniac",
|
|
836
|
+
title: "Insomniac",
|
|
837
|
+
tier: "gold",
|
|
838
|
+
category: "secret",
|
|
839
|
+
description: "Twenty-five runs finished between midnight and 5 am. Seriously, get some sleep.",
|
|
840
|
+
hint: "Finish 25 runs between midnight and 5 am.",
|
|
841
|
+
stat: count("nightRuns"),
|
|
842
|
+
goal: 25,
|
|
843
|
+
secret: true,
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
id: "ultramarathon",
|
|
847
|
+
title: "Ultramarathon",
|
|
848
|
+
tier: "platinum",
|
|
849
|
+
category: "secret",
|
|
850
|
+
description: "Ten runs that each kept working for over 30 minutes.",
|
|
851
|
+
hint: "Finish 10 runs that each work for over 30 minutes.",
|
|
852
|
+
stat: count("longRuns"),
|
|
853
|
+
goal: 10,
|
|
854
|
+
secret: true,
|
|
855
|
+
},
|
|
856
|
+
];
|
|
857
|
+
//# sourceMappingURL=catalog-more.js.map
|