@amsterdamdatalabs/enact-extensions 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/README.md +88 -0
- package/catalog/enact-context.json +9 -0
- package/catalog/enact-factory.json +7 -0
- package/catalog/enact-operator.json +7 -0
- package/catalog/enact-wiki.json +7 -0
- package/catalog/net-revenue-management.json +8 -0
- package/dist/create/claude.d.ts +3 -0
- package/dist/create/claude.d.ts.map +1 -0
- package/dist/create/claude.js +12 -0
- package/dist/create/claude.js.map +1 -0
- package/dist/create/codex.d.ts +3 -0
- package/dist/create/codex.d.ts.map +1 -0
- package/dist/create/codex.js +14 -0
- package/dist/create/codex.js.map +1 -0
- package/dist/create/cursor.d.ts +3 -0
- package/dist/create/cursor.d.ts.map +1 -0
- package/dist/create/cursor.js +20 -0
- package/dist/create/cursor.js.map +1 -0
- package/dist/create/enact.d.ts +3 -0
- package/dist/create/enact.d.ts.map +1 -0
- package/dist/create/enact.js +32 -0
- package/dist/create/enact.js.map +1 -0
- package/dist/create/index.d.ts +18 -0
- package/dist/create/index.d.ts.map +1 -0
- package/dist/create/index.js +54 -0
- package/dist/create/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +60 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +250 -0
- package/dist/install.js.map +1 -0
- package/dist/internal/claude.d.ts +16 -0
- package/dist/internal/claude.d.ts.map +1 -0
- package/dist/internal/claude.js +35 -0
- package/dist/internal/claude.js.map +1 -0
- package/dist/internal/codex.d.ts +43 -0
- package/dist/internal/codex.d.ts.map +1 -0
- package/dist/internal/codex.js +205 -0
- package/dist/internal/codex.js.map +1 -0
- package/dist/internal/cursor.d.ts +2 -0
- package/dist/internal/cursor.d.ts.map +1 -0
- package/dist/internal/cursor.js +6 -0
- package/dist/internal/cursor.js.map +1 -0
- package/dist/internal/io.d.ts +3 -0
- package/dist/internal/io.d.ts.map +1 -0
- package/dist/internal/io.js +11 -0
- package/dist/internal/io.js.map +1 -0
- package/dist/internal/pick.d.ts +4 -0
- package/dist/internal/pick.d.ts.map +1 -0
- package/dist/internal/pick.js +17 -0
- package/dist/internal/pick.js.map +1 -0
- package/dist/internal/platform.d.ts +21 -0
- package/dist/internal/platform.d.ts.map +1 -0
- package/dist/internal/platform.js +120 -0
- package/dist/internal/platform.js.map +1 -0
- package/dist/internal/schema.d.ts +5 -0
- package/dist/internal/schema.d.ts.map +1 -0
- package/dist/internal/schema.js +37 -0
- package/dist/internal/schema.js.map +1 -0
- package/dist/internal/types.d.ts +49 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +2 -0
- package/dist/internal/types.js.map +1 -0
- package/dist/validate/claude.d.ts +3 -0
- package/dist/validate/claude.d.ts.map +1 -0
- package/dist/validate/claude.js +11 -0
- package/dist/validate/claude.js.map +1 -0
- package/dist/validate/codex.d.ts +3 -0
- package/dist/validate/codex.d.ts.map +1 -0
- package/dist/validate/codex.js +11 -0
- package/dist/validate/codex.js.map +1 -0
- package/dist/validate/cursor.d.ts +3 -0
- package/dist/validate/cursor.d.ts.map +1 -0
- package/dist/validate/cursor.js +11 -0
- package/dist/validate/cursor.js.map +1 -0
- package/dist/validate/enact.d.ts +4 -0
- package/dist/validate/enact.d.ts.map +1 -0
- package/dist/validate/enact.js +18 -0
- package/dist/validate/enact.js.map +1 -0
- package/dist/validate/index.d.ts +17 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +99 -0
- package/dist/validate/index.js.map +1 -0
- package/package.json +58 -0
- package/plugins/net-revenue-management/.codex-plugin/plugin.json +35 -0
- package/plugins/net-revenue-management/.mcp.json +9 -0
- package/plugins/net-revenue-management/skills/net-revenue-risks/SKILL.md +30 -0
- package/plugins/net-revenue-management/skills/net-revenue-scenario/SKILL.md +31 -0
- package/scripts/enact-extensions.mjs +105 -0
- package/scripts/install.sh +70 -0
- package/scripts/lib/resolve-plugin-root.mjs +9 -0
- package/scripts/lib/run-install.mjs +66 -0
- package/scripts/lib/run-sync.mjs +24 -0
- package/scripts/lib/run-validate.mjs +36 -0
- package/scripts/rename-supervisor-to-operator.pl +66 -0
- package/scripts/setup-enact-context.sh +23 -0
- package/scripts/sync-manifests.mjs +23 -0
- package/scripts/validate-catalog.mjs +37 -0
- package/scripts/validate-plugin.mjs +10 -0
- package/spec/claude.json +99 -0
- package/spec/claude.md +485 -0
- package/spec/codex.json +154 -0
- package/spec/codex.md +145 -0
- package/spec/cursor.json +88 -0
- package/spec/cursor.md +175 -0
- package/spec/enact.json +211 -0
- package/spec/enact.md +204 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../../src/internal/pick.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,cAAc,CAQhB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CAMV"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function pickManifestFields(source, allowed) {
|
|
2
|
+
const out = {};
|
|
3
|
+
for (const key of allowed) {
|
|
4
|
+
if (key in source && source[key] !== undefined) {
|
|
5
|
+
out[key] = source[key];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return out;
|
|
9
|
+
}
|
|
10
|
+
export function withPlatformKeyword(keywords, platform) {
|
|
11
|
+
const base = keywords ? [...keywords] : [];
|
|
12
|
+
if (!base.includes(platform)) {
|
|
13
|
+
base.unshift(platform);
|
|
14
|
+
}
|
|
15
|
+
return base;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=pick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick.js","sourceRoot":"","sources":["../../src/internal/pick.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAChC,MAAsB,EACtB,OAA0B;IAE1B,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC/C,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAA8B,EAC9B,QAAgB;IAEhB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Platform, TargetPlatform } from "./types.js";
|
|
2
|
+
export declare const SPEC_DIR = "spec";
|
|
3
|
+
export declare const MANIFEST_BY_PLATFORM: Record<Platform, {
|
|
4
|
+
directory: string;
|
|
5
|
+
filename: string;
|
|
6
|
+
schemaFile: string;
|
|
7
|
+
}>;
|
|
8
|
+
/** Fields allowed on each platform manifest (derived from spec/*.json). */
|
|
9
|
+
export declare const MANIFEST_FIELDS: Record<Platform, readonly string[]>;
|
|
10
|
+
export declare const DEFAULT_TARGETS: TargetPlatform[];
|
|
11
|
+
export declare const DEFAULT_PATHS: {
|
|
12
|
+
readonly skills: "./skills/";
|
|
13
|
+
readonly agents: "./agents/";
|
|
14
|
+
readonly commands: "./commands/";
|
|
15
|
+
readonly hooks: "./hooks/hooks.json";
|
|
16
|
+
readonly mcpServers: "./.mcp.json";
|
|
17
|
+
readonly apps: "./.app.json";
|
|
18
|
+
};
|
|
19
|
+
export declare function manifestRelPath(platform: Platform): string;
|
|
20
|
+
export declare function isTargetPlatform(value: string): value is TargetPlatform;
|
|
21
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/internal/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,QAAQ,SAAS,CAAC;AAE/B,eAAO,MAAM,oBAAoB,EAAE,MAAM,CACvC,QAAQ,EACR;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAsB5D,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CA8E/D,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,EAAkC,CAAC;AAE/E,eAAO,MAAM,aAAa;;;;;;;CAOhB,CAAC;AAEX,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAG1D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAEvE"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export const SPEC_DIR = "spec";
|
|
2
|
+
export const MANIFEST_BY_PLATFORM = {
|
|
3
|
+
enact: {
|
|
4
|
+
directory: ".agents",
|
|
5
|
+
filename: "plugin.json",
|
|
6
|
+
schemaFile: "enact.json",
|
|
7
|
+
},
|
|
8
|
+
claude: {
|
|
9
|
+
directory: ".claude-plugin",
|
|
10
|
+
filename: "plugin.json",
|
|
11
|
+
schemaFile: "claude.json",
|
|
12
|
+
},
|
|
13
|
+
codex: {
|
|
14
|
+
directory: ".codex-plugin",
|
|
15
|
+
filename: "plugin.json",
|
|
16
|
+
schemaFile: "codex.json",
|
|
17
|
+
},
|
|
18
|
+
cursor: {
|
|
19
|
+
directory: ".cursor-plugin",
|
|
20
|
+
filename: "plugin.json",
|
|
21
|
+
schemaFile: "cursor.json",
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
/** Fields allowed on each platform manifest (derived from spec/*.json). */
|
|
25
|
+
export const MANIFEST_FIELDS = {
|
|
26
|
+
enact: [
|
|
27
|
+
"name",
|
|
28
|
+
"version",
|
|
29
|
+
"description",
|
|
30
|
+
"author",
|
|
31
|
+
"homepage",
|
|
32
|
+
"repository",
|
|
33
|
+
"license",
|
|
34
|
+
"keywords",
|
|
35
|
+
"targets",
|
|
36
|
+
"skills",
|
|
37
|
+
"agents",
|
|
38
|
+
"commands",
|
|
39
|
+
"hooks",
|
|
40
|
+
"mcpServers",
|
|
41
|
+
"apps",
|
|
42
|
+
"lsp",
|
|
43
|
+
"monitors",
|
|
44
|
+
"settings",
|
|
45
|
+
"bin",
|
|
46
|
+
"interface",
|
|
47
|
+
"factory",
|
|
48
|
+
"operator",
|
|
49
|
+
],
|
|
50
|
+
claude: [
|
|
51
|
+
"name",
|
|
52
|
+
"version",
|
|
53
|
+
"description",
|
|
54
|
+
"author",
|
|
55
|
+
"homepage",
|
|
56
|
+
"repository",
|
|
57
|
+
"license",
|
|
58
|
+
"keywords",
|
|
59
|
+
"skills",
|
|
60
|
+
"commands",
|
|
61
|
+
"agents",
|
|
62
|
+
"hooks",
|
|
63
|
+
"mcpServers",
|
|
64
|
+
"lsp",
|
|
65
|
+
"monitors",
|
|
66
|
+
"settings",
|
|
67
|
+
"bin",
|
|
68
|
+
],
|
|
69
|
+
codex: [
|
|
70
|
+
"name",
|
|
71
|
+
"version",
|
|
72
|
+
"description",
|
|
73
|
+
"author",
|
|
74
|
+
"homepage",
|
|
75
|
+
"repository",
|
|
76
|
+
"license",
|
|
77
|
+
"keywords",
|
|
78
|
+
"skills",
|
|
79
|
+
"agents",
|
|
80
|
+
"commands",
|
|
81
|
+
"mcpServers",
|
|
82
|
+
"apps",
|
|
83
|
+
"hooks",
|
|
84
|
+
"interface",
|
|
85
|
+
],
|
|
86
|
+
cursor: [
|
|
87
|
+
"name",
|
|
88
|
+
"version",
|
|
89
|
+
"description",
|
|
90
|
+
"author",
|
|
91
|
+
"homepage",
|
|
92
|
+
"repository",
|
|
93
|
+
"license",
|
|
94
|
+
"keywords",
|
|
95
|
+
"logo",
|
|
96
|
+
"rules",
|
|
97
|
+
"skills",
|
|
98
|
+
"agents",
|
|
99
|
+
"commands",
|
|
100
|
+
"mcpServers",
|
|
101
|
+
"hooks",
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
export const DEFAULT_TARGETS = ["claude", "codex", "cursor"];
|
|
105
|
+
export const DEFAULT_PATHS = {
|
|
106
|
+
skills: "./skills/",
|
|
107
|
+
agents: "./agents/",
|
|
108
|
+
commands: "./commands/",
|
|
109
|
+
hooks: "./hooks/hooks.json",
|
|
110
|
+
mcpServers: "./.mcp.json",
|
|
111
|
+
apps: "./.app.json",
|
|
112
|
+
};
|
|
113
|
+
export function manifestRelPath(platform) {
|
|
114
|
+
const { directory, filename } = MANIFEST_BY_PLATFORM[platform];
|
|
115
|
+
return `${directory}/${filename}`;
|
|
116
|
+
}
|
|
117
|
+
export function isTargetPlatform(value) {
|
|
118
|
+
return value === "claude" || value === "codex" || value === "cursor";
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/internal/platform.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE/B,MAAM,CAAC,MAAM,oBAAoB,GAG7B;IACF,KAAK,EAAE;QACL,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,YAAY;KACzB;IACD,MAAM,EAAE;QACN,SAAS,EAAE,gBAAgB;QAC3B,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,aAAa;KAC1B;IACD,KAAK,EAAE;QACL,SAAS,EAAE,eAAe;QAC1B,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,YAAY;KACzB;IACD,MAAM,EAAE;QACN,SAAS,EAAE,gBAAgB;QAC3B,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,aAAa;KAC1B;CACF,CAAC;AAEF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAwC;IAClE,KAAK,EAAE;QACL,MAAM;QACN,SAAS;QACT,aAAa;QACb,QAAQ;QACR,UAAU;QACV,YAAY;QACZ,SAAS;QACT,UAAU;QACV,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,OAAO;QACP,YAAY;QACZ,MAAM;QACN,KAAK;QACL,UAAU;QACV,UAAU;QACV,KAAK;QACL,WAAW;QACX,SAAS;QACT,UAAU;KACX;IACD,MAAM,EAAE;QACN,MAAM;QACN,SAAS;QACT,aAAa;QACb,QAAQ;QACR,UAAU;QACV,YAAY;QACZ,SAAS;QACT,UAAU;QACV,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,KAAK;QACL,UAAU;QACV,UAAU;QACV,KAAK;KACN;IACD,KAAK,EAAE;QACL,MAAM;QACN,SAAS;QACT,aAAa;QACb,QAAQ;QACR,UAAU;QACV,YAAY;QACZ,SAAS;QACT,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,YAAY;QACZ,MAAM;QACN,OAAO;QACP,WAAW;KACZ;IACD,MAAM,EAAE;QACN,MAAM;QACN,SAAS;QACT,aAAa;QACb,QAAQ;QACR,UAAU;QACV,YAAY;QACZ,SAAS;QACT,UAAU;QACV,MAAM;QACN,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,YAAY;QACZ,OAAO;KACR;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,oBAAoB;IAC3B,UAAU,EAAE,aAAa;IACzB,IAAI,EAAE,aAAa;CACX,CAAC;AAEX,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/D,OAAO,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ErrorObject, ValidateFunction } from "ajv";
|
|
2
|
+
import type { Platform } from "./types.js";
|
|
3
|
+
export declare function getValidator(platform: Platform): ValidateFunction;
|
|
4
|
+
export declare function formatAjvErrors(errors: ErrorObject[] | null | undefined): string[];
|
|
5
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/internal/schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgB3C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,CAQjE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CASlF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { Ajv } from "ajv";
|
|
5
|
+
import * as addFormatsModule from "ajv-formats";
|
|
6
|
+
// NodeNext ESM resolution returns the module namespace; access .default explicitly and cast
|
|
7
|
+
const addFormats = addFormatsModule.default;
|
|
8
|
+
import { MANIFEST_BY_PLATFORM, SPEC_DIR } from "./platform.js";
|
|
9
|
+
const packageRoot = join(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
10
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
11
|
+
addFormats(ajv);
|
|
12
|
+
const validators = new Map();
|
|
13
|
+
function loadSchema(platform) {
|
|
14
|
+
const schemaFile = MANIFEST_BY_PLATFORM[platform].schemaFile;
|
|
15
|
+
const raw = readFileSync(join(packageRoot, SPEC_DIR, schemaFile), "utf8");
|
|
16
|
+
return JSON.parse(raw);
|
|
17
|
+
}
|
|
18
|
+
export function getValidator(platform) {
|
|
19
|
+
const cached = validators.get(platform);
|
|
20
|
+
if (cached) {
|
|
21
|
+
return cached;
|
|
22
|
+
}
|
|
23
|
+
const validator = ajv.compile(loadSchema(platform));
|
|
24
|
+
validators.set(platform, validator);
|
|
25
|
+
return validator;
|
|
26
|
+
}
|
|
27
|
+
export function formatAjvErrors(errors) {
|
|
28
|
+
if (!errors?.length) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
return errors.map((err) => {
|
|
32
|
+
const path = err.instancePath || "/";
|
|
33
|
+
const msg = err.message ?? "invalid";
|
|
34
|
+
return `${path}: ${msg}`;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/internal/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,KAAK,gBAAgB,MAAM,aAAa,CAAC;AAChD,4FAA4F;AAC5F,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAmC,CAAC;AAGxE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAE3E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACxD,UAAU,CAAC,GAAG,CAAC,CAAC;AAEhB,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEzD,SAAS,UAAU,CAAC,QAAkB;IACpC,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC;IAC7D,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAwC;IACtE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;QACrC,OAAO,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type Platform = "enact" | "claude" | "codex" | "cursor";
|
|
2
|
+
export type TargetPlatform = Exclude<Platform, "enact">;
|
|
3
|
+
export type PluginManifest = Record<string, unknown>;
|
|
4
|
+
export type ValidationResult = {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
platform: Platform;
|
|
7
|
+
errors: string[];
|
|
8
|
+
};
|
|
9
|
+
export type CreateEnactInput = {
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
version?: string;
|
|
13
|
+
author?: {
|
|
14
|
+
name: string;
|
|
15
|
+
email?: string;
|
|
16
|
+
url?: string;
|
|
17
|
+
};
|
|
18
|
+
homepage?: string;
|
|
19
|
+
repository?: string;
|
|
20
|
+
license?: string;
|
|
21
|
+
keywords?: string[];
|
|
22
|
+
targets?: TargetPlatform[];
|
|
23
|
+
interface?: {
|
|
24
|
+
displayName: string;
|
|
25
|
+
shortDescription: string;
|
|
26
|
+
longDescription?: string;
|
|
27
|
+
developerName?: string;
|
|
28
|
+
category?: string;
|
|
29
|
+
composerIcon?: string;
|
|
30
|
+
logo?: string;
|
|
31
|
+
capabilities?: string[];
|
|
32
|
+
};
|
|
33
|
+
factory?: {
|
|
34
|
+
firstParty?: boolean;
|
|
35
|
+
bundledMcpProviders?: string[];
|
|
36
|
+
operatorScope?: "global" | "project" | "session";
|
|
37
|
+
};
|
|
38
|
+
operator?: {
|
|
39
|
+
firstParty?: boolean;
|
|
40
|
+
bundledMcpProviders?: string[];
|
|
41
|
+
operatorScope?: "global" | "project" | "session";
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export type SyncResult = {
|
|
45
|
+
platform: Platform;
|
|
46
|
+
manifestPath: string;
|
|
47
|
+
written: boolean;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/internal/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,aAAa,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;KAClD,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,aAAa,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;KAClD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/internal/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/validate/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB,CAQ1E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { formatAjvErrors, getValidator } from "../internal/schema.js";
|
|
2
|
+
export function validateClaudeManifest(manifest) {
|
|
3
|
+
const validator = getValidator("claude");
|
|
4
|
+
const ok = validator(manifest) === true;
|
|
5
|
+
return {
|
|
6
|
+
ok,
|
|
7
|
+
platform: "claude",
|
|
8
|
+
errors: ok ? [] : formatAjvErrors(validator.errors),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/validate/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGtE,MAAM,UAAU,sBAAsB,CAAC,QAAiB;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACxC,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC;KACpD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/validate/codex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB,CAQzE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { formatAjvErrors, getValidator } from "../internal/schema.js";
|
|
2
|
+
export function validateCodexManifest(manifest) {
|
|
3
|
+
const validator = getValidator("codex");
|
|
4
|
+
const ok = validator(manifest) === true;
|
|
5
|
+
return {
|
|
6
|
+
ok,
|
|
7
|
+
platform: "codex",
|
|
8
|
+
errors: ok ? [] : formatAjvErrors(validator.errors),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/validate/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGtE,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACxC,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC;KACpD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/validate/cursor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB,CAQ1E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { formatAjvErrors, getValidator } from "../internal/schema.js";
|
|
2
|
+
export function validateCursorManifest(manifest) {
|
|
3
|
+
const validator = getValidator("cursor");
|
|
4
|
+
const ok = validator(manifest) === true;
|
|
5
|
+
return {
|
|
6
|
+
ok,
|
|
7
|
+
platform: "cursor",
|
|
8
|
+
errors: ok ? [] : formatAjvErrors(validator.errors),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/validate/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGtE,MAAM,UAAU,sBAAsB,CAAC,QAAiB;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACxC,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC;KACpD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PluginManifest, ValidationResult } from "../internal/types.js";
|
|
2
|
+
export declare function validateEnactManifest(manifest: unknown): ValidationResult;
|
|
3
|
+
export declare function assertEnactManifest(manifest: unknown): PluginManifest;
|
|
4
|
+
//# sourceMappingURL=enact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enact.d.ts","sourceRoot":"","sources":["../../src/validate/enact.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7E,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB,CAQzE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,cAAc,CAMrE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { formatAjvErrors, getValidator } from "../internal/schema.js";
|
|
2
|
+
export function validateEnactManifest(manifest) {
|
|
3
|
+
const validator = getValidator("enact");
|
|
4
|
+
const ok = validator(manifest) === true;
|
|
5
|
+
return {
|
|
6
|
+
ok,
|
|
7
|
+
platform: "enact",
|
|
8
|
+
errors: ok ? [] : formatAjvErrors(validator.errors),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function assertEnactManifest(manifest) {
|
|
12
|
+
const result = validateEnactManifest(manifest);
|
|
13
|
+
if (!result.ok) {
|
|
14
|
+
throw new Error(`Invalid enact manifest:\n${result.errors.join("\n")}`);
|
|
15
|
+
}
|
|
16
|
+
return manifest;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=enact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enact.js","sourceRoot":"","sources":["../../src/validate/enact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGtE,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACxC,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAiB;IACnD,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,QAA0B,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Platform, PluginManifest, ValidationResult } from "../internal/types.js";
|
|
2
|
+
export { validateEnactManifest, assertEnactManifest } from "./enact.js";
|
|
3
|
+
export { validateClaudeManifest } from "./claude.js";
|
|
4
|
+
export { validateCodexManifest } from "./codex.js";
|
|
5
|
+
export { validateCursorManifest } from "./cursor.js";
|
|
6
|
+
export declare function validateManifest(platform: Platform, manifest: unknown): ValidationResult;
|
|
7
|
+
export declare function readManifestFile(pluginRoot: string, platform: Platform): unknown;
|
|
8
|
+
export declare function validatePluginManifest(pluginRoot: string, platform: Platform): ValidationResult;
|
|
9
|
+
export type PluginValidationReport = {
|
|
10
|
+
pluginRoot: string;
|
|
11
|
+
results: ValidationResult[];
|
|
12
|
+
ok: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function validatePluginBundle(pluginRoot: string, platforms?: Platform[]): PluginValidationReport;
|
|
15
|
+
export declare function checkComponentPaths(pluginRoot: string, manifest: PluginManifest): string[];
|
|
16
|
+
export declare function checkPluginBundleComponentPaths(pluginRoot: string, platforms?: Platform[]): string[];
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAOvF,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AASrD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,OAAO,GAChB,gBAAgB,CAElB;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAMhF;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ,GACjB,gBAAgB,CAWlB;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;CACb,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,QAAQ,EAA2C,GAC7D,sBAAsB,CAOxB;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACvB,MAAM,EAAE,CAkBV;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,QAAQ,EAA2C,GAC7D,MAAM,EAAE,CA4BV"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { manifestRelPath } from "../internal/platform.js";
|
|
4
|
+
import { validateEnactManifest } from "./enact.js";
|
|
5
|
+
import { validateClaudeManifest } from "./claude.js";
|
|
6
|
+
import { validateCodexManifest } from "./codex.js";
|
|
7
|
+
import { validateCursorManifest } from "./cursor.js";
|
|
8
|
+
export { validateEnactManifest, assertEnactManifest } from "./enact.js";
|
|
9
|
+
export { validateClaudeManifest } from "./claude.js";
|
|
10
|
+
export { validateCodexManifest } from "./codex.js";
|
|
11
|
+
export { validateCursorManifest } from "./cursor.js";
|
|
12
|
+
const VALIDATORS = {
|
|
13
|
+
enact: validateEnactManifest,
|
|
14
|
+
claude: validateClaudeManifest,
|
|
15
|
+
codex: validateCodexManifest,
|
|
16
|
+
cursor: validateCursorManifest,
|
|
17
|
+
};
|
|
18
|
+
export function validateManifest(platform, manifest) {
|
|
19
|
+
return VALIDATORS[platform](manifest);
|
|
20
|
+
}
|
|
21
|
+
export function readManifestFile(pluginRoot, platform) {
|
|
22
|
+
const path = join(pluginRoot, manifestRelPath(platform));
|
|
23
|
+
if (!existsSync(path)) {
|
|
24
|
+
throw new Error(`Missing manifest: ${path}`);
|
|
25
|
+
}
|
|
26
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
27
|
+
}
|
|
28
|
+
export function validatePluginManifest(pluginRoot, platform) {
|
|
29
|
+
try {
|
|
30
|
+
const manifest = readManifestFile(pluginRoot, platform);
|
|
31
|
+
return validateManifest(platform, manifest);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return {
|
|
35
|
+
ok: false,
|
|
36
|
+
platform,
|
|
37
|
+
errors: [err instanceof Error ? err.message : String(err)],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function validatePluginBundle(pluginRoot, platforms = ["enact", "claude", "codex", "cursor"]) {
|
|
42
|
+
const results = platforms.map((platform) => validatePluginManifest(pluginRoot, platform));
|
|
43
|
+
return {
|
|
44
|
+
pluginRoot,
|
|
45
|
+
results,
|
|
46
|
+
ok: results.every((r) => r.ok),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function checkComponentPaths(pluginRoot, manifest) {
|
|
50
|
+
const warnings = [];
|
|
51
|
+
const paths = [
|
|
52
|
+
["skills", manifest.skills],
|
|
53
|
+
["commands", manifest.commands],
|
|
54
|
+
["hooks", manifest.hooks],
|
|
55
|
+
["mcpServers", manifest.mcpServers],
|
|
56
|
+
["apps", manifest.apps],
|
|
57
|
+
];
|
|
58
|
+
for (const [label, rel] of paths) {
|
|
59
|
+
if (typeof rel !== "string")
|
|
60
|
+
continue;
|
|
61
|
+
const abs = join(pluginRoot, rel.replace(/^\.\//, ""));
|
|
62
|
+
if (!existsSync(abs)) {
|
|
63
|
+
warnings.push(`Missing ${label} path: ${rel}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return warnings;
|
|
67
|
+
}
|
|
68
|
+
export function checkPluginBundleComponentPaths(pluginRoot, platforms = ["enact", "claude", "codex", "cursor"]) {
|
|
69
|
+
const issues = [];
|
|
70
|
+
for (const platform of platforms) {
|
|
71
|
+
let manifest;
|
|
72
|
+
try {
|
|
73
|
+
manifest = readManifestFile(pluginRoot, platform);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (!manifest || typeof manifest !== "object" || Array.isArray(manifest)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const paths = [
|
|
82
|
+
["skills", manifest.skills],
|
|
83
|
+
["commands", manifest.commands],
|
|
84
|
+
["hooks", manifest.hooks],
|
|
85
|
+
["mcpServers", manifest.mcpServers],
|
|
86
|
+
["apps", manifest.apps],
|
|
87
|
+
];
|
|
88
|
+
for (const [label, rel] of paths) {
|
|
89
|
+
if (typeof rel !== "string")
|
|
90
|
+
continue;
|
|
91
|
+
const abs = join(pluginRoot, rel.replace(/^\.\//, ""));
|
|
92
|
+
if (!existsSync(abs)) {
|
|
93
|
+
issues.push(`${platform} ${label} path does not exist: ${rel}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return issues;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@amsterdamdatalabs/enact-extensions",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Create and validate Enact multi-platform plugin manifests",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"spec",
|
|
18
|
+
"scripts",
|
|
19
|
+
"catalog",
|
|
20
|
+
".agents",
|
|
21
|
+
"plugins"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"bin": {
|
|
27
|
+
"enact-extensions": "./scripts/enact-extensions.mjs",
|
|
28
|
+
"enact-plugin-validate": "./scripts/validate-plugin.mjs",
|
|
29
|
+
"enact-plugin-sync": "./scripts/sync-manifests.mjs"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://dev.azure.com/amsterdamdatalabs/Enact/_git/enact-extensions"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "rm -rf dist && tsc -p tsconfig.json",
|
|
37
|
+
"prepublishOnly": "npm run build",
|
|
38
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
39
|
+
"validate": "npm run build && node scripts/enact-extensions.mjs validate extensions",
|
|
40
|
+
"sync": "npm run build && node scripts/enact-extensions.mjs sync extensions",
|
|
41
|
+
"validate:catalog": "node scripts/validate-catalog.mjs",
|
|
42
|
+
"setup:context": "bash scripts/setup-enact-context.sh",
|
|
43
|
+
"test": "npm run build && node --test tests/*.test.mjs"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"ajv": "^8.17.1",
|
|
47
|
+
"ajv-formats": "^3.0.1",
|
|
48
|
+
"@iarna/toml": "^2.2.5"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.0.0",
|
|
52
|
+
"esbuild": "^0.28.0",
|
|
53
|
+
"typescript": "^5.9.3"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=22"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "net-revenue-management",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Revenue Growth Management modelling for CPG pricing events — models P&L cascades, elasticity-based volume responses, retailer terms risks, and scenario comparisons on Meridian Confections UK Premium Snacks data.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Amsterdam Data Labs"
|
|
7
|
+
},
|
|
8
|
+
"license": "UNLICENSED",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"rgm",
|
|
11
|
+
"revenue",
|
|
12
|
+
"pricing",
|
|
13
|
+
"cpg",
|
|
14
|
+
"analytics",
|
|
15
|
+
"mcp"
|
|
16
|
+
],
|
|
17
|
+
"skills": "./skills/",
|
|
18
|
+
"mcpServers": "./.mcp.json",
|
|
19
|
+
"interface": {
|
|
20
|
+
"displayName": "Net Revenue Management",
|
|
21
|
+
"shortDescription": "RGM modelling: elasticity, P&L cascades, retailer risk.",
|
|
22
|
+
"longDescription": "Model price-event impacts across 14 SKUs in the Meridian Confections UK Premium Snacks range (January 2026). Covers own-price elasticity, P&L waterfall bridges for conservative/base/optimistic scenarios, Asda delisting-risk detection, split pricing strategies by segment, and a full four-option scenario comparison table.",
|
|
23
|
+
"developerName": "Amsterdam Data Labs",
|
|
24
|
+
"category": "Analytics",
|
|
25
|
+
"capabilities": [
|
|
26
|
+
"Read",
|
|
27
|
+
"Interactive"
|
|
28
|
+
],
|
|
29
|
+
"defaultPrompt": [
|
|
30
|
+
"Model a 3% Asda-only investment scenario for Galaxy sharing SKUs.",
|
|
31
|
+
"Run the optimistic P&L cascade for the January 2026 price event.",
|
|
32
|
+
"Show all retailer terms risks and Asda delisting exposure."
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
}
|