fridayy 1.0.2 ā 1.2.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 +12 -0
- package/dist/adapters/nodejs/ast-scanner.d.ts +5 -3
- package/dist/adapters/nodejs/ast-scanner.d.ts.map +1 -1
- package/dist/adapters/nodejs/ast-scanner.js +104 -29
- package/dist/adapters/nodejs/ast-scanner.js.map +1 -1
- package/dist/adapters/rest/adapter.d.ts +1 -0
- package/dist/adapters/rest/adapter.d.ts.map +1 -1
- package/dist/adapters/rest/adapter.js +118 -2
- package/dist/adapters/rest/adapter.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +45 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +11 -1
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +58 -8
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/scan.d.ts.map +1 -1
- package/dist/cli/commands/scan.js +33 -17
- package/dist/cli/commands/scan.js.map +1 -1
- package/dist/cli/commands/use.d.ts +7 -0
- package/dist/cli/commands/use.d.ts.map +1 -0
- package/dist/cli/commands/use.js +89 -0
- package/dist/cli/commands/use.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ui/banner.js +1 -1
- package/dist/core/discovery/project-scanner.d.ts.map +1 -1
- package/dist/core/discovery/project-scanner.js +29 -19
- package/dist/core/discovery/project-scanner.js.map +1 -1
- package/dist/core/tool-generator/generator.d.ts +3 -1
- package/dist/core/tool-generator/generator.d.ts.map +1 -1
- package/dist/core/tool-generator/generator.js +33 -5
- package/dist/core/tool-generator/generator.js.map +1 -1
- package/package.json +2 -1
- package/point/AI_INSTRUCTIONS.md +130 -0
- package/point/PROJECT_CONTEXT.md +61 -0
- package/point/QUICK_START_PROMPT.md +27 -0
package/README.md
CHANGED
|
@@ -76,6 +76,9 @@ npx fridayy init
|
|
|
76
76
|
### 2. The 4-Step Developer Experience
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
+
# How-To & Architecture guide
|
|
80
|
+
fridayy use
|
|
81
|
+
|
|
79
82
|
# Step 1: Initialize Fridayy configuration in your project
|
|
80
83
|
fridayy init
|
|
81
84
|
|
|
@@ -94,6 +97,15 @@ fridayy start
|
|
|
94
97
|
|
|
95
98
|
---
|
|
96
99
|
|
|
100
|
+
### š¤ Pointing AI Assistants to Your Project
|
|
101
|
+
|
|
102
|
+
Simply point any LLM or AI agent (Cursor, Claude, ChatGPT, Gemini, Antigravity) to:
|
|
103
|
+
š **[`point/AI_INSTRUCTIONS.md`](point/AI_INSTRUCTIONS.md)**
|
|
104
|
+
|
|
105
|
+
The AI will automatically understand your architecture, discover endpoints, generate tools, configure safe permissions, and run the MCP server autonomously!
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
97
109
|
## šļø Architecture
|
|
98
110
|
|
|
99
111
|
fridayy is built with a modular, extensible architecture designed for future pluggability:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Fridayy - Node.js Route Scanner
|
|
3
|
-
* Scans JavaScript and TypeScript files for Express
|
|
2
|
+
* Fridayy - Enhanced Node.js Route Scanner
|
|
3
|
+
* Scans JavaScript and TypeScript files for Express, Fastify, Koa, NestJS, and Next.js route declarations.
|
|
4
4
|
*/
|
|
5
5
|
export interface DiscoveredRoute {
|
|
6
6
|
method: string;
|
|
@@ -12,10 +12,12 @@ export interface DiscoveredRoute {
|
|
|
12
12
|
}
|
|
13
13
|
export declare class NodeJsScanner {
|
|
14
14
|
/**
|
|
15
|
-
* Scans a directory recursively for Express/Fastify routes.
|
|
15
|
+
* Scans a directory recursively for Express/Fastify/Koa/NestJS/Next.js routes.
|
|
16
16
|
*/
|
|
17
17
|
scanDirectory(rootDir: string, maxFiles?: number): Promise<DiscoveredRoute[]>;
|
|
18
18
|
scanFileContent(content: string, filePath: string): DiscoveredRoute[];
|
|
19
|
+
private scanNextJsRouteFile;
|
|
20
|
+
private extractComment;
|
|
19
21
|
private collectSourceFiles;
|
|
20
22
|
}
|
|
21
23
|
//# sourceMappingURL=ast-scanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-scanner.d.ts","sourceRoot":"","sources":["../../../src/adapters/nodejs/ast-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"ast-scanner.d.ts","sourceRoot":"","sources":["../../../src/adapters/nodejs/ast-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAWD,qBAAa,aAAa;IACxB;;OAEG;IACU,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA8BhF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAsD5E,OAAO,CAAC,mBAAmB;IAyC3B,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,kBAAkB;CA8B3B"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Fridayy - Node.js Route Scanner
|
|
3
|
-
* Scans JavaScript and TypeScript files for Express
|
|
2
|
+
* Fridayy - Enhanced Node.js Route Scanner
|
|
3
|
+
* Scans JavaScript and TypeScript files for Express, Fastify, Koa, NestJS, and Next.js route declarations.
|
|
4
4
|
*/
|
|
5
5
|
import fs from 'node:fs';
|
|
6
6
|
import path from 'node:path';
|
|
7
|
-
|
|
7
|
+
// Matches: app.get('/path', ...), router.post('/path', ...), server.delete('/path', ...), etc.
|
|
8
|
+
const ROUTE_PATTERN = /(?:app|router|fastify|server|api|v1|route|r|expressRouter)\.(get|post|put|patch|delete|options|head)\s*\(\s*(['"`])([^'"`]+)\2/gi;
|
|
9
|
+
// Matches NestJS / TypeScript decorators: @Get('/path'), @Post('/path'), etc.
|
|
10
|
+
const DECORATOR_PATTERN = /@(Get|Post|Put|Patch|Delete|Options|Head)\s*\(\s*(?:(['"`])([^'"`]*)\2)?\s*\)/gi;
|
|
11
|
+
// Matches chained routes: .route('/users').get(...).post(...)
|
|
12
|
+
const CHAINED_ROUTE_PATTERN = /\.route\s*\(\s*(['"`])([^'"`]+)\1\s*\)/gi;
|
|
8
13
|
export class NodeJsScanner {
|
|
9
14
|
/**
|
|
10
|
-
* Scans a directory recursively for Express/Fastify routes.
|
|
15
|
+
* Scans a directory recursively for Express/Fastify/Koa/NestJS/Next.js routes.
|
|
11
16
|
*/
|
|
12
|
-
async scanDirectory(rootDir, maxFiles =
|
|
17
|
+
async scanDirectory(rootDir, maxFiles = 500) {
|
|
13
18
|
const discovered = [];
|
|
14
19
|
const files = this.collectSourceFiles(rootDir, maxFiles);
|
|
15
20
|
for (const file of files) {
|
|
@@ -17,16 +22,28 @@ export class NodeJsScanner {
|
|
|
17
22
|
const content = fs.readFileSync(file, 'utf-8');
|
|
18
23
|
const fileRoutes = this.scanFileContent(content, file);
|
|
19
24
|
discovered.push(...fileRoutes);
|
|
25
|
+
// Also check if this file is a Next.js App Router / Pages API route
|
|
26
|
+
const nextJsRoutes = this.scanNextJsRouteFile(content, file, rootDir);
|
|
27
|
+
discovered.push(...nextJsRoutes);
|
|
20
28
|
}
|
|
21
29
|
catch {
|
|
22
30
|
// Skip unreadable files
|
|
23
31
|
}
|
|
24
32
|
}
|
|
25
|
-
|
|
33
|
+
// Deduplicate routes by method + path
|
|
34
|
+
const uniqueMap = new Map();
|
|
35
|
+
for (const r of discovered) {
|
|
36
|
+
const key = `${r.method}:${r.path}`;
|
|
37
|
+
if (!uniqueMap.has(key)) {
|
|
38
|
+
uniqueMap.set(key, r);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return Array.from(uniqueMap.values());
|
|
26
42
|
}
|
|
27
43
|
scanFileContent(content, filePath) {
|
|
28
44
|
const routes = [];
|
|
29
45
|
const lines = content.split('\n');
|
|
46
|
+
// 1. Standard Express / Fastify / Koa routes
|
|
30
47
|
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
31
48
|
const line = lines[lineIndex];
|
|
32
49
|
ROUTE_PATTERN.lastIndex = 0;
|
|
@@ -34,27 +51,7 @@ export class NodeJsScanner {
|
|
|
34
51
|
while ((match = ROUTE_PATTERN.exec(line)) !== null) {
|
|
35
52
|
const method = match[1].toUpperCase();
|
|
36
53
|
const routePath = match[3];
|
|
37
|
-
|
|
38
|
-
let comment;
|
|
39
|
-
if (lineIndex > 0) {
|
|
40
|
-
const prevLine = lines[lineIndex - 1].trim();
|
|
41
|
-
if (prevLine.startsWith('//')) {
|
|
42
|
-
comment = prevLine.replace(/^\/\/\s*/, '');
|
|
43
|
-
}
|
|
44
|
-
else if (prevLine.endsWith('*/')) {
|
|
45
|
-
// Find start of JSDoc block
|
|
46
|
-
let jsDocStart = lineIndex - 1;
|
|
47
|
-
while (jsDocStart > 0 && !lines[jsDocStart].includes('/**')) {
|
|
48
|
-
jsDocStart--;
|
|
49
|
-
}
|
|
50
|
-
const block = lines.slice(jsDocStart, lineIndex).join('\n');
|
|
51
|
-
const summaryMatch = block.match(/@summary\s+([^\n*]+)/i) || block.match(/\*\s*([^*@\n/]+)/);
|
|
52
|
-
if (summaryMatch) {
|
|
53
|
-
comment = summaryMatch[1].trim();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
// Extract path parameters like :id or :userId
|
|
54
|
+
const comment = this.extractComment(lines, lineIndex);
|
|
58
55
|
const pathParams = (routePath.match(/:[a-zA-Z0-9_]+/g) || []).map(p => p.slice(1));
|
|
59
56
|
routes.push({
|
|
60
57
|
method,
|
|
@@ -65,9 +62,87 @@ export class NodeJsScanner {
|
|
|
65
62
|
pathParams
|
|
66
63
|
});
|
|
67
64
|
}
|
|
65
|
+
// 2. NestJS Decorator style routes: @Get('/users')
|
|
66
|
+
DECORATOR_PATTERN.lastIndex = 0;
|
|
67
|
+
let decMatch;
|
|
68
|
+
while ((decMatch = DECORATOR_PATTERN.exec(line)) !== null) {
|
|
69
|
+
const method = decMatch[1].toUpperCase();
|
|
70
|
+
let subPath = decMatch[3] || '';
|
|
71
|
+
if (subPath && !subPath.startsWith('/')) {
|
|
72
|
+
subPath = `/${subPath}`;
|
|
73
|
+
}
|
|
74
|
+
const finalPath = subPath || '/';
|
|
75
|
+
const comment = this.extractComment(lines, lineIndex);
|
|
76
|
+
const pathParams = (finalPath.match(/:[a-zA-Z0-9_]+/g) || []).map(p => p.slice(1));
|
|
77
|
+
routes.push({
|
|
78
|
+
method,
|
|
79
|
+
path: finalPath,
|
|
80
|
+
file: filePath,
|
|
81
|
+
line: lineIndex + 1,
|
|
82
|
+
description: comment,
|
|
83
|
+
pathParams
|
|
84
|
+
});
|
|
85
|
+
}
|
|
68
86
|
}
|
|
69
87
|
return routes;
|
|
70
88
|
}
|
|
89
|
+
scanNextJsRouteFile(content, filePath, rootDir) {
|
|
90
|
+
const routes = [];
|
|
91
|
+
const rel = path.relative(rootDir, filePath).replace(/\\/g, '/');
|
|
92
|
+
// Check Next.js App Router: app/api/.../route.ts
|
|
93
|
+
const appRouterMatch = rel.match(/(?:src\/)?app\/(api\/.*?)\/route\.[jt]sx?$/i);
|
|
94
|
+
if (appRouterMatch) {
|
|
95
|
+
const apiPath = `/${appRouterMatch[1]}`;
|
|
96
|
+
const methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];
|
|
97
|
+
for (const m of methods) {
|
|
98
|
+
const regex = new RegExp(`export\\s+(?:async\\s+)?function\\s+${m}\\b`, 'i');
|
|
99
|
+
if (regex.test(content)) {
|
|
100
|
+
routes.push({
|
|
101
|
+
method: m,
|
|
102
|
+
path: apiPath,
|
|
103
|
+
file: filePath,
|
|
104
|
+
line: 1,
|
|
105
|
+
description: `Next.js App Router ${m} ${apiPath}`,
|
|
106
|
+
pathParams: (apiPath.match(/\[([a-zA-Z0-9_]+)\]/g) || []).map(p => p.slice(1, -1))
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Check Next.js Pages Router: pages/api/...
|
|
112
|
+
const pagesRouterMatch = rel.match(/(?:src\/)?pages\/(api\/.*?)\.[jt]sx?$/i);
|
|
113
|
+
if (pagesRouterMatch) {
|
|
114
|
+
const apiPath = `/${pagesRouterMatch[1]}`.replace(/\/index$/, '');
|
|
115
|
+
routes.push({
|
|
116
|
+
method: 'POST', // Default handler
|
|
117
|
+
path: apiPath,
|
|
118
|
+
file: filePath,
|
|
119
|
+
line: 1,
|
|
120
|
+
description: `Next.js Pages API ${apiPath}`,
|
|
121
|
+
pathParams: (apiPath.match(/\[([a-zA-Z0-9_]+)\]/g) || []).map(p => p.slice(1, -1))
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return routes;
|
|
125
|
+
}
|
|
126
|
+
extractComment(lines, lineIndex) {
|
|
127
|
+
if (lineIndex <= 0)
|
|
128
|
+
return undefined;
|
|
129
|
+
const prevLine = lines[lineIndex - 1].trim();
|
|
130
|
+
if (prevLine.startsWith('//')) {
|
|
131
|
+
return prevLine.replace(/^\/\/\s*/, '');
|
|
132
|
+
}
|
|
133
|
+
else if (prevLine.endsWith('*/')) {
|
|
134
|
+
let jsDocStart = lineIndex - 1;
|
|
135
|
+
while (jsDocStart > 0 && !lines[jsDocStart].includes('/**')) {
|
|
136
|
+
jsDocStart--;
|
|
137
|
+
}
|
|
138
|
+
const block = lines.slice(jsDocStart, lineIndex).join('\n');
|
|
139
|
+
const summaryMatch = block.match(/@summary\s+([^\n*]+)/i) || block.match(/\*\s*([^*@\n/]+)/);
|
|
140
|
+
if (summaryMatch) {
|
|
141
|
+
return summaryMatch[1].trim();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
71
146
|
collectSourceFiles(dir, maxFiles, collected = []) {
|
|
72
147
|
if (!fs.existsSync(dir))
|
|
73
148
|
return collected;
|
|
@@ -81,13 +156,13 @@ export class NodeJsScanner {
|
|
|
81
156
|
const fullPath = path.join(dir, entry.name);
|
|
82
157
|
if (entry.isDirectory()) {
|
|
83
158
|
// Ignore heavy or irrelevant folders
|
|
84
|
-
if (!['node_modules', 'dist', '.git', '.gemini', 'coverage', 'build', '.next'].includes(entry.name)) {
|
|
159
|
+
if (!['node_modules', 'dist', '.git', '.gemini', 'coverage', 'build', '.next', '.turbo', '.cache'].includes(entry.name)) {
|
|
85
160
|
this.collectSourceFiles(fullPath, maxFiles, collected);
|
|
86
161
|
}
|
|
87
162
|
}
|
|
88
163
|
else if (entry.isFile()) {
|
|
89
164
|
const ext = path.extname(entry.name).toLowerCase();
|
|
90
|
-
if (['.js', '.ts', '.mjs', '.cjs'].includes(ext) && !entry.name.endsWith('.d.ts') && !entry.name.includes('.test.')) {
|
|
165
|
+
if (['.js', '.ts', '.mjs', '.cjs', '.jsx', '.tsx'].includes(ext) && !entry.name.endsWith('.d.ts') && !entry.name.includes('.test.') && !entry.name.includes('.spec.')) {
|
|
91
166
|
collected.push(fullPath);
|
|
92
167
|
}
|
|
93
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-scanner.js","sourceRoot":"","sources":["../../../src/adapters/nodejs/ast-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"ast-scanner.js","sourceRoot":"","sources":["../../../src/adapters/nodejs/ast-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fridayy - Generic REST Adapter
|
|
3
3
|
* Adapter for executing and declaring arbitrary REST endpoints.
|
|
4
|
+
* Automatically provisions baseline operational tools when connected to an API URL.
|
|
4
5
|
*/
|
|
5
6
|
import { BaseAdapter, AdapterScanContext, AdapterGenerationContext, AdapterExecutionContext } from '../base.js';
|
|
6
7
|
import { FridayyToolDefinition, ToolExecutionResult } from '../../core/schema/types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/rest/adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/rest/adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAOpC,qBAAa,WAAY,SAAQ,WAAW;IAC1C,SAAgB,IAAI,UAAU;IAC9B,SAAgB,WAAW,qDAAqD;IAEhF,OAAO,CAAC,YAAY,CAAuB;IAE9B,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAQlF,aAAa,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAmGlF,WAAW,CACtB,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,mBAAmB,CAAC;CAqDhC"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fridayy - Generic REST Adapter
|
|
3
3
|
* Adapter for executing and declaring arbitrary REST endpoints.
|
|
4
|
+
* Automatically provisions baseline operational tools when connected to an API URL.
|
|
4
5
|
*/
|
|
5
6
|
import { BaseAdapter } from '../base.js';
|
|
6
7
|
import { buildHttpRequest } from '../openapi/request-builder.js';
|
|
7
8
|
import { defaultRestExecutor } from './executor.js';
|
|
8
9
|
import { AuthenticationManager } from '../../core/authentication/manager.js';
|
|
9
10
|
import { defaultSecretResolver } from '../../core/authentication/secret-resolver.js';
|
|
11
|
+
import { buildUnifiedInputSchema } from '../../core/schema/json-schema.js';
|
|
10
12
|
export class RestAdapter extends BaseAdapter {
|
|
11
13
|
name = 'rest';
|
|
12
14
|
description = 'Adapter for REST APIs and custom HTTP endpoints';
|
|
@@ -19,12 +21,126 @@ export class RestAdapter extends BaseAdapter {
|
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
23
|
async generateTools(context) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
const baseUrl = defaultSecretResolver.resolveBaseUrl(context.config?.source?.baseUrl || context.config?.source?.url) ||
|
|
25
|
+
'http://localhost:3000';
|
|
26
|
+
const tools = [];
|
|
27
|
+
// 1. Health check tool
|
|
28
|
+
tools.push({
|
|
29
|
+
id: 'tool_check_api_health',
|
|
30
|
+
name: 'check_api_health',
|
|
31
|
+
description: `Ping target API at ${baseUrl} to check availability and health status.`,
|
|
32
|
+
inputSchema: buildUnifiedInputSchema({
|
|
33
|
+
parameters: {
|
|
34
|
+
query: [
|
|
35
|
+
{
|
|
36
|
+
name: 'path',
|
|
37
|
+
in: 'query',
|
|
38
|
+
required: false,
|
|
39
|
+
schema: { type: 'string', default: '/health' },
|
|
40
|
+
description: 'Health probe path (e.g. /health or /)'
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}),
|
|
45
|
+
source: {
|
|
46
|
+
type: 'rest',
|
|
47
|
+
method: 'GET',
|
|
48
|
+
path: '/health',
|
|
49
|
+
baseUrl
|
|
50
|
+
},
|
|
51
|
+
permissions: {
|
|
52
|
+
type: 'READ',
|
|
53
|
+
read: true,
|
|
54
|
+
write: false,
|
|
55
|
+
destructive: false
|
|
56
|
+
},
|
|
57
|
+
risk: 'low',
|
|
58
|
+
status: 'APPROVED',
|
|
59
|
+
metadata: {
|
|
60
|
+
createdAt: new Date().toISOString(),
|
|
61
|
+
autoGenerated: true
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
// 2. Dynamic REST Query Tool
|
|
65
|
+
tools.push({
|
|
66
|
+
id: 'tool_call_api_endpoint',
|
|
67
|
+
name: 'call_api_endpoint',
|
|
68
|
+
description: `Execute a structured HTTP request to the target API at ${baseUrl}.`,
|
|
69
|
+
inputSchema: {
|
|
70
|
+
type: 'object',
|
|
71
|
+
properties: {
|
|
72
|
+
path: {
|
|
73
|
+
type: 'string',
|
|
74
|
+
description: 'Relative endpoint path (e.g. /api/users or /products/123)'
|
|
75
|
+
},
|
|
76
|
+
method: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
|
|
79
|
+
default: 'GET',
|
|
80
|
+
description: 'HTTP method to execute'
|
|
81
|
+
},
|
|
82
|
+
queryParams: {
|
|
83
|
+
type: 'object',
|
|
84
|
+
description: 'Optional query parameters as key-value pairs',
|
|
85
|
+
additionalProperties: true
|
|
86
|
+
},
|
|
87
|
+
body: {
|
|
88
|
+
type: 'object',
|
|
89
|
+
description: 'Optional JSON payload for POST/PUT/PATCH requests',
|
|
90
|
+
additionalProperties: true
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
required: ['path']
|
|
94
|
+
},
|
|
95
|
+
source: {
|
|
96
|
+
type: 'rest',
|
|
97
|
+
method: 'GET',
|
|
98
|
+
path: '/',
|
|
99
|
+
baseUrl
|
|
100
|
+
},
|
|
101
|
+
permissions: {
|
|
102
|
+
type: 'WRITE',
|
|
103
|
+
read: true,
|
|
104
|
+
write: true,
|
|
105
|
+
destructive: false
|
|
106
|
+
},
|
|
107
|
+
risk: 'medium',
|
|
108
|
+
status: 'APPROVED',
|
|
109
|
+
metadata: {
|
|
110
|
+
createdAt: new Date().toISOString(),
|
|
111
|
+
autoGenerated: true
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return tools;
|
|
24
115
|
}
|
|
25
116
|
async executeTool(tool, input, context = {}) {
|
|
26
117
|
const authManager = new AuthenticationManager(context.config);
|
|
27
118
|
const baseUrl = defaultSecretResolver.resolveBaseUrl(context.config?.source?.baseUrl);
|
|
119
|
+
// If dynamic endpoint execution
|
|
120
|
+
if (tool.name === 'call_api_endpoint' && input.path) {
|
|
121
|
+
const dynamicTool = {
|
|
122
|
+
...tool,
|
|
123
|
+
source: {
|
|
124
|
+
...tool.source,
|
|
125
|
+
method: input.method || 'GET',
|
|
126
|
+
path: input.path.startsWith('/') ? input.path : `/${input.path}`
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const preparedReq = buildHttpRequest(dynamicTool, {
|
|
130
|
+
...(input.queryParams || {}),
|
|
131
|
+
...(input.body || {})
|
|
132
|
+
}, baseUrl);
|
|
133
|
+
if (context.headers) {
|
|
134
|
+
Object.assign(preparedReq.headers, context.headers);
|
|
135
|
+
}
|
|
136
|
+
authManager.applyAuth(tool.authentication, {
|
|
137
|
+
headers: preparedReq.headers,
|
|
138
|
+
queryParams: {}
|
|
139
|
+
});
|
|
140
|
+
return await this.restExecutor.execute(preparedReq, tool.name, {
|
|
141
|
+
timeoutMs: context.timeoutMs
|
|
142
|
+
});
|
|
143
|
+
}
|
|
28
144
|
const preparedReq = buildHttpRequest(tool, input, baseUrl);
|
|
29
145
|
if (context.headers) {
|
|
30
146
|
Object.assign(preparedReq.headers, context.headers);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/rest/adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/rest/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmK5D"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Fridayy - Doctor Command
|
|
3
3
|
* Diagnoses project configuration, environment variables, target API connectivity, and permissions.
|
|
4
4
|
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
5
7
|
import chalk from 'chalk';
|
|
6
8
|
import { defaultConfigManager } from '../../config/config-manager.js';
|
|
7
9
|
import { defaultSecretResolver } from '../../core/authentication/secret-resolver.js';
|
|
@@ -35,7 +37,46 @@ export function registerDoctorCommand(program) {
|
|
|
35
37
|
console.log(chalk.red('ā') + ' Configuration: fridayy.config.json not found (run `fridayy init`)');
|
|
36
38
|
errorCount++;
|
|
37
39
|
}
|
|
38
|
-
// 2. Check
|
|
40
|
+
// 2. Check Source Adapter & Files
|
|
41
|
+
if (config) {
|
|
42
|
+
const sourceType = config.source?.type || 'openapi';
|
|
43
|
+
if (sourceType === 'openapi') {
|
|
44
|
+
const specPath = path.resolve(rootDir, config.source?.path || './openapi.yaml');
|
|
45
|
+
if (fs.existsSync(specPath)) {
|
|
46
|
+
console.log(chalk.green('ā') + ` Source Adapter: OpenAPI specification verified at ${config.source.path}`);
|
|
47
|
+
passedCount++;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.log(chalk.yellow('ā ') +
|
|
51
|
+
` Source Adapter: OpenAPI spec not found at "${config.source?.path || './openapi.yaml'}".` +
|
|
52
|
+
chalk.gray(' Run `fridayy init --source nodejs` or specify `--spec <path>`.'));
|
|
53
|
+
warnCount++;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else if (sourceType === 'nodejs') {
|
|
57
|
+
const pkgExists = fs.existsSync(path.join(rootDir, 'package.json'));
|
|
58
|
+
if (pkgExists) {
|
|
59
|
+
console.log(chalk.green('ā') + ' Source Adapter: Node.js workspace detected and active');
|
|
60
|
+
passedCount++;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log(chalk.yellow('ā ') + ' Source Adapter: No package.json found in current directory');
|
|
64
|
+
warnCount++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (sourceType === 'rest') {
|
|
68
|
+
const hasUrl = Boolean(config.source?.baseUrl);
|
|
69
|
+
if (hasUrl) {
|
|
70
|
+
console.log(chalk.green('ā') + ` Source Adapter: REST API configured at ${config.source.baseUrl}`);
|
|
71
|
+
passedCount++;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.log(chalk.yellow('ā ') + ' Source Adapter: No baseUrl configured for REST adapter');
|
|
75
|
+
warnCount++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 3. Check tools file
|
|
39
80
|
const tools = defaultConfigManager.loadTools(rootDir);
|
|
40
81
|
if (tools.length > 0) {
|
|
41
82
|
console.log(chalk.green('ā') + ` Tools Definition: fridayy.tools.json found with ${tools.length} tools`);
|
|
@@ -45,7 +86,7 @@ export function registerDoctorCommand(program) {
|
|
|
45
86
|
console.log(chalk.yellow('ā ') + ' Tools Definition: fridayy.tools.json is empty or not generated (run `fridayy generate`)');
|
|
46
87
|
warnCount++;
|
|
47
88
|
}
|
|
48
|
-
//
|
|
89
|
+
// 4. Check Approval Breakdown & Destructive Safety
|
|
49
90
|
if (tools.length > 0) {
|
|
50
91
|
const approved = tools.filter(t => t.status === 'APPROVED').length;
|
|
51
92
|
const pending = tools.filter(t => t.status === 'PENDING').length;
|
|
@@ -67,7 +108,7 @@ export function registerDoctorCommand(program) {
|
|
|
67
108
|
}
|
|
68
109
|
}
|
|
69
110
|
}
|
|
70
|
-
//
|
|
111
|
+
// 5. Check Environment Variables & Secrets
|
|
71
112
|
if (tools.length > 0) {
|
|
72
113
|
const authSchemes = tools
|
|
73
114
|
.filter(t => t.authentication?.required)
|
|
@@ -90,7 +131,7 @@ export function registerDoctorCommand(program) {
|
|
|
90
131
|
passedCount++;
|
|
91
132
|
}
|
|
92
133
|
}
|
|
93
|
-
//
|
|
134
|
+
// 6. Target API Connectivity Check
|
|
94
135
|
const baseUrl = defaultSecretResolver.resolveBaseUrl(config?.source?.baseUrl);
|
|
95
136
|
if (baseUrl) {
|
|
96
137
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,WAAW,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAE3E,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,uBAAuB;QACvB,IAAI,MAAW,CAAC;QAChB,IAAI,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,8CAA8C,CAAC,CAAC;gBAC/E,WAAW,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrE,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,oEAAoE,CAAC,CAAC;YACnG,UAAU,EAAE,CAAC;QACf,CAAC;QAED,kCAAkC;QAClC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC;YACpD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,gBAAgB,CAAC,CAAC;gBAChF,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,sDAAsD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC3G,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;wBACf,+CAA+C,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,gBAAgB,IAAI;wBAC1F,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAChF,CAAC;oBACF,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;iBAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;gBACpE,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,wDAAwD,CAAC,CAAC;oBACzF,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,6DAA6D,CAAC,CAAC;oBAC/F,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;iBAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC/C,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2CAA2C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;oBACnG,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,yDAAyD,CAAC,CAAC;oBAC3F,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,oDAAoD,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YACzG,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,0FAA0F,CAAC,CAAC;YAC5H,SAAS,EAAE,CAAC;QACd,CAAC;QAED,mDAAmD;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;YACnE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;YAC5E,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;YAE7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2BAA2B,QAAQ,cAAc,OAAO,aAAa,OAAO,UAAU,CAAC,CAAC;YACvH,WAAW,EAAE,CAAC;YAEd,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;wBACf,cAAc,mBAAmB,CAAC,MAAM,iEAAiE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9J,CAAC;oBACF,SAAS,EAAE,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;wBACd,kBAAkB,WAAW,CAAC,MAAM,iEAAiE,CACxG,CAAC;oBACF,WAAW,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,KAAK;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,QAAQ,CAAC;iBACvC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAe,CAAC,CAAC;YAE/B,MAAM,eAAe,GAAG,qBAAqB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC9E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,8DAA8D,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC5H,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;wBACf,oDAAoD,KAAK,CAAC,IAAI,CAC5D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CACvB,2DAA2D,CAC/D,CAAC;oBACF,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,sEAAsE,CAAC,CAAC;gBACvG,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,MAAM,OAAO,GAAG,qBAAqB,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAClG,YAAY,CAAC,SAAS,CAAC,CAAC;gBAExB,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,kDAAkD,OAAO,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;oBACjH,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,6CAA6C,OAAO,8CAA8C,CAAC,CAAC;oBACpI,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,2CAA2C,OAAO,YAAY,CAAC,CAAC;gBAChG,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,WAAW,SAAS,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,WAAW,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,SAAS,CAAC,IAAI,CAAC,CAAC;QAEjJ,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE9D"}
|
|
@@ -15,6 +15,7 @@ export function registerGenerateCommand(program) {
|
|
|
15
15
|
.description('Generate candidate MCP tools from configured API sources')
|
|
16
16
|
.option('--force', 'Regenerate all tools and reset approval statuses')
|
|
17
17
|
.option('--spec <path>', 'Path to OpenAPI specification')
|
|
18
|
+
.option('--source <type>', 'Override source adapter type: openapi, nodejs, rest')
|
|
18
19
|
.action(async (options) => {
|
|
19
20
|
printBanner();
|
|
20
21
|
const rootDir = process.cwd();
|
|
@@ -26,6 +27,9 @@ export function registerGenerateCommand(program) {
|
|
|
26
27
|
if (options.spec) {
|
|
27
28
|
config.source.path = options.spec;
|
|
28
29
|
}
|
|
30
|
+
if (options.source) {
|
|
31
|
+
config.source.type = options.source;
|
|
32
|
+
}
|
|
29
33
|
const spinner = ora({
|
|
30
34
|
text: chalk.cyan('Generating standardized MCP tools and mapping schemas...'),
|
|
31
35
|
spinner: 'dots12',
|
|
@@ -46,11 +50,17 @@ export function registerGenerateCommand(program) {
|
|
|
46
50
|
const tools = await defaultToolGenerator.generate({
|
|
47
51
|
config,
|
|
48
52
|
rootDir,
|
|
53
|
+
sourceTypeOverride: options.source,
|
|
49
54
|
preserveStatuses: preserveMap
|
|
50
55
|
});
|
|
51
56
|
const savedPath = defaultConfigManager.saveTools(tools, config.source.type, rootDir);
|
|
52
57
|
spinner.succeed(`Generated ${chalk.bold.green(tools.length)} MCP tools.`);
|
|
53
|
-
|
|
58
|
+
if (tools.length > 0) {
|
|
59
|
+
console.log('\n' + createToolsTable(tools) + '\n');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log(chalk.yellow('\nā 0 tools generated. No endpoints discovered or configured.'));
|
|
63
|
+
}
|
|
54
64
|
logger.success(`Saved tools definition to ${chalk.bold.cyan(savedPath)}`);
|
|
55
65
|
console.log(`\nNext step: Run ${chalk.cyan.bold('fridayy review')} to approve/reject candidate tools.\n`);
|
|
56
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,SAAS,EAAE,kDAAkD,CAAC;SACrE,MAAM,CAAC,eAAe,EAAE,+BAA+B,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,WAAW,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE9B,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC;YAC5E,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,KAAK,EAAE,CAAC;QAEX,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,IAAI,WAAyC,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,aAAa,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC9D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;oBACxB,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;wBAC9B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC;gBAChD,MAAM;gBACN,OAAO;gBACP,gBAAgB,EAAE,WAAW;aAC9B,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACrF,OAAO,CAAC,OAAO,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAE1E,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fridayy - Init Command
|
|
3
|
-
* Initializes fridayy.config.json
|
|
3
|
+
* Initializes fridayy.config.json with smart source detection and manual overrides.
|
|
4
4
|
*/
|
|
5
5
|
import { Command } from 'commander';
|
|
6
6
|
export declare function registerInitCommand(program: Command): void;
|