@wonsukchoi/crondex 0.13.0 → 0.14.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/README.md CHANGED
@@ -25,7 +25,7 @@ access.
25
25
  ```bash
26
26
  npx @wonsukchoi/crondex recommend "warn me before my SSL cert expires"
27
27
  npx @wonsukchoi/crondex show ssl-cert-expiry-check
28
- npx @wonsukchoi/crondex add ssl-cert-expiry-check --dest ./cron/ssl-cert-expiry-check.yaml
28
+ npx @wonsukchoi/crondex deploy ssl-cert-expiry-check --var host=example.com
29
29
  ```
30
30
 
31
31
  - `recommend "<what you want>"` — find the closest matching job (zero
@@ -35,6 +35,14 @@ npx @wonsukchoi/crondex add ssl-cert-expiry-check --dest ./cron/ssl-cert-expiry-
35
35
  - `show <id>` — print a job's full YAML
36
36
  - `add <id> [--dest path]` — copy it into your project to edit
37
37
  - `init <id> [--category x]` — scaffold a brand-new job from the template
38
+ - `deploy <id> [--target crontab|github-actions] [--var name=value ...]`
39
+ — turn a job into something that actually runs: prints a ready crontab
40
+ line (or installs it into your own crontab with `--install`), or writes
41
+ a scheduled GitHub Actions workflow file. `--var` overrides a variable's
42
+ default (repeatable). `hybrid` jobs deploy their `command` by default;
43
+ pass `--mode prompt` to deploy the `prompt` side instead — for a
44
+ crontab target that means wiring in your own agent CLI via a
45
+ `CRONDEX_AGENT_CLI` env var, since crondex can't guess its syntax.
38
46
 
39
47
  Add `--json` to `list`/`categories`/`show`/`recommend` for machine-readable
40
48
  output — useful when an agent is parsing the result programmatically
@@ -91,13 +99,13 @@ tags, variables) use `crondex list`, `crondex recommend`, or browse
91
99
  `jobs/<category>/` directly.
92
100
 
93
101
  <!-- BEGIN JOB SUMMARY -->
94
- 257 jobs across 44 categories:
102
+ 271 jobs across 44 categories:
95
103
 
96
104
  | category | jobs | description |
97
105
  |---|---|---|
98
106
  | `agriculture` | 5 | Farm operations — weather risk, irrigation, equipment, market prices. |
99
- | `automotive` | 3 | Repair shop workflow — repair orders, parts, loaners. |
100
- | `childcare` | 3 | Daycare compliance and ops — ratios, immunizations, tuition. |
107
+ | `automotive` | 5 | Repair shop workflow — repair orders, parts, loaners. |
108
+ | `childcare` | 5 | Daycare compliance and ops — ratios, immunizations, tuition. |
101
109
  | `construction` | 5 | Job site compliance — permits, inspections, change orders, rentals. |
102
110
  | `content` | 13 | Site/content health — SEO, broken links, freshness, repurposing. |
103
111
  | `creator` | 5 | Influencer/creator ops — content calendar, cross-posting, sponsorships. |
@@ -107,10 +115,10 @@ tags, variables) use `crondex list`, `crondex recommend`, or browse
107
115
  | `education` | 5 | Classroom ops — grading, attendance, deadlines, permission slips. |
108
116
  | `events` | 5 | Event planning — budget, RSVPs, staffing, vendors, day-of check-in. |
109
117
  | `finance` | 10 | Personal/business finance — budgets, invoices, taxes, subscriptions. |
110
- | `fitness` | 3 | Gym/studio ops — memberships, class utilization, equipment. |
118
+ | `fitness` | 5 | Gym/studio ops — memberships, class utilization, equipment. |
111
119
  | `fleet` | 5 | Vehicle fleet compliance — maintenance, registration, licenses, fuel. |
112
120
  | `gaming` | 5 | Streaming and community server ops — schedules, patches, tournaments. |
113
- | `government` | 3 | Public-sector ops — records requests, permits, constituent casework. |
121
+ | `government` | 5 | Public-sector ops — records requests, permits, constituent casework. |
114
122
  | `growth` | 5 | Lifecycle marketing — churn, trials, onboarding, reviews. |
