@wonsukchoi/crondex 0.17.0 → 0.19.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 +43 -40
- package/catalog.json +979 -33
- package/jobs/agriculture/grain-storage-temperature-check.yaml +34 -0
- package/jobs/automotive/warranty-claim-deadline-check.yaml +35 -0
- package/jobs/childcare/allergy-action-plan-expiry-check.yaml +34 -0
- package/jobs/construction/material-delivery-delay-check.yaml +32 -0
- package/jobs/creator/brand-deal-payment-followup-check.yaml +32 -0
- package/jobs/crypto/stablecoin-peg-deviation-watch.yaml +33 -0
- package/jobs/ecommerce/shipping-delay-check.yaml +31 -0
- package/jobs/education/overdue-library-materials-check.yaml +34 -0
- package/jobs/events/speaker-confirmation-deadline-check.yaml +35 -0
- package/jobs/fitness/locker-rental-expiry-check.yaml +35 -0
- package/jobs/fleet/fleet-insurance-expiry-check.yaml +34 -0
- package/jobs/gaming/game-server-disk-space-check.yaml +34 -0
- package/jobs/government/public-comment-period-closing-check.yaml +35 -0
- package/jobs/growth/seat-utilization-upsell-check.yaml +34 -0
- package/jobs/healthcare/medical-equipment-calibration-check.yaml +35 -0
- package/jobs/hiring/job-posting-expiry-check.yaml +41 -0
- package/jobs/home/utility-bill-anomaly-check.yaml +36 -0
- package/jobs/hospitality/housekeeping-turnover-time-check.yaml +41 -0
- package/jobs/hr/i9-reverification-deadline-check.yaml +36 -0
- package/jobs/insurance/beneficiary-designation-review-reminder.yaml +35 -0
- package/jobs/inventory/supplier-lead-time-drift-check.yaml +34 -0
- package/jobs/investing/bond-cd-maturity-reminder.yaml +31 -0
- package/jobs/learning/practice-streak-check.yaml +33 -0
- package/jobs/legal/business-license-renewal-check.yaml +37 -0
- package/jobs/logistics/port-congestion-watch.yaml +34 -0
- package/jobs/manufacturing/equipment-calibration-due-check.yaml +32 -0
- package/jobs/marketing/newsletter-unsubscribe-spike-check.yaml +37 -0
- package/jobs/nonprofit/event-rsvp-shortfall-check.yaml +40 -0
- package/jobs/podcast/transcript-publish-lag-check.yaml +31 -0
- package/jobs/realestate/hoa-fee-collection-check.yaml +35 -0
- package/jobs/restaurant/supplier-price-increase-watch.yaml +36 -0
- package/jobs/retail/markdown-aging-inventory-check.yaml +33 -0
- package/jobs/sales/proposal-followup-nudge.yaml +31 -0
- package/jobs/support/macro-usage-staleness-check.yaml +33 -0
- package/jobs/team/expense-report-deadline-reminder.yaml +28 -0
- package/jobs/travel/hotel-cancellation-deadline-reminder.yaml +32 -0
- package/jobs/veterinary/medication-inventory-expiry-check.yaml +31 -0
- package/jobs/warehousing/returns-processing-backlog-check.yaml +33 -0
- package/lib/recommend.js +75 -2
- package/package.json +1 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: i9-reverification-deadline-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: I-9 Reverification Deadline Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks employees whose work authorization document has an expiration
|
|
6
|
+
date and warns before I-9 reverification is due. Use this if an I-9
|
|
7
|
+
reverification deadline has ever been missed and only caught during an
|
|
8
|
+
audit.
|
|
9
|
+
category: hr
|
|
10
|
+
tags: [hr, compliance, i9, employment-eligibility]
|
|
11
|
+
schedule: "0 8 * * 1"
|
|
12
|
+
timezone: "America/New_York"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
$2 == "" {next}
|
|
18
|
+
{
|
|
19
|
+
cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline expiry_epoch; close(cmd);
|
|
21
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
22
|
+
diff_days = (expiry_epoch - now_epoch) / 86400;
|
|
23
|
+
if (diff_days <= days) {
|
|
24
|
+
printf "REVERIFICATION DUE: %s — document expires %s (%d days)\n", $1, $2, diff_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{i9_tracking_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
i9_tracking_csv_path:
|
|
30
|
+
default: "./i9-tracking.csv"
|
|
31
|
+
description: "Path to a CSV with columns: employee_name,document_expiry_date (YYYY-MM-DD, blank if the employee's document has no expiration)."
|
|
32
|
+
warn_days_before:
|
|
33
|
+
default: 60
|
|
34
|
+
description: How many days before document expiry to start warning.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: Only applies to employees whose work-authorization document has an expiration date; consult counsel for I-9 process specifics and required forms.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: beneficiary-designation-review-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Beneficiary Designation Review Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Reminds you to review beneficiary designations on your insurance
|
|
6
|
+
policies and retirement accounts once they haven't been checked in a
|
|
7
|
+
while. Use this if a beneficiary has ever gone unchanged for years
|
|
8
|
+
through a marriage, divorce, or new child without anyone catching it.
|
|
9
|
+
category: insurance
|
|
10
|
+
tags: [insurance, beneficiary, review, reminder]
|
|
11
|
+
schedule: "0 9 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v interval="{{review_interval_days}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline last_review_epoch; close(cmd);
|
|
21
|
+
days_since = (today - last_review_epoch) / 86400;
|
|
22
|
+
if (days_since >= interval) {
|
|
23
|
+
printf "REVIEW DUE: %s — last reviewed %s (%d days ago)\n", $1, $2, days_since;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{beneficiary_review_csv}}"
|
|
27
|
+
variables:
|
|
28
|
+
beneficiary_review_csv:
|
|
29
|
+
default: "beneficiary-reviews.csv"
|
|
30
|
+
description: "CSV with header row, columns: policy_or_account_name,last_review_date (YYYY-MM-DD)."
|
|
31
|
+
review_interval_days:
|
|
32
|
+
default: 365
|
|
33
|
+
description: How many days to allow between beneficiary reviews before flagging it as due.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: Update last_review_date in the CSV each time you actually confirm designations are current, and after any major life event (marriage, divorce, new child, death in the family).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: supplier-lead-time-drift-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Supplier Lead Time Drift Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares each supplier's recent delivery lead time against their
|
|
6
|
+
historical baseline and flags suppliers who have started shipping
|
|
7
|
+
noticeably slower. Use this if a reorder point has ever gone stale
|
|
8
|
+
because a supplier quietly started taking longer to deliver than they
|
|
9
|
+
used to.
|
|
10
|
+
category: inventory
|
|
11
|
+
tags: [inventory, suppliers, lead-time, procurement]
|
|
12
|
+
schedule: "0 6 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v threshold="{{drift_threshold_days}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
supplier = $1; baseline = $2 + 0; recent = $3 + 0;
|
|
20
|
+
drift = recent - baseline;
|
|
21
|
+
if (drift >= threshold) {
|
|
22
|
+
printf "LEAD TIME DRIFT: %s — baseline %d days, recent %d days (+%d days)\n", supplier, baseline, recent, drift;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
' "{{supplier_lead_times_csv}}"
|
|
26
|
+
variables:
|
|
27
|
+
supplier_lead_times_csv:
|
|
28
|
+
default: "./supplier-lead-times.csv"
|
|
29
|
+
description: "Path to a CSV with columns: supplier_name,baseline_lead_time_days,recent_lead_time_days."
|
|
30
|
+
drift_threshold_days:
|
|
31
|
+
default: 3
|
|
32
|
+
description: Days of increase over baseline before a supplier is flagged.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: Feed recent_lead_time_days from actual PO-to-delivery data (e.g. an average of the last 3-5 orders) rather than a single order, to avoid false positives from one slow shipment.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: bond-cd-maturity-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Bond & CD Maturity Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a bond or certificate of deposit reaches its maturity
|
|
6
|
+
date. Use this if a CD has ever auto-renewed into a worse rate because
|
|
7
|
+
the maturity date crept up unnoticed.
|
|
8
|
+
category: investing
|
|
9
|
+
tags: [investing, bonds, cd, maturity]
|
|
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 mat_ts; close(cmd);
|
|
19
|
+
days_left = int((mat_ts - today) / 86400);
|
|
20
|
+
if (days_left <= warn) print "WARNING: \"" $1 "\" (" $3 ") matures in " days_left " days (" $2 ")";
|
|
21
|
+
}
|
|
22
|
+
' {{holdings_csv}}
|
|
23
|
+
variables:
|
|
24
|
+
holdings_csv:
|
|
25
|
+
default: "bond-cd-holdings.csv"
|
|
26
|
+
description: "CSV with header row, columns: name,maturity_date(YYYY-MM-DD),amount."
|
|
27
|
+
warn_days:
|
|
28
|
+
default: 30
|
|
29
|
+
description: Days before maturity to start warning.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Keep bond-cd-holdings.csv updated whenever you buy or roll over a bond/CD — one row per holding.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: practice-streak-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Skill Practice Streak Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks a practice log file for a skill you're building (language,
|
|
6
|
+
instrument, coding kata) and warns if too many days have passed since
|
|
7
|
+
the last logged session. Use this if a daily practice habit has ever
|
|
8
|
+
quietly lapsed without you noticing until weeks had gone by.
|
|
9
|
+
category: learning
|
|
10
|
+
tags: [learning, practice, streak, habit]
|
|
11
|
+
schedule: "0 20 * * *"
|
|
12
|
+
timezone: "America/Los_Angeles"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
last_line=$(tail -n1 "{{log_file_path}}" 2>/dev/null);
|
|
16
|
+
if [ -z "$last_line" ]; then echo "WARNING: no practice sessions logged yet in {{log_file_path}}"; exit 1; fi;
|
|
17
|
+
last_ts=$(date -d "$last_line" +%s 2>/dev/null || date -jf "%Y-%m-%d" "$last_line" +%s);
|
|
18
|
+
now_ts=$(date +%s);
|
|
19
|
+
days_since=$(( (now_ts - last_ts) / 86400 ));
|
|
20
|
+
if [ "$days_since" -ge "{{max_gap_days}}" ]; then echo "WARNING: no {{skill_name}} practice logged in $days_since days"; exit 1;
|
|
21
|
+
else echo "OK: last {{skill_name}} practice $days_since days ago"; fi
|
|
22
|
+
variables:
|
|
23
|
+
log_file_path:
|
|
24
|
+
default: "./practice-log.txt"
|
|
25
|
+
description: "Path to a text file with one YYYY-MM-DD line per practice session, newest last."
|
|
26
|
+
skill_name:
|
|
27
|
+
default: "your skill"
|
|
28
|
+
description: Name of the skill being tracked, for labeling output.
|
|
29
|
+
max_gap_days:
|
|
30
|
+
default: 3
|
|
31
|
+
description: Days without a logged session before it's flagged.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: Append today's date to practice-log.txt each time you practice (e.g. `date +%F >> practice-log.txt`) — this job only reads the file, it doesn't log sessions for you.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: business-license-renewal-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Business License Renewal Check
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a specific business license or permit (liquor,
|
|
6
|
+
contractor, professional, health department, etc.) reaches its renewal
|
|
7
|
+
deadline. Use this if a license has ever lapsed because its renewal
|
|
8
|
+
date lived only in someone's memory instead of a calendar.
|
|
9
|
+
category: legal
|
|
10
|
+
tags: [legal, license, permit, renewal]
|
|
11
|
+
schedule: "0 9 1 * *"
|
|
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 {
|
|
18
|
+
cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
|
|
19
|
+
cmd | getline exp_ts; close(cmd);
|
|
20
|
+
days_left = int((exp_ts - today) / 86400);
|
|
21
|
+
if (days_left <= warn) print "WARNING: \"" $1 "\" (" $2 ") expires in " days_left " days (" $3 ")";
|
|
22
|
+
}
|
|
23
|
+
' {{licenses_csv}}
|
|
24
|
+
variables:
|
|
25
|
+
licenses_csv:
|
|
26
|
+
default: "business-licenses.csv"
|
|
27
|
+
description: "CSV with header row, columns: license_name,jurisdiction,expiry_date(YYYY-MM-DD)."
|
|
28
|
+
warn_days:
|
|
29
|
+
default: 45
|
|
30
|
+
description: Days before expiry to start warning.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: >
|
|
33
|
+
Keep business-licenses.csv updated whenever a license/permit is issued
|
|
34
|
+
or renewed — one row per license/jurisdiction. Distinct from
|
|
35
|
+
`compliance-filing-deadline-reminder` (recurring corporate/state
|
|
36
|
+
filings like annual reports and franchise tax) — this tracks
|
|
37
|
+
individually-issued operating licenses and permits instead.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: port-congestion-watch
|
|
2
|
+
version: 1
|
|
3
|
+
name: Port Congestion Watch
|
|
4
|
+
description: >
|
|
5
|
+
Checks a port's average vessel wait time and flags it once congestion
|
|
6
|
+
crosses your threshold. Use this if a congested port has ever blown up
|
|
7
|
+
a shipping timeline before anyone checked the wait times.
|
|
8
|
+
category: logistics
|
|
9
|
+
tags: [logistics, port, congestion, shipping]
|
|
10
|
+
schedule: "0 6 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
wait_hours=$(curl -s -H "Authorization: Bearer {{port_api_token}}" "{{port_status_api_url}}" | grep -o '"avg_wait_hours":[0-9.]*' | head -n1 | cut -d':' -f2);
|
|
15
|
+
if [ -z "$wait_hours" ]; then echo "ERROR: could not fetch port congestion data from {{port_status_api_url}}"; exit 1; fi;
|
|
16
|
+
if awk "BEGIN{exit !($wait_hours >= {{wait_hours_threshold}})}"; then
|
|
17
|
+
echo "WARNING: {{port_name}} average vessel wait is ${wait_hours}h (>= {{wait_hours_threshold}}h)";
|
|
18
|
+
exit 1;
|
|
19
|
+
else echo "OK: {{port_name}} average vessel wait is ${wait_hours}h"; fi
|
|
20
|
+
variables:
|
|
21
|
+
port_name:
|
|
22
|
+
default: "your-port"
|
|
23
|
+
description: Port name, for labeling output.
|
|
24
|
+
port_status_api_url:
|
|
25
|
+
default: "https://api.example-port-tracker.com/ports/your-port/status"
|
|
26
|
+
description: Port status API endpoint returning avg_wait_hours.
|
|
27
|
+
port_api_token:
|
|
28
|
+
default: "your-api-token"
|
|
29
|
+
description: Bearer token for the port/maritime data API.
|
|
30
|
+
wait_hours_threshold:
|
|
31
|
+
default: 48
|
|
32
|
+
description: Hours of average vessel wait before flagging as congested.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: Generic REST pattern — point port_status_api_url at your port authority's or a maritime data provider's (MarineTraffic, Portcast, project44) congestion endpoint; adjust field names to match its response shape.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: equipment-calibration-due-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Equipment Calibration Due Check
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a piece of measurement or test equipment is due for
|
|
6
|
+
calibration. Use this if an out-of-calibration gauge has ever kept
|
|
7
|
+
producing "passing" measurements nobody could actually trust.
|
|
8
|
+
category: manufacturing
|
|
9
|
+
tags: [manufacturing, calibration, quality, compliance]
|
|
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 last_ts; close(cmd);
|
|
19
|
+
due_ts = last_ts + ($3 * 86400);
|
|
20
|
+
days_left = int((due_ts - today) / 86400);
|
|
21
|
+
if (days_left <= warn) print "WARNING: equipment \"" $1 "\" calibration due in " days_left " days";
|
|
22
|
+
}
|
|
23
|
+
' {{equipment_csv}}
|
|
24
|
+
variables:
|
|
25
|
+
equipment_csv:
|
|
26
|
+
default: "calibration-schedule.csv"
|
|
27
|
+
description: "CSV with header row, columns: equipment_id,last_calibrated(YYYY-MM-DD),interval_days."
|
|
28
|
+
warn_days:
|
|
29
|
+
default: 14
|
|
30
|
+
description: Days before calibration is due to start warning.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: Keep calibration-schedule.csv updated after every calibration event — one row per instrument/gauge.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: newsletter-unsubscribe-spike-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Newsletter Unsubscribe Spike Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks your most recent newsletter send's unsubscribe rate against a
|
|
6
|
+
threshold and flags it if it's abnormally high. Use this if a bad
|
|
7
|
+
subject line or list segment has ever quietly torched your audience
|
|
8
|
+
before anyone compared it to prior sends.
|
|
9
|
+
category: marketing
|
|
10
|
+
tags: [marketing, newsletter, unsubscribe, retention]
|
|
11
|
+
schedule: "0 9 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
unsub_rate=$(curl -s -H "Authorization: Bearer {{esp_api_token}}" "{{campaign_stats_api_url}}" | grep -o '"unsubscribe_rate":[0-9.]*' | head -n1 | cut -d':' -f2);
|
|
16
|
+
if [ -z "$unsub_rate" ]; then echo "ERROR: could not fetch unsubscribe rate from {{campaign_stats_api_url}}"; exit 1; fi;
|
|
17
|
+
if awk "BEGIN{exit !($unsub_rate >= {{unsub_rate_threshold}})}"; then
|
|
18
|
+
echo "WARNING: unsubscribe rate ${unsub_rate}% is at/above threshold {{unsub_rate_threshold}}%";
|
|
19
|
+
exit 1;
|
|
20
|
+
else echo "OK: unsubscribe rate ${unsub_rate}%"; fi
|
|
21
|
+
variables:
|
|
22
|
+
campaign_stats_api_url:
|
|
23
|
+
default: "https://api.example-esp.com/campaigns/latest/stats"
|
|
24
|
+
description: Email service provider endpoint returning the most recent send's unsubscribe_rate as a percent.
|
|
25
|
+
esp_api_token:
|
|
26
|
+
default: "your-api-token"
|
|
27
|
+
description: API token for the email service provider.
|
|
28
|
+
unsub_rate_threshold:
|
|
29
|
+
default: 0.5
|
|
30
|
+
description: Percent unsubscribe rate that triggers a warning.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: >
|
|
33
|
+
Generic REST pattern — point campaign_stats_api_url at your ESP's
|
|
34
|
+
(Mailchimp, Klaviyo, SendGrid) campaign stats endpoint for the most
|
|
35
|
+
recent send; adjust field names to match its response shape. Distinct
|
|
36
|
+
from `email-deliverability-check` (bounce/spam-complaint risk) — this
|
|
37
|
+
tracks list attrition per send instead.
|
|
@@ -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,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,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,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,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: 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.
|