@forwardimpact/outpost 3.0.3
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/LICENSE +201 -0
- package/README.md +15 -0
- package/bin/fit-outpost.js +3 -0
- package/config/scheduler.json +34 -0
- package/package.json +63 -0
- package/src/agent-runner.js +189 -0
- package/src/index.js +5 -0
- package/src/kb-manager.js +228 -0
- package/src/outpost.js +417 -0
- package/src/scheduler.js +195 -0
- package/src/socket-server.js +336 -0
- package/src/state-manager.js +126 -0
- package/templates/.claude/agents/chief-of-staff.md +58 -0
- package/templates/.claude/agents/concierge.md +46 -0
- package/templates/.claude/agents/head-hunter.md +57 -0
- package/templates/.claude/agents/librarian.md +60 -0
- package/templates/.claude/agents/postman.md +47 -0
- package/templates/.claude/agents/recruiter.md +63 -0
- package/templates/.claude/settings.json +88 -0
- package/templates/.claude/skills/candidate-report/SKILL.md +139 -0
- package/templates/.claude/skills/candidate-report/references/report-template.html +203 -0
- package/templates/.claude/skills/candidate-report/references/report.css +438 -0
- package/templates/.claude/skills/candidate-report/references/rubric.md +76 -0
- package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +48 -0
- package/templates/.claude/skills/deck-create/SKILL.md +75 -0
- package/templates/.claude/skills/deck-create/references/slide.css +35 -0
- package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +47 -0
- package/templates/.claude/skills/deck-summarize/SKILL.md +139 -0
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +85 -0
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +210 -0
- package/templates/.claude/skills/doc-collab/SKILL.md +112 -0
- package/templates/.claude/skills/doc-create/SKILL.md +105 -0
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +50 -0
- package/templates/.claude/skills/draft-emails/SKILL.md +141 -0
- package/templates/.claude/skills/draft-emails/references/template.md +26 -0
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +66 -0
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +139 -0
- package/templates/.claude/skills/extract-entities/SKILL.md +187 -0
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +14 -0
- package/templates/.claude/skills/extract-entities/references/conditions.md +55 -0
- package/templates/.claude/skills/extract-entities/references/content.md +104 -0
- package/templates/.claude/skills/extract-entities/references/links.md +48 -0
- package/templates/.claude/skills/extract-entities/references/recruitment.md +57 -0
- package/templates/.claude/skills/extract-entities/references/resolution.md +71 -0
- package/templates/.claude/skills/extract-entities/references/sources.md +70 -0
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +36 -0
- package/templates/.claude/skills/extract-entities/references/templates-goals-priorities.md +63 -0
- package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +67 -0
- package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +68 -0
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +131 -0
- package/templates/.claude/skills/hyprnote-follow/SKILL.md +174 -0
- package/templates/.claude/skills/hyprnote-follow/references/coaching.md +118 -0
- package/templates/.claude/skills/hyprnote-follow/references/debrief.md +59 -0
- package/templates/.claude/skills/hyprnote-follow/references/meeting-types.md +14 -0
- package/templates/.claude/skills/hyprnote-follow/scripts/follow.mjs +243 -0
- package/templates/.claude/skills/hyprnote-process/SKILL.md +147 -0
- package/templates/.claude/skills/hyprnote-process/references/extraction.md +84 -0
- package/templates/.claude/skills/hyprnote-process/references/sessions.md +81 -0
- package/templates/.claude/skills/hyprnote-process/scripts/scan.mjs +246 -0
- package/templates/.claude/skills/hyprnote-trim/SKILL.md +177 -0
- package/templates/.claude/skills/manage-tasks/SKILL.md +152 -0
- package/templates/.claude/skills/manage-tasks/references/format.md +73 -0
- package/templates/.claude/skills/meeting-prep/SKILL.md +180 -0
- package/templates/.claude/skills/organize-files/SKILL.md +146 -0
- package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +105 -0
- package/templates/.claude/skills/organize-files/scripts/summarize.mjs +91 -0
- package/templates/.claude/skills/req-assess/SKILL.md +137 -0
- package/templates/.claude/skills/req-assess/references/interview-template.md +62 -0
- package/templates/.claude/skills/req-assess/references/panel-template.md +117 -0
- package/templates/.claude/skills/req-assess/references/rubric.md +65 -0
- package/templates/.claude/skills/req-decide/SKILL.md +163 -0
- package/templates/.claude/skills/req-decide/references/rubric.md +63 -0
- package/templates/.claude/skills/req-decide/references/template.md +118 -0
- package/templates/.claude/skills/req-forget/SKILL.md +154 -0
- package/templates/.claude/skills/req-forget/references/classify.md +23 -0
- package/templates/.claude/skills/req-forget/references/locations.md +59 -0
- package/templates/.claude/skills/req-forget/references/report-template.md +67 -0
- package/templates/.claude/skills/req-scan/SKILL.md +145 -0
- package/templates/.claude/skills/req-scan/references/fallbacks.md +76 -0
- package/templates/.claude/skills/req-scan/references/filters.md +83 -0
- package/templates/.claude/skills/req-scan/references/sources.md +76 -0
- package/templates/.claude/skills/req-scan/references/state.md +54 -0
- package/templates/.claude/skills/req-scan/references/template.md +36 -0
- package/templates/.claude/skills/req-scan/scripts/state.mjs +396 -0
- package/templates/.claude/skills/req-screen/SKILL.md +151 -0
- package/templates/.claude/skills/req-screen/references/rubric.md +94 -0
- package/templates/.claude/skills/req-screen/references/template.md +91 -0
- package/templates/.claude/skills/req-track/SKILL.md +189 -0
- package/templates/.claude/skills/req-track/references/fields.md +114 -0
- package/templates/.claude/skills/req-track/references/signals.md +42 -0
- package/templates/.claude/skills/req-track/references/statuses.md +32 -0
- package/templates/.claude/skills/req-track/references/templates.md +127 -0
- package/templates/.claude/skills/req-workday/SKILL.md +162 -0
- package/templates/.claude/skills/req-workday/references/field-mapping.md +40 -0
- package/templates/.claude/skills/req-workday/references/status-mapping.md +38 -0
- package/templates/.claude/skills/req-workday/references/templates.md +126 -0
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +56 -0
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +313 -0
- package/templates/.claude/skills/send-chat/SKILL.md +170 -0
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +145 -0
- package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +80 -0
- package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +307 -0
- package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +332 -0
- package/templates/.claude/skills/sync-apple-mail/SKILL.md +151 -0
- package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +115 -0
- package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +389 -0
- package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +372 -0
- package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +239 -0
- package/templates/.claude/skills/sync-teams/SKILL.md +177 -0
- package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +147 -0
- package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +288 -0
- package/templates/.claude/skills/sync-teams/scripts/sync.mjs +381 -0
- package/templates/.claude/skills/upstream-skill/SKILL.md +130 -0
- package/templates/.claude/skills/upstream-skill/references/examples.md +80 -0
- package/templates/.claude/skills/weekly-update/SKILL.md +141 -0
- package/templates/.claude/skills/weekly-update/references/template.md +55 -0
- package/templates/CLAUDE.md +134 -0
- package/templates/USER.md +3 -0
- package/templates/apm.yml +5 -0
- package/templates/knowledge/Briefings/.gitkeep +0 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Templates
|
|
2
|
+
|
|
3
|
+
Markdown templates used by `req-track` for Role files and Candidate briefs.
|
|
4
|
+
|
|
5
|
+
## Role file stub
|
|
6
|
+
|
|
7
|
+
Used by Step 0b when a Req appears on a candidate brief but no Role file exists.
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
# {Title from candidate Req field}
|
|
11
|
+
|
|
12
|
+
## Info
|
|
13
|
+
**Req:** {req number}
|
|
14
|
+
**Title:** {title from Req field}
|
|
15
|
+
**Level:** —
|
|
16
|
+
**Track:** —
|
|
17
|
+
**Discipline:** —
|
|
18
|
+
**Domain lead:** —
|
|
19
|
+
**Hiring manager:** —
|
|
20
|
+
**Locations:** —
|
|
21
|
+
**Positions:** —
|
|
22
|
+
**Channel:** hr
|
|
23
|
+
**Status:** open
|
|
24
|
+
**Opened:** —
|
|
25
|
+
**Last activity:** {today}
|
|
26
|
+
|
|
27
|
+
## Connected to
|
|
28
|
+
- Staffing/recruitment project
|
|
29
|
+
|
|
30
|
+
## Candidates
|
|
31
|
+
<!-- Rebuilt each cycle -->
|
|
32
|
+
|
|
33
|
+
## Notes
|
|
34
|
+
- Stub created automatically — enrich with data from emails, calendar, and imports.
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Role Candidates table
|
|
38
|
+
|
|
39
|
+
Step 0b rebuilds this table on each Role file by scanning briefs:
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
## Candidates
|
|
43
|
+
| Candidate | Status | Channel | First seen |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| [[Candidates/{Name}/brief\|{Name}]] | {status} | {channel} | {date} |
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Sort by First seen, newest first.
|
|
49
|
+
|
|
50
|
+
## Candidate brief
|
|
51
|
+
|
|
52
|
+
Used by Step 5 for new candidates. File:
|
|
53
|
+
`knowledge/Candidates/{Full Name}/brief.md`.
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
# {Full Name}
|
|
57
|
+
|
|
58
|
+
## Info
|
|
59
|
+
**Title:** {professional title/function}
|
|
60
|
+
**Rate:** {rate or "—"}
|
|
61
|
+
**Availability:** {availability or "—"}
|
|
62
|
+
**English:** {level or "—"}
|
|
63
|
+
**Location:** {location or "—"}
|
|
64
|
+
**Gender:** {Woman / Man / —}
|
|
65
|
+
**Source:** [[Organizations/{Agency}]] via [[People/{Recruiter Name}]]
|
|
66
|
+
**Status:** {pipeline status}
|
|
67
|
+
**First seen:** {YYYY-MM-DD}
|
|
68
|
+
**Last activity:** {YYYY-MM-DD}
|
|
69
|
+
{extra fields here — see below}
|
|
70
|
+
|
|
71
|
+
## Summary
|
|
72
|
+
{2-3 sentences: role, experience level, key strengths}
|
|
73
|
+
|
|
74
|
+
## CV
|
|
75
|
+
- [CV.pdf](./CV.pdf)
|
|
76
|
+
|
|
77
|
+
## Connected to
|
|
78
|
+
- [[Organizations/{Agency}]] — sourced by
|
|
79
|
+
- [[People/{Recruiter}]] — recruiter
|
|
80
|
+
- [[Roles/{Role filename without .md}]] — applied to
|
|
81
|
+
- [[People/{Hiring manager}]] — hiring manager
|
|
82
|
+
- [[People/{Domain lead}]] — domain lead
|
|
83
|
+
|
|
84
|
+
## Pipeline
|
|
85
|
+
- **{date}**: {event}
|
|
86
|
+
|
|
87
|
+
## Skills
|
|
88
|
+
{comma-separated agent-aligned engineering standard skill IDs}
|
|
89
|
+
|
|
90
|
+
## Interview Notes
|
|
91
|
+
{omit section if no interviews yet}
|
|
92
|
+
|
|
93
|
+
## Notes
|
|
94
|
+
{free-form observations — always present, even if empty}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Omit `## CV` when no CV attachment exists.
|
|
98
|
+
|
|
99
|
+
## Extra Info fields
|
|
100
|
+
|
|
101
|
+
Place after `Last activity`, in this order, only when known:
|
|
102
|
+
|
|
103
|
+
```markdown
|
|
104
|
+
**Role:** {internal requisition profile, e.g. "Staff Engineer"}
|
|
105
|
+
**Req:** [[Roles/{filename}|{req number}]] — {title}
|
|
106
|
+
**Channel:** {hr / vendor}
|
|
107
|
+
**Hiring manager:** {[[People/{name}]] or "—"}
|
|
108
|
+
**Domain lead:** {[[People/{name}]] or "—"}
|
|
109
|
+
**Internal/External:** {Internal / External / External (Prior Worker)}
|
|
110
|
+
**Model:** {engagement model, e.g. "B2B (via Agency) — conversion to FTE not possible"}
|
|
111
|
+
**Current title:** {current job title and employer}
|
|
112
|
+
**Email:** {personal or work email}
|
|
113
|
+
**Phone:** {phone number}
|
|
114
|
+
**LinkedIn:** {profile URL}
|
|
115
|
+
**Also known as:** {alternate spellings}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
For vendor-pipeline candidates the Req backlink uses
|
|
119
|
+
`[[Roles/{filename}|Vendor]] — {description}`.
|
|
120
|
+
|
|
121
|
+
## Optional sections
|
|
122
|
+
|
|
123
|
+
Add between `## Skills` and `## Notes` when data is rich enough, in this order:
|
|
124
|
+
`## Education`, `## Certifications`, `## Work History`, `## Key Facts`,
|
|
125
|
+
`## Interview Notes` (`### YYYY-MM-DD — {description}` per interview).
|
|
126
|
+
|
|
127
|
+
`## Notes` is always last. If `## Open Items` exists, place it after Notes.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: req-workday
|
|
3
|
+
description: >
|
|
4
|
+
Import candidates from a Workday requisition export (.xlsx) into
|
|
5
|
+
knowledge/Candidates/. Parses requisition metadata and candidate data,
|
|
6
|
+
creates candidate briefs and CV.md files from resume text, and integrates
|
|
7
|
+
with the existing req-track pipeline. Use when the user provides a
|
|
8
|
+
Workday export file or asks to import candidates from an XLSX requisition
|
|
9
|
+
export.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workday Requisition Import
|
|
13
|
+
|
|
14
|
+
Import candidates from a Workday requisition export (`.xlsx`) into
|
|
15
|
+
`knowledge/Candidates/`. Extract requisition metadata and candidate profiles,
|
|
16
|
+
create standardized briefs and `CV.md` files from the embedded resume text, and
|
|
17
|
+
integrate with the `req-track` pipeline format.
|
|
18
|
+
|
|
19
|
+
## Trigger
|
|
20
|
+
|
|
21
|
+
- The user provides a Workday requisition export (`.xlsx`).
|
|
22
|
+
- The user asks to import candidates from Workday or an XLSX export.
|
|
23
|
+
- The user mentions a requisition ID and asks to process the export.
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
|
|
27
|
+
- A Workday requisition export accessible on the filesystem.
|
|
28
|
+
- `read-excel-file` package installed:
|
|
29
|
+
`bun pm ls read-excel-file 2>/dev/null || bun install read-excel-file`.
|
|
30
|
+
- User identity in `USER.md`.
|
|
31
|
+
|
|
32
|
+
## Inputs
|
|
33
|
+
|
|
34
|
+
- Path to the `.xlsx` file (e.g. `~/Downloads/4951493_…(Open).xlsx`).
|
|
35
|
+
|
|
36
|
+
## Outputs
|
|
37
|
+
|
|
38
|
+
- `knowledge/Candidates/{Clean Name}/brief.md` — candidate profile.
|
|
39
|
+
- `knowledge/Candidates/{Clean Name}/CV.md` — resume text as markdown.
|
|
40
|
+
- `knowledge/Roles/{Req ID} — {Title}.md` — created or updated.
|
|
41
|
+
- Updated existing briefs when a candidate already exists.
|
|
42
|
+
|
|
43
|
+
<do_confirm_checklist goal="Verify the Workday import is consistent with
|
|
44
|
+
req-track">
|
|
45
|
+
|
|
46
|
+
- [ ] XLSX parsed; candidate count matches the parser summary.
|
|
47
|
+
- [ ] Requisition metadata extracted (ID, title; HM/recruiter when available).
|
|
48
|
+
- [ ] Each candidate has a directory under `knowledge/Candidates/{Clean Name}/`
|
|
49
|
+
(annotation stripped).
|
|
50
|
+
- [ ] `CV.md` created for every candidate with resume text — faithfully
|
|
51
|
+
reproduced (no rewriting).
|
|
52
|
+
- [ ] Pipeline status mapped from **Step / Disposition** (not Stage); raw step
|
|
53
|
+
preserved in the Pipeline entry.
|
|
54
|
+
- [ ] Internal/External derived from name annotations and source.
|
|
55
|
+
- [ ] Existing candidates updated via targeted edits (not duplicated).
|
|
56
|
+
- [ ] Skills tagged with standard IDs; Gender set to `—` (export has no signal);
|
|
57
|
+
Channel = `hr`; Req backlinks to the Role file.
|
|
58
|
+
|
|
59
|
+
</do_confirm_checklist>
|
|
60
|
+
|
|
61
|
+
## Procedure
|
|
62
|
+
|
|
63
|
+
Process **10 candidates per run**.
|
|
64
|
+
|
|
65
|
+
### 1. Set up
|
|
66
|
+
|
|
67
|
+
Read `USER.md`. Confirm the XLSX path. Ensure the parser dependency is
|
|
68
|
+
installed:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
bun pm ls read-excel-file 2>/dev/null || bun install read-excel-file
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 2. Parse the export
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
node .claude/skills/req-workday/scripts/parse-workday.mjs "<path>" --summary
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Review the summary for sanity (candidate count, header detection). For the JSON
|
|
81
|
+
consumed by later steps:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
node .claude/skills/req-workday/scripts/parse-workday.mjs "<path>"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The output is `{ requisition, candidates }`. Format details (sheet shapes,
|
|
88
|
+
header indices, name annotations) are in
|
|
89
|
+
[references/xlsx-format.md](references/xlsx-format.md).
|
|
90
|
+
|
|
91
|
+
### 3. Create or update the Role file
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
ls knowledge/Roles/ | grep "{Req ID}"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Use the **Role file stub** in
|
|
98
|
+
[references/templates.md](references/templates.md). Resolve the domain lead by:
|
|
99
|
+
|
|
100
|
+
1. `rg "{Req ID}" knowledge/` — look in project timelines, People notes, Topics
|
|
101
|
+
for context.
|
|
102
|
+
2. Reading the hiring manager's People note for `**Reports to:**` and walking up
|
|
103
|
+
to a VP or senior leader.
|
|
104
|
+
3. Falling back to `Domain lead: —` for later cycles.
|
|
105
|
+
|
|
106
|
+
If the Role file already exists, follow the existing-file rules in
|
|
107
|
+
`references/templates.md`.
|
|
108
|
+
|
|
109
|
+
### 4. Build the candidate index
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
ls -d knowledge/Candidates/*/ 2>/dev/null
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Match imported candidates against existing notes by name (fuzzy — middle names,
|
|
116
|
+
accents, spelling variations).
|
|
117
|
+
|
|
118
|
+
### 5. Determine pipeline status
|
|
119
|
+
|
|
120
|
+
Map **Step / Disposition** to the `req-track` status using
|
|
121
|
+
[references/status-mapping.md](references/status-mapping.md). Preserve the raw
|
|
122
|
+
step value in the Pipeline entry.
|
|
123
|
+
|
|
124
|
+
### 6. Write `CV.md`
|
|
125
|
+
|
|
126
|
+
For every candidate with resume text, create
|
|
127
|
+
`knowledge/Candidates/{Clean Name}/CV.md` using the **CV.md template** in
|
|
128
|
+
[references/templates.md](references/templates.md).
|
|
129
|
+
|
|
130
|
+
### 7. Write or update the brief
|
|
131
|
+
|
|
132
|
+
Column-to-field map: [references/field-mapping.md](references/field-mapping.md).
|
|
133
|
+
Brief layout (new candidates) and edit rules (existing candidates):
|
|
134
|
+
[references/templates.md](references/templates.md).
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
mkdir -p "knowledge/Candidates/{Clean Name}"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
For existing candidates, apply targeted Edit operations only — never rewrite the
|
|
141
|
+
file.
|
|
142
|
+
|
|
143
|
+
### 8. Capture insights
|
|
144
|
+
|
|
145
|
+
After the batch, review for strategic observations and add bullets to
|
|
146
|
+
`knowledge/Candidates/Insights.md` under `## Placement Notes` with
|
|
147
|
+
`[[Candidates/Name/brief|Name]]` links. See `req-track` Step 5b for the
|
|
148
|
+
inclusion criteria.
|
|
149
|
+
|
|
150
|
+
### 9. Tag skills
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
bunx fit-pathway skill --list
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Use standard skill IDs in each brief's `## Skills` section. Flag candidates with
|
|
157
|
+
a `CV.md` for `req-screen`.
|
|
158
|
+
|
|
159
|
+
### 10. Batch and report
|
|
160
|
+
|
|
161
|
+
Process 10 candidates per run. Report `Processed {N}/{Total}`. If more remain,
|
|
162
|
+
tell the user how many and offer to continue.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Field Mapping
|
|
2
|
+
|
|
3
|
+
Reference for `req-workday` Step 5. Map Workday columns to candidate brief
|
|
4
|
+
fields.
|
|
5
|
+
|
|
6
|
+
## Core columns
|
|
7
|
+
|
|
8
|
+
| Header | Maps to brief field… |
|
|
9
|
+
| ---------------------- | ------------------------------------------------- |
|
|
10
|
+
| Job Application | `# {Name}` |
|
|
11
|
+
| Stage | Row detection only (not used for status) |
|
|
12
|
+
| Step / Disposition | **Workday step** → status (see status-mapping.md) |
|
|
13
|
+
| Resume | Reference only (no file) |
|
|
14
|
+
| Date Applied | **First seen** |
|
|
15
|
+
| Current Job Title | **Current title**, Title |
|
|
16
|
+
| Current Company | **Current title** suffix |
|
|
17
|
+
| Source | **Source** |
|
|
18
|
+
| Referred by | **Source** suffix |
|
|
19
|
+
| Candidate Location | **Location** |
|
|
20
|
+
| Phone | **Phone** |
|
|
21
|
+
| Email | **Email** |
|
|
22
|
+
| Availability Date | **Availability** |
|
|
23
|
+
| Visa Requirement | Notes |
|
|
24
|
+
| Eligible to Work | Notes |
|
|
25
|
+
| Relocation | Notes |
|
|
26
|
+
| Salary Expectations | **Rate** |
|
|
27
|
+
| Non-Compete | Notes |
|
|
28
|
+
| Total Years Experience | Summary context |
|
|
29
|
+
| All Job Titles | Work History context |
|
|
30
|
+
| Companies | Work History context |
|
|
31
|
+
| Degrees | Education |
|
|
32
|
+
| Fields of Study | Education |
|
|
33
|
+
| Language | **English** / Language |
|
|
34
|
+
| Resume Text | `CV.md` content |
|
|
35
|
+
|
|
36
|
+
## Extra info field order
|
|
37
|
+
|
|
38
|
+
After `Last activity`, in this order, only when known: `Req`,
|
|
39
|
+
`Internal/External`, `Current title`, `Email`, `Phone`, `LinkedIn`. Follow the
|
|
40
|
+
same order as `req-track`.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Step → Status Mapping
|
|
2
|
+
|
|
3
|
+
Reference for `req-workday` Step 3. Map the **Step / Disposition** column to the
|
|
4
|
+
`req-track` pipeline status. Do **not** use the Stage column for status — Stage
|
|
5
|
+
is only used for row detection (stop condition).
|
|
6
|
+
|
|
7
|
+
| Workday Step / Disposition | Pipeline status |
|
|
8
|
+
| -------------------------------------- | ------------------ |
|
|
9
|
+
| `Considered` | `new` |
|
|
10
|
+
| `Review` | `new` |
|
|
11
|
+
| `Manager Resume Screen` | `screening` |
|
|
12
|
+
| `Schedule Recruiter Phone Screen` | `screening` |
|
|
13
|
+
| `Manager Request to Move Forward (HS)` | `screening` |
|
|
14
|
+
| `Proposed Interview Slate` | `screening` |
|
|
15
|
+
| `Assessment` | `screening` |
|
|
16
|
+
| `Manager Request to Decline (HS)` | `rejected` |
|
|
17
|
+
| `Interview` / `Phone Screen` | `first-interview` |
|
|
18
|
+
| `Second Interview` | `second-interview` |
|
|
19
|
+
| `Reference Check` | `second-interview` |
|
|
20
|
+
| `Offer` | `offer` |
|
|
21
|
+
| `Employment Agreement` | `offer` |
|
|
22
|
+
| `Background Check` | `hired` |
|
|
23
|
+
| `Ready for Hire` | `hired` |
|
|
24
|
+
| `Rejected` / `Declined` | `rejected` |
|
|
25
|
+
|
|
26
|
+
Empty or unrecognized step → default to `new`.
|
|
27
|
+
|
|
28
|
+
## Preserving the raw step
|
|
29
|
+
|
|
30
|
+
The raw `step` value is always preserved in the parser's JSON output and must be
|
|
31
|
+
stored in the candidate brief's `## Pipeline` section, e.g.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
- **2026-02-10**: Applied via LinkedIn — Step: Manager Request to Move Forward (HS)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
This lets the user filter and query candidates by their exact Workday
|
|
38
|
+
disposition.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Output Templates
|
|
2
|
+
|
|
3
|
+
Reference templates for `req-workday` Steps 1b, 4, and 5.
|
|
4
|
+
|
|
5
|
+
## Role file stub
|
|
6
|
+
|
|
7
|
+
Use when no Role file exists for the requisition. Filename:
|
|
8
|
+
`knowledge/Roles/{Req ID} — {Short Title}.md`.
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
# {Requisition Title}
|
|
12
|
+
|
|
13
|
+
## Info
|
|
14
|
+
**Req:** {Req ID}
|
|
15
|
+
**Title:** {Full title from export}
|
|
16
|
+
**Level:** {Infer from title: "Principal" → J100, "Staff" → J090, "Director" → J100 M-track, "Senior" → J070}
|
|
17
|
+
**Track:** {P-track for IC roles, M-track for Director/Manager roles}
|
|
18
|
+
**Discipline:** {Infer: "Software Engineer" → software_engineering, "Data Engineer" → data_engineering, "Data Scientist" → data_science}
|
|
19
|
+
**Domain lead:** —
|
|
20
|
+
**Hiring manager:** {From export metadata if available, or "—"}
|
|
21
|
+
**Locations:** {Primary Location from export}
|
|
22
|
+
**Positions:** —
|
|
23
|
+
**Channel:** hr
|
|
24
|
+
**Status:** open
|
|
25
|
+
**Opened:** {Recruiting Start Date from export}
|
|
26
|
+
**Last activity:** {today}
|
|
27
|
+
|
|
28
|
+
## Connected to
|
|
29
|
+
- Staffing/recruitment project
|
|
30
|
+
|
|
31
|
+
## Candidates
|
|
32
|
+
<!-- Rebuilt by req-track role sync -->
|
|
33
|
+
|
|
34
|
+
## Notes
|
|
35
|
+
- Created from requisition export on {today}.
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If the Role file already exists: set `Hiring manager` only when the export
|
|
39
|
+
provides one and the field is `—`; update `Last activity` to today; append
|
|
40
|
+
`- Requisition export processed on {today}: {N} candidates` to Notes.
|
|
41
|
+
|
|
42
|
+
## CV.md template
|
|
43
|
+
|
|
44
|
+
Save to `knowledge/Candidates/{Clean Name}/CV.md` when resume text exists. Skip
|
|
45
|
+
when it doesn't.
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
# {Clean Name} — Resume
|
|
49
|
+
|
|
50
|
+
> Extracted from Workday requisition export {Req ID} on {today's date}.
|
|
51
|
+
> Original file: {Resume filename from column G}
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
{Resume text from column AC, preserving original formatting}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Formatting:** preserve paragraph breaks; convert ALL-CAPS headers to
|
|
59
|
+
`## Heading`; keep bullets/lists; never rewrite or summarise.
|
|
60
|
+
|
|
61
|
+
## Candidate brief
|
|
62
|
+
|
|
63
|
+
Save to `knowledge/Candidates/{Clean Name}/brief.md`. Format follows
|
|
64
|
+
`req-track`.
|
|
65
|
+
|
|
66
|
+
```markdown
|
|
67
|
+
# {Clean Name}
|
|
68
|
+
|
|
69
|
+
## Info
|
|
70
|
+
**Title:** {Current Job Title or "—"}
|
|
71
|
+
**Rate:** {Salary Expectations or "—"}
|
|
72
|
+
**Availability:** {Availability Date or "—"}
|
|
73
|
+
**English:** {Language field or "—"}
|
|
74
|
+
**Location:** {Candidate Location or "—"}
|
|
75
|
+
**Gender:** —
|
|
76
|
+
**Source:** {Source} {via Referred by, if present}
|
|
77
|
+
**Status:** {pipeline status}
|
|
78
|
+
**First seen:** {Date Applied, YYYY-MM-DD}
|
|
79
|
+
**Last activity:** {Date Applied, YYYY-MM-DD}
|
|
80
|
+
**Req:** [[Roles/{Role filename}|{Req ID}]] — {Req Title}
|
|
81
|
+
**Channel:** hr
|
|
82
|
+
**Hiring manager:** {From Role file or "—"}
|
|
83
|
+
**Domain lead:** {From Role file or "—"}
|
|
84
|
+
**Internal/External:** {Internal / External / External (Prior Worker)}
|
|
85
|
+
**Current title:** {Current Job Title at Current Company}
|
|
86
|
+
**Email:** {Email or "—"}
|
|
87
|
+
**Phone:** {Phone or "—"}
|
|
88
|
+
|
|
89
|
+
## Summary
|
|
90
|
+
{2–3 sentences from resume text: focus, years of experience, key strengths.
|
|
91
|
+
Fall back to Current Job Title + Total Years Experience.}
|
|
92
|
+
|
|
93
|
+
## CV
|
|
94
|
+
- [CV.md](./CV.md)
|
|
95
|
+
|
|
96
|
+
## Connected to
|
|
97
|
+
- [[Roles/{Role filename}]] — applied to
|
|
98
|
+
- {[[People/{Hiring manager}]] — hiring manager, if known}
|
|
99
|
+
- {[[People/{Domain lead}]] — domain lead, if known}
|
|
100
|
+
- {Referred-by person, if present}
|
|
101
|
+
|
|
102
|
+
## Pipeline
|
|
103
|
+
- **{Date Applied}**: Applied via {Source} — Step: {Workday step}
|
|
104
|
+
|
|
105
|
+
## Skills
|
|
106
|
+
{Agent-aligned standard skill IDs from `bunx fit-pathway skill --list`}
|
|
107
|
+
|
|
108
|
+
## Education
|
|
109
|
+
{Degrees + Fields of Study}
|
|
110
|
+
|
|
111
|
+
## Work History
|
|
112
|
+
{All Job Titles + Companies}
|
|
113
|
+
|
|
114
|
+
## Notes
|
|
115
|
+
{Visa, Eligibility, Relocation, Non-compete, Years experience}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Gender is `—` (Workday exports carry no gender signals).
|
|
119
|
+
|
|
120
|
+
## Existing-candidate edits
|
|
121
|
+
|
|
122
|
+
Apply targeted edits to `brief.md` — never rewrite. Set/update `Req`, advance
|
|
123
|
+
`Status` if the Workday step is more advanced, update `Last activity`, append
|
|
124
|
+
`**{Date Applied}**: Applied to {Req ID} — {Title} via {Source}` to Pipeline,
|
|
125
|
+
fill only missing Email/Phone/ Location. Never overwrite richer existing data
|
|
126
|
+
with sparser Workday data.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Workday Export Format
|
|
2
|
+
|
|
3
|
+
Reference for `req-workday`. The export format varies between Workday versions;
|
|
4
|
+
the parse script handles both with header-driven column mapping and dynamic
|
|
5
|
+
header-row detection.
|
|
6
|
+
|
|
7
|
+
## Sheet 1 — requisition metadata
|
|
8
|
+
|
|
9
|
+
### Old format (key/value)
|
|
10
|
+
|
|
11
|
+
| Row | Field | Example |
|
|
12
|
+
| --- | --------------------- | -------------------------------------- |
|
|
13
|
+
| 1 | Title header | `4951493 Principal Software Engineer…` |
|
|
14
|
+
| 2 | Recruiting Start Date | `02/10/2026` |
|
|
15
|
+
| 3 | Target Hire Date | `02/10/2026` |
|
|
16
|
+
| 4 | Primary Location | `USA - NY - Headquarters` |
|
|
17
|
+
| 5 | Hiring Manager Title | `Hiring Manager` |
|
|
18
|
+
| 6 | Hiring Manager | Name |
|
|
19
|
+
| 7 | Recruiter Title | `Recruiter` |
|
|
20
|
+
| 8 | Recruiter | Name |
|
|
21
|
+
|
|
22
|
+
### New format (stage-count summary)
|
|
23
|
+
|
|
24
|
+
| Row | Field | Example |
|
|
25
|
+
| --- | ----------------- | -------------------------------------- |
|
|
26
|
+
| 1 | Title header | `4951493 Principal Software Engineer…` |
|
|
27
|
+
| 2 | Active Candidates | `74 of 74` |
|
|
28
|
+
| 3 | Active Referrals | `3 of 3` |
|
|
29
|
+
| 4 | Active Internal | `4 of 4` |
|
|
30
|
+
| 7+ | Stage counts | `56 → Considered` |
|
|
31
|
+
|
|
32
|
+
The new format does not carry hiring manager, recruiter, or location.
|
|
33
|
+
|
|
34
|
+
## Candidates sheet
|
|
35
|
+
|
|
36
|
+
Auto-detected:
|
|
37
|
+
|
|
38
|
+
- **Old format:** 3+ sheets; candidates on the "Candidates" sheet or Sheet3;
|
|
39
|
+
header at row 3 (index 2); two "Job Application" columns.
|
|
40
|
+
- **New format:** 2 sheets; candidates on Sheet2; header at row 8 (index 7);
|
|
41
|
+
single "Job Application" column.
|
|
42
|
+
|
|
43
|
+
Column mapping is header-driven — the parser reads the header row and maps
|
|
44
|
+
columns by name. Columns that vary between exports ("Jobs Applied to", "Referred
|
|
45
|
+
by", "Convenience Task") are handled automatically.
|
|
46
|
+
|
|
47
|
+
## Name annotations
|
|
48
|
+
|
|
49
|
+
Names may include parenthetical annotations:
|
|
50
|
+
|
|
51
|
+
- `(Prior Worker)` → Internal/External = `External (Prior Worker)`.
|
|
52
|
+
- `(Internal)` → Internal/External = `Internal`.
|
|
53
|
+
- No annotation, source contains "Internal" → `Internal`.
|
|
54
|
+
- Otherwise → `External`.
|
|
55
|
+
|
|
56
|
+
Strip the annotation from the directory name and the brief heading.
|