pine is a Go CLI for Taiga, built on github.com/theriverman/taigo and urfave/cli/v3.
It is aimed at people who want a local CLI for common Taiga workflows with saved context, structured output, and shell completion.
- saved Taiga instance management
- saved project management per instance
- persistent default project selection
- shell completion for
bash,zsh,fish, andpowershell - CRUD for the curated resource set:
projectsepicsuser-stories/ustasksissuesmilestoneswikiusersmesearch
- clone helpers for:
epicsuser-stories/ustasks
Download a prebuilt binary from GitHub Releases, or build from source if you prefer.
To build the current host binary locally:
make buildThe binary is written to dist/.
Print build metadata with:
pine --versionThe output includes:
- app name
- app version
- app commit
- build Go version
pine stores configuration in the platform config directory:
- Linux:
~/.config/pine/config.yaml - macOS:
~/Library/Application Support/pine/config.yaml - Windows:
%AppData%\pine\config.yaml
The YAML file stores metadata only:
- saved instance aliases
- frontend URL
- discovered API URL
- auth type
- username
- saved projects
- default project
Secrets are stored separately:
- macOS: native Keychain
- Windows: native Credential Manager
- Linux: Secret Service (
gnome-keyring) or KWallet when a desktop session exposes them; otherwise use environment variables
For development and tests, PINE_CONFIG_DIR can override the config directory.
Runtime precedence is:
- explicit CLI flags
- environment variables
- native secret storage
- saved config
Supported environment variables:
PINE_INSTANCEPINE_AUTH_TYPEPINE_USERNAMEPINE_PASSWORDPINE_TOKENPINE_CONFIG_DIR
Add a Taiga instance interactively:
pine ctx instance addpine fetches <frontend>/conf.json, requires an api key, and derives the Taiga client base URL and API version from it.
List saved instances:
pine ctx instance listSelect the active instance:
pine ctx instance use localAdd a project from the active instance:
pine ctx project addSelect the default project:
pine ctx project use demoShow the current context:
pine ctx showRemove saved context when needed:
pine ctx instance remove local
pine ctx project remove demoGenerate completion scripts with the built-in completion command:
pine completion bash
pine completion zsh
pine completion fish
pine completion powershellExamples:
source <(pine completion bash)
source <(pine completion zsh)
pine completion fish > ~/.config/fish/completions/pine.fishpine supports:
--output json--output yaml--output table
Table is the default. Use --output json when you want the full raw payload.
Tables are rendered with github.com/jedib0t/go-pretty and prefer a curated subset of the most useful fields for common resource types such as projects, epics, user stories, tasks, and milestones.
pine ctx show uses a dedicated table view that summarises the active instance, authentication settings, default project, and saved projects. Project and task tables also include related IDs alongside names where that makes cross-referencing easier.
List resources:
pine epics list
pine epics list --project=1 --status-is-closed=false
pine projects list --page=1 --page-size=10
pine projects list --mineFetch a resource:
pine epics get 7
pine projects get demo
pine wiki get homeCreate a resource:
pine us create --subject="My first user story"
pine issues create --subject="Bug report" --priority=2 --severity=3
pine milestones create --name="Sprint 1" --estimated-start=2026-03-13 --estimated-finish=2026-03-27Edit a resource:
pine us edit 42 --description="Updated description"
pine us edit 42 --from-json=/path/to/us.json --subject="CLI flags still win"
pine us edit 42 --clear descriptionClone a resource:
pine epics clone 7
pine epics clone 7 --with-related-user-stories
pine us clone 42
pine us clone 42 --with-subtasks
pine tasks clone 99
pine tasks clone 99 --user-story=42Delete a resource:
pine us delete 42
pine us delete 42 --yesBulk-create epics from JSON:
pine epics bulk-creation --json=/path/to/epics.jsonbulk-creation accepts a JSON array of strings or objects with a subject key.
- command names use kebab case
- query and payload flags expose kebab-case names
- where useful, Taiga-style aliases are also accepted, for example
--status__is_closed - project-scoped create commands fall back to the saved default project when
--projectis omitted pine projects list --minefilters projects to the current authenticated user and cannot be combined with--memberor--members- create and edit accept
--from-json; CLI flags override values from the JSON file - clone commands accept
--subjector--subject-prefix; by default the cloned subject is prefixed withCopy of pine us clone --with-subtasksclones the user story and recreates its related tasks under the cloned user storypine epics clone --with-related-user-storiesclones the epic, clones each related user story, and links the cloned user stories to the cloned epicpine tasks clone --user-story=<id>clones a task directly into a different user story
- this milestone intentionally focuses on curated endpoints rather than the entire Taiga API surface
resolver, attachments, import/export, and other admin-heavy or specialised endpoints are not included yet- Linux native secret storage requires a running Secret Service or KWallet session; otherwise provide credentials through environment variables
edituses merged-update behaviour; explicit field clearing is handled through--clear
Contributor and development workflow documentation lives in CONTRIBUTE.md.