skilldrop-cli 0.16.7 → 0.16.8

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.
Files changed (46) hide show
  1. package/README.md +1 -1
  2. package/catalogue.json +3 -2
  3. package/model-routing.json +4 -0
  4. package/package.json +1 -1
  5. package/packs/career/loops/apply/LOOP.md +19 -10
  6. package/packs/career/loops/apply/loop.json +9 -3
  7. package/packs/career/pack.json +27 -7
  8. package/packs/career/skills/application-form-answers/SKILL.md +146 -0
  9. package/packs/career/skills/application-form-answers/evals/eval_queries.json +34 -0
  10. package/packs/career/skills/application-form-answers/evals/evals.json +103 -0
  11. package/packs/career/skills/application-form-answers/evals/files/1/form.md +17 -0
  12. package/packs/career/skills/application-form-answers/evals/files/1/posting.md +20 -0
  13. package/packs/career/skills/application-form-answers/evals/files/1/resume.md +32 -0
  14. package/packs/career/skills/application-form-answers/evals/files/2/form.md +15 -0
  15. package/packs/career/skills/application-form-answers/evals/files/2/posting.md +21 -0
  16. package/packs/career/skills/application-form-answers/evals/files/2/resume.md +32 -0
  17. package/packs/career/skills/application-form-answers/evals/files/4/form.md +14 -0
  18. package/packs/career/skills/application-form-answers/evals/files/4/posting.md +25 -0
  19. package/packs/career/skills/application-form-answers/evals/files/4/resume.md +29 -0
  20. package/packs/career/skills/application-form-answers/evals/files/5/form.md +15 -0
  21. package/packs/career/skills/application-form-answers/evals/files/5/posting.md +18 -0
  22. package/packs/career/skills/application-form-answers/evals/files/5/resume.md +23 -0
  23. package/packs/career/skills/application-form-answers/evals/files/6/form.md +11 -0
  24. package/packs/career/skills/application-form-answers/evals/files/6/posting.md +28 -0
  25. package/packs/career/skills/application-form-answers/evals/files/6/resume.md +35 -0
  26. package/packs/career/skills/application-form-answers/evals/files/7/form.md +11 -0
  27. package/packs/career/skills/application-form-answers/evals/files/7/posting.md +19 -0
  28. package/packs/career/skills/application-form-answers/evals/files/7/resume.md +26 -0
  29. package/packs/career/skills/application-form-answers/manifest.json +31 -0
  30. package/packs/career/skills/cover-letter/scripts/claim_check.py +7 -4
  31. package/packs/career/skills/job-fit-analysis/SKILL.md +26 -10
  32. package/packs/career/skills/job-fit-analysis/evals/evals.json +26 -0
  33. package/packs/career/skills/job-fit-analysis/evals/files/6/linkedin-about.txt +5 -0
  34. package/packs/career/skills/job-fit-analysis/evals/files/6/posting.md +25 -0
  35. package/packs/career/skills/job-fit-analysis/evals/files/6/resume.md +35 -0
  36. package/packs/career/skills/job-fit-analysis/evals/files/7/resume.md +32 -0
  37. package/packs/career/skills/job-fit-analysis/manifest.json +1 -1
  38. package/packs/career/skills/resume-tailor/SKILL.md +37 -9
  39. package/packs/career/skills/resume-tailor/evals/evals.json +28 -0
  40. package/packs/career/skills/resume-tailor/evals/files/8/posting.md +25 -0
  41. package/packs/career/skills/resume-tailor/evals/files/8/resume.typ +31 -0
  42. package/packs/career/skills/resume-tailor/evals/files/9/linkedin-about.txt +5 -0
  43. package/packs/career/skills/resume-tailor/evals/files/9/posting.md +25 -0
  44. package/packs/career/skills/resume-tailor/evals/files/9/resume.md +35 -0
  45. package/packs/career/skills/resume-tailor/manifest.json +1 -1
  46. package/packs/career/skills/resume-tailor/scripts/claim_check.py +7 -4
@@ -24,10 +24,15 @@ These four rules outrank the steps below.
24
24
  - **Write for the recruiter.** The file contains the resume and nothing else: no notes,
25
25
  no placeholders, no brackets, no mention of this skill.
26
26
 
