@stigmer/plugin-package 3.18.1-dev.20260919070736 → 3.19.1-dev.20260920100552
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/client/builtin.d.ts +20 -23
- package/client/builtin.d.ts.map +1 -1
- package/client/builtin.js +19 -36
- package/client/builtin.js.map +1 -1
- package/dialects/manifest.d.ts +23 -5
- package/dialects/manifest.d.ts.map +1 -1
- package/dialects/manifest.js +38 -6
- package/dialects/manifest.js.map +1 -1
- package/dialects/open.d.ts +3 -2
- package/dialects/open.d.ts.map +1 -1
- package/dialects/open.js +3 -2
- package/dialects/open.js.map +1 -1
- package/package.json +1 -1
- package/presentation.d.ts +4 -3
- package/presentation.d.ts.map +1 -1
- package/presentation.js +10 -5
- package/presentation.js.map +1 -1
- package/src/__tests__/client-prepare.test.ts +3 -7
- package/src/__tests__/client-select-archive.test.ts +14 -12
- package/src/__tests__/detect.test.ts +11 -0
- package/src/__tests__/presentation.test.ts +27 -2
- package/src/client/builtin.ts +20 -39
- package/src/dialects/manifest.ts +37 -6
- package/src/dialects/open.ts +3 -2
- package/src/presentation.ts +10 -5
package/client/builtin.d.ts
CHANGED
|
@@ -1,37 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
* catalogue
|
|
2
|
+
* The one source every client lists without being told: Stigmer's official
|
|
3
|
+
* catalogue.
|
|
4
4
|
*
|
|
5
|
-
* The
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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,
|
|
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
|
|
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;
|
package/client/builtin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/client/builtin.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
3
|
-
* catalogue
|
|
2
|
+
* The one source every client lists without being told: Stigmer's official
|
|
3
|
+
* catalogue.
|
|
4
4
|
*
|
|
5
|
-
* The
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
|
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. */
|
package/client/builtin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../src/client/builtin.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dialects/manifest.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
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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"}
|
package/dialects/manifest.js
CHANGED
|
@@ -169,11 +169,35 @@ const EXPERIMENTAL_KINDS = {
|
|
|
169
169
|
evals: "evals",
|
|
170
170
|
};
|
|
171
171
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
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
|
-
|
|
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
|
}
|
package/dialects/manifest.js.map
CHANGED
|
@@ -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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"}
|
package/dialects/open.d.ts
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
|
|
12
|
-
*
|
|
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";
|
package/dialects/open.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/dialects/open.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
12
|
-
*
|
|
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";
|
package/dialects/open.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/dialects/open.ts"],"names":[],"mappings":"AAAA
|
|
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.
|
|
3
|
+
"version": "3.19.1-dev.20260920100552",
|
|
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
|
|
21
|
-
*
|
|
22
|
-
*
|
|
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
|
package/presentation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
21
|
-
*
|
|
22
|
-
*
|
|
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 {
|
package/presentation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation.js","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
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
|
|
8
|
-
* `d75b0724a` (`preparePluginPush` over `
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* the
|
|
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
|
|
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
|
|
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
|
|
94
|
-
expect(
|
|
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
|
|
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(
|
package/src/client/builtin.ts
CHANGED
|
@@ -1,60 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
* catalogue
|
|
2
|
+
* The one source every client lists without being told: Stigmer's official
|
|
3
|
+
* catalogue.
|
|
4
4
|
*
|
|
5
|
-
* The
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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,
|
|
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
|
|
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));
|
package/src/dialects/manifest.ts
CHANGED
|
@@ -215,11 +215,36 @@ const EXPERIMENTAL_KINDS: Readonly<Record<string, IgnoredComponentKind>> = {
|
|
|
215
215
|
};
|
|
216
216
|
|
|
217
217
|
/**
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
*
|
|
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
|
-
|
|
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
|
}
|
package/src/dialects/open.ts
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
|
|
12
|
-
*
|
|
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";
|
package/src/presentation.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
|
|
21
|
-
*
|
|
22
|
-
*
|
|
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 {
|