@grimoire-rs/indexer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +48 -0
  3. package/dist/cli/build.d.ts +6 -0
  4. package/dist/cli/build.d.ts.map +1 -0
  5. package/dist/cli/build.js +29 -0
  6. package/dist/cli/build.js.map +1 -0
  7. package/dist/cli/exit.d.ts +28 -0
  8. package/dist/cli/exit.d.ts.map +1 -0
  9. package/dist/cli/exit.js +33 -0
  10. package/dist/cli/exit.js.map +1 -0
  11. package/dist/cli/index.d.ts +3 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +8 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/init.d.ts +40 -0
  16. package/dist/cli/init.d.ts.map +1 -0
  17. package/dist/cli/init.js +317 -0
  18. package/dist/cli/init.js.map +1 -0
  19. package/dist/cli/main.d.ts +2 -0
  20. package/dist/cli/main.d.ts.map +1 -0
  21. package/dist/cli/main.js +112 -0
  22. package/dist/cli/main.js.map +1 -0
  23. package/dist/cli/validate.d.ts +18 -0
  24. package/dist/cli/validate.d.ts.map +1 -0
  25. package/dist/cli/validate.js +139 -0
  26. package/dist/cli/validate.js.map +1 -0
  27. package/dist/config.d.ts +76 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +134 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/data/index.d.ts +40 -0
  32. package/dist/data/index.d.ts.map +1 -0
  33. package/dist/data/index.js +103 -0
  34. package/dist/data/index.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +4 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/integration.d.ts +2 -0
  40. package/dist/integration.d.ts.map +1 -0
  41. package/dist/integration.js +4 -0
  42. package/dist/integration.js.map +1 -0
  43. package/dist/renderer/astro/components/Catalog.d.ts +6 -0
  44. package/dist/renderer/astro/components/Catalog.d.ts.map +1 -0
  45. package/dist/renderer/astro/components/Catalog.js +73 -0
  46. package/dist/renderer/astro/components/Catalog.js.map +1 -0
  47. package/dist/renderer/astro/components/Catalog.tsx +256 -0
  48. package/dist/renderer/astro/components/CopyButton.astro +24 -0
  49. package/dist/renderer/astro/components/VersionMenu.astro +105 -0
  50. package/dist/renderer/astro/content.config.ts +30 -0
  51. package/dist/renderer/astro/layouts/Base.astro +623 -0
  52. package/dist/renderer/astro/lib/catalog.d.ts +7 -0
  53. package/dist/renderer/astro/lib/catalog.d.ts.map +1 -0
  54. package/dist/renderer/astro/lib/catalog.js +61 -0
  55. package/dist/renderer/astro/lib/catalog.js.map +1 -0
  56. package/dist/renderer/astro/lib/catalog.ts +69 -0
  57. package/dist/renderer/astro/lib/data.d.ts +3 -0
  58. package/dist/renderer/astro/lib/data.d.ts.map +1 -0
  59. package/dist/renderer/astro/lib/data.js +4 -0
  60. package/dist/renderer/astro/lib/data.js.map +1 -0
  61. package/dist/renderer/astro/lib/data.ts +12 -0
  62. package/dist/renderer/astro/pages/index.astro +69 -0
  63. package/dist/renderer/astro/pages/p/[...slug].astro +367 -0
  64. package/dist/renderer/index.d.ts +20 -0
  65. package/dist/renderer/index.d.ts.map +1 -0
  66. package/dist/renderer/index.js +192 -0
  67. package/dist/renderer/index.js.map +1 -0
  68. package/dist/renderer/public/favicon.svg +4 -0
  69. package/dist/renderer/types.d.ts +34 -0
  70. package/dist/renderer/types.d.ts.map +1 -0
  71. package/dist/renderer/types.js +4 -0
  72. package/dist/renderer/types.js.map +1 -0
  73. package/dist/validate/adapters/files.d.ts +17 -0
  74. package/dist/validate/adapters/files.d.ts.map +1 -0
  75. package/dist/validate/adapters/files.js +50 -0
  76. package/dist/validate/adapters/files.js.map +1 -0
  77. package/dist/validate/adapters/forge.d.ts +25 -0
  78. package/dist/validate/adapters/forge.d.ts.map +1 -0
  79. package/dist/validate/adapters/forge.js +100 -0
  80. package/dist/validate/adapters/forge.js.map +1 -0
  81. package/dist/validate/adapters/http.d.ts +24 -0
  82. package/dist/validate/adapters/http.d.ts.map +1 -0
  83. package/dist/validate/adapters/http.js +75 -0
  84. package/dist/validate/adapters/http.js.map +1 -0
  85. package/dist/validate/adapters/registry.d.ts +16 -0
  86. package/dist/validate/adapters/registry.d.ts.map +1 -0
  87. package/dist/validate/adapters/registry.js +91 -0
  88. package/dist/validate/adapters/registry.js.map +1 -0
  89. package/dist/validate/core/metadata.d.ts +67 -0
  90. package/dist/validate/core/metadata.d.ts.map +1 -0
  91. package/dist/validate/core/metadata.js +149 -0
  92. package/dist/validate/core/metadata.js.map +1 -0
  93. package/dist/validate/core/ownership.d.ts +43 -0
  94. package/dist/validate/core/ownership.d.ts.map +1 -0
  95. package/dist/validate/core/ownership.js +33 -0
  96. package/dist/validate/core/ownership.js.map +1 -0
  97. package/dist/validate/core/paths.d.ts +21 -0
  98. package/dist/validate/core/paths.d.ts.map +1 -0
  99. package/dist/validate/core/paths.js +34 -0
  100. package/dist/validate/core/paths.js.map +1 -0
  101. package/dist/validate/index.d.ts +40 -0
  102. package/dist/validate/index.d.ts.map +1 -0
  103. package/dist/validate/index.js +206 -0
  104. package/dist/validate/index.js.map +1 -0
  105. package/package.json +50 -0
  106. package/templates/README.md +48 -0
  107. package/templates/github-pages.yml +24 -0
  108. package/templates/github-validate.yml +36 -0
  109. package/templates/gitignore +9 -0
  110. package/templates/gitlab-ci.yml +13 -0
  111. package/templates/publish.toml +17 -0
  112. package/templates/reusable/gitlab-index-ci.yml +61 -0
  113. package/templates/reusable/index-pages.yml +80 -0
  114. package/templates/reusable/index-validate.yml +88 -0