27
- 1. **Read both documents.** From the posting take the requirements in the employer's words,
28
- required before preferred. From the resume take every job, date, title, qualification,
29
- tool and number. If the person told you facts that are not in the resume, save them to
30
- `notes.md` so they count as source material.
27
+ 1. **Read everything the person gave you.** From the posting take the requirements in the
28
+ employer's words, required before preferred. From the resume take every job, date, title,
29
+ qualification, tool and number. The person's own material also counts as a source: facts
30
+ they tell you, and any file they point to, such as a LinkedIn summary, a portfolio page
31
+ or a project's README. Save every fact that is not in the resume to `notes.md`, with
32
+ where it came from.
33
+
34
+ When the posting is a link, read the full text. If you cannot open it, say so and ask for
35
+ the text pasted in. Never rebuild a posting from what you remember of the employer.
31
36
 
32
37
  2. **Decide what leads.** For each requirement find the resume lines that answer it. Lines
33
38
  that answer a required item move up within their job; lines that answer nothing in this
@@ -50,16 +55,30 @@ These four rules outrank the steps below.
50
55
  4. **Write the summary last**, two or three lines at the top, built only from lines below it.
51
56
  Use the resume's own job title, not the posting's.
52
57
 
53
- 5. **Keep it sendable.** Same sections and no more pages than the original; one
58
+ 5. **Work in the resume's own format.** Many resumes are built from a source file: Typst,
59
+ LaTeX, Word, a resume builder's data file. Find that file and edit a copy of it, named
60
+ `resume-<employer>` with the same extension, beside the original. Never edit the original
61
+ or anything else in its project. Keep the source valid: its imports, its escapes (`\$`,
62
+ `\&`), its structure. Build the copy the way the original is built when the tool is
63
+ there (`typst compile`, `pdflatex`), and look at the page count of what comes out. If you
64
+ cannot build it, say so and give the command; do not describe a PDF you did not make.
65
+
66
+ 6. **Treat the page count as a budget.** The result has no more pages than the original.
67
+ Anything you add is paid for with a cut, and every line you cut is reported in the reply
68
+ with a few words on why, so the person can ask for it back. Cut what answers nothing in
69
+ this posting first: older roles' detail before recent roles', a third example of the same
70
+ point before the only example of another.
71
+
72
+ 7. **Keep it sendable.** Same sections as the original; one
54
73
  column, standard headings, no tables, images or text boxes, so application systems can
55
74
  parse it. Keep the person's contact details, spelling convention and the word they use
56
75
  (resume or CV). Do not add a photo, date of birth or anything the original left out.
57
76
  Employment gaps stay as the original shows them.
58
77
 
59
- 6. **Write a new file** beside the original, `resume-<employer>.md`, or the original's format
60
- when you can produce it. Never overwrite the original.
78
+ 8. **Write a new file** beside the original: `resume-<employer>.md` for a text or Markdown
79
+ resume, or the copy from step 5. Never overwrite the original.
61
80
 
62
- 7. **Run the check and resolve every line it prints:**
81
+ 9. **Run the check and resolve every line it prints:**
63
82
 
