+---------+
███████╗ █████╗ ███████╗██╗ ██╗ | ███████ |
██╔════╝██╔══██╗██╔════╝╚██╗ ██╔╝ |██ ██|
█████╗ ███████║███████╗ ╚████╔╝ | ███████ |
██╔══╝ ██╔══██║╚════██║ ╚██╔╝ |██ ██|
███████╗██║ ██║███████║ ██║ | ███████ |
╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ +---------+
Small Go CLI for Easy8. Current scope: Issues and Product Backlog Items (PBIs).
- Easy8 API key
- Go 1.22+ only when building from source
curl -fsSL https://raw.githubusercontent.com/Easy8Com/easy8-cli/main/scripts/install.sh | bashirm https://raw.githubusercontent.com/Easy8Com/easy8-cli/main/scripts/install.ps1 | iexThe installers detect OS/architecture, download the matching binary from GitHub Releases, and verify SHA-256 checksums.
If easy8 is not found after installation, restart the terminal or make sure the install directory is on your PATH.
Run the setup wizard once:
easy8 setupThe wizard saves the Easy8 base URL and API key to a YAML config file. It also asks whether to enable automatic daily updates and defaults to yes.
For scripts and CI, use non-interactive setup:
easy8 setup --non-interactive --global --base-url "https://demo.easy8.com" --api-key "<your-key>"
easy8 setup --non-interactive --local --base-url "https://demo.easy8.com" --api-key "<your-key>"Or configure with environment variables:
export EASY8_BASE_URL="https://demo.easy8.com"
export EASY8_API_KEY="<your-key>"easy8 issue list --limit 10| Command | Purpose |
|---|---|
easy8 issue create |
Create an issue |
easy8 issue show |
Show issue detail |
easy8 issue list |
List issues |
easy8 issue search |
Search issues |
easy8 issue update |
Update an issue |
easy8 pbi list |
List product backlog items |
easy8 pbi show |
Show PBI detail |
easy8 pbi update |
Update a PBI |
easy8 auth status |
Show authentication status |
easy8 auth login |
Save API key |
easy8 auth logout |
Remove API key |
easy8 setup |
Configure base URL, API key, defaults, and autoupdate |
easy8 skill |
Print/install bundled agent skills |
easy8 commands |
Print command catalog for agents |
easy8 update |
Update easy8 from GitHub Releases |
easy8 version |
Print version |
Config files:
- Global:
~/.config/easy8/config.yaml - Local:
.easy8.yamlin the current directory or a parent directory
Load priority, highest first:
- Environment variables
- Local config
.easy8.yaml - Global config
~/.config/easy8/config.yaml - Built-in defaults
Environment variables:
export EASY8_BASE_URL="https://demo.easy8.com"
export EASY8_API_KEY="<your-key>"
export EASY8_AUTOUPDATE=trueOptional default IDs for issue create:
export EASY8_DEFAULT_PROJECT_ID=1
export EASY8_DEFAULT_TRACKER_ID=1
export EASY8_DEFAULT_STATUS_ID=1
export EASY8_DEFAULT_PRIORITY_ID=1
export EASY8_DEFAULT_AUTHOR_ID=1
export EASY8_DEFAULT_ASSIGNED_TO_ID=1The same defaults can be saved through setup flags:
easy8 setup --non-interactive --global \
--base-url "https://demo.easy8.com" \
--api-key "<your-key>" \
--project-id 1 \
--tracker-id 1 \
--status-id 1 \
--priority-id 1 \
--author-id 1 \
--assigned-to-id 1Invalid integer and boolean environment values produce a warning on stderr.
easy8 issue list --limit 10
easy8 issue list --limit 10 --sort "priority:desc,due_date"
easy8 issue list --q "onboarding"easy8 issue show 123
easy8 issue show 123 --include journals,attachments
easy8 issue show 123 --json
easy8 issue show 123 --quieteasy8 issue show --id 123 is also supported for compatibility.
Fulltext search:
easy8 issue search --q "onboarding"Search with ID filters:
easy8 issue search --q "petr" --assignee-id 51 --status-id 2 --priority-id 3 --due-date 2024-01-10 --subject "Login" --task-type-id 1Search with name lookups:
easy8 issue search --q "petr" --assignee "Alice Doe" --status "New" --priority "High" --task-type "Task" --project "Project A"For assignee, status, priority, task type, and project you can use either name or ID.
The Easy8 API requires these fields when creating an issue: subject, project_id, tracker_id, status_id, priority_id, author_id, and assigned_to_id.
easy8 issue create \
--subject "Fix onboarding" \
--project-id 1 \
--tracker-id 1 \
--status-id 1 \
--priority-id 1 \
--author-id 1 \
--assigned-to-id 2 \
--description "Short summary" \
--done-ratio 0With attachments:
easy8 issue create \
--subject "Fix onboarding" \
--project-id 1 \
--tracker-id 1 \
--status-id 1 \
--priority-id 1 \
--author-id 1 \
--assigned-to-id 2 \
--attachment ./spec.pdf \
--attachment-description "Specification" \
--attachment ./build.logeasy8 issue update 123 --status-id 5 --done-ratio 80
easy8 issue update 123 --subject "New subject"
easy8 issue update 123 --notes "Progress update"
easy8 issue update 123 --attachment ./error.log
easy8 issue update 123 --attachment ./screenshot.png --attachment-description "Failure screenshot"easy8 issue update --id 123 --status-id 5 is also supported for compatibility.
Issue update notes:
--done-ratiomust be between 0 and 100.--attachmentcan be repeated.--attachment-descriptionis optional and applies to the immediately preceding--attachment.--notesis optional, including attachment-only updates.
easy8 pbi list --limit 10
easy8 pbi list --status to_do --board-id 17
easy8 pbi list --q "design" --author-id 51Filters: --status (to_do, realization, done, deleted), --author-id, --board-id, and --q.
easy8 pbi show 42
easy8 pbi show 42 --json
easy8 pbi show 42 --quieteasy8 pbi show --id 42 is also supported for compatibility.
easy8 pbi update 42 --status done
easy8 pbi update 42 --status done --json
easy8 pbi update 42 --name "New name" --estimate 5 --description "Details"easy8 pbi update --id 42 --status done is also supported for compatibility.
Updatable fields: --name, --description, --status, and --estimate.
Entity and helper commands support two machine-readable modes:
--json: envelope format withok,data,summary, and optionalbreadcrumbs/context--quiet: raw API-shaped JSON data
Examples:
easy8 issue list --json
easy8 issue list --quiet
easy8 issue show 123 --json
easy8 issue show 123 --quiet
easy8 pbi list --json
easy8 pbi list --quiet
easy8 pbi show 42 --json
easy8 pbi show 42 --quiet
easy8 update --json
easy8 update --quietFor a full command catalog:
easy8 commands --json
easy8 commands --quietThis repository contains bundled skill files for agent-driven Easy8 workflows:
skills/easy8-cli/SKILL.md
Print the embedded primary skill:
easy8 skillList bundled skills:
easy8 skill listInstall only the primary easy8-cli skill:
easy8 skill install --target opencode
easy8 skill install --target claude
easy8 skill install --target codex --localSync all bundled skills:
easy8 skill sync --target opencode
easy8 skill sync --target opencode --local
easy8 skill sync --target opencode --dry-runExample prompts after installing the skill:
fix issue #1234
fix pbi #42
find pbi onboarding
Update the current executable from GitHub Releases:
easy8 update
easy8 update --json
easy8 update --quietEnable or disable silent daily update checks:
easy8 setup --autoupdate
easy8 setup --autoupdate=falseWhen enabled, easy8 checks GitHub Releases at most once every 24 hours on normal command startup, verifies checksums.txt, and updates the current executable when a newer release exists.
Autoupdate state is stored in ~/.config/easy8/update-state.yaml.
Autoupdate is skipped for easy8 version, easy8 help, easy8 commands, easy8 update, and easy8 setup.
easy8 auth status
easy8 auth login --api-key "<your-key>"
easy8 auth logoutFor local auth in the current repository:
easy8 auth login --api-key "<your-key>" --local
easy8 auth logout --localgo build -o easy8 ./cmd/easy8Build with a version stamp:
go build -ldflags "-X easy8-cli/internal/cli.Version=0.1.7" -o easy8 ./cmd/easy8Run without installing:
go run ./cmd/easy8 issue list --limit 10Unit tests:
go test ./...Integration tests require a running Easy8 server:
EASY8_BASE_URL="https://demo.easy8.com" EASY8_API_KEY="<your-key>" go test -tags integration -v -timeout 600s ./internal/api/Integration tests use the //go:build integration build tag and skip automatically when EASY8_BASE_URL / EASY8_API_KEY are not set.
- Additional entities: projects, users, time entries, and more
- Config profiles
- Convenience commands: quick create, templates
MIT