---
title: PM Portfolios
---

# PM Portfolios

Cross-board aggregation for Mission Control: group multiple boards into a
named portfolio and see a unified status summary.

## What it is

A portfolio is a named grouping of PM boards within a workspace. It lets you
aggregate items across multiple boards for a unified view of total items,
completed items, and a status-bucket breakdown.

Each portfolio has a title, optional description, and a list of linked
boards. The aggregation works by loading each linked board's full data,
finding its status column, running `bucketByColumn` (reused from the
dashboard widgets), merging buckets across boards by key, and counting done
items using each board's done-index setting.

## Where to find it

Portfolios live in a Mission Control workspace. You create one there, give it a
title and optional description, link the boards you want it to cover, and open
its summary view to see the cross-board rollup. The same operations are exposed
over the CLI routes listed under For agents, so a portfolio can also be built and
read programmatically.

## How it behaves

1. **Create** -- workspace-scoped, with a title and optional description
2. **Link / Unlink boards** -- add or remove boards from the portfolio
3. **View summary** -- `PortfolioSummary` loads each linked board, buckets items by status, and merges across boards for a cross-board rollup
4. **Delete** -- soft delete (`is_deleted = 1`) that cascades to board links within a transaction

## For agents

### Key files

- `src/shared/types/pm.ts` (lines 359-373) -- `PmPortfolio` and `PmPortfolioBoard` interfaces
- `src/shared/ipc-schemas/pm-portfolios.ts` -- Zod validation schemas for all 8 operations
- `src/main/db/queries-pm-portfolios.ts` -- SQLite CRUD against `pm_portfolios` and `pm_portfolio_boards` tables
- `src/main/ipc/pm-portfolios-handlers.ts` -- 8 IPC handler registrations
- `src/main/services/cli/pm/pm-portfolio-routes.ts` -- CLI route registration
- `src/plugins/mission-control/web/lib/session-bridge-portfolios.ts` -- frontend bridge wrappers (timed IPC calls)
- `src/plugins/mission-control/web/features/portfolios/PortfolioSummary.tsx` -- aggregation UI (loads boards, buckets by status, merges)

### Implementation notes

- 9 IPC channels prefixed `pm:portfolio:` and `pm:portfolio-*`: list, get, create, update, delete, board list/link/unlink, plus `pm:portfolios:changed` push event
- CLI routes: `GET /pm/portfolios`, `GET /pm/portfolios/:id`, `POST /pm/portfolios`, `PATCH /pm/portfolios/:id`, `DELETE /pm/portfolios/:id`, plus board link/unlink endpoints; feature-gated via `pm_portfolios`
- Aggregation reuses `bucketByColumn` from the dashboard widget infrastructure
- Soft delete cascades from portfolio to board links within a DB transaction

## Related

[mission-control.md](mission-control.md) is the parent feature doc, and
[mc-dashboards.md](mc-dashboards.md) matters here because dashboards share the
`bucketByColumn` aggregation logic this feature reuses. If what you want to roll up is not boards
but objectives above them, [pm-goals.md](pm-goals.md) covers goal tracking, which sits one level
higher. The full list of library pages is in [INDEX.md](INDEX.md).
