@pulsemcp/air-cowork 0.0.29

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.
@@ -0,0 +1,42 @@
1
+ import type { PluginEmitter, ResolvedArtifacts, PluginEntry, BuildMarketplaceOptions, BuiltPlugin, BuiltMarketplace } from "@pulsemcp/air-core";
2
+ export declare class CoworkEmitter implements PluginEmitter {
3
+ name: string;
4
+ displayName: string;
5
+ buildMarketplace(artifacts: ResolvedArtifacts, pluginIds: string[], outputDir: string, options?: BuildMarketplaceOptions): Promise<BuiltMarketplace>;
6
+ buildPlugin(artifacts: ResolvedArtifacts, pluginId: string, plugin: PluginEntry, outputDir: string): BuiltPlugin;
7
+ buildManifest(pluginId: string, plugin: PluginEntry): Record<string, unknown>;
8
+ /**
9
+ * Build inline hooks.json in the Co-work format:
10
+ * { hooks: { EventName: [{ matcher, hooks: [{ type, command }] }] } }
11
+ *
12
+ * Each AIR HOOK.json is read, its event mapped, and its command rewritten
13
+ * to use ${CLAUDE_PLUGIN_ROOT} for script paths.
14
+ */
15
+ buildHooksConfig(artifacts: ResolvedArtifacts, hookIds: string[], pluginDir: string): {
16
+ hooks: Record<string, unknown[]>;
17
+ };
18
+ /**
19
+ * Build a hook command using ${CLAUDE_PLUGIN_ROOT} for relative paths.
20
+ * Hook scripts are copied to scripts/{hookId}/ in the plugin directory,
21
+ * so relative paths point there.
22
+ */
23
+ buildHookCommand(hookId: string, command: string, args?: string[]): string;
24
+ /**
25
+ * Copy hook scripts into scripts/{hookId}/ inside the plugin directory.
26
+ * Only copies executable files and scripts (not HOOK.json itself).
27
+ */
28
+ copyHookScripts(artifacts: ResolvedArtifacts, hookIds: string[], pluginDir: string): void;
29
+ /**
30
+ * Translate AIR MCP server entries to Co-work .mcp.json format.
31
+ * Same translation as Claude Code — Co-work uses the same MCP config format.
32
+ */
33
+ buildMcpConfig(artifacts: ResolvedArtifacts, mcpServerIds: string[]): {
34
+ mcpServers: Record<string, Record<string, unknown>>;
35
+ };
36
+ private translateOAuth;
37
+ private buildMarketplaceIndex;
38
+ private validatePluginIds;
39
+ private copyReferences;
40
+ private copyDirRecursive;
41
+ }
42
+ //# sourceMappingURL=cowork-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cowork-emitter.d.ts","sourceRoot":"","sources":["../src/cowork-emitter.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,WAAW,EAGX,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAe5B,qBAAa,aAAc,YAAW,aAAa;IACjD,IAAI,SAAY;IAChB,WAAW,SAAoB;IAEzB,gBAAgB,CACpB,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,gBAAgB,CAAC;IA2B5B,WAAW,CACT,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,GAChB,WAAW;IA8Dd,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAClB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAc1B;;;;;;OAMG;IACH,gBAAgB,CACd,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,GAChB;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;KAAE;IAgDvC;;;;OAIG;IACH,gBAAgB,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,GACd,MAAM;IAcT;;;OAGG;IACH,eAAe,CACb,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI;IAqBP;;;OAGG;IACH,cAAc,CACZ,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,MAAM,EAAE,GACrB;QAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE;IA4B1D,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,qBAAqB;IAiC7B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,gBAAgB;CAYzB"}
@@ -0,0 +1,297 @@
1
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, copyFileSync, statSync, } from "fs";
2
+ import { join, basename, dirname } from "path";
3
+ /**
4
+ * AIR event names → Claude Co-work hook event names.
5
+ * Co-work supports many more events than AIR currently models;
6
+ * unmapped AIR events are silently skipped.
7
+ */
8
+ const AIR_TO_COWORK_EVENT = {
9
+ session_start: "SessionStart",
10
+ session_end: "SessionEnd",
11
+ pre_tool_call: "PreToolUse",
12
+ post_tool_call: "PostToolUse",
13
+ notification: "Notification",
14
+ };
15
+ export class CoworkEmitter {
16
+ name = "cowork";
17
+ displayName = "Claude Co-work";
18
+ async buildMarketplace(artifacts, pluginIds, outputDir, options) {
19
+ this.validatePluginIds(artifacts, pluginIds);
20
+ mkdirSync(outputDir, { recursive: true });
21
+ const builtPlugins = [];
22
+ for (const pluginId of pluginIds) {
23
+ const plugin = artifacts.plugins[pluginId];
24
+ const pluginDir = join(outputDir, pluginId);
25
+ const built = this.buildPlugin(artifacts, pluginId, plugin, pluginDir);
26
+ builtPlugins.push(built);
27
+ }
28
+ const claudePluginDir = join(outputDir, ".claude-plugin");
29
+ mkdirSync(claudePluginDir, { recursive: true });
30
+ const indexPath = join(claudePluginDir, "marketplace.json");
31
+ const index = this.buildMarketplaceIndex(artifacts, pluginIds, builtPlugins, options);
32
+ writeFileSync(indexPath, JSON.stringify(index, null, 2) + "\n");
33
+ return { indexPath, plugins: builtPlugins };
34
+ }
35
+ buildPlugin(artifacts, pluginId, plugin, outputDir) {
36
+ mkdirSync(outputDir, { recursive: true });
37
+ const manifest = this.buildManifest(pluginId, plugin);
38
+ const manifestDir = join(outputDir, ".claude-plugin");
39
+ mkdirSync(manifestDir, { recursive: true });
40
+ writeFileSync(join(manifestDir, "plugin.json"), JSON.stringify(manifest, null, 2) + "\n");
41
+ const skillIds = plugin.skills ?? [];
42
+ const hookIds = plugin.hooks ?? [];
43
+ const mcpServerIds = plugin.mcp_servers ?? [];
44
+ // Emit skills
45
+ for (const skillId of skillIds) {
46
+ const skill = artifacts.skills[skillId];
47
+ if (!skill)
48
+ continue;
49
+ const skillTargetDir = join(outputDir, "skills", skillId);
50
+ if (existsSync(skill.path)) {
51
+ this.copyDirRecursive(skill.path, skillTargetDir);
52
+ }
53
+ if (skill.references?.length) {
54
+ this.copyReferences(skill.references, skillTargetDir, artifacts);
55
+ }
56
+ }
57
+ // Emit hooks
58
+ if (hookIds.length > 0) {
59
+ const hooksConfig = this.buildHooksConfig(artifacts, hookIds, outputDir);
60
+ if (Object.keys(hooksConfig.hooks).length > 0) {
61
+ const hooksDir = join(outputDir, "hooks");
62
+ mkdirSync(hooksDir, { recursive: true });
63
+ writeFileSync(join(hooksDir, "hooks.json"), JSON.stringify(hooksConfig, null, 2) + "\n");
64
+ this.copyHookScripts(artifacts, hookIds, outputDir);
65
+ }
66
+ }
67
+ // Emit MCP servers
68
+ if (mcpServerIds.length > 0) {
69
+ const mcpConfig = this.buildMcpConfig(artifacts, mcpServerIds);
70
+ if (Object.keys(mcpConfig.mcpServers).length > 0) {
71
+ writeFileSync(join(outputDir, ".mcp.json"), JSON.stringify(mcpConfig, null, 2) + "\n");
72
+ }
73
+ }
74
+ return {
75
+ id: pluginId,
76
+ path: outputDir,
77
+ skillCount: skillIds.filter((id) => artifacts.skills[id]).length,
78
+ hookCount: hookIds.filter((id) => artifacts.hooks[id]).length,
79
+ mcpServerCount: mcpServerIds.filter((id) => artifacts.mcp[id]).length,
80
+ };
81
+ }
82
+ buildManifest(pluginId, plugin) {
83
+ const manifest = {
84
+ name: pluginId,
85
+ description: plugin.description,
86
+ };
87
+ if (plugin.version)
88
+ manifest.version = plugin.version;
89
+ if (plugin.author)
90
+ manifest.author = plugin.author;
91
+ if (plugin.homepage)
92
+ manifest.homepage = plugin.homepage;
93
+ if (plugin.repository)
94
+ manifest.repository = plugin.repository;
95
+ if (plugin.license)
96
+ manifest.license = plugin.license;
97
+ if (plugin.keywords)
98
+ manifest.keywords = plugin.keywords;
99
+ return manifest;
100
+ }
101
+ /**
102
+ * Build inline hooks.json in the Co-work format:
103
+ * { hooks: { EventName: [{ matcher, hooks: [{ type, command }] }] } }
104
+ *
105
+ * Each AIR HOOK.json is read, its event mapped, and its command rewritten
106
+ * to use ${CLAUDE_PLUGIN_ROOT} for script paths.
107
+ */
108
+ buildHooksConfig(artifacts, hookIds, pluginDir) {
109
+ const hooks = {};
110
+ for (const hookId of hookIds) {
111
+ const hook = artifacts.hooks[hookId];
112
+ if (!hook)
113
+ continue;
114
+ const hookJsonPath = join(hook.path, "HOOK.json");
115
+ if (!existsSync(hookJsonPath))
116
+ continue;
117
+ let hookJson;
118
+ try {
119
+ hookJson = JSON.parse(readFileSync(hookJsonPath, "utf-8"));
120
+ }
121
+ catch {
122
+ continue;
123
+ }
124
+ const coworkEvent = AIR_TO_COWORK_EVENT[hookJson.event];
125
+ if (!coworkEvent || !hookJson.command)
126
+ continue;
127
+ const command = this.buildHookCommand(hookId, hookJson.command, hookJson.args);
128
+ const hookEntry = {
129
+ type: "command",
130
+ command,
131
+ };
132
+ if (hookJson.timeout_seconds != null) {
133
+ hookEntry.timeout = hookJson.timeout_seconds;
134
+ }
135
+ const matcherGroup = {
136
+ matcher: hookJson.matcher ?? "",
137
+ hooks: [hookEntry],
138
+ };
139
+ if (!hooks[coworkEvent]) {
140
+ hooks[coworkEvent] = [];
141
+ }
142
+ hooks[coworkEvent].push(matcherGroup);
143
+ }
144
+ return { hooks };
145
+ }
146
+ /**
147
+ * Build a hook command using ${CLAUDE_PLUGIN_ROOT} for relative paths.
148
+ * Hook scripts are copied to scripts/{hookId}/ in the plugin directory,
149
+ * so relative paths point there.
150
+ */
151
+ buildHookCommand(hookId, command, args) {
152
+ let cmd = command;
153
+ if (cmd.startsWith("./")) {
154
+ cmd = `\${CLAUDE_PLUGIN_ROOT}/scripts/${hookId}/${cmd.slice(2)}`;
155
+ }
156
+ if (args?.length) {
157
+ const escaped = args.map((a) => /[\s;&|`$"'\\]/.test(a) ? `'${a.replace(/'/g, "'\\''")}'` : a);
158
+ cmd += " " + escaped.join(" ");
159
+ }
160
+ return cmd;
161
+ }
162
+ /**
163
+ * Copy hook scripts into scripts/{hookId}/ inside the plugin directory.
164
+ * Only copies executable files and scripts (not HOOK.json itself).
165
+ */
166
+ copyHookScripts(artifacts, hookIds, pluginDir) {
167
+ for (const hookId of hookIds) {
168
+ const hook = artifacts.hooks[hookId];
169
+ if (!hook || !existsSync(hook.path))
170
+ continue;
171
+ const scriptsDir = join(pluginDir, "scripts", hookId);
172
+ const entries = readdirSync(hook.path);
173
+ for (const entry of entries) {
174
+ if (entry === "HOOK.json")
175
+ continue;
176
+ const srcPath = join(hook.path, entry);
177
+ if (statSync(srcPath).isDirectory()) {
178
+ this.copyDirRecursive(srcPath, join(scriptsDir, entry));
179
+ }
180
+ else {
181
+ mkdirSync(scriptsDir, { recursive: true });
182
+ copyFileSync(srcPath, join(scriptsDir, entry));
183
+ }
184
+ }
185
+ }
186
+ }
187
+ /**
188
+ * Translate AIR MCP server entries to Co-work .mcp.json format.
189
+ * Same translation as Claude Code — Co-work uses the same MCP config format.
190
+ */
191
+ buildMcpConfig(artifacts, mcpServerIds) {
192
+ const mcpServers = {};
193
+ for (const id of mcpServerIds) {
194
+ const server = artifacts.mcp[id];
195
+ if (!server)
196
+ continue;
197
+ if (server.type === "stdio") {
198
+ mcpServers[id] = {
199
+ command: server.command,
200
+ ...(server.args && { args: server.args }),
201
+ ...(server.env && { env: server.env }),
202
+ };
203
+ }
204
+ else {
205
+ const coworkType = server.type === "streamable-http" ? "http" : server.type;
206
+ mcpServers[id] = {
207
+ type: coworkType,
208
+ url: server.url,
209
+ ...(server.headers && { headers: server.headers }),
210
+ ...(server.oauth && { oauth: this.translateOAuth(server.oauth) }),
211
+ };
212
+ }
213
+ }
214
+ return { mcpServers };
215
+ }
216
+ translateOAuth(oauth) {
217
+ const result = {};
218
+ if (oauth.clientId)
219
+ result.clientId = oauth.clientId;
220
+ if (oauth.redirectUri) {
221
+ try {
222
+ const url = new URL(oauth.redirectUri);
223
+ if (url.port)
224
+ result.callbackPort = parseInt(url.port, 10);
225
+ }
226
+ catch {
227
+ // Skip if redirectUri isn't parseable
228
+ }
229
+ }
230
+ if (oauth.scopes)
231
+ result.scopes = oauth.scopes;
232
+ return result;
233
+ }
234
+ buildMarketplaceIndex(artifacts, pluginIds, builtPlugins, options) {
235
+ const plugins = pluginIds.map((id) => {
236
+ const plugin = artifacts.plugins[id];
237
+ const entry = {
238
+ name: id,
239
+ source: `./${id}`,
240
+ description: plugin.description,
241
+ };
242
+ if (plugin.version)
243
+ entry.version = plugin.version;
244
+ if (plugin.author)
245
+ entry.author = plugin.author;
246
+ if (plugin.keywords)
247
+ entry.keywords = plugin.keywords;
248
+ return entry;
249
+ });
250
+ const index = {
251
+ name: options?.marketplaceName ?? "air-marketplace",
252
+ owner: options?.marketplaceOwner ?? { name: "AIR" },
253
+ plugins,
254
+ };
255
+ const description = options?.marketplaceDescription ??
256
+ "Plugin marketplace generated from AIR configuration";
257
+ index.metadata = { description };
258
+ return index;
259
+ }
260
+ validatePluginIds(artifacts, pluginIds) {
261
+ const unknown = pluginIds.filter((id) => !artifacts.plugins[id]);
262
+ if (unknown.length > 0) {
263
+ const available = Object.keys(artifacts.plugins);
264
+ const availableMsg = available.length > 0
265
+ ? `Available: ${available.join(", ")}`
266
+ : "None available";
267
+ throw new Error(`Unknown plugin ID(s): ${unknown.join(", ")}. ${availableMsg}`);
268
+ }
269
+ }
270
+ copyReferences(refIds, targetDir, artifacts) {
271
+ const refsTargetDir = join(targetDir, "references");
272
+ for (const refId of refIds) {
273
+ const ref = artifacts.references[refId];
274
+ if (!ref)
275
+ continue;
276
+ if (existsSync(ref.path)) {
277
+ const refTargetPath = join(refsTargetDir, basename(ref.path));
278
+ mkdirSync(dirname(refTargetPath), { recursive: true });
279
+ copyFileSync(ref.path, refTargetPath);
280
+ }
281
+ }
282
+ }
283
+ copyDirRecursive(src, dest) {
284
+ mkdirSync(dest, { recursive: true });
285
+ for (const entry of readdirSync(src)) {
286
+ const srcPath = join(src, entry);
287
+ const destPath = join(dest, entry);
288
+ if (statSync(srcPath).isDirectory()) {
289
+ this.copyDirRecursive(srcPath, destPath);
290
+ }
291
+ else {
292
+ copyFileSync(srcPath, destPath);
293
+ }
294
+ }
295
+ }
296
+ }
297
+ //# sourceMappingURL=cowork-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cowork-emitter.js","sourceRoot":"","sources":["../src/cowork-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AirExtension } from "@pulsemcp/air-core";
2
+ export { CoworkEmitter } from "./cowork-emitter.js";
3
+ declare const extension: AirExtension;
4
+ export default extension;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,QAAA,MAAM,SAAS,EAAE,YAGhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ import { CoworkEmitter } from "./cowork-emitter.js";
2
+ export { CoworkEmitter } from "./cowork-emitter.js";
3
+ const extension = {
4
+ name: "cowork",
5
+ emitter: new CoworkEmitter(),
6
+ };
7
+ export default extension;
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,SAAS,GAAiB;IAC9B,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,IAAI,aAAa,EAAE;CAC7B,CAAC;AAEF,eAAe,SAAS,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@pulsemcp/air-cowork",
3
+ "version": "0.0.29",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/pulsemcp/air.git",
10
+ "directory": "packages/extensions/cowork"
11
+ },
12
+ "description": "AIR plugin emitter for Claude Co-work — builds distributable plugin directories from AIR artifacts",
13
+ "type": "module",
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist/"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest",
29
+ "lint": "tsc --noEmit"
30
+ },
31
+ "dependencies": {
32
+ "@pulsemcp/air-core": "0.0.29"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^22.10.0",
36
+ "typescript": "^5.7.0",
37
+ "vitest": "^2.1.0"
38
+ },
39
+ "engines": {
40
+ "node": ">=18"
41
+ }
42
+ }