Acahti v0.16.2
EN中文GitHubSelf-host

AcahtiUse Acahti

CLI

The acahti command-line client for shell agents, scripts, and pipeline jobs. Install from npm, set a host and a token, run the loop.

acahti is a thin client for <instance>/acahti/v1, the same catalog MCP uses. IDE agents (Codex, Cursor, Claude Code) keep MCP and do not need this package. Shell agents, pipeline jobs, and people at a terminal use the CLI.

Install#

The package is private on GitHub Packages (npm.pkg.github.com), not on registry.npmjs.org. Authenticate npm to the acahti-ai organization, then install:

echo '@acahti-ai:registry=https://npm.pkg.github.com' >> ~/.npmrc
# GitHub PAT with read:packages for acahti-ai
echo '//npm.pkg.github.com/:_authToken=GITHUB_TOKEN' >> ~/.npmrc
npm install -g @acahti-ai/acahti

The package carries binaries for macOS and Linux on amd64 and arm64. acahti version prints the release. The CLI talks to any instance through the /acahti/v1 API and is released on its own schedule (cli-vX.Y.Z tags). Each member supplies their own GitHub credentials; do not commit or share tokens.

Configure#

Two values: the instance and an access token.

export ACAHTI_ROOT_URL=https://acahti.example.com
export ACAHTI_TOKEN=…
acahti whoami

A person creates the token from the avatar menu → Access tokens; it is shown once, and deleting it revokes it. Pipeline jobs already have both variables. The CLI sends the token as Authorization: Bearer, never the account password.

To store them instead of exporting:

acahti auth login --hostname https://acahti.example.com --with-token < token.txt

This checks the token with GET /me and saves both to ~/.config/acahti/credentials.json (mode 0600). acahti auth login https://acahti.example.com prints setup guidance without opening a browser. In Benchyard, set ACAHTI_ROOT_URL and ACAHTI_TOKEN in Secrets and use them directly; do not copy injected placeholders into a credential file. acahti auth status shows the host and login; acahti auth logout deletes the file.

Environment variables win over stored credentials. Without ACAHTI_ROOT_URL or a stored host, the CLI uses the HTTPS URL of the git remote named acahti.

Commands#

Command REST
acahti whoami GET /me
acahti user list [--q TEXT] GET /users
acahti user create LOGIN [--author NAME] [--email EMAIL] [--admin] POST /users
acahti user update LOGIN [--author NAME] [--email EMAIL] PATCH /users/{login}
acahti user permissions LOGIN [--create-team true|false --create-repo true|false] GET/PUT /users/{login}/permissions
acahti team create|delete NAME POST /teams, DELETE /teams/NAME
acahti repo create NAME [--team TEAM] POST /repos
acahti repo delete OWNER/REPO DELETE /repos/OWNER/REPO
acahti repo move OWNER/REPO TEAM PUT /repos/OWNER/REPO/team/TEAM
acahti repo archive|unarchive OWNER/REPO PUT /repos/OWNER/REPO/archived
acahti pr list OWNER/REPO [--state open] GET /repos/OWNER/REPO/pulls
acahti pr view OWNER/REPO N GET …/pulls/N
acahti pr create OWNER/REPO --title T --head BRANCH [--base B] [--body B] POST …/pulls
acahti pr merge OWNER/REPO N POST …/pulls/N/merge
acahti pr close OWNER/REPO N DELETE …/pulls/N
acahti checks OWNER/REPO SHA [--wait] [--timeout 30m] GET …/checks/SHA; --wait polls until the latest pipeline finishes and exits 1 unless it is green
acahti pipeline list OWNER/REPO [--sha S] [--branch B] [--status S] GET …/pipelines
acahti pipeline view OWNER/REPO N GET …/pipelines/N
acahti pipeline log OWNER/REPO N [--step N] [--tail N] GET …/pipelines/N/log
acahti pipeline trigger OWNER/REPO [--ref REF] POST …/pipelines (default branch without --ref)
acahti pipeline rerun|cancel|approve OWNER/REPO N POST …/pipelines/N/rerun, /cancel, /approve
acahti inbox [--section pipes|prs] GET /inbox
acahti search [--q TEXT] [--type …] [--assignee …] [--state …] [--scope …] GET /work/search
acahti iteration list|view|create|update|close … /work/iterations
acahti ticket|todo|document list|view|create|update|comment … /work/tickets, /work/todos, /work/docs
acahti attachment view|download|upload … /work/attachments
acahti delivery list|draft|view|submit|retry … /work/deliveries
acahti track list [--view work|tickets|argos] [--project ID] [--owner LOGIN] [--pack P] [--group G] [--env E] [--stuck-days N] GET /work/track
acahti track view KIND ID GET /work/track/KIND/ID
acahti track activity [--login LOGIN] [--days N] [--until YYYY-MM-DD] GET /work/track/activity
acahti track templates GET /work/track-templates
acahti track template set|reset TYPE … PUT/DELETE /work/track-templates/TYPE
acahti track flow KIND ID [--template TYPE] [--add k,…] [--skip k,…] | --clear PUT /work/track/KIND/ID/flow
acahti aidy ask --question TEXT [--conversation ID] POST /work/aidy/ask
acahti aidy confirm ID --call CALL_ID [--cancel] POST /work/aidy/conversations/ID/confirm
acahti aidy list|view ID|rename ID --title T|delete ID /work/aidy/conversations
acahti aidy settings|configure … /work/aidy/settings
acahti mcp tools, acahti mcp call TOOL [JSON | -] /mcp

