360 Secure SkillHub
360 安全技能中心

Anubis

核心功能:基于职位描述和现有简历,重写ATS优化的定制简历,生成指定语气的求职信并保存。典型使用场景:求职时针对特定岗位优化申请材料,提升ATS筛选通过率。输入需提供职位描述文本、简历路径、许可证密钥,可自定义姓名、求职信语气、输出目录;输出为两个可直接提交的Markdown文件。

occupythemilkyway
occupythemilkyway
热度 16.02
最近更新 2026-05-28 03:29:22
分类:效率依赖:代码执行 / 读写文件 / 内部调用大模型应用场景:文案创作 / 数据处理

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add anubis
Metadata
name
anubis
description
Anubis Standard -- Career Application Engine. Full resume rewrite + cover letter tailored to a specific job. ATS-optimised. Saved to files.
version
1.0.0
metadata
{"openclaw":{"requires":{"env":["JOB_DESCRIPTION","RESUME_PATH","LICENSE_KEY"],"bins":["python3","pip3"]},"primaryEnv":"JOB_DESCRIPTION","emoji":"🐺📋","homepage":"https://clawhub.ai/occupythemilkyway/anubis","tags":["resume","career","job","cover-letter","ats","keywords","standard","anubis"],"envVars":[{"name":"LICENSE_KEY","required":true,"description":"Your Anubis Standard license key. Get one at: ko-fi.com/occupythemilkyway"},{"name":"JOB_DESCRIPTION","required":true,"description":"The full job description text"},{"name":"RESUME_PATH","required":true,"description":"Path to your current resume file (.txt, .md, or .pdf text)"},{"name":"YOUR_NAME","required":false,"description":"Your name for the cover letter","default":""},{"name":"COVER_TONE","required":false,"description":"Cover letter tone: professional | conversational | executive (default: professional)","default":"professional"},{"name":"OUTPUT_DIR","required":false,"description":"Where to save outputs (default: ./anubis_output)","default":"./anubis_output"}]}}

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]\n\n"
        "Get your key at: [bold cyan]ko-fi.com/occupythemilkyway[/bold cyan]\n\n"
        "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("\n")[0].strip()[:80]

console.print()
console.print(Panel.fit(
    f"[bold magenta]🐺 Anubis Standard -- Career Application Engine[/bold magenta]\n"
    f"Role:   [cyan]{role_line}[/cyan]\n"
    f"Exp:    [white]{exp_req}[/white]\n"
    f"Tone:   [white]{COVER_TONE}[/white]\n"
    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"\n=== CURRENT RESUME ===\n{resume_text}\n=== END RESUME ===")
print(f"\n=== JOB DESCRIPTION ===\n{JD}\n=== 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]\n\n"
    "Upgrade to [magenta]Anubis Pro ($9)[/magenta] for interview Q&As, follow-up email templates, and application tracking.\n"
    "-> [cyan]ko-fi.com/occupythemilkyway[/cyan]",
    border_style="green"
))

Save both files to OUTPUT_DIR using your file writing tool, then display the confirmation.