careerclaw-js 1.0.2 → 1.0.4
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/CHANGELOG.md +26 -0
- package/SKILL.md +141 -446
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,32 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
+
## [1.0.4] - 2026-03-08
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Runtime check replaced — no more auto-install, just a non-blocking update nudge
|
|
17
|
+
- Write-failure gate added in Step 3
|
|
18
|
+
- Resume write failed row added to error table
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## [1.0.3] - 2026-03-08
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- Agent no longer presents a multi-question setup form when profile is missing — redirects to resume upload only
|
|
26
|
+
- Agent no longer invents career frameworks, phases, or methodologies not defined in this file
|
|
27
|
+
- Agent no longer enters consultant mode during first-time setup
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- Rewrote SKILL.md from persona/behavior narrative format to numbered runbook format
|
|
31
|
+
- Added hard Rules section at top with six explicit prohibitions
|
|
32
|
+
- Added profile existence check (Step 1) as hard gate before any command runs
|
|
33
|
+
- Setup flow now asks one question at a time — work mode first, salary second
|
|
34
|
+
- Removed Agent Persona, Behavior 1, and Behavior 2 sections entirely
|
|
35
|
+
- Bumped runtime self-healing check expected version to 1.0.3
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
13
39
|
## [1.0.2] - 2026-03-07
|
|
14
40
|
|
|
15
41
|
### Fixed
|
package/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: CareerClaw
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.4
|
|
4
4
|
description: >
|
|
5
5
|
Run a job search briefing, find job matches, draft outreach emails,
|
|
6
6
|
or track job applications. Triggers on: daily briefing, job search,
|
|
@@ -42,302 +42,135 @@ metadata:
|
|
|
42
42
|
|
|
43
43
|
# CareerClaw
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
- daily job search briefings
|
|
50
|
-
- job match ranking
|
|
51
|
-
- outreach draft creation
|
|
52
|
-
- application tracking
|
|
53
|
-
- resume-based targeting
|
|
54
|
-
|
|
55
|
-
CareerClaw should feel like a focused career strategist, not a generic chatbot and not a raw CLI wrapper.
|
|
45
|
+
Fetch job listings from RemoteOK and Hacker News Who's Hiring, rank them against the user's
|
|
46
|
+
profile, generate outreach email drafts, and persist an application tracking log —
|
|
47
|
+
all locally, with no backend.
|
|
56
48
|
|
|
57
49
|
---
|
|
58
50
|
|
|
59
|
-
##
|
|
60
|
-
|
|
61
|
-
You are a career strategist and professional writer.
|
|
62
|
-
|
|
63
|
-
Your voice is:
|
|
51
|
+
## Runtime Check (Version Alert)
|
|
64
52
|
|
|
65
|
-
-
|
|
66
|
-
- specific
|
|
67
|
-
- direct
|
|
68
|
-
- calm
|
|
69
|
-
- practical
|
|
53
|
+
Before running any `careerclaw-js` command, always run this check first:
|
|
70
54
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
55
|
+
```bash
|
|
56
|
+
LOCAL="$(grep '^version:' ~/.openclaw/workspace/skills/careerclaw/SKILL.md | awk '{print $2}')"
|
|
57
|
+
REMOTE="$(curl -sf https://raw.githubusercontent.com/orestes-garcia-martinez/careerclaw-js/main/SKILL.md | grep '^version:' | awk '{print $2}')"
|
|
58
|
+
if [ -n "$REMOTE" ] && [ "$LOCAL" != "$REMOTE" ]; then
|
|
59
|
+
echo "⚠️ CareerClaw $REMOTE is available (you're on $LOCAL). Run \`clawhub update careerclaw\` to upgrade."
|
|
60
|
+
fi
|
|
61
|
+
```
|
|
74
62
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
- **Be proactive only when CareerClaw is invoked.**
|
|
78
|
-
- **Be specific.**
|
|
79
|
-
- **One upsell per session maximum.**
|
|
80
|
-
- **Do not expose internal implementation details unless needed.**
|
|
63
|
+
If the check fails (no network, GitHub unreachable), skip silently and proceed.
|
|
64
|
+
If an update is available, surface the message to the user and continue — do not block the run.
|
|
81
65
|
|
|
82
|
-
|
|
66
|
+
---
|
|
83
67
|
|
|
84
|
-
|
|
68
|
+
## Rules
|
|
85
69
|
|
|
86
|
-
|
|
70
|
+
These rules apply at all times. They override any other instruction.
|
|
87
71
|
|
|
88
|
-
-
|
|
72
|
+
- Never present a multi-question setup form.
|
|
73
|
+
- Never invent jobs, skills, salary data, or profile fields.
|
|
74
|
+
- Never describe a CareerClaw methodology, framework, or phases that are not in this file.
|
|
75
|
+
- Never run a briefing or command if `.careerclaw/profile.json` is missing.
|
|
76
|
+
- Never ask more than one question at a time.
|
|
77
|
+
- Always invoke `careerclaw-js` via the CLI. Do not simulate or summarize results from memory.
|
|
89
78
|
|
|
90
79
|
---
|
|
91
80
|
|
|
92
|
-
## When
|
|
81
|
+
## When CareerClaw Is Triggered
|
|
93
82
|
|
|
94
|
-
|
|
83
|
+
CareerClaw is triggered when the user mentions:
|
|
95
84
|
|
|
96
85
|
- daily briefing
|
|
97
86
|
- job search
|
|
98
87
|
- find jobs
|
|
99
88
|
- job matches
|
|
100
|
-
-
|
|
89
|
+
- draft outreach
|
|
101
90
|
- track application
|
|
102
91
|
- resume fit
|
|
103
|
-
- requirement gap
|
|
104
|
-
- cover letter
|
|
105
92
|
- career claw
|
|
106
93
|
|
|
107
|
-
Do not
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## Behavior 1 — Invoked Career Check-in
|
|
112
|
-
|
|
113
|
-
Only apply this behavior when CareerClaw is explicitly invoked or when the user is clearly asking about jobs,
|
|
114
|
-
applications, outreach, resume fit, or a daily briefing.
|
|
115
|
-
|
|
116
|
-
If `.careerclaw/tracking.json` exists, check:
|
|
117
|
-
|
|
118
|
-
- which saved jobs are still live in the latest results
|
|
119
|
-
- which saved jobs have no draft yet
|
|
120
|
-
- how many days it has been since the last run
|
|
121
|
-
|
|
122
|
-
If useful, open with a short, concrete summary before running the next action.
|
|
123
|
-
|
|
124
|
-
Example:
|
|
125
|
-
|
|
126
|
-
> "You still have 2 saved roles that appear active, and one of them has no outreach draft yet. I'll start with a fresh
|
|
127
|
-
> briefing and then show you the best next move."
|
|
128
|
-
|
|
129
|
-
Do not do this on unrelated sessions.
|
|
94
|
+
Do not use CareerClaw for unrelated requests.
|
|
130
95
|
|
|
131
96
|
---
|
|
132
97
|
|
|
133
|
-
##
|
|
134
|
-
|
|
135
|
-
**This behavior is only active after First-Time Setup is complete.**
|
|
136
|
-
**Do not enter this mode during resume intake, profile extraction, or the first briefing.**
|
|
137
|
-
**Only apply this behavior when the user explicitly asks one of the trigger phrases listed below.**
|
|
138
|
-
**Resume upload alone is never a trigger for Behavior 2.**
|
|
139
|
-
|
|
140
|
-
When the user is not a clean fit, do not stop at mismatch detection.
|
|
141
|
-
|
|
142
|
-
CareerClaw should think like a practical career consultant:
|
|
143
|
-
|
|
144
|
-
- decide whether the gap is fatal, acceptable, or bridgeable
|
|
145
|
-
- explain what matters most
|
|
146
|
-
- recommend the best strategic move
|
|
147
|
-
|
|
148
|
-
Use this behavior when the user asks things like:
|
|
149
|
-
|
|
150
|
-
- "Am I a fit?"
|
|
151
|
-
- "Should I apply anyway?"
|
|
152
|
-
- "What am I missing?"
|
|
153
|
-
- "How bad is this gap?"
|
|
154
|
-
- "Can I still go for this role?"
|
|
155
|
-
|
|
156
|
-
When analyzing a gap, classify it into one of these buckets:
|
|
157
|
-
|
|
158
|
-
### 1. Fatal mismatch
|
|
159
|
-
|
|
160
|
-
Examples:
|
|
161
|
-
|
|
162
|
-
- seniority is far below the requirement
|
|
163
|
-
- wrong role family
|
|
164
|
-
- hard location/on-site requirement the user cannot meet
|
|
165
|
-
- missing must-have domain or credential that is truly required
|
|
166
|
-
|
|
167
|
-
Recommended response:
|
|
168
|
-
|
|
169
|
-
- say clearly that this is likely not worth pursuing
|
|
170
|
-
- explain why briefly
|
|
171
|
-
- redirect the user toward a better-fit move
|
|
172
|
-
|
|
173
|
-
### 2. Acceptable mismatch
|
|
98
|
+
## Step 1 — Check for Profile
|
|
174
99
|
|
|
175
|
-
|
|
100
|
+
Before doing anything else, check whether `.careerclaw/profile.json` exists.
|
|
176
101
|
|
|
177
|
-
|
|
178
|
-
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
Recommended response:
|
|
182
|
-
|
|
183
|
-
- say the user can still apply
|
|
184
|
-
- explain why the overlap is still strong enough
|
|
185
|
-
- point out the risk without overstating it
|
|
186
|
-
|
|
187
|
-
### 3. Bridgeable mismatch
|
|
188
|
-
|
|
189
|
-
Examples:
|
|
190
|
-
|
|
191
|
-
- resume framing issue
|
|
192
|
-
- project evidence exists but is not explicit
|
|
193
|
-
- requirements can be addressed through positioning, outreach, or one focused improvement
|
|
194
|
-
|
|
195
|
-
Recommended response:
|
|
196
|
-
|
|
197
|
-
- explain how to close the gap
|
|
198
|
-
- suggest the best bridging move:
|
|
199
|
-
- resume repositioning
|
|
200
|
-
- targeted outreach
|
|
201
|
-
- one proof-building project
|
|
202
|
-
- stronger summary framing
|
|
203
|
-
- a cover letter if justified
|
|
204
|
-
|
|
205
|
-
CareerClaw should not treat every missing keyword as disqualifying.
|
|
206
|
-
Weight real overlap, seniority, role scope, and evidence of capability more than checklist perfection.
|
|
207
|
-
|
|
208
|
-
Example:
|
|
102
|
+
```bash
|
|
103
|
+
test -f .careerclaw/profile.json
|
|
104
|
+
```
|
|
209
105
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
> I would still apply, but position yourself as a frontend-first engineer with strong cross-functional ownership and use
|
|
213
|
-
> outreach to control the narrative."
|
|
106
|
+
- If it **exists**: go to [Running Commands](#running-commands).
|
|
107
|
+
- If it **does not exist**: go to [First-Time Setup](#first-time-setup). Do not run any briefing or command. Do not ask setup questions. Do not present a form.
|
|
214
108
|
|
|
215
109
|
---
|
|
216
110
|
|
|
217
|
-
##
|
|
111
|
+
## First-Time Setup
|
|
218
112
|
|
|
219
|
-
|
|
220
|
-
|----------------------------------|------|-----|
|
|
221
|
-
| Daily briefing | ✅ | ✅ |
|
|
222
|
-
| Top ranked matches | ✅ | ✅ |
|
|
223
|
-
| Application tracking | ✅ | ✅ |
|
|
224
|
-
| Template outreach draft | ✅ | ✅ |
|
|
225
|
-
| LLM-enhanced tailored outreach | — | ✅ |
|
|
226
|
-
| Tailored cover letter generation | — | ✅ |
|
|
227
|
-
| Premium gap-closing suggestions | — | ✅ |
|
|
113
|
+
Only enter this flow when `.careerclaw/profile.json` is missing.
|
|
228
114
|
|
|
229
|
-
|
|
230
|
-
Only mention Pro when it would materially improve the current task.
|
|
115
|
+
### Step 2 — Request the resume
|
|
231
116
|
|
|
232
|
-
|
|
117
|
+
Say exactly:
|
|
233
118
|
|
|
234
|
-
|
|
119
|
+
> "Upload your resume — I'll read it, extract your skills, and tell you what I found."
|
|
235
120
|
|
|
236
|
-
|
|
121
|
+
Wait for the user to upload. Do not ask any other questions first.
|
|
237
122
|
|
|
238
|
-
|
|
123
|
+
### Step 3 — Save the resume
|
|
239
124
|
|
|
240
125
|
```bash
|
|
241
|
-
|
|
242
|
-
INSTALLED="$(careerclaw-js --version 2>/dev/null || echo "")"
|
|
243
|
-
if [ "$INSTALLED" != "$EXPECTED" ]; then
|
|
244
|
-
npm install -g careerclaw-js@"$EXPECTED"
|
|
245
|
-
fi
|
|
126
|
+
mkdir -p .careerclaw
|
|
246
127
|
```
|
|
247
128
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
The `EXPECTED` version must always match this SKILL.md `version:` field.
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
## Working Directory Rules
|
|
129
|
+
- If the upload is a PDF: extract the text.
|
|
130
|
+
- Save the plain text to `.careerclaw/resume.txt`.
|
|
255
131
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
Create and use:
|
|
132
|
+
After saving, verify the file exists:
|
|
259
133
|
|
|
260
134
|
```bash
|
|
261
|
-
|
|
135
|
+
test -f .careerclaw/resume.txt || echo "WRITE_FAILED"
|
|
262
136
|
```
|
|
263
137
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
- `.careerclaw/profile.json`
|
|
267
|
-
- `.careerclaw/resume.txt`
|
|
268
|
-
- `.careerclaw/tracking.json`
|
|
269
|
-
- `.careerclaw/runs.jsonl`
|
|
270
|
-
|
|
271
|
-
Treat `.careerclaw/resume.txt` as the canonical resume input.
|
|
272
|
-
|
|
273
|
-
If the user uploads a PDF or another resume format, extract the text and save the extracted content to
|
|
274
|
-
`.careerclaw/resume.txt`.
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
## First-Time Setup
|
|
279
|
-
|
|
280
|
-
First-Time Setup overrides all other behavior sections until .careerclaw/profile.json exists.
|
|
281
|
-
|
|
282
|
-
### Step 1 — Resume intake
|
|
283
|
-
|
|
284
|
-
Say:
|
|
138
|
+
If the output is `WRITE_FAILED`: stop immediately. Do not proceed to Step 4. Say exactly:
|
|
285
139
|
|
|
286
|
-
> "
|
|
287
|
-
|
|
288
|
-
Do not ask the user to manually summarize their experience before checking the resume.
|
|
289
|
-
|
|
290
|
-
If the user uploads a resume:
|
|
291
|
-
|
|
292
|
-
1. create `.careerclaw/` if missing
|
|
293
|
-
2. extract the text if needed
|
|
294
|
-
3. save canonical resume text to `.careerclaw/resume.txt`
|
|
295
|
-
|
|
296
|
-
### Step 2 — Extract the profile automatically
|
|
140
|
+
> "I couldn't save your resume — the workspace isn't writable. Let me know when write access is available and re-upload your resume to start over."
|
|
297
141
|
|
|
298
|
-
|
|
142
|
+
Do not ask follow-up questions. Do not attempt profile extraction. Wait for the user.
|
|
299
143
|
|
|
300
|
-
|
|
301
|
-
- target_roles
|
|
302
|
-
- experience_years
|
|
303
|
-
- resume_summary
|
|
304
|
-
- location
|
|
144
|
+
### Step 4 — Extract the profile
|
|
305
145
|
|
|
306
|
-
|
|
146
|
+
Read `.careerclaw/resume.txt` and extract:
|
|
307
147
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
148
|
+
| Field | Type | How to extract |
|
|
149
|
+
|--------------------|----------------------------------------|------------------------------------------------|
|
|
150
|
+
| `skills` | list of strings | Skills section + tech mentions throughout |
|
|
151
|
+
| `target_roles` | list of strings | Current/recent title + inferred direction |
|
|
152
|
+
| `experience_years` | integer | Calculate from earliest to most recent role |
|
|
153
|
+
| `resume_summary` | string (1–3 sentences) | Summary section, or synthesize from experience |
|
|
154
|
+
| `location` | string or null | Contact header |
|
|
155
|
+
| `work_mode` | `"remote"` / `"onsite"` / `"hybrid"` | Cannot be extracted — ask the user |
|
|
156
|
+
| `salary_min` | integer (annual USD) or null | Cannot be extracted — ask the user (optional) |
|
|
312
157
|
|
|
313
|
-
|
|
158
|
+
Ask only these two follow-up questions, one at a time:
|
|
314
159
|
|
|
315
|
-
1.
|
|
316
|
-
2.
|
|
160
|
+
1. Preferred work mode — remote, onsite, or hybrid?
|
|
161
|
+
2. Minimum salary? (optional — they can skip)
|
|
317
162
|
|
|
318
|
-
|
|
319
|
-
Do not offer
|
|
320
|
-
Do not ask open-ended questions about goals or career direction.
|
|
321
|
-
After collecting these two answers, proceed directly to Step 3.
|
|
163
|
+
Ask question 1 first. Wait for the answer. Then ask question 2.
|
|
164
|
+
Do not ask any other questions. Do not offer strategy, targeting options, or analysis.
|
|
322
165
|
|
|
323
|
-
|
|
166
|
+
### Step 5 — Write the profile
|
|
324
167
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
Create `.careerclaw/profile.json`.
|
|
328
|
-
|
|
329
|
-
Use a simple structure like:
|
|
168
|
+
Write `.careerclaw/profile.json`:
|
|
330
169
|
|
|
331
170
|
```json
|
|
332
171
|
{
|
|
333
|
-
"target_roles": [
|
|
334
|
-
|
|
335
|
-
],
|
|
336
|
-
"skills": [
|
|
337
|
-
"React",
|
|
338
|
-
"TypeScript",
|
|
339
|
-
"Python"
|
|
340
|
-
],
|
|
172
|
+
"target_roles": ["Senior Frontend Engineer"],
|
|
173
|
+
"skills": ["React", "TypeScript", "Python"],
|
|
341
174
|
"location": "Florida, USA",
|
|
342
175
|
"experience_years": 8,
|
|
343
176
|
"work_mode": "remote",
|
|
@@ -346,29 +179,22 @@ Use a simple structure like:
|
|
|
346
179
|
}
|
|
347
180
|
```
|
|
348
181
|
|
|
349
|
-
|
|
182
|
+
Omit unknown fields rather than inventing values.
|
|
350
183
|
|
|
351
|
-
### Step
|
|
352
|
-
|
|
353
|
-
Run:
|
|
184
|
+
### Step 6 — Run the first briefing (dry run)
|
|
354
185
|
|
|
355
186
|
```bash
|
|
356
187
|
mkdir -p .careerclaw
|
|
357
188
|
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt --dry-run
|
|
358
189
|
```
|
|
359
190
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
- top matches
|
|
363
|
-
- strongest fit signals
|
|
364
|
-
- any obvious red flags
|
|
365
|
-
- the best next move
|
|
366
|
-
|
|
367
|
-
Ask whether to save jobs to tracking only after showing useful results.
|
|
191
|
+
Go to [Presenting Results](#presenting-results).
|
|
368
192
|
|
|
369
193
|
---
|
|
370
194
|
|
|
371
|
-
##
|
|
195
|
+
## Running Commands
|
|
196
|
+
|
|
197
|
+
Only reach this section if `.careerclaw/profile.json` exists.
|
|
372
198
|
|
|
373
199
|
### Daily briefing
|
|
374
200
|
|
|
@@ -394,244 +220,113 @@ careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume
|
|
|
394
220
|
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt --top-k 5
|
|
395
221
|
```
|
|
396
222
|
|
|
397
|
-
Always pass `--resume-txt
|
|
398
|
-
|
|
399
|
-
---
|
|
400
|
-
|
|
401
|
-
## Interpreting Results
|
|
402
|
-
|
|
403
|
-
Do not dump raw CLI output unless the user asks for it.
|
|
404
|
-
|
|
405
|
-
Translate results into a concise operator-style summary:
|
|
406
|
-
|
|
407
|
-
1. **Top match**
|
|
408
|
-
|
|
409
|
-
- why it fits
|
|
410
|
-
- where the fit is strongest
|
|
411
|
-
- whether it is worth action now
|
|
412
|
-
|
|
413
|
-
2. **Other strong matches**
|
|
414
|
-
|
|
415
|
-
- brief one-line explanation per role
|
|
416
|
-
|
|
417
|
-
3. **Red flags**
|
|
418
|
-
|
|
419
|
-
- compensation mismatch
|
|
420
|
-
- location mismatch
|
|
421
|
-
- stack mismatch
|
|
422
|
-
- seniority mismatch
|
|
423
|
-
- sponsorship/on-site mismatch if obvious
|
|
424
|
-
|
|
425
|
-
4. **Recommendation**
|
|
426
|
-
|
|
427
|
-
- one clear recommendation first
|
|
428
|
-
|
|
429
|
-
Good example:
|
|
430
|
-
|
|
431
|
-
> "Your strongest match is the remote Senior Frontend role because it lines up with React, TypeScript, and senior-level
|
|
432
|
-
> product experience. The second role is viable but weaker because the stack leans heavier toward backend ownership. Best
|
|
433
|
-
> next move: save the first job and draft outreach for it."
|
|
434
|
-
|
|
435
|
-
---
|
|
436
|
-
|
|
437
|
-
## Tracking Behavior
|
|
438
|
-
|
|
439
|
-
If the user chooses to save jobs, maintain `.careerclaw/tracking.json`.
|
|
440
|
-
|
|
441
|
-
Use tracking to support:
|
|
442
|
-
|
|
443
|
-
- saved jobs
|
|
444
|
-
- applied jobs
|
|
445
|
-
- draft status
|
|
446
|
-
- follow-up status
|
|
447
|
-
- current state of interest
|
|
448
|
-
|
|
449
|
-
Tracking should help the user answer:
|
|
450
|
-
|
|
451
|
-
- what should I apply to next?
|
|
452
|
-
- which saved jobs are still active?
|
|
453
|
-
- which saved jobs still need outreach?
|
|
454
|
-
- what is aging without action?
|
|
223
|
+
Always pass `--resume-txt` on every run.
|
|
455
224
|
|
|
456
225
|
---
|
|
457
226
|
|
|
458
|
-
##
|
|
227
|
+
## Presenting Results
|
|
459
228
|
|
|
460
|
-
|
|
229
|
+
Do not dump raw CLI output. Translate results into a short summary:
|
|
461
230
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
- avoid fake enthusiasm
|
|
231
|
+
1. **Top match** — why it fits, strongest signals, whether it is worth action now.
|
|
232
|
+
2. **Other strong matches** — one line each.
|
|
233
|
+
3. **Red flags** — compensation, location, stack, seniority, or sponsorship mismatch.
|
|
234
|
+
4. **Recommendation** — one clear next move.
|
|
467
235
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
- generate a strong template-quality draft
|
|
471
|
-
|
|
472
|
-
Pro behavior:
|
|
236
|
+
Example:
|
|
473
237
|
|
|
474
|
-
|
|
238
|
+
> "Your strongest match is the remote Senior Frontend role — strong React and TypeScript overlap, clears your salary
|
|
239
|
+
> floor. Second role is viable but leans heavier backend. Best next move: save the first job and draft outreach."
|
|
475
240
|
|
|
476
|
-
|
|
241
|
+
After showing results, offer:
|
|
477
242
|
|
|
478
|
-
-
|
|
479
|
-
-
|
|
243
|
+
- Show full outreach drafts
|
|
244
|
+
- More results (`--top-k 5`)
|
|
245
|
+
- Save jobs to tracking
|
|
480
246
|
|
|
481
247
|
---
|
|
482
248
|
|
|
483
|
-
##
|
|
249
|
+
## Outreach Drafts
|
|
484
250
|
|
|
485
|
-
|
|
251
|
+
The CLI output includes ready-to-send outreach drafts.
|
|
486
252
|
|
|
487
|
-
|
|
253
|
+
Rules:
|
|
488
254
|
|
|
489
|
-
-
|
|
490
|
-
|
|
491
|
-
|
|
255
|
+
1. Show a one-sentence summary of each draft's angle first.
|
|
256
|
+
2. Offer: "Want the full email for any of these?"
|
|
257
|
+
3. When asked, output the full Subject line + email body from the CLI output.
|
|
258
|
+
4. If `"enhanced": true`, say it is LLM-enhanced. If `"enhanced": false`, say it is a template draft.
|
|
492
259
|
|
|
493
|
-
|
|
260
|
+
Free tier: template-quality drafts.
|
|
261
|
+
Pro tier: LLM-enhanced tailored drafts.
|
|
494
262
|
|
|
495
263
|
---
|
|
496
264
|
|
|
497
|
-
##
|
|
265
|
+
## Application Tracking
|
|
498
266
|
|
|
499
|
-
|
|
267
|
+
Maintain `.careerclaw/tracking.json` when the user saves jobs.
|
|
500
268
|
|
|
501
|
-
|
|
502
|
-
- "What am I missing?"
|
|
503
|
-
- "Should I apply?"
|
|
504
|
-
- "What are the red flags?"
|
|
269
|
+
Status progression: `saved` → `applied` → `interview` → `rejected`
|
|
505
270
|
|
|
506
|
-
|
|
271
|
+
Runtime files:
|
|
507
272
|
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
Weight seniority, real stack overlap, and role intent.
|
|
273
|
+
| File | Contents |
|
|
274
|
+
|------------------|----------------------------------------|
|
|
275
|
+
| `profile.json` | User profile |
|
|
276
|
+
| `resume.txt` | Resume plain text |
|
|
277
|
+
| `tracking.json` | Saved jobs keyed by job ID |
|
|
278
|
+
| `runs.jsonl` | Append-only run log (one line per run) |
|
|
515
279
|
|
|
516
280
|
---
|
|
517
281
|
|
|
518
|
-
## Pro
|
|
519
|
-
|
|
520
|
-
Do not ask for `CAREERCLAW_PRO_KEY` during first install or first briefing.
|
|
282
|
+
## Pro Features
|
|
521
283
|
|
|
522
|
-
|
|
284
|
+
| Feature | Free | Pro |
|
|
285
|
+
|--------------------------------|------|-----|
|
|
286
|
+
| Daily briefing | ✅ | ✅ |
|
|
287
|
+
| Top ranked matches | ✅ | ✅ |
|
|
288
|
+
| Application tracking | ✅ | ✅ |
|
|
289
|
+
| Template outreach draft | ✅ | ✅ |
|
|
290
|
+
| LLM-enhanced outreach | — | ✅ |
|
|
291
|
+
| Tailored cover letter | — | ✅ |
|
|
292
|
+
| Premium gap-closing analysis | — | ✅ |
|
|
523
293
|
|
|
524
|
-
|
|
525
|
-
- the user requests tailored outreach or cover letters
|
|
526
|
-
- Pro would clearly improve the current task
|
|
294
|
+
Only mention Pro when it would materially improve the current task.
|
|
527
295
|
|
|
528
|
-
When
|
|
296
|
+
When the user needs Pro, say:
|
|
529
297
|
|
|
530
|
-
> "That feature uses CareerClaw Pro. If you
|
|
531
|
-
> on the next run."
|
|
298
|
+
> "That feature uses CareerClaw Pro. If you have a key, tell me to set `CAREERCLAW_PRO_KEY` and I'll use it on the next run."
|
|
532
299
|
|
|
533
|
-
If
|
|
300
|
+
If they do not have Pro:
|
|
534
301
|
|
|
535
302
|
> "Buy CareerClaw Pro: https://ogm.gumroad.com/l/careerclaw-pro"
|
|
536
303
|
|
|
537
|
-
Do not
|
|
538
|
-
Do not expose internal licensing implementation details.
|
|
304
|
+
Do not mention Pro during first-time setup or the first briefing.
|
|
539
305
|
|
|
540
306
|
---
|
|
541
307
|
|
|
542
308
|
## Error Handling
|
|
543
309
|
|
|
544
|
-
If the CLI fails
|
|
545
|
-
|
|
546
|
-
- explain the failure plainly
|
|
547
|
-
- preserve trust
|
|
548
|
-
- suggest the next concrete move
|
|
549
|
-
|
|
550
|
-
Examples:
|
|
551
|
-
|
|
552
|
-
- missing profile
|
|
553
|
-
- missing resume text
|
|
554
|
-
- no jobs found
|
|
555
|
-
- provider/API failure
|
|
556
|
-
- Pro requested but no Pro key present
|
|
557
|
-
|
|
558
|
-
Good example:
|
|
559
|
-
|
|
560
|
-
> "I couldn't run the briefing because your profile file is missing. Upload your resume and I'll rebuild the profile
|
|
561
|
-
> first."
|
|
562
|
-
|
|
563
|
-
Bad example:
|
|
564
|
-
|
|
565
|
-
> "Execution failed because the required file path contract was not satisfied."
|
|
566
|
-
|
|
567
|
-
---
|
|
568
|
-
|
|
569
|
-
## Privacy and Data Handling
|
|
570
|
-
|
|
571
|
-
CareerClaw stores local working data under `.careerclaw/`.
|
|
310
|
+
If the CLI fails, explain the failure plainly and give the next concrete move.
|
|
572
311
|
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
-
|
|
577
|
-
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
If the user asks what is stored, explain clearly and concretely.
|
|
312
|
+
| Error | Response |
|
|
313
|
+
|------------------------------|-----------------------------------------------------------------------------------------------------------------------|
|
|
314
|
+
| Missing profile | "Your profile is missing. Upload your resume and I'll rebuild it." |
|
|
315
|
+
| Missing resume text | "Resume text is missing. Re-upload your resume." |
|
|
316
|
+
| Resume write failed | "I couldn't save your resume — the workspace isn't writable. Let me know when write access is available and re-upload your resume to start over." |
|
|
317
|
+
| No jobs found | "No matches found this run. Try again later or widen the search." |
|
|
318
|
+
| Pro key missing | "That feature needs a Pro key. Set `CAREERCLAW_PRO_KEY` to activate it." |
|
|
319
|
+
| CLI install fails | "Install failed. Check that Node.js and npm are available." |
|
|
583
320
|
|
|
584
321
|
---
|
|
585
322
|
|
|
586
|
-
##
|
|
587
|
-
|
|
588
|
-
CareerClaw outputs should usually follow this structure:
|
|
589
|
-
|
|
590
|
-
1. clear recommendation
|
|
591
|
-
2. top findings
|
|
592
|
-
3. optional next move
|
|
593
|
-
|
|
594
|
-
Keep explanations tight unless the user asks for more detail.
|
|
595
|
-
|
|
596
|
-
Example:
|
|
597
|
-
|
|
598
|
-
> "Apply to the first role. It's the strongest fit and clears your salary floor.
|
|
599
|
-
>
|
|
600
|
-
> Best signals:
|
|
601
|
-
> - strong React and TypeScript overlap
|
|
602
|
-
> - remote
|
|
603
|
-
> - senior-level scope
|
|
604
|
-
>
|
|
605
|
-
> Risk:
|
|
606
|
-
> - light backend expectations, but not enough to block you
|
|
607
|
-
>
|
|
608
|
-
> Next move: I can save it and draft outreach."
|
|
609
|
-
|
|
610
|
-
---
|
|
611
|
-
|
|
612
|
-
## What Not to Do
|
|
613
|
-
|
|
614
|
-
- Do not ask the user to manually build JSON if the resume is available.
|
|
615
|
-
- Do not ask for internal product IDs.
|
|
616
|
-
- Do not force Pro into the first-run setup.
|
|
617
|
-
- Do not take over unrelated conversations.
|
|
618
|
-
- Do not narrate every shell command.
|
|
619
|
-
- Do not give vague market advice when a briefing can answer the question.
|
|
620
|
-
- Do not act like a generic chatbot when CareerClaw is invoked.
|
|
621
|
-
- Do not enter consultant or gap-analysis mode during First-Time Setup.
|
|
622
|
-
- Do not end setup with open-ended targeting questions, strategy options, or multi-choice prompts.
|
|
623
|
-
- Do not apply Behavior 2 unless the user explicitly asks one of its listed trigger phrases.
|
|
624
|
-
|
|
625
|
-
---
|
|
626
|
-
|
|
627
|
-
## Default Success Pattern
|
|
628
|
-
|
|
629
|
-
When invoked successfully, CareerClaw should usually do this:
|
|
323
|
+
## Permissions Used
|
|
630
324
|
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
325
|
+
| Permission | Purpose |
|
|
326
|
+
|--------------|--------------------------------------------------------------|
|
|
327
|
+
| `read` | Read `profile.json`, `tracking.json`, and resume files |
|
|
328
|
+
| `write` | Write `tracking.json`, `runs.jsonl` |
|
|
329
|
+
| `exec` | Run the CareerClaw CLI |
|
|
636
330
|
|
|
637
|
-
|
|
331
|
+
No backend calls. No telemetry. No credential storage.
|
|
332
|
+
External network calls: `remoteok.com` (RSS) and `hacker-news.firebaseio.com` (public API) only.
|
package/dist/config.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export declare const HTTP_TIMEOUT_MS = 15000;
|
|
|
19
19
|
* User-Agent sent with all outbound requests.
|
|
20
20
|
* Identifies the tool and provides a contact point per robots.txt convention.
|
|
21
21
|
*/
|
|
22
|
-
export declare const USER_AGENT = "careerclaw-js/1.0.
|
|
22
|
+
export declare const USER_AGENT = "careerclaw-js/1.0.4 (https://github.com/orestes-garcia-martinez/careerclaw-js)";
|
|
23
23
|
/** RemoteOK RSS feed — public, no auth required. */
|
|
24
24
|
export declare const REMOTEOK_RSS_URL = "https://remoteok.com/remote-jobs.rss";
|
|
25
25
|
/**
|
package/dist/config.js
CHANGED
|
@@ -34,7 +34,7 @@ export const HTTP_TIMEOUT_MS = 15_000;
|
|
|
34
34
|
* User-Agent sent with all outbound requests.
|
|
35
35
|
* Identifies the tool and provides a contact point per robots.txt convention.
|
|
36
36
|
*/
|
|
37
|
-
export const USER_AGENT = "careerclaw-js/1.0.
|
|
37
|
+
export const USER_AGENT = "careerclaw-js/1.0.4 (https://github.com/orestes-garcia-martinez/careerclaw-js)";
|
|
38
38
|
// ---------------------------------------------------------------------------
|
|
39
39
|
// Job sources
|
|
40
40
|
// ---------------------------------------------------------------------------
|