@wonsukchoi/crondex 0.6.0 → 0.7.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 +9 -1
- package/bin/crondex.js +85 -0
- package/catalog.json +1335 -35
- package/jobs/construction/inspection-deadline-reminder.yaml +31 -0
- package/jobs/construction/permit-expiry-check.yaml +31 -0
- package/jobs/content/hreflang-audit.yaml +25 -0
- package/jobs/content/image-alt-text-audit.yaml +21 -0
- package/jobs/content/page-speed-regression-watch.yaml +26 -0
- package/jobs/creator/content-calendar-gap-check.yaml +31 -0
- package/jobs/creator/engagement-drop-watch.yaml +36 -0
- package/jobs/devops/cdn-cache-purge-reminder.yaml +27 -0
- package/jobs/devops/ci-build-time-regression-watch.yaml +35 -0
- package/jobs/devops/k8s-pod-restart-watch.yaml +26 -0
- package/jobs/devops/log-forwarding-health-check.yaml +32 -0
- package/jobs/devops/staging-prod-config-diff.yaml +32 -0
- package/jobs/education/assignment-grading-backlog-check.yaml +23 -0
- package/jobs/education/attendance-anomaly-check.yaml +33 -0
- package/jobs/events/rsvp-followup-reminder.yaml +30 -0
- package/jobs/events/vendor-payment-deadline-reminder.yaml +31 -0
- package/jobs/finance/payroll-run-reminder.yaml +27 -0
- package/jobs/finance/recurring-payment-failure-check.yaml +23 -0
- package/jobs/fleet/fuel-card-anomaly-check.yaml +37 -0
- package/jobs/fleet/vehicle-maintenance-due-check.yaml +36 -0
- package/jobs/hiring/candidate-followup-nudge.yaml +23 -0
- package/jobs/hiring/open-req-aging-check.yaml +31 -0
- package/jobs/home/warranty-expiry-reminder.yaml +31 -0
- package/jobs/hospitality/food-safety-temp-log-check.yaml +36 -0
- package/jobs/hospitality/reservation-noshow-check.yaml +20 -0
- package/jobs/inventory/inventory-count-discrepancy-check.yaml +38 -0
- package/jobs/inventory/low-stock-alert.yaml +20 -0
- package/jobs/investing/crypto-price-alert.yaml +33 -0
- package/jobs/investing/portfolio-rebalance-check.yaml +32 -0
- package/jobs/legal/contract-renewal-reminder.yaml +31 -0
- package/jobs/legal/trademark-renewal-reminder.yaml +30 -0
- package/jobs/logistics/customs-clearance-check.yaml +34 -0
- package/jobs/logistics/shipment-delay-watch.yaml +38 -0
- package/jobs/manufacturing/production-line-downtime-watch.yaml +34 -0
- package/jobs/manufacturing/quality-defect-rate-check.yaml +20 -0
- package/jobs/marketing/ad-spend-pacing-check.yaml +37 -0
- package/jobs/marketing/email-deliverability-check.yaml +37 -0
- package/jobs/nonprofit/grant-deadline-reminder.yaml +44 -0
- package/jobs/nonprofit/lapsed-donor-check.yaml +26 -0
- package/jobs/podcast/episode-publish-gap-check.yaml +29 -0
- package/jobs/podcast/sponsor-deliverable-tracker.yaml +31 -0
- package/jobs/productivity/timezone-meeting-conflict-check.yaml +31 -0
- package/jobs/realestate/lease-expiry-reminder.yaml +30 -0
- package/jobs/realestate/rental-vacancy-check.yaml +30 -0
- package/jobs/sales/lead-response-time-check.yaml +23 -0
- package/jobs/sales/stale-deal-nudge.yaml +35 -0
- package/jobs/security/2fa-enrollment-audit.yaml +24 -0
- package/jobs/security/dependabot-alert-digest.yaml +30 -0
- package/jobs/security/expiring-api-key-rotation.yaml +31 -0
- package/jobs/security/tls-cipher-weak-check.yaml +31 -0
- package/jobs/security/waf-rule-change-watch.yaml +38 -0
- package/jobs/support/csat-score-watch.yaml +32 -0
- package/jobs/support/ticket-backlog-aging-check.yaml +30 -0
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: open-req-aging-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Open Req Aging Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags job requisitions that have been open too long without enough
|
|
6
|
+
candidates in the pipeline. Use this if a req has ever sat open for
|
|
7
|
+
months before anyone asked why it wasn't moving.
|
|
8
|
+
category: hiring
|
|
9
|
+
tags: [hiring, recruiting, requisitions]
|
|
10
|
+
schedule: "0 9 * * 1"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: agent-prompt
|
|
13
|
+
prompt: |
|
|
14
|
+
Review open job requisitions in {{ats_hint}}.
|
|
15
|
+
1. For each req open more than {{stale_days}} days, note days open and
|
|
16
|
+
current candidate count by stage.
|
|
17
|
+
2. Flag reqs with fewer than {{min_candidates}} active candidates as
|
|
18
|
+
needing sourcing attention.
|
|
19
|
+
3. Report the list ranked by days open, oldest first.
|
|
20
|
+
variables:
|
|
21
|
+
ats_hint:
|
|
22
|
+
default: "your ATS (Greenhouse, Lever, Ashby)"
|
|
23
|
+
description: Name of the applicant tracking system in use.
|
|
24
|
+
stale_days:
|
|
25
|
+
default: 45
|
|
26
|
+
description: Days open before a req is flagged for review.
|
|
27
|
+
min_candidates:
|
|
28
|
+
default: 3
|
|
29
|
+
description: Minimum active candidates expected before a req is considered healthy.
|
|
30
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
31
|
+
notes: No generic script mode — ATS APIs vary widely and most need OAuth the agent may not have configured.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: warranty-expiry-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Warranty Expiry Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before an appliance or product warranty expires. Use this if
|
|
6
|
+
you've ever discovered a warranty lapsed the week before whatever it
|
|
7
|
+
covered broke.
|
|
8
|
+
category: home
|
|
9
|
+
tags: [home, warranty, reminder]
|
|
10
|
+
schedule: "0 9 1 * *"
|
|
11
|
+
timezone: "America/Los_Angeles"
|
|
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 exp_ts; close(cmd);
|
|
19
|
+
days_left = int((exp_ts - today) / 86400);
|
|
20
|
+
if (days_left <= warn) print "WARNING: warranty for \"" $1 "\" expires in " days_left " days (" $2 ")";
|
|
21
|
+
}
|
|
22
|
+
' {{warranties_csv}}
|
|
23
|
+
variables:
|
|
24
|
+
warranties_csv:
|
|
25
|
+
default: "warranties.csv"
|
|
26
|
+
description: "CSV with header row, columns: item_name,expiry_date(YYYY-MM-DD)."
|
|
27
|
+
warn_days:
|
|
28
|
+
default: 30
|
|
29
|
+
description: Days before expiry to start warning.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Keep warranties.csv updated whenever you buy something worth tracking — add the receipt/warranty end date at purchase time.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: food-safety-temp-log-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Food Safety Temperature Log Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks that fridge/freezer temperature logs were actually recorded
|
|
6
|
+
today and flags any reading outside the safe range. Use this if a
|
|
7
|
+
temperature log has ever gone unfilled for a shift, or a unit drifted
|
|
8
|
+
out of range without anyone noticing until the food was already at risk.
|
|
9
|
+
category: hospitality
|
|
10
|
+
tags: [hospitality, food-safety, compliance]
|
|
11
|
+
schedule: "0 */4 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%Y-%m-%d);
|
|
16
|
+
last_entry=$(awk -F, -v today="$today" '$1 ~ today {last=$0} END {print last}' {{temp_log_csv}});
|
|
17
|
+
if [ -z "$last_entry" ]; then echo "WARNING: no temperature log entry today for {{unit_name}}"; exit 1; fi;
|
|
18
|
+
temp=$(echo "$last_entry" | cut -d, -f3);
|
|
19
|
+
if awk "BEGIN{exit !($temp > {{max_temp_f}} || $temp < {{min_temp_f}})}"; then
|
|
20
|
+
echo "WARNING: {{unit_name}} reading ${temp}F is out of range ({{min_temp_f}}-{{max_temp_f}}F): $last_entry"; exit 1;
|
|
21
|
+
else echo "OK: {{unit_name}} last reading ${temp}F, in range"; fi
|
|
22
|
+
variables:
|
|
23
|
+
unit_name:
|
|
24
|
+
default: "walk-in cooler"
|
|
25
|
+
description: Name of the unit being logged.
|
|
26
|
+
temp_log_csv:
|
|
27
|
+
default: "temp-log.csv"
|
|
28
|
+
description: "CSV with columns: date(YYYY-MM-DD HH:MM),unit,temp_f."
|
|
29
|
+
min_temp_f:
|
|
30
|
+
default: 33
|
|
31
|
+
description: Minimum safe temperature in Fahrenheit.
|
|
32
|
+
max_temp_f:
|
|
33
|
+
default: 40
|
|
34
|
+
description: Maximum safe temperature in Fahrenheit.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: Assumes manual or IoT-exported entries appended to temp-log.csv throughout the day — one job instance per unit tracked.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
id: reservation-noshow-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Reservation No-show Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks yesterday's no-show rate against your normal baseline and flags a
|
|
6
|
+
spike. Use this if a run of no-shows has ever quietly hurt revenue for
|
|
7
|
+
days before anyone connected the pattern.
|
|
8
|
+
category: hospitality
|
|
9
|
+
tags: [hospitality, reservations, noshow]
|
|
10
|
+
schedule: "0 8 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
psql "{{database_url}}" -t -c "select round(100.0 * sum(case when status = 'no_show' then 1 else 0 end) / count(*), 1) from reservations where reservation_date = current_date - interval '1 day';"
|
|
15
|
+
variables:
|
|
16
|
+
database_url:
|
|
17
|
+
default: "postgres://user:pass@host:5432/db"
|
|
18
|
+
description: Connection string for the reservations database.
|
|
19
|
+
compatible_agents: [generic, claude, codex]
|
|
20
|
+
notes: Assumes a `reservations` table with `status` and `reservation_date` columns — adjust the query for your reservation system's schema; compare the printed rate against your normal baseline manually.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: inventory-count-discrepancy-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Inventory Count Discrepancy Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares a physical inventory count against system records and flags
|
|
6
|
+
mismatches worth investigating. Use this if shrinkage or data entry
|
|
7
|
+
errors have ever gone unnoticed until a full audit months later.
|
|
8
|
+
category: inventory
|
|
9
|
+
tags: [inventory, audit, discrepancy]
|
|
10
|
+
schedule: "0 9 1 * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: agent-prompt
|
|
13
|
+
prompt: |
|
|
14
|
+
Compare the physical count file at {{physical_count_file}} against
|
|
15
|
+
system inventory records (query {{database_url}} or the inventory
|
|
16
|
+
system).
|
|
17
|
+
1. For each SKU, compute the difference between physical and system
|
|
18
|
+
quantity.
|
|
19
|
+
2. Flag any SKU with a discrepancy of {{threshold_units}} units or more,
|
|
20
|
+
or {{threshold_pct}}% of system quantity, whichever is smaller.
|
|
21
|
+
3. Report flagged SKUs ranked by discrepancy size, with a guess at
|
|
22
|
+
likely cause if the pattern suggests one (e.g. consistent
|
|
23
|
+
under-count of one category = possible shrinkage).
|
|
24
|
+
variables:
|
|
25
|
+
physical_count_file:
|
|
26
|
+
default: "physical-count.csv"
|
|
27
|
+
description: CSV export of the physical count, columns sku,quantity.
|
|
28
|
+
database_url:
|
|
29
|
+
default: "postgres://user:pass@host:5432/db"
|
|
30
|
+
description: Connection string for the system inventory database.
|
|
31
|
+
threshold_units:
|
|
32
|
+
default: 5
|
|
33
|
+
description: Absolute unit discrepancy that triggers a flag.
|
|
34
|
+
threshold_pct:
|
|
35
|
+
default: 10
|
|
36
|
+
description: Percent discrepancy that triggers a flag.
|
|
37
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
38
|
+
notes: No generic script mode — matching two data sources and judging what's a meaningful discrepancy needs an agent, not a fixed query.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
id: low-stock-alert
|
|
2
|
+
version: 1
|
|
3
|
+
name: Low Stock Alert
|
|
4
|
+
description: >
|
|
5
|
+
Checks inventory levels against a reorder point and flags SKUs running
|
|
6
|
+
low. Use this if you've ever gone out of stock on a bestseller because
|
|
7
|
+
nobody was watching the count.
|
|
8
|
+
category: inventory
|
|
9
|
+
tags: [inventory, stock, ecommerce]
|
|
10
|
+
schedule: "0 7 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
psql "{{database_url}}" -t -c "select sku, quantity, reorder_point from inventory where quantity <= reorder_point;"
|
|
15
|
+
variables:
|
|
16
|
+
database_url:
|
|
17
|
+
default: "postgres://user:pass@host:5432/db"
|
|
18
|
+
description: Connection string for the inventory database.
|
|
19
|
+
compatible_agents: [generic, claude, codex]
|
|
20
|
+
notes: Assumes an `inventory` table with `sku`, `quantity`, and `reorder_point` columns — adjust the query to your schema.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: crypto-price-alert
|
|
2
|
+
version: 1
|
|
3
|
+
name: Crypto Price Alert
|
|
4
|
+
description: >
|
|
5
|
+
Checks a crypto asset's price and alerts when it crosses a threshold you
|
|
6
|
+
set. Use this if you're waiting for a price target and don't want to
|
|
7
|
+
keep a tab open all day watching a chart.
|
|
8
|
+
category: investing
|
|
9
|
+
tags: [crypto, price, alert]
|
|
10
|
+
schedule: "*/15 * * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
price=$(curl -s "https://api.coingecko.com/api/v3/simple/price?ids={{coin_id}}&vs_currencies={{vs_currency}}" | grep -o '[0-9.]*' | head -n1);
|
|
15
|
+
if [ -z "$price" ]; then echo "ERROR: could not fetch price for {{coin_id}}"; exit 1; fi;
|
|
16
|
+
if awk "BEGIN{exit !($price {{comparison}} {{target_price}})}"; then
|
|
17
|
+
echo "ALERT: {{coin_id}} is $price {{vs_currency}} ({{comparison}} {{target_price}})";
|
|
18
|
+
else echo "OK: {{coin_id}} is $price {{vs_currency}}"; fi
|
|
19
|
+
variables:
|
|
20
|
+
coin_id:
|
|
21
|
+
default: "bitcoin"
|
|
22
|
+
description: CoinGecko coin id (e.g. bitcoin, ethereum).
|
|
23
|
+
vs_currency:
|
|
24
|
+
default: "usd"
|
|
25
|
+
description: Currency to price against.
|
|
26
|
+
target_price:
|
|
27
|
+
default: 50000
|
|
28
|
+
description: Threshold price to compare against.
|
|
29
|
+
comparison:
|
|
30
|
+
default: ">="
|
|
31
|
+
description: "Comparison operator for triggering the alert: <=, >=, <, or >."
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: Uses the free CoinGecko public API, no key required; rate-limited so avoid scheduling much tighter than every few minutes.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: portfolio-rebalance-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Portfolio Rebalance Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares your current asset allocation to your target and flags drift
|
|
6
|
+
worth rebalancing. Use this if your portfolio only gets rebalanced
|
|
7
|
+
whenever you happen to remember to look.
|
|
8
|
+
category: investing
|
|
9
|
+
tags: [investing, portfolio, rebalancing]
|
|
10
|
+
schedule: "0 9 1 * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: agent-prompt
|
|
13
|
+
prompt: |
|
|
14
|
+
Check current portfolio allocation against the target allocation below.
|
|
15
|
+
Target: {{target_allocation}}
|
|
16
|
+
1. Pull current balances/allocation from {{brokerage_hint}} (or ask the
|
|
17
|
+
user for current values if no direct access).
|
|
18
|
+
2. Compute drift per asset class vs. target.
|
|
19
|
+
3. Flag any class drifted more than {{drift_threshold_pct}} percentage
|
|
20
|
+
points, and suggest the trade(s) to rebalance back.
|
|
21
|
+
variables:
|
|
22
|
+
target_allocation:
|
|
23
|
+
default: "60% stocks / 30% bonds / 10% cash"
|
|
24
|
+
description: Your target allocation across asset classes.
|
|
25
|
+
brokerage_hint:
|
|
26
|
+
default: "your brokerage account"
|
|
27
|
+
description: Where portfolio balances live.
|
|
28
|
+
drift_threshold_pct:
|
|
29
|
+
default: 5
|
|
30
|
+
description: Percentage-point drift from target that triggers a rebalance flag.
|
|
31
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
32
|
+
notes: No generic script mode — brokerage APIs vary widely and most require OAuth the agent may not have configured.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: contract-renewal-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Contract Renewal Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a vendor or customer contract auto-renews or expires.
|
|
6
|
+
Use this if a contract has ever auto-renewed for another year because
|
|
7
|
+
nobody flagged the cancellation window in time.
|
|
8
|
+
category: legal
|
|
9
|
+
tags: [legal, contracts, renewal]
|
|
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 renew_ts; close(cmd);
|
|
19
|
+
days_left = int((renew_ts - today) / 86400);
|
|
20
|
+
if (days_left <= warn) print "WARNING: " $1 " renews/expires in " days_left " days (" $2 ")";
|
|
21
|
+
}
|
|
22
|
+
' {{contracts_csv}}
|
|
23
|
+
variables:
|
|
24
|
+
contracts_csv:
|
|
25
|
+
default: "contracts.csv"
|
|
26
|
+
description: "CSV with header row, columns: name,renewal_date(YYYY-MM-DD)."
|
|
27
|
+
warn_days:
|
|
28
|
+
default: 30
|
|
29
|
+
description: Days before renewal/expiry to start warning.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Keep contracts.csv updated manually or export it from your contract management tool before each run.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
id: trademark-renewal-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Trademark Renewal Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a trademark registration's renewal deadline. Use this
|
|
6
|
+
if you've ever let a trademark lapse simply because the renewal date
|
|
7
|
+
wasn't on anyone's calendar.
|
|
8
|
+
category: legal
|
|
9
|
+
tags: [legal, trademark, ip]
|
|
10
|
+
schedule: "0 9 1 * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
today=$(date +%s);
|
|
15
|
+
due_ts=$(date -d "{{renewal_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{renewal_date}}" +%s);
|
|
16
|
+
days_left=$(( (due_ts - today) / 86400 ));
|
|
17
|
+
if [ "$days_left" -le "{{warn_days}}" ]; then echo "WARNING: trademark {{mark_name}} renewal due in $days_left days ({{renewal_date}})"; exit 1;
|
|
18
|
+
else echo "OK: trademark {{mark_name}} renewal due in $days_left days"; fi
|
|
19
|
+
variables:
|
|
20
|
+
mark_name:
|
|
21
|
+
default: "your trademark"
|
|
22
|
+
description: Name/identifier of the trademark to track.
|
|
23
|
+
renewal_date:
|
|
24
|
+
default: "2027-01-01"
|
|
25
|
+
description: Renewal deadline date (YYYY-MM-DD).
|
|
26
|
+
warn_days:
|
|
27
|
+
default: 90
|
|
28
|
+
description: Days before deadline to start warning.
|
|
29
|
+
compatible_agents: [generic, claude, codex]
|
|
30
|
+
notes: Manual renewal_date input — update after each renewal cycle; run one copy per registered mark/jurisdiction.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: customs-clearance-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Customs Clearance Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags a shipment that's been sitting in customs longer than expected.
|
|
6
|
+
Use this if a shipment has ever been stuck at the border for weeks
|
|
7
|
+
before anyone thought to follow up with the broker.
|
|
8
|
+
category: logistics
|
|
9
|
+
tags: [logistics, customs, shipping]
|
|
10
|
+
schedule: "0 9 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: agent-prompt
|
|
13
|
+
prompt: |
|
|
14
|
+
Check the customs clearance status of shipment {{shipment_id}} via
|
|
15
|
+
{{tracking_source_hint}}.
|
|
16
|
+
1. Determine how long it's been in a "customs hold" or equivalent
|
|
17
|
+
status.
|
|
18
|
+
2. If it's been more than {{warn_days}} days, flag it and note any
|
|
19
|
+
stated reason for the hold (missing documents, duties owed,
|
|
20
|
+
inspection) if visible.
|
|
21
|
+
3. Suggest the next action (contact broker, pay duties, provide
|
|
22
|
+
documents) based on the reason if known.
|
|
23
|
+
variables:
|
|
24
|
+
shipment_id:
|
|
25
|
+
default: "your-shipment-id"
|
|
26
|
+
description: Shipment/tracking identifier to check.
|
|
27
|
+
tracking_source_hint:
|
|
28
|
+
default: "carrier tracking page or customs broker portal"
|
|
29
|
+
description: Where to check customs status for this shipment.
|
|
30
|
+
warn_days:
|
|
31
|
+
default: 5
|
|
32
|
+
description: Days in customs hold before it's flagged.
|
|
33
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
34
|
+
notes: No generic script mode — customs status pages/APIs vary by carrier and broker, and reason codes need interpretation.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: shipment-delay-watch
|
|
2
|
+
version: 1
|
|
3
|
+
name: Shipment Delay Watch
|
|
4
|
+
description: >
|
|
5
|
+
Checks a shipment's tracking status and flags it if it hasn't moved in a
|
|
6
|
+
while. Use this if a stuck shipment has ever gone unnoticed until a
|
|
7
|
+
customer asked where their order was.
|
|
8
|
+
category: logistics
|
|
9
|
+
tags: [logistics, shipping, tracking]
|
|
10
|
+
schedule: "0 */6 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
status=$(curl -s -H "Authorization: Bearer {{carrier_api_token}}" "{{tracking_api_url}}" | grep -o '"status":"[^"]*"' | head -n1 | cut -d'"' -f4);
|
|
15
|
+
updated=$(curl -s -H "Authorization: Bearer {{carrier_api_token}}" "{{tracking_api_url}}" | grep -o '"updated_at":"[^"]*"' | head -n1 | cut -d'"' -f4);
|
|
16
|
+
if [ -z "$status" ]; then echo "ERROR: could not fetch tracking status from {{tracking_api_url}}"; exit 1; fi;
|
|
17
|
+
updated_ts=$(date -d "$updated" +%s 2>/dev/null);
|
|
18
|
+
now_ts=$(date +%s);
|
|
19
|
+
hours_stale=$(( (now_ts - updated_ts) / 3600 ));
|
|
20
|
+
if [ "$hours_stale" -ge "{{stale_hours}}" ] && [ "$status" != "delivered" ]; then
|
|
21
|
+
echo "WARNING: shipment {{shipment_id}} status \"$status\" hasn't updated in $hours_stale hours";
|
|
22
|
+
exit 1;
|
|
23
|
+
else echo "OK: shipment {{shipment_id}} status \"$status\", updated $hours_stale hours ago"; fi
|
|
24
|
+
variables:
|
|
25
|
+
shipment_id:
|
|
26
|
+
default: "your-shipment-id"
|
|
27
|
+
description: Shipment/tracking identifier, for labeling output.
|
|
28
|
+
tracking_api_url:
|
|
29
|
+
default: "https://api.example-carrier.com/track/your-shipment-id"
|
|
30
|
+
description: Carrier tracking API endpoint returning status and updated_at.
|
|
31
|
+
carrier_api_token:
|
|
32
|
+
default: "your-api-token"
|
|
33
|
+
description: Bearer token for the carrier's tracking API.
|
|
34
|
+
stale_hours:
|
|
35
|
+
default: 48
|
|
36
|
+
description: Hours without a status update before it's flagged as delayed.
|
|
37
|
+
compatible_agents: [generic, claude, codex]
|
|
38
|
+
notes: Generic REST pattern — point tracking_api_url at your carrier or aggregator's (EasyPost, AfterShip, ShipEngine) tracking endpoint; adjust field names to match its response shape.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: production-line-downtime-watch
|
|
2
|
+
version: 1
|
|
3
|
+
name: Production Line Downtime Watch
|
|
4
|
+
description: >
|
|
5
|
+
Checks how long a production line has been stopped and flags it once it
|
|
6
|
+
crosses a threshold. Use this if a line has ever sat down far longer
|
|
7
|
+
than anyone realized because the stoppage alert never made it to the
|
|
8
|
+
right person.
|
|
9
|
+
category: manufacturing
|
|
10
|
+
tags: [manufacturing, downtime, production]
|
|
11
|
+
schedule: "*/15 * * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
status=$(curl -s "{{line_status_api_url}}" | grep -o '"status":"[^"]*"' | head -n1 | cut -d'"' -f4);
|
|
16
|
+
since=$(curl -s "{{line_status_api_url}}" | grep -o '"status_since":"[^"]*"' | head -n1 | cut -d'"' -f4);
|
|
17
|
+
if [ "$status" != "stopped" ]; then echo "OK: line {{line_id}} status is $status"; exit 0; fi;
|
|
18
|
+
since_ts=$(date -d "$since" +%s 2>/dev/null);
|
|
19
|
+
now_ts=$(date +%s);
|
|
20
|
+
minutes_down=$(( (now_ts - since_ts) / 60 ));
|
|
21
|
+
if [ "$minutes_down" -ge "{{threshold_minutes}}" ]; then echo "WARNING: line {{line_id}} stopped for $minutes_down minutes"; exit 1;
|
|
22
|
+
else echo "OK: line {{line_id}} stopped for $minutes_down minutes (under threshold)"; fi
|
|
23
|
+
variables:
|
|
24
|
+
line_id:
|
|
25
|
+
default: "line-1"
|
|
26
|
+
description: Identifier of the production line, for labeling output.
|
|
27
|
+
line_status_api_url:
|
|
28
|
+
default: "https://api.example-mes.com/lines/line-1/status"
|
|
29
|
+
description: MES/SCADA API endpoint returning status and status_since fields.
|
|
30
|
+
threshold_minutes:
|
|
31
|
+
default: 30
|
|
32
|
+
description: Minutes stopped before it's flagged.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: Generic REST pattern — point line_status_api_url at your MES/SCADA system's status endpoint; adjust field names to match its response shape.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
id: quality-defect-rate-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Quality Defect Rate Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks today's defect rate against a target and flags it if it's
|
|
6
|
+
running high. Use this if a quality problem has ever run for a full
|
|
7
|
+
shift before anyone pulled the numbers and noticed.
|
|
8
|
+
category: manufacturing
|
|
9
|
+
tags: [manufacturing, quality, defects]
|
|
10
|
+
schedule: "0 */4 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
psql "{{database_url}}" -t -c "select round(100.0 * sum(case when defective then 1 else 0 end) / count(*), 2) from inspections where inspected_at >= current_date;"
|
|
15
|
+
variables:
|
|
16
|
+
database_url:
|
|
17
|
+
default: "postgres://user:pass@host:5432/db"
|
|
18
|
+
description: Connection string for the quality/inspections database.
|
|
19
|
+
compatible_agents: [generic, claude, codex]
|
|
20
|
+
notes: Assumes an `inspections` table with a boolean `defective` column and `inspected_at` timestamp — adjust the query to your QMS schema; compare the printed rate against your target manually or extend the command with a threshold check.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: ad-spend-pacing-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Ad Spend Pacing Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks a campaign's spend so far against where it should be by this
|
|
6
|
+
point in the budget period, and flags over- or under-pacing. Use this
|
|
7
|
+
if a campaign has ever blown through its monthly budget in the first
|
|
8
|
+
two weeks because nobody was watching the burn rate.
|
|
9
|
+
category: marketing
|
|
10
|
+
tags: [marketing, ads, budget]
|
|
11
|
+
schedule: "0 8 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: agent-prompt
|
|
14
|
+
prompt: |
|
|
15
|
+
Check spend for campaign {{campaign_name}} on {{ad_platform_hint}}.
|
|
16
|
+
1. Pull total spend so far this budget period against the
|
|
17
|
+
{{budget_usd}} budget.
|
|
18
|
+
2. Compute expected spend-to-date based on days elapsed vs. total days
|
|
19
|
+
in the period, and compare to actual.
|
|
20
|
+
3. Flag if pacing is more than {{pacing_threshold_pct}}% over or under
|
|
21
|
+
the expected pace.
|
|
22
|
+
4. Report actual vs. expected spend and the pacing delta.
|
|
23
|
+
variables:
|
|
24
|
+
campaign_name:
|
|
25
|
+
default: "your campaign"
|
|
26
|
+
description: Name/ID of the ad campaign to check.
|
|
27
|
+
ad_platform_hint:
|
|
28
|
+
default: "Google Ads, Meta Ads, or similar"
|
|
29
|
+
description: Which ad platform the campaign runs on.
|
|
30
|
+
budget_usd:
|
|
31
|
+
default: 5000
|
|
32
|
+
description: Total budget for the period, in USD.
|
|
33
|
+
pacing_threshold_pct:
|
|
34
|
+
default: 15
|
|
35
|
+
description: Percent over/under expected pace that triggers a flag.
|
|
36
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
37
|
+
notes: No generic script mode — ad platform APIs need OAuth per-platform, and pacing math needs the campaign's period boundaries which vary by setup.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: email-deliverability-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Email Deliverability Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks recent bounce and spam-complaint rates for your email sends and
|
|
6
|
+
flags a spike. Use this if a deliverability problem has ever quietly
|
|
7
|
+
tanked open rates for a week before anyone checked the actual bounce
|
|
8
|
+
numbers.
|
|
9
|
+
category: marketing
|
|
10
|
+
tags: [marketing, email, deliverability]
|
|
11
|
+
schedule: "0 9 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
stats=$(curl -s -H "Authorization: Bearer {{esp_api_token}}" "{{esp_stats_api_url}}");
|
|
16
|
+
bounce_rate=$(echo "$stats" | grep -o '"bounce_rate":[0-9.]*' | cut -d: -f2);
|
|
17
|
+
complaint_rate=$(echo "$stats" | grep -o '"complaint_rate":[0-9.]*' | cut -d: -f2);
|
|
18
|
+
if [ -z "$bounce_rate" ]; then echo "ERROR: could not fetch stats from {{esp_stats_api_url}}"; exit 1; fi;
|
|
19
|
+
flagged=0;
|
|
20
|
+
if awk "BEGIN{exit !($bounce_rate > {{max_bounce_pct}})}"; then echo "WARNING: bounce rate ${bounce_rate}% over threshold {{max_bounce_pct}}%"; flagged=1; fi;
|
|
21
|
+
if awk "BEGIN{exit !($complaint_rate > {{max_complaint_pct}})}"; then echo "WARNING: complaint rate ${complaint_rate}% over threshold {{max_complaint_pct}}%"; flagged=1; fi;
|
|
22
|
+
if [ "$flagged" -eq 0 ]; then echo "OK: bounce ${bounce_rate}%, complaint ${complaint_rate}%"; else exit 1; fi
|
|
23
|
+
variables:
|
|
24
|
+
esp_stats_api_url:
|
|
25
|
+
default: "https://api.example-esp.com/stats/recent"
|
|
26
|
+
description: Email service provider stats API endpoint returning bounce_rate and complaint_rate.
|
|
27
|
+
esp_api_token:
|
|
28
|
+
default: "your-api-token"
|
|
29
|
+
description: API token for the email service provider.
|
|
30
|
+
max_bounce_pct:
|
|
31
|
+
default: 2
|
|
32
|
+
description: Bounce rate percent that triggers a warning.
|
|
33
|
+
max_complaint_pct:
|
|
34
|
+
default: 0.1
|
|
35
|
+
description: Spam complaint rate percent that triggers a warning.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: Generic REST pattern — point esp_stats_api_url at your ESP's (SendGrid, Mailgun, Postmark) stats endpoint; adjust field names to match its response shape.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
id: grant-deadline-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Grant Deadline Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a grant application deadline, and can help draft the
|
|
6
|
+
application. Use this if a funding opportunity has ever been missed
|
|
7
|
+
simply because the deadline crept up during a busy week.
|
|
8
|
+
category: nonprofit
|
|
9
|
+
tags: [nonprofit, grants, fundraising]
|
|
10
|
+
schedule: "0 9 * * 1"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: hybrid
|
|
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 due_ts; close(cmd);
|
|
19
|
+
days_left = int((due_ts - today) / 86400);
|
|
20
|
+
if (days_left <= warn && days_left >= 0) print "WARNING: grant \"" $1 "\" due in " days_left " days (" $2 ")";
|
|
21
|
+
}
|
|
22
|
+
' {{grants_csv}}
|
|
23
|
+
prompt: |
|
|
24
|
+
Check {{grants_csv}} for grant application deadlines within
|
|
25
|
+
{{warn_days}} days.
|
|
26
|
+
1. Flag any that are close, listing days remaining.
|
|
27
|
+
2. For the closest one, help draft or outline the application based on
|
|
28
|
+
{{org_mission_hint}} — key sections, and what evidence/data to pull
|
|
29
|
+
together first.
|
|
30
|
+
script_note: >
|
|
31
|
+
`command` only checks dates and warns. `prompt` also helps draft/outline
|
|
32
|
+
the closest application, which needs an LLM.
|
|
33
|
+
variables:
|
|
34
|
+
grants_csv:
|
|
35
|
+
default: "grants.csv"
|
|
36
|
+
description: "CSV with header row, columns: grant_name,deadline(YYYY-MM-DD)."
|
|
37
|
+
warn_days:
|
|
38
|
+
default: 21
|
|
39
|
+
description: Days before deadline to start warning.
|
|
40
|
+
org_mission_hint:
|
|
41
|
+
default: "your organization's mission and programs"
|
|
42
|
+
description: Brief context on the org, to help draft the application outline.
|
|
43
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
44
|
+
notes: Keep grants.csv updated with opportunities as you find them.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
id: lapsed-donor-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Lapsed Donor Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags donors who gave before but haven't in a while, before they're
|
|
6
|
+
fully lost. Use this if lapsed-donor outreach only happens during the
|
|
7
|
+
annual campaign instead of catching people while it's still recoverable.
|
|
8
|
+
category: nonprofit
|
|
9
|
+
tags: [nonprofit, donors, fundraising]
|
|
10
|
+
schedule: "0 9 1 * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
psql "{{database_url}}" -t -c "select name, email, last_donation_at from donors where last_donation_at < now() - interval '{{lapsed_months}} months' and last_donation_at > now() - interval '{{lapsed_months}} months' - interval '90 days';"
|
|
15
|
+
variables:
|
|
16
|
+
database_url:
|
|
17
|
+
default: "postgres://user:pass@host:5432/db"
|
|
18
|
+
description: Connection string for the donor database.
|
|
19
|
+
lapsed_months:
|
|
20
|
+
default: 12
|
|
21
|
+
description: Months since last donation before a donor counts as lapsing.
|
|
22
|
+
compatible_agents: [generic, claude, codex]
|
|
23
|
+
notes: >
|
|
24
|
+
Assumes a `donors` table with `last_donation_at` — the 90-day window
|
|
25
|
+
after the lapsed_months mark keeps this from re-flagging the same donor
|
|
26
|
+
every run indefinitely.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
id: episode-publish-gap-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Podcast Episode Publish Gap Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks that a new episode has gone out recently and flags it if your
|
|
6
|
+
publish cadence has slipped. Use this if listeners have ever noticed a
|
|
7
|
+
gap in your feed before you did.
|
|
8
|
+
category: podcast
|
|
9
|
+
tags: [podcast, publishing, cadence]
|
|
10
|
+
schedule: "0 9 * * 1"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
lastmod=$(curl -s {{feed_url}} | grep -o '<pubDate>[^<]*' | sed 's/<pubDate>//' | head -n1);
|
|
15
|
+
if [ -z "$lastmod" ]; then echo "WARNING: could not find any <pubDate> in {{feed_url}}"; exit 1; fi;
|
|
16
|
+
last_ts=$(date -d "$lastmod" +%s 2>/dev/null);
|
|
17
|
+
now_ts=$(date +%s);
|
|
18
|
+
days_since=$(( (now_ts - last_ts) / 86400 ));
|
|
19
|
+
if [ "$days_since" -ge "{{max_gap_days}}" ]; then echo "WARNING: last episode was $days_since days ago"; exit 1;
|
|
20
|
+
else echo "OK: last episode was $days_since days ago"; fi
|
|
21
|
+
variables:
|
|
22
|
+
feed_url:
|
|
23
|
+
default: "https://example.com/podcast/feed.xml"
|
|
24
|
+
description: URL of the podcast's RSS feed.
|
|
25
|
+
max_gap_days:
|
|
26
|
+
default: 14
|
|
27
|
+
description: Days since the last episode before it's flagged.
|
|
28
|
+
compatible_agents: [generic, claude, codex]
|
|
29
|
+
notes: Relies on the feed's <pubDate> being in a standard RFC 822 format, which most podcast hosts produce.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: sponsor-deliverable-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Podcast Sponsor Deliverable Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Flags sponsor deliverables (read, mention, social post) coming due. Use
|
|
6
|
+
this if you've ever had a sponsor follow up asking where their promised
|
|
7
|
+
mention was.
|
|
8
|
+
category: podcast
|
|
9
|
+
tags: [podcast, sponsorship, deliverables]
|
|
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 due_ts; close(cmd);
|
|
19
|
+
days_left = int((due_ts - today) / 86400);
|
|
20
|
+
if (days_left <= warn && days_left >= 0) print "WARNING: " $1 " deliverable (" $2 ") due in " days_left " days (" $3 ")";
|
|
21
|
+
}
|
|
22
|
+
' {{sponsor_deliverables_csv}}
|
|
23
|
+
variables:
|
|
24
|
+
sponsor_deliverables_csv:
|
|
25
|
+
default: "sponsor-deliverables.csv"
|
|
26
|
+
description: "CSV with header row, columns: sponsor_name,deliverable,due_date(YYYY-MM-DD)."
|
|
27
|
+
warn_days:
|
|
28
|
+
default: 7
|
|
29
|
+
description: Days before due date to start warning.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Keep sponsor-deliverables.csv updated whenever a sponsorship deal is signed — one row per deliverable.
|