{"_id":"@benmillerat/productboard-cli","_rev":"3-d6b46be2915ad5b18ead73706472300f","name":"@benmillerat/productboard-cli","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@benmillerat/productboard-cli","version":"1.0.0","keywords":["productboard","cli","oclif"],"author":{"name":"Ben Miller"},"license":"MIT","_id":"@benmillerat/productboard-cli@1.0.0","maintainers":[{"name":"benmillerat","email":"mail@benmiller.at"}],"bin":{"pb":"bin/run.js"},"dist":{"shasum":"5dfd5b7137bfa6f8f9a441c3bac120ed0d5e78ac","tarball":"https://registry.npmjs.org/@benmillerat/productboard-cli/-/productboard-cli-1.0.0.tgz","fileCount":624,"integrity":"sha512-59NTBvcah0/tetqhv3/QRwtNPLFNFCqkv+QXgpaDDGCt/da2++51lCvEDwOeSYookUEgpLAhIgjjGf6daNwC8A==","signatures":[{"sig":"MEUCIQC6rzPl9vy/kgOWyfAZlAvZX6Lm5Jm82Zrx57txCb4FiwIgSQ+E1tg0I/legMiCvccolfBeqQ0A0XXPe79yPpRaYsI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":691031},"main":"dist/index.js","type":"module","oclif":{"bin":"pb","dirname":"productboard-cli","commands":"./dist/commands","topicSeparator":" "},"types":"dist/index.d.ts","engines":{"node":">=20"},"gitHead":"2057ab0282b9f586c547dda19dd75fa56ad03fbc","scripts":{"dev":"./bin/dev.js","lint":"eslint .","test":"vitest run","build":"npm run clean && tsc -p tsconfig.build.json","clean":"rimraf dist","format":"prettier --check .","test:watch":"vitest","format:write":"prettier --write ."},"_npmUser":{"name":"benmillerat","email":"mail@benmiller.at"},"_npmVersion":"11.9.0","description":"Standalone Productboard CLI","directories":{},"_nodeVersion":"25.6.0","dependencies":{"yaml":"^2.8.1","keytar":"^7.9.0","cli-table3":"^0.6.5","@oclif/core":"^4.8.0"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^14.0.10","eslint":"^9.35.0","rimraf":"^6.0.1","vitest":"^3.2.4","ts-node":"^10.9.2","prettier":"^3.6.2","typescript":"^5.9.2","@types/node":"^22.10.2","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.43.0","@typescript-eslint/eslint-plugin":"^8.43.0"},"_npmOperationalInternal":{"tmp":"tmp/productboard-cli_1.0.0_1771163373992_0.7459097392386036","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@benmillerat/productboard-cli","version":"1.0.1","keywords":["productboard","cli","oclif"],"author":{"name":"Ben Miller"},"license":"MIT","_id":"@benmillerat/productboard-cli@1.0.1","maintainers":[{"name":"benmillerat","email":"mail@benmiller.at"}],"bin":{"pb":"bin/run.js"},"dist":{"shasum":"4c989b0db8d31b70d30e24afa83ed69bcf034b7c","tarball":"https://registry.npmjs.org/@benmillerat/productboard-cli/-/productboard-cli-1.0.1.tgz","fileCount":624,"integrity":"sha512-MVr0rnjIWDbI0SRb/f3PYlMOXb9JUJTZCTKtXQx2fNjpXSXLJiJnqcoNYd9J2yWOu2MEUf8hzKGRdia3RWV9Ug==","signatures":[{"sig":"MEUCIQCdstRbpx9fyR5+dUAKjTuroQhHTJfPwOYRfm0O7A3tRwIgboxOVqWEc0GYaPvDsQSpBPAuuC7sWFRXvPDVWbMNhhE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":693608},"main":"dist/index.js","type":"module","oclif":{"bin":"pb","dirname":"productboard-cli","commands":"./dist/commands","topicSeparator":" "},"types":"dist/index.d.ts","engines":{"node":">=20"},"gitHead":"ab6ec6e22ae446787d2aa509a9d8d5c224e74331","scripts":{"dev":"./bin/dev.js","lint":"eslint .","test":"vitest run","build":"npm run clean && tsc -p tsconfig.build.json","clean":"rimraf dist","format":"prettier --check .","test:watch":"vitest","format:write":"prettier --write ."},"_npmUser":{"name":"benmillerat","email":"mail@benmiller.at"},"_npmVersion":"11.9.0","description":"Standalone Productboard CLI","directories":{},"_nodeVersion":"25.6.0","dependencies":{"yaml":"^2.8.1","keytar":"^7.9.0","cli-table3":"^0.6.5","@oclif/core":"^4.8.0"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^14.0.10","eslint":"^9.35.0","rimraf":"^6.0.1","vitest":"^3.2.4","ts-node":"^10.9.2","prettier":"^3.6.2","typescript":"^5.9.2","@types/node":"^22.10.2","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.43.0","@typescript-eslint/eslint-plugin":"^8.43.0"},"_npmOperationalInternal":{"tmp":"tmp/productboard-cli_1.0.1_1771163923801_0.45414225916072937","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@benmillerat/productboard-cli","version":"2.0.0","description":"Standalone Productboard CLI","license":"MIT","author":{"name":"Ben Miller"},"type":"module","bin":{"pb":"bin/run.js"},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20"},"scripts":{"clean":"rimraf dist","build":"npm run clean && tsc -p tsconfig.build.json","dev":"./bin/dev.js","lint":"eslint .","format":"prettier --check .","format:write":"prettier --write .","test":"vitest run","test:watch":"vitest"},"keywords":["productboard","cli","oclif"],"oclif":{"bin":"pb","commands":"./dist/commands","dirname":"productboard-cli","topicSeparator":" "},"dependencies":{"@oclif/core":"^4.8.0","cli-table3":"^0.6.5","keytar":"^7.9.0","yaml":"^2.8.1"},"devDependencies":{"@types/node":"^22.10.2","@typescript-eslint/eslint-plugin":"^8.43.0","@typescript-eslint/parser":"^8.43.0","eslint":"^9.35.0","eslint-config-prettier":"^10.1.8","nock":"^14.0.10","prettier":"^3.6.2","rimraf":"^6.0.1","ts-node":"^10.9.2","typescript":"^5.9.2","vitest":"^3.2.4"},"gitHead":"05d97e06f5aabb3a84c6d794b45437bfea7059a4","_id":"@benmillerat/productboard-cli@2.0.0","_nodeVersion":"25.6.1","_npmVersion":"11.9.0","dist":{"integrity":"sha512-jp75KLfjLqeKEz4QZZuW6P70/0Vc87pj134Z4WZLOdFZ5Qp804LvPs2lVh06hEjWydjxFqvPNIpc+xnqvXogmA==","shasum":"2eb796c51d3679b68948938a03718edb8c530790","tarball":"https://registry.npmjs.org/@benmillerat/productboard-cli/-/productboard-cli-2.0.0.tgz","fileCount":676,"unpackedSize":873169,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCcoNtUvyBrTqMAi3yE6JKN3QnQINVQwFu2MITy8tQ93QIgZtl3vCmIgs9/5fw2NEOEGUru4SQWzzQ2sPNex4SCdZo="}]},"_npmUser":{"name":"benmillerat","email":"mail@benmiller.at"},"directories":{},"maintainers":[{"name":"benmillerat","email":"mail@benmiller.at"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/productboard-cli_2.0.0_1771367205341_0.05353234403451368"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-15T13:49:33.880Z","modified":"2026-02-17T22:26:45.613Z","1.0.0":"2026-02-15T13:49:34.140Z","1.0.1":"2026-02-15T13:58:43.979Z","2.0.0":"2026-02-17T22:26:45.499Z"},"author":{"name":"Ben Miller"},"license":"MIT","keywords":["productboard","cli","oclif"],"description":"Standalone Productboard CLI","maintainers":[{"name":"benmillerat","email":"mail@benmiller.at"}],"readme":"# Productboard CLI (`pb`)\n\n`pb` is a standalone command-line interface for Productboard.\n\nIt is designed for fast day-to-day API workflows, scripting, and automation, with broad coverage of Productboard v1 endpoints and an isolated `v2` beta namespace.\n\n## What's New in v2.0.0\n\n- Expanded output controls for humans and scripts: `--plain`, `--wide`, `--results-only`\n- Safer delete workflows: confirmation prompts by default, with `--yes` and `--no-input`\n- HTTP troubleshooting mode with `--debug` (request/response logs on stderr, auth masked)\n- Consistent command coverage across the CLI (145 command entries)\n\n## Why this project\n\n- First open-source Productboard-focused CLI with broad API coverage\n- Script-friendly output (`plain`, `json`, `yaml`, `ndjson`, `quiet`, `--results-only`)\n- Profile-aware authentication via OS keychain + env/flag overrides\n- Consistent command patterns across resources\n\n## Installation\n\n### npm\n\nCurrent release: **v2.0.0**\n\n```bash\nnpm install -g @benmillerat/productboard-cli\n```\n\nVerify:\n\n```bash\npb --help\n```\n\n### Homebrew (planned)\n\nHomebrew distribution is planned for a future release.\n\n## Quick start\n\n1. Authenticate:\n\n```bash\npb auth login\n```\n\n2. Check auth state:\n\n```bash\npb auth status\npb auth whoami\n```\n\n3. Run your first API commands:\n\n```bash\npb features list\npb notes list --limit 20\npb v2 notes list --limit 20\n```\n\n4. Use machine-readable output when scripting:\n\n```bash\npb features list --output json\n```\n\n## Authentication and profiles\n\nToken resolution order:\n\n1. `--token`\n2. `PRODUCTBOARD_API_TOKEN`\n3. Keychain token for active profile\n\nProfile selection:\n\n- Use `--profile <name>` on any command\n- Default profile name is `default`\n\nAuth commands:\n\n- `pb auth login`\n- `pb auth logout`\n- `pb auth status`\n- `pb auth whoami`\n\n## Output formats\n\nGlobal output flags available on commands:\n\n- `--output table|plain|json|yaml|ndjson`\n- `--plain` (shorthand for `--output plain`)\n- `--results-only` (JSON mode only)\n- `--wide` (extra columns in table/plain)\n- `--quiet`\n- `--debug` (HTTP request/response logs to stderr)\n\nBehavior:\n\n- `table` (default): clean aligned text table for humans\n- `plain`: tab-separated output for scripts (TSV), without table-style truncation\n- `json`: pretty JSON (full API envelope by default)\n- `yaml`: YAML output\n- `ndjson`: one JSON object per line (arrays emit multiple lines)\n- `--results-only`: with `--output json`, emit only primary payload (for example just `data[]`)\n- `--wide`: show additional columns (for example parent IDs/URLs)\n- `--quiet`: emit compact IDs/scalars when possible\n- `--debug`: print HTTP logs like `DEBUG: GET /features?limit=25 → 200 (142ms)`, plus masked request headers and response size (stderr only)\n\nExample human table output:\n\n```text\nID                                    NAME               TYPE        STATUS   OWNER               UPDATED\n02a68d50-9a53-4999-824c-92cac04f3518  Sample subfeature  subfeature  Planned  tech@benpro.at      2026-02-13 12:37\n```\n\nExample plain output (`--plain` / TSV):\n\n```text\nID\\tNAME\\tTYPE\\tSTATUS\\tOWNER\\tUPDATED\n02a68d50-9a53-4999-824c-92cac04f3518\\tSample subfeature\\tsubfeature\\tPlanned\\ttech@benpro.at\\t2026-02-13 12:37\n```\n\nExamples:\n\n```bash\n# Plain TSV output (script-friendly)\npb companies list --plain\n\n# Include extra columns in table/plain modes\npb companies list --wide\n\n# Extract only the primary JSON array payload\nauto_json=\"$(pb companies list --output json --results-only)\"\n\n# Other formats\npb companies list --output table\npb companies list --output json\npb companies list --output yaml\npb companies list --output ndjson\n\n# Compact scalar output and debug logs\npb companies get com_123 --quiet\npb features list --debug --limit 3\n```\n\n## Destructive command confirmations\n\nDelete commands now require confirmation by default.\n\n- Interactive terminal (TTY): prompts with `Delete <resource> <id>? [y/N]`\n- Non-interactive (CI/script): command exits with code `2` unless `--yes` is provided\n\nRelated flags:\n\n- `--yes`, `-y`: skip confirmation prompts\n- `--no-input`: never prompt; fail when confirmation would be required\n\nExamples:\n\n```bash\npb features delete fea_123\npb features delete fea_123 --yes\npb features delete fea_123 --no-input --yes\n```\n\n## Configuration\n\nConfig file path:\n\n- `~/.config/productboard-cli/config.json`\n\nSupported config keys:\n\n- `activeProfile`\n- `profiles` (per-profile settings like `baseUrl`, `defaultOutput`)\n- `defaults.output`\n- `defaults.quiet`\n- `defaults.timeoutMs`\n- `defaults.maxRetries`\n\nExample:\n\n```json\n{\n  \"activeProfile\": \"default\",\n  \"profiles\": {\n    \"default\": {\n      \"baseUrl\": \"https://api.productboard.com\",\n      \"defaultOutput\": \"table\"\n    },\n    \"work\": {\n      \"defaultOutput\": \"json\"\n    }\n  },\n  \"defaults\": {\n    \"output\": \"table\",\n    \"quiet\": false,\n    \"timeoutMs\": 30000,\n    \"maxRetries\": 3\n  }\n}\n```\n\n## Scripting examples\n\nList and filter with `jq`:\n\n```bash\npb features list --output json | jq '.data[] | {id, name: .name}'\n```\n\nCreate a note from inline JSON:\n\n```bash\npb notes create --data '{\"title\":\"CLI note\",\"content\":\"Created from pb\"}' --output json\n```\n\nUpdate by piping generated payload:\n\n```bash\npayload='{\"name\":\"Renamed Feature\"}'\npb features update fea_123 --data \"$payload\"\n```\n\nQuiet IDs for shell loops:\n\n```bash\npb releases list --quiet | while read -r rel; do\n  pb releases get \"$rel\" --output json\n done\n```\n\nRaw API escape hatch:\n\n```bash\npb api call GET /features --query limit=10 --output json\npb api call PATCH /features/fea_123 --body '{\"data\":{\"name\":\"New name\"}}'\n```\n\n## Full command reference\n\n### Utility and auth\n\n- `pb api call <method> <path>`\n- `pb auth login`\n- `pb auth logout`\n- `pb auth status`\n- `pb auth whoami`\n- `pb help exit-codes`\n\n### Companies\n\n- `pb companies list`\n- `pb companies create`\n- `pb companies get <id>`\n- `pb companies update <id>`\n- `pb companies delete <id>`\n\nCompany fields:\n\n- `pb companies fields list`\n- `pb companies fields create`\n- `pb companies fields get <id>`\n- `pb companies fields update <id>`\n- `pb companies fields delete <id>`\n\nCompany field values:\n\n- `pb companies field-values get <companyId> <companyCustomFieldId>`\n- `pb companies field-values set <companyId> <companyCustomFieldId>`\n- `pb companies field-values delete <companyId> <companyCustomFieldId>`\n\n### Users\n\n- `pb users list`\n- `pb users create`\n- `pb users get <id>`\n- `pb users update <id>`\n- `pb users delete <id>`\n\n### Products and components\n\nProducts:\n\n- `pb products list`\n- `pb products get <id>`\n- `pb products update <id>`\n\nComponents:\n\n- `pb components list`\n- `pb components create`\n- `pb components get <id>`\n- `pb components update <id>`\n\n### Features\n\n- `pb features list`\n- `pb features create`\n- `pb features get <id>`\n- `pb features update <id>`\n- `pb features delete <id>`\n\nFeature links -> initiatives:\n\n- `pb features links initiatives list <featureId>`\n- `pb features links initiatives add <featureId> <initiativeId>`\n- `pb features links initiatives remove <featureId> <initiativeId>`\n\nFeature links -> objectives:\n\n- `pb features links objectives list <featureId>`\n- `pb features links objectives add <featureId> <objectiveId>`\n- `pb features links objectives remove <featureId> <objectiveId>`\n\nFeature metadata:\n\n- `pb feature-statuses list`\n- `pb feature-release-assignments list <featureId>`\n- `pb feature-release-assignments get <featureId> <releaseId>`\n- `pb feature-release-assignments set <featureId> <releaseId>`\n\n### Notes\n\n- `pb notes list`\n- `pb notes create`\n- `pb notes get <id>`\n- `pb notes update <id>`\n- `pb notes delete <id>`\n\nNote links:\n\n- `pb notes links list <noteId>`\n- `pb notes links add <noteId> <entityId>`\n\nNote tags:\n\n- `pb notes tags list <noteId>`\n- `pb notes tags add <noteId> <tag>`\n- `pb notes tags remove <noteId> <tag>`\n\nNote followers:\n\n- `pb notes followers add-bulk <noteId>`\n- `pb notes followers remove <noteId> <followerId>`\n\n### Releases\n\nReleases:\n\n- `pb releases list`\n- `pb releases create`\n- `pb releases get <id>`\n- `pb releases update <id>`\n- `pb releases delete <id>`\n\nRelease groups:\n\n- `pb release-groups list`\n- `pb release-groups create`\n- `pb release-groups get <id>`\n- `pb release-groups update <id>`\n- `pb release-groups delete <id>`\n\n### Objectives, initiatives, key results\n\nObjectives:\n\n- `pb objectives list`\n- `pb objectives create`\n- `pb objectives get <id>`\n- `pb objectives update <id>`\n- `pb objectives delete <id>`\n\nObjective links -> initiatives:\n\n- `pb objectives links initiatives list <objectiveId>`\n- `pb objectives links initiatives add <objectiveId> <initiativeId>`\n- `pb objectives links initiatives remove <objectiveId> <initiativeId>`\n\nObjective links -> features:\n\n- `pb objectives links features list <objectiveId>`\n- `pb objectives links features add <objectiveId> <featureId>`\n- `pb objectives links features remove <objectiveId> <featureId>`\n\nInitiatives:\n\n- `pb initiatives list`\n- `pb initiatives create`\n- `pb initiatives get <id>`\n- `pb initiatives update <id>`\n- `pb initiatives delete <id>`\n\nInitiative links -> objectives:\n\n- `pb initiatives links objectives list <initiativeId>`\n- `pb initiatives links objectives add <initiativeId> <objectiveId>`\n- `pb initiatives links objectives remove <initiativeId> <objectiveId>`\n\nInitiative links -> features:\n\n- `pb initiatives links features list <initiativeId>`\n- `pb initiatives links features add <initiativeId> <featureId>`\n- `pb initiatives links features remove <initiativeId> <featureId>`\n\nKey results:\n\n- `pb key-results list`\n- `pb key-results create`\n- `pb key-results get <id>`\n- `pb key-results update <id>`\n- `pb key-results delete <id>`\n\n### Custom fields and feedback\n\nCustom fields:\n\n- `pb custom-fields list`\n- `pb custom-fields get <id>`\n\nCustom field values:\n\n- `pb custom-fields values list <entityId>`\n- `pb custom-fields values get <entityId> <customFieldId>`\n- `pb custom-fields values set <entityId> <customFieldId>`\n- `pb custom-fields values delete <entityId> <customFieldId>`\n\nFeedback:\n\n- `pb feedback-configurations list`\n- `pb feedback-configurations get <id>`\n- `pb feedback-forms submit`\n\n### Integrations and webhooks\n\nPlugin integrations:\n\n- `pb plugin-integrations list`\n- `pb plugin-integrations create`\n- `pb plugin-integrations get <id>`\n- `pb plugin-integrations update <id>`\n- `pb plugin-integrations delete <id>`\n\nPlugin integration connections:\n\n- `pb plugin-integrations connections list <pluginIntegrationId>`\n- `pb plugin-integrations connections get <pluginIntegrationId> <connectionId>`\n- `pb plugin-integrations connections set <pluginIntegrationId> <connectionId>`\n- `pb plugin-integrations connections delete <pluginIntegrationId> <connectionId>`\n\nJira integrations:\n\n- `pb jira-integrations list`\n- `pb jira-integrations get <id>`\n\nJira integration connections:\n\n- `pb jira-integrations connections list <jiraIntegrationId>`\n- `pb jira-integrations connections get <jiraIntegrationId> <connectionId>`\n\nWebhooks:\n\n- `pb webhooks list`\n- `pb webhooks create`\n- `pb webhooks get <id>`\n- `pb webhooks delete <id>`\n\n### v2 beta namespace\n\nNotes:\n\n- `pb v2 notes list`\n- `pb v2 notes create`\n- `pb v2 notes get <id>`\n- `pb v2 notes update <id>`\n- `pb v2 notes delete <id>`\n- `pb v2 notes configurations list`\n- `pb v2 notes configurations get <type>`\n- `pb v2 notes relationships list <id>`\n- `pb v2 notes relationships create <id>`\n- `pb v2 notes relationships set-customer <id>`\n- `pb v2 notes relationships delete <id> <targetType> <targetId>`\n\nPM entities:\n\n- `pb v2 entities list`\n- `pb v2 entities create`\n- `pb v2 entities get <id>`\n- `pb v2 entities update <id>`\n- `pb v2 entities delete <id>`\n- `pb v2 entities search`\n- `pb v2 entities configurations list`\n- `pb v2 entities configurations get <type>`\n- `pb v2 entities relationships list <id>`\n- `pb v2 entities relationships create <id>`\n- `pb v2 entities relationships set-parent <id>`\n- `pb v2 entities relationships delete <id> <type> <targetId>`\n\nAnalytics:\n\n- `pb v2 analytics member-activities get`\n\n## Exit codes\n\nYou can also run `pb help exit-codes` for this table.\n\n| Code | Meaning |\n|------|---------|\n| 0 | Success |\n| 1 | Runtime/API/network error |\n| 2 | Usage/validation/config error (includes missing confirmation) |\n| 4 | Auth required or invalid |\n| 5 | Resource not found (404) |\n| 130 | Interrupted (Ctrl+C) |\n\n## Development and contributing\n\n### Setup\n\n```bash\ngit clone <repo-url>\ncd productboard-cli\nnpm install\n```\n\n### Build and test\n\n```bash\nnpm run build\nnpx tsc --noEmit\nnpx vitest run\nnpm run lint\n```\n\n### Local CLI usage\n\n```bash\nnpm run dev -- --help\nnpm run dev -- auth status\nnpm run dev -- features list --limit 5\n```\n\n### Contribution workflow\n\n1. Create a focused branch.\n2. Add or update commands/tests/docs.\n3. Run `npx tsc --noEmit` and `npx vitest run`.\n4. Open a PR with command examples and behavior notes.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}