@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.
- package/dist/index.d.ts +136 -0
- package/dist/index.js +1002 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
- package/presets/claude-code/.claude/settings.json +25 -0
- package/presets/claude-code/.claude/skills/git-commit/SKILL.md +124 -0
- package/presets/claude-code/.claude/skills/next-best-practices/SKILL.md +152 -0
- package/presets/claude-code/.claude/skills/tailwind-design-system/SKILL.md +874 -0
- package/presets/claude-code/.claude/skills/vitest/SKILL.md +52 -0
- package/presets/claude-code/.mcp.json +25 -0
- package/presets/claude-code/skills-lock.json +16 -0
- package/presets/codex/.agents/skills/git-commit/SKILL.md +124 -0
- package/presets/codex/.agents/skills/next-best-practices/SKILL.md +152 -0
- package/presets/codex/.agents/skills/tailwind-design-system/SKILL.md +874 -0
- package/presets/codex/.agents/skills/vitest/SKILL.md +52 -0
- package/presets/codex/.codex/config.toml +17 -0
- package/presets/codex/skills-lock.json +16 -0
- package/presets/cursor/.agents/skills/git-commit/SKILL.md +124 -0
- package/presets/cursor/.agents/skills/next-best-practices/SKILL.md +152 -0
- package/presets/cursor/.agents/skills/tailwind-design-system/SKILL.md +874 -0
- package/presets/cursor/.agents/skills/vitest/SKILL.md +52 -0
- package/presets/cursor/.cursor/cli.json +17 -0
- package/presets/cursor/.cursor/mcp.json +25 -0
- package/presets/cursor/.mcp.json +28 -0
- package/presets/cursor/skills-lock.json +16 -0
- package/presets/gemini-cli/.agents/skills/git-commit/SKILL.md +124 -0
- package/presets/gemini-cli/.agents/skills/next-best-practices/SKILL.md +152 -0
- package/presets/gemini-cli/.agents/skills/tailwind-design-system/SKILL.md +874 -0
- package/presets/gemini-cli/.agents/skills/vitest/SKILL.md +52 -0
- package/presets/gemini-cli/.gemini/settings.json +25 -0
- package/presets/gemini-cli/skills-lock.json +16 -0
- package/presets/mcporter/config/mcporter.json +25 -0
- package/presets/opencode/.agents/skills/git-commit/SKILL.md +124 -0
- package/presets/opencode/.agents/skills/next-best-practices/SKILL.md +152 -0
- package/presets/opencode/.agents/skills/tailwind-design-system/SKILL.md +874 -0
- package/presets/opencode/.agents/skills/vitest/SKILL.md +52 -0
- package/presets/opencode/opencode.json +34 -0
- package/presets/opencode/skills-lock.json +16 -0
- package/presets/vscode/.vscode/mcp.json +25 -0
- 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`
|