export type ProfileId = 'developer' | 'architect' | 'sa' | 'pm' | 'mulesoft' | 'ux' | 'cgcloud' | 'qa' | 'crma' | 'commerce' | 'data360' | 'sfmc' | 'salescloud' | 'service' | 'cpq' | 'omnistudio' | 'fsl' | 'ai' | 'slack' | 'tableau' | 'experience-cloud' | 'release-manager' | 'fsc' | 'health' | 'manufacturing' | 'communications' | 'automotive' | 'education' | 'netzero' | 'nonprofit' | 'public-sector' | 'media' | 'energy' | 'revenue' | 'maps' | 'loyalty' | 'industries'; export type ProfileCapability = 'story-mapping' | 'deploy' | 'code-analysis' | 'backlog-sync' | 'elements-sync' | 'doc-sync' | 'prompt-registry' | 'declare-points' | 'qa-evidence' | 'oclif-plugin' | 'project-knowledge-bootstrap' | 'transcription' | 'org-assessment' | 'story-refinement' | 'adr' | 'decomposition' | 'rom' | 'mobile-appium-testing' | 'audience-tailored-reports'; export type ProfileOrchestrationMetadata = { activationCriteria: string[]; expectedEvidence: string[]; gates: string[]; }; /** * Controls how a Cursor .mdc rule is loaded: * - 'always' → alwaysApply: true, no globs (injected every turn) * - 'auto-attach' → alwaysApply: false, globs set (injected when matching files are open) * - 'description' → alwaysApply: false, no globs (injected by AI judgment from description) */ export type CursorScope = 'always' | 'auto-attach' | 'description'; export type ProfileCategory = 'technical' | 'functional' | 'role' | 'product'; export type Profile = { id: ProfileId; label: string; category?: ProfileCategory; ruleFile: string; extensions: string[]; capabilities: ProfileCapability[]; orchestration?: ProfileOrchestrationMetadata; /** Cursor rule loading mode. Defaults to 'always' if omitted. */ cursorScope?: CursorScope; /** File globs for Cursor auto-attach mode. Only used when cursorScope is 'auto-attach'. */ globs?: string[]; /** If true, included via @ import in CLAUDE.md and AGENTS.md root files. Defaults to false. */ claudeAlwaysImport?: boolean; /** * Role-targeted content fragments for PRODUCT profiles (product-profile-role-fusion). When * this product profile is selected alongside a role profile whose id matches a key here, that * role's generated rule content gets these extra lines appended and this product does NOT get * its own standalone rule file/subagent for this run (see `resolveProductRoleFusion` in * `src/services/product-role-fusion.ts`). A product with no fragment for any selected role — or * selected with no role at all — falls back to generating its own standalone file/subagent, so * content is never silently dropped. * * Keys should be role profile ids (see `ROLE_PROFILE_IDS` in `./categories.js`) — not enforced * at the type level to avoid a circular import between `types.ts` and `categories.ts`; validated * at runtime by a unit test instead (every key in every profile's `roleSections` must be a real * role id). */ roleSections?: Partial string[]>>; ruleContent(): string; /** Profile-specific Agentforce Vibes workflows. Returns filename → markdown content. */ workflows?(version: string): Record; detect?(cwd: string): boolean; };