needware-cli 1.6.1 → 1.6.3
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/tools/supabase-deploy-functions-tool.d.ts +1 -3
- package/dist/tools/supabase-deploy-functions-tool.d.ts.map +1 -1
- package/dist/tools/supabase-deploy-functions-tool.js +37 -38
- package/dist/tools/supabase-deploy-functions-tool.js.map +1 -1
- package/package.json +1 -1
- package/skills/resend-integration/SKILL.md +13 -2
|
@@ -8,10 +8,8 @@ import { z } from 'zod';
|
|
|
8
8
|
export declare class SupabaseDeployFunctionsTool extends BaseTool {
|
|
9
9
|
definition: ToolDefinition;
|
|
10
10
|
getZodSchema(): {
|
|
11
|
-
functionName: z.
|
|
11
|
+
functionName: z.ZodString;
|
|
12
12
|
functionPath: z.ZodOptional<z.ZodString>;
|
|
13
|
-
noVerifyJwt: z.ZodOptional<z.ZodBoolean>;
|
|
14
|
-
importMap: z.ZodOptional<z.ZodString>;
|
|
15
13
|
};
|
|
16
14
|
execute(input: Record<string, any>): Promise<ToolResult>;
|
|
17
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-deploy-functions-tool.d.ts","sourceRoot":"","sources":["../../src/tools/supabase-deploy-functions-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"supabase-deploy-functions-tool.d.ts","sourceRoot":"","sources":["../../src/tools/supabase-deploy-functions-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkBxB,qBAAa,2BAA4B,SAAQ,QAAQ;IACvD,UAAU,EAAE,cAAc,CAiBxB;IAEF,YAAY;;;;IAON,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CA2G/D"}
|
|
@@ -5,48 +5,58 @@
|
|
|
5
5
|
import { BaseTool } from './base-tool.js';
|
|
6
6
|
import chalk from 'chalk';
|
|
7
7
|
import { z } from 'zod';
|
|
8
|
+
import fs from 'fs/promises';
|
|
9
|
+
import path from 'path';
|
|
8
10
|
export class SupabaseDeployFunctionsTool extends BaseTool {
|
|
9
11
|
definition = {
|
|
10
12
|
name: 'supabase-deploy-functions',
|
|
11
|
-
description: 'Deploy Supabase Edge
|
|
13
|
+
description: 'Deploy a Supabase Edge Function by reading the function code and deploying it to your Supabase project.',
|
|
12
14
|
input_schema: {
|
|
13
15
|
type: 'object',
|
|
14
16
|
properties: {
|
|
15
17
|
functionName: {
|
|
16
18
|
type: 'string',
|
|
17
|
-
description: 'Name of the function to deploy
|
|
19
|
+
description: 'Name of the function to deploy (required)',
|
|
18
20
|
},
|
|
19
21
|
functionPath: {
|
|
20
22
|
type: 'string',
|
|
21
|
-
description: 'Path to the function
|
|
22
|
-
},
|
|
23
|
-
noVerifyJwt: {
|
|
24
|
-
type: 'boolean',
|
|
25
|
-
description: 'Deploy without JWT verification (useful for public functions)',
|
|
26
|
-
},
|
|
27
|
-
importMap: {
|
|
28
|
-
type: 'string',
|
|
29
|
-
description: 'Path to import map file',
|
|
23
|
+
description: 'Path to the function file. Defaults to supabase/functions/<functionName>/index.ts',
|
|
30
24
|
},
|
|
31
25
|
},
|
|
32
|
-
required: [],
|
|
26
|
+
required: ['functionName'],
|
|
33
27
|
},
|
|
34
28
|
};
|
|
35
29
|
getZodSchema() {
|
|
36
30
|
return {
|
|
37
|
-
functionName: z.string().
|
|
38
|
-
functionPath: z.string().optional().describe('Path to the function
|
|
39
|
-
noVerifyJwt: z.boolean().optional().describe('Deploy without JWT verification'),
|
|
40
|
-
importMap: z.string().optional().describe('Path to import map file'),
|
|
31
|
+
functionName: z.string().describe('Name of the function to deploy'),
|
|
32
|
+
functionPath: z.string().optional().describe('Path to the function file'),
|
|
41
33
|
};
|
|
42
34
|
}
|
|
43
35
|
async execute(input) {
|
|
44
36
|
try {
|
|
45
37
|
// 验证并获取 Gateway 配置
|
|
46
38
|
this.validateGatewayConfig();
|
|
47
|
-
const { apiKey, chatId
|
|
48
|
-
const { functionName, functionPath
|
|
49
|
-
|
|
39
|
+
const { apiKey, chatId } = this.getGatewayConfig();
|
|
40
|
+
const { functionName, functionPath } = input;
|
|
41
|
+
if (!functionName) {
|
|
42
|
+
throw new Error('functionName is required');
|
|
43
|
+
}
|
|
44
|
+
// 1. 确定函数文件路径
|
|
45
|
+
const workspacePath = process.cwd();
|
|
46
|
+
const defaultFunctionPath = path.join('supabase', 'functions', functionName, 'index.ts');
|
|
47
|
+
const actualFunctionPath = functionPath || defaultFunctionPath;
|
|
48
|
+
const fullPath = path.join(workspacePath, actualFunctionPath);
|
|
49
|
+
console.log(chalk.blue(`📖 读取函数代码: ${actualFunctionPath}`));
|
|
50
|
+
// 2. 读取函数代码
|
|
51
|
+
let functionCode;
|
|
52
|
+
try {
|
|
53
|
+
functionCode = await fs.readFile(fullPath, 'utf-8');
|
|
54
|
+
console.log(chalk.green(`✓ 成功读取函数代码 (${functionCode.length} 字符)`));
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new Error(`Failed to read function file at ${actualFunctionPath}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
58
|
+
}
|
|
59
|
+
// 3. 先检查 Supabase 项目状态
|
|
50
60
|
console.log(chalk.blue('🔍 检查 Supabase 项目状态...'));
|
|
51
61
|
const statusUrl = `https://www.needware.dev/api/supabase/status?chatId=${chatId}`;
|
|
52
62
|
const statusResponse = await fetch(statusUrl, {
|
|
@@ -64,26 +74,14 @@ export class SupabaseDeployFunctionsTool extends BaseTool {
|
|
|
64
74
|
}
|
|
65
75
|
const projectId = statusData.data.projectId;
|
|
66
76
|
console.log(chalk.green(`✓ 找到 Supabase 项目: ${projectId}`));
|
|
67
|
-
//
|
|
68
|
-
console.log(chalk.blue(`🚀 开始部署 Edge Function
|
|
77
|
+
// 4. 部署 Edge Function
|
|
78
|
+
console.log(chalk.blue(`🚀 开始部署 Edge Function: ${functionName}...`));
|
|
69
79
|
const deployUrl = 'https://www.needware.dev/api/supabase/deploy-function';
|
|
70
80
|
const deployPayload = {
|
|
71
81
|
chatId,
|
|
72
|
-
|
|
73
|
-
|
|
82
|
+
functionName,
|
|
83
|
+
functionCode,
|
|
74
84
|
};
|
|
75
|
-
if (functionName) {
|
|
76
|
-
deployPayload.functionName = functionName;
|
|
77
|
-
}
|
|
78
|
-
if (functionPath) {
|
|
79
|
-
deployPayload.functionPath = functionPath;
|
|
80
|
-
}
|
|
81
|
-
if (noVerifyJwt !== undefined) {
|
|
82
|
-
deployPayload.noVerifyJwt = noVerifyJwt;
|
|
83
|
-
}
|
|
84
|
-
if (importMap) {
|
|
85
|
-
deployPayload.importMap = importMap;
|
|
86
|
-
}
|
|
87
85
|
const deployResponse = await fetch(deployUrl, {
|
|
88
86
|
method: 'POST',
|
|
89
87
|
headers: {
|
|
@@ -101,7 +99,7 @@ export class SupabaseDeployFunctionsTool extends BaseTool {
|
|
|
101
99
|
throw new Error(`Deploy failed: ${deployData.error || deployData.message || 'Unknown error'}`);
|
|
102
100
|
}
|
|
103
101
|
console.log(chalk.green('✓ Edge Function 部署成功'));
|
|
104
|
-
//
|
|
102
|
+
// 5. 构建返回信息
|
|
105
103
|
const resultMessage = `Supabase Edge Function deployed successfully!
|
|
106
104
|
|
|
107
105
|
${deployData.message}
|
|
@@ -114,11 +112,12 @@ ${deployData.data ? `Deployment Details:
|
|
|
114
112
|
- Deployed At: ${deployData.data.deployedAt}` : ''}
|
|
115
113
|
|
|
116
114
|
Project ID: ${projectId}
|
|
117
|
-
|
|
115
|
+
Function: ${functionName}
|
|
116
|
+
Source File: ${actualFunctionPath}`;
|
|
118
117
|
return this.successWithContent(resultMessage);
|
|
119
118
|
}
|
|
120
119
|
catch (error) {
|
|
121
|
-
const message = error instanceof Error ? error.message : 'Failed to deploy Supabase Edge
|
|
120
|
+
const message = error instanceof Error ? error.message : 'Failed to deploy Supabase Edge Function';
|
|
122
121
|
console.log(chalk.red(`\n✖ ${message}\n`));
|
|
123
122
|
return this.errorWithContent(message);
|
|
124
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-deploy-functions-tool.js","sourceRoot":"","sources":["../../src/tools/supabase-deploy-functions-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"supabase-deploy-functions-tool.js","sourceRoot":"","sources":["../../src/tools/supabase-deploy-functions-tool.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -120,8 +120,11 @@ const corsHeaders = {
|
|
|
120
120
|
"Access-Control-Allow-Origin": "*",
|
|
121
121
|
"Access-Control-Allow-Headers":
|
|
122
122
|
"authorization, x-client-info, apikey, content-type",
|
|
123
|
+
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
124
|
+
"Access-Control-Max-Age": "86400",
|
|
123
125
|
};
|
|
124
126
|
|
|
127
|
+
|
|
125
128
|
interface EmailRequest {
|
|
126
129
|
to: string;
|
|
127
130
|
subject: string;
|
|
@@ -131,7 +134,10 @@ interface EmailRequest {
|
|
|
131
134
|
const handler = async (req: Request): Promise<Response> => {
|
|
132
135
|
// Handle CORS preflight requests
|
|
133
136
|
if (req.method === "OPTIONS") {
|
|
134
|
-
return new Response(null, {
|
|
137
|
+
return new Response(null, {
|
|
138
|
+
status: 200,
|
|
139
|
+
headers: corsHeaders
|
|
140
|
+
});
|
|
135
141
|
}
|
|
136
142
|
|
|
137
143
|
try {
|
|
@@ -186,7 +192,10 @@ interface BatchEmailRequest {
|
|
|
186
192
|
|
|
187
193
|
const handler = async (req: Request): Promise<Response> => {
|
|
188
194
|
if (req.method === "OPTIONS") {
|
|
189
|
-
return new Response(null, {
|
|
195
|
+
return new Response(null, {
|
|
196
|
+
status: 200,
|
|
197
|
+
headers: corsHeaders
|
|
198
|
+
});
|
|
190
199
|
}
|
|
191
200
|
|
|
192
201
|
try {
|
|
@@ -251,6 +260,8 @@ const corsHeaders = {
|
|
|
251
260
|
"Access-Control-Allow-Origin": "*",
|
|
252
261
|
"Access-Control-Allow-Headers":
|
|
253
262
|
"authorization, x-client-info, apikey, content-type",
|
|
263
|
+
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
264
|
+
"Access-Control-Max-Age": "86400",
|
|
254
265
|
};
|
|
255
266
|
|
|
256
267
|
interface AlertEmailRequest {
|