A command-line interface for interacting with the Shortcut (formerly Clubhouse) REST API v3.
- 🚀 OpenAPI-Driven: Automatically generated from Shortcut’s OpenAPI specification
- 🔧 Full CRUD Support: Create, read, update, and delete Stories, Epics, Iterations, and more
- 🎯 Generic Invoke: Call any API endpoint directly with operation-id and JSON parameters
- 📚 Built-in Documentation: Explore API endpoints and schemas without leaving the terminal
- 🎨 Pretty Output: Colorful, formatted output for better readability
- ⚡ High Performance: Async HTTP with http-kit
- Clojure 1.12+
- Java 11+
- Babashka (for build tasks)
# Clone the repository
git clone https://github.com/your-username/shortcut-cli.git
cd shortcut-cli
# Build the uberjar
bb build-jar
# Run the CLI
java -jar target/shortcut-cli.jar --helpSet your Shortcut API token as an environment variable:
export SHORTCUT_TOKEN="your-api-token-here"You can get your API token from Shortcut Settings > API Tokens.
The CLI uses μ/log for structured event logging. To enable logging:
export MULOG_ENABLED=trueThis will output structured JSON logs to the console showing API requests, errors, and more. See LOGGING.md for detailed configuration options including file output, Elasticsearch, CloudWatch, and Kafka publishers.
shortcut-cli [command] [subcommand] [options]shortcut-cli doc endpointShows a table of all available API operations with their URLs, methods, and operation IDs.
shortcut-cli doc endpoint getStoryShows detailed information about a specific API operation.
shortcut-cli doc schemaShows all available data schemas in the API.
shortcut-cli doc schema StoryShows the structure and fields of a specific schema.
Call any API endpoint directly:
shortcut-cli invoke --operation getStory --params '{"story-public-id": 12345}'Short form:
shortcut-cli invoke -o getCurrentMemberInfo -p '{}'shortcut-cli story add \
--name "Implement user authentication" \
--description "Add OAuth2 support" \
--story-type feature \
--project-id 123 \
--epic-id 456 \
--estimate 5shortcut-cli story view 12345shortcut-cli story listshortcut-cli story delete 12345shortcut-cli epic create \
--name "Q4 Authentication Epic" \
--description "Complete authentication overhaul" \
--state "in progress" \
--milestone-id 789shortcut-cli epic update \
--id 456 \
--name "Updated Epic Name" \
--state "done"shortcut-cli epic view 456shortcut-cli epic listshortcut-cli epic delete 456shortcut-cli epic stories 456shortcut-cli iteration listshortcut-cli iteration view 789shortcut-cli iteration stories 789shortcut-cli iteration delete 789shortcut-cli project listshortcut-cli project view 123shortcut-cli project stories 123shortcut-cli project delete 123shortcut-cli label listshortcut-cli label view 999shortcut-cli label stories 999shortcut-cli label epics 999shortcut-cli member listshortcut-cli member view "uuid-here"shortcut-cli member meshortcut-cli workflow listshortcut-cli workflow view 111shortcut-cli milestone listshortcut-cli milestone view 222shortcut-cli milestone epics 222bb testbb lint### Code Formatting
# Check formatting
bb fmt-check
# Auto-format code
bb fmt# Start an nREPL server
bb nrepl
# Run the CLI directly
bb main --help
bb main story list# Clean build artifacts
bb clean
# Build uberjar
bb build-jar
# Full CI pipeline (clean, lint, test)
bb cishortcut-cli/ ├── src/ │ └── shortcut_cli/ │ └── main.clj # Main CLI implementation ├── resources/ │ ├── cli.yml # CLI configuration │ └── shortcut.openapi.json # Shortcut OpenAPI spec ├── test/ # Test files ├── deps.edn # Dependencies ├── bb.edn # Babashka tasks └── readme.org # This file
The CLI is built using:
- cli-matic: Declarative CLI framework
- http-kit: Async HTTP client
- jsonista: Fast JSON parsing
- clj-yaml: YAML parsing for OpenAPI spec
- puget: Pretty printing
- bling: Terminal colors and formatting
The entire CLI is dynamically generated from Shortcut’s OpenAPI specification, ensuring it stays up-to-date with the API.
The CLI provides helpful error messages:
- 401 Unauthorized: Check your SHORTCUT_TOKEN
- 404 Not Found: Resource doesn’t exist
- 422 Unprocessable Entity: Invalid parameters
- 429 Rate Limit Exceeded: Too many requests
All errors include the full API response for debugging.
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests and linting:
bb ci - Submit a pull request
[Your chosen license here]
- Initial release
- OpenAPI-driven command generation
- Full CRUD support for Stories, Epics, Iterations, Projects
- Generic API invocation
- Built-in API documentation explorer
- Pretty formatted output