115
123
  | `healthcare` | 5 | Clinic ops — appointments, recalls, licenses, lab results. |
116
124
  | `hiring` | 5 | Recruiting pipeline — candidates, offers, interviews, reqs. |
@@ -131,14 +139,14 @@ tags, variables) use `crondex list`, `crondex recommend`, or browse
131
139
  | `productivity` | 9 | Work habits — inbox, standups, focus, meetings, reports. |
132
140
  | `realestate` | 5 | Property management — leases, rent, vacancy, inspections, tax. |
133
141
  | `restaurant` | 5 | Kitchen/FOH ops — food cost, labor cost, waste, inspections. |
134
- | `retail` | 3 | Store ops — till reconciliation, opening checklist, scheduling. |
142
+ | `retail` | 5 | Store ops — till reconciliation, opening checklist, scheduling. |
135
143
  | `sales` | 5 | Pipeline ops — leads, deals, quota, CRM sync. |
136
144
  | `security` | 14 | Security posture — keys, certs, access, scans, firewalls. |
137
145
  | `support` | 5 | Helpdesk ops — SLA, backlog, CSAT, agent workload. |
138
146
  | `team` | 5 | Team ops — 1:1s, on-call, PTO, anniversaries. |
139
147
  | `travel` | 5 | Trip logistics — flights, passports, visas, insurance, miles. |
140
- | `veterinary` | 3 | Clinic ops for animals — vaccines, controlled substances, boarding. |
141
- | `warehousing` | 3 | Warehouse ops — dock scheduling, pick/pack errors, climate control. |
148
+ | `veterinary` | 5 | Clinic ops for animals — vaccines, controlled substances, boarding. |
149
+ | `warehousing` | 5 | Warehouse ops — dock scheduling, pick/pack errors, climate control. |
142
150
  <!-- END JOB SUMMARY -->
143
151
 
144
152
  ---
@@ -148,12 +156,12 @@ tags, variables) use `crondex list`, `crondex recommend`, or browse
148
156
  ```
149
157
  crondex/
150
158
  ├── llms.txt agent-discovery manifest (llms.txt convention)
151
- ├── bin/crondex.js CLI: list / categories / show / add / recommend / init
152
- ├── lib/recommend.js recommend's scoring logic (unit tested in test/)
159
+ ├── bin/crondex.js CLI: list / categories / show / add / recommend / init / deploy
160
+ ├── lib/ recommend, deploy, and catalog-building logic (unit tested in test/)
153
161
  ├── catalog.json generated index of every job — read this first
154
162
  ├── schema/job.schema.json spec every job file follows
155
163
  ├── jobs/ one YAML per job, grouped by category subdirectory
156
- └── scripts/ build-catalog.js, validate-jobs.js, lint-shell.js
164
+ └── scripts/ build-catalog.js, validate-jobs.js, lint-shell.js, check-duplicates.js, smoke-test.js
157
165
  ```
158
166
 
159
167
  ---
package/bin/crondex.js CHANGED
@@ -1,10 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  // CLI over catalog.json — browse jobs, read one, or pull one into your project.
3
- import { readFileSync, writeFileSync, existsSync } from "node:fs";
4
- import { join } from "node:path";
3
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
4
+ import { join, dirname } from "node:path";
5
+ import { execFileSync } from "node:child_process";
5
6
  import yaml from "js-yaml";
6
7
  import { tokenize, rankJobs } from "../lib/recommend.js";
7
8
  import { CATEGORY_DESCRIPTIONS } from "../lib/category-descriptions.js";
9
+ import { resolveVariables, substitutePlaceholders, pickMode, buildCrontabLine, buildGithubActionsWorkflow } from "../lib/deploy.js";
8
10
 
9
11
  const ROOT = new URL("..", import.meta.url).pathname;
10
12
  const CATALOG = JSON.parse(readFileSync(join(ROOT, "catalog.json"), "utf8"));
@@ -21,6 +23,19 @@ function hasFlag(name) {
21
23
  return args.includes(`--${name}`);
22
24
  }
23
25
 
