@pulsemcp/air-adapter-claude 0.0.1

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/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # @pulsemcp/air-adapter-claude
2
+
3
+ AIR adapter extension for [Claude Code](https://claude.ai/code). Translates AIR artifacts into Claude Code's native format and prepares working directories for agent sessions.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @pulsemcp/air-adapter-claude
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### With the AIR CLI
14
+
15
+ ```bash
16
+ # Install the adapter globally alongside the CLI
17
+ npm install -g @pulsemcp/air-cli @pulsemcp/air-adapter-claude
18
+
19
+ # Start a Claude Code session
20
+ air start claude --root web-app
21
+ ```
22
+
23
+ ### Programmatic
24
+
25
+ ```typescript
26
+ import { resolveArtifacts } from "@pulsemcp/air-core";
27
+ import { ClaudeAdapter } from "@pulsemcp/air-adapter-claude";
28
+
29
+ const artifacts = await resolveArtifacts("./air.json");
30
+ const adapter = new ClaudeAdapter();
31
+
32
+ // Prepare a working directory for a Claude Code session
33
+ const session = await adapter.prepareSession(artifacts, "./my-project", {
34
+ root: artifacts.roots["web-app"],
35
+ secretResolvers: [myVaultResolver],
36
+ });
37
+
38
+ // session.configFiles — paths written (.mcp.json, etc.)
39
+ // session.skillPaths — skill dirs created in .claude/skills/
40
+ // session.startCommand — { command: "claude", args: [...], cwd: "..." }
41
+ ```
42
+
43
+ ## What `prepareSession()` does
44
+
45
+ 1. **Writes `.mcp.json`** — translates AIR MCP server configs to Claude Code format, resolves `${VAR}` secrets via the provided `SecretResolver` chain
46
+ 2. **Injects skills** — copies SKILL.md files and associated content into `.claude/skills/{name}/`
47
+ 3. **Copies references** — attaches referenced documents into `.claude/skills/{name}/references/`
48
+ 4. **Respects local priority** — if a skill directory already exists in the target, it is not overwritten
49
+
50
+ ## Translation Details
51
+
52
+ | AIR Format | Claude Code Format |
53
+ |------------|-------------------|
54
+ | `mcp.json` (flat map with `type`, `title`, `description`) | `.mcp.json` (`mcpServers` wrapper, strips metadata) |
55
+ | `stdio` servers | `{ command, args, env }` |
56
+ | `sse`/`streamable-http` servers | `{ url, headers, oauth }` |
57
+ | OAuth `redirectUri` | Extracted as `callbackPort` |
58
+ | Plugin `timeout_seconds` | `timeout` |
59
+ | Plugin `id` | `name` |
@@ -0,0 +1,30 @@
1
+ import type { AgentAdapter, AgentSessionConfig, StartCommand, ResolvedArtifacts, RootEntry, McpServerEntry, PluginEntry, PrepareSessionOptions, PreparedSession } from "@pulsemcp/air-core";
2
+ export declare class ClaudeAdapter implements AgentAdapter {
3
+ name: string;
4
+ displayName: string;
5
+ isAvailable(): Promise<boolean>;
6
+ generateConfig(artifacts: ResolvedArtifacts, root?: RootEntry, _workDir?: string): AgentSessionConfig;
7
+ buildStartCommand(config: AgentSessionConfig): StartCommand;
8
+ /**
9
+ * Prepare a working directory for a Claude Code session.
10
+ * Writes .mcp.json, injects skills + references into .claude/skills/,
11
+ * and returns the start command.
12
+ */
13
+ prepareSession(artifacts: ResolvedArtifacts, targetDir: string, options?: PrepareSessionOptions): Promise<PreparedSession>;
14
+ /** Translate AIR mcp.json format to Claude Code .mcp.json format */
15
+ translateMcpServers(servers: Record<string, McpServerEntry>): Record<string, unknown>;
16
+ /** Translate AIR oauth config to Claude Code oauth format */
17
+ private translateOAuth;
18
+ /** Translate an AIR plugin to Claude Code plugin format */
19
+ translatePlugin(plugin: PluginEntry): Record<string, unknown>;
20
+ /**
21
+ * Resolve ${VAR} patterns in MCP server env values and URLs using
22
+ * the provided secret resolvers. Falls through resolvers in order.
23
+ */
24
+ private resolveServerSecrets;
25
+ private resolveEnvMap;
26
+ private resolveString;
27
+ private filterByIds;
28
+ private copyDirRecursive;
29
+ }
30
+ //# sourceMappingURL=claude-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../src/claude-adapter.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,cAAc,EAEd,WAAW,EAEX,qBAAqB,EACrB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAI5B,qBAAa,aAAc,YAAW,YAAY;IAChD,IAAI,SAAY;IAChB,WAAW,SAAiB;IAEtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC,cAAc,CACZ,SAAS,EAAE,iBAAiB,EAC5B,IAAI,CAAC,EAAE,SAAS,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,kBAAkB;IA+BrB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY;IAW3D;;;;OAIG;IACG,cAAc,CAClB,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,eAAe,CAAC;IA8E3B,oEAAoE;IACpE,mBAAmB,CACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAsB1B,6DAA6D;IAC7D,OAAO,CAAC,cAAc;IAqBtB,2DAA2D;IAC3D,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAU7D;;;OAGG;YACW,oBAAoB;YAwBpB,aAAa;YAWb,aAAa;IAqB3B,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,gBAAgB;CAYzB"}
@@ -0,0 +1,238 @@
1
+ import { execSync } from "child_process";
2
+ import { existsSync, mkdirSync, writeFileSync, readdirSync, copyFileSync, statSync, } from "fs";
3
+ import { resolve, join, dirname } from "path";
4
+ const ENV_VAR_PATTERN = /\$\{([^}]+)\}/g;
5
+ export class ClaudeAdapter {
6
+ name = "claude";
7
+ displayName = "Claude Code";
8
+ async isAvailable() {
9
+ try {
10
+ execSync("which claude", { stdio: "pipe" });
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ generateConfig(artifacts, root, _workDir) {
18
+ const mcpServers = root?.default_mcp_servers
19
+ ? this.filterByIds(artifacts.mcp, root.default_mcp_servers)
20
+ : artifacts.mcp;
21
+ const plugins = root?.default_plugins
22
+ ? this.filterByIds(artifacts.plugins, root.default_plugins)
23
+ : artifacts.plugins;
24
+ const mcpConfig = this.translateMcpServers(mcpServers);
25
+ const pluginConfigs = Object.values(plugins).map((p) => this.translatePlugin(p));
26
+ const skillIds = root?.default_skills
27
+ ? root.default_skills
28
+ : Object.keys(artifacts.skills);
29
+ const skillPaths = skillIds
30
+ .filter((id) => artifacts.skills[id])
31
+ .map((id) => artifacts.skills[id].path);
32
+ return {
33
+ agent: "claude",
34
+ mcpConfig,
35
+ pluginConfigs,
36
+ skillPaths,
37
+ env: {},
38
+ };
39
+ }
40
+ buildStartCommand(config) {
41
+ const args = [];
42
+ return {
43
+ command: "claude",
44
+ args,
45
+ env: config.env,
46
+ cwd: config.workDir,
47
+ };
48
+ }
49
+ /**
50
+ * Prepare a working directory for a Claude Code session.
51
+ * Writes .mcp.json, injects skills + references into .claude/skills/,
52
+ * and returns the start command.
53
+ */
54
+ async prepareSession(artifacts, targetDir, options) {
55
+ const root = options?.root;
56
+ const resolvers = options?.secretResolvers || [];
57
+ const configFiles = [];
58
+ const skillPaths = [];
59
+ // 1. Resolve which artifacts to activate
60
+ const mcpServers = root?.default_mcp_servers
61
+ ? this.filterByIds(artifacts.mcp, root.default_mcp_servers)
62
+ : artifacts.mcp;
63
+ const plugins = root?.default_plugins
64
+ ? this.filterByIds(artifacts.plugins, root.default_plugins)
65
+ : artifacts.plugins;
66
+ const skillIds = root?.default_skills
67
+ ? root.default_skills
68
+ : Object.keys(artifacts.skills);
69
+ // 2. Write .mcp.json with resolved secrets
70
+ const resolvedServers = await this.resolveServerSecrets(mcpServers, resolvers);
71
+ const mcpConfig = this.translateMcpServers(resolvedServers);
72
+ const mcpConfigPath = join(targetDir, ".mcp.json");
73
+ writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2) + "\n");
74
+ configFiles.push(mcpConfigPath);
75
+ // 3. Inject skills + references into .claude/skills/
76
+ for (const skillId of skillIds) {
77
+ const skill = artifacts.skills[skillId];
78
+ if (!skill)
79
+ continue;
80
+ const skillTargetDir = join(targetDir, ".claude", "skills", skillId);
81
+ // Skip if skill already exists locally (local takes priority)
82
+ if (existsSync(skillTargetDir))
83
+ continue;
84
+ // Copy skill directory contents
85
+ const skillSourceDir = resolve(dirname(targetDir), skill.path);
86
+ if (existsSync(skillSourceDir)) {
87
+ this.copyDirRecursive(skillSourceDir, skillTargetDir);
88
+ skillPaths.push(skillTargetDir);
89
+ }
90
+ // Copy referenced documents
91
+ if (skill.references && skill.references.length > 0) {
92
+ const refsTargetDir = join(skillTargetDir, "references");
93
+ for (const refId of skill.references) {
94
+ const ref = artifacts.references[refId];
95
+ if (!ref)
96
+ continue;
97
+ const refSourcePath = resolve(dirname(targetDir), ref.file);
98
+ if (existsSync(refSourcePath)) {
99
+ const refTargetPath = join(refsTargetDir, ref.file.split("/").pop() || ref.file);
100
+ mkdirSync(dirname(refTargetPath), { recursive: true });
101
+ copyFileSync(refSourcePath, refTargetPath);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ // 4. Build start command
107
+ const config = this.generateConfig(artifacts, root, targetDir);
108
+ const startCommand = this.buildStartCommand({
109
+ ...config,
110
+ workDir: targetDir,
111
+ });
112
+ return { configFiles, skillPaths, startCommand };
113
+ }
114
+ /** Translate AIR mcp.json format to Claude Code .mcp.json format */
115
+ translateMcpServers(servers) {
116
+ const mcpServers = {};
117
+ for (const [name, server] of Object.entries(servers)) {
118
+ if (server.type === "stdio") {
119
+ mcpServers[name] = {
120
+ command: server.command,
121
+ ...(server.args && { args: server.args }),
122
+ ...(server.env && { env: server.env }),
123
+ };
124
+ }
125
+ else {
126
+ mcpServers[name] = {
127
+ url: server.url,
128
+ ...(server.headers && { headers: server.headers }),
129
+ ...(server.oauth && { oauth: this.translateOAuth(server.oauth) }),
130
+ };
131
+ }
132
+ }
133
+ return { mcpServers };
134
+ }
135
+ /** Translate AIR oauth config to Claude Code oauth format */
136
+ translateOAuth(oauth) {
137
+ const result = {};
138
+ if (oauth.clientId) {
139
+ result.clientId = oauth.clientId;
140
+ }
141
+ if (oauth.redirectUri) {
142
+ try {
143
+ const url = new URL(oauth.redirectUri);
144
+ if (url.port) {
145
+ result.callbackPort = parseInt(url.port, 10);
146
+ }
147
+ }
148
+ catch {
149
+ // If redirectUri isn't parseable, omit callbackPort
150
+ }
151
+ }
152
+ if (oauth.scopes) {
153
+ result.scopes = oauth.scopes;
154
+ }
155
+ return result;
156
+ }
157
+ /** Translate an AIR plugin to Claude Code plugin format */
158
+ translatePlugin(plugin) {
159
+ return {
160
+ name: plugin.id,
161
+ description: plugin.description,
162
+ command: plugin.command,
163
+ ...(plugin.args && { args: plugin.args }),
164
+ ...(plugin.timeout_seconds && { timeout: plugin.timeout_seconds }),
165
+ };
166
+ }
167
+ /**
168
+ * Resolve ${VAR} patterns in MCP server env values and URLs using
169
+ * the provided secret resolvers. Falls through resolvers in order.
170
+ */
171
+ async resolveServerSecrets(servers, resolvers) {
172
+ if (resolvers.length === 0)
173
+ return servers;
174
+ const resolved = {};
175
+ for (const [name, server] of Object.entries(servers)) {
176
+ resolved[name] = {
177
+ ...server,
178
+ ...(server.env && {
179
+ env: await this.resolveEnvMap(server.env, resolvers),
180
+ }),
181
+ ...(server.url && {
182
+ url: await this.resolveString(server.url, resolvers),
183
+ }),
184
+ ...(server.headers && {
185
+ headers: await this.resolveEnvMap(server.headers, resolvers),
186
+ }),
187
+ };
188
+ }
189
+ return resolved;
190
+ }
191
+ async resolveEnvMap(env, resolvers) {
192
+ const resolved = {};
193
+ for (const [key, value] of Object.entries(env)) {
194
+ resolved[key] = await this.resolveString(value, resolvers);
195
+ }
196
+ return resolved;
197
+ }
198
+ async resolveString(value, resolvers) {
199
+ const matches = [...value.matchAll(ENV_VAR_PATTERN)];
200
+ if (matches.length === 0)
201
+ return value;
202
+ let result = value;
203
+ for (const match of matches) {
204
+ const varName = match[1];
205
+ for (const resolver of resolvers) {
206
+ const resolved = await resolver.resolve(varName);
207
+ if (resolved !== undefined) {
208
+ result = result.replace(match[0], resolved);
209
+ break;
210
+ }
211
+ }
212
+ }
213
+ return result;
214
+ }
215
+ filterByIds(all, ids) {
216
+ const filtered = {};
217
+ for (const id of ids) {
218
+ if (all[id]) {
219
+ filtered[id] = all[id];
220
+ }
221
+ }
222
+ return filtered;
223
+ }
224
+ copyDirRecursive(src, dest) {
225
+ mkdirSync(dest, { recursive: true });
226
+ for (const entry of readdirSync(src)) {
227
+ const srcPath = join(src, entry);
228
+ const destPath = join(dest, entry);
229
+ if (statSync(srcPath).isDirectory()) {
230
+ this.copyDirRecursive(srcPath, destPath);
231
+ }
232
+ else {
233
+ copyFileSync(srcPath, destPath);
234
+ }
235
+ }
236
+ }
237
+ }
238
+ //# sourceMappingURL=claude-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../src/claude-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AirExtension } from "@pulsemcp/air-core";
2
+ export { ClaudeAdapter } from "./claude-adapter.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,YAIhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ import { ClaudeAdapter } from "./claude-adapter.js";
2
+ export { ClaudeAdapter } from "./claude-adapter.js";
3
+ const extension = {
4
+ name: "claude",
5
+ type: "adapter",
6
+ adapter: new ClaudeAdapter(),
7
+ };
8
+ export default extension;
9
+ //# 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,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,IAAI,aAAa,EAAE;CAC7B,CAAC;AAEF,eAAe,SAAS,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@pulsemcp/air-adapter-claude",
3
+ "version": "0.0.1",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/pulsemcp/air.git",
10
+ "directory": "packages/extensions/adapter-claude"
11
+ },
12
+ "description": "AIR adapter for Claude Code — translates AIR config to Claude Code format",
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.1"
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
+ }