-
-
Notifications
You must be signed in to change notification settings - Fork 9.5k
feat: add Next.js web UI dashboard (web-ui/) #679
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 7 commits
07de6b7
472522e
c98534c
aa48c49
fd7a05d
fa42e8c
ed36f3a
6d091a1
395f2c0
017878f
57c2d71
1ad6a7c
941ef16
76c80db
d4f3b65
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| ../../../.agents/skills/career-ops/SKILL.md |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| github: santifer |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,118 +1,2 @@ | ||||||||||||||
| # Career-Ops — AI Job Search Pipeline (Gemini CLI) | ||||||||||||||
|
|
||||||||||||||
| > This file is auto-loaded by the Gemini CLI as persistent context. | ||||||||||||||
| > It is the Gemini equivalent of CLAUDE.md. | ||||||||||||||
| > All slash commands are defined in `.gemini/commands/`. | ||||||||||||||
|
|
||||||||||||||
| ## What is career-ops | ||||||||||||||
|
|
||||||||||||||
| AI-powered job search automation: pipeline tracking, offer evaluation, CV generation, portal scanning, batch processing. Originally built on Claude Code, now fully supported on Gemini CLI and OpenCode. | ||||||||||||||
|
|
||||||||||||||
| ## Data Contract (CRITICAL) | ||||||||||||||
|
|
||||||||||||||
| **User Layer (NEVER auto-updated — your personalizations live here):** | ||||||||||||||
| - `cv.md`, `config/profile.yml`, `modes/_profile.md`, `article-digest.md`, `portals.yml` | ||||||||||||||
| - `data/*`, `reports/*`, `output/*`, `interview-prep/*` | ||||||||||||||
|
|
||||||||||||||
| **System Layer (auto-updatable — do NOT put user data here):** | ||||||||||||||
| - `modes/_shared.md`, `modes/oferta.md`, all other modes | ||||||||||||||
| - `GEMINI.md`, `CLAUDE.md`, `*.mjs` scripts, `templates/*`, `batch/*` | ||||||||||||||
|
|
||||||||||||||
| **THE RULE:** When the user asks to customize anything (archetypes, narrative, negotiation scripts, proof points, location policy, comp targets), ALWAYS write to `modes/_profile.md` or `config/profile.yml`. NEVER edit `modes/_shared.md` for user-specific content. | ||||||||||||||
|
|
||||||||||||||
| ## Update Check | ||||||||||||||
|
|
||||||||||||||
| On the first message of each session, run the update checker silently: | ||||||||||||||
|
|
||||||||||||||
| ```bash | ||||||||||||||
| node update-system.mjs check | ||||||||||||||
| ``` | ||||||||||||||
|
|
||||||||||||||
| Parse the JSON output: | ||||||||||||||
| - `{"status": "update-available", ...}` → tell the user an update is available and ask if they want to apply it (`node update-system.mjs apply`) | ||||||||||||||
| - `{"status": "up-to-date"}` → say nothing | ||||||||||||||
| - `{"status": "dismissed"}` or `{"status": "offline"}` → say nothing | ||||||||||||||
|
|
||||||||||||||
| ## Gemini CLI Commands | ||||||||||||||
|
|
||||||||||||||
| When using [Gemini CLI](https://github.com/google-gemini/gemini-cli), the following slash commands are available (defined in `.gemini/commands/`): | ||||||||||||||
|
|
||||||||||||||
| | Command | Claude Code Equivalent | Description | | ||||||||||||||
| |---------|------------------------|-------------| | ||||||||||||||
| | `/career-ops` | `/career-ops` | Show menu or evaluate JD | | ||||||||||||||
| | `/career-ops-pipeline` | `/career-ops pipeline` | Process pending URLs from inbox | | ||||||||||||||
| | `/career-ops-evaluate` | `/career-ops oferta` | Evaluate job offer (A-G scoring) | | ||||||||||||||
| | `/career-ops-compare` | `/career-ops ofertas` | Compare and rank multiple offers | | ||||||||||||||
| | `/career-ops-contact` | `/career-ops contacto` | LinkedIn outreach | | ||||||||||||||
| | `/career-ops-deep` | `/career-ops deep` | Deep company research | | ||||||||||||||
| | `/career-ops-pdf` | `/career-ops pdf` | Generate ATS-optimized CV | | ||||||||||||||
| | `/career-ops-training` | `/career-ops training` | Evaluate course/cert | | ||||||||||||||
| | `/career-ops-project` | `/career-ops project` | Evaluate portfolio project | | ||||||||||||||
| | `/career-ops-tracker` | `/career-ops tracker` | Application status overview | | ||||||||||||||
| | `/career-ops-apply` | `/career-ops apply` | Live application assistant | | ||||||||||||||
| | `/career-ops-scan` | `/career-ops scan` | Scan portals for new offers | | ||||||||||||||
| | `/career-ops-batch` | `/career-ops batch` | Batch processing | | ||||||||||||||
| | `/career-ops-patterns` | `/career-ops patterns` | Analyze rejection patterns | | ||||||||||||||
| | `/career-ops-followup` | `/career-ops followup` | Follow-up cadence tracker | | ||||||||||||||
|
|
||||||||||||||
| **All commands share the same evaluation logic** in `modes/*.md`. The `modes/` files are shared between Claude Code, OpenCode, and Gemini CLI. | ||||||||||||||
|
|
||||||||||||||
| ## First Run — Onboarding | ||||||||||||||
|
|
||||||||||||||
| **Before doing anything else, check if the system is set up.** Run silently every session: | ||||||||||||||
|
|
||||||||||||||
| 1. Does `cv.md` exist? | ||||||||||||||
| 2. Does `config/profile.yml` exist (not just profile.example.yml)? | ||||||||||||||
| 3. Does `modes/_profile.md` exist (not just _profile.template.md)? | ||||||||||||||
| 4. Does `portals.yml` exist (not just templates/portals.example.yml)? | ||||||||||||||
|
|
||||||||||||||
| If `modes/_profile.md` is missing, copy from `modes/_profile.template.md` silently. | ||||||||||||||
|
|
||||||||||||||
| **If ANY of these is missing, enter onboarding mode.** Guide the user step by step — ask for their CV, fill the profile, set up the tracker. See `CLAUDE.md` for the full onboarding script (identical logic applies here). | ||||||||||||||
|
|
||||||||||||||
| ## Skill Modes | ||||||||||||||
|
|
||||||||||||||
| | If the user... | Mode to load | | ||||||||||||||
| |----------------|-------------| | ||||||||||||||
| | Pastes JD or URL | auto-pipeline → read `modes/_shared.md` + `modes/auto-pipeline.md` | | ||||||||||||||
| | Asks to evaluate offer | read `modes/_shared.md` + `modes/oferta.md` | | ||||||||||||||
| | Asks to compare offers | read `modes/_shared.md` + `modes/ofertas.md` | | ||||||||||||||
| | Wants LinkedIn outreach | read `modes/_shared.md` + `modes/contacto.md` | | ||||||||||||||
| | Asks for company research | read `modes/deep.md` | | ||||||||||||||
| | Preps for interview | read `modes/interview-prep.md` | | ||||||||||||||
| | Wants to generate CV/PDF | read `modes/_shared.md` + `modes/pdf.md` | | ||||||||||||||
| | Evaluates a course/cert | read `modes/training.md` | | ||||||||||||||
| | Evaluates portfolio project | read `modes/project.md` | | ||||||||||||||
| | Asks about application status | read `modes/tracker.md` | | ||||||||||||||
| | Fills out application form | read `modes/_shared.md` + `modes/apply.md` | | ||||||||||||||
| | Searches for new offers | read `modes/_shared.md` + `modes/scan.md` | | ||||||||||||||
| | Processes pending URLs | read `modes/_shared.md` + `modes/pipeline.md` | | ||||||||||||||
| | Batch processes offers | read `modes/_shared.md` + `modes/batch.md` | | ||||||||||||||
| | Asks about rejection patterns | read `modes/patterns.md` | | ||||||||||||||
| | Asks about follow-ups | read `modes/followup.md` | | ||||||||||||||
|
|
||||||||||||||
| ## Main Files | ||||||||||||||
|
|
||||||||||||||
| | File | Function | | ||||||||||||||
| |------|----------| | ||||||||||||||
| | `data/applications.md` | Application tracker | | ||||||||||||||
| | `data/pipeline.md` | Inbox of pending URLs | | ||||||||||||||
| | `portals.yml` | Query and company config | | ||||||||||||||
| | `templates/cv-template.html` | HTML template for CVs | | ||||||||||||||
| | `generate-pdf.mjs` | Playwright: HTML to PDF | | ||||||||||||||
| | `article-digest.md` | Proof points from portfolio (optional) | | ||||||||||||||
| | `interview-prep/story-bank.md` | Accumulated STAR+R stories | | ||||||||||||||
| | `gemini-eval.mjs` | Standalone Gemini API evaluator (no CLI required) | | ||||||||||||||
|
|
||||||||||||||
| ## Ethical Use — CRITICAL | ||||||||||||||
|
|
||||||||||||||
| - **NEVER submit an application without the user reviewing it first.** Fill forms, draft answers, generate PDFs — but always STOP before clicking Submit. The user makes the final call. | ||||||||||||||
| - **Strongly discourage low-fit applications.** If a score is below 4.0/5, explicitly recommend against applying. | ||||||||||||||
| - **Quality over speed.** A well-targeted application to 5 companies beats a generic blast to 50. | ||||||||||||||
|
|
||||||||||||||
| ## Pipeline Integrity | ||||||||||||||
|
|
||||||||||||||
| 1. **NEVER edit applications.md to ADD new entries** — Write TSV in `batch/tracker-additions/` and `node merge-tracker.mjs` handles the merge. | ||||||||||||||
| 2. Run `node verify-pipeline.mjs` to check health. | ||||||||||||||
| 3. All reports MUST include `**URL:**` and `**Legitimacy:**` in the header. | ||||||||||||||
| 4. All statuses MUST be canonical (see `templates/states.yml`). | ||||||||||||||
| @./AGENTS.md | ||||||||||||||
| <!-- Add anything Gemini specific that other agents don't need --> | ||||||||||||||
|
Comment on lines
+1
to
+2
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add a top-level heading to satisfy markdown linting. Line 1 currently starts with an include directive, which triggers MD041 ( 💡 Suggested patch+# Gemini
+
@./AGENTS.md
<!-- Add anything Gemini specific that other agents don't need -->📝 Committable suggestion
Suggested change
🧰 Tools🪛 markdownlint-cli2 (0.22.1)[warning] 1-1: First line in a file should be a top-level heading (MD041, first-line-heading, first-line-h1) 🤖 Prompt for AI Agents |
||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -157,7 +157,7 @@ node gemini-eval.mjs --file ./jds/my-job.txt | |
| npm run gemini:eval -- "JD text here" | ||
| ``` | ||
|
|
||
| > **Free tier:** Both options work without billing. Native CLI uses Google OAuth; the API script uses `gemini-2.0-flash` (15 RPM, 1M tokens/day free). | ||
| > **Free tier:** Both options work without billing. Native CLI uses Google OAuth; the API script uses `gemini-2.5-flash` (15 RPM, 1M tokens/day free). | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win 🧩 Analysis chain🌐 Web query:
💡 Result: As of May 17, 2026, the free-tier limits and model access for the Gemini API and Gemini CLI are structured as follows: Gemini API Free Tier The Gemini API free tier is designed for developers and small projects [1][2]. It provides free access to input and output tokens, but it is subject to specific rate limits and model restrictions [1][2]. - Model Access: The free tier is restricted to Flash models (e.g., Gemini 2.5 Flash and Flash-Lite) [3]. Access to Pro models typically requires a paid API key or a subscription [3]. - Rate Limits: Limits are project-based and can be viewed in Google AI Studio [4][5]. While specific limits vary by model, they are generally lower than those in paid tiers [4][5][6]. - Data Usage: Content submitted via the free tier may be used by Google to improve its products [1][2]. Gemini CLI Free Tier The Gemini CLI offers a free tier that depends on the authentication method used [7][8]. - Authentication via Google Account (Gemini Code Assist for individuals): This method allows for 1,000 model requests per user per day and 60 model requests per user per minute [7][9][8]. - Authentication via Gemini API Key (Unpaid): This method is limited to 250 model requests per user per day and 10 model requests per user per minute, with access restricted to Flash models only [7][8]. - Vertex AI (Express Mode): This offers a trial period (typically 90 days) before billing must be enabled, with variable quotas and model access specific to the account [7][8]. Note: Usage limits and model availability are subject to change [10]. Developers are encouraged to check the official Google AI Studio and Gemini API documentation for the most current information [4][5][10]. Citations:
Consider removing or qualifying hardcoded Gemini quotas in README. Line 160 specifies 🤖 Prompt for AI Agents |
||
|
|
||
| ## Usage | ||
|
|
||
|
|
@@ -233,7 +233,8 @@ Features: 6 filter tabs, 4 sort modes, grouped/flat view, lazy-loaded previews, | |
|
|
||
| ``` | ||
| career-ops/ | ||
| ├── CLAUDE.md # Agent instructions | ||
| ├── AGENTS.md # Canonical agent instructions (all CLIs) | ||
| ├── CLAUDE.md # Claude Code wrapper (imports AGENTS.md) | ||
| ├── cv.md # Your CV (create this) | ||
| ├── article-digest.md # Your proof points (optional) | ||
| ├── config/ | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1 +1 @@ | ||
| 1.6.0 | ||
| 1.8.0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do not reclassify a previously user-layer path into system-layer ownership.
This change makes
writing-samples/README.mdsystem-owned while the parentwriting-samples/*path is user data. That weakens the contract and can permit updater writes inside a user-layer directory.As per coding guidelines:
DATA_CONTRACT.md: “This file defines system vs user file boundaries. Changes here are critical — reject if user-layer files are being reclassified.”Also applies to: 65-65
🤖 Prompt for AI Agents