@wonsukchoi/crondex 0.18.0 → 0.20.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.
Files changed (79) hide show
  1. package/README.md +41 -40
  2. package/catalog.json +1955 -58
  3. package/jobs/agriculture/field-soil-test-due-reminder.yaml +35 -0
  4. package/jobs/agriculture/grain-storage-temperature-check.yaml +34 -0
  5. package/jobs/automotive/fleet-inspection-expiry-check.yaml +35 -0
  6. package/jobs/automotive/warranty-claim-deadline-check.yaml +35 -0
  7. package/jobs/childcare/allergy-action-plan-expiry-check.yaml +34 -0
  8. package/jobs/childcare/classroom-supply-low-stock-check.yaml +28 -0
  9. package/jobs/construction/crew-safety-cert-expiry-check.yaml +35 -0
  10. package/jobs/construction/material-delivery-delay-check.yaml +32 -0
  11. package/jobs/creator/affiliate-link-expiry-check.yaml +35 -0
  12. package/jobs/creator/brand-deal-payment-followup-check.yaml +32 -0
  13. package/jobs/crypto/nft-floor-price-watch.yaml +37 -0
  14. package/jobs/crypto/stablecoin-peg-deviation-watch.yaml +33 -0
  15. package/jobs/ecommerce/coupon-code-expiry-check.yaml +36 -0
  16. package/jobs/ecommerce/shipping-delay-check.yaml +31 -0
  17. package/jobs/education/overdue-library-materials-check.yaml +34 -0
  18. package/jobs/education/tuition-payment-plan-delinquency-check.yaml +35 -0
  19. package/jobs/events/post-event-survey-response-rate-watch.yaml +39 -0
  20. package/jobs/events/speaker-confirmation-deadline-check.yaml +35 -0
  21. package/jobs/fitness/class-waitlist-overflow-check.yaml +31 -0
  22. package/jobs/fitness/locker-rental-expiry-check.yaml +35 -0
  23. package/jobs/fleet/fleet-insurance-expiry-check.yaml +34 -0
  24. package/jobs/fleet/vehicle-idle-time-check.yaml +31 -0
  25. package/jobs/gaming/game-server-disk-space-check.yaml +34 -0
  26. package/jobs/gaming/player-contract-renewal-check.yaml +35 -0
  27. package/jobs/government/public-comment-period-closing-check.yaml +35 -0
  28. package/jobs/government/public-records-retention-purge-check.yaml +32 -0
  29. package/jobs/growth/onboarding-completion-stall-check.yaml +38 -0
  30. package/jobs/growth/seat-utilization-upsell-check.yaml +34 -0
  31. package/jobs/healthcare/medical-equipment-calibration-check.yaml +35 -0
  32. package/jobs/healthcare/referral-pending-followup-check.yaml +36 -0
  33. package/jobs/hiring/job-posting-expiry-check.yaml +41 -0
  34. package/jobs/hiring/reference-check-overdue-reminder.yaml +36 -0
  35. package/jobs/home/gutter-cleaning-reminder.yaml +30 -0
  36. package/jobs/home/utility-bill-anomaly-check.yaml +36 -0
  37. package/jobs/hospitality/housekeeping-turnover-time-check.yaml +41 -0
  38. package/jobs/hospitality/lost-and-found-item-aging-check.yaml +36 -0
  39. package/jobs/hr/i9-reverification-deadline-check.yaml +36 -0
  40. package/jobs/hr/probation-period-review-reminder.yaml +36 -0
  41. package/jobs/insurance/beneficiary-designation-review-reminder.yaml +35 -0
  42. package/jobs/insurance/endorsement-request-followup-check.yaml +37 -0
  43. package/jobs/inventory/purchase-order-receiving-delay-check.yaml +33 -0
  44. package/jobs/inventory/supplier-lead-time-drift-check.yaml +34 -0
  45. package/jobs/investing/bond-cd-maturity-reminder.yaml +31 -0
  46. package/jobs/investing/dca-contribution-reminder.yaml +33 -0
  47. package/jobs/learning/practice-streak-check.yaml +33 -0
  48. package/jobs/learning/webinar-attendance-reminder.yaml +32 -0
  49. package/jobs/legal/business-license-renewal-check.yaml +37 -0
  50. package/jobs/legal/patent-maintenance-fee-reminder.yaml +35 -0
  51. package/jobs/logistics/driver-hos-compliance-check.yaml +38 -0
  52. package/jobs/logistics/port-congestion-watch.yaml +34 -0
  53. package/jobs/manufacturing/energy-consumption-spike-check.yaml +37 -0
  54. package/jobs/manufacturing/equipment-calibration-due-check.yaml +32 -0
  55. package/jobs/marketing/broken-campaign-link-check.yaml +31 -0
  56. package/jobs/marketing/newsletter-unsubscribe-spike-check.yaml +37 -0
  57. package/jobs/nonprofit/donation-acknowledgment-lag-check.yaml +32 -0
  58. package/jobs/nonprofit/event-rsvp-shortfall-check.yaml +40 -0
  59. package/jobs/podcast/rss-feed-health-check.yaml +25 -0
  60. package/jobs/podcast/transcript-publish-lag-check.yaml +31 -0
  61. package/jobs/realestate/hoa-fee-collection-check.yaml +35 -0
  62. package/jobs/realestate/insurance-policy-renewal-reminder.yaml +31 -0
  63. package/jobs/restaurant/supplier-price-increase-watch.yaml +36 -0
  64. package/jobs/restaurant/walk-in-cooler-temp-log-check.yaml +31 -0
  65. package/jobs/retail/loyalty-points-expiry-reminder.yaml +31 -0
  66. package/jobs/retail/markdown-aging-inventory-check.yaml +33 -0
  67. package/jobs/sales/proposal-followup-nudge.yaml +31 -0
  68. package/jobs/sales/quote-expiry-reminder.yaml +24 -0
  69. package/jobs/support/knowledge-base-article-staleness-check.yaml +39 -0
  70. package/jobs/support/macro-usage-staleness-check.yaml +33 -0
  71. package/jobs/team/expense-report-deadline-reminder.yaml +28 -0
  72. package/jobs/team/new-hire-onboarding-task-check.yaml +32 -0
  73. package/jobs/travel/flight-layover-buffer-check.yaml +35 -0
  74. package/jobs/travel/hotel-cancellation-deadline-reminder.yaml +32 -0
  75. package/jobs/veterinary/lab-result-turnaround-check.yaml +35 -0
  76. package/jobs/veterinary/medication-inventory-expiry-check.yaml +31 -0
  77. package/jobs/warehousing/pallet-putaway-delay-check.yaml +35 -0
  78. package/jobs/warehousing/returns-processing-backlog-check.yaml +33 -0
  79. package/package.json +1 -1
