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
- 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)