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