career-compass-mcp 2.0.0 → 2.2.0
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 +391 -340
- package/build/bin/cli.d.ts +5 -5
- package/build/bin/cli.d.ts.map +1 -1
- package/build/bin/cli.js +55 -49
- package/build/bin/cli.js.map +1 -1
- package/build/src/dashboard-lite/render.d.ts +21 -0
- package/build/src/dashboard-lite/render.d.ts.map +1 -0
- package/build/src/dashboard-lite/render.js +216 -0
- package/build/src/dashboard-lite/render.js.map +1 -0
- package/build/src/dashboard-lite/server.d.ts +14 -0
- package/build/src/dashboard-lite/server.d.ts.map +1 -0
- package/build/src/dashboard-lite/server.js +50 -0
- package/build/src/dashboard-lite/server.js.map +1 -0
- package/build/src/schemas/career-schema.d.ts +108 -0
- package/build/src/schemas/career-schema.d.ts.map +1 -1
- package/build/src/schemas/career-schema.js +43 -0
- package/build/src/schemas/career-schema.js.map +1 -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 +43 -0
- package/build/src/storage/file-store.d.ts.map +1 -1
- package/build/src/storage/file-store.js +133 -4
- package/build/src/storage/file-store.js.map +1 -1
- package/build/src/tools/career-kb.d.ts.map +1 -1
- package/build/src/tools/career-kb.js +120 -13
- package/build/src/tools/career-kb.js.map +1 -1
- package/build/src/tools/interview.d.ts.map +1 -1
- package/build/src/tools/interview.js +21 -4
- 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 +19 -2
- package/build/src/tools/opportunity.js.map +1 -1
- package/build/src/tools/pipeline.d.ts.map +1 -1
- package/build/src/tools/pipeline.js +105 -47
- package/build/src/tools/pipeline.js.map +1 -1
- package/build/src/tools/resume.d.ts.map +1 -1
- package/build/src/tools/resume.js +28 -4
- package/build/src/tools/resume.js.map +1 -1
- package/build/src/tools/signal-digest.d.ts +15 -0
- package/build/src/tools/signal-digest.d.ts.map +1 -0
- package/build/src/tools/signal-digest.js +45 -0
- package/build/src/tools/signal-digest.js.map +1 -0
- package/build/src/untrusted.d.ts +63 -0
- package/build/src/untrusted.d.ts.map +1 -0
- package/build/src/untrusted.js +83 -0
- package/build/src/untrusted.js.map +1 -0
- package/build/src/version.d.ts +23 -0
- package/build/src/version.d.ts.map +1 -0
- package/build/src/version.js +66 -0
- package/build/src/version.js.map +1 -0
- package/data/example/career/education.yaml +20 -0
- package/data/example/career/journal.yaml +56 -0
- package/data/example/career/projects.yaml +47 -0
- package/package.json +3 -13
|
@@ -83,6 +83,81 @@ export declare const Profile: z.ZodObject<{
|
|
|
83
83
|
openToRelocation: z.ZodDefault<z.ZodBoolean>;
|
|
84
84
|
noticePeriod: z.ZodOptional<z.ZodString>;
|
|
85
85
|
}, z.core.$strip>;
|
|
86
|
+
/**
|
|
87
|
+
* An append-only career signal captured from a real interaction — an interview
|
|
88
|
+
* that surfaced a recurring gap, an offer you weighed, a rejection and the
|
|
89
|
+
* pattern behind it. The journal is what lets the KB *accrue*: individually a
|
|
90
|
+
* line, collectively the shape of a career.
|
|
91
|
+
*
|
|
92
|
+
* Stored as its own section (`data/career/journal.yaml`) so it never disturbs
|
|
93
|
+
* the load-bearing profile/experience files and can be loaded fail-closed on
|
|
94
|
+
* the write path (see file-store `appendJournalEntry`).
|
|
95
|
+
*/
|
|
96
|
+
export declare const JournalEntry: z.ZodObject<{
|
|
97
|
+
id: z.ZodString;
|
|
98
|
+
date: z.ZodString;
|
|
99
|
+
type: z.ZodEnum<{
|
|
100
|
+
fit_signal: "fit_signal";
|
|
101
|
+
interview_insight: "interview_insight";
|
|
102
|
+
offer_reflection: "offer_reflection";
|
|
103
|
+
rejection_pattern: "rejection_pattern";
|
|
104
|
+
skill_evidence: "skill_evidence";
|
|
105
|
+
win: "win";
|
|
106
|
+
note: "note";
|
|
107
|
+
}>;
|
|
108
|
+
applicationId: z.ZodOptional<z.ZodString>;
|
|
109
|
+
company: z.ZodOptional<z.ZodString>;
|
|
110
|
+
role: z.ZodOptional<z.ZodString>;
|
|
111
|
+
summary: z.ZodString;
|
|
112
|
+
detail: z.ZodOptional<z.ZodString>;
|
|
113
|
+
signals: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
114
|
+
sentiment: z.ZodOptional<z.ZodEnum<{
|
|
115
|
+
positive: "positive";
|
|
116
|
+
neutral: "neutral";
|
|
117
|
+
hard: "hard";
|
|
118
|
+
}>>;
|
|
119
|
+
source: z.ZodDefault<z.ZodEnum<{
|
|
120
|
+
explore_opportunity: "explore_opportunity";
|
|
121
|
+
prepare_interview: "prepare_interview";
|
|
122
|
+
evaluate_offer: "evaluate_offer";
|
|
123
|
+
rejection: "rejection";
|
|
124
|
+
ingest_document: "ingest_document";
|
|
125
|
+
manual: "manual";
|
|
126
|
+
}>>;
|
|
127
|
+
}, z.core.$strip>;
|
|
128
|
+
/** The on-disk shape of `data/career/journal.yaml`: a flat, append-ordered list. */
|
|
129
|
+
export declare const JournalSection: z.ZodArray<z.ZodObject<{
|
|
130
|
+
id: z.ZodString;
|
|
131
|
+
date: z.ZodString;
|
|
132
|
+
type: z.ZodEnum<{
|
|
133
|
+
fit_signal: "fit_signal";
|
|
134
|
+
interview_insight: "interview_insight";
|
|
135
|
+
offer_reflection: "offer_reflection";
|
|
136
|
+
rejection_pattern: "rejection_pattern";
|
|
137
|
+
skill_evidence: "skill_evidence";
|
|
138
|
+
win: "win";
|
|
139
|
+
note: "note";
|
|
140
|
+
}>;
|
|
141
|
+
applicationId: z.ZodOptional<z.ZodString>;
|
|
142
|
+
company: z.ZodOptional<z.ZodString>;
|
|
143
|
+
role: z.ZodOptional<z.ZodString>;
|
|
144
|
+
summary: z.ZodString;
|
|
145
|
+
detail: z.ZodOptional<z.ZodString>;
|
|
146
|
+
signals: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
147
|
+
sentiment: z.ZodOptional<z.ZodEnum<{
|
|
148
|
+
positive: "positive";
|
|
149
|
+
neutral: "neutral";
|
|
150
|
+
hard: "hard";
|
|
151
|
+
}>>;
|
|
152
|
+
source: z.ZodDefault<z.ZodEnum<{
|
|
153
|
+
explore_opportunity: "explore_opportunity";
|
|
154
|
+
prepare_interview: "prepare_interview";
|
|
155
|
+
evaluate_offer: "evaluate_offer";
|
|
156
|
+
rejection: "rejection";
|
|
157
|
+
ingest_document: "ingest_document";
|
|
158
|
+
manual: "manual";
|
|
159
|
+
}>>;
|
|
160
|
+
}, z.core.$strip>>;
|
|
86
161
|
export declare const CareerData: z.ZodObject<{
|
|
87
162
|
profile: z.ZodObject<{
|
|
88
163
|
name: z.ZodString;
|
|
@@ -149,6 +224,38 @@ export declare const CareerData: z.ZodObject<{
|
|
|
149
224
|
date: z.ZodOptional<z.ZodString>;
|
|
150
225
|
context: z.ZodOptional<z.ZodString>;
|
|
151
226
|
}, z.core.$strip>>>;
|
|
227
|
+
journal: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
228
|
+
id: z.ZodString;
|
|
229
|
+
date: z.ZodString;
|
|
230
|
+
type: z.ZodEnum<{
|
|
231
|
+
fit_signal: "fit_signal";
|
|
232
|
+
interview_insight: "interview_insight";
|
|
233
|
+
offer_reflection: "offer_reflection";
|
|
234
|
+
rejection_pattern: "rejection_pattern";
|
|
235
|
+
skill_evidence: "skill_evidence";
|
|
236
|
+
win: "win";
|
|
237
|
+
note: "note";
|
|
238
|
+
}>;
|
|
239
|
+
applicationId: z.ZodOptional<z.ZodString>;
|
|
240
|
+
company: z.ZodOptional<z.ZodString>;
|
|
241
|
+
role: z.ZodOptional<z.ZodString>;
|
|
242
|
+
summary: z.ZodString;
|
|
243
|
+
detail: z.ZodOptional<z.ZodString>;
|
|
244
|
+
signals: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
245
|
+
sentiment: z.ZodOptional<z.ZodEnum<{
|
|
246
|
+
positive: "positive";
|
|
247
|
+
neutral: "neutral";
|
|
248
|
+
hard: "hard";
|
|
249
|
+
}>>;
|
|
250
|
+
source: z.ZodDefault<z.ZodEnum<{
|
|
251
|
+
explore_opportunity: "explore_opportunity";
|
|
252
|
+
prepare_interview: "prepare_interview";
|
|
253
|
+
evaluate_offer: "evaluate_offer";
|
|
254
|
+
rejection: "rejection";
|
|
255
|
+
ingest_document: "ingest_document";
|
|
256
|
+
manual: "manual";
|
|
257
|
+
}>>;
|
|
258
|
+
}, z.core.$strip>>>;
|
|
152
259
|
}, z.core.$strip>;
|
|
153
260
|
export declare const Contact: z.ZodObject<{
|
|
154
261
|
name: z.ZodString;
|
|
@@ -353,6 +460,7 @@ export type Project = z.infer<typeof Project>;
|
|
|
353
460
|
export type Testimonial = z.infer<typeof Testimonial>;
|
|
354
461
|
export type Achievement = z.infer<typeof Achievement>;
|
|
355
462
|
export type CareerData = z.infer<typeof CareerData>;
|
|
463
|
+
export type JournalEntry = z.infer<typeof JournalEntry>;
|
|
356
464
|
export type Application = z.infer<typeof Application>;
|
|
357
465
|
export type Pipeline = z.infer<typeof Pipeline>;
|
|
358
466
|
export type Contact = z.infer<typeof Contact>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"career-schema.d.ts","sourceRoot":"","sources":["../../../src/schemas/career-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;EAW5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAIlE,eAAO,MAAM,WAAW;;;;;iBAKtB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;iBAUrB,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;iBAMhB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;iBAOpB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;iBAQlB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;iBAMtB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;iBAiBlB,CAAC;AAEH,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"career-schema.d.ts","sourceRoot":"","sources":["../../../src/schemas/career-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;EAW5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAIlE,eAAO,MAAM,WAAW;;;;;iBAKtB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;iBAUrB,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;iBAMhB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;iBAOpB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;iBAQlB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;iBAMtB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;iBAiBlB,CAAC;AAIH;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2BvB,CAAC;AAEH,oFAAoF;AACpF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwB,CAAC;AAIpD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQrB,CAAC;AAIH,eAAO,MAAM,OAAO;;;;;;iBAMlB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;iBAMzB,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;;;;iBAShB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BtB,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGnB,CAAC;AAIH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAC9C,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;AAC1C,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAClD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAC9C,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAChD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAC9C,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC"}
|
|
@@ -79,6 +79,48 @@ export const Profile = z.object({
|
|
|
79
79
|
openToRelocation: z.boolean().default(false),
|
|
80
80
|
noticePeriod: z.string().optional().describe("e.g. '2 weeks', 'immediately'"),
|
|
81
81
|
});
|
|
82
|
+
// ─── Career Journal ─────────────────────────────────────────────────────────────
|
|
83
|
+
/**
|
|
84
|
+
* An append-only career signal captured from a real interaction — an interview
|
|
85
|
+
* that surfaced a recurring gap, an offer you weighed, a rejection and the
|
|
86
|
+
* pattern behind it. The journal is what lets the KB *accrue*: individually a
|
|
87
|
+
* line, collectively the shape of a career.
|
|
88
|
+
*
|
|
89
|
+
* Stored as its own section (`data/career/journal.yaml`) so it never disturbs
|
|
90
|
+
* the load-bearing profile/experience files and can be loaded fail-closed on
|
|
91
|
+
* the write path (see file-store `appendJournalEntry`).
|
|
92
|
+
*/
|
|
93
|
+
export const JournalEntry = z.object({
|
|
94
|
+
id: z.string(),
|
|
95
|
+
date: z.string().describe("ISO timestamp of when the signal was captured"),
|
|
96
|
+
type: z.enum([
|
|
97
|
+
"fit_signal", // how well a role/company fit — what matched, what gapped
|
|
98
|
+
"interview_insight", // what a round surfaced: questions, what landed, what to sharpen
|
|
99
|
+
"offer_reflection", // what mattered when weighing an offer; the tradeoffs
|
|
100
|
+
"rejection_pattern", // stage reached, stated reason, the pattern behind it
|
|
101
|
+
"skill_evidence", // fresh proof of a skill (review, shipped project, praise)
|
|
102
|
+
"win", // something that went well and is worth remembering
|
|
103
|
+
"note", // freeform
|
|
104
|
+
]),
|
|
105
|
+
applicationId: z.string().optional().describe("Links to a pipeline Application.id"),
|
|
106
|
+
company: z.string().optional(),
|
|
107
|
+
role: z.string().optional(),
|
|
108
|
+
summary: z.string().describe("One-line durable takeaway — the thing worth keeping"),
|
|
109
|
+
detail: z.string().optional().describe("Longer context, if useful"),
|
|
110
|
+
signals: z.array(z.string()).default([]).describe("Recurring strengths, gaps, or keywords to track over time"),
|
|
111
|
+
sentiment: z.enum(["positive", "neutral", "hard"]).optional().describe("Honest emotional read — 'hard' is a first-class, valid value"),
|
|
112
|
+
source: z.enum([
|
|
113
|
+
"explore_opportunity",
|
|
114
|
+
"prepare_interview",
|
|
115
|
+
"evaluate_offer",
|
|
116
|
+
"rejection",
|
|
117
|
+
"ingest_document",
|
|
118
|
+
"manual",
|
|
119
|
+
]).default("manual").describe("Which surface produced this entry"),
|
|
120
|
+
});
|
|
121
|
+
/** The on-disk shape of `data/career/journal.yaml`: a flat, append-ordered list. */
|
|
122
|
+
export const JournalSection = z.array(JournalEntry);
|
|
123
|
+
// ─── Career Data (SSOT) ─────────────────────────────────────────────────────────
|
|
82
124
|
export const CareerData = z.object({
|
|
83
125
|
profile: Profile,
|
|
84
126
|
experience: z.array(Experience).default([]),
|
|
@@ -86,6 +128,7 @@ export const CareerData = z.object({
|
|
|
86
128
|
education: z.array(Education).default([]),
|
|
87
129
|
projects: z.array(Project).default([]),
|
|
88
130
|
testimonials: z.array(Testimonial).default([]),
|
|
131
|
+
journal: z.array(JournalEntry).default([]),
|
|
89
132
|
});
|
|
90
133
|
// ─── Pipeline ─────────────────────────────────────────────────────────────────
|
|
91
134
|
export const Contact = z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"career-schema.js","sourceRoot":"","sources":["../../../src/schemas/career-schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"career-schema.js","sourceRoot":"","sources":["../../../src/schemas/career-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,YAAY,IAAI,SAAS,CA8BxC"}
|
package/build/src/server.js
CHANGED
|
@@ -6,10 +6,13 @@ import { registerPipelineTools } from "./tools/pipeline.js";
|
|
|
6
6
|
import { registerInterviewTools } from "./tools/interview.js";
|
|
7
7
|
import { registerCareerKBTools } from "./tools/career-kb.js";
|
|
8
8
|
import { registerPrompts } from "./prompts/index.js";
|
|
9
|
+
import { PKG_VERSION } from "./version.js";
|
|
9
10
|
export function createServer() {
|
|
10
11
|
const server = new McpServer({
|
|
11
12
|
name: "career-compass",
|
|
12
|
-
|
|
13
|
+
// Resolved from package.json — never hardcode. A literal here drifts the
|
|
14
|
+
// moment the package is bumped, and the client has no way to notice.
|
|
15
|
+
version: PKG_VERSION,
|
|
13
16
|
});
|
|
14
17
|
// Resources — Career KB + Pipeline
|
|
15
18
|
registerCareerResources(server);
|
package/build/src/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,yEAAyE;QACzE,qEAAqE;QACrE,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;IAEH,mCAAmC;IACnC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAEhC,+BAA+B;IAC/B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEjC,+BAA+B;IAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,sCAAsC;IACtC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,4BAA4B;IAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/B,+BAA+B;IAC/B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,iCAAiC;IACjC,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CareerData, Pipeline } from "../schemas/career-schema.js";
|
|
2
|
+
import type { JournalEntry } from "../schemas/career-schema.js";
|
|
2
3
|
/**
|
|
3
4
|
* Thrown when a data file exists on disk but cannot be parsed or fails schema
|
|
4
5
|
* validation. This is the fail-closed signal: callers MUST NOT proceed to
|
|
@@ -14,9 +15,51 @@ export declare class CorruptDataError extends Error {
|
|
|
14
15
|
constructor(filePath: string, cause?: unknown);
|
|
15
16
|
}
|
|
16
17
|
export declare function isCorruptDataError(e: unknown): e is CorruptDataError;
|
|
18
|
+
export declare function withDataLock<T>(key: string, fn: () => Promise<T>): Promise<T>;
|
|
17
19
|
export declare function loadCareerData(): Promise<CareerData | null>;
|
|
18
20
|
export declare function saveCareerSection(section: string, data: unknown): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Load the career journal.
|
|
23
|
+
*
|
|
24
|
+
* - Missing file → [] (normal empty state; the journal is optional).
|
|
25
|
+
* - Exists but invalid → throws CorruptDataError (fail closed).
|
|
26
|
+
*
|
|
27
|
+
* The fail-closed behavior is load-bearing for {@link appendJournalEntry}: an
|
|
28
|
+
* append must never silently start from [] on top of an unreadable file, or it
|
|
29
|
+
* would overwrite recoverable history with a single new entry.
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadJournal(): Promise<JournalEntry[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Append one entry to the journal and persist it (atomic write + .bak backup,
|
|
34
|
+
* via {@link atomicWriteYaml}). Returns the full updated list.
|
|
35
|
+
*
|
|
36
|
+
* Reads fail-closed first: if journal.yaml exists but is corrupt, this throws
|
|
37
|
+
* CorruptDataError rather than clobbering it.
|
|
38
|
+
*/
|
|
39
|
+
export declare function appendJournalEntry(entry: JournalEntry): Promise<JournalEntry[]>;
|
|
19
40
|
export declare function loadPipeline(): Promise<Pipeline>;
|
|
20
41
|
export declare function savePipeline(pipeline: Pipeline): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Run a read-modify-write cycle against the pipeline as one critical section.
|
|
44
|
+
*
|
|
45
|
+
* This is the only correct way to mutate the pipeline. `loadPipeline()` +
|
|
46
|
+
* mutate + `savePipeline()` written out by hand at a call site is exactly the
|
|
47
|
+
* bug this exists to prevent: the load and the save are two separate awaits, so
|
|
48
|
+
* a second call can slip in between and have its write overwritten wholesale.
|
|
49
|
+
*
|
|
50
|
+
* `mutator` receives the freshly-loaded pipeline, mutates it in place, and
|
|
51
|
+
* returns whatever the caller needs — handlers keep their ordinary return
|
|
52
|
+
* contract, including the no-op branches ("application not found"), rather than
|
|
53
|
+
* signalling through a thrown sentinel.
|
|
54
|
+
*
|
|
55
|
+
* The write is skipped when the mutator left the pipeline structurally
|
|
56
|
+
* unchanged. `savePipeline` stamps a fresh `lastUpdated` and `atomicWriteYaml`
|
|
57
|
+
* copies a full `.bak` on every call, so a no-op branch that wrote anyway would
|
|
58
|
+
* spend a backup and move the clock to record that nothing happened.
|
|
59
|
+
*
|
|
60
|
+
* A CorruptDataError from the load propagates untouched: nothing is written,
|
|
61
|
+
* so an unreadable file is never overwritten.
|
|
62
|
+
*/
|
|
63
|
+
export declare function mutatePipeline<T>(mutator: (pipeline: Pipeline) => T | Promise<T>): Promise<T>;
|
|
21
64
|
export declare function ensureDataDirs(): Promise<void>;
|
|
22
65
|
//# sourceMappingURL=file-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../../src/storage/file-store.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../../src/storage/file-store.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAkB,MAAM,6BAA6B,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBACb,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAU9C;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,gBAAgB,CAEpE;AA8BD,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAc7E;AAiFD,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA8CjE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrF;AAMD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAG3D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAWrF;AAID,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAgBtD;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAC9C,OAAO,CAAC,CAAC,CAAC,CAaZ;AAID,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpD"}
|
|
@@ -4,7 +4,7 @@ import { join, dirname, basename } from "path";
|
|
|
4
4
|
import { homedir } from "os";
|
|
5
5
|
import { randomUUID } from "crypto";
|
|
6
6
|
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
7
|
-
import { CareerData, Pipeline } from "../schemas/career-schema.js";
|
|
7
|
+
import { CareerData, Pipeline, JournalSection } from "../schemas/career-schema.js";
|
|
8
8
|
// ─── Typed errors ─────────────────────────────────────────────────────────────
|
|
9
9
|
/**
|
|
10
10
|
* Thrown when a data file exists on disk but cannot be parsed or fails schema
|
|
@@ -30,6 +30,41 @@ export class CorruptDataError extends Error {
|
|
|
30
30
|
export function isCorruptDataError(e) {
|
|
31
31
|
return e instanceof CorruptDataError;
|
|
32
32
|
}
|
|
33
|
+
// ─── Write serialization ──────────────────────────────────────────────────────
|
|
34
|
+
/**
|
|
35
|
+
* One promise chain per data file. Everything that mutates a file runs inside
|
|
36
|
+
* `withDataLock` for that file's path, so read-modify-write cycles never
|
|
37
|
+
* interleave.
|
|
38
|
+
*
|
|
39
|
+
* This is a different guarantee from the atomic rename in
|
|
40
|
+
* {@link atomicWriteYaml}. Atomic *writes* stop a reader from ever seeing a
|
|
41
|
+
* half-written file. They do nothing about two overlapping read-modify-write
|
|
42
|
+
* cycles: both load the same snapshot, both mutate their own copy, both write,
|
|
43
|
+
* and whichever renames last wins outright. That is not a theoretical race —
|
|
44
|
+
* an MCP client may dispatch several `tools/call` requests before any resolves
|
|
45
|
+
* (the SDK's stdio transport drains a whole chunk synchronously and dispatches
|
|
46
|
+
* each without awaiting the previous), which is exactly what happens when a
|
|
47
|
+
* user says "add both of these jobs." Before this lock, eight concurrent adds
|
|
48
|
+
* left one application on disk and reported eight successes.
|
|
49
|
+
*
|
|
50
|
+
* Keyed by resolved absolute path rather than by a logical name because
|
|
51
|
+
* `CAREER_DATA_PATH` is read at call time — two different data dirs are
|
|
52
|
+
* genuinely independent and should not serialize against each other.
|
|
53
|
+
*
|
|
54
|
+
* In-process only, which is the right scope: the MCP server is the single
|
|
55
|
+
* writer for a given data dir. It is not a defense against two servers pointed
|
|
56
|
+
* at one directory, and does not claim to be.
|
|
57
|
+
*/
|
|
58
|
+
const writeChains = new Map();
|
|
59
|
+
export function withDataLock(key, fn) {
|
|
60
|
+
const previous = writeChains.get(key) ?? Promise.resolve();
|
|
61
|
+
// Run on both settle paths: one caller's failure must not wedge the chain.
|
|
62
|
+
const run = previous.then(fn, fn);
|
|
63
|
+
// Store a never-rejecting tail so an unhandled rejection can't escape here;
|
|
64
|
+
// `run` itself still rejects to the caller.
|
|
65
|
+
writeChains.set(key, run.then(() => undefined, () => undefined));
|
|
66
|
+
return run;
|
|
67
|
+
}
|
|
33
68
|
// ─── Path resolution ──────────────────────────────────────────────────────────
|
|
34
69
|
function getDataDir() {
|
|
35
70
|
return process.env.CAREER_DATA_PATH ?? join(homedir(), ".career-compass");
|
|
@@ -76,7 +111,31 @@ async function atomicWriteYaml(filePath, data) {
|
|
|
76
111
|
const tmpPath = join(dir, `.${basename(filePath)}.${randomUUID()}.tmp`);
|
|
77
112
|
const serialized = stringifyYaml(data, { lineWidth: 120 });
|
|
78
113
|
await writeFile(tmpPath, serialized, "utf-8");
|
|
79
|
-
await
|
|
114
|
+
await renameWithRetry(tmpPath, filePath);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* rename(), with a short retry on the transient Windows failures.
|
|
118
|
+
*
|
|
119
|
+
* On Windows a rename over an existing file fails with EPERM/EBUSY/EACCES if
|
|
120
|
+
* anything holds a handle on the destination for even a moment — an indexer, a
|
|
121
|
+
* virus scanner, or the dashboard reading the file. POSIX rename has no such
|
|
122
|
+
* behavior, so this never fires on macOS/Linux. Without it, the failure surfaced
|
|
123
|
+
* to the user as a raw Node error string containing an absolute temp path.
|
|
124
|
+
*/
|
|
125
|
+
async function renameWithRetry(from, to, attempts = 5) {
|
|
126
|
+
for (let i = 0;; i++) {
|
|
127
|
+
try {
|
|
128
|
+
await rename(from, to);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
const code = error.code;
|
|
133
|
+
const transient = code === "EPERM" || code === "EBUSY" || code === "EACCES";
|
|
134
|
+
if (!transient || i >= attempts - 1)
|
|
135
|
+
throw error;
|
|
136
|
+
await new Promise((r) => setTimeout(r, 15 * 2 ** i));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
80
139
|
}
|
|
81
140
|
// ─── Career data ──────────────────────────────────────────────────────────────
|
|
82
141
|
export async function loadCareerData() {
|
|
@@ -88,7 +147,7 @@ export async function loadCareerData() {
|
|
|
88
147
|
return null;
|
|
89
148
|
// Load each section and merge
|
|
90
149
|
const raw = {};
|
|
91
|
-
const sections = ["profile", "experience", "skills", "education", "projects", "testimonials"];
|
|
150
|
+
const sections = ["profile", "experience", "skills", "education", "projects", "testimonials", "journal"];
|
|
92
151
|
await Promise.all(sections.map(async (section) => {
|
|
93
152
|
const path = join(dir, `${section}.yaml`);
|
|
94
153
|
if (!existsSync(path)) {
|
|
@@ -130,7 +189,42 @@ export async function loadCareerData() {
|
|
|
130
189
|
}
|
|
131
190
|
export async function saveCareerSection(section, data) {
|
|
132
191
|
const path = join(careerDir(), `${section}.yaml`);
|
|
133
|
-
await atomicWriteYaml(path, data);
|
|
192
|
+
await withDataLock(path, () => atomicWriteYaml(path, data));
|
|
193
|
+
}
|
|
194
|
+
// ─── Career journal (append-only signals) ──────────────────────────────────────
|
|
195
|
+
function journalPath() { return join(careerDir(), "journal.yaml"); }
|
|
196
|
+
/**
|
|
197
|
+
* Load the career journal.
|
|
198
|
+
*
|
|
199
|
+
* - Missing file → [] (normal empty state; the journal is optional).
|
|
200
|
+
* - Exists but invalid → throws CorruptDataError (fail closed).
|
|
201
|
+
*
|
|
202
|
+
* The fail-closed behavior is load-bearing for {@link appendJournalEntry}: an
|
|
203
|
+
* append must never silently start from [] on top of an unreadable file, or it
|
|
204
|
+
* would overwrite recoverable history with a single new entry.
|
|
205
|
+
*/
|
|
206
|
+
export async function loadJournal() {
|
|
207
|
+
const parsed = await readYaml(journalPath(), JournalSection);
|
|
208
|
+
return parsed ?? [];
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Append one entry to the journal and persist it (atomic write + .bak backup,
|
|
212
|
+
* via {@link atomicWriteYaml}). Returns the full updated list.
|
|
213
|
+
*
|
|
214
|
+
* Reads fail-closed first: if journal.yaml exists but is corrupt, this throws
|
|
215
|
+
* CorruptDataError rather than clobbering it.
|
|
216
|
+
*/
|
|
217
|
+
export async function appendJournalEntry(entry) {
|
|
218
|
+
const path = journalPath();
|
|
219
|
+
return withDataLock(path, async () => {
|
|
220
|
+
// The read MUST be inside the lock. Loading outside it means two concurrent
|
|
221
|
+
// appends both start from the same list and the second write drops the
|
|
222
|
+
// first entry — with both calls reporting success.
|
|
223
|
+
const existing = await loadJournal();
|
|
224
|
+
const next = [...existing, entry];
|
|
225
|
+
await atomicWriteYaml(path, next);
|
|
226
|
+
return next;
|
|
227
|
+
});
|
|
134
228
|
}
|
|
135
229
|
// ─── Pipeline ─────────────────────────────────────────────────────────────────
|
|
136
230
|
export async function loadPipeline() {
|
|
@@ -155,6 +249,41 @@ export async function savePipeline(pipeline) {
|
|
|
155
249
|
const path = join(pipelineDir(), "applications.yaml");
|
|
156
250
|
await atomicWriteYaml(path, { ...pipeline, lastUpdated: new Date().toISOString() });
|
|
157
251
|
}
|
|
252
|
+
/**
|
|
253
|
+
* Run a read-modify-write cycle against the pipeline as one critical section.
|
|
254
|
+
*
|
|
255
|
+
* This is the only correct way to mutate the pipeline. `loadPipeline()` +
|
|
256
|
+
* mutate + `savePipeline()` written out by hand at a call site is exactly the
|
|
257
|
+
* bug this exists to prevent: the load and the save are two separate awaits, so
|
|
258
|
+
* a second call can slip in between and have its write overwritten wholesale.
|
|
259
|
+
*
|
|
260
|
+
* `mutator` receives the freshly-loaded pipeline, mutates it in place, and
|
|
261
|
+
* returns whatever the caller needs — handlers keep their ordinary return
|
|
262
|
+
* contract, including the no-op branches ("application not found"), rather than
|
|
263
|
+
* signalling through a thrown sentinel.
|
|
264
|
+
*
|
|
265
|
+
* The write is skipped when the mutator left the pipeline structurally
|
|
266
|
+
* unchanged. `savePipeline` stamps a fresh `lastUpdated` and `atomicWriteYaml`
|
|
267
|
+
* copies a full `.bak` on every call, so a no-op branch that wrote anyway would
|
|
268
|
+
* spend a backup and move the clock to record that nothing happened.
|
|
269
|
+
*
|
|
270
|
+
* A CorruptDataError from the load propagates untouched: nothing is written,
|
|
271
|
+
* so an unreadable file is never overwritten.
|
|
272
|
+
*/
|
|
273
|
+
export async function mutatePipeline(mutator) {
|
|
274
|
+
const path = join(pipelineDir(), "applications.yaml");
|
|
275
|
+
return withDataLock(path, async () => {
|
|
276
|
+
const pipeline = await loadPipeline();
|
|
277
|
+
// `lastUpdated` is rewritten on every save, so comparing it would make the
|
|
278
|
+
// dirty check always true. Compare only the applications.
|
|
279
|
+
const before = JSON.stringify(pipeline.applications);
|
|
280
|
+
const result = await mutator(pipeline);
|
|
281
|
+
if (JSON.stringify(pipeline.applications) !== before) {
|
|
282
|
+
await savePipeline(pipeline);
|
|
283
|
+
}
|
|
284
|
+
return result;
|
|
285
|
+
});
|
|
286
|
+
}
|
|
158
287
|
// ─── Initialization ───────────────────────────────────────────────────────────
|
|
159
288
|
export async function ensureDataDirs() {
|
|
160
289
|
await mkdir(careerDir(), { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../../src/storage/file-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../../src/storage/file-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"career-kb.d.ts","sourceRoot":"","sources":["../../../src/tools/career-kb.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"career-kb.d.ts","sourceRoot":"","sources":["../../../src/tools/career-kb.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6Q7D"}
|