@nospt/plugin-dev-ai-hub 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dev/index.tsx +17 -217
  2. package/dist/api/DevAiHubClient.esm.js +2 -0
  3. package/dist/api/DevAiHubClient.esm.js.map +1 -1
  4. package/dist/components/AssetCard/AssetCard.esm.js +60 -134
  5. package/dist/components/AssetCard/AssetCard.esm.js.map +1 -1
  6. package/dist/components/AssetCard/AssetCard.module.css.esm.js +8 -0
  7. package/dist/components/AssetCard/AssetCard.module.css.esm.js.map +1 -0
  8. package/dist/components/AssetDetailPanel/AssetDetailPanel.esm.js +175 -281
  9. package/dist/components/AssetDetailPanel/AssetDetailPanel.esm.js.map +1 -1
  10. package/dist/components/AssetDetailPanel/AssetDetailPanel.module.css.esm.js +8 -0
  11. package/dist/components/AssetDetailPanel/AssetDetailPanel.module.css.esm.js.map +1 -0
  12. package/dist/components/AssetFilters/AssetFilters.esm.js +94 -134
  13. package/dist/components/AssetFilters/AssetFilters.esm.js.map +1 -1
  14. package/dist/components/AssetFilters/AssetFilters.module.css.esm.js +8 -0
  15. package/dist/components/AssetFilters/AssetFilters.module.css.esm.js.map +1 -0
  16. package/dist/components/AssetInstallDialog/AssetInstallDialog.esm.js +70 -126
  17. package/dist/components/AssetInstallDialog/AssetInstallDialog.esm.js.map +1 -1
  18. package/dist/components/AssetInstallDialog/AssetInstallDialog.module.css.esm.js +8 -0
  19. package/dist/components/AssetInstallDialog/AssetInstallDialog.module.css.esm.js.map +1 -0
  20. package/dist/components/DevAiHubPage/DevAiHubPage.esm.js +64 -189
  21. package/dist/components/DevAiHubPage/DevAiHubPage.esm.js.map +1 -1
  22. package/dist/components/DevAiHubPage/DevAiHubPage.module.css.esm.js +8 -0
  23. package/dist/components/DevAiHubPage/DevAiHubPage.module.css.esm.js.map +1 -0
  24. package/dist/components/McpConfigPage/McpConfigPage.esm.js +200 -0
  25. package/dist/components/McpConfigPage/McpConfigPage.esm.js.map +1 -0
  26. package/dist/components/McpConfigPage/McpConfigPage.module.css.esm.js +8 -0
  27. package/dist/components/McpConfigPage/McpConfigPage.module.css.esm.js.map +1 -0
  28. package/dist/components/McpConfigPage/index.esm.js +6 -0
  29. package/dist/components/McpConfigPage/index.esm.js.map +1 -0
  30. package/dist/components/ToolIcon/ToolIcon.esm.js +25 -13
  31. package/dist/components/ToolIcon/ToolIcon.esm.js.map +1 -1
  32. package/dist/index.d.ts +10 -5
  33. package/dist/index.esm.js +1 -1
  34. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
  35. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
  36. package/dist/plugin.esm.js +24 -6
  37. package/dist/plugin.esm.js.map +1 -1
  38. package/dist/routes.esm.js +2 -1
  39. package/dist/routes.esm.js.map +1 -1
  40. package/package.json +24 -14
  41. package/package.json-prepack +24 -14
  42. package/src/components/AssetCard/AssetCard.module.css +153 -0
  43. package/src/components/AssetCard/AssetCard.tsx +79 -148
  44. package/src/components/AssetDetailPanel/AssetDetailPanel.module.css +207 -0
  45. package/src/components/AssetDetailPanel/AssetDetailPanel.tsx +228 -292
  46. package/src/components/AssetFilters/AssetFilters.module.css +67 -0
  47. package/src/components/AssetFilters/AssetFilters.tsx +136 -178
  48. package/src/components/AssetInstallDialog/AssetInstallDialog.module.css +72 -0
  49. package/src/components/AssetInstallDialog/AssetInstallDialog.tsx +95 -135
  50. package/src/components/DevAiHubPage/DevAiHubPage.module.css +105 -0
  51. package/src/components/DevAiHubPage/DevAiHubPage.tsx +73 -222
  52. package/src/components/McpConfigDialog/McpConfigDialog.module.css +111 -0
  53. package/src/components/McpConfigDialog/McpConfigDialog.tsx +178 -208
  54. package/src/components/McpConfigPage/McpConfigPage.module.css +121 -0
  55. package/src/components/McpConfigPage/McpConfigPage.tsx +242 -0
  56. package/src/components/McpConfigPage/index.ts +1 -0
  57. package/src/components/ToolIcon/ToolIcon.tsx +31 -15
  58. package/src/css-modules.d.ts +4 -0
  59. package/src/index.ts +1 -1
  60. package/src/plugin.tsx +23 -3
  61. package/src/routes.ts +1 -0
  62. package/tests/e2e/.auth.json +14 -0
  63. package/tests/e2e/asset-detail.spec.ts +90 -0
  64. package/tests/e2e/asset-filtering.spec.ts +145 -0
  65. package/tests/e2e/asset-installation.spec.ts +74 -0
  66. package/tests/e2e/dev-ai-hub-page.spec.ts +89 -0
  67. package/tests/e2e/fixtures/base.ts +61 -0
  68. package/tests/e2e/fixtures/mock-api.ts +221 -0
  69. package/tests/e2e/mcp-config.spec.ts +88 -0
  70. package/dist/components/McpConfigDialog/McpConfigDialog.esm.js +0 -274
  71. package/dist/components/McpConfigDialog/McpConfigDialog.esm.js.map +0 -1
