@stackwright-pro/mcp 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/tools/data-explorer.ts","../src/tools/security.ts","../src/tools/isr.ts","../src/tools/dashboard.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { registerDataExplorerTools } from './tools/data-explorer.js';\nimport { registerSecurityTools } from './tools/security.js';\nimport { registerIsrTools } from './tools/isr.js';\nimport { registerDashboardTools } from './tools/dashboard.js';\n\nconst server = new McpServer({\n name: 'stackwright-pro',\n version: '0.1.0',\n});\n\n// Register all Pro tools\nregisterDataExplorerTools(server); // stackwright_pro_list_entities, stackwright_pro_generate_filter\nregisterSecurityTools(server); // stackwright_pro_validate_spec, stackwright_pro_add_approved_spec, stackwright_pro_list_approved_specs\nregisterIsrTools(server); // stackwright_pro_configure_isr, stackwright_pro_configure_isr_batch\nregisterDashboardTools(server); // stackwright_pro_generate_dashboard, stackwright_pro_generate_detail_page\n\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Stackwright Pro MCP server running on stdio');\n}\n\nmain().catch((err) => {\n console.error('Fatal:', err);\n process.exit(1);\n});\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { listEntities, generateFilter } from '@stackwright-pro/cli-data-explorer';\n\n/**\n * Register data-explorer MCP tools.\n * Tools for discovering API entities and generating endpoint filters.\n */\nexport function registerDataExplorerTools(server: McpServer): void {\n // Tool: List available entities\n server.tool(\n 'stackwright_pro_list_entities',\n 'List all available API entities from OpenAPI specs or generated Zod schemas. ' +\n 'Use this to discover what entities are available before generating endpoint filters. ' +\n 'Returns entity names, endpoints, and field counts. ' +\n 'Part of the Pro Otter Raft for building API-integrated Stackwright applications.',\n {\n specPath: z.string().optional().describe('Path to OpenAPI spec file (YAML or JSON)'),\n projectRoot: z\n .string()\n .optional()\n .describe('Project root directory (auto-detected if omitted)'),\n },\n async ({ specPath, projectRoot }) => {\n const result = listEntities({\n specPath,\n projectRoot,\n });\n\n if (!result.success) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error discovering entities: ${(result.errors ?? []).join(', ')}`,\n },\n ],\n isError: true,\n };\n }\n\n const lines: string[] = [`šŸ“¦ Found ${result.entities.length} API Entities:\\n`];\n\n for (const entity of result.entities) {\n lines.push(`šŸ“¦ ${entity.name} (${entity.slug})`);\n lines.push(` Endpoint: ${entity.endpoint}`);\n lines.push(` Fields: ${entity.fieldCount}`);\n if (entity.fields.length > 0) {\n const fieldTypes = entity.fields\n .slice(0, 3)\n .map((f) => `${f.name}:${f.type}`)\n .join(', ');\n lines.push(` Types: ${fieldTypes}${entity.fields.length > 3 ? '...' : ''}`);\n }\n lines.push('');\n }\n\n lines.push(\n `\\nšŸ’” Use stackwright_pro_generate_filter with selected entity slugs to create endpoint filters.`\n );\n\n return {\n content: [\n {\n type: 'text' as const,\n text: lines.join('\\n'),\n },\n ],\n };\n }\n );\n\n // Tool: Generate endpoint filter\n server.tool(\n 'stackwright_pro_generate_filter',\n 'Generate endpoint filter configuration from selected entities. ' +\n 'Creates include/exclude patterns for stackwright.yml OpenAPI integration. ' +\n 'Use this after stackwright_pro_list_entities to select which API endpoints the application needs. ' +\n 'Only selected endpoints will generate client code, reducing bundle size and improving security.',\n {\n selectedEntities: z\n .array(z.string())\n .describe('Entity slugs to include (e.g., [\"equipment\", \"supplies\"])'),\n excludePatterns: z\n .array(z.string())\n .optional()\n .describe('Glob patterns to exclude (e.g., [\"/admin/**\", \"/reports/**\"])'),\n projectRoot: z.string().optional().describe('Project root directory'),\n },\n async ({ selectedEntities, excludePatterns, projectRoot }) => {\n const result = generateFilter({\n selectedEntities,\n excludePatterns,\n projectRoot: projectRoot || process.cwd(),\n });\n\n if (!result.success) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error generating filter: ${result.warnings?.join(', ')}`,\n },\n ],\n isError: true,\n };\n }\n\n const lines: string[] = ['šŸ” Generated Endpoint Filter:\\n'];\n lines.push('```yaml');\n lines.push('integrations:');\n lines.push(' - type: openapi');\n lines.push(' endpoints:');\n\n if (result.filter.include && result.filter.include.length > 0) {\n lines.push(' include:');\n for (const path of result.filter.include) {\n lines.push(` - ${path}`);\n }\n }\n\n if (result.filter.exclude && result.filter.exclude.length > 0) {\n lines.push(' exclude:');\n for (const pattern of result.filter.exclude) {\n lines.push(` - ${pattern}`);\n }\n }\n\n lines.push('```');\n\n if (result.warnings && result.warnings.length > 0) {\n lines.push('\\nāš ļø Warnings:');\n for (const warning of result.warnings) {\n lines.push(` ${warning}`);\n }\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: lines.join('\\n'),\n },\n ],\n };\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport fs from 'fs';\nimport path from 'path';\n\n/**\n * Register security-focused MCP tools.\n * Tools for validating specs against approved-specs and managing the allowlist.\n */\nexport function registerSecurityTools(server: McpServer): void {\n // Tool: Validate a spec against approved-specs\n server.tool(\n 'stackwright_pro_validate_spec',\n 'Validate an OpenAPI spec against the enterprise approved-specs configuration. ' +\n 'Checks if the spec URL is on the allowlist and verifies SHA-256 hash integrity. ' +\n 'Use this in enterprise environments where only pre-approved API specs are allowed. ' +\n 'Fails build if spec is not approved or has been modified.',\n {\n specPath: z.string().describe('URL or file path to the OpenAPI spec to validate'),\n configPath: z\n .string()\n .optional()\n .describe('Path to stackwright.yml with prebuild.security config'),\n },\n async ({ specPath, configPath }) => {\n // Try to load config from stackwright.yml\n let securityEnabled = false;\n let allowlist: Array<{ name: string; url: string; sha256: string }> = [];\n\n const configFile = configPath || path.join(process.cwd(), 'stackwright.yml');\n\n if (fs.existsSync(configFile)) {\n try {\n const content = fs.readFileSync(configFile, 'utf8');\n\n // Simple regex extraction for security config\n const securityMatch = content.match(\n /prebuild:\\s*\\n\\s*security:\\s*\\n\\s*enabled:\\s*(true|false)/\n );\n if (securityMatch && securityMatch[1] === 'true') {\n securityEnabled = true;\n // Extract allowlist entries\n const specMatches = content.matchAll(\n /- name:\\s*(.+?)\\n\\s+url:\\s*(.+?)\\n\\s+sha256:\\s*(.+?)(?:\\n|$)/g\n );\n for (const match of specMatches) {\n allowlist.push({\n name: match[1].trim(),\n url: match[2].trim(),\n sha256: match[3].trim(),\n });\n }\n }\n } catch {\n // Config exists but couldn't parse - continue without it\n }\n }\n\n // If no security config, just return success (security not enabled)\n if (!securityEnabled) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `āœ… Spec validation skipped (security not enabled)\\n\\nTo enable approved-specs validation, add to stackwright.yml:\\n\\nprebuild:\\n security:\\n enabled: true\\n allowlist:\\n - name: My API\\n url: ${specPath}\\n sha256: <sha256-of-spec>`,\n },\n ],\n };\n }\n\n // Check if spec is in allowlist\n const matchingSpec = allowlist.find((s) => s.url === specPath);\n\n if (!matchingSpec) {\n return {\n content: [\n {\n type: 'text' as const,\n text:\n `āŒ Spec rejected!\\n\\nError Code: SPEC_NOT_IN_ALLOWLIST\\n\\nURL: ${specPath}\\n\\nThis spec is not on the approved-specs allowlist. ` +\n `Add it using stackwright_pro_add_approved_spec before proceeding.`,\n },\n ],\n isError: true,\n };\n }\n\n // For file-based specs, compute hash and validate\n if (!specPath.startsWith('http://') && !specPath.startsWith('https://')) {\n if (fs.existsSync(specPath)) {\n const specContent = fs.readFileSync(specPath, 'utf8');\n const crypto = require('crypto');\n const sha256 = crypto.createHash('sha256').update(specContent).digest('hex');\n\n if (sha256 !== matchingSpec.sha256) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `āŒ Spec hash mismatch!\\n\\nError Code: SPEC_HASH_MISMATCH\\n\\nExpected: ${matchingSpec.sha256.substring(0, 16)}...\\nActual: ${sha256.substring(0, 16)}...\\n\\nThe spec has been modified since it was approved. Re-approve the spec to continue.`,\n },\n ],\n isError: true,\n };\n }\n }\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `āœ… Spec approved!\\n\\nName: ${matchingSpec.name}\\nURL: ${specPath}\\nStatus: Valid (${allowlist.length} specs on allowlist)`,\n },\n ],\n };\n }\n );\n\n // Tool: Add approved spec to allowlist\n server.tool(\n 'stackwright_pro_add_approved_spec',\n 'Add an OpenAPI spec to the approved-specs allowlist in stackwright.yml. ' +\n 'Computes the SHA-256 hash of the spec and adds it to the security configuration. ' +\n 'Use this when onboarding a new API in enterprise environments.',\n {\n name: z.string().describe('Human-readable name for the spec'),\n url: z.string().describe('URL or file path to the OpenAPI spec'),\n configPath: z.string().optional().describe('Path to stackwright.yml'),\n },\n async ({ name, url, configPath }) => {\n const configFile = configPath || path.join(process.cwd(), 'stackwright.yml');\n\n // Compute SHA-256 of spec\n let sha256 = '<computed-at-build>';\n\n try {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // URL spec - hash computed at build time\n sha256 = '<computed-at-build>';\n } else if (fs.existsSync(url)) {\n const specContent = fs.readFileSync(url, 'utf8');\n const crypto = require('crypto');\n sha256 = crypto.createHash('sha256').update(specContent).digest('hex');\n } else {\n return {\n content: [\n {\n type: 'text' as const,\n text: `āŒ Spec file not found: ${url}`,\n },\n ],\n isError: true,\n };\n }\n } catch (e) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `āŒ Failed to read spec: ${e}`,\n },\n ],\n isError: true,\n };\n }\n\n const yamlSnippet = ` - name: ${name}\n url: ${url}\n sha256: ${sha256}`;\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `šŸ“ Add this to stackwright.yml under prebuild.security.allowlist:\\n\\n${yamlSnippet}\\n\\nSHA-256 computed: ${sha256}`,\n },\n ],\n };\n }\n );\n\n // Tool: List approved specs\n server.tool(\n 'stackwright_pro_list_approved_specs',\n 'List all specs currently on the approved-specs allowlist. ' +\n 'Shows spec names, URLs, and hash prefixes. ' +\n 'Use this to audit what APIs are approved in the project.',\n {\n configPath: z.string().optional().describe('Path to stackwright.yml'),\n },\n async ({ configPath }) => {\n const configFile = configPath || path.join(process.cwd(), 'stackwright.yml');\n\n if (!fs.existsSync(configFile)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: 'āŒ stackwright.yml not found in project root.',\n },\n ],\n isError: true,\n };\n }\n\n const content = fs.readFileSync(configFile, 'utf8');\n\n // Check if security is enabled\n const securityEnabled =\n content.includes('prebuild:') &&\n content.includes('security:') &&\n content.includes('enabled: true');\n\n if (!securityEnabled) {\n return {\n content: [\n {\n type: 'text' as const,\n text: 'ā„¹ļø Approved-specs validation is not enabled.\\n\\nAdd to stackwright.yml to enable:\\n\\nprebuild:\\n security:\\n enabled: true\\n allowlist: []',\n },\n ],\n };\n }\n\n // Extract specs\n const specs: Array<{ name: string; url: string; sha256: string }> = [];\n const specMatches = content.matchAll(\n /- name:\\s*(.+?)\\n\\s+url:\\s*(.+?)\\n\\s+sha256:\\s*(.+?)(?:\\n|$)/g\n );\n\n for (const match of specMatches) {\n specs.push({\n name: match[1].trim(),\n url: match[2].trim(),\n sha256: match[3].trim().substring(0, 16) + '...',\n });\n }\n\n if (specs.length === 0) {\n return {\n content: [\n {\n type: 'text' as const,\n text: 'ā„¹ļø Security enabled but no specs on allowlist.\\n\\nAdd specs using stackwright_pro_add_approved_spec.',\n },\n ],\n };\n }\n\n const lines = [`šŸ” Approved Specs (${specs.length}):\\n`];\n for (const spec of specs) {\n lines.push(`šŸ“¦ ${spec.name}`);\n lines.push(` URL: ${spec.url}`);\n lines.push(` Hash: ${spec.sha256}`);\n lines.push('');\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: lines.join('\\n'),\n },\n ],\n };\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport fs from 'fs';\nimport path from 'path';\n\n/**\n * Register ISR configuration MCP tools.\n * Tools for configuring Incremental Static Regeneration for API-backed collections.\n */\nexport function registerIsrTools(server: McpServer): void {\n // Tool: Configure ISR for a collection\n server.tool(\n 'stackwright_pro_configure_isr',\n 'Configure Incremental Static Regeneration (ISR) for an API-backed collection. ' +\n 'ISR allows API data to be cached and refreshed on a schedule, providing real-time data ' +\n 'with the performance of static generation. ' +\n 'Use this after stackwright_pro_generate_filter to set revalidation intervals.',\n {\n collection: z.string().describe('Collection name (e.g., \"equipment\", \"supplies\")'),\n revalidateSeconds: z\n .number()\n .optional()\n .describe('Revalidation interval in seconds (default: 60)'),\n fallback: z\n .enum(['blocking', 'true', 'false'])\n .optional()\n .describe('Fallback behavior for new pages'),\n configPath: z.string().optional().describe('Path to stackwright.yml'),\n },\n async ({ collection, revalidateSeconds = 60, fallback = 'blocking', configPath }) => {\n const revalidate = revalidateSeconds;\n\n const yamlSnippet = `# Add to stackwright.yml under integrations:\n - type: openapi\n name: ${collection}\n # ... other config\n isr:\n revalidate: ${revalidate}\n fallback: ${fallback}`;\n\n let description = '';\n if (revalidate < 60) {\n description = '⚔ Very fresh data (revalidate every ' + revalidate + 's)';\n } else if (revalidate < 300) {\n description = 'šŸ“Š Fresh data (revalidate every ' + (revalidate / 60).toFixed(0) + ' min)';\n } else if (revalidate < 3600) {\n description = 'šŸ’¾ Cached data (revalidate every ' + (revalidate / 60).toFixed(0) + ' min)';\n } else {\n description =\n 'šŸ—„ļø Static data (revalidate every ' + (revalidate / 3600).toFixed(0) + ' hour)';\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `āš™ļø ISR Configuration for \"${collection}\":\\n\\n${description}\\n\\nFallback: ${fallback === 'blocking' ? 'ā³ Show loading until cached' : fallback === 'true' ? 'šŸ“„ Generate on demand' : 'āŒ 404 for new pages'}\\n\\n\\`\\`\\`yaml\\n${yamlSnippet}\\n\\`\\`\\``,\n },\n ],\n };\n }\n );\n\n // Tool: Configure ISR for multiple collections\n server.tool(\n 'stackwright_pro_configure_isr_batch',\n 'Configure ISR for multiple collections at once. ' +\n 'More efficient than calling stackwright_pro_configure_isr multiple times. ' +\n 'Provide different revalidation intervals based on data freshness requirements.',\n {\n collections: z\n .array(\n z.object({\n name: z.string().describe('Collection name'),\n revalidateSeconds: z.number().optional().describe('Revalidation interval'),\n })\n )\n .describe('Array of collection configurations'),\n defaultFallback: z\n .enum(['blocking', 'true', 'false'])\n .optional()\n .describe('Default fallback behavior'),\n configPath: z.string().optional().describe('Path to stackwright.yml'),\n },\n async ({ collections, defaultFallback = 'blocking', configPath }) => {\n const lines = [`āš™ļø Batch ISR Configuration:\\n`];\n\n for (const col of collections) {\n const rev = col.revalidateSeconds || 60;\n let freshness = 'šŸ’¾';\n if (rev < 60) freshness = '⚔';\n else if (rev < 300) freshness = 'šŸ“Š';\n else if (rev >= 3600) freshness = 'šŸ—„ļø';\n\n lines.push(`${freshness} ${col.name}: revalidate=${rev}s`);\n }\n\n lines.push(`\\nFallback: ${defaultFallback}`);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: lines.join('\\n'),\n },\n ],\n };\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { listEntities } from '@stackwright-pro/cli-data-explorer';\n\n/**\n * Register dashboard generation MCP tools.\n * Tools for building pages that display live API data.\n */\nexport function registerDashboardTools(server: McpServer): void {\n // Tool: Generate dashboard page configuration\n server.tool(\n 'stackwright_pro_generate_dashboard',\n 'Generate a dashboard page configuration for displaying API data. ' +\n 'Creates YAML content for a Stackwright page with collection_listing, data_table, or stats_grid content types. ' +\n 'Use this after stackwright_pro_generate_filter to create pages for your API collections.',\n {\n entities: z.array(z.string()).describe('Entity slugs to include in dashboard'),\n layout: z.enum(['grid', 'table', 'mixed']).optional().describe('Dashboard layout style'),\n pageTitle: z.string().optional().describe('Page title'),\n specPath: z.string().optional().describe('Path to OpenAPI spec for entity details'),\n },\n async ({ entities, layout = 'mixed', pageTitle, specPath }) => {\n // Get entity details if spec provided\n let entityDetails: any[] = [];\n if (specPath) {\n const result = listEntities({ specPath });\n if (result.success) {\n entityDetails = result.entities.filter((e) => entities.includes(e.slug));\n }\n }\n\n const title =\n pageTitle || entities.map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(' & ');\n\n const yamlLines = [\n '# Dashboard page configuration',\n '# Generated by Stackwright Pro MCP',\n '',\n 'content:',\n ' meta:',\n ` title: \"${title} | Dashboard\"`,\n ` description: \"Live data from API\"`,\n '',\n ' content_items:',\n ];\n\n // Add stats grid for each entity\n if (layout === 'grid' || layout === 'mixed') {\n for (const slug of entities) {\n yamlLines.push(` - stats_grid:`);\n yamlLines.push(` label: \"${slug}-stats\"`);\n yamlLines.push(` heading:`);\n yamlLines.push(\n ` text: \"${slug.charAt(0).toUpperCase() + slug.slice(1)} Overview\"`\n );\n yamlLines.push(` textSize: \"h2\"`);\n yamlLines.push(` stats:`);\n yamlLines.push(` - label: \"Total\"`);\n yamlLines.push(` value: \"{{ ${slug}.count }}\"`);\n yamlLines.push(` icon: \"Database\"`);\n yamlLines.push(` source: \"${slug}\"`);\n yamlLines.push(` background: \"surface\"`);\n yamlLines.push('');\n }\n }\n\n // Add collection listing for each entity\n yamlLines.push(` - collection_listing:`);\n yamlLines.push(` label: \"${entities[0]}-listing\"`);\n yamlLines.push(` heading:`);\n yamlLines.push(\n ` text: \"${entities.map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(' & ')}\"`\n );\n yamlLines.push(` textSize: \"h2\"`);\n yamlLines.push(` collection: \"${entities[0]}\"`);\n yamlLines.push(` showFilters: true`);\n yamlLines.push(` showSearch: true`);\n const defaultCols = ['\"id\"', '\"name\"', '\"status\"', '\"created_at\"'];\n yamlLines.push(\n ` columns: ${\n entityDetails[0]?.fields\n ?.slice(0, 4)\n .map((f: any) => `\"${f.name}\"`)\n .join(', ') || defaultCols.join(', ')\n }`\n );\n yamlLines.push(` background: \"background\"`);\n yamlLines.push('');\n\n if (layout === 'table') {\n yamlLines.push(` - data_table:`);\n yamlLines.push(` label: \"${entities[0]}-table\"`);\n yamlLines.push(` heading:`);\n yamlLines.push(` text: \"Detailed View\"`);\n yamlLines.push(` textSize: \"h3\"`);\n yamlLines.push(` collection: \"${entities[0]}\"`);\n yamlLines.push(` sortableColumns: true`);\n yamlLines.push(` exportable: true`);\n yamlLines.push(` background: \"surface\"`);\n }\n\n const yaml = yamlLines.join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `šŸ“Š Generated Dashboard for: ${entities.join(', ')}\\n\\nLayout: ${layout}\\n\\n\\`\\`\\`yaml\\n${yaml}\\n\\`\\`\\`\\n\\nšŸ’” Add this to pages/dashboard/content.yml and validate with stackwright_validate_pages.`,\n },\n ],\n };\n }\n );\n\n // Tool: Generate detail page\n server.tool(\n 'stackwright_pro_generate_detail_page',\n 'Generate a detail view page for a single API entity. ' +\n 'Creates YAML content for displaying all fields of an individual record. ' +\n 'Use this to create detail pages that complement collection listing pages.',\n {\n entity: z.string().describe('Entity slug (e.g., \"equipment\")'),\n slugField: z.string().optional().describe('Field to use as URL slug (default: \"id\")'),\n specPath: z.string().optional().describe('Path to OpenAPI spec for field details'),\n },\n async ({ entity, slugField = 'id', specPath }) => {\n // Get field details if spec provided\n let fields: any[] = [];\n if (specPath) {\n const result = listEntities({ specPath });\n if (result.success) {\n const ent = result.entities.find((e) => e.slug === entity);\n if (ent) {\n fields = ent.fields;\n }\n }\n }\n\n const entityName = entity.charAt(0).toUpperCase() + entity.slice(1);\n\n const yamlLines = [\n `# Detail page for ${entityName}`,\n '# Generated by Stackwright Pro MCP',\n '',\n 'content:',\n ' meta:',\n ` title: \"${entityName} Details | {{ ${entity}.${slugField} }}\"`,\n '',\n ' content_items:',\n ' - main:',\n ' label: \"detail-header\"',\n ' heading:',\n ` text: \"{{ ${entity}.${slugField} }}\"`,\n ' textSize: \"h1\"',\n ' textBlocks:',\n ` - text: \"Details for this ${entity}\"`,\n ' textSize: \"body1\"',\n ' background: \"primary\"',\n ' color: \"text\"',\n '',\n ' - grid:',\n ' label: \"detail-fields\"',\n ' columns: 2',\n ' items:',\n ];\n\n // Add field cards\n const displayFields =\n fields.length > 0\n ? fields.slice(0, 8)\n : [\n { name: slugField, type: 'string' },\n { name: 'created_at', type: 'datetime' },\n { name: 'updated_at', type: 'datetime' },\n ];\n\n for (const field of displayFields) {\n const label = field.name.replace(/_/g, ' ').replace(/\\b\\w/g, (l) => l.toUpperCase());\n yamlLines.push(` - card:`);\n yamlLines.push(` label: \"${field.name}-field\"`);\n yamlLines.push(` heading:`);\n yamlLines.push(` text: \"${label}\"`);\n yamlLines.push(` textSize: \"h4\"`);\n yamlLines.push(` content:`);\n yamlLines.push(` - text: \"{{ ${entity}.${field.name} }}\"`);\n yamlLines.push(` textSize: \"body1\"`);\n }\n\n yamlLines.push(' background: \"background\"');\n\n const yaml = yamlLines.join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `šŸ“„ Generated Detail Page for: ${entity}\\n\\n\\`\\`\\`yaml\\n${yaml}\\n\\`\\`\\`\\n\\nšŸ’” Add this to pages/${entity}/[${slugField}]/content.yml and validate.`,\n },\n ],\n };\n }\n );\n}\n"],"mappings":"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","names":["server","path","import_zod","server","path","fs","import_zod","server","import_zod","import_cli_data_explorer","server"]}