@nospt/plugin-dev-ai-hub 0.3.1 → 1.0.0-rc1
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/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# @nospt/plugin-dev-ai-hub
|
|
2
|
+
|
|
3
|
+
The frontend half of **Dev AI Hub** — a catalog-backed browser for AI assets usable by GitHub Copilot, Claude Code, Google Gemini, Cursor and other AI coding tools.
|
|
4
|
+
|
|
5
|
+
> **Requires Backstage 1.51 or later.** The `AiResource` kind comes from Backstage's own alpha catalog module, which is not available before that.
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
## What it is
|
|
10
|
+
|
|
11
|
+
Teams accumulate AI assets — a prompt that writes good commit messages, an agent that reviews code, an MCP server config for Grafana — and they end up scattered across repos, wikis and chat threads. Dev AI Hub gives them one page in Backstage, with the catalog as the source of truth.
|
|
12
|
+
|
|
13
|
+
Six kinds of resource, each with its own install path:
|
|
14
|
+
|
|
15
|
+
| Type | What it is |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `skill` | Reusable instructions an AI tool loads on demand |
|
|
18
|
+
| `agent` | A specialised assistant with its own system prompt |
|
|
19
|
+
| `hook` | Something that runs on a tool event, e.g. lint after an edit |
|
|
20
|
+
| `mcp-config` | An MCP server configuration to merge into your tool |
|
|
21
|
+
| `plugin` | A bundle of the above, installed from a marketplace |
|
|
22
|
+
| `marketplace` | A catalog of plugins you register with your tool once |
|
|
23
|
+
|
|
24
|
+
## What a user does with it
|
|
25
|
+
|
|
26
|
+
1. **Browses** — type tiles double as filters; search covers name, description and tags; further filters narrow by AI tool and tag.
|
|
27
|
+
2. **Opens a resource** — a drawer shows the metadata plus the body, resolved on demand from wherever it lives in Git. Markdown is rendered; an `mcp-config` is shown as copyable JSON.
|
|
28
|
+
3. **Installs it** — the dialog gives per-framework install paths, a copy button, a download where the body *is* the artifact, and one-click launchers where the tool has a URL handler.
|
|
29
|
+
|
|
30
|
+
Every resource opened or installed is counted, so the cards can show what colleagues actually use.
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
yarn --cwd packages/app add @nospt/plugin-dev-ai-hub
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This plugin uses the Backstage **New Frontend System**. In `packages/app/src/App.tsx`:
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { devAiHubPlugin } from '@nospt/plugin-dev-ai-hub';
|
|
42
|
+
|
|
43
|
+
export const app = createApp({
|
|
44
|
+
features: [
|
|
45
|
+
// ...existing features
|
|
46
|
+
devAiHubPlugin,
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The sidebar item and the `/dev-ai-hub` route register themselves.
|
|
52
|
+
|
|
53
|
+
### You also need
|
|
54
|
+
|
|
55
|
+
- **[`@nospt/plugin-dev-ai-hub-backend`](https://www.npmjs.com/package/@nospt/plugin-dev-ai-hub-backend)** — the page has nothing to show without it.
|
|
56
|
+
- **`@backstage/plugin-catalog-backend-module-ai-model`** — provides the `AiResource` kind.
|
|
57
|
+
- **`AiResource` allow-listed** in your `catalog.rules`, and at least one entity registered.
|
|
58
|
+
|
|
59
|
+
All three are covered in the [repository README](https://github.com/nosportugal/backstage-plugin-dev-ai-hub#readme), which is the single place kept current.
|
|
60
|
+
|
|
61
|
+
## Troubleshooting
|
|
62
|
+
|
|
63
|
+
| Symptom | Usually means |
|
|
64
|
+
|---|---|
|
|
65
|
+
| The page loads but says "Register AiResource entities…" | The catalog has no `AiResource` entities — or they were rejected because the kind is not in `catalog.rules` |
|
|
66
|
+
| "Could not load resources" | The backend plugin is not registered, or the request is unauthenticated |
|
|
67
|
+
| Components render unstyled | `@backstage/ui/css/styles.css` is not imported in `packages/app/src/index.tsx` — apps scaffolded by a current `create-app` already do this |
|
|
68
|
+
| A resource is listed but has no install actions | It publishes no `backstage.io/source-location`, so it is browsable but not installable |
|
|
69
|
+
|
|
70
|
+
## License
|
|
71
|
+
|
|
72
|
+
Apache-2.0
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
2
|
|
|
3
|
-
var css_248z = "/*\n * Plugin-owned colour tokens for the six ResourceType roles (ADR-0008,\n * ADR-0010, amended 2026-08-03).\n *\n * Source of truth is the NOS *digital* brand palette — `brand` in\n * nosportugal/backstage `packages/app/src/themes/palette.ts`, the same one\n * that app's MUI themes and BUI variable overrides derive from. Hue and\n * saturation come from there and never change; only lightness moves, and only\n * far enough to clear 3:1 against the card background of the theme the value\n * is used in (`--bui-bg-neutral-1`: #ededeb in nos-light, #252830 in\n * nos-dark). Several values are the brand hex untouched, because they already\n * cleared it.\n *\n * marketplace is the exception: it keeps NOS Coral (#f26b43, from the\n * presentation brand reference) rather than taking brand.red, which that\n * palette binds to `error` — a semantic colour used for identity is the\n * misuse ADR-0008 exists to avoid.\n *\n * This is the ONLY place raw hex may appear for type identity; components\n * reference the custom properties. Chrome accents are NOT here — they use\n * BUI's own tokens, so they track the host theme instead of competing.\n */\n:root,\n[data-theme-mode='light'] {\n /* green / pink / yellow / blue / turquoise darkened onto the off-white card */\n --devaihub-type-skill: #609112;\n --devaihub-type-agent: #e042b2;\n --devaihub-type-hook: #9b8100;\n --devaihub-type-plugin: #4f60d2;\n --devaihub-type-mcp-config: #1d9381;\n --devaihub-type-marketplace: #ef4716;\n\n --devaihub-type-skill-bg: rgba(96, 145, 18, 0.14);\n --devaihub-type-agent-bg: rgba(224, 66, 178, 0.14);\n --devaihub-type-hook-bg: rgba(155, 129, 0, 0.14);\n --devaihub-type-plugin-bg: rgba(79, 96, 210, 0.14);\n --devaihub-type-mcp-config-bg: rgba(29, 147, 129, 0.14);\n --devaihub-type-marketplace-bg: rgba(239, 71, 22, 0.14);\n}\n\n[data-theme-mode='dark'] {\n /* The brand hexes as published — all but blue already clear 3:1 on #252830 */\n --devaihub-type-skill: #6ea514;\n --devaihub-type-agent: #eb84cd;\n --devaihub-type-hook: #fcd200;\n --devaihub-type-plugin: #5d6dd6;\n --devaihub-type-mcp-config: #4bdbc5;\n --devaihub-type-marketplace: #f26b43;\n\n --devaihub-type-skill-bg: rgba(110, 165, 20, 0.2);\n --devaihub-type-agent-bg: rgba(235, 132, 205, 0.2);\n --devaihub-type-hook-bg: rgba(252, 210, 0, 0.2);\n --devaihub-type-plugin-bg: rgba(93, 109, 214, 0.2);\n --devaihub-type-mcp-config-bg: rgba(75, 219, 197, 0.2);\n --devaihub-type-marketplace-bg: rgba(242, 107, 67, 0.2);\n}\n\n/*\n * Stat-tile fills. The tiles are solid blocks of the type's colour, so unlike\n * the accents above they take the NOS brand hex **as published, identically in\n * both themes** — a filled tile carries its own contrast and has no page\n * behind it to react to.\n *\n * This is deliberately not `--devaihub-type-*`. Those values are tuned for\n * legibility *against* a card surface, which in light mode means darkened —\n * filling a tile with the light-mode accent produces the olive/dull row this\n * palette exists to avoid. Same hues, different job, so different tokens.\n *\n * White on these measures 5.34:1 (blue) down to 1.46:1 (yellow) and 1.72:1\n * (turquoise): three of six are below WCAG AA. That is a known trade, made\n * with the alternatives rendered — see ADR-0008. It is contained to this row;\n * every type accent on the cards is AA in both themes.\n */\n:root {\n --devaihub-tile-fg: #ffffff;\n\n --devaihub-tile-skill: #6ea514;\n --devaihub-tile-agent: #eb84cd;\n --devaihub-tile-hook: #fcd200;\n --devaihub-tile-plugin: #4f60d2;\n --devaihub-tile-mcp-config: #4bdbc5;\n --devaihub-tile-marketplace: #f26b43;\n}\n\n@layer components {\n .
|
|
4
|
-
var styles = {"pageRoot":"
|
|
3
|
+
var css_248z = "/*\n * Plugin-owned colour tokens for the six ResourceType roles (ADR-0008,\n * ADR-0010, amended 2026-08-03).\n *\n * Source of truth is the NOS *digital* brand palette — `brand` in\n * nosportugal/backstage `packages/app/src/themes/palette.ts`, the same one\n * that app's MUI themes and BUI variable overrides derive from. Hue and\n * saturation come from there and never change; only lightness moves, and only\n * far enough to clear 3:1 against the card background of the theme the value\n * is used in (`--bui-bg-neutral-1`: #ededeb in nos-light, #252830 in\n * nos-dark). Several values are the brand hex untouched, because they already\n * cleared it.\n *\n * marketplace is the exception: it keeps NOS Coral (#f26b43, from the\n * presentation brand reference) rather than taking brand.red, which that\n * palette binds to `error` — a semantic colour used for identity is the\n * misuse ADR-0008 exists to avoid.\n *\n * This is the ONLY place raw hex may appear for type identity; components\n * reference the custom properties. Chrome accents are NOT here — they use\n * BUI's own tokens, so they track the host theme instead of competing.\n */\n:root,\n[data-theme-mode='light'] {\n /* green / pink / yellow / blue / turquoise darkened onto the off-white card */\n --devaihub-type-skill: #609112;\n --devaihub-type-agent: #e042b2;\n --devaihub-type-hook: #9b8100;\n --devaihub-type-plugin: #4f60d2;\n --devaihub-type-mcp-config: #1d9381;\n --devaihub-type-marketplace: #ef4716;\n\n --devaihub-type-skill-bg: rgba(96, 145, 18, 0.14);\n --devaihub-type-agent-bg: rgba(224, 66, 178, 0.14);\n --devaihub-type-hook-bg: rgba(155, 129, 0, 0.14);\n --devaihub-type-plugin-bg: rgba(79, 96, 210, 0.14);\n --devaihub-type-mcp-config-bg: rgba(29, 147, 129, 0.14);\n --devaihub-type-marketplace-bg: rgba(239, 71, 22, 0.14);\n}\n\n[data-theme-mode='dark'] {\n /* The brand hexes as published — all but blue already clear 3:1 on #252830 */\n --devaihub-type-skill: #6ea514;\n --devaihub-type-agent: #eb84cd;\n --devaihub-type-hook: #fcd200;\n --devaihub-type-plugin: #5d6dd6;\n --devaihub-type-mcp-config: #4bdbc5;\n --devaihub-type-marketplace: #f26b43;\n\n --devaihub-type-skill-bg: rgba(110, 165, 20, 0.2);\n --devaihub-type-agent-bg: rgba(235, 132, 205, 0.2);\n --devaihub-type-hook-bg: rgba(252, 210, 0, 0.2);\n --devaihub-type-plugin-bg: rgba(93, 109, 214, 0.2);\n --devaihub-type-mcp-config-bg: rgba(75, 219, 197, 0.2);\n --devaihub-type-marketplace-bg: rgba(242, 107, 67, 0.2);\n}\n\n/*\n * Stat-tile fills. The tiles are solid blocks of the type's colour, so unlike\n * the accents above they take the NOS brand hex **as published, identically in\n * both themes** — a filled tile carries its own contrast and has no page\n * behind it to react to.\n *\n * This is deliberately not `--devaihub-type-*`. Those values are tuned for\n * legibility *against* a card surface, which in light mode means darkened —\n * filling a tile with the light-mode accent produces the olive/dull row this\n * palette exists to avoid. Same hues, different job, so different tokens.\n *\n * White on these measures 5.34:1 (blue) down to 1.46:1 (yellow) and 1.72:1\n * (turquoise): three of six are below WCAG AA. That is a known trade, made\n * with the alternatives rendered — see ADR-0008. It is contained to this row;\n * every type accent on the cards is AA in both themes.\n */\n:root {\n --devaihub-tile-fg: #ffffff;\n\n /*\n * A uniform ink veil composited over the fill — appearance, not contrast.\n * At 8% the published hex is still plainly itself (yellow #fcd200 renders\n * as #e8c100) while the row loses the glare it had as six blocks of\n * full-strength brand colour, which read hardest against the light theme's\n * off-white page.\n *\n * It buys almost no legibility and is not claimed to: white on yellow goes\n * 1.46:1 -> 1.74:1, against a 3:1 floor. The trade recorded in ADR-0008 is\n * unchanged. Reaching that floor everywhere needs ~30%, and AA ~45%, by\n * which point yellow is #8c7500 and no longer a NOS colour — the outcome\n * that ADR records as rejected twice on sight.\n *\n * The veil is a separate token rather than baked into the hexes below so\n * the fills stay the brand values as published, and so the strength is one\n * number to revisit.\n */\n --devaihub-tile-veil: rgba(0, 0, 0, 0.08);\n\n --devaihub-tile-skill: #6ea514;\n --devaihub-tile-agent: #eb84cd;\n --devaihub-tile-hook: #fcd200;\n --devaihub-tile-plugin: #4f60d2;\n --devaihub-tile-mcp-config: #4bdbc5;\n --devaihub-tile-marketplace: #f26b43;\n}\n\n@layer components {\n .AiResourcesPage_pageRoot__da942a1d83 {\n padding: var(--bui-space-6);\n }\n\n .AiResourcesPage_grid__da942a1d83 {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: var(--bui-space-4);\n }\n\n .AiResourcesPage_paginationRow__da942a1d83 {\n justify-content: center;\n margin-top: var(--bui-space-5);\n }\n\n /* Staggered entrance for the initial card grid render only (see\n AiResourcesPage.tsx's playEntrance) — --card-index is set per-card. */\n .AiResourcesPage_cardEntrance__da942a1d83 {\n animation: AiResourcesPage_card-entrance__da942a1d83 320ms cubic-bezier(0.16, 1, 0.3, 1) both;\n animation-delay: calc(var(--card-index, 0) * 40ms);\n }\n\n @keyframes AiResourcesPage_card-entrance__da942a1d83 {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .AiResourcesPage_cardEntrance__da942a1d83 {\n animation: none;\n }\n }\n\n .AiResourcesPage_emptyState__da942a1d83 {\n text-align: center;\n padding: var(--bui-space-9) 0;\n }\n\n .AiResourcesPage_emptyEmoji__da942a1d83 {\n font-size: 40px;\n margin-bottom: var(--bui-space-2);\n animation: AiResourcesPage_empty-emoji-bounce__da942a1d83 700ms cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n @keyframes AiResourcesPage_empty-emoji-bounce__da942a1d83 {\n 0% {\n opacity: 0;\n transform: scale(0.4) translateY(-6px);\n }\n 60% {\n opacity: 1;\n transform: scale(1.08) translateY(0);\n }\n 100% {\n transform: scale(1) translateY(0);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .AiResourcesPage_emptyEmoji__da942a1d83 {\n animation: none;\n }\n }\n}\n";
|
|
4
|
+
var styles = {"pageRoot":"AiResourcesPage_pageRoot__da942a1d83","grid":"AiResourcesPage_grid__da942a1d83","paginationRow":"AiResourcesPage_paginationRow__da942a1d83","cardEntrance":"AiResourcesPage_cardEntrance__da942a1d83","emptyState":"AiResourcesPage_emptyState__da942a1d83","emptyEmoji":"AiResourcesPage_emptyEmoji__da942a1d83"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { styles as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
2
|
|
|
3
|
-
var css_248z = "@layer components {\n /*\n * The type filter: a row of solid brand-coloured blocks, each carrying a\n * share bar along its bottom edge — the type's proportion of the catalog.\n *\n * The bar is the data-ink. It answers \"what is this catalog made of?\" in the\n * space the tile already occupied, and it breaks the uniformity of six\n * identical tiles, which is what makes attention drop off across a repeated\n * row (eye-tracking: users barely register the last two of five).\n *\n * A full-height proportional fill was built first — the saturated part being\n * the share, the remainder the same hue dimmed — and rejected on sight: the\n * dimmed remainder is the muddy tone this palette has repeatedly failed on,\n * and it covered most of every tile. The bar keeps the encoding and leaves\n * the colour alone.\n *\n * The fill is `--devaihub-tile-*` (the brand hex, identical in both themes),\n * NOT `--devaihub-type-*`: those are darkened in light mode to read against\n * a card surface, and filling with them turns the row olive. See the token\n * block in AiResourcesPage.module.css.\n */\n .
|
|
4
|
-
var solidStyles = {"grid":"
|
|
3
|
+
var css_248z = "@layer components {\n /*\n * The type filter: a row of solid brand-coloured blocks, each carrying a\n * share bar along its bottom edge — the type's proportion of the catalog.\n *\n * The bar is the data-ink. It answers \"what is this catalog made of?\" in the\n * space the tile already occupied, and it breaks the uniformity of six\n * identical tiles, which is what makes attention drop off across a repeated\n * row (eye-tracking: users barely register the last two of five).\n *\n * A full-height proportional fill was built first — the saturated part being\n * the share, the remainder the same hue dimmed — and rejected on sight: the\n * dimmed remainder is the muddy tone this palette has repeatedly failed on,\n * and it covered most of every tile. The bar keeps the encoding and leaves\n * the colour alone.\n *\n * The fill is `--devaihub-tile-*` (the brand hex, identical in both themes),\n * NOT `--devaihub-type-*`: those are darkened in light mode to read against\n * a card surface, and filling with them turns the row olive. See the token\n * block in AiResourcesPage.module.css.\n */\n .StatTiles_grid__e83ca2277a {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));\n gap: var(--bui-space-3);\n margin-bottom: var(--bui-space-5);\n }\n\n .StatTiles_tile__e83ca2277a {\n position: relative;\n /* The variant owns its foreground: the components reference these tokens\n inline, which is what lets one DOM serve three treatments. */\n --devaihub-tile-fg: #ffffff;\n --devaihub-tile-fg-muted: rgba(255, 255, 255, 0.92);\n /* Ink veil over the published hex — see --devaihub-tile-veil for why it is\n a veil and not a darker set of fills. The gradient is a flat fill: two\n identical stops is the shortest way to composite a colour over another\n in one background shorthand. The shadows below stay keyed to the raw\n --tile-fill, so the hue-tinted glow keeps its full-strength colour. */\n background: linear-gradient(\n var(--devaihub-tile-veil),\n var(--devaihub-tile-veil)\n ),\n var(--tile-fill);\n border-radius: var(--bui-radius-3);\n padding: var(--bui-space-4);\n display: flex;\n align-items: center;\n gap: var(--bui-space-3);\n cursor: pointer;\n /* A lit top edge and a shadow tinted with the tile's own hue, so the row\n sits on the page rather than being pasted onto it. */\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25),\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 8px 18px -10px color-mix(in srgb, var(--tile-fill) 60%, transparent);\n /* Room for the share bar under the label. */\n padding-bottom: var(--bui-space-5);\n transition: transform 160ms cubic-bezier(0.16, 1, 0.3, 1),\n box-shadow 160ms ease;\n }\n\n .StatTiles_tile__e83ca2277a:hover {\n transform: translateY(-2px);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.32),\n 0 2px 4px rgba(0, 0, 0, 0.14),\n 0 14px 26px -12px color-mix(in srgb, var(--tile-fill) 70%, transparent);\n }\n\n .StatTiles_tile__e83ca2277a:focus-visible {\n outline: 2px solid var(--bui-fg-primary);\n outline-offset: 3px;\n }\n\n /* The ring sits OUTSIDE, on the page background, and takes the theme's\n foreground. A tint or an inset white ring cannot read on a solid fill —\n white is invisible on the yellow and turquoise tiles, which is exactly\n where selection has to be legible. */\n .StatTiles_tileActive__e83ca2277a {\n transform: translateY(-2px);\n outline: 2px solid var(--bui-fg-primary);\n outline-offset: 3px;\n }\n\n /* Share bar: a track across the full width with the fill sized to this\n type's proportion of the catalog. Drawn in the tile's own foreground so it\n works on every hue without a second colour decision. */\n .StatTiles_shareTrack__e83ca2277a {\n position: absolute;\n left: var(--bui-space-4);\n right: var(--bui-space-4);\n bottom: var(--bui-space-3);\n height: 3px;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.28);\n overflow: hidden;\n }\n\n .StatTiles_shareFill__e83ca2277a {\n display: block;\n height: 100%;\n width: var(--tile-share);\n border-radius: inherit;\n background: var(--devaihub-tile-fg);\n transition: width 320ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n .StatTiles_tileIconBox__e83ca2277a {\n background: rgba(255, 255, 255, 0.22);\n color: var(--devaihub-tile-fg);\n border-radius: var(--bui-radius-2);\n padding: var(--bui-space-2);\n display: flex;\n flex-shrink: 0;\n }\n\n .StatTiles_tileText__e83ca2277a {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n /* Colour and size are set inline on the components too: BUI's Text carries\n its own, and which wins depends on the order BUI's styles land in the host\n app relative to this plugin's. These rules cover hosts where the plugin\n lands last. */\n .StatTiles_tile__e83ca2277a .StatTiles_tileValue__e83ca2277a {\n color: var(--devaihub-tile-fg);\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.1;\n letter-spacing: -0.02em;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.28);\n display: block;\n }\n\n .StatTiles_tile__e83ca2277a .StatTiles_tileLabel__e83ca2277a {\n color: var(--devaihub-tile-fg);\n font-size: 0.75rem;\n font-weight: 600;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n line-height: 1.2;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.28);\n display: block;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .StatTiles_tile__e83ca2277a {\n transition: none;\n }\n\n .StatTiles_tile__e83ca2277a:hover,\n .StatTiles_tileActive__e83ca2277a {\n transform: none;\n }\n\n .StatTiles_shareFill__e83ca2277a {\n transition: none;\n }\n }\n}\n";
|
|
4
|
+
var solidStyles = {"grid":"StatTiles_grid__e83ca2277a","tile":"StatTiles_tile__e83ca2277a","tileActive":"StatTiles_tileActive__e83ca2277a StatTiles_tile__e83ca2277a","shareTrack":"StatTiles_shareTrack__e83ca2277a","shareFill":"StatTiles_shareFill__e83ca2277a","tileIconBox":"StatTiles_tileIconBox__e83ca2277a","tileText":"StatTiles_tileText__e83ca2277a","tileValue":"StatTiles_tileValue__e83ca2277a","tileLabel":"StatTiles_tileLabel__e83ca2277a"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { solidStyles as default };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nospt/plugin-dev-ai-hub",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-rc1",
|
|
4
4
|
"description": "Frontend plugin for Dev AI Hub",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./dist/index.esm.js",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"pluginPackages": [
|
|
34
34
|
"@nospt/plugin-dev-ai-hub",
|
|
35
35
|
"@nospt/plugin-dev-ai-hub-backend",
|
|
36
|
-
"@nospt/plugin-dev-ai-hub-common"
|
|
37
|
-
"@nospt/plugin-dev-ai-hub-node"
|
|
36
|
+
"@nospt/plugin-dev-ai-hub-common"
|
|
38
37
|
]
|
|
39
38
|
},
|
|
40
39
|
"sideEffects": false,
|
|
41
40
|
"files": [
|
|
42
|
-
"dist"
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md"
|
|
43
43
|
],
|
|
44
44
|
"scripts": {
|
|
45
45
|
"start": "backstage-cli package start --config ../../app-config.dev.yaml",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"@backstage/core-plugin-api": "^1.12.6",
|
|
60
60
|
"@backstage/frontend-plugin-api": "^0.17.0",
|
|
61
61
|
"@backstage/ui": "^0.15.0",
|
|
62
|
-
"@nospt/plugin-dev-ai-hub-common": "^0.
|
|
62
|
+
"@nospt/plugin-dev-ai-hub-common": "^1.0.0-rc1",
|
|
63
63
|
"@remixicon/react": "^4.6.0",
|
|
64
64
|
"react-markdown": "^9.0.0",
|
|
65
65
|
"react-syntax-highlighter": "^16.1.1",
|
|
@@ -86,12 +86,20 @@
|
|
|
86
86
|
"jsdom": "^27.1.0",
|
|
87
87
|
"react": "^18.0.0",
|
|
88
88
|
"react-dom": "^18.0.0",
|
|
89
|
-
"react-router-dom": "^6.30.2"
|
|
89
|
+
"react-router-dom": "^6.30.2",
|
|
90
|
+
"yaml": "^2.9.0"
|
|
90
91
|
},
|
|
91
92
|
"peerDependencies": {
|
|
92
93
|
"react": "^18.0.0",
|
|
93
94
|
"react-dom": "^18.0.0",
|
|
94
95
|
"react-router-dom": "^6.0.0"
|
|
95
96
|
},
|
|
97
|
+
"jest": {
|
|
98
|
+
"coveragePathIgnorePatterns": [
|
|
99
|
+
"/node_modules/",
|
|
100
|
+
"plugin\\.tsx$",
|
|
101
|
+
"routes\\.ts$"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
96
104
|
"module": "./dist/index.esm.js"
|
|
97
105
|
}
|