@bendyline/gilde 0.1.95 → 0.2.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/data/craftbook-templates/ab/ab-test-readout/manifest.json +4 -0
- package/data/craftbook-templates/al/album-curate/manifest.json +4 -0
- package/data/craftbook-templates/an/anniversary-cut/manifest.json +4 -0
- package/data/craftbook-templates/an/annotated-bibliography/manifest.json +4 -0
- package/data/craftbook-templates/an/annual-document-review/manifest.json +4 -0
- package/data/craftbook-templates/an/anomaly-scan/manifest.json +3 -0
- package/data/craftbook-templates/au/audio-ad-spot/manifest.json +4 -0
- package/data/craftbook-templates/bo/board-deck/manifest.json +3 -0
- package/data/craftbook-templates/bo/board-game-web/manifest.json +4 -0
- package/data/craftbook-templates/br/branding-website/manifest.json +4 -0
- package/data/craftbook-templates/br/broadcast-announcement/manifest.json +4 -0
- package/data/craftbook-templates/ca/calendar-brief/manifest.json +3 -0
- package/data/craftbook-templates/ch/chapter-weave/manifest.json +4 -0
- package/data/craftbook-templates/ch/chart-pack/manifest.json +3 -0
- package/data/craftbook-templates/co/codebase-ux-review/manifest.json +3 -0
- package/data/craftbook-templates/co/cohort-analysis/manifest.json +3 -0
- package/data/craftbook-templates/co/company-research-brief/manifest.json +4 -0
- package/data/craftbook-templates/co/compat-check/manifest.json +4 -0
- package/data/craftbook-templates/co/competitive-analysis/manifest.json +4 -0
- package/data/craftbook-templates/co/content-accuracy-review/manifest.json +4 -0
- package/data/craftbook-templates/co/content-deck/manifest.json +4 -0
- package/data/craftbook-templates/co/contract-template/manifest.json +4 -0
- package/data/craftbook-templates/co/corpus-email-digest/manifest.json +3 -0
- package/data/craftbook-templates/co/cover-letter/manifest.json +3 -0
- package/data/craftbook-templates/cr/crm-update-batch/manifest.json +3 -0
- package/data/craftbook-templates/cr/crossword-forge/manifest.json +4 -0
- package/data/craftbook-templates/cs/csv-transformer/manifest.json +3 -0
- package/data/craftbook-templates/da/dashboard-spec/manifest.json +4 -0
- package/data/craftbook-templates/da/data-dictionary/manifest.json +3 -0
- package/data/craftbook-templates/da/data-export-migrate/manifest.json +4 -0
- package/data/craftbook-templates/da/data-join-merge/manifest.json +3 -0
- package/data/craftbook-templates/da/data-quality-audit/manifest.json +3 -0
- package/data/craftbook-templates/da/data-to-report/manifest.json +4 -0
- package/data/craftbook-templates/da/data-viz-page/manifest.json +4 -0
- package/data/craftbook-templates/da/dataset-clean/manifest.json +3 -0
- package/data/craftbook-templates/de/design-review/manifest.json +4 -0
- package/data/craftbook-templates/de/design-system-consultation/manifest.json +4 -0
- package/data/craftbook-templates/di/diagram-from-text/manifest.json +4 -0
- package/data/craftbook-templates/dr/drive-wrap-up/manifest.json +4 -0
- package/data/craftbook-templates/du/due-diligence-brief/manifest.json +4 -0
- package/data/craftbook-templates/en/engineering-retrospective/manifest.json +4 -0
- package/data/craftbook-templates/ex/expense-categorize/manifest.json +4 -0
- package/data/craftbook-templates/ex/explain-code-folder/manifest.json +26 -0
- package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/craftbook.json +233 -0
- package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/README.md +29 -0
- package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/package.json +17 -0
- package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/src/format.js +15 -0
- package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/src/index.js +50 -0
- package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/src/store.js +45 -0
- package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/samples/todo-cli/test/store.test.js +61 -0
- package/data/craftbook-templates/ex/explain-code-folder/versions/1.0.0/test.json +106 -0
- package/data/craftbook-templates/fa/family-story-chapter/manifest.json +4 -0
- package/data/craftbook-templates/fo/forecast-model/manifest.json +4 -0
- package/data/craftbook-templates/ga/game-with-screens/manifest.json +4 -0
- package/data/craftbook-templates/gl/glossary-build/manifest.json +3 -0
- package/data/craftbook-templates/ha/handbook-section/manifest.json +3 -0
- package/data/craftbook-templates/he/hero-image/manifest.json +4 -0
- package/data/craftbook-templates/ht/html-arcade-game/manifest.json +4 -0
- package/data/craftbook-templates/ht/html-puzzle-game/manifest.json +4 -0
- package/data/craftbook-templates/id/idle-clicker-game/manifest.json +4 -0
- package/data/craftbook-templates/in/inbox-triage/manifest.json +3 -0
- package/data/craftbook-templates/in/insurance-inventory/manifest.json +4 -0
- package/data/craftbook-templates/in/interactive-quiz/manifest.json +3 -0
- package/data/craftbook-templates/in/invoice-generator/manifest.json +3 -0
- package/data/craftbook-templates/in/invoice-run/manifest.json +3 -0
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/ju/juice-pass/manifest.json +4 -0
- package/data/craftbook-templates/kp/kpi-scorecard/manifest.json +4 -0
- package/data/craftbook-templates/la/landing-page/manifest.json +4 -0
- package/data/craftbook-templates/le/lead-enrichment/manifest.json +4 -0
- package/data/craftbook-templates/li/literature-review/manifest.json +4 -0
- package/data/craftbook-templates/lo/logo-set/manifest.json +4 -0
- package/data/craftbook-templates/ma/market-scan/manifest.json +4 -0
- package/data/craftbook-templates/me/meeting-minutes/manifest.json +3 -0
- package/data/craftbook-templates/me/meeting-notes-to-actions/manifest.json +3 -0
- package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.1.2/craftbook.json +255 -0
- package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.1.2/samples/team-sync/notes.md +47 -0
- package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.1.2/test.json +78 -0
- package/data/craftbook-templates/me/meeting-prep-brief/manifest.json +3 -0
- package/data/craftbook-templates/me/meeting-summary-audio/manifest.json +3 -0
- package/data/craftbook-templates/me/memory-prompt-session/manifest.json +3 -0
- package/data/craftbook-templates/mi/micro-game-jam/manifest.json +4 -0
- package/data/craftbook-templates/mo/mock-interview/manifest.json +3 -0
- package/data/craftbook-templates/mo/mod-scaffold/manifest.json +4 -0
- package/data/craftbook-templates/mo/month-close/manifest.json +3 -0
- package/data/craftbook-templates/mo/monthly-recording-review/manifest.json +3 -0
- package/data/craftbook-templates/oc/ocr-extract/manifest.json +4 -0
- package/data/craftbook-templates/of/offer-compare/manifest.json +3 -0
- package/data/craftbook-templates/on/one-pager/manifest.json +4 -0
- package/data/craftbook-templates/ph/photo-cull/manifest.json +4 -0
- package/data/craftbook-templates/ph/photo-library-nightly/manifest.json +4 -0
- package/data/craftbook-templates/ph/physics-toy/manifest.json +4 -0
- package/data/craftbook-templates/pi/pitch-deck/manifest.json +4 -0
- package/data/craftbook-templates/pl/playtest-report/manifest.json +4 -0
- package/data/craftbook-templates/po/powerpoint-deck/manifest.json +4 -0
- package/data/craftbook-templates/pr/practice-exam/manifest.json +3 -0
- package/data/craftbook-templates/pr/practice-session/manifest.json +3 -0
- package/data/craftbook-templates/pr/price-tracker/manifest.json +4 -0
- package/data/craftbook-templates/pr/proposal-sow/manifest.json +3 -0
- package/data/craftbook-templates/pu/puzzle-pack-layout/manifest.json +4 -0
- package/data/craftbook-templates/qu/quarterly-summary/manifest.json +4 -0
- package/data/craftbook-templates/raw-index.json +1 -1
- package/data/craftbook-templates/re/reading-list/manifest.json +3 -0
- package/data/craftbook-templates/re/receipt-intake/manifest.json +4 -0
- package/data/craftbook-templates/re/receipt-ocr-ledger/manifest.json +3 -0
- package/data/craftbook-templates/re/recurring-invoice-run/manifest.json +3 -0
- package/data/craftbook-templates/re/release-announcement/manifest.json +4 -0
- package/data/craftbook-templates/re/resume-cv/manifest.json +3 -0
- package/data/craftbook-templates/re/review-code-folder/manifest.json +25 -0
- package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/craftbook.json +223 -0
- package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/README.md +29 -0
- package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/package.json +17 -0
- package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/src/format.js +15 -0
- package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/src/index.js +50 -0
- package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/src/store.js +44 -0
- package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/samples/todo-cli-bugs/test/store.test.js +37 -0
- package/data/craftbook-templates/re/review-code-folder/versions/1.0.0/test.json +108 -0
- package/data/craftbook-templates/sc/scrape-to-structured/manifest.json +3 -0
- package/data/craftbook-templates/sp/spa-dashboard/manifest.json +4 -0
- package/data/craftbook-templates/sp/spreadsheet-findings/manifest.json +26 -0
- package/data/craftbook-templates/sp/spreadsheet-findings/versions/1.0.0/craftbook.json +186 -0
- package/data/craftbook-templates/sp/spreadsheet-findings/versions/1.0.0/samples/shop-sales/sales.csv +49 -0
- package/data/craftbook-templates/sp/spreadsheet-findings/versions/1.0.0/test.json +88 -0
- package/data/craftbook-templates/sp/spreadsheet-model/manifest.json +4 -0
- package/data/craftbook-templates/sp/sprite-sheet/manifest.json +4 -0
- package/data/craftbook-templates/sq/sql-analysis/manifest.json +3 -0
- package/data/craftbook-templates/st/standup-summary/manifest.json +3 -0
- package/data/craftbook-templates/st/status-report/manifest.json +3 -0
- package/data/craftbook-templates/su/subscription-audit/manifest.json +4 -0
- package/data/craftbook-templates/su/survey-analysis/manifest.json +4 -0
- package/data/craftbook-templates/ta/tailor-resume/manifest.json +3 -0
- package/data/craftbook-templates/ti/tidy-spreadsheet/manifest.json +26 -0
- package/data/craftbook-templates/ti/tidy-spreadsheet/versions/1.0.0/craftbook.json +183 -0
- package/data/craftbook-templates/ti/tidy-spreadsheet/versions/1.0.0/samples/club-members/members.csv +43 -0
- package/data/craftbook-templates/ti/tidy-spreadsheet/versions/1.0.0/test.json +108 -0
- package/data/craftbook-templates/ti/tileset-batch/manifest.json +4 -0
- package/data/craftbook-templates/to/topic-explainer/manifest.json +4 -0
- package/data/craftbook-templates/tr/transcribe-audio/manifest.json +4 -0
- package/data/craftbook-templates/tr/transcribe-index/manifest.json +4 -0
- package/data/craftbook-templates/vi/visit-prep/manifest.json +4 -0
- package/data/craftbook-templates/we/weak-spot-drill/manifest.json +3 -0
- package/data/craftbook-templates/we/week-plan/manifest.json +3 -0
- package/data/craftbook-templates/we/weekly-pipeline-review/manifest.json +3 -0
- package/data/craftbook-templates/we/weekly-review/manifest.json +3 -0
- package/data/craftbook-templates/ye/year-in-review/manifest.json +4 -0
- package/data/image-models/an/animagine-xl-4/versions/4.0.1/manifest.json +16 -0
- package/data/image-models/fl/flux-2-klein-4b-q4/versions/1.0.1/manifest.json +29 -0
- package/data/image-models/index.json +1 -1
- package/data/image-models/ir/iris-3b-f32/versions/1.0.1/manifest.json +25 -0
- package/data/image-models/kr/krea-2-turbo-q4/versions/1.0.1/manifest.json +29 -0
- package/data/image-models/kr/krea-2-turbo-q6/versions/1.0.1/manifest.json +29 -0
- package/data/image-models/kr/krea-2-turbo-q8/versions/1.0.1/manifest.json +29 -0
- package/data/image-models/mi/ming-image-0.1-design-bf16/versions/1.0.1/manifest.json +50 -0
- package/data/image-models/raw-index.json +1 -1
- package/data/image-models/sd/sd-1.5/versions/1.0.1/manifest.json +16 -0
- package/data/image-models/sd/sd-turbo/versions/1.0.1/manifest.json +16 -0
- package/data/image-models/sd/sdxl-base-1.0/versions/1.0.1/manifest.json +16 -0
- package/data/image-models/sd/sdxl-lightning-4step/versions/1.0.1/manifest.json +16 -0
- package/data/image-models/sd/sdxl-turbo/versions/1.0.1/manifest.json +16 -0
- package/data/project-types/ca/caregiving-binder/manifest.json +4 -0
- package/data/project-types/de/design-scheme/manifest.json +4 -0
- package/data/project-types/fi/fitness-coach/manifest.json +4 -0
- package/data/project-types/fr/freelance-office/manifest.json +3 -0
- package/data/project-types/fu/fundraiser-hq/manifest.json +4 -0
- package/data/project-types/ho/household-budget/manifest.json +3 -0
- package/data/project-types/index.json +1 -1
- package/data/project-types/jo/job-hunt/manifest.json +4 -0
- package/data/project-types/jo/job-hunt/versions/1.0.3/about.md +10 -0
- package/data/project-types/jo/job-hunt/versions/1.0.3/activity.json +4 -0
- package/data/project-types/jo/job-hunt/versions/1.0.3/manifest.json +212 -0
- package/data/project-types/jo/job-hunt/versions/1.0.3/mission.md +9 -0
- package/data/project-types/jo/job-hunt/versions/1.0.3/pages/dashboard/index.html +430 -0
- package/data/project-types/jo/job-hunt/versions/1.0.3/pipeline.json +6 -0
- package/data/project-types/li/life-binder/manifest.json +4 -0
- package/data/project-types/raw-index.json +1 -1
- package/data/project-types/so/social-feed/manifest.json +3 -0
- package/data/project-types/tr/trip-planner/versions/1.0.3/about.md +7 -0
- package/data/project-types/tr/trip-planner/versions/1.0.3/journal.json +4 -0
- package/data/project-types/tr/trip-planner/versions/1.0.3/manifest.json +226 -0
- package/data/project-types/tr/trip-planner/versions/1.0.3/mission.md +4 -0
- package/data/project-types/tr/trip-planner/versions/1.0.3/packing.json +8 -0
- package/data/project-types/tr/trip-planner/versions/1.0.3/pages/dashboard/index.html +368 -0
- package/data/project-types/tr/trip-planner/versions/1.0.3/trip.json +8 -0
- package/data/toolsets/do/docblocks/versions/2.7.0/manifest.json +95 -0
- package/data/toolsets/index.json +1 -1
- package/data/toolsets/raw-index.json +1 -1
- package/data/video-models/index.json +1 -1
- package/data/video-models/lt/ltx-2-19b/versions/1.0.1/manifest.json +375 -0
- package/data/video-models/lt/ltx-2.3-22b/versions/1.0.1/manifest.json +377 -0
- package/data/video-models/lt/ltx-2.3-22b-distilled/versions/1.0.1/manifest.json +377 -0
- package/data/video-models/lt/ltx-video-0.9.7-dev/versions/1.0.1/manifest.json +195 -0
- package/data/video-models/lt/ltx-video-0.9.8-13b-distilled/versions/1.0.1/manifest.json +190 -0
- package/data/video-models/raw-index.json +1 -1
- package/data/video-models/wa/wan2.2-ti2v-5b/versions/1.0.1/manifest.json +168 -0
- package/package.json +2 -1
- package/schemas/craftbook-doc.schema.json +35 -0
- package/schemas/craftbook-template-identity.schema.json +18 -0
- package/schemas/craftbook-template-version.schema.json +35 -0
- package/schemas/image-model-identity.schema.json +0 -2
- package/schemas/image-model-version.schema.json +50 -0
- package/schemas/project-type-identity.schema.json +18 -0
- package/schemas/video-model-identity.schema.json +0 -2
- package/schemas/video-model-version.schema.json +25 -0
- package/data/image-models/fl/flux-1-dev-q4/manifest.json +0 -38
- package/data/image-models/fl/flux-1-dev-q4/versions/1.0.0/manifest.json +0 -29
- package/data/image-models/fl/flux-1-schnell-q4/manifest.json +0 -39
- package/data/image-models/fl/flux-1-schnell-q4/versions/1.0.0/manifest.json +0 -29
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
A campaign to land a **{{role}}** role.
|
|
2
|
+
|
|
3
|
+
Your crew: a Loopbaancoach who keeps every application on the pipeline — tracked
|
|
4
|
+
the day it happens, chased when it goes quiet — and an Oefen-interviewer who runs
|
|
5
|
+
practice rounds before the real ones, with debriefs worth reading twice.
|
|
6
|
+
|
|
7
|
+
Open the **Output** tab any time: the pipeline board and this week's follow-ups
|
|
8
|
+
live there.
|
|
9
|
+
|
|
10
|
+
Notes for the coach: {{focus}}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"version": "1.0.3",
|
|
4
|
+
"releasedAt": "2026-10-12T00:00:00Z",
|
|
5
|
+
"extends": "job-hunt",
|
|
6
|
+
"meesterManaged": false,
|
|
7
|
+
"params": {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"role": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"title": "What role are you hunting for?",
|
|
13
|
+
"description": "The role or title you're targeting — e.g. Staff Engineer, Product Designer, Data Analyst.",
|
|
14
|
+
"default": "Software Engineer"
|
|
15
|
+
},
|
|
16
|
+
"focus": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"title": "Anything about your search?",
|
|
19
|
+
"description": "Optional context for your coach — location constraints, timeline, dream companies.",
|
|
20
|
+
"default": "Just getting started."
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"required": [
|
|
24
|
+
"role"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
"nameTemplate": "{{role}} Job Hunt",
|
|
28
|
+
"aboutTemplate": "about.md",
|
|
29
|
+
"missionTemplate": "mission.md",
|
|
30
|
+
"gezels": [
|
|
31
|
+
{
|
|
32
|
+
"templateId": "career-coach",
|
|
33
|
+
"voorman": true
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"templateId": "mock-interviewer"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"application-store": "import { type InferredInput, defineScript, gezel } from '@bendyline/gezel-sdk';\nimport { logStore, rosterStore } from '@bendyline/gezel-sdk/stores';\n\nexport const meta = defineScript({\n name: 'application-store',\n description:\n \"Read and update the job-search pipeline (applications in pipeline.json, activity in activity.json). Call action:'status' at the start of a session to see where the search stands; 'record_application' the moment the user mentions applying somewhere; 'advance_stage' when reality moves; 'log_activity' for follow-ups, scheduled interviews, and thank-yous.\",\n inputs: {\n action: {\n type: 'string',\n description: \"One of 'status', 'record_application', 'advance_stage', or 'log_activity'.\",\n required: true,\n },\n company: { type: 'string', description: 'Company name (identifies the application when id is omitted).' },\n role: { type: 'string', description: 'Role title for a new application.' },\n link: { type: 'string', description: 'Posting or application link.' },\n notes: { type: 'string', description: 'Free-form notes for a new application.' },\n id: { type: 'string', description: \"Application id (e.g. 'acme-staff-engineer') when advancing or logging.\" },\n stage: {\n type: 'string',\n description: 'Target stage for advance_stage: applied, screening, interview, offer, or closed.',\n },\n outcome: { type: 'string', description: \"With stage 'closed': signed, rejected, or withdrawn.\" },\n kind: {\n type: 'string',\n description: \"Activity kind for log_activity: follow-up, interview-scheduled, thank-you, offer-received, or note.\",\n },\n note: { type: 'string', description: 'The activity note for log_activity, or a note on a stage change.' },\n due: { type: 'string', description: 'Due date (ISO) for a follow-up.' },\n },\n outputs: {\n applications: { type: 'number', description: 'Total applications tracked.' },\n summary: { type: 'string', description: 'Human-readable pipeline summary.' },\n stale: { type: 'json', description: 'Active applications untouched for over 7 days.' },\n followUps: { type: 'json', description: 'Follow-ups due within 7 days or overdue.' },\n },\n requires: ['workspace.read', 'workspace.write'],\n} as const);\n\nconst input = gezel.input as InferredInput<typeof meta>;\n\nconst STAGES: [string, ...string[]] = ['applied', 'screening', 'interview', 'offer', 'closed'];\nconst OUTCOMES = ['signed', 'rejected', 'withdrawn'];\nconst WEEK_MS = 7 * 24 * 60 * 60 * 1000;\n\nconst roster = rosterStore(gezel.fs, 'pipeline.json', { stages: STAGES, idPrefix: 'app' });\nconst activity = logStore(gezel.fs, 'activity.json');\n\nfunction slugify(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'application'\n );\n}\n\nasync function freshId(company: string, role?: string): Promise<string> {\n const base = slugify(role ? `${company} ${role}` : company);\n let candidate = base;\n for (let n = 2; (await roster.get(candidate)) !== null; n += 1) {\n candidate = `${base}-${n}`;\n }\n return candidate;\n}\n\nasync function resolveId(): Promise<string> {\n if (input.id) {\n if ((await roster.get(input.id)) === null) throw new Error(`No application '${input.id}'.`);\n return input.id;\n }\n if (input.company) {\n const wanted = input.company.toLowerCase();\n const matches = (await roster.list()).filter(\n (r) => String(r.fields.company ?? '').toLowerCase() === wanted,\n );\n if (matches.length === 1) return matches[0]!.id;\n if (matches.length > 1) {\n throw new Error(\n `Multiple applications match company '${input.company}': ${matches.map((m) => m.id).join(', ')}. Pass id.`,\n );\n }\n }\n throw new Error(\"Pass 'id' or a unique 'company' to identify the application.\");\n}\n\nasync function summarize(): Promise<{\n applications: number;\n summary: string;\n stale: unknown[];\n followUps: unknown[];\n}> {\n const records = await roster.list();\n const counts = await roster.counts();\n const now = Date.now();\n const stale = records\n .filter((r) => r.status !== 'closed' && now - Date.parse(r.updatedAt) > WEEK_MS)\n .map((r) => ({\n id: r.id,\n company: r.fields.company ?? r.id,\n stage: r.status,\n daysQuiet: Math.floor((now - Date.parse(r.updatedAt)) / (24 * 60 * 60 * 1000)),\n }));\n const followUps = (await activity.list({ kind: 'follow-up' }))\n .filter((e) => {\n const due = typeof e.data?.dueAt === 'string' ? Date.parse(e.data.dueAt) : null;\n return due !== null && due <= now + WEEK_MS;\n })\n .map((e) => ({\n note: e.note ?? '',\n dueAt: e.data?.dueAt,\n applicationId: e.data?.applicationId,\n overdue: typeof e.data?.dueAt === 'string' && Date.parse(e.data.dueAt) < now,\n }));\n const active = records.filter((r) => r.status !== 'closed').length;\n const stageLine = STAGES.filter((s) => (counts[s] ?? 0) > 0)\n .map((s) => `${s} ${counts[s]}`)\n .join(', ');\n const summary = records.length\n ? `${active} application(s) in play (${stageLine || 'none'}). ${stale.length} stale, ${followUps.length} follow-up(s) due this week.`\n : 'No applications tracked yet.';\n return { applications: records.length, summary, stale, followUps };\n}\n\nif (input.action === 'record_application') {\n if (!input.company) throw new Error(\"record_application needs 'company'.\");\n const id = await freshId(input.company, input.role);\n const record = await roster.add({\n id,\n fields: {\n company: input.company,\n ...(input.role ? { role: input.role } : {}),\n ...(input.link ? { link: input.link } : {}),\n ...(input.notes ? { notes: input.notes } : {}),\n },\n });\n await activity.append({\n kind: 'applied',\n note: `Applied to ${input.company}${input.role ? ` for ${input.role}` : ''}.`,\n data: { applicationId: record.id },\n });\n} else if (input.action === 'advance_stage') {\n if (!input.stage) throw new Error(\"advance_stage needs 'stage'.\");\n if (!STAGES.includes(input.stage)) {\n throw new Error(`Unknown stage '${input.stage}'. Stages: ${STAGES.join(', ')}.`);\n }\n if (input.outcome && input.stage !== 'closed') {\n throw new Error(\"'outcome' only applies when closing (stage 'closed').\");\n }\n if (input.outcome && !OUTCOMES.includes(input.outcome)) {\n throw new Error(`Unknown outcome '${input.outcome}'. Outcomes: ${OUTCOMES.join(', ')}.`);\n }\n const id = await resolveId();\n await roster.transition(id, input.stage, input.note ? { note: input.note } : {});\n if (input.outcome) await roster.update(id, { fields: { outcome: input.outcome } });\n const company = String((await roster.get(id))?.fields.company ?? id);\n await activity.append({\n kind: 'stage',\n note: `${company} moved to ${input.stage}${input.outcome ? ` (${input.outcome})` : ''}.`,\n data: { applicationId: id },\n });\n} else if (input.action === 'log_activity') {\n if (!input.note) throw new Error(\"log_activity needs 'note'.\");\n let applicationId: string | undefined;\n if (input.id || input.company) {\n applicationId = await resolveId();\n // A logged touch counts as attention — it resets the staleness clock.\n await roster.update(applicationId, input.note ? { note: input.note } : {});\n }\n await activity.append({\n kind: input.kind ?? 'note',\n note: input.note,\n data: {\n ...(applicationId ? { applicationId } : {}),\n ...(input.due ? { dueAt: input.due } : {}),\n },\n });\n} else if (input.action !== 'status') {\n throw new Error(\n `Unknown action '${input.action}'. Use status, record_application, advance_stage, or log_activity.`,\n );\n}\n\ngezel.output(await summarize());\n"
|
|
41
|
+
},
|
|
42
|
+
"tools": [
|
|
43
|
+
{
|
|
44
|
+
"name": "record_application",
|
|
45
|
+
"description": "Track a new job application the moment it happens.",
|
|
46
|
+
"script": "application-store",
|
|
47
|
+
"inputs": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"properties": {
|
|
50
|
+
"company": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"description": "Company name."
|
|
53
|
+
},
|
|
54
|
+
"role": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"description": "Role title."
|
|
57
|
+
},
|
|
58
|
+
"link": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"description": "Posting or application link."
|
|
61
|
+
},
|
|
62
|
+
"notes": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"description": "Anything worth remembering about this one."
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"required": [
|
|
68
|
+
"company"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"bind": {
|
|
72
|
+
"action": "record_application"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"name": "advance_stage",
|
|
77
|
+
"description": "Move an application to a new pipeline stage (applied, screening, interview, offer, closed).",
|
|
78
|
+
"script": "application-store",
|
|
79
|
+
"inputs": {
|
|
80
|
+
"type": "object",
|
|
81
|
+
"properties": {
|
|
82
|
+
"id": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"description": "Application id."
|
|
85
|
+
},
|
|
86
|
+
"company": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "Company name (when id is omitted)."
|
|
89
|
+
},
|
|
90
|
+
"stage": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"enum": [
|
|
93
|
+
"applied",
|
|
94
|
+
"screening",
|
|
95
|
+
"interview",
|
|
96
|
+
"offer",
|
|
97
|
+
"closed"
|
|
98
|
+
],
|
|
99
|
+
"description": "The stage reality moved to."
|
|
100
|
+
},
|
|
101
|
+
"note": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"description": "What happened."
|
|
104
|
+
},
|
|
105
|
+
"outcome": {
|
|
106
|
+
"type": "string",
|
|
107
|
+
"enum": [
|
|
108
|
+
"signed",
|
|
109
|
+
"rejected",
|
|
110
|
+
"withdrawn"
|
|
111
|
+
],
|
|
112
|
+
"description": "Only when closing: how it ended."
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"required": [
|
|
116
|
+
"stage"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"bind": {
|
|
120
|
+
"action": "advance_stage"
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "log_activity",
|
|
125
|
+
"description": "Log activity on the search — a follow-up to send, an interview scheduled, a thank-you sent.",
|
|
126
|
+
"script": "application-store",
|
|
127
|
+
"inputs": {
|
|
128
|
+
"type": "object",
|
|
129
|
+
"properties": {
|
|
130
|
+
"id": {
|
|
131
|
+
"type": "string",
|
|
132
|
+
"description": "Application id this activity belongs to."
|
|
133
|
+
},
|
|
134
|
+
"company": {
|
|
135
|
+
"type": "string",
|
|
136
|
+
"description": "Company name (when id is omitted)."
|
|
137
|
+
},
|
|
138
|
+
"kind": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"enum": [
|
|
141
|
+
"follow-up",
|
|
142
|
+
"interview-scheduled",
|
|
143
|
+
"thank-you",
|
|
144
|
+
"offer-received",
|
|
145
|
+
"note"
|
|
146
|
+
],
|
|
147
|
+
"description": "What kind of activity this is."
|
|
148
|
+
},
|
|
149
|
+
"note": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"description": "The activity itself."
|
|
152
|
+
},
|
|
153
|
+
"due": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": "Due date (ISO) for a follow-up."
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
"required": [
|
|
159
|
+
"note"
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
"bind": {
|
|
163
|
+
"action": "log_activity"
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"name": "pipeline_status",
|
|
168
|
+
"description": "See the whole pipeline: counts per stage, stale applications, and follow-ups due this week.",
|
|
169
|
+
"script": "application-store",
|
|
170
|
+
"inputs": {
|
|
171
|
+
"type": "object",
|
|
172
|
+
"properties": {}
|
|
173
|
+
},
|
|
174
|
+
"bind": {
|
|
175
|
+
"action": "status"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
],
|
|
179
|
+
"craftbooks": [
|
|
180
|
+
"tailor-resume",
|
|
181
|
+
"company-research-brief",
|
|
182
|
+
"mock-interview",
|
|
183
|
+
"offer-compare",
|
|
184
|
+
"weekly-pipeline-review"
|
|
185
|
+
],
|
|
186
|
+
"schedules": [
|
|
187
|
+
{
|
|
188
|
+
"cron": "0 17 * * 5",
|
|
189
|
+
"craftbook": "weekly-pipeline-review",
|
|
190
|
+
"consent": "ask",
|
|
191
|
+
"overlap": "skip"
|
|
192
|
+
}
|
|
193
|
+
],
|
|
194
|
+
"pages": {
|
|
195
|
+
"entry": "dashboard/index.html",
|
|
196
|
+
"api": 1,
|
|
197
|
+
"reads": [
|
|
198
|
+
{
|
|
199
|
+
"source": "workspace",
|
|
200
|
+
"path": "pipeline.json"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"source": "workspace",
|
|
204
|
+
"path": "activity.json"
|
|
205
|
+
}
|
|
206
|
+
]
|
|
207
|
+
},
|
|
208
|
+
"workspaceSeed": [
|
|
209
|
+
"pipeline.json",
|
|
210
|
+
"activity.json"
|
|
211
|
+
]
|
|
212
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
- Land a signed offer for a {{role}} role — that is done.
|
|
2
|
+
- Every application is tracked the day it happens; stages move when reality moves.
|
|
3
|
+
- Nothing goes stale silently — anything untouched for a week gets chased, parked
|
|
4
|
+
with a reason, or closed.
|
|
5
|
+
- Materials are tailored per serious application: one resume variant, one company
|
|
6
|
+
brief.
|
|
7
|
+
- Before any real interview: at least one mock round, with its debrief read.
|
|
8
|
+
- Every Friday: the weekly pipeline review — what moved, what stalled, the next
|
|
9
|
+
three actions.
|