1
0
Fork
You've already forked vein
0
No description
  • Rust 96.8%
  • Shell 1.8%
  • Nix 1%
  • Just 0.4%
Adam C. Stephens e58f5f698f
feat: add 'vein prompt orient' CLI entrypoint
Prints the same priming orientation text as the MCP 'orient' prompt,
so agents without MCP access can be primed via the CLI. The orient
text generation is extracted into shared orient_text/format_orient
functions used by both the MCP prompt and the CLI.
Ticket: vein-dx1d
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026年06月15日 18:15:11 -04:00
.beans feat: add 'vein prompt orient' CLI entrypoint 2026年06月15日 18:15:11 -04:00
.epi feat(test): add MCP server integration test harness 2026年03月15日 23:59:24 -04:00
.services chore: ignore sqlite wal sidecar files in vikunja service dir 2026年06月15日 18:15:10 -04:00
nix feat: add shell completion support 2026年03月21日 19:33:05 +00:00
src feat: add 'vein prompt orient' CLI entrypoint 2026年06月15日 18:15:11 -04:00
tests feat: move tasks between columns and reorder in board TUI 2026年04月08日 18:01:46 -04:00
.beans.yml feat(config): add configuration module for Vikunja env vars 2026年03月15日 23:59:08 -04:00
.envrc chore(dev): move provision script to standalone 2026年03月16日 22:40:33 -04:00
.gitignore feat(cli): add list-project-views subcommand 2026年03月15日 23:59:17 -04:00
.mcp.json fix(provision): fix empty fields in .secret.envrc 2026年03月16日 22:40:34 -04:00
AGENTS.md feat: adopt git-cliff for changelog generation 2026年03月28日 22:02:58 -04:00
Cargo.lock cargo: update 2026年06月15日 18:15:08 -04:00
Cargo.toml feat: add interactive kanban board TUI (vein board) 2026年04月08日 18:01:39 -04:00
CHANGELOG.md release: 0.4.0 2026年03月28日 22:04:59 -04:00
CLAUDE.md feat(config): add configuration module for Vikunja env vars 2026年03月15日 23:59:08 -04:00
cliff.toml feat: adopt git-cliff for changelog generation 2026年03月28日 22:02:58 -04:00
flake.lock flake.lock: Update 2026年06月07日 22:13:18 -04:00
flake.nix cargo: update deps 2026年06月07日 22:13:19 -04:00
justfile fix: use git to sign the tag 2026年03月28日 22:12:33 -04:00
LICENSE.txt license it 2026年03月17日 23:04:25 -04:00
README.md feat: support project identifiers (e.g. VEIN-3) for task references 2026年03月17日 09:16:22 -04:00

vein

Agent-focused issue tracker built on Vikunja.

Setup

1. Create a Vikunja API token

In your Vikunja instance, go to Settings > API Tokens and create a token with these permissions:

Group Permissions
projects read_one, views_buckets, views_buckets_tasks
tasks read_one, create, update
projects_views_tasks read_all
tasks_relations create
tasks_comments create
labels read_all, create
tasks_labels create

vein init also needs projects (read_all) and projects_views (read_all) to discover your project and bucket IDs. You can add these temporarily or use a broader token for setup.

2. Configure environment

Set your Vikunja connection, then run vein init to discover project and bucket IDs:

export VIKUNJA_URL="https://your-vikunja-instance.example.com"
export VIKUNJA_API_TOKEN="tk_..."
vein init

Then set all the variables it prints:

export VIKUNJA_PROJECT_ID="1"
export VIKUNJA_VIEW_ID="10"
export VIKUNJA_TODO_BUCKET_ID="2"
export VIKUNJA_INPROGRESS_BUCKET_ID="3"
export VIKUNJA_DONE_BUCKET_ID="4"

3. Connect to Claude Code

Add vein as an MCP server in your project's .mcp.json:

{
 "mcpServers": {
 "vein": {
 "command": "vein",
 "args": ["serve"],
 "env": {
 "VIKUNJA_URL": "https://your-vikunja-instance.example.com",
 "VIKUNJA_API_TOKEN": "tk_...",
 "VIKUNJA_PROJECT_ID": "1",
 "VIKUNJA_VIEW_ID": "10",
 "VIKUNJA_TODO_BUCKET_ID": "2",
 "VIKUNJA_INPROGRESS_BUCKET_ID": "3",
 "VIKUNJA_DONE_BUCKET_ID": "4"
 }
 }
 }
}

If you use direnv to manage these environment variables, you can omit the env block:

{
 "mcpServers": {
 "vein": {
 "command": "vein",
 "args": ["serve"]
 }
 }
}

Agent orientation

Vein exposes an orient MCP prompt that gives agents a complete orientation: available tools, workflow guidance, and current task state. To have your agent invoke it automatically, add this to your project's CLAUDE.md:

## Agent workflow
- **IMPORTANT**: before you do anything else, invoke the vein `orient` MCP prompt and heed its output with `/mcp__vein__orient`.

Or use tools directly from the CLI:

vein tool list-ready
vein tool get-task 42
vein tool list-tasks -f "done = false" -s "login"
vein tool create-task "Fix the bug" -d "Login is broken"
vein tool claim 42
vein tool complete 42
vein tool comment 42 "Started working on this"
vein tool update-task 42 -t "New title"
vein tool add-relation 1 2 blocked
vein tool create-label "bug"
vein tool add-label 42 1
vein tool list-labels

Development

Prerequisites

  • Nix with flakes enabled

Setup

nix develop # or use direnv
just dev # starts dev Vikunja via process-compose
direnv allow # reload env after first run to pick up the generated API token

just dev starts a local Vikunja instance on http://127.0.0.1:3456 and provisions:

  • An admin user (admin / admin)
  • A scoped API token written to .secret.envrc as VIKUNJA_API_TOKEN
  • A vein-dev project with a kanban view (To-Do, Doing, Done buckets), with VIKUNJA_PROJECT_ID and VIKUNJA_VIEW_ID written to .secret.envrc

API token scope

The provisioned token grants access to project-scoped Vikunja endpoints:

Group Permissions
projects read_all, read_one, create, update, delete, views_buckets, views_buckets_tasks
tasks read_all, read_one, create, update, delete
labels read_all, create
tasks_labels create
projects_views_tasks read_all

Global endpoints like /api/v1/tasks/all and /api/v1/user are not accessible with scoped tokens — use JWT auth (POST /api/v1/login) for those.

Commands

Command Description
just dev Start dev Vikunja (detached)
just test Run tests
just lint Run clippy
just format Format code

Config

  • Vikunja config: .services/vikunja/config.yml
  • Secrets: .secret.envrc (gitignored, loaded by direnv)
  • Process-compose: process-compose.yml