@@ -1,24 +1,13 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState } from 'react';
3
- import Box from '@mui/material/Box';
4
- import Chip from '@mui/material/Chip';
5
- import Button from '@mui/material/Button';
6
- import CircularProgress from '@mui/material/CircularProgress';
7
- import Dialog from '@mui/material/Dialog';
8
- import DialogActions from '@mui/material/DialogActions';
9
- import DialogContent from '@mui/material/DialogContent';
10
- import DialogTitle from '@mui/material/DialogTitle';
11
- import Tooltip from '@mui/material/Tooltip';
12
- import Typography from '@mui/material/Typography';
13
- import ContentCopyIcon from '@mui/icons-material/ContentCopy';
14
- import DownloadIcon from '@mui/icons-material/Download';
15
- import CheckIcon from '@mui/icons-material/Check';
16
- import FolderZipIcon from '@mui/icons-material/FolderZip';
3
+ import { DialogTrigger, Dialog, DialogHeader, Text, DialogBody, Flex, Skeleton, Box, TagGroup, Tag, TooltipTrigger, Button, Tooltip, DialogFooter } from '@backstage/ui';
4
+ import { RiFolderZipLine, RiCheckLine, RiFileCopyLine, RiDownloadLine } from '@remixicon/react';
17
5
  import { getInstallPathsForAsset } from '@nospt/plugin-dev-ai-hub-common';
18
6
  import { useApi } from '@backstage/core-plugin-api';
19
7
  import { devAiHubApiRef } from '../../api/DevAiHubClient.esm.js';
20
8
  import { useAssetDetail } from '../../hooks/index.esm.js';
21
9
  import { ToolIcon } from '../ToolIcon/ToolIcon.esm.js';
10
+ import styles from './AssetInstallDialog.module.css.esm.js';
22
11
 
23
12
  const TOOL_LABELS = {
24
13
  "claude-code": "Claude Code",
@@ -70,124 +59,79 @@ function AssetInstallDialog({ assetId, onClose }) {
70
59
  installPath: asset.installPath,
71
60
  installPaths: asset.installPaths
72
61
  }) : {};
