@openape/apes 0.6.0 → 0.6.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/dist/index.d.ts CHANGED
@@ -1,4 +1,209 @@
1
- export { AdapterMeta, BuiltGrantRequest, GrantRequestOptions, LoadedAdapter, RegistryEntry, RegistryIndex, ResolvedCapability, ResolvedCommand, ShapesAdapter, ShapesOperation, buildExactCommandGrantRequest, buildStructuredCliGrantRequest, createShapesGrant, extractOption, extractWrappedCommand, fetchGrantToken, fetchRegistry, findAdapter, findConflictingAdapters, findExistingGrant, getInstalledDigest, installAdapter, isInstalled, loadAdapter, removeAdapter, resolveAdapterPath, resolveCapabilityRequest, resolveCommand, searchAdapters, verifyAndExecute, waitForGrantStatus } from '@openape/shapes';
1
+ import { OpenApeGrantRequest, ScopeRiskLevel, OpenApeCliAuthorizationDetail, OpenApeExecutionContext } from '@openape/core';
2
+
3
+ interface ShapesAdapter {
4
+ schema: string;
5
+ cli: {
6
+ id: string;
7
+ executable: string;
8
+ audience?: string;
9
+ version?: string;
10
+ };
11
+ operations: ShapesOperation[];
12
+ }
13
+ interface ShapesOperation {
14
+ id: string;
15
+ command: string[];
16
+ positionals?: string[];
17
+ required_options?: string[];
18
+ display: string;
19
+ action: string;
20
+ risk: ScopeRiskLevel;
21
+ resource_chain: string[];
22
+ exact_command?: boolean;
23
+ }
24
+ interface LoadedAdapter {
25
+ adapter: ShapesAdapter;
26
+ source: string;
27
+ digest: string;
28
+ }
29
+ interface ResolvedCommand {
30
+ adapter: ShapesAdapter;
31
+ source: string;
32
+ digest: string;
33
+ executable: string;
34
+ commandArgv: string[];
35
+ bindings: Record<string, string>;
36
+ detail: OpenApeCliAuthorizationDetail;
37
+ executionContext: OpenApeExecutionContext;
38
+ permission: string;
39
+ }
40
+ interface ResolvedCapability {
41
+ adapter: ShapesAdapter;
42
+ source: string;
43
+ digest: string;
44
+ executable: string;
45
+ details: OpenApeCliAuthorizationDetail[];
46
+ executionContext: OpenApeExecutionContext;
47
+ permissions: string[];
48
+ summary: string;
49
+ }
50
+ interface GrantRequestOptions {
51
+ requester: string;
52
+ target_host: string;
53
+ grant_type: 'once' | 'timed' | 'always';
54
+ reason?: string;
55
+ run_as?: string;
56
+ }
57
+ interface BuiltGrantRequest {
58
+ request: OpenApeGrantRequest;
59
+ }
60
+ interface RegistryEntry {
61
+ id: string;
62
+ name: string;
63
+ description: string;
64
+ category: string;
65
+ tags: string[];
66
+ author: string;
67
+ executable: string;
68
+ min_shapes_version: string;
69
+ digest: string;
70
+ download_url: string;
71
+ }
72
+ interface RegistryIndex {
73
+ version: number;
74
+ generated_at: string;
75
+ adapters: RegistryEntry[];
76
+ }
77
+ interface AdapterMeta {
78
+ id: string;
79
+ name: string;
80
+ description: string;
81
+ author: string;
82
+ category: string;
83
+ tags: string[];
84
+ executable: string;
85
+ risk_summary?: string;
86
+ homepage?: string;
87
+ min_shapes_version: string;
88
+ }
89
+
90
+ declare function resolveAdapterPath(cliId: string, explicitPath?: string): string;
91
+ declare function loadAdapter(cliId: string, explicitPath?: string): LoadedAdapter;
92
+ /** Try to load an adapter locally, return null instead of throwing when not found. */
93
+ declare function tryLoadAdapter(cliId: string, explicitPath?: string): LoadedAdapter | null;
94
+
95
+ /**
96
+ * Append a single entry to the audit log at ~/.config/apes/audit.jsonl.
97
+ * Failures are swallowed — the audit log should never break the actual flow.
98
+ */
99
+ declare function appendAuditLog(entry: {
100
+ action: string;
101
+ timestamp?: number;
102
+ } & Record<string, unknown>): void;
103
+
104
+ /** A parsed shell command string with the executable and its argv extracted. */
105
+ interface ParsedShellCommand {
106
+ /** The program to run (first token, e.g. "rm") */
107
+ executable: string;
108
+ /** Remaining tokens after the executable (e.g. ["-f", "/tmp/foo.txt"]) */
109
+ argv: string[];
110
+ /**
111
+ * true if the command contains compound operators (&&, ||, ;, |),
112
+ * subshells ($(...)), or backticks. These cannot be safely handled
113
+ * by the adapter mode and must fall back to the generic shell grant flow.
114
+ */
115
+ isCompound: boolean;
116
+ /** The original command string for display/logging */
117
+ raw: string;
118
+ }
119
+ /**
120
+ * Parse a shell command string like `rm /tmp/foo.txt` or `git commit -m "hello"` into
121
+ * its executable and argv. Uses `shell-quote` to handle quoting correctly.
122
+ *
123
+ * Returns null for empty/whitespace-only input.
124
+ */
125
+ declare function parseShellCommand(raw: string): ParsedShellCommand | null;
126
+ /**
127
+ * Extract the command string from an `apes run --shell -- bash -c "…"` argv.
128
+ * Returns null if the argv does not follow that shape.
129
+ */
130
+ declare function extractShellCommandString(command: string[]): string | null;
131
+ /**
132
+ * Load an adapter for the given CLI id. If the adapter is not installed locally,
133
+ * try to fetch it from the shapes registry and auto-install it.
134
+ *
135
+ * Returns null when no adapter exists in either location, or when any step fails.
136
+ * Failures are logged but never thrown — callers should fall back to the generic flow.
137
+ */
138
+ declare function loadOrInstallAdapter(cliId: string): Promise<LoadedAdapter | null>;
139
+
140
+ declare function resolveCapabilityRequest(loaded: LoadedAdapter, params: {
141
+ resources: string[];
142
+ selectors?: string[];
143
+ actions: string[];
144
+ }): ResolvedCapability;
145
+
146
+ declare function extractWrappedCommand(args: string[]): string[];
147
+ declare function extractOption(args: string[], name: string): string | undefined;
148
+
149
+ interface SimilarGrantsInfo {
150
+ similar_grants: Array<{
151
+ grant: {
152
+ id: string;
153
+ };
154
+ similar_detail_indices: number[];
155
+ }>;
156
+ widened_details: Array<{
157
+ permission: string;
158
+ }>;
159
+ merged_details: Array<{
160
+ permission: string;
161
+ }>;
162
+ }
163
+ declare function createShapesGrant(resolved: ResolvedCommand, params: {
164
+ idp: string;
165
+ approval: 'once' | 'timed' | 'always';
166
+ reason?: string;
167
+ }): Promise<{
168
+ id: string;
169
+ status: string;
170
+ similar_grants?: SimilarGrantsInfo;
171
+ }>;
172
+ declare function waitForGrantStatus(idp: string, grantId: string): Promise<'approved' | 'denied' | 'revoked'>;
173
+ declare function fetchGrantToken(idp: string, grantId: string): Promise<string>;
174
+ declare function verifyAndExecute(token: string, resolved: ResolvedCommand): Promise<void>;
175
+ declare function findExistingGrant(resolved: ResolvedCommand, idp: string): Promise<string | null>;
176
+
177
+ declare function resolveCommand(loaded: LoadedAdapter, fullArgv: string[]): Promise<ResolvedCommand>;
178
+
179
+ declare function buildExactCommandGrantRequest(command: string[], options: GrantRequestOptions & {
180
+ audience: string;
181
+ }): Promise<BuiltGrantRequest>;
182
+ declare function buildStructuredCliGrantRequest(resolved: ResolvedCommand | ResolvedCapability, options: GrantRequestOptions): Promise<BuiltGrantRequest>;
183
+
184
+ declare function fetchRegistry(forceRefresh?: boolean): Promise<RegistryIndex>;
185
+ declare function searchAdapters(index: RegistryIndex, query: string): RegistryEntry[];
186
+ declare function findAdapter(index: RegistryIndex, id: string): RegistryEntry | undefined;
187
+
188
+ interface InstallResult {
189
+ id: string;
190
+ path: string;
191
+ digest: string;
192
+ updated: boolean;
193
+ }
194
+ declare function installAdapter(entry: RegistryEntry, options?: {
195
+ local?: boolean;
196
+ }): Promise<InstallResult>;
197
+ declare function getInstalledDigest(id: string, local: boolean): string | null;
198
+ declare function isInstalled(id: string, local: boolean): boolean;
199
+ declare function removeAdapter(id: string, local: boolean): boolean;
200
+ interface ConflictingAdapter {
201
+ file: string;
202
+ path: string;
203
+ adapterId: string;
204
+ executable: string;
205
+ }
206
+ declare function findConflictingAdapters(executable: string, excludeId: string): ConflictingAdapter[];
2
207
 
