@nexus-cortex/server 4.26.0
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/.cortex/agents/AGENT_PROFILE_GUIDE.md +307 -0
- package/.cortex/agents/README.md +268 -0
- package/.cortex/agents/a-frontend-landing-page-designer.md +41 -0
- package/.cortex/agents/autoresearch-agent.md +49 -0
- package/.cortex/agents/code-reviewer.md +63 -0
- package/.cortex/agents/context-research.md +26 -0
- package/.cortex/agents/doc-writer.md +92 -0
- package/.cortex/agents/explore.md +63 -0
- package/.cortex/agents/new-model-api-integrator-analyst.md +41 -0
- package/.cortex/agents/plan.md +109 -0
- package/.cortex/agents/pr-architecture-reviewer.md +77 -0
- package/.cortex/agents/pr-code-quality.md +78 -0
- package/.cortex/agents/pr-implementer.md +50 -0
- package/.cortex/agents/pr-security-auditor.md +62 -0
- package/.cortex/agents/pr-test-writer.md +67 -0
- package/.cortex/agents/refactor.md +118 -0
- package/.cortex/agents/test-writer.md +72 -0
- package/.cortex/agents/web-researcher.md +72 -0
- package/.cortex/bench/tasks/sample-tasks.json +20 -0
- package/.cortex/commands/compare.md +14 -0
- package/.cortex/commands/deps.md +16 -0
- package/.cortex/commands/diff.md +14 -0
- package/.cortex/commands/explain.md +16 -0
- package/.cortex/commands/find-bug.md +13 -0
- package/.cortex/commands/profile.md +15 -0
- package/.cortex/commands/review.md +18 -0
- package/.cortex/commands/search.md +16 -0
- package/.cortex/commands/test.md +15 -0
- package/.cortex/permissions.dev.json +20 -0
- package/.cortex/permissions.example.json +71 -0
- package/.cortex/permissions.prod.json +63 -0
- package/.cortex/permissions.test.json +19 -0
- package/.cortex/skills/autoresearch/SKILL.md +77 -0
- package/.cortex/skills/autoresearch/personas/README.md +45 -0
- package/.cortex/skills/autoresearch/personas/aggressive-refactor.md +25 -0
- package/.cortex/skills/autoresearch/personas/creative.md +29 -0
- package/.cortex/skills/autoresearch/personas/perf-hunter.md +27 -0
- package/.cortex/skills/autoresearch/personas/precise.md +23 -0
- package/.cortex/skills/autoresearch/personas/root-cause.md +26 -0
- package/.cortex/skills/autoresearch/personas/security-auditor.md +29 -0
- package/.cortex/skills/autoresearch/personas/skeptic-reviewer.md +31 -0
- package/.cortex/skills/autoresearch/personas/test-first.md +25 -0
- package/.cortex/skills/best-of-n/SKILL.md +76 -0
- package/.cortex/skills/cortex/SKILL.md +834 -0
- package/.cortex/skills/cortex-bench/SKILL.md +354 -0
- package/.cortex/skills/docx/SKILL.md +83 -0
- package/.cortex/skills/pdf-documents/SKILL.md +297 -0
- package/.cortex/skills/pdf-documents/sections/01-image-acquisition.md +132 -0
- package/.cortex/skills/pdf-documents/sections/02-ai-image-generation.md +274 -0
- package/.cortex/skills/pdf-documents/sections/03-paper-sizes.md +89 -0
- package/.cortex/skills/pdf-documents/sections/04-design-system.md +549 -0
- package/.cortex/skills/pdf-documents/sections/05-css-print-rules.md +135 -0
- package/.cortex/skills/pdf-documents/sections/06-svg-charts.md +100 -0
- package/.cortex/skills/pdf-documents/sections/07-templates.md +224 -0
- package/.cortex/skills/pdf-documents/sections/08-scaled-output.md +164 -0
- package/.cortex/skills/pdf-documents/sections/09-preview-qa.md +66 -0
- package/.cortex/skills/pdf-documents/sections/10-reading-pdfs.md +499 -0
- package/.cortex/skills/pdf-documents/sections/11-form-filling.md +241 -0
- package/.cortex/skills/pptx/SKILL.md +90 -0
- package/.cortex/skills/resume-analyst/SKILL.md +373 -0
- package/.cortex/skills/verify-work/SKILL.md +74 -0
- package/.cortex/skills/xlsx/SKILL.md +101 -0
- package/.cortex/system-messages/messages/WORK_QUALITY.md +159 -0
- package/.cortex/system-messages/registry.json +18 -0
- package/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +13 -0
- package/bin/cortex-daemon.js +47 -0
- package/bin/cortex-server.js +15 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +513 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/cors.d.ts +10 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +11 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +10 -0
- package/dist/middleware/errorHandler.d.ts.map +1 -0
- package/dist/middleware/errorHandler.js +15 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/routes/approval.d.ts +2 -0
- package/dist/routes/approval.d.ts.map +1 -0
- package/dist/routes/approval.js +96 -0
- package/dist/routes/approval.js.map +1 -0
- package/dist/routes/config.d.ts +2 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +70 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/health.d.ts +2 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +1031 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/mcp.d.ts +2 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +251 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/messages.d.ts +5 -0
- package/dist/routes/messages.d.ts.map +1 -0
- package/dist/routes/messages.js +136 -0
- package/dist/routes/messages.js.map +1 -0
- package/dist/routes/middleware.d.ts +2 -0
- package/dist/routes/middleware.d.ts.map +1 -0
- package/dist/routes/middleware.js +146 -0
- package/dist/routes/middleware.js.map +1 -0
- package/dist/routes/models.d.ts +2 -0
- package/dist/routes/models.d.ts.map +1 -0
- package/dist/routes/models.js +29 -0
- package/dist/routes/models.js.map +1 -0
- package/dist/routes/permissions.d.ts +2 -0
- package/dist/routes/permissions.d.ts.map +1 -0
- package/dist/routes/permissions.js +253 -0
- package/dist/routes/permissions.js.map +1 -0
- package/dist/routes/pr.d.ts +2 -0
- package/dist/routes/pr.d.ts.map +1 -0
- package/dist/routes/pr.js +222 -0
- package/dist/routes/pr.js.map +1 -0
- package/dist/routes/sessions.d.ts +2 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +628 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/system-messages.d.ts +2 -0
- package/dist/routes/system-messages.d.ts.map +1 -0
- package/dist/routes/system-messages.js +146 -0
- package/dist/routes/system-messages.js.map +1 -0
- package/dist/routes/tools.d.ts +2 -0
- package/dist/routes/tools.d.ts.map +1 -0
- package/dist/routes/tools.js +79 -0
- package/dist/routes/tools.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# PDF Form Detection & Filling
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Detect AcroForm fields in existing PDF documents, inventory every field for the
|
|
6
|
+
user, fill values programmatically with baked appearance streams, and deliver
|
|
7
|
+
a completed PDF. Works with interactive AcroForm PDFs and provides a coordinate-overlay
|
|
8
|
+
fallback for scanned/non-interactive forms.
|
|
9
|
+
|
|
10
|
+
All processing via PyMuPDF. Install: `pip install pymupdf`
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Step 1: Install PyMuPDF (if needed)
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pip install pymupdf
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Step 2: Detect and Inventory All Fields
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
import fitz
|
|
24
|
+
import json
|
|
25
|
+
|
|
26
|
+
doc = fitz.open('form.pdf')
|
|
27
|
+
|
|
28
|
+
# PyMuPDF widget field_type values:
|
|
29
|
+
# 0=unknown, 1=PushButton, 2=CheckBox, 3=RadioButton,
|
|
30
|
+
# 4=ListBox, 5=ComboBox, 6=Signature, 7=Text
|
|
31
|
+
TYPE_NAMES = {0:'unknown', 1:'button', 2:'checkbox', 3:'radio',
|
|
32
|
+
4:'listbox', 5:'combobox', 6:'signature', 7:'text'}
|
|
33
|
+
|
|
34
|
+
fields = []
|
|
35
|
+
for page_num in range(len(doc)):
|
|
36
|
+
page = doc[page_num]
|
|
37
|
+
for widget in page.widgets():
|
|
38
|
+
field = {
|
|
39
|
+
'page': page_num + 1,
|
|
40
|
+
'index': len(fields),
|
|
41
|
+
'name': widget.field_name,
|
|
42
|
+
'type': TYPE_NAMES.get(widget.field_type, 'unknown'),
|
|
43
|
+
'type_id': widget.field_type,
|
|
44
|
+
'value': widget.field_value,
|
|
45
|
+
'rect': list(widget.rect),
|
|
46
|
+
'read_only': bool(widget.field_flags & 1),
|
|
47
|
+
}
|
|
48
|
+
if widget.field_type in (4, 5) and widget.choice_values:
|
|
49
|
+
field['options'] = widget.choice_values
|
|
50
|
+
if widget.field_type == 7 and widget.text_maxlen > 0:
|
|
51
|
+
field['max_length'] = widget.text_maxlen
|
|
52
|
+
fields.append(field)
|
|
53
|
+
|
|
54
|
+
doc.close()
|
|
55
|
+
|
|
56
|
+
print(f'Found {len(fields)} form fields across {len(doc)} pages')
|
|
57
|
+
for f in fields:
|
|
58
|
+
ro = ' [READ-ONLY]' if f['read_only'] else ''
|
|
59
|
+
val = f' = "{f["value"]}"' if f['value'] else ''
|
|
60
|
+
opts = f' options: {f["options"]}' if 'options' in f else ''
|
|
61
|
+
print(f' [{f["index"]:2d}] p{f["page"]} | {f["type"]:12} | {f["name"]}{val}{opts}{ro}')
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Present the inventory to the user and collect values before filling.
|
|
65
|
+
|
|
66
|
+
**IMPORTANT:** Fields with duplicate names (e.g., multiple "County" fields on the same
|
|
67
|
+
form) must be addressed by index, not by name. The index is the widget's position
|
|
68
|
+
in the `page.widgets()` list.
|
|
69
|
+
|
|
70
|
+
## Step 3: Fill the Form
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
import fitz
|
|
74
|
+
|
|
75
|
+
fill_data = {
|
|
76
|
+
'Full Name': 'John A. Smith',
|
|
77
|
+
'Date of Birth': '03/15/1985',
|
|
78
|
+
'State': 'TX',
|
|
79
|
+
'I Agree': True,
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# For duplicate field names, use index-based overrides:
|
|
83
|
+
# fill_by_index = { 10: 'Jefferson', 12: 'Jefferson', 23: 'Jefferson' }
|
|
84
|
+
|
|
85
|
+
doc = fitz.open('form.pdf')
|
|
86
|
+
|
|
87
|
+
for page in doc:
|
|
88
|
+
widgets = list(page.widgets())
|
|
89
|
+
for i, widget in enumerate(widgets):
|
|
90
|
+
# Set font properties for baked appearance streams
|
|
91
|
+
if widget.field_type in (6, 7): # Signature or Text
|
|
92
|
+
widget.text_fontsize = 0 # auto-fit to field rect
|
|
93
|
+
widget.text_color = (0, 0, 0)
|
|
94
|
+
|
|
95
|
+
# Index-based overrides first (for duplicate field names)
|
|
96
|
+
# if i in fill_by_index:
|
|
97
|
+
# widget.field_value = fill_by_index[i]
|
|
98
|
+
# widget.update()
|
|
99
|
+
# continue
|
|
100
|
+
|
|
101
|
+
name = widget.field_name
|
|
102
|
+
if name not in fill_data:
|
|
103
|
+
continue
|
|
104
|
+
|
|
105
|
+
value = fill_data[name]
|
|
106
|
+
|
|
107
|
+
if widget.field_type == 2: # checkbox
|
|
108
|
+
widget.field_value = 'Yes' if value else 'Off'
|
|
109
|
+
elif widget.field_type == 3: # radio
|
|
110
|
+
widget.field_value = str(value)
|
|
111
|
+
elif widget.field_type == 6: # signature — typed name
|
|
112
|
+
widget.field_value = str(value)
|
|
113
|
+
else:
|
|
114
|
+
widget.field_value = str(value)
|
|
115
|
+
|
|
116
|
+
widget.update()
|
|
117
|
+
|
|
118
|
+
# ── CRITICAL: Bake appearance streams ──────────────────────────
|
|
119
|
+
# Set NeedAppearances=false so ALL PDF viewers render the filled
|
|
120
|
+
# values. Without this, many viewers (web, mobile, lightweight)
|
|
121
|
+
# show blank fields — the #1 cause of "it filled but looks empty."
|
|
122
|
+
cat_xref = doc.pdf_catalog()
|
|
123
|
+
acro_ref = doc.xref_get_key(cat_xref, 'AcroForm')
|
|
124
|
+
if acro_ref[0] == 'xref':
|
|
125
|
+
af_xref = int(acro_ref[1].split()[0])
|
|
126
|
+
doc.xref_set_key(af_xref, 'NeedAppearances', 'false')
|
|
127
|
+
|
|
128
|
+
doc.save('form-filled.pdf', garbage=3, deflate=True)
|
|
129
|
+
doc.close()
|
|
130
|
+
print('Saved filled form with baked appearances')
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Why NeedAppearances Matters
|
|
134
|
+
|
|
135
|
+
PDF forms have two rendering modes:
|
|
136
|
+
- **NeedAppearances=true** — asks the viewer to regenerate visual appearances at
|
|
137
|
+
open time. Many viewers DON'T support this → fields appear blank.
|
|
138
|
+
- **NeedAppearances=false** — PyMuPDF's `widget.update()` bakes an AP (appearance
|
|
139
|
+
stream) into each field. These render in ALL viewers.
|
|
140
|
+
|
|
141
|
+
**Always set NeedAppearances=false after filling.** This is the difference between
|
|
142
|
+
a form that works everywhere and one that looks empty in half of all viewers.
|
|
143
|
+
|
|
144
|
+
## Step 4: Verify All Fields Filled
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
import fitz
|
|
148
|
+
|
|
149
|
+
doc = fitz.open('form-filled.pdf')
|
|
150
|
+
filled = 0
|
|
151
|
+
empty = []
|
|
152
|
+
for page in doc:
|
|
153
|
+
for i, w in enumerate(page.widgets()):
|
|
154
|
+
v = w.field_value or ''
|
|
155
|
+
if v and v != 'Off':
|
|
156
|
+
filled += 1
|
|
157
|
+
elif w.field_type != 2:
|
|
158
|
+
empty.append(f'[{i}] {w.field_name}')
|
|
159
|
+
else:
|
|
160
|
+
filled += 1
|
|
161
|
+
|
|
162
|
+
total = filled + len(empty)
|
|
163
|
+
if empty:
|
|
164
|
+
print(f'WARNING: {len(empty)}/{total} fields empty: {empty}')
|
|
165
|
+
else:
|
|
166
|
+
print(f'All {total} fields verified')
|
|
167
|
+
doc.close()
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Step 5: Flatten (Optional — Lock Fields)
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
import fitz
|
|
174
|
+
|
|
175
|
+
doc = fitz.open('form-filled.pdf')
|
|
176
|
+
|
|
177
|
+
for page in doc:
|
|
178
|
+
for widget in list(page.widgets()):
|
|
179
|
+
rect = widget.rect
|
|
180
|
+
value = widget.field_value or ''
|
|
181
|
+
if value and value != 'Off':
|
|
182
|
+
page.insert_text(
|
|
183
|
+
fitz.Point(rect.x0 + 2, rect.y1 - 2),
|
|
184
|
+
value, fontsize=10, fontname='helv',
|
|
185
|
+
)
|
|
186
|
+
page.clean_contents()
|
|
187
|
+
|
|
188
|
+
doc.save('form-final.pdf', garbage=4, deflate=True)
|
|
189
|
+
doc.close()
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Fallback: Scanned / Non-Interactive Forms
|
|
195
|
+
|
|
196
|
+
If the PDF has no AcroForm fields, overlay text at specific coordinates:
|
|
197
|
+
|
|
198
|
+
```python
|
|
199
|
+
import fitz
|
|
200
|
+
|
|
201
|
+
doc = fitz.open('scanned-form.pdf')
|
|
202
|
+
page = doc[0]
|
|
203
|
+
|
|
204
|
+
# 1. Render as image to identify field locations
|
|
205
|
+
pix = page.get_pixmap(dpi=150)
|
|
206
|
+
pix.save('form-preview.png')
|
|
207
|
+
|
|
208
|
+
# 2. Overlay text at identified positions (coordinates in PDF points, 72/inch)
|
|
209
|
+
fields = [
|
|
210
|
+
(fitz.Point(150, 245), 'John A. Smith'),
|
|
211
|
+
(fitz.Point(150, 290), '03/15/1985'),
|
|
212
|
+
(fitz.Point(150, 335), '123 Main St, Dallas, TX 75201'),
|
|
213
|
+
]
|
|
214
|
+
|
|
215
|
+
for point, text in fields:
|
|
216
|
+
page.insert_text(point, text, fontsize=11, fontname='helv', color=(0, 0, 0))
|
|
217
|
+
|
|
218
|
+
doc.save('scanned-filled.pdf')
|
|
219
|
+
doc.close()
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Field Type Reference
|
|
225
|
+
|
|
226
|
+
| Type ID | Type | Fill Pattern | Notes |
|
|
227
|
+
|---------|------|-------------|-------|
|
|
228
|
+
| 2 | Checkbox | `'Yes'` / `'Off'` | Some PDFs use custom on_state values |
|
|
229
|
+
| 3 | Radio | Option label text | Set to the option's export value |
|
|
230
|
+
| 4 | Listbox | Option value | Must match one of `choice_values` |
|
|
231
|
+
| 5 | Combobox | Option value or free text | Depends on field flags |
|
|
232
|
+
| 6 | Signature | `/s/ Name` | Accepts text for typed signatures |
|
|
233
|
+
| 7 | Text | Any string | Set `text_fontsize=0` for auto-fit |
|
|
234
|
+
|
|
235
|
+
## Tips
|
|
236
|
+
|
|
237
|
+
- Always inventory fields first — present to user before filling
|
|
238
|
+
- Watch for duplicate field names — use index-based filling when names collide
|
|
239
|
+
- `text_fontsize = 0` tells PyMuPDF to auto-scale text to fit the field rect
|
|
240
|
+
- **Always set NeedAppearances=false** — this is the #1 cause of blank fields
|
|
241
|
+
- Signature fields (type 6) accept typed text like `/s/ Full Name` for e-signatures
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pptx
|
|
3
|
+
description: >
|
|
4
|
+
Create, read, and edit PowerPoint presentations (.pptx). Use whenever the
|
|
5
|
+
deliverable is a slide deck — building presentations from content or data,
|
|
6
|
+
editing existing decks, extracting slide text, or deck-to-PDF conversion. Do
|
|
7
|
+
not trigger when the requested output is a document or web page.
|
|
8
|
+
metadata:
|
|
9
|
+
short-description: "Create, read, and edit PowerPoint (.pptx) decks"
|
|
10
|
+
author: "nexus-cortex"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# PPTX — Presentations
|
|
14
|
+
|
|
15
|
+
Build and edit .pptx decks with open-source tooling. Decks are a LAYOUT medium:
|
|
16
|
+
the most common failure isn't broken files, it's unreadable slides — too much
|
|
17
|
+
text, overflowing frames, invisible contrast. Design for the back of the room.
|
|
18
|
+
|
|
19
|
+
## Tooling (pick by job)
|
|
20
|
+
|
|
21
|
+
| Job | Tool | Notes |
|
|
22
|
+
|-----|------|-------|
|
|
23
|
+
| Create / edit programmatically | `python-pptx` | Slides, layouts, placeholders, text frames, images, tables, charts, notes |
|
|
24
|
+
| Markdown → deck quickly | `pandoc` | `pandoc slides.md -o deck.pptx` (`---`-separated slides; `--reference-doc` for branding) |
|
|
25
|
+
| Extract slide text | `python-pptx` walk | Iterate slides → shapes → `text_frame` |
|
|
26
|
+
| pptx → PDF | LibreOffice headless | `soffice --headless --convert-to pdf deck.pptx --outdir out/` |
|
|
27
|
+
|
|
28
|
+
Install on demand: `pip install python-pptx`.
|
|
29
|
+
|
|
30
|
+
## Core patterns (python-pptx)
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
from pptx import Presentation
|
|
34
|
+
from pptx.util import Inches, Pt, Emu
|
|
35
|
+
from pptx.dml.color import RGBColor
|
|
36
|
+
|
|
37
|
+
prs = Presentation() # or Presentation("existing.pptx")
|
|
38
|
+
prs.slide_width = Inches(13.333) # 16:9 — set BEFORE adding slides
|
|
39
|
+
prs.slide_height = Inches(7.5)
|
|
40
|
+
|
|
41
|
+
title_slide = prs.slides.add_slide(prs.slide_layouts[0]) # 0=title, 1=title+content
|
|
42
|
+
title_slide.shapes.title.text = "Q3 Results"
|
|
43
|
+
title_slide.placeholders[1].text = "Engineering review — 2026"
|
|
44
|
+
|
|
45
|
+
slide = prs.slides.add_slide(prs.slide_layouts[1])
|
|
46
|
+
slide.shapes.title.text = "Highlights"
|
|
47
|
+
body = slide.placeholders[1].text_frame
|
|
48
|
+
body.text = "Latency down 40%" # first bullet
|
|
49
|
+
p = body.add_paragraph(); p.text = "Cost per request halved"; p.level = 1
|
|
50
|
+
|
|
51
|
+
slide.shapes.add_picture("chart.png", Inches(7), Inches(1.5), width=Inches(5.5))
|
|
52
|
+
slide.notes_slide.notes_text_frame.text = "Mention the cache work here."
|
|
53
|
+
prs.save("deck.pptx")
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Editing an existing deck: iterate `prs.slides` → `slide.shapes`; only shapes
|
|
57
|
+
with `shape.has_text_frame` carry text. Edit at the run level
|
|
58
|
+
(`text_frame.paragraphs[i].runs[j].text`) to preserve formatting. To match the
|
|
59
|
+
deck's branding, ALWAYS build new slides from `prs.slide_layouts` of the same
|
|
60
|
+
file rather than a fresh `Presentation()`.
|
|
61
|
+
|
|
62
|
+
## Slide design rules (what makes decks fail review)
|
|
63
|
+
|
|
64
|
+
- **One idea per slide; ≤ 6 bullets; ≤ 10 words per bullet.** Prose belongs in
|
|
65
|
+
the speaker notes, not the slide.
|
|
66
|
+
- **Minimum 18pt body text** (titles 28pt+). If content doesn't fit at 18pt,
|
|
67
|
+
split the slide — never shrink the font to fit.
|
|
68
|
+
- **Check contrast** — light text needs a dark fill behind it; never place text
|
|
69
|
+
straight onto a busy image without a scrim shape.
|
|
70
|
+
- **Charts as images** (matplotlib → PNG → `add_picture`) are more reliable than
|
|
71
|
+
native chart XML for complex visuals; use native `pptx.chart` only for simple
|
|
72
|
+
bar/line/pie that must stay editable.
|
|
73
|
+
- Position with explicit `Inches()` — overlapping autolayout shapes are the #1
|
|
74
|
+
source of "looks broken" decks.
|
|
75
|
+
|
|
76
|
+
## Verification (mandatory)
|
|
77
|
+
|
|
78
|
+
1. **Re-open** with `Presentation("deck.pptx")` — corruption throws.
|
|
79
|
+
2. **Assert structure**: slide count, expected titles, image/shape presence.
|
|
80
|
+
3. **Render-check when layout matters**: convert to PDF via LibreOffice and
|
|
81
|
+
inspect the pages (text overflow and overlap are invisible in the XML — only
|
|
82
|
+
a render shows them).
|
|
83
|
+
|
|
84
|
+
## Limits to know
|
|
85
|
+
|
|
86
|
+
- SmartArt, animations, and transitions are not supported by `python-pptx` —
|
|
87
|
+
preserved if present, but not creatable/editable. Say so; don't fake it.
|
|
88
|
+
- Embedded video/audio: insert as a linked file or warn — round-trip is fragile.
|
|
89
|
+
- Fonts must exist on the rendering machine; stick to widely-available families
|
|
90
|
+
(Calibri, Arial, Helvetica) unless the user supplies brand fonts.
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: resume-analyst
|
|
3
|
+
description: Analyze, improve, and create professional resumes and CVs. Use when the user needs help with resume review, ATS optimization, content improvement, or creating a new resume from scratch.
|
|
4
|
+
allowed-tools: Read, Write, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Resume & CV Analyst
|
|
8
|
+
|
|
9
|
+
A comprehensive skill for analyzing, improving, and creating professional resumes and CVs with ATS (Applicant Tracking System) optimization.
|
|
10
|
+
|
|
11
|
+
## When to Use This Skill
|
|
12
|
+
|
|
13
|
+
- User wants to review or improve an existing resume
|
|
14
|
+
- User needs help creating a new resume
|
|
15
|
+
- User asks for ATS optimization advice
|
|
16
|
+
- User wants feedback on resume structure or content
|
|
17
|
+
- User needs to tailor a resume for a specific job posting
|
|
18
|
+
|
|
19
|
+
## Instructions
|
|
20
|
+
|
|
21
|
+
### Phase 1: Analysis (Existing Resume)
|
|
22
|
+
|
|
23
|
+
If the user has an existing resume:
|
|
24
|
+
|
|
25
|
+
1. **Locate the Resume File**
|
|
26
|
+
- Use Glob to find resume files: `*.pdf`, `*.docx`, `*.txt`, `resume.*`, `cv.*`
|
|
27
|
+
- Common locations: current directory, `~/Documents/`, `~/Desktop/`
|
|
28
|
+
- Ask user for file location if not found
|
|
29
|
+
|
|
30
|
+
2. **Read and Parse Content**
|
|
31
|
+
- Use Read tool to access the file
|
|
32
|
+
- For PDF: Use Bash with `pdftotext` or `strings` if needed
|
|
33
|
+
- For Word: Use Bash with `antiword` or `docx2txt` if available
|
|
34
|
+
- Extract all text content for analysis
|
|
35
|
+
|
|
36
|
+
3. **Analyze Resume Structure**
|
|
37
|
+
Check for these essential sections:
|
|
38
|
+
- ✅ Contact Information (name, email, phone, location, LinkedIn/portfolio)
|
|
39
|
+
- ✅ Professional Summary/Objective
|
|
40
|
+
- ✅ Work Experience (with dates, company, role, achievements)
|
|
41
|
+
- ✅ Education (degree, institution, graduation date)
|
|
42
|
+
- ✅ Skills (technical and soft skills)
|
|
43
|
+
- ✅ Optional: Certifications, Projects, Publications, Awards
|
|
44
|
+
|
|
45
|
+
4. **ATS Optimization Check**
|
|
46
|
+
Evaluate for ATS compatibility:
|
|
47
|
+
- ❌ **Avoid**: Graphics, tables, columns, headers/footers, text boxes, images
|
|
48
|
+
- ✅ **Use**: Simple formatting, standard fonts (Arial, Calibri, Times New Roman)
|
|
49
|
+
- ✅ **Include**: Keywords from job description
|
|
50
|
+
- ✅ **Format**: Standard section headings, consistent date formats
|
|
51
|
+
- ✅ **File Type**: .docx or .txt preferred over PDF for ATS
|
|
52
|
+
|
|
53
|
+
5. **Content Quality Assessment**
|
|
54
|
+
Evaluate each work experience entry:
|
|
55
|
+
- **Achievement-Focused**: Quantifiable results (increased X by Y%, managed $Z budget)
|
|
56
|
+
- **Action Verbs**: Strong verbs (Led, Implemented, Optimized, not "Responsible for")
|
|
57
|
+
- **STAR Format**: Situation, Task, Action, Result
|
|
58
|
+
- **Relevance**: Aligned with target role
|
|
59
|
+
- **Clarity**: Clear, concise bullet points (1-2 lines each)
|
|
60
|
+
|
|
61
|
+
### Phase 2: Feedback & Recommendations
|
|
62
|
+
|
|
63
|
+
Provide structured feedback:
|
|
64
|
+
|
|
65
|
+
1. **Overall Assessment** (1-10 score with rationale)
|
|
66
|
+
- ATS Compatibility: __/10
|
|
67
|
+
- Content Quality: __/10
|
|
68
|
+
- Structure & Format: __/10
|
|
69
|
+
- Professional Impact: __/10
|
|
70
|
+
|
|
71
|
+
2. **Critical Issues** (Must Fix)
|
|
72
|
+
- Missing essential sections
|
|
73
|
+
- ATS-incompatible formatting
|
|
74
|
+
- Lack of quantifiable achievements
|
|
75
|
+
- Typos or grammatical errors
|
|
76
|
+
- Outdated or irrelevant content
|
|
77
|
+
|
|
78
|
+
3. **Improvement Opportunities** (Should Fix)
|
|
79
|
+
- Weak action verbs
|
|
80
|
+
- Vague descriptions
|
|
81
|
+
- Missing keywords
|
|
82
|
+
- Inconsistent formatting
|
|
83
|
+
- Poor space utilization
|
|
84
|
+
|
|
85
|
+
4. **Enhancement Suggestions** (Nice to Have)
|
|
86
|
+
- Additional relevant skills
|
|
87
|
+
- Project showcases
|
|
88
|
+
- Leadership examples
|
|
89
|
+
- Industry certifications
|
|
90
|
+
|
|
91
|
+
### Phase 3: Content Improvement
|
|
92
|
+
|
|
93
|
+
For each work experience entry, suggest improved versions:
|
|
94
|
+
|
|
95
|
+
**Before**:
|
|
96
|
+
```
|
|
97
|
+
Responsible for managing team projects and coordinating with clients.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**After**:
|
|
101
|
+
```
|
|
102
|
+
• Led cross-functional team of 8 engineers to deliver 15+ client projects on time, achieving 95% customer satisfaction
|
|
103
|
+
• Coordinated with 20+ enterprise clients, resulting in $2M+ annual contract renewals
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Guidelines for Improvements**:
|
|
107
|
+
- Start with strong action verbs
|
|
108
|
+
- Include specific numbers and metrics
|
|
109
|
+
- Show impact and results
|
|
110
|
+
- Use industry-standard terminology
|
|
111
|
+
- Keep bullet points concise (1-2 lines)
|
|
112
|
+
|
|
113
|
+
### Phase 4: Resume Generation (New Resume)
|
|
114
|
+
|
|
115
|
+
If creating a new resume from scratch:
|
|
116
|
+
|
|
117
|
+
1. **Gather Information**
|
|
118
|
+
Ask the user for:
|
|
119
|
+
- Personal details (name, contact, location)
|
|
120
|
+
- Target role and industry
|
|
121
|
+
- Work history (companies, dates, responsibilities, achievements)
|
|
122
|
+
- Education background
|
|
123
|
+
- Skills and certifications
|
|
124
|
+
- Notable projects or accomplishments
|
|
125
|
+
|
|
126
|
+
2. **Choose Format**
|
|
127
|
+
- **Chronological**: Best for steady career progression
|
|
128
|
+
- **Functional**: Best for career changers or gaps
|
|
129
|
+
- **Combination**: Best for experienced professionals
|
|
130
|
+
|
|
131
|
+
3. **Generate Resume Content**
|
|
132
|
+
Use this structure:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
[FULL NAME]
|
|
136
|
+
[Email] | [Phone] | [City, State] | [LinkedIn URL] | [Portfolio/GitHub]
|
|
137
|
+
|
|
138
|
+
PROFESSIONAL SUMMARY
|
|
139
|
+
[2-3 sentences highlighting years of experience, key expertise, and value proposition]
|
|
140
|
+
|
|
141
|
+
PROFESSIONAL EXPERIENCE
|
|
142
|
+
|
|
143
|
+
[Company Name] | [Location]
|
|
144
|
+
[Job Title] | [Month Year] - [Month Year]
|
|
145
|
+
• [Achievement-focused bullet point with metrics]
|
|
146
|
+
• [Achievement-focused bullet point with metrics]
|
|
147
|
+
• [Achievement-focused bullet point with metrics]
|
|
148
|
+
|
|
149
|
+
[Repeat for each role]
|
|
150
|
+
|
|
151
|
+
EDUCATION
|
|
152
|
+
|
|
153
|
+
[Degree] in [Field] | [University Name] | [Graduation Year]
|
|
154
|
+
• [Honors, GPA if >3.5, relevant coursework]
|
|
155
|
+
|
|
156
|
+
SKILLS
|
|
157
|
+
|
|
158
|
+
Technical: [List of relevant technical skills]
|
|
159
|
+
Tools: [List of relevant tools and platforms]
|
|
160
|
+
Soft Skills: [List of relevant soft skills]
|
|
161
|
+
|
|
162
|
+
CERTIFICATIONS (if applicable)
|
|
163
|
+
• [Certification Name], [Issuing Organization], [Year]
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
4. **Write to File**
|
|
167
|
+
- Save as `resume_[name]_[date].txt` or `.md`
|
|
168
|
+
- Use Write tool to create the file
|
|
169
|
+
- Inform user they can convert to PDF/Word as needed
|
|
170
|
+
|
|
171
|
+
### Phase 5: Job-Specific Tailoring
|
|
172
|
+
|
|
173
|
+
If user has a specific job posting:
|
|
174
|
+
|
|
175
|
+
1. **Extract Job Requirements**
|
|
176
|
+
- Read job description
|
|
177
|
+
- Identify required skills, experience, qualifications
|
|
178
|
+
- Note key terminology and phrases
|
|
179
|
+
- Identify company values and culture
|
|
180
|
+
|
|
181
|
+
2. **Match Resume Content**
|
|
182
|
+
- Highlight relevant experience
|
|
183
|
+
- Incorporate job-specific keywords
|
|
184
|
+
- Reorder bullet points for relevance
|
|
185
|
+
- Add/emphasize matching skills
|
|
186
|
+
- Adjust professional summary
|
|
187
|
+
|
|
188
|
+
3. **Customize Cover Letter** (if requested)
|
|
189
|
+
- Reference specific job requirements
|
|
190
|
+
- Connect experience to role needs
|
|
191
|
+
- Show cultural fit
|
|
192
|
+
- Include call-to-action
|
|
193
|
+
|
|
194
|
+
## ATS Optimization Checklist
|
|
195
|
+
|
|
196
|
+
Use this checklist for ATS compatibility:
|
|
197
|
+
|
|
198
|
+
- [ ] Simple, clean formatting (no tables, columns, graphics)
|
|
199
|
+
- [ ] Standard section headings (EXPERIENCE, EDUCATION, SKILLS)
|
|
200
|
+
- [ ] Standard fonts (Arial, Calibri, Times New Roman, 10-12pt)
|
|
201
|
+
- [ ] .docx or .txt file format
|
|
202
|
+
- [ ] No headers/footers (put contact info in body)
|
|
203
|
+
- [ ] No text boxes or images
|
|
204
|
+
- [ ] Keywords from job description included
|
|
205
|
+
- [ ] Consistent date formatting (MM/YYYY or Month YYYY)
|
|
206
|
+
- [ ] Acronyms spelled out first time (e.g., "Search Engine Optimization (SEO)")
|
|
207
|
+
- [ ] Standard bullet points (•, -, or ◦)
|
|
208
|
+
- [ ] File name format: FirstName_LastName_Resume.docx
|
|
209
|
+
|
|
210
|
+
## Common Issues & Solutions
|
|
211
|
+
|
|
212
|
+
### Issue: "Responsible for..."
|
|
213
|
+
**Problem**: Passive language that doesn't show impact
|
|
214
|
+
**Solution**: Start with action verbs and add results
|
|
215
|
+
```
|
|
216
|
+
❌ Responsible for customer support
|
|
217
|
+
✅ Resolved 200+ customer inquiries monthly with 98% satisfaction rating
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Issue: No Metrics
|
|
221
|
+
**Problem**: Vague, unmeasurable claims
|
|
222
|
+
**Solution**: Add specific numbers
|
|
223
|
+
```
|
|
224
|
+
❌ Improved team efficiency
|
|
225
|
+
✅ Improved team efficiency by 35% through process automation, reducing turnaround time from 5 days to 3 days
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Issue: Too Long or Too Short
|
|
229
|
+
**Problem**: Resume length not appropriate for experience level
|
|
230
|
+
**Solution**:
|
|
231
|
+
- Entry-level (0-5 years): 1 page
|
|
232
|
+
- Mid-level (5-10 years): 1-2 pages
|
|
233
|
+
- Senior-level (10+ years): 2 pages maximum
|
|
234
|
+
|
|
235
|
+
### Issue: Outdated Skills
|
|
236
|
+
**Problem**: Lists irrelevant or outdated technologies
|
|
237
|
+
**Solution**: Focus on current, in-demand skills for target role
|
|
238
|
+
|
|
239
|
+
### Issue: Employment Gaps
|
|
240
|
+
**Problem**: Unexplained gaps in work history
|
|
241
|
+
**Solution**:
|
|
242
|
+
- Use years instead of months if gap is small
|
|
243
|
+
- Include relevant activities (freelance, courses, volunteering)
|
|
244
|
+
- Address positively in cover letter if needed
|
|
245
|
+
|
|
246
|
+
## Industry-Specific Guidance
|
|
247
|
+
|
|
248
|
+
### Tech/Engineering
|
|
249
|
+
- Emphasize: Technical skills, programming languages, frameworks, projects
|
|
250
|
+
- Include: GitHub/portfolio links, open-source contributions
|
|
251
|
+
- Format: Clean, modern, data-driven
|
|
252
|
+
- Keywords: Agile, CI/CD, APIs, cloud platforms, version control
|
|
253
|
+
|
|
254
|
+
### Business/Finance
|
|
255
|
+
- Emphasize: Results, revenue impact, cost savings, strategic initiatives
|
|
256
|
+
- Include: Certifications (CPA, CFA, MBA), leadership experience
|
|
257
|
+
- Format: Professional, conservative
|
|
258
|
+
- Keywords: P&L, ROI, stakeholder management, financial modeling
|
|
259
|
+
|
|
260
|
+
### Creative/Design
|
|
261
|
+
- Emphasize: Portfolio, design process, tools, creative achievements
|
|
262
|
+
- Include: Portfolio link prominently, design awards
|
|
263
|
+
- Format: Can be more creative but still ATS-friendly
|
|
264
|
+
- Keywords: UX/UI, Adobe Creative Suite, design thinking, user research
|
|
265
|
+
|
|
266
|
+
### Healthcare
|
|
267
|
+
- Emphasize: Certifications, patient care, compliance, specialized skills
|
|
268
|
+
- Include: Licenses, credentials, patient outcomes
|
|
269
|
+
- Format: Professional, detail-oriented
|
|
270
|
+
- Keywords: EMR systems, HIPAA, patient-centered care, clinical protocols
|
|
271
|
+
|
|
272
|
+
### Marketing/Sales
|
|
273
|
+
- Emphasize: Campaign results, growth metrics, brand awareness, revenue
|
|
274
|
+
- Include: Successful campaigns, client portfolios, certifications
|
|
275
|
+
- Format: Results-driven, dynamic
|
|
276
|
+
- Keywords: ROI, lead generation, conversion rates, digital marketing, CRM
|
|
277
|
+
|
|
278
|
+
## Examples
|
|
279
|
+
|
|
280
|
+
### Example 1: Software Engineer
|
|
281
|
+
|
|
282
|
+
**Before**:
|
|
283
|
+
```
|
|
284
|
+
Software Developer at TechCorp (2020-2023)
|
|
285
|
+
- Wrote code for various projects
|
|
286
|
+
- Fixed bugs
|
|
287
|
+
- Worked with team members
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**After**:
|
|
291
|
+
```
|
|
292
|
+
Software Engineer | TechCorp | San Francisco, CA | Jan 2020 - Dec 2023
|
|
293
|
+
• Architected and deployed 12+ microservices handling 10M+ daily requests with 99.9% uptime
|
|
294
|
+
• Reduced application load time by 40% through code optimization and caching strategies
|
|
295
|
+
• Mentored 5 junior developers, conducting code reviews and technical workshops
|
|
296
|
+
• Technologies: Python, Django, PostgreSQL, Redis, AWS, Docker, Kubernetes
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Example 2: Marketing Manager
|
|
300
|
+
|
|
301
|
+
**Before**:
|
|
302
|
+
```
|
|
303
|
+
Marketing Manager at StartupXYZ (2019-2023)
|
|
304
|
+
- Managed marketing campaigns
|
|
305
|
+
- Worked on social media
|
|
306
|
+
- Helped increase brand awareness
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**After**:
|
|
310
|
+
```
|
|
311
|
+
Marketing Manager | StartupXYZ | Austin, TX | Mar 2019 - Present
|
|
312
|
+
• Drove 250% increase in qualified leads through multi-channel campaigns, generating $5M in pipeline
|
|
313
|
+
• Managed $500K annual marketing budget, optimizing spend to achieve 35% reduction in CAC
|
|
314
|
+
• Built marketing team from 2 to 8 members, establishing processes and campaign frameworks
|
|
315
|
+
• Increased social media engagement by 180% across LinkedIn, Twitter, and Facebook platforms
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Example 3: Project Manager
|
|
319
|
+
|
|
320
|
+
**Before**:
|
|
321
|
+
```
|
|
322
|
+
Project Manager at ConsultCo (2018-2023)
|
|
323
|
+
- Managed client projects
|
|
324
|
+
- Coordinated with teams
|
|
325
|
+
- Delivered projects on time
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**After**:
|
|
329
|
+
```
|
|
330
|
+
Senior Project Manager | ConsultCo | Chicago, IL | Jun 2018 - Aug 2023
|
|
331
|
+
• Led 25+ enterprise consulting engagements ($100K-$2M each) for Fortune 500 clients with 100% on-time delivery
|
|
332
|
+
• Managed cross-functional teams of 15+ consultants across 3 time zones, delivering complex digital transformation projects
|
|
333
|
+
• Improved client satisfaction scores from 7.2 to 9.1/10 through proactive communication and risk management
|
|
334
|
+
• Achieved 98% project profitability rate by implementing agile methodologies and resource optimization
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Key Reminders
|
|
338
|
+
|
|
339
|
+
1. **Quantify Everything**: Numbers, percentages, dollar amounts, timeframes
|
|
340
|
+
2. **Be Specific**: Replace vague terms with concrete examples
|
|
341
|
+
3. **Show Impact**: Focus on results, not just responsibilities
|
|
342
|
+
4. **Use Keywords**: Match language from job descriptions
|
|
343
|
+
5. **Keep it Current**: Remove outdated skills and old experiences (>10-15 years)
|
|
344
|
+
6. **Proofread Thoroughly**: No typos, consistent formatting, proper grammar
|
|
345
|
+
7. **Optimize for ATS**: Simple format, standard headings, keyword-rich
|
|
346
|
+
8. **Tell a Story**: Show career progression and growth
|
|
347
|
+
9. **Be Honest**: Never fabricate experience or qualifications
|
|
348
|
+
10. **Keep it Concise**: Every word should add value
|
|
349
|
+
|
|
350
|
+
## Resources to Reference
|
|
351
|
+
|
|
352
|
+
- **Action Verbs List**: Achieved, Accelerated, Accomplished, Administered, Analyzed, Architected, Built, Championed, Collaborated, Coordinated, Created, Delivered, Demonstrated, Designed, Developed, Drove, Enhanced, Established, Exceeded, Executed, Expanded, Generated, Implemented, Improved, Increased, Initiated, Launched, Led, Managed, Maximized, Optimized, Orchestrated, Organized, Pioneered, Reduced, Resolved, Spearheaded, Streamlined, Strengthened, Transformed
|
|
353
|
+
|
|
354
|
+
- **Metrics to Include**:
|
|
355
|
+
- Percentages (increased by X%)
|
|
356
|
+
- Dollar amounts ($X revenue, $Y budget)
|
|
357
|
+
- Time saved (reduced from X to Y)
|
|
358
|
+
- Team size (managed X people)
|
|
359
|
+
- Customer/user counts (served X customers)
|
|
360
|
+
- Project counts (delivered X projects)
|
|
361
|
+
- Quality metrics (98% satisfaction, 99.9% uptime)
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## Final Output Format
|
|
366
|
+
|
|
367
|
+
Always provide:
|
|
368
|
+
1. **Analysis Summary** (if reviewing existing resume)
|
|
369
|
+
2. **Scored Assessment** (ATS, Content, Structure, Impact)
|
|
370
|
+
3. **Prioritized Recommendations** (Critical, Important, Enhancement)
|
|
371
|
+
4. **Specific Improvements** (before/after examples)
|
|
372
|
+
5. **Updated Resume Draft** (if requested)
|
|
373
|
+
6. **Next Steps** (actions user should take)
|