Anubis
/install anubis
Anubis Standard -- Career Application Engine
Full resume rewrite tailored to a job description. ATS-optimised. Complete cover letter. All saved to files ready to submit.
Step 1 -- Install
pip3 install rich --break-system-packages --quiet
Step 2 -- Validate and load documents
import os, sys, re
from datetime import datetime
from rich.console import Console
from rich.panel import Panel
from rich.table import Table
from rich.rule import Rule
from rich import box
console = Console()
LICENSE_KEY = os.environ.get("LICENSE_KEY", "").strip()
if not LICENSE_KEY or not LICENSE_KEY.startswith("ANUBIS-STD-"):
console.print(Panel(
"[red bold]Anubis Standard requires a license key.[/red bold]\
\
"
"Get your key at: [bold cyan]ko-fi.com/occupythemilkyway[/bold cyan]\
\
"
"Or use the free version: [dim]openclaw skills install anubis-lite[/dim]",
title="License Required",
border_style="red"
))
sys.exit(1)
JD = os.environ.get("JOB_DESCRIPTION", "").strip()
RESUME_PATH = os.environ.get("RESUME_PATH", "").strip()
YOUR_NAME = os.environ.get("YOUR_NAME", "").strip()
COVER_TONE = os.environ.get("COVER_TONE", "professional").lower().strip()
OUTPUT_DIR = os.environ.get("OUTPUT_DIR", "./anubis_output").strip()
if not JD:
console.print(Panel("[red]JOB_DESCRIPTION is required.[/red]", title="Error", border_style="red"))
sys.exit(1)
if not RESUME_PATH or not os.path.exists(RESUME_PATH):
console.print(Panel(f"[red]RESUME_PATH not found: {RESUME_PATH}[/red]", title="Error", border_style="red"))
sys.exit(1)
os.makedirs(OUTPUT_DIR, exist_ok=True)
with open(RESUME_PATH, encoding="utf-8", errors="replace") as fh:
resume_text = fh.read()
# ATS keyword extraction
TECH_KW = ["python","javascript","typescript","react","node","sql","aws","azure","gcp","docker",
"kubernetes","machine learning","ai","data","api","rest","agile","scrum","product",
"management","leadership","analytics","excel","tableau","salesforce","java","go"]
SOFT_KW = ["communication","collaboration","problem-solving","leadership","analytical",
"strategic","cross-functional","stakeholder","detail-oriented"]
jd_lower = JD.lower()
ats_tech = [k for k in TECH_KW if k in jd_lower]
ats_soft = [k for k in SOFT_KW if k in jd_lower]
exp_match = re.findall(r"(\d+)\+?\s*years?", JD, re.IGNORECASE)
exp_req = exp_match[0] + "+ years" if exp_match else "Not specified"
role_line = JD.split("\
")[0].strip()[:80]
console.print()
console.print(Panel.fit(
f"[bold magenta]🐺 Anubis Standard -- Career Application Engine[/bold magenta]\
"
f"Role: [cyan]{role_line}[/cyan]\
"
f"Exp: [white]{exp_req}[/white]\
"
f"Tone: [white]{COVER_TONE}[/white]\
"
f"Output: [green]{OUTPUT_DIR}/[/green]",
border_style="magenta"
))
tbl = Table(title="ATS Analysis", box=box.SIMPLE, border_style="magenta")
tbl.add_column("Category", style="dim", width=20)
tbl.add_column("Keywords", style="cyan")
tbl.add_row("Technical", ", ".join(ats_tech) or "None detected")
tbl.add_row("Soft skills", ", ".join(ats_soft) or "None detected")
console.print(tbl)
console.print(Rule("[magenta]Loading documents...[/magenta]"))
print(f"\
=== CURRENT RESUME ===\
{resume_text}\
=== END RESUME ===")
print(f"\
=== JOB DESCRIPTION ===\
{JD}\
=== END JD ===")
Step 3 -- Generate tailored application
Based on the resume and job description above, generate two complete documents:
Document 1: TAILORED_RESUME.md Rewrite the candidate's resume to be perfectly tailored for this job:
- Reorder and rewrite ALL bullet points using action verbs from the JD
- Add/emphasize every ATS keyword found in the JD that legitimately applies
- Rewrite the summary/objective to match the role exactly
- Restructure sections if needed for this role type
- Preserve all true facts -- only reframe, never fabricate
- Format cleanly in markdown
Document 2: COVER_LETTER.md Write a complete cover letter in the {COVER_TONE} tone:
- Opening: specific hook referencing something about the company or role
- Body paragraph 1: your strongest alignment with their top 2-3 requirements
- Body paragraph 2: a specific achievement that proves you can do the job
- Body paragraph 3: why THIS company specifically (research the company from JD clues)
- Closing: confident call to action
- Sign off with {YOUR_NAME} or "[Your Name]" if not provided
Both documents must be submission-ready. No placeholders unless genuinely unknown.
Step 4 -- Save and confirm
import os
from datetime import datetime
from rich.console import Console
from rich.panel import Panel
from rich.table import Table
from rich import box
console = Console()
date_str = datetime.now().strftime("%Y%m%d")
resume_out = os.path.join(OUTPUT_DIR, f"tailored_resume_{date_str}.md")
letter_out = os.path.join(OUTPUT_DIR, f"cover_letter_{date_str}.md")
tbl = Table(title="Anubis -- Application Package Ready", box=box.SIMPLE, border_style="green")
tbl.add_column("File", style="cyan")
tbl.add_column("Description", style="dim")
tbl.add_row(resume_out, "ATS-optimised tailored resume")
tbl.add_row(letter_out, f"Cover letter ({COVER_TONE} tone)")
console.print()
console.print(tbl)
console.print(Panel(
"[bold green]Application package complete.[/bold green]\
\
"
"Upgrade to [magenta]Anubis Pro ($9)[/magenta] for interview Q&As, follow-up email templates, and application tracking.\
"
"-> [cyan]ko-fi.com/occupythemilkyway[/cyan]",
border_style="green"
))
Save both files to OUTPUT_DIR using your file writing tool, then display the confirmation.
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install anubis - 安装完成后,直接呼叫该 Skill 的名称或使用
/anubis触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Anubis 是什么?
Anubis Standard -- Career Application Engine. Full resume rewrite + cover letter tailored to a specific job. ATS-optimised. Saved to files. 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 42 次。
如何安装 Anubis?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install anubis」即可一键安装,无需额外配置。
Anubis 是免费的吗?
是的,Anubis 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。
Anubis 支持哪些平台?
Anubis 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 Anubis?
由 OccupyTheMilkyWay(@occupythemilkyway)开发并维护,当前版本 v1.0.0。