@stigmer/plugin-package 3.18.1-dev.20260919070736 → 3.19.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.
@@ -1,37 +1,34 @@
1
1
  /**
2
- * The sources every client lists without being told: Stigmer's official
3
- * catalogue and the three vendors' public ones.
2
+ * The one source every client lists without being told: Stigmer's official
3
+ * catalogue.
4
4
  *
5
- * The product's promise is "bring your Cursor, Claude Code or Codex
6
- * plugin", so the catalogues those vendors publish are on offer from the
7
- * first screen, in the console's Marketplace and in `stigmer marketplace
8
- * list`, without a user having to know a repository slug. They are code,
9
- * not stored state: a client's remembered sources hold only what the user
10
- * added, so the two clients cannot drift from each other and a vendor
11
- * moving its repository is one release, not a migration. The names are
12
- * reserved the way the official one is; a user can neither add nor remove
13
- * them.
5
+ * The catalogue is curated (`plugins/README.md`, "What the catalogue holds"):
6
+ * every entry is one Stigmer may ship and one whose servers Stigmer can
7
+ * connect to, vendored from a publisher's redistributable set or authored
8
+ * by Stigmer for a vendor's public endpoint. The vendors' own repositories
9
+ * were built in for one release and were taken out again when the audit
10
+ * behind the catalogue measured that more than half of their entries fail
11
+ * that bar: a chip that offers what the catalogue left out re-surfaces
12
+ * what curation removed. A user who wants another catalogue adds it as a
13
+ * source of his own (a repository with a marketplace file, read from
14
+ * GitHub), in the console's Manage sources or with `stigmer marketplace
15
+ * add`; the vendors' repositories are ordinary candidates for that, at the
16
+ * user's word, never on offer by default.
14
17
  *
15
- * Each vendor keeps its marketplace file at the repository root in its own
16
- * location, all four of which `readMarketplace` reads (`.cursor-plugin/`,
17
- * `.claude-plugin/`, `.agents/plugins/`). Measured on 2026-09-18 through
18
- * the GitHub Trees API: 1,168, 1,594 and 7,746 entries respectively, none
19
- * truncated, all under the console's 20,000-entry listing cap; Codex's
20
- * catalogue names its entries as `{source: "local", path}` objects, which
21
- * the reader accepts, and three of its 65 as remote sources, which it
22
- * drops with its own sentence.
18
+ * The list is code, not stored state: a client's remembered sources hold
19
+ * only what the user added, so the two clients cannot drift from each
20
+ * other. The official name is reserved the way it always was; a user can
21
+ * neither add over it nor remove it.
23
22
  */
24
23
  import type { GitHubMarketplaceSource } from "./refs.js";
25
- /** A source a client ships with: named, described for a section heading, and either the official catalogue or a public GitHub tree. */
24
+ /** A source a client ships with: named, and either the official catalogue or a public GitHub tree. */
26
25
  export interface BuiltInMarketplace {
27
26
  readonly name: string;
28
- /** One sentence for the Marketplace's section heading and `marketplace list`. */
29
- readonly description: string;
30
27
  readonly source: {
31
28
  readonly type: "official";
32
29
  } | GitHubMarketplaceSource;
33
30
  }
34
- /** In listing order: the official catalogue first, then the vendors in the order the product names them. */
31
+ /** In listing order. Today one entry; the type keeps the shape a future built-in would take. */
35
32
  export declare const BUILT_IN_MARKETPLACES: readonly BuiltInMarketplace[];
36
33
  /** Whether `name` is one a user may neither add nor remove. */
