career-compass-mcp 2.0.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/LICENSE +21 -0
- package/README.md +340 -0
- package/build/bin/cli.d.ts +9 -0
- package/build/bin/cli.d.ts.map +1 -0
- package/build/bin/cli.js +134 -0
- package/build/bin/cli.js.map +1 -0
- package/build/src/index.d.ts +3 -0
- package/build/src/index.d.ts.map +1 -0
- package/build/src/index.js +18 -0
- package/build/src/index.js.map +1 -0
- package/build/src/prompts/index.d.ts +3 -0
- package/build/src/prompts/index.d.ts.map +1 -0
- package/build/src/prompts/index.js +122 -0
- package/build/src/prompts/index.js.map +1 -0
- package/build/src/resources/career-kb.d.ts +3 -0
- package/build/src/resources/career-kb.d.ts.map +1 -0
- package/build/src/resources/career-kb.js +143 -0
- package/build/src/resources/career-kb.js.map +1 -0
- package/build/src/schemas/career-schema.d.ts +361 -0
- package/build/src/schemas/career-schema.d.ts.map +1 -0
- package/build/src/schemas/career-schema.js +146 -0
- package/build/src/schemas/career-schema.js.map +1 -0
- package/build/src/server.d.ts +3 -0
- package/build/src/server.d.ts.map +1 -0
- package/build/src/server.js +30 -0
- package/build/src/server.js.map +1 -0
- package/build/src/storage/file-store.d.ts +22 -0
- package/build/src/storage/file-store.d.ts.map +1 -0
- package/build/src/storage/file-store.js +163 -0
- package/build/src/storage/file-store.js.map +1 -0
- package/build/src/tools/career-kb.d.ts +3 -0
- package/build/src/tools/career-kb.d.ts.map +1 -0
- package/build/src/tools/career-kb.js +148 -0
- package/build/src/tools/career-kb.js.map +1 -0
- package/build/src/tools/interview.d.ts +3 -0
- package/build/src/tools/interview.d.ts.map +1 -0
- package/build/src/tools/interview.js +194 -0
- package/build/src/tools/interview.js.map +1 -0
- package/build/src/tools/opportunity.d.ts +3 -0
- package/build/src/tools/opportunity.d.ts.map +1 -0
- package/build/src/tools/opportunity.js +137 -0
- package/build/src/tools/opportunity.js.map +1 -0
- package/build/src/tools/pipeline.d.ts +11 -0
- package/build/src/tools/pipeline.d.ts.map +1 -0
- package/build/src/tools/pipeline.js +295 -0
- package/build/src/tools/pipeline.js.map +1 -0
- package/build/src/tools/resume.d.ts +3 -0
- package/build/src/tools/resume.d.ts.map +1 -0
- package/build/src/tools/resume.js +222 -0
- package/build/src/tools/resume.js.map +1 -0
- package/build/src/types/tool-args.d.ts +52 -0
- package/build/src/types/tool-args.d.ts.map +1 -0
- package/build/src/types/tool-args.js +2 -0
- package/build/src/types/tool-args.js.map +1 -0
- package/data/example/career/experience.yaml +67 -0
- package/data/example/career/profile.yaml +31 -0
- package/data/example/career/skills.yaml +71 -0
- package/data/example/career/testimonials.yaml +26 -0
- package/data/example/pipeline/applications.yaml +312 -0
- package/package.json +82 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ─── Application Status ────────────────────────────────────────────────────────
|
|
3
|
+
export const ApplicationStatus = z.enum([
|
|
4
|
+
"discovered",
|
|
5
|
+
"applied",
|
|
6
|
+
"screening",
|
|
7
|
+
"interviewing",
|
|
8
|
+
"offer",
|
|
9
|
+
"negotiating",
|
|
10
|
+
"accepted",
|
|
11
|
+
"rejected",
|
|
12
|
+
"withdrawn",
|
|
13
|
+
"ghosted",
|
|
14
|
+
]);
|
|
15
|
+
// ─── Career Data ───────────────────────────────────────────────────────────────
|
|
16
|
+
export const Achievement = z.object({
|
|
17
|
+
metric: z.string().describe("Quantifiable outcome, e.g. 'reduced latency 40%'"),
|
|
18
|
+
context: z.string().describe("What the situation/task was"),
|
|
19
|
+
impact: z.string().describe("Why it mattered to the org"),
|
|
20
|
+
keywords: z.array(z.string()).default([]).describe("ATS-friendly keywords"),
|
|
21
|
+
});
|
|
22
|
+
export const Experience = z.object({
|
|
23
|
+
role: z.string(),
|
|
24
|
+
company: z.string(),
|
|
25
|
+
industry: z.string().optional(),
|
|
26
|
+
location: z.string().optional(),
|
|
27
|
+
startDate: z.string().describe("YYYY-MM or 'present'"),
|
|
28
|
+
endDate: z.string().describe("YYYY-MM or 'present'"),
|
|
29
|
+
summary: z.string().optional(),
|
|
30
|
+
achievements: z.array(Achievement).default([]),
|
|
31
|
+
tags: z.array(z.string()).default([]).describe("Searchable tags"),
|
|
32
|
+
});
|
|
33
|
+
export const Skill = z.object({
|
|
34
|
+
name: z.string(),
|
|
35
|
+
category: z.string().describe("e.g. 'Leadership', 'Technical', 'Domain'"),
|
|
36
|
+
proficiency: z.number().min(1).max(5).optional(),
|
|
37
|
+
yearsUsed: z.number().optional(),
|
|
38
|
+
lastUsed: z.string().optional().describe("YYYY or 'current'"),
|
|
39
|
+
});
|
|
40
|
+
export const Education = z.object({
|
|
41
|
+
degree: z.string(),
|
|
42
|
+
institution: z.string(),
|
|
43
|
+
date: z.string().describe("YYYY or YYYY-MM"),
|
|
44
|
+
honors: z.string().optional(),
|
|
45
|
+
relevantCoursework: z.array(z.string()).default([]),
|
|
46
|
+
certifications: z.array(z.string()).default([]),
|
|
47
|
+
});
|
|
48
|
+
export const Project = z.object({
|
|
49
|
+
name: z.string(),
|
|
50
|
+
role: z.string(),
|
|
51
|
+
description: z.string(),
|
|
52
|
+
technologies: z.array(z.string()).default([]),
|
|
53
|
+
metrics: z.array(z.string()).default([]),
|
|
54
|
+
outcomes: z.array(z.string()).default([]),
|
|
55
|
+
url: z.string().optional(),
|
|
56
|
+
});
|
|
57
|
+
export const Testimonial = z.object({
|
|
58
|
+
source: z.string().describe("Name and title of person"),
|
|
59
|
+
relationship: z.string().describe("e.g. 'Direct Manager', 'Peer'"),
|
|
60
|
+
quote: z.string(),
|
|
61
|
+
date: z.string().optional(),
|
|
62
|
+
context: z.string().optional().describe("What project/situation this is about"),
|
|
63
|
+
});
|
|
64
|
+
export const Profile = z.object({
|
|
65
|
+
name: z.string(),
|
|
66
|
+
email: z.string().optional(),
|
|
67
|
+
phone: z.string().optional(),
|
|
68
|
+
location: z.string().optional(),
|
|
69
|
+
linkedIn: z.string().optional(),
|
|
70
|
+
portfolio: z.string().optional(),
|
|
71
|
+
summary: z.string().describe("2-3 sentence professional summary"),
|
|
72
|
+
targetRoles: z.array(z.string()).default([]),
|
|
73
|
+
targetIndustries: z.array(z.string()).default([]),
|
|
74
|
+
targetCompanySize: z.array(z.string()).default([]).describe("e.g. 'startup', 'enterprise'"),
|
|
75
|
+
salaryMin: z.number().optional(),
|
|
76
|
+
salaryMax: z.number().optional(),
|
|
77
|
+
salaryCurrency: z.string().default("USD"),
|
|
78
|
+
openToRemote: z.boolean().default(true),
|
|
79
|
+
openToRelocation: z.boolean().default(false),
|
|
80
|
+
noticePeriod: z.string().optional().describe("e.g. '2 weeks', 'immediately'"),
|
|
81
|
+
});
|
|
82
|
+
export const CareerData = z.object({
|
|
83
|
+
profile: Profile,
|
|
84
|
+
experience: z.array(Experience).default([]),
|
|
85
|
+
skills: z.array(Skill).default([]),
|
|
86
|
+
education: z.array(Education).default([]),
|
|
87
|
+
projects: z.array(Project).default([]),
|
|
88
|
+
testimonials: z.array(Testimonial).default([]),
|
|
89
|
+
});
|
|
90
|
+
// ─── Pipeline ─────────────────────────────────────────────────────────────────
|
|
91
|
+
export const Contact = z.object({
|
|
92
|
+
name: z.string(),
|
|
93
|
+
title: z.string().optional(),
|
|
94
|
+
email: z.string().optional(),
|
|
95
|
+
linkedIn: z.string().optional(),
|
|
96
|
+
notes: z.string().optional(),
|
|
97
|
+
});
|
|
98
|
+
export const InterviewRound = z.object({
|
|
99
|
+
type: z.enum(["phone_screen", "behavioral", "technical", "panel", "final", "offer_call", "other"]),
|
|
100
|
+
date: z.string().optional(),
|
|
101
|
+
interviewers: z.array(z.string()).default([]),
|
|
102
|
+
notes: z.string().optional(),
|
|
103
|
+
outcome: z.string().optional(),
|
|
104
|
+
});
|
|
105
|
+
export const Offer = z.object({
|
|
106
|
+
baseSalary: z.number().optional(),
|
|
107
|
+
currency: z.string().default("USD"),
|
|
108
|
+
bonus: z.number().optional(),
|
|
109
|
+
equity: z.string().optional().describe("e.g. '0.1% over 4 years'"),
|
|
110
|
+
benefits: z.array(z.string()).default([]),
|
|
111
|
+
startDate: z.string().optional(),
|
|
112
|
+
expiresDate: z.string().optional(),
|
|
113
|
+
notes: z.string().optional(),
|
|
114
|
+
});
|
|
115
|
+
export const Application = z.object({
|
|
116
|
+
id: z.string(),
|
|
117
|
+
company: z.string(),
|
|
118
|
+
role: z.string(),
|
|
119
|
+
department: z.string().optional(),
|
|
120
|
+
industry: z.string().optional(),
|
|
121
|
+
location: z.string().optional(),
|
|
122
|
+
remote: z.enum(["remote", "hybrid", "onsite", "unknown"]).default("unknown"),
|
|
123
|
+
postingUrl: z.string().optional(),
|
|
124
|
+
postingText: z.string().optional().describe("Full job posting text, cached"),
|
|
125
|
+
status: ApplicationStatus,
|
|
126
|
+
dateDiscovered: z.string().optional(),
|
|
127
|
+
dateApplied: z.string().optional(),
|
|
128
|
+
dateUpdated: z.string(),
|
|
129
|
+
contacts: z.array(Contact).default([]),
|
|
130
|
+
interviewRounds: z.array(InterviewRound).default([]),
|
|
131
|
+
offer: Offer.optional(),
|
|
132
|
+
salaryRange: z.object({ min: z.number().optional(), max: z.number().optional(), currency: z.string().default("USD") }).optional(),
|
|
133
|
+
notes: z.array(z.string()).default([]),
|
|
134
|
+
tailoredResumeVersion: z.string().optional(),
|
|
135
|
+
coverLetterGenerated: z.boolean().default(false),
|
|
136
|
+
followUpDue: z.string().optional().describe("ISO date when follow-up is needed"),
|
|
137
|
+
priority: z.enum(["high", "medium", "low"]).default("medium"),
|
|
138
|
+
source: z.string().optional().describe("e.g. 'LinkedIn', 'Referral', 'Company site'"),
|
|
139
|
+
referral: z.string().optional(),
|
|
140
|
+
excitement: z.number().min(1).max(10).optional().describe("Personal excitement score"),
|
|
141
|
+
});
|
|
142
|
+
export const Pipeline = z.object({
|
|
143
|
+
applications: z.array(Application).default([]),
|
|
144
|
+
lastUpdated: z.string(),
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=career-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"career-schema.js","sourceRoot":"","sources":["../../../src/schemas/career-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,wBAAgB,YAAY,IAAI,SAAS,CA4BxC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { registerCareerResources } from "./resources/career-kb.js";
|
|
3
|
+
import { registerOpportunityTools } from "./tools/opportunity.js";
|
|
4
|
+
import { registerResumeTools } from "./tools/resume.js";
|
|
5
|
+
import { registerPipelineTools } from "./tools/pipeline.js";
|
|
6
|
+
import { registerInterviewTools } from "./tools/interview.js";
|
|
7
|
+
import { registerCareerKBTools } from "./tools/career-kb.js";
|
|
8
|
+
import { registerPrompts } from "./prompts/index.js";
|
|
9
|
+
export function createServer() {
|
|
10
|
+
const server = new McpServer({
|
|
11
|
+
name: "career-compass",
|
|
12
|
+
version: "2.0.0",
|
|
13
|
+
});
|
|
14
|
+
// Resources — Career KB + Pipeline
|
|
15
|
+
registerCareerResources(server);
|
|
16
|
+
// Tools — Discovery & Research
|
|
17
|
+
registerOpportunityTools(server);
|
|
18
|
+
// Tools — Resume & Application
|
|
19
|
+
registerResumeTools(server);
|
|
20
|
+
// Tools — Pipeline Management & Email
|
|
21
|
+
registerPipelineTools(server);
|
|
22
|
+
// Tools — Interview & Offer
|
|
23
|
+
registerInterviewTools(server);
|
|
24
|
+
// Tools — Career KB Management
|
|
25
|
+
registerCareerKBTools(server);
|
|
26
|
+
// Prompts — Power user shortcuts
|
|
27
|
+
registerPrompts(server);
|
|
28
|
+
return server;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +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;AAErD,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB,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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CareerData, Pipeline } from "../schemas/career-schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* Thrown when a data file exists on disk but cannot be parsed or fails schema
|
|
4
|
+
* validation. This is the fail-closed signal: callers MUST NOT proceed to
|
|
5
|
+
* mutate/overwrite the store, because doing so would replace recoverable
|
|
6
|
+
* (but currently invalid) user data with empty/fallback data — silent loss.
|
|
7
|
+
*
|
|
8
|
+
* A *missing* file is NOT an error: that is the normal "empty store" state and
|
|
9
|
+
* the loaders return empty/null for it.
|
|
10
|
+
*/
|
|
11
|
+
export declare class CorruptDataError extends Error {
|
|
12
|
+
readonly filePath: string;
|
|
13
|
+
readonly cause?: unknown;
|
|
14
|
+
constructor(filePath: string, cause?: unknown);
|
|
15
|
+
}
|
|
16
|
+
export declare function isCorruptDataError(e: unknown): e is CorruptDataError;
|
|
17
|
+
export declare function loadCareerData(): Promise<CareerData | null>;
|
|
18
|
+
export declare function saveCareerSection(section: string, data: unknown): Promise<void>;
|
|
19
|
+
export declare function loadPipeline(): Promise<Pipeline>;
|
|
20
|
+
export declare function savePipeline(pipeline: Pipeline): Promise<void>;
|
|
21
|
+
export declare function ensureDataDirs(): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=file-store.d.ts.map
|
|
@@ -0,0 +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;AAKnE;;;;;;;;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;AA0DD,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;AAID,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAgBtD;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE;AAID,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, rename, copyFile } from "fs/promises";
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
import { join, dirname, basename } from "path";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
import { randomUUID } from "crypto";
|
|
6
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
7
|
+
import { CareerData, Pipeline } from "../schemas/career-schema.js";
|
|
8
|
+
// ─── Typed errors ─────────────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Thrown when a data file exists on disk but cannot be parsed or fails schema
|
|
11
|
+
* validation. This is the fail-closed signal: callers MUST NOT proceed to
|
|
12
|
+
* mutate/overwrite the store, because doing so would replace recoverable
|
|
13
|
+
* (but currently invalid) user data with empty/fallback data — silent loss.
|
|
14
|
+
*
|
|
15
|
+
* A *missing* file is NOT an error: that is the normal "empty store" state and
|
|
16
|
+
* the loaders return empty/null for it.
|
|
17
|
+
*/
|
|
18
|
+
export class CorruptDataError extends Error {
|
|
19
|
+
filePath;
|
|
20
|
+
cause;
|
|
21
|
+
constructor(filePath, cause) {
|
|
22
|
+
super(`Data file exists but is unreadable or invalid: ${filePath}. ` +
|
|
23
|
+
`Refusing to continue so it cannot be overwritten. ` +
|
|
24
|
+
`Fix the file or restore a .bak backup, then retry.`);
|
|
25
|
+
this.name = "CorruptDataError";
|
|
26
|
+
this.filePath = filePath;
|
|
27
|
+
this.cause = cause;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function isCorruptDataError(e) {
|
|
31
|
+
return e instanceof CorruptDataError;
|
|
32
|
+
}
|
|
33
|
+
// ─── Path resolution ──────────────────────────────────────────────────────────
|
|
34
|
+
function getDataDir() {
|
|
35
|
+
return process.env.CAREER_DATA_PATH ?? join(homedir(), ".career-compass");
|
|
36
|
+
}
|
|
37
|
+
function careerDir() { return join(getDataDir(), "career"); }
|
|
38
|
+
function pipelineDir() { return join(getDataDir(), "pipeline"); }
|
|
39
|
+
// ─── YAML helpers ─────────────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Read + parse + validate a YAML file.
|
|
42
|
+
*
|
|
43
|
+
* - Missing file → returns null (normal empty state).
|
|
44
|
+
* - Exists but invalid → throws CorruptDataError (fail closed).
|
|
45
|
+
*/
|
|
46
|
+
async function readYaml(filePath, schema) {
|
|
47
|
+
if (!existsSync(filePath))
|
|
48
|
+
return null;
|
|
49
|
+
try {
|
|
50
|
+
const raw = await readFile(filePath, "utf-8");
|
|
51
|
+
const parsed = parseYaml(raw);
|
|
52
|
+
return schema.parse(parsed);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`Failed to parse ${filePath}:`, error);
|
|
56
|
+
throw new CorruptDataError(filePath, error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Back up (if the target exists) then write atomically.
|
|
61
|
+
*
|
|
62
|
+
* 1. If the destination already exists, copy it to a timestamped `.bak` so a
|
|
63
|
+
* bad write is always recoverable.
|
|
64
|
+
* 2. Write to a unique temp file in the same directory, then rename it over the
|
|
65
|
+
* destination. rename() is atomic on the same filesystem, so a reader never
|
|
66
|
+
* observes a half-written file.
|
|
67
|
+
*/
|
|
68
|
+
async function atomicWriteYaml(filePath, data) {
|
|
69
|
+
const dir = dirname(filePath);
|
|
70
|
+
await mkdir(dir, { recursive: true });
|
|
71
|
+
if (existsSync(filePath)) {
|
|
72
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
73
|
+
const backupPath = join(dir, `${basename(filePath)}.${stamp}.bak`);
|
|
74
|
+
await copyFile(filePath, backupPath);
|
|
75
|
+
}
|
|
76
|
+
const tmpPath = join(dir, `.${basename(filePath)}.${randomUUID()}.tmp`);
|
|
77
|
+
const serialized = stringifyYaml(data, { lineWidth: 120 });
|
|
78
|
+
await writeFile(tmpPath, serialized, "utf-8");
|
|
79
|
+
await rename(tmpPath, filePath);
|
|
80
|
+
}
|
|
81
|
+
// ─── Career data ──────────────────────────────────────────────────────────────
|
|
82
|
+
export async function loadCareerData() {
|
|
83
|
+
const dir = careerDir();
|
|
84
|
+
if (!existsSync(dir))
|
|
85
|
+
return null;
|
|
86
|
+
const profilePath = join(dir, "profile.yaml");
|
|
87
|
+
if (!existsSync(profilePath))
|
|
88
|
+
return null;
|
|
89
|
+
// Load each section and merge
|
|
90
|
+
const raw = {};
|
|
91
|
+
const sections = ["profile", "experience", "skills", "education", "projects", "testimonials"];
|
|
92
|
+
await Promise.all(sections.map(async (section) => {
|
|
93
|
+
const path = join(dir, `${section}.yaml`);
|
|
94
|
+
if (!existsSync(path)) {
|
|
95
|
+
if (section !== "profile")
|
|
96
|
+
raw[section] = [];
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
let parsed;
|
|
100
|
+
try {
|
|
101
|
+
const content = await readFile(path, "utf-8");
|
|
102
|
+
parsed = parseYaml(content);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error(`Failed to parse ${section}.yaml:`, error);
|
|
106
|
+
// The profile is required and load-bearing: a corrupt profile must fail
|
|
107
|
+
// closed so it can't be overwritten. Optional sections degrade to empty.
|
|
108
|
+
if (section === "profile") {
|
|
109
|
+
throw new CorruptDataError(path, error);
|
|
110
|
+
}
|
|
111
|
+
raw[section] = [];
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (section === "profile") {
|
|
115
|
+
raw.profile = parsed;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
raw[section] = Array.isArray(parsed) ? parsed : (parsed?.[section] ?? []);
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
try {
|
|
122
|
+
return CareerData.parse(raw);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
console.error("Career data validation failed:", error);
|
|
126
|
+
// Files exist (profile is present) but the merged document is schema-invalid.
|
|
127
|
+
// Fail closed rather than returning null, which a caller could overwrite.
|
|
128
|
+
throw new CorruptDataError(profilePath, error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export async function saveCareerSection(section, data) {
|
|
132
|
+
const path = join(careerDir(), `${section}.yaml`);
|
|
133
|
+
await atomicWriteYaml(path, data);
|
|
134
|
+
}
|
|
135
|
+
// ─── Pipeline ─────────────────────────────────────────────────────────────────
|
|
136
|
+
export async function loadPipeline() {
|
|
137
|
+
const path = join(pipelineDir(), "applications.yaml");
|
|
138
|
+
if (!existsSync(path)) {
|
|
139
|
+
return { applications: [], lastUpdated: new Date().toISOString() };
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const raw = await readFile(path, "utf-8");
|
|
143
|
+
const parsed = parseYaml(raw);
|
|
144
|
+
return Pipeline.parse(parsed);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error("Failed to parse pipeline:", error);
|
|
148
|
+
// The file exists but is unreadable/invalid. Fail closed: returning an
|
|
149
|
+
// empty pipeline here would let a subsequent savePipeline() destroy the
|
|
150
|
+
// user's real (recoverable) applications.yaml.
|
|
151
|
+
throw new CorruptDataError(path, error);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export async function savePipeline(pipeline) {
|
|
155
|
+
const path = join(pipelineDir(), "applications.yaml");
|
|
156
|
+
await atomicWriteYaml(path, { ...pipeline, lastUpdated: new Date().toISOString() });
|
|
157
|
+
}
|
|
158
|
+
// ─── Initialization ───────────────────────────────────────────────────────────
|
|
159
|
+
export async function ensureDataDirs() {
|
|
160
|
+
await mkdir(careerDir(), { recursive: true });
|
|
161
|
+
await mkdir(pipelineDir(), { recursive: true });
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=file-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../../src/storage/file-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"career-kb.d.ts","sourceRoot":"","sources":["../../../src/tools/career-kb.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2J7D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { loadPipeline, savePipeline } from "../storage/file-store.js";
|
|
3
|
+
export function registerCareerKBTools(server) {
|
|
4
|
+
server.registerTool("ingest_document", {
|
|
5
|
+
title: "Ingest Career Document",
|
|
6
|
+
description: "Paste any career document — performance review, award email, project summary, LinkedIn recommendation — and extract structured achievements to add to your Career KB.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
content: z.string().describe("Full document text to ingest"),
|
|
9
|
+
documentType: z.enum(["performance_review", "award", "project_summary", "recommendation", "email", "self_review", "other"]).describe("Type of document"),
|
|
10
|
+
associatedRole: z.string().optional().describe("Job role this document relates to"),
|
|
11
|
+
associatedCompany: z.string().optional().describe("Company this document relates to"),
|
|
12
|
+
datePeriod: z.string().optional().describe("Time period this covers, e.g. '2023 Q1' or '2022-2023'"),
|
|
13
|
+
autoSave: z.boolean().default(false).describe("If true, automatically append extracted data to Career KB"),
|
|
14
|
+
},
|
|
15
|
+
}, async ({ content, documentType, associatedRole, associatedCompany, datePeriod, autoSave }) => {
|
|
16
|
+
return {
|
|
17
|
+
content: [{
|
|
18
|
+
type: "text",
|
|
19
|
+
text: `# Career Document Ingestion
|
|
20
|
+
|
|
21
|
+
## Document
|
|
22
|
+
**Type:** ${documentType}
|
|
23
|
+
${associatedRole ? `**Role:** ${associatedRole}` : ""}
|
|
24
|
+
${associatedCompany ? `**Company:** ${associatedCompany}` : ""}
|
|
25
|
+
${datePeriod ? `**Period:** ${datePeriod}` : ""}
|
|
26
|
+
|
|
27
|
+
**Content:**
|
|
28
|
+
${content}
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
**Instructions for Claude:**
|
|
33
|
+
Extract structured career data from this document. Produce output in two formats:
|
|
34
|
+
|
|
35
|
+
### 1. Human-Readable Summary
|
|
36
|
+
What are the key achievements, skills, and attributes this document reveals?
|
|
37
|
+
|
|
38
|
+
### 2. Career KB YAML Block
|
|
39
|
+
Extract into YAML format ready to add to the Career KB:
|
|
40
|
+
|
|
41
|
+
\`\`\`yaml
|
|
42
|
+
# Extracted from ${documentType} — ${associatedCompany ?? "Unknown Company"} — ${datePeriod ?? "Unknown period"}
|
|
43
|
+
experience_entry:
|
|
44
|
+
role: "${associatedRole ?? "Unknown"}"
|
|
45
|
+
company: "${associatedCompany ?? "Unknown"}"
|
|
46
|
+
achievements:
|
|
47
|
+
- metric: "[quantified outcome]"
|
|
48
|
+
context: "[situation or task]"
|
|
49
|
+
impact: "[why it mattered]"
|
|
50
|
+
keywords: []
|
|
51
|
+
# ... additional achievements
|
|
52
|
+
|
|
53
|
+
testimonials:
|
|
54
|
+
- source: "[name and title if from recommendation/review]"
|
|
55
|
+
relationship: "[manager/peer/report]"
|
|
56
|
+
quote: "[direct quote if available]"
|
|
57
|
+
context: "[what this was about]"
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
### 3. Skills Identified
|
|
61
|
+
List any skills surfaced by this document that may not be in the Career KB:
|
|
62
|
+
\`\`\`yaml
|
|
63
|
+
skills:
|
|
64
|
+
- name: "[skill]"
|
|
65
|
+
category: "[Technical/Leadership/Domain/etc]"
|
|
66
|
+
proficiency: [1-5]
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
### 4. Keywords Extracted
|
|
70
|
+
Top 10 ATS-friendly keywords from this document.
|
|
71
|
+
|
|
72
|
+
${autoSave ? `
|
|
73
|
+
**Auto-save requested:** After extraction, call the update tools to append this data to the Career KB files.
|
|
74
|
+
` : `
|
|
75
|
+
**To save:** Review the YAML above and use your file editor to append to the relevant data/career/ files, or set autoSave=true to let Claude do it automatically.
|
|
76
|
+
`}`,
|
|
77
|
+
}],
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
server.registerTool("generate_rejection_response", {
|
|
81
|
+
title: "Generate Rejection Response",
|
|
82
|
+
description: "Craft a graceful rejection response that keeps the door open, maintains relationships, and positions you for future opportunities.",
|
|
83
|
+
inputSchema: {
|
|
84
|
+
applicationId: z.string().optional().describe("Pipeline application ID"),
|
|
85
|
+
company: z.string().optional(),
|
|
86
|
+
role: z.string().optional(),
|
|
87
|
+
rejectionContent: z.string().describe("The rejection email or message content"),
|
|
88
|
+
responseGoal: z.enum(["keep_door_open", "request_feedback", "decline_gracefully", "express_continued_interest"]).default("keep_door_open"),
|
|
89
|
+
contactName: z.string().optional().describe("Person who sent the rejection"),
|
|
90
|
+
hadGoodRapport: z.boolean().default(false).describe("Did you have positive interactions during the process?"),
|
|
91
|
+
},
|
|
92
|
+
}, async ({ applicationId, company, role, rejectionContent, responseGoal, contactName, hadGoodRapport }) => {
|
|
93
|
+
if (applicationId) {
|
|
94
|
+
const pipeline = await loadPipeline();
|
|
95
|
+
const app = pipeline.applications.find(a => a.id === applicationId);
|
|
96
|
+
if (app) {
|
|
97
|
+
company = company ?? app.company;
|
|
98
|
+
role = role ?? app.role;
|
|
99
|
+
// Auto-update status to rejected
|
|
100
|
+
app.status = "rejected";
|
|
101
|
+
app.dateUpdated = new Date().toISOString();
|
|
102
|
+
await savePipeline(pipeline);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
content: [{
|
|
107
|
+
type: "text",
|
|
108
|
+
text: `# Rejection Response
|
|
109
|
+
|
|
110
|
+
## Rejection Received
|
|
111
|
+
**Company:** ${company ?? "Unknown"}
|
|
112
|
+
**Role:** ${role ?? "Unknown"}
|
|
113
|
+
${contactName ? `**From:** ${contactName}` : ""}
|
|
114
|
+
**Goal:** ${responseGoal}
|
|
115
|
+
**Prior rapport:** ${hadGoodRapport ? "Yes — positive relationship built" : "Limited"}
|
|
116
|
+
|
|
117
|
+
**Rejection message:**
|
|
118
|
+
${rejectionContent}
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
**Instructions for Claude:**
|
|
123
|
+
Write a rejection response that achieves: **${responseGoal}**
|
|
124
|
+
|
|
125
|
+
**Tone guidelines:**
|
|
126
|
+
- Gracious, never bitter
|
|
127
|
+
- Genuine, not sycophantic
|
|
128
|
+
- Brief (3-5 sentences max)
|
|
129
|
+
- Memorable without being awkward
|
|
130
|
+
${hadGoodRapport ? "- Reference the positive experience you had — make it personal" : ""}
|
|
131
|
+
|
|
132
|
+
**For goal: ${responseGoal}:**
|
|
133
|
+
${responseGoal === "keep_door_open" ? "Express appreciation, mention you'd welcome future opportunities, leave a positive final impression" : ""}
|
|
134
|
+
${responseGoal === "request_feedback" ? "Politely ask what the deciding factor was — make it easy to say no, so they'll actually respond" : ""}
|
|
135
|
+
${responseGoal === "decline_gracefully" ? "If you're withdrawing after a rejection arrived simultaneously, thank them and close cleanly" : ""}
|
|
136
|
+
${responseGoal === "express_continued_interest" ? "Mention the company is still high on your list and you'd welcome being considered for future openings" : ""}
|
|
137
|
+
|
|
138
|
+
**Output:**
|
|
139
|
+
1. **Recommended response** (ready to send)
|
|
140
|
+
2. **Alternative version** (different angle)
|
|
141
|
+
3. **LinkedIn connection note** (if you haven't connected yet — 300 chars)
|
|
142
|
+
|
|
143
|
+
${applicationId ? `\n**Note:** Application ${applicationId} status has been automatically updated to 'rejected'.` : ""}`,
|
|
144
|
+
}],
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=career-kb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"career-kb.js","sourceRoot":"","sources":["../../../src/tools/career-kb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interview.d.ts","sourceRoot":"","sources":["../../../src/tools/interview.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0M9D"}
|