73
- return /* @__PURE__ */ jsxs(Dialog, { open: !!assetId, onClose: handleClose, maxWidth: "sm", fullWidth: true, children: [
74
- /* @__PURE__ */ jsxs(DialogTitle, { sx: { pb: 1 }, children: [
75
- asset ? `Install: ${asset.name}` : "Install",
76
- /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: 0.5, fontWeight: 400 }, children: "Copy the content and place the file at the path shown for your tool." })
77
- ] }),
78
- /* @__PURE__ */ jsxs(DialogContent, { sx: { display: "flex", flexDirection: "column", gap: 1.5, pt: "8px !important" }, children: [
79
- loading && /* @__PURE__ */ jsx(Box, { sx: { display: "flex", justifyContent: "center", py: 3 }, children: /* @__PURE__ */ jsx(CircularProgress, {}) }),
80
- !loading && asset && isZipSkill && /* @__PURE__ */ jsxs(
81
- Box,
82
- {
83
- sx: {
84
- border: "1px solid",
85
- borderColor: "info.main",
86
- borderRadius: 2,
87
- p: 1.5,
88
- backgroundColor: "info.main",
89
- backgroundImage: "none",
90
- bgcolor: (theme) => `${theme.palette.info.main}12`
91
- },
92
- children: [
93
- /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 }, children: [
94
- /* @__PURE__ */ jsx(FolderZipIcon, { sx: { fontSize: "1rem", color: "info.main" } }),
95
- /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", fontWeight: 700, color: "info.main", children: "Bundled skill \u2014 downloads as .zip" })
62
+ return /* @__PURE__ */ jsx(DialogTrigger, { children: /* @__PURE__ */ jsxs(
63
+ Dialog,
64
+ {
65
+ isOpen: !!assetId,
66
+ isDismissable: true,
67
+ onOpenChange: (open) => {
68
+ if (!open) handleClose();
69
+ },
70
+ children: [
71
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
72
+ asset ? `Install: ${asset.name}` : "Install",
73
+ /* @__PURE__ */ jsx(Text, { variant: "body-small", color: "secondary", className: styles.subtitle, children: "Copy the content and place the file at the path shown for your tool." })
74
+ ] }),
75
+ /* @__PURE__ */ jsx(DialogBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", style: { gap: "var(--bui-space-3)" }, children: [
76
+ loading && /* @__PURE__ */ jsx(Flex, { className: styles.loadingContainer, children: /* @__PURE__ */ jsx(Skeleton, { style: { width: "100%", height: 80 } }) }),
77
+ !loading && asset && isZipSkill && /* @__PURE__ */ jsxs(Box, { className: styles.zipInfo, children: [
78
+ /* @__PURE__ */ jsxs(Flex, { className: styles.zipHeader, children: [
79
+ /* @__PURE__ */ jsx(RiFolderZipLine, { size: 16, style: { color: "var(--bui-fg-info)" } }),
80
+ /* @__PURE__ */ jsx(Text, { variant: "body-small", weight: "bold", style: { color: "var(--bui-fg-info)" }, children: "Bundled skill \u2014 downloads as .zip" })
96
81
  ] }),
97
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "text.secondary", sx: { display: "block", mb: 1 }, children: [
82
+ /* @__PURE__ */ jsxs(Text, { variant: "body-x-small", color: "secondary", style: { display: "block", marginBottom: "var(--bui-space-2)" }, children: [
98
83
  "This skill includes resource files alongside ",
99
84
  /* @__PURE__ */ jsx("code", { children: "SKILL.md" }),
100
85
  ". Extract the zip and place all files in the skill directory."
101
86
  ] }),
102
- /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 0.5, flexWrap: "wrap" }, children: [
103
- /* @__PURE__ */ jsx(
104
- Chip,
105
- {
106
- label: "SKILL.md",
107
- size: "small",
108
- sx: { fontFamily: "monospace", fontSize: "0.7rem", height: 20 }
109
- }
110
- ),
111
- resourcePaths.map((p) => /* @__PURE__ */ jsx(
112
- Chip,
113
- {
114
- label: p,
115
- size: "small",
116
- variant: "outlined",
117
- sx: { fontFamily: "monospace", fontSize: "0.7rem", height: 20 }
118
- },
119
- p
120
- ))
121
- ] })
122
- ]
123
- }
124
- ),
125
- !loading && asset && Object.entries(installPaths).map(([tool, installPath]) => /* @__PURE__ */ jsxs(
126
- Box,
127
- {
128
- sx: {
129
- border: "1px solid",
130
- borderColor: "divider",
131
- borderRadius: 2,
132
- p: 1.5
133
- },
134
- children: [
135
- /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 }, children: [
136
- /* @__PURE__ */ jsx(ToolIcon, { tool, sx: { fontSize: "1rem" } }),
137
- /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", fontWeight: 700, children: TOOL_LABELS[tool] ?? tool })
87
+ /* @__PURE__ */ jsx(TagGroup, { "aria-label": "Bundled files", children: /* @__PURE__ */ jsxs(Flex, { className: styles.zipFiles, children: [
88
+ /* @__PURE__ */ jsx(Tag, { id: "skill-md", size: "small", className: styles.monoTag, children: "SKILL.md" }),
89
+ resourcePaths.map((p) => /* @__PURE__ */ jsx(Tag, { id: p, size: "small", className: styles.monoTag, children: p }, p))
90
+ ] }) })
91
+ ] }),
92
+ !loading && asset && Object.entries(installPaths).map(([tool, installPath]) => /* @__PURE__ */ jsxs(Box, { className: styles.toolSection, children: [
93
+ /* @__PURE__ */ jsxs(Flex, { className: styles.toolHeader, children: [
94
+ /* @__PURE__ */ jsx(ToolIcon, { tool, size: 16 }),
95
+ /* @__PURE__ */ jsx(Text, { variant: "body-small", weight: "bold", children: TOOL_LABELS[tool] ?? tool })
138
96
  ] }),
139
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", sx: { display: "block", mb: 0.5 }, children: "Install path" }),
140
- /* @__PURE__ */ jsx(
141
- Box,
142
- {
143
- sx: {
144
- bgcolor: "action.hover",
145
- border: "1px solid",
146
- borderColor: "divider",
147
- borderRadius: 1,
148
- px: 1.5,
149
- py: 0.75,
150
- fontFamily: "monospace",
151
- fontSize: "0.78rem",
152
- color: "text.primary",
153
- wordBreak: "break-all",
154
- mb: 1.25
155
- },
156
- children: installPath
157
- }
158
- ),
159
- /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 1 }, children: [
160
- /* @__PURE__ */ jsx(Tooltip, { title: copiedTool === tool ? "Copied!" : "Copy markdown content", children: /* @__PURE__ */ jsx(
161
- Button,
162
- {
163
- size: "small",
164
- variant: "outlined",
165
- startIcon: copiedTool === tool ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(ContentCopyIcon, {}),
166
- onClick: () => handleCopy(tool),
167
- color: copiedTool === tool ? "success" : "primary",
168
- sx: { flex: 1 },
169
- children: copiedTool === tool ? "Copied!" : "Copy Content"
170
- }
171
- ) }),
172
- /* @__PURE__ */ jsx(Tooltip, { title: isZipSkill ? "Download as .zip with all bundled files" : "Download file with correct name", children: /* @__PURE__ */ jsx(
173
- Button,
174
- {
175
- size: "small",
176
- variant: "outlined",
177
- startIcon: isZipSkill ? /* @__PURE__ */ jsx(FolderZipIcon, {}) : /* @__PURE__ */ jsx(DownloadIcon, {}),
178
- onClick: () => handleDownload(tool, installPath),
179
- sx: { flex: 1 },
180
- children: isZipSkill ? "Download .zip" : "Download"
181
- }
182
- ) })
97
+ /* @__PURE__ */ jsx(Text, { variant: "body-x-small", color: "secondary", style: { display: "block", marginBottom: "var(--bui-space-1)" }, children: "Install path" }),
98
+ /* @__PURE__ */ jsx(Box, { className: styles.installPathBox, children: installPath }),
99
+ /* @__PURE__ */ jsxs(Flex, { className: styles.toolActions, children: [
100
+ /* @__PURE__ */ jsxs(TooltipTrigger, { children: [
101
+ /* @__PURE__ */ jsxs(
102
+ Button,
103
+ {
104
+ variant: "secondary",
105
+ onClick: () => handleCopy(tool),
106
+ children: [
107
+ copiedTool === tool ? /* @__PURE__ */ jsx(RiCheckLine, { size: 14 }) : /* @__PURE__ */ jsx(RiFileCopyLine, { size: 14 }),
108
+ copiedTool === tool ? "Copied!" : "Copy Content"
109
+ ]
110
+ }
111
+ ),
112
+ /* @__PURE__ */ jsx(Tooltip, { children: copiedTool === tool ? "Copied!" : "Copy markdown content" })
113
+ ] }),
114
+ /* @__PURE__ */ jsxs(TooltipTrigger, { children: [
115
+ /* @__PURE__ */ jsxs(
116
+ Button,
117
+ {
118
+ variant: "secondary",
119
+ onClick: () => handleDownload(tool, installPath),
120
+ children: [
121
+ isZipSkill ? /* @__PURE__ */ jsx(RiFolderZipLine, { size: 14 }) : /* @__PURE__ */ jsx(RiDownloadLine, { size: 14 }),
122
+ isZipSkill ? "Download .zip" : "Download"
123
+ ]
124
+ }
125
+ ),
126
+ /* @__PURE__ */ jsx(Tooltip, { children: isZipSkill ? "Download as .zip with all bundled files" : "Download file with correct name" })
127
+ ] })
183
128
  ] })
184
- ]
185
- },
186
- tool
187
- ))
188
- ] }),
189
- /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button, { onClick: handleClose, children: "Close" }) })
190
- ] });
129
+ ] }, tool))
130
+ ] }) }),
131
+ /* @__PURE__ */ jsx(DialogFooter, { children: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "secondary", slot: "close", children: "Close" }) })
132
+ ]
133
+ }
134
+ ) });
191
135
  }
