knowme-careerforge-skill 0.0.2 → 0.0.4
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/SKILL.md +11 -1
- package/agents/claude/knowme-careerforge.md +10 -9
- package/agents/codex/knowme-careerforge.yaml +3 -3
- package/agents/cursor/knowme-careerforge.mdc +12 -8
- package/agents/opencode/skill.yaml +1 -1
- package/agents/windsurf/knowme-careerforge.rules +9 -9
- package/dist/cli/src/commands/init.js +9 -0
- package/dist/cli/src/index.js +17 -0
- package/package.json +2 -1
- package/scripts/build/sync-version.py +11 -2
- package/scripts/template/instantiate-resume.py +8 -2
- package/scripts/template/search-template.py +290 -89
- package/skill.json +1 -1
- package/src/knowledge/index.json +2 -10
- package/src/knowledge/templates.json +1 -9
- package/src/references/01-evidence-mining.md +41 -0
- package/src/references/02-career-goal.md +38 -0
- package/src/references/03-jd-analysis.md +44 -0
- package/src/references/04-template-selection.md +43 -0
- package/src/references/05-html-canvas-tokens.md +51 -0
- package/src/references/06-qa-and-rendering.md +54 -0
- package/src/templates/classic/style.css +22 -51
- package/src/templates/common/base.css +150 -0
- package/src/templates/executive/style.css +30 -73
- package/src/templates/minimal/style.css +30 -72
- package/src/templates/modern/style.css +32 -72
- package/src/references/ats.md +0 -17
- package/src/references/evidence-first.md +0 -22
- package/src/references/pdf.md +0 -40
- package/src/references/resume-writing.md +0 -25
- package/src/references/template-design.md +0 -57
- package/src/workflows/analyze-job.md +0 -16
- package/src/workflows/define-goal.md +0 -16
- package/src/workflows/forge-resume.md +0 -25
- package/src/workflows/know-me.md +0 -21
- package/src/workflows/position.md +0 -19
- package/src/workflows/review.md +0 -31
package/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: knowme-careerforge
|
|
3
3
|
displayName: KnowMe CareerForge
|
|
4
4
|
description: An agent-native skill for self-discovery, career positioning, and tailored resume engineering. Analyzes candidate evidence, maps strengths to target JDs, crafts tailored resumes inside an HTML Intermediate Canvas, self-heals layout/ATS, and exports pixel-perfect PDFs.
|
|
5
|
-
version: 0.0.
|
|
5
|
+
version: 0.0.4
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# KnowMe CareerForge — Agent Reasoning Contract & Execution Specification
|
|
@@ -32,6 +32,16 @@ When this skill is activated, you are NOT a generic text generator. You act as a
|
|
|
32
32
|
- Execute tool scripts silently in the background.
|
|
33
33
|
- Final response contract: One-line Value Proposition + Top 3 Grounded Evidence Highlights + Direct Output File Paths (`workspace/resume.pdf` and `workspace/resume.html`).
|
|
34
34
|
|
|
35
|
+
### Reference Manuals (L3 Domain Rules):
|
|
36
|
+
- **Stage 1 (Know Me)**: `references/01-evidence-mining.md`
|
|
37
|
+
- **Stage 2 (Define Goal)**: `references/02-career-goal.md`
|
|
38
|
+
- **Stage 3 (Understand JD)**: `references/03-jd-analysis.md`
|
|
39
|
+
- **Stage 4 (Position & Select)**: `references/04-template-selection.md`
|
|
40
|
+
- **Stage 5 (Forge Canvas)**: `references/05-html-canvas-tokens.md`
|
|
41
|
+
- **Stage 6 (Review & QA)**: `references/06-qa-and-rendering.md`
|
|
42
|
+
|
|
43
|
+
*See `AGENT.md` for strict editorial standards and `ARCHITECTURE.md` for system architecture.*
|
|
44
|
+
|
|
35
45
|
---
|
|
36
46
|
|
|
37
47
|
## 2. Input & Content Intelligence Layer (Repo-to-Resume Modes)
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: An agent-native skill for self-discovery, career positioning, and tailored resume engineering.
|
|
3
|
-
globs: ["workspace/*", "src/**/*", "scripts/**/*"]
|
|
3
|
+
globs: ["workspace/*", "src/**/*", "scripts/**/*", "references/*"]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# KnowMe CareerForge — Claude Code Skill
|
|
7
7
|
|
|
8
|
-
Know Yourself. Define Your Direction. Forge Your Opportunity.
|
|
8
|
+
> *"Know Yourself. Define Your Direction. Forge Your Opportunity."*
|
|
9
9
|
|
|
10
|
-
When activated, follow the
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
When activated, follow the 6-Stage Deterministic Workflow and Quiet Execution Protocol (see `AGENT.md` and `ARCHITECTURE.md`):
|
|
11
|
+
|
|
12
|
+
1. **Evidence Mining (repo-to-resume)**: Extract codebase facts via `python3 scripts/evidence/extract-evidence.py --repo .` or run one-shot `python3 scripts/pipeline/forge.py` (see `references/01-evidence-mining.md`).
|
|
13
|
+
2. **Define Goal & Archetype**: Establish target seniority tier and capability matrix (see `references/02-career-goal.md`).
|
|
14
|
+
3. **Understand Target**: Analyze target JD via `python3 scripts/evidence/analyze-jd.py` (see `references/03-jd-analysis.md`).
|
|
15
|
+
4. **Template Search**: Match template via `python3 scripts/template/search-template.py` (see `references/04-template-selection.md`).
|
|
16
|
+
5. **Intermediate Canvas**: Instantiate `workspace/resume.html` via `python3 scripts/template/instantiate-resume.py` and calibrate CSS design tokens (see `references/05-html-canvas-tokens.md`).
|
|
17
|
+
6. **Review & Dual QA**: Run `python3 scripts/validation/validate-resume.py` and export `workspace/resume.pdf` via `python3 scripts/rendering/render-pdf.py` (see `references/06-qa-and-rendering.md`).
|
|
17
18
|
7. **Quiet Delivery**: Execute silently in background; deliver concise executive summary and final file path (`workspace/resume.pdf`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
name: knowme-careerforge
|
|
2
2
|
description: An agent-native skill for self-discovery, career positioning, and tailored resume engineering.
|
|
3
|
-
version: 0.0.
|
|
3
|
+
version: 0.0.4
|
|
4
4
|
entrypoint: SKILL.md
|
|
5
5
|
tools:
|
|
6
6
|
- name: forge
|
|
@@ -18,7 +18,7 @@ tools:
|
|
|
18
18
|
- name: render-pdf
|
|
19
19
|
command: python3 scripts/rendering/render-pdf.py
|
|
20
20
|
rules:
|
|
21
|
-
- "Execute tools silently in background (DO NOT print raw HTML, full CSS, or scripts in chat)."
|
|
21
|
+
- "Execute tools silently in background with --quiet (DO NOT print raw HTML, full CSS, or scripts in chat)."
|
|
22
22
|
- "Use workspace/resume.html as the sole Intermediate Working Canvas."
|
|
23
23
|
- "Deliver final concise summary and path to workspace/resume.pdf."
|
|
24
|
-
- "Reference
|
|
24
|
+
- "Reference AGENT.md, ARCHITECTURE.md, and references/01~06 for complete specifications."
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: KnowMe CareerForge — Agent-native career positioning and resume engineering
|
|
3
|
-
globs: ["workspace/*", "src/**/*", "scripts/**/*"]
|
|
3
|
+
globs: ["workspace/*", "src/**/*", "scripts/**/*", "references/*"]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# KnowMe CareerForge MDC Rules
|
|
6
|
+
# KnowMe CareerForge MDC Rules (Cursor)
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
When activated for career positioning, resume tailoring, or repo-to-resume analysis:
|
|
9
|
+
|
|
10
|
+
1. **Evidence-First Invariant**: Enforce strict L1~L3 evidence classification (see `references/01-evidence-mining.md`). Never hallucinate ungrounded revenue metrics, fake degrees, or false tenures.
|
|
11
|
+
2. **Repo-to-Resume Extraction**: Extract codebase facts using `python3 scripts/evidence/extract-evidence.py --repo .` or execute the one-shot pipeline `python3 scripts/pipeline/forge.py`.
|
|
12
|
+
3. **Target Alignment & JD Parsing**: Analyze target Job Descriptions using `python3 scripts/evidence/analyze-jd.py` (see `references/03-jd-analysis.md`).
|
|
13
|
+
4. **Template Search**: Match template via `python3 scripts/template/search-template.py "<Target Role>"` (see `references/04-template-selection.md`).
|
|
14
|
+
5. **HTML Canvas Editing**: Edit exclusively in `workspace/resume.html` Intermediate Working Canvas (`scripts/template/instantiate-resume.py`). Calibrate CSS variables (`--resume-*`) in `:root` (see `references/05-html-canvas-tokens.md`).
|
|
15
|
+
6. **Dual QA & Deterministic PDF**: Validate layout height ($297\text{mm} \le 1122.5\text{px}$) and ATS via `python3 scripts/validation/validate-resume.py`. Export final vector PDF via `python3 scripts/rendering/render-pdf.py`.
|
|
16
|
+
7. **Quiet Execution Protocol**: Execute all tools silently with `--quiet`. Never output raw HTML/CSS into the chat. Deliver concise value proposition and direct output file paths.
|
|
17
|
+
8. **Authoritative Guide**: Refer to root `AGENT.md` for Vercel-inspired editorial standards and `ARCHITECTURE.md` for system design.
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
# Trigger: Career discovery, resume tailoring, JD analysis, repo-to-resume
|
|
3
3
|
|
|
4
4
|
When user requests resume tailoring, project analysis, or career positioning:
|
|
5
|
-
1. Extract candidate facts using `python3 scripts/evidence/extract-evidence.py --repo .` or execute one-shot `python3 scripts/pipeline/forge.py`.
|
|
6
|
-
2. Tag all experience items with Evidence Level (L1~L3 only,
|
|
7
|
-
3. Analyze target JD requirements using `python3 scripts/evidence/analyze-jd.py
|
|
8
|
-
4. Recommend best template using `python3 scripts/template/search-template.py
|
|
9
|
-
5. Instantiate `workspace/resume.html` using `python3 scripts/template/instantiate-resume.py` and calibrate CSS design tokens.
|
|
10
|
-
6. Validate DOM fit and ATS compatibility using `python3 scripts/validation/validate-resume.py`.
|
|
11
|
-
7. Export final
|
|
12
|
-
8. Execute silently in background; deliver concise
|
|
13
|
-
9.
|
|
5
|
+
1. **Evidence Mining**: Extract candidate facts using `python3 scripts/evidence/extract-evidence.py --repo .` or execute one-shot `python3 scripts/pipeline/forge.py`.
|
|
6
|
+
2. **Anti-Hallucination Gate**: Tag all experience items with Evidence Level (L1~L3 only, see `references/01-evidence-mining.md`).
|
|
7
|
+
3. **JD & Signal Analysis**: Analyze target JD requirements using `python3 scripts/evidence/analyze-jd.py` (see `references/03-jd-analysis.md`).
|
|
8
|
+
4. **Template Search**: Recommend best template using `python3 scripts/template/search-template.py` (see `references/04-template-selection.md`).
|
|
9
|
+
5. **Canvas Instantiation**: Instantiate `workspace/resume.html` using `python3 scripts/template/instantiate-resume.py` and calibrate CSS design tokens (see `references/05-html-canvas-tokens.md`).
|
|
10
|
+
6. **Dual QA Verification**: Validate DOM fit ($297\text{mm} \le 1122.5\text{px}$) and ATS compatibility using `python3 scripts/validation/validate-resume.py`.
|
|
11
|
+
7. **Deterministic PDF Export**: Export final vector PDF using `python3 scripts/rendering/render-pdf.py` (see `references/06-qa-and-rendering.md`).
|
|
12
|
+
8. **Quiet Delivery**: Execute silently in background (`--quiet`); deliver concise value proposition and direct output file paths (`workspace/resume.pdf`).
|
|
13
|
+
9. **Authoritative Guide**: Refer to root `AGENT.md` for editorial standards and `ARCHITECTURE.md` for system architecture.
|
|
@@ -93,7 +93,10 @@ function runInit(options) {
|
|
|
93
93
|
fs.mkdirSync(claudeDir, { recursive: true });
|
|
94
94
|
copyDirRecursive(path.join(rootDir, 'scripts'), path.join(claudeDir, 'scripts'));
|
|
95
95
|
copyDirRecursive(path.join(rootDir, 'src'), path.join(claudeDir, 'src'));
|
|
96
|
+
copyDirRecursive(path.join(rootDir, 'references'), path.join(claudeDir, 'references'));
|
|
96
97
|
fs.copyFileSync(path.join(rootDir, 'SKILL.md'), path.join(claudeDir, 'SKILL.md'));
|
|
98
|
+
fs.copyFileSync(path.join(rootDir, 'AGENT.md'), path.join(claudeDir, 'AGENT.md'));
|
|
99
|
+
fs.copyFileSync(path.join(rootDir, 'ARCHITECTURE.md'), path.join(claudeDir, 'ARCHITECTURE.md'));
|
|
97
100
|
fs.copyFileSync(path.join(rootDir, 'skill.json'), path.join(claudeDir, 'skill.json'));
|
|
98
101
|
console.log(`[✓] Claude Code Skill fully bundled -> ${claudeDir}`);
|
|
99
102
|
break;
|
|
@@ -103,7 +106,10 @@ function runInit(options) {
|
|
|
103
106
|
fs.mkdirSync(codexDir, { recursive: true });
|
|
104
107
|
copyDirRecursive(path.join(rootDir, 'scripts'), path.join(codexDir, 'scripts'));
|
|
105
108
|
copyDirRecursive(path.join(rootDir, 'src'), path.join(codexDir, 'src'));
|
|
109
|
+
copyDirRecursive(path.join(rootDir, 'references'), path.join(codexDir, 'references'));
|
|
106
110
|
fs.copyFileSync(path.join(rootDir, 'SKILL.md'), path.join(codexDir, 'SKILL.md'));
|
|
111
|
+
fs.copyFileSync(path.join(rootDir, 'AGENT.md'), path.join(codexDir, 'AGENT.md'));
|
|
112
|
+
fs.copyFileSync(path.join(rootDir, 'ARCHITECTURE.md'), path.join(codexDir, 'ARCHITECTURE.md'));
|
|
107
113
|
fs.copyFileSync(path.join(rootDir, 'skill.json'), path.join(codexDir, 'skill.json'));
|
|
108
114
|
if (fs.existsSync(path.join(rootDir, 'agents', 'codex', 'knowme-careerforge.yaml'))) {
|
|
109
115
|
fs.copyFileSync(path.join(rootDir, 'agents', 'codex', 'knowme-careerforge.yaml'), path.join(codexDir, 'skill.yaml'));
|
|
@@ -139,7 +145,10 @@ function runInit(options) {
|
|
|
139
145
|
fs.mkdirSync(opencodeDir, { recursive: true });
|
|
140
146
|
copyDirRecursive(path.join(rootDir, 'scripts'), path.join(opencodeDir, 'scripts'));
|
|
141
147
|
copyDirRecursive(path.join(rootDir, 'src'), path.join(opencodeDir, 'src'));
|
|
148
|
+
copyDirRecursive(path.join(rootDir, 'references'), path.join(opencodeDir, 'references'));
|
|
142
149
|
fs.copyFileSync(path.join(rootDir, 'SKILL.md'), path.join(opencodeDir, 'SKILL.md'));
|
|
150
|
+
fs.copyFileSync(path.join(rootDir, 'AGENT.md'), path.join(opencodeDir, 'AGENT.md'));
|
|
151
|
+
fs.copyFileSync(path.join(rootDir, 'ARCHITECTURE.md'), path.join(opencodeDir, 'ARCHITECTURE.md'));
|
|
143
152
|
fs.copyFileSync(path.join(rootDir, 'skill.json'), path.join(opencodeDir, 'skill.json'));
|
|
144
153
|
console.log(`[✓] OpenCode Skill fully bundled -> ${opencodeDir}`);
|
|
145
154
|
break;
|
package/dist/cli/src/index.js
CHANGED
|
@@ -53,6 +53,17 @@ function findPackageRoot(startDir) {
|
|
|
53
53
|
}
|
|
54
54
|
return path.resolve(startDir, '../../..');
|
|
55
55
|
}
|
|
56
|
+
function getVersion(rootDir) {
|
|
57
|
+
try {
|
|
58
|
+
const pkgJson = path.join(rootDir, 'package.json');
|
|
59
|
+
if (require('fs').existsSync(pkgJson)) {
|
|
60
|
+
const data = JSON.parse(require('fs').readFileSync(pkgJson, 'utf-8'));
|
|
61
|
+
return data.version || '0.0.4';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch { }
|
|
65
|
+
return '0.0.4';
|
|
66
|
+
}
|
|
56
67
|
function showHelp() {
|
|
57
68
|
console.log(`
|
|
58
69
|
======================================================================
|
|
@@ -179,6 +190,12 @@ function main() {
|
|
|
179
190
|
child_process.spawnSync('python3', [scriptPath], { stdio: 'inherit' });
|
|
180
191
|
break;
|
|
181
192
|
}
|
|
193
|
+
case '--version':
|
|
194
|
+
case '-v':
|
|
195
|
+
case 'version': {
|
|
196
|
+
console.log(getVersion(rootDir));
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
182
199
|
case 'help':
|
|
183
200
|
case '--help':
|
|
184
201
|
case '-h':
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "knowme-careerforge-skill",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "An agent-native skill for self-discovery, career positioning, and tailored resume engineering.",
|
|
5
5
|
"main": "dist/cli/src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"build:knowledge": "python3 scripts/build/build-knowledge.py",
|
|
31
31
|
"build:gallery": "python3 scripts/build/build-gallery.py",
|
|
32
32
|
"release": "python3 scripts/build/release.py",
|
|
33
|
+
"version:sync": "python3 scripts/build/sync-version.py",
|
|
33
34
|
"prepublishOnly": "npm run build && npm test"
|
|
34
35
|
},
|
|
35
36
|
"keywords": [
|
|
@@ -79,8 +79,17 @@ def sync_version(new_version: str):
|
|
|
79
79
|
new_text = re.sub(r'version:\s*[\d.]+', f'version: {semver}', text)
|
|
80
80
|
opencode_yaml.write_text(new_text, encoding="utf-8")
|
|
81
81
|
print(f"[✓] Synced agents/opencode/skill.yaml -> {semver}")
|
|
82
|
+
# 8. Update cli/src/index.ts fallback version
|
|
83
|
+
cli_ts_path = base_dir / "cli" / "src" / "index.ts"
|
|
84
|
+
if cli_ts_path.exists():
|
|
85
|
+
text = cli_ts_path.read_text(encoding="utf-8")
|
|
86
|
+
new_text = re.sub(r"return\s+data\.version\s*\|\|\s*'[^']+'", f"return data.version || '{semver}'", text)
|
|
87
|
+
new_text = re.sub(r"return\s+'[^']+'\s*;", f"return '{semver}';", new_text)
|
|
88
|
+
cli_ts_path.write_text(new_text, encoding="utf-8")
|
|
89
|
+
print(f"[✓] Synced cli/src/index.ts -> {semver}")
|
|
82
90
|
|
|
83
|
-
|
|
91
|
+
|
|
92
|
+
# 9. Update scripts/Agent.md
|
|
84
93
|
agent_md = base_dir / "scripts" / "Agent.md"
|
|
85
94
|
if agent_md.exists():
|
|
86
95
|
text = agent_md.read_text(encoding="utf-8")
|
|
@@ -88,7 +97,7 @@ def sync_version(new_version: str):
|
|
|
88
97
|
agent_md.write_text(new_text, encoding="utf-8")
|
|
89
98
|
print(f"[✓] Synced scripts/Agent.md -> v{semver}")
|
|
90
99
|
|
|
91
|
-
#
|
|
100
|
+
# 10. Recompile knowledge index to update index.json version
|
|
92
101
|
kb_script = base_dir / "scripts" / "build" / "build-knowledge.py"
|
|
93
102
|
if kb_script.exists():
|
|
94
103
|
import subprocess
|
|
@@ -129,6 +129,7 @@ def instantiate_workspace(template_id: str, profile_path: Optional[str] = None,
|
|
|
129
129
|
|
|
130
130
|
html_file = template_dir / "template.html"
|
|
131
131
|
css_file = template_dir / "style.css"
|
|
132
|
+
base_css_file = base_dir / "src" / "templates" / "common" / "base.css"
|
|
132
133
|
|
|
133
134
|
if not html_file.exists() or not css_file.exists():
|
|
134
135
|
raise FileNotFoundError(f"template.html or style.css missing in {template_dir}")
|
|
@@ -136,11 +137,16 @@ def instantiate_workspace(template_id: str, profile_path: Optional[str] = None,
|
|
|
136
137
|
html_content = html_file.read_text(encoding="utf-8")
|
|
137
138
|
css_content = css_file.read_text(encoding="utf-8")
|
|
138
139
|
|
|
140
|
+
combined_css = ""
|
|
141
|
+
if base_css_file.exists():
|
|
142
|
+
combined_css = base_css_file.read_text(encoding="utf-8") + "\n\n/* === TEMPLATE SPECIFIC STYLES === */\n" + css_content
|
|
143
|
+
else:
|
|
144
|
+
combined_css = css_content
|
|
145
|
+
|
|
139
146
|
inlined_html = html_content.replace(
|
|
140
147
|
'<link rel="stylesheet" href="style.css">',
|
|
141
|
-
f'<style>\n{
|
|
148
|
+
f'<style>\n{combined_css}\n </style>'
|
|
142
149
|
)
|
|
143
|
-
|
|
144
150
|
kw_list = [k.strip() for k in keywords.split(",") if k.strip()] if keywords else []
|
|
145
151
|
|
|
146
152
|
if profile_path and Path(profile_path).exists():
|