{"id":30196444,"url":"https://github.com/bdmorin/raxodus","last_synced_at":"2025-08-13T05:21:58.845Z","repository":{"id":308495443,"uuid":"1033014200","full_name":"bdmorin/raxodus","owner":"bdmorin","description":"Escape from Rackspace ticket hell - A minimal CLI for Rackspace tickets","archived":false,"fork":false,"pushed_at":"2025-08-06T07:40:52.000Z","size":79,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-06T09:12:25.302Z","etag":null,"topics":["automation","cli","n8n","python","rackspace"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/raxodus/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bdmorin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-06T07:08:06.000Z","updated_at":"2025-08-06T07:40:47.000Z","dependencies_parsed_at":"2025-08-06T09:13:20.759Z","dependency_job_id":"cc12091c-c8e1-48f0-8393-c27443e2bd93","html_url":"https://github.com/bdmorin/raxodus","commit_stats":null,"previous_names":["bdmorin/raxodus"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/bdmorin/raxodus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdmorin%2Fraxodus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdmorin%2Fraxodus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdmorin%2Fraxodus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdmorin%2Fraxodus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bdmorin","download_url":"https://codeload.github.com/bdmorin/raxodus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdmorin%2Fraxodus/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270101037,"owners_count":24527195,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","cli","n8n","python","rackspace"],"created_at":"2025-08-13T05:21:54.417Z","updated_at":"2025-08-13T05:21:58.820Z","avatar_url":"https://github.com/bdmorin.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🗡️ Raxodus\n\n[![PyPI version](https://badge.fury.io/py/raxodus.svg)](https://badge.fury.io/py/raxodus)\n[![Python versions](https://img.shields.io/pypi/pyversions/raxodus.svg)](https://pypi.org/project/raxodus/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Tests](https://github.com/bdmorin/raxodus/actions/workflows/test.yml/badge.svg)](https://github.com/bdmorin/raxodus/actions/workflows/test.yml)\n\n\u003e *\"Neither demon nor machine, but something altogether different\"* - Ultima III\n\n**Raxodus** - Escape from Rackspace ticket hell. A minimal CLI for managing Rackspace support tickets, built specifically for automation and n8n workflow integration.\n\n## 🎯 Why Raxodus?\n\nThe Rackspace ticket API is broken in numerous ways (30+ second response times, inconsistent field names, \"demo\" endpoints in production). This tool works around those issues to give you reliable ticket access.\n\n## ✨ Features\n\n- **🎫 Read-Only Ticket Access** - List and view Rackspace support tickets\n- **📊 Multiple Output Formats** - JSON, table, or CSV output  \n- **🚀 Fast \u0026 Lightweight** - Minimal dependencies, quick responses (when API allows)\n- **🔐 Secure by Design** - No CLI credential flags, environment variables only\n- **⏱️ Debug Mode** - Track API performance with timing metadata\n- **🔄 n8n Ready** - JSON output perfect for workflow automation\n- **🐚 Shell Completions** - Bash, Zsh, and Fish support\n- **💾 Smart Caching** - Work around slow API responses\n- **🛡️ Type Safe** - Pydantic models handle API inconsistencies\n\n## 📦 Installation\n\n```bash\n# Quick run without installation (recommended)\nuvx raxodus --version\n\n# Install with pip\npip install raxodus\n\n# Install with uv\nuv pip install raxodus\n```\n\n## 🚀 Quick Start\n\n### 1. Set Credentials\n\n```bash\n# Required environment variables\nexport RACKSPACE_USERNAME=\"your-username\"\nexport RACKSPACE_API_KEY=\"your-api-key\"\nexport RACKSPACE_ACCOUNT=\"123456\"  # Optional default account\n```\n\n⚠️ **Security Note**: Never pass credentials as command-line arguments. This is by design for security.\n\n### 2. Test Authentication\n\n```bash\n# Verify your credentials work\nraxodus auth test\n```\n\n### 3. List Tickets\n\n```bash\n# List all tickets (table format)\nraxodus tickets list --format table\n\n# List open tickets from last 7 days\nraxodus tickets list --status open --days 7\n\n# JSON output for automation\nraxodus tickets list --format json\n\n# CSV for spreadsheets\nraxodus tickets list --format csv \u003e tickets.csv\n\n# With debug timing info\nraxodus tickets list --debug --format json\n```\n\n### 4. Get Specific Ticket\n\n```bash\n# View single ticket\nraxodus tickets get 250625-02866\n\n# As JSON\nraxodus tickets get 250625-02866 --format json\n```\n\n## 📚 Complete Command Reference\n\n### Main Commands\n\n```bash\nraxodus --help                    # Show help\nraxodus --version                  # Show version info\n```\n\n### Authentication Commands\n\n```bash\n# Test credentials\nraxodus auth test\n\n# Example output:\n# ✓ Authentication successful\n# ✓ Token expires: 2025-01-07 15:30:00\n```\n\n### Ticket Commands\n\n```bash\n# List tickets with ALL options\nraxodus tickets list \\\n    --account 123456 \\           # Specific account (overrides env)\n    --status open \\              # Filter: open, closed, pending\n    --days 30 \\                  # Tickets from last N days\n    --page 1 \\                   # Pagination\n    --per-page 100 \\             # Results per page (max 100)\n    --format json \\              # Output: json, table, csv\n    --debug                      # Include timing metadata\n\n# Get single ticket\nraxodus tickets get TICKET-ID \\\n    --format json \\              # Output: json, table\n    --debug                      # Include timing metadata\n```\n\n### Shell Completions\n\n```bash\n# Install completions for your shell\nraxodus completion install\n\n# Or manually add to your shell config\nraxodus completion show \u003e\u003e ~/.bashrc     # Bash\nraxodus completion show \u003e\u003e ~/.zshrc      # Zsh\n```\n\n## 🔧 Configuration\n\n### Environment Variables\n\n```bash\n# Required\nRACKSPACE_USERNAME=\"your-username\"       # Your Rackspace username\nRACKSPACE_API_KEY=\"your-api-key\"        # Your API key\n\n# Optional\nRACKSPACE_ACCOUNT=\"123456\"               # Default account number\nRACKSPACE_REGION=\"us\"                    # API region (default: us)\nRAXODUS_CACHE_DIR=\"~/.cache/raxodus\"    # Cache directory\nRAXODUS_CACHE_TTL=\"300\"                 # Cache TTL in seconds\n```\n\n## 🤖 n8n Integration\n\n### Execute Command Node\n\n```json\n{\n  \"nodes\": [{\n    \"name\": \"List Tickets\",\n    \"type\": \"n8n-nodes-base.executeCommand\",\n    \"parameters\": {\n      \"command\": \"raxodus tickets list --format json --debug\",\n      \"env\": {\n        \"RACKSPACE_USERNAME\": \"={{ $credentials.rackspace.username }}\",\n        \"RACKSPACE_API_KEY\": \"={{ $credentials.rackspace.apiKey }}\",\n        \"RACKSPACE_ACCOUNT\": \"={{ $credentials.rackspace.account }}\"\n      }\n    }\n  }]\n}\n```\n\n### Process JSON Output\n\n```javascript\n// Code node to process tickets\nconst output = JSON.parse($input.item.json.stdout);\nconst openTickets = output.tickets.filter(t =\u003e t.status === 'open');\n\n// Check performance\nif (output.elapsed_seconds \u003e 30) {\n  console.warn(`Slow API response: ${output.elapsed_seconds}s`);\n}\n\nreturn openTickets;\n```\n\n### Complete n8n Workflow Example\n\n```json\n{\n  \"name\": \"Monitor Rackspace Tickets\",\n  \"nodes\": [\n    {\n      \"name\": \"Every 15 minutes\",\n      \"type\": \"n8n-nodes-base.scheduleTrigger\",\n      \"parameters\": {\n        \"rule\": {\n          \"interval\": [{\"field\": \"minutes\", \"value\": 15}]\n        }\n      }\n    },\n    {\n      \"name\": \"Get Open Tickets\",\n      \"type\": \"n8n-nodes-base.executeCommand\",\n      \"parameters\": {\n        \"command\": \"uvx raxodus tickets list --status open --format json\",\n        \"env\": {\n          \"RACKSPACE_USERNAME\": \"={{ $credentials.rackspace.username }}\",\n          \"RACKSPACE_API_KEY\": \"={{ $credentials.rackspace.apiKey }}\"\n        }\n      }\n    },\n    {\n      \"name\": \"Parse and Filter\",\n      \"type\": \"n8n-nodes-base.code\",\n      \"parameters\": {\n        \"code\": \"const data = JSON.parse($input.item.json.stdout);\\nreturn data.tickets.filter(t =\u003e t.severity === 'urgent');\"\n      }\n    },\n    {\n      \"name\": \"Send Alert\",\n      \"type\": \"n8n-nodes-base.slack\",\n      \"parameters\": {\n        \"channel\": \"#alerts\",\n        \"text\": \"Urgent ticket: {{ $json.subject }}\"\n      }\n    }\n  ]\n}\n```\n\n## 📊 Output Format Examples\n\n### JSON Format\n```json\n{\n  \"tickets\": [\n    {\n      \"ticketId\": \"250625-02866\",\n      \"subject\": \"Server connectivity issue\",\n      \"status\": \"open\",\n      \"severity\": \"normal\",\n      \"created\": \"2025-06-25T14:30:00Z\",\n      \"modified\": \"2025-06-26T09:15:00Z\"\n    }\n  ],\n  \"elapsed_seconds\": 31.5,\n  \"from_cache\": false\n}\n```\n\n### Table Format\n```\n┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┓\n┃ Ticket ID    ┃ Subject                 ┃ Status┃ Severity ┃ Modified   ┃\n┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━┩\n│ 250625-02866 │ Server connectivity...  │ open  │ normal   │ 2025-06-26 │\n└──────────────┴─────────────────────────┴───────┴──────────┴────────────┘\n```\n\n### CSV Format\n```csv\nticketId,subject,status,severity,created,modified\n250625-02866,Server connectivity issue,open,normal,2025-06-25T14:30:00Z,2025-06-26T09:15:00Z\n```\n\n## ⚠️ Known Issues \u0026 Workarounds\n\n### Rackspace API Problems\n\n1. **30+ Second Response Times** - Use `--debug` to track performance\n2. **Invalid Dates in Responses** - Pydantic models handle gracefully\n3. **Inconsistent Field Names** - Abstracted in our models\n4. **No Write Access** - API claims to support updates but returns 404\n\n### Workarounds\n\n```bash\n# Use debug flag to track slow responses\nraxodus tickets list --debug --format json\n\n# Cache results to avoid repeated slow calls\nexport RAXODUS_CACHE_TTL=600  # 10 minute cache\n\n# Use pagination for large result sets\nraxodus tickets list --page 1 --per-page 50\n```\n\n## 🛠️ Development\n\n```bash\n# Clone repository\ngit clone https://github.com/bdmorin/raxodus\ncd raxodus\n\n# Install for development\nuv pip install -e \".[dev]\"\n\n# Run tests\npytest\n\n# Check linting\nruff check src/\n\n# Build package\nuv build\n```\n\n## 🎮 Why \"Raxodus\"?\n\nLike the villain Exodus from Ultima III - neither demon nor machine, but something altogether different - Rackspace tickets exist in a frustrating limbo between automated systems and human support. This tool helps you escape that hell.\n\nEach release is named after an Ultima III character:\n- v0.1.x - \"Mondain\" (The dark wizard)\n- v0.2.x - \"Minax\" (The enchantress)\n- v0.3.x - \"Exodus\" (Neither demon nor machine)\n\n## 📝 License\n\nMIT - See [LICENSE](LICENSE) file\n\n## 🤝 Contributing\n\nPull requests welcome! Please ensure:\n- All tests pass\n- Code follows existing style\n- New features include tests\n- API workarounds are documented\n\n## ⚖️ Disclaimer\n\nThis is an **unofficial** tool and is not affiliated with or supported by Rackspace Technology. Use at your own risk.\n\n## 🐛 Issues \u0026 Support\n\n- **Bug Reports**: [GitHub Issues](https://github.com/bdmorin/raxodus/issues)\n- **Feature Requests**: [GitHub Issues](https://github.com/bdmorin/raxodus/issues)\n- **Security Issues**: Please email privately\n\n## 📈 Project Status\n\n**Current Version**: v0.1.2 (Mondain)\n\nThe tool is functional but limited by Rackspace API issues. We maintain 0.x versioning to indicate these limitations. Version 1.0 will only be released when Rackspace fixes their API.\n\nSee [CLAUDE.md](CLAUDE.md) for v1.0 release criteria.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbdmorin%2Fraxodus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbdmorin%2Fraxodus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbdmorin%2Fraxodus/lists"}