192
136
 
193
137
  export { AssetInstallDialog };
@@ -1 +1 @@
1
- {"version":3,"file":"AssetInstallDialog.esm.js","sources":["../../../src/components/AssetInstallDialog/AssetInstallDialog.tsx"],"sourcesContent":["import { useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport Button from '@mui/material/Button';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport CheckIcon from '@mui/icons-material/Check';\nimport FolderZipIcon from '@mui/icons-material/FolderZip';\nimport type { AiTool } from '@nospt/plugin-dev-ai-hub-common';\nimport { getInstallPathsForAsset } from '@nospt/plugin-dev-ai-hub-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { devAiHubApiRef } from '../../api/DevAiHubClient';\nimport { useAssetDetail } from '../../hooks';\nimport { ToolIcon } from '../ToolIcon';\n\nconst TOOL_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n 'github-copilot': 'GitHub Copilot',\n 'google-gemini': 'Google Gemini',\n 'cursor': 'Cursor',\n};\n\ninterface AssetInstallDialogProps {\n assetId: string | null;\n onClose: () => void;\n}\n\nexport function AssetInstallDialog({ assetId, onClose }: AssetInstallDialogProps) {\n const [copiedTool, setCopiedTool] = useState<string | null>(null);\n const api = useApi(devAiHubApiRef);\n const { asset, loading } = useAssetDetail(assetId);\n\n const handleClose = () => {\n onClose();\n setCopiedTool(null);\n };\n\n const handleCopy = (tool: string) => {\n if (!asset) return;\n navigator.clipboard.writeText(asset.content).then(() => {\n setCopiedTool(tool);\n setTimeout(() => setCopiedTool(null), 2000);\n });\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const resourcePaths = asset?.resourcesContent\n ? Object.keys(asset.resourcesContent)\n : [];\n const isZipSkill = asset?.type === 'skill' && resourcePaths.length > 0;\n\n const handleDownload = async (_tool: string, installPath: string) => {\n if (!asset) return;\n if (isZipSkill) {\n const url = await api.getDownloadUrl(asset.id);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${asset.name.replace(/\\s+/g, '-').toLowerCase()}.zip`;\n a.click();\n } else {\n const filename = installPath.split('/').pop() ?? `${asset.name}.md`;\n const blob = new Blob([asset.content], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const installPaths = asset\n ? getInstallPathsForAsset(asset.type, asset.tools, asset.name, {\n installPath: asset.installPath,\n installPaths: asset.installPaths,\n })\n : {};\n\n return (\n <Dialog open={!!assetId} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle sx={{ pb: 1 }}>\n {asset ? `Install: ${asset.name}` : 'Install'}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5, fontWeight: 400 }}>\n Copy the content and place the file at the path shown for your tool.\n </Typography>\n </DialogTitle>\n\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 1.5, pt: '8px !important' }}>\n {loading && (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 3 }}>\n <CircularProgress />\n </Box>\n )}\n\n {!loading && asset && isZipSkill && (\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'info.main',\n borderRadius: 2,\n p: 1.5,\n backgroundColor: 'info.main',\n backgroundImage: 'none',\n bgcolor: theme => `${theme.palette.info.main}12`,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <FolderZipIcon sx={{ fontSize: '1rem', color: 'info.main' }} />\n <Typography variant=\"subtitle2\" fontWeight={700} color=\"info.main\">\n Bundled skill — downloads as .zip\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1 }}>\n This skill includes resource files alongside <code>SKILL.md</code>.\n Extract the zip and place all files in the skill directory.\n </Typography>\n <Box sx={{ display: 'flex', gap: 0.5, flexWrap: 'wrap' }}>\n <Chip\n label=\"SKILL.md\"\n size=\"small\"\n sx={{ fontFamily: 'monospace', fontSize: '0.7rem', height: 20 }}\n />\n {resourcePaths.map(p => (\n <Chip\n key={p}\n label={p}\n size=\"small\"\n variant=\"outlined\"\n sx={{ fontFamily: 'monospace', fontSize: '0.7rem', height: 20 }}\n />\n ))}\n </Box>\n </Box>\n )}\n\n {!loading && asset && Object.entries(installPaths).map(([tool, installPath]) => (\n <Box\n key={tool}\n sx={{\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 2,\n p: 1.5,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <ToolIcon tool={tool as AiTool} sx={{ fontSize: '1rem' }} />\n <Typography variant=\"subtitle2\" fontWeight={700}>\n {TOOL_LABELS[tool] ?? tool}\n </Typography>\n </Box>\n\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 0.5 }}>\n Install path\n </Typography>\n <Box\n sx={{\n bgcolor: 'action.hover',\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n px: 1.5,\n py: 0.75,\n fontFamily: 'monospace',\n fontSize: '0.78rem',\n color: 'text.primary',\n wordBreak: 'break-all',\n mb: 1.25,\n }}\n >\n {installPath}\n </Box>\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Tooltip title={copiedTool === tool ? 'Copied!' : 'Copy markdown content'}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={copiedTool === tool ? <CheckIcon /> : <ContentCopyIcon />}\n onClick={() => handleCopy(tool)}\n color={copiedTool === tool ? 'success' : 'primary'}\n sx={{ flex: 1 }}\n >\n {copiedTool === tool ? 'Copied!' : 'Copy Content'}\n </Button>\n </Tooltip>\n <Tooltip title={isZipSkill ? 'Download as .zip with all bundled files' : 'Download file with correct name'}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n startIcon={isZipSkill ? <FolderZipIcon /> : <DownloadIcon />}\n onClick={() => handleDownload(tool, installPath)}\n sx={{ flex: 1 }}\n >\n {isZipSkill ? 'Download .zip' : 'Download'}\n </Button>\n </Tooltip>\n </Box>\n </Box>\n ))}\n </DialogContent>\n\n <DialogActions>\n <Button onClick={handleClose}>Close</Button>\n </DialogActions>\n </Dialog>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssetInstallDialog.esm.js","sources":["../../../src/components/AssetInstallDialog/AssetInstallDialog.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Box, Flex, Text, Button, Tag, TagGroup, Skeleton,\n Dialog, DialogTrigger, DialogHeader, DialogBody, DialogFooter,\n Tooltip, TooltipTrigger,\n} from '@backstage/ui';\nimport { RiFileCopyLine, RiDownloadLine, RiCheckLine, RiFolderZipLine } from '@remixicon/react';\nimport type { AiTool } from '@nospt/plugin-dev-ai-hub-common';\nimport { getInstallPathsForAsset } from '@nospt/plugin-dev-ai-hub-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { devAiHubApiRef } from '../../api/DevAiHubClient';\nimport { useAssetDetail } from '../../hooks';\nimport { ToolIcon } from '../ToolIcon';\nimport styles from './AssetInstallDialog.module.css';\n\nconst TOOL_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n 'github-copilot': 'GitHub Copilot',\n 'google-gemini': 'Google Gemini',\n 'cursor': 'Cursor',\n};\n\ninterface AssetInstallDialogProps {\n assetId: string | null;\n onClose: () => void;\n}\n\nexport function AssetInstallDialog({ assetId, onClose }: AssetInstallDialogProps) {\n const [copiedTool, setCopiedTool] = useState<string | null>(null);\n const api = useApi(devAiHubApiRef);\n const { asset, loading } = useAssetDetail(assetId);\n\n const handleClose = () => {\n onClose();\n setCopiedTool(null);\n };\n\n const handleCopy = (tool: string) => {\n if (!asset) return;\n navigator.clipboard.writeText(asset.content).then(() => {\n setCopiedTool(tool);\n setTimeout(() => setCopiedTool(null), 2000);\n });\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const resourcePaths = asset?.resourcesContent\n ? Object.keys(asset.resourcesContent)\n : [];\n const isZipSkill = asset?.type === 'skill' && resourcePaths.length > 0;\n\n const handleDownload = async (_tool: string, installPath: string) => {\n if (!asset) return;\n if (isZipSkill) {\n const url = await api.getDownloadUrl(asset.id);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${asset.name.replace(/\\s+/g, '-').toLowerCase()}.zip`;\n a.click();\n } else {\n const filename = installPath.split('/').pop() ?? `${asset.name}.md`;\n const blob = new Blob([asset.content], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n api.trackInstall(asset.id).catch(() => {});\n };\n\n const installPaths = asset\n ? getInstallPathsForAsset(asset.type, asset.tools, asset.name, {\n installPath: asset.installPath,\n installPaths: asset.installPaths,\n })\n : {};\n\n return (\n <DialogTrigger>\n <Dialog\n isOpen={!!assetId}\n isDismissable\n onOpenChange={open => { if (!open) handleClose(); }}\n >\n <DialogHeader>\n {asset ? `Install: ${asset.name}` : 'Install'}\n <Text variant=\"body-small\" color=\"secondary\" className={styles.subtitle}>\n Copy the content and place the file at the path shown for your tool.\n </Text>\n </DialogHeader>\n\n <DialogBody>\n <Flex direction=\"column\" style={{ gap: 'var(--bui-space-3)' }}>\n {loading && (\n <Flex className={styles.loadingContainer}>\n <Skeleton style={{ width: '100%', height: 80 }} />\n </Flex>\n )}\n\n {!loading && asset && isZipSkill && (\n <Box className={styles.zipInfo}>\n <Flex className={styles.zipHeader}>\n <RiFolderZipLine size={16} style={{ color: 'var(--bui-fg-info)' }} />\n <Text variant=\"body-small\" weight=\"bold\" style={{ color: 'var(--bui-fg-info)' }}>\n Bundled skill — downloads as .zip\n </Text>\n </Flex>\n <Text variant=\"body-x-small\" color=\"secondary\" style={{ display: 'block', marginBottom: 'var(--bui-space-2)' }}>\n This skill includes resource files alongside <code>SKILL.md</code>.\n Extract the zip and place all files in the skill directory.\n </Text>\n <TagGroup aria-label=\"Bundled files\">\n <Flex className={styles.zipFiles}>\n <Tag id=\"skill-md\" size=\"small\" className={styles.monoTag}>SKILL.md</Tag>\n {resourcePaths.map(p => (\n <Tag key={p} id={p} size=\"small\" className={styles.monoTag}>{p}</Tag>\n ))}\n </Flex>\n </TagGroup>\n </Box>\n )}\n\n {!loading && asset && Object.entries(installPaths).map(([tool, installPath]) => (\n <Box key={tool} className={styles.toolSection}>\n <Flex className={styles.toolHeader}>\n <ToolIcon tool={tool as AiTool} size={16} />\n <Text variant=\"body-small\" weight=\"bold\">\n {TOOL_LABELS[tool] ?? tool}\n </Text>\n </Flex>\n\n <Text variant=\"body-x-small\" color=\"secondary\" style={{ display: 'block', marginBottom: 'var(--bui-space-1)' }}>\n Install path\n </Text>\n <Box className={styles.installPathBox}>\n {installPath}\n </Box>\n\n <Flex className={styles.toolActions}>\n <TooltipTrigger>\n <Button\n variant=\"secondary\"\n onClick={() => handleCopy(tool)}\n >\n {copiedTool === tool ? <RiCheckLine size={14} /> : <RiFileCopyLine size={14} />}\n {copiedTool === tool ? 'Copied!' : 'Copy Content'}\n </Button>\n <Tooltip>{copiedTool === tool ? 'Copied!' : 'Copy markdown content'}</Tooltip>\n </TooltipTrigger>\n <TooltipTrigger>\n <Button\n variant=\"secondary\"\n onClick={() => handleDownload(tool, installPath)}\n >\n {isZipSkill ? <RiFolderZipLine size={14} /> : <RiDownloadLine size={14} />}\n {isZipSkill ? 'Download .zip' : 'Download'}\n </Button>\n <Tooltip>{isZipSkill ? 'Download as .zip with all bundled files' : 'Download file with correct name'}</Tooltip>\n </TooltipTrigger>\n </Flex>\n </Box>\n ))}\n </Flex>\n </DialogBody>\n\n <DialogFooter>\n <Button onClick={handleClose} variant=\"secondary\" slot=\"close\">\n Close\n </Button>\n </DialogFooter>\n </Dialog>\n </DialogTrigger>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
+
3
+ var css_248z = "@layer components {\n .AssetInstallDialog_subtitle__b31679eacf {\n margin-top: var(--bui-space-1);\n font-weight: 400;\n }\n\n .AssetInstallDialog_loadingContainer__b31679eacf {\n display: flex;\n justify-content: center;\n padding: var(--bui-space-6) 0;\n }\n\n .AssetInstallDialog_zipInfo__b31679eacf {\n border: 1px solid #00D2D3;\n border-radius: var(--bui-radius-2);\n padding: var(--bui-space-3);\n background-color: color-mix(in srgb, #00D2D3 7%, transparent);\n }\n\n .AssetInstallDialog_zipHeader__b31679eacf {\n display: flex;\n align-items: center;\n gap: var(--bui-space-2);\n margin-bottom: var(--bui-space-2);\n }\n\n .AssetInstallDialog_zipFiles__b31679eacf {\n display: flex;\n gap: var(--bui-space-1);\n flex-wrap: wrap;\n }\n\n .AssetInstallDialog_monoTag__b31679eacf {\n font-family: monospace;\n font-size: 0.7rem;\n height: 20px;\n }\n\n .AssetInstallDialog_toolSection__b31679eacf {\n border: 1px solid var(--bui-border-1);\n border-radius: var(--bui-radius-2);\n padding: var(--bui-space-3);\n }\n\n .AssetInstallDialog_toolHeader__b31679eacf {\n display: flex;\n align-items: center;\n gap: var(--bui-space-2);\n margin-bottom: var(--bui-space-2);\n }\n\n .AssetInstallDialog_installPathBox__b31679eacf {\n background-color: var(--bui-bg-neutral-1-hover);\n border: 1px solid var(--bui-border-1);\n border-radius: var(--bui-radius-2);\n padding: var(--bui-space-2) var(--bui-space-3);\n font-family: monospace;\n font-size: 0.78rem;\n color: var(--bui-fg-primary);\n word-break: break-all;\n margin-bottom: 10px;\n }\n\n .AssetInstallDialog_toolActions__b31679eacf {\n display: flex;\n gap: var(--bui-space-2);\n }\n\n .AssetInstallDialog_toolActions__b31679eacf > * {\n flex: 1;\n }\n}\n";
4
+ var styles = {"subtitle":"AssetInstallDialog_subtitle__b31679eacf","loadingContainer":"AssetInstallDialog_loadingContainer__b31679eacf","zipInfo":"AssetInstallDialog_zipInfo__b31679eacf","zipHeader":"AssetInstallDialog_zipHeader__b31679eacf","zipFiles":"AssetInstallDialog_zipFiles__b31679eacf","monoTag":"AssetInstallDialog_monoTag__b31679eacf","toolSection":"AssetInstallDialog_toolSection__b31679eacf","toolHeader":"AssetInstallDialog_toolHeader__b31679eacf","installPathBox":"AssetInstallDialog_installPathBox__b31679eacf","toolActions":"AssetInstallDialog_toolActions__b31679eacf"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=AssetInstallDialog.module.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetInstallDialog.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}