Package Exports
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (pfeed-cli) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
pf
A command-line tool for Project Feed. Manage your projects, tasks, posts, and more without leaving the terminal.

Install
npm install -g pfeed-cliOr run directly with npx:
npx pfeed-cli projects listSetup
You'll need an API key from your Project Feed workspace settings.
pf auth loginThis will prompt you for your key and store it locally. You can also set it as an environment variable:
export PROJECT_FEED_API_KEY=pf_live_your_key_hereOr jump straight in with the guided setup:
pf quickstartUsage
pf follows the same resource action pattern as the GitHub CLI:
pf projects list
pf tasks create --title "Fix login bug" --project <id> --priority high
pf posts view 3 # by post number
pf notifications unread-countQuick overview
| Command | What it does |
|---|---|
pf projects list |
List all projects (use --show-archived to include archived) |
pf projects create |
Create a new project (interactive) |
pf tasks list --status in_progress |
List tasks filtered by status |
pf tasks create |
Create a task (interactive or with flags) |
pf tasks view 5 |
View a task by number (or by ID) |
pf posts list --project <id> |
List posts for a project |
pf posts publish 3 |
Publish a draft post by number |
pf comments add 2 --content "looks good" |
Comment on a post by number |
pf reactions toggle 1 🚀 |
Toggle a reaction on a post by number |
pf media list --post <id> |
List media on a post |
pf notifications mark-all-read |
Clear your notifications |
pf status |
Dashboard with project/task summary |
pf init |
Scaffold a new project in the current directory |
pf open WR-42 --task |
Open a task by identifier in the browser |
pf history |
See recent actions |
pf undo |
Reverse your last edit or create |
Every command supports --json for machine-readable output:
pf tasks list --json
pf tasks list --json id,title,status # specific fields onlyYou can also pipe JSON through a jq-like filter:
pf posts list --json --jq ".[].title"Sorting and filtering
List commands accept --sort and --reverse:
pf tasks list --sort priority --reverse
pf posts list --sort titleDry runs
Destructive commands (delete, archive, mark-all-read, etc.) support --dry-run to preview what would happen without making changes:
pf posts delete <id> --dry-run
pf projects archive <id> --dry-runInteractive selection
When you run a view or edit command in a terminal without specifying an ID, you'll get an interactive picker:
pf tasks view # pick from a list
pf posts edit # pick, then editHistory and undo
Every create and edit is logged locally. You can review recent actions and reverse the last one:
pf history
pf undoUndo works by restoring the previous state for edits, or deleting the resource for creates. Deletes cannot be undone.
Directory linking
You can associate a directory with a project so you don't have to pass --project every time:
pf link <slug> # link by project slug
pf link <projectId> # or by ID — creates .pf/config.json in the current directory
pf unlink # removes itWhen linked, commands like pf tasks list will default to that project.
Raw API access
For anything the CLI doesn't cover, you can hit the API directly with your auth injected:
pf api GET /projects
pf api POST /posts --data '{"title": "Hello", "projectId": "..."}'Command aliases
Most commands have short aliases so you can type less:
pf p -> pf projects
pf t -> pf tasks
pf po -> pf posts
pf c -> pf comments
pf r -> pf reactions
pf n -> pf notifications
pf ws -> pf workspace
pf wh -> pf webhooksSubcommands have aliases too: ls for list, rm for delete, show for view.
Shell completions
Generate completion scripts for your shell:
eval "$(pf completion bash)" # bash
pf completion zsh > ~/.zfunc/_pf # zsh
pf completion fish | source # fishConfiguration
Config is stored at ~/.config/project-feed/config.json (Linux/macOS) or %APPDATA%/project-feed/Config/config.json (Windows).
pf config set defaultProject <id> # skip --project on every command
pf config set defaultWorkspace <slug>
pf config list # see current config
pf config path # show config file locationProfiles
You can create multiple config profiles for different workspaces or accounts:
pf config profile create work
pf config profile use work
pf config set apiKey pf_live_...
pf config profile use default # switch back
pf config profile listOr use a profile for a single command with --profile:
pf projects list --profile workGlobal flags
These work on any command:
--json [fields] Output as JSON, optionally selecting specific fields
--jq <expr> Filter JSON output with a path expression
--verbose Show HTTP request/response details
--debug Show full request/response bodies
--sort <field> Sort list output by a field
--reverse Reverse sort order
--profile <name> Use a specific config profile
--api-key <key> Use a different API key for this command
--project <id> Override the default project
--no-color Disable colored outputAll commands
Run pf --help or pf <command> --help for full details.
auth - login, logout, status
config - set, get, list, path, profile
projects - list, create, view, edit, archive
tasks - list, create, view, edit, comment, link, unlink
posts - list, create, view, edit, delete, publish, unpublish
comments - list, add, edit, delete
reactions - toggle
media - list, upload, view, delete
notifications - list, unread-count, mark-read, mark-all-read, preferences
workspace - members
webhooks - list, create, view, edit, delete, test, regen-secret, deliveries, retry, listen
status - dashboard overview
history - recent action log
undo - reverse last create or edit
init - scaffold a new project
open - open a resource in the browser (--post, --task for identifier URLs)
link / unlink - associate a directory with a project
quickstart - guided onboarding
api - raw API access
completion - shell completion scripts
Releases
Pushing to main triggers CI. If the version in package.json is newer than what's on npm, it publishes automatically.
npm publishing uses Trusted Publishing (OIDC). There's no npm token stored in GitHub secrets. Instead, the GitHub Actions workflow exchanges a short-lived OIDC token directly with npm. You set this up by linking the repo to the package on npmjs.com under Settings > Publishing access > Add linked repository.
The workflow also creates a GitHub Release with auto-generated notes.
Requirements
Node.js 20 or later.
License
MIT