Skip to content

Commit 8481f50

Browse files
PunithVTclaude
andcommitted
Add career-ops infrastructure required by web app
Commits the upstream career-ops project files that the web app depends on at runtime: prompt modes, HTML/CSS template, fonts, helper scripts, and root package.json. Without these, the deployed web server cannot evaluate JDs, generate PDFs, run scans, or analyze patterns. Excludes user-specific files via .gitignore (cv.md, article-digest.md, config/profile.yml, portals.yml, modes/_profile.md, data/, reports/, output/). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 1785206 commit 8481f50

164 files changed

Lines changed: 18968 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/skills/career-ops/SKILL.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
---
2+
name: career-ops
3+
description: AI job search command center -- evaluate offers, generate CVs, scan portals, track applications
4+
user_invocable: true
5+
args: mode
6+
argument-hint: "[scan | deep | pdf | oferta | ofertas | apply | batch | tracker | pipeline | contacto | training | project | interview-prep | update]"
7+
---
8+
9+
# career-ops -- Router
10+
11+
## Mode Routing
12+
13+
Determine the mode from `{{mode}}`:
14+
15+
| Input | Mode |
16+
|-------|------|
17+
| (empty / no args) | `discovery` -- Show command menu |
18+
| JD text or URL (no sub-command) | **`auto-pipeline`** |
19+
| `oferta` | `oferta` |
20+
| `ofertas` | `ofertas` |
21+
| `contacto` | `contacto` |
22+
| `deep` | `deep` |
23+
| `pdf` | `pdf` |
24+
| `training` | `training` |
25+
| `project` | `project` |
26+
| `tracker` | `tracker` |
27+
| `pipeline` | `pipeline` |
28+
| `apply` | `apply` |
29+
| `scan` | `scan` |
30+
| `batch` | `batch` |
31+
| `patterns` | `patterns` |
32+
| `followup` | `followup` |
33+
34+
**Auto-pipeline detection:** If `{{mode}}` is not a known sub-command AND contains JD text (keywords: "responsibilities", "requirements", "qualifications", "about the role", "we're looking for", company name + role) or a URL to a JD, execute `auto-pipeline`.
35+
36+
If `{{mode}}` is not a sub-command AND doesn't look like a JD, show discovery.
37+
38+
---
39+
40+
## Discovery Mode (no arguments)
41+
42+
Show this menu:
43+
44+
```
45+
career-ops -- Command Center
46+
47+
Available commands:
48+
/career-ops {JD} → AUTO-PIPELINE: evaluate + report + PDF + tracker (paste text or URL)
49+
/career-ops pipeline → Process pending URLs from inbox (data/pipeline.md)
50+
/career-ops oferta → Evaluation only A-F (no auto PDF)
51+
/career-ops ofertas → Compare and rank multiple offers
52+
/career-ops contacto → LinkedIn power move: find contacts + draft message
53+
/career-ops deep → Deep research prompt about company
54+
/career-ops pdf → PDF only, ATS-optimized CV
55+
/career-ops training → Evaluate course/cert against North Star
56+
/career-ops project → Evaluate portfolio project idea
57+
/career-ops tracker → Application status overview
58+
/career-ops apply → Live application assistant (reads form + generates answers)
59+
/career-ops scan → Scan portals and discover new offers
60+
/career-ops batch → Batch processing with parallel workers
61+
/career-ops patterns → Analyze rejection patterns and improve targeting
62+
/career-ops followup → Follow-up cadence tracker: flag overdue, generate drafts
63+
64+
Inbox: add URLs to data/pipeline.md → /career-ops pipeline
65+
Or paste a JD directly to run the full pipeline.
66+
```
67+
68+
---
69+
70+
## Context Loading by Mode
71+
72+
After determining the mode, load the necessary files before executing:
73+
74+
### Modes that require `_shared.md` + their mode file:
75+
Read `modes/_shared.md` + `modes/{mode}.md`
76+
77+
Applies to: `auto-pipeline`, `oferta`, `ofertas`, `pdf`, `contacto`, `apply`, `pipeline`, `scan`, `batch`
78+
79+
### Standalone modes (only their mode file):
80+
Read `modes/{mode}.md`
81+
82+
Applies to: `tracker`, `deep`, `training`, `project`, `patterns`, `followup`
83+
84+
### Modes delegated to subagent:
85+
For `scan`, `apply` (with Playwright), and `pipeline` (3+ URLs): launch as Agent with the content of `_shared.md` + `modes/{mode}.md` injected into the subagent prompt.
86+
87+
```
88+
Agent(
89+
subagent_type="general-purpose",
90+
prompt="[content of modes/_shared.md]\n\n[content of modes/{mode}.md]\n\n[invocation-specific data]",
91+
description="career-ops {mode}"
92+
)
93+
```
94+
95+
Execute the instructions from the loaded mode file.