26
+ // Collects every `--var name=value` occurrence (the flag can repeat).
27
+ function varOverrides() {
28
+ const overrides = {};
29
+ for (let i = 0; i < args.length; i++) {
30
+ if (args[i] !== "--var") continue;
31
+ const pair = args[i + 1] ?? "";
32
+ const eq = pair.indexOf("=");
33
+ if (eq === -1) continue;
34
+ overrides[pair.slice(0, eq)] = pair.slice(eq + 1);
35
+ }
36
+ return overrides;
37
+ }
38
+
24
39
  function printJson(value) {
25
40
  console.log(JSON.stringify(value, null, 2));
26
41
  }
@@ -44,6 +59,8 @@ Usage:
44
59
  crondex add <id> [--dest <path>]
45
60
  crondex recommend "<what you want done>" [--limit <n>] [--json]
46
61
  crondex init <id> [--category <name>] [--dest <path>]
62
+ crondex deploy <id> [--target crontab|github-actions] [--mode script|prompt]
63
+ [--var name=value ...] [--dest <path>] [--install]
47
64
 
48
65
  Examples:
49
66
  crondex list --category devops
@@ -52,10 +69,19 @@ Examples:
52
69
  crondex add backup-reminder --dest ./cron/backup-reminder.yaml
53
70
  crondex recommend "warn me before my SSL cert expires"
54
71
  crondex init ssl-cert-expiry-check --category security
72
+ crondex deploy ssl-cert-expiry-check --var host=example.com --var port=443
73
+ crondex deploy repo-health-check --target github-actions
55
74
 
56
75
  Add --json to list/categories/show/recommend for machine-readable output —
57
76
  useful when an agent is parsing crondex's output programmatically instead
58
77
  of a human reading it.
78
+
79
+ deploy turns a job into something you can actually run: --target crontab
80
+ (default) prints a ready crontab line, or installs it into your own
81
+ crontab with --install; --target github-actions writes a scheduled
82
+ workflow file (default .github/workflows/<id>.yml). --var overrides a
83
+ job's variable defaults (repeatable). hybrid jobs default to --mode script
84
+ (zero tokens); pass --mode prompt to deploy the agent-prompt side instead.
59
85
  `);
60
86
  }
61
87
 
@@ -168,6 +194,66 @@ function init(id) {
168
194
  console.log(`wrote ${dest} — fill in the fields, then \`npm run validate\` (see CONTRIBUTING.md to submit it upstream).`);
169
195
  }
170
196
 
197
+ function installCrontabLine(id, line) {
198
+ let existing = "";
199
+ try {
200
+ existing = execFileSync("crontab", ["-l"], { encoding: "utf8" });
201
+ } catch {
202
+ existing = "";
203
+ }
204
+ const marker = `# crondex:${id}`;
205
+ const kept = existing
206
+ .split("\n")
207
+ .filter((l) => l.trim().length > 0 && !l.includes(marker));
208
+ const updated = [...kept, line].join("\n") + "\n";
209
+ execFileSync("crontab", ["-"], { input: updated });
210
+ }
211
+
212
+ function deploy(id) {
213
+ const meta = findJob(id);
214
+ const doc = yaml.load(readFileSync(join(ROOT, meta.path), "utf8"));
215
+ doc.path = meta.path;
216
+ const target = flag("target") ?? "crontab";
217
+ const mode = pickMode(doc, flag("mode"));
218
+
219
+ if (mode === "prompt" && !doc.prompt) {
220
+ console.error(`"${id}" has no prompt to deploy (runner: ${doc.runner}). Try without --mode prompt.`);
221
+ process.exit(1);
222
+ }
223
+ if (mode === "script" && !doc.command) {
224
+ console.error(`"${id}" has no command to deploy (runner: ${doc.runner}). Try --mode prompt.`);
225
+ process.exit(1);
226
+ }
227
+
228
+ const values = resolveVariables(doc, varOverrides());
229
+ const command = doc.command ? substitutePlaceholders(doc.command, values) : undefined;
230
+ const prompt = doc.prompt ? substitutePlaceholders(doc.prompt, values) : undefined;
231
+
232
+ if (target === "crontab") {
233
+ const line = buildCrontabLine(doc, mode === "prompt" ? prompt : command, mode === "prompt");
234
+ if (hasFlag("install")) {
235
+ installCrontabLine(id, line);
236
+ console.log(`installed into your crontab (replacing any previous "${id}" entry):`);
237
+ console.log(line);
238
+ } else {
239
+ console.log(line);
240
+ }
241
+ } else if (target === "github-actions") {
242
+ const workflow = buildGithubActionsWorkflow(doc, { command, prompt, mode });
243
+ const dest = flag("dest") ?? join(".github/workflows", `${id}.yml`);
244
+ if (existsSync(dest)) {
245
+ console.error(`${dest} already exists — refusing to overwrite. Pass --dest to choose another path.`);
246
+ process.exit(1);
247
+ }
248
+ mkdirSync(dirname(dest), { recursive: true });
249
+ writeFileSync(dest, workflow);
250
+ console.log(`wrote ${dest}`);
251
+ } else {
252
+ console.error(`unknown --target "${target}" — use "crontab" or "github-actions".`);
253
+ process.exit(1);
254
+ }
255
+ }
256
+
171
257
  function add(id) {
172
258
  const meta = findJob(id);
173
259
  const dest = flag("dest") ?? `./${id}.yaml`;
@@ -214,6 +300,13 @@ switch (cmd) {
214
300
  }
215
301
  recommend(args[0]);
216
302
  break;
303
+ case "deploy":
304
+ if (!args[0]) {
305
+ console.error("usage: crondex deploy <id> [--target crontab|github-actions] [--mode script|prompt] [--var name=value ...] [--dest <path>] [--install]");
306
+ process.exit(1);
307
+ }
308
+ deploy(args[0]);
309
+ break;
217
310
  default:
218
311
  printHelp();
219
312
  }
