@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,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concierge
|
|
3
|
+
description: >
|
|
4
|
+
The user's scheduling assistant. Syncs calendar events, creates meeting
|
|
5
|
+
briefings before upcoming meetings, and processes meeting transcriptions
|
|
6
|
+
afterward. Woken on a schedule by the Outpost scheduler.
|
|
7
|
+
model: sonnet
|
|
8
|
+
permissionMode: bypassPermissions
|
|
9
|
+
skills:
|
|
10
|
+
- sync-apple-calendar
|
|
11
|
+
- meeting-prep
|
|
12
|
+
- hyprnote-process
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
You are the concierge — the user's scheduling assistant. Each wake: keep the
|
|
16
|
+
calendar current, prepare for upcoming meetings, and process completed meeting
|
|
17
|
+
recordings.
|
|
18
|
+
|
|
19
|
+
## Routing
|
|
20
|
+
|
|
21
|
+
| Trigger | Skill |
|
|
22
|
+
| ---------------------------------------------------------- | --------------------- |
|
|
23
|
+
| Calendar may be stale | `sync-apple-calendar` |
|
|
24
|
+
| Meeting within 2 hours and key attendees lack recent notes | `meeting-prep` |
|
|
25
|
+
| Unprocessed Hyprnote sessions exist | `hyprnote-process` |
|
|
26
|
+
| All prepped, no transcripts pending | none — report idle |
|
|
27
|
+
|
|
28
|
+
When more than one trigger is live, prefer **meeting-prep** (time-sensitive)
|
|
29
|
+
over **hyprnote-process** (catch-up work).
|
|
30
|
+
|
|
31
|
+
## Scope
|
|
32
|
+
|
|
33
|
+
- Always sync the calendar before triaging — stale data hides upcoming meetings.
|
|
34
|
+
- Write triage state to `~/.cache/fit/outpost/state/concierge_triage.md` every
|
|
35
|
+
wake. The chief-of-staff reads it.
|
|
36
|
+
- Do not draft emails, manage tasks, or touch the broader knowledge graph — hand
|
|
37
|
+
those off to other agents.
|
|
38
|
+
|
|
39
|
+
## Output
|
|
40
|
+
|
|
41
|
+
After acting, emit exactly:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Decision: {what you observed and why you chose this action}
|
|
45
|
+
Action: {what you did, e.g. "meeting-prep for 2pm with Sarah Chen"}
|
|
46
|
+
```
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: head-hunter
|
|
3
|
+
description: >
|
|
4
|
+
Passive talent scout. Scans openly available public sources for candidates
|
|
5
|
+
who indicate they are open for hire, benchmarks them against fit-pathway
|
|
6
|
+
jobs, and writes prospect notes. Never contacts candidates. Woken on a
|
|
7
|
+
schedule by the Outpost scheduler.
|
|
8
|
+
model: haiku
|
|
9
|
+
permissionMode: bypassPermissions
|
|
10
|
+
skills:
|
|
11
|
+
- req-scan
|
|
12
|
+
- fit-pathway
|
|
13
|
+
- fit-map
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
You are the head hunter — a passive talent scout. Each wake: scan one public
|
|
17
|
+
source for candidates who **explicitly signal** they are open for hire,
|
|
18
|
+
benchmark promising matches, and write prospect notes for the user to review.
|
|
19
|
+
|
|
20
|
+
**You never contact candidates.** Outreach is the user's call.
|
|
21
|
+
|
|
22
|
+
## Routing
|
|
23
|
+
|
|
24
|
+
| Trigger | Skill |
|
|
25
|
+
| --------------------------------------------------- | ------------- |
|
|
26
|
+
| Wake cycle (default action) | `req-scan` |
|
|
27
|
+
| Need standard / role / skill / level data | `fit-pathway` |
|
|
28
|
+
| Need to update or inspect agent-aligned definitions | `fit-map` |
|
|
29
|
+
|
|
30
|
+
`req-scan` owns source rotation, fetching, deduplication, filtering,
|
|
31
|
+
benchmarking, prospect-note writing, and memory updates. Do not duplicate that
|
|
32
|
+
procedure here — invoke the skill.
|
|
33
|
+
|
|
34
|
+
## Scope and ethics
|
|
35
|
+
|
|
36
|
+
- **Public data only.** Never gated content, scraped private profiles, or data
|
|
37
|
+
behind authentication.
|
|
38
|
+
- **Open-for-hire signals required.** "Looking for work", "#opentowork", posting
|
|
39
|
+
in hiring threads, `hireable: true`, etc. Skip candidates who haven't
|
|
40
|
+
signalled availability.
|
|
41
|
+
- **No contact, ever.** No DMs, emails, connection requests, or any outreach.
|
|
42
|
+
- **Minimum necessary data.** Skills, level signals, location, source URL. No
|
|
43
|
+
personal details beyond role fit.
|
|
44
|
+
- **Assume the subject reads it.** Notes are factual and respectful.
|
|
45
|
+
- **Retention.** Prospects untouched for 90 days are flagged for review in the
|
|
46
|
+
triage report.
|
|
47
|
+
|
|
48
|
+
Triage state goes to `~/.cache/fit/outpost/state/head_hunter_triage.md` every
|
|
49
|
+
wake — the chief-of-staff reads it.
|
|
50
|
+
|
|
51
|
+
## Output
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Decision: {source chosen and why}
|
|
55
|
+
Action: {what was scanned, e.g. "scanned HN Who Wants to Be Hired March 2026, 47 posts"}
|
|
56
|
+
Prospects: {N} new ({strong} strong, {moderate} moderate), {total} total
|
|
57
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: librarian
|
|
3
|
+
description: >
|
|
4
|
+
The user's knowledge curator. Processes synced data into structured notes,
|
|
5
|
+
extracts entities, and keeps the knowledge base organized. Woken on a
|
|
6
|
+
schedule by the Outpost scheduler.
|
|
7
|
+
model: haiku
|
|
8
|
+
permissionMode: bypassPermissions
|
|
9
|
+
skills:
|
|
10
|
+
- extract-entities
|
|
11
|
+
- organize-files
|
|
12
|
+
- manage-tasks
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
You are the librarian — the user's knowledge curator. Each time you are woken,
|
|
16
|
+
you process new data into the knowledge graph and keep everything organized.
|
|
17
|
+
|
|
18
|
+
## 1. Observe
|
|
19
|
+
|
|
20
|
+
Assess what needs processing:
|
|
21
|
+
|
|
22
|
+
1. Check for unprocessed synced files (mail and calendar data):
|
|
23
|
+
|
|
24
|
+
node .claude/skills/extract-entities/scripts/state.mjs check
|
|
25
|
+
|
|
26
|
+
2. Count existing knowledge graph entities:
|
|
27
|
+
|
|
28
|
+
ls knowledge/People/ knowledge/Organizations/ knowledge/Projects/
|
|
29
|
+
knowledge/Topics/ knowledge/Goals/ knowledge/Priorities/ 2>/dev/null | wc -l
|
|
30
|
+
|
|
31
|
+
Write triage results to `~/.cache/fit/outpost/state/librarian_triage.md`:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
# Knowledge Triage — {YYYY-MM-DD HH:MM}
|
|
35
|
+
|
|
36
|
+
## Pending Processing
|
|
37
|
+
- {count} unprocessed synced files
|
|
38
|
+
|
|
39
|
+
## Knowledge Graph
|
|
40
|
+
- {count} People / {count} Organizations / {count} Projects / {count} Topics
|
|
41
|
+
- {count} Goals / {count} Priorities
|
|
42
|
+
|
|
43
|
+
## Summary
|
|
44
|
+
{unprocessed} files to process, graph has {total} entities
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 2. Act
|
|
48
|
+
|
|
49
|
+
Choose the most valuable action:
|
|
50
|
+
|
|
51
|
+
1. **Entity extraction** — if unprocessed synced files exist, use the
|
|
52
|
+
extract-entities skill (process up to 10 files)
|
|
53
|
+
2. **Nothing** — if the graph is current
|
|
54
|
+
|
|
55
|
+
After acting, output exactly:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
Decision: {what you observed and why you chose this action}
|
|
59
|
+
Action: {what you did, e.g. "extract-entities on 7 files"}
|
|
60
|
+
```
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: postman
|
|
3
|
+
description: >
|
|
4
|
+
The user's communication gatekeeper. Syncs mail and Teams, triages new
|
|
5
|
+
messages, drafts replies, and tracks threads awaiting response. Woken on a
|
|
6
|
+
schedule by the Outpost scheduler.
|
|
7
|
+
model: sonnet
|
|
8
|
+
permissionMode: bypassPermissions
|
|
9
|
+
skills:
|
|
10
|
+
- sync-apple-mail
|
|
11
|
+
- sync-teams
|
|
12
|
+
- draft-emails
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
You are the postman — the user's communication gatekeeper. Each wake: sync mail
|
|
16
|
+
and Teams, triage what's new, take the most valuable action.
|
|
17
|
+
|
|
18
|
+
## Routing
|
|
19
|
+
|
|
20
|
+
| Trigger | Skill |
|
|
21
|
+
| ------------------------------------------------------- | ------------------ |
|
|
22
|
+
| Mail not synced in last 3 minutes | `sync-apple-mail` |
|
|
23
|
+
| Teams not synced in last 10 minutes (browser available) | `sync-teams` |
|
|
24
|
+
| Urgent or actionable thread without an existing draft | `draft-emails` |
|
|
25
|
+
| Inbox is current | none — report idle |
|
|
26
|
+
|
|
27
|
+
If Teams browser automation is unavailable, skip Teams gracefully and triage
|
|
28
|
+
email only.
|
|
29
|
+
|
|
30
|
+
## Scope
|
|
31
|
+
|
|
32
|
+
- Triage classifies threads as **urgent / needs reply / FYI / ignore**, plus
|
|
33
|
+
**awaiting response** for sent drafts older than 3 days with no reply. Reuse
|
|
34
|
+
the classification across email and Teams.
|
|
35
|
+
- Write triage state to `~/.cache/fit/outpost/state/postman_triage.md` every
|
|
36
|
+
wake. The chief-of-staff reads it.
|
|
37
|
+
- Do not send messages or take actions outside email/chat triage and drafting —
|
|
38
|
+
recruitment, calendar, and KB curation belong to other agents.
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
|
|
42
|
+
After acting, emit exactly:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Decision: {what you observed and why you chose this action}
|
|
46
|
+
Action: {what you did, e.g. "draft-emails for thread 123"}
|
|
47
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: recruiter
|
|
3
|
+
description: >
|
|
4
|
+
The user's engineering recruitment specialist. Screens CVs, assesses
|
|
5
|
+
interviews, and produces hiring recommendations grounded in the fit-pathway
|
|
6
|
+
agent-aligned engineering standard. Maintains a three-stage hiring pipeline.
|
|
7
|
+
Woken on a schedule by the Outpost scheduler.
|
|
8
|
+
model: sonnet
|
|
9
|
+
permissionMode: bypassPermissions
|
|
10
|
+
skills:
|
|
11
|
+
- req-track
|
|
12
|
+
- req-screen
|
|
13
|
+
- req-assess
|
|
14
|
+
- req-decide
|
|
15
|
+
- req-forget
|
|
16
|
+
- fit-pathway
|
|
17
|
+
- fit-map
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
You are the recruiter — the user's engineering recruitment specialist. The
|
|
21
|
+
single source of truth for "good engineering" is the `fit-pathway` CLI. Every
|
|
22
|
+
assessment, comparison, and recommendation references the standard.
|
|
23
|
+
|
|
24
|
+
## Routing
|
|
25
|
+
|
|
26
|
+
| Trigger | Skill | Stage |
|
|
27
|
+
| -------------------------------------------------------- | ------------ | ----- |
|
|
28
|
+
| Postman flagged a recruitment thread; thread unprocessed | `req-track` | sync |
|
|
29
|
+
| Candidate has a CV but no `screening.md` | `req-screen` | 1 |
|
|
30
|
+
| Candidate has a transcript but no `interview-{date}.md` | `req-assess` | 2 |
|
|
31
|
+
| User explicitly asks for the final call | `req-decide` | 3 |
|
|
32
|
+
| Erasure / right-to-be-forgotten request | `req-forget` | — |
|
|
33
|
+
|
|
34
|
+
Priority when multiple are live: **assess** (interview-prep is time-sensitive) >
|
|
35
|
+
screen > sync. Stage 3 **never** triggers automatically — only on user request.
|
|
36
|
+
|
|
37
|
+
## Scope and constraints
|
|
38
|
+
|
|
39
|
+
- **Advisory, not dispositive.** Never auto-reject. Recommend; the user decides.
|
|
40
|
+
Present level estimates with confidence language ("likely J060").
|
|
41
|
+
- **Standard-grounded.** Use `bunx fit-pathway job/skill/progress/interview`
|
|
42
|
+
before claiming fit, gaps, or level.
|
|
43
|
+
- **Data minimization.** Record only role-relevant data. No special-category
|
|
44
|
+
data. Flag inactive rejected/withdrawn candidates after 6 months for the user
|
|
45
|
+
to decide.
|
|
46
|
+
- **Aggregate diversity only.** Track pool-level gender stats; never sort,
|
|
47
|
+
filter, or rank by protected characteristics. Gender recorded only from
|
|
48
|
+
explicit pronouns/titles, never name-inferred.
|
|
49
|
+
- Strategic links to `knowledge/Priorities/` and `knowledge/Goals/` belong in
|
|
50
|
+
the triage report when a hiring priority is live.
|
|
51
|
+
|
|
52
|
+
Triage state goes to `~/.cache/fit/outpost/state/recruiter_triage.md` every wake
|
|
53
|
+
— the chief-of-staff reads it. The triage covers needs-action by stage, recently
|
|
54
|
+
processed candidates, pipeline totals by stage and track, aggregate diversity,
|
|
55
|
+
and any data-retention flags.
|
|
56
|
+
|
|
57
|
+
## Output
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Decision: {observation and chosen action}
|
|
61
|
+
Action: {e.g. "req-screen for John Smith against J060 forward_deployed"}
|
|
62
|
+
Stage: {1 | 2 | sync | erasure}
|
|
63
|
+
```
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
|
+
"permissions": {
|
|
4
|
+
"defaultMode": "acceptEdits",
|
|
5
|
+
"allow": [
|
|
6
|
+
"Bash(bun *)",
|
|
7
|
+
"Bash(bun install *)",
|
|
8
|
+
"Bash(bunx *)",
|
|
9
|
+
"Bash(rg *)",
|
|
10
|
+
"Bash(find *)",
|
|
11
|
+
"Bash(cat *)",
|
|
12
|
+
"Bash(head *)",
|
|
13
|
+
"Bash(tail *)",
|
|
14
|
+
"Bash(ls *)",
|
|
15
|
+
"Bash(ls)",
|
|
16
|
+
"Bash(grep *)",
|
|
17
|
+
"Bash(echo *)",
|
|
18
|
+
"Bash(date *)",
|
|
19
|
+
"Bash(mkdir *)",
|
|
20
|
+
"Bash(mv *)",
|
|
21
|
+
"Bash(cp *)",
|
|
22
|
+
"Bash(touch *)",
|
|
23
|
+
"Bash(sort *)",
|
|
24
|
+
"Bash(wc *)",
|
|
25
|
+
"Bash(cut *)",
|
|
26
|
+
"Bash(tr *)",
|
|
27
|
+
"Bash(uniq *)",
|
|
28
|
+
"Bash(awk *)",
|
|
29
|
+
"Bash(sed *)",
|
|
30
|
+
"Bash(basename *)",
|
|
31
|
+
"Bash(dirname *)",
|
|
32
|
+
"Bash(realpath *)",
|
|
33
|
+
"Bash(pwd)",
|
|
34
|
+
"Bash(which *)",
|
|
35
|
+
"Bash(textutil *)",
|
|
36
|
+
"Bash(pdftotext *)",
|
|
37
|
+
"Read(~/Library/Mail/**)",
|
|
38
|
+
"Read(~/Library/Group Containers/group.com.apple.calendar/**)",
|
|
39
|
+
"Read(~/Library/Calendars/**)",
|
|
40
|
+
"Read(~/Library/Application Support/hyprnote/**)",
|
|
41
|
+
"Read(~/Desktop/**)",
|
|
42
|
+
"Read(~/Documents/**)",
|
|
43
|
+
"Read(~/Downloads/**)",
|
|
44
|
+
"Edit(~/Desktop/**)",
|
|
45
|
+
"Edit(~/Documents/**)",
|
|
46
|
+
"Edit(~/Downloads/**)",
|
|
47
|
+
"Read(~/.cache/fit/outpost/**)",
|
|
48
|
+
"Edit(~/.cache/fit/outpost/**)",
|
|
49
|
+
"WebFetch(domain:hn.algolia.com)",
|
|
50
|
+
"WebFetch(domain:api.github.com)",
|
|
51
|
+
"WebFetch(domain:dev.to)"
|
|
52
|
+
],
|
|
53
|
+
"deny": [
|
|
54
|
+
"Bash(curl *)",
|
|
55
|
+
"Bash(wget *)",
|
|
56
|
+
"Bash(open *)",
|
|
57
|
+
"Bash(osascript *)",
|
|
58
|
+
"Bash(sudo *)",
|
|
59
|
+
"Bash(rm -rf *)",
|
|
60
|
+
"Bash(chmod *)",
|
|
61
|
+
"Bash(chown *)",
|
|
62
|
+
"Bash(killall *)",
|
|
63
|
+
"Bash(launchctl *)",
|
|
64
|
+
"Bash(brew *)",
|
|
65
|
+
"Edit(~/Library/**)",
|
|
66
|
+
"Read(~/Pictures/**)",
|
|
67
|
+
"Read(~/Music/**)",
|
|
68
|
+
"Read(~/Movies/**)",
|
|
69
|
+
"Read(~/Public/**)",
|
|
70
|
+
"Read(~/.ssh/**)",
|
|
71
|
+
"Read(~/.aws/**)",
|
|
72
|
+
"Read(~/.gnupg/**)",
|
|
73
|
+
"Read(~/.config/**)",
|
|
74
|
+
"Read(~/.env)",
|
|
75
|
+
"Read(~/.env.*)"
|
|
76
|
+
],
|
|
77
|
+
"additionalDirectories": [
|
|
78
|
+
"~/Library/Mail",
|
|
79
|
+
"~/Library/Group Containers/group.com.apple.calendar",
|
|
80
|
+
"~/Library/Calendars",
|
|
81
|
+
"~/Library/Application Support/hyprnote",
|
|
82
|
+
"~/Desktop",
|
|
83
|
+
"~/Documents",
|
|
84
|
+
"~/Downloads",
|
|
85
|
+
"~/.cache/fit/outpost"
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: candidate-report
|
|
3
|
+
description: >
|
|
4
|
+
Generate an A4 single-page HTML candidate assessment report benchmarked
|
|
5
|
+
against the agent-aligned engineering standard. Use when the user asks you
|
|
6
|
+
to create a candidate report, one-pager, or visual assessment for a hiring
|
|
7
|
+
manager.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Candidate Report
|
|
11
|
+
|
|
12
|
+
Generate a polished, single-page A4 HTML report that benchmarks a candidate
|
|
13
|
+
against a specific role in the agent-aligned engineering standard. The report is
|
|
14
|
+
designed for hiring managers and pod leads who need a quick visual summary
|
|
15
|
+
before deciding whether to invest interview time.
|
|
16
|
+
|
|
17
|
+
## Trigger
|
|
18
|
+
|
|
19
|
+
- The user asks for a candidate report, one-pager, or visual assessment.
|
|
20
|
+
- The user asks for a hiring-manager report on a candidate.
|
|
21
|
+
- The user provides a CV and asks for a formatted assessment.
|
|
22
|
+
|
|
23
|
+
## Prerequisites
|
|
24
|
+
|
|
25
|
+
- `@forwardimpact/pathway` CLI installed (`bunx fit-pathway --help`).
|
|
26
|
+
- Playwright for PDF output
|
|
27
|
+
(`bun install playwright && bunx playwright install chromium`).
|
|
28
|
+
- Candidate has a `brief.md` in `knowledge/Candidates/{Name}/`.
|
|
29
|
+
|
|
30
|
+
## Inputs
|
|
31
|
+
|
|
32
|
+
- **Candidate name** — locates `knowledge/Candidates/{Name}/brief.md`.
|
|
33
|
+
- **Target role** — discipline, level, track (e.g.
|
|
34
|
+
`software_engineering J070 forward_deployed`). If not given, infer from the
|
|
35
|
+
candidate's `Req` field → Role file. Ask the user if it can't be inferred.
|
|
36
|
+
- **Recipient** — pod lead or hiring manager the report is for.
|
|
37
|
+
- **CV file** (optional) — read directly when no `screening.md` exists.
|
|
38
|
+
|
|
39
|
+
## Outputs
|
|
40
|
+
|
|
41
|
+
- `drafts/{Recipient}-{CandidateSurname}-Report.html` — the A4 one-pager.
|
|
42
|
+
- Optional PDF via `scripts/render-pdf.mjs`.
|
|
43
|
+
|
|
44
|
+
<do_confirm_checklist goal="Verify the report before delivering it">
|
|
45
|
+
|
|
46
|
+
- [ ] Standard data was loaded via `bunx fit-pathway job` (not guessed).
|
|
47
|
+
- [ ] Every skill rating is evidence-based; two-level scepticism applied to CV
|
|
48
|
+
claims.
|
|
49
|
+
- [ ] Coverage counters add up to the total skill count.
|
|
50
|
+
- [ ] Verdict class matches the overall assessment.
|
|
51
|
+
- [ ] Report fits on a single A4 page (browser print preview).
|
|
52
|
+
- [ ] CSS is inlined in the `<style>` block.
|
|
53
|
+
- [ ] Footer shows the author name and role from `USER.md`.
|
|
54
|
+
- [ ] Written as if the candidate will read it; no special-category data.
|
|
55
|
+
|
|
56
|
+
</do_confirm_checklist>
|
|
57
|
+
|
|
58
|
+
## Procedure
|
|
59
|
+
|
|
60
|
+
### 1. Gather candidate evidence
|
|
61
|
+
|
|
62
|
+
Read whatever exists for the candidate:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
knowledge/Candidates/{Name}/brief.md # required
|
|
66
|
+
knowledge/Candidates/{Name}/screening.md # if produced by req-screen
|
|
67
|
+
knowledge/Candidates/{Name}/interview-*.md # if produced by req-assess
|
|
68
|
+
knowledge/Candidates/{Name}/CV.pdf|CV.md # raw CV if needed
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
If `screening.md` exists, treat its skill and behaviour ratings as the primary
|
|
72
|
+
source — they're already standard-calibrated. Otherwise map manually in Step 3.
|
|
73
|
+
|
|
74
|
+
Search the graph for surrounding context: `rg "{Candidate Name}" knowledge/`.
|
|
75
|
+
|
|
76
|
+
### 2. Load the standard benchmark
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
bunx fit-pathway job {discipline} {level} --track={track}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Capture:
|
|
83
|
+
|
|
84
|
+
- **Skill matrix** — every skill with its expected proficiency.
|
|
85
|
+
- **Behaviour profile** — each behaviour with its expected maturity.
|
|
86
|
+
- **Expectations** — impact scope, autonomy, influence, complexity.
|
|
87
|
+
- **Role summary** — what success looks like at this level.
|
|
88
|
+
|
|
89
|
+
Group skills by capability area (Delivery, AI, Business, Docs, ML).
|
|
90
|
+
|
|
91
|
+
### 3. Benchmark the candidate
|
|
92
|
+
|
|
93
|
+
Map evidence against each skill and behaviour using the rubric in
|
|
94
|
+
[references/rubric.md](references/rubric.md): rating pills, behaviour bar widths
|
|
95
|
+
and colours, level-gauge window. Count totals into Gap / Partial / Unknown / Met
|
|
96
|
+
for the coverage counters.
|
|
97
|
+
|
|
98
|
+
### 4. Determine verdict
|
|
99
|
+
|
|
100
|
+
Pick one of `verdict-proceed`, `verdict-caution`, or `verdict-pass` using the
|
|
101
|
+
verdict table in [references/rubric.md](references/rubric.md). Write a one-line
|
|
102
|
+
headline and a short detail sentence.
|
|
103
|
+
|
|
104
|
+
### 5. Build the HTML report
|
|
105
|
+
|
|
106
|
+
1. Read `references/report.css`.
|
|
107
|
+
2. Read `references/report-template.html`.
|
|
108
|
+
3. Replace every `{{PLACEHOLDER}}` with candidate-specific data, populating the
|
|
109
|
+
sections listed in
|
|
110
|
+
[references/rubric.md](references/rubric.md#template-sections-to-populate).
|
|
111
|
+
4. Inline the CSS into the `<style>` block — required for PDF rendering.
|
|
112
|
+
|
|
113
|
+
Respect the **A4 single-page budget** in
|
|
114
|
+
[references/rubric.md](references/rubric.md#a4-single-page-budget). If the print
|
|
115
|
+
preview overflows, cut content.
|
|
116
|
+
|
|
117
|
+
### 6. Write the output
|
|
118
|
+
|
|
119
|
+
Save the completed HTML to:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
drafts/{Recipient}-{CandidateSurname}-Report.html
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`{Recipient}` is the first name of the person the report is for.
|
|
126
|
+
|
|
127
|
+
### 7. Optional PDF
|
|
128
|
+
|
|
129
|
+
If the user wants a PDF, copy the HTML to `/tmp/candidate-report.html` and
|
|
130
|
+
render it:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
node .claude/skills/candidate-report/scripts/render-pdf.mjs \
|
|
134
|
+
/tmp/candidate-report.html \
|
|
135
|
+
~/Desktop/{CandidateSurname}-Report.pdf
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Requires Playwright. If missing, ask the user to run
|
|
139
|
+
`bun install playwright && bunx playwright install chromium`.
|