@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 +59 -0
- package/dist/claude-adapter.d.ts +30 -0
- package/dist/claude-adapter.d.ts.map +1 -0
- package/dist/claude-adapter.js +238 -0
- package/dist/claude-adapter.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|