career-compass-mcp 2.3.0 → 2.4.1
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 +98 -12
- package/build/bin/cli.d.ts.map +1 -1
- package/build/bin/cli.js +70 -7
- package/build/bin/cli.js.map +1 -1
- package/build/src/dashboard-lite/render.d.ts +11 -11
- package/build/src/dashboard-lite/render.d.ts.map +1 -1
- package/build/src/dashboard-lite/render.js +40 -26
- package/build/src/dashboard-lite/render.js.map +1 -1
- package/build/src/dashboard-lite/server.d.ts +5 -6
- package/build/src/dashboard-lite/server.d.ts.map +1 -1
- package/build/src/dashboard-lite/server.js +75 -2
- package/build/src/dashboard-lite/server.js.map +1 -1
- package/build/src/manifest-format.d.ts +56 -0
- package/build/src/manifest-format.d.ts.map +1 -0
- package/build/src/manifest-format.js +67 -0
- package/build/src/manifest-format.js.map +1 -0
- package/build/src/pipeline-stats.d.ts +59 -0
- package/build/src/pipeline-stats.d.ts.map +1 -0
- package/build/src/pipeline-stats.js +66 -0
- package/build/src/pipeline-stats.js.map +1 -0
- package/build/src/sample-data.d.ts +49 -0
- package/build/src/sample-data.d.ts.map +1 -0
- package/build/src/sample-data.js +234 -0
- package/build/src/sample-data.js.map +1 -0
- package/build/src/schemas/career-schema.d.ts +15 -4
- package/build/src/schemas/career-schema.d.ts.map +1 -1
- package/build/src/schemas/career-schema.js +36 -2
- package/build/src/schemas/career-schema.js.map +1 -1
- package/build/src/server.d.ts +14 -1
- package/build/src/server.d.ts.map +1 -1
- package/build/src/server.js +4 -1
- package/build/src/server.js.map +1 -1
- package/build/src/storage/file-store.d.ts +10 -0
- package/build/src/storage/file-store.d.ts.map +1 -1
- package/build/src/storage/file-store.js +72 -5
- package/build/src/storage/file-store.js.map +1 -1
- package/build/src/tools/career-kb.d.ts +26 -0
- package/build/src/tools/career-kb.d.ts.map +1 -1
- package/build/src/tools/career-kb.js +138 -13
- package/build/src/tools/career-kb.js.map +1 -1
- package/build/src/tools/doctor.d.ts +115 -0
- package/build/src/tools/doctor.d.ts.map +1 -0
- package/build/src/tools/doctor.js +549 -0
- package/build/src/tools/doctor.js.map +1 -0
- package/build/src/tools/interview.d.ts.map +1 -1
- package/build/src/tools/interview.js +206 -0
- package/build/src/tools/interview.js.map +1 -1
- package/build/src/tools/opportunity.d.ts.map +1 -1
- package/build/src/tools/opportunity.js +101 -22
- package/build/src/tools/opportunity.js.map +1 -1
- package/build/src/tools/pipeline.d.ts +23 -1
- package/build/src/tools/pipeline.d.ts.map +1 -1
- package/build/src/tools/pipeline.js +110 -17
- package/build/src/tools/pipeline.js.map +1 -1
- package/build/src/types/tool-args.d.ts +4 -1
- package/build/src/types/tool-args.d.ts.map +1 -1
- package/build/src/version.d.ts +9 -0
- package/build/src/version.d.ts.map +1 -1
- package/build/src/version.js +10 -1
- package/build/src/version.js.map +1 -1
- package/data/example/career/journal.yaml +4 -4
- package/data/example/pipeline/applications.yaml +7 -7
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -84,7 +84,9 @@ files on your own disk** and never leaves it.
|
|
|
84
84
|
- **Never committed to git:** `.gitignore` excludes `data/career/` and `data/pipeline/`, so
|
|
85
85
|
the only career data in this repo is the fictional sample under `data/example/` (meet Alex
|
|
86
86
|
Rivera). Read it, edit it, delete it — it's all just files you own.
|
|
87
|
-
- **No account, no cloud sync, no telemetry.**
|
|
87
|
+
- **No account, no cloud sync, no telemetry.** The one request the package ever makes is
|
|
88
|
+
`check_setup`'s optional version check against the public npm registry, which carries
|
|
89
|
+
nothing about you or your data — see [Privacy Policy](#privacy-policy).
|
|
88
90
|
- **What ships in the package:** only the MCP server code and a small set of **fictional
|
|
89
91
|
example files** (`data/example/` — the "Alex Rivera" persona). There is no real career
|
|
90
92
|
data in the published package, and none can be — the package and your data live in
|
|
@@ -142,7 +144,14 @@ Open Claude and say:
|
|
|
142
144
|
Claude will:
|
|
143
145
|
- Extract your work history, achievements, and skills into structured YAML
|
|
144
146
|
- Ask clarifying questions about gaps or unclear metrics
|
|
145
|
-
-
|
|
147
|
+
- Call `save_career_section` once per section to write it to your `CAREER_DATA_PATH`
|
|
148
|
+
|
|
149
|
+
`save_career_section` is the step where your data actually lands on disk — it is
|
|
150
|
+
the only tool that writes the Career KB. It saves one section at a time
|
|
151
|
+
(`profile`, `experience`, `skills`, `education`, `projects`, `testimonials`),
|
|
152
|
+
validates against the schema before touching the file, and keeps the previous
|
|
153
|
+
version as a timestamped `.bak`. Because it replaces a section wholesale, your
|
|
154
|
+
host will ask you to confirm each write; approving them is what fills the KB.
|
|
146
155
|
|
|
147
156
|
That's it. From there, every tool has full context on who you are.
|
|
148
157
|
|
|
@@ -165,7 +174,7 @@ Career Compass stores all data as YAML files under `CAREER_DATA_PATH` (default `
|
|
|
165
174
|
└── applications.yaml # all job applications
|
|
166
175
|
```
|
|
167
176
|
|
|
168
|
-
This is your single source of truth — built once, enriched over time, read by every tool. You never need to edit these files by hand:
|
|
177
|
+
This is your single source of truth — built once, enriched over time, read by every tool. You never need to edit these files by hand: paste a document and ask Claude to save it, and it will extract the structure and write it with `save_career_section`. (`ingest_document` reads a document and pulls achievements out of it, but never writes — `save_career_section` is what puts them on disk.)
|
|
169
178
|
|
|
170
179
|
See [`data/example/`](data/example/) in this repo for a fully populated sample (the fictional Alex Rivera).
|
|
171
180
|
|
|
@@ -205,7 +214,7 @@ cd dashboard && npm install && cd .. # dashboard deps (its own package.json)
|
|
|
205
214
|
npm run build
|
|
206
215
|
|
|
207
216
|
# Try it with the bundled Alex Rivera sample (no setup, ~1 minute):
|
|
208
|
-
|
|
217
|
+
npm run dashboard -- --sample
|
|
209
218
|
```
|
|
210
219
|
|
|
211
220
|
This opens the dashboard at `http://localhost:3141` (or the next available port). Point
|
|
@@ -226,13 +235,20 @@ every request**, so a browser refresh always reflects the current state of `~/.c
|
|
|
226
235
|
> `dashboard` reports that no dashboard is available.
|
|
227
236
|
|
|
228
237
|
```bash
|
|
229
|
-
#
|
|
230
|
-
npx -y career-compass-mcp dashboard --lite
|
|
238
|
+
# Try it with the bundled Alex Rivera sample - no clone, no build, no setup:
|
|
239
|
+
npx -y career-compass-mcp dashboard --lite --sample
|
|
231
240
|
|
|
232
|
-
# Or
|
|
233
|
-
|
|
241
|
+
# Or against your own data (CAREER_DATA_PATH, or ~/.career-compass if unset):
|
|
242
|
+
npx -y career-compass-mcp dashboard --lite
|
|
234
243
|
```
|
|
235
244
|
|
|
245
|
+
`--sample` (alias `--demo`) resolves the demo *inside the installed package*, wherever npx
|
|
246
|
+
put it, so it works from any directory and on any shell. The sample is a **read-only
|
|
247
|
+
demo**: its dates are shifted to sit around today each time it is read, so the pipeline
|
|
248
|
+
always looks like a live search, and Career Compass refuses to write into it. Drop the flag
|
|
249
|
+
— and point `CAREER_DATA_PATH` at your own folder, or leave it unset for
|
|
250
|
+
`~/.career-compass` — before saving anything.
|
|
251
|
+
|
|
236
252
|
Plain `career-compass-mcp dashboard` uses the full dashboard when it's been built and falls back
|
|
237
253
|
to the lite one otherwise. Data never leaves your machine - the page has no external assets and
|
|
238
254
|
makes no network calls. Clicking a card copies a ready-to-paste prompt for Claude (in Cowork, the
|
|
@@ -243,11 +259,16 @@ same board is available as a live artifact that dispatches the prompt straight i
|
|
|
243
259
|
## Privacy Policy
|
|
244
260
|
|
|
245
261
|
Career Compass runs entirely on your own computer. There is no account, no cloud sync, and
|
|
246
|
-
no telemetry
|
|
262
|
+
no telemetry. The whole package makes exactly one outbound network request: `check_setup`
|
|
263
|
+
asks the public npm registry whether a newer version has been released. It is an
|
|
264
|
+
unauthenticated GET for the package name — nothing about you or your data goes with it —
|
|
265
|
+
and calling `check_setup` with `checkForUpdates: false` never constructs the request at all.
|
|
247
266
|
|
|
248
267
|
- **What it handles:** the career history, job pipeline, and pasted documents you give it.
|
|
249
268
|
- **Where it's stored:** plain YAML in the directory you set via `CAREER_DATA_PATH`
|
|
250
|
-
(default `~/.career-compass/`), plus timestamped `.bak` copies of previous versions
|
|
269
|
+
(default `~/.career-compass/`), plus timestamped `.bak` copies of previous versions
|
|
270
|
+
(the five most recent per file are kept; older ones are pruned on the next write —
|
|
271
|
+
backups you make by hand are never touched).
|
|
251
272
|
- **Who else sees it:** only the MCP client you connect (e.g. Claude Desktop), and through
|
|
252
273
|
it your model provider, under *their* policy — and only for the requests you make.
|
|
253
274
|
Career Compass sends nothing anywhere on its own.
|
|
@@ -265,21 +286,23 @@ published at https://benskamps.github.io/career-compass-mcp/privacy
|
|
|
265
286
|
|
|
266
287
|
| Tool | What it does |
|
|
267
288
|
|------|-------------|
|
|
268
|
-
| `explore_opportunity` | Analyzes a job posting against your Career KB — fit score, matched strengths, gaps, talking points, day-in-the-life, red flags |
|
|
289
|
+
| `explore_opportunity` | Analyzes a job posting against your Career KB **and your stated preferences** — salary band, remote, relocation, notice period. Returns a fit score, an explicit compensation and location check, matched strengths, gaps, talking points, day-in-the-life, red flags. Pass `sourceFitLabel` ("LinkedIn: strong match") and it will explicitly agree or disagree with the job board, in both directions |
|
|
269
290
|
| `research_company` | Builds an intelligence brief: product, culture, funding, interview process, strategic fit |
|
|
270
291
|
| `tailor_resume` | Generates an ATS-optimized, tailored resume from your KB — standard, federal, academic, or functional formats |
|
|
271
292
|
| `generate_cover_letter` | Writes a personalized cover letter with your actual achievements woven in |
|
|
272
293
|
| `format_for_ats` | Reformats resume content for specific ATS systems: Workday, Greenhouse, Lever, LinkedIn, iCIMS, Taleo |
|
|
273
294
|
| `pipeline_view` | Reads the pipeline — list, funnel stats, what needs attention, or one application by id. Read-only, so it runs without a permission prompt |
|
|
274
|
-
| `pipeline_add` | Adds one job application to the pipeline |
|
|
295
|
+
| `pipeline_add` | Adds one job application to the pipeline. Takes an optional starting `status` (defaults to `applied`); unknown statuses are rejected with a did-you-mean suggestion |
|
|
275
296
|
| `pipeline_update` | Updates one application — status, notes, follow-up date, a contact, or an interview round |
|
|
276
297
|
| `classify_email` | Classifies a job-search email and extracts contacts, dates, and suggested pipeline updates |
|
|
277
298
|
| `prepare_interview` | Full interview prep: opening pitch, STAR stories, likely questions, company alignment, questions to ask |
|
|
299
|
+
| `interview_arc` | Mid-process projection: reconstructs the arc so far from your recorded rounds and journal signals, then projects what the **next** round will probe — ground already covered, threads the last interview left open, gaps nobody has tested yet, and ranked likely questions |
|
|
278
300
|
| `evaluate_offer` | Breaks down total comp, compares to market, builds negotiation strategy, drafts counter scripts |
|
|
279
301
|
| `ingest_document` | Extracts achievements from any document: performance review, award email, LinkedIn recommendation, project summary |
|
|
280
302
|
| `generate_rejection_response` | Drafts a graceful response that keeps the door open and maintains the relationship |
|
|
281
303
|
| `capture_insight` | Appends a dated signal to your career journal — fit signals, interview insights, offer reflections, rejection patterns, skill evidence, wins — which later resume, interview, and fit prompts read back |
|
|
282
304
|
| `save_career_section` | Writes one section of your Career KB to disk as plain YAML — this is how the KB gets populated. Replaces the whole section; the previous version is kept as a `.bak` |
|
|
305
|
+
| `check_setup` | Health-checks the install in one pass — version vs. the current npm release, data directory, which Career KB sections are filled, whether the pipeline parses, leftover temp files, dashboard status — each finding with the one command that fixes it. Read-only. Run it first when anything seems off |
|
|
283
306
|
|
|
284
307
|
## Resources
|
|
285
308
|
|
|
@@ -316,6 +339,69 @@ Power-user shortcuts (appear in Claude's prompt menu):
|
|
|
316
339
|
|
|
317
340
|
---
|
|
318
341
|
|
|
342
|
+
## Upgrading
|
|
343
|
+
|
|
344
|
+
**If something is behaving strangely, start here:**
|
|
345
|
+
|
|
346
|
+
> **"Run the Career Compass setup check."**
|
|
347
|
+
|
|
348
|
+
That calls `check_setup`, which reports your installed version against the current npm
|
|
349
|
+
release, whether your data directory exists and is writable, which Career KB sections are
|
|
350
|
+
filled in, whether your pipeline file parses, any leftover temp files, and whether the
|
|
351
|
+
dashboard is running — each with the one command that fixes it. It is read-only and usually
|
|
352
|
+
answers the question before you have to debug anything.
|
|
353
|
+
|
|
354
|
+
It is also the fastest way to find out you are simply on an old version, which is the most
|
|
355
|
+
common cause of "this feels rough around the edges."
|
|
356
|
+
|
|
357
|
+
Your career data is never touched by an upgrade. It lives in `CAREER_DATA_PATH`, not in the
|
|
358
|
+
package, and older data directories keep working — sections added by later releases are
|
|
359
|
+
created when you first write them.
|
|
360
|
+
|
|
361
|
+
### Claude Desktop (`.mcpb` bundle)
|
|
362
|
+
|
|
363
|
+
The bundle does not self-update. Download the current `.mcpb` from the
|
|
364
|
+
[Releases page](https://github.com/benskamps/career-compass-mcp/releases), then in Claude
|
|
365
|
+
Desktop go to **Settings → Extensions**, remove the installed Career Compass extension, and
|
|
366
|
+
install the new file. Restart Claude Desktop.
|
|
367
|
+
|
|
368
|
+
Your settings — including `CAREER_DATA_PATH` — are re-entered on install, so note the path
|
|
369
|
+
before you remove the old one. `check_setup` prints it.
|
|
370
|
+
|
|
371
|
+
### npx (the config in Quick Start)
|
|
372
|
+
|
|
373
|
+
`npx -y career-compass-mcp` resolves the latest published version, but npx caches, so a
|
|
374
|
+
stale copy can persist. To force the current one:
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
npx -y career-compass-mcp@latest --version
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
Then restart your MCP client. If the version still lags, clear the npx cache with
|
|
381
|
+
`npm cache clean --force` and try again.
|
|
382
|
+
|
|
383
|
+
### Global npm install
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
npm install -g career-compass-mcp@latest
|
|
387
|
+
career-compass-mcp --version
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Restart your MCP client afterward — it keeps the old server process alive until it does.
|
|
391
|
+
|
|
392
|
+
### From source
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
git pull
|
|
396
|
+
npm install
|
|
397
|
+
npm run build:mcp # or `npm run build` for the full Next.js dashboard too
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Restart your MCP client. A source checkout will normally report itself as *ahead* of npm in
|
|
401
|
+
`check_setup`; that is expected, not drift.
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
319
405
|
## Building from Source
|
|
320
406
|
|
|
321
407
|
```bash
|
package/build/bin/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AAkBA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AAkBA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
package/build/bin/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { homedir } from "os";
|
|
3
|
-
import { join } from "path";
|
|
3
|
+
import { join, resolve } from "path";
|
|
4
4
|
import { existsSync, mkdirSync } from "fs";
|
|
5
5
|
import { createServer as createNetServer } from "net";
|
|
6
6
|
import { spawn } from "child_process";
|
|
@@ -18,6 +18,7 @@ const __cliDir = fileURLToPath(new URL(".", import.meta.url));
|
|
|
18
18
|
* cli-version.test.ts exercises it directly.
|
|
19
19
|
*/
|
|
20
20
|
import { readPkgVersion } from "../src/version.js";
|
|
21
|
+
import { bundledSampleDir } from "../src/sample-data.js";
|
|
21
22
|
export { readPkgVersion };
|
|
22
23
|
const pkgVersion = readPkgVersion(__cliDir);
|
|
23
24
|
if (args.includes("--version") || args.includes("-v")) {
|
|
@@ -32,6 +33,7 @@ career-compass-mcp v${pkgVersion}
|
|
|
32
33
|
Usage:
|
|
33
34
|
career-compass-mcp Run MCP server (stdio)
|
|
34
35
|
career-compass-mcp dashboard Open web dashboard (full if built, else lite)
|
|
36
|
+
career-compass-mcp dashboard --sample Open the bundled Alex Rivera demo
|
|
35
37
|
career-compass-mcp dashboard --lite Force the zero-build lite dashboard
|
|
36
38
|
career-compass-mcp dashboard --port 3000 Specify port (default: 3141)
|
|
37
39
|
career-compass-mcp dashboard --no-open Start without opening browser
|
|
@@ -39,9 +41,13 @@ Usage:
|
|
|
39
41
|
Options:
|
|
40
42
|
-h, --help Show this help message
|
|
41
43
|
-v, --version Show version number
|
|
44
|
+
--sample Serve the bundled read-only demo (alias: --demo).
|
|
45
|
+
Ignores CAREER_DATA_PATH; writes nothing.
|
|
42
46
|
--lite Use the built-in zero-build dashboard (no Next.js build needed)
|
|
43
47
|
--port <number> Dashboard port (default: 3141)
|
|
44
48
|
--no-open Don't auto-open browser
|
|
49
|
+
|
|
50
|
+
Your data folder is CAREER_DATA_PATH, or ~/.career-compass when that is unset.
|
|
45
51
|
`);
|
|
46
52
|
process.exit(0);
|
|
47
53
|
}
|
|
@@ -64,12 +70,8 @@ else {
|
|
|
64
70
|
}
|
|
65
71
|
const noOpen = args.includes("--no-open");
|
|
66
72
|
const forceLite = args.includes("--lite");
|
|
67
|
-
|
|
68
|
-
const dataPath =
|
|
69
|
-
if (!existsSync(dataPath)) {
|
|
70
|
-
mkdirSync(join(dataPath, "career"), { recursive: true });
|
|
71
|
-
mkdirSync(join(dataPath, "pipeline"), { recursive: true });
|
|
72
|
-
}
|
|
73
|
+
const useSample = args.includes("--sample") || args.includes("--demo");
|
|
74
|
+
const dataPath = resolveDataPath(useSample);
|
|
73
75
|
// Find available port
|
|
74
76
|
const port = await findPort(requestedPort);
|
|
75
77
|
// Resolve standalone server path
|
|
@@ -146,6 +148,67 @@ function findPort(preferred) {
|
|
|
146
148
|
});
|
|
147
149
|
});
|
|
148
150
|
}
|
|
151
|
+
function ensureDataDirs(dir) {
|
|
152
|
+
mkdirSync(join(dir, "career"), { recursive: true });
|
|
153
|
+
mkdirSync(join(dir, "pipeline"), { recursive: true });
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Decide which folder the dashboard serves, and refuse the one case that used
|
|
157
|
+
* to fail silently.
|
|
158
|
+
*
|
|
159
|
+
* The README's own demo line was `CAREER_DATA_PATH=data/example npx -y
|
|
160
|
+
* career-compass-mcp dashboard --lite`. That path is relative, and npx runs it
|
|
161
|
+
* from wherever the user happens to be standing — so unless they were inside a
|
|
162
|
+
* clone of this repo it resolved to a folder that did not exist, which this
|
|
163
|
+
* function's predecessor then created. The result was an empty dashboard, a
|
|
164
|
+
* stray `./data/example/` left in their working directory, and no indication
|
|
165
|
+
* that either had happened. `--sample` is the flag that command actually
|
|
166
|
+
* wanted: it resolves the demo inside the installed package, wherever npx put
|
|
167
|
+
* it.
|
|
168
|
+
*
|
|
169
|
+
* A missing CAREER_DATA_PATH is now refused rather than conjured. Creating a
|
|
170
|
+
* directory the user did not ask for is the more surprising of the two
|
|
171
|
+
* behaviours — the default `~/.career-compass` is still created without
|
|
172
|
+
* ceremony, because that one *is* what they asked for by not choosing.
|
|
173
|
+
*/
|
|
174
|
+
function resolveDataPath(useSample) {
|
|
175
|
+
if (useSample) {
|
|
176
|
+
const sample = bundledSampleDir();
|
|
177
|
+
if (!sample) {
|
|
178
|
+
console.error("Error: --sample serves the bundled demo (data/example/), which is missing from this install.");
|
|
179
|
+
console.error("Reinstall the package, or drop --sample and point CAREER_DATA_PATH at your own folder.");
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
console.error(`Serving the bundled Alex Rivera demo — read-only, nothing is written:\n ${sample}`);
|
|
183
|
+
return sample;
|
|
184
|
+
}
|
|
185
|
+
const configured = process.env.CAREER_DATA_PATH;
|
|
186
|
+
if (!configured) {
|
|
187
|
+
const fallback = join(homedir(), ".career-compass");
|
|
188
|
+
ensureDataDirs(fallback);
|
|
189
|
+
return fallback;
|
|
190
|
+
}
|
|
191
|
+
const abs = resolve(configured);
|
|
192
|
+
if (!existsSync(abs)) {
|
|
193
|
+
console.error(`Error: CAREER_DATA_PATH points at a folder that does not exist:\n ${abs}`);
|
|
194
|
+
if (abs !== configured) {
|
|
195
|
+
console.error(` (resolved from "${configured}" against ${process.cwd()})`);
|
|
196
|
+
}
|
|
197
|
+
console.error("");
|
|
198
|
+
console.error("Nothing was created: an empty folder here would open an empty dashboard and");
|
|
199
|
+
console.error("leave a stray directory behind. One of these is probably what you meant:");
|
|
200
|
+
console.error("");
|
|
201
|
+
console.error(" To see the bundled demo:");
|
|
202
|
+
console.error(" career-compass-mcp dashboard --sample");
|
|
203
|
+
console.error(" To use your own data in the default folder (~/.career-compass):");
|
|
204
|
+
console.error(" clear CAREER_DATA_PATH from your environment");
|
|
205
|
+
console.error(" To really use this folder:");
|
|
206
|
+
console.error(` mkdir "${abs}"`);
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
ensureDataDirs(abs);
|
|
210
|
+
return abs;
|
|
211
|
+
}
|
|
149
212
|
function openBrowser(url) {
|
|
150
213
|
const cmd = process.platform === "win32" ? "start" : process.platform === "darwin" ? "open" : "xdg-open";
|
|
151
214
|
spawn(cmd, [url], { shell: true, stdio: "ignore", detached: true }).unref();
|
package/build/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,16 +6,16 @@ interface NextAction {
|
|
|
6
6
|
}
|
|
7
7
|
/** Derive next actions from follow-up dates, upcoming interviews, and expiring offers. */
|
|
8
8
|
export declare function deriveNextActions(apps: Application[], today?: Date): NextAction[];
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export declare function renderLiteDashboard(pipeline: Pipeline): string;
|
|
9
|
+
/**
|
|
10
|
+
* Render the full self-contained HTML document.
|
|
11
|
+
*
|
|
12
|
+
* `dataDir` is passed in rather than read here so this module stays free of the
|
|
13
|
+
* store (and of node-only APIs — the Next dashboard imports from this tree).
|
|
14
|
+
* When it is absent the footer simply does not name a folder, which is the one
|
|
15
|
+
* honest thing to say without knowing it: the footer used to print
|
|
16
|
+
* `~/.career-compass` unconditionally, so anyone running with CAREER_DATA_PATH
|
|
17
|
+
* set was told their data was somewhere it wasn't.
|
|
18
|
+
*/
|
|
19
|
+
export declare function renderLiteDashboard(pipeline: Pipeline, dataDir?: string): string;
|
|
20
20
|
export {};
|
|
21
21
|
//# sourceMappingURL=render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/dashboard-lite/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/dashboard-lite/render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAqB,MAAM,6BAA6B,CAAC;AA2D5F,UAAU,UAAU;IAAG,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;CAAE;AAE/F,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,OAAa,GAAG,UAAU,EAAE,CAwCvF;AAmBD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CA6LhF"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { STATUS_ORDER, statusRank } from "../schemas/career-schema.js";
|
|
2
|
+
import { ACTIVE_STATUSES, computeStats } from "../pipeline-stats.js";
|
|
1
3
|
/**
|
|
2
4
|
* Zero-build "lite" dashboard.
|
|
3
5
|
*
|
|
@@ -12,13 +14,13 @@
|
|
|
12
14
|
* than dispatching it. In Cowork, the artifact variant wires the same prompts to
|
|
13
15
|
* sendPrompt() instead.
|
|
14
16
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
// The board's column order is the funnel order declared on the schema, shared
|
|
18
|
+
// with `pipeline_view sortBy=status` so the two surfaces cannot disagree about
|
|
19
|
+
// which stage comes first.
|
|
20
|
+
const STAGE_ORDER = STATUS_ORDER;
|
|
21
|
+
// The same live-stage list the stats use, so the chart cannot show a stage the
|
|
22
|
+
// "Active" KPI is not counting.
|
|
23
|
+
const ACTIVE = ACTIVE_STATUSES;
|
|
22
24
|
/**
|
|
23
25
|
* Stage colours as a temperature ramp, not a rainbow.
|
|
24
26
|
*
|
|
@@ -77,7 +79,13 @@ export function deriveNextActions(apps, today = new Date()) {
|
|
|
77
79
|
else if (fu <= 2)
|
|
78
80
|
out.push({ app, label: `Follow-up due ${fu === 0 ? "today" : `in ${fu}d`} — ${app.company}`, urgency: "soon" });
|
|
79
81
|
}
|
|
80
|
-
|
|
82
|
+
// A future-dated round on an application that has already reached offer or
|
|
83
|
+
// negotiating is a leftover, not a plan — the process moved past it.
|
|
84
|
+
// Filtering rounds by date alone put "Interview in 2d" beside an offer
|
|
85
|
+
// under review, in the demo, on the panel that is supposed to say what to
|
|
86
|
+
// do next.
|
|
87
|
+
const stillInterviewing = statusRank(app.status) <= statusRank("interviewing");
|
|
88
|
+
const nextInterview = !stillInterviewing ? undefined : (app.interviewRounds ?? [])
|
|
81
89
|
.map((r) => days(r.date)).filter((d) => !Number.isNaN(d) && d >= 0).sort((a, b) => a - b)[0];
|
|
82
90
|
if (nextInterview != null && nextInterview <= 7) {
|
|
83
91
|
out.push({ app, label: `Interview ${nextInterview === 0 ? "today" : `in ${nextInterview}d`} — ${app.company}`, urgency: nextInterview <= 2 ? "soon" : "info" });
|
|
@@ -91,20 +99,6 @@ export function deriveNextActions(apps, today = new Date()) {
|
|
|
91
99
|
const rank = { overdue: 0, soon: 1, info: 2 };
|
|
92
100
|
return out.sort((a, b) => rank[a.urgency] - rank[b.urgency]);
|
|
93
101
|
}
|
|
94
|
-
export function computeStats(apps) {
|
|
95
|
-
const total = apps.length;
|
|
96
|
-
const active = apps.filter((a) => ACTIVE.includes(a.status)).length;
|
|
97
|
-
const inConversation = apps.filter((a) => ["screening", "interviewing"].includes(a.status)).length;
|
|
98
|
-
const offers = apps.filter((a) => ["offer", "negotiating", "accepted"].includes(a.status)).length;
|
|
99
|
-
const applied = apps.filter((a) => a.status !== "discovered").length;
|
|
100
|
-
const responded = apps.filter((a) => !["discovered", "applied", "ghosted"].includes(a.status)).length;
|
|
101
|
-
const ghosted = apps.filter((a) => a.status === "ghosted").length;
|
|
102
|
-
return {
|
|
103
|
-
total, active, inConversation, offers,
|
|
104
|
-
responseRate: applied ? Math.round((responded / applied) * 100) : 0,
|
|
105
|
-
ghostRate: applied ? Math.round((ghosted / applied) * 100) : 0,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
102
|
function kpi(n, label, foot = "") {
|
|
109
103
|
return `<div class="kpi"><div class="n">${esc(n)}</div><div class="l">${esc(label)}</div>${foot ? `<div class="foot">${esc(foot)}</div>` : ""}</div>`;
|
|
110
104
|
}
|
|
@@ -119,8 +113,17 @@ function jobCard(a) {
|
|
|
119
113
|
<div class="meta">${pr}${exc}</div>
|
|
120
114
|
</div>`;
|
|
121
115
|
}
|
|
122
|
-
/**
|
|
123
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Render the full self-contained HTML document.
|
|
118
|
+
*
|
|
119
|
+
* `dataDir` is passed in rather than read here so this module stays free of the
|
|
120
|
+
* store (and of node-only APIs — the Next dashboard imports from this tree).
|
|
121
|
+
* When it is absent the footer simply does not name a folder, which is the one
|
|
122
|
+
* honest thing to say without knowing it: the footer used to print
|
|
123
|
+
* `~/.career-compass` unconditionally, so anyone running with CAREER_DATA_PATH
|
|
124
|
+
* set was told their data was somewhere it wasn't.
|
|
125
|
+
*/
|
|
126
|
+
export function renderLiteDashboard(pipeline, dataDir) {
|
|
124
127
|
const apps = [...(pipeline.applications ?? [])].sort((a, b) => (b.dateUpdated ?? "").localeCompare(a.dateUpdated ?? ""));
|
|
125
128
|
const s = computeStats(apps);
|
|
126
129
|
const actions = deriveNextActions(apps);
|
|
@@ -196,7 +199,18 @@ h1{font-size:20px;margin:0 0 2px;letter-spacing:-.01em}.sub{color:var(--muted);f
|
|
|
196
199
|
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:20px}
|
|
197
200
|
.kpi{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px 16px;box-shadow:var(--shadow)}
|
|
198
201
|
.kpi .n{font-size:26px;font-weight:700;letter-spacing:-.02em}.kpi .l{color:var(--muted);font-size:12px;margin-top:2px}.kpi .foot{font-size:11.5px;margin-top:6px;color:var(--muted)}
|
|
199
|
-
|
|
202
|
+
/* minmax(0,…) is load-bearing, not decoration. A grid item's default
|
|
203
|
+
min-width is auto — its min-content — so a bare 1fr track is a *floor*,
|
|
204
|
+
not a cap: one long unbreakable token in a company name or a follow-up
|
|
205
|
+
label grows its own rail past its share, and the sibling rail is squeezed
|
|
206
|
+
to whatever is left. Measured on the sample pipeline at 1512px, the rails
|
|
207
|
+
went 1263px / 175px, the chart track collapsed to 3px, and the page ran
|
|
208
|
+
135px off the right edge. minmax(0,1fr) lets the item shrink; the
|
|
209
|
+
overflow-wrap below is what keeps the token itself inside the card once
|
|
210
|
+
the box stops growing to fit it. */
|
|
211
|
+
.grid2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;align-items:start}@media(max-width:900px){.grid2{grid-template-columns:minmax(0,1fr)}}
|
|
212
|
+
.grid2>*,.board>*{min-width:0}
|
|
213
|
+
.action .t b,.jc .co,.jc .ro{overflow-wrap:anywhere}
|
|
200
214
|
.panel{background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow)}
|
|
201
215
|
.panel h2{font-size:13px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:0;padding:14px 16px;border-bottom:1px solid var(--line)}
|
|
202
216
|
.panel .body{padding:14px 16px}.chart-box{position:relative;display:flex;gap:10px}
|
|
@@ -259,7 +273,7 @@ ${apps.length === 0 ? emptyState : `
|
|
|
259
273
|
<div class="panel"><h2>Next actions</h2><div class="body">${actionsHtml}</div></div>
|
|
260
274
|
<div class="panel"><h2>Stage distribution</h2><div class="body"><div id="chart" class="chart-box"></div></div></div>
|
|
261
275
|
</div>`}
|
|
262
|
-
<div class="foot-note"
|
|
276
|
+
<div class="foot-note">${dataDir ? `Data stays local (<code>${esc(dataDir)}</code>).` : "Data stays local on this machine."} Click any card to copy a prompt for Claude — that's where the work happens. Refresh the page to re-read from disk.</div>
|
|
263
277
|
</div>
|
|
264
278
|
<div id="toast"></div>
|
|
265
279
|
<script>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/dashboard-lite/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/dashboard-lite/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { type Server } from "http";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Is this `Host` header one of ours?
|
|
4
4
|
*
|
|
5
|
-
* A
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* of ~/.career-compass, mirroring the force-dynamic guarantee of the Next.js
|
|
9
|
-
* dashboard. Ships in the npm package (pure JS, no framework, no build).
|
|
5
|
+
* A missing header is refused too. HTTP/1.1 requires it and every browser sends
|
|
6
|
+
* it, so its absence is either a hand-written request or an attempt to skip the
|
|
7
|
+
* check — neither is a case worth serving a career history to.
|
|
10
8
|
*/
|
|
9
|
+
export declare function isAllowedHost(host: string | undefined): boolean;
|
|
11
10
|
export declare function createLiteDashboardServer(): Server;
|
|
12
11
|
/**
|
|
13
12
|
* Start the lite dashboard on `port`, resolving once it's listening.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/dashboard-lite/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/dashboard-lite/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAkEjD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI/D;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAwClD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBxF"}
|