@terasky/backstage-plugin-ai-rules 1.6.0 → 1.7.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/config.d.ts +11 -9
- package/dist/alpha.esm.js +30 -0
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api/AiRulesClient.esm.js +27 -19
- package/dist/api/AiRulesClient.esm.js.map +1 -1
- package/dist/api/types.esm.js.map +1 -1
- package/dist/components/AgentConfigsComponent/AgentConfigsComponent.esm.js +91 -0
- package/dist/components/AgentConfigsComponent/AgentConfigsComponent.esm.js.map +1 -0
- package/dist/components/AgentSkillsComponent/AgentSkillsComponent.esm.js +225 -0
- package/dist/components/AgentSkillsComponent/AgentSkillsComponent.esm.js.map +1 -0
- package/dist/components/AiInstructionsComponent/AiInstructionsComponent.esm.js +13 -3
- package/dist/components/AiInstructionsComponent/AiInstructionsComponent.esm.js.map +1 -1
- package/dist/components/AiRulesComponent/AiRulesComponent.esm.js +327 -248
- package/dist/components/AiRulesComponent/AiRulesComponent.esm.js.map +1 -1
- package/dist/components/IgnoreFilesComponent/IgnoreFilesComponent.esm.js +86 -0
- package/dist/components/IgnoreFilesComponent/IgnoreFilesComponent.esm.js.map +1 -0
- package/dist/components/MCPServersComponent/MCPServersComponent.esm.js +4 -0
- package/dist/components/MCPServersComponent/MCPServersComponent.esm.js.map +1 -1
- package/dist/hooks/useAgentConfigs.esm.js +38 -0
- package/dist/hooks/useAgentConfigs.esm.js.map +1 -0
- package/dist/hooks/useAiRules.esm.js +13 -1
- package/dist/hooks/useAiRules.esm.js.map +1 -1
- package/dist/hooks/useIgnoreFiles.esm.js +38 -0
- package/dist/hooks/useIgnoreFiles.esm.js.map +1 -0
- package/dist/hooks/useSkills.esm.js +38 -0
- package/dist/hooks/useSkills.esm.js.map +1 -0
- package/dist/index.d.ts +143 -7
- package/dist/index.esm.js +3 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +24 -0
- package/dist/plugin.esm.js.map +1 -1
- package/dist/types.esm.js +7 -0
- package/dist/types.esm.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiRulesComponent.esm.js","sources":["../../../src/components/AiRulesComponent/AiRulesComponent.tsx"],"sourcesContent":["import React from 'react';\nimport { useAiRules } from '../../hooks/useAiRules';\nimport { InfoCard, Progress, EmptyState, MarkdownContent } from '@backstage/core-components';\nimport { Button, makeStyles, useTheme, Typography, Chip, Card, CardContent, Accordion, AccordionSummary, AccordionDetails, FormControlLabel, Checkbox, IconButton, Tooltip } from '@material-ui/core';\nimport { Entity } from '@backstage/catalog-model';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport CodeIcon from '@material-ui/icons/Code';\nimport LaunchIcon from '@material-ui/icons/Launch';\nimport { AIRuleType, AIRule, CursorRule, CopilotRule, ClineRule, ClaudeCodeRule } from '../../types';\nexport interface AIRulesComponentProps {\n title?: string;\n}\n\nexport const isAIRulesAvailable = (entity: Entity): boolean => {\n const sourceAnnotation = entity.metadata?.annotations?.['backstage.io/source-location'] || '';\n return sourceAnnotation.startsWith('url:');\n};\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n '& .MuiAccordion-root': {\n marginBottom: theme.spacing(1),\n '&:before': {\n display: 'none',\n },\n },\n },\n filterSection: {\n marginBottom: theme.spacing(2),\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n borderRadius: theme.shape.borderRadius,\n },\n ruleCard: {\n marginBottom: theme.spacing(1),\n border: `1px solid ${theme.palette.divider}`,\n },\n ruleHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n width: '100%',\n },\n ruleHeaderContent: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n flex: 1,\n },\n ruleType: {\n textTransform: 'uppercase',\n fontWeight: 'bold',\n fontSize: '0.75rem',\n },\n ruleContent: {\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n overflow: 'auto',\n maxHeight: '300px',\n '& > *': {\n backgroundColor: 'transparent !important',\n },\n },\n ruleMetadata: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(0.5),\n marginBottom: theme.spacing(1),\n },\n statsContainer: {\n display: 'flex',\n gap: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n statCard: {\n minWidth: '120px',\n textAlign: 'center',\n },\n emptyStateIcon: {\n fontSize: '4rem',\n color: theme.palette.grey[400],\n },\n filterContainer: {\n display: 'flex',\n flexWrap: 'wrap',\n '& > *': {\n marginRight: theme.spacing(1),\n },\n },\n applyFilterButton: {\n marginTop: theme.spacing(1),\n },\n}));\n\nconst RuleTypeIcon = ({ type }: { type: AIRuleType }) => {\n const colors = {\n [AIRuleType.CURSOR]: '#0066CC',\n [AIRuleType.COPILOT]: '#6F42C1', \n [AIRuleType.CLINE]: '#28A745',\n [AIRuleType.CLAUDE_CODE]: '#FF6B35',\n };\n \n return <CodeIcon style={{ color: colors[type] }} />;\n};\n\nconst renderFrontmatter = (theme: any, frontmatter?: Record<string, any>) => {\n if (!frontmatter || Object.keys(frontmatter).length === 0) {\n return null;\n }\n\n // Filter out fields that are already displayed elsewhere (description, globs)\n const filteredEntries = Object.entries(frontmatter).filter(([key]) => \n !['description', 'globs'].includes(key)\n );\n\n if (filteredEntries.length === 0) {\n return null;\n }\n\n return (\n <div style={{ \n marginBottom: '16px', \n padding: '16px', \n backgroundColor: theme.palette.type === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.05)', \n borderRadius: '8px',\n border: `1px solid ${theme.palette.type === 'dark' ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.12)'}`\n }}>\n <Typography variant=\"subtitle2\" style={{ \n marginBottom: '12px', \n fontWeight: 'bold',\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n letterSpacing: '0.5px'\n }}>\n Metadata\n </Typography>\n {filteredEntries.map(([key, value], index) => (\n <div key={key} style={{ marginBottom: index < filteredEntries.length - 1 ? '12px' : '0' }}>\n <Typography variant=\"body2\" style={{ \n fontWeight: 'bold',\n textTransform: 'capitalize',\n color: theme.palette.primary.main,\n marginBottom: '4px'\n }}>\n {key}:\n </Typography>\n <Typography variant=\"body2\" style={{ \n lineHeight: '1.5',\n marginLeft: '8px',\n color: theme.palette.text.primary\n }}>\n {Array.isArray(value) ? value.join(', ') : String(value)}\n </Typography>\n </div>\n ))}\n </div>\n );\n};\n\n// Helper function to parse cursor rule content manually\nconst parseCursorContent = (content: string) => {\n return manualParseFrontmatter(content);\n};\n\n// Manual frontmatter parsing as fallback\nconst manualParseFrontmatter = (content: string) => {\n // Check if content starts with ---\n if (!content.trim().startsWith('---')) {\n return {\n frontmatter: undefined,\n content: content\n };\n }\n\n try {\n // Split by lines\n const lines = content.split('\\n');\n let frontmatterEndIndex = -1;\n \n // Find the closing ---\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim() === '---') {\n frontmatterEndIndex = i;\n break;\n }\n }\n \n if (frontmatterEndIndex === -1) {\n return {\n frontmatter: undefined,\n content: content\n };\n }\n \n // Extract frontmatter lines (between the --- markers)\n const frontmatterLines = lines.slice(1, frontmatterEndIndex);\n const contentLines = lines.slice(frontmatterEndIndex + 1);\n \n // Parse the YAML manually (simple key: value pairs)\n const frontmatter: Record<string, any> = {};\n for (const line of frontmatterLines) {\n const trimmedLine = line.trim();\n if (trimmedLine && trimmedLine.includes(':')) {\n const colonIndex = trimmedLine.indexOf(':');\n const key = trimmedLine.substring(0, colonIndex).trim();\n const value = trimmedLine.substring(colonIndex + 1).trim();\n frontmatter[key] = value;\n }\n }\n \n return {\n frontmatter: Object.keys(frontmatter).length > 0 ? frontmatter : undefined,\n content: contentLines.join('\\n').trim()\n };\n } catch (error) {\n return {\n frontmatter: undefined,\n content: content\n };\n }\n};\n\nconst constructFileUrl = (gitUrl: string, filePath: string): string => {\n // Remove trailing slashes from gitUrl\n const cleanGitUrl = gitUrl.replace(/\\/+$/, '');\n \n // For GitHub URLs, convert to blob view\n if (cleanGitUrl.includes('github.com')) {\n return `${cleanGitUrl}/blob/main/${filePath}`;\n }\n \n // For GitLab URLs, convert to blob view\n if (cleanGitUrl.includes('gitlab.com')) {\n return `${cleanGitUrl}/-/blob/main/${filePath}`;\n }\n \n // For other git providers, try generic blob URL\n return `${cleanGitUrl}/blob/main/${filePath}`;\n};\n\nconst RuleComponent = ({ rule }: { rule: AIRule }) => {\n const styles = useStyles();\n const theme = useTheme();\n \n const renderCursorRule = (rule: CursorRule) => {\n // Parse the raw content to extract frontmatter and clean content\n const { frontmatter, content } = parseCursorContent(rule.content);\n \n return (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={rule.type} />\n <Typography variant=\"h6\">{rule.fileName}</Typography>\n <Chip label={rule.type} size=\"small\" className={styles.ruleType} />\n {frontmatter?.description && (\n <Typography variant=\"body2\" style={{ marginLeft: 8, color: theme.palette.text.secondary }}>\n {frontmatter.description}\n </Typography>\n )}\n </div>\n {rule.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n window.open(constructFileUrl(rule.gitUrl!, rule.filePath), '_blank');\n }}\n >\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${rule.filePath}`} size=\"small\" variant=\"outlined\" />\n {frontmatter?.globs && (\n <Chip label={`Globs: ${Array.isArray(frontmatter.globs) ? frontmatter.globs.join(', ') : frontmatter.globs}`} size=\"small\" variant=\"outlined\" />\n )}\n </div>\n {renderFrontmatter(theme, frontmatter)}\n <div className={styles.ruleContent}>\n <MarkdownContent content={content} />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n };\n\n const renderCopilotRule = (rule: CopilotRule) => {\n // Get rule number from either order (legacy) or extract from filename\n const ruleNumber = rule.order || (rule.fileName.match(/Rule (\\d+)/) || [])[1] || rule.id.split('-').pop();\n \n return (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={rule.type} />\n <Typography variant=\"h6\">\n {rule.title || `Copilot Rule #${ruleNumber}`}\n </Typography>\n <Chip label={rule.type} size=\"small\" className={styles.ruleType} />\n {rule.applyTo && (\n <Chip \n label={`Applies to: ${rule.applyTo}`} \n size=\"small\" \n variant=\"outlined\" \n style={{ marginLeft: 8 }}\n />\n )}\n </div>\n {rule.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n window.open(constructFileUrl(rule.gitUrl!, rule.filePath), '_blank');\n }}\n >\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${rule.filePath}`} size=\"small\" variant=\"outlined\" />\n {rule.frontmatter && renderFrontmatter(theme, rule.frontmatter)}\n </div>\n <div className={styles.ruleContent}>\n <MarkdownContent content={rule.content} />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n };\n\n const renderClineRule = (rule: ClineRule) => (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={rule.type} />\n <Typography variant=\"h6\">{rule.title || rule.fileName}</Typography>\n <Chip label={rule.type} size=\"small\" className={styles.ruleType} />\n </div>\n {rule.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n window.open(constructFileUrl(rule.gitUrl!, rule.filePath), '_blank');\n }}\n >\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${rule.filePath}`} size=\"small\" variant=\"outlined\" />\n </div>\n <div className={styles.ruleContent}>\n <MarkdownContent content={rule.content} />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n\n const renderClaudeCodeRule = (rule: ClaudeCodeRule) => (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={rule.type} />\n <Typography variant=\"h6\">{rule.title || rule.fileName}</Typography>\n <Chip label={rule.type} size=\"small\" className={styles.ruleType} />\n </div>\n {rule.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n window.open(constructFileUrl(rule.gitUrl!, rule.filePath), '_blank');\n }}\n >\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${rule.filePath}`} size=\"small\" variant=\"outlined\" />\n </div>\n <div className={styles.ruleContent}>\n <MarkdownContent content={rule.content} />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n\n switch (rule.type) {\n case AIRuleType.CURSOR:\n return renderCursorRule(rule as CursorRule);\n case AIRuleType.CLAUDE_CODE:\n return renderClaudeCodeRule(rule as ClaudeCodeRule);\n case AIRuleType.COPILOT:\n return renderCopilotRule(rule as CopilotRule);\n case AIRuleType.CLINE:\n return renderClineRule(rule as ClineRule);\n default:\n return null;\n }\n};\n\nexport const AIRulesComponent: React.FC<AIRulesComponentProps> = ({ title = \"AI Coding Rules\" } = {}) => {\n const { rulesByType, loading, error, hasGitUrl, totalRules, allowedRuleTypes, selectedRuleTypes, setSelectedRuleTypes, applyFilters, resetFilters, hasUnappliedChanges, hasSearched } = useAiRules();\n const styles = useStyles();\n \n // Define the desired rendering order\n const ruleTypeDisplayOrder = [AIRuleType.CURSOR, AIRuleType.CLAUDE_CODE, AIRuleType.COPILOT, AIRuleType.CLINE];\n \n // Helper function to format rule type names for display\n const formatRuleTypeName = (type: AIRuleType): string => {\n switch (type) {\n case AIRuleType.CURSOR:\n return 'Cursor';\n case AIRuleType.CLAUDE_CODE:\n return 'Claude Code';\n case AIRuleType.COPILOT:\n return 'Copilot';\n case AIRuleType.CLINE:\n return 'Cline';\n }\n };\n const handleTypeToggle = (type: AIRuleType, checked: boolean) => {\n const newTypes = checked \n ? [...selectedRuleTypes, type]\n : selectedRuleTypes.filter(t => t !== type);\n setSelectedRuleTypes(newTypes);\n };\n\n if (loading) {\n return (\n <InfoCard title={title}>\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasGitUrl) {\n return (\n <InfoCard title={title}>\n <EmptyState\n missing=\"content\"\n title=\"No Git Repository\"\n description=\"This component doesn't have a Git source URL configured.\"\n />\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title={title}>\n <EmptyState\n missing=\"content\"\n title=\"Error Loading Rules\"\n description={error}\n />\n </InfoCard>\n );\n }\n\n return (\n <InfoCard title={title} className={styles.root}>\n <div className={styles.filterSection}>\n <Typography variant=\"h6\" gutterBottom>\n Filter Rule Types\n </Typography>\n <div className={styles.filterContainer}>\n {allowedRuleTypes.map(type => (\n <FormControlLabel\n key={type}\n control={\n <Checkbox\n checked={selectedRuleTypes.includes(type)}\n onChange={(e) => handleTypeToggle(type, e.target.checked)}\n />\n }\n label={formatRuleTypeName(type)}\n />\n ))}\n </div>\n <div className={styles.applyFilterButton}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={applyFilters}\n disabled={!hasUnappliedChanges}\n >\n Apply Filter\n </Button>\n {hasUnappliedChanges && (\n <Typography variant=\"body2\" color=\"textSecondary\" style={{ marginTop: 8 }}>\n You have unsaved filter changes. Click \"Apply Filter\" to update the results.\n </Typography>\n )}\n {!hasUnappliedChanges && selectedRuleTypes.length === 0 && (\n <Typography variant=\"body2\" color=\"textSecondary\" style={{ marginTop: 8 }}>\n Select at least one rule type to search for AI rules.\n </Typography>\n )}\n </div>\n </div>\n\n {hasSearched && totalRules === 0 ? (\n <EmptyState\n missing=\"content\"\n title=\"No AI Rules Found\"\n description=\"No AI rules were found in this repository for the selected rule types.\"\n action={\n <Button\n variant=\"outlined\"\n onClick={resetFilters}\n >\n Reset Filters\n </Button>\n }\n />\n ) : totalRules > 0 ? (\n <>\n <div className={styles.statsContainer}>\n <Card className={styles.statCard}>\n <CardContent>\n <Typography variant=\"h4\">{totalRules}</Typography>\n <Typography color=\"textSecondary\">Total Rules</Typography>\n </CardContent>\n </Card>\n {ruleTypeDisplayOrder.map(type => {\n const typeRules = rulesByType[type] || [];\n if (typeRules.length === 0) return null;\n return (\n <Card key={type} className={styles.statCard}>\n <CardContent>\n <Typography variant=\"h4\">{typeRules.length}</Typography>\n <Typography color=\"textSecondary\">{formatRuleTypeName(type)}</Typography>\n </CardContent>\n </Card>\n );\n })}\n </div>\n\n {ruleTypeDisplayOrder.map(type => {\n const typeRules = rulesByType[type] || [];\n if (typeRules.length === 0) return null;\n return (\n <div key={type}>\n <Typography variant=\"h5\" gutterBottom style={{ marginTop: 16 }}>\n {formatRuleTypeName(type)} Rules ({typeRules.length})\n </Typography>\n {typeRules.map(rule => (\n <RuleComponent key={rule.id} rule={rule} />\n ))}\n </div>\n );\n })}\n </>\n ) : (\n <div style={{ marginTop: 16 }}>\n <Typography variant=\"body1\" color=\"textSecondary\">\n Select rule types above and click \"Apply Filter\" to search for AI coding rules in this repository.\n </Typography>\n </div>\n )}\n </InfoCard>\n );\n};"],"names":["rule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiRulesComponent.esm.js","sources":["../../../src/components/AiRulesComponent/AiRulesComponent.tsx"],"sourcesContent":["import React, { useState, useCallback, useMemo } from 'react';\nimport { useAiRules } from '../../hooks/useAiRules';\nimport { InfoCard, Progress, EmptyState, MarkdownContent, CodeSnippet } from '@backstage/core-components';\nimport {\n Button,\n makeStyles,\n useTheme,\n Typography,\n Chip,\n Card,\n CardContent,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n FormControlLabel,\n Checkbox,\n IconButton,\n Tooltip,\n TextField,\n Snackbar,\n} from '@material-ui/core';\nimport { ToggleButton, ToggleButtonGroup } from '@material-ui/lab';\nimport { Entity } from '@backstage/catalog-model';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport CodeIcon from '@material-ui/icons/Code';\nimport LaunchIcon from '@material-ui/icons/Launch';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport GetAppIcon from '@material-ui/icons/GetApp';\nimport { AIRuleType, AIRule, CursorRule, CopilotRule, ClineRule, ClaudeCodeRule } from '../../types';\n\nexport interface AIRulesComponentProps {\n title?: string;\n}\n\nexport const isAIRulesAvailable = (entity: Entity): boolean => {\n const sourceAnnotation = entity.metadata?.annotations?.['backstage.io/source-location'] || '';\n return sourceAnnotation.startsWith('url:');\n};\n\n// ─── Type metadata ────────────────────────────────────────────────────────────\n\nconst RULE_TYPE_COLORS: Record<AIRuleType, string> = {\n [AIRuleType.CURSOR]: '#0066CC',\n [AIRuleType.COPILOT]: '#6F42C1',\n [AIRuleType.CLINE]: '#28A745',\n [AIRuleType.CLAUDE_CODE]: '#FF6B35',\n [AIRuleType.WINDSURF]: '#00B4D8',\n [AIRuleType.ROO_CODE]: '#6610F2',\n [AIRuleType.CODEX]: '#10A37F',\n [AIRuleType.GEMINI]: '#4285F4',\n [AIRuleType.AMAZON_Q]: '#FF9900',\n [AIRuleType.CONTINUE]: '#1A73E8',\n [AIRuleType.AIDER]: '#E83E8C',\n};\n\nconst RULE_TYPE_DISPLAY_NAMES: Record<AIRuleType, string> = {\n [AIRuleType.CURSOR]: 'Cursor',\n [AIRuleType.COPILOT]: 'Copilot',\n [AIRuleType.CLINE]: 'Cline',\n [AIRuleType.CLAUDE_CODE]: 'Claude Code',\n [AIRuleType.WINDSURF]: 'Windsurf',\n [AIRuleType.ROO_CODE]: 'Roo Code',\n [AIRuleType.CODEX]: 'OpenAI Codex',\n [AIRuleType.GEMINI]: 'Gemini CLI',\n [AIRuleType.AMAZON_Q]: 'Amazon Q',\n [AIRuleType.CONTINUE]: 'Continue',\n [AIRuleType.AIDER]: 'Aider',\n};\n\nconst RULE_TYPE_DISPLAY_ORDER: AIRuleType[] = [\n AIRuleType.CURSOR,\n AIRuleType.CLAUDE_CODE,\n AIRuleType.COPILOT,\n AIRuleType.CLINE,\n AIRuleType.WINDSURF,\n AIRuleType.ROO_CODE,\n AIRuleType.CODEX,\n AIRuleType.GEMINI,\n AIRuleType.AMAZON_Q,\n AIRuleType.CONTINUE,\n AIRuleType.AIDER,\n];\n\n// ─── Styles ───────────────────────────────────────────────────────────────────\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n '& .MuiAccordion-root': {\n marginBottom: theme.spacing(1),\n '&:before': { display: 'none' },\n },\n },\n filterSection: {\n marginBottom: theme.spacing(2),\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n borderRadius: theme.shape.borderRadius,\n },\n searchBar: {\n marginBottom: theme.spacing(2),\n width: '100%',\n },\n ruleCard: {\n marginBottom: theme.spacing(1),\n border: `1px solid ${theme.palette.divider}`,\n },\n ruleHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n width: '100%',\n },\n ruleHeaderContent: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n flex: 1,\n overflow: 'hidden',\n },\n ruleHeaderActions: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n flexShrink: 0,\n },\n ruleType: {\n textTransform: 'uppercase',\n fontWeight: 'bold',\n fontSize: '0.75rem',\n },\n ruleContent: {\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n overflow: 'auto',\n maxHeight: '300px',\n '& > *': { backgroundColor: 'transparent !important' },\n },\n ruleMetadata: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(0.5),\n marginBottom: theme.spacing(1),\n },\n statsContainer: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(2),\n marginBottom: theme.spacing(2),\n alignItems: 'center',\n },\n statCard: {\n minWidth: '100px',\n textAlign: 'center',\n },\n filterContainer: {\n display: 'flex',\n flexWrap: 'wrap',\n '& > *': { marginRight: theme.spacing(1) },\n },\n applyFilterButton: {\n marginTop: theme.spacing(1),\n },\n viewToggle: {\n marginBottom: theme.spacing(1),\n },\n exportButton: {\n marginLeft: 'auto',\n },\n}));\n\n// ─── Helper functions ─────────────────────────────────────────────────────────\n\nconst parseCursorContent = (content: string) => manualParseFrontmatter(content);\n\nconst manualParseFrontmatter = (content: string) => {\n if (!content.trim().startsWith('---')) {\n return { frontmatter: undefined, content };\n }\n try {\n const lines = content.split('\\n');\n let frontmatterEndIndex = -1;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim() === '---') { frontmatterEndIndex = i; break; }\n }\n if (frontmatterEndIndex === -1) return { frontmatter: undefined, content };\n const frontmatterLines = lines.slice(1, frontmatterEndIndex);\n const contentLines = lines.slice(frontmatterEndIndex + 1);\n const frontmatter: Record<string, any> = {};\n for (const line of frontmatterLines) {\n const trimmedLine = line.trim();\n if (trimmedLine && trimmedLine.includes(':')) {\n const colonIndex = trimmedLine.indexOf(':');\n const key = trimmedLine.substring(0, colonIndex).trim();\n const value = trimmedLine.substring(colonIndex + 1).trim();\n frontmatter[key] = value;\n }\n }\n return {\n frontmatter: Object.keys(frontmatter).length > 0 ? frontmatter : undefined,\n content: contentLines.join('\\n').trim(),\n };\n } catch (_e) {\n return { frontmatter: undefined, content };\n }\n};\n\nconst constructFileUrl = (gitUrl: string, filePath: string): string => {\n const cleanGitUrl = gitUrl.replace(/\\/+$/, '');\n if (cleanGitUrl.includes('github.com')) return `${cleanGitUrl}/blob/main/${filePath}`;\n if (cleanGitUrl.includes('gitlab.com')) return `${cleanGitUrl}/-/blob/main/${filePath}`;\n return `${cleanGitUrl}/blob/main/${filePath}`;\n};\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nconst RuleTypeIcon = ({ type }: { type: AIRuleType }) => (\n <CodeIcon style={{ color: RULE_TYPE_COLORS[type] ?? '#888', flexShrink: 0 }} />\n);\n\nconst renderFrontmatter = (theme: any, frontmatter?: Record<string, any>) => {\n if (!frontmatter || Object.keys(frontmatter).length === 0) return null;\n const filteredEntries = Object.entries(frontmatter).filter(([key]) =>\n !['description', 'globs'].includes(key),\n );\n if (filteredEntries.length === 0) return null;\n return (\n <div style={{\n marginBottom: 16,\n padding: 16,\n backgroundColor: theme.palette.type === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.05)',\n borderRadius: 8,\n border: `1px solid ${theme.palette.type === 'dark' ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.12)'}`,\n }}>\n <Typography variant=\"subtitle2\" style={{ marginBottom: 12, fontWeight: 'bold', color: theme.palette.text.secondary, textTransform: 'uppercase', letterSpacing: '0.5px' }}>\n Metadata\n </Typography>\n {filteredEntries.map(([key, value], index) => (\n <div key={key} style={{ marginBottom: index < filteredEntries.length - 1 ? 12 : 0 }}>\n <Typography variant=\"body2\" style={{ fontWeight: 'bold', textTransform: 'capitalize', color: theme.palette.primary.main, marginBottom: 4 }}>\n {key}:\n </Typography>\n <Typography variant=\"body2\" style={{ lineHeight: '1.5', marginLeft: 8, color: theme.palette.text.primary }}>\n {Array.isArray(value) ? value.join(', ') : String(value)}\n </Typography>\n </div>\n ))}\n </div>\n );\n};\n\n// Content viewer with raw/rendered toggle\nconst RuleContentViewer = ({ content }: { content: string }) => {\n const styles = useStyles();\n const [view, setView] = useState<'rendered' | 'raw'>('rendered');\n return (\n <div>\n <ToggleButtonGroup\n size=\"small\"\n value={view}\n exclusive\n onChange={(_e: any, v: any) => { if (v) setView(v); }}\n className={styles.viewToggle}\n >\n <ToggleButton value=\"rendered\">Rendered</ToggleButton>\n <ToggleButton value=\"raw\">Raw</ToggleButton>\n </ToggleButtonGroup>\n {view === 'rendered' ? (\n <div className={styles.ruleContent}>\n <MarkdownContent content={content} />\n </div>\n ) : (\n <CodeSnippet text={content} language=\"markdown\" />\n )}\n </div>\n );\n};\n\n// Copy-to-clipboard button\nconst CopyButton = ({ content }: { content: string }) => {\n const [open, setOpen] = useState(false);\n const handleCopy = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(content).then(() => setOpen(true));\n }, [content]);\n return (\n <>\n <Tooltip title=\"Copy content\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Snackbar\n open={open}\n autoHideDuration={2000}\n onClose={() => setOpen(false)}\n message=\"Copied to clipboard\"\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n />\n </>\n );\n};\n\n// Generic rule renderer for agents with simple markdown + title\nconst GenericRuleAccordion = ({\n rule,\n label,\n}: {\n rule: AIRule & { title?: string; mode?: string; alwaysApply?: boolean; applyTo?: string; frontmatter?: Record<string, any> };\n label?: string;\n}) => {\n const styles = useStyles();\n const theme = useTheme();\n return (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={rule.type} />\n <Typography variant=\"h6\">{rule.title || rule.fileName}</Typography>\n <Chip label={label ?? rule.type} size=\"small\" className={styles.ruleType} />\n {rule.mode && <Chip label={`Mode: ${rule.mode}`} size=\"small\" variant=\"outlined\" />}\n {rule.alwaysApply !== undefined && (\n <Chip label={rule.alwaysApply ? 'Always Apply' : 'On Demand'} size=\"small\" variant=\"outlined\" />\n )}\n {rule.applyTo && <Chip label={`Applies to: ${rule.applyTo}`} size=\"small\" variant=\"outlined\" />}\n </div>\n <div className={styles.ruleHeaderActions}>\n <CopyButton content={rule.content} />\n {rule.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); window.open(constructFileUrl(rule.gitUrl!, rule.filePath), '_blank'); }}>\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${rule.filePath}`} size=\"small\" variant=\"outlined\" />\n </div>\n {rule.frontmatter && renderFrontmatter(theme, rule.frontmatter)}\n <RuleContentViewer content={rule.content} />\n </div>\n </AccordionDetails>\n </Accordion>\n );\n};\n\nconst RuleComponent = ({ rule }: { rule: AIRule }) => {\n const styles = useStyles();\n const theme = useTheme();\n\n const renderCursorRule = (r: CursorRule) => {\n const { frontmatter, content } = parseCursorContent(r.content);\n return (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={r.type} />\n <Typography variant=\"h6\">{r.fileName}</Typography>\n <Chip label={r.type} size=\"small\" className={styles.ruleType} />\n {frontmatter?.description && (\n <Typography variant=\"body2\" style={{ marginLeft: 8, color: theme.palette.text.secondary }}>\n {frontmatter.description}\n </Typography>\n )}\n </div>\n <div className={styles.ruleHeaderActions}>\n <CopyButton content={content} />\n {r.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); window.open(constructFileUrl(r.gitUrl!, r.filePath), '_blank'); }}>\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${r.filePath}`} size=\"small\" variant=\"outlined\" />\n {frontmatter?.globs && (\n <Chip label={`Globs: ${Array.isArray(frontmatter.globs) ? frontmatter.globs.join(', ') : frontmatter.globs}`} size=\"small\" variant=\"outlined\" />\n )}\n </div>\n {renderFrontmatter(theme, frontmatter)}\n <RuleContentViewer content={content} />\n </div>\n </AccordionDetails>\n </Accordion>\n );\n };\n\n const renderCopilotRule = (r: CopilotRule) => (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={r.type} />\n <Typography variant=\"h6\">{r.title || r.fileName}</Typography>\n <Chip label={r.type} size=\"small\" className={styles.ruleType} />\n {r.applyTo && <Chip label={`Applies to: ${r.applyTo}`} size=\"small\" variant=\"outlined\" style={{ marginLeft: 8 }} />}\n </div>\n <div className={styles.ruleHeaderActions}>\n <CopyButton content={r.content} />\n {r.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); window.open(constructFileUrl(r.gitUrl!, r.filePath), '_blank'); }}>\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${r.filePath}`} size=\"small\" variant=\"outlined\" />\n {r.frontmatter && renderFrontmatter(theme, r.frontmatter)}\n </div>\n <RuleContentViewer content={r.content} />\n </div>\n </AccordionDetails>\n </Accordion>\n );\n\n const renderClineRule = (r: ClineRule) => (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={r.type} />\n <Typography variant=\"h6\">{r.title || r.fileName}</Typography>\n <Chip label={r.type} size=\"small\" className={styles.ruleType} />\n </div>\n <div className={styles.ruleHeaderActions}>\n <CopyButton content={r.content} />\n {r.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); window.open(constructFileUrl(r.gitUrl!, r.filePath), '_blank'); }}>\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${r.filePath}`} size=\"small\" variant=\"outlined\" />\n </div>\n <RuleContentViewer content={r.content} />\n </div>\n </AccordionDetails>\n </Accordion>\n );\n\n const renderClaudeCodeRule = (r: ClaudeCodeRule) => (\n <Accordion className={styles.ruleCard}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.ruleHeader}>\n <div className={styles.ruleHeaderContent}>\n <RuleTypeIcon type={r.type} />\n <Typography variant=\"h6\">{r.title || r.fileName}</Typography>\n <Chip label=\"claude-code\" size=\"small\" className={styles.ruleType} />\n </div>\n <div className={styles.ruleHeaderActions}>\n <CopyButton content={r.content} />\n {r.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); window.open(constructFileUrl(r.gitUrl!, r.filePath), '_blank'); }}>\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div>\n <div className={styles.ruleMetadata}>\n <Chip label={`Path: ${r.filePath}`} size=\"small\" variant=\"outlined\" />\n </div>\n <RuleContentViewer content={r.content} />\n </div>\n </AccordionDetails>\n </Accordion>\n );\n\n switch (rule.type) {\n case AIRuleType.CURSOR: return renderCursorRule(rule as CursorRule);\n case AIRuleType.CLAUDE_CODE: return renderClaudeCodeRule(rule as ClaudeCodeRule);\n case AIRuleType.COPILOT: return renderCopilotRule(rule as CopilotRule);\n case AIRuleType.CLINE: return renderClineRule(rule as ClineRule);\n default: return <GenericRuleAccordion rule={rule as any} />;\n }\n};\n\n// ─── Export helper ────────────────────────────────────────────────────────────\n\nconst exportRulesToMarkdown = (rules: AIRule[]) => {\n const lines: string[] = ['# AI Coding Rules Export\\n'];\n const grouped: Partial<Record<AIRuleType, AIRule[]>> = {};\n for (const rule of rules) {\n if (!grouped[rule.type]) grouped[rule.type] = [];\n grouped[rule.type]!.push(rule);\n }\n for (const type of RULE_TYPE_DISPLAY_ORDER) {\n const typeRules = grouped[type];\n if (!typeRules || typeRules.length === 0) continue;\n lines.push(`## ${RULE_TYPE_DISPLAY_NAMES[type]}\\n`);\n for (const rule of typeRules) {\n const title = (rule as any).title || rule.fileName;\n lines.push(`### ${title}\\n`);\n lines.push(`_File: \\`${rule.filePath}\\`_\\n`);\n lines.push(`${rule.content}\\n`);\n }\n }\n const blob = new Blob([lines.join('\\n')], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'ai-rules-export.md';\n a.click();\n URL.revokeObjectURL(url);\n};\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AIRulesComponent: React.FC<AIRulesComponentProps> = ({ title = 'AI Coding Rules' } = {}) => {\n const { rulesByType, rules, loading, error, hasGitUrl, totalRules, allowedRuleTypes, selectedRuleTypes, setSelectedRuleTypes, applyFilters, resetFilters, hasUnappliedChanges, hasSearched } = useAiRules();\n const styles = useStyles();\n\n const [searchQuery, setSearchQuery] = useState('');\n\n const formatRuleTypeName = (type: AIRuleType): string => RULE_TYPE_DISPLAY_NAMES[type] ?? type;\n\n const handleTypeToggle = (type: AIRuleType, checked: boolean) => {\n const newTypes = checked\n ? [...selectedRuleTypes, type]\n : selectedRuleTypes.filter(t => t !== type);\n setSelectedRuleTypes(newTypes);\n };\n\n // Filter rules by search query\n const filteredRulesByType = useMemo(() => {\n if (!searchQuery.trim()) return rulesByType;\n const q = searchQuery.toLowerCase();\n const filtered: Partial<Record<AIRuleType, AIRule[]>> = {};\n for (const type of RULE_TYPE_DISPLAY_ORDER) {\n const typeRules = (rulesByType[type] || []).filter(rule => {\n const r = rule as any;\n return (\n rule.content?.toLowerCase().includes(q) ||\n rule.fileName?.toLowerCase().includes(q) ||\n r.title?.toLowerCase().includes(q) ||\n r.description?.toLowerCase().includes(q)\n );\n });\n if (typeRules.length > 0) filtered[type] = typeRules;\n }\n return filtered;\n }, [rulesByType, searchQuery]);\n\n const filteredTotal = useMemo(\n () => Object.values(filteredRulesByType).reduce((sum, arr) => sum + (arr?.length ?? 0), 0),\n [filteredRulesByType],\n );\n\n if (loading) {\n return <InfoCard title={title}><Progress /></InfoCard>;\n }\n\n if (!hasGitUrl) {\n return (\n <InfoCard title={title}>\n <EmptyState missing=\"content\" title=\"No Git Repository\" description=\"This component doesn't have a Git source URL configured.\" />\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title={title}>\n <EmptyState missing=\"content\" title=\"Error Loading Rules\" description={error} />\n </InfoCard>\n );\n }\n\n return (\n <InfoCard title={title} className={styles.root}>\n {/* Filter section */}\n <div className={styles.filterSection}>\n <Typography variant=\"h6\" gutterBottom>Filter Rule Types</Typography>\n <div className={styles.filterContainer}>\n {allowedRuleTypes.map(type => (\n <FormControlLabel\n key={type}\n control={<Checkbox checked={selectedRuleTypes.includes(type)} onChange={(e) => handleTypeToggle(type, e.target.checked)} />}\n label={formatRuleTypeName(type)}\n />\n ))}\n </div>\n <div className={styles.applyFilterButton}>\n <Button variant=\"contained\" color=\"primary\" onClick={applyFilters} disabled={!hasUnappliedChanges}>\n Apply Filter\n </Button>\n {hasUnappliedChanges && (\n <Typography variant=\"body2\" color=\"textSecondary\" style={{ marginTop: 8 }}>\n You have unsaved filter changes. Click \"Apply Filter\" to update the results.\n </Typography>\n )}\n {!hasUnappliedChanges && selectedRuleTypes.length === 0 && (\n <Typography variant=\"body2\" color=\"textSecondary\" style={{ marginTop: 8 }}>\n Select at least one rule type to search for AI rules.\n </Typography>\n )}\n </div>\n </div>\n\n {hasSearched && totalRules === 0 ? (\n <EmptyState\n missing=\"content\"\n title=\"No AI Rules Found\"\n description=\"No AI rules were found in this repository for the selected rule types.\"\n action={<Button variant=\"outlined\" onClick={resetFilters}>Reset Filters</Button>}\n />\n ) : totalRules > 0 ? (\n <>\n {/* Search bar */}\n <TextField\n className={styles.searchBar}\n variant=\"outlined\"\n size=\"small\"\n label=\"Search rules\"\n placeholder=\"Search by name, title, or content…\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n\n {/* Stats + export */}\n <div className={styles.statsContainer}>\n <Card className={styles.statCard}>\n <CardContent>\n <Typography variant=\"h4\">{searchQuery ? filteredTotal : totalRules}</Typography>\n <Typography color=\"textSecondary\">{searchQuery ? 'Matching' : 'Total Rules'}</Typography>\n </CardContent>\n </Card>\n {RULE_TYPE_DISPLAY_ORDER.map(type => {\n const typeRules = (searchQuery ? filteredRulesByType : rulesByType)[type] || [];\n if (typeRules.length === 0) return null;\n return (\n <Card key={type} className={styles.statCard}>\n <CardContent>\n <Typography variant=\"h4\">{typeRules.length}</Typography>\n <Typography color=\"textSecondary\">{formatRuleTypeName(type)}</Typography>\n </CardContent>\n </Card>\n );\n })}\n <Tooltip title=\"Download all rules as Markdown\">\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<GetAppIcon />}\n className={styles.exportButton}\n onClick={() => exportRulesToMarkdown(rules)}\n >\n Export\n </Button>\n </Tooltip>\n </div>\n\n {/* Rules grouped by type */}\n {RULE_TYPE_DISPLAY_ORDER.map(type => {\n const typeRules = (searchQuery ? filteredRulesByType : rulesByType)[type] || [];\n if (typeRules.length === 0) return null;\n return (\n <div key={type}>\n <Typography variant=\"h5\" gutterBottom style={{ marginTop: 16 }}>\n {formatRuleTypeName(type)} Rules ({typeRules.length})\n </Typography>\n {typeRules.map(rule => (\n <RuleComponent key={rule.id} rule={rule} />\n ))}\n </div>\n );\n })}\n\n {searchQuery && filteredTotal === 0 && (\n <EmptyState missing=\"content\" title=\"No matching rules\" description={`No rules match \"${searchQuery}\". Clear the search to show all rules.`} />\n )}\n </>\n ) : (\n <div style={{ marginTop: 16 }}>\n <Typography variant=\"body1\" color=\"textSecondary\">\n Select rule types above and click \"Apply Filter\" to search for AI coding rules in this repository.\n </Typography>\n </div>\n )}\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { InfoCard, Progress, EmptyState, CodeSnippet } from '@backstage/core-components';
|
|
3
|
+
import { makeStyles, Typography, Accordion, AccordionSummary, Chip, Tooltip, IconButton, AccordionDetails } from '@material-ui/core';
|
|
4
|
+
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
5
|
+
import LaunchIcon from '@material-ui/icons/Launch';
|
|
6
|
+
import { useIgnoreFiles } from '../../hooks/useIgnoreFiles.esm.js';
|
|
7
|
+
|
|
8
|
+
const useStyles = makeStyles((theme) => ({
|
|
9
|
+
root: {
|
|
10
|
+
"& .MuiAccordion-root": {
|
|
11
|
+
marginBottom: theme.spacing(1),
|
|
12
|
+
"&:before": { display: "none" }
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
fileAccordion: {
|
|
16
|
+
backgroundColor: theme.palette.background.paper,
|
|
17
|
+
border: `1px solid ${theme.palette.divider}`
|
|
18
|
+
},
|
|
19
|
+
summaryRow: {
|
|
20
|
+
display: "flex",
|
|
21
|
+
alignItems: "center",
|
|
22
|
+
width: "100%",
|
|
23
|
+
gap: theme.spacing(1)
|
|
24
|
+
},
|
|
25
|
+
codeContainer: {
|
|
26
|
+
backgroundColor: theme.palette.background.default,
|
|
27
|
+
borderRadius: theme.shape.borderRadius,
|
|
28
|
+
"& pre": { margin: 0 }
|
|
29
|
+
}
|
|
30
|
+
}));
|
|
31
|
+
const constructFileUrl = (gitUrl, filePath) => {
|
|
32
|
+
const cleanGitUrl = gitUrl.replace(/\/+$/, "");
|
|
33
|
+
if (cleanGitUrl.includes("github.com")) return `${cleanGitUrl}/blob/main/${filePath}`;
|
|
34
|
+
if (cleanGitUrl.includes("gitlab.com")) return `${cleanGitUrl}/-/blob/main/${filePath}`;
|
|
35
|
+
return `${cleanGitUrl}/blob/main/${filePath}`;
|
|
36
|
+
};
|
|
37
|
+
const IgnoreFileAccordion = ({ file }) => {
|
|
38
|
+
const styles = useStyles();
|
|
39
|
+
return /* @__PURE__ */ jsxs(Accordion, { className: styles.fileAccordion, children: [
|
|
40
|
+
/* @__PURE__ */ jsx(AccordionSummary, { expandIcon: /* @__PURE__ */ jsx(ExpandMoreIcon, {}), children: /* @__PURE__ */ jsxs("div", { className: styles.summaryRow, children: [
|
|
41
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle1", children: file.agent }),
|
|
42
|
+
/* @__PURE__ */ jsx(Chip, { label: file.filePath, size: "small", variant: "outlined" }),
|
|
43
|
+
/* @__PURE__ */ jsx(Chip, { label: `${file.content.split("\n").filter((l) => l.trim() && !l.startsWith("#")).length} patterns`, size: "small", color: "primary" }),
|
|
44
|
+
file.gitUrl && /* @__PURE__ */ jsx(Tooltip, { title: "Open file in repository", children: /* @__PURE__ */ jsx(
|
|
45
|
+
IconButton,
|
|
46
|
+
{
|
|
47
|
+
size: "small",
|
|
48
|
+
style: { marginLeft: "auto" },
|
|
49
|
+
onClick: (e) => {
|
|
50
|
+
e.stopPropagation();
|
|
51
|
+
window.open(constructFileUrl(file.gitUrl, file.filePath), "_blank");
|
|
52
|
+
},
|
|
53
|
+
children: /* @__PURE__ */ jsx(LaunchIcon, { fontSize: "small" })
|
|
54
|
+
}
|
|
55
|
+
) })
|
|
56
|
+
] }) }),
|
|
57
|
+
/* @__PURE__ */ jsx(AccordionDetails, { children: /* @__PURE__ */ jsx("div", { style: { width: "100%" }, children: /* @__PURE__ */ jsx("div", { className: styles.codeContainer, children: /* @__PURE__ */ jsx(CodeSnippet, { text: file.content, language: "bash", showLineNumbers: true }) }) }) })
|
|
58
|
+
] });
|
|
59
|
+
};
|
|
60
|
+
const IgnoreFilesComponent = ({ title = "Agent Ignore Files" }) => {
|
|
61
|
+
const styles = useStyles();
|
|
62
|
+
const { files, loading, error, hasGitUrl } = useIgnoreFiles();
|
|
63
|
+
if (loading) return /* @__PURE__ */ jsx(InfoCard, { title, children: /* @__PURE__ */ jsx(Progress, {}) });
|
|
64
|
+
if (!hasGitUrl) {
|
|
65
|
+
return /* @__PURE__ */ jsx(InfoCard, { title, children: /* @__PURE__ */ jsx(EmptyState, { missing: "content", title: "No Git Repository", description: "This component doesn't have a Git source URL configured." }) });
|
|
66
|
+
}
|
|
67
|
+
if (error) {
|
|
68
|
+
return /* @__PURE__ */ jsx(InfoCard, { title, children: /* @__PURE__ */ jsx(EmptyState, { missing: "content", title: "Error Loading Ignore Files", description: error }) });
|
|
69
|
+
}
|
|
70
|
+
if (files.length === 0) {
|
|
71
|
+
return /* @__PURE__ */ jsx(InfoCard, { title, children: /* @__PURE__ */ jsx(EmptyState, { missing: "content", title: "No Ignore Files Found", description: "No agent ignore files (.cursorignore, .aiderignore, .rooignore, .geminiignore, .copilotignore) were found in this repository." }) });
|
|
72
|
+
}
|
|
73
|
+
return /* @__PURE__ */ jsxs(InfoCard, { title, className: styles.root, children: [
|
|
74
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", style: { marginBottom: 16 }, children: [
|
|
75
|
+
"Found ",
|
|
76
|
+
files.length,
|
|
77
|
+
" ignore file",
|
|
78
|
+
files.length !== 1 ? "s" : "",
|
|
79
|
+
" controlling which files agents skip."
|
|
80
|
+
] }),
|
|
81
|
+
files.map((file) => /* @__PURE__ */ jsx(IgnoreFileAccordion, { file }, file.filePath))
|
|
82
|
+
] });
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export { IgnoreFilesComponent };
|
|
86
|
+
//# sourceMappingURL=IgnoreFilesComponent.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IgnoreFilesComponent.esm.js","sources":["../../../src/components/IgnoreFilesComponent/IgnoreFilesComponent.tsx"],"sourcesContent":["import {\n InfoCard,\n Progress,\n EmptyState,\n CodeSnippet,\n} from '@backstage/core-components';\nimport {\n makeStyles,\n Typography,\n Chip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n IconButton,\n Tooltip,\n} from '@material-ui/core';\nimport { Theme } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport LaunchIcon from '@material-ui/icons/Launch';\nimport { useIgnoreFiles } from '../../hooks/useIgnoreFiles';\nimport { IgnoreFile } from '../../types';\n\nconst useStyles = makeStyles((theme: Theme) => ({\n root: {\n '& .MuiAccordion-root': {\n marginBottom: theme.spacing(1),\n '&:before': { display: 'none' },\n },\n },\n fileAccordion: {\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n },\n summaryRow: {\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n gap: theme.spacing(1),\n },\n codeContainer: {\n backgroundColor: theme.palette.background.default,\n borderRadius: theme.shape.borderRadius,\n '& pre': { margin: 0 },\n },\n}));\n\nconst constructFileUrl = (gitUrl: string, filePath: string): string => {\n const cleanGitUrl = gitUrl.replace(/\\/+$/, '');\n if (cleanGitUrl.includes('github.com')) return `${cleanGitUrl}/blob/main/${filePath}`;\n if (cleanGitUrl.includes('gitlab.com')) return `${cleanGitUrl}/-/blob/main/${filePath}`;\n return `${cleanGitUrl}/blob/main/${filePath}`;\n};\n\nconst IgnoreFileAccordion = ({ file }: { file: IgnoreFile }) => {\n const styles = useStyles();\n return (\n <Accordion className={styles.fileAccordion}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div className={styles.summaryRow}>\n <Typography variant=\"subtitle1\">{file.agent}</Typography>\n <Chip label={file.filePath} size=\"small\" variant=\"outlined\" />\n <Chip label={`${file.content.split('\\n').filter(l => l.trim() && !l.startsWith('#')).length} patterns`} size=\"small\" color=\"primary\" />\n {file.gitUrl && (\n <Tooltip title=\"Open file in repository\">\n <IconButton\n size=\"small\"\n style={{ marginLeft: 'auto' }}\n onClick={(e) => { e.stopPropagation(); window.open(constructFileUrl(file.gitUrl!, file.filePath), '_blank'); }}\n >\n <LaunchIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div style={{ width: '100%' }}>\n <div className={styles.codeContainer}>\n <CodeSnippet text={file.content} language=\"bash\" showLineNumbers />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport interface IgnoreFilesComponentProps {\n title?: string;\n}\n\nexport const IgnoreFilesComponent = ({ title = 'Agent Ignore Files' }: IgnoreFilesComponentProps) => {\n const styles = useStyles();\n const { files, loading, error, hasGitUrl } = useIgnoreFiles();\n\n if (loading) return <InfoCard title={title}><Progress /></InfoCard>;\n\n if (!hasGitUrl) {\n return (\n <InfoCard title={title}>\n <EmptyState missing=\"content\" title=\"No Git Repository\" description=\"This component doesn't have a Git source URL configured.\" />\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title={title}>\n <EmptyState missing=\"content\" title=\"Error Loading Ignore Files\" description={error} />\n </InfoCard>\n );\n }\n\n if (files.length === 0) {\n return (\n <InfoCard title={title}>\n <EmptyState missing=\"content\" title=\"No Ignore Files Found\" description=\"No agent ignore files (.cursorignore, .aiderignore, .rooignore, .geminiignore, .copilotignore) were found in this repository.\" />\n </InfoCard>\n );\n }\n\n return (\n <InfoCard title={title} className={styles.root}>\n <Typography variant=\"body2\" color=\"textSecondary\" style={{ marginBottom: 16 }}>\n Found {files.length} ignore file{files.length !== 1 ? 's' : ''} controlling which files agents skip.\n </Typography>\n {files.map(file => (\n <IgnoreFileAccordion key={file.filePath} file={file} />\n ))}\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MCPServersComponent.esm.js","sources":["../../../src/components/MCPServersComponent/MCPServersComponent.tsx"],"sourcesContent":["import React from 'react';\nimport {\n InfoCard,\n Progress,\n EmptyState,\n CodeSnippet,\n} from '@backstage/core-components';\nimport {\n makeStyles,\n Typography,\n Chip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n} from '@material-ui/core';\nimport { Theme } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { MCPServerInfo } from '../../types/mcp';\nimport { useMCPServers } from '../../hooks/useMCPServers';\n\nconst useStyles = makeStyles((theme: Theme) => ({\n root: {\n '& .MuiAccordion-root': {\n marginBottom: theme.spacing(1),\n '&:before': {\n display: 'none',\n },\n },\n },\n sourceAccordion: {\n backgroundColor: theme.palette.background.default,\n marginBottom: theme.spacing(2),\n width: '100%',\n '& .MuiAccordionSummary-root': {\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n '& .MuiAccordionDetails-root': {\n padding: theme.spacing(2),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n },\n },\n serversList: {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n width: '100%',\n },\n serverAccordion: {\n backgroundColor: theme.palette.background.paper,\n width: '100%',\n '& .MuiAccordionSummary-root': {\n minHeight: '48px',\n '&.Mui-expanded': {\n minHeight: '48px',\n },\n },\n '& .MuiAccordionSummary-content': {\n margin: '12px 0',\n '&.Mui-expanded': {\n margin: '12px 0',\n },\n },\n '& .MuiAccordionDetails-root': {\n padding: theme.spacing(3),\n },\n },\n envContainer: {\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n },\n envGrid: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gap: theme.spacing(1),\n alignItems: 'center',\n },\n envKey: {\n fontWeight: 'bold',\n color: theme.palette.text.secondary,\n padding: theme.spacing(0.5, 1),\n backgroundColor: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n fontSize: '0.875rem',\n },\n envValue: {\n wordBreak: 'break-word',\n padding: theme.spacing(0.5, 1),\n backgroundColor: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n fontSize: '0.875rem',\n },\n rawConfig: {\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n '& pre': {\n margin: 0,\n },\n },\n sectionTitle: {\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n fontWeight: 500,\n },\n serverContent: {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(3),\n width: '100%',\n },\n commandContainer: {\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n fontFamily: 'monospace',\n fontSize: '0.9rem',\n overflowX: 'auto',\n whiteSpace: 'pre',\n },\n detailsContainer: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: theme.spacing(3),\n },\n}));\n\n\nexport interface MCPServersComponentProps {\n title?: string;\n}\n\nexport const MCPServersComponent = ({ title = \"MCP Servers\" }: MCPServersComponentProps) => {\n const styles = useStyles();\n const { servers, loading, error, hasGitUrl } = useMCPServers();\n\n if (loading) {\n return (\n <InfoCard title={title}>\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasGitUrl) {\n return (\n <InfoCard title={title}>\n <EmptyState\n missing=\"content\"\n title=\"No Git Repository\"\n description=\"This component doesn't have a Git source URL configured.\"\n />\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title={title}>\n <EmptyState\n missing=\"content\"\n title=\"Error Loading MCP Servers\"\n description={error}\n />\n </InfoCard>\n );\n }\n\n if (servers.length === 0) {\n return (\n <InfoCard title={title}>\n <EmptyState\n missing=\"content\"\n title=\"No MCP Servers Found\"\n description=\"No MCP server configurations were found in this repository.\"\n />\n </InfoCard>\n );\n }\n\n // Group servers by source\n const serversBySource = servers.reduce((acc, server) => {\n const source = server.source;\n if (!acc[source]) {\n acc[source] = [];\n }\n acc[source].push(server);\n return acc;\n }, {} as Record<string, MCPServerInfo[]>);\n\n const formatSourceName = (source: string) => {\n switch (source) {\n case 'vscode':\n return 'VSCode';\n case 'cursor':\n return 'Cursor';\n case 'claude':\n return 'Claude';\n default:\n return source;\n }\n };\n\n return (\n <InfoCard title={title} className={styles.root}>\n {Object.entries(serversBySource).map(([source, sourceServers]) => (\n <Accordion key={source} defaultExpanded={false} className={styles.sourceAccordion}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div style={{ display: 'flex', alignItems: 'center', width: '100%', gap: '16px' }}>\n <Typography variant=\"h6\">\n {formatSourceName(source)} MCP Servers\n </Typography>\n <Chip\n label={`${sourceServers.length} server${sourceServers.length !== 1 ? 's' : ''}`}\n size=\"small\"\n color=\"primary\"\n />\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div className={styles.serversList}>\n {sourceServers.map((server) => (\n <Accordion key={server.name} className={styles.serverAccordion}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div style={{ display: 'flex', alignItems: 'center', width: '100%', gap: '16px' }}>\n <Typography variant=\"subtitle1\">{server.name}</Typography>\n <Chip \n label={server.type} \n size=\"small\" \n color={server.type === 'local' ? 'default' : 'secondary'}\n variant=\"outlined\"\n />\n {server.config.command && (\n <Chip \n label={`${server.config.command}`}\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div className={styles.serverContent}>\n {server.config.command && (\n <div>\n <Typography variant=\"subtitle2\" className={styles.sectionTitle}>Command</Typography>\n <div className={styles.commandContainer}>\n {server.config.command} {server.config.args?.join(' ')}\n </div>\n </div>\n )}\n <div className={styles.detailsContainer}>\n <div>\n {server.config.env && Object.keys(server.config.env).length > 0 && (\n <>\n <Typography variant=\"subtitle2\" className={styles.sectionTitle}>Environment Variables</Typography>\n <div className={styles.envContainer}>\n <div className={styles.envGrid}>\n {Object.entries(server.config.env).map(([key, value]) => (\n <React.Fragment key={key}>\n <Typography className={styles.envKey}>{key}</Typography>\n <Typography className={styles.envValue}>{value}</Typography>\n </React.Fragment>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n <div>\n <Typography variant=\"subtitle2\" className={styles.sectionTitle}>Raw Configuration</Typography>\n <div className={styles.rawConfig}>\n <CodeSnippet text={server.rawConfig} language=\"json\" />\n </div>\n </div>\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n ))}\n </div>\n </AccordionDetails>\n </Accordion>\n ))}\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MCPServersComponent.esm.js","sources":["../../../src/components/MCPServersComponent/MCPServersComponent.tsx"],"sourcesContent":["import React from 'react';\nimport {\n InfoCard,\n Progress,\n EmptyState,\n CodeSnippet,\n} from '@backstage/core-components';\nimport {\n makeStyles,\n Typography,\n Chip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n} from '@material-ui/core';\nimport { Theme } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { MCPServerInfo } from '../../types/mcp';\nimport { useMCPServers } from '../../hooks/useMCPServers';\n\nconst useStyles = makeStyles((theme: Theme) => ({\n root: {\n '& .MuiAccordion-root': {\n marginBottom: theme.spacing(1),\n '&:before': {\n display: 'none',\n },\n },\n },\n sourceAccordion: {\n backgroundColor: theme.palette.background.default,\n marginBottom: theme.spacing(2),\n width: '100%',\n '& .MuiAccordionSummary-root': {\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n '& .MuiAccordionDetails-root': {\n padding: theme.spacing(2),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n },\n },\n serversList: {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n width: '100%',\n },\n serverAccordion: {\n backgroundColor: theme.palette.background.paper,\n width: '100%',\n '& .MuiAccordionSummary-root': {\n minHeight: '48px',\n '&.Mui-expanded': {\n minHeight: '48px',\n },\n },\n '& .MuiAccordionSummary-content': {\n margin: '12px 0',\n '&.Mui-expanded': {\n margin: '12px 0',\n },\n },\n '& .MuiAccordionDetails-root': {\n padding: theme.spacing(3),\n },\n },\n envContainer: {\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n },\n envGrid: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gap: theme.spacing(1),\n alignItems: 'center',\n },\n envKey: {\n fontWeight: 'bold',\n color: theme.palette.text.secondary,\n padding: theme.spacing(0.5, 1),\n backgroundColor: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n fontSize: '0.875rem',\n },\n envValue: {\n wordBreak: 'break-word',\n padding: theme.spacing(0.5, 1),\n backgroundColor: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n fontSize: '0.875rem',\n },\n rawConfig: {\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n '& pre': {\n margin: 0,\n },\n },\n sectionTitle: {\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n fontWeight: 500,\n },\n serverContent: {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(3),\n width: '100%',\n },\n commandContainer: {\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n fontFamily: 'monospace',\n fontSize: '0.9rem',\n overflowX: 'auto',\n whiteSpace: 'pre',\n },\n detailsContainer: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: theme.spacing(3),\n },\n}));\n\n\nexport interface MCPServersComponentProps {\n title?: string;\n}\n\nexport const MCPServersComponent = ({ title = \"MCP Servers\" }: MCPServersComponentProps) => {\n const styles = useStyles();\n const { servers, loading, error, hasGitUrl } = useMCPServers();\n\n if (loading) {\n return (\n <InfoCard title={title}>\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasGitUrl) {\n return (\n <InfoCard title={title}>\n <EmptyState\n missing=\"content\"\n title=\"No Git Repository\"\n description=\"This component doesn't have a Git source URL configured.\"\n />\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title={title}>\n <EmptyState\n missing=\"content\"\n title=\"Error Loading MCP Servers\"\n description={error}\n />\n </InfoCard>\n );\n }\n\n if (servers.length === 0) {\n return (\n <InfoCard title={title}>\n <EmptyState\n missing=\"content\"\n title=\"No MCP Servers Found\"\n description=\"No MCP server configurations were found in this repository.\"\n />\n </InfoCard>\n );\n }\n\n // Group servers by source\n const serversBySource = servers.reduce((acc, server) => {\n const source = server.source;\n if (!acc[source]) {\n acc[source] = [];\n }\n acc[source].push(server);\n return acc;\n }, {} as Record<string, MCPServerInfo[]>);\n\n const formatSourceName = (source: string) => {\n switch (source) {\n case 'vscode': return 'VSCode';\n case 'cursor': return 'Cursor';\n case 'claude': return 'Claude';\n case 'windsurf': return 'Windsurf';\n case 'cline': return 'Cline';\n default: return source;\n }\n };\n\n return (\n <InfoCard title={title} className={styles.root}>\n {Object.entries(serversBySource).map(([source, sourceServers]) => (\n <Accordion key={source} defaultExpanded={false} className={styles.sourceAccordion}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div style={{ display: 'flex', alignItems: 'center', width: '100%', gap: '16px' }}>\n <Typography variant=\"h6\">\n {formatSourceName(source)} MCP Servers\n </Typography>\n <Chip\n label={`${sourceServers.length} server${sourceServers.length !== 1 ? 's' : ''}`}\n size=\"small\"\n color=\"primary\"\n />\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div className={styles.serversList}>\n {sourceServers.map((server) => (\n <Accordion key={server.name} className={styles.serverAccordion}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <div style={{ display: 'flex', alignItems: 'center', width: '100%', gap: '16px' }}>\n <Typography variant=\"subtitle1\">{server.name}</Typography>\n <Chip \n label={server.type} \n size=\"small\" \n color={server.type === 'local' ? 'default' : 'secondary'}\n variant=\"outlined\"\n />\n {server.config.command && (\n <Chip \n label={`${server.config.command}`}\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n </div>\n </AccordionSummary>\n <AccordionDetails>\n <div className={styles.serverContent}>\n {server.config.command && (\n <div>\n <Typography variant=\"subtitle2\" className={styles.sectionTitle}>Command</Typography>\n <div className={styles.commandContainer}>\n {server.config.command} {server.config.args?.join(' ')}\n </div>\n </div>\n )}\n <div className={styles.detailsContainer}>\n <div>\n {server.config.env && Object.keys(server.config.env).length > 0 && (\n <>\n <Typography variant=\"subtitle2\" className={styles.sectionTitle}>Environment Variables</Typography>\n <div className={styles.envContainer}>\n <div className={styles.envGrid}>\n {Object.entries(server.config.env).map(([key, value]) => (\n <React.Fragment key={key}>\n <Typography className={styles.envKey}>{key}</Typography>\n <Typography className={styles.envValue}>{value}</Typography>\n </React.Fragment>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n <div>\n <Typography variant=\"subtitle2\" className={styles.sectionTitle}>Raw Configuration</Typography>\n <div className={styles.rawConfig}>\n <CodeSnippet text={server.rawConfig} language=\"json\" />\n </div>\n </div>\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n ))}\n </div>\n </AccordionDetails>\n </Accordion>\n ))}\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
2
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
3
|
+
import { aiRulesApiRef } from '../api/types.esm.js';
|
|
4
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
5
|
+
|
|
6
|
+
const useAgentConfigs = () => {
|
|
7
|
+
const api = useApi(aiRulesApiRef);
|
|
8
|
+
const { entity } = useEntity();
|
|
9
|
+
const [loading, setLoading] = useState(false);
|
|
10
|
+
const [error, setError] = useState();
|
|
11
|
+
const [configs, setConfigs] = useState([]);
|
|
12
|
+
const [hasGitUrl, setHasGitUrl] = useState(true);
|
|
13
|
+
const sourceLocation = entity.metadata?.annotations?.["backstage.io/source-location"];
|
|
14
|
+
const fetchConfigs = useCallback(async () => {
|
|
15
|
+
if (!sourceLocation) {
|
|
16
|
+
setHasGitUrl(false);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
setLoading(true);
|
|
21
|
+
setError(void 0);
|
|
22
|
+
const gitUrl = sourceLocation.replace("url:", "").replace(/\/tree\/(?:main|master)\/.*$/, "");
|
|
23
|
+
const response = await api.getAgentConfigs(gitUrl);
|
|
24
|
+
setConfigs(response.configs);
|
|
25
|
+
} catch (err) {
|
|
26
|
+
setError(err.message);
|
|
27
|
+
} finally {
|
|
28
|
+
setLoading(false);
|
|
29
|
+
}
|
|
30
|
+
}, [api, sourceLocation]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
fetchConfigs();
|
|
33
|
+
}, [fetchConfigs]);
|
|
34
|
+
return { loading, error, configs, hasGitUrl, refetch: fetchConfigs };
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { useAgentConfigs };
|
|
38
|
+
//# sourceMappingURL=useAgentConfigs.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgentConfigs.esm.js","sources":["../../src/hooks/useAgentConfigs.ts"],"sourcesContent":["import { useApi } from '@backstage/core-plugin-api';\nimport { useCallback, useEffect, useState } from 'react';\nimport { aiRulesApiRef } from '../api/types';\nimport type { AiRulesApi } from '../api/types';\nimport { AgentConfig } from '../types';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nexport const useAgentConfigs = () => {\n const api = useApi(aiRulesApiRef) as AiRulesApi;\n const { entity } = useEntity();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const [configs, setConfigs] = useState<AgentConfig[]>([]);\n const [hasGitUrl, setHasGitUrl] = useState(true);\n\n const sourceLocation = entity.metadata?.annotations?.['backstage.io/source-location'];\n\n const fetchConfigs = useCallback(async () => {\n if (!sourceLocation) {\n setHasGitUrl(false);\n return;\n }\n try {\n setLoading(true);\n setError(undefined);\n const gitUrl = sourceLocation\n .replace('url:', '')\n .replace(/\\/tree\\/(?:main|master)\\/.*$/, '');\n const response = await api.getAgentConfigs(gitUrl);\n setConfigs(response.configs);\n } catch (err) {\n setError((err as Error).message);\n } finally {\n setLoading(false);\n }\n }, [api, sourceLocation]);\n\n useEffect(() => { fetchConfigs(); }, [fetchConfigs]);\n\n return { loading, error, configs, hasGitUrl, refetch: fetchConfigs };\n};\n"],"names":[],"mappings":";;;;;AAOO,MAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,GAAA,GAAM,OAAO,aAAa,CAAA;AAChC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAA6B;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAwB,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,IAAI,CAAA;AAE/C,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,QAAA,EAAU,WAAA,GAAc,8BAA8B,CAAA;AAEpF,EAAA,MAAM,YAAA,GAAe,YAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,KAAA,CAAS,CAAA;AAClB,MAAA,MAAM,MAAA,GAAS,eACZ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAClB,OAAA,CAAQ,gCAAgC,EAAE,CAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,MAAM,CAAA;AACjD,MAAA,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAU,IAAc,OAAO,CAAA;AAAA,IACjC,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,cAAc,CAAC,CAAA;AAExB,EAAA,SAAA,CAAU,MAAM;AAAE,IAAA,YAAA,EAAa;AAAA,EAAG,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEnD,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,SAAS,YAAA,EAAa;AACrE;;;;"}
|
|
@@ -16,7 +16,19 @@ const useAiRules = () => {
|
|
|
16
16
|
const [initialized, setInitialized] = useState(false);
|
|
17
17
|
const [hasSearched, setHasSearched] = useState(false);
|
|
18
18
|
const allowedRuleTypes = useMemo(() => {
|
|
19
|
-
return configApi.getOptionalStringArray("aiRules.allowedRuleTypes") || [
|
|
19
|
+
return configApi.getOptionalStringArray("aiRules.allowedRuleTypes") || [
|
|
20
|
+
AIRuleType.CURSOR,
|
|
21
|
+
AIRuleType.COPILOT,
|
|
22
|
+
AIRuleType.CLINE,
|
|
23
|
+
AIRuleType.CLAUDE_CODE,
|
|
24
|
+
AIRuleType.WINDSURF,
|
|
25
|
+
AIRuleType.ROO_CODE,
|
|
26
|
+
AIRuleType.CODEX,
|
|
27
|
+
AIRuleType.GEMINI,
|
|
28
|
+
AIRuleType.AMAZON_Q,
|
|
29
|
+
AIRuleType.CONTINUE,
|
|
30
|
+
AIRuleType.AIDER
|
|
31
|
+
];
|
|
20
32
|
}, [configApi]);
|
|
21
33
|
const defaultRuleTypes = useMemo(() => {
|
|
22
34
|
const aiRulesConfig = configApi.getOptionalConfig("aiRules");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAiRules.esm.js","sources":["../../src/hooks/useAiRules.ts"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { AIRuleType, AIRulesResponse, AIRule } from '../types';\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useApi, configApiRef, discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api';\n\nexport const useAiRules = () => {\n const { entity } = useEntity();\n const configApi = useApi(configApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n const fetchApi = useApi(fetchApiRef);\n \n const [rules, setRules] = useState<AIRule[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedRuleTypes, setSelectedRuleTypes] = useState<AIRuleType[]>([]);\n const [appliedRuleTypes, setAppliedRuleTypes] = useState<AIRuleType[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [hasSearched, setHasSearched] = useState(false);\n\n // Stabilize allowed rule types\n const allowedRuleTypes = useMemo(() => {\n return configApi.getOptionalStringArray('aiRules.allowedRuleTypes') as AIRuleType[] || [AIRuleType.CURSOR, AIRuleType.COPILOT, AIRuleType.CLINE, AIRuleType.CLAUDE_CODE];\n }, [configApi]);\n\n // Stabilize default rule types\n const defaultRuleTypes = useMemo(() => {\n // Check if the config has the aiRules section at all\n const aiRulesConfig = configApi.getOptionalConfig('aiRules');\n if (!aiRulesConfig) {\n // Config not loaded yet or aiRules section doesn't exist, use empty array\n return [];\n }\n \n const configuredDefaults = configApi.getOptionalStringArray('aiRules.defaultRuleTypes') as AIRuleType[];\n \n // If defaultRuleTypes is explicitly configured (even as empty array), use that\n // If not configured at all, use empty array\n return configuredDefaults !== undefined ? configuredDefaults : [];\n }, [configApi]);\n\n // Extract stable entity properties\n const entityData = useMemo(() => {\n const sourceAnnotation = entity.metadata?.annotations?.['backstage.io/source-location'] || '';\n const hasGitUrl = sourceAnnotation.startsWith('url:');\n \n let gitUrl = hasGitUrl ? sourceAnnotation.substring(4) : undefined;\n if (gitUrl) {\n // Remove trailing slashes and normalize URL\n gitUrl = gitUrl.replace(/\\/+$/, '');\n // Handle GitHub tree/blob URLs - extract base repo URL\n const treeMatch = gitUrl.match(/^(.+)\\/tree\\/([^/]+)(?:\\/(.+))?$/);\n const blobMatch = gitUrl.match(/^(.+)\\/blob\\/([^/]+)(?:\\/(.+))?$/);\n if (treeMatch) {\n gitUrl = treeMatch[1]; // Just the base repo URL\n }\n if (blobMatch) {\n gitUrl = blobMatch[1]; // Just the base repo URL \n }\n }\n\n return {\n kind: entity.kind,\n namespace: entity.metadata.namespace || 'default',\n name: entity.metadata.name,\n sourceAnnotation,\n hasGitUrl,\n gitUrl,\n };\n }, [entity.kind, entity.metadata.namespace, entity.metadata.name, entity.metadata?.annotations?.['backstage.io/source-location']]);\n\n // Initialize selected and applied rule types when defaultRuleTypes is available\n useEffect(() => {\n // Check if config is loaded\n const aiRulesConfig = configApi.getOptionalConfig('aiRules');\n const configLoaded = aiRulesConfig !== undefined;\n \n if (!initialized && allowedRuleTypes.length > 0 && configLoaded) {\n setSelectedRuleTypes(defaultRuleTypes);\n setAppliedRuleTypes(defaultRuleTypes);\n setInitialized(true);\n }\n }, [defaultRuleTypes, allowedRuleTypes, initialized, configApi]);\n\n // Stable fetch function\n const fetchAiRules = useCallback(async (ruleTypes: AIRuleType[]) => {\n if (!entityData.hasGitUrl || !entityData.gitUrl) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n setHasSearched(true);\n \n const baseUrl = await discoveryApi.getBaseUrl('ai-rules');\n const url = new URL(`${baseUrl}/rules`);\n \n // Send the Git URL directly to the backend\n url.searchParams.append('gitUrl', entityData.gitUrl);\n if (ruleTypes.length > 0) {\n url.searchParams.append('ruleTypes', ruleTypes.join(','));\n }\n\n const response = await fetchApi.fetch(url.toString());\n if (!response.ok) {\n throw new Error(`Failed to fetch AI rules: ${response.statusText}`);\n }\n\n const data: AIRulesResponse = await response.json();\n setRules(data.rules);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred';\n console.error('Error fetching AI rules:', errorMessage);\n setError(errorMessage);\n setRules([]);\n } finally {\n setLoading(false);\n }\n }, [entityData.hasGitUrl, entityData.gitUrl, discoveryApi, fetchApi]);\n\n // Manual apply filter function\n const applyFilters = useCallback(() => {\n setAppliedRuleTypes([...selectedRuleTypes]);\n if (selectedRuleTypes.length > 0) {\n fetchAiRules(selectedRuleTypes);\n } else {\n // If no rule types selected, clear rules\n setRules([]);\n setError(null);\n setHasSearched(true);\n }\n }, [selectedRuleTypes, fetchAiRules]);\n\n // Reset filters to allowed rule types and apply immediately\n const resetFilters = useCallback(() => {\n setSelectedRuleTypes(allowedRuleTypes);\n setAppliedRuleTypes([...allowedRuleTypes]);\n if (allowedRuleTypes.length > 0) {\n fetchAiRules(allowedRuleTypes);\n }\n }, [allowedRuleTypes, fetchAiRules]);\n\n // Fetch rules when applied rule types change (triggered by applyFilters)\n useEffect(() => {\n if (appliedRuleTypes.length > 0) {\n fetchAiRules(appliedRuleTypes);\n }\n }, [fetchAiRules, appliedRuleTypes]);\n\n const rulesByType = useMemo(() => {\n return rules.reduce((acc, rule) => {\n if (!acc[rule.type]) {\n acc[rule.type] = [];\n }\n acc[rule.type].push(rule);\n return acc;\n }, {} as Record<AIRuleType, AIRule[]>);\n }, [rules]);\n\n return {\n rules,\n rulesByType,\n loading,\n error,\n hasGitUrl: entityData.hasGitUrl,\n componentName: entityData.name,\n allowedRuleTypes,\n defaultRuleTypes,\n selectedRuleTypes,\n setSelectedRuleTypes,\n appliedRuleTypes,\n applyFilters,\n resetFilters,\n totalRules: rules.length,\n hasSearched,\n hasUnappliedChanges: JSON.stringify(selectedRuleTypes.sort()) !== JSON.stringify(appliedRuleTypes.sort()),\n };\n};"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAiRules.esm.js","sources":["../../src/hooks/useAiRules.ts"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { AIRuleType, AIRulesResponse, AIRule } from '../types';\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useApi, configApiRef, discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api';\n\nexport const useAiRules = () => {\n const { entity } = useEntity();\n const configApi = useApi(configApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n const fetchApi = useApi(fetchApiRef);\n \n const [rules, setRules] = useState<AIRule[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedRuleTypes, setSelectedRuleTypes] = useState<AIRuleType[]>([]);\n const [appliedRuleTypes, setAppliedRuleTypes] = useState<AIRuleType[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [hasSearched, setHasSearched] = useState(false);\n\n // Stabilize allowed rule types\n const allowedRuleTypes = useMemo(() => {\n return configApi.getOptionalStringArray('aiRules.allowedRuleTypes') as AIRuleType[] || [\n AIRuleType.CURSOR, AIRuleType.COPILOT, AIRuleType.CLINE, AIRuleType.CLAUDE_CODE,\n AIRuleType.WINDSURF, AIRuleType.ROO_CODE, AIRuleType.CODEX, AIRuleType.GEMINI,\n AIRuleType.AMAZON_Q, AIRuleType.CONTINUE, AIRuleType.AIDER,\n ];\n }, [configApi]);\n\n // Stabilize default rule types\n const defaultRuleTypes = useMemo(() => {\n // Check if the config has the aiRules section at all\n const aiRulesConfig = configApi.getOptionalConfig('aiRules');\n if (!aiRulesConfig) {\n // Config not loaded yet or aiRules section doesn't exist, use empty array\n return [];\n }\n \n const configuredDefaults = configApi.getOptionalStringArray('aiRules.defaultRuleTypes') as AIRuleType[];\n \n // If defaultRuleTypes is explicitly configured (even as empty array), use that\n // If not configured at all, use empty array\n return configuredDefaults !== undefined ? configuredDefaults : [];\n }, [configApi]);\n\n // Extract stable entity properties\n const entityData = useMemo(() => {\n const sourceAnnotation = entity.metadata?.annotations?.['backstage.io/source-location'] || '';\n const hasGitUrl = sourceAnnotation.startsWith('url:');\n \n let gitUrl = hasGitUrl ? sourceAnnotation.substring(4) : undefined;\n if (gitUrl) {\n // Remove trailing slashes and normalize URL\n gitUrl = gitUrl.replace(/\\/+$/, '');\n // Handle GitHub tree/blob URLs - extract base repo URL\n const treeMatch = gitUrl.match(/^(.+)\\/tree\\/([^/]+)(?:\\/(.+))?$/);\n const blobMatch = gitUrl.match(/^(.+)\\/blob\\/([^/]+)(?:\\/(.+))?$/);\n if (treeMatch) {\n gitUrl = treeMatch[1]; // Just the base repo URL\n }\n if (blobMatch) {\n gitUrl = blobMatch[1]; // Just the base repo URL \n }\n }\n\n return {\n kind: entity.kind,\n namespace: entity.metadata.namespace || 'default',\n name: entity.metadata.name,\n sourceAnnotation,\n hasGitUrl,\n gitUrl,\n };\n }, [entity.kind, entity.metadata.namespace, entity.metadata.name, entity.metadata?.annotations?.['backstage.io/source-location']]);\n\n // Initialize selected and applied rule types when defaultRuleTypes is available\n useEffect(() => {\n // Check if config is loaded\n const aiRulesConfig = configApi.getOptionalConfig('aiRules');\n const configLoaded = aiRulesConfig !== undefined;\n \n if (!initialized && allowedRuleTypes.length > 0 && configLoaded) {\n setSelectedRuleTypes(defaultRuleTypes);\n setAppliedRuleTypes(defaultRuleTypes);\n setInitialized(true);\n }\n }, [defaultRuleTypes, allowedRuleTypes, initialized, configApi]);\n\n // Stable fetch function\n const fetchAiRules = useCallback(async (ruleTypes: AIRuleType[]) => {\n if (!entityData.hasGitUrl || !entityData.gitUrl) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n setHasSearched(true);\n \n const baseUrl = await discoveryApi.getBaseUrl('ai-rules');\n const url = new URL(`${baseUrl}/rules`);\n \n // Send the Git URL directly to the backend\n url.searchParams.append('gitUrl', entityData.gitUrl);\n if (ruleTypes.length > 0) {\n url.searchParams.append('ruleTypes', ruleTypes.join(','));\n }\n\n const response = await fetchApi.fetch(url.toString());\n if (!response.ok) {\n throw new Error(`Failed to fetch AI rules: ${response.statusText}`);\n }\n\n const data: AIRulesResponse = await response.json();\n setRules(data.rules);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred';\n console.error('Error fetching AI rules:', errorMessage);\n setError(errorMessage);\n setRules([]);\n } finally {\n setLoading(false);\n }\n }, [entityData.hasGitUrl, entityData.gitUrl, discoveryApi, fetchApi]);\n\n // Manual apply filter function\n const applyFilters = useCallback(() => {\n setAppliedRuleTypes([...selectedRuleTypes]);\n if (selectedRuleTypes.length > 0) {\n fetchAiRules(selectedRuleTypes);\n } else {\n // If no rule types selected, clear rules\n setRules([]);\n setError(null);\n setHasSearched(true);\n }\n }, [selectedRuleTypes, fetchAiRules]);\n\n // Reset filters to allowed rule types and apply immediately\n const resetFilters = useCallback(() => {\n setSelectedRuleTypes(allowedRuleTypes);\n setAppliedRuleTypes([...allowedRuleTypes]);\n if (allowedRuleTypes.length > 0) {\n fetchAiRules(allowedRuleTypes);\n }\n }, [allowedRuleTypes, fetchAiRules]);\n\n // Fetch rules when applied rule types change (triggered by applyFilters)\n useEffect(() => {\n if (appliedRuleTypes.length > 0) {\n fetchAiRules(appliedRuleTypes);\n }\n }, [fetchAiRules, appliedRuleTypes]);\n\n const rulesByType = useMemo(() => {\n return rules.reduce((acc, rule) => {\n if (!acc[rule.type]) {\n acc[rule.type] = [];\n }\n acc[rule.type].push(rule);\n return acc;\n }, {} as Record<AIRuleType, AIRule[]>);\n }, [rules]);\n\n return {\n rules,\n rulesByType,\n loading,\n error,\n hasGitUrl: entityData.hasGitUrl,\n componentName: entityData.name,\n allowedRuleTypes,\n defaultRuleTypes,\n selectedRuleTypes,\n setSelectedRuleTypes,\n appliedRuleTypes,\n applyFilters,\n resetFilters,\n totalRules: rules.length,\n hasSearched,\n hasUnappliedChanges: JSON.stringify(selectedRuleTypes.sort()) !== JSON.stringify(appliedRuleTypes.sort()),\n };\n};"],"names":[],"mappings":"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"}
|