package/catalog.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "generated_by": "scripts/build-catalog.js",
3
3
  "schema": "schema/job.schema.json",
4
- "count": 257,
4
+ "count": 271,
5
5
  "jobs": [
6
6
  {
7
7
  "id": "1on1-prep-reminder",
@@ -462,6 +462,31 @@
462
462
  ],
463
463
  "path": "jobs/content/broken-link-check.yaml"
464
464
  },
465
+ {
466
+ "id": "budget-appropriation-deadline-check",
467
+ "version": 1,
468
+ "name": "Budget Appropriation Submission Deadline Check",
469
+ "description": "Warns you before an agency's budget appropriation submission is due. Use this if a department has ever missed its window to request funding for the next cycle because the internal deadline snuck up during budget season chaos.",
470
+ "category": "government",
471
+ "tags": [
472
+ "government",
473
+ "budget",
474
+ "appropriation",
475
+ "deadline"
476
+ ],
477
+ "schedule": "0 8 * * *",
478
+ "timezone": "UTC",
479
+ "runner": "shell",
480
+ "modes": [
481
+ "script"
482
+ ],
483
+ "compatible_agents": [
484
+ "generic",
485
+ "claude",
486
+ "codex"
487
+ ],
488
+ "path": "jobs/government/budget-appropriation-deadline-check.yaml"
489
+ },
465
490
  {
466
491
  "id": "budget-overspend-check",
467
492
  "version": 1,
@@ -1405,6 +1430,31 @@
1405
1430
  ],
1406
1431
  "path": "jobs/security/cve-watch.yaml"
1407
1432
  },
1433
+ {
1434
+ "id": "cycle-count-schedule-check",
1435
+ "version": 1,
1436
+ "name": "Cycle Count Schedule Adherence Check",
1437
+ "description": "Checks whether scheduled cycle counts actually happened on time, zone by zone. Use this if a cycle count program has ever quietly stopped happening for a whole section of the warehouse because nobody was tracking adherence to the schedule itself, only the count results.",
1438
+ "category": "warehousing",
1439
+ "tags": [
1440
+ "warehousing",
1441
+ "cycle-count",
1442
+ "schedule",
1443
+ "inventory"
1444
+ ],
1445
+ "schedule": "0 8 * * 1",
1446
+ "timezone": "UTC",
1447
+ "runner": "shell",
1448
+ "modes": [
1449
+ "script"
1450
+ ],
1451
+ "compatible_agents": [
1452
+ "generic",
1453
+ "claude",
1454
+ "codex"
1455
+ ],
1456
+ "path": "jobs/warehousing/cycle-count-schedule-check.yaml"
1457
+ },
1408
1458
  {
1409
1459
  "id": "daily-flashcard-review",
1410
1460
  "version": 1,
@@ -1558,6 +1608,31 @@
1558
1608
  ],