@@ -0,0 +1,76 @@
1
+ /** File name `loadConfig` looks for at the index repo root. */
2
+ export declare const CONFIG_FILE = "index.config.json";
3
+ /** One copy-pasteable installer command shown in the landing-page hero. */
4
+ export interface InstallCommand {
5
+ /** Short platform label, e.g. `"Linux / macOS"`. */
6
+ os: string;
7
+ /** The shell one-liner, rendered verbatim and copied to the clipboard. */
8
+ command: string;
9
+ }
10
+ /**
11
+ * The "add this index" block — `grim config registry add <alias> --index
12
+ * <index>` plus the matching `[[registries]]` TOML. Set to `null` to omit
13
+ * the block entirely (an index with no publicly reachable URL).
14
+ */
15
+ export interface RegistryHint {
16
+ /** Alias the visitor's `grimoire.toml` will use, e.g. `"hub"`. */
17
+ alias: string;
18
+ /** Public index URL or git remote grim browses. */
19
+ index: string;
20
+ }
21
+ /**
22
+ * Renderer configuration. Every field is optional — `resolveConfig` fills
23
+ * gaps from `DEFAULT_CONFIG`, so a partial `index.config.json`
24
+ * (or a hand-built object) always renders.
25
+ */
26
+ export interface SiteConfig {
27
+ /** Canonical deployment URL. Astro's `site`; drives absolute `og:` URLs. */
28
+ site?: string;
29
+ /** Header text, `<title>`, and the landing-page `<h1>`. */
30
+ brand?: string;
31
+ /** Accent-styled monospace prefix of `brand` in the header, e.g. `"grim"`. */
32
+ brandMark?: string;
33
+ /** `<meta name="description">` on the landing page. */
34
+ description?: string;
35
+ /** Hero paragraph under the `<h1>`. */
36
+ tagline?: string;
37
+ /** Header "docs" link. `null` hides it. */
38
+ docsUrl?: string | null;
39
+ /** "install grim" link in the hero paragraph. `null` drops the sentence. */
40
+ installDocsUrl?: string | null;
41
+ /** Header "GitHub" link. `null` hides it. */
42
+ repoUrl?: string | null;
43
+ /** `<link rel="icon">` href. The file itself comes from `public/`. */
44
+ favicon?: string;
45
+ /** Hero installer one-liners. Empty array hides the strip. */
46
+ install?: InstallCommand[];
47
+ /**
48
+ * VS Code `publisher.extension` id behind the per-package deep link
49
+ * (`vscode://<id>/open?repo=…`). `null` hides every VS Code affordance.
50
+ */
51
+ vscodeExtension?: string | null;
52
+ /** "Add this index" copy-paste block. `null` omits it. */
53
+ registry?: RegistryHint | null;
54
+ /** Footer sentence after the `/all.json` link. `null` drops it. */
55
+ footerNote?: string | null;
56
+ /**
57
+ * Path to a CSS file, relative to the index repo root. Inlined after the
58
+ * default token set; unlayered, so it wins over every default rule.
59
+ */
60
+ customCss?: string | null;
61
+ }
62
+ /** A `SiteConfig` with every gap filled — what the templates actually read. */
63
+ export type ResolvedSiteConfig = Required<SiteConfig>;
64
+ export declare const DEFAULT_CONFIG: ResolvedSiteConfig;
65
+ /** Thrown for a malformed config file — a user data problem, not a bug. */
66
+ export declare class SiteConfigError extends Error {
67
+ constructor(message: string);
68
+ }
69
+ /**
70
+ * Read `index.config.json` from `root`. A missing file is not an
71
+ * error — an index repo that wants the defaults ships no config at all.
72
+ */
73
+ export declare function loadConfig(root: string): Promise<SiteConfig>;
74
+ /** Fill every gap in `config` from `DEFAULT_CONFIG`. */
75
+ export declare function resolveConfig(config: SiteConfig): ResolvedSiteConfig;
76
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,+DAA+D;AAC/D,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAE/C,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,+EAA+E;AAC/E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;AAEtD,eAAO,MAAM,cAAc,EAAE,kBAwB5B,CAAC;AAEF,2EAA2E;AAC3E,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAkED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAelE;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,kBAAkB,CAWpE"}
package/dist/config.js ADDED
@@ -0,0 +1,134 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 The Grimoire Authors
3
+ // Site configuration for the catalog renderer. Every field here was a
4
+ // hardcoded literal in the first-party index site; nothing else about the
5
+ // templates is configurable (see `SiteTokens` in the renderer for the CSS
6
+ // customization surface).
7
+ import fs from "node:fs/promises";
8
+ import path from "node:path";
9
+ /** File name `loadConfig` looks for at the index repo root. */
10
+ export const CONFIG_FILE = "index.config.json";
11
+ export const DEFAULT_CONFIG = {
12
+ site: "https://index.grimoire.rs",
13
+ brand: "grim package index",
14
+ brandMark: "grim",
15
+ description: "Browse and search AI-config packages — skills, rules, agents, MCP servers, and bundles — installable with the grim package manager.",
16
+ tagline: "Skills, rules, agents, MCP servers, and bundles for AI coding agents, hosted on OCI registries.",
17
+ docsUrl: "https://grimoire.rs",
18
+ installDocsUrl: "https://grimoire.rs/installation.html",
19
+ repoUrl: "https://github.com/grimoire-rs/index",
20
+ favicon: "/favicon.svg",
21
+ install: [
22
+ {
23
+ os: "Linux / macOS",
24
+ command: "curl --proto '=https' --tlsv1.2 -LsSf https://setup.grimoire.rs/sh | sh",
25
+ },
26
+ { os: "Windows", command: "irm https://setup.grimoire.rs/ps1 | iex" },
27
+ ],
28
+ vscodeExtension: "grimoire-rs.grimoire-vscode",
29
+ registry: { alias: "hub", index: "https://index.grimoire.rs" },
30
+ footerNote: "metadata is CC0 · pointers, not payloads — packages live on OCI registries",
31
+ customCss: null,
32
+ };
33
+ /** Thrown for a malformed config file — a user data problem, not a bug. */
34
+ export class SiteConfigError extends Error {
35
+ constructor(message) {
36
+ super(message);
37
+ this.name = "SiteConfigError";
38
+ }
39
+ }
40
+ function fail(msg) {
41
+ throw new SiteConfigError(`${CONFIG_FILE}: ${msg}`);
42
+ }
43
+ function optionalString(raw, key) {
44
+ const value = raw[key];
45
+ if (value !== undefined && value !== null && typeof value !== "string") {
46
+ fail(`${key} must be a string`);
47
+ }
48
+ }
49
+ // Config values land in `href`; a `javascript:` URL would execute in the
50
+ // visitor's browser. The site owner authors this file, so this is a
51
+ // typo/paste guard rather than a trust boundary — but it costs one check.
52
+ function optionalUrl(raw, key) {
53
+ optionalString(raw, key);
54
+ const value = raw[key];
55
+ if (typeof value === "string" && !/^https?:\/\//i.test(value)) {
56
+ fail(`${key} must be an http(s) URL`);
57
+ }
58
+ }
59
+ function validate(raw) {
60
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
61
+ fail("must contain a JSON object");
62
+ }
63
+ const cfg = raw;
64
+ for (const key of ["brand", "brandMark", "description", "tagline", "favicon", "footerNote", "customCss"]) {
65
+ optionalString(cfg, key);
66
+ }
67
+ for (const key of ["site", "docsUrl", "installDocsUrl", "repoUrl"]) {
68
+ optionalUrl(cfg, key);
69
+ }
70
+ if (cfg.vscodeExtension !== undefined && cfg.vscodeExtension !== null) {
71
+ if (typeof cfg.vscodeExtension !== "string" || !/^[\w.-]+\.[\w.-]+$/.test(cfg.vscodeExtension)) {
72
+ fail("vscodeExtension must be a `publisher.extension` id");
73
+ }
74
+ }
75
+ if (cfg.install !== undefined) {
76
+ if (!Array.isArray(cfg.install))
77
+ fail("install must be an array");
78
+ for (const entry of cfg.install) {
79
+ const row = entry;
80
+ if (row === null || typeof row !== "object" || typeof row.os !== "string" || typeof row.command !== "string") {
81
+ fail("install entries must be { os, command } strings");
82
+ }
83
+ }
84
+ }
85
+ if (cfg.registry !== undefined && cfg.registry !== null) {
86
+ const reg = cfg.registry;
87
+ if (typeof reg !== "object" || Array.isArray(reg))
88
+ fail("registry must be an object");
89
+ if (typeof reg.alias !== "string" || !/^[a-z0-9][a-z0-9._-]*$/i.test(reg.alias)) {
90
+ fail("registry.alias must be an alphanumeric alias");
91
+ }
92
+ optionalUrl(reg, "index");
93
+ if (typeof reg.index !== "string")
94
+ fail("registry.index is required");
95
+ }
96
+ return cfg;
97
+ }
98
+ /**
99
+ * Read `index.config.json` from `root`. A missing file is not an
100
+ * error — an index repo that wants the defaults ships no config at all.
101
+ */
102
+ export async function loadConfig(root) {
103
+ let text;
104
+ try {
105
+ text = await fs.readFile(path.join(root, CONFIG_FILE), "utf8");
106
+ }
107
+ catch (err) {
108
+ if (err.code === "ENOENT")
109
+ return {};
110
+ throw err;
111
+ }
112
+ let parsed;
113
+ try {
114
+ parsed = JSON.parse(text);
115
+ }
116
+ catch (err) {
117
+ fail(err.message);
118
+ }
119
+ return validate(parsed);
120
+ }
121
+ /** Fill every gap in `config` from `DEFAULT_CONFIG`. */
122
+ export function resolveConfig(config) {
123
+ const merged = { ...DEFAULT_CONFIG, ...config };
124
+ // `{...}` spreads an explicit `undefined` over the default; treat an
125
+ // absent-but-present key the same as an omitted one. `null` is meaningful
126
+ // (it disables the feature) and survives.
127
+ for (const [key, value] of Object.entries(merged)) {
128
+ if (value === undefined) {
129
+ merged[key] = DEFAULT_CONFIG[key];
130
+ }
131
+ }
132
+ return merged;
133
+ }
134
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export type PackageKind = "skill" | "rule" | "agent" | "mcp" | "bundle";
2
+ export interface IndexOwner {
3
+ id: number;
4
+ github?: string;
5
+ login?: string;
6
+ }
7
+ /**
8
+ * One compiled package record — the frozen public shape of each entry in
9
+ * `dist/all.json`. Index metadata plus (when present) the merged enrichment
10
+ * sidecar; index metadata always wins on key overlap. `[key: string]:
11
+ * unknown` carries enrichment fields (title, summary, version, license,
12
+ * keywords, tags, logo, hasReadme, hasChangelog, …) grim's read side never
13
+ * relies on a closed field set here (additive schema evolution).
14
+ */
15
+ export interface IndexRecord {
16
+ [key: string]: unknown;
17
+ schema: 1;
18
+ name: string;
19
+ kind: PackageKind;
20
+ ref: string;
21
+ description: string;
22
+ owner: IndexOwner;
23
+ namespace: string;
24
+ }
25
+ export interface CompileOptions {
26
+ /** Index repo root (holds `index/` and `enrich/`). Never derived from `__dirname`/`cwd`. */
27
+ root: string;
28
+ /** Directory to write `all.json`, `index/`, and `logos/` into. */
29
+ outDir: string;
30
+ }
31
+ export interface CompileResult {
32
+ count: number;
33
+ namespaces: string[];
34
+ }
35
+ /** Thrown for malformed `metadata.json` entries — a data problem, not a bug. */
36
+ export declare class IndexValidationError extends Error {
37
+ constructor(message: string);
38
+ }
39
+ export declare function compileIndex(opts: CompileOptions): Promise<CompileResult>;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,gFAAgF;AAChF,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAkDD,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAiD/E"}
@@ -0,0 +1,103 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 The Grimoire Authors
3
+ // Compiles index/**/metadata.json into a static dist/ tree. TS port of the
4
+ // former scripts/build.py (single implementation now — see
5
+ // site/src/lib/catalog.ts, which duplicated this same derivation).
6
+ import fs from "node:fs";
7
+ import path from "node:path";
8
+ const KINDS = new Set(["skill", "rule", "agent", "mcp", "bundle"]);
9
+ const REQUIRED = ["schema", "name", "kind", "ref", "description", "owner"];
10
+ /** Thrown for malformed `metadata.json` entries — a data problem, not a bug. */
11
+ export class IndexValidationError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = "IndexValidationError";
15
+ }
16
+ }
17
+ function shownPath(root, file) {
18
+ const rel = path.relative(root, file);
19
+ return rel.startsWith("..") ? file : rel;
20
+ }
21
+ function fail(root, file, msg) {
22
+ throw new IndexValidationError(`${shownPath(root, file)}: ${msg}`);
23
+ }
24
+ function validate(root, file, meta) {
25
+ const missing = REQUIRED.filter((key) => !(key in meta));
26
+ if (missing.length > 0) {
27
+ fail(root, file, `missing keys: ${missing.join(", ")}`);
28
+ }
29
+ if (meta.schema !== 1) {
30
+ fail(root, file, `unsupported schema version ${JSON.stringify(meta.schema)}`);
31
+ }
32
+ if (typeof meta.kind !== "string" || !KINDS.has(meta.kind)) {
33
+ fail(root, file, `kind must be one of ${[...KINDS].sort().join(", ")}`);
34
+ }
35
+ const dirName = path.basename(path.dirname(file));
36
+ if (meta.name !== dirName) {
37
+ fail(root, file, `name ${JSON.stringify(meta.name)} != directory ${JSON.stringify(dirName)}`);
38
+ }
39
+ const owner = meta.owner;
40
+ const ownerValid = typeof owner === "object" &&
41
+ owner !== null &&
42
+ !Array.isArray(owner) &&
43
+ "id" in owner &&
44
+ ("github" in owner || "login" in owner);
45
+ if (!ownerValid) {
46
+ fail(root, file, `owner must be an object with 'id' and 'github' or 'login'`);
47
+ }
48
+ }
49
+ function findMetadataFiles(indexDir) {
50
+ if (!fs.existsSync(indexDir))
51
+ return [];
52
+ const entries = fs.readdirSync(indexDir, { recursive: true, withFileTypes: true });
53
+ const files = [];
54
+ for (const entry of entries) {
55
+ if (entry.isFile() && entry.name === "metadata.json") {
56
+ files.push(path.join(entry.parentPath, entry.name));
57
+ }
58
+ }
59
+ return files.sort();
60
+ }
61
+ export async function compileIndex(opts) {
62
+ const { root, outDir } = opts;
63
+ const indexDir = path.join(root, "index");
64
+ const enrichDir = path.join(root, "enrich");
65
+ const packages = [];
66
+ const logos = [];
67
+ for (const file of findMetadataFiles(indexDir)) {
68
+ const meta = JSON.parse(fs.readFileSync(file, "utf8"));
69
+ validate(root, file, meta);
70
+ const ns = path
71
+ .relative(indexDir, path.dirname(path.dirname(file)))
72
+ .split(path.sep)
73
+ .join("/");
74
+ const withNamespace = { ...meta, namespace: ns };
75
+ const dataPath = path.join(enrichDir, ns, meta.name, "data.json");
76
+ let record = withNamespace;
77
+ if (fs.existsSync(dataPath)) {
78
+ const sidecar = JSON.parse(fs.readFileSync(dataPath, "utf8"));
79
+ const { descDigest: _descDigest, ...enrich } = sidecar; // internal change-probe bookkeeping — never ship
80
+ record = { ...enrich, ...withNamespace }; // index metadata wins on overlap
81
+ }
82
+ if (typeof record.logo === "string") {
83
+ const ext = record.logo.split(".").pop() ?? "";
84
+ const src = path.join(path.dirname(dataPath), `logo.${ext}`);
85
+ if (fs.existsSync(src)) {
86
+ logos.push({ src, rel: `${ns}/${record.name}.${ext}` });
87
+ }
88
+ }
89
+ packages.push(record);
90
+ }
91
+ fs.rmSync(outDir, { recursive: true, force: true });
92
+ fs.mkdirSync(outDir, { recursive: true });
93
+ fs.cpSync(indexDir, path.join(outDir, "index"), { recursive: true });
94
+ fs.writeFileSync(path.join(outDir, "all.json"), JSON.stringify(packages, null, 1) + "\n");
95
+ for (const { src, rel } of logos) {
96
+ const dst = path.join(outDir, "logos", rel);
97
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
98
+ fs.copyFileSync(src, dst);
99
+ }
100
+ const namespaces = [...new Set(packages.map((p) => p.namespace))].sort();
101
+ return { count: packages.length, namespaces };
102
+ }
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,sCAAsC;AAEtC,2EAA2E;AAC3E,2DAA2D;AAC3D,mEAAmE;AACnE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnE,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,CAAU,CAAC;AAyCpF,gFAAgF;AAChF,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW;IACnD,MAAM,IAAI,oBAAoB,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAY,EAAE,IAA6B;IACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,8BAA8B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,uBAAuB,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,UAAU,GACd,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,IAAI,IAAI,KAAK;QACb,CAAC,QAAQ,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,2DAA2D,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAoB;IACrD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAwC,EAAE,CAAC;IAEtD,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;QAClF,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE3B,MAAM,EAAE,GAAG,IAAI;aACZ,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;aACpD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,aAAa,GAA4B,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAE1E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,IAAc,EAAE,WAAW,CAAC,CAAC;QAC5E,IAAI,MAAM,GAA4B,aAAa,CAAC;QACpD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAA4B,CAAC;YACzF,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,iDAAiD;YACzG,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC,iCAAiC;QAC7E,CAAC;QAED,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC;YAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,MAAM,CAAC,IAAc,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,MAAqB,CAAC,CAAC;IACvC,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1F,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 The Grimoire Authors
3
+ export {};
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,sCAAsC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 The Grimoire Authors
3
+ export {};
4
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,sCAAsC"}
@@ -0,0 +1,6 @@
1
+ import { type CatalogPackage } from "../lib/catalog.js";
2
+ export default function Catalog({ packages, vscodeExtension, }: {
3
+ packages: CatalogPackage[];
4
+ vscodeExtension: string | null;
5
+ }): import("preact").JSX.Element;
6
+ //# sourceMappingURL=Catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Catalog.d.ts","sourceRoot":"","sources":["../../../../src/renderer/astro/components/Catalog.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAkE5E,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAC9B,QAAQ,EACR,eAAe,GAChB,EAAE;IACD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,gCAsLA"}
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { useMemo, useState } from "preact/hooks";
3
+ import { timeAgo, vscodeUrl } from "../lib/catalog.js";
4
+ // Known kinds get stable chip ordering + badge colors; unknown kinds
5
+ // (future schema growth) still render with a neutral badge.
6
+ const KNOWN_KINDS = ["skill", "rule", "agent", "mcp", "bundle"];
7
+ function kindOrder(kind) {
8
+ const i = KNOWN_KINDS.indexOf(kind);
9
+ return i === -1 ? KNOWN_KINDS.length : i;
10
+ }
11
+ // Deprecated packages sink to the bottom regardless of sort mode; the
12
+ // chosen sort only orders within the two groups.
13
+ function compare(a, b, sort) {
14
+ const dep = Number(!!a.deprecated) - Number(!!b.deprecated);
15
+ if (dep !== 0)
16
+ return dep;
17
+ if (sort === "name")
18
+ return a.name.localeCompare(b.name);
19
+ if (!a.created || !b.created)
20
+ return (a.created ? 0 : 1) - (b.created ? 0 : 1);
21
+ return new Date(b.created).getTime() - new Date(a.created).getTime();
22
+ }
23
+ // The two install scopes wear the same glyphs as the VS Code extension, so
24
+ // "project" and "global" read identically in both: codicons `root-folder`
25
+ // and `globe` (@vscode/codicons 0.0.45, CC-BY-4.0), copied as paths rather
26
+ // than pulling in the icon font for two icons.
27
+ const SCOPE_PROJECT = "M4.5 7C2.019 7 0 9.019 0 11.5C0 13.981 2.019 16 4.5 16C6.981 16 9 13.981 9 11.5C9 9.019 6.981 7 4.5 7ZM4.5 15C2.57 15 1 13.43 1 11.5C1 9.57 2.57 8 4.5 8C6.43 8 8 9.57 8 11.5C8 13.43 6.43 15 4.5 15ZM7 11.5C7 12.881 5.881 14 4.5 14C3.119 14 2 12.881 2 11.5C2 10.119 3.119 9 4.5 9C5.881 9 7 10.119 7 11.5ZM15 6.5V11.5C15 12.881 13.881 14 12.5 14H10V13H12.5C13.328 13 14 12.328 14 11.5V6.5C14 5.672 13.328 5 12.5 5H8.207L7.207 6H5.586C5.719 6 5.846 5.947 5.94 5.854L7.294 4.5L5.94 3.146C5.846 3.052 5.719 3 5.586 3H3.5C2.672 3 2 3.672 2 4.5V6H1V4.5C1 3.119 2.119 2 3.5 2H5.586C5.984 2 6.365 2.158 6.647 2.439L8.208 4H12.501C13.882 4 15.001 5.119 15.001 6.5H15Z";
28
+ const SCOPE_GLOBAL = "M8 1C4.141 1 1 4.141 1 8C1 11.859 4.141 15 8 15C11.859 15 15 11.859 15 8C15 4.141 11.859 1 8 1ZM8 14C7.422 14 6.686 12.906 6.288 11H9.713C9.315 12.906 8.579 14 8.001 14H8ZM6.121 10C6.044 9.392 6 8.723 6 8C6 7.277 6.044 6.608 6.121 6H9.878C9.955 6.608 9.999 7.277 9.999 8C9.999 8.723 9.955 9.392 9.878 10H6.121ZM2 8C2 7.299 2.121 6.626 2.343 6H5.121C5.041 6.656 5 7.332 5 8C5 8.668 5.041 9.344 5.121 10H2.343C2.121 9.374 2 8.701 2 8ZM8 2C8.578 2 9.314 3.094 9.712 5H6.287C6.685 3.094 7.422 2 8 2ZM10.879 6H13.657C13.879 6.626 14 7.299 14 8C14 8.701 13.879 9.374 13.657 10H10.879C10.959 9.344 11 8.668 11 8C11 7.332 10.959 6.656 10.879 6ZM13.195 5H10.722C10.516 3.938 10.199 2.98 9.775 2.268C11.228 2.719 12.446 3.707 13.195 5ZM6.226 2.268C5.802 2.98 5.484 3.938 5.279 5H2.806C3.556 3.707 4.774 2.718 6.226 2.268ZM2.805 11H5.278C5.484 12.062 5.801 13.02 6.225 13.732C4.772 13.281 3.554 12.293 2.805 11ZM9.774 13.732C10.198 13.02 10.516 12.062 10.721 11H13.194C12.444 12.293 11.226 13.282 9.774 13.732Z";
29
+ const CHECK = "M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.75.75 0 1 1 1.06-1.06L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z";
30
+ function CopyButton({ command, variant = "default", }) {
31
+ const [copied, setCopied] = useState(false);
32
+ const copy = () => {
33
+ navigator.clipboard.writeText(command).then(() => {
34
+ setCopied(true);
35
+ setTimeout(() => setCopied(false), 1500);
36
+ });
37
+ };
38
+ return (_jsx("button", { type: "button", class: copied ? "copy copied" : "copy", title: command, "aria-label": `Copy: ${command}`, onClick: copy, children: _jsx("svg", { viewBox: "0 0 16 16", width: "14", height: "14", fill: "currentColor", "aria-hidden": "true", children: _jsx("path", { d: copied ? CHECK : variant === "global" ? SCOPE_GLOBAL : SCOPE_PROJECT }) }) }));
39
+ }
40
+ // `vscodeExtension` arrives as a prop, not from lib/data: this island
41
+ // hydrates in the browser, so importing the build-time payload here would
42
+ // ship the whole catalog twice.
43
+ export default function Catalog({ packages, vscodeExtension, }) {
44
+ const [query, setQuery] = useState("");
45
+ const [kind, setKind] = useState(null);
46
+ const [sort, setSort] = useState("name");
47
+ const kinds = useMemo(() => {
48
+ const counts = new Map();
49
+ for (const p of packages)
50
+ counts.set(p.kind, (counts.get(p.kind) ?? 0) + 1);
51
+ return [...counts.entries()].sort((a, b) => kindOrder(a[0]) - kindOrder(b[0]) || a[0].localeCompare(b[0]));
52
+ }, [packages]);
53
+ const q = query.trim().toLowerCase();
54
+ const shown = packages
55
+ .filter((p) => {
56
+ if (kind && p.kind !== kind)
57
+ return false;
58
+ if (!q)
59
+ return true;
60
+ return [
61
+ p.name,
62
+ p.description ?? "",
63
+ p.namespace,
64
+ p.kind,
65
+ p.ref,
66
+ p.summary ?? "",
67
+ (p.keywords ?? []).join(" "),
68
+ ].some((field) => field.toLowerCase().includes(q));
69
+ })
70
+ .sort((a, b) => compare(a, b, sort));
71
+ return (_jsxs("section", { children: [_jsxs("div", { class: "controls", children: [_jsx("input", { type: "search", placeholder: `Search ${packages.length} packages…`, value: query, onInput: (e) => setQuery(e.target.value), "aria-label": "Search packages" }), _jsxs("div", { class: "chips", role: "group", "aria-label": "Sort by", children: [_jsx("button", { type: "button", class: sort === "name" ? "chip active" : "chip", onClick: () => setSort("name"), children: "name" }), _jsx("button", { type: "button", class: sort === "updated" ? "chip active" : "chip", onClick: () => setSort("updated"), children: "updated" })] }), _jsxs("div", { class: "chips", role: "group", "aria-label": "Filter by kind", children: [_jsxs("button", { type: "button", class: kind === null ? "chip active" : "chip", onClick: () => setKind(null), children: ["all ", _jsx("small", { children: packages.length })] }), kinds.map(([k, count]) => (_jsxs("button", { type: "button", class: kind === k ? `chip active kind-${k}` : `chip kind-${k}`, onClick: () => setKind(kind === k ? null : k), children: [k, " ", _jsx("small", { children: count })] }, k)))] })] }), shown.length === 0 ? (_jsx("p", { class: "empty", children: "No packages match." })) : (_jsx("ul", { class: "grid", children: shown.map((p) => (_jsxs("li", { class: "card", children: [_jsxs("div", { class: "card-head", children: [p.logo ? (_jsx("img", { class: "card-logo", src: p.logo, alt: "", loading: "lazy" })) : (_jsx("span", { class: "card-logo card-logo-fallback", "aria-hidden": "true", style: { background: `var(--kind-${p.kind}, var(--muted))` }, children: p.name[0]?.toUpperCase() })), _jsx("h2", { children: _jsx("a", { href: `/p/${p.namespace}/${p.name}/`, children: p.name }) }), p.deprecated ? (_jsx("span", { class: "badge deprecated", children: "deprecated" })) : (_jsx("span", { class: `badge kind-${p.kind}`, children: p.kind }))] }), _jsx("p", { class: "namespace", children: p.namespace }), (p.version || p.license || p.created) && (_jsxs("div", { class: "meta-row", children: [p.version && _jsxs("span", { class: "pill version", children: ["v", p.version] }), p.license && _jsx("span", { class: "pill license", children: p.license }), p.created && timeAgo(p.created) && (_jsxs("time", { class: "updated", datetime: p.created, title: p.created, children: ["updated ", timeAgo(p.created)] }))] })), p.deprecated && (_jsxs("p", { class: "deprecated-strip", children: ["deprecated", p.replacedBy ? ` — replaced by ${p.replacedBy}` : ""] })), p.description && _jsx("p", { class: "description", children: p.description }), p.keywords && p.keywords.length > 0 && (_jsxs("div", { class: "keywords", children: [p.keywords.slice(0, 5).map((kw) => (_jsx("button", { type: "button", class: "chip keyword", onClick: () => setQuery(kw), children: kw }, kw))), p.keywords.length > 5 && (_jsxs("span", { class: "chip keyword overflow", children: ["+", p.keywords.length - 5] }))] })), _jsxs("div", { class: "card-foot", children: [_jsxs("div", { class: "copy-group", children: [_jsx(CopyButton, { command: `grim add ${p.ref}` }), _jsx(CopyButton, { command: `grim add --global ${p.ref}`, variant: "global" }), vscodeUrl(vscodeExtension, p.ref) && (_jsx("a", { class: "copy vscode", href: vscodeUrl(vscodeExtension, p.ref), title: "Open in VS Code", "aria-label": `Open ${p.name} in VS Code`, children: _jsx("svg", { viewBox: "0 0 24 24", width: "16", height: "16", "aria-hidden": "true", children: _jsx("path", { fill: "currentColor", d: "M23.15 2.587L18.21.21a1.494 1.494 0 0 0-1.705.29l-9.46 8.63-4.12-3.128a.999.999 0 0 0-1.276.057L.327 7.261A1 1 0 0 0 .326 8.74L3.899 12l-3.573 3.26a1 1 0 0 0 .001 1.479L1.65 17.94a.999.999 0 0 0 1.276.057l4.12-3.128 9.46 8.63a1.492 1.492 0 0 0 1.704.29l4.942-2.377A1.5 1.5 0 0 0 24 20.06V3.939a1.5 1.5 0 0 0-.85-1.352zm-5.146 14.861L10.826 12l7.178-5.448v10.896z" }) }) }))] }), p.repository && (_jsx("a", { class: "source", href: p.repository, target: "_blank", rel: "noopener noreferrer", children: "source" }))] })] }, `${p.namespace}/${p.name}`))) }))] }));
72
+ }
73
+ //# sourceMappingURL=Catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Catalog.js","sourceRoot":"","sources":["../../../../src/renderer/astro/components/Catalog.tsx"],"names":[],"mappings":"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"}