paperclipai/paperclip · error

Company ID is required.

Error message

Company ID is required.

What it means

listCatalogTeamStatusRows is company-scoped but the resolved context carries no companyId, so neither catalog teams nor installed teams can be listed.

Solutions

  1. Pass --company-id or set PAPERCLIP_COMPANY_ID / a context default companyId.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at cli/src/commands/client/teams.ts:294 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@120ae5428f (2026-08-18). Data as JSON: /api/errors/c1214e30f4a87afb. Report an issue: GitHub.

Appendix: source

Thrown at cli/src/commands/client/teams.ts:294

  slug: string | null;
  name: string;
  installedStatus: CatalogTeamInstalledStatus;
  installedAgentCount: number;
  catalogAgentCount: number | null;
  projectCount: number | null;
  trustLevel: CatalogTeam["trustLevel"] | null;
  present: boolean;
  outOfDate: boolean;
  currentContentHash: string | null;
  installedOriginHashes: string[];
}

async function listCatalogTeamStatusRows(
  ctx: ResolvedClientContext,
  opts: TeamListOptions,
): Promise<CatalogTeamStatusRow[]> {
  if (!ctx.companyId) {
    throw new Error("Company ID is required.");
  }

  const [teams, installed] = await Promise.all([
    listCatalogTeams(ctx, opts),
    ctx.api.get<InstalledCatalogTeam[]>(
      `/api/companies/${encodeURIComponent(ctx.companyId)}/teams/catalog/installed`,
    ),
  ]);

  const installedByCatalogId = new Map((installed ?? []).map((row) => [row.catalogId, row]));
  const rows = teams.map((team) => {
    const installedTeam = installedByCatalogId.get(team.id);
    if (installedTeam) {
      installedByCatalogId.delete(team.id);
    }
    return buildCatalogTeamStatusRow(team, installedTeam ?? null);
  });

View on GitHub (pinned to 120ae5428f)