The full tool catalog is MCP; shell agents use the verbs above for the delivery loop, acahti mcp call for any other tool, and acahti aidy to hand a question or an instruction to Aidy.

After a push#

sha=$(git rev-parse HEAD)
acahti checks acme/demo "$sha" --wait
acahti pipeline list acme/demo --sha "$sha"
acahti pipeline log acme/demo 12
acahti pr merge acme/demo 3

pr merge requires the newest pipeline on the head SHA to be green, exactly as the MCP tool does.

Git#

Git stays HTTPS. Username is the Acahti login; password is the account password or an access token. An SSH key is not a credential for Git, MCP, or the CLI.

Full MCP catalog from a shell#

acahti mcp tools lists the live tool schemas. acahti mcp call TOOL '{"argument":"value"}' invokes a tool through Streamable HTTP with the same personal token. Use - in place of JSON to read arguments from stdin. A tool error exits nonzero. Requests have bounded timeouts and do not follow redirects or send stored credentials to a different instance.

Work: tickets, todos, documents and files#

The same personal Access Token or OAuth identity used for repositories can use Work without a website session. All Work objects are instance-shared; personal views filter the list and do not restrict object access.

acahti ticket view 267
acahti ticket view https://your-instance.example/tickets/267
acahti ticket list --view assigned --page 2 --page-size 20
acahti ticket create --body-file ticket.json
acahti ticket update 267 --body-file changes.json
acahti ticket comment 267 --body-file comment.txt --file evidence.png
acahti ticket archive 267
acahti ticket unarchive 267
acahti todo create --body-file todo.json
acahti todo comment 12 --body 'Progress'
acahti todo link-ticket 12
acahti todo delete 12
acahti document create --body-file document.json
acahti document update 8 --body-file changes.json
acahti document folder-create --body-file folder.json
acahti document folder-update 3 --body-file folder.json
acahti document folder-delete 3
acahti document delete 8
acahti mcp call project_list '{}'
acahti mcp call project_context '{"id":"turbomesh"}'
acahti mcp call time_entry_save '{"todo_id":12,"work_date":"2026-10-30","minutes":120,"summary":"Completed task implementation"}'
acahti mcp call time_entry_list '{"work_date":"2026-10-30"}'
acahti attachment view 123
acahti attachment download 123 --output evidence.png
acahti attachment upload document 8 --file evidence.png

ticket, todo, and document share list, view, create, and update. --body-file - reads stdin. Creation and update files contain a JSON object. Comment files contain plain text. Commands return JSON; downloads write a new file with private permissions and refuse to overwrite an existing file. Page URLs must use the selected instance. The token is never put in a URL.

Ticket details include all comments and attachment metadata. Binary files travel through authenticated multipart upload and content download endpoints, not JSON-encoded file payloads. PDF and Office attachments also expose an authenticated preview URL that returns a PDF (Office files are converted). Ticket comments accept up to nine 200 MiB files; todo/document uploads accept one 200 MiB file. Only non-archived tickets accept updates and comments. Documents default to instance-shared (visibility=instance). Restricted documents use per-login view or edit grants; owners, Work managers and org admins always retain full access.

Tickets and todos accept a project ID from project_list (filtered by repository access); clearing it uses an empty string. Linking a todo to a ticket preserves its project. Move a document with document update --body-file using {"folder_id":3} or {"folder_id":null} for the root. Empty folders can be deleted; occupied folders return a conflict until their contents are moved.

Todo list and detail responses include logged_minutes, the total recorded across all people and dates for that task. Time reports belong to the authenticated person. Each save adds an entry with its minutes (1 to 960) and a completion summary. Dates use YYYY-MM-DD; the UI defaults to the current date in Asia/Shanghai. time_entry_list shows the day's total against an eight-hour reference; daily totals are unrestricted. time_entry_delete accepts an entry ID and only deletes your own entry. Tasks with reports cannot be deleted until those reports are removed.

acahti search --q TurboMesh
acahti search --type ticket --scope mine --state open
acahti iteration list --project turbomesh --state open
acahti iteration view 9
acahti aidy ask --question "Which of my tickets are still open?"
acahti aidy ask --question "创建一个 Star Map 新项目"
acahti aidy confirm 12 --call call_ab12
acahti aidy settings

search, iteration, and aidy are the named verbs for product planning and source-grounded answers. aidy ask runs Aidy in a conversation (a new one unless --conversation names one): reads run at once, and a write comes back under pending until aidy confirm approves it or --cancel drops it. Agents that call the operations themselves cite URLs and use write verbs only when the user authorizes a mutation. aidy ask and aidy confirm may take up to a few minutes while the host model runs.

Operations without a named command run through acahti mcp call, for example acahti mcp call ticket_get '{"id":267}'; acahti mcp tools lists the live catalog.

Delivery commands#

acahti delivery draft --iteration 12
acahti delivery submit --body-file delivery.json
acahti delivery list --iteration 12 --page 1
acahti delivery view 7
acahti delivery retry 7

The delivery manifest and retry rules are documented in iterations.

Track commands#

acahti track list                                   # open todos and tickets no todo carries
acahti track list --view tickets --owner wei --stuck-days 3
acahti track list --view argos --pack nebula --env bj-test
acahti track view todo 123
acahti track view argos_case nebula.upload

--project and --owner filter the work and tickets views; --pack, --group and --env filter the argos view. KIND is ticket, todo, iteration, delivery or argos_case. Stages and views are described in Track. todo update requires the current revision in its JSON body. Batch planning and structured agent steps use acahti mcp call planning_move_todos, planning_todo_links, planning_run_step and the corresponding read tools.

For agents: cli.mdEdit this page