.coderabbit.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
language: en
2+
reviews:
3+
profile: assertive
4+
request_changes_workflow: false
5+
high_level_summary: true
6+
poem: false
7+
auto_review:
8+
enabled: true
9+
drafts: false
10+
base_branches:
11+
- main
12+
path_instructions:
13+
- path: "CLAUDE.md"
14+
instructions: "This file controls agent behavior. Review changes very carefully for conflicts with existing instructions."
15+
- path: "modes/_shared.md"
16+
instructions: "This file controls the scoring system. Any changes affect ALL evaluations. Flag anything that modifies scoring logic."
17+
- path: "DATA_CONTRACT.md"
18+
instructions: "This file defines system vs user file boundaries. Changes here are critical — reject if user-layer files are being reclassified."
19+
- path: "**/*.mjs"
20+
instructions: "Check for command injection, path traversal, and SSRF. Ensure scripts handle missing data/ directories gracefully."
21+
- path: "dashboard/**"
22+
instructions: "Go TUI code. Check for proper error handling and ensure no hardcoded paths."
23+
chat:
24+
auto_reply: true

.envrc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export DIRENV_WARN_TIMEOUT=2m
2+
if ! has nix_direnv_version || ! nix_direnv_version 3.0.5; then
3+
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.5/direnvrc" "sha256-RuwIS+QKFj/T9M2TFXScjBsLR6V3A17YVoEW/Q6AZ1w="
4+
fi
5+
dotenv
6+
use flake

