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.
- package/README.md +1 -1
- package/catalogue.json +3 -2
- package/model-routing.json +4 -0
- package/package.json +1 -1
- package/packs/career/loops/apply/LOOP.md +19 -10
- package/packs/career/loops/apply/loop.json +9 -3
- package/packs/career/pack.json +27 -7
- package/packs/career/skills/application-form-answers/SKILL.md +146 -0
- package/packs/career/skills/application-form-answers/evals/eval_queries.json +34 -0
- package/packs/career/skills/application-form-answers/evals/evals.json +103 -0
- package/packs/career/skills/application-form-answers/evals/files/1/form.md +17 -0
- package/packs/career/skills/application-form-answers/evals/files/1/posting.md +20 -0
- package/packs/career/skills/application-form-answers/evals/files/1/resume.md +32 -0
- package/packs/career/skills/application-form-answers/evals/files/2/form.md +15 -0
- package/packs/career/skills/application-form-answers/evals/files/2/posting.md +21 -0
- package/packs/career/skills/application-form-answers/evals/files/2/resume.md +32 -0
- package/packs/career/skills/application-form-answers/evals/files/4/form.md +14 -0
- package/packs/career/skills/application-form-answers/evals/files/4/posting.md +25 -0
- package/packs/career/skills/application-form-answers/evals/files/4/resume.md +29 -0
- package/packs/career/skills/application-form-answers/evals/files/5/form.md +15 -0
- package/packs/career/skills/application-form-answers/evals/files/5/posting.md +18 -0
- package/packs/career/skills/application-form-answers/evals/files/5/resume.md +23 -0
- package/packs/career/skills/application-form-answers/evals/files/6/form.md +11 -0
- package/packs/career/skills/application-form-answers/evals/files/6/posting.md +28 -0
- package/packs/career/skills/application-form-answers/evals/files/6/resume.md +35 -0
- package/packs/career/skills/application-form-answers/evals/files/7/form.md +11 -0
- package/packs/career/skills/application-form-answers/evals/files/7/posting.md +19 -0
- package/packs/career/skills/application-form-answers/evals/files/7/resume.md +26 -0
- package/packs/career/skills/application-form-answers/manifest.json +31 -0
- package/packs/career/skills/cover-letter/scripts/claim_check.py +7 -4
- package/packs/career/skills/job-fit-analysis/SKILL.md +26 -10
- package/packs/career/skills/job-fit-analysis/evals/evals.json +26 -0
- package/packs/career/skills/job-fit-analysis/evals/files/6/linkedin-about.txt +5 -0
- package/packs/career/skills/job-fit-analysis/evals/files/6/posting.md +25 -0
- package/packs/career/skills/job-fit-analysis/evals/files/6/resume.md +35 -0
- package/packs/career/skills/job-fit-analysis/evals/files/7/resume.md +32 -0
- package/packs/career/skills/job-fit-analysis/manifest.json +1 -1
- package/packs/career/skills/resume-tailor/SKILL.md +37 -9
- package/packs/career/skills/resume-tailor/evals/evals.json +28 -0
- package/packs/career/skills/resume-tailor/evals/files/8/posting.md +25 -0
- package/packs/career/skills/resume-tailor/evals/files/8/resume.typ +31 -0
- package/packs/career/skills/resume-tailor/evals/files/9/linkedin-about.txt +5 -0
- package/packs/career/skills/resume-tailor/evals/files/9/posting.md +25 -0
- package/packs/career/skills/resume-tailor/evals/files/9/resume.md +35 -0
- package/packs/career/skills/resume-tailor/manifest.json +1 -1
- 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
|
|
28
|
-
required before preferred. From the resume take every job, date, title,
|
|
29
|
-
tool and number.
|
|
30
|
-
|
|
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. **
|
|
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
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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:
|