careerclaw-js 1.0.2 → 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 +17 -0
- package/SKILL.md +132 -451
- 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,23 @@ 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
|
+
|
|
13
30
|
## [1.0.2] - 2026-03-07
|
|
14
31
|
|
|
15
32
|
### Fixed
|
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,302 +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
|
-
**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
|
|
97
|
+
## Step 1 — Check for Profile
|
|
172
98
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
Examples:
|
|
176
|
-
|
|
177
|
-
- partial tool mismatch
|
|
178
|
-
- weaker experience in one secondary area
|
|
179
|
-
- missing a nice-to-have rather than a must-have
|
|
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:
|
|
209
|
-
|
|
210
|
-
> "You are not a perfect fit on paper, but this is still viable. The biggest gap is backend depth, and it looks
|
|
211
|
-
> secondary rather than central.
|
|
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."
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## Free vs Pro
|
|
218
|
-
|
|
219
|
-
| Feature | Free | Pro |
|
|
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 | — | ✅ |
|
|
228
|
-
|
|
229
|
-
Use Free by default.
|
|
230
|
-
Only mention Pro when it would materially improve the current task.
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## Runtime Check (Self-Healing Install)
|
|
235
|
-
|
|
236
|
-
Before running any `careerclaw-js` command, make sure the correct version is installed.
|
|
237
|
-
|
|
238
|
-
Run:
|
|
99
|
+
Before doing anything else, check whether `.careerclaw/profile.json` exists.
|
|
239
100
|
|
|
240
101
|
```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
|
|
102
|
+
test -f .careerclaw/profile.json
|
|
246
103
|
```
|
|
247
104
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
The `EXPECTED` version must always match this SKILL.md `version:` field.
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
## Working Directory Rules
|
|
255
|
-
|
|
256
|
-
Use the OpenClaw workspace root as the working location.
|
|
257
|
-
|
|
258
|
-
Create and use:
|
|
259
|
-
|
|
260
|
-
```bash
|
|
261
|
-
mkdir -p .careerclaw
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
CareerClaw runtime files live under:
|
|
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`.
|
|
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.
|
|
275
107
|
|
|
276
108
|
---
|
|
277
109
|
|
|
278
110
|
## First-Time Setup
|
|
279
111
|
|
|
280
|
-
|
|
112
|
+
Only enter this flow when `.careerclaw/profile.json` is missing.
|
|
281
113
|
|
|
282
|
-
### Step
|
|
114
|
+
### Step 2 — Request the resume
|
|
283
115
|
|
|
284
|
-
Say:
|
|
116
|
+
Say exactly:
|
|
285
117
|
|
|
286
118
|
> "Upload your resume — I'll read it, extract your skills, and tell you what I found."
|
|
287
119
|
|
|
288
|
-
|
|
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
|
|
120
|
+
Wait for the user to upload. Do not ask any other questions first.
|
|
297
121
|
|
|
298
|
-
|
|
122
|
+
### Step 3 — Save the resume
|
|
299
123
|
|
|
300
|
-
|
|
301
|
-
-
|
|
302
|
-
|
|
303
|
-
- resume_summary
|
|
304
|
-
- location
|
|
124
|
+
```bash
|
|
125
|
+
mkdir -p .careerclaw
|
|
126
|
+
```
|
|
305
127
|
|
|
306
|
-
|
|
128
|
+
- If the upload is a PDF: extract the text.
|
|
129
|
+
- Save the plain text to `.careerclaw/resume.txt`.
|
|
307
130
|
|
|
308
|
-
|
|
309
|
-
- likely role family
|
|
310
|
-
- common stack keywords
|
|
311
|
-
- likely domains
|
|
131
|
+
### Step 4 — Extract the profile
|
|
312
132
|
|
|
313
|
-
|
|
133
|
+
Read `.careerclaw/resume.txt` and extract:
|
|
314
134
|
|
|
315
|
-
|
|
316
|
-
|
|
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) |
|
|
317
144
|
|
|
318
|
-
|
|
319
|
-
Do not offer analysis, strategy, optimization suggestions, or targeting options.
|
|
320
|
-
Do not ask open-ended questions about goals or career direction.
|
|
321
|
-
After collecting these two answers, proceed directly to Step 3.
|
|
145
|
+
Ask only these two follow-up questions, one at a time:
|
|
322
146
|
|
|
323
|
-
|
|
147
|
+
1. Preferred work mode — remote, onsite, or hybrid?
|
|
148
|
+
2. Minimum salary? (optional — they can skip)
|
|
324
149
|
|
|
325
|
-
|
|
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.
|
|
326
152
|
|
|
327
|
-
|
|
153
|
+
### Step 5 — Write the profile
|
|
328
154
|
|
|
329
|
-
|
|
155
|
+
Write `.careerclaw/profile.json`:
|
|
330
156
|
|
|
331
157
|
```json
|
|
332
158
|
{
|
|
333
|
-
"target_roles": [
|
|
334
|
-
|
|
335
|
-
],
|
|
336
|
-
"skills": [
|
|
337
|
-
"React",
|
|
338
|
-
"TypeScript",
|
|
339
|
-
"Python"
|
|
340
|
-
],
|
|
159
|
+
"target_roles": ["Senior Frontend Engineer"],
|
|
160
|
+
"skills": ["React", "TypeScript", "Python"],
|
|
341
161
|
"location": "Florida, USA",
|
|
342
162
|
"experience_years": 8,
|
|
343
163
|
"work_mode": "remote",
|
|
@@ -346,29 +166,22 @@ Use a simple structure like:
|
|
|
346
166
|
}
|
|
347
167
|
```
|
|
348
168
|
|
|
349
|
-
|
|
169
|
+
Omit unknown fields rather than inventing values.
|
|
350
170
|
|
|
351
|
-
### Step
|
|
352
|
-
|
|
353
|
-
Run:
|
|
171
|
+
### Step 6 — Run the first briefing (dry run)
|
|
354
172
|
|
|
355
173
|
```bash
|
|
356
174
|
mkdir -p .careerclaw
|
|
357
175
|
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt --dry-run
|
|
358
176
|
```
|
|
359
177
|
|
|
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.
|
|
178
|
+
Go to [Presenting Results](#presenting-results).
|
|
368
179
|
|
|
369
180
|
---
|
|
370
181
|
|
|
371
|
-
##
|
|
182
|
+
## Running Commands
|
|
183
|
+
|
|
184
|
+
Only reach this section if `.careerclaw/profile.json` exists.
|
|
372
185
|
|
|
373
186
|
### Daily briefing
|
|
374
187
|
|
|
@@ -394,244 +207,112 @@ careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume
|
|
|
394
207
|
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt --top-k 5
|
|
395
208
|
```
|
|
396
209
|
|
|
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?
|
|
210
|
+
Always pass `--resume-txt` on every run.
|
|
455
211
|
|
|
456
212
|
---
|
|
457
213
|
|
|
458
|
-
##
|
|
459
|
-
|
|
460
|
-
When the user asks for outreach:
|
|
461
|
-
|
|
462
|
-
- use known profile data
|
|
463
|
-
- use job-specific details
|
|
464
|
-
- be concise and credible
|
|
465
|
-
- avoid generic flattery
|
|
466
|
-
- avoid fake enthusiasm
|
|
214
|
+
## Presenting Results
|
|
467
215
|
|
|
468
|
-
|
|
216
|
+
Do not dump raw CLI output. Translate results into a short summary:
|
|
469
217
|
|
|
470
|
-
|
|
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.
|
|
471
222
|
|
|
472
|
-
|
|
223
|
+
Example:
|
|
473
224
|
|
|
474
|
-
|
|
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."
|
|
475
227
|
|
|
476
|
-
|
|
228
|
+
After showing results, offer:
|
|
477
229
|
|
|
478
|
-
-
|
|
479
|
-
-
|
|
230
|
+
- Show full outreach drafts
|
|
231
|
+
- More results (`--top-k 5`)
|
|
232
|
+
- Save jobs to tracking
|
|
480
233
|
|
|
481
234
|
---
|
|
482
235
|
|
|
483
|
-
##
|
|
236
|
+
## Outreach Drafts
|
|
484
237
|
|
|
485
|
-
|
|
238
|
+
The CLI output includes ready-to-send outreach drafts.
|
|
486
239
|
|
|
487
|
-
|
|
240
|
+
Rules:
|
|
488
241
|
|
|
489
|
-
-
|
|
490
|
-
|
|
491
|
-
|
|
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.
|
|
492
246
|
|
|
493
|
-
|
|
247
|
+
Free tier: template-quality drafts.
|
|
248
|
+
Pro tier: LLM-enhanced tailored drafts.
|
|
494
249
|
|
|
495
250
|
---
|
|
496
251
|
|
|
497
|
-
##
|
|
498
|
-
|
|
499
|
-
When the user asks:
|
|
252
|
+
## Application Tracking
|
|
500
253
|
|
|
501
|
-
|
|
502
|
-
- "What am I missing?"
|
|
503
|
-
- "Should I apply?"
|
|
504
|
-
- "What are the red flags?"
|
|
254
|
+
Maintain `.careerclaw/tracking.json` when the user saves jobs.
|
|
505
255
|
|
|
506
|
-
|
|
256
|
+
Status progression: `saved` → `applied` → `interview` → `rejected`
|
|
507
257
|
|
|
508
|
-
|
|
509
|
-
- missing requirements
|
|
510
|
-
- likely risks
|
|
511
|
-
- recommended action
|
|
258
|
+
Runtime files:
|
|
512
259
|
|
|
513
|
-
|
|
514
|
-
|
|
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) |
|
|
515
266
|
|
|
516
267
|
---
|
|
517
268
|
|
|
518
|
-
## Pro
|
|
519
|
-
|
|
520
|
-
Do not ask for `CAREERCLAW_PRO_KEY` during first install or first briefing.
|
|
269
|
+
## Pro Features
|
|
521
270
|
|
|
522
|
-
|
|
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 | — | ✅ |
|
|
523
280
|
|
|
524
|
-
|
|
525
|
-
- the user requests tailored outreach or cover letters
|
|
526
|
-
- Pro would clearly improve the current task
|
|
281
|
+
Only mention Pro when it would materially improve the current task.
|
|
527
282
|
|
|
528
|
-
When
|
|
283
|
+
When the user needs Pro, say:
|
|
529
284
|
|
|
530
|
-
> "That feature uses CareerClaw Pro. If you
|
|
531
|
-
> 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."
|
|
532
286
|
|
|
533
|
-
If
|
|
287
|
+
If they do not have Pro:
|
|
534
288
|
|
|
535
289
|
> "Buy CareerClaw Pro: https://ogm.gumroad.com/l/careerclaw-pro"
|
|
536
290
|
|
|
537
|
-
Do not
|
|
538
|
-
Do not expose internal licensing implementation details.
|
|
291
|
+
Do not mention Pro during first-time setup or the first briefing.
|
|
539
292
|
|
|
540
293
|
---
|
|
541
294
|
|
|
542
295
|
## Error Handling
|
|
543
296
|
|
|
544
|
-
If the CLI fails
|
|
545
|
-
|
|
546
|
-
- explain the failure plainly
|
|
547
|
-
- preserve trust
|
|
548
|
-
- suggest the next concrete move
|
|
297
|
+
If the CLI fails, explain the failure plainly and give the next concrete move.
|
|
549
298
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
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."
|
|
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." |
|
|
566
306
|
|
|
567
307
|
---
|
|
568
308
|
|
|
569
|
-
##
|
|
570
|
-
|
|
571
|
-
CareerClaw stores local working data under `.careerclaw/`.
|
|
572
|
-
|
|
573
|
-
Treat this data as user-owned working memory:
|
|
574
|
-
|
|
575
|
-
- resume text
|
|
576
|
-
- profile data
|
|
577
|
-
- tracking data
|
|
578
|
-
- run history
|
|
579
|
-
|
|
580
|
-
Do not present private file details unless needed for the current task.
|
|
581
|
-
|
|
582
|
-
If the user asks what is stored, explain clearly and concretely.
|
|
583
|
-
|
|
584
|
-
---
|
|
585
|
-
|
|
586
|
-
## Result Style
|
|
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:
|
|
309
|
+
## Permissions Used
|
|
630
310
|
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
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 |
|
|
636
316
|
|
|
637
|
-
|
|
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
|
// ---------------------------------------------------------------------------
|