1559
1609
  "path": "jobs/devops/dependency-audit.yaml"
1560
1610
  },
1611
+ {
1612
+ "id": "diagnostic-equipment-calibration-check",
1613
+ "version": 1,
1614
+ "name": "Diagnostic Equipment Calibration Check",
1615
+ "description": "Tracks calibration due dates for in-house diagnostic equipment (x-ray, in-house lab analyzers, ultrasound) and warns before any lapse. Use this if a lab result has ever been called into question because equipment calibration had quietly lapsed and nobody noticed until an audit.",
1616
+ "category": "veterinary",
1617
+ "tags": [
1618
+ "veterinary",
1619
+ "equipment",
1620
+ "calibration",
1621
+ "compliance"
1622
+ ],
1623
+ "schedule": "0 7 * * 1",
1624
+ "timezone": "UTC",
1625
+ "runner": "shell",
1626
+ "modes": [
1627
+ "script"
1628
+ ],
1629
+ "compatible_agents": [
1630
+ "generic",
1631
+ "claude",
1632
+ "codex"
1633
+ ],
1634
+ "path": "jobs/veterinary/diagnostic-equipment-calibration-check.yaml"
1635
+ },
1561
1636
  {
1562
1637
  "id": "disk-space-check",
1563
1638
  "version": 1,
@@ -1860,6 +1935,31 @@
1860
1935
  ],
1861
1936
  "path": "jobs/creator/engagement-drop-watch.yaml"
1862
1937
  },
1938
+ {
1939
+ "id": "enrollment-waitlist-followup-check",
1940
+ "version": 1,
1941
+ "name": "Enrollment Waitlist Follow-Up Check",
1942
+ "description": "Flags waitlisted families who haven't been contacted in a while, so a spot doesn't go unfilled because nobody worked down the list. Use this if an opening has ever sat empty for weeks while a waitlisted family who would've taken it never got a call.",
1943
+ "category": "childcare",
1944
+ "tags": [
1945
+ "childcare",
1946
+ "waitlist",
1947
+ "enrollment",
1948
+ "followup"
1949
+ ],
1950
+ "schedule": "0 9 * * 1",
1951
+ "timezone": "UTC",
1952
+ "runner": "shell",
1953
+ "modes": [
1954
+ "script"
1955
+ ],
1956
+ "compatible_agents": [
1957
+ "generic",
1958
+ "claude",
1959
+ "codex"
1960
+ ],
1961
+ "path": "jobs/childcare/enrollment-waitlist-followup-check.yaml"
1962
+ },
1863
1963
  {
1864
1964
  "id": "env-drift-check",
1865
1965
  "version": 1,
@@ -1960,7 +2060,7 @@
1960
2060
  },
1961
2061
  {
1962
2062
  "id": "error-rate-spike-watch",
1963
- "version": 1,
2063
+ "version": 2,
1964
2064
  "name": "Error Rate Spike Watch",
1965
2065
  "description": "Checks your error tracker's recent error count against a threshold and flags a spike. Use this if a bad deploy has ever quietly spiked errors for hours before anyone noticed.",
1966
2066
  "category": "devops",
@@ -1985,6 +2085,31 @@
1985
2085
  ],
1986
2086
  "path": "jobs/devops/error-rate-spike-watch.yaml"
1987
2087
  },