.github/FUNDING.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
github: santifer
2+
buy_me_a_coffee: santifer
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Bug Report
2+
description: Report a bug in career-ops
3+
labels: ["bug"]
4+
body:
5+
- type: checkboxes
6+
id: coc
7+
attributes:
8+
label: Code of Conduct
9+
options:
10+
- label: I agree to follow the [Code of Conduct](https://github.com/santifer/career-ops/blob/main/CODE_OF_CONDUCT.md)
11+
required: true
12+
- type: checkboxes
13+
id: search
14+
attributes:
15+
label: Existing issues
16+
options:
17+
- label: I searched existing issues and this hasn't been reported yet
18+
required: true
19+
- type: textarea
20+
id: description
21+
attributes:
22+
label: What happened?
23+
description: A clear description of the bug
24+
validations:
25+
required: true
26+
- type: textarea
27+
id: steps
28+
attributes:
29+
label: Steps to reproduce
30+
description: How can we reproduce this?
31+
validations:
32+
required: true
33+
- type: textarea
34+
id: expected
35+
attributes:
36+
label: Expected behavior
37+
description: What should have happened?
38+
- type: input
39+
id: cli
40+
attributes:
41+
label: CLI tool
42+
placeholder: "e.g., Claude Code, OpenCode, Codex"
43+
- type: input
44+
id: os
45+
attributes:
46+
label: OS and Node.js version
47+
placeholder: "e.g., macOS 15 / Node 20.11"
48+
- type: textarea
49+
id: doctor
50+
attributes:
51+
label: Output of npm run doctor
52+
description: Paste the output here (helps us diagnose setup issues)
53+
render: shell

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Setup Help / How-to Questions
4+
url: https://discord.gg/8pRpHETxa4
5+
about: For setup help and general questions, ask in Discord instead of opening an issue.
6+
- name: GitHub Discussions
7+
url: https://github.com/santifer/career-ops/discussions
8+
about: For ideas, Q&A, and community conversations.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: Feature Request
2+
description: Suggest a new feature or improvement
3+
labels: ["enhancement"]
4+
body:
5+
- type: checkboxes
6+
id: coc
7+
attributes:
8+
label: Code of Conduct
9+
options:
10+
- label: I agree to follow the [Code of Conduct](https://github.com/santifer/career-ops/blob/main/CODE_OF_CONDUCT.md)
11+
required: true
12+
- type: checkboxes
13+
id: search
14+
attributes:
15+
label: Existing issues
16+
options:
17+
- label: I searched existing issues and this hasn't been requested yet
18+
required: true
19+
- type: textarea
20+
id: problem
21+
attributes:
22+
label: Problem
23+
description: What problem does this solve? Why do you need this?
24+
validations:
25+
required: true
26+
- type: textarea
27+
id: solution
28+
attributes:
29+
label: Proposed solution
30+
description: How would you like this to work?
31+
validations:
32+
required: true
33+
- type: dropdown
34+
id: area
35+
attributes:
36+
label: Area
37+
options:
38+
- Evaluation / Scoring
39+
- PDF Generation
40+
- Portal Scanner
41+
- Dashboard TUI
42+
- Batch Processing
43+
- Language / i18n
44+
- Documentation
45+
- Other
46+
validations:
47+
required: true
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: "I Got Hired!"
2+
description: Share your success story — you landed a job using career-ops
3+
labels: ["hired"]
4+
body:
5+
- type: markdown
6+
attributes:
7+
value: |
8+
Congrats on the new role! Your story helps others see what's possible.
9+
- type: input
10+
id: role
11+
attributes:
12+
label: What role did you land?
13+
placeholder: "e.g., Senior Backend Engineer, Product Manager, ML Engineer"
14+
validations:
15+
required: true
16+
- type: input
17+
id: company_type
18+
attributes:
19+
label: Company type
20+
placeholder: "e.g., startup, big tech, agency, remote-first"
21+
- type: textarea
22+
id: story
23+
attributes:
24+
label: Your story
25+
description: How did career-ops help? What features made the difference?
26+
placeholder: "e.g., I evaluated 50+ listings, the scoring helped me focus on 3 real matches, generated tailored CVs for each..."
27+
validations:
28+
required: true
29+
- type: dropdown
30+
id: feature
31+
attributes:
32+
label: Most useful feature
33+
options:
34+
- A-F Evaluation scoring
35+
- PDF / CV generation
36+
- Portal scanner
37+
- Interview prep (STAR stories)
38+
- Batch processing
39+
- Follow-up tracker
40+
- Ghost job detection (Block G)
41+
- Other
42+
validations:
43+
required: true
44+
- type: input
45+
id: listings_evaluated
46+
attributes:
47+
label: How many listings did you evaluate?
48+
placeholder: "e.g., 30, 100, 500+"
49+
- type: input
50+
id: time_to_hire
51+
attributes:
52+
label: Time from first scan to offer
53+
placeholder: "e.g., 2 weeks, 1 month, 3 months"
54+
- type: textarea
55+
id: advice
56+
attributes:
57+
label: One tip for others
58+
description: What would you tell someone just starting their job search with career-ops?
59+
- type: checkboxes
60+
id: permission
61+
attributes:
62+
label: Permission
63+
options:
64+
- label: I'm okay with my story being featured in the README and release notes
65+
required: false

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
## What does this PR do?
2+
3+
<!-- Describe the change in 1-3 sentences -->
4+
5+
## Related issue
6+
7+
<!-- REQUIRED: Link the issue this PR addresses. PRs without a related issue will be closed. -->
8+
<!-- Format: Fixes #123 / Closes #123 -->
9+
<!-- Bug fixes can skip this if the fix is obvious (e.g., typo, crash). -->
10+
11+
## Type of change
12+
13+
- [ ] Bug fix
14+
- [ ] New feature
15+
- [ ] Documentation / translation
16+
- [ ] Refactor (no behavior change)
17+
18+
## Checklist
19+
20+
- [ ] I have read [CONTRIBUTING.md](https://github.com/santifer/career-ops/blob/main/CONTRIBUTING.md)
21+
- [ ] I linked a related issue above (required for features and architecture changes)
22+
- [ ] My PR does not include personal data (CV, email, real names)
23+
- [ ] I ran `node test-all.mjs` and all tests pass
24+
- [ ] My changes respect the [Data Contract](https://github.com/santifer/career-ops/blob/main/DATA_CONTRACT.md) (no modifications to user-layer files)
25+
- [ ] My changes align with the [project roadmap](https://github.com/santifer/career-ops/discussions/156)
26+
27+
---
28+
Questions? [Join the Discord](https://discord.gg/8pRpHETxa4) for faster feedback.

.github/SECURITY.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Security Policy
2+
3+
## Reporting a Vulnerability
4+
5+
**Do NOT open a public issue for security vulnerabilities.**
6+
7+
Instead, please email **hi@santifer.io** with:
8+
9+
1. Description of the vulnerability
10+
2. Steps to reproduce
11+
3. Potential impact
12+
4. Suggested fix (if any)
13+
14+
You will receive a response within 72 hours. We will work with you to understand and address the issue before any public disclosure.
15+
16+
## Scope
17+
18+
Security issues in the following are in scope:
19+
20+
- **Scripts** (`*.mjs`) — command injection, path traversal, SSRF
21+
- **Dashboard** (`dashboard/`) — any Go binary vulnerabilities
22+
- **Templates** (`templates/`) — XSS in generated HTML/PDF
23+
- **Configuration** — secrets exposure, unsafe defaults
24+
25+
## Out of Scope
26+
27+
- Issues in third-party dependencies (report upstream)
28+
- Issues requiring physical access to the user's machine
29+
- Social engineering attacks
30+
- career-ops is a local tool — there is no hosted service to attack
31+
32+
## Disclosure Policy
33+
34+
We follow coordinated disclosure. Once a fix is released, we will credit the reporter (unless they prefer anonymity) in the release notes.

0 commit comments

Comments
 (0)