3
208
  interface AuthData {
4
209
  idp: string;
@@ -54,4 +259,4 @@ declare class CliExit extends Error {
54
259
  constructor(exitCode?: number);
55
260
  }
56
261
 
57
- export { type ApesConfig, ApiError, type AuthData, CliError, CliExit, apiFetch, clearAuth, discoverEndpoints, getAuthToken, getIdpUrl, getRequesterIdentity, loadAuth, loadConfig, parseDuration, saveAuth, saveConfig };
262
+ export { type AdapterMeta, type ApesConfig, ApiError, type AuthData, type BuiltGrantRequest, CliError, CliExit, type GrantRequestOptions, type LoadedAdapter, type RegistryEntry, type RegistryIndex, type ResolvedCapability, type ResolvedCommand, type ShapesAdapter, type ShapesOperation, apiFetch, appendAuditLog, buildExactCommandGrantRequest, buildStructuredCliGrantRequest, clearAuth, createShapesGrant, discoverEndpoints, extractOption, extractShellCommandString, extractWrappedCommand, fetchGrantToken, fetchRegistry, findAdapter, findConflictingAdapters, findExistingGrant, getAuthToken, getIdpUrl, getInstalledDigest, getRequesterIdentity, installAdapter, isInstalled, loadAdapter, loadAuth, loadConfig, loadOrInstallAdapter, parseDuration, parseShellCommand, removeAdapter, resolveAdapterPath, resolveCapabilityRequest, resolveCommand, saveAuth, saveConfig, searchAdapters, tryLoadAdapter, verifyAndExecute, waitForGrantStatus };
package/dist/index.js CHANGED
@@ -7,52 +7,55 @@ import {
7
7
  import {
8
8
  ApiError,
9
9
  apiFetch,
10
+ appendAuditLog,
11
+ buildExactCommandGrantRequest,
12
+ buildStructuredCliGrantRequest,
10
13
  clearAuth,
14
+ createShapesGrant,
11
15
  discoverEndpoints,
16
+ extractOption,
17
+ extractShellCommandString,
18
+ extractWrappedCommand,
19
+ fetchGrantToken,
20
+ fetchRegistry,
21
+ findAdapter,
22
+ findConflictingAdapters,
23
+ findExistingGrant,
12
24
  getAuthToken,
13
25
  getIdpUrl,
26
+ getInstalledDigest,
14
27
  getRequesterIdentity,
28
+ installAdapter,
29
+ isInstalled,
30
+ loadAdapter,
15
31
  loadAuth,
16
32
  loadConfig,
17
- saveAuth,
18
- saveConfig
19
- } from "./chunk-KXESKY4X.js";
20
-
21
- // src/index.ts
22
- import {
23
- loadAdapter,
33
+ loadOrInstallAdapter,
34
+ parseShellCommand,
35
+ removeAdapter,
24
36
  resolveAdapterPath,
25
37
  resolveCapabilityRequest,
26
38
  resolveCommand,
27
- buildExactCommandGrantRequest,
28
- buildStructuredCliGrantRequest,
29
- fetchRegistry,
30
- findAdapter,
39
+ saveAuth,
40
+ saveConfig,
31
41
  searchAdapters,
32
- findConflictingAdapters,
33
- getInstalledDigest,
34
- installAdapter,
35
- isInstalled,
36
- removeAdapter,
37
- extractWrappedCommand,
38
- extractOption,
39
- createShapesGrant,
40
- fetchGrantToken,
41
- findExistingGrant,
42
+ tryLoadAdapter,
42
43
  verifyAndExecute,
43
44
  waitForGrantStatus
44
- } from "@openape/shapes";
45
+ } from "./chunk-G3Q2TMAI.js";
45
46
  export {
46
47
  ApiError,
47
48
  CliError,
48
49
  CliExit,
49
50
  apiFetch,
51
+ appendAuditLog,
50
52
  buildExactCommandGrantRequest,
51
53
  buildStructuredCliGrantRequest,
52
54
  clearAuth,
53
55
  createShapesGrant,
54
56
  discoverEndpoints,
55
57
  extractOption,
58
+ extractShellCommandString,
56
59
  extractWrappedCommand,
57
60
  fetchGrantToken,
58
61
  fetchRegistry,
@@ -68,7 +71,9 @@ export {
68
71
  loadAdapter,
69
72
  loadAuth,
70
73
  loadConfig,
74
+ loadOrInstallAdapter,
71
75
  parseDuration,
76
+ parseShellCommand,
72
77
  removeAdapter,
73
78
  resolveAdapterPath,
74
79
  resolveCapabilityRequest,
@@ -76,6 +81,7 @@ export {
76
81
  saveAuth,
77
82
  saveConfig,
78
83
  searchAdapters,
84
+ tryLoadAdapter,
79
85
  verifyAndExecute,
80
86
  waitForGrantStatus
81
87
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Re-export all shapes library functions\nexport {\n loadAdapter,\n resolveAdapterPath,\n resolveCapabilityRequest,\n resolveCommand,\n buildExactCommandGrantRequest,\n buildStructuredCliGrantRequest,\n fetchRegistry,\n findAdapter,\n searchAdapters,\n findConflictingAdapters,\n getInstalledDigest,\n installAdapter,\n isInstalled,\n removeAdapter,\n extractWrappedCommand,\n extractOption,\n createShapesGrant,\n fetchGrantToken,\n findExistingGrant,\n verifyAndExecute,\n waitForGrantStatus,\n} from '@openape/shapes'\n\nexport type {\n AdapterMeta,\n BuiltGrantRequest,\n GrantRequestOptions,\n LoadedAdapter,\n RegistryEntry,\n RegistryIndex,\n ResolvedCapability,\n ResolvedCommand,\n ShapesAdapter,\n ShapesOperation,\n} from '@openape/shapes'\n\n// Apes-specific exports\nexport { loadAuth, saveAuth, clearAuth, loadConfig, saveConfig, getIdpUrl, getAuthToken, getRequesterIdentity } from './config'\nexport type { AuthData, ApesConfig } from './config'\nexport { apiFetch, discoverEndpoints, ApiError } from './http'\nexport { parseDuration } from './duration'\nexport { CliError, CliExit } from './errors'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,11 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  apiFetch,
4
+ createShapesGrant,
5
+ fetchGrantToken,
4
6
  getAuthToken,
5
7
  getGrantsEndpoint,
6
8
  getIdpUrl,
7
- getRequesterIdentity
8
- } from "./chunk-KXESKY4X.js";
9
+ getRequesterIdentity,
10
+ loadAdapter,
11
+ resolveCommand,
12
+ verifyAndExecute
13
+ } from "./chunk-G3Q2TMAI.js";
9
14
 
10
15
  // src/commands/mcp/server.ts
11
16
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -16,20 +21,12 @@ import consola from "consola";
16
21
 
17
22
  // src/commands/mcp/tools.ts
18
23
  import { hostname } from "os";
19
- import {
20
- createShapesGrant,
21
- fetchGrantToken,
22
- loadAdapter as loadAdapter2,
23
- resolveCommand,
24
- verifyAndExecute
25
- } from "@openape/shapes";
26
24
  import { z } from "zod";
27
25
 
28
26
  // src/commands/mcp/adapter-tools.ts
29
27
  import { readdirSync } from "fs";
30
28
  import { homedir } from "os";
31
29
  import { join } from "path";
32
- import { loadAdapter } from "@openape/shapes";
33
30
  function operationToInputSchema(op) {
34
31
  const properties = {};
35
32
  const required = [];
@@ -174,7 +171,7 @@ function registerStaticTools(server) {
174
171
  }
175
172
  }, async ({ command, adapter }) => {
176
173
  try {
177
- const loaded = loadAdapter2(command[0], adapter);
174
+ const loaded = loadAdapter(command[0], adapter);
178
175
  const resolved = await resolveCommand(loaded, command);
179
176
  return {
180
177
  content: [{
@@ -255,7 +252,7 @@ function registerAdapterTools(server) {
255
252
  if (!idp)
256
253
  return { content: [{ type: "text", text: "Not configured. Run `apes login` first." }], isError: true };
257
254
  try {
258
- const loaded = loadAdapter2(tool.adapterId);
255
+ const loaded = loadAdapter(tool.adapterId);
259
256
  const op = loaded.adapter.operations.find((o) => o.id === tool.operationId);
260
257
  if (!op)
261
258
  return { content: [{ type: "text", text: `Operation ${tool.operationId} not found` }], isError: true };
@@ -302,7 +299,7 @@ function registerAdapterTools(server) {
302
299
  async function startMcpServer(transport, port) {
303
300
  const server = new McpServer({
304
301
  name: "apes",
305
- version: true ? "0.6.0" : "0.1.0"
302
+ version: true ? "0.6.1" : "0.1.0"
306
303
  });
307
304
  registerStaticTools(server);
308
305
  registerAdapterTools(server);
@@ -330,4 +327,4 @@ async function startMcpServer(transport, port) {
330
327
  export {
331
328
  startMcpServer
332
329
  };
333
- //# sourceMappingURL=server-IYR5LM63.js.map
330
+ //# sourceMappingURL=server-FR6GFS3S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/mcp/server.ts","../src/commands/mcp/tools.ts","../src/commands/mcp/adapter-tools.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'\nimport { createServer } from 'node:http'\nimport consola from 'consola'\nimport { registerAdapterTools, registerStaticTools } from './tools'\n\ndeclare const __VERSION__: string\n\nexport async function startMcpServer(transport: 'stdio' | 'sse', port: number) {\n const server = new McpServer({\n name: 'apes',\n version: typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.1.0',\n })\n\n // Register static tools\n registerStaticTools(server)\n\n // Register adapter-derived tools\n registerAdapterTools(server)\n\n if (transport === 'stdio') {\n const stdioTransport = new StdioServerTransport()\n await server.connect(stdioTransport)\n }\n else if (transport === 'sse') {\n const httpServer = createServer(async (req, res) => {\n if (req.url === '/sse' && req.method === 'GET') {\n const sseTransport = new SSEServerTransport('/messages', res)\n await server.connect(sseTransport)\n }\n else if (req.url === '/messages' && req.method === 'POST') {\n // SSE message handling is done by the transport\n res.writeHead(200)\n res.end()\n }\n else {\n res.writeHead(404)\n res.end('Not found')\n }\n })\n\n httpServer.listen(port, () => {\n consola.info(`MCP SSE server listening on http://localhost:${port}/sse`)\n })\n }\n}\n","import { hostname } from 'node:os'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport {\n createShapesGrant,\n fetchGrantToken,\n loadAdapter,\n resolveCommand,\n verifyAndExecute,\n} from '../../shapes/index.js'\nimport { z } from 'zod'\nimport { getAuthToken, getIdpUrl, getRequesterIdentity } from '../../config'\nimport { apiFetch, getGrantsEndpoint } from '../../http'\nimport { loadAdapterTools } from './adapter-tools'\n\nexport function registerStaticTools(server: McpServer) {\n server.registerTool('apes.grants.list', {\n description: 'List grants',\n inputSchema: {\n status: z.string().optional().describe('Filter by status: pending, approved, denied, revoked, used'),\n limit: z.string().optional().describe('Max results'),\n },\n }, async ({ status, limit }) => {\n const idp = getIdpUrl()\n if (!idp)\n return { content: [{ type: 'text' as const, text: 'Not configured. Run `apes login` first.' }] }\n\n const grantsUrl = await getGrantsEndpoint(idp)\n const params = new URLSearchParams()\n if (status)\n params.set('status', status)\n if (limit)\n params.set('limit', limit)\n const query = params.toString() ? `?${params.toString()}` : ''\n const response = await apiFetch(`${grantsUrl}${query}`)\n return { content: [{ type: 'text' as const, text: JSON.stringify(response, null, 2) }] }\n })\n\n server.registerTool('apes.grants.request', {\n description: 'Request a grant for a command',\n inputSchema: {\n command: z.string().describe('Command to request permission for'),\n audience: z.string().describe('Service identifier (e.g. escapes, proxy, shapes)'),\n approval: z.string().optional().describe('once, timed, or always'),\n reason: z.string().optional().describe('Reason for the request'),\n },\n }, async ({ command, audience, approval, reason }) => {\n const idp = getIdpUrl()\n const requester = getRequesterIdentity()\n if (!idp || !requester)\n return { content: [{ type: 'text' as const, text: 'Not authenticated. Run `apes login` first.' }] }\n\n const grantsUrl = await getGrantsEndpoint(idp)\n const cmdParts = command.split(' ')\n const grant = await apiFetch<{ id: string, status: string }>(grantsUrl, {\n method: 'POST',\n body: {\n requester,\n target_host: hostname(),\n audience,\n grant_type: approval || 'once',\n command: cmdParts,\n reason: reason || command,\n },\n })\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n status: 'pending_approval',\n grant_id: grant.id,\n approve_url: `${idp}/grant-approval?grant_id=${grant.id}`,\n message: 'Grant needs approval. Approve via URL or `apes grants approve <id>`, then retry with grant_id.',\n }, null, 2),\n }],\n }\n })\n\n server.registerTool('apes.config.get', {\n description: 'Get apes configuration value',\n inputSchema: {\n key: z.string().describe('Config key: idp, email'),\n },\n }, ({ key }) => {\n if (key === 'idp') {\n const idp = getIdpUrl()\n return { content: [{ type: 'text' as const, text: idp || 'Not configured' }] }\n }\n if (key === 'email') {\n const email = getRequesterIdentity()\n return { content: [{ type: 'text' as const, text: email || 'Not logged in' }] }\n }\n return { content: [{ type: 'text' as const, text: `Unknown key: ${key}` }] }\n })\n\n server.registerTool('apes.explain', {\n description: 'Show what permissions a command would need',\n inputSchema: {\n command: z.array(z.string()).describe('Command as array of strings (e.g. [\"gh\", \"repo\", \"list\"])'),\n adapter: z.string().optional().describe('Explicit adapter TOML path'),\n },\n }, async ({ command, adapter }) => {\n try {\n const loaded = loadAdapter(command[0]!, adapter)\n const resolved = await resolveCommand(loaded, command)\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n adapter: resolved.adapter.cli.id,\n operation: resolved.detail.operation_id,\n display: resolved.detail.display,\n permission: resolved.permission,\n resource_chain: resolved.detail.resource_chain,\n exact_command: resolved.detail.constraints?.exact_command ?? false,\n adapter_digest: resolved.digest,\n }, null, 2),\n }],\n }\n }\n catch (err) {\n return { content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true }\n }\n })\n\n server.registerTool('apes.adapter.list', {\n description: 'List installed CLI adapters',\n }, () => {\n const tools = loadAdapterTools()\n const adapters = [...new Set(tools.map(t => t.adapterId))]\n return {\n content: [{\n type: 'text' as const,\n text: adapters.length > 0\n ? `Installed adapters: ${adapters.join(', ')}`\n : 'No adapters installed.',\n }],\n }\n })\n\n server.registerTool('apes.fetch', {\n description: 'Make an authenticated HTTP request',\n inputSchema: {\n method: z.string().describe('HTTP method (GET, POST, PUT, DELETE)'),\n url: z.string().describe('URL to fetch'),\n body: z.string().optional().describe('Request body (JSON string)'),\n },\n }, async ({ method, url, body }) => {\n const token = getAuthToken()\n if (!token)\n return { content: [{ type: 'text' as const, text: 'Not authenticated. Run `apes login` first.' }], isError: true }\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: body || undefined,\n })\n const text = await response.text()\n try {\n return { content: [{ type: 'text' as const, text: JSON.stringify(JSON.parse(text), null, 2) }] }\n }\n catch {\n return { content: [{ type: 'text' as const, text }] }\n }\n })\n}\n\nexport function registerAdapterTools(server: McpServer) {\n const adapterTools = loadAdapterTools()\n\n for (const tool of adapterTools) {\n // Build Zod schema from adapter operation\n const schemaShape: Record<string, z.ZodType> = {\n grant_id: z.string().optional().describe('Grant ID from a previous pending_approval response'),\n }\n\n if (tool.inputSchema && typeof tool.inputSchema === 'object') {\n const props = (tool.inputSchema as { properties?: Record<string, { description?: string }> }).properties\n if (props) {\n for (const [key, val] of Object.entries(props)) {\n schemaShape[key] = z.string().optional().describe(val.description || key)\n }\n }\n }\n\n server.registerTool(tool.name, {\n description: tool.description,\n inputSchema: schemaShape,\n }, async (args) => {\n const idp = getIdpUrl()\n if (!idp)\n return { content: [{ type: 'text' as const, text: 'Not configured. Run `apes login` first.' }], isError: true }\n\n try {\n const loaded = loadAdapter(tool.adapterId)\n const op = loaded.adapter.operations.find(o => o.id === tool.operationId)\n if (!op)\n return { content: [{ type: 'text' as const, text: `Operation ${tool.operationId} not found` }], isError: true }\n\n const argv = [loaded.adapter.cli.executable, ...op.command]\n if (op.positionals) {\n for (const pos of op.positionals) {\n if (args[pos])\n argv.push(String(args[pos]))\n }\n }\n if (op.required_options) {\n for (const opt of op.required_options) {\n const name = opt.replace(/^--/, '')\n if (args[name])\n argv.push(opt, String(args[name]))\n }\n }\n\n const resolved = await resolveCommand(loaded, argv)\n\n if (args.grant_id) {\n const token = await fetchGrantToken(idp, String(args.grant_id))\n await verifyAndExecute(token, resolved)\n return { content: [{ type: 'text' as const, text: 'Command executed successfully.' }] }\n }\n\n const grant = await createShapesGrant(resolved, { idp, approval: 'once' })\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n status: 'pending_approval',\n grant_id: grant.id,\n approve_url: `${idp}/grant-approval?grant_id=${grant.id}`,\n message: 'Grant needs approval. Approve, then call this tool again with grant_id.',\n }, null, 2),\n }],\n }\n }\n catch (err) {\n return { content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true }\n }\n })\n }\n}\n","import { readdirSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { loadAdapter } from '../../shapes/index.js'\nimport type { ShapesOperation } from '../../shapes/index.js'\n\nexport interface AdapterToolDef {\n name: string\n description: string\n inputSchema: Record<string, unknown>\n adapterId: string\n operationId: string\n}\n\nfunction operationToInputSchema(op: ShapesOperation): Record<string, unknown> {\n const properties: Record<string, unknown> = {}\n const required: string[] = []\n\n if (op.positionals) {\n for (const pos of op.positionals) {\n properties[pos] = { type: 'string', description: `Positional argument: ${pos}` }\n required.push(pos)\n }\n }\n\n if (op.required_options) {\n for (const opt of op.required_options) {\n const name = opt.replace(/^--/, '')\n properties[name] = { type: 'string', description: `Required option: ${opt}` }\n required.push(name)\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n }\n}\n\nfunction scanAdapterDir(dir: string): string[] {\n try {\n return readdirSync(dir)\n .filter(f => f.endsWith('.toml'))\n .map(f => f.replace('.toml', ''))\n }\n catch {\n return []\n }\n}\n\nexport function loadAdapterTools(): AdapterToolDef[] {\n const tools: AdapterToolDef[] = []\n const seen = new Set<string>()\n\n const adapterDirs = [\n join(process.cwd(), '.openape', 'shapes', 'adapters'),\n join(homedir(), '.openape', 'shapes', 'adapters'),\n '/etc/openape/shapes/adapters',\n ]\n\n for (const dir of adapterDirs) {\n for (const id of scanAdapterDir(dir)) {\n if (seen.has(id))\n continue\n seen.add(id)\n\n try {\n const loaded = loadAdapter(id)\n for (const op of loaded.adapter.operations) {\n tools.push({\n name: `apes.run.${id}.${op.id}`,\n description: op.display || `${id}: ${op.id}`,\n inputSchema: operationToInputSchema(op),\n adapterId: id,\n operationId: op.id,\n })\n }\n }\n catch {\n // Skip adapters that fail to load\n }\n }\n }\n\n return tools\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openape/apes",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "turbo": {
5
5
  "tags": [
6
6
  "publishable"
@@ -9,7 +9,8 @@
9
9
  "description": "Unified CLI + MCP Server for OpenApe",
10
10
  "type": "module",
11
11
  "bin": {
12
- "apes": "./dist/cli.js"
12
+ "apes": "./dist/cli.js",
13
+ "ape-shell": "./dist/cli.js"
13
14
  },
14
15
  "exports": {
15
16
  ".": {
@@ -18,26 +19,29 @@
18
19
  }
19
20
  },
20
21
  "files": [
21
- "dist"
22
+ "dist",
23
+ "README.md"
22
24
  ],
23
25
  "dependencies": {
24
26
  "@modelcontextprotocol/sdk": "^1.27.1",
25
27
  "citty": "^0.1.6",
26
28
  "consola": "^3.4.2",
27
29
  "giget": "^2.0.0",
30
+ "shell-quote": "^1.8.3",
28
31
  "zod": "^4.3.6",
29
- "@openape/grants": "0.7.0",
30
- "@openape/shapes": "0.6.1",
31
- "@openape/core": "0.12.0"
32
+ "@openape/core": "0.12.0",
33
+ "@openape/grants": "0.8.0"
32
34
  },
33
35
  "devDependencies": {
34
36
  "@types/node": "^25.3.5",
37
+ "@types/shell-quote": "^1.7.5",
38
+ "@vitest/coverage-istanbul": "^2.1.9",
35
39
  "h3": "^1.15.0",
36
40
  "jose": "^5.9.0",
37
41
  "tsup": "^8.5.1",
38
42
  "typescript": "^5.8.2",
39
43
  "vitest": "^3.2.4",
40
- "@openape/server": "0.2.0"
44
+ "@openape/server": "0.2.1"
41
45
  },
42
46
  "license": "MIT",
43
47
  "author": "Patrick Hofmann <phofmann@delta-mind.at>",
@@ -53,7 +57,7 @@
53
57
  "build": "tsup",
54
58
  "lint": "eslint .",
55
59
  "typecheck": "tsc --noEmit",
56
- "test": "vitest run",
60
+ "test": "vitest run --coverage",
57
61
  "test:coverage": "vitest run --coverage"
58
62
  }
59
63
  }