64
83
  ```
65
84
  python3 ${CLAUDE_SKILL_DIR}/scripts/claim_check.py resume-<employer>.md --source <original> --posting <posting>
@@ -71,9 +90,12 @@ These four rules outrank the steps below.
71
90
  source line that shows the same thing or take it out. Rerun until what remains is wording
72
91
  you can trace. If you cannot run it, do the same check by reading.
73
92
 
74
- 8. **Reply in this order, briefly:**
93
+ 10. **Reply in this order, briefly:**
75
94
  - the file name, or the resume itself when you cannot write files;
76
95
  - **What changed**: four to six lines;
96
+ - **Cut**: each line you removed, with a few words on why. Say "nothing cut" when so;
97
+ - **Added from outside the resume**: each fact that came from what they told you or from
98
+ another file, with where it came from, for them to confirm before sending;
77
99
  - **Not claimed**: each thing the posting asks for that the resume doesn't support, so the
78
100
  person knows what the employer will notice;
79
101
  - **Would be stronger with**: up to five short questions whose answers you could add,
@@ -90,6 +112,8 @@ build one only from what the person tells you about their history, and say what
90
112
  - **The posting's required items are answered in the top half**, wherever the resume can.
91
113
  - **The file can be sent as it is**: no placeholders, notes or brackets.
92
114
  - **What the resume cannot claim is reported to the person, not papered over.**
115
+ - **Nothing is cut silently and nothing from outside the resume is added silently.**
116
+ - **The original file and its project are untouched.**
93
117
 
94
118
  ## When to use this skill
95
119
 
@@ -113,4 +137,8 @@ build one only from what the person tells you about their history, and say what
113
137
  - ❌ **Smoothing over a gap** by changing dates or dropping months.
114
138
  - ❌ **Rewriting everything.** A recruiter should still recognise the person's own career.
115
139
  - ❌ **A longer resume than the original.** Tailoring cuts.
140
+ - ❌ **A silent cut.** The person finds out at interview that their favourite line is gone.
141
+ - ❌ **Converting the format.** A Typst or Word resume handed back as Markdown loses the
142
+ design the person chose and cannot be sent.
143
+ - ❌ **Claiming a build.** "The PDF is two pages" when no PDF was produced.
116
144
  - ❌ **Showing the machinery.** No mention of the check, this skill, or how the file was made.
@@ -100,6 +100,34 @@
100
100
  "Running the kitchen on the head chef's days off, the costed weekly specials and the hotel banqueting are in the top half of the CV",
101
101
  "The reply tells him what the posting asks for that the CV does not claim, naming Level 3 Food Safety or the team size"
102
102
  ]
103
+ },
104
+ {
105
+ "id": 8,
106
+ "prompt": "Tailor my CV for this customer success job (posting.md). The CV is resume.typ - I build the PDF from that with Typst.",
107
+ "assertions": [
108
+ "The tailored CV is written as a new Typst file (for example resume-brightloop.typ) and resume.typ is left unchanged",
109
+ "The new file is still Typst source, keeping the page setup and the role helper; it is not converted to Markdown or plain text",
110
+ "'Hart & Lowe Software' and 'Research & Insights' appear exactly as in the original",
111
+ "The renewals line keeps 40 accounts and $1.2M and still says she supported renewals alongside the account managers; it does not say she owned or managed the renewals, a $1.2M book or a revenue target",
112
+ "Gainsight and a customer success certification are not claimed",
113
+ "Her job titles stay Support Team Lead, Support Agent then Senior Support Agent, and Customer Service Adviser, with the original dates",
114
+ "The reply lists each line that was cut, or says that nothing was cut",
115
+ "The reply does not state a page count or say a PDF was built unless the run actually produced a PDF file"
116
+ ]
117
+ },
118
+ {
119
+ "id": 9,
120
+ "prompt": "Tailor my CV (resume.md) to posting.md. linkedin-about.txt has a couple of things that aren't on my CV.",
121
+ "assertions": [
122
+ "The monthly onboarding webinar for new customers is added to the CV with the figures as she gave them: since January 2024, around 30 people",
123
+ "Co-chairing the Customer Advisory Board is added or offered, with 8 customers and twice a year unchanged if figures are given",
124
+ "The reply lists what was added from the LinkedIn text separately from the other changes, for her to confirm",
125
+ "She is not said to have owned renewals or carried a revenue target; the renewals line still says she supported them",
126
+ "Gainsight is not claimed",
127
+ "Three or more years in customer success or account management is not claimed, and her job titles are unchanged",
128
+ "The reading mentor volunteering is left out or kept as volunteering; it is not presented as customer experience",
129
+ "The reply names what the posting asks for that the CV cannot claim, such as owning renewals or Gainsight"
130
+ ]
103
131
  }
104
132
  ]
105
133
  }
@@ -0,0 +1,25 @@
1
+ # Customer Success Manager
2
+
3
+ **Brightloop** · Manchester (hybrid) · £48,000 – £55,000
4
+
5
+ Brightloop makes scheduling software for 900 dental and veterinary practices.
6
+
7
+ ## What you'll do
8
+
9
+ - Own a book of 60 mid-market accounts and be accountable for their renewals
10
+ - Run onboarding and training for new customers
11
+ - Lead quarterly business reviews
12
+ - Bring customer feedback to the product team
13
+
14
+ ## What we need
15
+
16
+ - 3+ years in customer success or account management at a B2B software company
17
+ - Experience owning renewals or a revenue target
18
+ - Experience running customer onboarding or training
19
+ - Confident with Salesforce and a customer success platform such as Gainsight
20
+ - Experience leading or mentoring a small team
21
+
22
+ ## Nice to have
23
+
24
+ - A customer success certification
25
+ - Experience working with a product team on customer feedback
@@ -0,0 +1,31 @@
1
+ #set page(paper: "a4", margin: 14mm)
2
+ #set text(size: 10pt)
3
+ #let role(title, org, dates) = grid(columns: (1fr, auto), [*#title* · #org], dates)
4
+
5
+ = Nadia Rahman
6
+ Manchester · nadia.rahman\@example.com · 07700 900612
7
+
8
+ == Profile
9
+ Support team lead with seven years in B2B software support.
10
+
11
+ == Experience
12
+ #role("Support Team Lead", "Hart & Lowe Software", "March 2022 – present")
13
+ - Lead a team of 6 support agents covering 310 customer accounts.
14
+ - Supported renewals for 40 accounts worth \$1.2M a year by joining the account managers' quarterly reviews.
15
+ - Cut median first-response time from 9 hours to 3 hours by rewriting the triage rules in Zendesk.
16
+ - Built the weekly ticket-trends report in Salesforce that the Research & Insights team uses to plan fixes.
17
+ - Wrote 35 help-centre articles; self-service now resolves about a quarter of new tickets.
18
+ - Hire and onboard new agents; 4 hired since 2023.
19
+
20
+ #role("Support Agent, then Senior Support Agent", "Hart & Lowe Software", "June 2019 – March 2022")
21
+ - Handled billing and integration tickets for mid-market customers.
22
+ - Trained 5 new agents on the billing queue.
23
+
24
+ #role("Customer Service Adviser", "Pennine Water", "September 2017 – May 2019")
25
+ - Answered account and billing calls.
26
+
27
+ == Education
28
+ BA English Literature, University of Leeds, 2017
29
+
30
+ == Tools
31
+ Zendesk, Salesforce (reports & dashboards), Jira, Excel
@@ -0,0 +1,5 @@
1
+ About
2
+
3
+ I lead the support team at Hart & Lowe Software. Since January 2024 I've also run our monthly onboarding webinar for new customers, usually around 30 people on the call, and I co-chair the Customer Advisory Board with our Head of Product (8 customers, meets twice a year).
4
+
5
+ Outside work I volunteer as a reading mentor at a primary school.
@@ -0,0 +1,25 @@
1
+ # Customer Success Manager
2
+
3
+ **Brightloop** · Manchester (hybrid) · £48,000 – £55,000
4
+
5
+ Brightloop makes scheduling software for 900 dental and veterinary practices.
6
+
7
+ ## What you'll do
8
+
9
+ - Own a book of 60 mid-market accounts and be accountable for their renewals
10
+ - Run onboarding and training for new customers
11
+ - Lead quarterly business reviews
12
+ - Bring customer feedback to the product team
13
+
14
+ ## What we need
15
+
16
+ - 3+ years in customer success or account management at a B2B software company
17
+ - Experience owning renewals or a revenue target
18
+ - Experience running customer onboarding or training
19
+ - Confident with Salesforce and a customer success platform such as Gainsight
20
+ - Experience leading or mentoring a small team
21
+
22
+ ## Nice to have
23
+
24
+ - A customer success certification
25
+ - Experience working with a product team on customer feedback
@@ -0,0 +1,35 @@
1
+ # Nadia Rahman
2
+
3
+ Manchester · nadia.rahman@example.com · 07700 900612
4
+
5
+ ## Profile
6
+
7
+ Support team lead with seven years in B2B software support.
8
+
9
+ ## Experience
10
+
11
+ **Support Team Lead** · Hart & Lowe Software · March 2022 – present
12
+
13
+ - Lead a team of 6 support agents covering 310 customer accounts.
14
+ - Supported renewals for 40 accounts worth $1.2M a year by joining the account managers' quarterly reviews.
15
+ - Cut median first-response time from 9 hours to 3 hours by rewriting the triage rules in Zendesk.
16
+ - Built the weekly ticket-trends report in Salesforce that the Research & Insights team uses to plan fixes.
17
+ - Wrote 35 help-centre articles; self-service now resolves about a quarter of new tickets.
18
+ - Hire and onboard new agents; 4 hired since 2023.
19
+
20
+ **Support Agent, then Senior Support Agent** · Hart & Lowe Software · June 2019 – March 2022
21
+
22
+ - Handled billing and integration tickets for mid-market customers.
23
+ - Trained 5 new agents on the billing queue.
24
+
25
+ **Customer Service Adviser** · Pennine Water · September 2017 – May 2019
26
+
27
+ - Answered account and billing calls.
28
+
29
+ ## Education
30
+
31
+ BA English Literature, University of Leeds, 2017
32
+
33
+ ## Tools
34
+
35
+ Zendesk, Salesforce (reports & dashboards), Jira, Excel
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resume-tailor",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Tailor a resume or CV to one job posting without adding anything that isn't true: reorder, cut and reword what the person has already done so the posting's needs are answered first, keep every employer, title, date and number as it was, and report what the posting asks for that the resume cannot claim. A script lists every figure and name in the draft that the original doesn't contain. Works for any occupation and level. Use when the user says \"tailor my resume for this job\", \"adapt my CV to this posting\", \"rewrite my resume for this role\", or pastes a job description next to their resume.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -31,7 +31,7 @@ MULT = {"k": 1e3, "thousand": 1e3, "m": 1e6, "mm": 1e6, "million": 1e6,
31
31
  "bn": 1e9, "b": 1e9, "billion": 1e9}
32
32
  NUMBER = re.compile(r"(?<![\w.])(\d[\d,]*(?:\.\d+)?)(?:(k|mm|m|bn|b)\b|\s?(thousand|million|billion)\b)?"
33
33
  r"(\s?%|\s?percent\b|\s?per cent\b)?", re.I)
34
- WORD = re.compile(r"\.?[A-Za-z][A-Za-z0-9+#']*(?:\.[A-Za-z0-9]+)*")
34
+ WORD = re.compile(r"(?<![A-Za-z0-9])\.?[A-Za-z][A-Za-z0-9+#']*(?:\.[A-Za-z0-9]+)*")
35
35
  LIST_MARK = re.compile(r"^\s*(?:[-*•–>]+|\d+[.)]|#+|\|)\s*")
36
36
  LINK = re.compile(r"\[([^\]]*)\]\([^)]*\)")
37
37
  SUFFIXES = ("ations", "ation", "ments", "ment", "ings", "ing", "ers", "ies", "ed", "er", "es", "s", "ly")
@@ -73,8 +73,11 @@ def read(path):
73
73
 
74
74
 
75
75
  def clean(line):
76
- """A line with its markdown removed, so `**Go**` and `Go` read the same."""
76
+ """A line with its markup removed, so `**Go**` and `Go` read the same. Resumes kept as
77
+ Typst or LaTeX source escape `$`, `&`, `%` and `#`; the escapes are dropped too."""
77
78
  line = LINK.sub(r"\1", line)
