fff3832a01
Fixes #7551 ## Thinking Path > - Paperclip is the control plane for AI-agent companies, and reusable company/team setup is part of making those companies faster to launch. > - The teams catalog work introduces app-shipped team templates that can be browsed, previewed, and installed into a company. > - Catalog installation crosses several contracts: bundled package contents, shared API types, server import/install behavior, CLI workflows, and the board UI. > - Agents also need a safe path through catalog installs: scoped company selection, explicit source policy, approval fallback for agent creation, and preserved catalog provenance. > - This pull request extracts the completed teams catalog branch into one reviewable PR on top of `public-gh/master`. > - The benefit is a reusable teams catalog foundation with server, CLI, package, docs, and hidden UI surfaces kept in sync. ## What Changed - Added the `@paperclipai/teams-catalog` package with bundled/optional team definitions, generated manifest, validators, catalog builder tests, and migration notes. - Added shared teams catalog types/validators plus server routes and services for listing, previewing, and installing catalog teams. - Integrated catalog install with company portability, skill/source policy checks, provenance metadata, origin hashes, target-manager reparenting, and installed/out-of-date detection. - Added CLI `teams` commands and agent-safe company selection behavior, including `company current` and approval fallback for forbidden agent-run installs. - Added hidden Team Catalog UI/API/query surfaces, Storybook fixtures, and targeted UI tests while keeping the UI route out of primary navigation. - Added docs for CLI/company/teams catalog behavior and removed generated screenshot artifacts from the PR diff. ## Verification - `pnpm exec vitest run cli/src/__tests__/company.test.ts cli/src/__tests__/teams.test.ts packages/teams-catalog/src/catalog-builder.test.ts packages/teams-catalog/src/shipped-catalog.test.ts server/src/__tests__/agent-permissions-service.test.ts server/src/__tests__/company-portability.test.ts server/src/__tests__/company-skills-service.test.ts server/src/__tests__/teams-catalog-routes.test.ts server/src/__tests__/teams-catalog-service.test.ts server/src/__tests__/teams-catalog-install-no-overrides.test.ts ui/src/lib/company-routes.test.ts ui/src/pages/TeamCard.test.tsx ui/src/pages/TeamCatalog.test.tsx ui/src/pages/useInstallTeamCatalogEntry.test.tsx` - `pnpm --filter @paperclipai/shared typecheck && pnpm --filter @paperclipai/teams-catalog typecheck && pnpm --filter paperclipai typecheck && pnpm --filter @paperclipai/server typecheck && pnpm --filter @paperclipai/ui typecheck` - Confirmed branch is rebased onto `public-gh/master` (`78dc3625a`) and `public-gh/master` is an ancestor of `HEAD`. - Confirmed PR diff excludes `pnpm-lock.yaml`, `.github/workflows/*`, generated screenshot images, and screenshot helper scripts. ## Risks - Medium review surface: this crosses package generation, shared contracts, server install behavior, CLI, docs, and hidden UI code. - Catalog install behavior creates agents/projects/tasks/skills and must keep company scoping, permissions, source policy, and provenance checks strict. - `pnpm-lock.yaml` is intentionally excluded per repo policy; CI/default-branch automation owns lockfile refresh. - The Team Catalog UI is included but hidden from primary navigation, so future enablement should re-check visual QA before exposure. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. > > ROADMAP checked: this aligns with reusable companies/templates and plugin-adjacent onboarding work. This PR packages work already developed on the Paperclip task branch for review. ## Model Used - OpenAI Codex, GPT-5 series coding agent in this Paperclip session; exact runtime context window was not exposed. Used shell, git, `gh`, and local test/typecheck tooling. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I have included before/after screenshots, or documented why screenshots are intentionally omitted - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
468 lines
14 KiB
JSON
468 lines
14 KiB
JSON
{
|
|
"schemaVersion": 1,
|
|
"packageName": "@paperclipai/teams-catalog",
|
|
"packageVersion": "0.1.0",
|
|
"generatedAt": "2026-06-04T18:03:41.262Z",
|
|
"teams": [
|
|
{
|
|
"id": "paperclipai:bundled:company-defaults:core-exec-team",
|
|
"key": "paperclipai/bundled/company-defaults/core-exec-team",
|
|
"kind": "bundled",
|
|
"category": "company-defaults",
|
|
"slug": "core-exec-team",
|
|
"name": "Core Exec Team",
|
|
"description": "Default leadership and engineering team for bootstrapping a Paperclip company with a CEO, CTO, QA Engineer, starter project, and a recurring CEO heartbeat review task.",
|
|
"path": "catalog/bundled/company-defaults/core-exec-team",
|
|
"entrypoint": "TEAM.md",
|
|
"schema": "agentcompanies/v1",
|
|
"defaultInstall": true,
|
|
"recommendedForCompanyTypes": [
|
|
"startup",
|
|
"software",
|
|
"generalist"
|
|
],
|
|
"tags": [
|
|
"default",
|
|
"executive",
|
|
"engineering",
|
|
"qa"
|
|
],
|
|
"counts": {
|
|
"agents": 3,
|
|
"projects": 1,
|
|
"tasks": 0,
|
|
"routines": 1,
|
|
"localSkills": 0,
|
|
"catalogSkills": 4,
|
|
"externalSkillSources": 0
|
|
},
|
|
"rootAgentSlugs": [
|
|
"ceo"
|
|
],
|
|
"agentSlugs": [
|
|
"ceo",
|
|
"cto",
|
|
"qa"
|
|
],
|
|
"projectSlugs": [
|
|
"first-project"
|
|
],
|
|
"requiredSkills": [
|
|
{
|
|
"type": "catalog",
|
|
"ref": "github-pr-workflow",
|
|
"agentSlugs": [
|
|
"cto"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:software-development:github-pr-workflow",
|
|
"catalogSkillKey": "paperclipai/bundled/software-development/github-pr-workflow"
|
|
},
|
|
{
|
|
"type": "catalog",
|
|
"ref": "issue-triage",
|
|
"agentSlugs": [
|
|
"ceo"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:paperclip-operations:issue-triage",
|
|
"catalogSkillKey": "paperclipai/bundled/paperclip-operations/issue-triage"
|
|
},
|
|
{
|
|
"type": "catalog",
|
|
"ref": "qa-acceptance",
|
|
"agentSlugs": [
|
|
"qa"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:quality:qa-acceptance",
|
|
"catalogSkillKey": "paperclipai/bundled/quality/qa-acceptance"
|
|
},
|
|
{
|
|
"type": "catalog",
|
|
"ref": "task-planning",
|
|
"agentSlugs": [
|
|
"ceo",
|
|
"cto"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:paperclip-operations:task-planning",
|
|
"catalogSkillKey": "paperclipai/bundled/paperclip-operations/task-planning"
|
|
}
|
|
],
|
|
"envInputs": [],
|
|
"sourceRefs": [],
|
|
"files": [
|
|
{
|
|
"path": "TEAM.md",
|
|
"kind": "team",
|
|
"sizeBytes": 2144,
|
|
"sha256": "4ab4f57f147e89a56a6753755d7ef142d91741b3c0159f2e53fb333cd2779eaf"
|
|
},
|
|
{
|
|
"path": "agents/ceo/AGENTS.md",
|
|
"kind": "agent",
|
|
"sizeBytes": 2492,
|
|
"sha256": "50f580c51807762265f09c6fe7bf32d7701d64caeb30595bfd577b2f5087c21b"
|
|
},
|
|
{
|
|
"path": "agents/cto/AGENTS.md",
|
|
"kind": "agent",
|
|
"sizeBytes": 1449,
|
|
"sha256": "596e2e9fe08d7368b3b0cfe72c2635ea80444d92a2c0414157bfb0a17773fcaf"
|
|
},
|
|
{
|
|
"path": "agents/qa/AGENTS.md",
|
|
"kind": "agent",
|
|
"sizeBytes": 1307,
|
|
"sha256": "2a139b88b4b98516048395c569c1bc74fd31cdc2da65db410e9779b8d92c0343"
|
|
},
|
|
{
|
|
"path": "projects/first-project/PROJECT.md",
|
|
"kind": "project",
|
|
"sizeBytes": 364,
|
|
"sha256": "1f457ae956da52ff83adc1cf63a3fb84337a4afb25bd43f0d123902d75e871cc"
|
|
},
|
|
{
|
|
"path": "projects/first-project/tasks/first-heartbeat/TASK.md",
|
|
"kind": "task",
|
|
"sizeBytes": 292,
|
|
"sha256": "bdc979cafa43fc9b8f0d6f0e4120c01cecfb899082781a5da88e26fa262f18e4"
|
|
}
|
|
],
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"contentHash": "sha256:0f20e9d56124c1dc90a1e4b128fabd863538bcc935117220f719d9620f7c89f1"
|
|
},
|
|
{
|
|
"id": "paperclipai:bundled:product:product-design",
|
|
"key": "paperclipai/bundled/product/product-design",
|
|
"kind": "bundled",
|
|
"category": "product",
|
|
"slug": "product-design",
|
|
"name": "Product Design",
|
|
"description": "Bundled product design team with a Principal Product Designer who owns wireframes, design critiques, and UX quality reviews for a product company.",
|
|
"path": "catalog/bundled/product/product-design",
|
|
"entrypoint": "TEAM.md",
|
|
"schema": "agentcompanies/v1",
|
|
"defaultInstall": false,
|
|
"recommendedForCompanyTypes": [
|
|
"software",
|
|
"product",
|
|
"design"
|
|
],
|
|
"tags": [
|
|
"design",
|
|
"ux",
|
|
"product"
|
|
],
|
|
"counts": {
|
|
"agents": 1,
|
|
"projects": 1,
|
|
"tasks": 0,
|
|
"routines": 1,
|
|
"localSkills": 0,
|
|
"catalogSkills": 3,
|
|
"externalSkillSources": 0
|
|
},
|
|
"rootAgentSlugs": [
|
|
"ux-designer"
|
|
],
|
|
"agentSlugs": [
|
|
"ux-designer"
|
|
],
|
|
"projectSlugs": [
|
|
"product-design"
|
|
],
|
|
"requiredSkills": [
|
|
{
|
|
"type": "catalog",
|
|
"ref": "design-critique",
|
|
"agentSlugs": [
|
|
"ux-designer"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:optional:product:design-critique",
|
|
"catalogSkillKey": "paperclipai/optional/product/design-critique"
|
|
},
|
|
{
|
|
"type": "catalog",
|
|
"ref": "task-planning",
|
|
"agentSlugs": [
|
|
"ux-designer"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:paperclip-operations:task-planning",
|
|
"catalogSkillKey": "paperclipai/bundled/paperclip-operations/task-planning"
|
|
},
|
|
{
|
|
"type": "catalog",
|
|
"ref": "wireframe",
|
|
"agentSlugs": [
|
|
"ux-designer"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:product:wireframe",
|
|
"catalogSkillKey": "paperclipai/bundled/product/wireframe"
|
|
}
|
|
],
|
|
"envInputs": [],
|
|
"sourceRefs": [],
|
|
"files": [
|
|
{
|
|
"path": "TEAM.md",
|
|
"kind": "team",
|
|
"sizeBytes": 2074,
|
|
"sha256": "205be8d3ef6c1f5e73729207913c387eee4cc9379191c3ce6d943fcf9ca2545d"
|
|
},
|
|
{
|
|
"path": "agents/ux-designer/AGENTS.md",
|
|
"kind": "agent",
|
|
"sizeBytes": 2136,
|
|
"sha256": "f5a4b5696d8249e9f9d808a4373c2a1e6b07faa463e72f83fd9d5bed98d2022f"
|
|
},
|
|
{
|
|
"path": "projects/product-design/PROJECT.md",
|
|
"kind": "project",
|
|
"sizeBytes": 353,
|
|
"sha256": "4afe346bc5d5958216542d60a06be12983e1e018960cf2709c85c7d578f28420"
|
|
},
|
|
{
|
|
"path": "projects/product-design/tasks/weekly-design-review/TASK.md",
|
|
"kind": "task",
|
|
"sizeBytes": 313,
|
|
"sha256": "d255115eccc5c8b9f576c34fc2fb46a1cbb86ab36a56b980bdab35a952482d8a"
|
|
}
|
|
],
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"contentHash": "sha256:15a04b36f31d4c9a391bb499c92e91fedfcc237cfa6c3d41ea3ddb441bc85c5b"
|
|
},
|
|
{
|
|
"id": "paperclipai:bundled:software-development:product-engineering",
|
|
"key": "paperclipai/bundled/software-development/product-engineering",
|
|
"kind": "bundled",
|
|
"category": "software-development",
|
|
"slug": "product-engineering",
|
|
"name": "Product Engineering",
|
|
"description": "Bundled engineering team that pairs a CTO with a senior coder and a QA engineer to deliver, review, and verify product changes.",
|
|
"path": "catalog/bundled/software-development/product-engineering",
|
|
"entrypoint": "TEAM.md",
|
|
"schema": "agentcompanies/v1",
|
|
"defaultInstall": false,
|
|
"recommendedForCompanyTypes": [
|
|
"software",
|
|
"startup",
|
|
"product"
|
|
],
|
|
"tags": [
|
|
"engineering",
|
|
"delivery",
|
|
"qa",
|
|
"code-review"
|
|
],
|
|
"counts": {
|
|
"agents": 3,
|
|
"projects": 1,
|
|
"tasks": 0,
|
|
"routines": 1,
|
|
"localSkills": 0,
|
|
"catalogSkills": 4,
|
|
"externalSkillSources": 0
|
|
},
|
|
"rootAgentSlugs": [
|
|
"cto"
|
|
],
|
|
"agentSlugs": [
|
|
"cto",
|
|
"qa",
|
|
"senior-coder"
|
|
],
|
|
"projectSlugs": [
|
|
"product-engineering"
|
|
],
|
|
"requiredSkills": [
|
|
{
|
|
"type": "catalog",
|
|
"ref": "doc-maintenance",
|
|
"agentSlugs": [
|
|
"cto",
|
|
"senior-coder"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:docs:doc-maintenance",
|
|
"catalogSkillKey": "paperclipai/bundled/docs/doc-maintenance"
|
|
},
|
|
{
|
|
"type": "catalog",
|
|
"ref": "github-pr-workflow",
|
|
"agentSlugs": [
|
|
"cto",
|
|
"senior-coder"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:software-development:github-pr-workflow",
|
|
"catalogSkillKey": "paperclipai/bundled/software-development/github-pr-workflow"
|
|
},
|
|
{
|
|
"type": "catalog",
|
|
"ref": "qa-acceptance",
|
|
"agentSlugs": [
|
|
"qa"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:quality:qa-acceptance",
|
|
"catalogSkillKey": "paperclipai/bundled/quality/qa-acceptance"
|
|
},
|
|
{
|
|
"type": "catalog",
|
|
"ref": "task-planning",
|
|
"agentSlugs": [
|
|
"cto"
|
|
],
|
|
"resolved": true,
|
|
"catalogSkillId": "paperclipai:bundled:paperclip-operations:task-planning",
|
|
"catalogSkillKey": "paperclipai/bundled/paperclip-operations/task-planning"
|
|
}
|
|
],
|
|
"envInputs": [],
|
|
"sourceRefs": [],
|
|
"files": [
|
|
{
|
|
"path": "TEAM.md",
|
|
"kind": "team",
|
|
"sizeBytes": 2583,
|
|
"sha256": "7204eeef78a48714dd3f82b82e171a4039adc6325e91a6bdf51a442105ee33b0"
|
|
},
|
|
{
|
|
"path": ".paperclip.yaml",
|
|
"kind": "extension",
|
|
"sizeBytes": 81,
|
|
"sha256": "54babf05ba130ec54a143abf01581d99c0ac2936fd0d929bf0e0edd00e29d861"
|
|
},
|
|
{
|
|
"path": "agents/cto/AGENTS.md",
|
|
"kind": "agent",
|
|
"sizeBytes": 1499,
|
|
"sha256": "0a1a73ec9e5008056bca0a26325131ded2fcf4c4680a5014ba1e13400b32c173"
|
|
},
|
|
{
|
|
"path": "agents/qa/AGENTS.md",
|
|
"kind": "agent",
|
|
"sizeBytes": 1223,
|
|
"sha256": "2d5738f831aa772befa3471c844a0c9e611584be668e3ec82580ca9e92dc13fc"
|
|
},
|
|
{
|
|
"path": "agents/senior-coder/AGENTS.md",
|
|
"kind": "agent",
|
|
"sizeBytes": 1413,
|
|
"sha256": "b61071518755d9e584c099ae2082c7a78448d09586093ee91393082fe10872b5"
|
|
},
|
|
{
|
|
"path": "projects/product-engineering/PROJECT.md",
|
|
"kind": "project",
|
|
"sizeBytes": 358,
|
|
"sha256": "225d01c5b5b77f5d4dafedc083899c9368c9b079db1d3b7b67cfebd4677fc527"
|
|
},
|
|
{
|
|
"path": "projects/product-engineering/tasks/weekly-engineering-sync/TASK.md",
|
|
"kind": "task",
|
|
"sizeBytes": 322,
|
|
"sha256": "6acf3ed2da3dfa48de163810b4bc9d385dad537fd34037ca881eec713986a2a8"
|
|
}
|
|
],
|
|
"trustLevel": "assets",
|
|
"compatibility": "compatible",
|
|
"contentHash": "sha256:74ddeaeb11805835a4a67fc4530b048ab7f8aa1dc7d2b80acea139a933d158d3"
|
|
},
|
|
{
|
|
"id": "paperclipai:optional:content:content-machine",
|
|
"key": "paperclipai/optional/content/content-machine",
|
|
"kind": "optional",
|
|
"category": "content",
|
|
"slug": "content-machine",
|
|
"name": "Content Machine",
|
|
"description": "Optional content operations team with a lead agent, a recurring review task, and a vendored local content planning skill.",
|
|
"path": "catalog/optional/content/content-machine",
|
|
"entrypoint": "TEAM.md",
|
|
"schema": "agentcompanies/v1",
|
|
"defaultInstall": false,
|
|
"recommendedForCompanyTypes": [
|
|
"agency",
|
|
"marketing"
|
|
],
|
|
"tags": [
|
|
"content",
|
|
"marketing",
|
|
"routines"
|
|
],
|
|
"counts": {
|
|
"agents": 1,
|
|
"projects": 1,
|
|
"tasks": 0,
|
|
"routines": 1,
|
|
"localSkills": 1,
|
|
"catalogSkills": 0,
|
|
"externalSkillSources": 0
|
|
},
|
|
"rootAgentSlugs": [
|
|
"content-lead"
|
|
],
|
|
"agentSlugs": [
|
|
"content-lead"
|
|
],
|
|
"projectSlugs": [
|
|
"content-operations"
|
|
],
|
|
"requiredSkills": [
|
|
{
|
|
"type": "local",
|
|
"ref": "content-calendar",
|
|
"agentSlugs": [
|
|
"content-lead"
|
|
],
|
|
"resolved": true,
|
|
"localPath": "skills/content-calendar/SKILL.md"
|
|
}
|
|
],
|
|
"envInputs": [],
|
|
"sourceRefs": [],
|
|
"files": [
|
|
{
|
|
"path": "TEAM.md",
|
|
"kind": "team",
|
|
"sizeBytes": 1032,
|
|
"sha256": "f7c272c8b0c183fc840d49eb4851b7cdd1a30a5aa8d6415d215110f3238f6f13"
|
|
},
|
|
{
|
|
"path": "agents/content-lead/AGENTS.md",
|
|
"kind": "agent",
|
|
"sizeBytes": 251,
|
|
"sha256": "6fc2071ff463b6981780d5b40b2c0784cb119900062f8dc40ed372e7b8415bf7"
|
|
},
|
|
{
|
|
"path": "projects/content-operations/PROJECT.md",
|
|
"kind": "project",
|
|
"sizeBytes": 338,
|
|
"sha256": "1471f61cb0b3ffbb9c639a99d2d370f08217a0c63f97b3e24dbbd47861110206"
|
|
},
|
|
{
|
|
"path": "projects/content-operations/tasks/weekly-content-review/TASK.md",
|
|
"kind": "task",
|
|
"sizeBytes": 236,
|
|
"sha256": "3777de716334f2c3f24176f0fe121584ce9c53a7f59e1fca942a2f57995cef77"
|
|
},
|
|
{
|
|
"path": "skills/content-calendar/SKILL.md",
|
|
"kind": "skill",
|
|
"sizeBytes": 340,
|
|
"sha256": "aa62a332fc3149d6c0d58ca589c6b3910a373d542f16f749ec68ef2f3d7f29e9"
|
|
}
|
|
],
|
|
"trustLevel": "markdown_only",
|
|
"compatibility": "compatible",
|
|
"contentHash": "sha256:06822cec5f2b6910cb37ba0ebd5e04ed5c7e34f77225564ddddc2470779cdaa6"
|
|
}
|
|
]
|
|
}
|