37
34
  export declare function isBuiltInMarketplaceName(name: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/client/builtin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAGzD,uIAAuI;AACvI,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,uBAAuB,CAAC;CAC1E;AAED,4GAA4G;AAC5G,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAqB9D,CAAC;AAIF,+DAA+D;AAC/D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAWhF"}
1
+ {"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/client/builtin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAGzD,sGAAsG;AACtG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,uBAAuB,CAAC;CAC1E;AAED,gGAAgG;AAChG,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAK9D,CAAC;AAIF,+DAA+D;AAC/D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAWhF"}
package/client/builtin.js CHANGED
@@ -1,49 +1,32 @@
1
1
  /**
2
- * The sources every client lists without being told: Stigmer's official
3
- * catalogue and the three vendors' public ones.
2
+ * The one source every client lists without being told: Stigmer's official
3
+ * catalogue.
4
4
  *
5
- * The product's promise is "bring your Cursor, Claude Code or Codex
6
- * plugin", so the catalogues those vendors publish are on offer from the
7
- * first screen, in the console's Marketplace and in `stigmer marketplace
8
- * list`, without a user having to know a repository slug. They are code,
9
- * not stored state: a client's remembered sources hold only what the user
10
- * added, so the two clients cannot drift from each other and a vendor
11
- * moving its repository is one release, not a migration. The names are
12
- * reserved the way the official one is; a user can neither add nor remove
13
- * them.
5
+ * The catalogue is curated (`plugins/README.md`, "What the catalogue holds"):
6
+ * every entry is one Stigmer may ship and one whose servers Stigmer can
7
+ * connect to, vendored from a publisher's redistributable set or authored
8
+ * by Stigmer for a vendor's public endpoint. The vendors' own repositories
9
+ * were built in for one release and were taken out again when the audit
10
+ * behind the catalogue measured that more than half of their entries fail
11
+ * that bar: a chip that offers what the catalogue left out re-surfaces
12
+ * what curation removed. A user who wants another catalogue adds it as a
13
+ * source of his own (a repository with a marketplace file, read from
14
+ * GitHub), in the console's Manage sources or with `stigmer marketplace
15
+ * add`; the vendors' repositories are ordinary candidates for that, at the
16
+ * user's word, never on offer by default.
14
17
  *
15
- * Each vendor keeps its marketplace file at the repository root in its own
16
- * location, all four of which `readMarketplace` reads (`.cursor-plugin/`,
17
- * `.claude-plugin/`, `.agents/plugins/`). Measured on 2026-09-18 through
18
- * the GitHub Trees API: 1,168, 1,594 and 7,746 entries respectively, none
19
- * truncated, all under the console's 20,000-entry listing cap; Codex's
20
- * catalogue names its entries as `{source: "local", path}` objects, which
21
- * the reader accepts, and three of its 65 as remote sources, which it
22
- * drops with its own sentence.
18
+ * The list is code, not stored state: a client's remembered sources hold
19
+ * only what the user added, so the two clients cannot drift from each
20
+ * other. The official name is reserved the way it always was; a user can
21
+ * neither add over it nor remove it.
23
22
  */
24
23
  import { OFFICIAL_MARKETPLACE_NAME } from "./refs.js";
25
- /** In listing order: the official catalogue first, then the vendors in the order the product names them. */
24
+ /** In listing order. Today one entry; the type keeps the shape a future built-in would take. */
26
25
  export const BUILT_IN_MARKETPLACES = [
27
26
  {
28
27
  name: OFFICIAL_MARKETPLACE_NAME,
29
- description: "Stigmer's official catalogue, published with each release.",
30
28
  source: { type: "official" },
31
29
  },
32
- {
33
- name: "cursor-plugins",
34
- description: "Cursor's public plugin catalogue.",
35
- source: { type: "github", repo: "cursor/plugins" },
36
- },
37
- {
38
- name: "claude-code-plugins",
39
- description: "Claude Code's public plugin catalogue.",
40
- source: { type: "github", repo: "anthropics/claude-code" },
41
- },
42
- {
43
- name: "codex-plugins",
44
- description: "Codex's public plugin catalogue.",
45
- source: { type: "github", repo: "openai/plugins" },
46
- },
47
30
  ];
48
31
  const BUILT_IN_NAMES = new Set(BUILT_IN_MARKETPLACES.map((entry) => entry.name));
49
32
  /** Whether `name` is one a user may neither add nor remove. */
@@ -1 +1 @@
1
- {"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../src/client/builtin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAUtD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,4DAA4D;QACzE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;KAC7B;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,mCAAmC;QAChD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;KACnD;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,wCAAwC;QACrD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,wBAAwB,EAAE;KAC3D;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,kCAAkC;QAC/C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;KACnD;CACF,CAAC;AAEF,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAEtG,+DAA+D;AAC/D,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,GAAqB;IACtE,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,IAAI,IAAI,6EAA6E,CAAC;QAC/F,KAAK,QAAQ;YACX,OAAO,IAAI,IAAI,8CAA8C,CAAC;QAChE,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,UAAU,GAAU,GAAG,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../src/client/builtin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAQtD,gGAAgG;AAChG,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE;QACE,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;KAC7B;CACF,CAAC;AAEF,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAEtG,+DAA+D;AAC/D,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,GAAqB;IACtE,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,IAAI,IAAI,6EAA6E,CAAC;QAC/F,KAAK,QAAQ;YACX,OAAO,IAAI,IAAI,8CAA8C,CAAC;QAChE,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,UAAU,GAAU,GAAG,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -99,11 +99,29 @@ export declare function readMcpSources(object: JsonObject, field: string, path:
99
99
  export declare const IGNORED_FIELD_KINDS: Readonly<Record<string, IgnoredComponentKind>>;
100
100
  export declare function ignoredFieldComponents(object: JsonObject, path: string): IgnoredComponent[];
101
101
  /**
102
- * `extensions` in a root manifest: every namespace with content is an
103
- * ignored component (a client ignores namespaces it does not implement
104
- * without validating them); an empty object, including Stigmer's own
105
- * reserved `ai.stigmer`, is silent. A non-object `extensions` is the open
106
- * format's one non-fatal type violation: reported and ignored.
102
+ * Stigmer's own namespace under a root manifest's `extensions`. The open
103
+ * format has no appearance fields, so this is where an open-format plugin
104
+ * says what a storefront card shows: the same three the Cursor manifest
105
+ * carries at its top level, read by `presentation.ts` and treated by the
106
+ * install exactly as Cursor's are (`logo` an ignored component, because
107
+ * nothing in an Organization carries the image; `displayName` and
108
+ * `category` silent). The overlay FOLDER `ai.stigmer/` (`normalise/overlay.ts`)
109
+ * is the same name in a different place: resources there, appearance here.
110
+ */
111
+ export declare const STIGMER_EXTENSION_NAMESPACE = "ai.stigmer";
112
+ export declare const STIGMER_EXTENSION_FIELDS: ReadonlySet<string>;
113
+ /** The `ai.stigmer` extension object of a root manifest, or `undefined` when absent or not an object. */
114
+ export declare function stigmerExtensionOf(object: JsonObject): JsonObject | undefined;
115
+ /**
116
+ * `extensions` in a root manifest: every foreign namespace with content is
117
+ * an ignored component (a client ignores namespaces it does not implement
118
+ * without validating them); an empty object is silent. Stigmer's own
119
+ * namespace is read field by field: `logo` is recorded as the `logo`
120
+ * component Cursor's would be, the other appearance fields are silent, and
121
+ * any field beyond `STIGMER_EXTENSION_FIELDS` makes the namespace an
122
+ * ignored `extension` component so a misspelled key stays visible. A
123
+ * non-object `extensions` is the open format's one non-fatal type
124
+ * violation: reported and ignored.
107
125
  */
108
126
  export declare function extensionComponents(object: JsonObject, path: string, findings: Findings): IgnoredComponent[];
109
127
  //# sourceMappingURL=manifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/dialects/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/dialects/manifest.ts"],"names":[],"mappings":"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"}
@@ -169,11 +169,35 @@ const EXPERIMENTAL_KINDS = {
169
169
  evals: "evals",
170
170
  };
171
171
  /**
172
- * `extensions` in a root manifest: every namespace with content is an
173
- * ignored component (a client ignores namespaces it does not implement
174
- * without validating them); an empty object, including Stigmer's own
175
- * reserved `ai.stigmer`, is silent. A non-object `extensions` is the open
176
- * format's one non-fatal type violation: reported and ignored.
172
+ * Stigmer's own namespace under a root manifest's `extensions`. The open
173
+ * format has no appearance fields, so this is where an open-format plugin
174
+ * says what a storefront card shows: the same three the Cursor manifest
175
+ * carries at its top level, read by `presentation.ts` and treated by the
176
+ * install exactly as Cursor's are (`logo` an ignored component, because
177
+ * nothing in an Organization carries the image; `displayName` and
178
+ * `category` silent). The overlay FOLDER `ai.stigmer/` (`normalise/overlay.ts`)
179
+ * is the same name in a different place: resources there, appearance here.
180
+ */
181
+ export const STIGMER_EXTENSION_NAMESPACE = "ai.stigmer";
182
+ export const STIGMER_EXTENSION_FIELDS = new Set(["displayName", "logo", "category"]);
183
+ /** The `ai.stigmer` extension object of a root manifest, or `undefined` when absent or not an object. */
184
+ export function stigmerExtensionOf(object) {
185
+ const extensions = object["extensions"];
186
+ if (!isJsonObject(extensions))
187
+ return undefined;
188
+ const content = extensions[STIGMER_EXTENSION_NAMESPACE];
189
+ return isJsonObject(content) ? content : undefined;
190
+ }
191
+ /**
192
+ * `extensions` in a root manifest: every foreign namespace with content is
193
+ * an ignored component (a client ignores namespaces it does not implement
194
+ * without validating them); an empty object is silent. Stigmer's own
195
+ * namespace is read field by field: `logo` is recorded as the `logo`
196
+ * component Cursor's would be, the other appearance fields are silent, and
197
+ * any field beyond `STIGMER_EXTENSION_FIELDS` makes the namespace an
198
+ * ignored `extension` component so a misspelled key stays visible. A
199
+ * non-object `extensions` is the open format's one non-fatal type
200
+ * violation: reported and ignored.
177
201
  */
178
202
  export function extensionComponents(object, path, findings) {
179
203
  const value = object["extensions"];
@@ -187,7 +211,15 @@ export function extensionComponents(object, path, findings) {
187
211
  for (const [namespace, content] of fields(value)) {
188
212
  if (isJsonObject(content) && fields(content).length === 0)
189
213
  continue;
190
- ignored.push({ kind: "extension", path: `${path}#extensions.${namespace}` });
214
+ const at = `${path}#extensions.${namespace}`;
215
+ if (namespace === STIGMER_EXTENSION_NAMESPACE && isJsonObject(content)) {
216
+ if (content["logo"] !== undefined)
217
+ ignored.push({ kind: "logo", path: `${at}.logo` });
218
+ if (fields(content).some(([name]) => !STIGMER_EXTENSION_FIELDS.has(name)))
219
+ ignored.push({ kind: "extension", path: at });
220
+ continue;
221
+ }
222
+ ignored.push({ kind: "extension", path: at });
191
223
  }
192
224
  return ignored;
193
225
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/dialects/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/dialects/manifest.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,9 @@
8
8
  * so this manifest declares no paths and no inline servers; `mcp.json` is
9
9
  * read under the open format's rules by `detect.ts` when it exists.
10
10
  * Client-specific data belongs under `extensions`, which Stigmer records as
11
- * ignored per namespace (its own `ai.stigmer` namespace is reserved and
12
- * empty today).
11
+ * ignored per foreign namespace; its own `ai.stigmer` namespace carries the
12
+ * appearance fields a storefront card shows (`manifest.ts`,
13
+ * `STIGMER_EXTENSION_FIELDS`), the open format's only place for them.
13
14
  */
14
15
  import { type JsonObject } from "../documents.js";
15
16
  import { type Findings } from "../messages.js";
@@ -1 +1 @@
1
- {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/dialects/open.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAiC,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,KAAK,eAAe,EAAwD,MAAM,eAAe,CAAC;AAe3G,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAgBtG"}
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/dialects/open.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAiC,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,KAAK,eAAe,EAAwD,MAAM,eAAe,CAAC;AAe3G,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAgBtG"}
package/dialects/open.js CHANGED
@@ -8,8 +8,9 @@
8
8
  * so this manifest declares no paths and no inline servers; `mcp.json` is
9
9
  * read under the open format's rules by `detect.ts` when it exists.
10
10
  * Client-specific data belongs under `extensions`, which Stigmer records as
11
- * ignored per namespace (its own `ai.stigmer` namespace is reserved and
12
- * empty today).
11
+ * ignored per foreign namespace; its own `ai.stigmer` namespace carries the
12
+ * appearance fields a storefront card shows (`manifest.ts`,
13
+ * `STIGMER_EXTENSION_FIELDS`), the open format's only place for them.
13
14
  */
14
15
  import { describeValue } from "../documents.js";
15
16
  import { AGENT_PLUGINS_MANIFEST_SCHEMA } from "../messages.js";
@@ -1 +1 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/dialects/open.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAiB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAwB,mBAAmB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE3G,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC;IAChD,SAAS;IACT,MAAM;IACN,SAAS;IACT,aAAa;IACb,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;IACT,UAAU;IACV,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,IAAY,EAAE,QAAkB;IACnF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,QAAQ,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,MAAM,KAAK,6BAA6B,EAAE,CAAC;QACpD,QAAQ,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,IAAI;QACJ,QAAQ,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;QAC9C,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;KACrD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/dialects/open.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAiB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAwB,mBAAmB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE3G,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC;IAChD,SAAS;IACT,MAAM;IACN,SAAS;IACT,aAAa;IACb,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;IACT,UAAU;IACV,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,IAAY,EAAE,QAAkB;IACnF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,QAAQ,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,MAAM,KAAK,6BAA6B,EAAE,CAAC;QACpD,QAAQ,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,IAAI;QACJ,QAAQ,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;QAC9C,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;KACrD,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stigmer/plugin-package",
3
- "version": "3.18.1-dev.20260919070736",
3
+ "version": "3.19.0",
4
4
  "description": "Reads an Agent Plugins package — the open 1.0.0 format and the Cursor, Claude Code and Codex dialects — into one normalised description of what Stigmer would install, refusing with one sentence per problem what Stigmer cannot carry; pure over an in-memory file reader, shared by the CLI's offline validation and the server's install. The ./client entry is what every installing client does identically: file selection, the deterministic archive and its digest, the marketplace grammars",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
package/presentation.d.ts CHANGED
@@ -17,9 +17,10 @@
17
17
  * manifest that carries each; the presentation fields come from the
18
18
  * dialects that define them: Cursor's top-level `displayName`, `logo` and
19
19
  * `category`; the legacy Codex manifest's `interface.displayName`,
20
- * `interface.logo` and `interface.category`. Claude Code's manifest and the
21
- * open format define none, and a logo rule for the `ai.stigmer` extension
22
- * namespace waits for the first official plugin that needs one.
20
+ * `interface.logo` and `interface.category`; the open format's
21
+ * `extensions["ai.stigmer"]` with the same three names, the one place that
22
+ * format leaves a client for them (Stigmer's authored catalogue plugins are
23
+ * its first users). Claude Code's manifest defines none.
23
24
  *
24
25
  * A logo is a path inside the plugin, and the card that shows it fetches it
25
26
  * by URL from wherever the tree lives. So the path is kept only when it is
@@ -1 +1 @@
1
- {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EAAwE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAGpH,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAE9D,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qGAAqG;IACrG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAKD,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,kBAAkB,CAc7E"}
1
+ {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAIH,OAAO,EAAwE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAGpH,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAE9D,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qGAAqG;IACrG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAKD,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,kBAAkB,CAc7E"}
package/presentation.js CHANGED
@@ -17,9 +17,10 @@
17
17
  * manifest that carries each; the presentation fields come from the
18
18
  * dialects that define them: Cursor's top-level `displayName`, `logo` and
19
19
  * `category`; the legacy Codex manifest's `interface.displayName`,
20
- * `interface.logo` and `interface.category`. Claude Code's manifest and the
21
- * open format define none, and a logo rule for the `ai.stigmer` extension
22
- * namespace waits for the first official plugin that needs one.
20
+ * `interface.logo` and `interface.category`; the open format's
21
+ * `extensions["ai.stigmer"]` with the same three names, the one place that
22
+ * format leaves a client for them (Stigmer's authored catalogue plugins are
23
+ * its first users). Claude Code's manifest defines none.
23
24
  *
24
25
  * A logo is a path inside the plugin, and the card that shows it fetches it
25
26
  * by URL from wherever the tree lives. So the path is kept only when it is
@@ -34,6 +35,7 @@
34
35
  * installed" line is true until the stored plugin does.
35
36
  */
36
37
  import { MANIFEST_PRECEDENCE } from "./detect.js";
38
+ import { stigmerExtensionOf } from "./dialects/manifest.js";
37
39
  import { decodeUtf8, isContainedPath, PLUGIN_DOCUMENT_LIMITS, PluginFileIndex } from "./files.js";
38
40
  import { isJsonObject } from "./documents.js";
39
41
  import { MANIFEST_LOCATIONS } from "./messages.js";
@@ -87,7 +89,10 @@ function contributionOf(dialect, object, index) {
87
89
  const surface = object["interface"];
88
90
  return isJsonObject(surface) ? { ...identity, ...appearanceOf(surface, index) } : identity;
89
91
  }
90
- case "agent-plugins":
92
+ case "agent-plugins": {
93
+ const extension = stigmerExtensionOf(object);
94
+ return extension === undefined ? identity : { ...identity, ...appearanceOf(extension, index) };
95
+ }
91
96
  case "claude":
92
97
  return identity;
93
98
  default: {
@@ -105,7 +110,7 @@ function identityOf(object) {
105
110
  ...(author !== undefined && { author }),
106
111
  };
107
112
  }
108
- /** `displayName`, `logo` and `category` from an object that carries them at its top level (a Cursor manifest, a Codex `interface`). */
113
+ /** `displayName`, `logo` and `category` from an object that carries them at its top level (a Cursor manifest, a Codex `interface`, an open manifest's `extensions["ai.stigmer"]`). */
109
114
  function appearanceOf(object, index) {
110
115
  const logo = logoPath(object["logo"], index);
111
116
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"presentation.js","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presentation.js","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"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"}
@@ -153,15 +153,11 @@ describe("rerootSingleDirectory", () => {
153
153
  });
154
154
 
155
155
  describe("BUILT_IN_MARKETPLACES", () => {
156
- it("lists the official catalogue first, then the three vendors, each a reserved name", () => {
157
- expect(BUILT_IN_MARKETPLACES.map((entry) => entry.name)).toEqual([
158
- OFFICIAL_MARKETPLACE_NAME,
159
- "cursor-plugins",
160
- "claude-code-plugins",
161
- "codex-plugins",
162
- ]);
156
+ it("lists the official catalogue alone, a reserved name; a vendor's repository is a source the user adds", () => {
157
+ expect(BUILT_IN_MARKETPLACES.map((entry) => entry.name)).toEqual([OFFICIAL_MARKETPLACE_NAME]);
163
158
  expect(BUILT_IN_MARKETPLACES[0]?.source).toEqual({ type: "official" });
164
159
  for (const entry of BUILT_IN_MARKETPLACES) expect(isBuiltInMarketplaceName(entry.name)).toBe(true);
160
+ expect(isBuiltInMarketplaceName("cursor-plugins")).toBe(false);
165
161
  expect(isBuiltInMarketplaceName("acme-plugins")).toBe(false);
166
162
  });
167
163
  });
@@ -4,12 +4,14 @@
4
4
  * list (the console's edge) yields one digest, and that digest is the one
5
5
  * the CLI produced before this module existed.
6
6
  *
7
- * The two constants below were computed with the unmodified CLI at
8
- * `d75b0724a` (`preparePluginPush` over `plugins/assistant` and over the
9
- * vendored `thermos` fixture). `8d1000b4…` is also the digest the live
10
- * `assistant` plugin carried after `stigmer up` in that release. If either
11
- * changes, every installed plugin would look like an upgrade; this test is
12
- * the tripwire.
7
+ * The frozen constant below was computed with the unmodified CLI at
8
+ * `d75b0724a` (`preparePluginPush` over the vendored `thermos` fixture,
9
+ * whose bytes never change). If it changes, every installed plugin would
10
+ * look like an upgrade; this test is the tripwire. The catalogue's own
11
+ * `plugins/assistant` is read too, but its content is allowed to evolve (a
12
+ * manifest edit is an upgrade by design), so its cases pin the identity
13
+ * discipline (the directory edge and the in-memory edge agree on one
14
+ * digest, and the selection is exactly its files) rather than a constant.
13
15
  *
14
16
  * The selection cases pin the walk order (component-wise, directories and
15
17
  * files interleaved by name), the whole-subtree skip of an ignored
@@ -29,7 +31,6 @@ const FIXTURES = fileURLToPath(new URL("./fixtures/cursor-plugins/", import.meta
29
31
  const REPO_PLUGINS = fileURLToPath(new URL("../../../../../../plugins/", import.meta.url));
30
32
 
31
33
  const BASELINE = {
32
- assistant: "8d1000b4a48136a8530509f603805693fc2478d279962d4fade40716435064ce",
33
34
  thermos: "51bc4e5450e24762bb8515765c76bfe262f65c57f9afeda015c5818038396d5a",
34
35
  } as const;
35
36
 
@@ -67,7 +68,7 @@ function inMemory(files: Record<string, string>): { candidates: CandidateFile[];
67
68
  const RESPECT = { respectGitignore: true };
68
69
 
69
70
  describe("parity with the CLI's original walk", () => {
70
- it("plugins/assistant archives to the digest stigmer up installed", async () => {
71
+ it("plugins/assistant selects exactly its files, in walk order", () => {
71
72
  const { candidates, read } = listDirectory(`${REPO_PLUGINS}assistant`);
72
73
  const selection = selectPluginFiles(candidates, read, RESPECT);
73
74
  expect(selection.files.entries.map((entry) => entry.path)).toEqual([
@@ -75,7 +76,6 @@ describe("parity with the CLI's original walk", () => {
75
76
  "icon.svg",
76
77
  "plugin.json",
77
78
  ]);
78
- expect(await digestArchive(archivePlugin(selection.files))).toBe(BASELINE.assistant);
79
79
  });
80
80
 
81
81
  it("the thermos fixture archives to the CLI's digest", async () => {
@@ -85,13 +85,15 @@ describe("parity with the CLI's original walk", () => {
85
85
  expect(await digestArchive(archivePlugin(selection.files))).toBe(BASELINE.thermos);
86
86
  });
87
87
 
88
- it("the same bytes from an in-memory listing yield the same digest", async () => {
88
+ it("the same bytes from a directory and from an in-memory listing yield one digest", async () => {
89
89
  const dir = listDirectory(`${REPO_PLUGINS}assistant`);
90
+ const fromDirectory = await digestArchive(archivePlugin(selectPluginFiles(dir.candidates, dir.read, RESPECT).files));
90
91
  const memory = inMemory(
91
92
  Object.fromEntries(dir.candidates.map((c) => [c.path, new TextDecoder().decode(dir.read(c.path))])),
92
93
  );
93
- const selection = selectPluginFiles(memory.candidates, memory.read, RESPECT);
94
- expect(await digestArchive(archivePlugin(selection.files))).toBe(BASELINE.assistant);
94
+ const fromMemory = await digestArchive(archivePlugin(selectPluginFiles(memory.candidates, memory.read, RESPECT).files));
95
+ expect(fromMemory).toBe(fromDirectory);
96
+ expect(fromDirectory).toMatch(/^[0-9a-f]{64}$/);
95
97
  });
96
98
  });
97
99
 
@@ -126,6 +126,17 @@ describe("unknown and mistyped fields", () => {
126
126
  expect(plugin.ignored).toEqual([{ kind: "extension", path: "plugin.json#extensions.com.openai" }]);
127
127
  });
128
128
 
129
+ it("reads ai.stigmer's appearance fields the way Cursor's are read: the logo an ignored component, the rest silent", () => {
130
+ const plugin = accepted(read(openPlugin({ manifest: { extensions: { "ai.stigmer": { displayName: "Linear", logo: "assets/logo.png", category: "integrations" } } } })));
131
+ expect(plugin.ignored).toEqual([{ kind: "logo", path: "plugin.json#extensions.ai.stigmer.logo" }]);
132
+ expect(kindsOf(read(openPlugin({ manifest: { extensions: { "ai.stigmer": { displayName: "Linear" } } } })))).toEqual({ errors: [], warnings: [] });
133
+ });
134
+
135
+ it("a field ai.stigmer does not define makes the namespace an ignored extension, so a misspelling stays visible", () => {
136
+ const plugin = accepted(read(openPlugin({ manifest: { extensions: { "ai.stigmer": { displayname: "Linear" } } } })));
137
+ expect(plugin.ignored).toEqual([{ kind: "extension", path: "plugin.json#extensions.ai.stigmer" }]);
138
+ });
139
+
129
140
  it("warns on a non-object extensions field and keeps reading", () => {
130
141
  const outcome = read(openPlugin({ manifest: { extensions: "nope" } }));
131
142
  expect(kindsOf(outcome)).toEqual({ errors: [], warnings: ["manifest-extensions-invalid"] });
@@ -4,7 +4,9 @@
4
4
  * Pins: the vendored Cursor fixtures yield their `displayName`, `logo`,
5
5
  * `category` and author (thermos, a PNG; playwright, an SVG); a Codex
6
6
  * manifest yields the same fields from `interface`, with the `./` spelling
7
- * stripped; a Claude manifest and an open manifest yield identity only; a
7
+ * stripped; a Claude manifest yields identity only, and so does an open
8
+ * manifest until it carries `extensions["ai.stigmer"]`, which speaks the
9
+ * same three fields under the same logo rules; a
8
10
  * root manifest names the plugin ahead of a vendor manifest beside it,
9
11
  * while the vendor manifest still lends its appearance; a logo that is
10
12
  * absent from the listing, over the cap, not an image, a URL or an escape
@@ -75,7 +77,7 @@ describe("the dialects that carry appearance", () => {
75
77
  expect(present(files)).toEqual({ displayName: "Airtable", logo: "assets/logo.png", category: "Productivity", version: "6.0.1" });
76
78
  });
77
79
 
78
- it("a Claude manifest and an open manifest yield identity only", () => {
80
+ it("a Claude manifest and an open manifest without the extension yield identity only", () => {
79
81
  expect(present(claudePlugin({ version: "1.0.0", description: "Reviews pull requests.", manifest: { author: { name: "Anthropic" } } }))).toEqual({
80
82
  version: "1.0.0",
81
83
  description: "Reviews pull requests.",
@@ -87,6 +89,29 @@ describe("the dialects that carry appearance", () => {
87
89
  expect(open.version).toBe("2.0.0");
88
90
  });
89
91
 
92
+ it("an open manifest speaks through extensions[\"ai.stigmer\"], under the same logo rules as a vendor manifest", () => {
93
+ const files = withFile(
94
+ openPlugin({
95
+ version: "1.0.0",
96
+ description: "Linear's hosted MCP server.",
97
+ manifest: { author: { name: "Stigmer" }, extensions: { "ai.stigmer": { displayName: "Linear", logo: "assets/logo.png", category: "integrations" } } },
98
+ }),
99
+ "assets/logo.png",
100
+ PNG_BYTES,
101
+ );
102
+ expect(present(files)).toEqual({
103
+ displayName: "Linear",
104
+ logo: "assets/logo.png",
105
+ category: "integrations",
106
+ version: "1.0.0",
107
+ description: "Linear's hosted MCP server.",
108
+ author: { name: "Stigmer" },
109
+ });
110
+ const unlisted = present(openPlugin({ manifest: { extensions: { "ai.stigmer": { displayName: "Linear", logo: "assets/missing.png" } } } }));
111
+ expect(unlisted).toEqual({ displayName: "Linear" });
112
+ expect(present(openPlugin({ manifest: { extensions: { "ai.stigmer": "nope" } } }))).toEqual({});
113
+ });
114
+
90
115
  it("a root manifest names the plugin first; a vendor manifest beside it still lends its appearance", () => {
91
116
  let files = openPlugin({ version: "3.0.0", description: "From the root manifest." });
92
117
  files = withFile(
@@ -1,60 +1,41 @@
1
1
  /**
2
- * The sources every client lists without being told: Stigmer's official
3
- * catalogue and the three vendors' public ones.
2
+ * The one source every client lists without being told: Stigmer's official
3
+ * catalogue.
4
4
  *
5
- * The product's promise is "bring your Cursor, Claude Code or Codex
6
- * plugin", so the catalogues those vendors publish are on offer from the
7
- * first screen, in the console's Marketplace and in `stigmer marketplace
8
- * list`, without a user having to know a repository slug. They are code,
9
- * not stored state: a client's remembered sources hold only what the user
10
- * added, so the two clients cannot drift from each other and a vendor
11
- * moving its repository is one release, not a migration. The names are
12
- * reserved the way the official one is; a user can neither add nor remove
13
- * them.
5
+ * The catalogue is curated (`plugins/README.md`, "What the catalogue holds"):
6
+ * every entry is one Stigmer may ship and one whose servers Stigmer can
7
+ * connect to, vendored from a publisher's redistributable set or authored
8
+ * by Stigmer for a vendor's public endpoint. The vendors' own repositories
9
+ * were built in for one release and were taken out again when the audit
10
+ * behind the catalogue measured that more than half of their entries fail
11
+ * that bar: a chip that offers what the catalogue left out re-surfaces
12
+ * what curation removed. A user who wants another catalogue adds it as a
13
+ * source of his own (a repository with a marketplace file, read from
14
+ * GitHub), in the console's Manage sources or with `stigmer marketplace
15
+ * add`; the vendors' repositories are ordinary candidates for that, at the
16
+ * user's word, never on offer by default.
14
17
  *
15
- * Each vendor keeps its marketplace file at the repository root in its own
16
- * location, all four of which `readMarketplace` reads (`.cursor-plugin/`,
17
- * `.claude-plugin/`, `.agents/plugins/`). Measured on 2026-09-18 through
18
- * the GitHub Trees API: 1,168, 1,594 and 7,746 entries respectively, none
19
- * truncated, all under the console's 20,000-entry listing cap; Codex's
20
- * catalogue names its entries as `{source: "local", path}` objects, which
21
- * the reader accepts, and three of its 65 as remote sources, which it
22
- * drops with its own sentence.
18
+ * The list is code, not stored state: a client's remembered sources hold
19
+ * only what the user added, so the two clients cannot drift from each
20
+ * other. The official name is reserved the way it always was; a user can
21
+ * neither add over it nor remove it.
23
22
  */
24
23
 
25
24
  import type { GitHubMarketplaceSource } from "./refs.js";
26
25
  import { OFFICIAL_MARKETPLACE_NAME } from "./refs.js";
27
26
 
28
- /** A source a client ships with: named, described for a section heading, and either the official catalogue or a public GitHub tree. */
27
+ /** A source a client ships with: named, and either the official catalogue or a public GitHub tree. */
29
28
  export interface BuiltInMarketplace {
30
29
  readonly name: string;
31
- /** One sentence for the Marketplace's section heading and `marketplace list`. */
32
- readonly description: string;
33
30
  readonly source: { readonly type: "official" } | GitHubMarketplaceSource;
34
31
  }
35
32
 
36
- /** In listing order: the official catalogue first, then the vendors in the order the product names them. */
33
+ /** In listing order. Today one entry; the type keeps the shape a future built-in would take. */
37
34
  export const BUILT_IN_MARKETPLACES: readonly BuiltInMarketplace[] = [
38
35
  {
39
36
  name: OFFICIAL_MARKETPLACE_NAME,
40
- description: "Stigmer's official catalogue, published with each release.",
41
37
  source: { type: "official" },
42
38
  },
43
- {
44
- name: "cursor-plugins",
45
- description: "Cursor's public plugin catalogue.",
46
- source: { type: "github", repo: "cursor/plugins" },
47
- },
48
- {
49
- name: "claude-code-plugins",
50
- description: "Claude Code's public plugin catalogue.",
51
- source: { type: "github", repo: "anthropics/claude-code" },
52
- },
53
- {
54
- name: "codex-plugins",
55
- description: "Codex's public plugin catalogue.",
56
- source: { type: "github", repo: "openai/plugins" },
57
- },
58
39
  ];
59
40
 
60
41
  const BUILT_IN_NAMES: ReadonlySet<string> = new Set(BUILT_IN_MARKETPLACES.map((entry) => entry.name));
@@ -215,11 +215,36 @@ const EXPERIMENTAL_KINDS: Readonly<Record<string, IgnoredComponentKind>> = {
215
215
  };
216
216
 
217
217
  /**
218
- * `extensions` in a root manifest: every namespace with content is an
219
- * ignored component (a client ignores namespaces it does not implement
220
- * without validating them); an empty object, including Stigmer's own
221
- * reserved `ai.stigmer`, is silent. A non-object `extensions` is the open
222
- * format's one non-fatal type violation: reported and ignored.
218
+ * Stigmer's own namespace under a root manifest's `extensions`. The open
219
+ * format has no appearance fields, so this is where an open-format plugin
220
+ * says what a storefront card shows: the same three the Cursor manifest
221
+ * carries at its top level, read by `presentation.ts` and treated by the
222
+ * install exactly as Cursor's are (`logo` an ignored component, because
223
+ * nothing in an Organization carries the image; `displayName` and
224
+ * `category` silent). The overlay FOLDER `ai.stigmer/` (`normalise/overlay.ts`)
225
+ * is the same name in a different place: resources there, appearance here.
226
+ */
227
+ export const STIGMER_EXTENSION_NAMESPACE = "ai.stigmer";
228
+ export const STIGMER_EXTENSION_FIELDS: ReadonlySet<string> = new Set(["displayName", "logo", "category"]);
229
+
230
+ /** The `ai.stigmer` extension object of a root manifest, or `undefined` when absent or not an object. */
231
+ export function stigmerExtensionOf(object: JsonObject): JsonObject | undefined {
232
+ const extensions = object["extensions"];
233
+ if (!isJsonObject(extensions)) return undefined;
234
+ const content = extensions[STIGMER_EXTENSION_NAMESPACE];
235
+ return isJsonObject(content) ? content : undefined;
236
+ }
237
+
238
+ /**
239
+ * `extensions` in a root manifest: every foreign namespace with content is
240
+ * an ignored component (a client ignores namespaces it does not implement
241
+ * without validating them); an empty object is silent. Stigmer's own
242
+ * namespace is read field by field: `logo` is recorded as the `logo`
243
+ * component Cursor's would be, the other appearance fields are silent, and
244
+ * any field beyond `STIGMER_EXTENSION_FIELDS` makes the namespace an
245
+ * ignored `extension` component so a misspelled key stays visible. A
246
+ * non-object `extensions` is the open format's one non-fatal type
247
+ * violation: reported and ignored.
223
248
  */
224
249
  export function extensionComponents(object: JsonObject, path: string, findings: Findings): IgnoredComponent[] {
225
250
  const value = object["extensions"];
@@ -231,7 +256,13 @@ export function extensionComponents(object: JsonObject, path: string, findings:
231
256
  const ignored: IgnoredComponent[] = [];
232
257
  for (const [namespace, content] of fields(value)) {
233
258
  if (isJsonObject(content) && fields(content).length === 0) continue;
234
- ignored.push({ kind: "extension", path: `${path}#extensions.${namespace}` });
259
+ const at = `${path}#extensions.${namespace}`;
260
+ if (namespace === STIGMER_EXTENSION_NAMESPACE && isJsonObject(content)) {
261
+ if (content["logo"] !== undefined) ignored.push({ kind: "logo", path: `${at}.logo` });
262
+ if (fields(content).some(([name]) => !STIGMER_EXTENSION_FIELDS.has(name))) ignored.push({ kind: "extension", path: at });
263
+ continue;
264
+ }
265
+ ignored.push({ kind: "extension", path: at });
235
266
  }
236
267
  return ignored;
237
268
  }
@@ -8,8 +8,9 @@
8
8
  * so this manifest declares no paths and no inline servers; `mcp.json` is
9
9
  * read under the open format's rules by `detect.ts` when it exists.
10
10
  * Client-specific data belongs under `extensions`, which Stigmer records as
11
- * ignored per namespace (its own `ai.stigmer` namespace is reserved and
12
- * empty today).
11
+ * ignored per foreign namespace; its own `ai.stigmer` namespace carries the
12
+ * appearance fields a storefront card shows (`manifest.ts`,
13
+ * `STIGMER_EXTENSION_FIELDS`), the open format's only place for them.
13
14
  */
14
15
 
15
16
  import { describeValue, type JsonObject } from "../documents.js";
@@ -17,9 +17,10 @@
17
17
  * manifest that carries each; the presentation fields come from the
18
18
  * dialects that define them: Cursor's top-level `displayName`, `logo` and
19
19
  * `category`; the legacy Codex manifest's `interface.displayName`,
20
- * `interface.logo` and `interface.category`. Claude Code's manifest and the
21
- * open format define none, and a logo rule for the `ai.stigmer` extension
22
- * namespace waits for the first official plugin that needs one.
20
+ * `interface.logo` and `interface.category`; the open format's
21
+ * `extensions["ai.stigmer"]` with the same three names, the one place that
22
+ * format leaves a client for them (Stigmer's authored catalogue plugins are
23
+ * its first users). Claude Code's manifest defines none.
23
24
  *
24
25
  * A logo is a path inside the plugin, and the card that shows it fetches it
25
26
  * by URL from wherever the tree lives. So the path is kept only when it is
@@ -35,6 +36,7 @@
35
36
  */
36
37
 
37
38
  import { MANIFEST_PRECEDENCE } from "./detect.js";
39
+ import { stigmerExtensionOf } from "./dialects/manifest.js";
38
40
  import { decodeUtf8, isContainedPath, PLUGIN_DOCUMENT_LIMITS, PluginFileIndex, type PluginFiles } from "./files.js";
39
41
  import { isJsonObject, type JsonObject } from "./documents.js";
40
42
  import { MANIFEST_LOCATIONS } from "./messages.js";
@@ -102,7 +104,10 @@ function contributionOf(dialect: PluginDialect, object: JsonObject, index: Plugi
102
104
  const surface = object["interface"];
103
105
  return isJsonObject(surface) ? { ...identity, ...appearanceOf(surface, index) } : identity;
104
106
  }
105
- case "agent-plugins":
107
+ case "agent-plugins": {
108
+ const extension = stigmerExtensionOf(object);
109
+ return extension === undefined ? identity : { ...identity, ...appearanceOf(extension, index) };
110
+ }
106
111
  case "claude":
107
112
  return identity;
108
113
  default: {
@@ -122,7 +127,7 @@ function identityOf(object: JsonObject): PluginPresentation {
122
127
  };
123
128
  }
124
129
 
125
- /** `displayName`, `logo` and `category` from an object that carries them at its top level (a Cursor manifest, a Codex `interface`). */
130
+ /** `displayName`, `logo` and `category` from an object that carries them at its top level (a Cursor manifest, a Codex `interface`, an open manifest's `extensions["ai.stigmer"]`). */
126
131
  function appearanceOf(object: JsonObject, index: PluginFileIndex): PluginPresentation {
127
132
  const logo = logoPath(object["logo"], index);
128
133
  return {