{"_id":"@abe-ing/cli","_rev":"5-d7275357daf70d30733e2636eb5ec12a","name":"@abe-ing/cli","dist-tags":{"latest":"0.5.0"},"versions":{"0.2.0":{"name":"@abe-ing/cli","version":"0.2.0","_id":"@abe-ing/cli@0.2.0","maintainers":[{"name":"abe-viewcy","email":"abe@abe.ing"}],"bin":{"abe":"dist/cli.js"},"dist":{"shasum":"585ef6fc0f241af612f4e310a23cde2907897347","tarball":"https://registry.npmjs.org/@abe-ing/cli/-/cli-0.2.0.tgz","fileCount":38,"integrity":"sha512-7vskujS+/P1Re9EpRajssq0MRV8HrdFfGHMsqdVmSswWH9GygGchvLTRmg60IeUv7pszv+0V/U0WdVgIBOZiOg==","signatures":[{"sig":"MEUCIQDEhw88WAZOUVCy3xKyvMd5WOJQOt5UOsGD0b3hQOAHowIgdr9LsIp3ockMcXBYIngplwK5yCEwbbmeK04khDAv9x0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105457},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"655c9266107b3f0dbfd7b4f5ab4317eccde308cb","scripts":{"dev":"tsc -w","test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"abe-viewcy","email":"abe@abe.ing"},"_npmVersion":"10.8.2","description":"Command-line interface for driving ABE project boards and tasks.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"commander":"^12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.0_1785115954718_0.2002945119710351","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@abe-ing/cli","version":"0.3.0","_id":"@abe-ing/cli@0.3.0","maintainers":[{"name":"abe-viewcy","email":"abe@abe.ing"}],"bin":{"abe":"dist/cli.js"},"dist":{"shasum":"a51eb4115b6a0e83518aa339d21d9687676c9300","tarball":"https://registry.npmjs.org/@abe-ing/cli/-/cli-0.3.0.tgz","fileCount":38,"integrity":"sha512-ADqZiYQeW4DVMvOB94jL57Sw2aNThXCpzET6V3SMOpl47FVfR81sHxLa6NfX9bqlkjcBPmbPynG7Cr+16RCiMw==","signatures":[{"sig":"MEQCIB9pXL5tiDFsIECId8z64bb41leJtwXKRSltutlzCaE8AiB+IuA8rYG1eb2iwgaitG3RWa+c17n+w9NtU014Y4pijQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117758},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"3c39d54b6485969f6d4309c92cbf506ef0c65e21","scripts":{"dev":"tsc -w","test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"abe-viewcy","email":"abe@abe.ing"},"_npmVersion":"10.8.2","description":"Command-line interface for driving ABE project boards and tasks.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"commander":"^12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.3.0_1785117942360_0.2892771715951328","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@abe-ing/cli","version":"0.3.1","_id":"@abe-ing/cli@0.3.1","maintainers":[{"name":"abe-viewcy","email":"abe@abe.ing"}],"bin":{"abe":"dist/cli.js"},"dist":{"shasum":"a7137c703c078b8bf4ff85d82956c72f6428388d","tarball":"https://registry.npmjs.org/@abe-ing/cli/-/cli-0.3.1.tgz","fileCount":26,"integrity":"sha512-IrNLQKs18S0I3oRMxLC7bJj6HiyH98F6MK0fRbOvzhDCNb4Kfl8Nykh3gAlSRwVLYFF+lEesWXIGiJ11CBe0WQ==","signatures":[{"sig":"MEUCIQCrsOyhP38rR96WkNTRvxO/iwj6FuYu0zYpj6AAWqau0AIgAlnxU/BOXmOfZfSRaMhAqcMctw4qduq1EPithjPyRZE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72928},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"94a5c2cf598ae6939ac88f987ab12196430c1c3c","scripts":{"dev":"tsc -w","test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"abe-viewcy","email":"abe@abe.ing"},"_npmVersion":"10.8.2","description":"Command-line interface for driving ABE project boards and tasks.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"commander":"^12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.3.1_1785119017074_0.3713514717884705","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@abe-ing/cli","version":"0.4.0","_id":"@abe-ing/cli@0.4.0","maintainers":[{"name":"abe-viewcy","email":"abe@abe.ing"}],"bin":{"abe":"dist/cli.js"},"dist":{"shasum":"e2f3d35ece435ebdc0f73d707b0861a9a02de152","tarball":"https://registry.npmjs.org/@abe-ing/cli/-/cli-0.4.0.tgz","fileCount":28,"integrity":"sha512-R5aPtE+DvBp0RAUCGKoxkOi8NLWWTrBPXEr/P1UWuIQ4iTtu2E8G4lCwc5GeT8kw6Arn6KgL9U0cqse6KR8F8Q==","signatures":[{"sig":"MEUCIQDbK3fhms8RbBiZ8uxYVN+pXW62yab0hOBk1xS6ZuxyxAIgRKyl0Ni74lYXKaC/c0dx0f3KuJ2HSC6mfyMc12886WE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81116},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"3664285e5eb707df11045acca3d00d3bdddc7047","scripts":{"dev":"tsc -w","test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"abe-viewcy","email":"abe@abe.ing"},"_npmVersion":"10.8.2","description":"Command-line interface for driving ABE project boards and tasks, and reading the worksheets behind them.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"commander":"^12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.4.0_1789052792456_0.41993401882973025","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"_id":"@abe-ing/cli@0.5.0","bin":{"abe":"dist/cli.js"},"dist":{"shasum":"c80cd6dae893360a62523b6988df897c9240443e","tarball":"https://registry.npmjs.org/@abe-ing/cli/-/cli-0.5.0.tgz","fileCount":30,"integrity":"sha512-w/8E7jAXcHwHHxDVFIxbgzl4f2wXWCPPVt/BajrAkATEd4FnvprVligMugv0r29BV129OeXYq7YauCm70im3vQ==","signatures":[{"sig":"MEUCIQDU0JB8kbtECDb7Iq9xthrbI6z7nK/JK3kJj+Nr7W74qwIgFs3n3eoCVBpUACNjK/sa3o41zGMxyhA9WfpJedznWC8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDkZir3kfcK+80arX5dS5zvObPn8U8Z9KPckbkNPv7+sAiBjf6oQNDnHkc++vPIgYpHv3y/7WsYd0jkkjeu+2Pv5cQ=="}],"unpackedSize":90018},"main":"./dist/index.js","name":"@abe-ing/cli","type":"module","engines":{"node":">=18"},"gitHead":"2d5d24eed6730dfd65b44413ee1fe2167b216f46","scripts":{"dev":"tsc -w","test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"version":"0.5.0","_npmUser":{"name":"abe-viewcy","email":"abe@abe.ing"},"_npmVersion":"10.8.2","description":"Command-line interface for driving ABE project boards and tasks, and reading the worksheets behind them.","directories":{},"maintainers":[{"name":"abe-viewcy","email":"abe@abe.ing"}],"_nodeVersion":"20.20.2","dependencies":{"commander":"^12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_0.5.0_1789072696995_0.2786349201929066"}}},"time":{"created":"2026-07-27T01:32:34.578Z","modified":"2026-09-10T20:38:17.315Z","0.2.0":"2026-07-27T01:32:34.873Z","0.3.0":"2026-07-27T02:05:42.519Z","0.3.1":"2026-07-27T02:23:37.214Z","0.4.0":"2026-09-10T15:06:32.602Z","0.5.0":"2026-09-10T20:38:17.142Z"},"description":"Command-line interface for driving ABE project boards and tasks, and reading the worksheets behind them.","maintainers":[{"name":"abe-viewcy","email":"abe@abe.ing"}],"readme":"# @abe-ing/cli — the `abe` command\n\nDrive [ABE](https://abe.ing) project boards and tasks from the command line, and read the worksheets (docs) behind them. Built for humans **and** agents — run engineering issues inside ABE instead of GitHub, and let Claude Code (or any shell-driven agent) create boards, file issues, and move cards via `abe ... --json`.\n\nIt is a thin, dependency-light wrapper over the [ABE REST API](../../docs/agent-api/rest-api.md), authenticated with a Personal Access Token.\n\n## Install\n\n```bash\nnpm i -g @abe-ing/cli\n```\n\nRequires Node ≥ 18.\n\n## Authenticate\n\nGenerate a Personal Access Token in the ABE web app (**Settings → Developer → Generate a token**), then:\n\n```bash\nabe auth login --token abe_pat_xxxx --api-url https://api.abe.ing\n```\n\nThis stores the token at `~/.abe/config.json` (created `0600`). The token is bound to the workspace you generated it in.\n\n**Headless / CI** — skip the config file and use environment variables:\n\n```bash\nexport ABE_TOKEN=abe_pat_xxxx\nexport ABE_API_URL=https://api.abe.ing\n```\n\nConfiguration precedence: **flag (`--token`/`--api-url`) > environment (`ABE_TOKEN`/`ABE_API_URL`) > `~/.abe/config.json` > default**. The token is never printed in full (always redacted to the last 4 chars) and `abe config set token` is intentionally refused (it would leak into shell history).\n\n```bash\nabe auth status        # show current config + a live auth check\nabe auth logout        # remove the stored token\nabe config path        # print the config file location\nabe config set apiUrl https://api.abe.ing\n```\n\n## Project boards\n\nThese are the **Project Boards** in the ABE web app (the REST resource is `task_boards`).\n\n```bash\nabe board create \"Engineering\" --columns backlog,todo,in_review,done [--description \"...\"]\nabe board list\n```\n\nColumns are normalized to `lowercase_with_underscores`. New boards are custom boards; app/GitHub-backed boards are managed inside ABE.\n\n## Tasks\n\n```bash\n# Create — all properties in one shot\nabe task create \"Fix login race\" \\\n  --board engineering \\           # slug, name, or numeric id\n  --type bug \\                    # task | feature | bug | suggestion | improvement | ops\n  --priority P1 \\                 # P0 | P1 | P2 | urgent | high | normal\n  --size M \\                      # XS | S | M | L | XL\n  --assignee matt@viewcy.com \\    # email OR name — resolved server-side (or --assignee-id <n>)\n  --labels auth,regression \\\n  --column todo \\\n  --due 2026-07-01 \\\n  --description \"Race on concurrent login\"\n\n# Update any field (send only what changes)\nabe task update 91 --priority P0 --labels auth,p0\nabe task update 91 --board other-board     # move to another board\nabe task update 91 --body-file spec.md     # replace the task DOC from markdown (- = stdin); --body \"...\" inline\n\nabe task move 91 --column in_review\nabe task complete 91\n\n# Read\nabe task list --board engineering          # your OPEN tasks on that board\nabe task list --board engineering --all --include-done   # full set (admin/full token)\nabe task board --board engineering         # full board state incl. done — best for reconciliation\nabe task board --board engineering --with-bodies   # …plus every card's doc as body_markdown, in ONE call\nabe task show 91                           # header + the task BODY (its worksheet doc, rendered as markdown)\n```\n\n**Writing the doc.** `--body <markdown>` / `--body-file <path>` (`-` reads stdin) **replace the whole task doc**: the markdown is converted server-side (headings, lists, code, tables, rules, bold/italic), the previous body is kept as a version in ABE, and the markdown source is mirrored into the task's `description`. `--description` on `update` means the same thing it does on `create` — it *is* the doc — so it also replaces the doc. You need edit permission on the doc itself (creator, admin, an edit share, or a workspace-editable doc) — exit 6 otherwise, and nothing else in the command is applied. Read the current body first (`abe task show`) if you mean to edit rather than rewrite. Saves are last-write-wins with the web editor: don't rewrite a doc someone has open.\n\nSupported markdown: `#`–`######` headings, paragraphs, `**bold**` / `*italic*` / `` `code` `` / `[links](url)`, flat `-` and `1.` lists, `> quotes`, fenced code blocks, pipe tables, `---` rules. Nested lists flatten to one level and anything else lands as literal text — so on a read → edit → write round trip, check the result once for docs that use exotic formatting. A blank body is refused (exit 2 / 8) rather than emptying the doc.\n\n`task show` prints the task's `ref` (`ABE-91`, the form to cite in PRs), its `worksheet` id, and the task's body — the linked worksheet doc rendered to markdown — under the header block. `--json` carries the body as `task.body_markdown` (plus `task.description`, the create-time text, and `task.worksheet_id`). Prefer `body_markdown`: `description` stops tracking the doc once it has been edited in the editor. The CLI requests the body with `?render=markdown`; it is `null` when the doc is hidden from your token (e.g. a token without the `tasks` scope, or a private doc you can't see).\n\nInvalid `--priority/--type/--size/--status` fail fast (exit 2) before any network call. `--column` is **not** client-validated (columns are per-board) — an invalid column returns the server's `422` listing the valid set.\n\n### Comments, history & delete\n\nLeave PR-style progress notes on a task instead of a GitHub issue comment. Comments you add via the CLI are recorded as authored by the token's user (agent tokens are stamped `origin: \"agent\"`). You may only edit or delete your **own** comments (the server returns `403` otherwise).\n\n```bash\nabe task comment 91 \"Root-caused: race in the session refresh. Fix in review.\"\nabe task comments 91                       # list all comments (chronological)\nabe task comment-edit 91 42 \"Updated: shipped in #628.\"   # edit your comment #42\nabe task comment-delete 91 42              # delete your comment #42\n\nabe task history 91                        # full timeline: field/status events + comments + worksheet edits\n\nabe task delete 91 --yes                   # PERMANENT — refuses without --yes (exit 2)\n```\n\n`task delete` is irreversible; prefer `task complete` for finished work. It refuses without `--yes` so an agent can't destroy a task by accident.\n\n## Worksheets\n\nWorksheets are ABE's docs. Every task's body is a worksheet (`task.worksheet_id`); pages, specs, and plans are worksheets too. Read one directly — by a task's `worksheet_id`, or any other doc id:\n\n```bash\nabe worksheet show 6325                    # \"# <title>\" then the body as markdown\nabe --json worksheet show 6325 | jq -r '.worksheet.bodyMarkdown'\nabe worksheet update 6325 --body-file plan.md          # replace the whole doc from markdown (- = stdin)\nabe worksheet update 6325 --title \"Q3 plan\" --body \"# Q3 plan\\n\\n...\"\n```\n\nThe **server** renders the markdown (`GET /worksheets/:id?render=markdown`), so the CLI never carries its own Tiptap converter. Task docs need a token with the `tasks` scope (or `full`) — exit 6 otherwise. Private docs are readable only by their creator, people they're shared with, and workspace admins, exactly as in the web app (exit 7 when not visible). `update` replaces the whole body (previous version kept) and/or retitles; same edit permission and last-write-wins caveat as `task update --body-file`.\n\n`--json` emits a stable subset of the server's worksheet payload — `id`, `title`, `body` (Tiptap JSON), `bodyMarkdown`, `visibility`, `lastEditedAt`, `createdByName` — never the share token, owner email, or share/mention rosters the web editor receives.\n\n## Members\n\n```bash\nabe members list      # requires an admin/full token\n```\n\nYou rarely need this — assigning by email/name on `task create`/`update` resolves members server-side.\n\n## JSON output (for scripts & agents)\n\nAdd `--json` to any command. In `--json` mode, **stdout carries only the JSON payload**; all human/status text goes to stderr — so piping stdout to a parser never breaks.\n\n```bash\nabe --json task list --board engineering | jq '.tasks[] | {id,title,status}'\nBOARD_ID=$(abe --json board list | jq '.boards[] | select(.slug==\"engineering\") | .id')\n```\n\n## Exit codes\n\n| Code | Meaning |\n|------|---------|\n| 0 | Success |\n| 2 | Usage / parse error (bad flag, invalid enum) |\n| 4 | Auth (no token, or token invalid/expired) |\n| 5 | Workspace billing locked |\n| 6 | Forbidden (missing scope / role) |\n| 7 | Not found |\n| 8 | Validation error |\n| 9 | Server error |\n| 10 | Network error |\n\n## Global flags\n\n`--json`, `--api-url <url>`, `--token <pat>`, `--no-color`. Environment: `ABE_TOKEN`, `ABE_API_URL`, `ABE_TENANT` (display only), `ABE_CONFIG_DIR` (override `~/.abe`), `ABE_NO_CONFIG` (ignore the config file).\n\n## Develop\n\n```bash\nnpm install\nnpm run build        # tsc → dist/\nnpm test             # vitest\nnpm run typecheck\n```\n","readmeFilename":"README.md"}