2088
+ {
2089
+ "id": "estimate-approval-followup-check",
2090
+ "version": 1,
2091
+ "name": "Repair Estimate Approval Follow-Up Check",
2092
+ "description": "Flags repair estimates sent to a customer that haven't been approved yet, so the car doesn't sit untouched while a text goes unanswered. Use this if a vehicle has ever taken up a bay for days because nobody followed up on an estimate the customer never actually saw or responded to.",
2093
+ "category": "automotive",
2094
+ "tags": [
2095
+ "automotive",
2096
+ "repair-shop",
2097
+ "estimate",
2098
+ "followup"
2099
+ ],
2100
+ "schedule": "0 9,15 * * *",
2101
+ "timezone": "UTC",
2102
+ "runner": "shell",
2103
+ "modes": [
2104
+ "script"
2105
+ ],
2106
+ "compatible_agents": [
2107
+ "generic",
2108
+ "claude",
2109
+ "codex"
2110
+ ],
2111
+ "path": "jobs/automotive/estimate-approval-followup-check.yaml"
2112
+ },
1988
2113
  {
1989
2114
  "id": "event-budget-overrun-check",
1990
2115
  "version": 1,
@@ -2109,6 +2234,31 @@
2109
2234
  ],
2110
2235
  "path": "jobs/inventory/expiring-perishable-stock-check.yaml"
2111
2236
  },
2237
+ {
2238
+ "id": "facility-cleaning-log-check",
2239
+ "version": 1,
2240
+ "name": "Facility Cleaning Log Check",
2241
+ "description": "Checks that scheduled cleaning tasks (equipment wipe-down, locker rooms, floors) were actually logged as done today. Use this if a cleaning checklist has ever gone unfilled for a shift because it lived on a clipboard nobody was checking.",
2242
+ "category": "fitness",
2243
+ "tags": [
2244
+ "fitness",
2245
+ "cleaning",
2246
+ "facility",
2247
+ "compliance"
2248
+ ],
2249
+ "schedule": "0 21 * * *",
2250
+ "timezone": "UTC",
2251
+ "runner": "shell",
2252
+ "modes": [
2253
+ "script"
2254
+ ],
2255
+ "compatible_agents": [
2256
+ "generic",
2257
+ "claude",
2258
+ "codex"
2259
+ ],
2260
+ "path": "jobs/fitness/facility-cleaning-log-check.yaml"
2261
+ },
2112
2262
  {
2113
2263
  "id": "failed-login-watch",
2114
2264
  "version": 1,
@@ -2330,6 +2480,31 @@
2330
2480
  ],
2331
2481
  "path": "jobs/hospitality/food-safety-temp-log-check.yaml"
2332
2482
  },
2483
+ {
2484
+ "id": "forklift-inspection-check",
2485
+ "version": 1,
2486
+ "name": "Forklift Daily Safety Inspection Check",
2487
+ "description": "Checks that each forklift's required daily pre-use inspection was actually logged today. Use this if a forklift has ever been operated on a shift with no inspection logged, which is exactly what an OSHA audit will ask to see records of.",
2488
+ "category": "warehousing",
2489
+ "tags": [
2490
+ "warehousing",
2491
+ "forklift",
2492
+ "safety",
2493
+ "compliance"
2494
+ ],
2495
+ "schedule": "0 10 * * *",
2496
+ "timezone": "UTC",
2497
+ "runner": "shell",
2498
+ "modes": [
2499
+ "script"
2500
+ ],
2501
+ "compatible_agents": [
2502
+ "generic",
2503
+ "claude",
2504
+ "codex"
2505
+ ],
2506
+ "path": "jobs/warehousing/forklift-inspection-check.yaml"
2507
+ },
2333
2508
  {
2334
2509
  "id": "form-lead-crm-sync-check",
2335
2510
  "version": 1,
@@ -2536,6 +2711,31 @@
2536
2711
  ],
2537
2712
  "path": "jobs/crypto/gas-price-alert.yaml"
2538
2713
  },
2714
+ {
2715
+ "id": "gift-card-liability-reconciliation-check",
2716
+ "version": 1,
2717
+ "name": "Gift Card Liability Reconciliation Check",
2718
+ "description": "Compares your POS's outstanding gift card balance against your accounting ledger and flags a mismatch. Use this if outstanding gift card liability has ever drifted out of sync with your books for months before anyone reconciled it at year-end and found a gap.",
2719
+ "category": "retail",
2720
+ "tags": [
2721
+ "retail",
2722
+ "gift-cards",
2723
+ "reconciliation",
2724
+ "finance"
2725
+ ],
2726
+ "schedule": "0 7 1 * *",
2727
+ "timezone": "UTC",
2728
+ "runner": "shell",
2729
+ "modes": [
2730
+ "script"
2731
+ ],
2732
+ "compatible_agents": [
2733
+ "generic",
2734
+ "claude",
2735
+ "codex"
2736
+ ],
2737
+ "path": "jobs/retail/gift-card-liability-reconciliation-check.yaml"
2738
+ },
2539
2739
  {
2540
2740
  "id": "github-issue-triage",
2541
2741
  "version": 1,
@@ -4525,6 +4725,31 @@
4525
4725
  ],
