mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-10 01:50:13 +01:00
## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - The feature map describes product areas and verification entry points. > - Storybook has 223 story suites that show production components, proposals, and retained history. > - The parent PR maps those suites to features, but their folders and sidebar still use unrelated groups. > - This pull request puts the existing suites under feature folders and uses the feature map's names and order in the sidebar. > - Explicit meta IDs preserve existing story links while the titles change. > - Contributors can find stories through the same product structure without losing examples. ## Linked Issues or Issue Description Refs #16046. This is the requested follow-up. Parent #16046 is merged. This PR now targets master, with its single follow-up commit rebased onto the parent squash merge. The Storybook implementation is unchanged by that rebase. Related open Storybook PRs were checked; this change organizes existing suites and adds no product capability. ## What Changed - Move all 223 story files into folders named for their primary feature area. Keep useful scenario groups below the feature's sidebar label. - Order the sidebar by the eight feature-map sections. Put Overview first and shared Foundations last. Leave areas with no stories out of the sidebar. - Move 19 support files into `ui/storybook/support/` and update relative imports and active documentation. - Preserve all 2,210 story IDs and the single docs ID through explicit CSF meta IDs. Keep all entry names and story exports. - Record stable IDs and sidebar titles in the downstream catalog. Validate feature folders, title prefixes, and IDs. Update the maintenance skill and review evidence. ## Verification - Storybook build passed. Built index comparison against parent `75bd3c977cd828d5222823850339e8204f40eb47` found the same 2,211 entries, IDs, and names. - UI typecheck passed (`ui/node_modules/.bin/tsc -b` from `ui`, invoked as `./node_modules/.bin/tsc -b`). - UI Vitest project: 728 files and 8,176 tests passed. - Catalog checker and its nine tests passed. Feature-map checks, token gates, and the maintenance-skill validator passed. - Chromium: nine existing play cases and one render case reached `storyFinished: success` with no page exceptions. The guide rendered, sidebar sections followed map order, and a search for `steering/queue` opened its preserved story link. - Source comparison found only meta title/ID changes, rebased relative references, and updated fixture path text in story files. - To inspect: build Storybook, start `node scripts/serve-storybook-static.mjs --port 6136`, and open the Overview guide. Expand feature folders and use existing story links. - The complete repository suite was not repeated for this organization change. The parent records a backend timeout that passed in isolation, without a complete broad-suite pass. Visual comparisons remain blocked by the unpublished empty baseline. The separate fixture-server story was not run. ## Risks - Open branches that add stories under old paths will need to choose a feature folder and update the catalog. Cross-feature suites have one primary home and retain related capability references. - Sidebar paths change; story and docs IDs remain stable. Automated references to source paths may need the new location. - This is one requested follow-up with 258 changed files, mostly moves. It exceeds the usual review-size guideline because splitting it would leave the sidebar and folder convention partly migrated. - Browser verification samples ten stories, not all 2,210. Existing production/prototype classifications and review gaps remain unchanged. - Required CI gates and a 5/5 review passed on the original head. Fresh checks and review are running for the rebased head. Catalog validation and all nine checker tests passed after rebase; UI, map, skill, and checker contents are identical to the original reviewed head. ## Model Used - OpenAI Codex, GPT-6. The exact runtime model ID and context-window size are not exposed in this session. Used reasoning, repository inspection, code execution, and local browser automation. ## 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 searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [ ] All Paperclip CI gates are green - [ ] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge Co-authored-by: Paperclip <noreply@paperclip.ing>
167 lines
6.8 KiB
TypeScript
167 lines
6.8 KiB
TypeScript
import type {
|
|
CatalogTeam,
|
|
CatalogTeamSkillPreparation,
|
|
InstalledCatalogTeam,
|
|
} from "@paperclipai/shared";
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Shared Team Catalog fixtures.
|
|
//
|
|
// Used by both the Storybook stories (ui/storybook/stories/teams/team-catalog.stories.tsx)
|
|
// and the in-app /design-guide showcase so the two surfaces stay in sync.
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export const sampleTeam: CatalogTeam = {
|
|
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:
|
|
"A starter executive team: a CEO who manages a CTO and a CMO, plus a launch project and a weekly standup routine. Installs ready-to-run agents you can customize.",
|
|
path: "catalog/bundled/company-defaults/core-exec-team",
|
|
entrypoint: "TEAM.md",
|
|
schema: "agentcompanies/v1",
|
|
defaultInstall: true,
|
|
recommendedForCompanyTypes: ["company-root"],
|
|
tags: ["exec", "starter"],
|
|
counts: {
|
|
agents: 3,
|
|
projects: 1,
|
|
tasks: 1,
|
|
routines: 1,
|
|
localSkills: 1,
|
|
catalogSkills: 1,
|
|
externalSkillSources: 1,
|
|
},
|
|
rootAgentSlugs: ["ceo"],
|
|
agentSlugs: ["ceo", "cto", "cmo"],
|
|
projectSlugs: ["launch"],
|
|
requiredSkills: [
|
|
{ type: "catalog", ref: "engineering/code-review", agentSlugs: ["cto"], resolved: true, catalogSkillKey: "engineering/code-review" },
|
|
{ type: "github", ref: "acme/growth-playbook@v1.2.0", agentSlugs: ["cmo"], resolved: false, sourceRef: "v1.2.0" },
|
|
],
|
|
envInputs: [
|
|
{ key: "OPENAI_API_KEY", agentSlug: "cto", projectSlug: null, kind: "secret", requirement: "required" },
|
|
{ key: "DEFAULT_TIMEZONE", agentSlug: null, projectSlug: "launch", kind: "plain", requirement: "optional" },
|
|
],
|
|
sourceRefs: [
|
|
{ type: "github", ref: "acme/growth-playbook@v1.2.0", pinned: true },
|
|
{ type: "url", ref: "https://example.com/policies/brand.md", pinned: false },
|
|
],
|
|
files: [
|
|
{ path: "TEAM.md", kind: "team", sizeBytes: 2144, sha256: "a1" },
|
|
{ path: "README.md", kind: "readme", sizeBytes: 980, sha256: "a2" },
|
|
{ path: "agents/ceo/AGENTS.md", kind: "agent", sizeBytes: 1200, sha256: "a3" },
|
|
{ path: "agents/cto/AGENTS.md", kind: "agent", sizeBytes: 1100, sha256: "a4" },
|
|
{ path: "agents/cmo/AGENTS.md", kind: "agent", sizeBytes: 1050, sha256: "a5" },
|
|
{ path: "projects/launch/PROJECT.md", kind: "project", sizeBytes: 640, sha256: "a6" },
|
|
],
|
|
trustLevel: "external_sources",
|
|
compatibility: "compatible",
|
|
contentHash: "sha256:deadbeefdeadbeefdeadbeefdeadbeef",
|
|
packageName: "@paperclipai/teams-catalog",
|
|
packageVersion: "0.1.0",
|
|
};
|
|
|
|
export const optionalTeam: CatalogTeam = {
|
|
...sampleTeam,
|
|
id: "paperclipai:optional:software-development:platform-pod",
|
|
key: "paperclipai/optional/software-development/platform-pod",
|
|
kind: "optional",
|
|
category: "software-development",
|
|
slug: "platform-pod",
|
|
name: "Platform Engineering Pod",
|
|
description: "An optional platform pod with a tech lead and two engineers.",
|
|
recommendedForCompanyTypes: [],
|
|
counts: { ...sampleTeam.counts, agents: 4, routines: 2 },
|
|
rootAgentSlugs: ["tech-lead"],
|
|
agentSlugs: ["tech-lead", "eng-1", "eng-2", "sre"],
|
|
trustLevel: "markdown_only",
|
|
sourceRefs: [],
|
|
};
|
|
|
|
export const warnTeam: CatalogTeam = {
|
|
...sampleTeam,
|
|
id: "paperclipai:optional:research:lab-with-local-source",
|
|
slug: "lab-with-local-source",
|
|
name: "Research Lab (local source)",
|
|
kind: "optional",
|
|
category: "research",
|
|
trustLevel: "scripts_executables",
|
|
sourceRefs: [
|
|
{ type: "url", ref: "https://example.com/unpinned.md", pinned: false },
|
|
{ type: "local_path", ref: "/Users/dev/skills/secret-sauce", pinned: false },
|
|
],
|
|
};
|
|
|
|
// Server-computed installed-team state (PAP-10256). Drives the `INSTALLED · N`
|
|
// group, the per-row out-of-date badge, and the detail header chip. Shared by
|
|
// the Storybook stories and /design-guide showcase so they stay in sync.
|
|
export const outOfDateInstalledState: InstalledCatalogTeam = {
|
|
catalogId: sampleTeam.id,
|
|
catalogKey: sampleTeam.key,
|
|
present: true,
|
|
currentContentHash: sampleTeam.contentHash,
|
|
installedOriginHashes: ["sha256:0000older0000older0000older"],
|
|
agentCount: 3,
|
|
outOfDate: true,
|
|
};
|
|
|
|
export const currentInstalledState: InstalledCatalogTeam = {
|
|
...outOfDateInstalledState,
|
|
installedOriginHashes: [sampleTeam.contentHash],
|
|
outOfDate: false,
|
|
};
|
|
|
|
export const sampleSkillPreparations: CatalogTeamSkillPreparation[] = [
|
|
{ type: "catalog", ref: "engineering/code-review", agentSlugs: ["cto"], action: "already_in_package", catalogSkillId: "skill-1", catalogSkillKey: "engineering/code-review", sourceLocator: null, sourceRef: null, reason: null },
|
|
{ type: "github", ref: "acme/growth-playbook@v1.2.0", agentSlugs: ["cmo"], action: "external_import_required", catalogSkillId: null, catalogSkillKey: null, sourceLocator: "github.com/acme/growth-playbook", sourceRef: "v1.2.0", reason: "Resolved from GitHub at install time" },
|
|
];
|
|
|
|
// Onboarding "Pick a starter team" grid (design §6): `defaultInstall` bundled
|
|
// teams restricted to markdown_only/assets trust. Shared by the TeamCard
|
|
// Storybook fixture and the /design-guide showcase so they stay in sync.
|
|
export const onboardingTeams: CatalogTeam[] = [
|
|
{
|
|
...sampleTeam,
|
|
trustLevel: "markdown_only",
|
|
sourceRefs: [],
|
|
requiredSkills: [],
|
|
counts: { ...sampleTeam.counts, localSkills: 0, catalogSkills: 0, externalSkillSources: 0 },
|
|
},
|
|
{
|
|
...sampleTeam,
|
|
id: "paperclipai:bundled:company-defaults:growth-pod",
|
|
key: "paperclipai/bundled/company-defaults/growth-pod",
|
|
slug: "growth-pod",
|
|
name: "Growth Pod",
|
|
description:
|
|
"A lean growth squad: a head of growth managing a content marketer and a data analyst, wired to a launch project and a weekly metrics routine.",
|
|
tags: ["growth", "marketing", "starter"],
|
|
counts: { agents: 3, projects: 1, tasks: 0, routines: 1, localSkills: 0, catalogSkills: 0, externalSkillSources: 0 },
|
|
rootAgentSlugs: ["head-of-growth"],
|
|
agentSlugs: ["head-of-growth", "content-marketer", "data-analyst"],
|
|
trustLevel: "assets",
|
|
sourceRefs: [],
|
|
requiredSkills: [],
|
|
},
|
|
{
|
|
...sampleTeam,
|
|
id: "paperclipai:bundled:company-defaults:support-pod",
|
|
key: "paperclipai/bundled/company-defaults/support-pod",
|
|
slug: "support-pod",
|
|
name: "Support Pod",
|
|
description: "A two-person support desk with a lead and an agent, plus a triage routine.",
|
|
tags: ["support", "ops"],
|
|
counts: { agents: 2, projects: 0, tasks: 0, routines: 1, localSkills: 0, catalogSkills: 0, externalSkillSources: 0 },
|
|
rootAgentSlugs: ["support-lead"],
|
|
agentSlugs: ["support-lead", "support-agent"],
|
|
projectSlugs: [],
|
|
trustLevel: "markdown_only",
|
|
sourceRefs: [],
|
|
requiredSkills: [],
|
|
},
|
|
];
|