@@ -0,0 +1,32 @@
1
+ id: donation-acknowledgment-lag-check
2
+ version: 1
3
+ name: Donation Acknowledgment Lag Check
4
+ description: >
5
+ Flags donations that haven't been thanked yet and are approaching or
6
+ past your acknowledgment window. Use this if a donor has ever given and
7
+ waited weeks for a thank-you, or if a gift needing a timely
8
+ tax-receipt letter almost slipped past the deadline.
9
+ category: nonprofit
10
+ tags: [nonprofit, donors, acknowledgments, stewardship]
11
+ schedule: "0 9 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v warn={{warn_days}} '
17
+ NR>1 && $3 == "no" {
18
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
19
+ cmd | getline gift_ts; close(cmd);
20
+ days_since = int((today - gift_ts) / 86400);
21
+ if (days_since >= warn) print "UNACKNOWLEDGED: " $1 " gave on " $2 " (" days_since " days ago, not yet thanked)";
22
+ }
23
+ ' "{{donations_csv}}"
24
+ variables:
25
+ donations_csv:
26
+ default: "donations.csv"
27
+ description: "CSV with header row, columns: donor_name,gift_date(YYYY-MM-DD),acknowledged(yes/no)."
28
+ warn_days:
29
+ default: 7
30
+ description: Days since the gift date before an unacknowledged donation gets flagged.
31
+ compatible_agents: [generic, claude, codex]
32
+ notes: Mark a donation's acknowledged column "yes" once a thank-you/receipt goes out — export donations.csv from your CRM or update it manually.
@@ -0,0 +1,40 @@
1
+ id: event-rsvp-shortfall-check
2
+ version: 1
3
+ name: Fundraising Event RSVP Shortfall Check
4
+ description: >
5
+ Checks confirmed RSVPs for an upcoming fundraising event against your
6
+ goal and flags it if you're falling short as the date approaches. Use
7
+ this if an event has ever snuck up with half-empty RSVPs and no time
8
+ left to push more invitations.
9
+ category: nonprofit
10
+ tags: [nonprofit, events, fundraising, rsvp]
11
+ schedule: "0 9 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ rsvp_count=$(psql "{{database_url}}" -t -A -c "select count(*) from rsvps where event_id = '{{event_id}}' and status = 'confirmed';");
16
+ today=$(date +%s);
17
+ event_ts=$(date -d "{{event_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{event_date}}" +%s);
18
+ days_left=$(( (event_ts - today) / 86400 ));
19
+ if [ "$rsvp_count" -lt "{{rsvp_goal}}" ] && [ "$days_left" -le "{{warn_days_before}}" ]; then
20
+ echo "WARNING: event {{event_id}} has $rsvp_count/{{rsvp_goal}} RSVPs with $days_left days left";
21
+ exit 1;
22
+ else echo "OK: event {{event_id}} has $rsvp_count/{{rsvp_goal}} RSVPs, $days_left days left"; fi
23
+ variables:
24
+ database_url:
25
+ default: "postgres://user:pass@host:5432/db"
26
+ description: Connection string for the events/RSVP database.
27
+ event_id:
28
+ default: "your-event-id"
29
+ description: Identifier of the event to track, matching the rsvps table.
30
+ event_date:
31
+ default: "2027-01-01"
32
+ description: Event date (YYYY-MM-DD).
33
+ rsvp_goal:
34
+ default: 100
35
+ description: Target number of confirmed RSVPs.
36
+ warn_days_before:
37
+ default: 14
38
+ description: Days before the event to start warning if under goal.
39
+ compatible_agents: [generic, claude, codex]
40
+ notes: Assumes an `rsvps` table with `event_id` and a `status` column set to 'confirmed' for accepted invites — adjust the query to your CRM/registration schema.
@@ -0,0 +1,25 @@
1
+ id: rss-feed-health-check
2
+ version: 1
3
+ name: Podcast RSS Feed Health Check
4
+ description: >
5
+ Checks that your podcast's RSS feed is reachable and still valid XML with
6
+ the required podcast tags. Use this if a feed has ever silently broken
7
+ (bad edit, hosting hiccup, malformed enclosure) and stopped new episodes
8
+ from reaching Apple Podcasts or Spotify for days before anyone noticed.
9
+ category: podcast
10
+ tags: [podcast, rss, feed, distribution]
11
+ schedule: "0 */6 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ http_code=$(curl -s -o /tmp/rss-feed-check.xml -w "%{http_code}" "{{feed_url}}");
16
+ if [ "$http_code" != "200" ]; then echo "FAIL: feed_url returned HTTP $http_code"; exit 1; fi;
17
+ if ! grep -q "<rss" /tmp/rss-feed-check.xml; then echo "FAIL: response is not RSS XML"; exit 1; fi;
18
+ if ! grep -q "<enclosure" /tmp/rss-feed-check.xml; then echo "WARNING: no <enclosure> tag found — feed may have no episodes"; exit 1; fi;
19
+ echo "OK: feed reachable and looks valid"
20
+ variables:
21
+ feed_url:
22
+ default: "https://example.com/podcast/feed.xml"
23
+ description: Public URL of your podcast's RSS feed.
24
+ compatible_agents: [generic, claude, codex]
25
+ notes: A passing check confirms the feed is reachable and structurally sane — it doesn't validate against the full RSS/iTunes spec, so still run a dedicated feed validator before a big launch.
@@ -0,0 +1,31 @@
1
+ id: transcript-publish-lag-check
2
+ version: 1
3
+ name: Transcript Publish Lag Check
4
+ description: >
5
+ Flags episodes that published without a transcript still missing after a
6
+ grace period. Use this if you've ever promised accessible, searchable
7
+ transcripts but had episodes quietly sit for weeks without one.
8
+ category: podcast
9
+ tags: [podcast, transcript, accessibility, publishing]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ awk -F, -v today="$today" -v warn={{warn_days}} '
16
+ NR>1 {
17
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
18
+ cmd | getline pub_ts; close(cmd);
19
+ days_since = int((today - pub_ts) / 86400);
20
+ if ($3 == "missing" && days_since >= warn) print "WARNING: " $1 " published " days_since " days ago with no transcript (" $2 ")";
21
+ }
22
+ ' {{episodes_csv}}
23
+ variables:
24
+ episodes_csv:
25
+ default: "episodes.csv"
26
+ description: "CSV with header row, columns: episode_title,publish_date(YYYY-MM-DD),transcript_status(ready/missing)."
27
+ warn_days:
28
+ default: 3
29
+ description: Days after publish to allow before flagging a missing transcript.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Update transcript_status to "ready" in episodes.csv once a transcript is posted, so the row stops flagging.
@@ -0,0 +1,35 @@
1
+ id: hoa-fee-collection-check
2
+ version: 1
3
+ name: HOA Fee Collection Check
4
+ description: >
5
+ Scans an HOA/association dues ledger for owners who are past due and
6
+ totals what's outstanding. Use this if unpaid association dues have ever
7
+ piled up silently until the reserve fund came up short.
8
+ category: realestate
9
+ tags: [realestate, hoa, dues, collections]
10
+ schedule: "0 8 5 * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ awk -F',' -v grace="{{grace_days}}" -v today="$(date +%s)" '
15
+ NR==1 {next}
16
+ {
17
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
18
+ cmd | getline due_ts; close(cmd);
19
+ days_late = int((today - due_ts) / 86400);
20
+ if ($4 == "unpaid" && days_late >= grace) {
21
+ printf "PAST DUE: unit %s owes %s, %d days late (due %s)\n", $1, $2, days_late, $3;
22
+ total += $2; count++;
23
+ }
24
+ }
25
+ END { if (count > 0) printf "TOTAL OUTSTANDING: $%.2f across %d unit(s)\n", total, count; else print "OK: no past-due dues"; }
26
+ ' "{{dues_ledger_csv}}"
27
+ variables:
28
+ dues_ledger_csv:
29
+ default: "./hoa-dues-ledger.csv"
30
+ description: "Path to a CSV with columns: unit,amount_due,due_date(YYYY-MM-DD),status(paid/unpaid)."
31
+ grace_days:
32
+ default: 10
33
+ description: Days past the due date before a balance counts as past due.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Update hoa-dues-ledger.csv status to "paid" as payments land so this only ever flags true outstanding balances.
@@ -0,0 +1,31 @@
1
+ id: insurance-policy-renewal-reminder
2
+ version: 1
3
+ name: Property Insurance Policy Renewal Reminder
4
+ description: >
5
+ Flags property insurance policies that are coming up for renewal within a
6
+ set window. Use this if a policy has ever lapsed because the renewal
7
+ notice got buried in an inbox and nobody caught it in time.
8
+ category: realestate
9
+ tags: [realestate, insurance, renewals, compliance]
10
+ schedule: "0 8 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ awk -F, -v today="$today" -v warn={{warn_days}} '
16
+ NR>1 {
17
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
18
+ cmd | getline exp_ts; close(cmd);
19
+ days_left = int((exp_ts - today) / 86400);
20
+ if (days_left <= warn) print "RENEWAL DUE: " $1 " policy " $2 " expires in " days_left " days (" $3 ")";
21
+ }
22
+ ' {{policies_csv}}
23
+ variables:
24
+ policies_csv:
25
+ default: "property-insurance-policies.csv"
26
+ description: "CSV with header row, columns: property_name,policy_number,expiration_date(YYYY-MM-DD)."
27
+ warn_days:
28
+ default: 30
29
+ description: Days before expiration to start warning.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Keep property-insurance-policies.csv updated whenever a policy is bound, renewed, or switched carriers.
@@ -0,0 +1,36 @@
1
+ id: supplier-price-increase-watch
2
+ version: 1
3
+ name: Supplier Price Increase Watch
4
+ description: >
5
+ Compares this week's supplier invoice prices against your reference cost
6
+ sheet and flags ingredients that jumped more than a set percentage. Use
7
+ this if a supplier has ever quietly raised prices for months before
8
+ anyone noticed the food cost creeping up.
9
+ category: restaurant
10
+ tags: [restaurant, suppliers, cost, invoices]
11
+ schedule: "0 6 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ awk -F',' -v threshold="{{pct_increase_threshold}}" '
16
+ FNR==NR { if (FNR>1) ref[$1]=$2; next }
17
+ FNR==1 { next }
18
+ {
19
+ if ($1 in ref && ref[$1] > 0) {
20
+ pct = (($2 - ref[$1]) / ref[$1]) * 100;
21
+ if (pct >= threshold) printf "PRICE UP: %s reference $%.2f -> invoice $%.2f (+%.1f%%)\n", $1, ref[$1], $2, pct;
22
+ }
23
+ }
24
+ ' "{{reference_cost_csv}}" "{{latest_invoice_csv}}"
25
+ variables:
26
+ reference_cost_csv:
27
+ default: "./reference-costs.csv"
28
+ description: "CSV with header row, columns: ingredient,unit_cost — your baseline/expected price per ingredient."
29
+ latest_invoice_csv:
30
+ default: "./latest-invoice.csv"
31
+ description: "CSV with header row, columns: ingredient,unit_cost — the same ingredients priced on this week's invoice."
32
+ pct_increase_threshold:
33
+ default: 8
34
+ description: Percentage increase over the reference cost that counts as worth flagging.
35
+ compatible_agents: [generic, claude, codex]
36
+ notes: Ingredient names must match exactly between the two CSVs (same spelling/casing) or a row won't be compared.
@@ -0,0 +1,31 @@
1
+ id: walk-in-cooler-temp-log-check
2
+ version: 1
3
+ name: Walk-In Cooler Temperature Log Check
4
+ description: >
5
+ Scans today's logged cooler/freezer temperature readings and flags any
6
+ that fall outside the safe range. Use this if an out-of-range reading has
7
+ ever sat unnoticed in a paper log until a health inspector found it.
8
+ category: restaurant
9
+ tags: [restaurant, food-safety, temperature, compliance]
10
+ schedule: "0 11,17,23 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ awk -F',' -v min="{{min_safe_f}}" -v max="{{max_safe_f}}" '
15
+ NR==1 {next}
16
+ {
17
+ if ($3 < min || $3 > max) printf "OUT OF RANGE: %s %s reading %.1fF at %s\n", $1, $2, $3, $4;
18
+ }
19
+ ' "{{temp_log_csv}}"
20
+ variables:
21
+ temp_log_csv:
22
+ default: "./cooler-temp-log.csv"
23
+ description: "CSV with header row, columns: unit_name,unit_type,temp_f,logged_at — one row per temperature check."
24
+ min_safe_f:
25
+ default: 33
26
+ description: Minimum safe temperature in Fahrenheit for a walk-in cooler/freezer reading.
27
+ max_safe_f:
28
+ default: 40
29
+ description: Maximum safe temperature in Fahrenheit for a walk-in cooler/freezer reading.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Freezer units need a separate, much lower range — run this job once per unit_type with min_safe_f/max_safe_f set accordingly, or pre-filter the CSV.
@@ -0,0 +1,31 @@
1
+ id: loyalty-points-expiry-reminder
2
+ version: 1
3
+ name: Loyalty Points Expiry Reminder
4
+ description: >
5
+ Finds customers whose loyalty/reward points are about to expire unused.
6
+ Use this if points have ever quietly expired on customers who would have
7
+ redeemed them if someone had just reminded them in time.
8
+ category: retail
9
+ tags: [retail, loyalty, customers, rewards]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ awk -F, -v today="$today" -v warn={{warn_days}} '
16
+ NR>1 {
17
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
18
+ cmd | getline exp_ts; close(cmd);
19
+ days_left = int((exp_ts - today) / 86400);
20
+ if (days_left <= warn && days_left >= 0 && $2 > 0) print "EXPIRING: " $1 " has " $2 " points expiring in " days_left " days (" $3 ")";
21
+ }
22
+ ' {{loyalty_csv}}
23
+ variables:
24
+ loyalty_csv:
25
+ default: "loyalty-points.csv"
26
+ description: "CSV with header row, columns: customer_name,points_balance,expiration_date(YYYY-MM-DD)."
27
+ warn_days:
28
+ default: 14
29
+ description: Days before expiration to start warning.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Export loyalty-points.csv from your loyalty/POS platform on a schedule that matches how it tracks per-point expiration.
@@ -0,0 +1,33 @@
1
+ id: markdown-aging-inventory-check
2
+ version: 1
3
+ name: Markdown Aging Inventory Check
4
+ description: >
5
+ Flags SKUs that have sat unsold past a set number of days so they can be
6
+ marked down before they become dead stock. Use this if slow-moving
7
+ inventory has ever tied up cash for months because nobody was tracking
8
+ how long items had actually been sitting on the shelf.
9
+ category: retail
10
+ tags: [retail, inventory, markdown, aging]
11
+ schedule: "0 7 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v warn={{aging_days_threshold}} '
17
+ NR==1 {next}
18
+ {
19
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
20
+ cmd | getline received_ts; close(cmd);
21
+ days_on_shelf = int((today - received_ts) / 86400);
22
+ if ($3 == "in-stock" && days_on_shelf >= warn) printf "MARKDOWN CANDIDATE: SKU %s in stock %d days (received %s)\n", $1, days_on_shelf, $2;
23
+ }
24
+ ' "{{inventory_csv}}"
25
+ variables:
26
+ inventory_csv:
27
+ default: "./inventory-log.csv"
28
+ description: "CSV with header row, columns: sku,received_date(YYYY-MM-DD),status(in-stock/sold)."
29
+ aging_days_threshold:
30
+ default: 60
31
+ description: Days on the shelf before a SKU counts as a markdown candidate.
32
+ compatible_agents: [generic, claude, codex]
33
+ notes: Update inventory-log.csv status to "sold" as items move so this only ever flags genuinely aging stock.
@@ -0,0 +1,31 @@
1
+ id: proposal-followup-nudge
2
+ version: 1
3
+ name: Proposal Follow-Up Nudge
4
+ description: >
5
+ Checks which sent proposals/quotes have had no reply after a set number
6
+ of days and drafts a short follow-up nudge for each. Use this if a
7
+ proposal has ever gone quiet after you sent it, and only much later did
8
+ you realize nobody had followed up.
9
+ category: sales
10
+ tags: [sales, proposals, follow-up, outreach]
11
+ schedule: "0 9 * * 1-5"
12
+ timezone: "UTC"
13
+ runner: agent-prompt
14
+ prompt: |
15
+ Read {{proposals_source}} and find proposals/quotes sent more than
16
+ {{followup_days}} days ago with no recorded reply or status change.
17
+ 1. List each: prospect name, proposal sent date, deal value if known.
18
+ 2. Draft a short, low-pressure follow-up message per prospect that
19
+ references what was proposed and asks one specific question to
20
+ re-open the conversation, rather than a generic "just checking in."
21
+ 3. Skip anything already marked closed-won, closed-lost, or explicitly
22
+ "do not contact" in {{proposals_source}}.
23
+ variables:
24
+ proposals_source:
25
+ default: "your CRM's proposal/quote list, or a proposals.csv with columns: prospect,sent_date,status,value"
26
+ description: Where sent proposals and their status live.
27
+ followup_days:
28
+ default: 5
29
+ description: Days of silence after sending before a proposal counts as due for a follow-up.
30
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
31
+ notes: Draft-only — review each nudge before sending, and skip anything the prospect asked not to be contacted about.
@@ -0,0 +1,24 @@
1
+ id: quote-expiry-reminder
2
+ version: 1
3
+ name: Sales Quote Expiry Reminder
4
+ description: >
5
+ Flags outstanding price quotes that are about to expire before the
6
+ customer has accepted them. Use this if a quote has ever lapsed and
7
+ forced a re-negotiation because nobody followed up before the locked-in
8
+ pricing ran out.
9
+ category: sales
10
+ tags: [sales, quotes, pricing, followup]
11
+ schedule: "0 8 * * 1-5"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ psql "{{database_url}}" -t -c "select customer_name, owner, quote_number, expires_at from quotes where status = 'sent' and expires_at < now() + interval '{{warn_days}} days';"
16
+ variables:
17
+ database_url:
18
+ default: "postgres://user:pass@host:5432/db"
19
+ description: Connection string for the quotes/CPQ database.
20
+ warn_days:
21
+ default: 5
22
+ description: Days before expires_at to start flagging a quote.
23
+ compatible_agents: [generic, claude, codex]
24
+ notes: Assumes a `quotes` table with `status`, `expires_at`, and `owner` columns — adjust the query to your CPQ or CRM's schema.
@@ -0,0 +1,39 @@
1
+ id: knowledge-base-article-staleness-check
2
+ version: 1
3
+ name: Knowledge Base Article Staleness Check
4
+ description: >
5
+ Flags published help center articles that haven't been reviewed or
6
+ updated in a long time. Use this if a stale article has ever kept giving
7
+ customers outdated instructions because nobody was tracking when it was
8
+ last touched.
9
+ category: support
10
+ tags: [support, knowledge-base, content, self-service]
11
+ schedule: "0 9 1 * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ curl -s -H "Authorization: Bearer {{api_token}}" "{{kb_api_url}}" | grep -o '"title":"[^"]*","updated_at":"[^"]*"' | while IFS= read -r line; do
17
+ title=$(echo "$line" | sed -E 's/.*"title":"([^"]*)".*/\1/');
18
+ updated=$(echo "$line" | sed -E 's/.*"updated_at":"([^"]*)".*/\1/');
19
+ upd_ts=$(date -d "$updated" +%s 2>/dev/null || date -jf "%Y-%m-%dT%H:%M:%S" "$updated" +%s 2>/dev/null);
20
+ if [ -n "$upd_ts" ]; then
21
+ age_days=$(( (today - upd_ts) / 86400 ));
22
+ if [ "$age_days" -ge {{stale_days}} ]; then echo "STALE: \"$title\" last updated $age_days days ago"; fi;
23
+ fi;
24
+ done
25
+ variables:
26
+ kb_api_url:
27
+ default: "https://api.example-helpdesk.com/help_center/articles?status=published"
28
+ description: Help center API endpoint listing published articles with title and updated_at fields.
29
+ api_token:
30
+ default: "your-api-token"
31
+ description: Bearer token for the help center API.
32
+ stale_days:
33
+ default: 365
34
+ description: Days since last update before an article counts as stale.
35
+ compatible_agents: [generic, claude, codex]
36
+ notes: >
37
+ The JSON field extraction here is deliberately simple (grep/sed, no jq
38
+ dependency) — if your help center API's JSON is nested or multi-line,
39
+ swap in `jq` for reliable parsing instead.
@@ -0,0 +1,33 @@
1
+ id: macro-usage-staleness-check
2
+ version: 1
3
+ name: Macro/Canned Response Staleness Check
4
+ description: >
5
+ Flags saved canned responses (macros) that haven't been used in a long
6
+ time so someone can check whether they're still accurate. Use this if
7
+ a stale macro has ever gone out with outdated pricing, a dead link, or
8
+ a policy that changed months ago.
9
+ category: support
10
+ tags: [support, macros, canned-responses, knowledge-base]
11
+ schedule: "0 8 1 * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v warn={{stale_days_threshold}} '
17
+ NR==1 {next}
18
+ {
19
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
20
+ cmd | getline last_used_ts; close(cmd);
21
+ days_idle = int((today - last_used_ts) / 86400);
22
+ if (days_idle >= warn) printf "STALE MACRO: \"%s\" last used %d days ago (%s)\n", $1, days_idle, $2;
23
+ }
24
+ ' "{{macro_usage_csv}}"
25
+ variables:
26
+ macro_usage_csv:
27
+ default: "./macro-usage-log.csv"
28
+ description: "CSV with header row, columns: macro_name,last_used_date(YYYY-MM-DD) — export this from your helpdesk's macro usage report."
29
+ stale_days_threshold:
30
+ default: 90
31
+ description: Days since last use before a macro counts as stale and worth a content review.
32
+ compatible_agents: [generic, claude, codex]
33
+ notes: A flagged macro isn't necessarily wrong — low usage can just mean a rare scenario — but it's worth a quick read for outdated info before it fires again.
@@ -0,0 +1,28 @@
1
+ id: expense-report-deadline-reminder
2
+ version: 1
3
+ name: Expense Report Deadline Reminder
4
+ description: >
5
+ Warns you before the monthly expense report submission deadline
6
+ passes. Use this if you've ever missed reimbursement because the
7
+ expense window closed before you got around to submitting receipts.
8
+ category: team
9
+ tags: [team, expenses, finance, deadline]
10
+ schedule: "0 9 * * *"
11
+ timezone: "America/Los_Angeles"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%d); deadline={{deadline_day_of_month}};
15
+ days_left=$(( deadline - 10#$today ));
16
+ if [ "$days_left" -lt 0 ]; then echo "note: this month's deadline (day $deadline) has passed — nothing due until next month.";
17
+ elif [ "$days_left" -le {{warn_days_before}} ]; then
18
+ echo "REMINDER: expense report due in $days_left day(s), by day $deadline of this month.";
19
+ else echo "OK: $days_left day(s) until expense report deadline (day $deadline)."; fi
20
+ variables:
21
+ deadline_day_of_month:
22
+ default: 25
23
+ description: Day of the month expense reports are due (use 1-28 for portability across months).
24
+ warn_days_before:
25
+ default: 5
26
+ description: Start warning this many days before the deadline.
27
+ compatible_agents: [generic, claude, codex]
28
+ notes: Zero-token. Assumes a fixed day-of-month deadline; adjust deadline_day_of_month if your company's cycle differs.
@@ -0,0 +1,32 @@
1
+ id: new-hire-onboarding-task-check
2
+ version: 1
3
+ name: New Hire Onboarding Task Check
4
+ description: >
5
+ Checks which new hires have onboarding tasks (accounts, equipment,
6
+ paperwork) that are still open past their target date. Use this if a
7
+ new hire has ever shown up without laptop access or benefits paperwork
8
+ because a checklist item silently slipped through the cracks.
9
+ category: team
10
+ tags: [team, onboarding, new-hire, checklist]
11
+ schedule: "0 8 * * 1-5"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" '
17
+ NR==1 {next}
18
+ $4 == "open" {
19
+ cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
20
+ cmd | getline due_epoch; close(cmd);
21
+ age_days = (today - due_epoch) / 86400;
22
+ if (age_days >= 0) {
23
+ printf "OVERDUE: %s — task \"%s\" due %s (%d day(s) late)\n", $1, $2, $3, age_days;
24
+ }
25
+ }
26
+ ' "{{onboarding_tasks_csv_path}}"
27
+ variables:
28
+ onboarding_tasks_csv_path:
29
+ default: "./onboarding-tasks.csv"
30
+ description: "Path to a CSV with columns: new_hire_name,task_name,due_date (YYYY-MM-DD),status (open/done)."
31
+ compatible_agents: [generic, claude, codex]
32
+ notes: Assumes a maintained onboarding checklist export (from an HRIS or a spreadsheet) — this is the backstop that flags what's still open past its due date, not a source of truth for the checklist itself.
@@ -0,0 +1,35 @@
1
+ id: flight-layover-buffer-check
2
+ version: 1
3
+ name: Flight Layover Buffer Check
4
+ description: >
5
+ Checks your upcoming itinerary for connections shorter than a safe
6
+ minimum layover time. Use this if you've ever booked a multi-leg trip
7
+ and only noticed a 35-minute connection the night before flying.
8
+ category: travel
9
+ tags: [travel, flights, layover, itinerary]
10
+ schedule: "0 9 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ awk -F',' -v min_minutes="{{min_layover_minutes}}" '
15
+ NR==1 {next}
16
+ {
17
+ cmd1 = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f \"%Y-%m-%d %H:%M\" \"" $2 "\" +%s 2>/dev/null";
18
+ cmd1 | getline arrival_epoch; close(cmd1);
19
+ cmd2 = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f \"%Y-%m-%d %H:%M\" \"" $3 "\" +%s 2>/dev/null";
20
+ cmd2 | getline next_departure_epoch; close(cmd2);
21
+ layover_minutes = (next_departure_epoch - arrival_epoch) / 60;
22
+ if (layover_minutes < min_minutes) {
23
+ printf "TIGHT LAYOVER: %s — only %d minute(s) between arrival and next departure\n", $1, layover_minutes;
24
+ }
25
+ }
26
+ ' "{{itinerary_csv_path}}"
27
+ variables:
28
+ itinerary_csv_path:
29
+ default: "./flight-itinerary.csv"
30
+ description: "Path to a CSV with columns: connection_airport,arrival_time (YYYY-MM-DD HH:MM),next_departure_time (YYYY-MM-DD HH:MM)."
31
+ min_layover_minutes:
32
+ default: 60
33
+ description: Minimum minutes between arrival and next departure before a connection counts as tight. Raise this for connections requiring a terminal change, customs, or international-to-domestic transfers.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Zero-token. You maintain the itinerary CSV yourself — this doesn't pull from any airline or booking system. Times should be in the connection airport's local timezone.
@@ -0,0 +1,32 @@
1
+ id: hotel-cancellation-deadline-reminder
2
+ version: 1
3
+ name: Hotel Cancellation Deadline Reminder
4
+ description: >
5
+ Warns you before a hotel booking's free-cancellation window closes.
6
+ Use this if you've ever gotten charged for a hotel you meant to
7
+ cancel because the deadline passed while you were still deciding.
8
+ category: travel
9
+ tags: [travel, hotel, cancellation, deadline]
10
+ schedule: "0 9 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ name="{{booking_name}}"; deadline={{cancellation_deadline}}; warn={{warn_hours_before}};
15
+ deadline_epoch=$(date -j -f "%Y-%m-%dT%H:%M" "$deadline" +%s 2>/dev/null || date -d "$deadline" +%s);
16
+ now_epoch=$(date +%s);
17
+ hours_left=$(( (deadline_epoch-now_epoch)/3600 ));
18
+ if [ "$hours_left" -le 0 ]; then echo "note: cancellation window for $name has passed — booking is now non-refundable (or already handled).";
19
+ elif [ "$hours_left" -le "$warn" ]; then echo "WARNING: free cancellation for $name closes in $hours_left hour(s) ($deadline)."; exit 1;
20
+ else echo "OK: $name, $hours_left hour(s) until cancellation deadline."; fi
21
+ variables:
22
+ booking_name:
23
+ default: "hotel booking"
24
+ description: Name/label for this booking (hotel name or confirmation number).
25
+ cancellation_deadline:
26
+ default: "2026-12-31T23:59"
27
+ description: "Date and time (YYYY-MM-DDTHH:MM, local timezone) the free-cancellation window closes."
28
+ warn_hours_before:
29
+ default: 48
30
+ description: Start warning this many hours before the deadline.
31
+ compatible_agents: [generic, claude, codex]
32
+ notes: Zero-token. One job per booking — copy it and adjust for each reservation you're tracking.
@@ -0,0 +1,35 @@
1
+ id: lab-result-turnaround-check
2
+ version: 1
3
+ name: Lab Result Turnaround Check
4
+ description: >
5
+ Checks which submitted lab orders still have no result logged past
6
+ their expected turnaround time. Use this if a sample has ever sat at
7
+ an outside lab for a week with nobody following up because no one was
8
+ tracking orders against their expected turnaround.
9
+ category: veterinary
10
+ tags: [veterinary, lab-results, patients, turnaround]
11
+ schedule: "0 9 * * 1-5"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v warn_days="{{overdue_after_days}}" '
17
+ NR==1 {next}
18
+ $4 == "pending" {
19
+ cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
20
+ cmd | getline submitted_epoch; close(cmd);
21
+ age_days = (today - submitted_epoch) / 86400;
22
+ if (age_days >= warn_days) {
23
+ printf "OVERDUE RESULT: %s (%s) — %s submitted %s (%d day(s) ago, still pending)\n", $1, $2, $5, $3, age_days;
24
+ }
25
+ }
26
+ ' "{{lab_orders_csv_path}}"
27
+ variables:
28
+ lab_orders_csv_path:
29
+ default: "./lab-orders.csv"
30
+ description: "Path to a CSV with columns: pet_name,owner_name,submitted_date (YYYY-MM-DD),status (pending/resulted),test_type."
31
+ overdue_after_days:
32
+ default: 5
33
+ description: Days since a sample was submitted before a still-pending result counts as overdue for follow-up with the lab.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Assumes a maintained export from your practice management or lab-ordering system — this flags orders that fell out of tracking, it doesn't chase the lab itself.