4526
4726
  "path": "jobs/team/pto-balance-check.yaml"
4527
4727
  },
4728
+ {
4729
+ "id": "public-meeting-notice-compliance-check",
4730
+ "version": 1,
4731
+ "name": "Public Meeting Notice Compliance Check",
4732
+ "description": "Checks that an upcoming public meeting's notice was posted with enough lead time to meet open-meetings law requirements. Use this if a meeting has ever gotten challenged, or had to be redone, because notice went out a day late.",
4733
+ "category": "government",
4734
+ "tags": [
4735
+ "government",
4736
+ "open-meetings",
4737
+ "notice",
4738
+ "compliance"
4739
+ ],
4740
+ "schedule": "0 8 * * *",
4741
+ "timezone": "UTC",
4742
+ "runner": "shell",
4743
+ "modes": [
4744
+ "script"
4745
+ ],
4746
+ "compatible_agents": [
4747
+ "generic",
4748
+ "claude",
4749
+ "codex"
4750
+ ],
4751
+ "path": "jobs/government/public-meeting-notice-compliance-check.yaml"
4752
+ },
4528
4753
  {
4529
4754
  "id": "quality-defect-rate-check",
4530
4755
  "version": 1,
@@ -4869,6 +5094,31 @@
4869
5094
  ],
4870
5095
  "path": "jobs/restaurant/reservation-noshow-deposit-check.yaml"
4871
5096
  },
5097
+ {
5098
+ "id": "return-fraud-pattern-check",
5099
+ "version": 1,
5100
+ "name": "Return Fraud Pattern Check",
5101
+ "description": "Checks recent returns for patterns that look like abuse — the same customer returning unusually often, or a spike in receiptless returns — instead of treating every return as an isolated, no-questions-asked event. Use this if return fraud has ever quietly eaten margin for months because nobody was looking at returns in aggregate.",
5102
+ "category": "retail",
5103
+ "tags": [
5104
+ "retail",
5105
+ "returns",
5106
+ "fraud",
5107
+ "loss-prevention"
5108
+ ],
5109
+ "schedule": "0 7 * * 1",
5110
+ "timezone": "UTC",
5111
+ "runner": "shell",
5112
+ "modes": [
5113
+ "script"
5114
+ ],
5115
+ "compatible_agents": [
5116
+ "generic",
5117
+ "claude",
5118
+ "codex"
5119
+ ],
5120
+ "path": "jobs/retail/return-fraud-pattern-check.yaml"
5121
+ },
4872
5122
  {
4873
5123
  "id": "return-refund-backlog-check",
4874
5124
  "version": 1,
@@ -5393,6 +5643,31 @@
5393
5643
  ],
5394
5644
  "path": "jobs/devops/ssl-cert-expiry-check.yaml"
5395
5645
  },
5646
+ {
5647
+ "id": "staff-certification-expiry-check",
5648
+ "version": 1,
5649
+ "name": "Childcare Staff Certification Expiry Check",
5650
+ "description": "Checks staff CPR/first-aid and other required childcare certifications and warns before any expire. Use this if a licensing inspection has ever been the first place a lapsed certification got noticed, instead of catching it with time to renew.",
5651
+ "category": "childcare",
5652
+ "tags": [
5653
+ "childcare",
5654
+ "staff",
5655
+ "certification",
5656
+ "compliance"
5657
+ ],
5658
+ "schedule": "0 8 * * 1",
5659
+ "timezone": "UTC",
5660
+ "runner": "shell",
5661
+ "modes": [
5662
+ "script"
5663
+ ],
5664
+ "compatible_agents": [
5665
+ "generic",
5666
+ "claude",
5667
+ "codex"
5668
+ ],
5669
+ "path": "jobs/childcare/staff-certification-expiry-check.yaml"
5670
+ },
5396
5671
  {
5397
5672
  "id": "staff-child-ratio-compliance-check",
5398
5673
  "version": 1,
@@ -5743,6 +6018,31 @@
5743
6018
  ],
