{"id":"c91834b5-d05b-4b38-9b6a-eb0fe5507850","entityType":"agent","slug":"clawhub-occupythemilkyway-tyche-lite","name":"Tyche Lite — Quick Invoice Preview","canonicalUrl":"https://www.xpersona.co/agent/clawhub-occupythemilkyway-tyche-lite","canonicalPath":"/agent/clawhub-occupythemilkyway-tyche-lite","generatedAt":"2026-10-14T15:13:03.412Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-12T00:30:42.282Z","emptyReason":null},"description":"Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Ty... Skill: Tyche Lite — Quick Invoice Preview Owner: occupythemilkyway Summary: Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Ty... Tags: billing:1.0.0, business:1.0.0, free:1.0.0, freelance:1.0.0, invoicing:1.0.0, latest:1.0.4, lite:1.0.0, payments:1.0.0, tyche:1.0.0 Version history: v1.0.4 | 2026-05-24T18:56:52.","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 967 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s1757zbbgb226m951fdfmj4s6s860nkn:tyche-lite","sourceUrl":"https://clawhub.ai/occupythemilkyway/tyche-lite","homepage":"https://clawhub.ai/occupythemilkyway/skills/tyche-lite","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/occupythemilkyway/tyche-lite","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/occupythemilkyway/skills/tyche-lite","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Ty..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:30:42.282Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:30:42.282Z","emptyReason":null},"stars":null,"forks":null,"downloads":967,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.4","tractionLabel":"967 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:30:42.211Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T00:30:42.282Z","lastCrawledAt":"2026-10-12T00:30:42.211Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T00:30:42.211Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.4","createdAt":"2026-05-24T18:56:52.530Z","changelog":"- Updated all text and symbols to use proper Unicode characters (replace garbled characters with correct symbols and emoji). - Revised upgrade instructions with new purchase links and added a bundle deal mention for Pro skills. - No changes to functionality or logic; this is a documentation and display/text fix release. - Version bumped to 1.0.4.","fileCount":3,"zipByteSize":4491},{"version":"1.0.1","createdAt":"2026-05-17T00:18:01.755Z","changelog":"- Version bump from 1.0.0 to 1.0.1. - No functional or content changes in this release.","fileCount":2,"zipByteSize":3253},{"version":"1.0.0","createdAt":"2026-05-10T16:06:20.259Z","changelog":"Initial Lite release: 5 invoice limit, status overview, friendly reminder template, Pro upsell","fileCount":2,"zipByteSize":3253}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1757zbbgb226m951fdfmj4s6s860nkn:tyche-lite","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-14T15:13:03.412Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-tyche-lite/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-12T00:30:42.282Z","emptyReason":null},"readme":"Skill: Tyche Lite — Quick Invoice Preview\n\nOwner: occupythemilkyway\n\nSummary: Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Ty...\n\nTags: billing:1.0.0, business:1.0.0, free:1.0.0, freelance:1.0.0, invoicing:1.0.0, latest:1.0.4, lite:1.0.0, payments:1.0.0, tyche:1.0.0\n\nVersion history:\n\nv1.0.4 | 2026-05-24T18:56:52.530Z | user\n\n- Updated all text and symbols to use proper Unicode characters (replace garbled characters with correct symbols and emoji).\n- Revised upgrade instructions with new purchase links and added a bundle deal mention for Pro skills.\n- No changes to functionality or logic; this is a documentation and display/text fix release.\n- Version bumped to 1.0.4.\n\nv1.0.1 | 2026-05-17T00:18:01.755Z | user\n\n- Version bump from 1.0.0 to 1.0.1.\n- No functional or content changes in this release.\n\nv1.0.0 | 2026-05-10T16:06:20.259Z | user\n\nInitial Lite release: 5 invoice limit, status overview, friendly reminder template, Pro upsell\n\nArchive index:\n\nArchive v1.0.4: 3 files, 4491 bytes\n\nFiles: skill-card.md (2189b), SKILL.md (7235b), _meta.json (129b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: tyche-lite\ndescription: \"Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Tyche Pro does for your full client book.\"\nversion: \"1.0.4\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"INVOICES_FILE\"\n    homepage: https://clawhub.ai/occupythemilkyway/tyche-lite\n    emoji: \"⚖️\"\n    tags: [invoicing, payments, billing, business, freelance, free, lite, tyche]\n    envVars:\n      - name: INVOICES_FILE\n        required: false\n        description: \"Path to invoices CSV (client_name, client_email, description, amount, due_date, status). Max 5 rows in Lite.\"\n        default: \"\"\n      - name: YOUR_NAME\n        required: false\n        description: Your name or company\n        default: \"Your Name\"\n      - name: CURRENCY\n        required: false\n        description: \"Currency: USD, EUR, GBP\"\n        default: \"USD\"\n---\n\n# Tyche Lite — Free Invoice Preview\n\nTrack up to 5 invoices and get a friendly reminder template.\n\n## Free vs Pro\n\n| Feature | Tyche Lite (Free) | Tyche Pro |\n|---------|------------------|-----------|\n| Invoices | **5 max** | Unlimited |\n| Tax calculation | ❌ | ✅ |\n| Late fee calculation | ❌ | ✅ |\n| Reminder tiers | 1 (friendly only) | 3 tiers |\n| Multi-currency | ❌ | ✅ |\n| Project grouping | ❌ | ✅ |\n| Aged receivables | ❌ | ✅ 30/60/90d |\n| Analytics export | ❌ | ✅ |\n\n👉 **Upgrade:** `openclaw skills install tyche-pro` — key at **ko-fi.com/s/4e0d922f4c**\n\n💰 **Bundle deal:** all 5 Pro skills for **$29** → **ko-fi.com/s/7625accf3f** (save $16)\n\n---\n\n## Step 1 — Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 — Invoice overview (Lite)\n\n```python\nimport os, csv, re\nfrom datetime import datetime, timedelta\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nINVOICES_FILE = os.environ.get(\"INVOICES_FILE\",\"\").strip()\nYOUR_NAME     = os.environ.get(\"YOUR_NAME\",\"Your Name\")\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"€\",\"GBP\":\"£\"}.get(CURRENCY,\"$\")\nINVOICE_LIMIT = 5  # Lite cap\nnow           = datetime.now()\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\ndef parse_amount(r):\n    c = re.sub(r\"[^0-9.]\",\"\",str(r)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else 0.0\n    except: return 0.0\ndef parse_date(raw):\n    for f in (\"%Y-%m-%d\",\"%m/%d/%Y\",\"%d/%m/%Y\"):\n        try: return datetime.strptime(raw.strip(),f)\n        except: pass\n    return None\n\ninvoices = []\nif INVOICES_FILE and os.path.exists(INVOICES_FILE):\n    with open(INVOICES_FILE,encoding=\"utf-8\",errors=\"replace\") as f:\n        reader = csv.DictReader(f)\n        for i,row in enumerate(reader,1):\n            if i > INVOICE_LIMIT:\n                console.print(f\"[yellow]⚠️  Lite limit: showing first {INVOICE_LIMIT} invoices only. Upgrade to Pro for unlimited.[/yellow]\")\n                break\n            rk = {k.lower().strip():v.strip() for k,v in row.items()}\n            invoices.append({\n                \"inv_number\":   rk.get(\"inv_number\",f\"INV-{i:04d}\"),\n                \"client_name\":  rk.get(\"client_name\",\"Client\"),\n                \"client_email\": rk.get(\"client_email\",\"\"),\n                \"description\":  rk.get(\"description\",\"Services\"),\n                \"amount\":       parse_amount(rk.get(\"amount\",\"0\")),\n                \"due_date\":     rk.get(\"due_date\",\"\"),\n                \"status\":       rk.get(\"status\",\"unpaid\").lower(),\n            })\nelse:\n    console.print(\"[yellow]ℹ️  No INVOICES_FILE — using demo data.[/yellow]\\n\")\n    invoices = [\n        {\"inv_number\":\"INV-0001\",\"client_name\":\"Acme Corp\",\"client_email\":\"billing@acme.com\",\"description\":\"Website redesign\",\"amount\":2500,\"due_date\":(now-timedelta(days=15)).strftime(\"%Y-%m-%d\"),\"status\":\"overdue\"},\n        {\"inv_number\":\"INV-0002\",\"client_name\":\"Globex Inc\",\"client_email\":\"ap@globex.com\",\"description\":\"Consulting\",\"amount\":1800,\"due_date\":(now+timedelta(days=10)).strftime(\"%Y-%m-%d\"),\"status\":\"unpaid\"},\n        {\"inv_number\":\"INV-0003\",\"client_name\":\"Initech Ltd\",\"client_email\":\"pay@initech.com\",\"description\":\"Logo design\",\"amount\":750,\"due_date\":(now-timedelta(days=5)).strftime(\"%Y-%m-%d\"),\"status\":\"paid\"},\n    ]\n\nfor inv in invoices:\n    due = parse_date(inv[\"due_date\"])\n    inv[\"due_dt\"]    = due\n    inv[\"days_late\"] = max(0,(now-due).days) if due and inv[\"status\"] in (\"overdue\",\"unpaid\") else 0\n\ntotal_invoiced    = sum(i[\"amount\"] for i in invoices)\ntotal_paid        = sum(i[\"amount\"] for i in invoices if i[\"status\"]==\"paid\")\ntotal_outstanding = total_invoiced - total_paid\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold yellow]⚖️  Tyche Lite — Invoice Overview[/bold yellow]\\n\"\n    f\"Invoiced: [white]{fmt(total_invoiced)}[/white]  Paid: [green]{fmt(total_paid)}[/green]  Outstanding: [red]{fmt(total_outstanding)}[/red]\\n\"\n    f\"[dim]Lite: showing {len(invoices)}/{INVOICE_LIMIT} invoices max[/dim]\",\n    border_style=\"yellow\"\n))\n\nSC = {\"paid\":\"green\",\"unpaid\":\"yellow\",\"overdue\":\"red\",\"partial\":\"cyan\"}\nconsole.print()\ntbl = Table(title=\"Invoice Status\", box=box.ROUNDED, border_style=\"yellow\")\ntbl.add_column(\"Inv #\",   width=10, style=\"dim\")\ntbl.add_column(\"Client\",  width=18, style=\"cyan\")\ntbl.add_column(\"Amount\",  width=12, justify=\"right\")\ntbl.add_column(\"Due\",     width=12, style=\"dim\")\ntbl.add_column(\"Late\",    width=8,  style=\"red\", justify=\"right\")\ntbl.add_column(\"Status\",  width=10)\nfor inv in sorted(invoices, key=lambda x: -(x[\"days_late\"] or 0)):\n    sc   = SC.get(inv[\"status\"],\"white\")\n    late = f\"{inv['days_late']}d\" if inv[\"days_late\"] else \"—\"\n    tbl.add_row(inv[\"inv_number\"],inv[\"client_name\"][:16],fmt(inv[\"amount\"]),inv[\"due_date\"],late,f\"[{sc}]{inv['status'].title()}[/{sc}]\")\nconsole.print(tbl)\n\n# 1 reminder (Lite: friendly only)\noverdue = [i for i in invoices if i[\"days_late\"] > 0]\nif overdue:\n    inv = overdue[0]\n    console.print()\n    console.print(Panel(\n        f\"To: {inv['client_email']}\\nSubject: Friendly Reminder — Invoice {inv['inv_number']}\\n\\n\"\n        f\"Dear {inv['client_name']},\\n\\n\"\n        f\"I hope you're well. Invoice {inv['inv_number']} for {fmt(inv['amount'])} was due {inv['due_date']}. \"\n        f\"Could you confirm when payment will be processed?\\n\\n\"\n        f\"Kind regards,\\n{YOUR_NAME}\",\n        title=f\"[yellow]Friendly Reminder — {inv['client_name']} ({inv['days_late']}d overdue)[/yellow]\",\n        border_style=\"yellow\"\n    ))\n    if len(overdue) > 1:\n        console.print(f\"[dim]+ {len(overdue)-1} more overdue invoice(s) — upgrade to Pro for all reminder tiers.[/dim]\")\n\nconsole.print()\nconsole.print(Panel(\n    f\"[bold yellow]🔓 Want more?[/bold yellow]\\n\\n\"\n    f\"Tyche Pro handles [bold]unlimited invoices[/bold], calculates [bold]late fees & tax[/bold], \"\n    f\"sends [bold]3-tier reminders[/bold], groups by project, and gives you an aged receivables dashboard.\\n\\n\"\n    f\"[bold cyan]openclaw skills install tyche-pro[/bold cyan]\\n\"\n    f\"Get your key → [bold]ko-fi.com/s/4e0d922f4c[/bold]\",\n    title=\"Upgrade to Tyche Pro\",\n    border_style=\"cyan\"\n))\n```\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"tyche-lite\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1779649012530\n}\n\nFile v1.0.4:skill-card.md\n\n## Description:\n\nTyche Lite previews up to five invoices from a CSV, summarizes payment status, and drafts one friendly overdue-payment reminder.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[occupythemilkyway](https://clawhub.ai/user/occupythemilkyway)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users, freelancers, and small businesses use this skill to preview invoice status from a small CSV file and generate a friendly reminder for an overdue invoice. It is intended as a lightweight invoice-review helper rather than a full receivables workflow.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The provided dependency install command uses an overly broad system-package flag.\n\nMitigation: Install dependencies in a virtual environment and avoid running the command against system Python.\n\nRisk: The skill includes visible upsell messaging and a Ko-fi purchase link.\n\nMitigation: Treat Tyche Pro and the purchase link as separate decisions from the invoice-preview task.\n\nRisk: Invoice CSV content may include client names, emails, amounts, and payment status.\n\nMitigation: Review generated output before sharing it and avoid pasting sensitive invoice data into unrelated workflows.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/occupythemilkyway/skills/tyche-lite)\n- [ClawHub metadata homepage](https://clawhub.ai/occupythemilkyway/tyche-lite)\n- [Publisher profile](https://clawhub.ai/user/occupythemilkyway)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with shell and Python code blocks]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reads an optional invoice CSV through INVOICES_FILE and limits Lite previews to five invoices.]\n\n## Skill Version(s):\n\n1.0.4 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.1: 2 files, 3253 bytes\n\nFiles: SKILL.md (7260b), _meta.json (129b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: tyche-lite\ndescription: \"Tyche Lite â Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Tyche Pro does for your full client book.\"\nversion: \"1.0.1\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"INVOICES_FILE\"\n    homepage: https://clawhub.ai/occupythemilkyway/tyche-lite\n    emoji: \"âï¸\"\n    tags: [invoicing, payments, billing, business, freelance, free, lite, tyche]\n    envVars:\n      - name: INVOICES_FILE\n        required: false\n        description: \"Path to invoices CSV (client_name, client_email, description, amount, due_date, status). Max 5 rows in Lite.\"\n        default: \"\"\n      - name: YOUR_NAME\n        required: false\n        description: Your name or company\n        default: \"Your Name\"\n      - name: CURRENCY\n        required: false\n        description: \"Currency: USD, EUR, GBP\"\n        default: \"USD\"\n---\n\n# Tyche Lite â Free Invoice Preview\n\nTrack up to 5 invoices and get a friendly reminder template.\n\n## Free vs Pro\n\n| Feature | Tyche Lite (Free) | Tyche Pro |\n|---------|------------------|-----------|\n| Invoices | **5 max** | Unlimited |\n| Tax calculation | â | â |\n| Late fee calculation | â | â |\n| Reminder tiers | 1 (friendly only) | 3 tiers |\n| Multi-currency | â | â |\n| Project grouping | â | â |\n| Aged receivables | â | â 30/60/90d |\n| Analytics export | â | â |\n\nð **Upgrade:** `openclaw skills install tyche-pro` â key at **ko-fi.com/occupythemilkyway**\n\n---\n\n## Step 1 â Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 â Invoice overview (Lite)\n\n```python\nimport os, csv, re\nfrom datetime import datetime, timedelta\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nINVOICES_FILE = os.environ.get(\"INVOICES_FILE\",\"\").strip()\nYOUR_NAME     = os.environ.get(\"YOUR_NAME\",\"Your Name\")\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"â¬\",\"GBP\":\"Â£\"}.get(CURRENCY,\"$\")\nINVOICE_LIMIT = 5  # Lite cap\nnow           = datetime.now()\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\ndef parse_amount(r):\n    c = re.sub(r\"[^0-9.]\",\"\",str(r)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else 0.0\n    except: return 0.0\ndef parse_date(raw):\n    for f in (\"%Y-%m-%d\",\"%m/%d/%Y\",\"%d/%m/%Y\"):\n        try: return datetime.strptime(raw.strip(),f)\n        except: pass\n    return None\n\ninvoices = []\nif INVOICES_FILE and os.path.exists(INVOICES_FILE):\n    with open(INVOICES_FILE,encoding=\"utf-8\",errors=\"replace\") as f:\n        reader = csv.DictReader(f)\n        for i,row in enumerate(reader,1):\n            if i > INVOICE_LIMIT:\n                console.print(f\"[yellow]â ï¸  Lite limit: showing first {INVOICE_LIMIT} invoices only. Upgrade to Pro for unlimited.[/yellow]\")\n                break\n            rk = {k.lower().strip():v.strip() for k,v in row.items()}\n            invoices.append({\n                \"inv_number\":   rk.get(\"inv_number\",f\"INV-{i:04d}\"),\n                \"client_name\":  rk.get(\"client_name\",\"Client\"),\n                \"client_email\": rk.get(\"client_email\",\"\"),\n                \"description\":  rk.get(\"description\",\"Services\"),\n                \"amount\":       parse_amount(rk.get(\"amount\",\"0\")),\n                \"due_date\":     rk.get(\"due_date\",\"\"),\n                \"status\":       rk.get(\"status\",\"unpaid\").lower(),\n            })\nelse:\n    console.print(\"[yellow]â¹ï¸  No INVOICES_FILE â using demo data.[/yellow]\\n\")\n    invoices = [\n        {\"inv_number\":\"INV-0001\",\"client_name\":\"Acme Corp\",\"client_email\":\"billing@acme.com\",\"description\":\"Website redesign\",\"amount\":2500,\"due_date\":(now-timedelta(days=15)).strftime(\"%Y-%m-%d\"),\"status\":\"overdue\"},\n        {\"inv_number\":\"INV-0002\",\"client_name\":\"Globex Inc\",\"client_email\":\"ap@globex.com\",\"description\":\"Consulting\",\"amount\":1800,\"due_date\":(now+timedelta(days=10)).strftime(\"%Y-%m-%d\"),\"status\":\"unpaid\"},\n        {\"inv_number\":\"INV-0003\",\"client_name\":\"Initech Ltd\",\"client_email\":\"pay@initech.com\",\"description\":\"Logo design\",\"amount\":750,\"due_date\":(now-timedelta(days=5)).strftime(\"%Y-%m-%d\"),\"status\":\"paid\"},\n    ]\n\nfor inv in invoices:\n    due = parse_date(inv[\"due_date\"])\n    inv[\"due_dt\"]    = due\n    inv[\"days_late\"] = max(0,(now-due).days) if due and inv[\"status\"] in (\"overdue\",\"unpaid\") else 0\n\ntotal_invoiced    = sum(i[\"amount\"] for i in invoices)\ntotal_paid        = sum(i[\"amount\"] for i in invoices if i[\"status\"]==\"paid\")\ntotal_outstanding = total_invoiced - total_paid\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold yellow]âï¸  Tyche Lite â Invoice Overview[/bold yellow]\\n\"\n    f\"Invoiced: [white]{fmt(total_invoiced)}[/white]  Paid: [green]{fmt(total_paid)}[/green]  Outstanding: [red]{fmt(total_outstanding)}[/red]\\n\"\n    f\"[dim]Lite: showing {len(invoices)}/{INVOICE_LIMIT} invoices max[/dim]\",\n    border_style=\"yellow\"\n))\n\nSC = {\"paid\":\"green\",\"unpaid\":\"yellow\",\"overdue\":\"red\",\"partial\":\"cyan\"}\nconsole.print()\ntbl = Table(title=\"Invoice Status\", box=box.ROUNDED, border_style=\"yellow\")\ntbl.add_column(\"Inv #\",   width=10, style=\"dim\")\ntbl.add_column(\"Client\",  width=18, style=\"cyan\")\ntbl.add_column(\"Amount\",  width=12, justify=\"right\")\ntbl.add_column(\"Due\",     width=12, style=\"dim\")\ntbl.add_column(\"Late\",    width=8,  style=\"red\", justify=\"right\")\ntbl.add_column(\"Status\",  width=10)\nfor inv in sorted(invoices, key=lambda x: -(x[\"days_late\"] or 0)):\n    sc   = SC.get(inv[\"status\"],\"white\")\n    late = f\"{inv['days_late']}d\" if inv[\"days_late\"] else \"â\"\n    tbl.add_row(inv[\"inv_number\"],inv[\"client_name\"][:16],fmt(inv[\"amount\"]),inv[\"due_date\"],late,f\"[{sc}]{inv['status'].title()}[/{sc}]\")\nconsole.print(tbl)\n\n# 1 reminder (Lite: friendly only)\noverdue = [i for i in invoices if i[\"days_late\"] > 0]\nif overdue:\n    inv = overdue[0]\n    console.print()\n    console.print(Panel(\n        f\"To: {inv['client_email']}\\nSubject: Friendly Reminder â Invoice {inv['inv_number']}\\n\\n\"\n        f\"Dear {inv['client_name']},\\n\\n\"\n        f\"I hope you're well. Invoice {inv['inv_number']} for {fmt(inv['amount'])} was due {inv['due_date']}. \"\n        f\"Could you confirm when payment will be processed?\\n\\n\"\n        f\"Kind regards,\\n{YOUR_NAME}\",\n        title=f\"[yellow]Friendly Reminder â {inv['client_name']} ({inv['days_late']}d overdue)[/yellow]\",\n        border_style=\"yellow\"\n    ))\n    if len(overdue) > 1:\n        console.print(f\"[dim]+ {len(overdue)-1} more overdue invoice(s) â upgrade to Pro for all reminder tiers.[/dim]\")\n\nconsole.print()\nconsole.print(Panel(\n    f\"[bold yellow]ð Want more?[/bold yellow]\\n\\n\"\n    f\"Tyche Pro handles [bold]unlimited invoices[/bold], calculates [bold]late fees & tax[/bold], \"\n    f\"sends [bold]3-tier reminders[/bold], groups by project, and gives you an aged receivables dashboard.\\n\\n\"\n    f\"[bold cyan]openclaw skills install tyche-pro[/bold cyan]\\n\"\n    f\"Get your key â [bold]ko-fi.com/occupythemilkyway[/bold]\",\n    title=\"Upgrade to Tyche Pro\",\n    border_style=\"cyan\"\n))\n```\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"tyche-lite\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1778977081755\n}\n\nArchive v1.0.0: 2 files, 3253 bytes\n\nFiles: SKILL.md (7260b), _meta.json (129b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: tyche-lite\ndescription: \"Tyche Lite â Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Tyche Pro does for your full client book.\"\nversion: \"1.0.0\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"INVOICES_FILE\"\n    homepage: https://clawhub.ai/occupythemilkyway/tyche-lite\n    emoji: \"âï¸\"\n    tags: [invoicing, payments, billing, business, freelance, free, lite, tyche]\n    envVars:\n      - name: INVOICES_FILE\n        required: false\n        description: \"Path to invoices CSV (client_name, client_email, description, amount, due_date, status). Max 5 rows in Lite.\"\n        default: \"\"\n      - name: YOUR_NAME\n        required: false\n        description: Your name or company\n        default: \"Your Name\"\n      - name: CURRENCY\n        required: false\n        description: \"Currency: USD, EUR, GBP\"\n        default: \"USD\"\n---\n\n# Tyche Lite â Free Invoice Preview\n\nTrack up to 5 invoices and get a friendly reminder template.\n\n## Free vs Pro\n\n| Feature | Tyche Lite (Free) | Tyche Pro |\n|---------|------------------|-----------|\n| Invoices | **5 max** | Unlimited |\n| Tax calculation | â | â |\n| Late fee calculation | â | â |\n| Reminder tiers | 1 (friendly only) | 3 tiers |\n| Multi-currency | â | â |\n| Project grouping | â | â |\n| Aged receivables | â | â 30/60/90d |\n| Analytics export | â | â |\n\nð **Upgrade:** `openclaw skills install tyche-pro` â key at **ko-fi.com/occupythemilkyway**\n\n---\n\n## Step 1 â Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 â Invoice overview (Lite)\n\n```python\nimport os, csv, re\nfrom datetime import datetime, timedelta\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nINVOICES_FILE = os.environ.get(\"INVOICES_FILE\",\"\").strip()\nYOUR_NAME     = os.environ.get(\"YOUR_NAME\",\"Your Name\")\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"â¬\",\"GBP\":\"Â£\"}.get(CURRENCY,\"$\")\nINVOICE_LIMIT = 5  # Lite cap\nnow           = datetime.now()\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\ndef parse_amount(r):\n    c = re.sub(r\"[^0-9.]\",\"\",str(r)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else 0.0\n    except: return 0.0\ndef parse_date(raw):\n    for f in (\"%Y-%m-%d\",\"%m/%d/%Y\",\"%d/%m/%Y\"):\n        try: return datetime.strptime(raw.strip(),f)\n        except: pass\n    return None\n\ninvoices = []\nif INVOICES_FILE and os.path.exists(INVOICES_FILE):\n    with open(INVOICES_FILE,encoding=\"utf-8\",errors=\"replace\") as f:\n        reader = csv.DictReader(f)\n        for i,row in enumerate(reader,1):\n            if i > INVOICE_LIMIT:\n                console.print(f\"[yellow]â ï¸  Lite limit: showing first {INVOICE_LIMIT} invoices only. Upgrade to Pro for unlimited.[/yellow]\")\n                break\n            rk = {k.lower().strip():v.strip() for k,v in row.items()}\n            invoices.append({\n                \"inv_number\":   rk.get(\"inv_number\",f\"INV-{i:04d}\"),\n                \"client_name\":  rk.get(\"client_name\",\"Client\"),\n                \"client_email\": rk.get(\"client_email\",\"\"),\n                \"description\":  rk.get(\"description\",\"Services\"),\n                \"amount\":       parse_amount(rk.get(\"amount\",\"0\")),\n                \"due_date\":     rk.get(\"due_date\",\"\"),\n                \"status\":       rk.get(\"status\",\"unpaid\").lower(),\n            })\nelse:\n    console.print(\"[yellow]â¹ï¸  No INVOICES_FILE â using demo data.[/yellow]\\n\")\n    invoices = [\n        {\"inv_number\":\"INV-0001\",\"client_name\":\"Acme Corp\",\"client_email\":\"billing@acme.com\",\"description\":\"Website redesign\",\"amount\":2500,\"due_date\":(now-timedelta(days=15)).strftime(\"%Y-%m-%d\"),\"status\":\"overdue\"},\n        {\"inv_number\":\"INV-0002\",\"client_name\":\"Globex Inc\",\"client_email\":\"ap@globex.com\",\"description\":\"Consulting\",\"amount\":1800,\"due_date\":(now+timedelta(days=10)).strftime(\"%Y-%m-%d\"),\"status\":\"unpaid\"},\n        {\"inv_number\":\"INV-0003\",\"client_name\":\"Initech Ltd\",\"client_email\":\"pay@initech.com\",\"description\":\"Logo design\",\"amount\":750,\"due_date\":(now-timedelta(days=5)).strftime(\"%Y-%m-%d\"),\"status\":\"paid\"},\n    ]\n\nfor inv in invoices:\n    due = parse_date(inv[\"due_date\"])\n    inv[\"due_dt\"]    = due\n    inv[\"days_late\"] = max(0,(now-due).days) if due and inv[\"status\"] in (\"overdue\",\"unpaid\") else 0\n\ntotal_invoiced    = sum(i[\"amount\"] for i in invoices)\ntotal_paid        = sum(i[\"amount\"] for i in invoices if i[\"status\"]==\"paid\")\ntotal_outstanding = total_invoiced - total_paid\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold yellow]âï¸  Tyche Lite â Invoice Overview[/bold yellow]\\n\"\n    f\"Invoiced: [white]{fmt(total_invoiced)}[/white]  Paid: [green]{fmt(total_paid)}[/green]  Outstanding: [red]{fmt(total_outstanding)}[/red]\\n\"\n    f\"[dim]Lite: showing {len(invoices)}/{INVOICE_LIMIT} invoices max[/dim]\",\n    border_style=\"yellow\"\n))\n\nSC = {\"paid\":\"green\",\"unpaid\":\"yellow\",\"overdue\":\"red\",\"partial\":\"cyan\"}\nconsole.print()\ntbl = Table(title=\"Invoice Status\", box=box.ROUNDED, border_style=\"yellow\")\ntbl.add_column(\"Inv #\",   width=10, style=\"dim\")\ntbl.add_column(\"Client\",  width=18, style=\"cyan\")\ntbl.add_column(\"Amount\",  width=12, justify=\"right\")\ntbl.add_column(\"Due\",     width=12, style=\"dim\")\ntbl.add_column(\"Late\",    width=8,  style=\"red\", justify=\"right\")\ntbl.add_column(\"Status\",  width=10)\nfor inv in sorted(invoices, key=lambda x: -(x[\"days_late\"] or 0)):\n    sc   = SC.get(inv[\"status\"],\"white\")\n    late = f\"{inv['days_late']}d\" if inv[\"days_late\"] else \"â\"\n    tbl.add_row(inv[\"inv_number\"],inv[\"client_name\"][:16],fmt(inv[\"amount\"]),inv[\"due_date\"],late,f\"[{sc}]{inv['status'].title()}[/{sc}]\")\nconsole.print(tbl)\n\n# 1 reminder (Lite: friendly only)\noverdue = [i for i in invoices if i[\"days_late\"] > 0]\nif overdue:\n    inv = overdue[0]\n    console.print()\n    console.print(Panel(\n        f\"To: {inv['client_email']}\\nSubject: Friendly Reminder â Invoice {inv['inv_number']}\\n\\n\"\n        f\"Dear {inv['client_name']},\\n\\n\"\n        f\"I hope you're well. Invoice {inv['inv_number']} for {fmt(inv['amount'])} was due {inv['due_date']}. \"\n        f\"Could you confirm when payment will be processed?\\n\\n\"\n        f\"Kind regards,\\n{YOUR_NAME}\",\n        title=f\"[yellow]Friendly Reminder â {inv['client_name']} ({inv['days_late']}d overdue)[/yellow]\",\n        border_style=\"yellow\"\n    ))\n    if len(overdue) > 1:\n        console.print(f\"[dim]+ {len(overdue)-1} more overdue invoice(s) â upgrade to Pro for all reminder tiers.[/dim]\")\n\nconsole.print()\nconsole.print(Panel(\n    f\"[bold yellow]ð Want more?[/bold yellow]\\n\\n\"\n    f\"Tyche Pro handles [bold]unlimited invoices[/bold], calculates [bold]late fees & tax[/bold], \"\n    f\"sends [bold]3-tier reminders[/bold], groups by project, and gives you an aged receivables dashboard.\\n\\n\"\n    f\"[bold cyan]openclaw skills install tyche-pro[/bold cyan]\\n\"\n    f\"Get your key â [bold]ko-fi.com/occupythemilkyway[/bold]\",\n    title=\"Upgrade to Tyche Pro\",\n    border_style=\"cyan\"\n))\n```\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"tyche-lite\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1778429180259\n}","readmeExcerpt":"Skill: Tyche Lite — Quick Invoice Preview Owner: occupythemilkyway Summary: Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Ty... Tags: billing:1.0.0, business:1.0.0, free:1.0.0, freelance:1.0.0, invoicing:1.0.0, latest:1.0.4, lite:1.0.0, payments:1.0.0, tyche:1.0.0 Version history: v1.0.4 | 2026-05-24T18:56:52.","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"pip3 install rich --break-system-packages --quiet"},{"language":"python","snippet":"import os, csv, re\nfrom datetime import datetime, timedelta\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nINVOICES_FILE = os.environ.get(\"INVOICES_FILE\",\"\").strip()\nYOUR_NAME     = os.environ.get(\"YOUR_NAME\",\"Your Name\")\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"€\",\"GBP\":\"£\"}.get(CURRENCY,\"$\")\nINVOICE_LIMIT = 5  # Lite cap\nnow           = datetime.now()\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\ndef parse_amount(r):\n    c = re.sub(r\"[^0-9.]\",\"\",str(r)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else 0.0\n    except: return 0.0\ndef parse_date(raw):\n    for f in (\"%Y-%m-%d\",\"%m/%d/%Y\",\"%d/%m/%Y\"):\n        try: return datetime.strptime(raw.strip(),f)\n        except: pass\n    return None\n\ninvoices = []\nif INVOICES_FILE and os.path.exists(INVOICES_FILE):\n    with open(INVOICES_FILE,encoding=\"utf-8\",errors=\"replace\") as f:\n        reader = csv.DictReader(f)\n        for i,row in enumerate(reader,1):\n            if i > INVOICE_LIMIT:\n                console.print(f\"[yellow]⚠️  Lite limit: showing first {INVOICE_LIMIT} invoices only. Upgrade to Pro for unlimited.[/yellow]\")\n                break\n            rk = {k.lower().strip():v.strip() for k,v in row.items()}\n            invoices.append({\n                \"inv_number\":   rk.get(\"inv_number\",f\"INV-{i:04d}\"),\n                \"client_name\":  rk.get(\"client_name\",\"Client\"),\n                \"client_email\": rk.get(\"client_email\",\"\"),\n                \"description\":  rk.get(\"description\",\"Services\"),\n                \"amount\":       parse_amount(rk.get(\"amount\",\"0\")),\n                \"due_date\":     rk.get(\"due_date\",\"\"),\n                \"status\":       rk.get(\"status\",\"unpaid\").lower(),\n            })\nelse:\n    console.print(\"[yellow]ℹ️  No INVOICES_FILE — using demo data.[/yellow]\\n\")\n    invoices = [\n        {\"inv_number\":\"INV-0001\",\"client_name\":\"Acme Corp\",\"client_email\":\"billing@acme.com\""},{"language":"bash","snippet":"pip3 install rich --break-system-packages --quiet"},{"language":"python","snippet":"import os, csv, re\nfrom datetime import datetime, timedelta\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nINVOICES_FILE = os.environ.get(\"INVOICES_FILE\",\"\").strip()\nYOUR_NAME     = os.environ.get(\"YOUR_NAME\",\"Your Name\")\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"â¬\",\"GBP\":\"Â£\"}.get(CURRENCY,\"$\")\nINVOICE_LIMIT = 5  # Lite cap\nnow           = datetime.now()\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\ndef parse_amount(r):\n    c = re.sub(r\"[^0-9.]\",\"\",str(r)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else 0.0\n    except: return 0.0\ndef parse_date(raw):\n    for f in (\"%Y-%m-%d\",\"%m/%d/%Y\",\"%d/%m/%Y\"):\n        try: return datetime.strptime(raw.strip(),f)\n        except: pass\n    return None\n\ninvoices = []\nif INVOICES_FILE and os.path.exists(INVOICES_FILE):\n    with open(INVOICES_FILE,encoding=\"utf-8\",errors=\"replace\") as f:\n        reader = csv.DictReader(f)\n        for i,row in enumerate(reader,1):\n            if i > INVOICE_LIMIT:\n                console.print(f\"[yellow]â ï¸  Lite limit: showing first {INVOICE_LIMIT} invoices only. Upgrade to Pro for unlimited.[/yellow]\")\n                break\n            rk = {k.lower().strip():v.strip() for k,v in row.items()}\n            invoices.append({\n                \"inv_number\":   rk.get(\"inv_number\",f\"INV-{i:04d}\"),\n                \"client_name\":  rk.get(\"client_name\",\"Client\"),\n                \"client_email\": rk.get(\"client_email\",\"\"),\n                \"description\":  rk.get(\"description\",\"Services\"),\n                \"amount\":       parse_amount(rk.get(\"amount\",\"0\")),\n                \"due_date\":     rk.get(\"due_date\",\"\"),\n                \"status\":       rk.get(\"status\",\"unpaid\").lower(),\n            })\nelse:\n    console.print(\"[yellow]â¹ï¸  No INVOICES_FILE â using demo data.[/yellow]\\n\")\n    invoices = [\n        {\"inv_number\":\"INV-0001\",\"client_name\":\"Acme Corp\",\"client_email\":\"bill"},{"language":"bash","snippet":"pip3 install rich --break-system-packages --quiet"},{"language":"python","snippet":"import os, csv, re\nfrom datetime import datetime, timedelta\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nINVOICES_FILE = os.environ.get(\"INVOICES_FILE\",\"\").strip()\nYOUR_NAME     = os.environ.get(\"YOUR_NAME\",\"Your Name\")\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"â¬\",\"GBP\":\"Â£\"}.get(CURRENCY,\"$\")\nINVOICE_LIMIT = 5  # Lite cap\nnow           = datetime.now()\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\ndef parse_amount(r):\n    c = re.sub(r\"[^0-9.]\",\"\",str(r)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else 0.0\n    except: return 0.0\ndef parse_date(raw):\n    for f in (\"%Y-%m-%d\",\"%m/%d/%Y\",\"%d/%m/%Y\"):\n        try: return datetime.strptime(raw.strip(),f)\n        except: pass\n    return None\n\ninvoices = []\nif INVOICES_FILE and os.path.exists(INVOICES_FILE):\n    with open(INVOICES_FILE,encoding=\"utf-8\",errors=\"replace\") as f:\n        reader = csv.DictReader(f)\n        for i,row in enumerate(reader,1):\n            if i > INVOICE_LIMIT:\n                console.print(f\"[yellow]â ï¸  Lite limit: showing first {INVOICE_LIMIT} invoices only. Upgrade to Pro for unlimited.[/yellow]\")\n                break\n            rk = {k.lower().strip():v.strip() for k,v in row.items()}\n            invoices.append({\n                \"inv_number\":   rk.get(\"inv_number\",f\"INV-{i:04d}\"),\n                \"client_name\":  rk.get(\"client_name\",\"Client\"),\n                \"client_email\": rk.get(\"client_email\",\"\"),\n                \"description\":  rk.get(\"description\",\"Services\"),\n                \"amount\":       parse_amount(rk.get(\"amount\",\"0\")),\n                \"due_date\":     rk.get(\"due_date\",\"\"),\n                \"status\":       rk.get(\"status\",\"unpaid\").lower(),\n            })\nelse:\n    console.print(\"[yellow]â¹ï¸  No INVOICES_FILE â using demo data.[/yellow]\\n\")\n    invoices = [\n        {\"inv_number\":\"INV-0001\",\"client_name\":\"Acme Corp\",\"client_email\":\"bill"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: tyche-lite\ndescription: \"Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Tyche Pro does for your full client book.\"\nversion: \"1.0.4\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"INVOICES_FILE\"\n    homepage: https://clawhub.ai/occupythemilkyway/tyche-lite\n    emoji: \"⚖️\"\n    tags: [invoicing, payments, billing, business, freelance, free, lite, tyche]\n    envVars:\n      - name: INVOICES_FILE\n        required: false\n        description: \"Path to invoices CSV (client_name, client_email, description, amount, due_date, status). Max 5 rows in Lite.\"\n        default: \"\"\n      - name: YOUR_NAME\n        required: false\n        description: Your name or company\n        default: \"Your Name\"\n      - name: CURRENCY\n        required: false\n        description: \"Currency: USD, EUR, GBP\"\n        default: \"USD\"\n---\n\n# Tyche Lite — Free Invoice Preview\n\nTrack up to 5 invoices and get a friendly reminder template.\n\n## Free vs Pro\n\n| Feature | Tyche Lite (Free) | Tyche Pro |\n|---------|------------------|-----------|\n| Invoices | **5 max** | Unlimited |\n| Tax calculation | ❌ | ✅ |\n| Late fee calculation | ❌ | ✅ |\n| Reminder tiers | 1 (friendly only) | 3 tiers |\n| Multi-currency | ❌ | ✅ |\n| Project grouping | ❌ | ✅ |\n| Aged receivables | ❌ | ✅ 30/60/90d |\n| Analytics export | ❌ | ✅ |\n\n👉 **Upgrade:** `openclaw skills install tyche-pro` — key at **ko-fi.com/s/4e0d922f4c**\n\n💰 **Bundle deal:** all 5 Pro skills for **$29** → **ko-fi.com/s/7625accf3f** (save $16)\n\n---\n\n## Step 1 — Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 — Invoice overview (Lite)\n\n```python\nimport os, csv, re\nfrom datetime import datetime, timedelta\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nINVOICES_FILE = os.environ.get(\"INVOICES_FILE\",\"\").strip()\nYOUR_NAME     = os.environ.get(\"YOUR_NAME\",\"Your Name\")\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"€\",\"GBP\":\"£\"}.get(CURRENCY,\"$\")\nINVOICE_LIMIT = 5  # Lite cap\nnow           = datetime.now()\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\ndef parse_amount(r):\n    c = re.sub(r\"[^0-9.]\",\"\",str(r)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else 0.0\n    except: return 0.0\ndef parse_date(raw):\n    for f in (\"%Y-%m-%d\",\"%m/%d/%Y\",\"%d/%m/%Y\"):\n        try: return datetime.strptime(raw.strip(),f)\n        except: pass\n    return None\n\ninvoices = []\nif INVOICES_FILE and os.path.exists(INVOICES_FILE):\n    with open(INVOICES_FILE,encoding=\"utf-8\",errors=\"replace\") as f:\n        reader = csv.DictReader(f)\n        for i,row in enumerate(reader,1):\n            if i > INVOICE_LIMIT:\n                console.print(f\"[yellow]⚠️  Lite limit: showing first {INVOICE_LIMIT} invoices only. Upgrade to Pro for unlimited.[/yellow]\")\n         "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"tyche-lite\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1779649012530\n}"},{"path":"skill-card.md","content":"## Description:\n\nTyche Lite previews up to five invoices from a CSV, summarizes payment status, and drafts one friendly overdue-payment reminder.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[occupythemilkyway](https://clawhub.ai/user/occupythemilkyway)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users, freelancers, and small businesses use this skill to preview invoice status from a small CSV file and generate a friendly reminder for an overdue invoice. It is intended as a lightweight invoice-review helper rather than a full receivables workflow.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The provided dependency install command uses an overly broad system-package flag.\n\nMitigation: Install dependencies in a virtual environment and avoid running the command against system Python.\n\nRisk: The skill includes visible upsell messaging and a Ko-fi purchase link.\n\nMitigation: Treat Tyche Pro and the purchase link as separate decisions from the invoice-preview task.\n\nRisk: Invoice CSV content may include client names, emails, amounts, and payment status.\n\nMitigation: Review generated output before sharing it and avoid pasting sensitive invoice data into unrelated workflows.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/occupythemilkyway/skills/tyche-lite)\n- [ClawHub metadata homepage](https://clawhub.ai/occupythemilkyway/tyche-lite)\n- [Publisher profile](https://clawhub.ai/user/occupythemilkyway)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with shell and Python code blocks]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reads an optional invoice CSV through INVOICES_FILE and limits Lite previews to five invoices.]\n\n## Skill Version(s):\n\n1.0.4 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Ty... Skill: Tyche Lite — Quick Invoice Preview Owner: occupythemilkyway Summary: Tyche Lite — Invoice Tracker (Free). Process up to 5 invoices from a CSV, see payment status, and get a friendly reminder template. A free preview of what Ty... Tags: billing:1.0.0, business:1.0.0, free:1.0.0, freelance:1.0.0, invoicing:1.0.0, latest:1.0.4, lite:1.0.0, payments:1.0.0, tyche:1.0.0 Version history: v1.0.4 | 2026-05-24T18:56:52.","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1098,"uniquenessScore":51,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T00:30:42.282Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-12T00:30:42.282Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-14T15:13:03.412Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}