@primeuicom/agent-setup 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/index.d.ts +136 -0
  2. package/dist/index.js +1002 -0
  3. package/dist/index.js.map +1 -0
  4. package/package.json +37 -0
  5. package/presets/claude-code/.claude/settings.json +25 -0
  6. package/presets/claude-code/.claude/skills/git-commit/SKILL.md +124 -0
  7. package/presets/claude-code/.claude/skills/next-best-practices/SKILL.md +152 -0
  8. package/presets/claude-code/.claude/skills/tailwind-design-system/SKILL.md +874 -0
  9. package/presets/claude-code/.claude/skills/vitest/SKILL.md +52 -0
  10. package/presets/claude-code/.mcp.json +25 -0
  11. package/presets/claude-code/skills-lock.json +16 -0
  12. package/presets/codex/.agents/skills/git-commit/SKILL.md +124 -0
  13. package/presets/codex/.agents/skills/next-best-practices/SKILL.md +152 -0
  14. package/presets/codex/.agents/skills/tailwind-design-system/SKILL.md +874 -0
  15. package/presets/codex/.agents/skills/vitest/SKILL.md +52 -0
  16. package/presets/codex/.codex/config.toml +17 -0
  17. package/presets/codex/skills-lock.json +16 -0
  18. package/presets/cursor/.agents/skills/git-commit/SKILL.md +124 -0
  19. package/presets/cursor/.agents/skills/next-best-practices/SKILL.md +152 -0
  20. package/presets/cursor/.agents/skills/tailwind-design-system/SKILL.md +874 -0
  21. package/presets/cursor/.agents/skills/vitest/SKILL.md +52 -0
  22. package/presets/cursor/.cursor/cli.json +17 -0
  23. package/presets/cursor/.cursor/mcp.json +25 -0
  24. package/presets/cursor/.mcp.json +28 -0
  25. package/presets/cursor/skills-lock.json +16 -0
  26. package/presets/gemini-cli/.agents/skills/git-commit/SKILL.md +124 -0
  27. package/presets/gemini-cli/.agents/skills/next-best-practices/SKILL.md +152 -0
  28. package/presets/gemini-cli/.agents/skills/tailwind-design-system/SKILL.md +874 -0
  29. package/presets/gemini-cli/.agents/skills/vitest/SKILL.md +52 -0
  30. package/presets/gemini-cli/.gemini/settings.json +25 -0
  31. package/presets/gemini-cli/skills-lock.json +16 -0
  32. package/presets/mcporter/config/mcporter.json +25 -0
  33. package/presets/opencode/.agents/skills/git-commit/SKILL.md +124 -0
  34. package/presets/opencode/.agents/skills/next-best-practices/SKILL.md +152 -0
  35. package/presets/opencode/.agents/skills/tailwind-design-system/SKILL.md +874 -0
  36. package/presets/opencode/.agents/skills/vitest/SKILL.md +52 -0
  37. package/presets/opencode/opencode.json +34 -0
  38. package/presets/opencode/skills-lock.json +16 -0
  39. package/presets/vscode/.vscode/mcp.json +25 -0
  40. package/presets/zed/.zed/settings.json +31 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ai-presets.ts","../src/agent-presets.ts","../src/ai-setup-config.ts","../src/ai-setup.ts","../src/errors.ts","../src/detect-agent-setup.ts","../src/infer-ai-preset.ts"],"sourcesContent":["export const PRIMEUI_AI_PRESET_VALUES = [\"codex\", \"claude\", \"cursor\"] as const;\n\nexport type PrimeUiAiPreset = (typeof PRIMEUI_AI_PRESET_VALUES)[number];\nexport type PrimeUiAiSetupChoice = PrimeUiAiPreset | \"nothing\";\n\nexport const DEFAULT_PRIMEUI_AI_PRESET: PrimeUiAiPreset = \"codex\";\nexport const PRIMEUI_AI_SETUP_CHOICE_VALUES = [\n ...PRIMEUI_AI_PRESET_VALUES,\n \"nothing\",\n] as const satisfies ReadonlyArray<PrimeUiAiSetupChoice>;\n\nexport const PRIMEUI_AI_PRESET_OPTIONS: ReadonlyArray<{\n value: PrimeUiAiPreset;\n label: string;\n hint: string;\n}> = [\n {\n value: \"codex\",\n label: \"Codex\",\n hint: \"Write project-local Codex config and install the shared PrimeUI AI toolchain.\",\n },\n {\n value: \"claude\",\n label: \"Claude Code\",\n hint: \"Write project-local Claude settings and install the shared PrimeUI AI toolchain.\",\n },\n {\n value: \"cursor\",\n label: \"Cursor\",\n hint: \"Write project-local Cursor config and install the shared PrimeUI AI toolchain.\",\n },\n];\n\nexport const PRIMEUI_AI_SETUP_CHOICE_OPTIONS: ReadonlyArray<{\n value: PrimeUiAiSetupChoice;\n label: string;\n hint: string;\n}> = [\n ...PRIMEUI_AI_PRESET_OPTIONS,\n {\n value: \"nothing\",\n label: \"Nothing\",\n hint: \"Skip project-local AI setup for now and leave the project unconfigured.\",\n },\n];\n\nexport function isPrimeUiAiPreset(value: string): value is PrimeUiAiPreset {\n return PRIMEUI_AI_PRESET_VALUES.includes(value as PrimeUiAiPreset);\n}\n\nexport function isPrimeUiAiSetupChoice(\n value: string,\n): value is PrimeUiAiSetupChoice {\n return PRIMEUI_AI_SETUP_CHOICE_VALUES.includes(value as PrimeUiAiSetupChoice);\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { PrimeUiAiPreset } from \"./ai-presets.js\";\n\nexport const PRIMEUI_SUPPORTED_AGENT_VALUES = [\n \"claude-code\",\n \"codex\",\n \"cursor\",\n \"gemini-cli\",\n \"opencode\",\n \"vscode\",\n \"zed\",\n \"mcporter\",\n] as const;\n\nexport type PrimeUiSupportedAgent =\n (typeof PRIMEUI_SUPPORTED_AGENT_VALUES)[number];\n\nexport type PrimeUiAgentSupportLevel = \"full\" | \"mcp-only\";\n\nexport type PrimeUiSupportedAgentPreset = {\n agent: PrimeUiSupportedAgent;\n supportLevel: PrimeUiAgentSupportLevel;\n presetDirName: PrimeUiSupportedAgent;\n mcpFiles: string[];\n detectionPaths: string[];\n presetInferencePaths?: string[];\n skillsDirectory?: string;\n skillsLockFile?: string;\n aiPreset?: PrimeUiAiPreset;\n};\n\nconst PRESET_ROOT_DIRECTORY = fileURLToPath(\n new URL(\"../presets\", import.meta.url),\n);\n\nconst SUPPORTED_AGENT_PRESETS: Record<\n PrimeUiSupportedAgent,\n PrimeUiSupportedAgentPreset\n> = {\n \"claude-code\": {\n agent: \"claude-code\",\n supportLevel: \"full\",\n presetDirName: \"claude-code\",\n mcpFiles: [\".mcp.json\", \".claude/settings.json\"],\n detectionPaths: [\".claude/settings.json\", \".claude\"],\n presetInferencePaths: [\".claude/settings.json\"],\n skillsDirectory: \".claude/skills\",\n skillsLockFile: \"skills-lock.json\",\n aiPreset: \"claude\",\n },\n codex: {\n agent: \"codex\",\n supportLevel: \"full\",\n presetDirName: \"codex\",\n mcpFiles: [\".codex/config.toml\"],\n detectionPaths: [\".codex/config.toml\", \".codex\"],\n presetInferencePaths: [\".codex/config.toml\"],\n skillsDirectory: \".agents/skills\",\n skillsLockFile: \"skills-lock.json\",\n aiPreset: \"codex\",\n },\n cursor: {\n agent: \"cursor\",\n supportLevel: \"full\",\n presetDirName: \"cursor\",\n mcpFiles: [\".mcp.json\", \".cursor/cli.json\", \".cursor/mcp.json\"],\n detectionPaths: [\".cursor/cli.json\", \".cursor/mcp.json\", \".cursor\"],\n presetInferencePaths: [\".cursor/cli.json\"],\n skillsDirectory: \".agents/skills\",\n skillsLockFile: \"skills-lock.json\",\n aiPreset: \"cursor\",\n },\n \"gemini-cli\": {\n agent: \"gemini-cli\",\n supportLevel: \"full\",\n presetDirName: \"gemini-cli\",\n mcpFiles: [\".gemini/settings.json\"],\n detectionPaths: [\".gemini/settings.json\", \".gemini\"],\n skillsDirectory: \".agents/skills\",\n skillsLockFile: \"skills-lock.json\",\n },\n opencode: {\n agent: \"opencode\",\n supportLevel: \"full\",\n presetDirName: \"opencode\",\n mcpFiles: [\"opencode.json\"],\n detectionPaths: [\"opencode.json\", \".opencode\"],\n skillsDirectory: \".agents/skills\",\n skillsLockFile: \"skills-lock.json\",\n },\n vscode: {\n agent: \"vscode\",\n supportLevel: \"mcp-only\",\n presetDirName: \"vscode\",\n mcpFiles: [\".vscode/mcp.json\"],\n detectionPaths: [\".vscode/mcp.json\", \".vscode\"],\n },\n zed: {\n agent: \"zed\",\n supportLevel: \"mcp-only\",\n presetDirName: \"zed\",\n mcpFiles: [\".zed/settings.json\"],\n detectionPaths: [\".zed/settings.json\", \".zed\"],\n },\n mcporter: {\n agent: \"mcporter\",\n supportLevel: \"mcp-only\",\n presetDirName: \"mcporter\",\n mcpFiles: [\"config/mcporter.json\"],\n detectionPaths: [\"config/mcporter.json\"],\n },\n};\n\nexport function listPrimeUiSupportedAgents(): PrimeUiSupportedAgent[] {\n return [...PRIMEUI_SUPPORTED_AGENT_VALUES];\n}\n\nexport function listPrimeUiSupportedAgentPresets(): PrimeUiSupportedAgentPreset[] {\n return PRIMEUI_SUPPORTED_AGENT_VALUES.map((agent) => ({\n ...SUPPORTED_AGENT_PRESETS[agent],\n }));\n}\n\nexport function getPrimeUiSupportedAgentPreset(\n agent: PrimeUiSupportedAgent,\n): PrimeUiSupportedAgentPreset {\n return {\n ...SUPPORTED_AGENT_PRESETS[agent],\n };\n}\n\nexport function getPrimeUiAgentPresetDirectory(\n agent: PrimeUiSupportedAgent,\n): string {\n return path.join(\n PRESET_ROOT_DIRECTORY,\n SUPPORTED_AGENT_PRESETS[agent].presetDirName,\n );\n}\n\nasync function walkFiles(\n rootDirectory: string,\n currentDirectory: string,\n): Promise<string[]> {\n const entries = await readdir(currentDirectory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const absolutePath = path.join(currentDirectory, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...(await walkFiles(rootDirectory, absolutePath)));\n continue;\n }\n\n if (entry.isFile()) {\n files.push(\n path.relative(rootDirectory, absolutePath).replaceAll(path.sep, \"/\"),\n );\n }\n }\n\n return files;\n}\n\nexport async function listPrimeUiAgentPresetFiles(\n agent: PrimeUiSupportedAgent,\n): Promise<string[]> {\n const presetDirectory = getPrimeUiAgentPresetDirectory(agent);\n const files = await walkFiles(presetDirectory, presetDirectory);\n return files.sort();\n}\n","import type { PrimeUiAiPreset } from \"./ai-presets.js\";\n\ntype RuntimeEnvBinding = {\n from: \"runtime-env\";\n envName: string;\n optional?: boolean;\n};\n\nexport type PrimeUiAiAgent = \"codex\" | \"claude-code\" | \"cursor\";\n\nexport type PrimeUiMcpServerConfig = {\n type: \"stdio\";\n command: string;\n args: string[];\n env?: Record<string, string>;\n};\n\ntype PrimeUiBaseMcpServerConfig = Omit<PrimeUiMcpServerConfig, \"env\">;\n\ntype PrimeUiBaseMcpConfig = {\n mcpServers: Record<string, PrimeUiBaseMcpServerConfig>;\n};\n\ntype PrimeUiMcpOverrideConfig = {\n mcpServers: Partial<\n Record<\n string,\n {\n env?: Record<string, RuntimeEnvBinding>;\n }\n >\n >;\n};\n\nexport type PrimeUiResolvedMcpConfig = {\n mcpServers: Record<string, PrimeUiMcpServerConfig>;\n};\n\nexport type PrimeUiSkillCollection = {\n source: string;\n skills: string[];\n};\n\ntype PrimeUiPermissionProfile = {\n shellCommands: string[];\n allowReadAll: boolean;\n allowWriteAll: boolean;\n allowMcpServers: string[];\n enableNetworkAccess: boolean;\n};\n\ntype PrimeUiPresetDefinition = {\n agent: PrimeUiAiAgent;\n configFiles: string[];\n instructionFiles: string[];\n};\n\nconst ROOT_AGENTS_PATH = \"AGENTS.md\";\nconst CLAUDE_INSTRUCTIONS_PATH = \"CLAUDE.md\";\nconst CURSOR_CLI_CONFIG_PATH = \".cursor/cli.json\";\nconst CLAUDE_SETTINGS_PATH = \".claude/settings.json\";\nconst CODEX_CONFIG_PATH = \".codex/config.toml\";\n\nconst SHARED_MCP_CONFIG: PrimeUiBaseMcpConfig = {\n mcpServers: {\n primeui: {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"@primeuicom/mcp@latest\"],\n },\n \"chrome-devtools\": {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"chrome-devtools-mcp@latest\"],\n },\n \"next-devtools\": {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"next-devtools-mcp@latest\"],\n },\n },\n};\n\nconst SHARED_MCP_OVERRIDES: PrimeUiMcpOverrideConfig = {\n mcpServers: {\n primeui: {\n env: {\n PRIMEUI_API_BASE_URL: {\n from: \"runtime-env\",\n envName: \"PRIMEUI_API_BASE_URL\",\n optional: true,\n },\n },\n },\n },\n};\n\n// Phase 1 mirrors the current CLI baseline so later phases can integrate the\n// new package without changing behavior yet.\nconst SHARED_SKILL_COLLECTIONS: ReadonlyArray<PrimeUiSkillCollection> = [\n {\n source: \"github/awesome-copilot\",\n skills: [\"git-commit\"],\n },\n {\n source: \"vercel-labs/next-skills\",\n skills: [\"next-best-practices\"],\n },\n {\n source: \"pproenca/dot-skills\",\n skills: [\"vitest\"],\n },\n {\n source: \"wshobson/agents\",\n skills: [\"tailwind-design-system\"],\n },\n];\n\nconst SHARED_PERMISSION_PROFILE: PrimeUiPermissionProfile = {\n shellCommands: [\"pnpm\", \"git\", \"node\", \"npx\"],\n allowReadAll: true,\n allowWriteAll: true,\n allowMcpServers: Object.keys(SHARED_MCP_CONFIG.mcpServers),\n enableNetworkAccess: true,\n};\n\nconst PRESET_DEFINITIONS: Record<PrimeUiAiPreset, PrimeUiPresetDefinition> = {\n codex: {\n agent: \"codex\",\n configFiles: [CODEX_CONFIG_PATH],\n instructionFiles: [ROOT_AGENTS_PATH],\n },\n claude: {\n agent: \"claude-code\",\n configFiles: [CLAUDE_SETTINGS_PATH],\n instructionFiles: [CLAUDE_INSTRUCTIONS_PATH],\n },\n cursor: {\n agent: \"cursor\",\n configFiles: [CURSOR_CLI_CONFIG_PATH],\n instructionFiles: [ROOT_AGENTS_PATH],\n },\n};\n\nexport const PRIMEUI_SHARED_MCP_CONFIG_PATH = \".mcp.json\";\nexport const PRIMEUI_SHARED_SKILLS_LOCK_PATH = \"skills-lock.json\";\nexport const PRIMEUI_SHARED_VERIFICATION_SCRIPTS = [\n \"format\",\n \"lint\",\n \"typecheck\",\n \"build\",\n] as const;\nexport const PRIMEUI_LOCAL_AI_ARTIFACT_PATHS = [\n \".codex\",\n \".claude\",\n \".cursor\",\n \".agents\",\n PRIMEUI_SHARED_MCP_CONFIG_PATH,\n PRIMEUI_SHARED_SKILLS_LOCK_PATH,\n] as const;\nexport const PRIMEUI_MANAGED_AI_CLEANUP_PATHS = [\n \".codex\",\n \".claude\",\n \".cursor\",\n PRIMEUI_SHARED_MCP_CONFIG_PATH,\n] as const;\n\nconst PRIMEUI_INSTRUCTION_FILE_PATHS = [\n ROOT_AGENTS_PATH,\n CLAUDE_INSTRUCTIONS_PATH,\n] as const;\n\nconst SHARED_WORKFLOW_LINES = [\n \"- Use `pnpm` for installs and scripts.\",\n \"- Use the checked-in project scripts before finishing code changes:\",\n \" - `pnpm format`\",\n \" - `pnpm lint`\",\n \" - `pnpm typecheck`\",\n \" - `pnpm build`\",\n \"- Start the local preview with `pnpm dev`.\",\n] as const;\n\nconst SHARED_PRIMEUI_LINES = [\n \"- PrimeUI project linkage lives in `.primeui/project.json`.\",\n \"- PrimeUI CLI configures project-local AI tooling with `npx @primeuicom/cli ai-setup --ai-preset <codex|claude|cursor>`.\",\n \"- Codex stores PrimeUI MCP server entries in `.codex/config.toml`; Claude and Cursor also keep shared MCP definitions in `.mcp.json`.\",\n \"- Keep agent configuration project-local and reversible. Do not modify user-global config from this repository.\",\n] as const;\n\nfunction readRuntimeEnvBinding(\n binding: RuntimeEnvBinding,\n env: NodeJS.ProcessEnv,\n): string | undefined {\n if (binding.from !== \"runtime-env\") {\n return undefined;\n }\n\n const value = env[binding.envName]?.trim();\n if (!value) {\n return undefined;\n }\n\n return value;\n}\n\nfunction buildCodexPermissionConfigLines(): string[] {\n return [\n 'approval_policy = \"never\"',\n 'sandbox_mode = \"workspace-write\"',\n \"\",\n \"[sandbox_workspace_write]\",\n `network_access = ${SHARED_PERMISSION_PROFILE.enableNetworkAccess ? \"true\" : \"false\"}`,\n ];\n}\n\nfunction buildClaudeAllowedPermissions(): string[] {\n const mcpPermissions = SHARED_PERMISSION_PROFILE.allowMcpServers.map(\n (serverName) => `mcp__${serverName}__*`,\n );\n\n return [\n ...SHARED_PERMISSION_PROFILE.shellCommands.map(\n (command) => `Bash(${command}:*)`,\n ),\n \"Bash(sleep:*)\",\n \"Bash(kill:*)\",\n \"Bash(wait:*)\",\n ...(SHARED_PERMISSION_PROFILE.allowReadAll ? [\"Read\"] : []),\n ...(SHARED_PERMISSION_PROFILE.allowWriteAll ? [\"Edit\"] : []),\n ...mcpPermissions,\n ];\n}\n\nfunction buildCursorAllowedPermissions(): string[] {\n const mcpPermissions = SHARED_PERMISSION_PROFILE.allowMcpServers.map(\n (serverName) => `Mcp(${serverName}:*)`,\n );\n\n return [\n ...SHARED_PERMISSION_PROFILE.shellCommands.map(\n (command) => `Shell(${command}:*)`,\n ),\n ...(SHARED_PERMISSION_PROFILE.allowReadAll ? [\"Read(**/*)\"] : []),\n ...(SHARED_PERMISSION_PROFILE.allowWriteAll ? [\"Write(**/*)\"] : []),\n ...mcpPermissions,\n ];\n}\n\nfunction buildSharedWorkflowSectionLines(): string[] {\n return [\"## Workflow\", \"\", ...SHARED_WORKFLOW_LINES];\n}\n\nfunction buildSharedPrimeUiSectionLines(): string[] {\n return [\"## PrimeUI Integration\", \"\", ...SHARED_PRIMEUI_LINES];\n}\n\nfunction buildSharedAgentsInstructionsContent(): string {\n return [\n \"# PrimeUI Exported Project\",\n \"\",\n ...buildSharedWorkflowSectionLines(),\n \"\",\n ...buildSharedPrimeUiSectionLines(),\n \"\",\n \"## Codex and Cursor Notes\",\n \"\",\n \"- Codex and Cursor both read repository instructions from `AGENTS.md`.\",\n \"- Project-local Codex settings live in `.codex/config.toml` after CLI AI setup.\",\n \"- Project-local Cursor settings live in `.cursor/cli.json` after CLI AI setup.\",\n \"- PrimeUI CLI installs shared MCP servers and public skills project-locally during AI setup.\",\n \"- The user still needs a local agent install/login for Codex or Cursor.\",\n ].join(\"\\n\");\n}\n\nfunction buildClaudeInstructionsContent(): string {\n return [\n \"# PrimeUI Exported Project\",\n \"\",\n ...buildSharedWorkflowSectionLines(),\n \"\",\n ...buildSharedPrimeUiSectionLines(),\n \"\",\n \"## Claude Code Notes\",\n \"\",\n \"- Claude Code reads repository instructions from `CLAUDE.md`.\",\n \"- Project-local Claude settings live in `.claude/settings.json` after CLI AI setup.\",\n \"- PrimeUI CLI installs shared MCP servers and public skills project-locally during AI setup.\",\n \"- The user still needs a local Claude Code install/login.\",\n ].join(\"\\n\");\n}\n\nexport function getPrimeUiAiAgent(aiPreset: PrimeUiAiPreset): PrimeUiAiAgent {\n return PRESET_DEFINITIONS[aiPreset].agent;\n}\n\nexport function getPrimeUiManagedConfigFiles(\n aiPreset: PrimeUiAiPreset,\n): string[] {\n return [...PRESET_DEFINITIONS[aiPreset].configFiles];\n}\n\nexport function getPrimeUiManagedInstructionFiles(\n aiPreset: PrimeUiAiPreset,\n): string[] {\n return [...PRESET_DEFINITIONS[aiPreset].instructionFiles];\n}\n\nexport function getPrimeUiManagedConfigFileContents(\n aiPreset: PrimeUiAiPreset,\n): Record<string, string> {\n switch (aiPreset) {\n case \"codex\":\n return {\n [CODEX_CONFIG_PATH]: buildPrimeUiCodexConfigToml(),\n };\n case \"claude\":\n return {\n [CLAUDE_SETTINGS_PATH]: buildPrimeUiClaudeSettingsFileContent(),\n };\n case \"cursor\":\n return {\n [CURSOR_CLI_CONFIG_PATH]: buildPrimeUiCursorCliConfigFileContent(),\n };\n }\n}\n\nexport function getPrimeUiManagedInstructionFileContents(\n aiPreset: PrimeUiAiPreset,\n): Record<string, string> {\n switch (aiPreset) {\n case \"codex\":\n case \"cursor\":\n return {\n [ROOT_AGENTS_PATH]: `${buildSharedAgentsInstructionsContent()}\\n`,\n };\n case \"claude\":\n return {\n [CLAUDE_INSTRUCTIONS_PATH]: `${buildClaudeInstructionsContent()}\\n`,\n };\n }\n}\n\nexport function listPrimeUiAiSkillRefs(): string[] {\n return SHARED_SKILL_COLLECTIONS.flatMap((collection) =>\n collection.skills.map((skill) => `${collection.source}@${skill}`),\n );\n}\n\nexport function listPrimeUiAiSkillCollections(): PrimeUiSkillCollection[] {\n return SHARED_SKILL_COLLECTIONS.map((collection) => ({\n source: collection.source,\n skills: [...collection.skills],\n }));\n}\n\nexport function getPrimeUiInstalledSkillsDirectory(\n aiPreset: PrimeUiAiPreset,\n): string {\n return aiPreset === \"claude\" ? \".claude/skills\" : \".agents/skills\";\n}\n\nexport function listPrimeUiAllowedShellCommands(): string[] {\n return [...SHARED_PERMISSION_PROFILE.shellCommands];\n}\n\nexport function listPrimeUiAllowedMcpServers(): string[] {\n return [...SHARED_PERMISSION_PROFILE.allowMcpServers];\n}\n\nexport function listPrimeUiClaudeAllowedPermissions(): string[] {\n return buildClaudeAllowedPermissions();\n}\n\nexport function listPrimeUiCursorAllowedPermissions(): string[] {\n return buildCursorAllowedPermissions();\n}\n\nexport function listPrimeUiInstructionFilePaths(): string[] {\n return [...PRIMEUI_INSTRUCTION_FILE_PATHS];\n}\n\nexport function listPrimeUiVerificationScripts(): string[] {\n return [...PRIMEUI_SHARED_VERIFICATION_SCRIPTS];\n}\n\nexport function shouldWritePrimeUiSharedMcpConfig(\n aiPreset: PrimeUiAiPreset,\n): boolean {\n return aiPreset !== \"codex\";\n}\n\nexport function resolvePrimeUiMcpConfig(\n env: NodeJS.ProcessEnv = process.env,\n): PrimeUiResolvedMcpConfig {\n const mcpServers = Object.fromEntries(\n Object.entries(SHARED_MCP_CONFIG.mcpServers).map(\n ([serverName, serverConfig]) => {\n const overrideEnv = SHARED_MCP_OVERRIDES.mcpServers[serverName]?.env;\n const resolvedEnvEntries = Object.entries(overrideEnv ?? {})\n .map(([envName, binding]) => {\n const value = readRuntimeEnvBinding(binding, env);\n if (!value) {\n return undefined;\n }\n\n return [envName, value] as const;\n })\n .filter((entry): entry is readonly [string, string] =>\n Boolean(entry),\n );\n\n return [\n serverName,\n {\n ...serverConfig,\n ...(resolvedEnvEntries.length > 0\n ? { env: Object.fromEntries(resolvedEnvEntries) }\n : {}),\n },\n ];\n },\n ),\n );\n\n return { mcpServers };\n}\n\nexport function createPrimeUiAiSetupEnv(\n env: NodeJS.ProcessEnv = process.env,\n primeUiApiBaseUrl?: string,\n): NodeJS.ProcessEnv {\n if (!primeUiApiBaseUrl?.trim()) {\n return env;\n }\n\n return {\n ...env,\n PRIMEUI_API_BASE_URL: primeUiApiBaseUrl.trim(),\n };\n}\n\nexport function buildPrimeUiCodexConfigToml(): string {\n return [\n \"# Project-scoped Codex config for this PrimeUI project.\",\n \"# PrimeUI CLI manages this file and add-mcp appends MCP server entries.\",\n ...buildCodexPermissionConfigLines(),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function buildPrimeUiClaudeSettings(): Record<string, unknown> {\n return {\n enableAllProjectMcpServers: true,\n enabledMcpjsonServers: SHARED_PERMISSION_PROFILE.allowMcpServers,\n permissions: {\n allow: buildClaudeAllowedPermissions(),\n deny: [],\n },\n };\n}\n\nexport function buildPrimeUiClaudeSettingsFileContent(): string {\n return `${JSON.stringify(buildPrimeUiClaudeSettings(), null, 2)}\\n`;\n}\n\nexport function buildPrimeUiCursorCliConfig(): Record<string, unknown> {\n return {\n version: 1,\n permissions: {\n allow: buildCursorAllowedPermissions(),\n deny: [],\n },\n };\n}\n\nexport function buildPrimeUiCursorCliConfigFileContent(): string {\n return `${JSON.stringify(buildPrimeUiCursorCliConfig(), null, 2)}\\n`;\n}\n","import {\n access,\n cp,\n mkdir,\n mkdtemp,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { execa } from \"execa\";\n\nimport type { PrimeUiAiPreset } from \"./ai-presets.js\";\nimport {\n getPrimeUiAiAgent,\n getPrimeUiManagedConfigFiles,\n getPrimeUiManagedConfigFileContents,\n getPrimeUiManagedInstructionFileContents,\n getPrimeUiManagedInstructionFiles,\n getPrimeUiInstalledSkillsDirectory,\n listPrimeUiAiSkillRefs,\n listPrimeUiInstructionFilePaths,\n resolvePrimeUiMcpConfig,\n shouldWritePrimeUiSharedMcpConfig,\n type PrimeUiAiAgent,\n type PrimeUiMcpServerConfig,\n type PrimeUiResolvedMcpConfig,\n PRIMEUI_MANAGED_AI_CLEANUP_PATHS,\n PRIMEUI_LOCAL_AI_ARTIFACT_PATHS,\n PRIMEUI_SHARED_MCP_CONFIG_PATH,\n PRIMEUI_SHARED_SKILLS_LOCK_PATH,\n} from \"./ai-setup-config.js\";\nimport {\n PRIMEUI_AGENT_SETUP_ERROR_CODES,\n PrimeUiAgentSetupError,\n} from \"./errors.js\";\n\ntype CommandResult = {\n exitCode?: number;\n stdout: string;\n stderr: string;\n};\n\nexport type ExecaLike = (\n file: string,\n args: string[],\n options: {\n cwd: string;\n reject: false;\n stderr: \"pipe\";\n stdout: \"pipe\";\n },\n) => Promise<CommandResult>;\n\nexport type PrimeUiAiSetupResult = {\n status: \"applied\";\n aiPreset: PrimeUiAiPreset;\n agent: PrimeUiAiAgent;\n installedMcpServers: string[];\n installedSkillRefs: string[];\n};\n\nexport type ApplyPrimeUiAiSetupOptions = {\n aiPreset: PrimeUiAiPreset;\n env?: NodeJS.ProcessEnv;\n execaFn?: ExecaLike;\n};\n\nfunction formatCommandHint(command: string, args: string[]): string {\n return [command, ...args].join(\" \");\n}\n\nfunction createCommandFailure(\n message: string,\n command: string,\n args: string[],\n result: CommandResult,\n): PrimeUiAgentSetupError {\n const stderr = result.stderr.trim();\n const stdout = result.stdout.trim();\n\n return new PrimeUiAgentSetupError(message, {\n code: PRIMEUI_AGENT_SETUP_ERROR_CODES.AI_SETUP_FAILED,\n hint:\n stderr ||\n stdout ||\n `Retry from the project directory with: ${formatCommandHint(command, args)}`,\n });\n}\n\nfunction resolveAddMcpInstallTarget(\n serverName: string,\n serverConfig: PrimeUiMcpServerConfig,\n): string {\n if (\n serverConfig.type === \"stdio\" &&\n serverConfig.command === \"npx\" &&\n serverConfig.args.length === 2 &&\n serverConfig.args[0] === \"-y\"\n ) {\n return serverConfig.args[1];\n }\n\n throw new PrimeUiAgentSetupError(\n `PrimeUI AI setup cannot install MCP server \"${serverName}\" from this config shape automatically.`,\n {\n code: PRIMEUI_AGENT_SETUP_ERROR_CODES.AI_SETUP_FAILED,\n hint: \"Only stdio MCP entries shaped like `npx -y <package>` are supported for automated setup right now.\",\n },\n );\n}\n\nfunction collapseStringArrayBlocks(json: string): string {\n return json.replace(\n /\\[\\n(\\s+)((?:\"(?:\\\\.|[^\"\\n])*\"(?:,\\n\\1\"(?:\\\\.|[^\"\\n])*\")*))\\n(\\s*)\\]/g,\n (_match, _indent, items: string) => {\n const collapsedItems = items\n .split(\"\\n\")\n .map((line) => line.trim())\n .join(\" \");\n\n return `[${collapsedItems}]`;\n },\n );\n}\n\nfunction formatSharedMcpConfigFileContent(\n config: PrimeUiResolvedMcpConfig,\n): string {\n return `${collapseStringArrayBlocks(JSON.stringify(config, null, 2))}\\n`;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeManagedFile(\n projectDirectory: string,\n relativePath: string,\n content: string,\n): Promise<void> {\n const filePath = path.join(projectDirectory, relativePath);\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, content, \"utf-8\");\n}\n\nasync function cleanupManagedAiFiles(projectDirectory: string): Promise<void> {\n for (const relativePath of PRIMEUI_MANAGED_AI_CLEANUP_PATHS) {\n await rm(path.join(projectDirectory, relativePath), {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n }\n}\n\nfunction listAiSetupBackupPaths(): string[] {\n return [\n ...PRIMEUI_LOCAL_AI_ARTIFACT_PATHS,\n ...listPrimeUiInstructionFilePaths(),\n ];\n}\n\nasync function createAiSetupBackup(projectDirectory: string): Promise<string> {\n const backupDir = await mkdtemp(\n path.join(os.tmpdir(), \"primeui-agent-setup-backup-\"),\n );\n\n for (const relativePath of listAiSetupBackupPaths()) {\n const sourcePath = path.join(projectDirectory, relativePath);\n if (!(await pathExists(sourcePath))) {\n continue;\n }\n\n const backupPath = path.join(backupDir, relativePath);\n await mkdir(path.dirname(backupPath), { recursive: true });\n await cp(sourcePath, backupPath, {\n force: true,\n recursive: true,\n });\n }\n\n return backupDir;\n}\n\nasync function removeLocalAiArtifacts(projectDirectory: string): Promise<void> {\n for (const relativePath of listAiSetupBackupPaths()) {\n await rm(path.join(projectDirectory, relativePath), {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n }\n}\n\nasync function restoreAiSetupBackup(\n projectDirectory: string,\n backupDir: string,\n): Promise<void> {\n await removeLocalAiArtifacts(projectDirectory);\n\n for (const relativePath of listAiSetupBackupPaths()) {\n const backupPath = path.join(backupDir, relativePath);\n if (!(await pathExists(backupPath))) {\n continue;\n }\n\n const targetPath = path.join(projectDirectory, relativePath);\n await mkdir(path.dirname(targetPath), { recursive: true });\n await cp(backupPath, targetPath, {\n force: true,\n recursive: true,\n });\n }\n}\n\nasync function writeManagedPresetFiles(\n projectDirectory: string,\n aiPreset: PrimeUiAiPreset,\n): Promise<void> {\n const managedFiles = getPrimeUiManagedConfigFileContents(aiPreset);\n\n for (const [relativePath, content] of Object.entries(managedFiles)) {\n await writeManagedFile(projectDirectory, relativePath, content);\n }\n}\n\nasync function writeManagedInstructionFiles(\n projectDirectory: string,\n aiPreset: PrimeUiAiPreset,\n): Promise<void> {\n const managedFiles = getPrimeUiManagedInstructionFileContents(aiPreset);\n\n for (const [relativePath, content] of Object.entries(managedFiles)) {\n await writeManagedFile(projectDirectory, relativePath, content);\n }\n}\n\nasync function writeSharedMcpConfig(\n projectDirectory: string,\n config: PrimeUiResolvedMcpConfig,\n): Promise<void> {\n await writeManagedFile(\n projectDirectory,\n PRIMEUI_SHARED_MCP_CONFIG_PATH,\n formatSharedMcpConfigFileContent(config),\n );\n}\n\nasync function installMcpServer(params: {\n agent: PrimeUiAiAgent;\n cwd: string;\n execaFn: ExecaLike;\n serverName: string;\n serverConfig: PrimeUiMcpServerConfig;\n}): Promise<void> {\n const installTarget = resolveAddMcpInstallTarget(\n params.serverName,\n params.serverConfig,\n );\n const args = [\n \"-y\",\n \"add-mcp@latest\",\n \"-a\",\n params.agent,\n \"-n\",\n params.serverName,\n installTarget,\n \"--yes\",\n ];\n\n for (const [envName, value] of Object.entries(\n params.serverConfig.env ?? {},\n )) {\n args.push(\"--env\", `${envName}=${value}`);\n }\n\n const result = await params.execaFn(\"npx\", args, {\n cwd: params.cwd,\n reject: false,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n if (result.exitCode !== 0) {\n throw createCommandFailure(\n `Failed to install MCP server \"${params.serverName}\" for ${params.agent}.`,\n \"npx\",\n args,\n result,\n );\n }\n}\n\nasync function cleanupUnmanagedInstructionFiles(\n projectDirectory: string,\n aiPreset: PrimeUiAiPreset,\n): Promise<void> {\n const managedInstructionFiles = new Set(\n getPrimeUiManagedInstructionFiles(aiPreset),\n );\n\n for (const relativePath of listPrimeUiInstructionFilePaths()) {\n if (managedInstructionFiles.has(relativePath)) {\n continue;\n }\n\n await rm(path.join(projectDirectory, relativePath), {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n }\n}\n\nfunction getTopLevelArtifactPath(relativePath: string): string {\n const [topLevelPath] = relativePath.split(\"/\", 1);\n return topLevelPath || relativePath;\n}\n\nasync function cleanupUnmanagedLocalArtifacts(\n projectDirectory: string,\n aiPreset: PrimeUiAiPreset,\n): Promise<void> {\n const managedArtifactPaths = new Set<string>([\n PRIMEUI_SHARED_SKILLS_LOCK_PATH,\n ...getPrimeUiManagedConfigFiles(aiPreset).map(getTopLevelArtifactPath),\n ]);\n\n managedArtifactPaths.add(\n getTopLevelArtifactPath(getPrimeUiInstalledSkillsDirectory(aiPreset)),\n );\n\n if (shouldWritePrimeUiSharedMcpConfig(aiPreset)) {\n managedArtifactPaths.add(PRIMEUI_SHARED_MCP_CONFIG_PATH);\n }\n\n for (const relativePath of PRIMEUI_LOCAL_AI_ARTIFACT_PATHS) {\n if (managedArtifactPaths.has(relativePath)) {\n continue;\n }\n\n await rm(path.join(projectDirectory, relativePath), {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n }\n}\n\nasync function normalizeInstalledSkillsDirectory(\n projectDirectory: string,\n aiPreset: PrimeUiAiPreset,\n): Promise<void> {\n const expectedSkillsDirectory = path.join(\n projectDirectory,\n getPrimeUiInstalledSkillsDirectory(aiPreset),\n );\n const sharedSkillsDirectory = path.join(\n projectDirectory,\n \".agents\",\n \"skills\",\n );\n\n if (aiPreset === \"claude\") {\n if (\n !(await pathExists(expectedSkillsDirectory)) &&\n (await pathExists(sharedSkillsDirectory))\n ) {\n await mkdir(path.dirname(expectedSkillsDirectory), { recursive: true });\n await cp(sharedSkillsDirectory, expectedSkillsDirectory, {\n force: true,\n recursive: true,\n });\n }\n\n await rm(path.join(projectDirectory, \".agents\"), {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n }\n}\n\nasync function normalizeCodexConfigFormatting(\n projectDirectory: string,\n aiPreset: PrimeUiAiPreset,\n): Promise<void> {\n if (aiPreset !== \"codex\") {\n return;\n }\n\n const codexConfigPath = path.join(projectDirectory, \".codex\", \"config.toml\");\n if (!(await pathExists(codexConfigPath))) {\n return;\n }\n\n const rawConfig = await readFile(codexConfigPath, \"utf-8\");\n const normalizedConfig = rawConfig\n .split(\"\\n\")\n .map((line) => line.trimStart())\n .join(\"\\n\");\n\n if (normalizedConfig !== rawConfig) {\n await writeFile(codexConfigPath, normalizedConfig, \"utf-8\");\n }\n}\n\nasync function installSkill(params: {\n agent: PrimeUiAiAgent;\n cwd: string;\n execaFn: ExecaLike;\n skillRef: string;\n}): Promise<void> {\n const args = [\n \"-y\",\n \"skills@latest\",\n \"add\",\n params.skillRef,\n \"--copy\",\n \"--agent\",\n params.agent,\n \"-y\",\n ];\n const result = await params.execaFn(\"npx\", args, {\n cwd: params.cwd,\n reject: false,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n if (result.exitCode !== 0) {\n throw createCommandFailure(\n `Failed to install skill \"${params.skillRef}\".`,\n \"npx\",\n args,\n result,\n );\n }\n}\n\nexport async function applyPrimeUiAiSetup(\n projectDirectory: string,\n options: ApplyPrimeUiAiSetupOptions,\n): Promise<PrimeUiAiSetupResult> {\n const execaFn = (options.execaFn ?? execa) as ExecaLike;\n const aiPreset = options.aiPreset;\n const agent = getPrimeUiAiAgent(aiPreset);\n const resolvedMcpConfig = resolvePrimeUiMcpConfig(options.env);\n const backupDir = await createAiSetupBackup(projectDirectory);\n\n try {\n await cleanupManagedAiFiles(projectDirectory);\n await writeManagedPresetFiles(projectDirectory, aiPreset);\n await writeManagedInstructionFiles(projectDirectory, aiPreset);\n\n const installedMcpServers: string[] = [];\n for (const [serverName, serverConfig] of Object.entries(\n resolvedMcpConfig.mcpServers,\n )) {\n await installMcpServer({\n agent,\n cwd: projectDirectory,\n execaFn,\n serverName,\n serverConfig,\n });\n installedMcpServers.push(serverName);\n }\n\n const installedSkillRefs: string[] = [];\n for (const skillRef of listPrimeUiAiSkillRefs()) {\n await installSkill({\n agent,\n cwd: projectDirectory,\n execaFn,\n skillRef,\n });\n installedSkillRefs.push(skillRef);\n }\n\n await normalizeInstalledSkillsDirectory(projectDirectory, aiPreset);\n await normalizeCodexConfigFormatting(projectDirectory, aiPreset);\n\n if (shouldWritePrimeUiSharedMcpConfig(aiPreset)) {\n await writeSharedMcpConfig(projectDirectory, resolvedMcpConfig);\n }\n await cleanupUnmanagedLocalArtifacts(projectDirectory, aiPreset);\n await cleanupUnmanagedInstructionFiles(projectDirectory, aiPreset);\n\n return {\n status: \"applied\",\n aiPreset,\n agent,\n installedMcpServers,\n installedSkillRefs,\n };\n } catch (error) {\n try {\n await restoreAiSetupBackup(projectDirectory, backupDir);\n } catch (restoreError) {\n throw new PrimeUiAgentSetupError(\n \"PrimeUI AI setup failed and the previous local AI setup could not be restored cleanly.\",\n {\n code: PRIMEUI_AGENT_SETUP_ERROR_CODES.AI_SETUP_FAILED,\n hint:\n restoreError instanceof Error\n ? restoreError.message\n : String(restoreError),\n cause: error,\n },\n );\n }\n\n throw error;\n } finally {\n await rm(backupDir, {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n }\n}\n","export const PRIMEUI_AGENT_SETUP_ERROR_CODES = {\n AI_SETUP_FAILED: \"AI_SETUP_FAILED\",\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type PrimeUiAgentSetupErrorCode =\n (typeof PRIMEUI_AGENT_SETUP_ERROR_CODES)[keyof typeof PRIMEUI_AGENT_SETUP_ERROR_CODES];\n\ntype PrimeUiAgentSetupErrorOptions = {\n code?: PrimeUiAgentSetupErrorCode;\n hint?: string;\n cause?: unknown;\n};\n\nexport class PrimeUiAgentSetupError extends Error {\n readonly code: PrimeUiAgentSetupErrorCode;\n readonly hint?: string;\n\n constructor(message: string, options: PrimeUiAgentSetupErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = \"PrimeUiAgentSetupError\";\n this.code = options.code ?? PRIMEUI_AGENT_SETUP_ERROR_CODES.UNKNOWN;\n this.hint = options.hint;\n }\n}\n\nexport function toPrimeUiAgentSetupError(\n error: unknown,\n): PrimeUiAgentSetupError {\n if (error instanceof PrimeUiAgentSetupError) {\n return error;\n }\n\n return new PrimeUiAgentSetupError(\n error instanceof Error ? error.message : String(error),\n {\n cause: error,\n },\n );\n}\n","import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n listPrimeUiSupportedAgentPresets,\n type PrimeUiSupportedAgent,\n type PrimeUiSupportedAgentPreset,\n} from \"./agent-presets.js\";\n\nexport type PrimeUiDetectedAgentSignal = {\n agent: PrimeUiSupportedAgent;\n supportLevel: PrimeUiSupportedAgentPreset[\"supportLevel\"];\n matchedPaths: string[];\n};\n\nexport type PrimeUiLocalAgentDetectionResult = {\n detectedAgents: PrimeUiDetectedAgentSignal[];\n};\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getDetectionPaths(\n preset: PrimeUiSupportedAgentPreset,\n): ReadonlyArray<string> {\n return preset.detectionPaths;\n}\n\nexport async function detectPrimeUiLocalAgentSetup(\n projectDirectory: string,\n): Promise<PrimeUiLocalAgentDetectionResult> {\n const detectedAgents: PrimeUiDetectedAgentSignal[] = [];\n\n for (const preset of listPrimeUiSupportedAgentPresets()) {\n const matchedPaths: string[] = [];\n\n for (const relativePath of getDetectionPaths(preset)) {\n if (await pathExists(path.join(projectDirectory, relativePath))) {\n matchedPaths.push(relativePath);\n }\n }\n\n if (matchedPaths.length === 0) {\n continue;\n }\n\n detectedAgents.push({\n agent: preset.agent,\n supportLevel: preset.supportLevel,\n matchedPaths,\n });\n }\n\n detectedAgents.sort((left, right) => left.agent.localeCompare(right.agent));\n\n return {\n detectedAgents,\n };\n}\n","import type { PrimeUiAiPreset } from \"./ai-presets.js\";\nimport {\n detectPrimeUiLocalAgentSetup,\n getPrimeUiSupportedAgentPreset,\n} from \"./index.js\";\n\nexport async function detectPrimeUiAiPresetCandidates(\n projectDirectory: string,\n): Promise<PrimeUiAiPreset[]> {\n const detection = await detectPrimeUiLocalAgentSetup(projectDirectory);\n const candidates = detection.detectedAgents\n .filter((signal) => {\n const preset = getPrimeUiSupportedAgentPreset(signal.agent);\n const strongPaths = preset.presetInferencePaths ?? [];\n\n return strongPaths.some((inferencePath) =>\n signal.matchedPaths.includes(inferencePath),\n );\n })\n .map((signal) => getPrimeUiSupportedAgentPreset(signal.agent).aiPreset)\n .filter((preset): preset is PrimeUiAiPreset => Boolean(preset));\n\n return Array.from(new Set(candidates));\n}\n\nexport async function inferPrimeUiAiPreset(\n projectDirectory: string,\n): Promise<PrimeUiAiPreset | undefined> {\n const candidates = await detectPrimeUiAiPresetCandidates(projectDirectory);\n return candidates.length === 1 ? candidates[0] : undefined;\n}\n"],"mappings":"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","names":["path","path","access","path","pathExists","access","path"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@primeuicom/agent-setup",
3
+ "version": "0.1.0",
4
+ "description": "Shared AI setup presets, config, and detection helpers for PrimeUI tooling",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "presets"
11
+ ],
12
+ "scripts": {
13
+ "clean": "rm -rf dist",
14
+ "build": "pnpm run clean && tsup --config tsup.config.ts",
15
+ "typecheck": "tsc --noEmit",
16
+ "test": "vitest run",
17
+ "validate:presets": "pnpm run build && node scripts/validate-presets.mjs",
18
+ "format": "prettier --write ./src ./tests",
19
+ "format:check": "prettier --check ./src ./tests",
20
+ "prepack": "pnpm run build"
21
+ },
22
+ "engines": {
23
+ "node": ">=20"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "dependencies": {
29
+ "execa": "^9.6.1"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^24.0.0",
33
+ "tsup": "^8.5.0",
34
+ "typescript": "5.8.2",
35
+ "vitest": "^3.2.3"
36
+ }
37
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "enableAllProjectMcpServers": true,
3
+ "enabledMcpjsonServers": [
4
+ "primeui",
5
+ "chrome-devtools",
6
+ "next-devtools"
7
+ ],
8
+ "permissions": {
9
+ "allow": [
10
+ "Bash(pnpm:*)",
11
+ "Bash(git:*)",
12
+ "Bash(node:*)",
13
+ "Bash(npx:*)",
14
+ "Bash(sleep:*)",
15
+ "Bash(kill:*)",
16
+ "Bash(wait:*)",
17
+ "Read",
18
+ "Edit",
19
+ "mcp__primeui__*",
20
+ "mcp__chrome-devtools__*",
21
+ "mcp__next-devtools__*"
22
+ ],
23
+ "deny": []
24
+ }
25
+ }
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: git-commit
3
+ description: 'Execute git commit with conventional commit message analysis, intelligent staging, and message generation. Use when user asks to commit changes, create a git commit, or mentions "/commit". Supports: (1) Auto-detecting type and scope from changes, (2) Generating conventional commit messages from diff, (3) Interactive commit with optional type/scope/description overrides, (4) Intelligent file staging for logical grouping'
4
+ license: MIT
5
+ allowed-tools: Bash
6
+ ---
7
+
8
+ # Git Commit with Conventional Commits
9
+
10
+ ## Overview
11
+
12
+ Create standardized, semantic git commits using the Conventional Commits specification. Analyze the actual diff to determine appropriate type, scope, and message.
13
+
14
+ ## Conventional Commit Format
15
+
16
+ ```
17
+ <type>[optional scope]: <description>
18
+
19
+ [optional body]
20
+
21
+ [optional footer(s)]
22
+ ```
23
+
24
+ ## Commit Types
25
+
26
+ | Type | Purpose |
27
+ | ---------- | ------------------------------ |
28
+ | `feat` | New feature |
29
+ | `fix` | Bug fix |
30
+ | `docs` | Documentation only |
31
+ | `style` | Formatting/style (no logic) |
32
+ | `refactor` | Code refactor (no feature/fix) |
33
+ | `perf` | Performance improvement |
34
+ | `test` | Add/update tests |
35
+ | `build` | Build system/dependencies |
36
+ | `ci` | CI/config changes |
37
+ | `chore` | Maintenance/misc |
38
+ | `revert` | Revert commit |
39
+
40
+ ## Breaking Changes
41
+
42
+ ```
43
+ # Exclamation mark after type/scope
44
+ feat!: remove deprecated endpoint
45
+
46
+ # BREAKING CHANGE footer
47
+ feat: allow config to extend other configs
48
+
49
+ BREAKING CHANGE: `extends` key behavior changed
50
+ ```
51
+
52
+ ## Workflow
53
+
54
+ ### 1. Analyze Diff
55
+
56
+ ```bash
57
+ # If files are staged, use staged diff
58
+ git diff --staged
59
+
60
+ # If nothing staged, use working tree diff
61
+ git diff
62
+
63
+ # Also check status
64
+ git status --porcelain
65
+ ```
66
+
67
+ ### 2. Stage Files (if needed)
68
+
69
+ If nothing is staged or you want to group changes differently:
70
+
71
+ ```bash
72
+ # Stage specific files
73
+ git add path/to/file1 path/to/file2
74
+
75
+ # Stage by pattern
76
+ git add *.test.*
77
+ git add src/components/*
78
+
79
+ # Interactive staging
80
+ git add -p
81
+ ```
82
+
83
+ **Never commit secrets** (.env, credentials.json, private keys).
84
+
85
+ ### 3. Generate Commit Message
86
+
87
+ Analyze the diff to determine:
88
+
89
+ - **Type**: What kind of change is this?
90
+ - **Scope**: What area/module is affected?
91
+ - **Description**: One-line summary of what changed (present tense, imperative mood, <72 chars)
92
+
93
+ ### 4. Execute Commit
94
+
95
+ ```bash
96
+ # Single line
97
+ git commit -m "<type>[scope]: <description>"
98
+
99
+ # Multi-line with body/footer
100
+ git commit -m "$(cat <<'EOF'
101
+ <type>[scope]: <description>
102
+
103
+ <optional body>
104
+
105
+ <optional footer>
106
+ EOF
107
+ )"
108
+ ```
109
+
110
+ ## Best Practices
111
+
112
+ - One logical change per commit
113
+ - Present tense: "add" not "added"
114
+ - Imperative mood: "fix bug" not "fixes bug"
115
+ - Reference issues: `Closes #123`, `Refs #456`
116
+ - Keep description under 72 characters
117
+
118
+ ## Git Safety Protocol
119
+
120
+ - NEVER update git config
121
+ - NEVER run destructive commands (--force, hard reset) without explicit request
122
+ - NEVER skip hooks (--no-verify) unless user asks
123
+ - NEVER force push to main/master
124
+ - If commit fails due to hooks, fix and create NEW commit (don't amend)
@@ -0,0 +1,152 @@
1
+ ---
2
+ name: next-best-practices
3
+ description: Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling
4
+ user-invocable: false
5
+ ---
6
+
7
+ # Next.js Best Practices
8
+
9
+ Apply these rules when writing or reviewing Next.js code.
10
+
11
+ ## File Conventions
12
+
13
+ See [file-conventions.md](./file-conventions.md) for:
14
+ - Project structure and special files
15
+ - Route segments (dynamic, catch-all, groups)
16
+ - Parallel and intercepting routes
17
+ - Middleware rename in v16 (middleware → proxy)
18
+
19
+ ## RSC Boundaries
20
+
21
+ Detect invalid React Server Component patterns.
22
+
23
+ See [rsc-boundaries.md](./rsc-boundaries.md) for:
24
+ - Async client component detection (invalid)
25
+ - Non-serializable props detection
26
+ - Server Action exceptions
27
+
28
+ ## Async Patterns
29
+
30
+ Next.js 15+ async API changes.
31
+
32
+ See [async-patterns.md](./async-patterns.md) for:
33
+ - Async `params` and `searchParams`
34
+ - Async `cookies()` and `headers()`
35
+ - Migration codemod
36
+
37
+ ## Runtime Selection
38
+
39
+ See [runtime-selection.md](./runtime-selection.md) for:
40
+ - Default to Node.js runtime
41
+ - When Edge runtime is appropriate
42
+
43
+ ## Directives
44
+
45
+ See [directives.md](./directives.md) for:
46
+ - `'use client'`, `'use server'` (React)
47
+ - `'use cache'` (Next.js)
48
+
49
+ ## Functions
50
+
51
+ See [functions.md](./functions.md) for:
52
+ - Navigation hooks: `useRouter`, `usePathname`, `useSearchParams`, `useParams`
53
+ - Server functions: `cookies`, `headers`, `draftMode`, `after`
54
+ - Generate functions: `generateStaticParams`, `generateMetadata`
55
+
56
+ ## Error Handling
57
+
58
+ See [error-handling.md](./error-handling.md) for:
59
+ - `error.tsx`, `global-error.tsx`, `not-found.tsx`
60
+ - `redirect`, `permanentRedirect`, `notFound`
61
+ - `forbidden`, `unauthorized` (auth errors)
62
+ - `unstable_rethrow` for catch blocks
63
+
64
+ ## Data Patterns
65
+
66
+ See [data-patterns.md](./data-patterns.md) for:
67
+ - Server Components vs Server Actions vs Route Handlers
68
+ - Avoiding data waterfalls (`Promise.all`, Suspense, preload)
69
+ - Client component data fetching
70
+
71
+ ## Route Handlers
72
+
73
+ See [route-handlers.md](./route-handlers.md) for:
74
+ - `route.ts` basics
75
+ - GET handler conflicts with `page.tsx`
76
+ - Environment behavior (no React DOM)
77
+ - When to use vs Server Actions
78
+
79
+ ## Metadata & OG Images
80
+
81
+ See [metadata.md](./metadata.md) for:
82
+ - Static and dynamic metadata
83
+ - `generateMetadata` function
84
+ - OG image generation with `next/og`
85
+ - File-based metadata conventions
86
+
87
+ ## Image Optimization
88
+
89
+ See [image.md](./image.md) for:
90
+ - Always use `next/image` over `<img>`
91
+ - Remote images configuration
92
+ - Responsive `sizes` attribute
93
+ - Blur placeholders
94
+ - Priority loading for LCP
95
+
96
+ ## Font Optimization
97
+
98
+ See [font.md](./font.md) for:
99
+ - `next/font` setup
100
+ - Google Fonts, local fonts
101
+ - Tailwind CSS integration
102
+ - Preloading subsets
103
+
104
+ ## Bundling
105
+
106
+ See [bundling.md](./bundling.md) for:
107
+ - Server-incompatible packages
108
+ - CSS imports (not link tags)
109
+ - Polyfills (already included)
110
+ - ESM/CommonJS issues
111
+ - Bundle analysis
112
+
113
+ ## Scripts
114
+
115
+ See [scripts.md](./scripts.md) for:
116
+ - `next/script` vs native script tags
117
+ - Inline scripts need `id`
118
+ - Loading strategies
119
+ - Google Analytics with `@next/third-parties`
120
+
121
+ ## Hydration Errors
122
+
123
+ See [hydration-error.md](./hydration-error.md) for:
124
+ - Common causes (browser APIs, dates, invalid HTML)
125
+ - Debugging with error overlay
126
+ - Fixes for each cause
127
+
128
+ ## Suspense Boundaries
129
+
130
+ See [suspense-boundaries.md](./suspense-boundaries.md) for:
131
+ - CSR bailout with `useSearchParams` and `usePathname`
132
+ - Which hooks require Suspense boundaries
133
+
134
+ ## Parallel & Intercepting Routes
135
+
136
+ See [parallel-routes.md](./parallel-routes.md) for:
137
+ - Modal patterns with `@slot` and `(.)` interceptors
138
+ - `default.tsx` for fallbacks
139
+ - Closing modals correctly with `router.back()`
140
+
141
+ ## Self-Hosting
142
+
143
+ See [self-hosting.md](./self-hosting.md) for:
144
+ - `output: 'standalone'` for Docker
145
+ - Cache handlers for multi-instance ISR
146
+ - What works vs needs extra setup
147
+
148
+ ## Debug Tricks
149
+
150
+ See [debug-tricks.md](./debug-tricks.md) for:
151
+ - MCP endpoint for AI-assisted debugging
152
+ - Rebuild specific routes with `--debug-build-paths`