79
+ line = re.sub(r"\\([$&%#_])", r"\1", line)
80
+ line = re.sub(r"(?<![$£€\w.,])\d+(?:\.\d+)?(?:em|mm|pt|cm|px|fr)\b", " ", line) # layout lengths
78
81
  line = line.replace("’", "'").replace("‘", "'").replace("–", " - ").replace("—", " - ")
79
82
  return re.sub(r"[*_`~]", "", line)
80
83
 
@@ -133,7 +136,7 @@ def phrases(line):
133
136
  so it only counts when it is name-shaped itself or opens a longer capitalised run."""
134
137
  text = LIST_MARK.sub("", clean(line))
135
138
  out, run, start_of_sentence = [], [], True
136
- tokens = re.findall(r"\.?[A-Za-z][A-Za-z0-9+#']*(?:\.[A-Za-z0-9]+)*|&|[.!?;:]\s|[,|·/()]|\s-\s", text + " ")
139
+ tokens = re.findall(r"(?<![A-Za-z0-9])\.?[A-Za-z][A-Za-z0-9+#']*(?:\.[A-Za-z0-9]+)*|&|[.!?;:]\s|[,|·/()]|\s-\s", text + " ")
137
140
  for i, tok in enumerate(tokens):
138
141
  if not (tok[0].isalpha() or tok[0] in ".&") or tok.strip() in (".", "!", "?", ";", ":"):
139
142
  if run:
@@ -200,7 +203,7 @@ def check(draft, sources, posting):
200
203
  if missing:
201
204
  add("name", " ".join(words), n, raw, all(key(w) in post_names for w in missing))
202
205
  elif len(content) > 1 and all(w.lower() not in PLAIN for w in content):
203
- flat = " ".join(key(w) for w in words)
206
+ flat = " ".join(key(w) for w in words if w != "&")
204
207
  if " " + flat + " " not in src_flat:
205
208
  add("combination", " ".join(words), n, raw)
206
209
  if posting: