@wonsukchoi/crondex 0.5.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.
Files changed (80) hide show
  1. package/README.md +9 -1
  2. package/bin/crondex.js +85 -0
  3. package/catalog.json +2397 -522
  4. package/jobs/construction/inspection-deadline-reminder.yaml +31 -0
  5. package/jobs/construction/permit-expiry-check.yaml +31 -0
  6. package/jobs/content/canonical-tag-check.yaml +25 -0
  7. package/jobs/content/hreflang-audit.yaml +25 -0
  8. package/jobs/content/image-alt-text-audit.yaml +21 -0
  9. package/jobs/content/page-speed-regression-watch.yaml +26 -0
  10. package/jobs/content/sitemap-freshness-check.yaml +31 -0
  11. package/jobs/content/stale-post-audit.yaml +28 -0
  12. package/jobs/creator/content-calendar-gap-check.yaml +31 -0
  13. package/jobs/creator/engagement-drop-watch.yaml +36 -0
  14. package/jobs/devops/cdn-cache-purge-reminder.yaml +27 -0
  15. package/jobs/devops/ci-build-time-regression-watch.yaml +35 -0
  16. package/jobs/devops/error-rate-spike-watch.yaml +43 -0
  17. package/jobs/devops/feature-flag-staleness-audit.yaml +30 -0
  18. package/jobs/devops/k8s-pod-restart-watch.yaml +26 -0
  19. package/jobs/devops/log-forwarding-health-check.yaml +32 -0
  20. package/jobs/devops/staging-prod-config-diff.yaml +32 -0
  21. package/jobs/devops/terraform-drift-check.yaml +24 -0
  22. package/jobs/education/assignment-grading-backlog-check.yaml +23 -0
  23. package/jobs/education/attendance-anomaly-check.yaml +33 -0
  24. package/jobs/events/rsvp-followup-reminder.yaml +30 -0
  25. package/jobs/events/vendor-payment-deadline-reminder.yaml +31 -0
  26. package/jobs/finance/budget-overspend-check.yaml +29 -0
  27. package/jobs/finance/fx-rate-watch.yaml +33 -0
  28. package/jobs/finance/payroll-run-reminder.yaml +27 -0
  29. package/jobs/finance/recurring-payment-failure-check.yaml +23 -0
  30. package/jobs/fleet/fuel-card-anomaly-check.yaml +37 -0
  31. package/jobs/fleet/vehicle-maintenance-due-check.yaml +36 -0
  32. package/jobs/growth/churn-risk-watch.yaml +33 -0
  33. package/jobs/growth/trial-expiring-nudge.yaml +33 -0
  34. package/jobs/hiring/candidate-followup-nudge.yaml +23 -0
  35. package/jobs/hiring/open-req-aging-check.yaml +31 -0
  36. package/jobs/home/car-maintenance-due-reminder.yaml +30 -0
  37. package/jobs/home/warranty-expiry-reminder.yaml +31 -0
  38. package/jobs/hospitality/food-safety-temp-log-check.yaml +36 -0
  39. package/jobs/hospitality/reservation-noshow-check.yaml +20 -0
  40. package/jobs/inventory/inventory-count-discrepancy-check.yaml +38 -0
  41. package/jobs/inventory/low-stock-alert.yaml +20 -0
  42. package/jobs/investing/crypto-price-alert.yaml +33 -0
  43. package/jobs/investing/portfolio-rebalance-check.yaml +32 -0
  44. package/jobs/learning/cert-renewal-reminder.yaml +30 -0
  45. package/jobs/learning/conference-cfp-deadline-reminder.yaml +42 -0
  46. package/jobs/legal/contract-renewal-reminder.yaml +31 -0
  47. package/jobs/legal/trademark-renewal-reminder.yaml +30 -0
  48. package/jobs/logistics/customs-clearance-check.yaml +34 -0
  49. package/jobs/logistics/shipment-delay-watch.yaml +38 -0
  50. package/jobs/manufacturing/production-line-downtime-watch.yaml +34 -0
  51. package/jobs/manufacturing/quality-defect-rate-check.yaml +20 -0
  52. package/jobs/marketing/ad-spend-pacing-check.yaml +37 -0
  53. package/jobs/marketing/email-deliverability-check.yaml +37 -0
  54. package/jobs/nonprofit/grant-deadline-reminder.yaml +44 -0
  55. package/jobs/nonprofit/lapsed-donor-check.yaml +26 -0
  56. package/jobs/personal/medication-refill-reminder.yaml +30 -0
  57. package/jobs/podcast/episode-publish-gap-check.yaml +29 -0
  58. package/jobs/podcast/sponsor-deliverable-tracker.yaml +31 -0
  59. package/jobs/productivity/calendar-double-booking-check.yaml +21 -0
  60. package/jobs/productivity/stale-todo-sweep.yaml +26 -0
  61. package/jobs/productivity/timezone-meeting-conflict-check.yaml +31 -0
  62. package/jobs/realestate/lease-expiry-reminder.yaml +30 -0
  63. package/jobs/realestate/rental-vacancy-check.yaml +30 -0
  64. package/jobs/sales/lead-response-time-check.yaml +23 -0
  65. package/jobs/sales/stale-deal-nudge.yaml +35 -0
  66. package/jobs/security/2fa-enrollment-audit.yaml +24 -0
  67. package/jobs/security/cve-watch.yaml +27 -0
  68. package/jobs/security/dependabot-alert-digest.yaml +30 -0
  69. package/jobs/security/expiring-api-key-rotation.yaml +31 -0
  70. package/jobs/security/iam-key-rotation-reminder.yaml +27 -0
  71. package/jobs/security/s3-public-bucket-check.yaml +20 -0
  72. package/jobs/security/tls-cipher-weak-check.yaml +31 -0
  73. package/jobs/security/waf-rule-change-watch.yaml +38 -0
  74. package/jobs/support/csat-score-watch.yaml +32 -0
  75. package/jobs/support/ticket-backlog-aging-check.yaml +30 -0
  76. package/jobs/team/oncall-handoff-reminder.yaml +26 -0
  77. package/jobs/team/team-anniversary-reminder.yaml +22 -0
  78. package/jobs/travel/frequent-flyer-miles-expiry.yaml +30 -0
  79. package/jobs/travel/travel-insurance-expiry-check.yaml +26 -0
  80. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ id: stale-deal-nudge
2
+ version: 1
3
+ name: Stale Deal Nudge
4
+ description: >
5
+ Finds open pipeline deals nobody's touched in a while. Use this if deals
6
+ have ever quietly died in "in progress" because follow-up only happens
7
+ when someone remembers.
8
+ category: sales
9
+ tags: [sales, pipeline, crm]
10
+ schedule: "0 8 * * 1-5"
11
+ timezone: "UTC"
12
+ runner: hybrid
13
+ command: >
14
+ psql "{{database_url}}" -t -c "select name, owner, last_activity_at from deals where stage not in ('closed_won','closed_lost') and last_activity_at < now() - interval '{{stale_days}} days';"
15
+ prompt: |
16
+ Find open deals in {{crm_hint}} with no activity in the last
17
+ {{stale_days}} days.
18
+ 1. List each deal with owner, stage, value, and days since last activity.
19
+ 2. Draft a short follow-up nudge message for the owner of each, prompting
20
+ next-step action (call, email, or mark as closed-lost).
21
+ script_note: >
22
+ `command` lists stale deals from Postgres with zero tokens. `prompt`
23
+ works with any CRM and also drafts the follow-up nudge per owner.
24
+ variables:
25
+ database_url:
26
+ default: "postgres://user:pass@host:5432/db"
27
+ description: Connection string for the CRM/deals database.
28
+ crm_hint:
29
+ default: "your CRM (Salesforce, HubSpot, Pipedrive)"
30
+ description: Name of the CRM in use, for agent-prompt mode.
31
+ stale_days:
32
+ default: 14
33
+ description: Days without activity before a deal counts as stale.
34
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
35
+ notes: Script mode assumes a `deals` table with `stage`, `owner`, and `last_activity_at` columns — adjust the query to your schema.
@@ -0,0 +1,24 @@
1
+ id: 2fa-enrollment-audit
2
+ version: 1
3
+ name: 2FA Enrollment Audit
4
+ description: >
5
+ Checks which team members in your identity provider or GitHub org don't
6
+ have two-factor auth enabled. Use this if you've ever assumed everyone
7
+ had 2FA on until an incident review proved otherwise.
8
+ category: security
9
+ tags: [security, 2fa, access]
10
+ schedule: "0 9 1 * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ command -v gh >/dev/null 2>&1 || { echo "ERROR: gh CLI not installed"; exit 1; };
15
+ gh api "orgs/{{org}}/members?filter=2fa_disabled" --jq '.[].login' > /tmp/2fa-disabled.txt 2>/dev/null;
16
+ count=$(wc -l < /tmp/2fa-disabled.txt | tr -d ' ');
17
+ if [ "$count" -eq 0 ]; then echo "OK: all org members have 2FA enabled";
18
+ else echo "WARNING: $count member(s) without 2FA:"; cat /tmp/2fa-disabled.txt; fi
19
+ variables:
20
+ org:
21
+ default: "your-org"
22
+ description: GitHub organization login to audit.
23
+ compatible_agents: [generic, claude, codex]
24
+ notes: Requires gh CLI authenticated as an org owner/admin — the 2fa_disabled filter needs admin:org scope.
@@ -0,0 +1,27 @@
1
+ id: cve-watch
2
+ version: 1
3
+ name: CVE Watch
4
+ description: >
5
+ Checks for newly published CVEs affecting packages in your stack. Use
6
+ this if you want a heads-up on a critical vulnerability before it shows
7
+ up in a routine dependency audit days later.
8
+ category: security
9
+ tags: [security, cve, vulnerabilities]
10
+ schedule: "0 8 * * *"
11
+ timezone: "UTC"
12
+ runner: agent-prompt
13
+ prompt: |
14
+ Check for new CVEs published in the last 24 hours affecting the
15
+ dependencies used in this project (see {{manifest_hint}}).
16
+ 1. Pull the current dependency list (name + version) from the manifest.
17
+ 2. Check a CVE/vulnerability source (NVD, GitHub Advisory Database, OSV)
18
+ for new entries matching those packages.
19
+ 3. Report any matches with severity, and whether a patched version is
20
+ already available.
21
+ 4. If nothing new, say so in one line.
22
+ variables:
23
+ manifest_hint:
24
+ default: "package.json / requirements.txt / go.mod"
25
+ description: Which dependency manifest(s) to read for this project.
26
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
27
+ notes: No generic script mode — matching CVEs to an arbitrary manifest against a live advisory database needs an agent, not a fixed CLI call.
@@ -0,0 +1,30 @@
1
+ id: dependabot-alert-digest
2
+ version: 1
3
+ name: Dependabot Alert Digest
4
+ description: >
5
+ Rolls up open Dependabot security alerts across a repo into one digest.
6
+ Use this if Dependabot alerts have ever piled up in a tab nobody checks
7
+ instead of getting triaged as they come in.
8
+ category: security
9
+ tags: [security, dependabot, github]
10
+ schedule: "0 8 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ command -v gh >/dev/null 2>&1 || { echo "ERROR: gh CLI not installed"; exit 1; };
15
+ count=$(gh api "repos/{{owner}}/{{repo}}/dependabot/alerts?state=open" --jq 'length' 2>/dev/null);
16
+ if [ -z "$count" ]; then echo "ERROR: could not fetch Dependabot alerts (check gh auth and repo access)"; exit 1;
17
+ elif [ "$count" -eq 0 ]; then echo "OK: no open Dependabot alerts";
18
+ else
19
+ echo "$count open Dependabot alert(s):";
20
+ gh api "repos/{{owner}}/{{repo}}/dependabot/alerts?state=open" --jq '.[] | "- " + .security_advisory.severity + ": " + .security_advisory.summary';
21
+ fi
22
+ variables:
23
+ owner:
24
+ default: "your-org"
25
+ description: GitHub repo owner/org.
26
+ repo:
27
+ default: "your-repo"
28
+ description: GitHub repo name.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: Requires gh CLI authenticated with a token that has security_events read access on the repo.
@@ -0,0 +1,31 @@
1
+ id: expiring-api-key-rotation
2
+ version: 1
3
+ name: Expiring API Key Rotation Reminder
4
+ description: >
5
+ Warns you before a third-party API key or token you're tracking expires.
6
+ Use this if an integration has ever gone down in production because a
7
+ key expired and nobody rotated it in time.
8
+ category: security
9
+ tags: [security, api-keys, rotation]
10
+ schedule: "0 8 * * *"
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 exp_ts; close(cmd);
19
+ days_left = int((exp_ts - today) / 86400);
20
+ if (days_left <= warn) print "WARNING: key \"" $1 "\" expires in " days_left " days (" $2 ")";
21
+ }
22
+ ' {{keys_csv}}
23
+ variables:
24
+ keys_csv:
25
+ default: "api-keys.csv"
26
+ description: "CSV with header row, columns: key_name,expiry_date(YYYY-MM-DD)."
27
+ warn_days:
28
+ default: 14
29
+ description: Days before expiry to start warning.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Keep api-keys.csv updated manually as a lightweight registry — most providers don't expose expiry via a common API.
@@ -0,0 +1,27 @@
1
+ id: iam-key-rotation-reminder
2
+ version: 1
3
+ name: IAM Key Rotation Reminder
4
+ description: >
5
+ Checks how old your IAM access keys are and flags any past your rotation
6
+ age. Use this if you've ever found a years-old access key still active
7
+ because nobody was tracking key age.
8
+ category: security
9
+ tags: [security, iam, aws, rotation]
10
+ schedule: "0 8 1 * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ aws iam list-users --query 'Users[].UserName' --output text | tr '\t' '\n' | while read -r user; do
16
+ aws iam list-access-keys --user-name "$user" --query 'AccessKeyMetadata[].[AccessKeyId,CreateDate]' --output text | while read -r key created; do
17
+ created_ts=$(date -d "$created" +%s 2>/dev/null || date -jf "%Y-%m-%dT%H:%M:%S" "${created%+*}" +%s 2>/dev/null);
18
+ age_days=$(( (today - created_ts) / 86400 ));
19
+ if [ "$age_days" -ge "{{max_age_days}}" ]; then echo "WARNING: key $key for user $user is $age_days days old"; fi;
20
+ done;
21
+ done
22
+ variables:
23
+ max_age_days:
24
+ default: 90
25
+ description: Key age in days before it's flagged for rotation.
26
+ compatible_agents: [generic, claude, codex]
27
+ notes: Requires AWS CLI with iam:ListUsers and iam:ListAccessKeys permissions.
@@ -0,0 +1,20 @@
1
+ id: s3-public-bucket-check
2
+ version: 1
3
+ name: S3 Public Bucket Check
4
+ description: >
5
+ Checks your S3 buckets for public access and flags any that are exposed.
6
+ Use this if a misconfigured bucket policy has ever quietly made private
7
+ data public.
8
+ category: security
9
+ tags: [security, s3, aws, exposure]
10
+ schedule: "0 6 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ aws s3api list-buckets --query 'Buckets[].Name' --output text | tr '\t' '\n' | while read -r bucket; do
15
+ status=$(aws s3api get-public-access-block --bucket "$bucket" 2>/dev/null);
16
+ if [ -z "$status" ]; then echo "WARNING: $bucket has no public access block configured"; fi;
17
+ done
18
+ variables: {}
19
+ compatible_agents: [generic, claude, codex]
20
+ notes: Requires AWS CLI configured with credentials that can call s3api list-buckets and get-public-access-block.
@@ -0,0 +1,31 @@
1
+ id: tls-cipher-weak-check
2
+ version: 1
3
+ name: Weak TLS Cipher/Protocol Check
4
+ description: >
5
+ Checks a host for weak TLS protocol versions or ciphers still enabled.
6
+ Use this if a legacy protocol has ever stayed enabled for "just in
7
+ case" long after every client that needed it was gone.
8
+ category: security
9
+ tags: [security, tls, ciphers]
10
+ schedule: "0 6 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ command -v openssl >/dev/null 2>&1 || { echo "ERROR: openssl not installed"; exit 1; };
15
+ weak_found=0;
16
+ for proto in ssl3 tls1 tls1_1; do
17
+ if openssl s_client -connect {{host}}:{{port}} -$proto </dev/null 2>/dev/null | grep -q "Cipher is"; then
18
+ echo "WARNING: {{host}}:{{port}} accepts $proto";
19
+ weak_found=1;
20
+ fi;
21
+ done;
22
+ if [ "$weak_found" -eq 0 ]; then echo "OK: {{host}}:{{port}} does not accept SSLv3/TLS1.0/TLS1.1"; else exit 1; fi
23
+ variables:
24
+ host:
25
+ default: "example.com"
26
+ description: Hostname to check.
27
+ port:
28
+ default: 443
29
+ description: Port to check.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Requires an openssl build with legacy protocol support compiled in to actually detect them; a modern openssl that's dropped them entirely will just fail to connect either way (still safe).
@@ -0,0 +1,38 @@
1
+ id: waf-rule-change-watch
2
+ version: 1
3
+ name: WAF Rule Change Watch
4
+ description: >
5
+ Diffs your current WAF rules against a saved baseline and flags drift.
6
+ Use this if a WAF rule has ever been loosened "just for testing" and
7
+ never put back.
8
+ category: security
9
+ tags: [security, waf, drift]
10
+ schedule: "0 6 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ command -v aws >/dev/null 2>&1 || { echo "ERROR: aws CLI not installed"; exit 1; };
15
+ aws wafv2 get-web-acl --name {{web_acl_name}} --scope {{scope}} --id {{web_acl_id}} --query 'WebACL.Rules' --output json > /tmp/waf-current.json 2>/dev/null;
16
+ if [ ! -s /tmp/waf-current.json ]; then echo "ERROR: could not fetch WAF rules for {{web_acl_name}}"; exit 1; fi;
17
+ if [ -f {{baseline_file}} ]; then
18
+ if diff -q {{baseline_file}} /tmp/waf-current.json >/dev/null; then echo "OK: WAF rules match baseline";
19
+ else echo "DRIFT DETECTED in {{web_acl_name}} rules:"; diff {{baseline_file}} /tmp/waf-current.json; exit 1; fi
20
+ else
21
+ echo "no baseline at {{baseline_file}} yet — copying current rules as the new baseline";
22
+ cp /tmp/waf-current.json {{baseline_file}};
23
+ fi
24
+ variables:
25
+ web_acl_name:
26
+ default: "your-web-acl"
27
+ description: Name of the AWS WAFv2 Web ACL to check.
28
+ web_acl_id:
29
+ default: "your-web-acl-id"
30
+ description: ID of the Web ACL.
31
+ scope:
32
+ default: "REGIONAL"
33
+ description: WAF scope, REGIONAL or CLOUDFRONT.
34
+ baseline_file:
35
+ default: "waf-baseline.json"
36
+ description: Path to the saved baseline rules file to diff against.
37
+ compatible_agents: [generic, claude, codex]
38
+ notes: Written for AWS WAFv2 — adapt the fetch command for Cloudflare, Azure Front Door, or other WAF providers.
@@ -0,0 +1,32 @@
1
+ id: csat-score-watch
2
+ version: 1
3
+ name: CSAT Score Watch
4
+ description: >
5
+ Checks your recent customer satisfaction score and flags it if it drops
6
+ below your target. Use this if CSAT only gets looked at once a quarter,
7
+ by which point a bad week is old news.
8
+ category: support
9
+ tags: [support, csat, customer-satisfaction]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: agent-prompt
13
+ prompt: |
14
+ Check the CSAT (or equivalent satisfaction) score for the last
15
+ {{lookback_days}} days from {{csat_source_hint}}.
16
+ 1. Compare it to the {{target_score}} target.
17
+ 2. If below target, pull 2-3 representative low-scoring responses to
18
+ show what's driving it.
19
+ 3. Report the score, trend vs. the prior period, and the drivers if
20
+ applicable, in under 150 words.
21
+ variables:
22
+ csat_source_hint:
23
+ default: "helpdesk tool (Zendesk, Intercom, etc.)"
24
+ description: Where CSAT/satisfaction survey data lives.
25
+ lookback_days:
26
+ default: 7
27
+ description: Rolling window to evaluate.
28
+ target_score:
29
+ default: 90
30
+ description: Target CSAT score (percent or your tool's native scale).
31
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
32
+ notes: No generic script mode — CSAT scoring and survey formats vary too much by helpdesk tool for a fixed command.
@@ -0,0 +1,30 @@
1
+ id: ticket-backlog-aging-check
2
+ version: 1
3
+ name: Support Ticket Backlog Aging Check
4
+ description: >
5
+ Checks how many open support tickets have sat unanswered past your SLA
6
+ window. Use this if tickets have ever quietly aged past their SLA
7
+ because the backlog view wasn't checked that day.
8
+ category: support
9
+ tags: [support, sla, tickets]
10
+ schedule: "0 */4 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ command -v curl >/dev/null 2>&1 || { echo "ERROR: curl not installed"; exit 1; };
15
+ count=$(curl -s -H "Authorization: Bearer {{api_token}}" "{{api_url}}" | grep -o '"status":"open"' | wc -l | tr -d ' ');
16
+ if [ -z "$count" ] || [ "$count" -eq 0 ]; then echo "OK: no aging open tickets found (or endpoint returned nothing)"; exit 0;
17
+ elif [ "$count" -ge "{{threshold}}" ]; then echo "WARNING: $count open tickets past SLA at {{api_url}}"; exit 1;
18
+ else echo "OK: $count open tickets past SLA (under threshold {{threshold}})"; fi
19
+ variables:
20
+ api_url:
21
+ default: "https://api.example-helpdesk.com/tickets?status=open&age_gt_hours=24"
22
+ description: Helpdesk API endpoint pre-filtered to tickets past your SLA age.
23
+ api_token:
24
+ default: "your-api-token"
25
+ description: Bearer token for the helpdesk API.
26
+ threshold:
27
+ default: 5
28
+ description: Number of aging open tickets that triggers a warning.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: Generic REST pattern — point api_url at your helpdesk's (Zendesk, Intercom, Freshdesk) filtered ticket search endpoint; adjust the grep pattern to match its response shape.
@@ -0,0 +1,26 @@
1
+ id: oncall-handoff-reminder
2
+ version: 1
3
+ name: On-call Handoff Reminder
4
+ description: >
5
+ Nudges outgoing and incoming on-call to sync before the shift changes.
6
+ Use this if a handoff has ever happened silently and the new on-call
7
+ found out about an open incident from a page instead of a briefing.
8
+ category: team
9
+ tags: [oncall, handoff, team]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "America/Los_Angeles"
12
+ runner: shell
13
+ command: >
14
+ echo "On-call handoff today: {{outgoing}} -> {{incoming}}. Sync on open incidents, recent alerts, and anything in-flight before {{handoff_time}}."
15
+ variables:
16
+ outgoing:
17
+ default: "outgoing on-call"
18
+ description: Name of the person finishing their on-call shift.
19
+ incoming:
20
+ default: "incoming on-call"
21
+ description: Name of the person starting their on-call shift.
22
+ handoff_time:
23
+ default: "10:00"
24
+ description: Time the handoff should be complete by.
25
+ compatible_agents: [generic, claude, codex]
26
+ notes: Static reminder text — plug in your actual rotation (e.g. pull outgoing/incoming from PagerDuty) if you want it dynamic.
@@ -0,0 +1,22 @@
1
+ id: team-anniversary-reminder
2
+ version: 1
3
+ name: Team Anniversary Reminder
4
+ description: >
5
+ Reminds you about teammates' birthdays and work anniversaries coming up
6
+ this week. Use this if you've ever felt bad realizing a work anniversary
7
+ passed with zero acknowledgment.
8
+ category: team
9
+ tags: [team, birthdays, anniversaries]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "America/Los_Angeles"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%m-%d);
15
+ end=$(date -d "+7 days" +%m-%d 2>/dev/null || date -v+7d +%m-%d);
16
+ awk -F, -v today="$today" -v end="$end" '$2 >= today && $2 <= end {print "UPCOMING: " $1 " (" $3 ") on " $2}' {{roster_csv}}
17
+ variables:
18
+ roster_csv:
19
+ default: "team-dates.csv"
20
+ description: "CSV with columns: name,date(MM-DD),type(birthday/anniversary)."
21
+ compatible_agents: [generic, claude, codex]
22
+ notes: Simple string comparison on MM-DD, so it doesn't handle windows spanning year-end (Dec into Jan) correctly — fine for most weeks.
@@ -0,0 +1,30 @@
1
+ id: frequent-flyer-miles-expiry
2
+ version: 1
3
+ name: Frequent Flyer Miles Expiry Check
4
+ description: >
5
+ Warns you before frequent flyer miles or points expire from inactivity.
6
+ Use this if you've ever lost a stash of miles just because you didn't
7
+ fly or transact on the account in time.
8
+ category: travel
9
+ tags: [travel, miles, points, loyalty]
10
+ schedule: "0 9 1 * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ expiry_ts=$(date -d "{{expiry_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{expiry_date}}" +%s);
16
+ days_left=$(( (expiry_ts - today) / 86400 ));
17
+ if [ "$days_left" -le "{{warn_days}}" ]; then echo "WARNING: {{program_name}} miles expire in $days_left days ({{expiry_date}})"; exit 1;
18
+ else echo "OK: {{program_name}} miles expire in $days_left days"; fi
19
+ variables:
20
+ program_name:
21
+ default: "your airline program"
22
+ description: Name of the loyalty program.
23
+ expiry_date:
24
+ default: "2027-01-01"
25
+ description: Date the miles/points are set to expire (YYYY-MM-DD).
26
+ warn_days:
27
+ default: 30
28
+ description: Days before expiry to start warning.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: Expiry date is a manual input since most loyalty programs don't expose it via a public API — update expiry_date after checking your account.
@@ -0,0 +1,26 @@
1
+ id: travel-insurance-expiry-check
2
+ version: 1
3
+ name: Travel Insurance Expiry Check
4
+ description: >
5
+ Warns you if you have an upcoming trip with no travel insurance policy
6
+ covering it, or a policy expiring before the trip ends. Use this if
7
+ you've ever booked a trip and only thought about insurance the night before.
8
+ category: travel
9
+ tags: [travel, insurance, documents]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ policy_end_ts=$(date -d "{{policy_end_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{policy_end_date}}" +%s);
15
+ trip_end_ts=$(date -d "{{trip_end_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{trip_end_date}}" +%s);
16
+ if [ "$policy_end_ts" -lt "$trip_end_ts" ]; then echo "WARNING: travel insurance ends {{policy_end_date}}, before trip ends {{trip_end_date}}"; exit 1;
17
+ else echo "OK: travel insurance covers the full trip"; fi
18
+ variables:
19
+ policy_end_date:
20
+ default: "2026-12-31"
21
+ description: Date your current travel insurance policy ends (YYYY-MM-DD).
22
+ trip_end_date:
23
+ default: "2026-12-31"
24
+ description: Date your upcoming trip ends (YYYY-MM-DD).
25
+ compatible_agents: [generic, claude, codex]
26
+ notes: Manual date inputs — update policy_end_date and trip_end_date per trip since there's no standard API for insurance policies.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wonsukchoi/crondex",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "A public directory of pre-made, agent-editable cron jobs.",
5
5
  "type": "module",
6
6
  "license": "MIT",