chameleon-cv 0.1.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/AGENTS.md +186 -0
- package/LICENSE +21 -0
- package/Makefile +136 -0
- package/README.md +356 -0
- package/bin/chameleon.js +136 -0
- package/chameleon.bat +286 -0
- package/chameleon.sh +353 -0
- package/package.json +39 -0
- package/profiles/github_repos.json +1266 -0
- package/requirements.txt +5 -0
- package/scan.sh +12 -0
- package/score.sh +12 -0
- package/scripts/__init__.py +1 -0
- package/scripts/__main_tui__.py +11 -0
- package/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
- package/scripts/__pycache__/__main_tui__.cpython-313.pyc +0 -0
- package/scripts/__pycache__/ats_ghost.cpython-313.pyc +0 -0
- package/scripts/__pycache__/cache.cpython-313.pyc +0 -0
- package/scripts/__pycache__/config.cpython-312.pyc +0 -0
- package/scripts/__pycache__/config.cpython-313.pyc +0 -0
- package/scripts/__pycache__/cover_letter.cpython-313.pyc +0 -0
- package/scripts/__pycache__/db.cpython-312.pyc +0 -0
- package/scripts/__pycache__/db.cpython-313.pyc +0 -0
- package/scripts/__pycache__/fonts.cpython-312.pyc +0 -0
- package/scripts/__pycache__/fonts.cpython-313.pyc +0 -0
- package/scripts/__pycache__/ghost.cpython-313.pyc +0 -0
- package/scripts/__pycache__/job_matcher.cpython-312.pyc +0 -0
- package/scripts/__pycache__/job_matcher.cpython-313.pyc +0 -0
- package/scripts/__pycache__/question.cpython-313.pyc +0 -0
- package/scripts/__pycache__/render.cpython-313.pyc +0 -0
- package/scripts/__pycache__/review.cpython-313.pyc +0 -0
- package/scripts/__pycache__/setup.cpython-312.pyc +0 -0
- package/scripts/__pycache__/tailor_brief.cpython-312.pyc +0 -0
- package/scripts/__pycache__/tailor_brief.cpython-313.pyc +0 -0
- package/scripts/__pycache__/tailor_cv.cpython-312.pyc +0 -0
- package/scripts/__pycache__/tailor_cv.cpython-313.pyc +0 -0
- package/scripts/__pycache__/tailor_prompts.cpython-312.pyc +0 -0
- package/scripts/__pycache__/tailor_prompts.cpython-313.pyc +0 -0
- package/scripts/__pycache__/tui_app.cpython-312.pyc +0 -0
- package/scripts/__pycache__/tui_app.cpython-313.pyc +0 -0
- package/scripts/ats_ghost.py +170 -0
- package/scripts/cache.py +63 -0
- package/scripts/cli.py +109 -0
- package/scripts/config.py +376 -0
- package/scripts/cover_letter.py +105 -0
- package/scripts/db.py +331 -0
- package/scripts/fonts.py +186 -0
- package/scripts/ghost.py +88 -0
- package/scripts/job_matcher.py +636 -0
- package/scripts/job_scanner/__init__.py +8 -0
- package/scripts/job_scanner/__main__.py +6 -0
- package/scripts/job_scanner/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/job_scanner/__pycache__/__init__.cpython-313.pyc +0 -0
- package/scripts/job_scanner/__pycache__/__main__.cpython-312.pyc +0 -0
- package/scripts/job_scanner/__pycache__/__main__.cpython-313.pyc +0 -0
- package/scripts/job_scanner/__pycache__/base.cpython-312.pyc +0 -0
- package/scripts/job_scanner/__pycache__/base.cpython-313.pyc +0 -0
- package/scripts/job_scanner/__pycache__/browser.cpython-312.pyc +0 -0
- package/scripts/job_scanner/__pycache__/browser.cpython-313.pyc +0 -0
- package/scripts/job_scanner/__pycache__/cli.cpython-313.pyc +0 -0
- package/scripts/job_scanner/__pycache__/registry.cpython-312.pyc +0 -0
- package/scripts/job_scanner/__pycache__/registry.cpython-313.pyc +0 -0
- package/scripts/job_scanner/__pycache__/scanner.cpython-312.pyc +0 -0
- package/scripts/job_scanner/__pycache__/scanner.cpython-313.pyc +0 -0
- package/scripts/job_scanner/base.py +197 -0
- package/scripts/job_scanner/browser.py +244 -0
- package/scripts/job_scanner/cli.py +6 -0
- package/scripts/job_scanner/parsers/__init__.py +24 -0
- package/scripts/job_scanner/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/adzuna.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/adzuna.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/arc.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/arc.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/crypto_careers.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/crypto_careers.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/dailyremote.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/dailyremote.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/flexjobs.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/himalayas.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/himalayas.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/hn_hiring.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/hn_hiring.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/indeed.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/jobicy.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/jobicy.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/jooble.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/jooble.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/linkedin.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/opentoworkremote.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/relocate.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/relocate.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/remote_rocketship.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/remoteok.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/remoteok.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/remotive.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/remotive.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/web3_career.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/wellfound.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/weworkremotely.cpython-312.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/weworkremotely.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/__pycache__/ycomb.cpython-313.pyc +0 -0
- package/scripts/job_scanner/parsers/adzuna.py +81 -0
- package/scripts/job_scanner/parsers/arc.py +65 -0
- package/scripts/job_scanner/parsers/crypto_careers.py +88 -0
- package/scripts/job_scanner/parsers/dailyremote.py +91 -0
- package/scripts/job_scanner/parsers/flexjobs.py +91 -0
- package/scripts/job_scanner/parsers/himalayas.py +47 -0
- package/scripts/job_scanner/parsers/hn_hiring.py +94 -0
- package/scripts/job_scanner/parsers/indeed.py +98 -0
- package/scripts/job_scanner/parsers/jobicy.py +60 -0
- package/scripts/job_scanner/parsers/jooble.py +68 -0
- package/scripts/job_scanner/parsers/linkedin.py +140 -0
- package/scripts/job_scanner/parsers/opentoworkremote.py +53 -0
- package/scripts/job_scanner/parsers/relocate.py +95 -0
- package/scripts/job_scanner/parsers/remote_rocketship.py +90 -0
- package/scripts/job_scanner/parsers/remoteok.py +63 -0
- package/scripts/job_scanner/parsers/remotive.py +57 -0
- package/scripts/job_scanner/parsers/web3_career.py +92 -0
- package/scripts/job_scanner/parsers/wellfound.py +94 -0
- package/scripts/job_scanner/parsers/weworkremotely.py +60 -0
- package/scripts/job_scanner/parsers/ycomb.py +83 -0
- package/scripts/job_scanner/registry.py +65 -0
- package/scripts/job_scanner/scanner.py +162 -0
- package/scripts/question.py +107 -0
- package/scripts/render.py +110 -0
- package/scripts/review.py +89 -0
- package/scripts/setup.py +139 -0
- package/scripts/tailor_brief.py +379 -0
- package/scripts/tailor_cv.py +746 -0
- package/scripts/tailor_prompts.py +101 -0
- package/scripts/tui/__init__.py +1 -0
- package/scripts/tui/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/tui/__pycache__/__init__.cpython-313.pyc +0 -0
- package/scripts/tui/__pycache__/app.cpython-312.pyc +0 -0
- package/scripts/tui/__pycache__/app.cpython-313.pyc +0 -0
- package/scripts/tui/__pycache__/helpers.cpython-312.pyc +0 -0
- package/scripts/tui/__pycache__/helpers.cpython-313.pyc +0 -0
- package/scripts/tui/__pycache__/screens.cpython-312.pyc +0 -0
- package/scripts/tui/__pycache__/screens.cpython-313.pyc +0 -0
- package/scripts/tui/__pycache__/widgets.cpython-312.pyc +0 -0
- package/scripts/tui/__pycache__/widgets.cpython-313.pyc +0 -0
- package/scripts/tui/app.py +1547 -0
- package/scripts/tui/helpers.py +65 -0
- package/scripts/tui/screens.py +642 -0
- package/scripts/tui/widgets.py +276 -0
- package/scripts/tui_app.py +25 -0
- package/scripts/wizard.py +109 -0
- package/tui.bat +50 -0
- package/tui.sh +59 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Prompt templates for one-shot opencode calls in the tailoring pipeline.
|
|
3
|
+
Every prompt is designed to return structured output (YAML or JSON).
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
TAILOR_PROMPT = """You are a CV tailoring engine that outputs raw YAML and nothing else.
|
|
8
|
+
|
|
9
|
+
CRITICAL RULE: Output ONLY the tailored YAML document. No greetings, no explanations, no file operations, no markdown fences, no backticks, no commentary. The first character of your output must be 'c' (from 'cv:') and the last character must be the last character of the YAML document.
|
|
10
|
+
|
|
11
|
+
## Rules
|
|
12
|
+
1. Keep the `design` section EXACTLY as it was in the input CV. Do not modify it.
|
|
13
|
+
2. For every experience section (every company/position pair):
|
|
14
|
+
- **Preserve the truth** — never fabricate a role, company, date, or technology.
|
|
15
|
+
- **Rephrase every highlight to maximize relevance** to the JD keywords and domains.
|
|
16
|
+
- Lead with the most relevant highlight for each experience.
|
|
17
|
+
3. Rewrite the **summary** to directly address the JD. First sentence = role statement. Second sentence = portfolio-scale evidence.
|
|
18
|
+
4. Keep **skills** section labels unchanged. Re-order and re-word details within each label to prioritize JD-relevant terms.
|
|
19
|
+
5. Reorder **experience** sections by relevance to the JD (most relevant first).
|
|
20
|
+
6. Keep only the 2-4 most relevant **projects**.
|
|
21
|
+
7. Education and languages are unchanged.
|
|
22
|
+
|
|
23
|
+
## Input
|
|
24
|
+
### MASTER CV (YAML)
|
|
25
|
+
{cv_yaml}
|
|
26
|
+
|
|
27
|
+
### TAILORING BRIEF
|
|
28
|
+
{brief_text}
|
|
29
|
+
|
|
30
|
+
Output ONLY the raw YAML document starting with 'cv:' — no other text at all.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
REVIEW_PROMPT = """You are a CV alignment auditor. Your task is to compare the **TAILORED CV** against the **JOB DESCRIPTION** and produce an alignment audit.
|
|
35
|
+
|
|
36
|
+
## Review criteria
|
|
37
|
+
1. **Skill coverage**: Are all JD-required languages/frameworks/tools present in the CV?
|
|
38
|
+
2. **Experience proof**: Does each JD responsibility have a matching experience highlight?
|
|
39
|
+
3. **Seniority match**: Does the CV project the right seniority level for the role?
|
|
40
|
+
4. **Domain relevance**: Are the domains mentioned in the JD reflected in the CV?
|
|
41
|
+
5. **ATS keywords**: Are key JD terms present in the CV for ATS scanning?
|
|
42
|
+
6. **Truth**: Does anything in the tailored CV appear fabricated or misleading?
|
|
43
|
+
7. **Language/tone**: Is the language confident, accomplishment-oriented, and professional?
|
|
44
|
+
|
|
45
|
+
## Output format
|
|
46
|
+
Return a JSON object with these keys:
|
|
47
|
+
```json
|
|
48
|
+
{{
|
|
49
|
+
"overall_score": <int 0-100>,
|
|
50
|
+
"by_section": {{
|
|
51
|
+
"summary": <int 0-100>,
|
|
52
|
+
"skills": <int 0-100>,
|
|
53
|
+
"experience": <int 0-100>,
|
|
54
|
+
"projects": <int 0-100>
|
|
55
|
+
}},
|
|
56
|
+
"missing_terms": ["term1", "term2"],
|
|
57
|
+
"present_terms": ["term3", "term4"],
|
|
58
|
+
"alignment_gaps": [
|
|
59
|
+
{{"section": "experience", "company": "...", "issue": "..."}}
|
|
60
|
+
],
|
|
61
|
+
"fabrication_concerns": ["..."] or [],
|
|
62
|
+
"corrections_needed": [
|
|
63
|
+
{{"section": "experience|summary|skills|projects", "path": "...", "current": "...", "suggested": "..."}}
|
|
64
|
+
],
|
|
65
|
+
"approved": <true|false>
|
|
66
|
+
}}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Input
|
|
70
|
+
### JOB DESCRIPTION
|
|
71
|
+
```
|
|
72
|
+
{jd_text}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### TAILORED CV (YAML)
|
|
76
|
+
```yaml
|
|
77
|
+
{tailored_yaml}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Return ONLY the JSON object — no commentary or markdown fences.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
FIX_PROMPT = """You are a CV editor. Apply the following corrections to the TAILORED CV YAML.
|
|
85
|
+
|
|
86
|
+
## Rules
|
|
87
|
+
1. Return ONLY valid YAML — no commentary, no markdown fences.
|
|
88
|
+
2. Keep the `design` section EXACTLY as-is.
|
|
89
|
+
3. Make ONLY the changes specified in the corrections list.
|
|
90
|
+
4. Preserve all other content exactly.
|
|
91
|
+
|
|
92
|
+
## Corrections to apply
|
|
93
|
+
{corrections_json}
|
|
94
|
+
|
|
95
|
+
## Current Tailored YAML
|
|
96
|
+
```yaml
|
|
97
|
+
{tailored_yaml}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Return ONLY the corrected YAML document.
|
|
101
|
+
"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Chameleon TUI — modular terminal interface for job scanning and CV tailoring."""
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|