5744
6019
  "path": "jobs/manufacturing/supplier-otd-performance-watch.yaml"
5745
6020
  },
6021
+ {
6022
+ "id": "surgery-prep-check",
6023
+ "version": 1,
6024
+ "name": "Surgery Prep Check",
6025
+ "description": "Checks tomorrow's scheduled surgeries for missing pre-op bloodwork or signed consent forms. Use this if a surgery has ever had to be rescheduled the morning of because consent wasn't signed or bloodwork hadn't been run, and nobody checked the night before.",
6026
+ "category": "veterinary",
6027
+ "tags": [
6028
+ "veterinary",
6029
+ "surgery",
6030
+ "pre-op",
6031
+ "consent"
6032
+ ],
6033
+ "schedule": "0 17 * * *",
6034
+ "timezone": "UTC",
6035
+ "runner": "shell",
6036
+ "modes": [
6037
+ "script"
6038
+ ],
6039
+ "compatible_agents": [
6040
+ "generic",
6041
+ "claude",
6042
+ "codex"
6043
+ ],
6044
+ "path": "jobs/veterinary/surgery-prep-check.yaml"
6045
+ },
5746
6046
  {
5747
6047
  "id": "tax-deadline-reminder",
5748
6048
  "version": 1,
@@ -6019,6 +6319,31 @@
6019
6319
  ],
6020
6320
  "path": "jobs/legal/trademark-renewal-reminder.yaml"
6021
6321
  },
6322
+ {
6323
+ "id": "trainer-session-package-expiry-check",
6324
+ "version": 1,
6325
+ "name": "Trainer Session Package Expiry Check",
6326
+ "description": "Flags members with a paid personal-training session package that's expiring soon with sessions still unused. Use this if a client has ever paid for ten sessions, used three, and let the rest expire because nobody nudged them to book before the window closed.",
6327
+ "category": "fitness",
6328
+ "tags": [
6329
+ "fitness",
6330
+ "personal-training",
6331
+ "sessions",
6332
+ "expiry"
6333
+ ],
6334
+ "schedule": "0 9 * * 1",
6335
+ "timezone": "UTC",
6336
+ "runner": "shell",
6337
+ "modes": [
6338
+ "script"
6339
+ ],
6340
+ "compatible_agents": [
6341
+ "generic",
6342
+ "claude",
6343
+ "codex"
6344
+ ],
6345
+ "path": "jobs/fitness/trainer-session-package-expiry-check.yaml"
6346
+ },
6022
6347
  {
6023
6348
  "id": "travel-insurance-expiry-check",
6024
6349
  "version": 1,
@@ -6168,6 +6493,31 @@
6168
6493
  ],
6169
6494
  "path": "jobs/fleet/vehicle-maintenance-due-check.yaml"
6170
6495
  },
6496
+ {
6497
+ "id": "vehicle-pickup-reminder",
6498
+ "version": 1,
6499
+ "name": "Finished Vehicle Pickup Reminder",
6500
+ "description": "Flags vehicles marked ready for pickup that the customer hasn't collected yet, so the lot doesn't fill up with finished cars nobody's chasing. Use this if a completed car has ever sat in the lot for a week because the \"ready\" call was made once and then forgotten.",
6501
+ "category": "automotive",
6502
+ "tags": [
6503
+ "automotive",
6504
+ "repair-shop",
6505
+ "pickup",
6506
+ "customer"
6507
+ ],
6508
+ "schedule": "0 9 * * *",
6509
+ "timezone": "UTC",
6510
+ "runner": "shell",
6511
+ "modes": [
6512
+ "script"
6513
+ ],
6514
+ "compatible_agents": [
6515
+ "generic",
6516
+ "claude",
6517
+ "codex"
6518
+ ],
6519
+ "path": "jobs/automotive/vehicle-pickup-reminder.yaml"
6520
+ },
6171
6521
  {
6172
6522
  "id": "vehicle-registration-expiry-check",
6173
6523
  "version": 1,